diff --git a/.eslintrc.js b/.eslintrc.js
index c242a1b5a94dcec7af11b57f0827207f0277fa0c..5c32ef3297a4280391f54cfc3ebb496fb66dbfce 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -12,10 +12,12 @@ module.exports = {
     "sourceType": "module"
   },
   "rules": {
+    "no-var": "warn",
     "sort-imports": "error",
     "no-unused-vars": [
       1,
       {"argsIgnorePattern": "^_"}
-    ]
+    ],
+    "prefer-const": "warn"
   },
 };
diff --git a/.gitignore b/.gitignore
index 51cadb418c9aaebaf25e8b2ef77fc77cc23500b9..69043cd4976f6b1fb19fe8190acb9e1e0be367ee 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,4 +5,5 @@
 release/mathbox-0.0.x*
 *bower_components
 decaffeinate*
-build
\ No newline at end of file
+build_testing/
+build_docs/
\ No newline at end of file
diff --git a/.prettierignore b/.prettierignore
index 96f2fbc25d09bd2cb9e4e57110d79fbe39a30cf9..6b4983a7cbde1057987f09eb61641c4a759a579e 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -2,6 +2,5 @@
 build
 coverage
 docs
-vendor
 release
 .*
\ No newline at end of file
diff --git a/CHANGES.md b/CHANGES.md
index d7d32afb2006400b3a4a868d38d252130ab4c861..aa9dccd711858f01fa985eeabb0948c14d38ff33 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,5 +1,19 @@
 ### MathBox Changelog
 
+2.1.1
+
+!16 applies JS-ported patches from the following open merge requests:
+
+  - https://gitgud.io/unconed/mathbox/-/merge_requests/11/
+  - https://gitgud.io/unconed/mathbox/-/merge_requests/10
+  - https://gitgud.io/unconed/mathbox/-/merge_requests/9
+  - https://gitgud.io/unconed/mathbox/-/merge_requests/8
+  - https://gitgud.io/unconed/mathbox/-/merge_requests/7
+  - https://gitgud.io/unconed/mathbox/-/merge_requests/6
+  - https://gitgud.io/unconed/mathbox/-/merge_requests/5
+
+  Thanks to @bobqwatsonsapphire, @carl00s01 and @Beddington for these fixes.
+
 0.0.5
 
 - ⚠️ Rename array `length` to `width` for consistency.
diff --git a/README.md b/README.md
index 6045876ba4a214f59cfee2e45beec95536b78c6b..ee8d81144077561c3dc8546adb5ab3462ea822fa 100644
--- a/README.md
+++ b/README.md
@@ -1,9 +1,5 @@
 # MathBox
 
-### TO FILE
-
-- `webpack-stream`, delete webpack from node_modules for eslint to work. maybe pub new version.
-
 ### Presentation-quality WebGL math graphing
 
 ![MathBox](http://acko.net/files/mathbox2/cover1.jpg)
@@ -131,6 +127,8 @@ Use `.print()`, `.inspect()` and `.debug()` to show information about a selectio
 
 ---
 
+## Development
+
 /src tree:
 
 - model/ - DOM tree + CSS selector handling
@@ -140,13 +138,15 @@ Use `.print()`, `.inspect()` and `.debug()` to show information about a selectio
 - stage/ - API / controllers
 - util/ - It's inevitable
 
-/vendor
+Uses `gulp` to build itself.
+
+---
+
+## Related Projects
 
 - [threestrap](https://github.com/unconed/threestrap) - Three.js bootstrapper
 - [shadergraph](https://github.com/unconed/shadergraph) - Functional GLSL linker
 
-Uses `gulp` to build itself.
-
 ---
 
 MathBox and ShaderGraph (c) Steven Wittens 2013-2022. MIT License.
diff --git a/RUNNING.md b/RUNNING.md
index c94baaabaa473529aa654b9825ec8c88e159f030..5929f1b9ace4d3f938972f76d1cd398ca293fe7d 100644
--- a/RUNNING.md
+++ b/RUNNING.md
@@ -24,13 +24,3 @@ When you get prompted for `lsp`, do `json-ls`.
 ### Safari
 
 - Develop, Experimental Features, WebGL 2.0
-
-### Random
-
-Make sure to delete:
-
-```sh
-rm -rf node_modules/gulp-eslint/node_modules/eslint
-```
-
-to get eslint working. This dependency keeps an old eslint on the classpath.
diff --git a/build/mathbox-bundle.js b/build/mathbox-bundle.js
new file mode 100644
index 0000000000000000000000000000000000000000..1424878831c6e9326ac0d3606da0f8b4702a66bc
--- /dev/null
+++ b/build/mathbox-bundle.js
@@ -0,0 +1,73780 @@
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory(require("THREE"));
+	else if(typeof define === 'function' && define.amd)
+		define("MathBox", ["THREE"], factory);
+	else if(typeof exports === 'object')
+		exports["MathBox"] = factory(require("THREE"));
+	else
+		root["MathBox"] = factory(root["THREE"]);
+})(self, function(__WEBPACK_EXTERNAL_MODULE__824__) {
+return /******/ (() => { // webpackBootstrap
+/******/ 	var __webpack_modules__ = ({
+
+/***/ 3036:
+/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
+
+var parse = __webpack_require__(8805);
+
+module.exports = parseArray;
+
+function parseArray(tokens) {
+  var parser = parse();
+
+  for (var i = 0; i < tokens.length; i++) {
+    parser(tokens[i]);
+  }
+
+  return parser(null);
+}
+
+
+/***/ }),
+
+/***/ 3837:
+/***/ ((module) => {
+
+let state, token, tokens, idx;
+
+const original_symbol = {
+  nud: function () {
+    return this.children && this.children.length ? this : fail("unexpected")();
+  },
+  led: fail("missing operator"),
+};
+
+const symbol_table = {};
+
+function itself() {
+  return this;
+}
+
+symbol("(ident)").nud = itself;
+symbol("(keyword)").nud = itself;
+symbol("(builtin)").nud = itself;
+symbol("(literal)").nud = itself;
+symbol("(end)");
+
+symbol(":");
+symbol(";");
+symbol(",");
+symbol(")");
+symbol("]");
+symbol("}");
+
+infixr("&&", 30);
+infixr("||", 30);
+infix("|", 43);
+infix("^", 44);
+infix("&", 45);
+infix("==", 46);
+infix("!=", 46);
+infix("<", 47);
+infix("<=", 47);
+infix(">", 47);
+infix(">=", 47);
+infix(">>", 48);
+infix("<<", 48);
+infix("+", 50);
+infix("-", 50);
+infix("*", 60);
+infix("/", 60);
+infix("%", 60);
+infix("?", 20, function (left) {
+  this.children = [left, expression(0), (advance(":"), expression(0))];
+  this.type = "ternary";
+  return this;
+});
+infix(".", 80, function (left) {
+  token.type = "literal";
+  state.fake(token);
+  this.children = [left, token];
+  advance();
+  return this;
+});
+infix("[", 80, function (left) {
+  this.children = [left, expression(0)];
+  this.type = "binary";
+  advance("]");
+  return this;
+});
+infix("(", 80, function (left) {
+  this.children = [left];
+  this.type = "call";
+
+  if (token.data !== ")")
+    while (1) {
+      this.children.push(expression(0));
+      if (token.data !== ",") break;
+      advance(",");
+    }
+  advance(")");
+  return this;
+});
+
+prefix("-");
+prefix("+");
+prefix("!");
+prefix("~");
+prefix("defined");
+prefix("(", function () {
+  this.type = "group";
+  this.children = [expression(0)];
+  advance(")");
+  return this;
+});
+prefix("++");
+prefix("--");
+suffix("++");
+suffix("--");
+
+assignment("=");
+assignment("+=");
+assignment("-=");
+assignment("*=");
+assignment("/=");
+assignment("%=");
+assignment("&=");
+assignment("|=");
+assignment("^=");
+assignment(">>=");
+assignment("<<=");
+
+module.exports = function (incoming_state, incoming_tokens) {
+  state = incoming_state;
+  tokens = incoming_tokens;
+  idx = 0;
+  let result;
+
+  if (!tokens.length) return;
+
+  advance();
+  result = expression(0);
+  result.parent = state[0];
+  emit(result);
+
+  if (idx < tokens.length) {
+    throw new Error("did not use all tokens");
+  }
+
+  result.parent.children = [result];
+
+  function emit(node) {
+    state.unshift(node, false);
+    for (let i = 0, len = node.children.length; i < len; ++i) {
+      emit(node.children[i]);
+    }
+    state.shift();
+  }
+};
+
+function symbol(id, binding_power) {
+  let sym = symbol_table[id];
+  binding_power = binding_power || 0;
+  if (sym) {
+    if (binding_power > sym.lbp) {
+      sym.lbp = binding_power;
+    }
+  } else {
+    sym = Object.create(original_symbol);
+    sym.id = id;
+    sym.lbp = binding_power;
+    symbol_table[id] = sym;
+  }
+  return sym;
+}
+
+function expression(rbp) {
+  let left,
+    t = token;
+  advance();
+
+  left = t.nud();
+  while (rbp < token.lbp) {
+    t = token;
+    advance();
+    left = t.led(left);
+  }
+  return left;
+}
+
+function infix(id, bp, led) {
+  const sym = symbol(id, bp);
+  sym.led =
+    led ||
+    function (left) {
+      this.children = [left, expression(bp)];
+      this.type = "binary";
+      return this;
+    };
+}
+
+function infixr(id, bp, led) {
+  const sym = symbol(id, bp);
+  sym.led =
+    led ||
+    function (left) {
+      this.children = [left, expression(bp - 1)];
+      this.type = "binary";
+      return this;
+    };
+  return sym;
+}
+
+function prefix(id, nud) {
+  const sym = symbol(id);
+  sym.nud =
+    nud ||
+    function () {
+      this.children = [expression(70)];
+      this.type = "unary";
+      return this;
+    };
+  return sym;
+}
+
+function suffix(id) {
+  const sym = symbol(id, 150);
+  sym.led = function (left) {
+    this.children = [left];
+    this.type = "suffix";
+    return this;
+  };
+}
+
+function assignment(id) {
+  return infixr(id, 10, function (left) {
+    this.children = [left, expression(9)];
+    this.assignment = true;
+    this.type = "assign";
+    return this;
+  });
+}
+
+function advance(id) {
+  let next, value, type, output;
+
+  if (id && token.data !== id) {
+    return state.unexpected("expected `" + id + "`, got `" + token.data + "`");
+  }
+
+  if (idx >= tokens.length) {
+    token = symbol_table["(end)"];
+    return;
+  }
+
+  next = tokens[idx++];
+  value = next.data;
+  type = next.type;
+
+  if (type === "ident") {
+    output = state.scope.find(value) || state.create_node();
+    type = output.type;
+  } else if (type === "builtin") {
+    output = symbol_table["(builtin)"];
+  } else if (type === "keyword") {
+    output = symbol_table["(keyword)"];
+  } else if (type === "operator") {
+    output = symbol_table[value];
+    if (!output) {
+      return state.unexpected("unknown operator `" + value + "`");
+    }
+  } else if (type === "float" || type === "integer") {
+    type = "literal";
+    output = symbol_table["(literal)"];
+  } else {
+    return state.unexpected("unexpected token.");
+  }
+
+  if (output) {
+    if (!output.nud) {
+      output.nud = itself;
+    }
+    if (!output.children) {
+      output.children = [];
+    }
+  }
+
+  output = Object.create(output);
+  output.token = next;
+  output.type = type;
+  if (!output.data) output.data = value;
+
+  return (token = output);
+}
+
+function fail(message) {
+  return function () {
+    return state.unexpected(message);
+  };
+}
+
+
+/***/ }),
+
+/***/ 8805:
+/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
+
+module.exports = parser;
+
+const full_parse_expr = __webpack_require__(3837),
+  Scope = __webpack_require__(8816);
+
+// singleton!
+const Advance = new Object();
+
+const DEBUG = false;
+
+let _ = 0,
+  IDENT = _++,
+  STMT = _++,
+  STMTLIST = _++,
+  STRUCT = _++,
+  FUNCTION = _++,
+  FUNCTIONARGS = _++,
+  DECL = _++,
+  DECLLIST = _++,
+  FORLOOP = _++,
+  WHILELOOP = _++,
+  IF = _++,
+  EXPR = _++,
+  PRECISION = _++,
+  COMMENT = _++,
+  PREPROCESSOR = _++,
+  KEYWORD = _++,
+  KEYWORD_OR_IDENT = _++,
+  RETURN = _++,
+  BREAK = _++,
+  CONTINUE = _++,
+  DISCARD = _++,
+  DOWHILELOOP = _++,
+  PLACEHOLDER = _++,
+  QUANTIFIER = _++;
+
+const DECL_ALLOW_ASSIGN = 0x1,
+  DECL_ALLOW_COMMA = 0x2,
+  DECL_REQUIRE_NAME = 0x4,
+  DECL_ALLOW_INVARIANT = 0x8,
+  DECL_ALLOW_STORAGE = 0x10,
+  DECL_NO_INOUT = 0x20,
+  DECL_ALLOW_STRUCT = 0x40,
+  DECL_STATEMENT = 0xff,
+  DECL_FUNCTION =
+    DECL_STATEMENT &
+    ~(
+      DECL_ALLOW_ASSIGN |
+      DECL_ALLOW_COMMA |
+      DECL_NO_INOUT |
+      DECL_ALLOW_INVARIANT |
+      DECL_REQUIRE_NAME
+    ),
+  DECL_STRUCT =
+    DECL_STATEMENT &
+    ~(
+      DECL_ALLOW_ASSIGN |
+      DECL_ALLOW_INVARIANT |
+      DECL_ALLOW_STORAGE |
+      DECL_ALLOW_STRUCT
+    );
+
+const QUALIFIERS = (/* unused pure expression or super */ null && (["const", "attribute", "uniform", "varying"]));
+
+const NO_ASSIGN_ALLOWED = false,
+  NO_COMMA_ALLOWED = false;
+
+// map of tokens to stmt types
+const token_map = {
+  "block-comment": COMMENT,
+  "line-comment": COMMENT,
+  preprocessor: PREPROCESSOR,
+};
+
+// map of stmt types to human
+const stmt_type = (_ = [
+  "ident",
+  "stmt",
+  "stmtlist",
+  "struct",
+  "function",
+  "functionargs",
+  "decl",
+  "decllist",
+  "forloop",
+  "whileloop",
+  "if",
+  "expr",
+  "precision",
+  "comment",
+  "preprocessor",
+  "keyword",
+  "keyword_or_ident",
+  "return",
+  "break",
+  "continue",
+  "discard",
+  "do-while",
+  "placeholder",
+  "quantifier",
+]);
+
+function parser() {
+  const stmtlist = n(STMTLIST),
+    stmt = n(STMT),
+    decllist = n(DECLLIST),
+    precision = n(PRECISION),
+    ident = n(IDENT),
+    keyword_or_ident = n(KEYWORD_OR_IDENT),
+    fn = n(FUNCTION),
+    fnargs = n(FUNCTIONARGS),
+    forstmt = n(FORLOOP),
+    ifstmt = n(IF),
+    whilestmt = n(WHILELOOP),
+    returnstmt = n(RETURN),
+    dowhilestmt = n(DOWHILELOOP),
+    quantifier = n(QUANTIFIER);
+
+  let parse_struct,
+    parse_precision,
+    parse_quantifier,
+    parse_forloop,
+    parse_if,
+    parse_return,
+    parse_whileloop,
+    parse_dowhileloop,
+    parse_function,
+    parse_function_args;
+
+  let check = arguments.length ? [].slice.call(arguments) : [],
+    complete = false,
+    ended = false,
+    depth = 0,
+    state = [],
+    nodes = [],
+    tokens = [],
+    whitespace = [],
+    errored = false,
+    program,
+    token,
+    node;
+
+  // setup state
+  state.shift = special_shift;
+  state.unshift = special_unshift;
+  state.fake = special_fake;
+  state.unexpected = unexpected;
+  state.scope = new Scope(state);
+  state.create_node = function () {
+    const n = mknode(IDENT, token);
+    n.parent = reader.program;
+    return n;
+  };
+
+  setup_stative_parsers();
+
+  // setup root node
+  node = stmtlist();
+  node.expecting = "(eof)";
+  node.mode = STMTLIST;
+  node.token = { type: "(program)", data: "(program)" };
+  program = node;
+
+  reader.program = program;
+  reader.scope = function (scope) {
+    if (arguments.length === 1) {
+      state.scope = scope;
+    }
+    return state.scope;
+  };
+
+  state.unshift(node);
+  return reader;
+
+  function reader(data) {
+    if (data === null) {
+      return end(), program;
+    }
+
+    nodes = [];
+    write(data);
+    return nodes;
+  }
+
+  // stream functions ---------------------------------------------
+
+  function write(input) {
+    if (
+      input.type === "whitespace" ||
+      input.type === "line-comment" ||
+      input.type === "block-comment"
+    ) {
+      whitespace.push(input);
+      return;
+    }
+    tokens.push(input);
+    token = token || tokens[0];
+
+    if (token && whitespace.length) {
+      token.preceding = token.preceding || [];
+      token.preceding = token.preceding.concat(whitespace);
+      whitespace = [];
+    }
+
+    while (take())
+      switch (state[0].mode) {
+        case STMT:
+          parse_stmt();
+          break;
+        case STMTLIST:
+          parse_stmtlist();
+          break;
+        case DECL:
+          parse_decl();
+          break;
+        case DECLLIST:
+          parse_decllist();
+          break;
+        case EXPR:
+          parse_expr();
+          break;
+        case STRUCT:
+          parse_struct(true, true);
+          break;
+        case PRECISION:
+          parse_precision();
+          break;
+        case IDENT:
+          parse_ident();
+          break;
+        case KEYWORD:
+          parse_keyword();
+          break;
+        case KEYWORD_OR_IDENT:
+          parse_keyword_or_ident();
+          break;
+        case FUNCTION:
+          parse_function();
+          break;
+        case FUNCTIONARGS:
+          parse_function_args();
+          break;
+        case FORLOOP:
+          parse_forloop();
+          break;
+        case WHILELOOP:
+          parse_whileloop();
+          break;
+        case DOWHILELOOP:
+          parse_dowhileloop();
+          break;
+        case RETURN:
+          parse_return();
+          break;
+        case IF:
+          parse_if();
+          break;
+        case QUANTIFIER:
+          parse_quantifier();
+          break;
+      }
+  }
+
+  function end(tokens) {
+    if (arguments.length) {
+      write(tokens);
+    }
+
+    if (state.length > 1) {
+      unexpected("unexpected EOF");
+      return;
+    }
+
+    complete = true;
+  }
+
+  function take() {
+    if (errored || !state.length) return false;
+
+    return (token = tokens[0]);
+  }
+
+  // ----- state manipulation --------
+
+  function special_fake(x) {
+    state.unshift(x);
+    state.shift();
+  }
+
+  function special_unshift(_node, add_child) {
+    _node.parent = state[0];
+
+    const ret = [].unshift.call(this, _node);
+
+    add_child = add_child === undefined ? true : add_child;
+
+    if (DEBUG) {
+      let pad = "";
+      for (let i = 0, len = this.length - 1; i < len; ++i) {
+        pad += " |";
+      }
+      console.log(pad, "\\" + _node.type, _node.token.data);
+    }
+
+    if (add_child && node !== _node) node.children.push(_node);
+    node = _node;
+
+    return ret;
+  }
+
+  function special_shift() {
+    let _node = [].shift.call(this),
+      okay = check[this.length],
+      emit = false;
+
+    if (DEBUG) {
+      let pad = "";
+      for (let i = 0, len = this.length; i < len; ++i) {
+        pad += " |";
+      }
+      console.log(pad, "/" + _node.type);
+    }
+
+    if (check.length) {
+      if (typeof check[0] === "function") {
+        emit = check[0](_node);
+      } else if (okay !== undefined) {
+        emit = okay.test ? okay.test(_node.type) : okay === _node.type;
+      }
+    } else {
+      emit = true;
+    }
+
+    if (emit && !errored) nodes.push(_node);
+
+    node = _node.parent;
+    return _node;
+  }
+
+  // parse states ---------------
+
+  function parse_stmtlist() {
+    // determine the type of the statement
+    // and then start parsing
+    return stative(function () {
+      state.scope.enter();
+      return Advance;
+    }, normal_mode)();
+
+    function normal_mode() {
+      if (token.data === state[0].expecting) {
+        return state.scope.exit(), state.shift();
+      }
+      switch (token.type) {
+        case "preprocessor":
+          state.fake(adhoc());
+          tokens.shift();
+          return;
+        default:
+          state.unshift(stmt());
+          return;
+      }
+    }
+  }
+
+  function parse_stmt() {
+    if (state[0].brace) {
+      if (token.data !== "}") {
+        return unexpected("expected `}`, got " + token.data);
+      }
+      state[0].brace = false;
+      return tokens.shift(), state.shift();
+    }
+    switch (token.type) {
+      case "eof":
+        return got_eof();
+      case "keyword":
+        switch (token.data) {
+          case "for":
+            return state.unshift(forstmt());
+          case "if":
+            return state.unshift(ifstmt());
+          case "while":
+            return state.unshift(whilestmt());
+          case "do":
+            return state.unshift(dowhilestmt());
+          case "break":
+            return state.fake(mknode(BREAK, token)), tokens.shift();
+          case "continue":
+            return state.fake(mknode(CONTINUE, token)), tokens.shift();
+          case "discard":
+            return state.fake(mknode(DISCARD, token)), tokens.shift();
+          case "return":
+            return state.unshift(returnstmt());
+          case "precision":
+            return state.unshift(precision());
+        }
+        return state.unshift(decl(DECL_STATEMENT));
+      case "ident":
+        var lookup;
+        if ((lookup = state.scope.find(token.data))) {
+          if (lookup.parent.type === "struct") {
+            // this is strictly untrue, you could have an
+            // expr that starts with a struct constructor.
+            //      ... sigh
+            return state.unshift(decl(DECL_STATEMENT));
+          }
+          return state.unshift(expr(";"));
+        }
+      case "operator":
+        if (token.data === "{") {
+          state[0].brace = true;
+          const n = stmtlist();
+          n.expecting = "}";
+          return tokens.shift(), state.unshift(n);
+        }
+        if (token.data === ";") {
+          return tokens.shift(), state.shift();
+        }
+      default:
+        return state.unshift(expr(";"));
+    }
+  }
+
+  function got_eof() {
+    if (ended) errored = true;
+    ended = true;
+    return state.shift();
+  }
+
+  function parse_decl() {
+    const stmt = state[0];
+
+    return stative(
+      invariant_or_not,
+      storage_or_not,
+      parameter_or_not,
+      precision_or_not,
+      struct_or_type,
+      maybe_name,
+      maybe_lparen, // lparen means we're a function
+      is_decllist,
+      done
+    )();
+
+    function invariant_or_not() {
+      if (token.data === "invariant") {
+        if (stmt.flags & DECL_ALLOW_INVARIANT) {
+          state.unshift(keyword());
+          return Advance;
+        } else {
+          return unexpected("`invariant` is not allowed here");
+        }
+      } else {
+        state.fake(mknode(PLACEHOLDER, { data: "", position: token.position }));
+        return Advance;
+      }
+    }
+
+    function storage_or_not() {
+      if (is_storage(token)) {
+        if (stmt.flags & DECL_ALLOW_STORAGE) {
+          state.unshift(keyword());
+          return Advance;
+        } else {
+          return unexpected("storage is not allowed here");
+        }
+      } else {
+        state.fake(mknode(PLACEHOLDER, { data: "", position: token.position }));
+        return Advance;
+      }
+    }
+
+    function parameter_or_not() {
+      if (is_parameter(token)) {
+        if (!(stmt.flags & DECL_NO_INOUT)) {
+          state.unshift(keyword());
+          return Advance;
+        } else {
+          return unexpected("parameter is not allowed here");
+        }
+      } else {
+        state.fake(mknode(PLACEHOLDER, { data: "", position: token.position }));
+        return Advance;
+      }
+    }
+
+    function precision_or_not() {
+      if (is_precision(token)) {
+        state.unshift(keyword());
+        return Advance;
+      } else {
+        state.fake(mknode(PLACEHOLDER, { data: "", position: token.position }));
+        return Advance;
+      }
+    }
+
+    function struct_or_type() {
+      if (token.data === "struct") {
+        if (!(stmt.flags & DECL_ALLOW_STRUCT)) {
+          return unexpected("cannot nest structs");
+        }
+        state.unshift(struct());
+        return Advance;
+      }
+
+      if (token.type === "keyword") {
+        state.unshift(keyword());
+        return Advance;
+      }
+
+      const lookup = state.scope.find(token.data);
+
+      if (lookup) {
+        state.fake(Object.create(lookup));
+        tokens.shift();
+        return Advance;
+      }
+      return unexpected(
+        "expected user defined type, struct or keyword, got " + token.data
+      );
+    }
+
+    function maybe_name() {
+      if (token.data === "," && !(stmt.flags & DECL_ALLOW_COMMA)) {
+        return state.shift();
+      }
+
+      if (token.data === "[") {
+        // oh lord.
+        state.unshift(quantifier());
+        return;
+      }
+
+      if (token.data === ")") return state.shift();
+
+      if (token.data === ";") {
+        return stmt.stage + 3;
+      }
+
+      if (token.type !== "ident" && token.type !== "builtin") {
+        return unexpected("expected identifier, got " + token.data);
+      }
+
+      stmt.collected_name = tokens.shift();
+      return Advance;
+    }
+
+    function maybe_lparen() {
+      if (token.data === "(") {
+        tokens.unshift(stmt.collected_name);
+        delete stmt.collected_name;
+        state.unshift(fn());
+        return stmt.stage + 2;
+      }
+      return Advance;
+    }
+
+    function is_decllist() {
+      tokens.unshift(stmt.collected_name);
+      delete stmt.collected_name;
+      state.unshift(decllist());
+      return Advance;
+    }
+
+    function done() {
+      return state.shift();
+    }
+  }
+
+  function parse_decllist() {
+    // grab ident
+
+    if (token.type === "ident" || token.type === "builtin") {
+      const name = token.data;
+      state.unshift(ident());
+      state.scope.define(name);
+      return;
+    }
+
+    if (token.type === "operator") {
+      if (token.data === ",") {
+        // multi-decl!
+        if (!(state[1].flags & DECL_ALLOW_COMMA)) {
+          return state.shift();
+        }
+
+        return tokens.shift();
+      } else if (token.data === "=") {
+        if (!(state[1].flags & DECL_ALLOW_ASSIGN))
+          return unexpected("`=` is not allowed here.");
+
+        tokens.shift();
+
+        state.unshift(expr(",", ";"));
+        return;
+      } else if (token.data === "[") {
+        state.unshift(quantifier());
+        return;
+      }
+    }
+    return state.shift();
+  }
+
+  function parse_keyword_or_ident() {
+    if (token.type === "keyword") {
+      state[0].type = "keyword";
+      state[0].mode = KEYWORD;
+      return;
+    }
+
+    if (token.type === "ident") {
+      state[0].type = "ident";
+      state[0].mode = IDENT;
+      return;
+    }
+
+    return unexpected(
+      "expected keyword or user-defined name, got " + token.data
+    );
+  }
+
+  function parse_keyword() {
+    if (token.type !== "keyword") {
+      return unexpected("expected keyword, got " + token.data);
+    }
+
+    return state.shift(), tokens.shift();
+  }
+
+  function parse_ident() {
+    if (token.type !== "ident" && token.type !== "builtin") {
+      return unexpected("expected user-defined name, got " + token.data);
+    }
+
+    state[0].data = token.data;
+    return state.shift(), tokens.shift();
+  }
+
+  function parse_expr() {
+    const expecting = state[0].expecting;
+
+    state[0].tokens = state[0].tokens || [];
+
+    if (state[0].parenlevel === undefined) {
+      state[0].parenlevel = 0;
+      state[0].bracelevel = 0;
+    }
+    if (state[0].parenlevel < 1 && expecting.indexOf(token.data) > -1) {
+      return parseexpr(state[0].tokens);
+    }
+    if (token.data === "(") {
+      ++state[0].parenlevel;
+    } else if (token.data === ")") {
+      --state[0].parenlevel;
+    }
+
+    switch (token.data) {
+      case "{":
+        ++state[0].bracelevel;
+        break;
+      case "}":
+        --state[0].bracelevel;
+        break;
+      case "(":
+        ++state[0].parenlevel;
+        break;
+      case ")":
+        --state[0].parenlevel;
+        break;
+    }
+
+    if (state[0].parenlevel < 0) return unexpected("unexpected `)`");
+    if (state[0].bracelevel < 0) return unexpected("unexpected `}`");
+
+    state[0].tokens.push(tokens.shift());
+    return;
+
+    function parseexpr(tokens) {
+      try {
+        full_parse_expr(state, tokens);
+      } catch (err) {
+        errored = true;
+        throw err;
+      }
+
+      return state.shift();
+    }
+  }
+
+  // node types ---------------
+
+  function n(type) {
+    // this is a function factory that suffices for most kinds of expressions and statements
+    return function () {
+      return mknode(type, token);
+    };
+  }
+
+  function adhoc() {
+    return mknode(token_map[token.type], token, node);
+  }
+
+  function decl(flags) {
+    const _ = mknode(DECL, token, node);
+    _.flags = flags;
+
+    return _;
+  }
+
+  function struct(allow_assign, allow_comma) {
+    const _ = mknode(STRUCT, token, node);
+    _.allow_assign = allow_assign === undefined ? true : allow_assign;
+    _.allow_comma = allow_comma === undefined ? true : allow_comma;
+    return _;
+  }
+
+  function expr() {
+    const n = mknode(EXPR, token, node);
+
+    n.expecting = [].slice.call(arguments);
+    return n;
+  }
+
+  function keyword(default_value) {
+    let t = token;
+    if (default_value) {
+      t = { type: "(implied)", data: "(default)", position: t.position };
+    }
+    return mknode(KEYWORD, t, node);
+  }
+
+  // utils ----------------------------
+
+  function unexpected(str) {
+    errored = true;
+    throw new Error(
+      (str || "unexpected " + state) + " at line " + state[0].token.line
+    );
+  }
+
+  function assert(type, data) {
+    return (
+      1,
+      assert_null_string_or_array(type, token.type) &&
+        assert_null_string_or_array(data, token.data)
+    );
+  }
+
+  function assert_null_string_or_array(x, y) {
+    switch (typeof x) {
+      case "string":
+        if (y !== x) {
+          unexpected("expected `" + x + "`, got " + y + "\n" + token.data);
+        }
+        return !errored;
+
+      case "object":
+        if (x && x.indexOf(y) === -1) {
+          unexpected("expected one of `" + x.join("`, `") + "`, got " + y);
+        }
+        return !errored;
+    }
+    return true;
+  }
+
+  // stative ----------------------------
+
+  function stative() {
+    let steps = [].slice.call(arguments),
+      step,
+      result;
+
+    return function () {
+      const current = state[0];
+
+      current.stage || (current.stage = 0);
+
+      step = steps[current.stage];
+      if (!step) return unexpected("parser in undefined state!");
+
+      result = step();
+
+      if (result === Advance) return ++current.stage;
+      if (result === undefined) return;
+      current.stage = result;
+    };
+  }
+
+  function advance(op, t) {
+    t = t || "operator";
+    return function () {
+      if (!assert(t, op)) return;
+
+      const last = tokens.shift(),
+        children = state[0].children,
+        last_node = children[children.length - 1];
+
+      if (last_node && last_node.token && last.preceding) {
+        last_node.token.succeeding = last_node.token.succeeding || [];
+        last_node.token.succeeding = last_node.token.succeeding.concat(
+          last.preceding
+        );
+      }
+      return Advance;
+    };
+  }
+
+  function advance_expr(until) {
+    return function () {
+      state.unshift(expr(until));
+      return Advance;
+    };
+  }
+
+  function advance_ident(declare) {
+    return declare
+      ? function () {
+          const name = token.data;
+          return (
+            assert("ident") &&
+            (state.unshift(ident()), state.scope.define(name), Advance)
+          );
+        }
+      : function () {
+          if (!assert("ident")) return;
+
+          const s = Object.create(state.scope.find(token.data));
+          s.token = token;
+
+          return tokens.shift(), Advance;
+        };
+  }
+
+  function advance_stmtlist() {
+    return function () {
+      const n = stmtlist();
+      n.expecting = "}";
+      return state.unshift(n), Advance;
+    };
+  }
+
+  function maybe_stmtlist(skip) {
+    return function () {
+      const current = state[0].stage;
+      if (token.data !== "{") {
+        return state.unshift(stmt()), current + skip;
+      }
+      return tokens.shift(), Advance;
+    };
+  }
+
+  function popstmt() {
+    return function () {
+      return state.shift(), state.shift();
+    };
+  }
+
+  function setup_stative_parsers() {
+    // could also be
+    // struct { } decllist
+    parse_struct = stative(
+      advance("struct", "keyword"),
+      function () {
+        if (token.data === "{") {
+          state.fake(
+            mknode(IDENT, { data: "", position: token.position, type: "ident" })
+          );
+          return Advance;
+        }
+
+        return advance_ident(true)();
+      },
+      function () {
+        state.scope.enter();
+        return Advance;
+      },
+      advance("{"),
+      function () {
+        if (token.type === "preprocessor") {
+          state.fake(adhoc());
+          tokens.shift();
+          return;
+        }
+        if (token.data === "}") {
+          state.scope.exit();
+          tokens.shift();
+          return state.shift();
+        }
+        if (token.data === ";") {
+          tokens.shift();
+          return;
+        }
+        state.unshift(decl(DECL_STRUCT));
+      }
+    );
+
+    parse_precision = stative(
+      function () {
+        return tokens.shift(), Advance;
+      },
+      function () {
+        return (
+          assert("keyword", ["lowp", "mediump", "highp"]) &&
+          (state.unshift(keyword()), Advance)
+        );
+      },
+      function () {
+        return state.unshift(keyword()), Advance;
+      },
+      function () {
+        return state.shift();
+      }
+    );
+
+    parse_quantifier = stative(
+      advance("["),
+      advance_expr("]"),
+      advance("]"),
+      function () {
+        return state.shift();
+      }
+    );
+
+    parse_forloop = stative(
+      advance("for", "keyword"),
+      advance("("),
+      function () {
+        let lookup;
+        if (token.type === "ident") {
+          if (!(lookup = state.scope.find(token.data))) {
+            lookup = state.create_node();
+          }
+
+          if (lookup.parent.type === "struct") {
+            return state.unshift(decl(DECL_STATEMENT)), Advance;
+          }
+        } else if (token.type === "builtin" || token.type === "keyword") {
+          return state.unshift(decl(DECL_STATEMENT)), Advance;
+        }
+        return advance_expr(";")();
+      },
+      advance(";"),
+      advance_expr(";"),
+      advance(";"),
+      advance_expr(")"),
+      advance(")"),
+      maybe_stmtlist(3),
+      advance_stmtlist(),
+      advance("}"),
+      popstmt()
+    );
+
+    parse_if = stative(
+      advance("if", "keyword"),
+      advance("("),
+      advance_expr(")"),
+      advance(")"),
+      maybe_stmtlist(3),
+      advance_stmtlist(),
+      advance("}"),
+      function () {
+        if (token.data === "else") {
+          return tokens.shift(), state.unshift(stmt()), Advance;
+        }
+        return popstmt()();
+      },
+      popstmt()
+    );
+
+    parse_return = stative(
+      advance("return", "keyword"),
+      function () {
+        if (token.data === ";") return Advance;
+        return state.unshift(expr(";")), Advance;
+      },
+      function () {
+        tokens.shift(), popstmt()();
+      }
+    );
+
+    parse_whileloop = stative(
+      advance("while", "keyword"),
+      advance("("),
+      advance_expr(")"),
+      advance(")"),
+      maybe_stmtlist(3),
+      advance_stmtlist(),
+      advance("}"),
+      popstmt()
+    );
+
+    parse_dowhileloop = stative(
+      advance("do", "keyword"),
+      maybe_stmtlist(3),
+      advance_stmtlist(),
+      advance("}"),
+      advance("while", "keyword"),
+      advance("("),
+      advance_expr(")"),
+      advance(")"),
+      popstmt()
+    );
+
+    parse_function = stative(
+      function () {
+        for (let i = 1, len = state.length; i < len; ++i)
+          if (state[i].mode === FUNCTION) {
+            return unexpected(
+              "function definition is not allowed within another function"
+            );
+          }
+
+        return Advance;
+      },
+      function () {
+        if (!assert("ident")) return;
+
+        const name = token.data,
+          lookup = state.scope.find(name);
+
+        state.unshift(ident());
+        state.scope.define(name);
+
+        state.scope.enter(lookup ? lookup.scope : null);
+        return Advance;
+      },
+      advance("("),
+      function () {
+        return state.unshift(fnargs()), Advance;
+      },
+      advance(")"),
+      function () {
+        // forward decl
+        if (token.data === ";") {
+          return state.scope.exit(), state.shift(), state.shift();
+        }
+        return Advance;
+      },
+      advance("{"),
+      advance_stmtlist(),
+      advance("}"),
+      function () {
+        state.scope.exit();
+        return Advance;
+      },
+      function () {
+        return state.shift(), state.shift(), state.shift();
+      }
+    );
+
+    parse_function_args = stative(
+      function () {
+        if (token.data === "void") {
+          state.fake(keyword());
+          tokens.shift();
+          return Advance;
+        }
+        if (token.data === ")") {
+          state.shift();
+          return;
+        }
+        if (token.data === "struct") {
+          state.unshift(struct(NO_ASSIGN_ALLOWED, NO_COMMA_ALLOWED));
+          return Advance;
+        }
+        state.unshift(decl(DECL_FUNCTION));
+        return Advance;
+      },
+      function () {
+        if (token.data === ",") {
+          tokens.shift();
+          return 0;
+        }
+        if (token.data === ")") {
+          state.shift();
+          return;
+        }
+        unexpected("expected one of `,` or `)`, got " + token.data);
+      }
+    );
+  }
+}
+
+function mknode(mode, sourcetoken) {
+  return {
+    mode: mode,
+    token: sourcetoken,
+    children: [],
+    type: stmt_type[mode],
+    id: (Math.random() * 0xffffffff).toString(16),
+  };
+}
+
+function is_storage(token) {
+  return (
+    token.data === "const" ||
+    token.data === "attribute" ||
+    token.data === "uniform" ||
+    token.data === "varying"
+  );
+}
+
+function is_parameter(token) {
+  return token.data === "in" || token.data === "inout" || token.data === "out";
+}
+
+function is_precision(token) {
+  return (
+    token.data === "highp" || token.data === "mediump" || token.data === "lowp"
+  );
+}
+
+
+/***/ }),
+
+/***/ 8816:
+/***/ ((module) => {
+
+module.exports = scope;
+
+function scope(state) {
+  if (this.constructor !== scope) return new scope(state);
+
+  this.state = state;
+  this.scopes = [];
+  this.current = null;
+}
+
+const cons = scope,
+  proto = cons.prototype;
+
+proto.enter = function (s) {
+  this.scopes.push((this.current = this.state[0].scope = s || {}));
+};
+
+proto.exit = function () {
+  this.scopes.pop();
+  this.current = this.scopes[this.scopes.length - 1];
+};
+
+proto.define = function (str) {
+  this.current[str] = this.state[0];
+};
+
+proto.find = function (name, fail) {
+  for (let i = this.scopes.length - 1; i > -1; --i) {
+    if (this.scopes[i].hasOwnProperty(name)) {
+      return this.scopes[i][name];
+    }
+  }
+
+  return null;
+};
+
+
+/***/ }),
+
+/***/ 1073:
+/***/ ((module) => {
+
+module.exports = {
+	trueFunc: function trueFunc(){
+		return true;
+	},
+	falseFunc: function falseFunc(){
+		return false;
+	}
+};
+
+/***/ }),
+
+/***/ 996:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.attributeRules = void 0;
+var boolbase_1 = __webpack_require__(1073);
+/**
+ * All reserved characters in a regex, used for escaping.
+ *
+ * Taken from XRegExp, (c) 2007-2020 Steven Levithan under the MIT license
+ * https://github.com/slevithan/xregexp/blob/95eeebeb8fac8754d54eafe2b4743661ac1cf028/src/xregexp.js#L794
+ */
+var reChars = /[-[\]{}()*+?.,\\^$|#\s]/g;
+function escapeRegex(value) {
+    return value.replace(reChars, "\\$&");
+}
+/**
+ * Attribute selectors
+ */
+exports.attributeRules = {
+    equals: function (next, data, _a) {
+        var adapter = _a.adapter;
+        var name = data.name;
+        var value = data.value;
+        if (data.ignoreCase) {
+            value = value.toLowerCase();
+            return function (elem) {
+                var attr = adapter.getAttributeValue(elem, name);
+                return (attr != null &&
+                    attr.length === value.length &&
+                    attr.toLowerCase() === value &&
+                    next(elem));
+            };
+        }
+        return function (elem) {
+            return adapter.getAttributeValue(elem, name) === value && next(elem);
+        };
+    },
+    hyphen: function (next, data, _a) {
+        var adapter = _a.adapter;
+        var name = data.name;
+        var value = data.value;
+        var len = value.length;
+        if (data.ignoreCase) {
+            value = value.toLowerCase();
+            return function hyphenIC(elem) {
+                var attr = adapter.getAttributeValue(elem, name);
+                return (attr != null &&
+                    (attr.length === len || attr.charAt(len) === "-") &&
+                    attr.substr(0, len).toLowerCase() === value &&
+                    next(elem));
+            };
+        }
+        return function hyphen(elem) {
+            var attr = adapter.getAttributeValue(elem, name);
+            return (attr != null &&
+                (attr.length === len || attr.charAt(len) === "-") &&
+                attr.substr(0, len) === value &&
+                next(elem));
+        };
+    },
+    element: function (next, _a, _b) {
+        var name = _a.name, value = _a.value, ignoreCase = _a.ignoreCase;
+        var adapter = _b.adapter;
+        if (/\s/.test(value)) {
+            return boolbase_1.falseFunc;
+        }
+        var regex = new RegExp("(?:^|\\s)".concat(escapeRegex(value), "(?:$|\\s)"), ignoreCase ? "i" : "");
+        return function element(elem) {
+            var attr = adapter.getAttributeValue(elem, name);
+            return (attr != null &&
+                attr.length >= value.length &&
+                regex.test(attr) &&
+                next(elem));
+        };
+    },
+    exists: function (next, _a, _b) {
+        var name = _a.name;
+        var adapter = _b.adapter;
+        return function (elem) { return adapter.hasAttrib(elem, name) && next(elem); };
+    },
+    start: function (next, data, _a) {
+        var adapter = _a.adapter;
+        var name = data.name;
+        var value = data.value;
+        var len = value.length;
+        if (len === 0) {
+            return boolbase_1.falseFunc;
+        }
+        if (data.ignoreCase) {
+            value = value.toLowerCase();
+            return function (elem) {
+                var attr = adapter.getAttributeValue(elem, name);
+                return (attr != null &&
+                    attr.length >= len &&
+                    attr.substr(0, len).toLowerCase() === value &&
+                    next(elem));
+            };
+        }
+        return function (elem) {
+            var _a;
+            return !!((_a = adapter.getAttributeValue(elem, name)) === null || _a === void 0 ? void 0 : _a.startsWith(value)) &&
+                next(elem);
+        };
+    },
+    end: function (next, data, _a) {
+        var adapter = _a.adapter;
+        var name = data.name;
+        var value = data.value;
+        var len = -value.length;
+        if (len === 0) {
+            return boolbase_1.falseFunc;
+        }
+        if (data.ignoreCase) {
+            value = value.toLowerCase();
+            return function (elem) {
+                var _a;
+                return ((_a = adapter
+                    .getAttributeValue(elem, name)) === null || _a === void 0 ? void 0 : _a.substr(len).toLowerCase()) === value && next(elem);
+            };
+        }
+        return function (elem) {
+            var _a;
+            return !!((_a = adapter.getAttributeValue(elem, name)) === null || _a === void 0 ? void 0 : _a.endsWith(value)) &&
+                next(elem);
+        };
+    },
+    any: function (next, data, _a) {
+        var adapter = _a.adapter;
+        var name = data.name, value = data.value;
+        if (value === "") {
+            return boolbase_1.falseFunc;
+        }
+        if (data.ignoreCase) {
+            var regex_1 = new RegExp(escapeRegex(value), "i");
+            return function anyIC(elem) {
+                var attr = adapter.getAttributeValue(elem, name);
+                return (attr != null &&
+                    attr.length >= value.length &&
+                    regex_1.test(attr) &&
+                    next(elem));
+            };
+        }
+        return function (elem) {
+            var _a;
+            return !!((_a = adapter.getAttributeValue(elem, name)) === null || _a === void 0 ? void 0 : _a.includes(value)) &&
+                next(elem);
+        };
+    },
+    not: function (next, data, _a) {
+        var adapter = _a.adapter;
+        var name = data.name;
+        var value = data.value;
+        if (value === "") {
+            return function (elem) {
+                return !!adapter.getAttributeValue(elem, name) && next(elem);
+            };
+        }
+        else if (data.ignoreCase) {
+            value = value.toLowerCase();
+            return function (elem) {
+                var attr = adapter.getAttributeValue(elem, name);
+                return ((attr == null ||
+                    attr.length !== value.length ||
+                    attr.toLowerCase() !== value) &&
+                    next(elem));
+            };
+        }
+        return function (elem) {
+            return adapter.getAttributeValue(elem, name) !== value && next(elem);
+        };
+    },
+};
+
+
+/***/ }),
+
+/***/ 8866:
+/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
+
+"use strict";
+
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.compileToken = exports.compileUnsafe = exports.compile = void 0;
+var css_what_1 = __webpack_require__(9751);
+var boolbase_1 = __webpack_require__(1073);
+var sort_1 = __importDefault(__webpack_require__(7353));
+var procedure_1 = __webpack_require__(7177);
+var general_1 = __webpack_require__(3621);
+var subselects_1 = __webpack_require__(1768);
+/**
+ * Compiles a selector to an executable function.
+ *
+ * @param selector Selector to compile.
+ * @param options Compilation options.
+ * @param context Optional context for the selector.
+ */
+function compile(selector, options, context) {
+    var next = compileUnsafe(selector, options, context);
+    return (0, subselects_1.ensureIsTag)(next, options.adapter);
+}
+exports.compile = compile;
+function compileUnsafe(selector, options, context) {
+    var token = typeof selector === "string" ? (0, css_what_1.parse)(selector, options) : selector;
+    return compileToken(token, options, context);
+}
+exports.compileUnsafe = compileUnsafe;
+function includesScopePseudo(t) {
+    return (t.type === "pseudo" &&
+        (t.name === "scope" ||
+            (Array.isArray(t.data) &&
+                t.data.some(function (data) { return data.some(includesScopePseudo); }))));
+}
+var DESCENDANT_TOKEN = { type: "descendant" };
+var FLEXIBLE_DESCENDANT_TOKEN = {
+    type: "_flexibleDescendant",
+};
+var SCOPE_TOKEN = { type: "pseudo", name: "scope", data: null };
+/*
+ * CSS 4 Spec (Draft): 3.3.1. Absolutizing a Scope-relative Selector
+ * http://www.w3.org/TR/selectors4/#absolutizing
+ */
+function absolutize(token, _a, context) {
+    var adapter = _a.adapter;
+    // TODO Use better check if the context is a document
+    var hasContext = !!(context === null || context === void 0 ? void 0 : context.every(function (e) {
+        var parent = adapter.isTag(e) && adapter.getParent(e);
+        return e === subselects_1.PLACEHOLDER_ELEMENT || (parent && adapter.isTag(parent));
+    }));
+    for (var _i = 0, token_1 = token; _i < token_1.length; _i++) {
+        var t = token_1[_i];
+        if (t.length > 0 && (0, procedure_1.isTraversal)(t[0]) && t[0].type !== "descendant") {
+            // Don't continue in else branch
+        }
+        else if (hasContext && !t.some(includesScopePseudo)) {
+            t.unshift(DESCENDANT_TOKEN);
+        }
+        else {
+            continue;
+        }
+        t.unshift(SCOPE_TOKEN);
+    }
+}
+function compileToken(token, options, context) {
+    var _a;
+    token = token.filter(function (t) { return t.length > 0; });
+    token.forEach(sort_1.default);
+    context = (_a = options.context) !== null && _a !== void 0 ? _a : context;
+    var isArrayContext = Array.isArray(context);
+    var finalContext = context && (Array.isArray(context) ? context : [context]);
+    absolutize(token, options, finalContext);
+    var shouldTestNextSiblings = false;
+    var query = token
+        .map(function (rules) {
+        if (rules.length >= 2) {
+            var first = rules[0], second = rules[1];
+            if (first.type !== "pseudo" || first.name !== "scope") {
+                // Ignore
+            }
+            else if (isArrayContext && second.type === "descendant") {
+                rules[1] = FLEXIBLE_DESCENDANT_TOKEN;
+            }
+            else if (second.type === "adjacent" ||
+                second.type === "sibling") {
+                shouldTestNextSiblings = true;
+            }
+        }
+        return compileRules(rules, options, finalContext);
+    })
+        .reduce(reduceRules, boolbase_1.falseFunc);
+    query.shouldTestNextSiblings = shouldTestNextSiblings;
+    return query;
+}
+exports.compileToken = compileToken;
+function compileRules(rules, options, context) {
+    var _a;
+    return rules.reduce(function (previous, rule) {
+        return previous === boolbase_1.falseFunc
+            ? boolbase_1.falseFunc
+            : (0, general_1.compileGeneralSelector)(previous, rule, options, context, compileToken);
+    }, (_a = options.rootFunc) !== null && _a !== void 0 ? _a : boolbase_1.trueFunc);
+}
+function reduceRules(a, b) {
+    if (b === boolbase_1.falseFunc || a === boolbase_1.trueFunc) {
+        return a;
+    }
+    if (a === boolbase_1.falseFunc || b === boolbase_1.trueFunc) {
+        return b;
+    }
+    return function combine(elem) {
+        return a(elem) || b(elem);
+    };
+}
+
+
+/***/ }),
+
+/***/ 3621:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.compileGeneralSelector = void 0;
+var attributes_1 = __webpack_require__(996);
+var pseudo_selectors_1 = __webpack_require__(8677);
+/*
+ * All available rules
+ */
+function compileGeneralSelector(next, selector, options, context, compileToken) {
+    var adapter = options.adapter, equals = options.equals;
+    switch (selector.type) {
+        case "pseudo-element":
+            throw new Error("Pseudo-elements are not supported by css-select");
+        case "attribute":
+            return attributes_1.attributeRules[selector.action](next, selector, options);
+        case "pseudo":
+            return (0, pseudo_selectors_1.compilePseudoSelector)(next, selector, options, context, compileToken);
+        // Tags
+        case "tag":
+            return function tag(elem) {
+                return adapter.getName(elem) === selector.name && next(elem);
+            };
+        // Traversal
+        case "descendant":
+            if (options.cacheResults === false ||
+                typeof WeakSet === "undefined") {
+                return function descendant(elem) {
+                    var current = elem;
+                    while ((current = adapter.getParent(current))) {
+                        if (adapter.isTag(current) && next(current)) {
+                            return true;
+                        }
+                    }
+                    return false;
+                };
+            }
+            // @ts-expect-error `ElementNode` is not extending object
+            // eslint-disable-next-line no-case-declarations
+            var isFalseCache_1 = new WeakSet();
+            return function cachedDescendant(elem) {
+                var current = elem;
+                while ((current = adapter.getParent(current))) {
+                    if (!isFalseCache_1.has(current)) {
+                        if (adapter.isTag(current) && next(current)) {
+                            return true;
+                        }
+                        isFalseCache_1.add(current);
+                    }
+                }
+                return false;
+            };
+        case "_flexibleDescendant":
+            // Include element itself, only used while querying an array
+            return function flexibleDescendant(elem) {
+                var current = elem;
+                do {
+                    if (adapter.isTag(current) && next(current))
+                        return true;
+                } while ((current = adapter.getParent(current)));
+                return false;
+            };
+        case "parent":
+            return function parent(elem) {
+                return adapter
+                    .getChildren(elem)
+                    .some(function (elem) { return adapter.isTag(elem) && next(elem); });
+            };
+        case "child":
+            return function child(elem) {
+                var parent = adapter.getParent(elem);
+                return parent != null && adapter.isTag(parent) && next(parent);
+            };
+        case "sibling":
+            return function sibling(elem) {
+                var siblings = adapter.getSiblings(elem);
+                for (var i = 0; i < siblings.length; i++) {
+                    var currentSibling = siblings[i];
+                    if (equals(elem, currentSibling))
+                        break;
+                    if (adapter.isTag(currentSibling) && next(currentSibling)) {
+                        return true;
+                    }
+                }
+                return false;
+            };
+        case "adjacent":
+            return function adjacent(elem) {
+                var siblings = adapter.getSiblings(elem);
+                var lastElement;
+                for (var i = 0; i < siblings.length; i++) {
+                    var currentSibling = siblings[i];
+                    if (equals(elem, currentSibling))
+                        break;
+                    if (adapter.isTag(currentSibling)) {
+                        lastElement = currentSibling;
+                    }
+                }
+                return !!lastElement && next(lastElement);
+            };
+        case "universal":
+            return next;
+    }
+}
+exports.compileGeneralSelector = compileGeneralSelector;
+
+
+/***/ }),
+
+/***/ 5366:
+/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
+
+"use strict";
+
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aliases = exports.pseudos = exports.filters = exports.is = exports.selectOne = exports.selectAll = exports.prepareContext = exports._compileToken = exports._compileUnsafe = exports.compile = void 0;
+var DomUtils = __importStar(__webpack_require__(9432));
+var boolbase_1 = __webpack_require__(1073);
+var compile_1 = __webpack_require__(8866);
+var subselects_1 = __webpack_require__(1768);
+var defaultEquals = function (a, b) { return a === b; };
+var defaultOptions = {
+    adapter: DomUtils,
+    equals: defaultEquals,
+};
+function convertOptionFormats(options) {
+    var _a, _b, _c, _d;
+    /*
+     * We force one format of options to the other one.
+     */
+    // @ts-expect-error Default options may have incompatible `Node` / `ElementNode`.
+    var opts = options !== null && options !== void 0 ? options : defaultOptions;
+    // @ts-expect-error Same as above.
+    (_a = opts.adapter) !== null && _a !== void 0 ? _a : (opts.adapter = DomUtils);
+    // @ts-expect-error `equals` does not exist on `Options`
+    (_b = opts.equals) !== null && _b !== void 0 ? _b : (opts.equals = (_d = (_c = opts.adapter) === null || _c === void 0 ? void 0 : _c.equals) !== null && _d !== void 0 ? _d : defaultEquals);
+    return opts;
+}
+function wrapCompile(func) {
+    return function addAdapter(selector, options, context) {
+        var opts = convertOptionFormats(options);
+        return func(selector, opts, context);
+    };
+}
+/**
+ * Compiles the query, returns a function.
+ */
+exports.compile = wrapCompile(compile_1.compile);
+exports._compileUnsafe = wrapCompile(compile_1.compileUnsafe);
+exports._compileToken = wrapCompile(compile_1.compileToken);
+function getSelectorFunc(searchFunc) {
+    return function select(query, elements, options) {
+        var opts = convertOptionFormats(options);
+        if (typeof query !== "function") {
+            query = (0, compile_1.compileUnsafe)(query, opts, elements);
+        }
+        var filteredElements = prepareContext(elements, opts.adapter, query.shouldTestNextSiblings);
+        return searchFunc(query, filteredElements, opts);
+    };
+}
+function prepareContext(elems, adapter, shouldTestNextSiblings) {
+    if (shouldTestNextSiblings === void 0) { shouldTestNextSiblings = false; }
+    /*
+     * Add siblings if the query requires them.
+     * See https://github.com/fb55/css-select/pull/43#issuecomment-225414692
+     */
+    if (shouldTestNextSiblings) {
+        elems = appendNextSiblings(elems, adapter);
+    }
+    return Array.isArray(elems)
+        ? adapter.removeSubsets(elems)
+        : adapter.getChildren(elems);
+}
+exports.prepareContext = prepareContext;
+function appendNextSiblings(elem, adapter) {
+    // Order matters because jQuery seems to check the children before the siblings
+    var elems = Array.isArray(elem) ? elem.slice(0) : [elem];
+    var elemsLength = elems.length;
+    for (var i = 0; i < elemsLength; i++) {
+        var nextSiblings = (0, subselects_1.getNextSiblings)(elems[i], adapter);
+        elems.push.apply(elems, nextSiblings);
+    }
+    return elems;
+}
+/**
+ * @template Node The generic Node type for the DOM adapter being used.
+ * @template ElementNode The Node type for elements for the DOM adapter being used.
+ * @param elems Elements to query. If it is an element, its children will be queried..
+ * @param query can be either a CSS selector string or a compiled query function.
+ * @param [options] options for querying the document.
+ * @see compile for supported selector queries.
+ * @returns All matching elements.
+ *
+ */
+exports.selectAll = getSelectorFunc(function (query, elems, options) {
+    return query === boolbase_1.falseFunc || !elems || elems.length === 0
+        ? []
+        : options.adapter.findAll(query, elems);
+});
+/**
+ * @template Node The generic Node type for the DOM adapter being used.
+ * @template ElementNode The Node type for elements for the DOM adapter being used.
+ * @param elems Elements to query. If it is an element, its children will be queried..
+ * @param query can be either a CSS selector string or a compiled query function.
+ * @param [options] options for querying the document.
+ * @see compile for supported selector queries.
+ * @returns the first match, or null if there was no match.
+ */
+exports.selectOne = getSelectorFunc(function (query, elems, options) {
+    return query === boolbase_1.falseFunc || !elems || elems.length === 0
+        ? null
+        : options.adapter.findOne(query, elems);
+});
+/**
+ * Tests whether or not an element is matched by query.
+ *
+ * @template Node The generic Node type for the DOM adapter being used.
+ * @template ElementNode The Node type for elements for the DOM adapter being used.
+ * @param elem The element to test if it matches the query.
+ * @param query can be either a CSS selector string or a compiled query function.
+ * @param [options] options for querying the document.
+ * @see compile for supported selector queries.
+ * @returns
+ */
+function is(elem, query, options) {
+    var opts = convertOptionFormats(options);
+    return (typeof query === "function" ? query : (0, compile_1.compile)(query, opts))(elem);
+}
+exports.is = is;
+/**
+ * Alias for selectAll(query, elems, options).
+ * @see [compile] for supported selector queries.
+ */
+exports["default"] = exports.selectAll;
+// Export filters, pseudos and aliases to allow users to supply their own.
+var pseudo_selectors_1 = __webpack_require__(8677);
+Object.defineProperty(exports, "filters", ({ enumerable: true, get: function () { return pseudo_selectors_1.filters; } }));
+Object.defineProperty(exports, "pseudos", ({ enumerable: true, get: function () { return pseudo_selectors_1.pseudos; } }));
+Object.defineProperty(exports, "aliases", ({ enumerable: true, get: function () { return pseudo_selectors_1.aliases; } }));
+
+
+/***/ }),
+
+/***/ 7177:
+/***/ ((__unused_webpack_module, exports) => {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.isTraversal = exports.procedure = void 0;
+exports.procedure = {
+    universal: 50,
+    tag: 30,
+    attribute: 1,
+    pseudo: 0,
+    "pseudo-element": 0,
+    descendant: -1,
+    child: -1,
+    parent: -1,
+    sibling: -1,
+    adjacent: -1,
+    _flexibleDescendant: -1,
+};
+function isTraversal(t) {
+    return exports.procedure[t.type] < 0;
+}
+exports.isTraversal = isTraversal;
+
+
+/***/ }),
+
+/***/ 2968:
+/***/ ((__unused_webpack_module, exports) => {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aliases = void 0;
+/**
+ * Aliases are pseudos that are expressed as selectors.
+ */
+exports.aliases = {
+    // Links
+    "any-link": ":is(a, area, link)[href]",
+    link: ":any-link:not(:visited)",
+    // Forms
+    // https://html.spec.whatwg.org/multipage/scripting.html#disabled-elements
+    disabled: ":is(\n        :is(button, input, select, textarea, optgroup, option)[disabled],\n        optgroup[disabled] > option,\n        fieldset[disabled]:not(fieldset[disabled] legend:first-of-type *)\n    )",
+    enabled: ":not(:disabled)",
+    checked: ":is(:is(input[type=radio], input[type=checkbox])[checked], option:selected)",
+    required: ":is(input, select, textarea)[required]",
+    optional: ":is(input, select, textarea):not([required])",
+    // JQuery extensions
+    // https://html.spec.whatwg.org/multipage/form-elements.html#concept-option-selectedness
+    selected: "option:is([selected], select:not([multiple]):not(:has(> option[selected])) > :first-of-type)",
+    checkbox: "[type=checkbox]",
+    file: "[type=file]",
+    password: "[type=password]",
+    radio: "[type=radio]",
+    reset: "[type=reset]",
+    image: "[type=image]",
+    submit: "[type=submit]",
+    parent: ":not(:empty)",
+    header: ":is(h1, h2, h3, h4, h5, h6)",
+    button: ":is(button, input[type=button])",
+    input: ":is(input, textarea, select, button)",
+    text: "input:is(:not([type!='']), [type=text])",
+};
+
+
+/***/ }),
+
+/***/ 7689:
+/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
+
+"use strict";
+
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.filters = void 0;
+var nth_check_1 = __importDefault(__webpack_require__(7540));
+var boolbase_1 = __webpack_require__(1073);
+function getChildFunc(next, adapter) {
+    return function (elem) {
+        var parent = adapter.getParent(elem);
+        return parent != null && adapter.isTag(parent) && next(elem);
+    };
+}
+exports.filters = {
+    contains: function (next, text, _a) {
+        var adapter = _a.adapter;
+        return function contains(elem) {
+            return next(elem) && adapter.getText(elem).includes(text);
+        };
+    },
+    icontains: function (next, text, _a) {
+        var adapter = _a.adapter;
+        var itext = text.toLowerCase();
+        return function icontains(elem) {
+            return (next(elem) &&
+                adapter.getText(elem).toLowerCase().includes(itext));
+        };
+    },
+    // Location specific methods
+    "nth-child": function (next, rule, _a) {
+        var adapter = _a.adapter, equals = _a.equals;
+        var func = (0, nth_check_1.default)(rule);
+        if (func === boolbase_1.falseFunc)
+            return boolbase_1.falseFunc;
+        if (func === boolbase_1.trueFunc)
+            return getChildFunc(next, adapter);
+        return function nthChild(elem) {
+            var siblings = adapter.getSiblings(elem);
+            var pos = 0;
+            for (var i = 0; i < siblings.length; i++) {
+                if (equals(elem, siblings[i]))
+                    break;
+                if (adapter.isTag(siblings[i])) {
+                    pos++;
+                }
+            }
+            return func(pos) && next(elem);
+        };
+    },
+    "nth-last-child": function (next, rule, _a) {
+        var adapter = _a.adapter, equals = _a.equals;
+        var func = (0, nth_check_1.default)(rule);
+        if (func === boolbase_1.falseFunc)
+            return boolbase_1.falseFunc;
+        if (func === boolbase_1.trueFunc)
+            return getChildFunc(next, adapter);
+        return function nthLastChild(elem) {
+            var siblings = adapter.getSiblings(elem);
+            var pos = 0;
+            for (var i = siblings.length - 1; i >= 0; i--) {
+                if (equals(elem, siblings[i]))
+                    break;
+                if (adapter.isTag(siblings[i])) {
+                    pos++;
+                }
+            }
+            return func(pos) && next(elem);
+        };
+    },
+    "nth-of-type": function (next, rule, _a) {
+        var adapter = _a.adapter, equals = _a.equals;
+        var func = (0, nth_check_1.default)(rule);
+        if (func === boolbase_1.falseFunc)
+            return boolbase_1.falseFunc;
+        if (func === boolbase_1.trueFunc)
+            return getChildFunc(next, adapter);
+        return function nthOfType(elem) {
+            var siblings = adapter.getSiblings(elem);
+            var pos = 0;
+            for (var i = 0; i < siblings.length; i++) {
+                var currentSibling = siblings[i];
+                if (equals(elem, currentSibling))
+                    break;
+                if (adapter.isTag(currentSibling) &&
+                    adapter.getName(currentSibling) === adapter.getName(elem)) {
+                    pos++;
+                }
+            }
+            return func(pos) && next(elem);
+        };
+    },
+    "nth-last-of-type": function (next, rule, _a) {
+        var adapter = _a.adapter, equals = _a.equals;
+        var func = (0, nth_check_1.default)(rule);
+        if (func === boolbase_1.falseFunc)
+            return boolbase_1.falseFunc;
+        if (func === boolbase_1.trueFunc)
+            return getChildFunc(next, adapter);
+        return function nthLastOfType(elem) {
+            var siblings = adapter.getSiblings(elem);
+            var pos = 0;
+            for (var i = siblings.length - 1; i >= 0; i--) {
+                var currentSibling = siblings[i];
+                if (equals(elem, currentSibling))
+                    break;
+                if (adapter.isTag(currentSibling) &&
+                    adapter.getName(currentSibling) === adapter.getName(elem)) {
+                    pos++;
+                }
+            }
+            return func(pos) && next(elem);
+        };
+    },
+    // TODO determine the actual root element
+    root: function (next, _rule, _a) {
+        var adapter = _a.adapter;
+        return function (elem) {
+            var parent = adapter.getParent(elem);
+            return (parent == null || !adapter.isTag(parent)) && next(elem);
+        };
+    },
+    scope: function (next, rule, options, context) {
+        var equals = options.equals;
+        if (!context || context.length === 0) {
+            // Equivalent to :root
+            return exports.filters.root(next, rule, options);
+        }
+        if (context.length === 1) {
+            // NOTE: can't be unpacked, as :has uses this for side-effects
+            return function (elem) { return equals(context[0], elem) && next(elem); };
+        }
+        return function (elem) { return context.includes(elem) && next(elem); };
+    },
+    hover: dynamicStatePseudo("isHovered"),
+    visited: dynamicStatePseudo("isVisited"),
+    active: dynamicStatePseudo("isActive"),
+};
+/**
+ * Dynamic state pseudos. These depend on optional Adapter methods.
+ *
+ * @param name The name of the adapter method to call.
+ * @returns Pseudo for the `filters` object.
+ */
+function dynamicStatePseudo(name) {
+    return function dynamicPseudo(next, _rule, _a) {
+        var adapter = _a.adapter;
+        var func = adapter[name];
+        if (typeof func !== "function") {
+            return boolbase_1.falseFunc;
+        }
+        return function active(elem) {
+            return func(elem) && next(elem);
+        };
+    };
+}
+
+
+/***/ }),
+
+/***/ 8677:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.compilePseudoSelector = exports.aliases = exports.pseudos = exports.filters = void 0;
+/*
+ * Pseudo selectors
+ *
+ * Pseudo selectors are available in three forms:
+ *
+ * 1. Filters are called when the selector is compiled and return a function
+ *  that has to return either false, or the results of `next()`.
+ * 2. Pseudos are called on execution. They have to return a boolean.
+ * 3. Subselects work like filters, but have an embedded selector that will be run separately.
+ *
+ * Filters are great if you want to do some pre-processing, or change the call order
+ * of `next()` and your code.
+ * Pseudos should be used to implement simple checks.
+ */
+var boolbase_1 = __webpack_require__(1073);
+var css_what_1 = __webpack_require__(9751);
+var filters_1 = __webpack_require__(7689);
+Object.defineProperty(exports, "filters", ({ enumerable: true, get: function () { return filters_1.filters; } }));
+var pseudos_1 = __webpack_require__(7221);
+Object.defineProperty(exports, "pseudos", ({ enumerable: true, get: function () { return pseudos_1.pseudos; } }));
+var aliases_1 = __webpack_require__(2968);
+Object.defineProperty(exports, "aliases", ({ enumerable: true, get: function () { return aliases_1.aliases; } }));
+var subselects_1 = __webpack_require__(1768);
+function compilePseudoSelector(next, selector, options, context, compileToken) {
+    var name = selector.name, data = selector.data;
+    if (Array.isArray(data)) {
+        return subselects_1.subselects[name](next, data, options, context, compileToken);
+    }
+    if (name in aliases_1.aliases) {
+        if (data != null) {
+            throw new Error("Pseudo ".concat(name, " doesn't have any arguments"));
+        }
+        // The alias has to be parsed here, to make sure options are respected.
+        var alias = (0, css_what_1.parse)(aliases_1.aliases[name], options);
+        return subselects_1.subselects.is(next, alias, options, context, compileToken);
+    }
+    if (name in filters_1.filters) {
+        return filters_1.filters[name](next, data, options, context);
+    }
+    if (name in pseudos_1.pseudos) {
+        var pseudo_1 = pseudos_1.pseudos[name];
+        (0, pseudos_1.verifyPseudoArgs)(pseudo_1, name, data);
+        return pseudo_1 === boolbase_1.falseFunc
+            ? boolbase_1.falseFunc
+            : next === boolbase_1.trueFunc
+                ? function (elem) { return pseudo_1(elem, options, data); }
+                : function (elem) { return pseudo_1(elem, options, data) && next(elem); };
+    }
+    throw new Error("unmatched pseudo-class :".concat(name));
+}
+exports.compilePseudoSelector = compilePseudoSelector;
+
+
+/***/ }),
+
+/***/ 7221:
+/***/ ((__unused_webpack_module, exports) => {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.verifyPseudoArgs = exports.pseudos = void 0;
+// While filters are precompiled, pseudos get called when they are needed
+exports.pseudos = {
+    empty: function (elem, _a) {
+        var adapter = _a.adapter;
+        return !adapter.getChildren(elem).some(function (elem) {
+            // FIXME: `getText` call is potentially expensive.
+            return adapter.isTag(elem) || adapter.getText(elem) !== "";
+        });
+    },
+    "first-child": function (elem, _a) {
+        var adapter = _a.adapter, equals = _a.equals;
+        var firstChild = adapter
+            .getSiblings(elem)
+            .find(function (elem) { return adapter.isTag(elem); });
+        return firstChild != null && equals(elem, firstChild);
+    },
+    "last-child": function (elem, _a) {
+        var adapter = _a.adapter, equals = _a.equals;
+        var siblings = adapter.getSiblings(elem);
+        for (var i = siblings.length - 1; i >= 0; i--) {
+            if (equals(elem, siblings[i]))
+                return true;
+            if (adapter.isTag(siblings[i]))
+                break;
+        }
+        return false;
+    },
+    "first-of-type": function (elem, _a) {
+        var adapter = _a.adapter, equals = _a.equals;
+        var siblings = adapter.getSiblings(elem);
+        var elemName = adapter.getName(elem);
+        for (var i = 0; i < siblings.length; i++) {
+            var currentSibling = siblings[i];
+            if (equals(elem, currentSibling))
+                return true;
+            if (adapter.isTag(currentSibling) &&
+                adapter.getName(currentSibling) === elemName) {
+                break;
+            }
+        }
+        return false;
+    },
+    "last-of-type": function (elem, _a) {
+        var adapter = _a.adapter, equals = _a.equals;
+        var siblings = adapter.getSiblings(elem);
+        var elemName = adapter.getName(elem);
+        for (var i = siblings.length - 1; i >= 0; i--) {
+            var currentSibling = siblings[i];
+            if (equals(elem, currentSibling))
+                return true;
+            if (adapter.isTag(currentSibling) &&
+                adapter.getName(currentSibling) === elemName) {
+                break;
+            }
+        }
+        return false;
+    },
+    "only-of-type": function (elem, _a) {
+        var adapter = _a.adapter, equals = _a.equals;
+        var elemName = adapter.getName(elem);
+        return adapter
+            .getSiblings(elem)
+            .every(function (sibling) {
+            return equals(elem, sibling) ||
+                !adapter.isTag(sibling) ||
+                adapter.getName(sibling) !== elemName;
+        });
+    },
+    "only-child": function (elem, _a) {
+        var adapter = _a.adapter, equals = _a.equals;
+        return adapter
+            .getSiblings(elem)
+            .every(function (sibling) { return equals(elem, sibling) || !adapter.isTag(sibling); });
+    },
+};
+function verifyPseudoArgs(func, name, subselect) {
+    if (subselect === null) {
+        if (func.length > 2) {
+            throw new Error("pseudo-selector :".concat(name, " requires an argument"));
+        }
+    }
+    else if (func.length === 2) {
+        throw new Error("pseudo-selector :".concat(name, " doesn't have any arguments"));
+    }
+}
+exports.verifyPseudoArgs = verifyPseudoArgs;
+
+
+/***/ }),
+
+/***/ 1768:
+/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
+
+"use strict";
+
+var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
+    if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
+        if (ar || !(i in from)) {
+            if (!ar) ar = Array.prototype.slice.call(from, 0, i);
+            ar[i] = from[i];
+        }
+    }
+    return to.concat(ar || Array.prototype.slice.call(from));
+};
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.subselects = exports.getNextSiblings = exports.ensureIsTag = exports.PLACEHOLDER_ELEMENT = void 0;
+var boolbase_1 = __webpack_require__(1073);
+var procedure_1 = __webpack_require__(7177);
+/** Used as a placeholder for :has. Will be replaced with the actual element. */
+exports.PLACEHOLDER_ELEMENT = {};
+function ensureIsTag(next, adapter) {
+    if (next === boolbase_1.falseFunc)
+        return boolbase_1.falseFunc;
+    return function (elem) { return adapter.isTag(elem) && next(elem); };
+}
+exports.ensureIsTag = ensureIsTag;
+function getNextSiblings(elem, adapter) {
+    var siblings = adapter.getSiblings(elem);
+    if (siblings.length <= 1)
+        return [];
+    var elemIndex = siblings.indexOf(elem);
+    if (elemIndex < 0 || elemIndex === siblings.length - 1)
+        return [];
+    return siblings.slice(elemIndex + 1).filter(adapter.isTag);
+}
+exports.getNextSiblings = getNextSiblings;
+var is = function (next, token, options, context, compileToken) {
+    var opts = {
+        xmlMode: !!options.xmlMode,
+        adapter: options.adapter,
+        equals: options.equals,
+    };
+    var func = compileToken(token, opts, context);
+    return function (elem) { return func(elem) && next(elem); };
+};
+/*
+ * :not, :has, :is, :matches and :where have to compile selectors
+ * doing this in src/pseudos.ts would lead to circular dependencies,
+ * so we add them here
+ */
+exports.subselects = {
+    is: is,
+    /**
+     * `:matches` and `:where` are aliases for `:is`.
+     */
+    matches: is,
+    where: is,
+    not: function (next, token, options, context, compileToken) {
+        var opts = {
+            xmlMode: !!options.xmlMode,
+            adapter: options.adapter,
+            equals: options.equals,
+        };
+        var func = compileToken(token, opts, context);
+        if (func === boolbase_1.falseFunc)
+            return next;
+        if (func === boolbase_1.trueFunc)
+            return boolbase_1.falseFunc;
+        return function not(elem) {
+            return !func(elem) && next(elem);
+        };
+    },
+    has: function (next, subselect, options, _context, compileToken) {
+        var adapter = options.adapter;
+        var opts = {
+            xmlMode: !!options.xmlMode,
+            adapter: adapter,
+            equals: options.equals,
+        };
+        // @ts-expect-error Uses an array as a pointer to the current element (side effects)
+        var context = subselect.some(function (s) {
+            return s.some(procedure_1.isTraversal);
+        })
+            ? [exports.PLACEHOLDER_ELEMENT]
+            : undefined;
+        var compiled = compileToken(subselect, opts, context);
+        if (compiled === boolbase_1.falseFunc)
+            return boolbase_1.falseFunc;
+        if (compiled === boolbase_1.trueFunc) {
+            return function (elem) {
+                return adapter.getChildren(elem).some(adapter.isTag) && next(elem);
+            };
+        }
+        var hasElement = ensureIsTag(compiled, adapter);
+        var _a = compiled.shouldTestNextSiblings, shouldTestNextSiblings = _a === void 0 ? false : _a;
+        /*
+         * `shouldTestNextSiblings` will only be true if the query starts with
+         * a traversal (sibling or adjacent). That means we will always have a context.
+         */
+        if (context) {
+            return function (elem) {
+                context[0] = elem;
+                var childs = adapter.getChildren(elem);
+                var nextElements = shouldTestNextSiblings
+                    ? __spreadArray(__spreadArray([], childs, true), getNextSiblings(elem, adapter), true) : childs;
+                return (next(elem) && adapter.existsOne(hasElement, nextElements));
+            };
+        }
+        return function (elem) {
+            return next(elem) &&
+                adapter.existsOne(hasElement, adapter.getChildren(elem));
+        };
+    },
+};
+
+
+/***/ }),
+
+/***/ 7353:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+var procedure_1 = __webpack_require__(7177);
+var attributes = {
+    exists: 10,
+    equals: 8,
+    not: 7,
+    start: 6,
+    end: 6,
+    any: 5,
+    hyphen: 4,
+    element: 4,
+};
+/**
+ * Sort the parts of the passed selector,
+ * as there is potential for optimization
+ * (some types of selectors are faster than others)
+ *
+ * @param arr Selector to sort
+ */
+function sortByProcedure(arr) {
+    var procs = arr.map(getProcedure);
+    for (var i = 1; i < arr.length; i++) {
+        var procNew = procs[i];
+        if (procNew < 0)
+            continue;
+        for (var j = i - 1; j >= 0 && procNew < procs[j]; j--) {
+            var token = arr[j + 1];
+            arr[j + 1] = arr[j];
+            arr[j] = token;
+            procs[j + 1] = procs[j];
+            procs[j] = procNew;
+        }
+    }
+}
+exports["default"] = sortByProcedure;
+function getProcedure(token) {
+    var proc = procedure_1.procedure[token.type];
+    if (token.type === "attribute") {
+        proc = attributes[token.action];
+        if (proc === attributes.equals && token.name === "id") {
+            // Prefer ID selectors (eg. #ID)
+            proc = 9;
+        }
+        if (token.ignoreCase) {
+            /*
+             * IgnoreCase adds some overhead, prefer "normal" token
+             * this is a binary operation, to ensure it's still an int
+             */
+            proc >>= 1;
+        }
+    }
+    else if (token.type === "pseudo") {
+        if (!token.data) {
+            proc = 3;
+        }
+        else if (token.name === "has" || token.name === "contains") {
+            proc = 0; // Expensive in any case
+        }
+        else if (Array.isArray(token.data)) {
+            // "matches" and "not"
+            proc = 0;
+            for (var i = 0; i < token.data.length; i++) {
+                // TODO better handling of complex selectors
+                if (token.data[i].length !== 1)
+                    continue;
+                var cur = getProcedure(token.data[i][0]);
+                // Avoid executing :has or :contains
+                if (cur === 0) {
+                    proc = 0;
+                    break;
+                }
+                if (cur > proc)
+                    proc = cur;
+            }
+            if (token.data.length > 1 && proc > 0)
+                proc -= 1;
+        }
+        else {
+            proc = 1;
+        }
+    }
+    return proc;
+}
+
+
+/***/ }),
+
+/***/ 9751:
+/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
+
+"use strict";
+
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __exportStar = (this && this.__exportStar) || function(m, exports) {
+    for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
+};
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.stringify = exports.parse = void 0;
+__exportStar(__webpack_require__(675), exports);
+var parse_1 = __webpack_require__(675);
+Object.defineProperty(exports, "parse", ({ enumerable: true, get: function () { return __importDefault(parse_1).default; } }));
+var stringify_1 = __webpack_require__(6868);
+Object.defineProperty(exports, "stringify", ({ enumerable: true, get: function () { return __importDefault(stringify_1).default; } }));
+
+
+/***/ }),
+
+/***/ 675:
+/***/ (function(__unused_webpack_module, exports) {
+
+"use strict";
+
+var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
+    if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
+        if (ar || !(i in from)) {
+            if (!ar) ar = Array.prototype.slice.call(from, 0, i);
+            ar[i] = from[i];
+        }
+    }
+    return to.concat(ar || Array.prototype.slice.call(from));
+};
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.isTraversal = void 0;
+var reName = /^[^\\#]?(?:\\(?:[\da-f]{1,6}\s?|.)|[\w\-\u00b0-\uFFFF])+/;
+var reEscape = /\\([\da-f]{1,6}\s?|(\s)|.)/gi;
+var actionTypes = new Map([
+    ["~", "element"],
+    ["^", "start"],
+    ["$", "end"],
+    ["*", "any"],
+    ["!", "not"],
+    ["|", "hyphen"],
+]);
+var Traversals = {
+    ">": "child",
+    "<": "parent",
+    "~": "sibling",
+    "+": "adjacent",
+};
+var attribSelectors = {
+    "#": ["id", "equals"],
+    ".": ["class", "element"],
+};
+// Pseudos, whose data property is parsed as well.
+var unpackPseudos = new Set([
+    "has",
+    "not",
+    "matches",
+    "is",
+    "where",
+    "host",
+    "host-context",
+]);
+var traversalNames = new Set(__spreadArray([
+    "descendant"
+], Object.keys(Traversals).map(function (k) { return Traversals[k]; }), true));
+/**
+ * Attributes that are case-insensitive in HTML.
+ *
+ * @private
+ * @see https://html.spec.whatwg.org/multipage/semantics-other.html#case-sensitivity-of-selectors
+ */
+var caseInsensitiveAttributes = new Set([
+    "accept",
+    "accept-charset",
+    "align",
+    "alink",
+    "axis",
+    "bgcolor",
+    "charset",
+    "checked",
+    "clear",
+    "codetype",
+    "color",
+    "compact",
+    "declare",
+    "defer",
+    "dir",
+    "direction",
+    "disabled",
+    "enctype",
+    "face",
+    "frame",
+    "hreflang",
+    "http-equiv",
+    "lang",
+    "language",
+    "link",
+    "media",
+    "method",
+    "multiple",
+    "nohref",
+    "noresize",
+    "noshade",
+    "nowrap",
+    "readonly",
+    "rel",
+    "rev",
+    "rules",
+    "scope",
+    "scrolling",
+    "selected",
+    "shape",
+    "target",
+    "text",
+    "type",
+    "valign",
+    "valuetype",
+    "vlink",
+]);
+/**
+ * Checks whether a specific selector is a traversal.
+ * This is useful eg. in swapping the order of elements that
+ * are not traversals.
+ *
+ * @param selector Selector to check.
+ */
+function isTraversal(selector) {
+    return traversalNames.has(selector.type);
+}
+exports.isTraversal = isTraversal;
+var stripQuotesFromPseudos = new Set(["contains", "icontains"]);
+var quotes = new Set(['"', "'"]);
+// Unescape function taken from https://github.com/jquery/sizzle/blob/master/src/sizzle.js#L152
+function funescape(_, escaped, escapedWhitespace) {
+    var high = parseInt(escaped, 16) - 0x10000;
+    // NaN means non-codepoint
+    return high !== high || escapedWhitespace
+        ? escaped
+        : high < 0
+            ? // BMP codepoint
+                String.fromCharCode(high + 0x10000)
+            : // Supplemental Plane codepoint (surrogate pair)
+                String.fromCharCode((high >> 10) | 0xd800, (high & 0x3ff) | 0xdc00);
+}
+function unescapeCSS(str) {
+    return str.replace(reEscape, funescape);
+}
+function isWhitespace(c) {
+    return c === " " || c === "\n" || c === "\t" || c === "\f" || c === "\r";
+}
+/**
+ * Parses `selector`, optionally with the passed `options`.
+ *
+ * @param selector Selector to parse.
+ * @param options Options for parsing.
+ * @returns Returns a two-dimensional array.
+ * The first dimension represents selectors separated by commas (eg. `sub1, sub2`),
+ * the second contains the relevant tokens for that selector.
+ */
+function parse(selector, options) {
+    var subselects = [];
+    var endIndex = parseSelector(subselects, "" + selector, options, 0);
+    if (endIndex < selector.length) {
+        throw new Error("Unmatched selector: " + selector.slice(endIndex));
+    }
+    return subselects;
+}
+exports["default"] = parse;
+function parseSelector(subselects, selector, options, selectorIndex) {
+    var _a, _b;
+    if (options === void 0) { options = {}; }
+    var tokens = [];
+    var sawWS = false;
+    function getName(offset) {
+        var match = selector.slice(selectorIndex + offset).match(reName);
+        if (!match) {
+            throw new Error("Expected name, found " + selector.slice(selectorIndex));
+        }
+        var name = match[0];
+        selectorIndex += offset + name.length;
+        return unescapeCSS(name);
+    }
+    function stripWhitespace(offset) {
+        while (isWhitespace(selector.charAt(selectorIndex + offset)))
+            offset++;
+        selectorIndex += offset;
+    }
+    function isEscaped(pos) {
+        var slashCount = 0;
+        while (selector.charAt(--pos) === "\\")
+            slashCount++;
+        return (slashCount & 1) === 1;
+    }
+    function ensureNotTraversal() {
+        if (tokens.length > 0 && isTraversal(tokens[tokens.length - 1])) {
+            throw new Error("Did not expect successive traversals.");
+        }
+    }
+    stripWhitespace(0);
+    while (selector !== "") {
+        var firstChar = selector.charAt(selectorIndex);
+        if (isWhitespace(firstChar)) {
+            sawWS = true;
+            stripWhitespace(1);
+        }
+        else if (firstChar in Traversals) {
+            ensureNotTraversal();
+            tokens.push({ type: Traversals[firstChar] });
+            sawWS = false;
+            stripWhitespace(1);
+        }
+        else if (firstChar === ",") {
+            if (tokens.length === 0) {
+                throw new Error("Empty sub-selector");
+            }
+            subselects.push(tokens);
+            tokens = [];
+            sawWS = false;
+            stripWhitespace(1);
+        }
+        else if (selector.startsWith("/*", selectorIndex)) {
+            var endIndex = selector.indexOf("*/", selectorIndex + 2);
+            if (endIndex < 0) {
+                throw new Error("Comment was not terminated");
+            }
+            selectorIndex = endIndex + 2;
+        }
+        else {
+            if (sawWS) {
+                ensureNotTraversal();
+                tokens.push({ type: "descendant" });
+                sawWS = false;
+            }
+            if (firstChar in attribSelectors) {
+                var _c = attribSelectors[firstChar], name_1 = _c[0], action = _c[1];
+                tokens.push({
+                    type: "attribute",
+                    name: name_1,
+                    action: action,
+                    value: getName(1),
+                    namespace: null,
+                    // TODO: Add quirksMode option, which makes `ignoreCase` `true` for HTML.
+                    ignoreCase: options.xmlMode ? null : false,
+                });
+            }
+            else if (firstChar === "[") {
+                stripWhitespace(1);
+                // Determine attribute name and namespace
+                var namespace = null;
+                if (selector.charAt(selectorIndex) === "|") {
+                    namespace = "";
+                    selectorIndex += 1;
+                }
+                if (selector.startsWith("*|", selectorIndex)) {
+                    namespace = "*";
+                    selectorIndex += 2;
+                }
+                var name_2 = getName(0);
+                if (namespace === null &&
+                    selector.charAt(selectorIndex) === "|" &&
+                    selector.charAt(selectorIndex + 1) !== "=") {
+                    namespace = name_2;
+                    name_2 = getName(1);
+                }
+                if ((_a = options.lowerCaseAttributeNames) !== null && _a !== void 0 ? _a : !options.xmlMode) {
+                    name_2 = name_2.toLowerCase();
+                }
+                stripWhitespace(0);
+                // Determine comparison operation
+                var action = "exists";
+                var possibleAction = actionTypes.get(selector.charAt(selectorIndex));
+                if (possibleAction) {
+                    action = possibleAction;
+                    if (selector.charAt(selectorIndex + 1) !== "=") {
+                        throw new Error("Expected `=`");
+                    }
+                    stripWhitespace(2);
+                }
+                else if (selector.charAt(selectorIndex) === "=") {
+                    action = "equals";
+                    stripWhitespace(1);
+                }
+                // Determine value
+                var value = "";
+                var ignoreCase = null;
+                if (action !== "exists") {
+                    if (quotes.has(selector.charAt(selectorIndex))) {
+                        var quote = selector.charAt(selectorIndex);
+                        var sectionEnd = selectorIndex + 1;
+                        while (sectionEnd < selector.length &&
+                            (selector.charAt(sectionEnd) !== quote ||
+                                isEscaped(sectionEnd))) {
+                            sectionEnd += 1;
+                        }
+                        if (selector.charAt(sectionEnd) !== quote) {
+                            throw new Error("Attribute value didn't end");
+                        }
+                        value = unescapeCSS(selector.slice(selectorIndex + 1, sectionEnd));
+                        selectorIndex = sectionEnd + 1;
+                    }
+                    else {
+                        var valueStart = selectorIndex;
+                        while (selectorIndex < selector.length &&
+                            ((!isWhitespace(selector.charAt(selectorIndex)) &&
+                                selector.charAt(selectorIndex) !== "]") ||
+                                isEscaped(selectorIndex))) {
+                            selectorIndex += 1;
+                        }
+                        value = unescapeCSS(selector.slice(valueStart, selectorIndex));
+                    }
+                    stripWhitespace(0);
+                    // See if we have a force ignore flag
+                    var forceIgnore = selector.charAt(selectorIndex);
+                    // If the forceIgnore flag is set (either `i` or `s`), use that value
+                    if (forceIgnore === "s" || forceIgnore === "S") {
+                        ignoreCase = false;
+                        stripWhitespace(1);
+                    }
+                    else if (forceIgnore === "i" || forceIgnore === "I") {
+                        ignoreCase = true;
+                        stripWhitespace(1);
+                    }
+                }
+                // If `xmlMode` is set, there are no rules; otherwise, use the `caseInsensitiveAttributes` list.
+                if (!options.xmlMode) {
+                    // TODO: Skip this for `exists`, as there is no value to compare to.
+                    ignoreCase !== null && ignoreCase !== void 0 ? ignoreCase : (ignoreCase = caseInsensitiveAttributes.has(name_2));
+                }
+                if (selector.charAt(selectorIndex) !== "]") {
+                    throw new Error("Attribute selector didn't terminate");
+                }
+                selectorIndex += 1;
+                var attributeSelector = {
+                    type: "attribute",
+                    name: name_2,
+                    action: action,
+                    value: value,
+                    namespace: namespace,
+                    ignoreCase: ignoreCase,
+                };
+                tokens.push(attributeSelector);
+            }
+            else if (firstChar === ":") {
+                if (selector.charAt(selectorIndex + 1) === ":") {
+                    tokens.push({
+                        type: "pseudo-element",
+                        name: getName(2).toLowerCase(),
+                    });
+                    continue;
+                }
+                var name_3 = getName(1).toLowerCase();
+                var data = null;
+                if (selector.charAt(selectorIndex) === "(") {
+                    if (unpackPseudos.has(name_3)) {
+                        if (quotes.has(selector.charAt(selectorIndex + 1))) {
+                            throw new Error("Pseudo-selector " + name_3 + " cannot be quoted");
+                        }
+                        data = [];
+                        selectorIndex = parseSelector(data, selector, options, selectorIndex + 1);
+                        if (selector.charAt(selectorIndex) !== ")") {
+                            throw new Error("Missing closing parenthesis in :" + name_3 + " (" + selector + ")");
+                        }
+                        selectorIndex += 1;
+                    }
+                    else {
+                        selectorIndex += 1;
+                        var start = selectorIndex;
+                        var counter = 1;
+                        for (; counter > 0 && selectorIndex < selector.length; selectorIndex++) {
+                            if (selector.charAt(selectorIndex) === "(" &&
+                                !isEscaped(selectorIndex)) {
+                                counter++;
+                            }
+                            else if (selector.charAt(selectorIndex) === ")" &&
+                                !isEscaped(selectorIndex)) {
+                                counter--;
+                            }
+                        }
+                        if (counter) {
+                            throw new Error("Parenthesis not matched");
+                        }
+                        data = selector.slice(start, selectorIndex - 1);
+                        if (stripQuotesFromPseudos.has(name_3)) {
+                            var quot = data.charAt(0);
+                            if (quot === data.slice(-1) && quotes.has(quot)) {
+                                data = data.slice(1, -1);
+                            }
+                            data = unescapeCSS(data);
+                        }
+                    }
+                }
+                tokens.push({ type: "pseudo", name: name_3, data: data });
+            }
+            else {
+                var namespace = null;
+                var name_4 = void 0;
+                if (firstChar === "*") {
+                    selectorIndex += 1;
+                    name_4 = "*";
+                }
+                else if (reName.test(selector.slice(selectorIndex))) {
+                    if (selector.charAt(selectorIndex) === "|") {
+                        namespace = "";
+                        selectorIndex += 1;
+                    }
+                    name_4 = getName(0);
+                }
+                else {
+                    /*
+                     * We have finished parsing the selector.
+                     * Remove descendant tokens at the end if they exist,
+                     * and return the last index, so that parsing can be
+                     * picked up from here.
+                     */
+                    if (tokens.length &&
+                        tokens[tokens.length - 1].type === "descendant") {
+                        tokens.pop();
+                    }
+                    addToken(subselects, tokens);
+                    return selectorIndex;
+                }
+                if (selector.charAt(selectorIndex) === "|") {
+                    namespace = name_4;
+                    if (selector.charAt(selectorIndex + 1) === "*") {
+                        name_4 = "*";
+                        selectorIndex += 2;
+                    }
+                    else {
+                        name_4 = getName(1);
+                    }
+                }
+                if (name_4 === "*") {
+                    tokens.push({ type: "universal", namespace: namespace });
+                }
+                else {
+                    if ((_b = options.lowerCaseTags) !== null && _b !== void 0 ? _b : !options.xmlMode) {
+                        name_4 = name_4.toLowerCase();
+                    }
+                    tokens.push({ type: "tag", name: name_4, namespace: namespace });
+                }
+            }
+        }
+    }
+    addToken(subselects, tokens);
+    return selectorIndex;
+}
+function addToken(subselects, tokens) {
+    if (subselects.length > 0 && tokens.length === 0) {
+        throw new Error("Empty sub-selector");
+    }
+    subselects.push(tokens);
+}
+
+
+/***/ }),
+
+/***/ 6868:
+/***/ (function(__unused_webpack_module, exports) {
+
+"use strict";
+
+var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
+    if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
+        if (ar || !(i in from)) {
+            if (!ar) ar = Array.prototype.slice.call(from, 0, i);
+            ar[i] = from[i];
+        }
+    }
+    return to.concat(ar || Array.prototype.slice.call(from));
+};
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+var actionTypes = {
+    equals: "",
+    element: "~",
+    start: "^",
+    end: "$",
+    any: "*",
+    not: "!",
+    hyphen: "|",
+};
+var charsToEscape = new Set(__spreadArray(__spreadArray([], Object.keys(actionTypes)
+    .map(function (typeKey) { return actionTypes[typeKey]; })
+    .filter(Boolean), true), [
+    ":",
+    "[",
+    "]",
+    " ",
+    "\\",
+    "(",
+    ")",
+    "'",
+], false));
+/**
+ * Turns `selector` back into a string.
+ *
+ * @param selector Selector to stringify.
+ */
+function stringify(selector) {
+    return selector.map(stringifySubselector).join(", ");
+}
+exports["default"] = stringify;
+function stringifySubselector(token) {
+    return token.map(stringifyToken).join("");
+}
+function stringifyToken(token) {
+    switch (token.type) {
+        // Simple types
+        case "child":
+            return " > ";
+        case "parent":
+            return " < ";
+        case "sibling":
+            return " ~ ";
+        case "adjacent":
+            return " + ";
+        case "descendant":
+            return " ";
+        case "universal":
+            return getNamespace(token.namespace) + "*";
+        case "tag":
+            return getNamespacedName(token);
+        case "pseudo-element":
+            return "::" + escapeName(token.name);
+        case "pseudo":
+            if (token.data === null)
+                return ":" + escapeName(token.name);
+            if (typeof token.data === "string") {
+                return ":" + escapeName(token.name) + "(" + escapeName(token.data) + ")";
+            }
+            return ":" + escapeName(token.name) + "(" + stringify(token.data) + ")";
+        case "attribute": {
+            if (token.name === "id" &&
+                token.action === "equals" &&
+                !token.ignoreCase &&
+                !token.namespace) {
+                return "#" + escapeName(token.value);
+            }
+            if (token.name === "class" &&
+                token.action === "element" &&
+                !token.ignoreCase &&
+                !token.namespace) {
+                return "." + escapeName(token.value);
+            }
+            var name_1 = getNamespacedName(token);
+            if (token.action === "exists") {
+                return "[" + name_1 + "]";
+            }
+            return "[" + name_1 + actionTypes[token.action] + "='" + escapeName(token.value) + "'" + (token.ignoreCase ? "i" : token.ignoreCase === false ? "s" : "") + "]";
+        }
+    }
+}
+function getNamespacedName(token) {
+    return "" + getNamespace(token.namespace) + escapeName(token.name);
+}
+function getNamespace(namespace) {
+    return namespace !== null
+        ? (namespace === "*" ? "*" : escapeName(namespace)) + "|"
+        : "";
+}
+function escapeName(str) {
+    return str
+        .split("")
+        .map(function (c) { return (charsToEscape.has(c) ? "\\" + c : c); })
+        .join("");
+}
+
+
+/***/ }),
+
+/***/ 7837:
+/***/ ((__unused_webpack_module, exports) => {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.attributeNames = exports.elementNames = void 0;
+exports.elementNames = new Map([
+    ["altglyph", "altGlyph"],
+    ["altglyphdef", "altGlyphDef"],
+    ["altglyphitem", "altGlyphItem"],
+    ["animatecolor", "animateColor"],
+    ["animatemotion", "animateMotion"],
+    ["animatetransform", "animateTransform"],
+    ["clippath", "clipPath"],
+    ["feblend", "feBlend"],
+    ["fecolormatrix", "feColorMatrix"],
+    ["fecomponenttransfer", "feComponentTransfer"],
+    ["fecomposite", "feComposite"],
+    ["feconvolvematrix", "feConvolveMatrix"],
+    ["fediffuselighting", "feDiffuseLighting"],
+    ["fedisplacementmap", "feDisplacementMap"],
+    ["fedistantlight", "feDistantLight"],
+    ["fedropshadow", "feDropShadow"],
+    ["feflood", "feFlood"],
+    ["fefunca", "feFuncA"],
+    ["fefuncb", "feFuncB"],
+    ["fefuncg", "feFuncG"],
+    ["fefuncr", "feFuncR"],
+    ["fegaussianblur", "feGaussianBlur"],
+    ["feimage", "feImage"],
+    ["femerge", "feMerge"],
+    ["femergenode", "feMergeNode"],
+    ["femorphology", "feMorphology"],
+    ["feoffset", "feOffset"],
+    ["fepointlight", "fePointLight"],
+    ["fespecularlighting", "feSpecularLighting"],
+    ["fespotlight", "feSpotLight"],
+    ["fetile", "feTile"],
+    ["feturbulence", "feTurbulence"],
+    ["foreignobject", "foreignObject"],
+    ["glyphref", "glyphRef"],
+    ["lineargradient", "linearGradient"],
+    ["radialgradient", "radialGradient"],
+    ["textpath", "textPath"],
+]);
+exports.attributeNames = new Map([
+    ["definitionurl", "definitionURL"],
+    ["attributename", "attributeName"],
+    ["attributetype", "attributeType"],
+    ["basefrequency", "baseFrequency"],
+    ["baseprofile", "baseProfile"],
+    ["calcmode", "calcMode"],
+    ["clippathunits", "clipPathUnits"],
+    ["diffuseconstant", "diffuseConstant"],
+    ["edgemode", "edgeMode"],
+    ["filterunits", "filterUnits"],
+    ["glyphref", "glyphRef"],
+    ["gradienttransform", "gradientTransform"],
+    ["gradientunits", "gradientUnits"],
+    ["kernelmatrix", "kernelMatrix"],
+    ["kernelunitlength", "kernelUnitLength"],
+    ["keypoints", "keyPoints"],
+    ["keysplines", "keySplines"],
+    ["keytimes", "keyTimes"],
+    ["lengthadjust", "lengthAdjust"],
+    ["limitingconeangle", "limitingConeAngle"],
+    ["markerheight", "markerHeight"],
+    ["markerunits", "markerUnits"],
+    ["markerwidth", "markerWidth"],
+    ["maskcontentunits", "maskContentUnits"],
+    ["maskunits", "maskUnits"],
+    ["numoctaves", "numOctaves"],
+    ["pathlength", "pathLength"],
+    ["patterncontentunits", "patternContentUnits"],
+    ["patterntransform", "patternTransform"],
+    ["patternunits", "patternUnits"],
+    ["pointsatx", "pointsAtX"],
+    ["pointsaty", "pointsAtY"],
+    ["pointsatz", "pointsAtZ"],
+    ["preservealpha", "preserveAlpha"],
+    ["preserveaspectratio", "preserveAspectRatio"],
+    ["primitiveunits", "primitiveUnits"],
+    ["refx", "refX"],
+    ["refy", "refY"],
+    ["repeatcount", "repeatCount"],
+    ["repeatdur", "repeatDur"],
+    ["requiredextensions", "requiredExtensions"],
+    ["requiredfeatures", "requiredFeatures"],
+    ["specularconstant", "specularConstant"],
+    ["specularexponent", "specularExponent"],
+    ["spreadmethod", "spreadMethod"],
+    ["startoffset", "startOffset"],
+    ["stddeviation", "stdDeviation"],
+    ["stitchtiles", "stitchTiles"],
+    ["surfacescale", "surfaceScale"],
+    ["systemlanguage", "systemLanguage"],
+    ["tablevalues", "tableValues"],
+    ["targetx", "targetX"],
+    ["targety", "targetY"],
+    ["textlength", "textLength"],
+    ["viewbox", "viewBox"],
+    ["viewtarget", "viewTarget"],
+    ["xchannelselector", "xChannelSelector"],
+    ["ychannelselector", "yChannelSelector"],
+    ["zoomandpan", "zoomAndPan"],
+]);
+
+
+/***/ }),
+
+/***/ 7220:
+/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
+
+"use strict";
+
+var __assign = (this && this.__assign) || function () {
+    __assign = Object.assign || function(t) {
+        for (var s, i = 1, n = arguments.length; i < n; i++) {
+            s = arguments[i];
+            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
+                t[p] = s[p];
+        }
+        return t;
+    };
+    return __assign.apply(this, arguments);
+};
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+/*
+ * Module dependencies
+ */
+var ElementType = __importStar(__webpack_require__(9960));
+var entities_1 = __webpack_require__(5863);
+/**
+ * Mixed-case SVG and MathML tags & attributes
+ * recognized by the HTML parser.
+ *
+ * @see https://html.spec.whatwg.org/multipage/parsing.html#parsing-main-inforeign
+ */
+var foreignNames_1 = __webpack_require__(7837);
+var unencodedElements = new Set([
+    "style",
+    "script",
+    "xmp",
+    "iframe",
+    "noembed",
+    "noframes",
+    "plaintext",
+    "noscript",
+]);
+/**
+ * Format attributes
+ */
+function formatAttributes(attributes, opts) {
+    if (!attributes)
+        return;
+    return Object.keys(attributes)
+        .map(function (key) {
+        var _a, _b;
+        var value = (_a = attributes[key]) !== null && _a !== void 0 ? _a : "";
+        if (opts.xmlMode === "foreign") {
+            /* Fix up mixed-case attribute names */
+            key = (_b = foreignNames_1.attributeNames.get(key)) !== null && _b !== void 0 ? _b : key;
+        }
+        if (!opts.emptyAttrs && !opts.xmlMode && value === "") {
+            return key;
+        }
+        return key + "=\"" + (opts.decodeEntities !== false
+            ? entities_1.encodeXML(value)
+            : value.replace(/"/g, "&quot;")) + "\"";
+    })
+        .join(" ");
+}
+/**
+ * Self-enclosing tags
+ */
+var singleTag = new Set([
+    "area",
+    "base",
+    "basefont",
+    "br",
+    "col",
+    "command",
+    "embed",
+    "frame",
+    "hr",
+    "img",
+    "input",
+    "isindex",
+    "keygen",
+    "link",
+    "meta",
+    "param",
+    "source",
+    "track",
+    "wbr",
+]);
+/**
+ * Renders a DOM node or an array of DOM nodes to a string.
+ *
+ * Can be thought of as the equivalent of the `outerHTML` of the passed node(s).
+ *
+ * @param node Node to be rendered.
+ * @param options Changes serialization behavior
+ */
+function render(node, options) {
+    if (options === void 0) { options = {}; }
+    var nodes = "length" in node ? node : [node];
+    var output = "";
+    for (var i = 0; i < nodes.length; i++) {
+        output += renderNode(nodes[i], options);
+    }
+    return output;
+}
+exports["default"] = render;
+function renderNode(node, options) {
+    switch (node.type) {
+        case ElementType.Root:
+            return render(node.children, options);
+        case ElementType.Directive:
+        case ElementType.Doctype:
+            return renderDirective(node);
+        case ElementType.Comment:
+            return renderComment(node);
+        case ElementType.CDATA:
+            return renderCdata(node);
+        case ElementType.Script:
+        case ElementType.Style:
+        case ElementType.Tag:
+            return renderTag(node, options);
+        case ElementType.Text:
+            return renderText(node, options);
+    }
+}
+var foreignModeIntegrationPoints = new Set([
+    "mi",
+    "mo",
+    "mn",
+    "ms",
+    "mtext",
+    "annotation-xml",
+    "foreignObject",
+    "desc",
+    "title",
+]);
+var foreignElements = new Set(["svg", "math"]);
+function renderTag(elem, opts) {
+    var _a;
+    // Handle SVG / MathML in HTML
+    if (opts.xmlMode === "foreign") {
+        /* Fix up mixed-case element names */
+        elem.name = (_a = foreignNames_1.elementNames.get(elem.name)) !== null && _a !== void 0 ? _a : elem.name;
+        /* Exit foreign mode at integration points */
+        if (elem.parent &&
+            foreignModeIntegrationPoints.has(elem.parent.name)) {
+            opts = __assign(__assign({}, opts), { xmlMode: false });
+        }
+    }
+    if (!opts.xmlMode && foreignElements.has(elem.name)) {
+        opts = __assign(__assign({}, opts), { xmlMode: "foreign" });
+    }
+    var tag = "<" + elem.name;
+    var attribs = formatAttributes(elem.attribs, opts);
+    if (attribs) {
+        tag += " " + attribs;
+    }
+    if (elem.children.length === 0 &&
+        (opts.xmlMode
+            ? // In XML mode or foreign mode, and user hasn't explicitly turned off self-closing tags
+                opts.selfClosingTags !== false
+            : // User explicitly asked for self-closing tags, even in HTML mode
+                opts.selfClosingTags && singleTag.has(elem.name))) {
+        if (!opts.xmlMode)
+            tag += " ";
+        tag += "/>";
+    }
+    else {
+        tag += ">";
+        if (elem.children.length > 0) {
+            tag += render(elem.children, opts);
+        }
+        if (opts.xmlMode || !singleTag.has(elem.name)) {
+            tag += "</" + elem.name + ">";
+        }
+    }
+    return tag;
+}
+function renderDirective(elem) {
+    return "<" + elem.data + ">";
+}
+function renderText(elem, opts) {
+    var data = elem.data || "";
+    // If entities weren't decoded, no need to encode them back
+    if (opts.decodeEntities !== false &&
+        !(!opts.xmlMode &&
+            elem.parent &&
+            unencodedElements.has(elem.parent.name))) {
+        data = entities_1.encodeXML(data);
+    }
+    return data;
+}
+function renderCdata(elem) {
+    return "<![CDATA[" + elem.children[0].data + "]]>";
+}
+function renderComment(elem) {
+    return "<!--" + elem.data + "-->";
+}
+
+
+/***/ }),
+
+/***/ 9960:
+/***/ ((__unused_webpack_module, exports) => {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.Doctype = exports.CDATA = exports.Tag = exports.Style = exports.Script = exports.Comment = exports.Directive = exports.Text = exports.Root = exports.isTag = exports.ElementType = void 0;
+/** Types of elements found in htmlparser2's DOM */
+var ElementType;
+(function (ElementType) {
+    /** Type for the root element of a document */
+    ElementType["Root"] = "root";
+    /** Type for Text */
+    ElementType["Text"] = "text";
+    /** Type for <? ... ?> */
+    ElementType["Directive"] = "directive";
+    /** Type for <!-- ... --> */
+    ElementType["Comment"] = "comment";
+    /** Type for <script> tags */
+    ElementType["Script"] = "script";
+    /** Type for <style> tags */
+    ElementType["Style"] = "style";
+    /** Type for Any tag */
+    ElementType["Tag"] = "tag";
+    /** Type for <![CDATA[ ... ]]> */
+    ElementType["CDATA"] = "cdata";
+    /** Type for <!doctype ...> */
+    ElementType["Doctype"] = "doctype";
+})(ElementType = exports.ElementType || (exports.ElementType = {}));
+/**
+ * Tests whether an element is a tag or not.
+ *
+ * @param elem Element to test
+ */
+function isTag(elem) {
+    return (elem.type === ElementType.Tag ||
+        elem.type === ElementType.Script ||
+        elem.type === ElementType.Style);
+}
+exports.isTag = isTag;
+// Exports for backwards compatibility
+/** Type for the root element of a document */
+exports.Root = ElementType.Root;
+/** Type for Text */
+exports.Text = ElementType.Text;
+/** Type for <? ... ?> */
+exports.Directive = ElementType.Directive;
+/** Type for <!-- ... --> */
+exports.Comment = ElementType.Comment;
+/** Type for <script> tags */
+exports.Script = ElementType.Script;
+/** Type for <style> tags */
+exports.Style = ElementType.Style;
+/** Type for Any tag */
+exports.Tag = ElementType.Tag;
+/** Type for <![CDATA[ ... ]]> */
+exports.CDATA = ElementType.CDATA;
+/** Type for <!doctype ...> */
+exports.Doctype = ElementType.Doctype;
+
+
+/***/ }),
+
+/***/ 7915:
+/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
+
+"use strict";
+
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __exportStar = (this && this.__exportStar) || function(m, exports) {
+    for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
+};
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.DomHandler = void 0;
+var domelementtype_1 = __webpack_require__(9960);
+var node_1 = __webpack_require__(7790);
+__exportStar(__webpack_require__(7790), exports);
+var reWhitespace = /\s+/g;
+// Default options
+var defaultOpts = {
+    normalizeWhitespace: false,
+    withStartIndices: false,
+    withEndIndices: false,
+    xmlMode: false,
+};
+var DomHandler = /** @class */ (function () {
+    /**
+     * @param callback Called once parsing has completed.
+     * @param options Settings for the handler.
+     * @param elementCB Callback whenever a tag is closed.
+     */
+    function DomHandler(callback, options, elementCB) {
+        /** The elements of the DOM */
+        this.dom = [];
+        /** The root element for the DOM */
+        this.root = new node_1.Document(this.dom);
+        /** Indicated whether parsing has been completed. */
+        this.done = false;
+        /** Stack of open tags. */
+        this.tagStack = [this.root];
+        /** A data node that is still being written to. */
+        this.lastNode = null;
+        /** Reference to the parser instance. Used for location information. */
+        this.parser = null;
+        // Make it possible to skip arguments, for backwards-compatibility
+        if (typeof options === "function") {
+            elementCB = options;
+            options = defaultOpts;
+        }
+        if (typeof callback === "object") {
+            options = callback;
+            callback = undefined;
+        }
+        this.callback = callback !== null && callback !== void 0 ? callback : null;
+        this.options = options !== null && options !== void 0 ? options : defaultOpts;
+        this.elementCB = elementCB !== null && elementCB !== void 0 ? elementCB : null;
+    }
+    DomHandler.prototype.onparserinit = function (parser) {
+        this.parser = parser;
+    };
+    // Resets the handler back to starting state
+    DomHandler.prototype.onreset = function () {
+        this.dom = [];
+        this.root = new node_1.Document(this.dom);
+        this.done = false;
+        this.tagStack = [this.root];
+        this.lastNode = null;
+        this.parser = null;
+    };
+    // Signals the handler that parsing is done
+    DomHandler.prototype.onend = function () {
+        if (this.done)
+            return;
+        this.done = true;
+        this.parser = null;
+        this.handleCallback(null);
+    };
+    DomHandler.prototype.onerror = function (error) {
+        this.handleCallback(error);
+    };
+    DomHandler.prototype.onclosetag = function () {
+        this.lastNode = null;
+        var elem = this.tagStack.pop();
+        if (this.options.withEndIndices) {
+            elem.endIndex = this.parser.endIndex;
+        }
+        if (this.elementCB)
+            this.elementCB(elem);
+    };
+    DomHandler.prototype.onopentag = function (name, attribs) {
+        var type = this.options.xmlMode ? domelementtype_1.ElementType.Tag : undefined;
+        var element = new node_1.Element(name, attribs, undefined, type);
+        this.addNode(element);
+        this.tagStack.push(element);
+    };
+    DomHandler.prototype.ontext = function (data) {
+        var normalizeWhitespace = this.options.normalizeWhitespace;
+        var lastNode = this.lastNode;
+        if (lastNode && lastNode.type === domelementtype_1.ElementType.Text) {
+            if (normalizeWhitespace) {
+                lastNode.data = (lastNode.data + data).replace(reWhitespace, " ");
+            }
+            else {
+                lastNode.data += data;
+            }
+            if (this.options.withEndIndices) {
+                lastNode.endIndex = this.parser.endIndex;
+            }
+        }
+        else {
+            if (normalizeWhitespace) {
+                data = data.replace(reWhitespace, " ");
+            }
+            var node = new node_1.Text(data);
+            this.addNode(node);
+            this.lastNode = node;
+        }
+    };
+    DomHandler.prototype.oncomment = function (data) {
+        if (this.lastNode && this.lastNode.type === domelementtype_1.ElementType.Comment) {
+            this.lastNode.data += data;
+            return;
+        }
+        var node = new node_1.Comment(data);
+        this.addNode(node);
+        this.lastNode = node;
+    };
+    DomHandler.prototype.oncommentend = function () {
+        this.lastNode = null;
+    };
+    DomHandler.prototype.oncdatastart = function () {
+        var text = new node_1.Text("");
+        var node = new node_1.NodeWithChildren(domelementtype_1.ElementType.CDATA, [text]);
+        this.addNode(node);
+        text.parent = node;
+        this.lastNode = text;
+    };
+    DomHandler.prototype.oncdataend = function () {
+        this.lastNode = null;
+    };
+    DomHandler.prototype.onprocessinginstruction = function (name, data) {
+        var node = new node_1.ProcessingInstruction(name, data);
+        this.addNode(node);
+    };
+    DomHandler.prototype.handleCallback = function (error) {
+        if (typeof this.callback === "function") {
+            this.callback(error, this.dom);
+        }
+        else if (error) {
+            throw error;
+        }
+    };
+    DomHandler.prototype.addNode = function (node) {
+        var parent = this.tagStack[this.tagStack.length - 1];
+        var previousSibling = parent.children[parent.children.length - 1];
+        if (this.options.withStartIndices) {
+            node.startIndex = this.parser.startIndex;
+        }
+        if (this.options.withEndIndices) {
+            node.endIndex = this.parser.endIndex;
+        }
+        parent.children.push(node);
+        if (previousSibling) {
+            node.prev = previousSibling;
+            previousSibling.next = node;
+        }
+        node.parent = parent;
+        this.lastNode = null;
+    };
+    return DomHandler;
+}());
+exports.DomHandler = DomHandler;
+exports["default"] = DomHandler;
+
+
+/***/ }),
+
+/***/ 7790:
+/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
+
+"use strict";
+
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        if (typeof b !== "function" && b !== null)
+            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+var __assign = (this && this.__assign) || function () {
+    __assign = Object.assign || function(t) {
+        for (var s, i = 1, n = arguments.length; i < n; i++) {
+            s = arguments[i];
+            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
+                t[p] = s[p];
+        }
+        return t;
+    };
+    return __assign.apply(this, arguments);
+};
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.cloneNode = exports.hasChildren = exports.isDocument = exports.isDirective = exports.isComment = exports.isText = exports.isCDATA = exports.isTag = exports.Element = exports.Document = exports.NodeWithChildren = exports.ProcessingInstruction = exports.Comment = exports.Text = exports.DataNode = exports.Node = void 0;
+var domelementtype_1 = __webpack_require__(9960);
+var nodeTypes = new Map([
+    [domelementtype_1.ElementType.Tag, 1],
+    [domelementtype_1.ElementType.Script, 1],
+    [domelementtype_1.ElementType.Style, 1],
+    [domelementtype_1.ElementType.Directive, 1],
+    [domelementtype_1.ElementType.Text, 3],
+    [domelementtype_1.ElementType.CDATA, 4],
+    [domelementtype_1.ElementType.Comment, 8],
+    [domelementtype_1.ElementType.Root, 9],
+]);
+/**
+ * This object will be used as the prototype for Nodes when creating a
+ * DOM-Level-1-compliant structure.
+ */
+var Node = /** @class */ (function () {
+    /**
+     *
+     * @param type The type of the node.
+     */
+    function Node(type) {
+        this.type = type;
+        /** Parent of the node */
+        this.parent = null;
+        /** Previous sibling */
+        this.prev = null;
+        /** Next sibling */
+        this.next = null;
+        /** The start index of the node. Requires `withStartIndices` on the handler to be `true. */
+        this.startIndex = null;
+        /** The end index of the node. Requires `withEndIndices` on the handler to be `true. */
+        this.endIndex = null;
+    }
+    Object.defineProperty(Node.prototype, "nodeType", {
+        // Read-only aliases
+        /**
+         * [DOM spec](https://dom.spec.whatwg.org/#dom-node-nodetype)-compatible
+         * node {@link type}.
+         */
+        get: function () {
+            var _a;
+            return (_a = nodeTypes.get(this.type)) !== null && _a !== void 0 ? _a : 1;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Node.prototype, "parentNode", {
+        // Read-write aliases for properties
+        /**
+         * Same as {@link parent}.
+         * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.
+         */
+        get: function () {
+            return this.parent;
+        },
+        set: function (parent) {
+            this.parent = parent;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Node.prototype, "previousSibling", {
+        /**
+         * Same as {@link prev}.
+         * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.
+         */
+        get: function () {
+            return this.prev;
+        },
+        set: function (prev) {
+            this.prev = prev;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Node.prototype, "nextSibling", {
+        /**
+         * Same as {@link next}.
+         * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.
+         */
+        get: function () {
+            return this.next;
+        },
+        set: function (next) {
+            this.next = next;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    /**
+     * Clone this node, and optionally its children.
+     *
+     * @param recursive Clone child nodes as well.
+     * @returns A clone of the node.
+     */
+    Node.prototype.cloneNode = function (recursive) {
+        if (recursive === void 0) { recursive = false; }
+        return cloneNode(this, recursive);
+    };
+    return Node;
+}());
+exports.Node = Node;
+/**
+ * A node that contains some data.
+ */
+var DataNode = /** @class */ (function (_super) {
+    __extends(DataNode, _super);
+    /**
+     * @param type The type of the node
+     * @param data The content of the data node
+     */
+    function DataNode(type, data) {
+        var _this = _super.call(this, type) || this;
+        _this.data = data;
+        return _this;
+    }
+    Object.defineProperty(DataNode.prototype, "nodeValue", {
+        /**
+         * Same as {@link data}.
+         * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.
+         */
+        get: function () {
+            return this.data;
+        },
+        set: function (data) {
+            this.data = data;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    return DataNode;
+}(Node));
+exports.DataNode = DataNode;
+/**
+ * Text within the document.
+ */
+var Text = /** @class */ (function (_super) {
+    __extends(Text, _super);
+    function Text(data) {
+        return _super.call(this, domelementtype_1.ElementType.Text, data) || this;
+    }
+    return Text;
+}(DataNode));
+exports.Text = Text;
+/**
+ * Comments within the document.
+ */
+var Comment = /** @class */ (function (_super) {
+    __extends(Comment, _super);
+    function Comment(data) {
+        return _super.call(this, domelementtype_1.ElementType.Comment, data) || this;
+    }
+    return Comment;
+}(DataNode));
+exports.Comment = Comment;
+/**
+ * Processing instructions, including doc types.
+ */
+var ProcessingInstruction = /** @class */ (function (_super) {
+    __extends(ProcessingInstruction, _super);
+    function ProcessingInstruction(name, data) {
+        var _this = _super.call(this, domelementtype_1.ElementType.Directive, data) || this;
+        _this.name = name;
+        return _this;
+    }
+    return ProcessingInstruction;
+}(DataNode));
+exports.ProcessingInstruction = ProcessingInstruction;
+/**
+ * A `Node` that can have children.
+ */
+var NodeWithChildren = /** @class */ (function (_super) {
+    __extends(NodeWithChildren, _super);
+    /**
+     * @param type Type of the node.
+     * @param children Children of the node. Only certain node types can have children.
+     */
+    function NodeWithChildren(type, children) {
+        var _this = _super.call(this, type) || this;
+        _this.children = children;
+        return _this;
+    }
+    Object.defineProperty(NodeWithChildren.prototype, "firstChild", {
+        // Aliases
+        /** First child of the node. */
+        get: function () {
+            var _a;
+            return (_a = this.children[0]) !== null && _a !== void 0 ? _a : null;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(NodeWithChildren.prototype, "lastChild", {
+        /** Last child of the node. */
+        get: function () {
+            return this.children.length > 0
+                ? this.children[this.children.length - 1]
+                : null;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(NodeWithChildren.prototype, "childNodes", {
+        /**
+         * Same as {@link children}.
+         * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.
+         */
+        get: function () {
+            return this.children;
+        },
+        set: function (children) {
+            this.children = children;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    return NodeWithChildren;
+}(Node));
+exports.NodeWithChildren = NodeWithChildren;
+/**
+ * The root node of the document.
+ */
+var Document = /** @class */ (function (_super) {
+    __extends(Document, _super);
+    function Document(children) {
+        return _super.call(this, domelementtype_1.ElementType.Root, children) || this;
+    }
+    return Document;
+}(NodeWithChildren));
+exports.Document = Document;
+/**
+ * An element within the DOM.
+ */
+var Element = /** @class */ (function (_super) {
+    __extends(Element, _super);
+    /**
+     * @param name Name of the tag, eg. `div`, `span`.
+     * @param attribs Object mapping attribute names to attribute values.
+     * @param children Children of the node.
+     */
+    function Element(name, attribs, children, type) {
+        if (children === void 0) { children = []; }
+        if (type === void 0) { type = name === "script"
+            ? domelementtype_1.ElementType.Script
+            : name === "style"
+                ? domelementtype_1.ElementType.Style
+                : domelementtype_1.ElementType.Tag; }
+        var _this = _super.call(this, type, children) || this;
+        _this.name = name;
+        _this.attribs = attribs;
+        return _this;
+    }
+    Object.defineProperty(Element.prototype, "tagName", {
+        // DOM Level 1 aliases
+        /**
+         * Same as {@link name}.
+         * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.
+         */
+        get: function () {
+            return this.name;
+        },
+        set: function (name) {
+            this.name = name;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Element.prototype, "attributes", {
+        get: function () {
+            var _this = this;
+            return Object.keys(this.attribs).map(function (name) {
+                var _a, _b;
+                return ({
+                    name: name,
+                    value: _this.attribs[name],
+                    namespace: (_a = _this["x-attribsNamespace"]) === null || _a === void 0 ? void 0 : _a[name],
+                    prefix: (_b = _this["x-attribsPrefix"]) === null || _b === void 0 ? void 0 : _b[name],
+                });
+            });
+        },
+        enumerable: false,
+        configurable: true
+    });
+    return Element;
+}(NodeWithChildren));
+exports.Element = Element;
+/**
+ * @param node Node to check.
+ * @returns `true` if the node is a `Element`, `false` otherwise.
+ */
+function isTag(node) {
+    return (0, domelementtype_1.isTag)(node);
+}
+exports.isTag = isTag;
+/**
+ * @param node Node to check.
+ * @returns `true` if the node has the type `CDATA`, `false` otherwise.
+ */
+function isCDATA(node) {
+    return node.type === domelementtype_1.ElementType.CDATA;
+}
+exports.isCDATA = isCDATA;
+/**
+ * @param node Node to check.
+ * @returns `true` if the node has the type `Text`, `false` otherwise.
+ */
+function isText(node) {
+    return node.type === domelementtype_1.ElementType.Text;
+}
+exports.isText = isText;
+/**
+ * @param node Node to check.
+ * @returns `true` if the node has the type `Comment`, `false` otherwise.
+ */
+function isComment(node) {
+    return node.type === domelementtype_1.ElementType.Comment;
+}
+exports.isComment = isComment;
+/**
+ * @param node Node to check.
+ * @returns `true` if the node has the type `ProcessingInstruction`, `false` otherwise.
+ */
+function isDirective(node) {
+    return node.type === domelementtype_1.ElementType.Directive;
+}
+exports.isDirective = isDirective;
+/**
+ * @param node Node to check.
+ * @returns `true` if the node has the type `ProcessingInstruction`, `false` otherwise.
+ */
+function isDocument(node) {
+    return node.type === domelementtype_1.ElementType.Root;
+}
+exports.isDocument = isDocument;
+/**
+ * @param node Node to check.
+ * @returns `true` if the node is a `NodeWithChildren` (has children), `false` otherwise.
+ */
+function hasChildren(node) {
+    return Object.prototype.hasOwnProperty.call(node, "children");
+}
+exports.hasChildren = hasChildren;
+/**
+ * Clone a node, and optionally its children.
+ *
+ * @param recursive Clone child nodes as well.
+ * @returns A clone of the node.
+ */
+function cloneNode(node, recursive) {
+    if (recursive === void 0) { recursive = false; }
+    var result;
+    if (isText(node)) {
+        result = new Text(node.data);
+    }
+    else if (isComment(node)) {
+        result = new Comment(node.data);
+    }
+    else if (isTag(node)) {
+        var children = recursive ? cloneChildren(node.children) : [];
+        var clone_1 = new Element(node.name, __assign({}, node.attribs), children);
+        children.forEach(function (child) { return (child.parent = clone_1); });
+        if (node.namespace != null) {
+            clone_1.namespace = node.namespace;
+        }
+        if (node["x-attribsNamespace"]) {
+            clone_1["x-attribsNamespace"] = __assign({}, node["x-attribsNamespace"]);
+        }
+        if (node["x-attribsPrefix"]) {
+            clone_1["x-attribsPrefix"] = __assign({}, node["x-attribsPrefix"]);
+        }
+        result = clone_1;
+    }
+    else if (isCDATA(node)) {
+        var children = recursive ? cloneChildren(node.children) : [];
+        var clone_2 = new NodeWithChildren(domelementtype_1.ElementType.CDATA, children);
+        children.forEach(function (child) { return (child.parent = clone_2); });
+        result = clone_2;
+    }
+    else if (isDocument(node)) {
+        var children = recursive ? cloneChildren(node.children) : [];
+        var clone_3 = new Document(children);
+        children.forEach(function (child) { return (child.parent = clone_3); });
+        if (node["x-mode"]) {
+            clone_3["x-mode"] = node["x-mode"];
+        }
+        result = clone_3;
+    }
+    else if (isDirective(node)) {
+        var instruction = new ProcessingInstruction(node.name, node.data);
+        if (node["x-name"] != null) {
+            instruction["x-name"] = node["x-name"];
+            instruction["x-publicId"] = node["x-publicId"];
+            instruction["x-systemId"] = node["x-systemId"];
+        }
+        result = instruction;
+    }
+    else {
+        throw new Error("Not implemented yet: ".concat(node.type));
+    }
+    result.startIndex = node.startIndex;
+    result.endIndex = node.endIndex;
+    if (node.sourceCodeLocation != null) {
+        result.sourceCodeLocation = node.sourceCodeLocation;
+    }
+    return result;
+}
+exports.cloneNode = cloneNode;
+function cloneChildren(childs) {
+    var children = childs.map(function (child) { return cloneNode(child, true); });
+    for (var i = 1; i < children.length; i++) {
+        children[i].prev = children[i - 1];
+        children[i - 1].next = children[i];
+    }
+    return children;
+}
+
+
+/***/ }),
+
+/***/ 6996:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.getFeed = void 0;
+var stringify_1 = __webpack_require__(3346);
+var legacy_1 = __webpack_require__(3905);
+/**
+ * Get the feed object from the root of a DOM tree.
+ *
+ * @param doc - The DOM to to extract the feed from.
+ * @returns The feed.
+ */
+function getFeed(doc) {
+    var feedRoot = getOneElement(isValidFeed, doc);
+    return !feedRoot
+        ? null
+        : feedRoot.name === "feed"
+            ? getAtomFeed(feedRoot)
+            : getRssFeed(feedRoot);
+}
+exports.getFeed = getFeed;
+/**
+ * Parse an Atom feed.
+ *
+ * @param feedRoot The root of the feed.
+ * @returns The parsed feed.
+ */
+function getAtomFeed(feedRoot) {
+    var _a;
+    var childs = feedRoot.children;
+    var feed = {
+        type: "atom",
+        items: (0, legacy_1.getElementsByTagName)("entry", childs).map(function (item) {
+            var _a;
+            var children = item.children;
+            var entry = { media: getMediaElements(children) };
+            addConditionally(entry, "id", "id", children);
+            addConditionally(entry, "title", "title", children);
+            var href = (_a = getOneElement("link", children)) === null || _a === void 0 ? void 0 : _a.attribs.href;
+            if (href) {
+                entry.link = href;
+            }
+            var description = fetch("summary", children) || fetch("content", children);
+            if (description) {
+                entry.description = description;
+            }
+            var pubDate = fetch("updated", children);
+            if (pubDate) {
+                entry.pubDate = new Date(pubDate);
+            }
+            return entry;
+        }),
+    };
+    addConditionally(feed, "id", "id", childs);
+    addConditionally(feed, "title", "title", childs);
+    var href = (_a = getOneElement("link", childs)) === null || _a === void 0 ? void 0 : _a.attribs.href;
+    if (href) {
+        feed.link = href;
+    }
+    addConditionally(feed, "description", "subtitle", childs);
+    var updated = fetch("updated", childs);
+    if (updated) {
+        feed.updated = new Date(updated);
+    }
+    addConditionally(feed, "author", "email", childs, true);
+    return feed;
+}
+/**
+ * Parse a RSS feed.
+ *
+ * @param feedRoot The root of the feed.
+ * @returns The parsed feed.
+ */
+function getRssFeed(feedRoot) {
+    var _a, _b;
+    var childs = (_b = (_a = getOneElement("channel", feedRoot.children)) === null || _a === void 0 ? void 0 : _a.children) !== null && _b !== void 0 ? _b : [];
+    var feed = {
+        type: feedRoot.name.substr(0, 3),
+        id: "",
+        items: (0, legacy_1.getElementsByTagName)("item", feedRoot.children).map(function (item) {
+            var children = item.children;
+            var entry = { media: getMediaElements(children) };
+            addConditionally(entry, "id", "guid", children);
+            addConditionally(entry, "title", "title", children);
+            addConditionally(entry, "link", "link", children);
+            addConditionally(entry, "description", "description", children);
+            var pubDate = fetch("pubDate", children);
+            if (pubDate)
+                entry.pubDate = new Date(pubDate);
+            return entry;
+        }),
+    };
+    addConditionally(feed, "title", "title", childs);
+    addConditionally(feed, "link", "link", childs);
+    addConditionally(feed, "description", "description", childs);
+    var updated = fetch("lastBuildDate", childs);
+    if (updated) {
+        feed.updated = new Date(updated);
+    }
+    addConditionally(feed, "author", "managingEditor", childs, true);
+    return feed;
+}
+var MEDIA_KEYS_STRING = ["url", "type", "lang"];
+var MEDIA_KEYS_INT = [
+    "fileSize",
+    "bitrate",
+    "framerate",
+    "samplingrate",
+    "channels",
+    "duration",
+    "height",
+    "width",
+];
+/**
+ * Get all media elements of a feed item.
+ *
+ * @param where Nodes to search in.
+ * @returns Media elements.
+ */
+function getMediaElements(where) {
+    return (0, legacy_1.getElementsByTagName)("media:content", where).map(function (elem) {
+        var attribs = elem.attribs;
+        var media = {
+            medium: attribs.medium,
+            isDefault: !!attribs.isDefault,
+        };
+        for (var _i = 0, MEDIA_KEYS_STRING_1 = MEDIA_KEYS_STRING; _i < MEDIA_KEYS_STRING_1.length; _i++) {
+            var attrib = MEDIA_KEYS_STRING_1[_i];
+            if (attribs[attrib]) {
+                media[attrib] = attribs[attrib];
+            }
+        }
+        for (var _a = 0, MEDIA_KEYS_INT_1 = MEDIA_KEYS_INT; _a < MEDIA_KEYS_INT_1.length; _a++) {
+            var attrib = MEDIA_KEYS_INT_1[_a];
+            if (attribs[attrib]) {
+                media[attrib] = parseInt(attribs[attrib], 10);
+            }
+        }
+        if (attribs.expression) {
+            media.expression =
+                attribs.expression;
+        }
+        return media;
+    });
+}
+/**
+ * Get one element by tag name.
+ *
+ * @param tagName Tag name to look for
+ * @param node Node to search in
+ * @returns The element or null
+ */
+function getOneElement(tagName, node) {
+    return (0, legacy_1.getElementsByTagName)(tagName, node, true, 1)[0];
+}
+/**
+ * Get the text content of an element with a certain tag name.
+ *
+ * @param tagName Tag name to look for.
+ * @param where  Node to search in.
+ * @param recurse Whether to recurse into child nodes.
+ * @returns The text content of the element.
+ */
+function fetch(tagName, where, recurse) {
+    if (recurse === void 0) { recurse = false; }
+    return (0, stringify_1.textContent)((0, legacy_1.getElementsByTagName)(tagName, where, recurse, 1)).trim();
+}
+/**
+ * Adds a property to an object if it has a value.
+ *
+ * @param obj Object to be extended
+ * @param prop Property name
+ * @param tagName Tag name that contains the conditionally added property
+ * @param where Element to search for the property
+ * @param recurse Whether to recurse into child nodes.
+ */
+function addConditionally(obj, prop, tagName, where, recurse) {
+    if (recurse === void 0) { recurse = false; }
+    var val = fetch(tagName, where, recurse);
+    if (val)
+        obj[prop] = val;
+}
+/**
+ * Checks if an element is a feed root node.
+ *
+ * @param value The name of the element to check.
+ * @returns Whether an element is a feed root node.
+ */
+function isValidFeed(value) {
+    return value === "rss" || value === "feed" || value === "rdf:RDF";
+}
+
+
+/***/ }),
+
+/***/ 4975:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.uniqueSort = exports.compareDocumentPosition = exports.removeSubsets = void 0;
+var domhandler_1 = __webpack_require__(7915);
+/**
+ * Given an array of nodes, remove any member that is contained by another.
+ *
+ * @param nodes Nodes to filter.
+ * @returns Remaining nodes that aren't subtrees of each other.
+ */
+function removeSubsets(nodes) {
+    var idx = nodes.length;
+    /*
+     * Check if each node (or one of its ancestors) is already contained in the
+     * array.
+     */
+    while (--idx >= 0) {
+        var node = nodes[idx];
+        /*
+         * Remove the node if it is not unique.
+         * We are going through the array from the end, so we only
+         * have to check nodes that preceed the node under consideration in the array.
+         */
+        if (idx > 0 && nodes.lastIndexOf(node, idx - 1) >= 0) {
+            nodes.splice(idx, 1);
+            continue;
+        }
+        for (var ancestor = node.parent; ancestor; ancestor = ancestor.parent) {
+            if (nodes.includes(ancestor)) {
+                nodes.splice(idx, 1);
+                break;
+            }
+        }
+    }
+    return nodes;
+}
+exports.removeSubsets = removeSubsets;
+/**
+ * Compare the position of one node against another node in any other document.
+ * The return value is a bitmask with the following values:
+ *
+ * Document order:
+ * > There is an ordering, document order, defined on all the nodes in the
+ * > document corresponding to the order in which the first character of the
+ * > XML representation of each node occurs in the XML representation of the
+ * > document after expansion of general entities. Thus, the document element
+ * > node will be the first node. Element nodes occur before their children.
+ * > Thus, document order orders element nodes in order of the occurrence of
+ * > their start-tag in the XML (after expansion of entities). The attribute
+ * > nodes of an element occur after the element and before its children. The
+ * > relative order of attribute nodes is implementation-dependent./
+ *
+ * Source:
+ * http://www.w3.org/TR/DOM-Level-3-Core/glossary.html#dt-document-order
+ *
+ * @param nodeA The first node to use in the comparison
+ * @param nodeB The second node to use in the comparison
+ * @returns A bitmask describing the input nodes' relative position.
+ *
+ * See http://dom.spec.whatwg.org/#dom-node-comparedocumentposition for
+ * a description of these values.
+ */
+function compareDocumentPosition(nodeA, nodeB) {
+    var aParents = [];
+    var bParents = [];
+    if (nodeA === nodeB) {
+        return 0;
+    }
+    var current = (0, domhandler_1.hasChildren)(nodeA) ? nodeA : nodeA.parent;
+    while (current) {
+        aParents.unshift(current);
+        current = current.parent;
+    }
+    current = (0, domhandler_1.hasChildren)(nodeB) ? nodeB : nodeB.parent;
+    while (current) {
+        bParents.unshift(current);
+        current = current.parent;
+    }
+    var maxIdx = Math.min(aParents.length, bParents.length);
+    var idx = 0;
+    while (idx < maxIdx && aParents[idx] === bParents[idx]) {
+        idx++;
+    }
+    if (idx === 0) {
+        return 1 /* DISCONNECTED */;
+    }
+    var sharedParent = aParents[idx - 1];
+    var siblings = sharedParent.children;
+    var aSibling = aParents[idx];
+    var bSibling = bParents[idx];
+    if (siblings.indexOf(aSibling) > siblings.indexOf(bSibling)) {
+        if (sharedParent === nodeB) {
+            return 4 /* FOLLOWING */ | 16 /* CONTAINED_BY */;
+        }
+        return 4 /* FOLLOWING */;
+    }
+    if (sharedParent === nodeA) {
+        return 2 /* PRECEDING */ | 8 /* CONTAINS */;
+    }
+    return 2 /* PRECEDING */;
+}
+exports.compareDocumentPosition = compareDocumentPosition;
+/**
+ * Sort an array of nodes based on their relative position in the document and
+ * remove any duplicate nodes. If the array contains nodes that do not belong
+ * to the same document, sort order is unspecified.
+ *
+ * @param nodes Array of DOM nodes.
+ * @returns Collection of unique nodes, sorted in document order.
+ */
+function uniqueSort(nodes) {
+    nodes = nodes.filter(function (node, i, arr) { return !arr.includes(node, i + 1); });
+    nodes.sort(function (a, b) {
+        var relative = compareDocumentPosition(a, b);
+        if (relative & 2 /* PRECEDING */) {
+            return -1;
+        }
+        else if (relative & 4 /* FOLLOWING */) {
+            return 1;
+        }
+        return 0;
+    });
+    return nodes;
+}
+exports.uniqueSort = uniqueSort;
+
+
+/***/ }),
+
+/***/ 9432:
+/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
+
+"use strict";
+
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __exportStar = (this && this.__exportStar) || function(m, exports) {
+    for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
+};
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.hasChildren = exports.isDocument = exports.isComment = exports.isText = exports.isCDATA = exports.isTag = void 0;
+__exportStar(__webpack_require__(3346), exports);
+__exportStar(__webpack_require__(5010), exports);
+__exportStar(__webpack_require__(6765), exports);
+__exportStar(__webpack_require__(8043), exports);
+__exportStar(__webpack_require__(3905), exports);
+__exportStar(__webpack_require__(4975), exports);
+__exportStar(__webpack_require__(6996), exports);
+/** @deprecated Use these methods from `domhandler` directly. */
+var domhandler_1 = __webpack_require__(7915);
+Object.defineProperty(exports, "isTag", ({ enumerable: true, get: function () { return domhandler_1.isTag; } }));
+Object.defineProperty(exports, "isCDATA", ({ enumerable: true, get: function () { return domhandler_1.isCDATA; } }));
+Object.defineProperty(exports, "isText", ({ enumerable: true, get: function () { return domhandler_1.isText; } }));
+Object.defineProperty(exports, "isComment", ({ enumerable: true, get: function () { return domhandler_1.isComment; } }));
+Object.defineProperty(exports, "isDocument", ({ enumerable: true, get: function () { return domhandler_1.isDocument; } }));
+Object.defineProperty(exports, "hasChildren", ({ enumerable: true, get: function () { return domhandler_1.hasChildren; } }));
+
+
+/***/ }),
+
+/***/ 3905:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.getElementsByTagType = exports.getElementsByTagName = exports.getElementById = exports.getElements = exports.testElement = void 0;
+var domhandler_1 = __webpack_require__(7915);
+var querying_1 = __webpack_require__(8043);
+var Checks = {
+    tag_name: function (name) {
+        if (typeof name === "function") {
+            return function (elem) { return (0, domhandler_1.isTag)(elem) && name(elem.name); };
+        }
+        else if (name === "*") {
+            return domhandler_1.isTag;
+        }
+        return function (elem) { return (0, domhandler_1.isTag)(elem) && elem.name === name; };
+    },
+    tag_type: function (type) {
+        if (typeof type === "function") {
+            return function (elem) { return type(elem.type); };
+        }
+        return function (elem) { return elem.type === type; };
+    },
+    tag_contains: function (data) {
+        if (typeof data === "function") {
+            return function (elem) { return (0, domhandler_1.isText)(elem) && data(elem.data); };
+        }
+        return function (elem) { return (0, domhandler_1.isText)(elem) && elem.data === data; };
+    },
+};
+/**
+ * @param attrib Attribute to check.
+ * @param value Attribute value to look for.
+ * @returns A function to check whether the a node has an attribute with a particular value.
+ */
+function getAttribCheck(attrib, value) {
+    if (typeof value === "function") {
+        return function (elem) { return (0, domhandler_1.isTag)(elem) && value(elem.attribs[attrib]); };
+    }
+    return function (elem) { return (0, domhandler_1.isTag)(elem) && elem.attribs[attrib] === value; };
+}
+/**
+ * @param a First function to combine.
+ * @param b Second function to combine.
+ * @returns A function taking a node and returning `true` if either
+ * of the input functions returns `true` for the node.
+ */
+function combineFuncs(a, b) {
+    return function (elem) { return a(elem) || b(elem); };
+}
+/**
+ * @param options An object describing nodes to look for.
+ * @returns A function executing all checks in `options` and returning `true`
+ * if any of them match a node.
+ */
+function compileTest(options) {
+    var funcs = Object.keys(options).map(function (key) {
+        var value = options[key];
+        return Object.prototype.hasOwnProperty.call(Checks, key)
+            ? Checks[key](value)
+            : getAttribCheck(key, value);
+    });
+    return funcs.length === 0 ? null : funcs.reduce(combineFuncs);
+}
+/**
+ * @param options An object describing nodes to look for.
+ * @param node The element to test.
+ * @returns Whether the element matches the description in `options`.
+ */
+function testElement(options, node) {
+    var test = compileTest(options);
+    return test ? test(node) : true;
+}
+exports.testElement = testElement;
+/**
+ * @param options An object describing nodes to look for.
+ * @param nodes Nodes to search through.
+ * @param recurse Also consider child nodes.
+ * @param limit Maximum number of nodes to return.
+ * @returns All nodes that match `options`.
+ */
+function getElements(options, nodes, recurse, limit) {
+    if (limit === void 0) { limit = Infinity; }
+    var test = compileTest(options);
+    return test ? (0, querying_1.filter)(test, nodes, recurse, limit) : [];
+}
+exports.getElements = getElements;
+/**
+ * @param id The unique ID attribute value to look for.
+ * @param nodes Nodes to search through.
+ * @param recurse Also consider child nodes.
+ * @returns The node with the supplied ID.
+ */
+function getElementById(id, nodes, recurse) {
+    if (recurse === void 0) { recurse = true; }
+    if (!Array.isArray(nodes))
+        nodes = [nodes];
+    return (0, querying_1.findOne)(getAttribCheck("id", id), nodes, recurse);
+}
+exports.getElementById = getElementById;
+/**
+ * @param tagName Tag name to search for.
+ * @param nodes Nodes to search through.
+ * @param recurse Also consider child nodes.
+ * @param limit Maximum number of nodes to return.
+ * @returns All nodes with the supplied `tagName`.
+ */
+function getElementsByTagName(tagName, nodes, recurse, limit) {
+    if (recurse === void 0) { recurse = true; }
+    if (limit === void 0) { limit = Infinity; }
+    return (0, querying_1.filter)(Checks.tag_name(tagName), nodes, recurse, limit);
+}
+exports.getElementsByTagName = getElementsByTagName;
+/**
+ * @param type Element type to look for.
+ * @param nodes Nodes to search through.
+ * @param recurse Also consider child nodes.
+ * @param limit Maximum number of nodes to return.
+ * @returns All nodes with the supplied `type`.
+ */
+function getElementsByTagType(type, nodes, recurse, limit) {
+    if (recurse === void 0) { recurse = true; }
+    if (limit === void 0) { limit = Infinity; }
+    return (0, querying_1.filter)(Checks.tag_type(type), nodes, recurse, limit);
+}
+exports.getElementsByTagType = getElementsByTagType;
+
+
+/***/ }),
+
+/***/ 6765:
+/***/ ((__unused_webpack_module, exports) => {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.prepend = exports.prependChild = exports.append = exports.appendChild = exports.replaceElement = exports.removeElement = void 0;
+/**
+ * Remove an element from the dom
+ *
+ * @param elem The element to be removed
+ */
+function removeElement(elem) {
+    if (elem.prev)
+        elem.prev.next = elem.next;
+    if (elem.next)
+        elem.next.prev = elem.prev;
+    if (elem.parent) {
+        var childs = elem.parent.children;
+        childs.splice(childs.lastIndexOf(elem), 1);
+    }
+}
+exports.removeElement = removeElement;
+/**
+ * Replace an element in the dom
+ *
+ * @param elem The element to be replaced
+ * @param replacement The element to be added
+ */
+function replaceElement(elem, replacement) {
+    var prev = (replacement.prev = elem.prev);
+    if (prev) {
+        prev.next = replacement;
+    }
+    var next = (replacement.next = elem.next);
+    if (next) {
+        next.prev = replacement;
+    }
+    var parent = (replacement.parent = elem.parent);
+    if (parent) {
+        var childs = parent.children;
+        childs[childs.lastIndexOf(elem)] = replacement;
+    }
+}
+exports.replaceElement = replaceElement;
+/**
+ * Append a child to an element.
+ *
+ * @param elem The element to append to.
+ * @param child The element to be added as a child.
+ */
+function appendChild(elem, child) {
+    removeElement(child);
+    child.next = null;
+    child.parent = elem;
+    if (elem.children.push(child) > 1) {
+        var sibling = elem.children[elem.children.length - 2];
+        sibling.next = child;
+        child.prev = sibling;
+    }
+    else {
+        child.prev = null;
+    }
+}
+exports.appendChild = appendChild;
+/**
+ * Append an element after another.
+ *
+ * @param elem The element to append after.
+ * @param next The element be added.
+ */
+function append(elem, next) {
+    removeElement(next);
+    var parent = elem.parent;
+    var currNext = elem.next;
+    next.next = currNext;
+    next.prev = elem;
+    elem.next = next;
+    next.parent = parent;
+    if (currNext) {
+        currNext.prev = next;
+        if (parent) {
+            var childs = parent.children;
+            childs.splice(childs.lastIndexOf(currNext), 0, next);
+        }
+    }
+    else if (parent) {
+        parent.children.push(next);
+    }
+}
+exports.append = append;
+/**
+ * Prepend a child to an element.
+ *
+ * @param elem The element to prepend before.
+ * @param child The element to be added as a child.
+ */
+function prependChild(elem, child) {
+    removeElement(child);
+    child.parent = elem;
+    child.prev = null;
+    if (elem.children.unshift(child) !== 1) {
+        var sibling = elem.children[1];
+        sibling.prev = child;
+        child.next = sibling;
+    }
+    else {
+        child.next = null;
+    }
+}
+exports.prependChild = prependChild;
+/**
+ * Prepend an element before another.
+ *
+ * @param elem The element to prepend before.
+ * @param prev The element be added.
+ */
+function prepend(elem, prev) {
+    removeElement(prev);
+    var parent = elem.parent;
+    if (parent) {
+        var childs = parent.children;
+        childs.splice(childs.indexOf(elem), 0, prev);
+    }
+    if (elem.prev) {
+        elem.prev.next = prev;
+    }
+    prev.parent = parent;
+    prev.prev = elem.prev;
+    prev.next = elem;
+    elem.prev = prev;
+}
+exports.prepend = prepend;
+
+
+/***/ }),
+
+/***/ 8043:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.findAll = exports.existsOne = exports.findOne = exports.findOneChild = exports.find = exports.filter = void 0;
+var domhandler_1 = __webpack_require__(7915);
+/**
+ * Search a node and its children for nodes passing a test function.
+ *
+ * @param test Function to test nodes on.
+ * @param node Node to search. Will be included in the result set if it matches.
+ * @param recurse Also consider child nodes.
+ * @param limit Maximum number of nodes to return.
+ * @returns All nodes passing `test`.
+ */
+function filter(test, node, recurse, limit) {
+    if (recurse === void 0) { recurse = true; }
+    if (limit === void 0) { limit = Infinity; }
+    if (!Array.isArray(node))
+        node = [node];
+    return find(test, node, recurse, limit);
+}
+exports.filter = filter;
+/**
+ * Search an array of node and its children for nodes passing a test function.
+ *
+ * @param test Function to test nodes on.
+ * @param nodes Array of nodes to search.
+ * @param recurse Also consider child nodes.
+ * @param limit Maximum number of nodes to return.
+ * @returns All nodes passing `test`.
+ */
+function find(test, nodes, recurse, limit) {
+    var result = [];
+    for (var _i = 0, nodes_1 = nodes; _i < nodes_1.length; _i++) {
+        var elem = nodes_1[_i];
+        if (test(elem)) {
+            result.push(elem);
+            if (--limit <= 0)
+                break;
+        }
+        if (recurse && (0, domhandler_1.hasChildren)(elem) && elem.children.length > 0) {
+            var children = find(test, elem.children, recurse, limit);
+            result.push.apply(result, children);
+            limit -= children.length;
+            if (limit <= 0)
+                break;
+        }
+    }
+    return result;
+}
+exports.find = find;
+/**
+ * Finds the first element inside of an array that matches a test function.
+ *
+ * @param test Function to test nodes on.
+ * @param nodes Array of nodes to search.
+ * @returns The first node in the array that passes `test`.
+ */
+function findOneChild(test, nodes) {
+    return nodes.find(test);
+}
+exports.findOneChild = findOneChild;
+/**
+ * Finds one element in a tree that passes a test.
+ *
+ * @param test Function to test nodes on.
+ * @param nodes Array of nodes to search.
+ * @param recurse Also consider child nodes.
+ * @returns The first child node that passes `test`.
+ */
+function findOne(test, nodes, recurse) {
+    if (recurse === void 0) { recurse = true; }
+    var elem = null;
+    for (var i = 0; i < nodes.length && !elem; i++) {
+        var checked = nodes[i];
+        if (!(0, domhandler_1.isTag)(checked)) {
+            continue;
+        }
+        else if (test(checked)) {
+            elem = checked;
+        }
+        else if (recurse && checked.children.length > 0) {
+            elem = findOne(test, checked.children);
+        }
+    }
+    return elem;
+}
+exports.findOne = findOne;
+/**
+ * @param test Function to test nodes on.
+ * @param nodes Array of nodes to search.
+ * @returns Whether a tree of nodes contains at least one node passing a test.
+ */
+function existsOne(test, nodes) {
+    return nodes.some(function (checked) {
+        return (0, domhandler_1.isTag)(checked) &&
+            (test(checked) ||
+                (checked.children.length > 0 &&
+                    existsOne(test, checked.children)));
+    });
+}
+exports.existsOne = existsOne;
+/**
+ * Search and array of nodes and its children for nodes passing a test function.
+ *
+ * Same as `find`, only with less options, leading to reduced complexity.
+ *
+ * @param test Function to test nodes on.
+ * @param nodes Array of nodes to search.
+ * @returns All nodes passing `test`.
+ */
+function findAll(test, nodes) {
+    var _a;
+    var result = [];
+    var stack = nodes.filter(domhandler_1.isTag);
+    var elem;
+    while ((elem = stack.shift())) {
+        var children = (_a = elem.children) === null || _a === void 0 ? void 0 : _a.filter(domhandler_1.isTag);
+        if (children && children.length > 0) {
+            stack.unshift.apply(stack, children);
+        }
+        if (test(elem))
+            result.push(elem);
+    }
+    return result;
+}
+exports.findAll = findAll;
+
+
+/***/ }),
+
+/***/ 3346:
+/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
+
+"use strict";
+
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.innerText = exports.textContent = exports.getText = exports.getInnerHTML = exports.getOuterHTML = void 0;
+var domhandler_1 = __webpack_require__(7915);
+var dom_serializer_1 = __importDefault(__webpack_require__(7220));
+var domelementtype_1 = __webpack_require__(9960);
+/**
+ * @param node Node to get the outer HTML of.
+ * @param options Options for serialization.
+ * @deprecated Use the `dom-serializer` module directly.
+ * @returns `node`'s outer HTML.
+ */
+function getOuterHTML(node, options) {
+    return (0, dom_serializer_1.default)(node, options);
+}
+exports.getOuterHTML = getOuterHTML;
+/**
+ * @param node Node to get the inner HTML of.
+ * @param options Options for serialization.
+ * @deprecated Use the `dom-serializer` module directly.
+ * @returns `node`'s inner HTML.
+ */
+function getInnerHTML(node, options) {
+    return (0, domhandler_1.hasChildren)(node)
+        ? node.children.map(function (node) { return getOuterHTML(node, options); }).join("")
+        : "";
+}
+exports.getInnerHTML = getInnerHTML;
+/**
+ * Get a node's inner text. Same as `textContent`, but inserts newlines for `<br>` tags.
+ *
+ * @deprecated Use `textContent` instead.
+ * @param node Node to get the inner text of.
+ * @returns `node`'s inner text.
+ */
+function getText(node) {
+    if (Array.isArray(node))
+        return node.map(getText).join("");
+    if ((0, domhandler_1.isTag)(node))
+        return node.name === "br" ? "\n" : getText(node.children);
+    if ((0, domhandler_1.isCDATA)(node))
+        return getText(node.children);
+    if ((0, domhandler_1.isText)(node))
+        return node.data;
+    return "";
+}
+exports.getText = getText;
+/**
+ * Get a node's text content.
+ *
+ * @param node Node to get the text content of.
+ * @returns `node`'s text content.
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent}
+ */
+function textContent(node) {
+    if (Array.isArray(node))
+        return node.map(textContent).join("");
+    if ((0, domhandler_1.hasChildren)(node) && !(0, domhandler_1.isComment)(node)) {
+        return textContent(node.children);
+    }
+    if ((0, domhandler_1.isText)(node))
+        return node.data;
+    return "";
+}
+exports.textContent = textContent;
+/**
+ * Get a node's inner text.
+ *
+ * @param node Node to get the inner text of.
+ * @returns `node`'s inner text.
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Node/innerText}
+ */
+function innerText(node) {
+    if (Array.isArray(node))
+        return node.map(innerText).join("");
+    if ((0, domhandler_1.hasChildren)(node) && (node.type === domelementtype_1.ElementType.Tag || (0, domhandler_1.isCDATA)(node))) {
+        return innerText(node.children);
+    }
+    if ((0, domhandler_1.isText)(node))
+        return node.data;
+    return "";
+}
+exports.innerText = innerText;
+
+
+/***/ }),
+
+/***/ 5010:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.prevElementSibling = exports.nextElementSibling = exports.getName = exports.hasAttrib = exports.getAttributeValue = exports.getSiblings = exports.getParent = exports.getChildren = void 0;
+var domhandler_1 = __webpack_require__(7915);
+var emptyArray = [];
+/**
+ * Get a node's children.
+ *
+ * @param elem Node to get the children of.
+ * @returns `elem`'s children, or an empty array.
+ */
+function getChildren(elem) {
+    var _a;
+    return (_a = elem.children) !== null && _a !== void 0 ? _a : emptyArray;
+}
+exports.getChildren = getChildren;
+/**
+ * Get a node's parent.
+ *
+ * @param elem Node to get the parent of.
+ * @returns `elem`'s parent node.
+ */
+function getParent(elem) {
+    return elem.parent || null;
+}
+exports.getParent = getParent;
+/**
+ * Gets an elements siblings, including the element itself.
+ *
+ * Attempts to get the children through the element's parent first.
+ * If we don't have a parent (the element is a root node),
+ * we walk the element's `prev` & `next` to get all remaining nodes.
+ *
+ * @param elem Element to get the siblings of.
+ * @returns `elem`'s siblings.
+ */
+function getSiblings(elem) {
+    var _a, _b;
+    var parent = getParent(elem);
+    if (parent != null)
+        return getChildren(parent);
+    var siblings = [elem];
+    var prev = elem.prev, next = elem.next;
+    while (prev != null) {
+        siblings.unshift(prev);
+        (_a = prev, prev = _a.prev);
+    }
+    while (next != null) {
+        siblings.push(next);
+        (_b = next, next = _b.next);
+    }
+    return siblings;
+}
+exports.getSiblings = getSiblings;
+/**
+ * Gets an attribute from an element.
+ *
+ * @param elem Element to check.
+ * @param name Attribute name to retrieve.
+ * @returns The element's attribute value, or `undefined`.
+ */
+function getAttributeValue(elem, name) {
+    var _a;
+    return (_a = elem.attribs) === null || _a === void 0 ? void 0 : _a[name];
+}
+exports.getAttributeValue = getAttributeValue;
+/**
+ * Checks whether an element has an attribute.
+ *
+ * @param elem Element to check.
+ * @param name Attribute name to look for.
+ * @returns Returns whether `elem` has the attribute `name`.
+ */
+function hasAttrib(elem, name) {
+    return (elem.attribs != null &&
+        Object.prototype.hasOwnProperty.call(elem.attribs, name) &&
+        elem.attribs[name] != null);
+}
+exports.hasAttrib = hasAttrib;
+/**
+ * Get the tag name of an element.
+ *
+ * @param elem The element to get the name for.
+ * @returns The tag name of `elem`.
+ */
+function getName(elem) {
+    return elem.name;
+}
+exports.getName = getName;
+/**
+ * Returns the next element sibling of a node.
+ *
+ * @param elem The element to get the next sibling of.
+ * @returns `elem`'s next sibling that is a tag.
+ */
+function nextElementSibling(elem) {
+    var _a;
+    var next = elem.next;
+    while (next !== null && !(0, domhandler_1.isTag)(next))
+        (_a = next, next = _a.next);
+    return next;
+}
+exports.nextElementSibling = nextElementSibling;
+/**
+ * Returns the previous element sibling of a node.
+ *
+ * @param elem The element to get the previous sibling of.
+ * @returns `elem`'s previous sibling that is a tag.
+ */
+function prevElementSibling(elem) {
+    var _a;
+    var prev = elem.prev;
+    while (prev !== null && !(0, domhandler_1.isTag)(prev))
+        (_a = prev, prev = _a.prev);
+    return prev;
+}
+exports.prevElementSibling = prevElementSibling;
+
+
+/***/ }),
+
+/***/ 4076:
+/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
+
+"use strict";
+
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.decodeHTML = exports.decodeHTMLStrict = exports.decodeXML = void 0;
+var entities_json_1 = __importDefault(__webpack_require__(9323));
+var legacy_json_1 = __importDefault(__webpack_require__(9591));
+var xml_json_1 = __importDefault(__webpack_require__(2586));
+var decode_codepoint_1 = __importDefault(__webpack_require__(26));
+var strictEntityRe = /&(?:[a-zA-Z0-9]+|#[xX][\da-fA-F]+|#\d+);/g;
+exports.decodeXML = getStrictDecoder(xml_json_1.default);
+exports.decodeHTMLStrict = getStrictDecoder(entities_json_1.default);
+function getStrictDecoder(map) {
+    var replace = getReplacer(map);
+    return function (str) { return String(str).replace(strictEntityRe, replace); };
+}
+var sorter = function (a, b) { return (a < b ? 1 : -1); };
+exports.decodeHTML = (function () {
+    var legacy = Object.keys(legacy_json_1.default).sort(sorter);
+    var keys = Object.keys(entities_json_1.default).sort(sorter);
+    for (var i = 0, j = 0; i < keys.length; i++) {
+        if (legacy[j] === keys[i]) {
+            keys[i] += ";?";
+            j++;
+        }
+        else {
+            keys[i] += ";";
+        }
+    }
+    var re = new RegExp("&(?:" + keys.join("|") + "|#[xX][\\da-fA-F]+;?|#\\d+;?)", "g");
+    var replace = getReplacer(entities_json_1.default);
+    function replacer(str) {
+        if (str.substr(-1) !== ";")
+            str += ";";
+        return replace(str);
+    }
+    // TODO consider creating a merged map
+    return function (str) { return String(str).replace(re, replacer); };
+})();
+function getReplacer(map) {
+    return function replace(str) {
+        if (str.charAt(1) === "#") {
+            var secondChar = str.charAt(2);
+            if (secondChar === "X" || secondChar === "x") {
+                return decode_codepoint_1.default(parseInt(str.substr(3), 16));
+            }
+            return decode_codepoint_1.default(parseInt(str.substr(2), 10));
+        }
+        // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
+        return map[str.slice(1, -1)] || str;
+    };
+}
+
+
+/***/ }),
+
+/***/ 26:
+/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
+
+"use strict";
+
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+var decode_json_1 = __importDefault(__webpack_require__(3600));
+// Adapted from https://github.com/mathiasbynens/he/blob/master/src/he.js#L94-L119
+var fromCodePoint = 
+// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
+String.fromCodePoint ||
+    function (codePoint) {
+        var output = "";
+        if (codePoint > 0xffff) {
+            codePoint -= 0x10000;
+            output += String.fromCharCode(((codePoint >>> 10) & 0x3ff) | 0xd800);
+            codePoint = 0xdc00 | (codePoint & 0x3ff);
+        }
+        output += String.fromCharCode(codePoint);
+        return output;
+    };
+function decodeCodePoint(codePoint) {
+    if ((codePoint >= 0xd800 && codePoint <= 0xdfff) || codePoint > 0x10ffff) {
+        return "\uFFFD";
+    }
+    if (codePoint in decode_json_1.default) {
+        codePoint = decode_json_1.default[codePoint];
+    }
+    return fromCodePoint(codePoint);
+}
+exports["default"] = decodeCodePoint;
+
+
+/***/ }),
+
+/***/ 7322:
+/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
+
+"use strict";
+
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.escapeUTF8 = exports.escape = exports.encodeNonAsciiHTML = exports.encodeHTML = exports.encodeXML = void 0;
+var xml_json_1 = __importDefault(__webpack_require__(2586));
+var inverseXML = getInverseObj(xml_json_1.default);
+var xmlReplacer = getInverseReplacer(inverseXML);
+/**
+ * Encodes all non-ASCII characters, as well as characters not valid in XML
+ * documents using XML entities.
+ *
+ * If a character has no equivalent entity, a
+ * numeric hexadecimal reference (eg. `&#xfc;`) will be used.
+ */
+exports.encodeXML = getASCIIEncoder(inverseXML);
+var entities_json_1 = __importDefault(__webpack_require__(9323));
+var inverseHTML = getInverseObj(entities_json_1.default);
+var htmlReplacer = getInverseReplacer(inverseHTML);
+/**
+ * Encodes all entities and non-ASCII characters in the input.
+ *
+ * This includes characters that are valid ASCII characters in HTML documents.
+ * For example `#` will be encoded as `&num;`. To get a more compact output,
+ * consider using the `encodeNonAsciiHTML` function.
+ *
+ * If a character has no equivalent entity, a
+ * numeric hexadecimal reference (eg. `&#xfc;`) will be used.
+ */
+exports.encodeHTML = getInverse(inverseHTML, htmlReplacer);
+/**
+ * Encodes all non-ASCII characters, as well as characters not valid in HTML
+ * documents using HTML entities.
+ *
+ * If a character has no equivalent entity, a
+ * numeric hexadecimal reference (eg. `&#xfc;`) will be used.
+ */
+exports.encodeNonAsciiHTML = getASCIIEncoder(inverseHTML);
+function getInverseObj(obj) {
+    return Object.keys(obj)
+        .sort()
+        .reduce(function (inverse, name) {
+        inverse[obj[name]] = "&" + name + ";";
+        return inverse;
+    }, {});
+}
+function getInverseReplacer(inverse) {
+    var single = [];
+    var multiple = [];
+    for (var _i = 0, _a = Object.keys(inverse); _i < _a.length; _i++) {
+        var k = _a[_i];
+        if (k.length === 1) {
+            // Add value to single array
+            single.push("\\" + k);
+        }
+        else {
+            // Add value to multiple array
+            multiple.push(k);
+        }
+    }
+    // Add ranges to single characters.
+    single.sort();
+    for (var start = 0; start < single.length - 1; start++) {
+        // Find the end of a run of characters
+        var end = start;
+        while (end < single.length - 1 &&
+            single[end].charCodeAt(1) + 1 === single[end + 1].charCodeAt(1)) {
+            end += 1;
+        }
+        var count = 1 + end - start;
+        // We want to replace at least three characters
+        if (count < 3)
+            continue;
+        single.splice(start, count, single[start] + "-" + single[end]);
+    }
+    multiple.unshift("[" + single.join("") + "]");
+    return new RegExp(multiple.join("|"), "g");
+}
+// /[^\0-\x7F]/gu
+var reNonASCII = /(?:[\x80-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g;
+var getCodePoint = 
+// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
+String.prototype.codePointAt != null
+    ? // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+        function (str) { return str.codePointAt(0); }
+    : // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae
+        function (c) {
+            return (c.charCodeAt(0) - 0xd800) * 0x400 +
+                c.charCodeAt(1) -
+                0xdc00 +
+                0x10000;
+        };
+function singleCharReplacer(c) {
+    return "&#x" + (c.length > 1 ? getCodePoint(c) : c.charCodeAt(0))
+        .toString(16)
+        .toUpperCase() + ";";
+}
+function getInverse(inverse, re) {
+    return function (data) {
+        return data
+            .replace(re, function (name) { return inverse[name]; })
+            .replace(reNonASCII, singleCharReplacer);
+    };
+}
+var reEscapeChars = new RegExp(xmlReplacer.source + "|" + reNonASCII.source, "g");
+/**
+ * Encodes all non-ASCII characters, as well as characters not valid in XML
+ * documents using numeric hexadecimal reference (eg. `&#xfc;`).
+ *
+ * Have a look at `escapeUTF8` if you want a more concise output at the expense
+ * of reduced transportability.
+ *
+ * @param data String to escape.
+ */
+function escape(data) {
+    return data.replace(reEscapeChars, singleCharReplacer);
+}
+exports.escape = escape;
+/**
+ * Encodes all characters not valid in XML documents using numeric hexadecimal
+ * reference (eg. `&#xfc;`).
+ *
+ * Note that the output will be character-set dependent.
+ *
+ * @param data String to escape.
+ */
+function escapeUTF8(data) {
+    return data.replace(xmlReplacer, singleCharReplacer);
+}
+exports.escapeUTF8 = escapeUTF8;
+function getASCIIEncoder(obj) {
+    return function (data) {
+        return data.replace(reEscapeChars, function (c) { return obj[c] || singleCharReplacer(c); });
+    };
+}
+
+
+/***/ }),
+
+/***/ 5863:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.decodeXMLStrict = exports.decodeHTML5Strict = exports.decodeHTML4Strict = exports.decodeHTML5 = exports.decodeHTML4 = exports.decodeHTMLStrict = exports.decodeHTML = exports.decodeXML = exports.encodeHTML5 = exports.encodeHTML4 = exports.escapeUTF8 = exports.escape = exports.encodeNonAsciiHTML = exports.encodeHTML = exports.encodeXML = exports.encode = exports.decodeStrict = exports.decode = void 0;
+var decode_1 = __webpack_require__(4076);
+var encode_1 = __webpack_require__(7322);
+/**
+ * Decodes a string with entities.
+ *
+ * @param data String to decode.
+ * @param level Optional level to decode at. 0 = XML, 1 = HTML. Default is 0.
+ * @deprecated Use `decodeXML` or `decodeHTML` directly.
+ */
+function decode(data, level) {
+    return (!level || level <= 0 ? decode_1.decodeXML : decode_1.decodeHTML)(data);
+}
+exports.decode = decode;
+/**
+ * Decodes a string with entities. Does not allow missing trailing semicolons for entities.
+ *
+ * @param data String to decode.
+ * @param level Optional level to decode at. 0 = XML, 1 = HTML. Default is 0.
+ * @deprecated Use `decodeHTMLStrict` or `decodeXML` directly.
+ */
+function decodeStrict(data, level) {
+    return (!level || level <= 0 ? decode_1.decodeXML : decode_1.decodeHTMLStrict)(data);
+}
+exports.decodeStrict = decodeStrict;
+/**
+ * Encodes a string with entities.
+ *
+ * @param data String to encode.
+ * @param level Optional level to encode at. 0 = XML, 1 = HTML. Default is 0.
+ * @deprecated Use `encodeHTML`, `encodeXML` or `encodeNonAsciiHTML` directly.
+ */
+function encode(data, level) {
+    return (!level || level <= 0 ? encode_1.encodeXML : encode_1.encodeHTML)(data);
+}
+exports.encode = encode;
+var encode_2 = __webpack_require__(7322);
+Object.defineProperty(exports, "encodeXML", ({ enumerable: true, get: function () { return encode_2.encodeXML; } }));
+Object.defineProperty(exports, "encodeHTML", ({ enumerable: true, get: function () { return encode_2.encodeHTML; } }));
+Object.defineProperty(exports, "encodeNonAsciiHTML", ({ enumerable: true, get: function () { return encode_2.encodeNonAsciiHTML; } }));
+Object.defineProperty(exports, "escape", ({ enumerable: true, get: function () { return encode_2.escape; } }));
+Object.defineProperty(exports, "escapeUTF8", ({ enumerable: true, get: function () { return encode_2.escapeUTF8; } }));
+// Legacy aliases (deprecated)
+Object.defineProperty(exports, "encodeHTML4", ({ enumerable: true, get: function () { return encode_2.encodeHTML; } }));
+Object.defineProperty(exports, "encodeHTML5", ({ enumerable: true, get: function () { return encode_2.encodeHTML; } }));
+var decode_2 = __webpack_require__(4076);
+Object.defineProperty(exports, "decodeXML", ({ enumerable: true, get: function () { return decode_2.decodeXML; } }));
+Object.defineProperty(exports, "decodeHTML", ({ enumerable: true, get: function () { return decode_2.decodeHTML; } }));
+Object.defineProperty(exports, "decodeHTMLStrict", ({ enumerable: true, get: function () { return decode_2.decodeHTMLStrict; } }));
+// Legacy aliases (deprecated)
+Object.defineProperty(exports, "decodeHTML4", ({ enumerable: true, get: function () { return decode_2.decodeHTML; } }));
+Object.defineProperty(exports, "decodeHTML5", ({ enumerable: true, get: function () { return decode_2.decodeHTML; } }));
+Object.defineProperty(exports, "decodeHTML4Strict", ({ enumerable: true, get: function () { return decode_2.decodeHTMLStrict; } }));
+Object.defineProperty(exports, "decodeHTML5Strict", ({ enumerable: true, get: function () { return decode_2.decodeHTMLStrict; } }));
+Object.defineProperty(exports, "decodeXMLStrict", ({ enumerable: true, get: function () { return decode_2.decodeXML; } }));
+
+
+/***/ }),
+
+/***/ 8460:
+/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
+
+module.exports = tokenize
+
+var literals100 = __webpack_require__(7529)
+  , operators = __webpack_require__(7679)
+  , builtins100 = __webpack_require__(2222)
+  , literals300es = __webpack_require__(2914)
+  , builtins300es = __webpack_require__(9537)
+
+var NORMAL = 999          // <-- never emitted
+  , TOKEN = 9999          // <-- never emitted
+  , BLOCK_COMMENT = 0
+  , LINE_COMMENT = 1
+  , PREPROCESSOR = 2
+  , OPERATOR = 3
+  , INTEGER = 4
+  , FLOAT = 5
+  , IDENT = 6
+  , BUILTIN = 7
+  , KEYWORD = 8
+  , WHITESPACE = 9
+  , EOF = 10
+  , HEX = 11
+
+var map = [
+    'block-comment'
+  , 'line-comment'
+  , 'preprocessor'
+  , 'operator'
+  , 'integer'
+  , 'float'
+  , 'ident'
+  , 'builtin'
+  , 'keyword'
+  , 'whitespace'
+  , 'eof'
+  , 'integer'
+]
+
+function tokenize(opt) {
+  var i = 0
+    , total = 0
+    , mode = NORMAL
+    , c
+    , last
+    , content = []
+    , tokens = []
+    , token_idx = 0
+    , token_offs = 0
+    , line = 1
+    , col = 0
+    , start = 0
+    , isnum = false
+    , isoperator = false
+    , input = ''
+    , len
+
+  opt = opt || {}
+  var allBuiltins = builtins100
+  var allLiterals = literals100
+  if (opt.version === '300 es') {
+    allBuiltins = builtins300es
+    allLiterals = literals300es
+  }
+
+  // cache by name
+  var builtinsDict = {}, literalsDict = {}
+  for (var i = 0; i < allBuiltins.length; i++) {
+    builtinsDict[allBuiltins[i]] = true
+  }
+  for (var i = 0; i < allLiterals.length; i++) {
+    literalsDict[allLiterals[i]] = true
+  }
+
+  return function(data) {
+    tokens = []
+    if (data !== null) return write(data)
+    return end()
+  }
+
+  function token(data) {
+    if (data.length) {
+      tokens.push({
+        type: map[mode]
+      , data: data
+      , position: start
+      , line: line
+      , column: col
+      })
+    }
+  }
+
+  function write(chunk) {
+    i = 0
+
+    if (chunk.toString) chunk = chunk.toString()
+
+    input += chunk.replace(/\r\n/g, '\n')
+    len = input.length
+
+
+    var last
+
+    while(c = input[i], i < len) {
+      last = i
+
+      switch(mode) {
+        case BLOCK_COMMENT: i = block_comment(); break
+        case LINE_COMMENT: i = line_comment(); break
+        case PREPROCESSOR: i = preprocessor(); break
+        case OPERATOR: i = operator(); break
+        case INTEGER: i = integer(); break
+        case HEX: i = hex(); break
+        case FLOAT: i = decimal(); break
+        case TOKEN: i = readtoken(); break
+        case WHITESPACE: i = whitespace(); break
+        case NORMAL: i = normal(); break
+      }
+
+      if(last !== i) {
+        switch(input[last]) {
+          case '\n': col = 0; ++line; break
+          default: ++col; break
+        }
+      }
+    }
+
+    total += i
+    input = input.slice(i)
+    return tokens
+  }
+
+  function end(chunk) {
+    if(content.length) {
+      token(content.join(''))
+    }
+
+    mode = EOF
+    token('(eof)')
+    return tokens
+  }
+
+  function normal() {
+    content = content.length ? [] : content
+
+    if(last === '/' && c === '*') {
+      start = total + i - 1
+      mode = BLOCK_COMMENT
+      last = c
+      return i + 1
+    }
+
+    if(last === '/' && c === '/') {
+      start = total + i - 1
+      mode = LINE_COMMENT
+      last = c
+      return i + 1
+    }
+
+    if(c === '#') {
+      mode = PREPROCESSOR
+      start = total + i
+      return i
+    }
+
+    if(/\s/.test(c)) {
+      mode = WHITESPACE
+      start = total + i
+      return i
+    }
+
+    isnum = /\d/.test(c)
+    isoperator = /[^\w_]/.test(c)
+
+    start = total + i
+    mode = isnum ? INTEGER : isoperator ? OPERATOR : TOKEN
+    return i
+  }
+
+  function whitespace() {
+    if(/[^\s]/g.test(c)) {
+      token(content.join(''))
+      mode = NORMAL
+      return i
+    }
+    content.push(c)
+    last = c
+    return i + 1
+  }
+
+  function preprocessor() {
+    if((c === '\r' || c === '\n') && last !== '\\') {
+      token(content.join(''))
+      mode = NORMAL
+      return i
+    }
+    content.push(c)
+    last = c
+    return i + 1
+  }
+
+  function line_comment() {
+    return preprocessor()
+  }
+
+  function block_comment() {
+    if(c === '/' && last === '*') {
+      content.push(c)
+      token(content.join(''))
+      mode = NORMAL
+      return i + 1
+    }
+
+    content.push(c)
+    last = c
+    return i + 1
+  }
+
+  function operator() {
+    if(last === '.' && /\d/.test(c)) {
+      mode = FLOAT
+      return i
+    }
+
+    if(last === '/' && c === '*') {
+      mode = BLOCK_COMMENT
+      return i
+    }
+
+    if(last === '/' && c === '/') {
+      mode = LINE_COMMENT
+      return i
+    }
+
+    if(c === '.' && content.length) {
+      while(determine_operator(content));
+
+      mode = FLOAT
+      return i
+    }
+
+    if(c === ';' || c === ')' || c === '(') {
+      if(content.length) while(determine_operator(content));
+      token(c)
+      mode = NORMAL
+      return i + 1
+    }
+
+    var is_composite_operator = content.length === 2 && c !== '='
+    if(/[\w_\d\s]/.test(c) || is_composite_operator) {
+      while(determine_operator(content));
+      mode = NORMAL
+      return i
+    }
+
+    content.push(c)
+    last = c
+    return i + 1
+  }
+
+  function determine_operator(buf) {
+    var j = 0
+      , idx
+      , res
+
+    do {
+      idx = operators.indexOf(buf.slice(0, buf.length + j).join(''))
+      res = operators[idx]
+
+      if(idx === -1) {
+        if(j-- + buf.length > 0) continue
+        res = buf.slice(0, 1).join('')
+      }
+
+      token(res)
+
+      start += res.length
+      content = content.slice(res.length)
+      return content.length
+    } while(1)
+  }
+
+  function hex() {
+    if(/[^a-fA-F0-9]/.test(c)) {
+      token(content.join(''))
+      mode = NORMAL
+      return i
+    }
+
+    content.push(c)
+    last = c
+    return i + 1
+  }
+
+  function integer() {
+    if(c === '.') {
+      content.push(c)
+      mode = FLOAT
+      last = c
+      return i + 1
+    }
+
+    if(/[eE]/.test(c)) {
+      content.push(c)
+      mode = FLOAT
+      last = c
+      return i + 1
+    }
+
+    if(c === 'x' && content.length === 1 && content[0] === '0') {
+      mode = HEX
+      content.push(c)
+      last = c
+      return i + 1
+    }
+
+    if(/[^\d]/.test(c)) {
+      token(content.join(''))
+      mode = NORMAL
+      return i
+    }
+
+    content.push(c)
+    last = c
+    return i + 1
+  }
+
+  function decimal() {
+    if(c === 'f') {
+      content.push(c)
+      last = c
+      i += 1
+    }
+
+    if(/[eE]/.test(c)) {
+      content.push(c)
+      last = c
+      return i + 1
+    }
+
+    if ((c === '-' || c === '+') && /[eE]/.test(last)) {
+      content.push(c)
+      last = c
+      return i + 1
+    }
+
+    if(/[^\d]/.test(c)) {
+      token(content.join(''))
+      mode = NORMAL
+      return i
+    }
+
+    content.push(c)
+    last = c
+    return i + 1
+  }
+
+  function readtoken() {
+    if(/[^\d\w_]/.test(c)) {
+      var contentstr = content.join('')
+      if(literalsDict[contentstr]) {
+        mode = KEYWORD
+      } else if(builtinsDict[contentstr]) {
+        mode = BUILTIN
+      } else {
+        mode = IDENT
+      }
+      token(content.join(''))
+      mode = NORMAL
+      return i
+    }
+    content.push(c)
+    last = c
+    return i + 1
+  }
+}
+
+
+/***/ }),
+
+/***/ 9537:
+/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
+
+// 300es builtins/reserved words that were previously valid in v100
+var v100 = __webpack_require__(2222)
+
+// The texture2D|Cube functions have been removed
+// And the gl_ features are updated
+v100 = v100.slice().filter(function (b) {
+  return !/^(gl\_|texture)/.test(b)
+})
+
+module.exports = v100.concat([
+  // the updated gl_ constants
+    'gl_VertexID'
+  , 'gl_InstanceID'
+  , 'gl_Position'
+  , 'gl_PointSize'
+  , 'gl_FragCoord'
+  , 'gl_FrontFacing'
+  , 'gl_FragDepth'
+  , 'gl_PointCoord'
+  , 'gl_MaxVertexAttribs'
+  , 'gl_MaxVertexUniformVectors'
+  , 'gl_MaxVertexOutputVectors'
+  , 'gl_MaxFragmentInputVectors'
+  , 'gl_MaxVertexTextureImageUnits'
+  , 'gl_MaxCombinedTextureImageUnits'
+  , 'gl_MaxTextureImageUnits'
+  , 'gl_MaxFragmentUniformVectors'
+  , 'gl_MaxDrawBuffers'
+  , 'gl_MinProgramTexelOffset'
+  , 'gl_MaxProgramTexelOffset'
+  , 'gl_DepthRangeParameters'
+  , 'gl_DepthRange'
+
+  // other builtins
+  , 'trunc'
+  , 'round'
+  , 'roundEven'
+  , 'isnan'
+  , 'isinf'
+  , 'floatBitsToInt'
+  , 'floatBitsToUint'
+  , 'intBitsToFloat'
+  , 'uintBitsToFloat'
+  , 'packSnorm2x16'
+  , 'unpackSnorm2x16'
+  , 'packUnorm2x16'
+  , 'unpackUnorm2x16'
+  , 'packHalf2x16'
+  , 'unpackHalf2x16'
+  , 'outerProduct'
+  , 'transpose'
+  , 'determinant'
+  , 'inverse'
+  , 'texture'
+  , 'textureSize'
+  , 'textureProj'
+  , 'textureLod'
+  , 'textureOffset'
+  , 'texelFetch'
+  , 'texelFetchOffset'
+  , 'textureProjOffset'
+  , 'textureLodOffset'
+  , 'textureProjLod'
+  , 'textureProjLodOffset'
+  , 'textureGrad'
+  , 'textureGradOffset'
+  , 'textureProjGrad'
+  , 'textureProjGradOffset'
+])
+
+
+/***/ }),
+
+/***/ 2222:
+/***/ ((module) => {
+
+module.exports = [
+  // Keep this list sorted
+  'abs'
+  , 'acos'
+  , 'all'
+  , 'any'
+  , 'asin'
+  , 'atan'
+  , 'ceil'
+  , 'clamp'
+  , 'cos'
+  , 'cross'
+  , 'dFdx'
+  , 'dFdy'
+  , 'degrees'
+  , 'distance'
+  , 'dot'
+  , 'equal'
+  , 'exp'
+  , 'exp2'
+  , 'faceforward'
+  , 'floor'
+  , 'fract'
+  , 'gl_BackColor'
+  , 'gl_BackLightModelProduct'
+  , 'gl_BackLightProduct'
+  , 'gl_BackMaterial'
+  , 'gl_BackSecondaryColor'
+  , 'gl_ClipPlane'
+  , 'gl_ClipVertex'
+  , 'gl_Color'
+  , 'gl_DepthRange'
+  , 'gl_DepthRangeParameters'
+  , 'gl_EyePlaneQ'
+  , 'gl_EyePlaneR'
+  , 'gl_EyePlaneS'
+  , 'gl_EyePlaneT'
+  , 'gl_Fog'
+  , 'gl_FogCoord'
+  , 'gl_FogFragCoord'
+  , 'gl_FogParameters'
+  , 'gl_FragColor'
+  , 'gl_FragCoord'
+  , 'gl_FragData'
+  , 'gl_FragDepth'
+  , 'gl_FragDepthEXT'
+  , 'gl_FrontColor'
+  , 'gl_FrontFacing'
+  , 'gl_FrontLightModelProduct'
+  , 'gl_FrontLightProduct'
+  , 'gl_FrontMaterial'
+  , 'gl_FrontSecondaryColor'
+  , 'gl_LightModel'
+  , 'gl_LightModelParameters'
+  , 'gl_LightModelProducts'
+  , 'gl_LightProducts'
+  , 'gl_LightSource'
+  , 'gl_LightSourceParameters'
+  , 'gl_MaterialParameters'
+  , 'gl_MaxClipPlanes'
+  , 'gl_MaxCombinedTextureImageUnits'
+  , 'gl_MaxDrawBuffers'
+  , 'gl_MaxFragmentUniformComponents'
+  , 'gl_MaxLights'
+  , 'gl_MaxTextureCoords'
+  , 'gl_MaxTextureImageUnits'
+  , 'gl_MaxTextureUnits'
+  , 'gl_MaxVaryingFloats'
+  , 'gl_MaxVertexAttribs'
+  , 'gl_MaxVertexTextureImageUnits'
+  , 'gl_MaxVertexUniformComponents'
+  , 'gl_ModelViewMatrix'
+  , 'gl_ModelViewMatrixInverse'
+  , 'gl_ModelViewMatrixInverseTranspose'
+  , 'gl_ModelViewMatrixTranspose'
+  , 'gl_ModelViewProjectionMatrix'
+  , 'gl_ModelViewProjectionMatrixInverse'
+  , 'gl_ModelViewProjectionMatrixInverseTranspose'
+  , 'gl_ModelViewProjectionMatrixTranspose'
+  , 'gl_MultiTexCoord0'
+  , 'gl_MultiTexCoord1'
+  , 'gl_MultiTexCoord2'
+  , 'gl_MultiTexCoord3'
+  , 'gl_MultiTexCoord4'
+  , 'gl_MultiTexCoord5'
+  , 'gl_MultiTexCoord6'
+  , 'gl_MultiTexCoord7'
+  , 'gl_Normal'
+  , 'gl_NormalMatrix'
+  , 'gl_NormalScale'
+  , 'gl_ObjectPlaneQ'
+  , 'gl_ObjectPlaneR'
+  , 'gl_ObjectPlaneS'
+  , 'gl_ObjectPlaneT'
+  , 'gl_Point'
+  , 'gl_PointCoord'
+  , 'gl_PointParameters'
+  , 'gl_PointSize'
+  , 'gl_Position'
+  , 'gl_ProjectionMatrix'
+  , 'gl_ProjectionMatrixInverse'
+  , 'gl_ProjectionMatrixInverseTranspose'
+  , 'gl_ProjectionMatrixTranspose'
+  , 'gl_SecondaryColor'
+  , 'gl_TexCoord'
+  , 'gl_TextureEnvColor'
+  , 'gl_TextureMatrix'
+  , 'gl_TextureMatrixInverse'
+  , 'gl_TextureMatrixInverseTranspose'
+  , 'gl_TextureMatrixTranspose'
+  , 'gl_Vertex'
+  , 'greaterThan'
+  , 'greaterThanEqual'
+  , 'inversesqrt'
+  , 'length'
+  , 'lessThan'
+  , 'lessThanEqual'
+  , 'log'
+  , 'log2'
+  , 'matrixCompMult'
+  , 'max'
+  , 'min'
+  , 'mix'
+  , 'mod'
+  , 'normalize'
+  , 'not'
+  , 'notEqual'
+  , 'pow'
+  , 'radians'
+  , 'reflect'
+  , 'refract'
+  , 'sign'
+  , 'sin'
+  , 'smoothstep'
+  , 'sqrt'
+  , 'step'
+  , 'tan'
+  , 'texture2D'
+  , 'texture2DLod'
+  , 'texture2DProj'
+  , 'texture2DProjLod'
+  , 'textureCube'
+  , 'textureCubeLod'
+  , 'texture2DLodEXT'
+  , 'texture2DProjLodEXT'
+  , 'textureCubeLodEXT'
+  , 'texture2DGradEXT'
+  , 'texture2DProjGradEXT'
+  , 'textureCubeGradEXT'
+]
+
+
+/***/ }),
+
+/***/ 2914:
+/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
+
+var v100 = __webpack_require__(7529)
+
+module.exports = v100.slice().concat([
+   'layout'
+  , 'centroid'
+  , 'smooth'
+  , 'case'
+  , 'mat2x2'
+  , 'mat2x3'
+  , 'mat2x4'
+  , 'mat3x2'
+  , 'mat3x3'
+  , 'mat3x4'
+  , 'mat4x2'
+  , 'mat4x3'
+  , 'mat4x4'
+  , 'uvec2'
+  , 'uvec3'
+  , 'uvec4'
+  , 'samplerCubeShadow'
+  , 'sampler2DArray'
+  , 'sampler2DArrayShadow'
+  , 'isampler2D'
+  , 'isampler3D'
+  , 'isamplerCube'
+  , 'isampler2DArray'
+  , 'usampler2D'
+  , 'usampler3D'
+  , 'usamplerCube'
+  , 'usampler2DArray'
+  , 'coherent'
+  , 'restrict'
+  , 'readonly'
+  , 'writeonly'
+  , 'resource'
+  , 'atomic_uint'
+  , 'noperspective'
+  , 'patch'
+  , 'sample'
+  , 'subroutine'
+  , 'common'
+  , 'partition'
+  , 'active'
+  , 'filter'
+  , 'image1D'
+  , 'image2D'
+  , 'image3D'
+  , 'imageCube'
+  , 'iimage1D'
+  , 'iimage2D'
+  , 'iimage3D'
+  , 'iimageCube'
+  , 'uimage1D'
+  , 'uimage2D'
+  , 'uimage3D'
+  , 'uimageCube'
+  , 'image1DArray'
+  , 'image2DArray'
+  , 'iimage1DArray'
+  , 'iimage2DArray'
+  , 'uimage1DArray'
+  , 'uimage2DArray'
+  , 'image1DShadow'
+  , 'image2DShadow'
+  , 'image1DArrayShadow'
+  , 'image2DArrayShadow'
+  , 'imageBuffer'
+  , 'iimageBuffer'
+  , 'uimageBuffer'
+  , 'sampler1DArray'
+  , 'sampler1DArrayShadow'
+  , 'isampler1D'
+  , 'isampler1DArray'
+  , 'usampler1D'
+  , 'usampler1DArray'
+  , 'isampler2DRect'
+  , 'usampler2DRect'
+  , 'samplerBuffer'
+  , 'isamplerBuffer'
+  , 'usamplerBuffer'
+  , 'sampler2DMS'
+  , 'isampler2DMS'
+  , 'usampler2DMS'
+  , 'sampler2DMSArray'
+  , 'isampler2DMSArray'
+  , 'usampler2DMSArray'
+])
+
+
+/***/ }),
+
+/***/ 7529:
+/***/ ((module) => {
+
+module.exports = [
+  // current
+    'precision'
+  , 'highp'
+  , 'mediump'
+  , 'lowp'
+  , 'attribute'
+  , 'const'
+  , 'uniform'
+  , 'varying'
+  , 'break'
+  , 'continue'
+  , 'do'
+  , 'for'
+  , 'while'
+  , 'if'
+  , 'else'
+  , 'in'
+  , 'out'
+  , 'inout'
+  , 'float'
+  , 'int'
+  , 'uint'
+  , 'void'
+  , 'bool'
+  , 'true'
+  , 'false'
+  , 'discard'
+  , 'return'
+  , 'mat2'
+  , 'mat3'
+  , 'mat4'
+  , 'vec2'
+  , 'vec3'
+  , 'vec4'
+  , 'ivec2'
+  , 'ivec3'
+  , 'ivec4'
+  , 'bvec2'
+  , 'bvec3'
+  , 'bvec4'
+  , 'sampler1D'
+  , 'sampler2D'
+  , 'sampler3D'
+  , 'samplerCube'
+  , 'sampler1DShadow'
+  , 'sampler2DShadow'
+  , 'struct'
+
+  // future
+  , 'asm'
+  , 'class'
+  , 'union'
+  , 'enum'
+  , 'typedef'
+  , 'template'
+  , 'this'
+  , 'packed'
+  , 'goto'
+  , 'switch'
+  , 'default'
+  , 'inline'
+  , 'noinline'
+  , 'volatile'
+  , 'public'
+  , 'static'
+  , 'extern'
+  , 'external'
+  , 'interface'
+  , 'long'
+  , 'short'
+  , 'double'
+  , 'half'
+  , 'fixed'
+  , 'unsigned'
+  , 'input'
+  , 'output'
+  , 'hvec2'
+  , 'hvec3'
+  , 'hvec4'
+  , 'dvec2'
+  , 'dvec3'
+  , 'dvec4'
+  , 'fvec2'
+  , 'fvec3'
+  , 'fvec4'
+  , 'sampler2DRect'
+  , 'sampler3DRect'
+  , 'sampler2DRectShadow'
+  , 'sizeof'
+  , 'cast'
+  , 'namespace'
+  , 'using'
+]
+
+
+/***/ }),
+
+/***/ 7679:
+/***/ ((module) => {
+
+module.exports = [
+    '<<='
+  , '>>='
+  , '++'
+  , '--'
+  , '<<'
+  , '>>'
+  , '<='
+  , '>='
+  , '=='
+  , '!='
+  , '&&'
+  , '||'
+  , '+='
+  , '-='
+  , '*='
+  , '/='
+  , '%='
+  , '&='
+  , '^^'
+  , '^='
+  , '|='
+  , '('
+  , ')'
+  , '['
+  , ']'
+  , '.'
+  , '!'
+  , '~'
+  , '*'
+  , '/'
+  , '%'
+  , '+'
+  , '-'
+  , '<'
+  , '>'
+  , '&'
+  , '^'
+  , '|'
+  , '?'
+  , ':'
+  , '='
+  , ','
+  , ';'
+  , '{'
+  , '}'
+]
+
+
+/***/ }),
+
+/***/ 9932:
+/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
+
+var tokenize = __webpack_require__(8460)
+
+module.exports = tokenizeString
+
+function tokenizeString(str, opt) {
+  var generator = tokenize(opt)
+  var tokens = []
+
+  tokens = tokens.concat(generator(str))
+  tokens = tokens.concat(generator(null))
+
+  return tokens
+}
+
+
+/***/ }),
+
+/***/ 9769:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.compile = void 0;
+var boolbase_1 = __webpack_require__(1073);
+/**
+ * Returns a function that checks if an elements index matches the given rule
+ * highly optimized to return the fastest solution.
+ *
+ * @param parsed A tuple [a, b], as returned by `parse`.
+ * @returns A highly optimized function that returns whether an index matches the nth-check.
+ * @example
+ * const check = nthCheck.compile([2, 3]);
+ *
+ * check(0); // `false`
+ * check(1); // `false`
+ * check(2); // `true`
+ * check(3); // `false`
+ * check(4); // `true`
+ * check(5); // `false`
+ * check(6); // `true`
+ */
+function compile(parsed) {
+    var a = parsed[0];
+    // Subtract 1 from `b`, to convert from one- to zero-indexed.
+    var b = parsed[1] - 1;
+    /*
+     * When `b <= 0`, `a * n` won't be lead to any matches for `a < 0`.
+     * Besides, the specification states that no elements are
+     * matched when `a` and `b` are 0.
+     *
+     * `b < 0` here as we subtracted 1 from `b` above.
+     */
+    if (b < 0 && a <= 0)
+        return boolbase_1.falseFunc;
+    // When `a` is in the range -1..1, it matches any element (so only `b` is checked).
+    if (a === -1)
+        return function (index) { return index <= b; };
+    if (a === 0)
+        return function (index) { return index === b; };
+    // When `b <= 0` and `a === 1`, they match any element.
+    if (a === 1)
+        return b < 0 ? boolbase_1.trueFunc : function (index) { return index >= b; };
+    /*
+     * Otherwise, modulo can be used to check if there is a match.
+     *
+     * Modulo doesn't care about the sign, so let's use `a`s absolute value.
+     */
+    var absA = Math.abs(a);
+    // Get `b mod a`, + a if this is negative.
+    var bMod = ((b % absA) + absA) % absA;
+    return a > 1
+        ? function (index) { return index >= b && index % absA === bMod; }
+        : function (index) { return index <= b && index % absA === bMod; };
+}
+exports.compile = compile;
+
+
+/***/ }),
+
+/***/ 7540:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.compile = exports.parse = void 0;
+var parse_1 = __webpack_require__(7766);
+Object.defineProperty(exports, "parse", ({ enumerable: true, get: function () { return parse_1.parse; } }));
+var compile_1 = __webpack_require__(9769);
+Object.defineProperty(exports, "compile", ({ enumerable: true, get: function () { return compile_1.compile; } }));
+/**
+ * Parses and compiles a formula to a highly optimized function.
+ * Combination of `parse` and `compile`.
+ *
+ * If the formula doesn't match any elements,
+ * it returns [`boolbase`](https://github.com/fb55/boolbase)'s `falseFunc`.
+ * Otherwise, a function accepting an _index_ is returned, which returns
+ * whether or not the passed _index_ matches the formula.
+ *
+ * Note: The nth-rule starts counting at `1`, the returned function at `0`.
+ *
+ * @param formula The formula to compile.
+ * @example
+ * const check = nthCheck("2n+3");
+ *
+ * check(0); // `false`
+ * check(1); // `false`
+ * check(2); // `true`
+ * check(3); // `false`
+ * check(4); // `true`
+ * check(5); // `false`
+ * check(6); // `true`
+ */
+function nthCheck(formula) {
+    return (0, compile_1.compile)((0, parse_1.parse)(formula));
+}
+exports["default"] = nthCheck;
+
+
+/***/ }),
+
+/***/ 7766:
+/***/ ((__unused_webpack_module, exports) => {
+
+"use strict";
+
+// Following http://www.w3.org/TR/css3-selectors/#nth-child-pseudo
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.parse = void 0;
+// Whitespace as per https://www.w3.org/TR/selectors-3/#lex is " \t\r\n\f"
+var whitespace = new Set([9, 10, 12, 13, 32]);
+var ZERO = "0".charCodeAt(0);
+var NINE = "9".charCodeAt(0);
+/**
+ * Parses an expression.
+ *
+ * @throws An `Error` if parsing fails.
+ * @returns An array containing the integer step size and the integer offset of the nth rule.
+ * @example nthCheck.parse("2n+3"); // returns [2, 3]
+ */
+function parse(formula) {
+    formula = formula.trim().toLowerCase();
+    if (formula === "even") {
+        return [2, 0];
+    }
+    else if (formula === "odd") {
+        return [2, 1];
+    }
+    // Parse [ ['-'|'+']? INTEGER? {N} [ S* ['-'|'+'] S* INTEGER ]?
+    var idx = 0;
+    var a = 0;
+    var sign = readSign();
+    var number = readNumber();
+    if (idx < formula.length && formula.charAt(idx) === "n") {
+        idx++;
+        a = sign * (number !== null && number !== void 0 ? number : 1);
+        skipWhitespace();
+        if (idx < formula.length) {
+            sign = readSign();
+            skipWhitespace();
+            number = readNumber();
+        }
+        else {
+            sign = number = 0;
+        }
+    }
+    // Throw if there is anything else
+    if (number === null || idx < formula.length) {
+        throw new Error("n-th rule couldn't be parsed ('" + formula + "')");
+    }
+    return [a, sign * number];
+    function readSign() {
+        if (formula.charAt(idx) === "-") {
+            idx++;
+            return -1;
+        }
+        if (formula.charAt(idx) === "+") {
+            idx++;
+        }
+        return 1;
+    }
+    function readNumber() {
+        var start = idx;
+        var value = 0;
+        while (idx < formula.length &&
+            formula.charCodeAt(idx) >= ZERO &&
+            formula.charCodeAt(idx) <= NINE) {
+            value = value * 10 + (formula.charCodeAt(idx) - ZERO);
+            idx++;
+        }
+        // Return `null` if we didn't read anything.
+        return idx === start ? null : value;
+    }
+    function skipWhitespace() {
+        while (idx < formula.length &&
+            whitespace.has(formula.charCodeAt(idx))) {
+            idx++;
+        }
+    }
+}
+exports.parse = parse;
+
+
+/***/ }),
+
+/***/ 3981:
+/***/ ((__unused_webpack_module, exports) => {
+
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS202: Simplify dynamic range loops
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+exports.make = function (x) {
+  if (x == null) {
+    x = [];
+  }
+  if (!(x instanceof Array)) {
+    x = [+x != null ? +x : 0];
+  }
+  return x;
+};
+
+exports.nest = (a, b) => a.concat(b);
+
+exports.compare = function (a, b) {
+  const n = Math.min(a.length, b.length);
+  for (
+    let i = 0, end = n, asc = 0 <= end;
+    asc ? i < end : i > end;
+    asc ? i++ : i--
+  ) {
+    const p = a[i];
+    const q = b[i];
+    if (p > q) {
+      return -1;
+    }
+    if (p < q) {
+      return 1;
+    }
+  }
+  a = a.length;
+  b = b.length;
+  if (a > b) {
+    return -1;
+  } else if (a < b) {
+    return 1;
+  } else {
+    return 0;
+  }
+};
+
+exports.max = function (a, b) {
+  if (exports.compare(a, b) > 0) {
+    return b;
+  } else {
+    return a;
+  }
+};
+
+
+/***/ }),
+
+/***/ 3466:
+/***/ (function(module) {
+
+// stats.js - http://github.com/mrdoob/stats.js
+(function(f,e){ true?module.exports=e():0})(this,function(){var f=function(){function e(a){c.appendChild(a.dom);return a}function u(a){for(var d=0;d<c.children.length;d++)c.children[d].style.display=d===a?"block":"none";l=a}var l=0,c=document.createElement("div");c.style.cssText="position:fixed;top:0;left:0;cursor:pointer;opacity:0.9;z-index:10000";c.addEventListener("click",function(a){a.preventDefault();
+u(++l%c.children.length)},!1);var k=(performance||Date).now(),g=k,a=0,r=e(new f.Panel("FPS","#0ff","#002")),h=e(new f.Panel("MS","#0f0","#020"));if(self.performance&&self.performance.memory)var t=e(new f.Panel("MB","#f08","#201"));u(0);return{REVISION:16,dom:c,addPanel:e,showPanel:u,begin:function(){k=(performance||Date).now()},end:function(){a++;var c=(performance||Date).now();h.update(c-k,200);if(c>g+1E3&&(r.update(1E3*a/(c-g),100),g=c,a=0,t)){var d=performance.memory;t.update(d.usedJSHeapSize/
+1048576,d.jsHeapSizeLimit/1048576)}return c},update:function(){k=this.end()},domElement:c,setMode:u}};f.Panel=function(e,f,l){var c=Infinity,k=0,g=Math.round,a=g(window.devicePixelRatio||1),r=80*a,h=48*a,t=3*a,v=2*a,d=3*a,m=15*a,n=74*a,p=30*a,q=document.createElement("canvas");q.width=r;q.height=h;q.style.cssText="width:80px;height:48px";var b=q.getContext("2d");b.font="bold "+9*a+"px Helvetica,Arial,sans-serif";b.textBaseline="top";b.fillStyle=l;b.fillRect(0,0,r,h);b.fillStyle=f;b.fillText(e,t,v);
+b.fillRect(d,m,n,p);b.fillStyle=l;b.globalAlpha=.9;b.fillRect(d,m,n,p);return{dom:q,update:function(h,w){c=Math.min(c,h);k=Math.max(k,h);b.fillStyle=l;b.globalAlpha=1;b.fillRect(0,0,r,m);b.fillStyle=f;b.fillText(g(h)+" "+e+" ("+g(c)+"-"+g(k)+")",t,v);b.drawImage(q,d+a,m,n-a,p,d,m,n-a,p);b.fillRect(d+n-a,m,a,p);b.fillStyle=l;b.globalAlpha=.9;b.fillRect(d+n-a,m,a,g((1-h/w)*p))}}};return f});
+
+
+/***/ }),
+
+/***/ 824:
+/***/ ((module) => {
+
+"use strict";
+module.exports = __WEBPACK_EXTERNAL_MODULE__824__;
+
+/***/ }),
+
+/***/ 3600:
+/***/ ((module) => {
+
+"use strict";
+module.exports = JSON.parse('{"0":65533,"128":8364,"130":8218,"131":402,"132":8222,"133":8230,"134":8224,"135":8225,"136":710,"137":8240,"138":352,"139":8249,"140":338,"142":381,"145":8216,"146":8217,"147":8220,"148":8221,"149":8226,"150":8211,"151":8212,"152":732,"153":8482,"154":353,"155":8250,"156":339,"158":382,"159":376}');
+
+/***/ }),
+
+/***/ 9323:
+/***/ ((module) => {
+
+"use strict";
+module.exports = JSON.parse('{"Aacute":"Á","aacute":"á","Abreve":"Ă","abreve":"ă","ac":"∾","acd":"∿","acE":"∾̳","Acirc":"Â","acirc":"â","acute":"´","Acy":"А","acy":"а","AElig":"Æ","aelig":"æ","af":"⁡","Afr":"𝔄","afr":"𝔞","Agrave":"À","agrave":"à","alefsym":"ℵ","aleph":"ℵ","Alpha":"Α","alpha":"α","Amacr":"Ā","amacr":"ā","amalg":"⨿","amp":"&","AMP":"&","andand":"⩕","And":"⩓","and":"∧","andd":"⩜","andslope":"⩘","andv":"⩚","ang":"∠","ange":"⦤","angle":"∠","angmsdaa":"⦨","angmsdab":"⦩","angmsdac":"⦪","angmsdad":"⦫","angmsdae":"⦬","angmsdaf":"⦭","angmsdag":"⦮","angmsdah":"⦯","angmsd":"∡","angrt":"∟","angrtvb":"⊾","angrtvbd":"⦝","angsph":"∢","angst":"Å","angzarr":"⍼","Aogon":"Ą","aogon":"ą","Aopf":"𝔸","aopf":"𝕒","apacir":"⩯","ap":"≈","apE":"⩰","ape":"≊","apid":"≋","apos":"\'","ApplyFunction":"⁡","approx":"≈","approxeq":"≊","Aring":"Å","aring":"å","Ascr":"𝒜","ascr":"𝒶","Assign":"≔","ast":"*","asymp":"≈","asympeq":"≍","Atilde":"Ã","atilde":"ã","Auml":"Ä","auml":"ä","awconint":"∳","awint":"⨑","backcong":"≌","backepsilon":"϶","backprime":"‵","backsim":"∽","backsimeq":"⋍","Backslash":"∖","Barv":"⫧","barvee":"⊽","barwed":"⌅","Barwed":"⌆","barwedge":"⌅","bbrk":"⎵","bbrktbrk":"⎶","bcong":"≌","Bcy":"Б","bcy":"б","bdquo":"„","becaus":"∵","because":"∵","Because":"∵","bemptyv":"⦰","bepsi":"϶","bernou":"ℬ","Bernoullis":"ℬ","Beta":"Β","beta":"β","beth":"ℶ","between":"≬","Bfr":"𝔅","bfr":"𝔟","bigcap":"⋂","bigcirc":"◯","bigcup":"⋃","bigodot":"⨀","bigoplus":"⨁","bigotimes":"⨂","bigsqcup":"⨆","bigstar":"★","bigtriangledown":"▽","bigtriangleup":"△","biguplus":"⨄","bigvee":"⋁","bigwedge":"⋀","bkarow":"⤍","blacklozenge":"⧫","blacksquare":"▪","blacktriangle":"▴","blacktriangledown":"▾","blacktriangleleft":"◂","blacktriangleright":"▸","blank":"␣","blk12":"▒","blk14":"░","blk34":"▓","block":"█","bne":"=⃥","bnequiv":"≡⃥","bNot":"⫭","bnot":"⌐","Bopf":"𝔹","bopf":"𝕓","bot":"⊥","bottom":"⊥","bowtie":"⋈","boxbox":"⧉","boxdl":"┐","boxdL":"╕","boxDl":"╖","boxDL":"╗","boxdr":"┌","boxdR":"╒","boxDr":"╓","boxDR":"╔","boxh":"─","boxH":"═","boxhd":"┬","boxHd":"╤","boxhD":"╥","boxHD":"╦","boxhu":"┴","boxHu":"╧","boxhU":"╨","boxHU":"╩","boxminus":"⊟","boxplus":"⊞","boxtimes":"⊠","boxul":"┘","boxuL":"╛","boxUl":"╜","boxUL":"╝","boxur":"└","boxuR":"╘","boxUr":"╙","boxUR":"╚","boxv":"│","boxV":"║","boxvh":"┼","boxvH":"╪","boxVh":"╫","boxVH":"╬","boxvl":"┤","boxvL":"╡","boxVl":"╢","boxVL":"╣","boxvr":"├","boxvR":"╞","boxVr":"╟","boxVR":"╠","bprime":"‵","breve":"˘","Breve":"˘","brvbar":"¦","bscr":"𝒷","Bscr":"ℬ","bsemi":"⁏","bsim":"∽","bsime":"⋍","bsolb":"⧅","bsol":"\\\\","bsolhsub":"⟈","bull":"•","bullet":"•","bump":"≎","bumpE":"⪮","bumpe":"≏","Bumpeq":"≎","bumpeq":"≏","Cacute":"Ć","cacute":"ć","capand":"⩄","capbrcup":"⩉","capcap":"⩋","cap":"∩","Cap":"⋒","capcup":"⩇","capdot":"⩀","CapitalDifferentialD":"ⅅ","caps":"∩︀","caret":"⁁","caron":"ˇ","Cayleys":"ℭ","ccaps":"⩍","Ccaron":"Č","ccaron":"č","Ccedil":"Ç","ccedil":"ç","Ccirc":"Ĉ","ccirc":"ĉ","Cconint":"∰","ccups":"⩌","ccupssm":"⩐","Cdot":"Ċ","cdot":"ċ","cedil":"¸","Cedilla":"¸","cemptyv":"⦲","cent":"¢","centerdot":"·","CenterDot":"·","cfr":"𝔠","Cfr":"ℭ","CHcy":"Ч","chcy":"ч","check":"✓","checkmark":"✓","Chi":"Χ","chi":"χ","circ":"ˆ","circeq":"≗","circlearrowleft":"↺","circlearrowright":"↻","circledast":"⊛","circledcirc":"⊚","circleddash":"⊝","CircleDot":"⊙","circledR":"®","circledS":"Ⓢ","CircleMinus":"⊖","CirclePlus":"⊕","CircleTimes":"⊗","cir":"○","cirE":"⧃","cire":"≗","cirfnint":"⨐","cirmid":"⫯","cirscir":"⧂","ClockwiseContourIntegral":"∲","CloseCurlyDoubleQuote":"”","CloseCurlyQuote":"’","clubs":"♣","clubsuit":"♣","colon":":","Colon":"∷","Colone":"⩴","colone":"≔","coloneq":"≔","comma":",","commat":"@","comp":"∁","compfn":"∘","complement":"∁","complexes":"ℂ","cong":"≅","congdot":"⩭","Congruent":"≡","conint":"∮","Conint":"∯","ContourIntegral":"∮","copf":"𝕔","Copf":"ℂ","coprod":"∐","Coproduct":"∐","copy":"©","COPY":"©","copysr":"℗","CounterClockwiseContourIntegral":"∳","crarr":"↵","cross":"✗","Cross":"⨯","Cscr":"𝒞","cscr":"𝒸","csub":"⫏","csube":"⫑","csup":"⫐","csupe":"⫒","ctdot":"⋯","cudarrl":"⤸","cudarrr":"⤵","cuepr":"⋞","cuesc":"⋟","cularr":"↶","cularrp":"⤽","cupbrcap":"⩈","cupcap":"⩆","CupCap":"≍","cup":"∪","Cup":"⋓","cupcup":"⩊","cupdot":"⊍","cupor":"⩅","cups":"∪︀","curarr":"↷","curarrm":"⤼","curlyeqprec":"⋞","curlyeqsucc":"⋟","curlyvee":"⋎","curlywedge":"⋏","curren":"¤","curvearrowleft":"↶","curvearrowright":"↷","cuvee":"⋎","cuwed":"⋏","cwconint":"∲","cwint":"∱","cylcty":"⌭","dagger":"†","Dagger":"‡","daleth":"ℸ","darr":"↓","Darr":"↡","dArr":"⇓","dash":"‐","Dashv":"⫤","dashv":"⊣","dbkarow":"⤏","dblac":"˝","Dcaron":"Ď","dcaron":"ď","Dcy":"Д","dcy":"д","ddagger":"‡","ddarr":"⇊","DD":"ⅅ","dd":"ⅆ","DDotrahd":"⤑","ddotseq":"⩷","deg":"°","Del":"∇","Delta":"Δ","delta":"δ","demptyv":"⦱","dfisht":"⥿","Dfr":"𝔇","dfr":"𝔡","dHar":"⥥","dharl":"⇃","dharr":"⇂","DiacriticalAcute":"´","DiacriticalDot":"˙","DiacriticalDoubleAcute":"˝","DiacriticalGrave":"`","DiacriticalTilde":"˜","diam":"⋄","diamond":"⋄","Diamond":"⋄","diamondsuit":"♦","diams":"♦","die":"¨","DifferentialD":"ⅆ","digamma":"ϝ","disin":"⋲","div":"÷","divide":"÷","divideontimes":"⋇","divonx":"⋇","DJcy":"Ђ","djcy":"ђ","dlcorn":"⌞","dlcrop":"⌍","dollar":"$","Dopf":"𝔻","dopf":"𝕕","Dot":"¨","dot":"˙","DotDot":"⃜","doteq":"≐","doteqdot":"≑","DotEqual":"≐","dotminus":"∸","dotplus":"∔","dotsquare":"⊡","doublebarwedge":"⌆","DoubleContourIntegral":"∯","DoubleDot":"¨","DoubleDownArrow":"⇓","DoubleLeftArrow":"⇐","DoubleLeftRightArrow":"⇔","DoubleLeftTee":"⫤","DoubleLongLeftArrow":"⟸","DoubleLongLeftRightArrow":"⟺","DoubleLongRightArrow":"⟹","DoubleRightArrow":"⇒","DoubleRightTee":"⊨","DoubleUpArrow":"⇑","DoubleUpDownArrow":"⇕","DoubleVerticalBar":"∥","DownArrowBar":"⤓","downarrow":"↓","DownArrow":"↓","Downarrow":"⇓","DownArrowUpArrow":"⇵","DownBreve":"̑","downdownarrows":"⇊","downharpoonleft":"⇃","downharpoonright":"⇂","DownLeftRightVector":"⥐","DownLeftTeeVector":"⥞","DownLeftVectorBar":"⥖","DownLeftVector":"↽","DownRightTeeVector":"⥟","DownRightVectorBar":"⥗","DownRightVector":"⇁","DownTeeArrow":"↧","DownTee":"⊤","drbkarow":"⤐","drcorn":"⌟","drcrop":"⌌","Dscr":"𝒟","dscr":"𝒹","DScy":"Ѕ","dscy":"ѕ","dsol":"⧶","Dstrok":"Đ","dstrok":"đ","dtdot":"⋱","dtri":"▿","dtrif":"▾","duarr":"⇵","duhar":"⥯","dwangle":"⦦","DZcy":"Џ","dzcy":"џ","dzigrarr":"⟿","Eacute":"É","eacute":"é","easter":"⩮","Ecaron":"Ě","ecaron":"ě","Ecirc":"Ê","ecirc":"ê","ecir":"≖","ecolon":"≕","Ecy":"Э","ecy":"э","eDDot":"⩷","Edot":"Ė","edot":"ė","eDot":"≑","ee":"ⅇ","efDot":"≒","Efr":"𝔈","efr":"𝔢","eg":"⪚","Egrave":"È","egrave":"è","egs":"⪖","egsdot":"⪘","el":"⪙","Element":"∈","elinters":"⏧","ell":"ℓ","els":"⪕","elsdot":"⪗","Emacr":"Ē","emacr":"ē","empty":"∅","emptyset":"∅","EmptySmallSquare":"◻","emptyv":"∅","EmptyVerySmallSquare":"▫","emsp13":" ","emsp14":" ","emsp":" ","ENG":"Ŋ","eng":"ŋ","ensp":" ","Eogon":"Ę","eogon":"ę","Eopf":"𝔼","eopf":"𝕖","epar":"⋕","eparsl":"⧣","eplus":"⩱","epsi":"ε","Epsilon":"Ε","epsilon":"ε","epsiv":"ϵ","eqcirc":"≖","eqcolon":"≕","eqsim":"≂","eqslantgtr":"⪖","eqslantless":"⪕","Equal":"⩵","equals":"=","EqualTilde":"≂","equest":"≟","Equilibrium":"⇌","equiv":"≡","equivDD":"⩸","eqvparsl":"⧥","erarr":"⥱","erDot":"≓","escr":"ℯ","Escr":"ℰ","esdot":"≐","Esim":"⩳","esim":"≂","Eta":"Η","eta":"η","ETH":"Ð","eth":"ð","Euml":"Ë","euml":"ë","euro":"€","excl":"!","exist":"∃","Exists":"∃","expectation":"ℰ","exponentiale":"ⅇ","ExponentialE":"ⅇ","fallingdotseq":"≒","Fcy":"Ф","fcy":"ф","female":"♀","ffilig":"ffi","fflig":"ff","ffllig":"ffl","Ffr":"𝔉","ffr":"𝔣","filig":"fi","FilledSmallSquare":"◼","FilledVerySmallSquare":"▪","fjlig":"fj","flat":"♭","fllig":"fl","fltns":"▱","fnof":"ƒ","Fopf":"𝔽","fopf":"𝕗","forall":"∀","ForAll":"∀","fork":"⋔","forkv":"⫙","Fouriertrf":"ℱ","fpartint":"⨍","frac12":"½","frac13":"⅓","frac14":"¼","frac15":"⅕","frac16":"⅙","frac18":"⅛","frac23":"⅔","frac25":"⅖","frac34":"¾","frac35":"⅗","frac38":"⅜","frac45":"⅘","frac56":"⅚","frac58":"⅝","frac78":"⅞","frasl":"⁄","frown":"⌢","fscr":"𝒻","Fscr":"ℱ","gacute":"ǵ","Gamma":"Γ","gamma":"γ","Gammad":"Ϝ","gammad":"ϝ","gap":"⪆","Gbreve":"Ğ","gbreve":"ğ","Gcedil":"Ģ","Gcirc":"Ĝ","gcirc":"ĝ","Gcy":"Г","gcy":"г","Gdot":"Ġ","gdot":"ġ","ge":"≥","gE":"≧","gEl":"⪌","gel":"⋛","geq":"≥","geqq":"≧","geqslant":"⩾","gescc":"⪩","ges":"⩾","gesdot":"⪀","gesdoto":"⪂","gesdotol":"⪄","gesl":"⋛︀","gesles":"⪔","Gfr":"𝔊","gfr":"𝔤","gg":"≫","Gg":"⋙","ggg":"⋙","gimel":"ℷ","GJcy":"Ѓ","gjcy":"ѓ","gla":"⪥","gl":"≷","glE":"⪒","glj":"⪤","gnap":"⪊","gnapprox":"⪊","gne":"⪈","gnE":"≩","gneq":"⪈","gneqq":"≩","gnsim":"⋧","Gopf":"𝔾","gopf":"𝕘","grave":"`","GreaterEqual":"≥","GreaterEqualLess":"⋛","GreaterFullEqual":"≧","GreaterGreater":"⪢","GreaterLess":"≷","GreaterSlantEqual":"⩾","GreaterTilde":"≳","Gscr":"𝒢","gscr":"ℊ","gsim":"≳","gsime":"⪎","gsiml":"⪐","gtcc":"⪧","gtcir":"⩺","gt":">","GT":">","Gt":"≫","gtdot":"⋗","gtlPar":"⦕","gtquest":"⩼","gtrapprox":"⪆","gtrarr":"⥸","gtrdot":"⋗","gtreqless":"⋛","gtreqqless":"⪌","gtrless":"≷","gtrsim":"≳","gvertneqq":"≩︀","gvnE":"≩︀","Hacek":"ˇ","hairsp":" ","half":"½","hamilt":"ℋ","HARDcy":"Ъ","hardcy":"ъ","harrcir":"⥈","harr":"↔","hArr":"⇔","harrw":"↭","Hat":"^","hbar":"ℏ","Hcirc":"Ĥ","hcirc":"ĥ","hearts":"♥","heartsuit":"♥","hellip":"…","hercon":"⊹","hfr":"𝔥","Hfr":"ℌ","HilbertSpace":"ℋ","hksearow":"⤥","hkswarow":"⤦","hoarr":"⇿","homtht":"∻","hookleftarrow":"↩","hookrightarrow":"↪","hopf":"𝕙","Hopf":"ℍ","horbar":"―","HorizontalLine":"─","hscr":"𝒽","Hscr":"ℋ","hslash":"ℏ","Hstrok":"Ħ","hstrok":"ħ","HumpDownHump":"≎","HumpEqual":"≏","hybull":"⁃","hyphen":"‐","Iacute":"Í","iacute":"í","ic":"⁣","Icirc":"Î","icirc":"î","Icy":"И","icy":"и","Idot":"İ","IEcy":"Е","iecy":"е","iexcl":"¡","iff":"⇔","ifr":"𝔦","Ifr":"ℑ","Igrave":"Ì","igrave":"ì","ii":"ⅈ","iiiint":"⨌","iiint":"∭","iinfin":"⧜","iiota":"℩","IJlig":"IJ","ijlig":"ij","Imacr":"Ī","imacr":"ī","image":"ℑ","ImaginaryI":"ⅈ","imagline":"ℐ","imagpart":"ℑ","imath":"ı","Im":"ℑ","imof":"⊷","imped":"Ƶ","Implies":"⇒","incare":"℅","in":"∈","infin":"∞","infintie":"⧝","inodot":"ı","intcal":"⊺","int":"∫","Int":"∬","integers":"ℤ","Integral":"∫","intercal":"⊺","Intersection":"⋂","intlarhk":"⨗","intprod":"⨼","InvisibleComma":"⁣","InvisibleTimes":"⁢","IOcy":"Ё","iocy":"ё","Iogon":"Į","iogon":"į","Iopf":"𝕀","iopf":"𝕚","Iota":"Ι","iota":"ι","iprod":"⨼","iquest":"¿","iscr":"𝒾","Iscr":"ℐ","isin":"∈","isindot":"⋵","isinE":"⋹","isins":"⋴","isinsv":"⋳","isinv":"∈","it":"⁢","Itilde":"Ĩ","itilde":"ĩ","Iukcy":"І","iukcy":"і","Iuml":"Ï","iuml":"ï","Jcirc":"Ĵ","jcirc":"ĵ","Jcy":"Й","jcy":"й","Jfr":"𝔍","jfr":"𝔧","jmath":"ȷ","Jopf":"𝕁","jopf":"𝕛","Jscr":"𝒥","jscr":"𝒿","Jsercy":"Ј","jsercy":"ј","Jukcy":"Є","jukcy":"є","Kappa":"Κ","kappa":"κ","kappav":"ϰ","Kcedil":"Ķ","kcedil":"ķ","Kcy":"К","kcy":"к","Kfr":"𝔎","kfr":"𝔨","kgreen":"ĸ","KHcy":"Х","khcy":"х","KJcy":"Ќ","kjcy":"ќ","Kopf":"𝕂","kopf":"𝕜","Kscr":"𝒦","kscr":"𝓀","lAarr":"⇚","Lacute":"Ĺ","lacute":"ĺ","laemptyv":"⦴","lagran":"ℒ","Lambda":"Λ","lambda":"λ","lang":"⟨","Lang":"⟪","langd":"⦑","langle":"⟨","lap":"⪅","Laplacetrf":"ℒ","laquo":"«","larrb":"⇤","larrbfs":"⤟","larr":"←","Larr":"↞","lArr":"⇐","larrfs":"⤝","larrhk":"↩","larrlp":"↫","larrpl":"⤹","larrsim":"⥳","larrtl":"↢","latail":"⤙","lAtail":"⤛","lat":"⪫","late":"⪭","lates":"⪭︀","lbarr":"⤌","lBarr":"⤎","lbbrk":"❲","lbrace":"{","lbrack":"[","lbrke":"⦋","lbrksld":"⦏","lbrkslu":"⦍","Lcaron":"Ľ","lcaron":"ľ","Lcedil":"Ļ","lcedil":"ļ","lceil":"⌈","lcub":"{","Lcy":"Л","lcy":"л","ldca":"⤶","ldquo":"“","ldquor":"„","ldrdhar":"⥧","ldrushar":"⥋","ldsh":"↲","le":"≤","lE":"≦","LeftAngleBracket":"⟨","LeftArrowBar":"⇤","leftarrow":"←","LeftArrow":"←","Leftarrow":"⇐","LeftArrowRightArrow":"⇆","leftarrowtail":"↢","LeftCeiling":"⌈","LeftDoubleBracket":"⟦","LeftDownTeeVector":"⥡","LeftDownVectorBar":"⥙","LeftDownVector":"⇃","LeftFloor":"⌊","leftharpoondown":"↽","leftharpoonup":"↼","leftleftarrows":"⇇","leftrightarrow":"↔","LeftRightArrow":"↔","Leftrightarrow":"⇔","leftrightarrows":"⇆","leftrightharpoons":"⇋","leftrightsquigarrow":"↭","LeftRightVector":"⥎","LeftTeeArrow":"↤","LeftTee":"⊣","LeftTeeVector":"⥚","leftthreetimes":"⋋","LeftTriangleBar":"⧏","LeftTriangle":"⊲","LeftTriangleEqual":"⊴","LeftUpDownVector":"⥑","LeftUpTeeVector":"⥠","LeftUpVectorBar":"⥘","LeftUpVector":"↿","LeftVectorBar":"⥒","LeftVector":"↼","lEg":"⪋","leg":"⋚","leq":"≤","leqq":"≦","leqslant":"⩽","lescc":"⪨","les":"⩽","lesdot":"⩿","lesdoto":"⪁","lesdotor":"⪃","lesg":"⋚︀","lesges":"⪓","lessapprox":"⪅","lessdot":"⋖","lesseqgtr":"⋚","lesseqqgtr":"⪋","LessEqualGreater":"⋚","LessFullEqual":"≦","LessGreater":"≶","lessgtr":"≶","LessLess":"⪡","lesssim":"≲","LessSlantEqual":"⩽","LessTilde":"≲","lfisht":"⥼","lfloor":"⌊","Lfr":"𝔏","lfr":"𝔩","lg":"≶","lgE":"⪑","lHar":"⥢","lhard":"↽","lharu":"↼","lharul":"⥪","lhblk":"▄","LJcy":"Љ","ljcy":"љ","llarr":"⇇","ll":"≪","Ll":"⋘","llcorner":"⌞","Lleftarrow":"⇚","llhard":"⥫","lltri":"◺","Lmidot":"Ŀ","lmidot":"ŀ","lmoustache":"⎰","lmoust":"⎰","lnap":"⪉","lnapprox":"⪉","lne":"⪇","lnE":"≨","lneq":"⪇","lneqq":"≨","lnsim":"⋦","loang":"⟬","loarr":"⇽","lobrk":"⟦","longleftarrow":"⟵","LongLeftArrow":"⟵","Longleftarrow":"⟸","longleftrightarrow":"⟷","LongLeftRightArrow":"⟷","Longleftrightarrow":"⟺","longmapsto":"⟼","longrightarrow":"⟶","LongRightArrow":"⟶","Longrightarrow":"⟹","looparrowleft":"↫","looparrowright":"↬","lopar":"⦅","Lopf":"𝕃","lopf":"𝕝","loplus":"⨭","lotimes":"⨴","lowast":"∗","lowbar":"_","LowerLeftArrow":"↙","LowerRightArrow":"↘","loz":"◊","lozenge":"◊","lozf":"⧫","lpar":"(","lparlt":"⦓","lrarr":"⇆","lrcorner":"⌟","lrhar":"⇋","lrhard":"⥭","lrm":"‎","lrtri":"⊿","lsaquo":"‹","lscr":"𝓁","Lscr":"ℒ","lsh":"↰","Lsh":"↰","lsim":"≲","lsime":"⪍","lsimg":"⪏","lsqb":"[","lsquo":"‘","lsquor":"‚","Lstrok":"Ł","lstrok":"ł","ltcc":"⪦","ltcir":"⩹","lt":"<","LT":"<","Lt":"≪","ltdot":"⋖","lthree":"⋋","ltimes":"⋉","ltlarr":"⥶","ltquest":"⩻","ltri":"◃","ltrie":"⊴","ltrif":"◂","ltrPar":"⦖","lurdshar":"⥊","luruhar":"⥦","lvertneqq":"≨︀","lvnE":"≨︀","macr":"¯","male":"♂","malt":"✠","maltese":"✠","Map":"⤅","map":"↦","mapsto":"↦","mapstodown":"↧","mapstoleft":"↤","mapstoup":"↥","marker":"▮","mcomma":"⨩","Mcy":"М","mcy":"м","mdash":"—","mDDot":"∺","measuredangle":"∡","MediumSpace":" ","Mellintrf":"ℳ","Mfr":"𝔐","mfr":"𝔪","mho":"℧","micro":"µ","midast":"*","midcir":"⫰","mid":"∣","middot":"·","minusb":"⊟","minus":"−","minusd":"∸","minusdu":"⨪","MinusPlus":"∓","mlcp":"⫛","mldr":"…","mnplus":"∓","models":"⊧","Mopf":"𝕄","mopf":"𝕞","mp":"∓","mscr":"𝓂","Mscr":"ℳ","mstpos":"∾","Mu":"Μ","mu":"μ","multimap":"⊸","mumap":"⊸","nabla":"∇","Nacute":"Ń","nacute":"ń","nang":"∠⃒","nap":"≉","napE":"⩰̸","napid":"≋̸","napos":"ʼn","napprox":"≉","natural":"♮","naturals":"ℕ","natur":"♮","nbsp":" ","nbump":"≎̸","nbumpe":"≏̸","ncap":"⩃","Ncaron":"Ň","ncaron":"ň","Ncedil":"Ņ","ncedil":"ņ","ncong":"≇","ncongdot":"⩭̸","ncup":"⩂","Ncy":"Н","ncy":"н","ndash":"–","nearhk":"⤤","nearr":"↗","neArr":"⇗","nearrow":"↗","ne":"≠","nedot":"≐̸","NegativeMediumSpace":"​","NegativeThickSpace":"​","NegativeThinSpace":"​","NegativeVeryThinSpace":"​","nequiv":"≢","nesear":"⤨","nesim":"≂̸","NestedGreaterGreater":"≫","NestedLessLess":"≪","NewLine":"\\n","nexist":"∄","nexists":"∄","Nfr":"𝔑","nfr":"𝔫","ngE":"≧̸","nge":"≱","ngeq":"≱","ngeqq":"≧̸","ngeqslant":"⩾̸","nges":"⩾̸","nGg":"⋙̸","ngsim":"≵","nGt":"≫⃒","ngt":"≯","ngtr":"≯","nGtv":"≫̸","nharr":"↮","nhArr":"⇎","nhpar":"⫲","ni":"∋","nis":"⋼","nisd":"⋺","niv":"∋","NJcy":"Њ","njcy":"њ","nlarr":"↚","nlArr":"⇍","nldr":"‥","nlE":"≦̸","nle":"≰","nleftarrow":"↚","nLeftarrow":"⇍","nleftrightarrow":"↮","nLeftrightarrow":"⇎","nleq":"≰","nleqq":"≦̸","nleqslant":"⩽̸","nles":"⩽̸","nless":"≮","nLl":"⋘̸","nlsim":"≴","nLt":"≪⃒","nlt":"≮","nltri":"⋪","nltrie":"⋬","nLtv":"≪̸","nmid":"∤","NoBreak":"⁠","NonBreakingSpace":" ","nopf":"𝕟","Nopf":"ℕ","Not":"⫬","not":"¬","NotCongruent":"≢","NotCupCap":"≭","NotDoubleVerticalBar":"∦","NotElement":"∉","NotEqual":"≠","NotEqualTilde":"≂̸","NotExists":"∄","NotGreater":"≯","NotGreaterEqual":"≱","NotGreaterFullEqual":"≧̸","NotGreaterGreater":"≫̸","NotGreaterLess":"≹","NotGreaterSlantEqual":"⩾̸","NotGreaterTilde":"≵","NotHumpDownHump":"≎̸","NotHumpEqual":"≏̸","notin":"∉","notindot":"⋵̸","notinE":"⋹̸","notinva":"∉","notinvb":"⋷","notinvc":"⋶","NotLeftTriangleBar":"⧏̸","NotLeftTriangle":"⋪","NotLeftTriangleEqual":"⋬","NotLess":"≮","NotLessEqual":"≰","NotLessGreater":"≸","NotLessLess":"≪̸","NotLessSlantEqual":"⩽̸","NotLessTilde":"≴","NotNestedGreaterGreater":"⪢̸","NotNestedLessLess":"⪡̸","notni":"∌","notniva":"∌","notnivb":"⋾","notnivc":"⋽","NotPrecedes":"⊀","NotPrecedesEqual":"⪯̸","NotPrecedesSlantEqual":"⋠","NotReverseElement":"∌","NotRightTriangleBar":"⧐̸","NotRightTriangle":"⋫","NotRightTriangleEqual":"⋭","NotSquareSubset":"⊏̸","NotSquareSubsetEqual":"⋢","NotSquareSuperset":"⊐̸","NotSquareSupersetEqual":"⋣","NotSubset":"⊂⃒","NotSubsetEqual":"⊈","NotSucceeds":"⊁","NotSucceedsEqual":"⪰̸","NotSucceedsSlantEqual":"⋡","NotSucceedsTilde":"≿̸","NotSuperset":"⊃⃒","NotSupersetEqual":"⊉","NotTilde":"≁","NotTildeEqual":"≄","NotTildeFullEqual":"≇","NotTildeTilde":"≉","NotVerticalBar":"∤","nparallel":"∦","npar":"∦","nparsl":"⫽⃥","npart":"∂̸","npolint":"⨔","npr":"⊀","nprcue":"⋠","nprec":"⊀","npreceq":"⪯̸","npre":"⪯̸","nrarrc":"⤳̸","nrarr":"↛","nrArr":"⇏","nrarrw":"↝̸","nrightarrow":"↛","nRightarrow":"⇏","nrtri":"⋫","nrtrie":"⋭","nsc":"⊁","nsccue":"⋡","nsce":"⪰̸","Nscr":"𝒩","nscr":"𝓃","nshortmid":"∤","nshortparallel":"∦","nsim":"≁","nsime":"≄","nsimeq":"≄","nsmid":"∤","nspar":"∦","nsqsube":"⋢","nsqsupe":"⋣","nsub":"⊄","nsubE":"⫅̸","nsube":"⊈","nsubset":"⊂⃒","nsubseteq":"⊈","nsubseteqq":"⫅̸","nsucc":"⊁","nsucceq":"⪰̸","nsup":"⊅","nsupE":"⫆̸","nsupe":"⊉","nsupset":"⊃⃒","nsupseteq":"⊉","nsupseteqq":"⫆̸","ntgl":"≹","Ntilde":"Ñ","ntilde":"ñ","ntlg":"≸","ntriangleleft":"⋪","ntrianglelefteq":"⋬","ntriangleright":"⋫","ntrianglerighteq":"⋭","Nu":"Ν","nu":"ν","num":"#","numero":"№","numsp":" ","nvap":"≍⃒","nvdash":"⊬","nvDash":"⊭","nVdash":"⊮","nVDash":"⊯","nvge":"≥⃒","nvgt":">⃒","nvHarr":"⤄","nvinfin":"⧞","nvlArr":"⤂","nvle":"≤⃒","nvlt":"<⃒","nvltrie":"⊴⃒","nvrArr":"⤃","nvrtrie":"⊵⃒","nvsim":"∼⃒","nwarhk":"⤣","nwarr":"↖","nwArr":"⇖","nwarrow":"↖","nwnear":"⤧","Oacute":"Ó","oacute":"ó","oast":"⊛","Ocirc":"Ô","ocirc":"ô","ocir":"⊚","Ocy":"О","ocy":"о","odash":"⊝","Odblac":"Ő","odblac":"ő","odiv":"⨸","odot":"⊙","odsold":"⦼","OElig":"Œ","oelig":"œ","ofcir":"⦿","Ofr":"𝔒","ofr":"𝔬","ogon":"˛","Ograve":"Ò","ograve":"ò","ogt":"⧁","ohbar":"⦵","ohm":"Ω","oint":"∮","olarr":"↺","olcir":"⦾","olcross":"⦻","oline":"‾","olt":"⧀","Omacr":"Ō","omacr":"ō","Omega":"Ω","omega":"ω","Omicron":"Ο","omicron":"ο","omid":"⦶","ominus":"⊖","Oopf":"𝕆","oopf":"𝕠","opar":"⦷","OpenCurlyDoubleQuote":"“","OpenCurlyQuote":"‘","operp":"⦹","oplus":"⊕","orarr":"↻","Or":"⩔","or":"∨","ord":"⩝","order":"ℴ","orderof":"ℴ","ordf":"ª","ordm":"º","origof":"⊶","oror":"⩖","orslope":"⩗","orv":"⩛","oS":"Ⓢ","Oscr":"𝒪","oscr":"ℴ","Oslash":"Ø","oslash":"ø","osol":"⊘","Otilde":"Õ","otilde":"õ","otimesas":"⨶","Otimes":"⨷","otimes":"⊗","Ouml":"Ö","ouml":"ö","ovbar":"⌽","OverBar":"‾","OverBrace":"⏞","OverBracket":"⎴","OverParenthesis":"⏜","para":"¶","parallel":"∥","par":"∥","parsim":"⫳","parsl":"⫽","part":"∂","PartialD":"∂","Pcy":"П","pcy":"п","percnt":"%","period":".","permil":"‰","perp":"⊥","pertenk":"‱","Pfr":"𝔓","pfr":"𝔭","Phi":"Φ","phi":"φ","phiv":"ϕ","phmmat":"ℳ","phone":"☎","Pi":"Π","pi":"π","pitchfork":"⋔","piv":"ϖ","planck":"ℏ","planckh":"ℎ","plankv":"ℏ","plusacir":"⨣","plusb":"⊞","pluscir":"⨢","plus":"+","plusdo":"∔","plusdu":"⨥","pluse":"⩲","PlusMinus":"±","plusmn":"±","plussim":"⨦","plustwo":"⨧","pm":"±","Poincareplane":"ℌ","pointint":"⨕","popf":"𝕡","Popf":"ℙ","pound":"£","prap":"⪷","Pr":"⪻","pr":"≺","prcue":"≼","precapprox":"⪷","prec":"≺","preccurlyeq":"≼","Precedes":"≺","PrecedesEqual":"⪯","PrecedesSlantEqual":"≼","PrecedesTilde":"≾","preceq":"⪯","precnapprox":"⪹","precneqq":"⪵","precnsim":"⋨","pre":"⪯","prE":"⪳","precsim":"≾","prime":"′","Prime":"″","primes":"ℙ","prnap":"⪹","prnE":"⪵","prnsim":"⋨","prod":"∏","Product":"∏","profalar":"⌮","profline":"⌒","profsurf":"⌓","prop":"∝","Proportional":"∝","Proportion":"∷","propto":"∝","prsim":"≾","prurel":"⊰","Pscr":"𝒫","pscr":"𝓅","Psi":"Ψ","psi":"ψ","puncsp":" ","Qfr":"𝔔","qfr":"𝔮","qint":"⨌","qopf":"𝕢","Qopf":"ℚ","qprime":"⁗","Qscr":"𝒬","qscr":"𝓆","quaternions":"ℍ","quatint":"⨖","quest":"?","questeq":"≟","quot":"\\"","QUOT":"\\"","rAarr":"⇛","race":"∽̱","Racute":"Ŕ","racute":"ŕ","radic":"√","raemptyv":"⦳","rang":"⟩","Rang":"⟫","rangd":"⦒","range":"⦥","rangle":"⟩","raquo":"»","rarrap":"⥵","rarrb":"⇥","rarrbfs":"⤠","rarrc":"⤳","rarr":"→","Rarr":"↠","rArr":"⇒","rarrfs":"⤞","rarrhk":"↪","rarrlp":"↬","rarrpl":"⥅","rarrsim":"⥴","Rarrtl":"⤖","rarrtl":"↣","rarrw":"↝","ratail":"⤚","rAtail":"⤜","ratio":"∶","rationals":"ℚ","rbarr":"⤍","rBarr":"⤏","RBarr":"⤐","rbbrk":"❳","rbrace":"}","rbrack":"]","rbrke":"⦌","rbrksld":"⦎","rbrkslu":"⦐","Rcaron":"Ř","rcaron":"ř","Rcedil":"Ŗ","rcedil":"ŗ","rceil":"⌉","rcub":"}","Rcy":"Р","rcy":"р","rdca":"⤷","rdldhar":"⥩","rdquo":"”","rdquor":"”","rdsh":"↳","real":"ℜ","realine":"ℛ","realpart":"ℜ","reals":"ℝ","Re":"ℜ","rect":"▭","reg":"®","REG":"®","ReverseElement":"∋","ReverseEquilibrium":"⇋","ReverseUpEquilibrium":"⥯","rfisht":"⥽","rfloor":"⌋","rfr":"𝔯","Rfr":"ℜ","rHar":"⥤","rhard":"⇁","rharu":"⇀","rharul":"⥬","Rho":"Ρ","rho":"ρ","rhov":"ϱ","RightAngleBracket":"⟩","RightArrowBar":"⇥","rightarrow":"→","RightArrow":"→","Rightarrow":"⇒","RightArrowLeftArrow":"⇄","rightarrowtail":"↣","RightCeiling":"⌉","RightDoubleBracket":"⟧","RightDownTeeVector":"⥝","RightDownVectorBar":"⥕","RightDownVector":"⇂","RightFloor":"⌋","rightharpoondown":"⇁","rightharpoonup":"⇀","rightleftarrows":"⇄","rightleftharpoons":"⇌","rightrightarrows":"⇉","rightsquigarrow":"↝","RightTeeArrow":"↦","RightTee":"⊢","RightTeeVector":"⥛","rightthreetimes":"⋌","RightTriangleBar":"⧐","RightTriangle":"⊳","RightTriangleEqual":"⊵","RightUpDownVector":"⥏","RightUpTeeVector":"⥜","RightUpVectorBar":"⥔","RightUpVector":"↾","RightVectorBar":"⥓","RightVector":"⇀","ring":"˚","risingdotseq":"≓","rlarr":"⇄","rlhar":"⇌","rlm":"‏","rmoustache":"⎱","rmoust":"⎱","rnmid":"⫮","roang":"⟭","roarr":"⇾","robrk":"⟧","ropar":"⦆","ropf":"𝕣","Ropf":"ℝ","roplus":"⨮","rotimes":"⨵","RoundImplies":"⥰","rpar":")","rpargt":"⦔","rppolint":"⨒","rrarr":"⇉","Rrightarrow":"⇛","rsaquo":"›","rscr":"𝓇","Rscr":"ℛ","rsh":"↱","Rsh":"↱","rsqb":"]","rsquo":"’","rsquor":"’","rthree":"⋌","rtimes":"⋊","rtri":"▹","rtrie":"⊵","rtrif":"▸","rtriltri":"⧎","RuleDelayed":"⧴","ruluhar":"⥨","rx":"℞","Sacute":"Ś","sacute":"ś","sbquo":"‚","scap":"⪸","Scaron":"Š","scaron":"š","Sc":"⪼","sc":"≻","sccue":"≽","sce":"⪰","scE":"⪴","Scedil":"Ş","scedil":"ş","Scirc":"Ŝ","scirc":"ŝ","scnap":"⪺","scnE":"⪶","scnsim":"⋩","scpolint":"⨓","scsim":"≿","Scy":"С","scy":"с","sdotb":"⊡","sdot":"⋅","sdote":"⩦","searhk":"⤥","searr":"↘","seArr":"⇘","searrow":"↘","sect":"§","semi":";","seswar":"⤩","setminus":"∖","setmn":"∖","sext":"✶","Sfr":"𝔖","sfr":"𝔰","sfrown":"⌢","sharp":"♯","SHCHcy":"Щ","shchcy":"щ","SHcy":"Ш","shcy":"ш","ShortDownArrow":"↓","ShortLeftArrow":"←","shortmid":"∣","shortparallel":"∥","ShortRightArrow":"→","ShortUpArrow":"↑","shy":"­","Sigma":"Σ","sigma":"σ","sigmaf":"ς","sigmav":"ς","sim":"∼","simdot":"⩪","sime":"≃","simeq":"≃","simg":"⪞","simgE":"⪠","siml":"⪝","simlE":"⪟","simne":"≆","simplus":"⨤","simrarr":"⥲","slarr":"←","SmallCircle":"∘","smallsetminus":"∖","smashp":"⨳","smeparsl":"⧤","smid":"∣","smile":"⌣","smt":"⪪","smte":"⪬","smtes":"⪬︀","SOFTcy":"Ь","softcy":"ь","solbar":"⌿","solb":"⧄","sol":"/","Sopf":"𝕊","sopf":"𝕤","spades":"♠","spadesuit":"♠","spar":"∥","sqcap":"⊓","sqcaps":"⊓︀","sqcup":"⊔","sqcups":"⊔︀","Sqrt":"√","sqsub":"⊏","sqsube":"⊑","sqsubset":"⊏","sqsubseteq":"⊑","sqsup":"⊐","sqsupe":"⊒","sqsupset":"⊐","sqsupseteq":"⊒","square":"□","Square":"□","SquareIntersection":"⊓","SquareSubset":"⊏","SquareSubsetEqual":"⊑","SquareSuperset":"⊐","SquareSupersetEqual":"⊒","SquareUnion":"⊔","squarf":"▪","squ":"□","squf":"▪","srarr":"→","Sscr":"𝒮","sscr":"𝓈","ssetmn":"∖","ssmile":"⌣","sstarf":"⋆","Star":"⋆","star":"☆","starf":"★","straightepsilon":"ϵ","straightphi":"ϕ","strns":"¯","sub":"⊂","Sub":"⋐","subdot":"⪽","subE":"⫅","sube":"⊆","subedot":"⫃","submult":"⫁","subnE":"⫋","subne":"⊊","subplus":"⪿","subrarr":"⥹","subset":"⊂","Subset":"⋐","subseteq":"⊆","subseteqq":"⫅","SubsetEqual":"⊆","subsetneq":"⊊","subsetneqq":"⫋","subsim":"⫇","subsub":"⫕","subsup":"⫓","succapprox":"⪸","succ":"≻","succcurlyeq":"≽","Succeeds":"≻","SucceedsEqual":"⪰","SucceedsSlantEqual":"≽","SucceedsTilde":"≿","succeq":"⪰","succnapprox":"⪺","succneqq":"⪶","succnsim":"⋩","succsim":"≿","SuchThat":"∋","sum":"∑","Sum":"∑","sung":"♪","sup1":"¹","sup2":"²","sup3":"³","sup":"⊃","Sup":"⋑","supdot":"⪾","supdsub":"⫘","supE":"⫆","supe":"⊇","supedot":"⫄","Superset":"⊃","SupersetEqual":"⊇","suphsol":"⟉","suphsub":"⫗","suplarr":"⥻","supmult":"⫂","supnE":"⫌","supne":"⊋","supplus":"⫀","supset":"⊃","Supset":"⋑","supseteq":"⊇","supseteqq":"⫆","supsetneq":"⊋","supsetneqq":"⫌","supsim":"⫈","supsub":"⫔","supsup":"⫖","swarhk":"⤦","swarr":"↙","swArr":"⇙","swarrow":"↙","swnwar":"⤪","szlig":"ß","Tab":"\\t","target":"⌖","Tau":"Τ","tau":"τ","tbrk":"⎴","Tcaron":"Ť","tcaron":"ť","Tcedil":"Ţ","tcedil":"ţ","Tcy":"Т","tcy":"т","tdot":"⃛","telrec":"⌕","Tfr":"𝔗","tfr":"𝔱","there4":"∴","therefore":"∴","Therefore":"∴","Theta":"Θ","theta":"θ","thetasym":"ϑ","thetav":"ϑ","thickapprox":"≈","thicksim":"∼","ThickSpace":"  ","ThinSpace":" ","thinsp":" ","thkap":"≈","thksim":"∼","THORN":"Þ","thorn":"þ","tilde":"˜","Tilde":"∼","TildeEqual":"≃","TildeFullEqual":"≅","TildeTilde":"≈","timesbar":"⨱","timesb":"⊠","times":"×","timesd":"⨰","tint":"∭","toea":"⤨","topbot":"⌶","topcir":"⫱","top":"⊤","Topf":"𝕋","topf":"𝕥","topfork":"⫚","tosa":"⤩","tprime":"‴","trade":"™","TRADE":"™","triangle":"▵","triangledown":"▿","triangleleft":"◃","trianglelefteq":"⊴","triangleq":"≜","triangleright":"▹","trianglerighteq":"⊵","tridot":"◬","trie":"≜","triminus":"⨺","TripleDot":"⃛","triplus":"⨹","trisb":"⧍","tritime":"⨻","trpezium":"⏢","Tscr":"𝒯","tscr":"𝓉","TScy":"Ц","tscy":"ц","TSHcy":"Ћ","tshcy":"ћ","Tstrok":"Ŧ","tstrok":"ŧ","twixt":"≬","twoheadleftarrow":"↞","twoheadrightarrow":"↠","Uacute":"Ú","uacute":"ú","uarr":"↑","Uarr":"↟","uArr":"⇑","Uarrocir":"⥉","Ubrcy":"Ў","ubrcy":"ў","Ubreve":"Ŭ","ubreve":"ŭ","Ucirc":"Û","ucirc":"û","Ucy":"У","ucy":"у","udarr":"⇅","Udblac":"Ű","udblac":"ű","udhar":"⥮","ufisht":"⥾","Ufr":"𝔘","ufr":"𝔲","Ugrave":"Ù","ugrave":"ù","uHar":"⥣","uharl":"↿","uharr":"↾","uhblk":"▀","ulcorn":"⌜","ulcorner":"⌜","ulcrop":"⌏","ultri":"◸","Umacr":"Ū","umacr":"ū","uml":"¨","UnderBar":"_","UnderBrace":"⏟","UnderBracket":"⎵","UnderParenthesis":"⏝","Union":"⋃","UnionPlus":"⊎","Uogon":"Ų","uogon":"ų","Uopf":"𝕌","uopf":"𝕦","UpArrowBar":"⤒","uparrow":"↑","UpArrow":"↑","Uparrow":"⇑","UpArrowDownArrow":"⇅","updownarrow":"↕","UpDownArrow":"↕","Updownarrow":"⇕","UpEquilibrium":"⥮","upharpoonleft":"↿","upharpoonright":"↾","uplus":"⊎","UpperLeftArrow":"↖","UpperRightArrow":"↗","upsi":"υ","Upsi":"ϒ","upsih":"ϒ","Upsilon":"Υ","upsilon":"υ","UpTeeArrow":"↥","UpTee":"⊥","upuparrows":"⇈","urcorn":"⌝","urcorner":"⌝","urcrop":"⌎","Uring":"Ů","uring":"ů","urtri":"◹","Uscr":"𝒰","uscr":"𝓊","utdot":"⋰","Utilde":"Ũ","utilde":"ũ","utri":"▵","utrif":"▴","uuarr":"⇈","Uuml":"Ü","uuml":"ü","uwangle":"⦧","vangrt":"⦜","varepsilon":"ϵ","varkappa":"ϰ","varnothing":"∅","varphi":"ϕ","varpi":"ϖ","varpropto":"∝","varr":"↕","vArr":"⇕","varrho":"ϱ","varsigma":"ς","varsubsetneq":"⊊︀","varsubsetneqq":"⫋︀","varsupsetneq":"⊋︀","varsupsetneqq":"⫌︀","vartheta":"ϑ","vartriangleleft":"⊲","vartriangleright":"⊳","vBar":"⫨","Vbar":"⫫","vBarv":"⫩","Vcy":"В","vcy":"в","vdash":"⊢","vDash":"⊨","Vdash":"⊩","VDash":"⊫","Vdashl":"⫦","veebar":"⊻","vee":"∨","Vee":"⋁","veeeq":"≚","vellip":"⋮","verbar":"|","Verbar":"‖","vert":"|","Vert":"‖","VerticalBar":"∣","VerticalLine":"|","VerticalSeparator":"❘","VerticalTilde":"≀","VeryThinSpace":" ","Vfr":"𝔙","vfr":"𝔳","vltri":"⊲","vnsub":"⊂⃒","vnsup":"⊃⃒","Vopf":"𝕍","vopf":"𝕧","vprop":"∝","vrtri":"⊳","Vscr":"𝒱","vscr":"𝓋","vsubnE":"⫋︀","vsubne":"⊊︀","vsupnE":"⫌︀","vsupne":"⊋︀","Vvdash":"⊪","vzigzag":"⦚","Wcirc":"Ŵ","wcirc":"ŵ","wedbar":"⩟","wedge":"∧","Wedge":"⋀","wedgeq":"≙","weierp":"℘","Wfr":"𝔚","wfr":"𝔴","Wopf":"𝕎","wopf":"𝕨","wp":"℘","wr":"≀","wreath":"≀","Wscr":"𝒲","wscr":"𝓌","xcap":"⋂","xcirc":"◯","xcup":"⋃","xdtri":"▽","Xfr":"𝔛","xfr":"𝔵","xharr":"⟷","xhArr":"⟺","Xi":"Ξ","xi":"ξ","xlarr":"⟵","xlArr":"⟸","xmap":"⟼","xnis":"⋻","xodot":"⨀","Xopf":"𝕏","xopf":"𝕩","xoplus":"⨁","xotime":"⨂","xrarr":"⟶","xrArr":"⟹","Xscr":"𝒳","xscr":"𝓍","xsqcup":"⨆","xuplus":"⨄","xutri":"△","xvee":"⋁","xwedge":"⋀","Yacute":"Ý","yacute":"ý","YAcy":"Я","yacy":"я","Ycirc":"Ŷ","ycirc":"ŷ","Ycy":"Ы","ycy":"ы","yen":"¥","Yfr":"𝔜","yfr":"𝔶","YIcy":"Ї","yicy":"ї","Yopf":"𝕐","yopf":"𝕪","Yscr":"𝒴","yscr":"𝓎","YUcy":"Ю","yucy":"ю","yuml":"ÿ","Yuml":"Ÿ","Zacute":"Ź","zacute":"ź","Zcaron":"Ž","zcaron":"ž","Zcy":"З","zcy":"з","Zdot":"Ż","zdot":"ż","zeetrf":"ℨ","ZeroWidthSpace":"​","Zeta":"Ζ","zeta":"ζ","zfr":"𝔷","Zfr":"ℨ","ZHcy":"Ж","zhcy":"ж","zigrarr":"⇝","zopf":"𝕫","Zopf":"ℤ","Zscr":"𝒵","zscr":"𝓏","zwj":"‍","zwnj":"‌"}');
+
+/***/ }),
+
+/***/ 9591:
+/***/ ((module) => {
+
+"use strict";
+module.exports = JSON.parse('{"Aacute":"Á","aacute":"á","Acirc":"Â","acirc":"â","acute":"´","AElig":"Æ","aelig":"æ","Agrave":"À","agrave":"à","amp":"&","AMP":"&","Aring":"Å","aring":"å","Atilde":"Ã","atilde":"ã","Auml":"Ä","auml":"ä","brvbar":"¦","Ccedil":"Ç","ccedil":"ç","cedil":"¸","cent":"¢","copy":"©","COPY":"©","curren":"¤","deg":"°","divide":"÷","Eacute":"É","eacute":"é","Ecirc":"Ê","ecirc":"ê","Egrave":"È","egrave":"è","ETH":"Ð","eth":"ð","Euml":"Ë","euml":"ë","frac12":"½","frac14":"¼","frac34":"¾","gt":">","GT":">","Iacute":"Í","iacute":"í","Icirc":"Î","icirc":"î","iexcl":"¡","Igrave":"Ì","igrave":"ì","iquest":"¿","Iuml":"Ï","iuml":"ï","laquo":"«","lt":"<","LT":"<","macr":"¯","micro":"µ","middot":"·","nbsp":" ","not":"¬","Ntilde":"Ñ","ntilde":"ñ","Oacute":"Ó","oacute":"ó","Ocirc":"Ô","ocirc":"ô","Ograve":"Ò","ograve":"ò","ordf":"ª","ordm":"º","Oslash":"Ø","oslash":"ø","Otilde":"Õ","otilde":"õ","Ouml":"Ö","ouml":"ö","para":"¶","plusmn":"±","pound":"£","quot":"\\"","QUOT":"\\"","raquo":"»","reg":"®","REG":"®","sect":"§","shy":"­","sup1":"¹","sup2":"²","sup3":"³","szlig":"ß","THORN":"Þ","thorn":"þ","times":"×","Uacute":"Ú","uacute":"ú","Ucirc":"Û","ucirc":"û","Ugrave":"Ù","ugrave":"ù","uml":"¨","Uuml":"Ü","uuml":"ü","Yacute":"Ý","yacute":"ý","yen":"¥","yuml":"ÿ"}');
+
+/***/ }),
+
+/***/ 2586:
+/***/ ((module) => {
+
+"use strict";
+module.exports = JSON.parse('{"amp":"&","apos":"\'","gt":">","lt":"<","quot":"\\""}');
+
+/***/ })
+
+/******/ 	});
+/************************************************************************/
+/******/ 	// The module cache
+/******/ 	var __webpack_module_cache__ = {};
+/******/ 	
+/******/ 	// The require function
+/******/ 	function __webpack_require__(moduleId) {
+/******/ 		// Check if module is in cache
+/******/ 		var cachedModule = __webpack_module_cache__[moduleId];
+/******/ 		if (cachedModule !== undefined) {
+/******/ 			return cachedModule.exports;
+/******/ 		}
+/******/ 		// Create a new module (and put it into the cache)
+/******/ 		var module = __webpack_module_cache__[moduleId] = {
+/******/ 			// no module.id needed
+/******/ 			// no module.loaded needed
+/******/ 			exports: {}
+/******/ 		};
+/******/ 	
+/******/ 		// Execute the module function
+/******/ 		__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/ 	
+/******/ 		// Return the exports of the module
+/******/ 		return module.exports;
+/******/ 	}
+/******/ 	
+/************************************************************************/
+/******/ 	/* webpack/runtime/compat get default export */
+/******/ 	(() => {
+/******/ 		// getDefaultExport function for compatibility with non-harmony modules
+/******/ 		__webpack_require__.n = (module) => {
+/******/ 			var getter = module && module.__esModule ?
+/******/ 				() => (module['default']) :
+/******/ 				() => (module);
+/******/ 			__webpack_require__.d(getter, { a: getter });
+/******/ 			return getter;
+/******/ 		};
+/******/ 	})();
+/******/ 	
+/******/ 	/* webpack/runtime/define property getters */
+/******/ 	(() => {
+/******/ 		// define getter functions for harmony exports
+/******/ 		__webpack_require__.d = (exports, definition) => {
+/******/ 			for(var key in definition) {
+/******/ 				if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
+/******/ 					Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
+/******/ 				}
+/******/ 			}
+/******/ 		};
+/******/ 	})();
+/******/ 	
+/******/ 	/* webpack/runtime/hasOwnProperty shorthand */
+/******/ 	(() => {
+/******/ 		__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
+/******/ 	})();
+/******/ 	
+/******/ 	/* webpack/runtime/make namespace object */
+/******/ 	(() => {
+/******/ 		// define __esModule on exports
+/******/ 		__webpack_require__.r = (exports) => {
+/******/ 			if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ 				Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ 			}
+/******/ 			Object.defineProperty(exports, '__esModule', { value: true });
+/******/ 		};
+/******/ 	})();
+/******/ 	
+/************************************************************************/
+var __webpack_exports__ = {};
+// This entry need to be wrapped in an IIFE because it need to be in strict mode.
+(() => {
+"use strict";
+// ESM COMPAT FLAG
+__webpack_require__.r(__webpack_exports__);
+
+// EXPORTS
+__webpack_require__.d(__webpack_exports__, {
+  "Context": () => (/* binding */ src_Context),
+  "DOM": () => (/* binding */ src_DOM),
+  "Model": () => (/* binding */ src_Model),
+  "Overlay": () => (/* binding */ src_Overlay),
+  "Primitives": () => (/* binding */ Primitives),
+  "Render": () => (/* binding */ Render),
+  "Shaders": () => (/* binding */ Shaders),
+  "Stage": () => (/* binding */ Stage),
+  "Util": () => (/* binding */ Util),
+  "e": () => (/* binding */ e),
+  "mathBox": () => (/* binding */ mathBox),
+  "version": () => (/* binding */ version),
+  "π": () => (/* binding */ π),
+  "Ï„": () => (/* binding */ Ï„)
+});
+
+// NAMESPACE OBJECT: ./src/util/pretty.js
+var pretty_namespaceObject = {};
+__webpack_require__.r(pretty_namespaceObject);
+__webpack_require__.d(pretty_namespaceObject, {
+  "JSX": () => (JSX),
+  "format": () => (prettyFormat),
+  "markup": () => (prettyMarkup),
+  "number": () => (prettyNumber),
+  "print": () => (prettyPrint)
+});
+
+// NAMESPACE OBJECT: ./src/model/index.js
+var src_model_namespaceObject = {};
+__webpack_require__.r(src_model_namespaceObject);
+__webpack_require__.d(src_model_namespaceObject, {
+  "Attributes": () => (Attributes),
+  "Group": () => (group_Group),
+  "Guard": () => (Guard),
+  "Model": () => (Model),
+  "Node": () => (node_Node)
+});
+
+// NAMESPACE OBJECT: ./src/util/vdom.js
+var vdom_namespaceObject = {};
+__webpack_require__.r(vdom_namespaceObject);
+__webpack_require__.d(vdom_namespaceObject, {
+  "Types": () => (Types),
+  "apply": () => (apply),
+  "createClass": () => (createClass),
+  "element": () => (vdom_element),
+  "hint": () => (hint),
+  "recycle": () => (recycle)
+});
+
+// NAMESPACE OBJECT: ./src/overlay/index.js
+var src_overlay_namespaceObject = {};
+__webpack_require__.r(src_overlay_namespaceObject);
+__webpack_require__.d(src_overlay_namespaceObject, {
+  "Classes": () => (Classes),
+  "Factory": () => (OverlayFactory),
+  "Overlay": () => (Overlay)
+});
+
+// NAMESPACE OBJECT: ./src/util/three.js
+var three_namespaceObject = {};
+__webpack_require__.r(three_namespaceObject);
+__webpack_require__.d(three_namespaceObject, {
+  "paramToArrayStorage": () => (paramToArrayStorage),
+  "paramToGL": () => (paramToGL),
+  "swizzleToEulerOrder": () => (swizzleToEulerOrder),
+  "transformComposer": () => (transformComposer)
+});
+
+// NAMESPACE OBJECT: ./src/util/data.js
+var data_namespaceObject = {};
+__webpack_require__.r(data_namespaceObject);
+__webpack_require__.d(data_namespaceObject, {
+  "getDimensions": () => (getDimensions),
+  "getLerpEmitter": () => (getLerpEmitter),
+  "getLerpThunk": () => (getLerpThunk),
+  "getSizes": () => (getSizes),
+  "getStreamer": () => (getStreamer),
+  "getThunk": () => (getThunk),
+  "makeEmitter": () => (makeEmitter),
+  "repeatCall": () => (repeatCall)
+});
+
+// NAMESPACE OBJECT: ./src/util/glsl.js
+var glsl_namespaceObject = {};
+__webpack_require__.r(glsl_namespaceObject);
+__webpack_require__.d(glsl_namespaceObject, {
+  "binaryOperator": () => (binaryOperator),
+  "constant": () => (constant),
+  "extendVec": () => (extendVec),
+  "identity": () => (identity),
+  "injectVec4": () => (injectVec4),
+  "invertSwizzleVec4": () => (invertSwizzleVec4),
+  "mapByte2FloatOffset": () => (mapByte2FloatOffset),
+  "sample2DArray": () => (glsl_sample2DArray),
+  "swizzleVec4": () => (swizzleVec4),
+  "toType": () => (toType),
+  "truncateVec": () => (truncateVec)
+});
+
+// NAMESPACE OBJECT: ./src/util/axis.js
+var axis_namespaceObject = {};
+__webpack_require__.r(axis_namespaceObject);
+__webpack_require__.d(axis_namespaceObject, {
+  "addOrigin": () => (addOrigin),
+  "recenterAxis": () => (recenterAxis),
+  "setDimension": () => (setDimension),
+  "setDimensionNormal": () => (setDimensionNormal),
+  "setOrigin": () => (setOrigin)
+});
+
+// NAMESPACE OBJECT: ./src/util/js.js
+var js_namespaceObject = {};
+__webpack_require__.r(js_namespaceObject);
+__webpack_require__.d(js_namespaceObject, {
+  "clone": () => (clone),
+  "merge": () => (merge),
+  "parseQuoted": () => (parseQuoted)
+});
+
+// NAMESPACE OBJECT: ./src/util/ease.js
+var ease_namespaceObject = {};
+__webpack_require__.r(ease_namespaceObject);
+__webpack_require__.d(ease_namespaceObject, {
+  "binary": () => (binary),
+  "clamp": () => (ease_clamp),
+  "cosine": () => (cosine),
+  "hold": () => (hold)
+});
+
+// NAMESPACE OBJECT: ./src/util/ticks.js
+var util_ticks_namespaceObject = {};
+__webpack_require__.r(util_ticks_namespaceObject);
+__webpack_require__.d(util_ticks_namespaceObject, {
+  "linear": () => (linear),
+  "log": () => (log),
+  "make": () => (make)
+});
+
+// NAMESPACE OBJECT: ./src/primitives/types/index.js
+var primitives_types_namespaceObject = {};
+__webpack_require__.r(primitives_types_namespaceObject);
+__webpack_require__.d(primitives_types_namespaceObject, {
+  "Classes": () => (classes_Classes),
+  "Helpers": () => (Helpers),
+  "Traits": () => (Traits),
+  "Types": () => (types_Types)
+});
+
+// NAMESPACE OBJECT: ./src/primitives/index.js
+var primitives_namespaceObject = {};
+__webpack_require__.r(primitives_namespaceObject);
+__webpack_require__.d(primitives_namespaceObject, {
+  "Factory": () => (PrimitiveFactory),
+  "Primitive": () => (Primitive),
+  "Types": () => (primitives_Types)
+});
+
+// NAMESPACE OBJECT: ./src/render/index.js
+var src_render_namespaceObject = {};
+__webpack_require__.r(src_render_namespaceObject);
+__webpack_require__.d(src_render_namespaceObject, {
+  "Classes": () => (render_classes_Classes),
+  "Factory": () => (RenderFactory),
+  "Scene": () => (Scene)
+});
+
+// NAMESPACE OBJECT: ./node_modules/shadergraph/src/graph/index.js
+var src_graph_namespaceObject = {};
+__webpack_require__.r(src_graph_namespaceObject);
+__webpack_require__.d(src_graph_namespaceObject, {
+  "Graph": () => (Graph),
+  "IN": () => (IN),
+  "Node": () => (graph_node_Node),
+  "OUT": () => (OUT),
+  "Outlet": () => (Outlet)
+});
+
+// NAMESPACE OBJECT: ./node_modules/shadergraph/src/linker/index.js
+var linker_namespaceObject = {};
+__webpack_require__.r(linker_namespaceObject);
+__webpack_require__.d(linker_namespaceObject, {
+  "Layout": () => (Layout),
+  "Program": () => (Program),
+  "Snippet": () => (Snippet),
+  "assemble": () => (assemble),
+  "compare": () => (linker_priority.compare),
+  "link": () => (link_link),
+  "load": () => (load),
+  "make": () => (linker_priority.make),
+  "max": () => (linker_priority.max),
+  "nest": () => (linker_priority.nest)
+});
+
+// NAMESPACE OBJECT: ./node_modules/shadergraph/src/visualize/markup.js
+var markup_namespaceObject = {};
+__webpack_require__.r(markup_namespaceObject);
+__webpack_require__.d(markup_namespaceObject, {
+  "merge": () => (markup_merge),
+  "overlay": () => (overlay),
+  "process": () => (process)
+});
+
+// NAMESPACE OBJECT: ./node_modules/shadergraph/src/visualize/index.js
+var visualize_namespaceObject = {};
+__webpack_require__.r(visualize_namespaceObject);
+__webpack_require__.d(visualize_namespaceObject, {
+  "inspect": () => (inspect),
+  "markup": () => (markup),
+  "serialize": () => (visualize_serialize),
+  "visualize": () => (visualize)
+});
+
+// NAMESPACE OBJECT: ./node_modules/shadergraph/src/factory/index.js
+var src_factory_namespaceObject = {};
+__webpack_require__.r(src_factory_namespaceObject);
+__webpack_require__.d(src_factory_namespaceObject, {
+  "Factory": () => (Factory),
+  "Material": () => (material_Material),
+  "cache": () => (cache),
+  "hash": () => (hash),
+  "library": () => (library),
+  "queue": () => (queue)
+});
+
+// NAMESPACE OBJECT: ./node_modules/shadergraph/src/glsl/index.js
+var src_glsl_namespaceObject = {};
+__webpack_require__.r(src_glsl_namespaceObject);
+__webpack_require__.d(src_glsl_namespaceObject, {
+  "RETURN_ARG": () => (RETURN_ARG),
+  "SHADOW_ARG": () => (SHADOW_ARG),
+  "body": () => (body),
+  "build": () => (build),
+  "call": () => (call),
+  "compile": () => (compile_compile),
+  "dedupe": () => (dedupe),
+  "define": () => (generate_define),
+  "defuse": () => (defuse),
+  "fn": () => (fn),
+  "hoist": () => (hoist),
+  "invoke": () => (invoke),
+  "lines": () => (lines),
+  "link": () => (generate_link),
+  "links": () => (links),
+  "list": () => (list),
+  "parse": () => (parse),
+  "same": () => (same),
+  "statements": () => (statements),
+  "unshadow": () => (unshadow),
+  "walk": () => (walk)
+});
+
+// NAMESPACE OBJECT: ./src/shaders/index.js
+var shaders_namespaceObject = {};
+__webpack_require__.r(shaders_namespaceObject);
+__webpack_require__.d(shaders_namespaceObject, {
+  "Factory": () => (factory_Factory),
+  "Snippets": () => (Snippets)
+});
+
+// NAMESPACE OBJECT: ./src/stage/index.js
+var stage_namespaceObject = {};
+__webpack_require__.r(stage_namespaceObject);
+__webpack_require__.d(stage_namespaceObject, {
+  "API": () => (API),
+  "Animator": () => (Animator),
+  "Controller": () => (Controller)
+});
+
+// NAMESPACE OBJECT: ./src/util/index.js
+var util_namespaceObject = {};
+__webpack_require__.r(util_namespaceObject);
+__webpack_require__.d(util_namespaceObject, {
+  "Axis": () => (util_Axis),
+  "Data": () => (util_Data),
+  "Ease": () => (Ease),
+  "GLSL": () => (GLSL),
+  "JS": () => (JS),
+  "Pretty": () => (Pretty),
+  "Three": () => (Three),
+  "Ticks": () => (util_Ticks),
+  "VDOM": () => (VDOM)
+});
+
+;// CONCATENATED MODULE: ./node_modules/threestrap/src/api.js
+class Api {
+  static apply(object) {
+    object.set = function (options) {
+      var o = this.options || {};
+
+      // Diff out changes
+      var changes = Object.entries(options).reduce(function (
+        result,
+        [key, value]
+      ) {
+        if (o[key] !== value) result[key] = value;
+        return result;
+      },
+      {});
+
+      this.options = Object.assign(o, changes);
+
+      // Notify
+      this.trigger({ type: "change", options: options, changes: changes });
+    };
+
+    object.get = function () {
+      return this.options;
+    };
+
+    object.api = function (object, context) {
+      if (!object) {
+        object = {};
+      }
+
+      // Append context argument to API methods
+      context &&
+        Object.entries(object).forEach(function ([key, callback]) {
+          if (typeof callback === "function") {
+            object[key] = (...args) => callback(...args, context);
+          }
+        });
+
+      object.set = this.set.bind(this);
+      object.get = this.get.bind(this);
+
+      return object;
+    };
+  }
+}
+
+;// CONCATENATED MODULE: ./node_modules/three/src/core/EventDispatcher.js
+/**
+ * https://github.com/mrdoob/eventdispatcher.js/
+ */
+
+class EventDispatcher {
+
+	addEventListener( type, listener ) {
+
+		if ( this._listeners === undefined ) this._listeners = {};
+
+		const listeners = this._listeners;
+
+		if ( listeners[ type ] === undefined ) {
+
+			listeners[ type ] = [];
+
+		}
+
+		if ( listeners[ type ].indexOf( listener ) === - 1 ) {
+
+			listeners[ type ].push( listener );
+
+		}
+
+	}
+
+	hasEventListener( type, listener ) {
+
+		if ( this._listeners === undefined ) return false;
+
+		const listeners = this._listeners;
+
+		return listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1;
+
+	}
+
+	removeEventListener( type, listener ) {
+
+		if ( this._listeners === undefined ) return;
+
+		const listeners = this._listeners;
+		const listenerArray = listeners[ type ];
+
+		if ( listenerArray !== undefined ) {
+
+			const index = listenerArray.indexOf( listener );
+
+			if ( index !== - 1 ) {
+
+				listenerArray.splice( index, 1 );
+
+			}
+
+		}
+
+	}
+
+	dispatchEvent( event ) {
+
+		if ( this._listeners === undefined ) return;
+
+		const listeners = this._listeners;
+		const listenerArray = listeners[ event.type ];
+
+		if ( listenerArray !== undefined ) {
+
+			event.target = this;
+
+			// Make a copy, in case listeners are removed while iterating.
+			const array = listenerArray.slice( 0 );
+
+			for ( let i = 0, l = array.length; i < l; i ++ ) {
+
+				array[ i ].call( this, event );
+
+			}
+
+			event.target = null;
+
+		}
+
+	}
+
+}
+
+
+
+
+;// CONCATENATED MODULE: ./node_modules/threestrap/src/binder.js
+
+
+class Binder {
+  static bind(context, globals) {
+    return function (key, object) {
+      // Prepare object
+      if (!object.__binds) {
+        object.__binds = [];
+      }
+
+      // Set base target
+      var fallback = context;
+
+      if (Array.isArray(key)) {
+        fallback = key[0];
+        key = key[1];
+      }
+
+      // Match key
+      var match = /^([^.:]*(?:\.[^.:]+)*)?(?::(.*))?$/.exec(key);
+      var path = match[1].split(/\./g);
+
+      var name = path.pop();
+      var dest = match[2] || name;
+
+      // Whitelisted objects
+      var selector = path.shift();
+
+      var target =
+        {
+          this: object,
+        }[selector] ||
+        globals[selector] ||
+        context[selector] ||
+        fallback;
+
+      // Look up keys
+      while (target && (key = path.shift())) {
+        target = target[key];
+      }
+
+      // Attach event handler at last level
+      if (target && (target.on || target.addEventListener)) {
+        var callback = function (event) {
+          object[dest] && object[dest](event, context);
+        };
+
+        // Polyfill for both styles of event listener adders
+        Binder._polyfill(target, ["addEventListener", "on"], function (method) {
+          target[method](name, callback);
+        });
+
+        // Store bind for removal later
+        var bind = { target: target, name: name, callback: callback };
+        object.__binds.push(bind);
+
+        // Return callback
+        return callback;
+      } else {
+        throw "Cannot bind '" + key + "' in " + this.__name;
+      }
+    };
+  }
+
+  static unbind() {
+    return function (object) {
+      // Remove all binds belonging to object
+      if (object.__binds) {
+        object.__binds.forEach(
+          function (bind) {
+            // Polyfill for both styles of event listener removers
+            Binder._polyfill(
+              bind.target,
+              ["removeEventListener", "off"],
+              function (method) {
+                bind.target[method](bind.name, bind.callback);
+              }
+            );
+          }.bind(this)
+        );
+
+        object.__binds = [];
+      }
+    };
+  }
+
+  static apply(object) {
+    object.trigger = Binder._trigger;
+    object.triggerOnce = Binder._triggerOnce;
+
+    object.hasEventListener = EventDispatcher.prototype.hasEventListener;
+    object.addEventListener = EventDispatcher.prototype.addEventListener;
+    object.removeEventListener = EventDispatcher.prototype.removeEventListener;
+
+    object.on = object.addEventListener;
+    object.off = object.removeEventListener;
+    object.dispatchEvent = object.trigger;
+  }
+
+  static _triggerOnce(event) {
+    this.trigger(event);
+    if (this._listeners) {
+      delete this._listeners[event.type];
+    }
+  }
+
+  static _trigger(event) {
+    if (this._listeners === undefined) return;
+
+    var type = event.type;
+    var listeners = this._listeners[type];
+    if (listeners !== undefined) {
+      listeners = listeners.slice();
+      var length = listeners.length;
+
+      event.target = this;
+      for (var i = 0; i < length; i++) {
+        // add original target as parameter for convenience
+        listeners[i].call(this, event, this);
+      }
+    }
+  }
+
+  static _polyfill(object, methods, callback) {
+    methods.map(function (_method) {
+      return object.method;
+    });
+    if (methods.length) callback(methods[0]);
+  }
+}
+
+;// CONCATENATED MODULE: ./node_modules/threestrap/src/bootstrap.js
+
+
+
+function isString(str) {
+  return str && typeof str.valueOf() === "string";
+}
+
+class Bootstrap {
+  static initClass() {
+    this.Plugins = {};
+    this.Aliases = {};
+  }
+
+  static registerPlugin(name, spec) {
+    var ctor = function (options) {
+      Bootstrap.Plugin.call(this, options);
+      this.__name = name;
+    };
+    ctor.prototype = Object.assign(new Bootstrap.Plugin(), spec);
+
+    this.Plugins[name] = ctor;
+  }
+
+  static unregisterPlugin(name) {
+    delete this.Plugins[name];
+  }
+
+  static registerAlias(name, plugins) {
+    this.Aliases[name] = plugins;
+  }
+
+  static unregisterAlias(name) {
+    delete this.Aliases[name];
+  }
+
+  constructor(options) {
+    if (options) {
+      let args = [].slice.apply(arguments);
+      options = {};
+
+      // (element, ...)
+      if (args[0] instanceof Node) {
+        const node = args[0];
+        args = args.slice(1);
+        options.element = node;
+      }
+
+      // (..., plugin, plugin, plugin)
+      if (isString(args[0])) {
+        options.plugins = args;
+      } else if (Array.isArray(args[0])) {
+        // (..., [plugin, plugin, plugin])
+        options.plugins = args[0];
+      } else if (args[0]) {
+        // (..., options)
+
+        // else, merge any arguments on the right that have NOT been set into the
+        // options dict on the left.
+        options = Object.assign({}, args[0], options);
+      }
+    }
+
+    // Apply defaults
+    const defaultOpts = {
+      init: true,
+      element: document.body,
+      plugins: ["core"],
+      aliases: {},
+      plugindb: Bootstrap.Plugins || {},
+      aliasdb: Bootstrap.Aliases || {},
+    };
+
+    this.__options = Object.assign({}, defaultOpts, options || {});
+
+    // Hidden state
+    this.__inited = false;
+    this.__destroyed = false;
+    this.__installed = [];
+
+    // Query element
+    var element = this.__options.element;
+    if (element === "" + element) {
+      element = document.querySelector(element);
+    }
+
+    // Global context
+    this.plugins = {};
+    this.element = element;
+
+    // Update cycle
+    this.trigger = this.trigger.bind(this);
+    this.frame = this.frame.bind(this);
+    this.events = ["pre", "update", "render", "post"].map(function (type) {
+      return { type: type };
+    });
+
+    // Auto-init
+    if (this.__options.init) {
+      this.init();
+    }
+  }
+
+  init() {
+    if (this.__inited) return;
+    this.__inited = true;
+
+    // Install plugins
+    this.install(this.__options.plugins);
+  }
+
+  destroy() {
+    if (!this.__inited) return;
+    if (this.__destroyed) return;
+    this.__destroyed = true;
+
+    // Notify of imminent destruction
+    this.trigger({ type: "destroy" });
+
+    // Then uninstall plugins
+    this.uninstall();
+  }
+
+  frame() {
+    this.events.map(this.trigger);
+  }
+
+  resolve(plugins) {
+    plugins = Array.isArray(plugins) ? plugins : [plugins];
+
+    // Resolve alias database
+    var o = this.__options;
+    var aliases = Object.assign({}, o.aliasdb, o.aliases);
+
+    // Remove inline alias defs from plugins
+    var pred = function (name) {
+      var key = name.split(":");
+      if (!key[1]) return true;
+      aliases[key[0]] = [key[1]];
+      return false;
+    };
+    plugins = plugins.filter(pred);
+
+    // Unify arrays
+    Object.entries(aliases).forEach(function ([key, alias]) {
+      aliases[key] = Array.isArray(alias) ? alias : [alias];
+    });
+
+    // Look up aliases recursively
+    function recurse(list, out, level) {
+      if (level >= 256) throw "Plug-in alias recursion detected.";
+      list = list.filter(pred);
+      list.forEach(function (name) {
+        var alias = aliases[name];
+        if (!alias) {
+          out.push(name);
+        } else {
+          out = out.concat(recurse(alias, [], level + 1));
+        }
+      });
+      return out;
+    }
+
+    return recurse(plugins, [], 0);
+  }
+
+  install(plugins) {
+    plugins = Array.isArray(plugins) ? plugins : [plugins];
+
+    // Resolve aliases
+    plugins = this.resolve(plugins);
+
+    // Install in order
+    plugins.forEach((name) => this.__install(name));
+
+    // Fire off ready event
+    this.__ready();
+  }
+
+  uninstall(plugins) {
+    if (plugins) {
+      plugins = Array.isArray(plugins) ? plugins : [plugins];
+
+      // Resolve aliases
+      plugins = this.resolve(plugins);
+    }
+
+    // Uninstall in reverse order
+    (plugins || this.__installed)
+      .reverse()
+      .forEach((p) => this.__uninstall(p.__name));
+  }
+
+  __install(name) {
+    // Sanity check
+    var ctor = this.__options.plugindb[name];
+    if (!ctor)
+      throw "[three.install] Cannot install. '" + name + "' is not registered.";
+
+    if (this.plugins[name])
+      return console.warn("[three.install] " + name + " is already installed.");
+
+    // Construct
+    var Plugin = ctor;
+    var plugin = new Plugin(this.__options[name] || {}, name);
+    this.plugins[name] = plugin;
+
+    // Install
+    const flag = plugin.install(this);
+    this.__installed.push(plugin);
+
+    // Then notify
+    this.trigger({ type: "install", plugin: plugin });
+
+    // Allow early abort
+    return flag;
+  }
+
+  __uninstall(name) {
+    // Sanity check
+    const plugin = isString(name) ? this.plugins[name] : name;
+    if (!plugin) {
+      console.warn("[three.uninstall] " + name + "' is not installed.");
+      return;
+    }
+
+    name = plugin.__name;
+
+    // Uninstall
+    plugin.uninstall(this);
+    this.__installed = this.__installed.filter((p) => p !== plugin);
+    delete this.plugins[name];
+
+    // Then notify
+    this.trigger({ type: "uninstall", plugin: plugin });
+  }
+
+  __ready() {
+    // Notify and remove event handlers
+    this.triggerOnce({ type: "ready" });
+  }
+}
+Bootstrap.initClass();
+
+// Plugin Creation
+
+Bootstrap.Plugin = function (options) {
+  this.options = Object.assign({}, this.defaults, options || {});
+};
+
+Bootstrap.Plugin.prototype = {
+  listen: [],
+  defaults: {},
+  install: function (_three) {},
+  uninstall: function (_three) {},
+};
+
+Binder.apply(Bootstrap.prototype);
+Binder.apply(Bootstrap.Plugin.prototype);
+Api.apply(Bootstrap.Plugin.prototype);
+
+;// CONCATENATED MODULE: ./src/splash.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS205: Consider reworking code to avoid use of IIFEs
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+// Threestrap plugin
+
+
+
+Bootstrap.registerPlugin("splash", {
+  defaults: {
+    color: "mono",
+    fancy: true,
+  },
+
+  listen: [
+    "ready",
+    "mathbox/init:init",
+    "mathbox/progress:progress",
+    "mathbox/destroy:destroy",
+  ],
+
+  uninstall() {
+    return this.destroy();
+  },
+
+  ready(event, three) {
+    if (three.MathBox && !this.div) {
+      // TODO woah seems wrong!!!
+      return this.init(event, three);
+    }
+  },
+
+  init(event, three) {
+    let div;
+    this.destroy();
+
+    const { color } = this.options;
+    const html = `\
+<div class="mathbox-loader mathbox-splash-${color}">
+  <div class="mathbox-logo">
+    <div> <div></div><div></div><div></div> </div>
+    <div> <div></div><div></div><div></div> </div>
+  </div>
+  <div class="mathbox-progress"><div></div></div>
+</div>\
+`;
+
+    this.div = div = document.createElement("div");
+    div.innerHTML = html;
+    three.element.appendChild(div);
+
+    const x = Math.random() * 2 - 1;
+    const y = Math.random() * 2 - 1;
+    const z = Math.random() * 2 - 1;
+    const l = 1 / Math.sqrt(x * x + y * y + z * z);
+
+    this.loader = div.querySelector(".mathbox-loader");
+    this.bar = div.querySelector(".mathbox-progress > div");
+    this.gyro = div.querySelectorAll(".mathbox-logo > div");
+    this.transforms = [
+      "rotateZ(22deg) rotateX(24deg) rotateY(30deg)",
+      "rotateZ(11deg) rotateX(12deg) rotateY(15deg) scale3d(.6, .6, .6)",
+    ];
+    this.random = [x * l, y * l, z * l];
+    this.start = three.Time.now;
+    return (this.timer = null);
+  },
+
+  // Update splash screen state and animation
+  progress(event, three) {
+    if (!this.div) {
+      return;
+    }
+
+    const { current, total } = event;
+
+    // Display splash screen
+    const visible = current < total;
+    clearTimeout(this.timer);
+    if (visible) {
+      this.loader.classList.remove("mathbox-exit");
+      this.loader.style.display = "block";
+    } else {
+      this.loader.classList.add("mathbox-exit");
+      this.timer = setTimeout(() => {
+        return (this.loader.style.display = "none");
+      }, 150);
+    }
+
+    // Update splash progress
+    const width =
+      current < total
+        ? Math.round((1000 * current) / total) * 0.1 + "%"
+        : "100%";
+    this.bar.style.width = width;
+
+    if (this.options.fancy) {
+      // Spinny gyros
+      const weights = this.random;
+
+      // Lerp clock speed
+      const f = Math.max(0, Math.min(1, three.Time.now - this.start));
+      const increment = function (transform, j) {
+        if (j == null) {
+          j = 0;
+        }
+        return transform.replace(
+          /(-?[0-9.e]+)deg/g,
+          (_, n) => +n + weights[j++] * f * three.Time.step * 60 + "deg"
+        );
+      };
+
+      return (() => {
+        const result = [];
+        for (let i = 0; i < this.gyro.length; i++) {
+          let t;
+          const el = this.gyro[i];
+          this.transforms[i] = t = increment(this.transforms[i]);
+          result.push((el.style.transform = el.style.WebkitTransform = t));
+        }
+        return result;
+      })();
+    }
+  },
+
+  destroy() {
+    if (this.div != null) {
+      this.div.remove();
+    }
+    return (this.div = null);
+  },
+});
+
+;// CONCATENATED MODULE: ./node_modules/threestrap/src/aliases.js
+
+
+Bootstrap.registerAlias("empty", [
+  "fallback",
+  "bind",
+  "renderer",
+  "size",
+  "fill",
+  "loop",
+  "time",
+]);
+
+Bootstrap.registerAlias("core", [
+  "empty",
+  "scene",
+  "camera",
+  "render",
+  "warmup",
+]);
+
+Bootstrap.registerAlias("VR", ["core", "cursor", "fullscreen", "render:vr"]);
+
+;// CONCATENATED MODULE: ./node_modules/threestrap/src/core/bind.js
+
+
+
+Bootstrap.registerPlugin("bind", {
+  install: function (three) {
+    const globals = {
+      three: three,
+      window: window,
+    };
+
+    three.bind = Binder.bind(three, globals);
+    three.unbind = Binder.unbind(three);
+
+    three.bind("install:bind", this);
+    three.bind("uninstall:unbind", this);
+  },
+
+  uninstall: function (three) {
+    three.unbind(this);
+
+    delete three.bind;
+    delete three.unbind;
+  },
+
+  bind: function (event, three) {
+    const plugin = event.plugin;
+    const listen = plugin.listen;
+
+    listen &&
+      listen.forEach(function (key) {
+        three.bind(key, plugin);
+      });
+  },
+
+  unbind: function (event, three) {
+    three.unbind(event.plugin);
+  },
+});
+
+;// CONCATENATED MODULE: ./node_modules/three/src/math/MathUtils.js
+const _lut = [];
+
+for ( let i = 0; i < 256; i ++ ) {
+
+	_lut[ i ] = ( i < 16 ? '0' : '' ) + ( i ).toString( 16 );
+
+}
+
+let _seed = 1234567;
+
+
+const DEG2RAD = Math.PI / 180;
+const RAD2DEG = 180 / Math.PI;
+
+// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136
+function generateUUID() {
+
+	const d0 = Math.random() * 0xffffffff | 0;
+	const d1 = Math.random() * 0xffffffff | 0;
+	const d2 = Math.random() * 0xffffffff | 0;
+	const d3 = Math.random() * 0xffffffff | 0;
+	const uuid = _lut[ d0 & 0xff ] + _lut[ d0 >> 8 & 0xff ] + _lut[ d0 >> 16 & 0xff ] + _lut[ d0 >> 24 & 0xff ] + '-' +
+			_lut[ d1 & 0xff ] + _lut[ d1 >> 8 & 0xff ] + '-' + _lut[ d1 >> 16 & 0x0f | 0x40 ] + _lut[ d1 >> 24 & 0xff ] + '-' +
+			_lut[ d2 & 0x3f | 0x80 ] + _lut[ d2 >> 8 & 0xff ] + '-' + _lut[ d2 >> 16 & 0xff ] + _lut[ d2 >> 24 & 0xff ] +
+			_lut[ d3 & 0xff ] + _lut[ d3 >> 8 & 0xff ] + _lut[ d3 >> 16 & 0xff ] + _lut[ d3 >> 24 & 0xff ];
+
+	// .toUpperCase() here flattens concatenated strings to save heap memory space.
+	return uuid.toUpperCase();
+
+}
+
+function clamp( value, min, max ) {
+
+	return Math.max( min, Math.min( max, value ) );
+
+}
+
+// compute euclidian modulo of m % n
+// https://en.wikipedia.org/wiki/Modulo_operation
+function euclideanModulo( n, m ) {
+
+	return ( ( n % m ) + m ) % m;
+
+}
+
+// Linear mapping from range <a1, a2> to range <b1, b2>
+function mapLinear( x, a1, a2, b1, b2 ) {
+
+	return b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );
+
+}
+
+// https://www.gamedev.net/tutorials/programming/general-and-gameplay-programming/inverse-lerp-a-super-useful-yet-often-overlooked-function-r5230/
+function inverseLerp( x, y, value ) {
+
+	if ( x !== y ) {
+
+		return ( value - x ) / ( y - x );
+
+	} else {
+
+		return 0;
+
+	}
+
+}
+
+// https://en.wikipedia.org/wiki/Linear_interpolation
+function lerp( x, y, t ) {
+
+	return ( 1 - t ) * x + t * y;
+
+}
+
+// http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/
+function damp( x, y, lambda, dt ) {
+
+	return lerp( x, y, 1 - Math.exp( - lambda * dt ) );
+
+}
+
+// https://www.desmos.com/calculator/vcsjnyz7x4
+function pingpong( x, length = 1 ) {
+
+	return length - Math.abs( euclideanModulo( x, length * 2 ) - length );
+
+}
+
+// http://en.wikipedia.org/wiki/Smoothstep
+function smoothstep( x, min, max ) {
+
+	if ( x <= min ) return 0;
+	if ( x >= max ) return 1;
+
+	x = ( x - min ) / ( max - min );
+
+	return x * x * ( 3 - 2 * x );
+
+}
+
+function smootherstep( x, min, max ) {
+
+	if ( x <= min ) return 0;
+	if ( x >= max ) return 1;
+
+	x = ( x - min ) / ( max - min );
+
+	return x * x * x * ( x * ( x * 6 - 15 ) + 10 );
+
+}
+
+// Random integer from <low, high> interval
+function randInt( low, high ) {
+
+	return low + Math.floor( Math.random() * ( high - low + 1 ) );
+
+}
+
+// Random float from <low, high> interval
+function randFloat( low, high ) {
+
+	return low + Math.random() * ( high - low );
+
+}
+
+// Random float from <-range/2, range/2> interval
+function randFloatSpread( range ) {
+
+	return range * ( 0.5 - Math.random() );
+
+}
+
+// Deterministic pseudo-random float in the interval [ 0, 1 ]
+function seededRandom( s ) {
+
+	if ( s !== undefined ) _seed = s % 2147483647;
+
+	// Park-Miller algorithm
+
+	_seed = _seed * 16807 % 2147483647;
+
+	return ( _seed - 1 ) / 2147483646;
+
+}
+
+function degToRad( degrees ) {
+
+	return degrees * DEG2RAD;
+
+}
+
+function radToDeg( radians ) {
+
+	return radians * RAD2DEG;
+
+}
+
+function MathUtils_isPowerOfTwo( value ) {
+
+	return ( value & ( value - 1 ) ) === 0 && value !== 0;
+
+}
+
+function ceilPowerOfTwo( value ) {
+
+	return Math.pow( 2, Math.ceil( Math.log( value ) / Math.LN2 ) );
+
+}
+
+function floorPowerOfTwo( value ) {
+
+	return Math.pow( 2, Math.floor( Math.log( value ) / Math.LN2 ) );
+
+}
+
+function setQuaternionFromProperEuler( q, a, b, c, order ) {
+
+	// Intrinsic Proper Euler Angles - see https://en.wikipedia.org/wiki/Euler_angles
+
+	// rotations are applied to the axes in the order specified by 'order'
+	// rotation by angle 'a' is applied first, then by angle 'b', then by angle 'c'
+	// angles are in radians
+
+	const cos = Math.cos;
+	const sin = Math.sin;
+
+	const c2 = cos( b / 2 );
+	const s2 = sin( b / 2 );
+
+	const c13 = cos( ( a + c ) / 2 );
+	const s13 = sin( ( a + c ) / 2 );
+
+	const c1_3 = cos( ( a - c ) / 2 );
+	const s1_3 = sin( ( a - c ) / 2 );
+
+	const c3_1 = cos( ( c - a ) / 2 );
+	const s3_1 = sin( ( c - a ) / 2 );
+
+	switch ( order ) {
+
+		case 'XYX':
+			q.set( c2 * s13, s2 * c1_3, s2 * s1_3, c2 * c13 );
+			break;
+
+		case 'YZY':
+			q.set( s2 * s1_3, c2 * s13, s2 * c1_3, c2 * c13 );
+			break;
+
+		case 'ZXZ':
+			q.set( s2 * c1_3, s2 * s1_3, c2 * s13, c2 * c13 );
+			break;
+
+		case 'XZX':
+			q.set( c2 * s13, s2 * s3_1, s2 * c3_1, c2 * c13 );
+			break;
+
+		case 'YXY':
+			q.set( s2 * c3_1, c2 * s13, s2 * s3_1, c2 * c13 );
+			break;
+
+		case 'ZYZ':
+			q.set( s2 * s3_1, s2 * c3_1, c2 * s13, c2 * c13 );
+			break;
+
+		default:
+			console.warn( 'THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: ' + order );
+
+	}
+
+}
+
+
+
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/math/Quaternion.js
+
+
+class Quaternion {
+
+	constructor( x = 0, y = 0, z = 0, w = 1 ) {
+
+		this._x = x;
+		this._y = y;
+		this._z = z;
+		this._w = w;
+
+	}
+
+	static slerp( qa, qb, qm, t ) {
+
+		console.warn( 'THREE.Quaternion: Static .slerp() has been deprecated. Use qm.slerpQuaternions( qa, qb, t ) instead.' );
+		return qm.slerpQuaternions( qa, qb, t );
+
+	}
+
+	static slerpFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) {
+
+		// fuzz-free, array-based Quaternion SLERP operation
+
+		let x0 = src0[ srcOffset0 + 0 ],
+			y0 = src0[ srcOffset0 + 1 ],
+			z0 = src0[ srcOffset0 + 2 ],
+			w0 = src0[ srcOffset0 + 3 ];
+
+		const x1 = src1[ srcOffset1 + 0 ],
+			y1 = src1[ srcOffset1 + 1 ],
+			z1 = src1[ srcOffset1 + 2 ],
+			w1 = src1[ srcOffset1 + 3 ];
+
+		if ( t === 0 ) {
+
+			dst[ dstOffset + 0 ] = x0;
+			dst[ dstOffset + 1 ] = y0;
+			dst[ dstOffset + 2 ] = z0;
+			dst[ dstOffset + 3 ] = w0;
+			return;
+
+		}
+
+		if ( t === 1 ) {
+
+			dst[ dstOffset + 0 ] = x1;
+			dst[ dstOffset + 1 ] = y1;
+			dst[ dstOffset + 2 ] = z1;
+			dst[ dstOffset + 3 ] = w1;
+			return;
+
+		}
+
+		if ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) {
+
+			let s = 1 - t;
+			const cos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1,
+				dir = ( cos >= 0 ? 1 : - 1 ),
+				sqrSin = 1 - cos * cos;
+
+			// Skip the Slerp for tiny steps to avoid numeric problems:
+			if ( sqrSin > Number.EPSILON ) {
+
+				const sin = Math.sqrt( sqrSin ),
+					len = Math.atan2( sin, cos * dir );
+
+				s = Math.sin( s * len ) / sin;
+				t = Math.sin( t * len ) / sin;
+
+			}
+
+			const tDir = t * dir;
+
+			x0 = x0 * s + x1 * tDir;
+			y0 = y0 * s + y1 * tDir;
+			z0 = z0 * s + z1 * tDir;
+			w0 = w0 * s + w1 * tDir;
+
+			// Normalize in case we just did a lerp:
+			if ( s === 1 - t ) {
+
+				const f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 );
+
+				x0 *= f;
+				y0 *= f;
+				z0 *= f;
+				w0 *= f;
+
+			}
+
+		}
+
+		dst[ dstOffset ] = x0;
+		dst[ dstOffset + 1 ] = y0;
+		dst[ dstOffset + 2 ] = z0;
+		dst[ dstOffset + 3 ] = w0;
+
+	}
+
+	static multiplyQuaternionsFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1 ) {
+
+		const x0 = src0[ srcOffset0 ];
+		const y0 = src0[ srcOffset0 + 1 ];
+		const z0 = src0[ srcOffset0 + 2 ];
+		const w0 = src0[ srcOffset0 + 3 ];
+
+		const x1 = src1[ srcOffset1 ];
+		const y1 = src1[ srcOffset1 + 1 ];
+		const z1 = src1[ srcOffset1 + 2 ];
+		const w1 = src1[ srcOffset1 + 3 ];
+
+		dst[ dstOffset ] = x0 * w1 + w0 * x1 + y0 * z1 - z0 * y1;
+		dst[ dstOffset + 1 ] = y0 * w1 + w0 * y1 + z0 * x1 - x0 * z1;
+		dst[ dstOffset + 2 ] = z0 * w1 + w0 * z1 + x0 * y1 - y0 * x1;
+		dst[ dstOffset + 3 ] = w0 * w1 - x0 * x1 - y0 * y1 - z0 * z1;
+
+		return dst;
+
+	}
+
+	get x() {
+
+		return this._x;
+
+	}
+
+	set x( value ) {
+
+		this._x = value;
+		this._onChangeCallback();
+
+	}
+
+	get y() {
+
+		return this._y;
+
+	}
+
+	set y( value ) {
+
+		this._y = value;
+		this._onChangeCallback();
+
+	}
+
+	get z() {
+
+		return this._z;
+
+	}
+
+	set z( value ) {
+
+		this._z = value;
+		this._onChangeCallback();
+
+	}
+
+	get w() {
+
+		return this._w;
+
+	}
+
+	set w( value ) {
+
+		this._w = value;
+		this._onChangeCallback();
+
+	}
+
+	set( x, y, z, w ) {
+
+		this._x = x;
+		this._y = y;
+		this._z = z;
+		this._w = w;
+
+		this._onChangeCallback();
+
+		return this;
+
+	}
+
+	clone() {
+
+		return new this.constructor( this._x, this._y, this._z, this._w );
+
+	}
+
+	copy( quaternion ) {
+
+		this._x = quaternion.x;
+		this._y = quaternion.y;
+		this._z = quaternion.z;
+		this._w = quaternion.w;
+
+		this._onChangeCallback();
+
+		return this;
+
+	}
+
+	setFromEuler( euler, update ) {
+
+		if ( ! ( euler && euler.isEuler ) ) {
+
+			throw new Error( 'THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.' );
+
+		}
+
+		const x = euler._x, y = euler._y, z = euler._z, order = euler._order;
+
+		// http://www.mathworks.com/matlabcentral/fileexchange/
+		// 	20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/
+		//	content/SpinCalc.m
+
+		const cos = Math.cos;
+		const sin = Math.sin;
+
+		const c1 = cos( x / 2 );
+		const c2 = cos( y / 2 );
+		const c3 = cos( z / 2 );
+
+		const s1 = sin( x / 2 );
+		const s2 = sin( y / 2 );
+		const s3 = sin( z / 2 );
+
+		switch ( order ) {
+
+			case 'XYZ':
+				this._x = s1 * c2 * c3 + c1 * s2 * s3;
+				this._y = c1 * s2 * c3 - s1 * c2 * s3;
+				this._z = c1 * c2 * s3 + s1 * s2 * c3;
+				this._w = c1 * c2 * c3 - s1 * s2 * s3;
+				break;
+
+			case 'YXZ':
+				this._x = s1 * c2 * c3 + c1 * s2 * s3;
+				this._y = c1 * s2 * c3 - s1 * c2 * s3;
+				this._z = c1 * c2 * s3 - s1 * s2 * c3;
+				this._w = c1 * c2 * c3 + s1 * s2 * s3;
+				break;
+
+			case 'ZXY':
+				this._x = s1 * c2 * c3 - c1 * s2 * s3;
+				this._y = c1 * s2 * c3 + s1 * c2 * s3;
+				this._z = c1 * c2 * s3 + s1 * s2 * c3;
+				this._w = c1 * c2 * c3 - s1 * s2 * s3;
+				break;
+
+			case 'ZYX':
+				this._x = s1 * c2 * c3 - c1 * s2 * s3;
+				this._y = c1 * s2 * c3 + s1 * c2 * s3;
+				this._z = c1 * c2 * s3 - s1 * s2 * c3;
+				this._w = c1 * c2 * c3 + s1 * s2 * s3;
+				break;
+
+			case 'YZX':
+				this._x = s1 * c2 * c3 + c1 * s2 * s3;
+				this._y = c1 * s2 * c3 + s1 * c2 * s3;
+				this._z = c1 * c2 * s3 - s1 * s2 * c3;
+				this._w = c1 * c2 * c3 - s1 * s2 * s3;
+				break;
+
+			case 'XZY':
+				this._x = s1 * c2 * c3 - c1 * s2 * s3;
+				this._y = c1 * s2 * c3 - s1 * c2 * s3;
+				this._z = c1 * c2 * s3 + s1 * s2 * c3;
+				this._w = c1 * c2 * c3 + s1 * s2 * s3;
+				break;
+
+			default:
+				console.warn( 'THREE.Quaternion: .setFromEuler() encountered an unknown order: ' + order );
+
+		}
+
+		if ( update !== false ) this._onChangeCallback();
+
+		return this;
+
+	}
+
+	setFromAxisAngle( axis, angle ) {
+
+		// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm
+
+		// assumes axis is normalized
+
+		const halfAngle = angle / 2, s = Math.sin( halfAngle );
+
+		this._x = axis.x * s;
+		this._y = axis.y * s;
+		this._z = axis.z * s;
+		this._w = Math.cos( halfAngle );
+
+		this._onChangeCallback();
+
+		return this;
+
+	}
+
+	setFromRotationMatrix( m ) {
+
+		// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm
+
+		// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)
+
+		const te = m.elements,
+
+			m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],
+			m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],
+			m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ],
+
+			trace = m11 + m22 + m33;
+
+		if ( trace > 0 ) {
+
+			const s = 0.5 / Math.sqrt( trace + 1.0 );
+
+			this._w = 0.25 / s;
+			this._x = ( m32 - m23 ) * s;
+			this._y = ( m13 - m31 ) * s;
+			this._z = ( m21 - m12 ) * s;
+
+		} else if ( m11 > m22 && m11 > m33 ) {
+
+			const s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );
+
+			this._w = ( m32 - m23 ) / s;
+			this._x = 0.25 * s;
+			this._y = ( m12 + m21 ) / s;
+			this._z = ( m13 + m31 ) / s;
+
+		} else if ( m22 > m33 ) {
+
+			const s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );
+
+			this._w = ( m13 - m31 ) / s;
+			this._x = ( m12 + m21 ) / s;
+			this._y = 0.25 * s;
+			this._z = ( m23 + m32 ) / s;
+
+		} else {
+
+			const s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );
+
+			this._w = ( m21 - m12 ) / s;
+			this._x = ( m13 + m31 ) / s;
+			this._y = ( m23 + m32 ) / s;
+			this._z = 0.25 * s;
+
+		}
+
+		this._onChangeCallback();
+
+		return this;
+
+	}
+
+	setFromUnitVectors( vFrom, vTo ) {
+
+		// assumes direction vectors vFrom and vTo are normalized
+
+		let r = vFrom.dot( vTo ) + 1;
+
+		if ( r < Number.EPSILON ) {
+
+			// vFrom and vTo point in opposite directions
+
+			r = 0;
+
+			if ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {
+
+				this._x = - vFrom.y;
+				this._y = vFrom.x;
+				this._z = 0;
+				this._w = r;
+
+			} else {
+
+				this._x = 0;
+				this._y = - vFrom.z;
+				this._z = vFrom.y;
+				this._w = r;
+
+			}
+
+		} else {
+
+			// crossVectors( vFrom, vTo ); // inlined to avoid cyclic dependency on Vector3
+
+			this._x = vFrom.y * vTo.z - vFrom.z * vTo.y;
+			this._y = vFrom.z * vTo.x - vFrom.x * vTo.z;
+			this._z = vFrom.x * vTo.y - vFrom.y * vTo.x;
+			this._w = r;
+
+		}
+
+		return this.normalize();
+
+	}
+
+	angleTo( q ) {
+
+		return 2 * Math.acos( Math.abs( clamp( this.dot( q ), - 1, 1 ) ) );
+
+	}
+
+	rotateTowards( q, step ) {
+
+		const angle = this.angleTo( q );
+
+		if ( angle === 0 ) return this;
+
+		const t = Math.min( 1, step / angle );
+
+		this.slerp( q, t );
+
+		return this;
+
+	}
+
+	identity() {
+
+		return this.set( 0, 0, 0, 1 );
+
+	}
+
+	invert() {
+
+		// quaternion is assumed to have unit length
+
+		return this.conjugate();
+
+	}
+
+	conjugate() {
+
+		this._x *= - 1;
+		this._y *= - 1;
+		this._z *= - 1;
+
+		this._onChangeCallback();
+
+		return this;
+
+	}
+
+	dot( v ) {
+
+		return this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;
+
+	}
+
+	lengthSq() {
+
+		return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;
+
+	}
+
+	length() {
+
+		return Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w );
+
+	}
+
+	normalize() {
+
+		let l = this.length();
+
+		if ( l === 0 ) {
+
+			this._x = 0;
+			this._y = 0;
+			this._z = 0;
+			this._w = 1;
+
+		} else {
+
+			l = 1 / l;
+
+			this._x = this._x * l;
+			this._y = this._y * l;
+			this._z = this._z * l;
+			this._w = this._w * l;
+
+		}
+
+		this._onChangeCallback();
+
+		return this;
+
+	}
+
+	multiply( q, p ) {
+
+		if ( p !== undefined ) {
+
+			console.warn( 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' );
+			return this.multiplyQuaternions( q, p );
+
+		}
+
+		return this.multiplyQuaternions( this, q );
+
+	}
+
+	premultiply( q ) {
+
+		return this.multiplyQuaternions( q, this );
+
+	}
+
+	multiplyQuaternions( a, b ) {
+
+		// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm
+
+		const qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;
+		const qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;
+
+		this._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;
+		this._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;
+		this._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;
+		this._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;
+
+		this._onChangeCallback();
+
+		return this;
+
+	}
+
+	slerp( qb, t ) {
+
+		if ( t === 0 ) return this;
+		if ( t === 1 ) return this.copy( qb );
+
+		const x = this._x, y = this._y, z = this._z, w = this._w;
+
+		// http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/
+
+		let cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z;
+
+		if ( cosHalfTheta < 0 ) {
+
+			this._w = - qb._w;
+			this._x = - qb._x;
+			this._y = - qb._y;
+			this._z = - qb._z;
+
+			cosHalfTheta = - cosHalfTheta;
+
+		} else {
+
+			this.copy( qb );
+
+		}
+
+		if ( cosHalfTheta >= 1.0 ) {
+
+			this._w = w;
+			this._x = x;
+			this._y = y;
+			this._z = z;
+
+			return this;
+
+		}
+
+		const sqrSinHalfTheta = 1.0 - cosHalfTheta * cosHalfTheta;
+
+		if ( sqrSinHalfTheta <= Number.EPSILON ) {
+
+			const s = 1 - t;
+			this._w = s * w + t * this._w;
+			this._x = s * x + t * this._x;
+			this._y = s * y + t * this._y;
+			this._z = s * z + t * this._z;
+
+			this.normalize();
+			this._onChangeCallback();
+
+			return this;
+
+		}
+
+		const sinHalfTheta = Math.sqrt( sqrSinHalfTheta );
+		const halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta );
+		const ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,
+			ratioB = Math.sin( t * halfTheta ) / sinHalfTheta;
+
+		this._w = ( w * ratioA + this._w * ratioB );
+		this._x = ( x * ratioA + this._x * ratioB );
+		this._y = ( y * ratioA + this._y * ratioB );
+		this._z = ( z * ratioA + this._z * ratioB );
+
+		this._onChangeCallback();
+
+		return this;
+
+	}
+
+	slerpQuaternions( qa, qb, t ) {
+
+		return this.copy( qa ).slerp( qb, t );
+
+	}
+
+	random() {
+
+		// Derived from http://planning.cs.uiuc.edu/node198.html
+		// Note, this source uses w, x, y, z ordering,
+		// so we swap the order below.
+
+		const u1 = Math.random();
+		const sqrt1u1 = Math.sqrt( 1 - u1 );
+		const sqrtu1 = Math.sqrt( u1 );
+
+		const u2 = 2 * Math.PI * Math.random();
+
+		const u3 = 2 * Math.PI * Math.random();
+
+		return this.set(
+			sqrt1u1 * Math.cos( u2 ),
+			sqrtu1 * Math.sin( u3 ),
+			sqrtu1 * Math.cos( u3 ),
+			sqrt1u1 * Math.sin( u2 ),
+		);
+
+	}
+
+	equals( quaternion ) {
+
+		return ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w );
+
+	}
+
+	fromArray( array, offset = 0 ) {
+
+		this._x = array[ offset ];
+		this._y = array[ offset + 1 ];
+		this._z = array[ offset + 2 ];
+		this._w = array[ offset + 3 ];
+
+		this._onChangeCallback();
+
+		return this;
+
+	}
+
+	toArray( array = [], offset = 0 ) {
+
+		array[ offset ] = this._x;
+		array[ offset + 1 ] = this._y;
+		array[ offset + 2 ] = this._z;
+		array[ offset + 3 ] = this._w;
+
+		return array;
+
+	}
+
+	fromBufferAttribute( attribute, index ) {
+
+		this._x = attribute.getX( index );
+		this._y = attribute.getY( index );
+		this._z = attribute.getZ( index );
+		this._w = attribute.getW( index );
+
+		return this;
+
+	}
+
+	_onChange( callback ) {
+
+		this._onChangeCallback = callback;
+
+		return this;
+
+	}
+
+	_onChangeCallback() {}
+
+}
+
+Quaternion.prototype.isQuaternion = true;
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/math/Vector3.js
+
+
+
+class Vector3 {
+
+	constructor( x = 0, y = 0, z = 0 ) {
+
+		this.x = x;
+		this.y = y;
+		this.z = z;
+
+	}
+
+	set( x, y, z ) {
+
+		if ( z === undefined ) z = this.z; // sprite.scale.set(x,y)
+
+		this.x = x;
+		this.y = y;
+		this.z = z;
+
+		return this;
+
+	}
+
+	setScalar( scalar ) {
+
+		this.x = scalar;
+		this.y = scalar;
+		this.z = scalar;
+
+		return this;
+
+	}
+
+	setX( x ) {
+
+		this.x = x;
+
+		return this;
+
+	}
+
+	setY( y ) {
+
+		this.y = y;
+
+		return this;
+
+	}
+
+	setZ( z ) {
+
+		this.z = z;
+
+		return this;
+
+	}
+
+	setComponent( index, value ) {
+
+		switch ( index ) {
+
+			case 0: this.x = value; break;
+			case 1: this.y = value; break;
+			case 2: this.z = value; break;
+			default: throw new Error( 'index is out of range: ' + index );
+
+		}
+
+		return this;
+
+	}
+
+	getComponent( index ) {
+
+		switch ( index ) {
+
+			case 0: return this.x;
+			case 1: return this.y;
+			case 2: return this.z;
+			default: throw new Error( 'index is out of range: ' + index );
+
+		}
+
+	}
+
+	clone() {
+
+		return new this.constructor( this.x, this.y, this.z );
+
+	}
+
+	copy( v ) {
+
+		this.x = v.x;
+		this.y = v.y;
+		this.z = v.z;
+
+		return this;
+
+	}
+
+	add( v, w ) {
+
+		if ( w !== undefined ) {
+
+			console.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );
+			return this.addVectors( v, w );
+
+		}
+
+		this.x += v.x;
+		this.y += v.y;
+		this.z += v.z;
+
+		return this;
+
+	}
+
+	addScalar( s ) {
+
+		this.x += s;
+		this.y += s;
+		this.z += s;
+
+		return this;
+
+	}
+
+	addVectors( a, b ) {
+
+		this.x = a.x + b.x;
+		this.y = a.y + b.y;
+		this.z = a.z + b.z;
+
+		return this;
+
+	}
+
+	addScaledVector( v, s ) {
+
+		this.x += v.x * s;
+		this.y += v.y * s;
+		this.z += v.z * s;
+
+		return this;
+
+	}
+
+	sub( v, w ) {
+
+		if ( w !== undefined ) {
+
+			console.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );
+			return this.subVectors( v, w );
+
+		}
+
+		this.x -= v.x;
+		this.y -= v.y;
+		this.z -= v.z;
+
+		return this;
+
+	}
+
+	subScalar( s ) {
+
+		this.x -= s;
+		this.y -= s;
+		this.z -= s;
+
+		return this;
+
+	}
+
+	subVectors( a, b ) {
+
+		this.x = a.x - b.x;
+		this.y = a.y - b.y;
+		this.z = a.z - b.z;
+
+		return this;
+
+	}
+
+	multiply( v, w ) {
+
+		if ( w !== undefined ) {
+
+			console.warn( 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' );
+			return this.multiplyVectors( v, w );
+
+		}
+
+		this.x *= v.x;
+		this.y *= v.y;
+		this.z *= v.z;
+
+		return this;
+
+	}
+
+	multiplyScalar( scalar ) {
+
+		this.x *= scalar;
+		this.y *= scalar;
+		this.z *= scalar;
+
+		return this;
+
+	}
+
+	multiplyVectors( a, b ) {
+
+		this.x = a.x * b.x;
+		this.y = a.y * b.y;
+		this.z = a.z * b.z;
+
+		return this;
+
+	}
+
+	applyEuler( euler ) {
+
+		if ( ! ( euler && euler.isEuler ) ) {
+
+			console.error( 'THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.' );
+
+		}
+
+		return this.applyQuaternion( _quaternion.setFromEuler( euler ) );
+
+	}
+
+	applyAxisAngle( axis, angle ) {
+
+		return this.applyQuaternion( _quaternion.setFromAxisAngle( axis, angle ) );
+
+	}
+
+	applyMatrix3( m ) {
+
+		const x = this.x, y = this.y, z = this.z;
+		const e = m.elements;
+
+		this.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z;
+		this.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z;
+		this.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z;
+
+		return this;
+
+	}
+
+	applyNormalMatrix( m ) {
+
+		return this.applyMatrix3( m ).normalize();
+
+	}
+
+	applyMatrix4( m ) {
+
+		const x = this.x, y = this.y, z = this.z;
+		const e = m.elements;
+
+		const w = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] );
+
+		this.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * w;
+		this.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * w;
+		this.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * w;
+
+		return this;
+
+	}
+
+	applyQuaternion( q ) {
+
+		const x = this.x, y = this.y, z = this.z;
+		const qx = q.x, qy = q.y, qz = q.z, qw = q.w;
+
+		// calculate quat * vector
+
+		const ix = qw * x + qy * z - qz * y;
+		const iy = qw * y + qz * x - qx * z;
+		const iz = qw * z + qx * y - qy * x;
+		const iw = - qx * x - qy * y - qz * z;
+
+		// calculate result * inverse quat
+
+		this.x = ix * qw + iw * - qx + iy * - qz - iz * - qy;
+		this.y = iy * qw + iw * - qy + iz * - qx - ix * - qz;
+		this.z = iz * qw + iw * - qz + ix * - qy - iy * - qx;
+
+		return this;
+
+	}
+
+	project( camera ) {
+
+		return this.applyMatrix4( camera.matrixWorldInverse ).applyMatrix4( camera.projectionMatrix );
+
+	}
+
+	unproject( camera ) {
+
+		return this.applyMatrix4( camera.projectionMatrixInverse ).applyMatrix4( camera.matrixWorld );
+
+	}
+
+	transformDirection( m ) {
+
+		// input: THREE.Matrix4 affine matrix
+		// vector interpreted as a direction
+
+		const x = this.x, y = this.y, z = this.z;
+		const e = m.elements;
+
+		this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z;
+		this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z;
+		this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z;
+
+		return this.normalize();
+
+	}
+
+	divide( v ) {
+
+		this.x /= v.x;
+		this.y /= v.y;
+		this.z /= v.z;
+
+		return this;
+
+	}
+
+	divideScalar( scalar ) {
+
+		return this.multiplyScalar( 1 / scalar );
+
+	}
+
+	min( v ) {
+
+		this.x = Math.min( this.x, v.x );
+		this.y = Math.min( this.y, v.y );
+		this.z = Math.min( this.z, v.z );
+
+		return this;
+
+	}
+
+	max( v ) {
+
+		this.x = Math.max( this.x, v.x );
+		this.y = Math.max( this.y, v.y );
+		this.z = Math.max( this.z, v.z );
+
+		return this;
+
+	}
+
+	clamp( min, max ) {
+
+		// assumes min < max, componentwise
+
+		this.x = Math.max( min.x, Math.min( max.x, this.x ) );
+		this.y = Math.max( min.y, Math.min( max.y, this.y ) );
+		this.z = Math.max( min.z, Math.min( max.z, this.z ) );
+
+		return this;
+
+	}
+
+	clampScalar( minVal, maxVal ) {
+
+		this.x = Math.max( minVal, Math.min( maxVal, this.x ) );
+		this.y = Math.max( minVal, Math.min( maxVal, this.y ) );
+		this.z = Math.max( minVal, Math.min( maxVal, this.z ) );
+
+		return this;
+
+	}
+
+	clampLength( min, max ) {
+
+		const length = this.length();
+
+		return this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );
+
+	}
+
+	floor() {
+
+		this.x = Math.floor( this.x );
+		this.y = Math.floor( this.y );
+		this.z = Math.floor( this.z );
+
+		return this;
+
+	}
+
+	ceil() {
+
+		this.x = Math.ceil( this.x );
+		this.y = Math.ceil( this.y );
+		this.z = Math.ceil( this.z );
+
+		return this;
+
+	}
+
+	round() {
+
+		this.x = Math.round( this.x );
+		this.y = Math.round( this.y );
+		this.z = Math.round( this.z );
+
+		return this;
+
+	}
+
+	roundToZero() {
+
+		this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );
+		this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );
+		this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );
+
+		return this;
+
+	}
+
+	negate() {
+
+		this.x = - this.x;
+		this.y = - this.y;
+		this.z = - this.z;
+
+		return this;
+
+	}
+
+	dot( v ) {
+
+		return this.x * v.x + this.y * v.y + this.z * v.z;
+
+	}
+
+	// TODO lengthSquared?
+
+	lengthSq() {
+
+		return this.x * this.x + this.y * this.y + this.z * this.z;
+
+	}
+
+	length() {
+
+		return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );
+
+	}
+
+	manhattanLength() {
+
+		return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z );
+
+	}
+
+	normalize() {
+
+		return this.divideScalar( this.length() || 1 );
+
+	}
+
+	setLength( length ) {
+
+		return this.normalize().multiplyScalar( length );
+
+	}
+
+	lerp( v, alpha ) {
+
+		this.x += ( v.x - this.x ) * alpha;
+		this.y += ( v.y - this.y ) * alpha;
+		this.z += ( v.z - this.z ) * alpha;
+
+		return this;
+
+	}
+
+	lerpVectors( v1, v2, alpha ) {
+
+		this.x = v1.x + ( v2.x - v1.x ) * alpha;
+		this.y = v1.y + ( v2.y - v1.y ) * alpha;
+		this.z = v1.z + ( v2.z - v1.z ) * alpha;
+
+		return this;
+
+	}
+
+	cross( v, w ) {
+
+		if ( w !== undefined ) {
+
+			console.warn( 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' );
+			return this.crossVectors( v, w );
+
+		}
+
+		return this.crossVectors( this, v );
+
+	}
+
+	crossVectors( a, b ) {
+
+		const ax = a.x, ay = a.y, az = a.z;
+		const bx = b.x, by = b.y, bz = b.z;
+
+		this.x = ay * bz - az * by;
+		this.y = az * bx - ax * bz;
+		this.z = ax * by - ay * bx;
+
+		return this;
+
+	}
+
+	projectOnVector( v ) {
+
+		const denominator = v.lengthSq();
+
+		if ( denominator === 0 ) return this.set( 0, 0, 0 );
+
+		const scalar = v.dot( this ) / denominator;
+
+		return this.copy( v ).multiplyScalar( scalar );
+
+	}
+
+	projectOnPlane( planeNormal ) {
+
+		_vector.copy( this ).projectOnVector( planeNormal );
+
+		return this.sub( _vector );
+
+	}
+
+	reflect( normal ) {
+
+		// reflect incident vector off plane orthogonal to normal
+		// normal is assumed to have unit length
+
+		return this.sub( _vector.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) );
+
+	}
+
+	angleTo( v ) {
+
+		const denominator = Math.sqrt( this.lengthSq() * v.lengthSq() );
+
+		if ( denominator === 0 ) return Math.PI / 2;
+
+		const theta = this.dot( v ) / denominator;
+
+		// clamp, to handle numerical problems
+
+		return Math.acos( clamp( theta, - 1, 1 ) );
+
+	}
+
+	distanceTo( v ) {
+
+		return Math.sqrt( this.distanceToSquared( v ) );
+
+	}
+
+	distanceToSquared( v ) {
+
+		const dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z;
+
+		return dx * dx + dy * dy + dz * dz;
+
+	}
+
+	manhattanDistanceTo( v ) {
+
+		return Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z );
+
+	}
+
+	setFromSpherical( s ) {
+
+		return this.setFromSphericalCoords( s.radius, s.phi, s.theta );
+
+	}
+
+	setFromSphericalCoords( radius, phi, theta ) {
+
+		const sinPhiRadius = Math.sin( phi ) * radius;
+
+		this.x = sinPhiRadius * Math.sin( theta );
+		this.y = Math.cos( phi ) * radius;
+		this.z = sinPhiRadius * Math.cos( theta );
+
+		return this;
+
+	}
+
+	setFromCylindrical( c ) {
+
+		return this.setFromCylindricalCoords( c.radius, c.theta, c.y );
+
+	}
+
+	setFromCylindricalCoords( radius, theta, y ) {
+
+		this.x = radius * Math.sin( theta );
+		this.y = y;
+		this.z = radius * Math.cos( theta );
+
+		return this;
+
+	}
+
+	setFromMatrixPosition( m ) {
+
+		const e = m.elements;
+
+		this.x = e[ 12 ];
+		this.y = e[ 13 ];
+		this.z = e[ 14 ];
+
+		return this;
+
+	}
+
+	setFromMatrixScale( m ) {
+
+		const sx = this.setFromMatrixColumn( m, 0 ).length();
+		const sy = this.setFromMatrixColumn( m, 1 ).length();
+		const sz = this.setFromMatrixColumn( m, 2 ).length();
+
+		this.x = sx;
+		this.y = sy;
+		this.z = sz;
+
+		return this;
+
+	}
+
+	setFromMatrixColumn( m, index ) {
+
+		return this.fromArray( m.elements, index * 4 );
+
+	}
+
+	setFromMatrix3Column( m, index ) {
+
+		return this.fromArray( m.elements, index * 3 );
+
+	}
+
+	equals( v ) {
+
+		return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) );
+
+	}
+
+	fromArray( array, offset = 0 ) {
+
+		this.x = array[ offset ];
+		this.y = array[ offset + 1 ];
+		this.z = array[ offset + 2 ];
+
+		return this;
+
+	}
+
+	toArray( array = [], offset = 0 ) {
+
+		array[ offset ] = this.x;
+		array[ offset + 1 ] = this.y;
+		array[ offset + 2 ] = this.z;
+
+		return array;
+
+	}
+
+	fromBufferAttribute( attribute, index, offset ) {
+
+		if ( offset !== undefined ) {
+
+			console.warn( 'THREE.Vector3: offset has been removed from .fromBufferAttribute().' );
+
+		}
+
+		this.x = attribute.getX( index );
+		this.y = attribute.getY( index );
+		this.z = attribute.getZ( index );
+
+		return this;
+
+	}
+
+	random() {
+
+		this.x = Math.random();
+		this.y = Math.random();
+		this.z = Math.random();
+
+		return this;
+
+	}
+
+	randomDirection() {
+
+		// Derived from https://mathworld.wolfram.com/SpherePointPicking.html
+
+		const u = ( Math.random() - 0.5 ) * 2;
+		const t = Math.random() * Math.PI * 2;
+		const f = Math.sqrt( 1 - u ** 2 );
+
+		this.x = f * Math.cos( t );
+		this.y = f * Math.sin( t );
+		this.z = u;
+
+		return this;
+
+	}
+
+	*[ Symbol.iterator ]() {
+
+		yield this.x;
+		yield this.y;
+		yield this.z;
+
+	}
+
+}
+
+Vector3.prototype.isVector3 = true;
+
+const _vector = /*@__PURE__*/ new Vector3();
+const _quaternion = /*@__PURE__*/ new Quaternion();
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/math/Matrix4.js
+
+
+class Matrix4_Matrix4 {
+
+	constructor() {
+
+		this.elements = [
+
+			1, 0, 0, 0,
+			0, 1, 0, 0,
+			0, 0, 1, 0,
+			0, 0, 0, 1
+
+		];
+
+		if ( arguments.length > 0 ) {
+
+			console.error( 'THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.' );
+
+		}
+
+	}
+
+	set( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {
+
+		const te = this.elements;
+
+		te[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14;
+		te[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24;
+		te[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34;
+		te[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44;
+
+		return this;
+
+	}
+
+	identity() {
+
+		this.set(
+
+			1, 0, 0, 0,
+			0, 1, 0, 0,
+			0, 0, 1, 0,
+			0, 0, 0, 1
+
+		);
+
+		return this;
+
+	}
+
+	clone() {
+
+		return new Matrix4_Matrix4().fromArray( this.elements );
+
+	}
+
+	copy( m ) {
+
+		const te = this.elements;
+		const me = m.elements;
+
+		te[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; te[ 3 ] = me[ 3 ];
+		te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ];
+		te[ 8 ] = me[ 8 ]; te[ 9 ] = me[ 9 ]; te[ 10 ] = me[ 10 ]; te[ 11 ] = me[ 11 ];
+		te[ 12 ] = me[ 12 ]; te[ 13 ] = me[ 13 ]; te[ 14 ] = me[ 14 ]; te[ 15 ] = me[ 15 ];
+
+		return this;
+
+	}
+
+	copyPosition( m ) {
+
+		const te = this.elements, me = m.elements;
+
+		te[ 12 ] = me[ 12 ];
+		te[ 13 ] = me[ 13 ];
+		te[ 14 ] = me[ 14 ];
+
+		return this;
+
+	}
+
+	setFromMatrix3( m ) {
+
+		const me = m.elements;
+
+		this.set(
+
+			me[ 0 ], me[ 3 ], me[ 6 ], 0,
+			me[ 1 ], me[ 4 ], me[ 7 ], 0,
+			me[ 2 ], me[ 5 ], me[ 8 ], 0,
+			0, 0, 0, 1
+
+		);
+
+		return this;
+
+	}
+
+	extractBasis( xAxis, yAxis, zAxis ) {
+
+		xAxis.setFromMatrixColumn( this, 0 );
+		yAxis.setFromMatrixColumn( this, 1 );
+		zAxis.setFromMatrixColumn( this, 2 );
+
+		return this;
+
+	}
+
+	makeBasis( xAxis, yAxis, zAxis ) {
+
+		this.set(
+			xAxis.x, yAxis.x, zAxis.x, 0,
+			xAxis.y, yAxis.y, zAxis.y, 0,
+			xAxis.z, yAxis.z, zAxis.z, 0,
+			0, 0, 0, 1
+		);
+
+		return this;
+
+	}
+
+	extractRotation( m ) {
+
+		// this method does not support reflection matrices
+
+		const te = this.elements;
+		const me = m.elements;
+
+		const scaleX = 1 / _v1.setFromMatrixColumn( m, 0 ).length();
+		const scaleY = 1 / _v1.setFromMatrixColumn( m, 1 ).length();
+		const scaleZ = 1 / _v1.setFromMatrixColumn( m, 2 ).length();
+
+		te[ 0 ] = me[ 0 ] * scaleX;
+		te[ 1 ] = me[ 1 ] * scaleX;
+		te[ 2 ] = me[ 2 ] * scaleX;
+		te[ 3 ] = 0;
+
+		te[ 4 ] = me[ 4 ] * scaleY;
+		te[ 5 ] = me[ 5 ] * scaleY;
+		te[ 6 ] = me[ 6 ] * scaleY;
+		te[ 7 ] = 0;
+
+		te[ 8 ] = me[ 8 ] * scaleZ;
+		te[ 9 ] = me[ 9 ] * scaleZ;
+		te[ 10 ] = me[ 10 ] * scaleZ;
+		te[ 11 ] = 0;
+
+		te[ 12 ] = 0;
+		te[ 13 ] = 0;
+		te[ 14 ] = 0;
+		te[ 15 ] = 1;
+
+		return this;
+
+	}
+
+	makeRotationFromEuler( euler ) {
+
+		if ( ! ( euler && euler.isEuler ) ) {
+
+			console.error( 'THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.' );
+
+		}
+
+		const te = this.elements;
+
+		const x = euler.x, y = euler.y, z = euler.z;
+		const a = Math.cos( x ), b = Math.sin( x );
+		const c = Math.cos( y ), d = Math.sin( y );
+		const e = Math.cos( z ), f = Math.sin( z );
+
+		if ( euler.order === 'XYZ' ) {
+
+			const ae = a * e, af = a * f, be = b * e, bf = b * f;
+
+			te[ 0 ] = c * e;
+			te[ 4 ] = - c * f;
+			te[ 8 ] = d;
+
+			te[ 1 ] = af + be * d;
+			te[ 5 ] = ae - bf * d;
+			te[ 9 ] = - b * c;
+
+			te[ 2 ] = bf - ae * d;
+			te[ 6 ] = be + af * d;
+			te[ 10 ] = a * c;
+
+		} else if ( euler.order === 'YXZ' ) {
+
+			const ce = c * e, cf = c * f, de = d * e, df = d * f;
+
+			te[ 0 ] = ce + df * b;
+			te[ 4 ] = de * b - cf;
+			te[ 8 ] = a * d;
+
+			te[ 1 ] = a * f;
+			te[ 5 ] = a * e;
+			te[ 9 ] = - b;
+
+			te[ 2 ] = cf * b - de;
+			te[ 6 ] = df + ce * b;
+			te[ 10 ] = a * c;
+
+		} else if ( euler.order === 'ZXY' ) {
+
+			const ce = c * e, cf = c * f, de = d * e, df = d * f;
+
+			te[ 0 ] = ce - df * b;
+			te[ 4 ] = - a * f;
+			te[ 8 ] = de + cf * b;
+
+			te[ 1 ] = cf + de * b;
+			te[ 5 ] = a * e;
+			te[ 9 ] = df - ce * b;
+
+			te[ 2 ] = - a * d;
+			te[ 6 ] = b;
+			te[ 10 ] = a * c;
+
+		} else if ( euler.order === 'ZYX' ) {
+
+			const ae = a * e, af = a * f, be = b * e, bf = b * f;
+
+			te[ 0 ] = c * e;
+			te[ 4 ] = be * d - af;
+			te[ 8 ] = ae * d + bf;
+
+			te[ 1 ] = c * f;
+			te[ 5 ] = bf * d + ae;
+			te[ 9 ] = af * d - be;
+
+			te[ 2 ] = - d;
+			te[ 6 ] = b * c;
+			te[ 10 ] = a * c;
+
+		} else if ( euler.order === 'YZX' ) {
+
+			const ac = a * c, ad = a * d, bc = b * c, bd = b * d;
+
+			te[ 0 ] = c * e;
+			te[ 4 ] = bd - ac * f;
+			te[ 8 ] = bc * f + ad;
+
+			te[ 1 ] = f;
+			te[ 5 ] = a * e;
+			te[ 9 ] = - b * e;
+
+			te[ 2 ] = - d * e;
+			te[ 6 ] = ad * f + bc;
+			te[ 10 ] = ac - bd * f;
+
+		} else if ( euler.order === 'XZY' ) {
+
+			const ac = a * c, ad = a * d, bc = b * c, bd = b * d;
+
+			te[ 0 ] = c * e;
+			te[ 4 ] = - f;
+			te[ 8 ] = d * e;
+
+			te[ 1 ] = ac * f + bd;
+			te[ 5 ] = a * e;
+			te[ 9 ] = ad * f - bc;
+
+			te[ 2 ] = bc * f - ad;
+			te[ 6 ] = b * e;
+			te[ 10 ] = bd * f + ac;
+
+		}
+
+		// bottom row
+		te[ 3 ] = 0;
+		te[ 7 ] = 0;
+		te[ 11 ] = 0;
+
+		// last column
+		te[ 12 ] = 0;
+		te[ 13 ] = 0;
+		te[ 14 ] = 0;
+		te[ 15 ] = 1;
+
+		return this;
+
+	}
+
+	makeRotationFromQuaternion( q ) {
+
+		return this.compose( _zero, q, _one );
+
+	}
+
+	lookAt( eye, target, up ) {
+
+		const te = this.elements;
+
+		_z.subVectors( eye, target );
+
+		if ( _z.lengthSq() === 0 ) {
+
+			// eye and target are in the same position
+
+			_z.z = 1;
+
+		}
+
+		_z.normalize();
+		_x.crossVectors( up, _z );
+
+		if ( _x.lengthSq() === 0 ) {
+
+			// up and z are parallel
+
+			if ( Math.abs( up.z ) === 1 ) {
+
+				_z.x += 0.0001;
+
+			} else {
+
+				_z.z += 0.0001;
+
+			}
+
+			_z.normalize();
+			_x.crossVectors( up, _z );
+
+		}
+
+		_x.normalize();
+		_y.crossVectors( _z, _x );
+
+		te[ 0 ] = _x.x; te[ 4 ] = _y.x; te[ 8 ] = _z.x;
+		te[ 1 ] = _x.y; te[ 5 ] = _y.y; te[ 9 ] = _z.y;
+		te[ 2 ] = _x.z; te[ 6 ] = _y.z; te[ 10 ] = _z.z;
+
+		return this;
+
+	}
+
+	multiply( m, n ) {
+
+		if ( n !== undefined ) {
+
+			console.warn( 'THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.' );
+			return this.multiplyMatrices( m, n );
+
+		}
+
+		return this.multiplyMatrices( this, m );
+
+	}
+
+	premultiply( m ) {
+
+		return this.multiplyMatrices( m, this );
+
+	}
+
+	multiplyMatrices( a, b ) {
+
+		const ae = a.elements;
+		const be = b.elements;
+		const te = this.elements;
+
+		const a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ];
+		const a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ];
+		const a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ];
+		const a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ];
+
+		const b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ];
+		const b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ];
+		const b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ];
+		const b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ];
+
+		te[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;
+		te[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;
+		te[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;
+		te[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;
+
+		te[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;
+		te[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;
+		te[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;
+		te[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;
+
+		te[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;
+		te[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;
+		te[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;
+		te[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;
+
+		te[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;
+		te[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;
+		te[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;
+		te[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;
+
+		return this;
+
+	}
+
+	multiplyScalar( s ) {
+
+		const te = this.elements;
+
+		te[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s;
+		te[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s;
+		te[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s;
+		te[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s;
+
+		return this;
+
+	}
+
+	determinant() {
+
+		const te = this.elements;
+
+		const n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ];
+		const n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ];
+		const n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ];
+		const n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ];
+
+		//TODO: make this more efficient
+		//( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )
+
+		return (
+			n41 * (
+				+ n14 * n23 * n32
+				 - n13 * n24 * n32
+				 - n14 * n22 * n33
+				 + n12 * n24 * n33
+				 + n13 * n22 * n34
+				 - n12 * n23 * n34
+			) +
+			n42 * (
+				+ n11 * n23 * n34
+				 - n11 * n24 * n33
+				 + n14 * n21 * n33
+				 - n13 * n21 * n34
+				 + n13 * n24 * n31
+				 - n14 * n23 * n31
+			) +
+			n43 * (
+				+ n11 * n24 * n32
+				 - n11 * n22 * n34
+				 - n14 * n21 * n32
+				 + n12 * n21 * n34
+				 + n14 * n22 * n31
+				 - n12 * n24 * n31
+			) +
+			n44 * (
+				- n13 * n22 * n31
+				 - n11 * n23 * n32
+				 + n11 * n22 * n33
+				 + n13 * n21 * n32
+				 - n12 * n21 * n33
+				 + n12 * n23 * n31
+			)
+
+		);
+
+	}
+
+	transpose() {
+
+		const te = this.elements;
+		let tmp;
+
+		tmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp;
+		tmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp;
+		tmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp;
+
+		tmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp;
+		tmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp;
+		tmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp;
+
+		return this;
+
+	}
+
+	setPosition( x, y, z ) {
+
+		const te = this.elements;
+
+		if ( x.isVector3 ) {
+
+			te[ 12 ] = x.x;
+			te[ 13 ] = x.y;
+			te[ 14 ] = x.z;
+
+		} else {
+
+			te[ 12 ] = x;
+			te[ 13 ] = y;
+			te[ 14 ] = z;
+
+		}
+
+		return this;
+
+	}
+
+	invert() {
+
+		// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm
+		const te = this.elements,
+
+			n11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ], n41 = te[ 3 ],
+			n12 = te[ 4 ], n22 = te[ 5 ], n32 = te[ 6 ], n42 = te[ 7 ],
+			n13 = te[ 8 ], n23 = te[ 9 ], n33 = te[ 10 ], n43 = te[ 11 ],
+			n14 = te[ 12 ], n24 = te[ 13 ], n34 = te[ 14 ], n44 = te[ 15 ],
+
+			t11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,
+			t12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,
+			t13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,
+			t14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;
+
+		const det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;
+
+		if ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );
+
+		const detInv = 1 / det;
+
+		te[ 0 ] = t11 * detInv;
+		te[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv;
+		te[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv;
+		te[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv;
+
+		te[ 4 ] = t12 * detInv;
+		te[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv;
+		te[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv;
+		te[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv;
+
+		te[ 8 ] = t13 * detInv;
+		te[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv;
+		te[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv;
+		te[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv;
+
+		te[ 12 ] = t14 * detInv;
+		te[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv;
+		te[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv;
+		te[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv;
+
+		return this;
+
+	}
+
+	scale( v ) {
+
+		const te = this.elements;
+		const x = v.x, y = v.y, z = v.z;
+
+		te[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z;
+		te[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z;
+		te[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z;
+		te[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z;
+
+		return this;
+
+	}
+
+	getMaxScaleOnAxis() {
+
+		const te = this.elements;
+
+		const scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ];
+		const scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ];
+		const scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ];
+
+		return Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) );
+
+	}
+
+	makeTranslation( x, y, z ) {
+
+		this.set(
+
+			1, 0, 0, x,
+			0, 1, 0, y,
+			0, 0, 1, z,
+			0, 0, 0, 1
+
+		);
+
+		return this;
+
+	}
+
+	makeRotationX( theta ) {
+
+		const c = Math.cos( theta ), s = Math.sin( theta );
+
+		this.set(
+
+			1, 0, 0, 0,
+			0, c, - s, 0,
+			0, s, c, 0,
+			0, 0, 0, 1
+
+		);
+
+		return this;
+
+	}
+
+	makeRotationY( theta ) {
+
+		const c = Math.cos( theta ), s = Math.sin( theta );
+
+		this.set(
+
+			 c, 0, s, 0,
+			 0, 1, 0, 0,
+			- s, 0, c, 0,
+			 0, 0, 0, 1
+
+		);
+
+		return this;
+
+	}
+
+	makeRotationZ( theta ) {
+
+		const c = Math.cos( theta ), s = Math.sin( theta );
+
+		this.set(
+
+			c, - s, 0, 0,
+			s, c, 0, 0,
+			0, 0, 1, 0,
+			0, 0, 0, 1
+
+		);
+
+		return this;
+
+	}
+
+	makeRotationAxis( axis, angle ) {
+
+		// Based on http://www.gamedev.net/reference/articles/article1199.asp
+
+		const c = Math.cos( angle );
+		const s = Math.sin( angle );
+		const t = 1 - c;
+		const x = axis.x, y = axis.y, z = axis.z;
+		const tx = t * x, ty = t * y;
+
+		this.set(
+
+			tx * x + c, tx * y - s * z, tx * z + s * y, 0,
+			tx * y + s * z, ty * y + c, ty * z - s * x, 0,
+			tx * z - s * y, ty * z + s * x, t * z * z + c, 0,
+			0, 0, 0, 1
+
+		);
+
+		return this;
+
+	}
+
+	makeScale( x, y, z ) {
+
+		this.set(
+
+			x, 0, 0, 0,
+			0, y, 0, 0,
+			0, 0, z, 0,
+			0, 0, 0, 1
+
+		);
+
+		return this;
+
+	}
+
+	makeShear( xy, xz, yx, yz, zx, zy ) {
+
+		this.set(
+
+			1, yx, zx, 0,
+			xy, 1, zy, 0,
+			xz, yz, 1, 0,
+			0, 0, 0, 1
+
+		);
+
+		return this;
+
+	}
+
+	compose( position, quaternion, scale ) {
+
+		const te = this.elements;
+
+		const x = quaternion._x, y = quaternion._y, z = quaternion._z, w = quaternion._w;
+		const x2 = x + x,	y2 = y + y, z2 = z + z;
+		const xx = x * x2, xy = x * y2, xz = x * z2;
+		const yy = y * y2, yz = y * z2, zz = z * z2;
+		const wx = w * x2, wy = w * y2, wz = w * z2;
+
+		const sx = scale.x, sy = scale.y, sz = scale.z;
+
+		te[ 0 ] = ( 1 - ( yy + zz ) ) * sx;
+		te[ 1 ] = ( xy + wz ) * sx;
+		te[ 2 ] = ( xz - wy ) * sx;
+		te[ 3 ] = 0;
+
+		te[ 4 ] = ( xy - wz ) * sy;
+		te[ 5 ] = ( 1 - ( xx + zz ) ) * sy;
+		te[ 6 ] = ( yz + wx ) * sy;
+		te[ 7 ] = 0;
+
+		te[ 8 ] = ( xz + wy ) * sz;
+		te[ 9 ] = ( yz - wx ) * sz;
+		te[ 10 ] = ( 1 - ( xx + yy ) ) * sz;
+		te[ 11 ] = 0;
+
+		te[ 12 ] = position.x;
+		te[ 13 ] = position.y;
+		te[ 14 ] = position.z;
+		te[ 15 ] = 1;
+
+		return this;
+
+	}
+
+	decompose( position, quaternion, scale ) {
+
+		const te = this.elements;
+
+		let sx = _v1.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length();
+		const sy = _v1.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length();
+		const sz = _v1.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length();
+
+		// if determine is negative, we need to invert one scale
+		const det = this.determinant();
+		if ( det < 0 ) sx = - sx;
+
+		position.x = te[ 12 ];
+		position.y = te[ 13 ];
+		position.z = te[ 14 ];
+
+		// scale the rotation part
+		_m1.copy( this );
+
+		const invSX = 1 / sx;
+		const invSY = 1 / sy;
+		const invSZ = 1 / sz;
+
+		_m1.elements[ 0 ] *= invSX;
+		_m1.elements[ 1 ] *= invSX;
+		_m1.elements[ 2 ] *= invSX;
+
+		_m1.elements[ 4 ] *= invSY;
+		_m1.elements[ 5 ] *= invSY;
+		_m1.elements[ 6 ] *= invSY;
+
+		_m1.elements[ 8 ] *= invSZ;
+		_m1.elements[ 9 ] *= invSZ;
+		_m1.elements[ 10 ] *= invSZ;
+
+		quaternion.setFromRotationMatrix( _m1 );
+
+		scale.x = sx;
+		scale.y = sy;
+		scale.z = sz;
+
+		return this;
+
+	}
+
+	makePerspective( left, right, top, bottom, near, far ) {
+
+		if ( far === undefined ) {
+
+			console.warn( 'THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.' );
+
+		}
+
+		const te = this.elements;
+		const x = 2 * near / ( right - left );
+		const y = 2 * near / ( top - bottom );
+
+		const a = ( right + left ) / ( right - left );
+		const b = ( top + bottom ) / ( top - bottom );
+		const c = - ( far + near ) / ( far - near );
+		const d = - 2 * far * near / ( far - near );
+
+		te[ 0 ] = x;	te[ 4 ] = 0;	te[ 8 ] = a;	te[ 12 ] = 0;
+		te[ 1 ] = 0;	te[ 5 ] = y;	te[ 9 ] = b;	te[ 13 ] = 0;
+		te[ 2 ] = 0;	te[ 6 ] = 0;	te[ 10 ] = c;	te[ 14 ] = d;
+		te[ 3 ] = 0;	te[ 7 ] = 0;	te[ 11 ] = - 1;	te[ 15 ] = 0;
+
+		return this;
+
+	}
+
+	makeOrthographic( left, right, top, bottom, near, far ) {
+
+		const te = this.elements;
+		const w = 1.0 / ( right - left );
+		const h = 1.0 / ( top - bottom );
+		const p = 1.0 / ( far - near );
+
+		const x = ( right + left ) * w;
+		const y = ( top + bottom ) * h;
+		const z = ( far + near ) * p;
+
+		te[ 0 ] = 2 * w;	te[ 4 ] = 0;	te[ 8 ] = 0;	te[ 12 ] = - x;
+		te[ 1 ] = 0;	te[ 5 ] = 2 * h;	te[ 9 ] = 0;	te[ 13 ] = - y;
+		te[ 2 ] = 0;	te[ 6 ] = 0;	te[ 10 ] = - 2 * p;	te[ 14 ] = - z;
+		te[ 3 ] = 0;	te[ 7 ] = 0;	te[ 11 ] = 0;	te[ 15 ] = 1;
+
+		return this;
+
+	}
+
+	equals( matrix ) {
+
+		const te = this.elements;
+		const me = matrix.elements;
+
+		for ( let i = 0; i < 16; i ++ ) {
+
+			if ( te[ i ] !== me[ i ] ) return false;
+
+		}
+
+		return true;
+
+	}
+
+	fromArray( array, offset = 0 ) {
+
+		for ( let i = 0; i < 16; i ++ ) {
+
+			this.elements[ i ] = array[ i + offset ];
+
+		}
+
+		return this;
+
+	}
+
+	toArray( array = [], offset = 0 ) {
+
+		const te = this.elements;
+
+		array[ offset ] = te[ 0 ];
+		array[ offset + 1 ] = te[ 1 ];
+		array[ offset + 2 ] = te[ 2 ];
+		array[ offset + 3 ] = te[ 3 ];
+
+		array[ offset + 4 ] = te[ 4 ];
+		array[ offset + 5 ] = te[ 5 ];
+		array[ offset + 6 ] = te[ 6 ];
+		array[ offset + 7 ] = te[ 7 ];
+
+		array[ offset + 8 ] = te[ 8 ];
+		array[ offset + 9 ] = te[ 9 ];
+		array[ offset + 10 ] = te[ 10 ];
+		array[ offset + 11 ] = te[ 11 ];
+
+		array[ offset + 12 ] = te[ 12 ];
+		array[ offset + 13 ] = te[ 13 ];
+		array[ offset + 14 ] = te[ 14 ];
+		array[ offset + 15 ] = te[ 15 ];
+
+		return array;
+
+	}
+
+}
+
+Matrix4_Matrix4.prototype.isMatrix4 = true;
+
+const _v1 = /*@__PURE__*/ new Vector3();
+const _m1 = /*@__PURE__*/ new Matrix4_Matrix4();
+const _zero = /*@__PURE__*/ new Vector3( 0, 0, 0 );
+const _one = /*@__PURE__*/ new Vector3( 1, 1, 1 );
+const _x = /*@__PURE__*/ new Vector3();
+const _y = /*@__PURE__*/ new Vector3();
+const _z = /*@__PURE__*/ new Vector3();
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/math/Euler.js
+
+
+
+
+
+const _matrix = /*@__PURE__*/ new Matrix4_Matrix4();
+const Euler_quaternion = /*@__PURE__*/ new Quaternion();
+
+class Euler {
+
+	constructor( x = 0, y = 0, z = 0, order = Euler.DefaultOrder ) {
+
+		this._x = x;
+		this._y = y;
+		this._z = z;
+		this._order = order;
+
+	}
+
+	get x() {
+
+		return this._x;
+
+	}
+
+	set x( value ) {
+
+		this._x = value;
+		this._onChangeCallback();
+
+	}
+
+	get y() {
+
+		return this._y;
+
+	}
+
+	set y( value ) {
+
+		this._y = value;
+		this._onChangeCallback();
+
+	}
+
+	get z() {
+
+		return this._z;
+
+	}
+
+	set z( value ) {
+
+		this._z = value;
+		this._onChangeCallback();
+
+	}
+
+	get order() {
+
+		return this._order;
+
+	}
+
+	set order( value ) {
+
+		this._order = value;
+		this._onChangeCallback();
+
+	}
+
+	set( x, y, z, order = this._order ) {
+
+		this._x = x;
+		this._y = y;
+		this._z = z;
+		this._order = order;
+
+		this._onChangeCallback();
+
+		return this;
+
+	}
+
+	clone() {
+
+		return new this.constructor( this._x, this._y, this._z, this._order );
+
+	}
+
+	copy( euler ) {
+
+		this._x = euler._x;
+		this._y = euler._y;
+		this._z = euler._z;
+		this._order = euler._order;
+
+		this._onChangeCallback();
+
+		return this;
+
+	}
+
+	setFromRotationMatrix( m, order = this._order, update = true ) {
+
+		// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)
+
+		const te = m.elements;
+		const m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ];
+		const m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ];
+		const m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];
+
+		switch ( order ) {
+
+			case 'XYZ':
+
+				this._y = Math.asin( clamp( m13, - 1, 1 ) );
+
+				if ( Math.abs( m13 ) < 0.9999999 ) {
+
+					this._x = Math.atan2( - m23, m33 );
+					this._z = Math.atan2( - m12, m11 );
+
+				} else {
+
+					this._x = Math.atan2( m32, m22 );
+					this._z = 0;
+
+				}
+
+				break;
+
+			case 'YXZ':
+
+				this._x = Math.asin( - clamp( m23, - 1, 1 ) );
+
+				if ( Math.abs( m23 ) < 0.9999999 ) {
+
+					this._y = Math.atan2( m13, m33 );
+					this._z = Math.atan2( m21, m22 );
+
+				} else {
+
+					this._y = Math.atan2( - m31, m11 );
+					this._z = 0;
+
+				}
+
+				break;
+
+			case 'ZXY':
+
+				this._x = Math.asin( clamp( m32, - 1, 1 ) );
+
+				if ( Math.abs( m32 ) < 0.9999999 ) {
+
+					this._y = Math.atan2( - m31, m33 );
+					this._z = Math.atan2( - m12, m22 );
+
+				} else {
+
+					this._y = 0;
+					this._z = Math.atan2( m21, m11 );
+
+				}
+
+				break;
+
+			case 'ZYX':
+
+				this._y = Math.asin( - clamp( m31, - 1, 1 ) );
+
+				if ( Math.abs( m31 ) < 0.9999999 ) {
+
+					this._x = Math.atan2( m32, m33 );
+					this._z = Math.atan2( m21, m11 );
+
+				} else {
+
+					this._x = 0;
+					this._z = Math.atan2( - m12, m22 );
+
+				}
+
+				break;
+
+			case 'YZX':
+
+				this._z = Math.asin( clamp( m21, - 1, 1 ) );
+
+				if ( Math.abs( m21 ) < 0.9999999 ) {
+
+					this._x = Math.atan2( - m23, m22 );
+					this._y = Math.atan2( - m31, m11 );
+
+				} else {
+
+					this._x = 0;
+					this._y = Math.atan2( m13, m33 );
+
+				}
+
+				break;
+
+			case 'XZY':
+
+				this._z = Math.asin( - clamp( m12, - 1, 1 ) );
+
+				if ( Math.abs( m12 ) < 0.9999999 ) {
+
+					this._x = Math.atan2( m32, m22 );
+					this._y = Math.atan2( m13, m11 );
+
+				} else {
+
+					this._x = Math.atan2( - m23, m33 );
+					this._y = 0;
+
+				}
+
+				break;
+
+			default:
+
+				console.warn( 'THREE.Euler: .setFromRotationMatrix() encountered an unknown order: ' + order );
+
+		}
+
+		this._order = order;
+
+		if ( update === true ) this._onChangeCallback();
+
+		return this;
+
+	}
+
+	setFromQuaternion( q, order, update ) {
+
+		_matrix.makeRotationFromQuaternion( q );
+
+		return this.setFromRotationMatrix( _matrix, order, update );
+
+	}
+
+	setFromVector3( v, order = this._order ) {
+
+		return this.set( v.x, v.y, v.z, order );
+
+	}
+
+	reorder( newOrder ) {
+
+		// WARNING: this discards revolution information -bhouston
+
+		Euler_quaternion.setFromEuler( this );
+
+		return this.setFromQuaternion( Euler_quaternion, newOrder );
+
+	}
+
+	equals( euler ) {
+
+		return ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order );
+
+	}
+
+	fromArray( array ) {
+
+		this._x = array[ 0 ];
+		this._y = array[ 1 ];
+		this._z = array[ 2 ];
+		if ( array[ 3 ] !== undefined ) this._order = array[ 3 ];
+
+		this._onChangeCallback();
+
+		return this;
+
+	}
+
+	toArray( array = [], offset = 0 ) {
+
+		array[ offset ] = this._x;
+		array[ offset + 1 ] = this._y;
+		array[ offset + 2 ] = this._z;
+		array[ offset + 3 ] = this._order;
+
+		return array;
+
+	}
+
+	toVector3( optionalResult ) {
+
+		if ( optionalResult ) {
+
+			return optionalResult.set( this._x, this._y, this._z );
+
+		} else {
+
+			return new Vector3( this._x, this._y, this._z );
+
+		}
+
+	}
+
+	_onChange( callback ) {
+
+		this._onChangeCallback = callback;
+
+		return this;
+
+	}
+
+	_onChangeCallback() {}
+
+}
+
+Euler.prototype.isEuler = true;
+
+Euler.DefaultOrder = 'XYZ';
+Euler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ];
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/core/Layers.js
+class Layers {
+
+	constructor() {
+
+		this.mask = 1 | 0;
+
+	}
+
+	set( channel ) {
+
+		this.mask = ( 1 << channel | 0 ) >>> 0;
+
+	}
+
+	enable( channel ) {
+
+		this.mask |= 1 << channel | 0;
+
+	}
+
+	enableAll() {
+
+		this.mask = 0xffffffff | 0;
+
+	}
+
+	toggle( channel ) {
+
+		this.mask ^= 1 << channel | 0;
+
+	}
+
+	disable( channel ) {
+
+		this.mask &= ~ ( 1 << channel | 0 );
+
+	}
+
+	disableAll() {
+
+		this.mask = 0;
+
+	}
+
+	test( layers ) {
+
+		return ( this.mask & layers.mask ) !== 0;
+
+	}
+
+	isEnabled( channel ) {
+
+		return ( this.mask & ( 1 << channel | 0 ) ) !== 0;
+
+	}
+
+}
+
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/math/Matrix3.js
+class Matrix3 {
+
+	constructor() {
+
+		this.elements = [
+
+			1, 0, 0,
+			0, 1, 0,
+			0, 0, 1
+
+		];
+
+		if ( arguments.length > 0 ) {
+
+			console.error( 'THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.' );
+
+		}
+
+	}
+
+	set( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {
+
+		const te = this.elements;
+
+		te[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31;
+		te[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32;
+		te[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33;
+
+		return this;
+
+	}
+
+	identity() {
+
+		this.set(
+
+			1, 0, 0,
+			0, 1, 0,
+			0, 0, 1
+
+		);
+
+		return this;
+
+	}
+
+	copy( m ) {
+
+		const te = this.elements;
+		const me = m.elements;
+
+		te[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ];
+		te[ 3 ] = me[ 3 ]; te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ];
+		te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; te[ 8 ] = me[ 8 ];
+
+		return this;
+
+	}
+
+	extractBasis( xAxis, yAxis, zAxis ) {
+
+		xAxis.setFromMatrix3Column( this, 0 );
+		yAxis.setFromMatrix3Column( this, 1 );
+		zAxis.setFromMatrix3Column( this, 2 );
+
+		return this;
+
+	}
+
+	setFromMatrix4( m ) {
+
+		const me = m.elements;
+
+		this.set(
+
+			me[ 0 ], me[ 4 ], me[ 8 ],
+			me[ 1 ], me[ 5 ], me[ 9 ],
+			me[ 2 ], me[ 6 ], me[ 10 ]
+
+		);
+
+		return this;
+
+	}
+
+	multiply( m ) {
+
+		return this.multiplyMatrices( this, m );
+
+	}
+
+	premultiply( m ) {
+
+		return this.multiplyMatrices( m, this );
+
+	}
+
+	multiplyMatrices( a, b ) {
+
+		const ae = a.elements;
+		const be = b.elements;
+		const te = this.elements;
+
+		const a11 = ae[ 0 ], a12 = ae[ 3 ], a13 = ae[ 6 ];
+		const a21 = ae[ 1 ], a22 = ae[ 4 ], a23 = ae[ 7 ];
+		const a31 = ae[ 2 ], a32 = ae[ 5 ], a33 = ae[ 8 ];
+
+		const b11 = be[ 0 ], b12 = be[ 3 ], b13 = be[ 6 ];
+		const b21 = be[ 1 ], b22 = be[ 4 ], b23 = be[ 7 ];
+		const b31 = be[ 2 ], b32 = be[ 5 ], b33 = be[ 8 ];
+
+		te[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31;
+		te[ 3 ] = a11 * b12 + a12 * b22 + a13 * b32;
+		te[ 6 ] = a11 * b13 + a12 * b23 + a13 * b33;
+
+		te[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31;
+		te[ 4 ] = a21 * b12 + a22 * b22 + a23 * b32;
+		te[ 7 ] = a21 * b13 + a22 * b23 + a23 * b33;
+
+		te[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31;
+		te[ 5 ] = a31 * b12 + a32 * b22 + a33 * b32;
+		te[ 8 ] = a31 * b13 + a32 * b23 + a33 * b33;
+
+		return this;
+
+	}
+
+	multiplyScalar( s ) {
+
+		const te = this.elements;
+
+		te[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s;
+		te[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s;
+		te[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s;
+
+		return this;
+
+	}
+
+	determinant() {
+
+		const te = this.elements;
+
+		const a = te[ 0 ], b = te[ 1 ], c = te[ 2 ],
+			d = te[ 3 ], e = te[ 4 ], f = te[ 5 ],
+			g = te[ 6 ], h = te[ 7 ], i = te[ 8 ];
+
+		return a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;
+
+	}
+
+	invert() {
+
+		const te = this.elements,
+
+			n11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ],
+			n12 = te[ 3 ], n22 = te[ 4 ], n32 = te[ 5 ],
+			n13 = te[ 6 ], n23 = te[ 7 ], n33 = te[ 8 ],
+
+			t11 = n33 * n22 - n32 * n23,
+			t12 = n32 * n13 - n33 * n12,
+			t13 = n23 * n12 - n22 * n13,
+
+			det = n11 * t11 + n21 * t12 + n31 * t13;
+
+		if ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0 );
+
+		const detInv = 1 / det;
+
+		te[ 0 ] = t11 * detInv;
+		te[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv;
+		te[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv;
+
+		te[ 3 ] = t12 * detInv;
+		te[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv;
+		te[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv;
+
+		te[ 6 ] = t13 * detInv;
+		te[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv;
+		te[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv;
+
+		return this;
+
+	}
+
+	transpose() {
+
+		let tmp;
+		const m = this.elements;
+
+		tmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp;
+		tmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp;
+		tmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp;
+
+		return this;
+
+	}
+
+	getNormalMatrix( matrix4 ) {
+
+		return this.setFromMatrix4( matrix4 ).invert().transpose();
+
+	}
+
+	transposeIntoArray( r ) {
+
+		const m = this.elements;
+
+		r[ 0 ] = m[ 0 ];
+		r[ 1 ] = m[ 3 ];
+		r[ 2 ] = m[ 6 ];
+		r[ 3 ] = m[ 1 ];
+		r[ 4 ] = m[ 4 ];
+		r[ 5 ] = m[ 7 ];
+		r[ 6 ] = m[ 2 ];
+		r[ 7 ] = m[ 5 ];
+		r[ 8 ] = m[ 8 ];
+
+		return this;
+
+	}
+
+	setUvTransform( tx, ty, sx, sy, rotation, cx, cy ) {
+
+		const c = Math.cos( rotation );
+		const s = Math.sin( rotation );
+
+		this.set(
+			sx * c, sx * s, - sx * ( c * cx + s * cy ) + cx + tx,
+			- sy * s, sy * c, - sy * ( - s * cx + c * cy ) + cy + ty,
+			0, 0, 1
+		);
+
+		return this;
+
+	}
+
+	scale( sx, sy ) {
+
+		const te = this.elements;
+
+		te[ 0 ] *= sx; te[ 3 ] *= sx; te[ 6 ] *= sx;
+		te[ 1 ] *= sy; te[ 4 ] *= sy; te[ 7 ] *= sy;
+
+		return this;
+
+	}
+
+	rotate( theta ) {
+
+		const c = Math.cos( theta );
+		const s = Math.sin( theta );
+
+		const te = this.elements;
+
+		const a11 = te[ 0 ], a12 = te[ 3 ], a13 = te[ 6 ];
+		const a21 = te[ 1 ], a22 = te[ 4 ], a23 = te[ 7 ];
+
+		te[ 0 ] = c * a11 + s * a21;
+		te[ 3 ] = c * a12 + s * a22;
+		te[ 6 ] = c * a13 + s * a23;
+
+		te[ 1 ] = - s * a11 + c * a21;
+		te[ 4 ] = - s * a12 + c * a22;
+		te[ 7 ] = - s * a13 + c * a23;
+
+		return this;
+
+	}
+
+	translate( tx, ty ) {
+
+		const te = this.elements;
+
+		te[ 0 ] += tx * te[ 2 ]; te[ 3 ] += tx * te[ 5 ]; te[ 6 ] += tx * te[ 8 ];
+		te[ 1 ] += ty * te[ 2 ]; te[ 4 ] += ty * te[ 5 ]; te[ 7 ] += ty * te[ 8 ];
+
+		return this;
+
+	}
+
+	equals( matrix ) {
+
+		const te = this.elements;
+		const me = matrix.elements;
+
+		for ( let i = 0; i < 9; i ++ ) {
+
+			if ( te[ i ] !== me[ i ] ) return false;
+
+		}
+
+		return true;
+
+	}
+
+	fromArray( array, offset = 0 ) {
+
+		for ( let i = 0; i < 9; i ++ ) {
+
+			this.elements[ i ] = array[ i + offset ];
+
+		}
+
+		return this;
+
+	}
+
+	toArray( array = [], offset = 0 ) {
+
+		const te = this.elements;
+
+		array[ offset ] = te[ 0 ];
+		array[ offset + 1 ] = te[ 1 ];
+		array[ offset + 2 ] = te[ 2 ];
+
+		array[ offset + 3 ] = te[ 3 ];
+		array[ offset + 4 ] = te[ 4 ];
+		array[ offset + 5 ] = te[ 5 ];
+
+		array[ offset + 6 ] = te[ 6 ];
+		array[ offset + 7 ] = te[ 7 ];
+		array[ offset + 8 ] = te[ 8 ];
+
+		return array;
+
+	}
+
+	clone() {
+
+		return new this.constructor().fromArray( this.elements );
+
+	}
+
+}
+
+Matrix3.prototype.isMatrix3 = true;
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/core/Object3D.js
+
+
+
+
+
+
+
+
+
+let _object3DId = 0;
+
+const Object3D_v1 = /*@__PURE__*/ new Vector3();
+const _q1 = /*@__PURE__*/ new Quaternion();
+const Object3D_m1 = /*@__PURE__*/ new Matrix4_Matrix4();
+const _target = /*@__PURE__*/ new Vector3();
+
+const _position = /*@__PURE__*/ new Vector3();
+const _scale = /*@__PURE__*/ new Vector3();
+const Object3D_quaternion = /*@__PURE__*/ new Quaternion();
+
+const _xAxis = /*@__PURE__*/ new Vector3( 1, 0, 0 );
+const _yAxis = /*@__PURE__*/ new Vector3( 0, 1, 0 );
+const _zAxis = /*@__PURE__*/ new Vector3( 0, 0, 1 );
+
+const _addedEvent = { type: 'added' };
+const _removedEvent = { type: 'removed' };
+
+class Object3D extends EventDispatcher {
+
+	constructor() {
+
+		super();
+
+		Object.defineProperty( this, 'id', { value: _object3DId ++ } );
+
+		this.uuid = generateUUID();
+
+		this.name = '';
+		this.type = 'Object3D';
+
+		this.parent = null;
+		this.children = [];
+
+		this.up = Object3D.DefaultUp.clone();
+
+		const position = new Vector3();
+		const rotation = new Euler();
+		const quaternion = new Quaternion();
+		const scale = new Vector3( 1, 1, 1 );
+
+		function onRotationChange() {
+
+			quaternion.setFromEuler( rotation, false );
+
+		}
+
+		function onQuaternionChange() {
+
+			rotation.setFromQuaternion( quaternion, undefined, false );
+
+		}
+
+		rotation._onChange( onRotationChange );
+		quaternion._onChange( onQuaternionChange );
+
+		Object.defineProperties( this, {
+			position: {
+				configurable: true,
+				enumerable: true,
+				value: position
+			},
+			rotation: {
+				configurable: true,
+				enumerable: true,
+				value: rotation
+			},
+			quaternion: {
+				configurable: true,
+				enumerable: true,
+				value: quaternion
+			},
+			scale: {
+				configurable: true,
+				enumerable: true,
+				value: scale
+			},
+			modelViewMatrix: {
+				value: new Matrix4_Matrix4()
+			},
+			normalMatrix: {
+				value: new Matrix3()
+			}
+		} );
+
+		this.matrix = new Matrix4_Matrix4();
+		this.matrixWorld = new Matrix4_Matrix4();
+
+		this.matrixAutoUpdate = Object3D.DefaultMatrixAutoUpdate;
+		this.matrixWorldNeedsUpdate = false;
+
+		this.layers = new Layers();
+		this.visible = true;
+
+		this.castShadow = false;
+		this.receiveShadow = false;
+
+		this.frustumCulled = true;
+		this.renderOrder = 0;
+
+		this.animations = [];
+
+		this.userData = {};
+
+	}
+
+	onBeforeRender( /* renderer, scene, camera, geometry, material, group */ ) {}
+
+	onAfterRender( /* renderer, scene, camera, geometry, material, group */ ) {}
+
+	applyMatrix4( matrix ) {
+
+		if ( this.matrixAutoUpdate ) this.updateMatrix();
+
+		this.matrix.premultiply( matrix );
+
+		this.matrix.decompose( this.position, this.quaternion, this.scale );
+
+	}
+
+	applyQuaternion( q ) {
+
+		this.quaternion.premultiply( q );
+
+		return this;
+
+	}
+
+	setRotationFromAxisAngle( axis, angle ) {
+
+		// assumes axis is normalized
+
+		this.quaternion.setFromAxisAngle( axis, angle );
+
+	}
+
+	setRotationFromEuler( euler ) {
+
+		this.quaternion.setFromEuler( euler, true );
+
+	}
+
+	setRotationFromMatrix( m ) {
+
+		// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)
+
+		this.quaternion.setFromRotationMatrix( m );
+
+	}
+
+	setRotationFromQuaternion( q ) {
+
+		// assumes q is normalized
+
+		this.quaternion.copy( q );
+
+	}
+
+	rotateOnAxis( axis, angle ) {
+
+		// rotate object on axis in object space
+		// axis is assumed to be normalized
+
+		_q1.setFromAxisAngle( axis, angle );
+
+		this.quaternion.multiply( _q1 );
+
+		return this;
+
+	}
+
+	rotateOnWorldAxis( axis, angle ) {
+
+		// rotate object on axis in world space
+		// axis is assumed to be normalized
+		// method assumes no rotated parent
+
+		_q1.setFromAxisAngle( axis, angle );
+
+		this.quaternion.premultiply( _q1 );
+
+		return this;
+
+	}
+
+	rotateX( angle ) {
+
+		return this.rotateOnAxis( _xAxis, angle );
+
+	}
+
+	rotateY( angle ) {
+
+		return this.rotateOnAxis( _yAxis, angle );
+
+	}
+
+	rotateZ( angle ) {
+
+		return this.rotateOnAxis( _zAxis, angle );
+
+	}
+
+	translateOnAxis( axis, distance ) {
+
+		// translate object by distance along axis in object space
+		// axis is assumed to be normalized
+
+		Object3D_v1.copy( axis ).applyQuaternion( this.quaternion );
+
+		this.position.add( Object3D_v1.multiplyScalar( distance ) );
+
+		return this;
+
+	}
+
+	translateX( distance ) {
+
+		return this.translateOnAxis( _xAxis, distance );
+
+	}
+
+	translateY( distance ) {
+
+		return this.translateOnAxis( _yAxis, distance );
+
+	}
+
+	translateZ( distance ) {
+
+		return this.translateOnAxis( _zAxis, distance );
+
+	}
+
+	localToWorld( vector ) {
+
+		return vector.applyMatrix4( this.matrixWorld );
+
+	}
+
+	worldToLocal( vector ) {
+
+		return vector.applyMatrix4( Object3D_m1.copy( this.matrixWorld ).invert() );
+
+	}
+
+	lookAt( x, y, z ) {
+
+		// This method does not support objects having non-uniformly-scaled parent(s)
+
+		if ( x.isVector3 ) {
+
+			_target.copy( x );
+
+		} else {
+
+			_target.set( x, y, z );
+
+		}
+
+		const parent = this.parent;
+
+		this.updateWorldMatrix( true, false );
+
+		_position.setFromMatrixPosition( this.matrixWorld );
+
+		if ( this.isCamera || this.isLight ) {
+
+			Object3D_m1.lookAt( _position, _target, this.up );
+
+		} else {
+
+			Object3D_m1.lookAt( _target, _position, this.up );
+
+		}
+
+		this.quaternion.setFromRotationMatrix( Object3D_m1 );
+
+		if ( parent ) {
+
+			Object3D_m1.extractRotation( parent.matrixWorld );
+			_q1.setFromRotationMatrix( Object3D_m1 );
+			this.quaternion.premultiply( _q1.invert() );
+
+		}
+
+	}
+
+	add( object ) {
+
+		if ( arguments.length > 1 ) {
+
+			for ( let i = 0; i < arguments.length; i ++ ) {
+
+				this.add( arguments[ i ] );
+
+			}
+
+			return this;
+
+		}
+
+		if ( object === this ) {
+
+			console.error( 'THREE.Object3D.add: object can\'t be added as a child of itself.', object );
+			return this;
+
+		}
+
+		if ( object && object.isObject3D ) {
+
+			if ( object.parent !== null ) {
+
+				object.parent.remove( object );
+
+			}
+
+			object.parent = this;
+			this.children.push( object );
+
+			object.dispatchEvent( _addedEvent );
+
+		} else {
+
+			console.error( 'THREE.Object3D.add: object not an instance of THREE.Object3D.', object );
+
+		}
+
+		return this;
+
+	}
+
+	remove( object ) {
+
+		if ( arguments.length > 1 ) {
+
+			for ( let i = 0; i < arguments.length; i ++ ) {
+
+				this.remove( arguments[ i ] );
+
+			}
+
+			return this;
+
+		}
+
+		const index = this.children.indexOf( object );
+
+		if ( index !== - 1 ) {
+
+			object.parent = null;
+			this.children.splice( index, 1 );
+
+			object.dispatchEvent( _removedEvent );
+
+		}
+
+		return this;
+
+	}
+
+	removeFromParent() {
+
+		const parent = this.parent;
+
+		if ( parent !== null ) {
+
+			parent.remove( this );
+
+		}
+
+		return this;
+
+	}
+
+	clear() {
+
+		for ( let i = 0; i < this.children.length; i ++ ) {
+
+			const object = this.children[ i ];
+
+			object.parent = null;
+
+			object.dispatchEvent( _removedEvent );
+
+		}
+
+		this.children.length = 0;
+
+		return this;
+
+
+	}
+
+	attach( object ) {
+
+		// adds object as a child of this, while maintaining the object's world transform
+
+		// Note: This method does not support scene graphs having non-uniformly-scaled nodes(s)
+
+		this.updateWorldMatrix( true, false );
+
+		Object3D_m1.copy( this.matrixWorld ).invert();
+
+		if ( object.parent !== null ) {
+
+			object.parent.updateWorldMatrix( true, false );
+
+			Object3D_m1.multiply( object.parent.matrixWorld );
+
+		}
+
+		object.applyMatrix4( Object3D_m1 );
+
+		this.add( object );
+
+		object.updateWorldMatrix( false, true );
+
+		return this;
+
+	}
+
+	getObjectById( id ) {
+
+		return this.getObjectByProperty( 'id', id );
+
+	}
+
+	getObjectByName( name ) {
+
+		return this.getObjectByProperty( 'name', name );
+
+	}
+
+	getObjectByProperty( name, value ) {
+
+		if ( this[ name ] === value ) return this;
+
+		for ( let i = 0, l = this.children.length; i < l; i ++ ) {
+
+			const child = this.children[ i ];
+			const object = child.getObjectByProperty( name, value );
+
+			if ( object !== undefined ) {
+
+				return object;
+
+			}
+
+		}
+
+		return undefined;
+
+	}
+
+	getWorldPosition( target ) {
+
+		this.updateWorldMatrix( true, false );
+
+		return target.setFromMatrixPosition( this.matrixWorld );
+
+	}
+
+	getWorldQuaternion( target ) {
+
+		this.updateWorldMatrix( true, false );
+
+		this.matrixWorld.decompose( _position, target, _scale );
+
+		return target;
+
+	}
+
+	getWorldScale( target ) {
+
+		this.updateWorldMatrix( true, false );
+
+		this.matrixWorld.decompose( _position, Object3D_quaternion, target );
+
+		return target;
+
+	}
+
+	getWorldDirection( target ) {
+
+		this.updateWorldMatrix( true, false );
+
+		const e = this.matrixWorld.elements;
+
+		return target.set( e[ 8 ], e[ 9 ], e[ 10 ] ).normalize();
+
+	}
+
+	raycast( /* raycaster, intersects */ ) {}
+
+	traverse( callback ) {
+
+		callback( this );
+
+		const children = this.children;
+
+		for ( let i = 0, l = children.length; i < l; i ++ ) {
+
+			children[ i ].traverse( callback );
+
+		}
+
+	}
+
+	traverseVisible( callback ) {
+
+		if ( this.visible === false ) return;
+
+		callback( this );
+
+		const children = this.children;
+
+		for ( let i = 0, l = children.length; i < l; i ++ ) {
+
+			children[ i ].traverseVisible( callback );
+
+		}
+
+	}
+
+	traverseAncestors( callback ) {
+
+		const parent = this.parent;
+
+		if ( parent !== null ) {
+
+			callback( parent );
+
+			parent.traverseAncestors( callback );
+
+		}
+
+	}
+
+	updateMatrix() {
+
+		this.matrix.compose( this.position, this.quaternion, this.scale );
+
+		this.matrixWorldNeedsUpdate = true;
+
+	}
+
+	updateMatrixWorld( force ) {
+
+		if ( this.matrixAutoUpdate ) this.updateMatrix();
+
+		if ( this.matrixWorldNeedsUpdate || force ) {
+
+			if ( this.parent === null ) {
+
+				this.matrixWorld.copy( this.matrix );
+
+			} else {
+
+				this.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );
+
+			}
+
+			this.matrixWorldNeedsUpdate = false;
+
+			force = true;
+
+		}
+
+		// update children
+
+		const children = this.children;
+
+		for ( let i = 0, l = children.length; i < l; i ++ ) {
+
+			children[ i ].updateMatrixWorld( force );
+
+		}
+
+	}
+
+	updateWorldMatrix( updateParents, updateChildren ) {
+
+		const parent = this.parent;
+
+		if ( updateParents === true && parent !== null ) {
+
+			parent.updateWorldMatrix( true, false );
+
+		}
+
+		if ( this.matrixAutoUpdate ) this.updateMatrix();
+
+		if ( this.parent === null ) {
+
+			this.matrixWorld.copy( this.matrix );
+
+		} else {
+
+			this.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );
+
+		}
+
+		// update children
+
+		if ( updateChildren === true ) {
+
+			const children = this.children;
+
+			for ( let i = 0, l = children.length; i < l; i ++ ) {
+
+				children[ i ].updateWorldMatrix( false, true );
+
+			}
+
+		}
+
+	}
+
+	toJSON( meta ) {
+
+		// meta is a string when called from JSON.stringify
+		const isRootObject = ( meta === undefined || typeof meta === 'string' );
+
+		const output = {};
+
+		// meta is a hash used to collect geometries, materials.
+		// not providing it implies that this is the root object
+		// being serialized.
+		if ( isRootObject ) {
+
+			// initialize meta obj
+			meta = {
+				geometries: {},
+				materials: {},
+				textures: {},
+				images: {},
+				shapes: {},
+				skeletons: {},
+				animations: {}
+			};
+
+			output.metadata = {
+				version: 4.5,
+				type: 'Object',
+				generator: 'Object3D.toJSON'
+			};
+
+		}
+
+		// standard Object3D serialization
+
+		const object = {};
+
+		object.uuid = this.uuid;
+		object.type = this.type;
+
+		if ( this.name !== '' ) object.name = this.name;
+		if ( this.castShadow === true ) object.castShadow = true;
+		if ( this.receiveShadow === true ) object.receiveShadow = true;
+		if ( this.visible === false ) object.visible = false;
+		if ( this.frustumCulled === false ) object.frustumCulled = false;
+		if ( this.renderOrder !== 0 ) object.renderOrder = this.renderOrder;
+		if ( JSON.stringify( this.userData ) !== '{}' ) object.userData = this.userData;
+
+		object.layers = this.layers.mask;
+		object.matrix = this.matrix.toArray();
+
+		if ( this.matrixAutoUpdate === false ) object.matrixAutoUpdate = false;
+
+		// object specific properties
+
+		if ( this.isInstancedMesh ) {
+
+			object.type = 'InstancedMesh';
+			object.count = this.count;
+			object.instanceMatrix = this.instanceMatrix.toJSON();
+			if ( this.instanceColor !== null ) object.instanceColor = this.instanceColor.toJSON();
+
+		}
+
+		//
+
+		function serialize( library, element ) {
+
+			if ( library[ element.uuid ] === undefined ) {
+
+				library[ element.uuid ] = element.toJSON( meta );
+
+			}
+
+			return element.uuid;
+
+		}
+
+		if ( this.isScene ) {
+
+			if ( this.background ) {
+
+				if ( this.background.isColor ) {
+
+					object.background = this.background.toJSON();
+
+				} else if ( this.background.isTexture ) {
+
+					object.background = this.background.toJSON( meta ).uuid;
+
+				}
+
+			}
+
+			if ( this.environment && this.environment.isTexture ) {
+
+				object.environment = this.environment.toJSON( meta ).uuid;
+
+			}
+
+		} else if ( this.isMesh || this.isLine || this.isPoints ) {
+
+			object.geometry = serialize( meta.geometries, this.geometry );
+
+			const parameters = this.geometry.parameters;
+
+			if ( parameters !== undefined && parameters.shapes !== undefined ) {
+
+				const shapes = parameters.shapes;
+
+				if ( Array.isArray( shapes ) ) {
+
+					for ( let i = 0, l = shapes.length; i < l; i ++ ) {
+
+						const shape = shapes[ i ];
+
+						serialize( meta.shapes, shape );
+
+					}
+
+				} else {
+
+					serialize( meta.shapes, shapes );
+
+				}
+
+			}
+
+		}
+
+		if ( this.isSkinnedMesh ) {
+
+			object.bindMode = this.bindMode;
+			object.bindMatrix = this.bindMatrix.toArray();
+
+			if ( this.skeleton !== undefined ) {
+
+				serialize( meta.skeletons, this.skeleton );
+
+				object.skeleton = this.skeleton.uuid;
+
+			}
+
+		}
+
+		if ( this.material !== undefined ) {
+
+			if ( Array.isArray( this.material ) ) {
+
+				const uuids = [];
+
+				for ( let i = 0, l = this.material.length; i < l; i ++ ) {
+
+					uuids.push( serialize( meta.materials, this.material[ i ] ) );
+
+				}
+
+				object.material = uuids;
+
+			} else {
+
+				object.material = serialize( meta.materials, this.material );
+
+			}
+
+		}
+
+		//
+
+		if ( this.children.length > 0 ) {
+
+			object.children = [];
+
+			for ( let i = 0; i < this.children.length; i ++ ) {
+
+				object.children.push( this.children[ i ].toJSON( meta ).object );
+
+			}
+
+		}
+
+		//
+
+		if ( this.animations.length > 0 ) {
+
+			object.animations = [];
+
+			for ( let i = 0; i < this.animations.length; i ++ ) {
+
+				const animation = this.animations[ i ];
+
+				object.animations.push( serialize( meta.animations, animation ) );
+
+			}
+
+		}
+
+		if ( isRootObject ) {
+
+			const geometries = extractFromCache( meta.geometries );
+			const materials = extractFromCache( meta.materials );
+			const textures = extractFromCache( meta.textures );
+			const images = extractFromCache( meta.images );
+			const shapes = extractFromCache( meta.shapes );
+			const skeletons = extractFromCache( meta.skeletons );
+			const animations = extractFromCache( meta.animations );
+
+			if ( geometries.length > 0 ) output.geometries = geometries;
+			if ( materials.length > 0 ) output.materials = materials;
+			if ( textures.length > 0 ) output.textures = textures;
+			if ( images.length > 0 ) output.images = images;
+			if ( shapes.length > 0 ) output.shapes = shapes;
+			if ( skeletons.length > 0 ) output.skeletons = skeletons;
+			if ( animations.length > 0 ) output.animations = animations;
+
+		}
+
+		output.object = object;
+
+		return output;
+
+		// extract data from the cache hash
+		// remove metadata on each item
+		// and return as array
+		function extractFromCache( cache ) {
+
+			const values = [];
+			for ( const key in cache ) {
+
+				const data = cache[ key ];
+				delete data.metadata;
+				values.push( data );
+
+			}
+
+			return values;
+
+		}
+
+	}
+
+	clone( recursive ) {
+
+		return new this.constructor().copy( this, recursive );
+
+	}
+
+	copy( source, recursive = true ) {
+
+		this.name = source.name;
+
+		this.up.copy( source.up );
+
+		this.position.copy( source.position );
+		this.rotation.order = source.rotation.order;
+		this.quaternion.copy( source.quaternion );
+		this.scale.copy( source.scale );
+
+		this.matrix.copy( source.matrix );
+		this.matrixWorld.copy( source.matrixWorld );
+
+		this.matrixAutoUpdate = source.matrixAutoUpdate;
+		this.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate;
+
+		this.layers.mask = source.layers.mask;
+		this.visible = source.visible;
+
+		this.castShadow = source.castShadow;
+		this.receiveShadow = source.receiveShadow;
+
+		this.frustumCulled = source.frustumCulled;
+		this.renderOrder = source.renderOrder;
+
+		this.userData = JSON.parse( JSON.stringify( source.userData ) );
+
+		if ( recursive === true ) {
+
+			for ( let i = 0; i < source.children.length; i ++ ) {
+
+				const child = source.children[ i ];
+				this.add( child.clone() );
+
+			}
+
+		}
+
+		return this;
+
+	}
+
+}
+
+Object3D.DefaultUp = new Vector3( 0, 1, 0 );
+Object3D.DefaultMatrixAutoUpdate = true;
+
+Object3D.prototype.isObject3D = true;
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/cameras/Camera.js
+
+
+
+class Camera extends Object3D {
+
+	constructor() {
+
+		super();
+
+		this.type = 'Camera';
+
+		this.matrixWorldInverse = new Matrix4_Matrix4();
+
+		this.projectionMatrix = new Matrix4_Matrix4();
+		this.projectionMatrixInverse = new Matrix4_Matrix4();
+
+	}
+
+	copy( source, recursive ) {
+
+		super.copy( source, recursive );
+
+		this.matrixWorldInverse.copy( source.matrixWorldInverse );
+
+		this.projectionMatrix.copy( source.projectionMatrix );
+		this.projectionMatrixInverse.copy( source.projectionMatrixInverse );
+
+		return this;
+
+	}
+
+	getWorldDirection( target ) {
+
+		this.updateWorldMatrix( true, false );
+
+		const e = this.matrixWorld.elements;
+
+		return target.set( - e[ 8 ], - e[ 9 ], - e[ 10 ] ).normalize();
+
+	}
+
+	updateMatrixWorld( force ) {
+
+		super.updateMatrixWorld( force );
+
+		this.matrixWorldInverse.copy( this.matrixWorld ).invert();
+
+	}
+
+	updateWorldMatrix( updateParents, updateChildren ) {
+
+		super.updateWorldMatrix( updateParents, updateChildren );
+
+		this.matrixWorldInverse.copy( this.matrixWorld ).invert();
+
+	}
+
+	clone() {
+
+		return new this.constructor().copy( this );
+
+	}
+
+}
+
+Camera.prototype.isCamera = true;
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/cameras/OrthographicCamera.js
+
+
+class OrthographicCamera extends Camera {
+
+	constructor( left = - 1, right = 1, top = 1, bottom = - 1, near = 0.1, far = 2000 ) {
+
+		super();
+
+		this.type = 'OrthographicCamera';
+
+		this.zoom = 1;
+		this.view = null;
+
+		this.left = left;
+		this.right = right;
+		this.top = top;
+		this.bottom = bottom;
+
+		this.near = near;
+		this.far = far;
+
+		this.updateProjectionMatrix();
+
+	}
+
+	copy( source, recursive ) {
+
+		super.copy( source, recursive );
+
+		this.left = source.left;
+		this.right = source.right;
+		this.top = source.top;
+		this.bottom = source.bottom;
+		this.near = source.near;
+		this.far = source.far;
+
+		this.zoom = source.zoom;
+		this.view = source.view === null ? null : Object.assign( {}, source.view );
+
+		return this;
+
+	}
+
+	setViewOffset( fullWidth, fullHeight, x, y, width, height ) {
+
+		if ( this.view === null ) {
+
+			this.view = {
+				enabled: true,
+				fullWidth: 1,
+				fullHeight: 1,
+				offsetX: 0,
+				offsetY: 0,
+				width: 1,
+				height: 1
+			};
+
+		}
+
+		this.view.enabled = true;
+		this.view.fullWidth = fullWidth;
+		this.view.fullHeight = fullHeight;
+		this.view.offsetX = x;
+		this.view.offsetY = y;
+		this.view.width = width;
+		this.view.height = height;
+
+		this.updateProjectionMatrix();
+
+	}
+
+	clearViewOffset() {
+
+		if ( this.view !== null ) {
+
+			this.view.enabled = false;
+
+		}
+
+		this.updateProjectionMatrix();
+
+	}
+
+	updateProjectionMatrix() {
+
+		const dx = ( this.right - this.left ) / ( 2 * this.zoom );
+		const dy = ( this.top - this.bottom ) / ( 2 * this.zoom );
+		const cx = ( this.right + this.left ) / 2;
+		const cy = ( this.top + this.bottom ) / 2;
+
+		let left = cx - dx;
+		let right = cx + dx;
+		let top = cy + dy;
+		let bottom = cy - dy;
+
+		if ( this.view !== null && this.view.enabled ) {
+
+			const scaleW = ( this.right - this.left ) / this.view.fullWidth / this.zoom;
+			const scaleH = ( this.top - this.bottom ) / this.view.fullHeight / this.zoom;
+
+			left += scaleW * this.view.offsetX;
+			right = left + scaleW * this.view.width;
+			top -= scaleH * this.view.offsetY;
+			bottom = top - scaleH * this.view.height;
+
+		}
+
+		this.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far );
+
+		this.projectionMatrixInverse.copy( this.projectionMatrix ).invert();
+
+	}
+
+	toJSON( meta ) {
+
+		const data = super.toJSON( meta );
+
+		data.object.zoom = this.zoom;
+		data.object.left = this.left;
+		data.object.right = this.right;
+		data.object.top = this.top;
+		data.object.bottom = this.bottom;
+		data.object.near = this.near;
+		data.object.far = this.far;
+
+		if ( this.view !== null ) data.object.view = Object.assign( {}, this.view );
+
+		return data;
+
+	}
+
+}
+
+OrthographicCamera.prototype.isOrthographicCamera = true;
+
+
+
+// EXTERNAL MODULE: external "THREE"
+var external_THREE_ = __webpack_require__(824);
+;// CONCATENATED MODULE: ./node_modules/threestrap/src/core/camera.js
+
+
+
+
+
+Bootstrap.registerPlugin("camera", {
+  defaults: {
+    near: 0.01,
+    far: 10000,
+
+    type: "perspective",
+    fov: 60,
+    aspect: null,
+
+    // type: 'orthographic',
+    left: -1,
+    right: 1,
+    bottom: -1,
+    top: 1,
+
+    klass: null,
+    parameters: null,
+  },
+
+  listen: ["resize", "this.change"],
+
+  install: function (three) {
+    three.Camera = this.api();
+    three.camera = null;
+
+    this.aspect = 1;
+    this.change({}, three);
+  },
+
+  uninstall: function (three) {
+    delete three.Camera;
+    delete three.camera;
+  },
+
+  change: function (event, three) {
+    const o = this.options;
+    const old = three.camera;
+
+    if (!three.camera || event.changes.type || event.changes.klass) {
+      const klass =
+        o.klass ||
+        {
+          perspective: external_THREE_.PerspectiveCamera,
+          orthographic: OrthographicCamera,
+        }[o.type] ||
+        Camera;
+
+      three.camera = o.parameters ? new klass(o.parameters) : new klass();
+    }
+
+    Object.entries(o).forEach(
+      function ([key]) {
+        if (Object.prototype.hasOwnProperty.call(three.camera, key))
+          three.camera[key] = o[key];
+      }.bind(this)
+    );
+
+    this.update(three);
+
+    old === three.camera ||
+      three.trigger({
+        type: "camera",
+        camera: three.camera,
+      });
+  },
+
+  resize: function (event, three) {
+    this.aspect = event.viewWidth / Math.max(1, event.viewHeight);
+
+    this.update(three);
+  },
+
+  update: function (three) {
+    three.camera.aspect = this.options.aspect || this.aspect;
+    three.camera.updateProjectionMatrix();
+  },
+});
+
+;// CONCATENATED MODULE: ./node_modules/threestrap/src/core/fallback.js
+
+
+Bootstrap.registerPlugin("fallback", {
+  defaults: {
+    force: false,
+    fill: true,
+    begin:
+      '<div class="threestrap-fallback" style="display: table; width: 100%; height: 100%;' +
+      'box-sizing: border-box; border: 1px dashed rgba(0, 0, 0, .25);">' +
+      '<div style="display: table-cell; padding: 10px; vertical-align: middle; text-align: center;">',
+    end: "</div></div>",
+    message:
+      "<big><strong>This example requires WebGL</strong></big><br>" +
+      'Visit <a target="_blank" href="http://get.webgl.org/">get.webgl.org</a> for more info</a>',
+  },
+
+  install: function (three) {
+    let cnv, gl;
+    try {
+      cnv = document.createElement("canvas");
+      gl = cnv.getContext("webgl") || cnv.getContext("experimental-webgl");
+      if (!gl || this.options.force) {
+        throw "WebGL unavailable.";
+      }
+      three.fallback = false;
+    } catch (e) {
+      const message = this.options.message;
+      const begin = this.options.begin;
+      const end = this.options.end;
+      const fill = this.options.fill;
+
+      const div = document.createElement("div");
+      div.innerHTML = begin + message + end;
+
+      this.children = [];
+
+      while (div.childNodes.length > 0) {
+        this.children.push(div.firstChild);
+        three.element.appendChild(div.firstChild);
+      }
+
+      if (fill) {
+        three.install("fill");
+      }
+
+      this.div = div;
+      three.fallback = true;
+      return false; // Abort install
+    }
+  },
+
+  uninstall: function (three) {
+    if (this.children) {
+      this.children.forEach(function (child) {
+        child.parentNode.removeChild(child);
+      });
+      this.children = null;
+    }
+
+    delete three.fallback;
+  },
+});
+
+;// CONCATENATED MODULE: ./node_modules/threestrap/src/core/fill.js
+
+
+Bootstrap.registerPlugin("fill", {
+  defaults: {
+    block: true,
+    body: true,
+    layout: true,
+  },
+
+  install: function (three) {
+    function is(element) {
+      const h = element.style.height;
+      return h == "auto" || h == "";
+    }
+
+    function set(element) {
+      element.style.height = "100%";
+      element.style.margin = 0;
+      element.style.padding = 0;
+      return element;
+    }
+
+    if (this.options.body && three.element == document.body) {
+      // Fix body height if we're naked
+      this.applied = [three.element, document.documentElement]
+        .filter(is)
+        .map(set);
+    }
+
+    if (this.options.block && three.canvas) {
+      three.canvas.style.display = "block";
+      this.block = true;
+    }
+
+    if (this.options.layout && three.element) {
+      const style = window.getComputedStyle(three.element);
+      if (style.position == "static") {
+        three.element.style.position = "relative";
+        this.layout = true;
+      }
+    }
+  },
+
+  uninstall: function (three) {
+    if (this.applied) {
+      const set = function (element) {
+        element.style.height = "";
+        element.style.margin = "";
+        element.style.padding = "";
+        return element;
+      };
+
+      this.applied.map(set);
+      delete this.applied;
+    }
+
+    if (this.block && three.canvas) {
+      three.canvas.style.display = "";
+      delete this.block;
+    }
+
+    if (this.layout && three.element) {
+      three.element.style.position = "";
+      delete this.layout;
+    }
+  },
+
+  change: function (three) {
+    this.uninstall(three);
+    this.install(three);
+  },
+});
+
+;// CONCATENATED MODULE: ./node_modules/threestrap/src/core/loop.js
+
+
+Bootstrap.registerPlugin("loop", {
+  defaults: {
+    start: true,
+    each: 1,
+  },
+
+  listen: ["ready"],
+
+  install: function (three) {
+    this.running = false;
+    this.lastRequestId = null;
+
+    three.Loop = this.api(
+      {
+        start: this.start.bind(this),
+        stop: this.stop.bind(this),
+        running: false,
+        window: window,
+      },
+      three
+    );
+
+    this.events = ["pre", "update", "render", "post"].map(function (type) {
+      return { type: type };
+    });
+  },
+
+  uninstall: function (three) {
+    this.stop(three);
+  },
+
+  ready: function (event, three) {
+    if (this.options.start) this.start(three);
+  },
+
+  start: function (three) {
+    if (this.running) return;
+
+    three.Loop.running = this.running = true;
+
+    const trigger = three.trigger.bind(three);
+    const loop = function () {
+      if (!this.running) return;
+      this.lastRequestId = three.Loop.window.requestAnimationFrame(loop);
+      this.events.map(trigger);
+    }.bind(this);
+
+    this.lastRequestId = three.Loop.window.requestAnimationFrame(loop);
+
+    three.trigger({ type: "start" });
+  },
+
+  stop: function (three) {
+    if (!this.running) return;
+    three.Loop.running = this.running = false;
+
+    three.Loop.window.cancelAnimationFrame(this.lastRequestId);
+    this.lastRequestId = null;
+
+    three.trigger({ type: "stop" });
+  },
+});
+
+;// CONCATENATED MODULE: ./node_modules/threestrap/src/core/render.js
+
+
+Bootstrap.registerPlugin("render", {
+  listen: ["render"],
+
+  render: function (event, three) {
+    if (three.scene && three.camera) {
+      three.renderer.render(three.scene, three.camera);
+    }
+  },
+});
+
+;// CONCATENATED MODULE: ./node_modules/three/src/constants.js
+const constants_REVISION = '137';
+const MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2, ROTATE: 0, DOLLY: 1, PAN: 2 };
+const TOUCH = { ROTATE: 0, PAN: 1, DOLLY_PAN: 2, DOLLY_ROTATE: 3 };
+const CullFaceNone = 0;
+const CullFaceBack = 1;
+const CullFaceFront = 2;
+const CullFaceFrontBack = 3;
+const BasicShadowMap = 0;
+const PCFShadowMap = 1;
+const PCFSoftShadowMap = 2;
+const VSMShadowMap = 3;
+const FrontSide = 0;
+const BackSide = 1;
+const DoubleSide = 2;
+const FlatShading = 1;
+const SmoothShading = 2;
+const NoBlending = 0;
+const NormalBlending = 1;
+const AdditiveBlending = 2;
+const SubtractiveBlending = 3;
+const MultiplyBlending = 4;
+const CustomBlending = 5;
+const AddEquation = 100;
+const SubtractEquation = 101;
+const ReverseSubtractEquation = 102;
+const MinEquation = 103;
+const MaxEquation = 104;
+const ZeroFactor = 200;
+const OneFactor = 201;
+const SrcColorFactor = 202;
+const OneMinusSrcColorFactor = 203;
+const SrcAlphaFactor = 204;
+const OneMinusSrcAlphaFactor = 205;
+const DstAlphaFactor = 206;
+const OneMinusDstAlphaFactor = 207;
+const DstColorFactor = 208;
+const OneMinusDstColorFactor = 209;
+const SrcAlphaSaturateFactor = 210;
+const NeverDepth = 0;
+const AlwaysDepth = 1;
+const LessDepth = 2;
+const LessEqualDepth = 3;
+const EqualDepth = 4;
+const GreaterEqualDepth = 5;
+const GreaterDepth = 6;
+const NotEqualDepth = 7;
+const MultiplyOperation = 0;
+const MixOperation = 1;
+const AddOperation = 2;
+const NoToneMapping = 0;
+const LinearToneMapping = 1;
+const ReinhardToneMapping = 2;
+const CineonToneMapping = 3;
+const ACESFilmicToneMapping = 4;
+const CustomToneMapping = 5;
+
+const UVMapping = 300;
+const CubeReflectionMapping = 301;
+const CubeRefractionMapping = 302;
+const EquirectangularReflectionMapping = 303;
+const EquirectangularRefractionMapping = 304;
+const CubeUVReflectionMapping = 306;
+const CubeUVRefractionMapping = 307;
+const RepeatWrapping = 1000;
+const ClampToEdgeWrapping = 1001;
+const MirroredRepeatWrapping = 1002;
+const NearestFilter = 1003;
+const NearestMipmapNearestFilter = 1004;
+const NearestMipMapNearestFilter = 1004;
+const NearestMipmapLinearFilter = 1005;
+const NearestMipMapLinearFilter = 1005;
+const LinearFilter = 1006;
+const LinearMipmapNearestFilter = 1007;
+const LinearMipMapNearestFilter = 1007;
+const LinearMipmapLinearFilter = 1008;
+const LinearMipMapLinearFilter = 1008;
+const UnsignedByteType = 1009;
+const ByteType = 1010;
+const ShortType = 1011;
+const UnsignedShortType = 1012;
+const IntType = 1013;
+const UnsignedIntType = 1014;
+const FloatType = 1015;
+const HalfFloatType = 1016;
+const UnsignedShort4444Type = 1017;
+const UnsignedShort5551Type = 1018;
+const UnsignedInt248Type = 1020;
+const AlphaFormat = 1021;
+const RGBFormat = 1022;
+const RGBAFormat = 1023;
+const LuminanceFormat = 1024;
+const LuminanceAlphaFormat = 1025;
+const DepthFormat = 1026;
+const DepthStencilFormat = 1027;
+const RedFormat = 1028;
+const RedIntegerFormat = 1029;
+const RGFormat = 1030;
+const RGIntegerFormat = 1031;
+const RGBAIntegerFormat = 1033;
+
+const RGB_S3TC_DXT1_Format = 33776;
+const RGBA_S3TC_DXT1_Format = 33777;
+const RGBA_S3TC_DXT3_Format = 33778;
+const RGBA_S3TC_DXT5_Format = 33779;
+const RGB_PVRTC_4BPPV1_Format = 35840;
+const RGB_PVRTC_2BPPV1_Format = 35841;
+const RGBA_PVRTC_4BPPV1_Format = 35842;
+const RGBA_PVRTC_2BPPV1_Format = 35843;
+const RGB_ETC1_Format = 36196;
+const RGB_ETC2_Format = 37492;
+const RGBA_ETC2_EAC_Format = 37496;
+const RGBA_ASTC_4x4_Format = 37808;
+const RGBA_ASTC_5x4_Format = 37809;
+const RGBA_ASTC_5x5_Format = 37810;
+const RGBA_ASTC_6x5_Format = 37811;
+const RGBA_ASTC_6x6_Format = 37812;
+const RGBA_ASTC_8x5_Format = 37813;
+const RGBA_ASTC_8x6_Format = 37814;
+const RGBA_ASTC_8x8_Format = 37815;
+const RGBA_ASTC_10x5_Format = 37816;
+const RGBA_ASTC_10x6_Format = 37817;
+const RGBA_ASTC_10x8_Format = 37818;
+const RGBA_ASTC_10x10_Format = 37819;
+const RGBA_ASTC_12x10_Format = 37820;
+const RGBA_ASTC_12x12_Format = 37821;
+const RGBA_BPTC_Format = 36492;
+const LoopOnce = 2200;
+const LoopRepeat = 2201;
+const LoopPingPong = 2202;
+const InterpolateDiscrete = 2300;
+const InterpolateLinear = 2301;
+const InterpolateSmooth = 2302;
+const ZeroCurvatureEnding = 2400;
+const ZeroSlopeEnding = 2401;
+const WrapAroundEnding = 2402;
+const NormalAnimationBlendMode = 2500;
+const AdditiveAnimationBlendMode = 2501;
+const TrianglesDrawMode = 0;
+const TriangleStripDrawMode = 1;
+const TriangleFanDrawMode = 2;
+const LinearEncoding = 3000;
+const sRGBEncoding = 3001;
+const BasicDepthPacking = 3200;
+const RGBADepthPacking = 3201;
+const TangentSpaceNormalMap = 0;
+const ObjectSpaceNormalMap = 1;
+
+const ZeroStencilOp = 0;
+const KeepStencilOp = 7680;
+const ReplaceStencilOp = 7681;
+const IncrementStencilOp = 7682;
+const DecrementStencilOp = 7683;
+const IncrementWrapStencilOp = 34055;
+const DecrementWrapStencilOp = 34056;
+const InvertStencilOp = 5386;
+
+const NeverStencilFunc = 512;
+const LessStencilFunc = 513;
+const EqualStencilFunc = 514;
+const LessEqualStencilFunc = 515;
+const GreaterStencilFunc = 516;
+const NotEqualStencilFunc = 517;
+const GreaterEqualStencilFunc = 518;
+const AlwaysStencilFunc = 519;
+
+const StaticDrawUsage = 35044;
+const DynamicDrawUsage = 35048;
+const StreamDrawUsage = 35040;
+const StaticReadUsage = 35045;
+const DynamicReadUsage = 35049;
+const StreamReadUsage = 35041;
+const StaticCopyUsage = 35046;
+const DynamicCopyUsage = 35050;
+const StreamCopyUsage = 35042;
+
+const GLSL1 = '100';
+const GLSL3 = '300 es';
+
+const _SRGBAFormat = 1035; // fallback for WebGL 1
+
+;// CONCATENATED MODULE: ./node_modules/three/src/math/Box3.js
+
+
+class Box3 {
+
+	constructor( min = new Vector3( + Infinity, + Infinity, + Infinity ), max = new Vector3( - Infinity, - Infinity, - Infinity ) ) {
+
+		this.min = min;
+		this.max = max;
+
+	}
+
+	set( min, max ) {
+
+		this.min.copy( min );
+		this.max.copy( max );
+
+		return this;
+
+	}
+
+	setFromArray( array ) {
+
+		let minX = + Infinity;
+		let minY = + Infinity;
+		let minZ = + Infinity;
+
+		let maxX = - Infinity;
+		let maxY = - Infinity;
+		let maxZ = - Infinity;
+
+		for ( let i = 0, l = array.length; i < l; i += 3 ) {
+
+			const x = array[ i ];
+			const y = array[ i + 1 ];
+			const z = array[ i + 2 ];
+
+			if ( x < minX ) minX = x;
+			if ( y < minY ) minY = y;
+			if ( z < minZ ) minZ = z;
+
+			if ( x > maxX ) maxX = x;
+			if ( y > maxY ) maxY = y;
+			if ( z > maxZ ) maxZ = z;
+
+		}
+
+		this.min.set( minX, minY, minZ );
+		this.max.set( maxX, maxY, maxZ );
+
+		return this;
+
+	}
+
+	setFromBufferAttribute( attribute ) {
+
+		let minX = + Infinity;
+		let minY = + Infinity;
+		let minZ = + Infinity;
+
+		let maxX = - Infinity;
+		let maxY = - Infinity;
+		let maxZ = - Infinity;
+
+		for ( let i = 0, l = attribute.count; i < l; i ++ ) {
+
+			const x = attribute.getX( i );
+			const y = attribute.getY( i );
+			const z = attribute.getZ( i );
+
+			if ( x < minX ) minX = x;
+			if ( y < minY ) minY = y;
+			if ( z < minZ ) minZ = z;
+
+			if ( x > maxX ) maxX = x;
+			if ( y > maxY ) maxY = y;
+			if ( z > maxZ ) maxZ = z;
+
+		}
+
+		this.min.set( minX, minY, minZ );
+		this.max.set( maxX, maxY, maxZ );
+
+		return this;
+
+	}
+
+	setFromPoints( points ) {
+
+		this.makeEmpty();
+
+		for ( let i = 0, il = points.length; i < il; i ++ ) {
+
+			this.expandByPoint( points[ i ] );
+
+		}
+
+		return this;
+
+	}
+
+	setFromCenterAndSize( center, size ) {
+
+		const halfSize = Box3_vector.copy( size ).multiplyScalar( 0.5 );
+
+		this.min.copy( center ).sub( halfSize );
+		this.max.copy( center ).add( halfSize );
+
+		return this;
+
+	}
+
+	setFromObject( object, precise = false ) {
+
+		this.makeEmpty();
+
+		return this.expandByObject( object, precise );
+
+	}
+
+	clone() {
+
+		return new this.constructor().copy( this );
+
+	}
+
+	copy( box ) {
+
+		this.min.copy( box.min );
+		this.max.copy( box.max );
+
+		return this;
+
+	}
+
+	makeEmpty() {
+
+		this.min.x = this.min.y = this.min.z = + Infinity;
+		this.max.x = this.max.y = this.max.z = - Infinity;
+
+		return this;
+
+	}
+
+	isEmpty() {
+
+		// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes
+
+		return ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z );
+
+	}
+
+	getCenter( target ) {
+
+		return this.isEmpty() ? target.set( 0, 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );
+
+	}
+
+	getSize( target ) {
+
+		return this.isEmpty() ? target.set( 0, 0, 0 ) : target.subVectors( this.max, this.min );
+
+	}
+
+	expandByPoint( point ) {
+
+		this.min.min( point );
+		this.max.max( point );
+
+		return this;
+
+	}
+
+	expandByVector( vector ) {
+
+		this.min.sub( vector );
+		this.max.add( vector );
+
+		return this;
+
+	}
+
+	expandByScalar( scalar ) {
+
+		this.min.addScalar( - scalar );
+		this.max.addScalar( scalar );
+
+		return this;
+
+	}
+
+	expandByObject( object, precise = false ) {
+
+		// Computes the world-axis-aligned bounding box of an object (including its children),
+		// accounting for both the object's, and children's, world transforms
+
+		object.updateWorldMatrix( false, false );
+
+		const geometry = object.geometry;
+
+		if ( geometry !== undefined ) {
+
+			if ( precise && geometry.attributes != undefined && geometry.attributes.position !== undefined ) {
+
+				const position = geometry.attributes.position;
+				for ( let i = 0, l = position.count; i < l; i ++ ) {
+
+					Box3_vector.fromBufferAttribute( position, i ).applyMatrix4( object.matrixWorld );
+					this.expandByPoint( Box3_vector );
+
+				}
+
+			} else {
+
+				if ( geometry.boundingBox === null ) {
+
+					geometry.computeBoundingBox();
+
+				}
+
+				_box.copy( geometry.boundingBox );
+				_box.applyMatrix4( object.matrixWorld );
+
+				this.union( _box );
+
+			}
+
+		}
+
+		const children = object.children;
+
+		for ( let i = 0, l = children.length; i < l; i ++ ) {
+
+			this.expandByObject( children[ i ], precise );
+
+		}
+
+		return this;
+
+	}
+
+	containsPoint( point ) {
+
+		return point.x < this.min.x || point.x > this.max.x ||
+			point.y < this.min.y || point.y > this.max.y ||
+			point.z < this.min.z || point.z > this.max.z ? false : true;
+
+	}
+
+	containsBox( box ) {
+
+		return this.min.x <= box.min.x && box.max.x <= this.max.x &&
+			this.min.y <= box.min.y && box.max.y <= this.max.y &&
+			this.min.z <= box.min.z && box.max.z <= this.max.z;
+
+	}
+
+	getParameter( point, target ) {
+
+		// This can potentially have a divide by zero if the box
+		// has a size dimension of 0.
+
+		return target.set(
+			( point.x - this.min.x ) / ( this.max.x - this.min.x ),
+			( point.y - this.min.y ) / ( this.max.y - this.min.y ),
+			( point.z - this.min.z ) / ( this.max.z - this.min.z )
+		);
+
+	}
+
+	intersectsBox( box ) {
+
+		// using 6 splitting planes to rule out intersections.
+		return box.max.x < this.min.x || box.min.x > this.max.x ||
+			box.max.y < this.min.y || box.min.y > this.max.y ||
+			box.max.z < this.min.z || box.min.z > this.max.z ? false : true;
+
+	}
+
+	intersectsSphere( sphere ) {
+
+		// Find the point on the AABB closest to the sphere center.
+		this.clampPoint( sphere.center, Box3_vector );
+
+		// If that point is inside the sphere, the AABB and sphere intersect.
+		return Box3_vector.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius );
+
+	}
+
+	intersectsPlane( plane ) {
+
+		// We compute the minimum and maximum dot product values. If those values
+		// are on the same side (back or front) of the plane, then there is no intersection.
+
+		let min, max;
+
+		if ( plane.normal.x > 0 ) {
+
+			min = plane.normal.x * this.min.x;
+			max = plane.normal.x * this.max.x;
+
+		} else {
+
+			min = plane.normal.x * this.max.x;
+			max = plane.normal.x * this.min.x;
+
+		}
+
+		if ( plane.normal.y > 0 ) {
+
+			min += plane.normal.y * this.min.y;
+			max += plane.normal.y * this.max.y;
+
+		} else {
+
+			min += plane.normal.y * this.max.y;
+			max += plane.normal.y * this.min.y;
+
+		}
+
+		if ( plane.normal.z > 0 ) {
+
+			min += plane.normal.z * this.min.z;
+			max += plane.normal.z * this.max.z;
+
+		} else {
+
+			min += plane.normal.z * this.max.z;
+			max += plane.normal.z * this.min.z;
+
+		}
+
+		return ( min <= - plane.constant && max >= - plane.constant );
+
+	}
+
+	intersectsTriangle( triangle ) {
+
+		if ( this.isEmpty() ) {
+
+			return false;
+
+		}
+
+		// compute box center and extents
+		this.getCenter( _center );
+		_extents.subVectors( this.max, _center );
+
+		// translate triangle to aabb origin
+		_v0.subVectors( triangle.a, _center );
+		Box3_v1.subVectors( triangle.b, _center );
+		_v2.subVectors( triangle.c, _center );
+
+		// compute edge vectors for triangle
+		_f0.subVectors( Box3_v1, _v0 );
+		_f1.subVectors( _v2, Box3_v1 );
+		_f2.subVectors( _v0, _v2 );
+
+		// test against axes that are given by cross product combinations of the edges of the triangle and the edges of the aabb
+		// make an axis testing of each of the 3 sides of the aabb against each of the 3 sides of the triangle = 9 axis of separation
+		// axis_ij = u_i x f_j (u0, u1, u2 = face normals of aabb = x,y,z axes vectors since aabb is axis aligned)
+		let axes = [
+			0, - _f0.z, _f0.y, 0, - _f1.z, _f1.y, 0, - _f2.z, _f2.y,
+			_f0.z, 0, - _f0.x, _f1.z, 0, - _f1.x, _f2.z, 0, - _f2.x,
+			- _f0.y, _f0.x, 0, - _f1.y, _f1.x, 0, - _f2.y, _f2.x, 0
+		];
+		if ( ! satForAxes( axes, _v0, Box3_v1, _v2, _extents ) ) {
+
+			return false;
+
+		}
+
+		// test 3 face normals from the aabb
+		axes = [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ];
+		if ( ! satForAxes( axes, _v0, Box3_v1, _v2, _extents ) ) {
+
+			return false;
+
+		}
+
+		// finally testing the face normal of the triangle
+		// use already existing triangle edge vectors here
+		_triangleNormal.crossVectors( _f0, _f1 );
+		axes = [ _triangleNormal.x, _triangleNormal.y, _triangleNormal.z ];
+
+		return satForAxes( axes, _v0, Box3_v1, _v2, _extents );
+
+	}
+
+	clampPoint( point, target ) {
+
+		return target.copy( point ).clamp( this.min, this.max );
+
+	}
+
+	distanceToPoint( point ) {
+
+		const clampedPoint = Box3_vector.copy( point ).clamp( this.min, this.max );
+
+		return clampedPoint.sub( point ).length();
+
+	}
+
+	getBoundingSphere( target ) {
+
+		this.getCenter( target.center );
+
+		target.radius = this.getSize( Box3_vector ).length() * 0.5;
+
+		return target;
+
+	}
+
+	intersect( box ) {
+
+		this.min.max( box.min );
+		this.max.min( box.max );
+
+		// ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values.
+		if ( this.isEmpty() ) this.makeEmpty();
+
+		return this;
+
+	}
+
+	union( box ) {
+
+		this.min.min( box.min );
+		this.max.max( box.max );
+
+		return this;
+
+	}
+
+	applyMatrix4( matrix ) {
+
+		// transform of empty box is an empty box.
+		if ( this.isEmpty() ) return this;
+
+		// NOTE: I am using a binary pattern to specify all 2^3 combinations below
+		_points[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000
+		_points[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001
+		_points[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010
+		_points[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011
+		_points[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100
+		_points[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101
+		_points[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110
+		_points[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 111
+
+		this.setFromPoints( _points );
+
+		return this;
+
+	}
+
+	translate( offset ) {
+
+		this.min.add( offset );
+		this.max.add( offset );
+
+		return this;
+
+	}
+
+	equals( box ) {
+
+		return box.min.equals( this.min ) && box.max.equals( this.max );
+
+	}
+
+}
+
+Box3.prototype.isBox3 = true;
+
+const _points = [
+	/*@__PURE__*/ new Vector3(),
+	/*@__PURE__*/ new Vector3(),
+	/*@__PURE__*/ new Vector3(),
+	/*@__PURE__*/ new Vector3(),
+	/*@__PURE__*/ new Vector3(),
+	/*@__PURE__*/ new Vector3(),
+	/*@__PURE__*/ new Vector3(),
+	/*@__PURE__*/ new Vector3()
+];
+
+const Box3_vector = /*@__PURE__*/ new Vector3();
+
+const _box = /*@__PURE__*/ new Box3();
+
+// triangle centered vertices
+
+const _v0 = /*@__PURE__*/ new Vector3();
+const Box3_v1 = /*@__PURE__*/ new Vector3();
+const _v2 = /*@__PURE__*/ new Vector3();
+
+// triangle edge vectors
+
+const _f0 = /*@__PURE__*/ new Vector3();
+const _f1 = /*@__PURE__*/ new Vector3();
+const _f2 = /*@__PURE__*/ new Vector3();
+
+const _center = /*@__PURE__*/ new Vector3();
+const _extents = /*@__PURE__*/ new Vector3();
+const _triangleNormal = /*@__PURE__*/ new Vector3();
+const _testAxis = /*@__PURE__*/ new Vector3();
+
+function satForAxes( axes, v0, v1, v2, extents ) {
+
+	for ( let i = 0, j = axes.length - 3; i <= j; i += 3 ) {
+
+		_testAxis.fromArray( axes, i );
+		// project the aabb onto the seperating axis
+		const r = extents.x * Math.abs( _testAxis.x ) + extents.y * Math.abs( _testAxis.y ) + extents.z * Math.abs( _testAxis.z );
+		// project all 3 vertices of the triangle onto the seperating axis
+		const p0 = v0.dot( _testAxis );
+		const p1 = v1.dot( _testAxis );
+		const p2 = v2.dot( _testAxis );
+		// actual test, basically see if either of the most extreme of the triangle points intersects r
+		if ( Math.max( - Math.max( p0, p1, p2 ), Math.min( p0, p1, p2 ) ) > r ) {
+
+			// points of the projected triangle are outside the projected half-length of the aabb
+			// the axis is seperating and we can exit
+			return false;
+
+		}
+
+	}
+
+	return true;
+
+}
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/math/Sphere.js
+
+
+
+const Sphere_box = /*@__PURE__*/ new Box3();
+const Sphere_v1 = /*@__PURE__*/ new Vector3();
+const _toFarthestPoint = /*@__PURE__*/ new Vector3();
+const _toPoint = /*@__PURE__*/ new Vector3();
+
+class Sphere {
+
+	constructor( center = new Vector3(), radius = - 1 ) {
+
+		this.center = center;
+		this.radius = radius;
+
+	}
+
+	set( center, radius ) {
+
+		this.center.copy( center );
+		this.radius = radius;
+
+		return this;
+
+	}
+
+	setFromPoints( points, optionalCenter ) {
+
+		const center = this.center;
+
+		if ( optionalCenter !== undefined ) {
+
+			center.copy( optionalCenter );
+
+		} else {
+
+			Sphere_box.setFromPoints( points ).getCenter( center );
+
+		}
+
+		let maxRadiusSq = 0;
+
+		for ( let i = 0, il = points.length; i < il; i ++ ) {
+
+			maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) );
+
+		}
+
+		this.radius = Math.sqrt( maxRadiusSq );
+
+		return this;
+
+	}
+
+	copy( sphere ) {
+
+		this.center.copy( sphere.center );
+		this.radius = sphere.radius;
+
+		return this;
+
+	}
+
+	isEmpty() {
+
+		return ( this.radius < 0 );
+
+	}
+
+	makeEmpty() {
+
+		this.center.set( 0, 0, 0 );
+		this.radius = - 1;
+
+		return this;
+
+	}
+
+	containsPoint( point ) {
+
+		return ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) );
+
+	}
+
+	distanceToPoint( point ) {
+
+		return ( point.distanceTo( this.center ) - this.radius );
+
+	}
+
+	intersectsSphere( sphere ) {
+
+		const radiusSum = this.radius + sphere.radius;
+
+		return sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum );
+
+	}
+
+	intersectsBox( box ) {
+
+		return box.intersectsSphere( this );
+
+	}
+
+	intersectsPlane( plane ) {
+
+		return Math.abs( plane.distanceToPoint( this.center ) ) <= this.radius;
+
+	}
+
+	clampPoint( point, target ) {
+
+		const deltaLengthSq = this.center.distanceToSquared( point );
+
+		target.copy( point );
+
+		if ( deltaLengthSq > ( this.radius * this.radius ) ) {
+
+			target.sub( this.center ).normalize();
+			target.multiplyScalar( this.radius ).add( this.center );
+
+		}
+
+		return target;
+
+	}
+
+	getBoundingBox( target ) {
+
+		if ( this.isEmpty() ) {
+
+			// Empty sphere produces empty bounding box
+			target.makeEmpty();
+			return target;
+
+		}
+
+		target.set( this.center, this.center );
+		target.expandByScalar( this.radius );
+
+		return target;
+
+	}
+
+	applyMatrix4( matrix ) {
+
+		this.center.applyMatrix4( matrix );
+		this.radius = this.radius * matrix.getMaxScaleOnAxis();
+
+		return this;
+
+	}
+
+	translate( offset ) {
+
+		this.center.add( offset );
+
+		return this;
+
+	}
+
+	expandByPoint( point ) {
+
+		// from https://github.com/juj/MathGeoLib/blob/2940b99b99cfe575dd45103ef20f4019dee15b54/src/Geometry/Sphere.cpp#L649-L671
+
+		_toPoint.subVectors( point, this.center );
+
+		const lengthSq = _toPoint.lengthSq();
+
+		if ( lengthSq > ( this.radius * this.radius ) ) {
+
+			const length = Math.sqrt( lengthSq );
+			const missingRadiusHalf = ( length - this.radius ) * 0.5;
+
+			// Nudge this sphere towards the target point. Add half the missing distance to radius,
+			// and the other half to position. This gives a tighter enclosure, instead of if
+			// the whole missing distance were just added to radius.
+
+			this.center.add( _toPoint.multiplyScalar( missingRadiusHalf / length ) );
+			this.radius += missingRadiusHalf;
+
+		}
+
+		return this;
+
+	}
+
+	union( sphere ) {
+
+		// from https://github.com/juj/MathGeoLib/blob/2940b99b99cfe575dd45103ef20f4019dee15b54/src/Geometry/Sphere.cpp#L759-L769
+
+		// To enclose another sphere into this sphere, we only need to enclose two points:
+		// 1) Enclose the farthest point on the other sphere into this sphere.
+		// 2) Enclose the opposite point of the farthest point into this sphere.
+
+		 if ( this.center.equals( sphere.center ) === true ) {
+
+			 _toFarthestPoint.set( 0, 0, 1 ).multiplyScalar( sphere.radius );
+
+
+		} else {
+
+			_toFarthestPoint.subVectors( sphere.center, this.center ).normalize().multiplyScalar( sphere.radius );
+
+		}
+
+		this.expandByPoint( Sphere_v1.copy( sphere.center ).add( _toFarthestPoint ) );
+		this.expandByPoint( Sphere_v1.copy( sphere.center ).sub( _toFarthestPoint ) );
+
+		return this;
+
+	}
+
+	equals( sphere ) {
+
+		return sphere.center.equals( this.center ) && ( sphere.radius === this.radius );
+
+	}
+
+	clone() {
+
+		return new this.constructor().copy( this );
+
+	}
+
+}
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/math/Plane.js
+
+
+
+const _vector1 = /*@__PURE__*/ new Vector3();
+const _vector2 = /*@__PURE__*/ new Vector3();
+const _normalMatrix = /*@__PURE__*/ new Matrix3();
+
+class Plane {
+
+	constructor( normal = new Vector3( 1, 0, 0 ), constant = 0 ) {
+
+		// normal is assumed to be normalized
+
+		this.normal = normal;
+		this.constant = constant;
+
+	}
+
+	set( normal, constant ) {
+
+		this.normal.copy( normal );
+		this.constant = constant;
+
+		return this;
+
+	}
+
+	setComponents( x, y, z, w ) {
+
+		this.normal.set( x, y, z );
+		this.constant = w;
+
+		return this;
+
+	}
+
+	setFromNormalAndCoplanarPoint( normal, point ) {
+
+		this.normal.copy( normal );
+		this.constant = - point.dot( this.normal );
+
+		return this;
+
+	}
+
+	setFromCoplanarPoints( a, b, c ) {
+
+		const normal = _vector1.subVectors( c, b ).cross( _vector2.subVectors( a, b ) ).normalize();
+
+		// Q: should an error be thrown if normal is zero (e.g. degenerate plane)?
+
+		this.setFromNormalAndCoplanarPoint( normal, a );
+
+		return this;
+
+	}
+
+	copy( plane ) {
+
+		this.normal.copy( plane.normal );
+		this.constant = plane.constant;
+
+		return this;
+
+	}
+
+	normalize() {
+
+		// Note: will lead to a divide by zero if the plane is invalid.
+
+		const inverseNormalLength = 1.0 / this.normal.length();
+		this.normal.multiplyScalar( inverseNormalLength );
+		this.constant *= inverseNormalLength;
+
+		return this;
+
+	}
+
+	negate() {
+
+		this.constant *= - 1;
+		this.normal.negate();
+
+		return this;
+
+	}
+
+	distanceToPoint( point ) {
+
+		return this.normal.dot( point ) + this.constant;
+
+	}
+
+	distanceToSphere( sphere ) {
+
+		return this.distanceToPoint( sphere.center ) - sphere.radius;
+
+	}
+
+	projectPoint( point, target ) {
+
+		return target.copy( this.normal ).multiplyScalar( - this.distanceToPoint( point ) ).add( point );
+
+	}
+
+	intersectLine( line, target ) {
+
+		const direction = line.delta( _vector1 );
+
+		const denominator = this.normal.dot( direction );
+
+		if ( denominator === 0 ) {
+
+			// line is coplanar, return origin
+			if ( this.distanceToPoint( line.start ) === 0 ) {
+
+				return target.copy( line.start );
+
+			}
+
+			// Unsure if this is the correct method to handle this case.
+			return null;
+
+		}
+
+		const t = - ( line.start.dot( this.normal ) + this.constant ) / denominator;
+
+		if ( t < 0 || t > 1 ) {
+
+			return null;
+
+		}
+
+		return target.copy( direction ).multiplyScalar( t ).add( line.start );
+
+	}
+
+	intersectsLine( line ) {
+
+		// Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it.
+
+		const startSign = this.distanceToPoint( line.start );
+		const endSign = this.distanceToPoint( line.end );
+
+		return ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 );
+
+	}
+
+	intersectsBox( box ) {
+
+		return box.intersectsPlane( this );
+
+	}
+
+	intersectsSphere( sphere ) {
+
+		return sphere.intersectsPlane( this );
+
+	}
+
+	coplanarPoint( target ) {
+
+		return target.copy( this.normal ).multiplyScalar( - this.constant );
+
+	}
+
+	applyMatrix4( matrix, optionalNormalMatrix ) {
+
+		const normalMatrix = optionalNormalMatrix || _normalMatrix.getNormalMatrix( matrix );
+
+		const referencePoint = this.coplanarPoint( _vector1 ).applyMatrix4( matrix );
+
+		const normal = this.normal.applyMatrix3( normalMatrix ).normalize();
+
+		this.constant = - referencePoint.dot( normal );
+
+		return this;
+
+	}
+
+	translate( offset ) {
+
+		this.constant -= offset.dot( this.normal );
+
+		return this;
+
+	}
+
+	equals( plane ) {
+
+		return plane.normal.equals( this.normal ) && ( plane.constant === this.constant );
+
+	}
+
+	clone() {
+
+		return new this.constructor().copy( this );
+
+	}
+
+}
+
+Plane.prototype.isPlane = true;
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/math/Frustum.js
+
+
+
+
+const _sphere = /*@__PURE__*/ new Sphere();
+const Frustum_vector = /*@__PURE__*/ new Vector3();
+
+class Frustum {
+
+	constructor( p0 = new Plane(), p1 = new Plane(), p2 = new Plane(), p3 = new Plane(), p4 = new Plane(), p5 = new Plane() ) {
+
+		this.planes = [ p0, p1, p2, p3, p4, p5 ];
+
+	}
+
+	set( p0, p1, p2, p3, p4, p5 ) {
+
+		const planes = this.planes;
+
+		planes[ 0 ].copy( p0 );
+		planes[ 1 ].copy( p1 );
+		planes[ 2 ].copy( p2 );
+		planes[ 3 ].copy( p3 );
+		planes[ 4 ].copy( p4 );
+		planes[ 5 ].copy( p5 );
+
+		return this;
+
+	}
+
+	copy( frustum ) {
+
+		const planes = this.planes;
+
+		for ( let i = 0; i < 6; i ++ ) {
+
+			planes[ i ].copy( frustum.planes[ i ] );
+
+		}
+
+		return this;
+
+	}
+
+	setFromProjectionMatrix( m ) {
+
+		const planes = this.planes;
+		const me = m.elements;
+		const me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ];
+		const me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ];
+		const me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ];
+		const me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ];
+
+		planes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize();
+		planes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();
+		planes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();
+		planes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();
+		planes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize();
+		planes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize();
+
+		return this;
+
+	}
+
+	intersectsObject( object ) {
+
+		const geometry = object.geometry;
+
+		if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();
+
+		_sphere.copy( geometry.boundingSphere ).applyMatrix4( object.matrixWorld );
+
+		return this.intersectsSphere( _sphere );
+
+	}
+
+	intersectsSprite( sprite ) {
+
+		_sphere.center.set( 0, 0, 0 );
+		_sphere.radius = 0.7071067811865476;
+		_sphere.applyMatrix4( sprite.matrixWorld );
+
+		return this.intersectsSphere( _sphere );
+
+	}
+
+	intersectsSphere( sphere ) {
+
+		const planes = this.planes;
+		const center = sphere.center;
+		const negRadius = - sphere.radius;
+
+		for ( let i = 0; i < 6; i ++ ) {
+
+			const distance = planes[ i ].distanceToPoint( center );
+
+			if ( distance < negRadius ) {
+
+				return false;
+
+			}
+
+		}
+
+		return true;
+
+	}
+
+	intersectsBox( box ) {
+
+		const planes = this.planes;
+
+		for ( let i = 0; i < 6; i ++ ) {
+
+			const plane = planes[ i ];
+
+			// corner at max distance
+
+			Frustum_vector.x = plane.normal.x > 0 ? box.max.x : box.min.x;
+			Frustum_vector.y = plane.normal.y > 0 ? box.max.y : box.min.y;
+			Frustum_vector.z = plane.normal.z > 0 ? box.max.z : box.min.z;
+
+			if ( plane.distanceToPoint( Frustum_vector ) < 0 ) {
+
+				return false;
+
+			}
+
+		}
+
+		return true;
+
+	}
+
+	containsPoint( point ) {
+
+		const planes = this.planes;
+
+		for ( let i = 0; i < 6; i ++ ) {
+
+			if ( planes[ i ].distanceToPoint( point ) < 0 ) {
+
+				return false;
+
+			}
+
+		}
+
+		return true;
+
+	}
+
+	clone() {
+
+		return new this.constructor().copy( this );
+
+	}
+
+}
+
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/math/Vector4.js
+class Vector4 {
+
+	constructor( x = 0, y = 0, z = 0, w = 1 ) {
+
+		this.x = x;
+		this.y = y;
+		this.z = z;
+		this.w = w;
+
+	}
+
+	get width() {
+
+		return this.z;
+
+	}
+
+	set width( value ) {
+
+		this.z = value;
+
+	}
+
+	get height() {
+
+		return this.w;
+
+	}
+
+	set height( value ) {
+
+		this.w = value;
+
+	}
+
+	set( x, y, z, w ) {
+
+		this.x = x;
+		this.y = y;
+		this.z = z;
+		this.w = w;
+
+		return this;
+
+	}
+
+	setScalar( scalar ) {
+
+		this.x = scalar;
+		this.y = scalar;
+		this.z = scalar;
+		this.w = scalar;
+
+		return this;
+
+	}
+
+	setX( x ) {
+
+		this.x = x;
+
+		return this;
+
+	}
+
+	setY( y ) {
+
+		this.y = y;
+
+		return this;
+
+	}
+
+	setZ( z ) {
+
+		this.z = z;
+
+		return this;
+
+	}
+
+	setW( w ) {
+
+		this.w = w;
+
+		return this;
+
+	}
+
+	setComponent( index, value ) {
+
+		switch ( index ) {
+
+			case 0: this.x = value; break;
+			case 1: this.y = value; break;
+			case 2: this.z = value; break;
+			case 3: this.w = value; break;
+			default: throw new Error( 'index is out of range: ' + index );
+
+		}
+
+		return this;
+
+	}
+
+	getComponent( index ) {
+
+		switch ( index ) {
+
+			case 0: return this.x;
+			case 1: return this.y;
+			case 2: return this.z;
+			case 3: return this.w;
+			default: throw new Error( 'index is out of range: ' + index );
+
+		}
+
+	}
+
+	clone() {
+
+		return new this.constructor( this.x, this.y, this.z, this.w );
+
+	}
+
+	copy( v ) {
+
+		this.x = v.x;
+		this.y = v.y;
+		this.z = v.z;
+		this.w = ( v.w !== undefined ) ? v.w : 1;
+
+		return this;
+
+	}
+
+	add( v, w ) {
+
+		if ( w !== undefined ) {
+
+			console.warn( 'THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );
+			return this.addVectors( v, w );
+
+		}
+
+		this.x += v.x;
+		this.y += v.y;
+		this.z += v.z;
+		this.w += v.w;
+
+		return this;
+
+	}
+
+	addScalar( s ) {
+
+		this.x += s;
+		this.y += s;
+		this.z += s;
+		this.w += s;
+
+		return this;
+
+	}
+
+	addVectors( a, b ) {
+
+		this.x = a.x + b.x;
+		this.y = a.y + b.y;
+		this.z = a.z + b.z;
+		this.w = a.w + b.w;
+
+		return this;
+
+	}
+
+	addScaledVector( v, s ) {
+
+		this.x += v.x * s;
+		this.y += v.y * s;
+		this.z += v.z * s;
+		this.w += v.w * s;
+
+		return this;
+
+	}
+
+	sub( v, w ) {
+
+		if ( w !== undefined ) {
+
+			console.warn( 'THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );
+			return this.subVectors( v, w );
+
+		}
+
+		this.x -= v.x;
+		this.y -= v.y;
+		this.z -= v.z;
+		this.w -= v.w;
+
+		return this;
+
+	}
+
+	subScalar( s ) {
+
+		this.x -= s;
+		this.y -= s;
+		this.z -= s;
+		this.w -= s;
+
+		return this;
+
+	}
+
+	subVectors( a, b ) {
+
+		this.x = a.x - b.x;
+		this.y = a.y - b.y;
+		this.z = a.z - b.z;
+		this.w = a.w - b.w;
+
+		return this;
+
+	}
+
+	multiply( v ) {
+
+		this.x *= v.x;
+		this.y *= v.y;
+		this.z *= v.z;
+		this.w *= v.w;
+
+		return this;
+
+	}
+
+	multiplyScalar( scalar ) {
+
+		this.x *= scalar;
+		this.y *= scalar;
+		this.z *= scalar;
+		this.w *= scalar;
+
+		return this;
+
+	}
+
+	applyMatrix4( m ) {
+
+		const x = this.x, y = this.y, z = this.z, w = this.w;
+		const e = m.elements;
+
+		this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w;
+		this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w;
+		this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w;
+		this.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w;
+
+		return this;
+
+	}
+
+	divideScalar( scalar ) {
+
+		return this.multiplyScalar( 1 / scalar );
+
+	}
+
+	setAxisAngleFromQuaternion( q ) {
+
+		// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm
+
+		// q is assumed to be normalized
+
+		this.w = 2 * Math.acos( q.w );
+
+		const s = Math.sqrt( 1 - q.w * q.w );
+
+		if ( s < 0.0001 ) {
+
+			this.x = 1;
+			this.y = 0;
+			this.z = 0;
+
+		} else {
+
+			this.x = q.x / s;
+			this.y = q.y / s;
+			this.z = q.z / s;
+
+		}
+
+		return this;
+
+	}
+
+	setAxisAngleFromRotationMatrix( m ) {
+
+		// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm
+
+		// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)
+
+		let angle, x, y, z; // variables for result
+		const epsilon = 0.01,		// margin to allow for rounding errors
+			epsilon2 = 0.1,		// margin to distinguish between 0 and 180 degrees
+
+			te = m.elements,
+
+			m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],
+			m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],
+			m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];
+
+		if ( ( Math.abs( m12 - m21 ) < epsilon ) &&
+		     ( Math.abs( m13 - m31 ) < epsilon ) &&
+		     ( Math.abs( m23 - m32 ) < epsilon ) ) {
+
+			// singularity found
+			// first check for identity matrix which must have +1 for all terms
+			// in leading diagonal and zero in other terms
+
+			if ( ( Math.abs( m12 + m21 ) < epsilon2 ) &&
+			     ( Math.abs( m13 + m31 ) < epsilon2 ) &&
+			     ( Math.abs( m23 + m32 ) < epsilon2 ) &&
+			     ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) {
+
+				// this singularity is identity matrix so angle = 0
+
+				this.set( 1, 0, 0, 0 );
+
+				return this; // zero angle, arbitrary axis
+
+			}
+
+			// otherwise this singularity is angle = 180
+
+			angle = Math.PI;
+
+			const xx = ( m11 + 1 ) / 2;
+			const yy = ( m22 + 1 ) / 2;
+			const zz = ( m33 + 1 ) / 2;
+			const xy = ( m12 + m21 ) / 4;
+			const xz = ( m13 + m31 ) / 4;
+			const yz = ( m23 + m32 ) / 4;
+
+			if ( ( xx > yy ) && ( xx > zz ) ) {
+
+				// m11 is the largest diagonal term
+
+				if ( xx < epsilon ) {
+
+					x = 0;
+					y = 0.707106781;
+					z = 0.707106781;
+
+				} else {
+
+					x = Math.sqrt( xx );
+					y = xy / x;
+					z = xz / x;
+
+				}
+
+			} else if ( yy > zz ) {
+
+				// m22 is the largest diagonal term
+
+				if ( yy < epsilon ) {
+
+					x = 0.707106781;
+					y = 0;
+					z = 0.707106781;
+
+				} else {
+
+					y = Math.sqrt( yy );
+					x = xy / y;
+					z = yz / y;
+
+				}
+
+			} else {
+
+				// m33 is the largest diagonal term so base result on this
+
+				if ( zz < epsilon ) {
+
+					x = 0.707106781;
+					y = 0.707106781;
+					z = 0;
+
+				} else {
+
+					z = Math.sqrt( zz );
+					x = xz / z;
+					y = yz / z;
+
+				}
+
+			}
+
+			this.set( x, y, z, angle );
+
+			return this; // return 180 deg rotation
+
+		}
+
+		// as we have reached here there are no singularities so we can handle normally
+
+		let s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) +
+			( m13 - m31 ) * ( m13 - m31 ) +
+			( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize
+
+		if ( Math.abs( s ) < 0.001 ) s = 1;
+
+		// prevent divide by zero, should not happen if matrix is orthogonal and should be
+		// caught by singularity test above, but I've left it in just in case
+
+		this.x = ( m32 - m23 ) / s;
+		this.y = ( m13 - m31 ) / s;
+		this.z = ( m21 - m12 ) / s;
+		this.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 );
+
+		return this;
+
+	}
+
+	min( v ) {
+
+		this.x = Math.min( this.x, v.x );
+		this.y = Math.min( this.y, v.y );
+		this.z = Math.min( this.z, v.z );
+		this.w = Math.min( this.w, v.w );
+
+		return this;
+
+	}
+
+	max( v ) {
+
+		this.x = Math.max( this.x, v.x );
+		this.y = Math.max( this.y, v.y );
+		this.z = Math.max( this.z, v.z );
+		this.w = Math.max( this.w, v.w );
+
+		return this;
+
+	}
+
+	clamp( min, max ) {
+
+		// assumes min < max, componentwise
+
+		this.x = Math.max( min.x, Math.min( max.x, this.x ) );
+		this.y = Math.max( min.y, Math.min( max.y, this.y ) );
+		this.z = Math.max( min.z, Math.min( max.z, this.z ) );
+		this.w = Math.max( min.w, Math.min( max.w, this.w ) );
+
+		return this;
+
+	}
+
+	clampScalar( minVal, maxVal ) {
+
+		this.x = Math.max( minVal, Math.min( maxVal, this.x ) );
+		this.y = Math.max( minVal, Math.min( maxVal, this.y ) );
+		this.z = Math.max( minVal, Math.min( maxVal, this.z ) );
+		this.w = Math.max( minVal, Math.min( maxVal, this.w ) );
+
+		return this;
+
+	}
+
+	clampLength( min, max ) {
+
+		const length = this.length();
+
+		return this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );
+
+	}
+
+	floor() {
+
+		this.x = Math.floor( this.x );
+		this.y = Math.floor( this.y );
+		this.z = Math.floor( this.z );
+		this.w = Math.floor( this.w );
+
+		return this;
+
+	}
+
+	ceil() {
+
+		this.x = Math.ceil( this.x );
+		this.y = Math.ceil( this.y );
+		this.z = Math.ceil( this.z );
+		this.w = Math.ceil( this.w );
+
+		return this;
+
+	}
+
+	round() {
+
+		this.x = Math.round( this.x );
+		this.y = Math.round( this.y );
+		this.z = Math.round( this.z );
+		this.w = Math.round( this.w );
+
+		return this;
+
+	}
+
+	roundToZero() {
+
+		this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );
+		this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );
+		this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );
+		this.w = ( this.w < 0 ) ? Math.ceil( this.w ) : Math.floor( this.w );
+
+		return this;
+
+	}
+
+	negate() {
+
+		this.x = - this.x;
+		this.y = - this.y;
+		this.z = - this.z;
+		this.w = - this.w;
+
+		return this;
+
+	}
+
+	dot( v ) {
+
+		return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;
+
+	}
+
+	lengthSq() {
+
+		return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;
+
+	}
+
+	length() {
+
+		return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );
+
+	}
+
+	manhattanLength() {
+
+		return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w );
+
+	}
+
+	normalize() {
+
+		return this.divideScalar( this.length() || 1 );
+
+	}
+
+	setLength( length ) {
+
+		return this.normalize().multiplyScalar( length );
+
+	}
+
+	lerp( v, alpha ) {
+
+		this.x += ( v.x - this.x ) * alpha;
+		this.y += ( v.y - this.y ) * alpha;
+		this.z += ( v.z - this.z ) * alpha;
+		this.w += ( v.w - this.w ) * alpha;
+
+		return this;
+
+	}
+
+	lerpVectors( v1, v2, alpha ) {
+
+		this.x = v1.x + ( v2.x - v1.x ) * alpha;
+		this.y = v1.y + ( v2.y - v1.y ) * alpha;
+		this.z = v1.z + ( v2.z - v1.z ) * alpha;
+		this.w = v1.w + ( v2.w - v1.w ) * alpha;
+
+		return this;
+
+	}
+
+	equals( v ) {
+
+		return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) );
+
+	}
+
+	fromArray( array, offset = 0 ) {
+
+		this.x = array[ offset ];
+		this.y = array[ offset + 1 ];
+		this.z = array[ offset + 2 ];
+		this.w = array[ offset + 3 ];
+
+		return this;
+
+	}
+
+	toArray( array = [], offset = 0 ) {
+
+		array[ offset ] = this.x;
+		array[ offset + 1 ] = this.y;
+		array[ offset + 2 ] = this.z;
+		array[ offset + 3 ] = this.w;
+
+		return array;
+
+	}
+
+	fromBufferAttribute( attribute, index, offset ) {
+
+		if ( offset !== undefined ) {
+
+			console.warn( 'THREE.Vector4: offset has been removed from .fromBufferAttribute().' );
+
+		}
+
+		this.x = attribute.getX( index );
+		this.y = attribute.getY( index );
+		this.z = attribute.getZ( index );
+		this.w = attribute.getW( index );
+
+		return this;
+
+	}
+
+	random() {
+
+		this.x = Math.random();
+		this.y = Math.random();
+		this.z = Math.random();
+		this.w = Math.random();
+
+		return this;
+
+	}
+
+	*[ Symbol.iterator ]() {
+
+		yield this.x;
+		yield this.y;
+		yield this.z;
+		yield this.w;
+
+	}
+
+}
+
+Vector4.prototype.isVector4 = true;
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/webgl/WebGLAnimation.js
+function WebGLAnimation() {
+
+	let context = null;
+	let isAnimating = false;
+	let animationLoop = null;
+	let requestId = null;
+
+	function onAnimationFrame( time, frame ) {
+
+		animationLoop( time, frame );
+
+		requestId = context.requestAnimationFrame( onAnimationFrame );
+
+	}
+
+	return {
+
+		start: function () {
+
+			if ( isAnimating === true ) return;
+			if ( animationLoop === null ) return;
+
+			requestId = context.requestAnimationFrame( onAnimationFrame );
+
+			isAnimating = true;
+
+		},
+
+		stop: function () {
+
+			context.cancelAnimationFrame( requestId );
+
+			isAnimating = false;
+
+		},
+
+		setAnimationLoop: function ( callback ) {
+
+			animationLoop = callback;
+
+		},
+
+		setContext: function ( value ) {
+
+			context = value;
+
+		}
+
+	};
+
+}
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/webgl/WebGLAttributes.js
+function WebGLAttributes( gl, capabilities ) {
+
+	const isWebGL2 = capabilities.isWebGL2;
+
+	const buffers = new WeakMap();
+
+	function createBuffer( attribute, bufferType ) {
+
+		const array = attribute.array;
+		const usage = attribute.usage;
+
+		const buffer = gl.createBuffer();
+
+		gl.bindBuffer( bufferType, buffer );
+		gl.bufferData( bufferType, array, usage );
+
+		attribute.onUploadCallback();
+
+		let type = gl.FLOAT;
+
+		if ( array instanceof Float32Array ) {
+
+			type = gl.FLOAT;
+
+		} else if ( array instanceof Float64Array ) {
+
+			console.warn( 'THREE.WebGLAttributes: Unsupported data buffer format: Float64Array.' );
+
+		} else if ( array instanceof Uint16Array ) {
+
+			if ( attribute.isFloat16BufferAttribute ) {
+
+				if ( isWebGL2 ) {
+
+					type = gl.HALF_FLOAT;
+
+				} else {
+
+					console.warn( 'THREE.WebGLAttributes: Usage of Float16BufferAttribute requires WebGL2.' );
+
+				}
+
+			} else {
+
+				type = gl.UNSIGNED_SHORT;
+
+			}
+
+		} else if ( array instanceof Int16Array ) {
+
+			type = gl.SHORT;
+
+		} else if ( array instanceof Uint32Array ) {
+
+			type = gl.UNSIGNED_INT;
+
+		} else if ( array instanceof Int32Array ) {
+
+			type = gl.INT;
+
+		} else if ( array instanceof Int8Array ) {
+
+			type = gl.BYTE;
+
+		} else if ( array instanceof Uint8Array ) {
+
+			type = gl.UNSIGNED_BYTE;
+
+		} else if ( array instanceof Uint8ClampedArray ) {
+
+			type = gl.UNSIGNED_BYTE;
+
+		}
+
+		return {
+			buffer: buffer,
+			type: type,
+			bytesPerElement: array.BYTES_PER_ELEMENT,
+			version: attribute.version
+		};
+
+	}
+
+	function updateBuffer( buffer, attribute, bufferType ) {
+
+		const array = attribute.array;
+		const updateRange = attribute.updateRange;
+
+		gl.bindBuffer( bufferType, buffer );
+
+		if ( updateRange.count === - 1 ) {
+
+			// Not using update ranges
+
+			gl.bufferSubData( bufferType, 0, array );
+
+		} else {
+
+			if ( isWebGL2 ) {
+
+				gl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT,
+					array, updateRange.offset, updateRange.count );
+
+			} else {
+
+				gl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT,
+					array.subarray( updateRange.offset, updateRange.offset + updateRange.count ) );
+
+			}
+
+			updateRange.count = - 1; // reset range
+
+		}
+
+	}
+
+	//
+
+	function get( attribute ) {
+
+		if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;
+
+		return buffers.get( attribute );
+
+	}
+
+	function remove( attribute ) {
+
+		if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;
+
+		const data = buffers.get( attribute );
+
+		if ( data ) {
+
+			gl.deleteBuffer( data.buffer );
+
+			buffers.delete( attribute );
+
+		}
+
+	}
+
+	function update( attribute, bufferType ) {
+
+		if ( attribute.isGLBufferAttribute ) {
+
+			const cached = buffers.get( attribute );
+
+			if ( ! cached || cached.version < attribute.version ) {
+
+				buffers.set( attribute, {
+					buffer: attribute.buffer,
+					type: attribute.type,
+					bytesPerElement: attribute.elementSize,
+					version: attribute.version
+				} );
+
+			}
+
+			return;
+
+		}
+
+		if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;
+
+		const data = buffers.get( attribute );
+
+		if ( data === undefined ) {
+
+			buffers.set( attribute, createBuffer( attribute, bufferType ) );
+
+		} else if ( data.version < attribute.version ) {
+
+			updateBuffer( data.buffer, attribute, bufferType );
+
+			data.version = attribute.version;
+
+		}
+
+	}
+
+	return {
+
+		get: get,
+		remove: remove,
+		update: update
+
+	};
+
+}
+
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/math/Vector2.js
+class Vector2 {
+
+	constructor( x = 0, y = 0 ) {
+
+		this.x = x;
+		this.y = y;
+
+	}
+
+	get width() {
+
+		return this.x;
+
+	}
+
+	set width( value ) {
+
+		this.x = value;
+
+	}
+
+	get height() {
+
+		return this.y;
+
+	}
+
+	set height( value ) {
+
+		this.y = value;
+
+	}
+
+	set( x, y ) {
+
+		this.x = x;
+		this.y = y;
+
+		return this;
+
+	}
+
+	setScalar( scalar ) {
+
+		this.x = scalar;
+		this.y = scalar;
+
+		return this;
+
+	}
+
+	setX( x ) {
+
+		this.x = x;
+
+		return this;
+
+	}
+
+	setY( y ) {
+
+		this.y = y;
+
+		return this;
+
+	}
+
+	setComponent( index, value ) {
+
+		switch ( index ) {
+
+			case 0: this.x = value; break;
+			case 1: this.y = value; break;
+			default: throw new Error( 'index is out of range: ' + index );
+
+		}
+
+		return this;
+
+	}
+
+	getComponent( index ) {
+
+		switch ( index ) {
+
+			case 0: return this.x;
+			case 1: return this.y;
+			default: throw new Error( 'index is out of range: ' + index );
+
+		}
+
+	}
+
+	clone() {
+
+		return new this.constructor( this.x, this.y );
+
+	}
+
+	copy( v ) {
+
+		this.x = v.x;
+		this.y = v.y;
+
+		return this;
+
+	}
+
+	add( v, w ) {
+
+		if ( w !== undefined ) {
+
+			console.warn( 'THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );
+			return this.addVectors( v, w );
+
+		}
+
+		this.x += v.x;
+		this.y += v.y;
+
+		return this;
+
+	}
+
+	addScalar( s ) {
+
+		this.x += s;
+		this.y += s;
+
+		return this;
+
+	}
+
+	addVectors( a, b ) {
+
+		this.x = a.x + b.x;
+		this.y = a.y + b.y;
+
+		return this;
+
+	}
+
+	addScaledVector( v, s ) {
+
+		this.x += v.x * s;
+		this.y += v.y * s;
+
+		return this;
+
+	}
+
+	sub( v, w ) {
+
+		if ( w !== undefined ) {
+
+			console.warn( 'THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );
+			return this.subVectors( v, w );
+
+		}
+
+		this.x -= v.x;
+		this.y -= v.y;
+
+		return this;
+
+	}
+
+	subScalar( s ) {
+
+		this.x -= s;
+		this.y -= s;
+
+		return this;
+
+	}
+
+	subVectors( a, b ) {
+
+		this.x = a.x - b.x;
+		this.y = a.y - b.y;
+
+		return this;
+
+	}
+
+	multiply( v ) {
+
+		this.x *= v.x;
+		this.y *= v.y;
+
+		return this;
+
+	}
+
+	multiplyScalar( scalar ) {
+
+		this.x *= scalar;
+		this.y *= scalar;
+
+		return this;
+
+	}
+
+	divide( v ) {
+
+		this.x /= v.x;
+		this.y /= v.y;
+
+		return this;
+
+	}
+
+	divideScalar( scalar ) {
+
+		return this.multiplyScalar( 1 / scalar );
+
+	}
+
+	applyMatrix3( m ) {
+
+		const x = this.x, y = this.y;
+		const e = m.elements;
+
+		this.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ];
+		this.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ];
+
+		return this;
+
+	}
+
+	min( v ) {
+
+		this.x = Math.min( this.x, v.x );
+		this.y = Math.min( this.y, v.y );
+
+		return this;
+
+	}
+
+	max( v ) {
+
+		this.x = Math.max( this.x, v.x );
+		this.y = Math.max( this.y, v.y );
+
+		return this;
+
+	}
+
+	clamp( min, max ) {
+
+		// assumes min < max, componentwise
+
+		this.x = Math.max( min.x, Math.min( max.x, this.x ) );
+		this.y = Math.max( min.y, Math.min( max.y, this.y ) );
+
+		return this;
+
+	}
+
+	clampScalar( minVal, maxVal ) {
+
+		this.x = Math.max( minVal, Math.min( maxVal, this.x ) );
+		this.y = Math.max( minVal, Math.min( maxVal, this.y ) );
+
+		return this;
+
+	}
+
+	clampLength( min, max ) {
+
+		const length = this.length();
+
+		return this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );
+
+	}
+
+	floor() {
+
+		this.x = Math.floor( this.x );
+		this.y = Math.floor( this.y );
+
+		return this;
+
+	}
+
+	ceil() {
+
+		this.x = Math.ceil( this.x );
+		this.y = Math.ceil( this.y );
+
+		return this;
+
+	}
+
+	round() {
+
+		this.x = Math.round( this.x );
+		this.y = Math.round( this.y );
+
+		return this;
+
+	}
+
+	roundToZero() {
+
+		this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );
+		this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );
+
+		return this;
+
+	}
+
+	negate() {
+
+		this.x = - this.x;
+		this.y = - this.y;
+
+		return this;
+
+	}
+
+	dot( v ) {
+
+		return this.x * v.x + this.y * v.y;
+
+	}
+
+	cross( v ) {
+
+		return this.x * v.y - this.y * v.x;
+
+	}
+
+	lengthSq() {
+
+		return this.x * this.x + this.y * this.y;
+
+	}
+
+	length() {
+
+		return Math.sqrt( this.x * this.x + this.y * this.y );
+
+	}
+
+	manhattanLength() {
+
+		return Math.abs( this.x ) + Math.abs( this.y );
+
+	}
+
+	normalize() {
+
+		return this.divideScalar( this.length() || 1 );
+
+	}
+
+	angle() {
+
+		// computes the angle in radians with respect to the positive x-axis
+
+		const angle = Math.atan2( - this.y, - this.x ) + Math.PI;
+
+		return angle;
+
+	}
+
+	distanceTo( v ) {
+
+		return Math.sqrt( this.distanceToSquared( v ) );
+
+	}
+
+	distanceToSquared( v ) {
+
+		const dx = this.x - v.x, dy = this.y - v.y;
+		return dx * dx + dy * dy;
+
+	}
+
+	manhattanDistanceTo( v ) {
+
+		return Math.abs( this.x - v.x ) + Math.abs( this.y - v.y );
+
+	}
+
+	setLength( length ) {
+
+		return this.normalize().multiplyScalar( length );
+
+	}
+
+	lerp( v, alpha ) {
+
+		this.x += ( v.x - this.x ) * alpha;
+		this.y += ( v.y - this.y ) * alpha;
+
+		return this;
+
+	}
+
+	lerpVectors( v1, v2, alpha ) {
+
+		this.x = v1.x + ( v2.x - v1.x ) * alpha;
+		this.y = v1.y + ( v2.y - v1.y ) * alpha;
+
+		return this;
+
+	}
+
+	equals( v ) {
+
+		return ( ( v.x === this.x ) && ( v.y === this.y ) );
+
+	}
+
+	fromArray( array, offset = 0 ) {
+
+		this.x = array[ offset ];
+		this.y = array[ offset + 1 ];
+
+		return this;
+
+	}
+
+	toArray( array = [], offset = 0 ) {
+
+		array[ offset ] = this.x;
+		array[ offset + 1 ] = this.y;
+
+		return array;
+
+	}
+
+	fromBufferAttribute( attribute, index, offset ) {
+
+		if ( offset !== undefined ) {
+
+			console.warn( 'THREE.Vector2: offset has been removed from .fromBufferAttribute().' );
+
+		}
+
+		this.x = attribute.getX( index );
+		this.y = attribute.getY( index );
+
+		return this;
+
+	}
+
+	rotateAround( center, angle ) {
+
+		const c = Math.cos( angle ), s = Math.sin( angle );
+
+		const x = this.x - center.x;
+		const y = this.y - center.y;
+
+		this.x = x * c - y * s + center.x;
+		this.y = x * s + y * c + center.y;
+
+		return this;
+
+	}
+
+	random() {
+
+		this.x = Math.random();
+		this.y = Math.random();
+
+		return this;
+
+	}
+
+	*[ Symbol.iterator ]() {
+
+		yield this.x;
+		yield this.y;
+
+	}
+
+}
+
+Vector2.prototype.isVector2 = true;
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/math/Color.js
+
+
+const _colorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF,
+	'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2,
+	'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50,
+	'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B,
+	'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B,
+	'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F,
+	'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3,
+	'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222,
+	'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700,
+	'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4,
+	'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00,
+	'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3,
+	'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA,
+	'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32,
+	'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3,
+	'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC,
+	'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD,
+	'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6,
+	'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9,
+	'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'rebeccapurple': 0x663399, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F,
+	'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE,
+	'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA,
+	'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0,
+	'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 };
+
+const _hslA = { h: 0, s: 0, l: 0 };
+const _hslB = { h: 0, s: 0, l: 0 };
+
+function hue2rgb( p, q, t ) {
+
+	if ( t < 0 ) t += 1;
+	if ( t > 1 ) t -= 1;
+	if ( t < 1 / 6 ) return p + ( q - p ) * 6 * t;
+	if ( t < 1 / 2 ) return q;
+	if ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t );
+	return p;
+
+}
+
+function SRGBToLinear( c ) {
+
+	return ( c < 0.04045 ) ? c * 0.0773993808 : Math.pow( c * 0.9478672986 + 0.0521327014, 2.4 );
+
+}
+
+function LinearToSRGB( c ) {
+
+	return ( c < 0.0031308 ) ? c * 12.92 : 1.055 * ( Math.pow( c, 0.41666 ) ) - 0.055;
+
+}
+
+class Color {
+
+	constructor( r, g, b ) {
+
+		if ( g === undefined && b === undefined ) {
+
+			// r is THREE.Color, hex or string
+			return this.set( r );
+
+		}
+
+		return this.setRGB( r, g, b );
+
+	}
+
+	set( value ) {
+
+		if ( value && value.isColor ) {
+
+			this.copy( value );
+
+		} else if ( typeof value === 'number' ) {
+
+			this.setHex( value );
+
+		} else if ( typeof value === 'string' ) {
+
+			this.setStyle( value );
+
+		}
+
+		return this;
+
+	}
+
+	setScalar( scalar ) {
+
+		this.r = scalar;
+		this.g = scalar;
+		this.b = scalar;
+
+		return this;
+
+	}
+
+	setHex( hex ) {
+
+		hex = Math.floor( hex );
+
+		this.r = ( hex >> 16 & 255 ) / 255;
+		this.g = ( hex >> 8 & 255 ) / 255;
+		this.b = ( hex & 255 ) / 255;
+
+		return this;
+
+	}
+
+	setRGB( r, g, b ) {
+
+		this.r = r;
+		this.g = g;
+		this.b = b;
+
+		return this;
+
+	}
+
+	setHSL( h, s, l ) {
+
+		// h,s,l ranges are in 0.0 - 1.0
+		h = euclideanModulo( h, 1 );
+		s = clamp( s, 0, 1 );
+		l = clamp( l, 0, 1 );
+
+		if ( s === 0 ) {
+
+			this.r = this.g = this.b = l;
+
+		} else {
+
+			const p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s );
+			const q = ( 2 * l ) - p;
+
+			this.r = hue2rgb( q, p, h + 1 / 3 );
+			this.g = hue2rgb( q, p, h );
+			this.b = hue2rgb( q, p, h - 1 / 3 );
+
+		}
+
+		return this;
+
+	}
+
+	setStyle( style ) {
+
+		function handleAlpha( string ) {
+
+			if ( string === undefined ) return;
+
+			if ( parseFloat( string ) < 1 ) {
+
+				console.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' );
+
+			}
+
+		}
+
+
+		let m;
+
+		if ( m = /^((?:rgb|hsl)a?)\(([^\)]*)\)/.exec( style ) ) {
+
+			// rgb / hsl
+
+			let color;
+			const name = m[ 1 ];
+			const components = m[ 2 ];
+
+			switch ( name ) {
+
+				case 'rgb':
+				case 'rgba':
+
+					if ( color = /^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec( components ) ) {
+
+						// rgb(255,0,0) rgba(255,0,0,0.5)
+						this.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255;
+						this.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255;
+						this.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255;
+
+						handleAlpha( color[ 4 ] );
+
+						return this;
+
+					}
+
+					if ( color = /^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec( components ) ) {
+
+						// rgb(100%,0%,0%) rgba(100%,0%,0%,0.5)
+						this.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100;
+						this.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100;
+						this.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100;
+
+						handleAlpha( color[ 4 ] );
+
+						return this;
+
+					}
+
+					break;
+
+				case 'hsl':
+				case 'hsla':
+
+					if ( color = /^\s*(\d*\.?\d+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec( components ) ) {
+
+						// hsl(120,50%,50%) hsla(120,50%,50%,0.5)
+						const h = parseFloat( color[ 1 ] ) / 360;
+						const s = parseInt( color[ 2 ], 10 ) / 100;
+						const l = parseInt( color[ 3 ], 10 ) / 100;
+
+						handleAlpha( color[ 4 ] );
+
+						return this.setHSL( h, s, l );
+
+					}
+
+					break;
+
+			}
+
+		} else if ( m = /^\#([A-Fa-f\d]+)$/.exec( style ) ) {
+
+			// hex color
+
+			const hex = m[ 1 ];
+			const size = hex.length;
+
+			if ( size === 3 ) {
+
+				// #ff0
+				this.r = parseInt( hex.charAt( 0 ) + hex.charAt( 0 ), 16 ) / 255;
+				this.g = parseInt( hex.charAt( 1 ) + hex.charAt( 1 ), 16 ) / 255;
+				this.b = parseInt( hex.charAt( 2 ) + hex.charAt( 2 ), 16 ) / 255;
+
+				return this;
+
+			} else if ( size === 6 ) {
+
+				// #ff0000
+				this.r = parseInt( hex.charAt( 0 ) + hex.charAt( 1 ), 16 ) / 255;
+				this.g = parseInt( hex.charAt( 2 ) + hex.charAt( 3 ), 16 ) / 255;
+				this.b = parseInt( hex.charAt( 4 ) + hex.charAt( 5 ), 16 ) / 255;
+
+				return this;
+
+			}
+
+		}
+
+		if ( style && style.length > 0 ) {
+
+			return this.setColorName( style );
+
+		}
+
+		return this;
+
+	}
+
+	setColorName( style ) {
+
+		// color keywords
+		const hex = _colorKeywords[ style.toLowerCase() ];
+
+		if ( hex !== undefined ) {
+
+			// red
+			this.setHex( hex );
+
+		} else {
+
+			// unknown color
+			console.warn( 'THREE.Color: Unknown color ' + style );
+
+		}
+
+		return this;
+
+	}
+
+	clone() {
+
+		return new this.constructor( this.r, this.g, this.b );
+
+	}
+
+	copy( color ) {
+
+		this.r = color.r;
+		this.g = color.g;
+		this.b = color.b;
+
+		return this;
+
+	}
+
+	copySRGBToLinear( color ) {
+
+		this.r = SRGBToLinear( color.r );
+		this.g = SRGBToLinear( color.g );
+		this.b = SRGBToLinear( color.b );
+
+		return this;
+
+	}
+
+	copyLinearToSRGB( color ) {
+
+		this.r = LinearToSRGB( color.r );
+		this.g = LinearToSRGB( color.g );
+		this.b = LinearToSRGB( color.b );
+
+		return this;
+
+	}
+
+	convertSRGBToLinear() {
+
+		this.copySRGBToLinear( this );
+
+		return this;
+
+	}
+
+	convertLinearToSRGB() {
+
+		this.copyLinearToSRGB( this );
+
+		return this;
+
+	}
+
+	getHex() {
+
+		return ( this.r * 255 ) << 16 ^ ( this.g * 255 ) << 8 ^ ( this.b * 255 ) << 0;
+
+	}
+
+	getHexString() {
+
+		return ( '000000' + this.getHex().toString( 16 ) ).slice( - 6 );
+
+	}
+
+	getHSL( target ) {
+
+		// h,s,l ranges are in 0.0 - 1.0
+
+		const r = this.r, g = this.g, b = this.b;
+
+		const max = Math.max( r, g, b );
+		const min = Math.min( r, g, b );
+
+		let hue, saturation;
+		const lightness = ( min + max ) / 2.0;
+
+		if ( min === max ) {
+
+			hue = 0;
+			saturation = 0;
+
+		} else {
+
+			const delta = max - min;
+
+			saturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min );
+
+			switch ( max ) {
+
+				case r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break;
+				case g: hue = ( b - r ) / delta + 2; break;
+				case b: hue = ( r - g ) / delta + 4; break;
+
+			}
+
+			hue /= 6;
+
+		}
+
+		target.h = hue;
+		target.s = saturation;
+		target.l = lightness;
+
+		return target;
+
+	}
+
+	getStyle() {
+
+		return 'rgb(' + ( ( this.r * 255 ) | 0 ) + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')';
+
+	}
+
+	offsetHSL( h, s, l ) {
+
+		this.getHSL( _hslA );
+
+		_hslA.h += h; _hslA.s += s; _hslA.l += l;
+
+		this.setHSL( _hslA.h, _hslA.s, _hslA.l );
+
+		return this;
+
+	}
+
+	add( color ) {
+
+		this.r += color.r;
+		this.g += color.g;
+		this.b += color.b;
+
+		return this;
+
+	}
+
+	addColors( color1, color2 ) {
+
+		this.r = color1.r + color2.r;
+		this.g = color1.g + color2.g;
+		this.b = color1.b + color2.b;
+
+		return this;
+
+	}
+
+	addScalar( s ) {
+
+		this.r += s;
+		this.g += s;
+		this.b += s;
+
+		return this;
+
+	}
+
+	sub( color ) {
+
+		this.r = Math.max( 0, this.r - color.r );
+		this.g = Math.max( 0, this.g - color.g );
+		this.b = Math.max( 0, this.b - color.b );
+
+		return this;
+
+	}
+
+	multiply( color ) {
+
+		this.r *= color.r;
+		this.g *= color.g;
+		this.b *= color.b;
+
+		return this;
+
+	}
+
+	multiplyScalar( s ) {
+
+		this.r *= s;
+		this.g *= s;
+		this.b *= s;
+
+		return this;
+
+	}
+
+	lerp( color, alpha ) {
+
+		this.r += ( color.r - this.r ) * alpha;
+		this.g += ( color.g - this.g ) * alpha;
+		this.b += ( color.b - this.b ) * alpha;
+
+		return this;
+
+	}
+
+	lerpColors( color1, color2, alpha ) {
+
+		this.r = color1.r + ( color2.r - color1.r ) * alpha;
+		this.g = color1.g + ( color2.g - color1.g ) * alpha;
+		this.b = color1.b + ( color2.b - color1.b ) * alpha;
+
+		return this;
+
+	}
+
+	lerpHSL( color, alpha ) {
+
+		this.getHSL( _hslA );
+		color.getHSL( _hslB );
+
+		const h = lerp( _hslA.h, _hslB.h, alpha );
+		const s = lerp( _hslA.s, _hslB.s, alpha );
+		const l = lerp( _hslA.l, _hslB.l, alpha );
+
+		this.setHSL( h, s, l );
+
+		return this;
+
+	}
+
+	equals( c ) {
+
+		return ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b );
+
+	}
+
+	fromArray( array, offset = 0 ) {
+
+		this.r = array[ offset ];
+		this.g = array[ offset + 1 ];
+		this.b = array[ offset + 2 ];
+
+		return this;
+
+	}
+
+	toArray( array = [], offset = 0 ) {
+
+		array[ offset ] = this.r;
+		array[ offset + 1 ] = this.g;
+		array[ offset + 2 ] = this.b;
+
+		return array;
+
+	}
+
+	fromBufferAttribute( attribute, index ) {
+
+		this.r = attribute.getX( index );
+		this.g = attribute.getY( index );
+		this.b = attribute.getZ( index );
+
+		if ( attribute.normalized === true ) {
+
+			// assuming Uint8Array
+
+			this.r /= 255;
+			this.g /= 255;
+			this.b /= 255;
+
+		}
+
+		return this;
+
+	}
+
+	toJSON() {
+
+		return this.getHex();
+
+	}
+
+}
+
+Color.NAMES = _colorKeywords;
+
+Color.prototype.isColor = true;
+Color.prototype.r = 1;
+Color.prototype.g = 1;
+Color.prototype.b = 1;
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/core/BufferAttribute.js
+
+
+
+
+
+
+const BufferAttribute_vector = /*@__PURE__*/ new Vector3();
+const BufferAttribute_vector2 = /*@__PURE__*/ new Vector2();
+
+class BufferAttribute {
+
+	constructor( array, itemSize, normalized ) {
+
+		if ( Array.isArray( array ) ) {
+
+			throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );
+
+		}
+
+		this.name = '';
+
+		this.array = array;
+		this.itemSize = itemSize;
+		this.count = array !== undefined ? array.length / itemSize : 0;
+		this.normalized = normalized === true;
+
+		this.usage = StaticDrawUsage;
+		this.updateRange = { offset: 0, count: - 1 };
+
+		this.version = 0;
+
+	}
+
+	onUploadCallback() {}
+
+	set needsUpdate( value ) {
+
+		if ( value === true ) this.version ++;
+
+	}
+
+	setUsage( value ) {
+
+		this.usage = value;
+
+		return this;
+
+	}
+
+	copy( source ) {
+
+		this.name = source.name;
+		this.array = new source.array.constructor( source.array );
+		this.itemSize = source.itemSize;
+		this.count = source.count;
+		this.normalized = source.normalized;
+
+		this.usage = source.usage;
+
+		return this;
+
+	}
+
+	copyAt( index1, attribute, index2 ) {
+
+		index1 *= this.itemSize;
+		index2 *= attribute.itemSize;
+
+		for ( let i = 0, l = this.itemSize; i < l; i ++ ) {
+
+			this.array[ index1 + i ] = attribute.array[ index2 + i ];
+
+		}
+
+		return this;
+
+	}
+
+	copyArray( array ) {
+
+		this.array.set( array );
+
+		return this;
+
+	}
+
+	copyColorsArray( colors ) {
+
+		const array = this.array;
+		let offset = 0;
+
+		for ( let i = 0, l = colors.length; i < l; i ++ ) {
+
+			let color = colors[ i ];
+
+			if ( color === undefined ) {
+
+				console.warn( 'THREE.BufferAttribute.copyColorsArray(): color is undefined', i );
+				color = new Color();
+
+			}
+
+			array[ offset ++ ] = color.r;
+			array[ offset ++ ] = color.g;
+			array[ offset ++ ] = color.b;
+
+		}
+
+		return this;
+
+	}
+
+	copyVector2sArray( vectors ) {
+
+		const array = this.array;
+		let offset = 0;
+
+		for ( let i = 0, l = vectors.length; i < l; i ++ ) {
+
+			let vector = vectors[ i ];
+
+			if ( vector === undefined ) {
+
+				console.warn( 'THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i );
+				vector = new Vector2();
+
+			}
+
+			array[ offset ++ ] = vector.x;
+			array[ offset ++ ] = vector.y;
+
+		}
+
+		return this;
+
+	}
+
+	copyVector3sArray( vectors ) {
+
+		const array = this.array;
+		let offset = 0;
+
+		for ( let i = 0, l = vectors.length; i < l; i ++ ) {
+
+			let vector = vectors[ i ];
+
+			if ( vector === undefined ) {
+
+				console.warn( 'THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i );
+				vector = new Vector3();
+
+			}
+
+			array[ offset ++ ] = vector.x;
+			array[ offset ++ ] = vector.y;
+			array[ offset ++ ] = vector.z;
+
+		}
+
+		return this;
+
+	}
+
+	copyVector4sArray( vectors ) {
+
+		const array = this.array;
+		let offset = 0;
+
+		for ( let i = 0, l = vectors.length; i < l; i ++ ) {
+
+			let vector = vectors[ i ];
+
+			if ( vector === undefined ) {
+
+				console.warn( 'THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i );
+				vector = new Vector4();
+
+			}
+
+			array[ offset ++ ] = vector.x;
+			array[ offset ++ ] = vector.y;
+			array[ offset ++ ] = vector.z;
+			array[ offset ++ ] = vector.w;
+
+		}
+
+		return this;
+
+	}
+
+	applyMatrix3( m ) {
+
+		if ( this.itemSize === 2 ) {
+
+			for ( let i = 0, l = this.count; i < l; i ++ ) {
+
+				BufferAttribute_vector2.fromBufferAttribute( this, i );
+				BufferAttribute_vector2.applyMatrix3( m );
+
+				this.setXY( i, BufferAttribute_vector2.x, BufferAttribute_vector2.y );
+
+			}
+
+		} else if ( this.itemSize === 3 ) {
+
+			for ( let i = 0, l = this.count; i < l; i ++ ) {
+
+				BufferAttribute_vector.fromBufferAttribute( this, i );
+				BufferAttribute_vector.applyMatrix3( m );
+
+				this.setXYZ( i, BufferAttribute_vector.x, BufferAttribute_vector.y, BufferAttribute_vector.z );
+
+			}
+
+		}
+
+		return this;
+
+	}
+
+	applyMatrix4( m ) {
+
+		for ( let i = 0, l = this.count; i < l; i ++ ) {
+
+			BufferAttribute_vector.x = this.getX( i );
+			BufferAttribute_vector.y = this.getY( i );
+			BufferAttribute_vector.z = this.getZ( i );
+
+			BufferAttribute_vector.applyMatrix4( m );
+
+			this.setXYZ( i, BufferAttribute_vector.x, BufferAttribute_vector.y, BufferAttribute_vector.z );
+
+		}
+
+		return this;
+
+	}
+
+	applyNormalMatrix( m ) {
+
+		for ( let i = 0, l = this.count; i < l; i ++ ) {
+
+			BufferAttribute_vector.x = this.getX( i );
+			BufferAttribute_vector.y = this.getY( i );
+			BufferAttribute_vector.z = this.getZ( i );
+
+			BufferAttribute_vector.applyNormalMatrix( m );
+
+			this.setXYZ( i, BufferAttribute_vector.x, BufferAttribute_vector.y, BufferAttribute_vector.z );
+
+		}
+
+		return this;
+
+	}
+
+	transformDirection( m ) {
+
+		for ( let i = 0, l = this.count; i < l; i ++ ) {
+
+			BufferAttribute_vector.x = this.getX( i );
+			BufferAttribute_vector.y = this.getY( i );
+			BufferAttribute_vector.z = this.getZ( i );
+
+			BufferAttribute_vector.transformDirection( m );
+
+			this.setXYZ( i, BufferAttribute_vector.x, BufferAttribute_vector.y, BufferAttribute_vector.z );
+
+		}
+
+		return this;
+
+	}
+
+	set( value, offset = 0 ) {
+
+		this.array.set( value, offset );
+
+		return this;
+
+	}
+
+	getX( index ) {
+
+		return this.array[ index * this.itemSize ];
+
+	}
+
+	setX( index, x ) {
+
+		this.array[ index * this.itemSize ] = x;
+
+		return this;
+
+	}
+
+	getY( index ) {
+
+		return this.array[ index * this.itemSize + 1 ];
+
+	}
+
+	setY( index, y ) {
+
+		this.array[ index * this.itemSize + 1 ] = y;
+
+		return this;
+
+	}
+
+	getZ( index ) {
+
+		return this.array[ index * this.itemSize + 2 ];
+
+	}
+
+	setZ( index, z ) {
+
+		this.array[ index * this.itemSize + 2 ] = z;
+
+		return this;
+
+	}
+
+	getW( index ) {
+
+		return this.array[ index * this.itemSize + 3 ];
+
+	}
+
+	setW( index, w ) {
+
+		this.array[ index * this.itemSize + 3 ] = w;
+
+		return this;
+
+	}
+
+	setXY( index, x, y ) {
+
+		index *= this.itemSize;
+
+		this.array[ index + 0 ] = x;
+		this.array[ index + 1 ] = y;
+
+		return this;
+
+	}
+
+	setXYZ( index, x, y, z ) {
+
+		index *= this.itemSize;
+
+		this.array[ index + 0 ] = x;
+		this.array[ index + 1 ] = y;
+		this.array[ index + 2 ] = z;
+
+		return this;
+
+	}
+
+	setXYZW( index, x, y, z, w ) {
+
+		index *= this.itemSize;
+
+		this.array[ index + 0 ] = x;
+		this.array[ index + 1 ] = y;
+		this.array[ index + 2 ] = z;
+		this.array[ index + 3 ] = w;
+
+		return this;
+
+	}
+
+	onUpload( callback ) {
+
+		this.onUploadCallback = callback;
+
+		return this;
+
+	}
+
+	clone() {
+
+		return new this.constructor( this.array, this.itemSize ).copy( this );
+
+	}
+
+	toJSON() {
+
+		const data = {
+			itemSize: this.itemSize,
+			type: this.array.constructor.name,
+			array: Array.prototype.slice.call( this.array ),
+			normalized: this.normalized
+		};
+
+		if ( this.name !== '' ) data.name = this.name;
+		if ( this.usage !== StaticDrawUsage ) data.usage = this.usage;
+		if ( this.updateRange.offset !== 0 || this.updateRange.count !== - 1 ) data.updateRange = this.updateRange;
+
+		return data;
+
+	}
+
+}
+
+BufferAttribute.prototype.isBufferAttribute = true;
+
+//
+
+class Int8BufferAttribute extends (/* unused pure expression or super */ null && (BufferAttribute)) {
+
+	constructor( array, itemSize, normalized ) {
+
+		super( new Int8Array( array ), itemSize, normalized );
+
+	}
+
+}
+
+class Uint8BufferAttribute extends (/* unused pure expression or super */ null && (BufferAttribute)) {
+
+	constructor( array, itemSize, normalized ) {
+
+		super( new Uint8Array( array ), itemSize, normalized );
+
+	}
+
+}
+
+class Uint8ClampedBufferAttribute extends (/* unused pure expression or super */ null && (BufferAttribute)) {
+
+	constructor( array, itemSize, normalized ) {
+
+		super( new Uint8ClampedArray( array ), itemSize, normalized );
+
+	}
+
+}
+
+class Int16BufferAttribute extends (/* unused pure expression or super */ null && (BufferAttribute)) {
+
+	constructor( array, itemSize, normalized ) {
+
+		super( new Int16Array( array ), itemSize, normalized );
+
+	}
+
+}
+
+class Uint16BufferAttribute extends BufferAttribute {
+
+	constructor( array, itemSize, normalized ) {
+
+		super( new Uint16Array( array ), itemSize, normalized );
+
+	}
+
+}
+
+class Int32BufferAttribute extends (/* unused pure expression or super */ null && (BufferAttribute)) {
+
+	constructor( array, itemSize, normalized ) {
+
+		super( new Int32Array( array ), itemSize, normalized );
+
+	}
+
+}
+
+class Uint32BufferAttribute extends BufferAttribute {
+
+	constructor( array, itemSize, normalized ) {
+
+		super( new Uint32Array( array ), itemSize, normalized );
+
+	}
+
+}
+
+class Float16BufferAttribute extends BufferAttribute {
+
+	constructor( array, itemSize, normalized ) {
+
+		super( new Uint16Array( array ), itemSize, normalized );
+
+	}
+
+}
+
+Float16BufferAttribute.prototype.isFloat16BufferAttribute = true;
+
+class Float32BufferAttribute extends BufferAttribute {
+
+	constructor( array, itemSize, normalized ) {
+
+		super( new Float32Array( array ), itemSize, normalized );
+
+	}
+
+}
+
+class Float64BufferAttribute extends (/* unused pure expression or super */ null && (BufferAttribute)) {
+
+	constructor( array, itemSize, normalized ) {
+
+		super( new Float64Array( array ), itemSize, normalized );
+
+	}
+
+}
+
+//
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/utils.js
+function arrayMin( array ) {
+
+	if ( array.length === 0 ) return Infinity;
+
+	let min = array[ 0 ];
+
+	for ( let i = 1, l = array.length; i < l; ++ i ) {
+
+		if ( array[ i ] < min ) min = array[ i ];
+
+	}
+
+	return min;
+
+}
+
+function arrayMax( array ) {
+
+	if ( array.length === 0 ) return - Infinity;
+
+	let max = array[ 0 ];
+
+	for ( let i = 1, l = array.length; i < l; ++ i ) {
+
+		if ( array[ i ] > max ) max = array[ i ];
+
+	}
+
+	return max;
+
+}
+
+function arrayNeedsUint32( array ) {
+
+	// assumes larger values usually on last
+
+	for ( let i = array.length - 1; i >= 0; -- i ) {
+
+		if ( array[ i ] > 65535 ) return true;
+
+	}
+
+	return false;
+
+}
+
+const TYPED_ARRAYS = {
+	Int8Array: Int8Array,
+	Uint8Array: Uint8Array,
+	Uint8ClampedArray: Uint8ClampedArray,
+	Int16Array: Int16Array,
+	Uint16Array: Uint16Array,
+	Int32Array: Int32Array,
+	Uint32Array: Uint32Array,
+	Float32Array: Float32Array,
+	Float64Array: Float64Array
+};
+
+function getTypedArray( type, buffer ) {
+
+	return new TYPED_ARRAYS[ type ]( buffer );
+
+}
+
+function createElementNS( name ) {
+
+	return document.createElementNS( 'http://www.w3.org/1999/xhtml', name );
+
+}
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/core/BufferGeometry.js
+
+
+
+
+
+
+
+
+
+
+
+
+let _id = 0;
+
+const BufferGeometry_m1 = /*@__PURE__*/ new Matrix4_Matrix4();
+const _obj = /*@__PURE__*/ new Object3D();
+const _offset = /*@__PURE__*/ new Vector3();
+const BufferGeometry_box = /*@__PURE__*/ new Box3();
+const _boxMorphTargets = /*@__PURE__*/ new Box3();
+const BufferGeometry_vector = /*@__PURE__*/ new Vector3();
+
+class BufferGeometry extends EventDispatcher {
+
+	constructor() {
+
+		super();
+
+		Object.defineProperty( this, 'id', { value: _id ++ } );
+
+		this.uuid = generateUUID();
+
+		this.name = '';
+		this.type = 'BufferGeometry';
+
+		this.index = null;
+		this.attributes = {};
+
+		this.morphAttributes = {};
+		this.morphTargetsRelative = false;
+
+		this.groups = [];
+
+		this.boundingBox = null;
+		this.boundingSphere = null;
+
+		this.drawRange = { start: 0, count: Infinity };
+
+		this.userData = {};
+
+	}
+
+	getIndex() {
+
+		return this.index;
+
+	}
+
+	setIndex( index ) {
+
+		if ( Array.isArray( index ) ) {
+
+			this.index = new ( arrayNeedsUint32( index ) ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 );
+
+		} else {
+
+			this.index = index;
+
+		}
+
+		return this;
+
+	}
+
+	getAttribute( name ) {
+
+		return this.attributes[ name ];
+
+	}
+
+	setAttribute( name, attribute ) {
+
+		this.attributes[ name ] = attribute;
+
+		return this;
+
+	}
+
+	deleteAttribute( name ) {
+
+		delete this.attributes[ name ];
+
+		return this;
+
+	}
+
+	hasAttribute( name ) {
+
+		return this.attributes[ name ] !== undefined;
+
+	}
+
+	addGroup( start, count, materialIndex = 0 ) {
+
+		this.groups.push( {
+
+			start: start,
+			count: count,
+			materialIndex: materialIndex
+
+		} );
+
+	}
+
+	clearGroups() {
+
+		this.groups = [];
+
+	}
+
+	setDrawRange( start, count ) {
+
+		this.drawRange.start = start;
+		this.drawRange.count = count;
+
+	}
+
+	applyMatrix4( matrix ) {
+
+		const position = this.attributes.position;
+
+		if ( position !== undefined ) {
+
+			position.applyMatrix4( matrix );
+
+			position.needsUpdate = true;
+
+		}
+
+		const normal = this.attributes.normal;
+
+		if ( normal !== undefined ) {
+
+			const normalMatrix = new Matrix3().getNormalMatrix( matrix );
+
+			normal.applyNormalMatrix( normalMatrix );
+
+			normal.needsUpdate = true;
+
+		}
+
+		const tangent = this.attributes.tangent;
+
+		if ( tangent !== undefined ) {
+
+			tangent.transformDirection( matrix );
+
+			tangent.needsUpdate = true;
+
+		}
+
+		if ( this.boundingBox !== null ) {
+
+			this.computeBoundingBox();
+
+		}
+
+		if ( this.boundingSphere !== null ) {
+
+			this.computeBoundingSphere();
+
+		}
+
+		return this;
+
+	}
+
+	applyQuaternion( q ) {
+
+		BufferGeometry_m1.makeRotationFromQuaternion( q );
+
+		this.applyMatrix4( BufferGeometry_m1 );
+
+		return this;
+
+	}
+
+	rotateX( angle ) {
+
+		// rotate geometry around world x-axis
+
+		BufferGeometry_m1.makeRotationX( angle );
+
+		this.applyMatrix4( BufferGeometry_m1 );
+
+		return this;
+
+	}
+
+	rotateY( angle ) {
+
+		// rotate geometry around world y-axis
+
+		BufferGeometry_m1.makeRotationY( angle );
+
+		this.applyMatrix4( BufferGeometry_m1 );
+
+		return this;
+
+	}
+
+	rotateZ( angle ) {
+
+		// rotate geometry around world z-axis
+
+		BufferGeometry_m1.makeRotationZ( angle );
+
+		this.applyMatrix4( BufferGeometry_m1 );
+
+		return this;
+
+	}
+
+	translate( x, y, z ) {
+
+		// translate geometry
+
+		BufferGeometry_m1.makeTranslation( x, y, z );
+
+		this.applyMatrix4( BufferGeometry_m1 );
+
+		return this;
+
+	}
+
+	scale( x, y, z ) {
+
+		// scale geometry
+
+		BufferGeometry_m1.makeScale( x, y, z );
+
+		this.applyMatrix4( BufferGeometry_m1 );
+
+		return this;
+
+	}
+
+	lookAt( vector ) {
+
+		_obj.lookAt( vector );
+
+		_obj.updateMatrix();
+
+		this.applyMatrix4( _obj.matrix );
+
+		return this;
+
+	}
+
+	center() {
+
+		this.computeBoundingBox();
+
+		this.boundingBox.getCenter( _offset ).negate();
+
+		this.translate( _offset.x, _offset.y, _offset.z );
+
+		return this;
+
+	}
+
+	setFromPoints( points ) {
+
+		const position = [];
+
+		for ( let i = 0, l = points.length; i < l; i ++ ) {
+
+			const point = points[ i ];
+			position.push( point.x, point.y, point.z || 0 );
+
+		}
+
+		this.setAttribute( 'position', new Float32BufferAttribute( position, 3 ) );
+
+		return this;
+
+	}
+
+	computeBoundingBox() {
+
+		if ( this.boundingBox === null ) {
+
+			this.boundingBox = new Box3();
+
+		}
+
+		const position = this.attributes.position;
+		const morphAttributesPosition = this.morphAttributes.position;
+
+		if ( position && position.isGLBufferAttribute ) {
+
+			console.error( 'THREE.BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box. Alternatively set "mesh.frustumCulled" to "false".', this );
+
+			this.boundingBox.set(
+				new Vector3( - Infinity, - Infinity, - Infinity ),
+				new Vector3( + Infinity, + Infinity, + Infinity )
+			);
+
+			return;
+
+		}
+
+		if ( position !== undefined ) {
+
+			this.boundingBox.setFromBufferAttribute( position );
+
+			// process morph attributes if present
+
+			if ( morphAttributesPosition ) {
+
+				for ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {
+
+					const morphAttribute = morphAttributesPosition[ i ];
+					BufferGeometry_box.setFromBufferAttribute( morphAttribute );
+
+					if ( this.morphTargetsRelative ) {
+
+						BufferGeometry_vector.addVectors( this.boundingBox.min, BufferGeometry_box.min );
+						this.boundingBox.expandByPoint( BufferGeometry_vector );
+
+						BufferGeometry_vector.addVectors( this.boundingBox.max, BufferGeometry_box.max );
+						this.boundingBox.expandByPoint( BufferGeometry_vector );
+
+					} else {
+
+						this.boundingBox.expandByPoint( BufferGeometry_box.min );
+						this.boundingBox.expandByPoint( BufferGeometry_box.max );
+
+					}
+
+				}
+
+			}
+
+		} else {
+
+			this.boundingBox.makeEmpty();
+
+		}
+
+		if ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) {
+
+			console.error( 'THREE.BufferGeometry.computeBoundingBox(): Computed min/max have NaN values. The "position" attribute is likely to have NaN values.', this );
+
+		}
+
+	}
+
+	computeBoundingSphere() {
+
+		if ( this.boundingSphere === null ) {
+
+			this.boundingSphere = new Sphere();
+
+		}
+
+		const position = this.attributes.position;
+		const morphAttributesPosition = this.morphAttributes.position;
+
+		if ( position && position.isGLBufferAttribute ) {
+
+			console.error( 'THREE.BufferGeometry.computeBoundingSphere(): GLBufferAttribute requires a manual bounding sphere. Alternatively set "mesh.frustumCulled" to "false".', this );
+
+			this.boundingSphere.set( new Vector3(), Infinity );
+
+			return;
+
+		}
+
+		if ( position ) {
+
+			// first, find the center of the bounding sphere
+
+			const center = this.boundingSphere.center;
+
+			BufferGeometry_box.setFromBufferAttribute( position );
+
+			// process morph attributes if present
+
+			if ( morphAttributesPosition ) {
+
+				for ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {
+
+					const morphAttribute = morphAttributesPosition[ i ];
+					_boxMorphTargets.setFromBufferAttribute( morphAttribute );
+
+					if ( this.morphTargetsRelative ) {
+
+						BufferGeometry_vector.addVectors( BufferGeometry_box.min, _boxMorphTargets.min );
+						BufferGeometry_box.expandByPoint( BufferGeometry_vector );
+
+						BufferGeometry_vector.addVectors( BufferGeometry_box.max, _boxMorphTargets.max );
+						BufferGeometry_box.expandByPoint( BufferGeometry_vector );
+
+					} else {
+
+						BufferGeometry_box.expandByPoint( _boxMorphTargets.min );
+						BufferGeometry_box.expandByPoint( _boxMorphTargets.max );
+
+					}
+
+				}
+
+			}
+
+			BufferGeometry_box.getCenter( center );
+
+			// second, try to find a boundingSphere with a radius smaller than the
+			// boundingSphere of the boundingBox: sqrt(3) smaller in the best case
+
+			let maxRadiusSq = 0;
+
+			for ( let i = 0, il = position.count; i < il; i ++ ) {
+
+				BufferGeometry_vector.fromBufferAttribute( position, i );
+
+				maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( BufferGeometry_vector ) );
+
+			}
+
+			// process morph attributes if present
+
+			if ( morphAttributesPosition ) {
+
+				for ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {
+
+					const morphAttribute = morphAttributesPosition[ i ];
+					const morphTargetsRelative = this.morphTargetsRelative;
+
+					for ( let j = 0, jl = morphAttribute.count; j < jl; j ++ ) {
+
+						BufferGeometry_vector.fromBufferAttribute( morphAttribute, j );
+
+						if ( morphTargetsRelative ) {
+
+							_offset.fromBufferAttribute( position, j );
+							BufferGeometry_vector.add( _offset );
+
+						}
+
+						maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( BufferGeometry_vector ) );
+
+					}
+
+				}
+
+			}
+
+			this.boundingSphere.radius = Math.sqrt( maxRadiusSq );
+
+			if ( isNaN( this.boundingSphere.radius ) ) {
+
+				console.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.', this );
+
+			}
+
+		}
+
+	}
+
+	computeTangents() {
+
+		const index = this.index;
+		const attributes = this.attributes;
+
+		// based on http://www.terathon.com/code/tangent.html
+		// (per vertex tangents)
+
+		if ( index === null ||
+			 attributes.position === undefined ||
+			 attributes.normal === undefined ||
+			 attributes.uv === undefined ) {
+
+			console.error( 'THREE.BufferGeometry: .computeTangents() failed. Missing required attributes (index, position, normal or uv)' );
+			return;
+
+		}
+
+		const indices = index.array;
+		const positions = attributes.position.array;
+		const normals = attributes.normal.array;
+		const uvs = attributes.uv.array;
+
+		const nVertices = positions.length / 3;
+
+		if ( attributes.tangent === undefined ) {
+
+			this.setAttribute( 'tangent', new BufferAttribute( new Float32Array( 4 * nVertices ), 4 ) );
+
+		}
+
+		const tangents = attributes.tangent.array;
+
+		const tan1 = [], tan2 = [];
+
+		for ( let i = 0; i < nVertices; i ++ ) {
+
+			tan1[ i ] = new Vector3();
+			tan2[ i ] = new Vector3();
+
+		}
+
+		const vA = new Vector3(),
+			vB = new Vector3(),
+			vC = new Vector3(),
+
+			uvA = new Vector2(),
+			uvB = new Vector2(),
+			uvC = new Vector2(),
+
+			sdir = new Vector3(),
+			tdir = new Vector3();
+
+		function handleTriangle( a, b, c ) {
+
+			vA.fromArray( positions, a * 3 );
+			vB.fromArray( positions, b * 3 );
+			vC.fromArray( positions, c * 3 );
+
+			uvA.fromArray( uvs, a * 2 );
+			uvB.fromArray( uvs, b * 2 );
+			uvC.fromArray( uvs, c * 2 );
+
+			vB.sub( vA );
+			vC.sub( vA );
+
+			uvB.sub( uvA );
+			uvC.sub( uvA );
+
+			const r = 1.0 / ( uvB.x * uvC.y - uvC.x * uvB.y );
+
+			// silently ignore degenerate uv triangles having coincident or colinear vertices
+
+			if ( ! isFinite( r ) ) return;
+
+			sdir.copy( vB ).multiplyScalar( uvC.y ).addScaledVector( vC, - uvB.y ).multiplyScalar( r );
+			tdir.copy( vC ).multiplyScalar( uvB.x ).addScaledVector( vB, - uvC.x ).multiplyScalar( r );
+
+			tan1[ a ].add( sdir );
+			tan1[ b ].add( sdir );
+			tan1[ c ].add( sdir );
+
+			tan2[ a ].add( tdir );
+			tan2[ b ].add( tdir );
+			tan2[ c ].add( tdir );
+
+		}
+
+		let groups = this.groups;
+
+		if ( groups.length === 0 ) {
+
+			groups = [ {
+				start: 0,
+				count: indices.length
+			} ];
+
+		}
+
+		for ( let i = 0, il = groups.length; i < il; ++ i ) {
+
+			const group = groups[ i ];
+
+			const start = group.start;
+			const count = group.count;
+
+			for ( let j = start, jl = start + count; j < jl; j += 3 ) {
+
+				handleTriangle(
+					indices[ j + 0 ],
+					indices[ j + 1 ],
+					indices[ j + 2 ]
+				);
+
+			}
+
+		}
+
+		const tmp = new Vector3(), tmp2 = new Vector3();
+		const n = new Vector3(), n2 = new Vector3();
+
+		function handleVertex( v ) {
+
+			n.fromArray( normals, v * 3 );
+			n2.copy( n );
+
+			const t = tan1[ v ];
+
+			// Gram-Schmidt orthogonalize
+
+			tmp.copy( t );
+			tmp.sub( n.multiplyScalar( n.dot( t ) ) ).normalize();
+
+			// Calculate handedness
+
+			tmp2.crossVectors( n2, t );
+			const test = tmp2.dot( tan2[ v ] );
+			const w = ( test < 0.0 ) ? - 1.0 : 1.0;
+
+			tangents[ v * 4 ] = tmp.x;
+			tangents[ v * 4 + 1 ] = tmp.y;
+			tangents[ v * 4 + 2 ] = tmp.z;
+			tangents[ v * 4 + 3 ] = w;
+
+		}
+
+		for ( let i = 0, il = groups.length; i < il; ++ i ) {
+
+			const group = groups[ i ];
+
+			const start = group.start;
+			const count = group.count;
+
+			for ( let j = start, jl = start + count; j < jl; j += 3 ) {
+
+				handleVertex( indices[ j + 0 ] );
+				handleVertex( indices[ j + 1 ] );
+				handleVertex( indices[ j + 2 ] );
+
+			}
+
+		}
+
+	}
+
+	computeVertexNormals() {
+
+		const index = this.index;
+		const positionAttribute = this.getAttribute( 'position' );
+
+		if ( positionAttribute !== undefined ) {
+
+			let normalAttribute = this.getAttribute( 'normal' );
+
+			if ( normalAttribute === undefined ) {
+
+				normalAttribute = new BufferAttribute( new Float32Array( positionAttribute.count * 3 ), 3 );
+				this.setAttribute( 'normal', normalAttribute );
+
+			} else {
+
+				// reset existing normals to zero
+
+				for ( let i = 0, il = normalAttribute.count; i < il; i ++ ) {
+
+					normalAttribute.setXYZ( i, 0, 0, 0 );
+
+				}
+
+			}
+
+			const pA = new Vector3(), pB = new Vector3(), pC = new Vector3();
+			const nA = new Vector3(), nB = new Vector3(), nC = new Vector3();
+			const cb = new Vector3(), ab = new Vector3();
+
+			// indexed elements
+
+			if ( index ) {
+
+				for ( let i = 0, il = index.count; i < il; i += 3 ) {
+
+					const vA = index.getX( i + 0 );
+					const vB = index.getX( i + 1 );
+					const vC = index.getX( i + 2 );
+
+					pA.fromBufferAttribute( positionAttribute, vA );
+					pB.fromBufferAttribute( positionAttribute, vB );
+					pC.fromBufferAttribute( positionAttribute, vC );
+
+					cb.subVectors( pC, pB );
+					ab.subVectors( pA, pB );
+					cb.cross( ab );
+
+					nA.fromBufferAttribute( normalAttribute, vA );
+					nB.fromBufferAttribute( normalAttribute, vB );
+					nC.fromBufferAttribute( normalAttribute, vC );
+
+					nA.add( cb );
+					nB.add( cb );
+					nC.add( cb );
+
+					normalAttribute.setXYZ( vA, nA.x, nA.y, nA.z );
+					normalAttribute.setXYZ( vB, nB.x, nB.y, nB.z );
+					normalAttribute.setXYZ( vC, nC.x, nC.y, nC.z );
+
+				}
+
+			} else {
+
+				// non-indexed elements (unconnected triangle soup)
+
+				for ( let i = 0, il = positionAttribute.count; i < il; i += 3 ) {
+
+					pA.fromBufferAttribute( positionAttribute, i + 0 );
+					pB.fromBufferAttribute( positionAttribute, i + 1 );
+					pC.fromBufferAttribute( positionAttribute, i + 2 );
+
+					cb.subVectors( pC, pB );
+					ab.subVectors( pA, pB );
+					cb.cross( ab );
+
+					normalAttribute.setXYZ( i + 0, cb.x, cb.y, cb.z );
+					normalAttribute.setXYZ( i + 1, cb.x, cb.y, cb.z );
+					normalAttribute.setXYZ( i + 2, cb.x, cb.y, cb.z );
+
+				}
+
+			}
+
+			this.normalizeNormals();
+
+			normalAttribute.needsUpdate = true;
+
+		}
+
+	}
+
+	merge( geometry, offset ) {
+
+		if ( ! ( geometry && geometry.isBufferGeometry ) ) {
+
+			console.error( 'THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', geometry );
+			return;
+
+		}
+
+		if ( offset === undefined ) {
+
+			offset = 0;
+
+			console.warn(
+				'THREE.BufferGeometry.merge(): Overwriting original geometry, starting at offset=0. '
+				+ 'Use BufferGeometryUtils.mergeBufferGeometries() for lossless merge.'
+			);
+
+		}
+
+		const attributes = this.attributes;
+
+		for ( const key in attributes ) {
+
+			if ( geometry.attributes[ key ] === undefined ) continue;
+
+			const attribute1 = attributes[ key ];
+			const attributeArray1 = attribute1.array;
+
+			const attribute2 = geometry.attributes[ key ];
+			const attributeArray2 = attribute2.array;
+
+			const attributeOffset = attribute2.itemSize * offset;
+			const length = Math.min( attributeArray2.length, attributeArray1.length - attributeOffset );
+
+			for ( let i = 0, j = attributeOffset; i < length; i ++, j ++ ) {
+
+				attributeArray1[ j ] = attributeArray2[ i ];
+
+			}
+
+		}
+
+		return this;
+
+	}
+
+	normalizeNormals() {
+
+		const normals = this.attributes.normal;
+
+		for ( let i = 0, il = normals.count; i < il; i ++ ) {
+
+			BufferGeometry_vector.fromBufferAttribute( normals, i );
+
+			BufferGeometry_vector.normalize();
+
+			normals.setXYZ( i, BufferGeometry_vector.x, BufferGeometry_vector.y, BufferGeometry_vector.z );
+
+		}
+
+	}
+
+	toNonIndexed() {
+
+		function convertBufferAttribute( attribute, indices ) {
+
+			const array = attribute.array;
+			const itemSize = attribute.itemSize;
+			const normalized = attribute.normalized;
+
+			const array2 = new array.constructor( indices.length * itemSize );
+
+			let index = 0, index2 = 0;
+
+			for ( let i = 0, l = indices.length; i < l; i ++ ) {
+
+				if ( attribute.isInterleavedBufferAttribute ) {
+
+					index = indices[ i ] * attribute.data.stride + attribute.offset;
+
+				} else {
+
+					index = indices[ i ] * itemSize;
+
+				}
+
+				for ( let j = 0; j < itemSize; j ++ ) {
+
+					array2[ index2 ++ ] = array[ index ++ ];
+
+				}
+
+			}
+
+			return new BufferAttribute( array2, itemSize, normalized );
+
+		}
+
+		//
+
+		if ( this.index === null ) {
+
+			console.warn( 'THREE.BufferGeometry.toNonIndexed(): BufferGeometry is already non-indexed.' );
+			return this;
+
+		}
+
+		const geometry2 = new BufferGeometry();
+
+		const indices = this.index.array;
+		const attributes = this.attributes;
+
+		// attributes
+
+		for ( const name in attributes ) {
+
+			const attribute = attributes[ name ];
+
+			const newAttribute = convertBufferAttribute( attribute, indices );
+
+			geometry2.setAttribute( name, newAttribute );
+
+		}
+
+		// morph attributes
+
+		const morphAttributes = this.morphAttributes;
+
+		for ( const name in morphAttributes ) {
+
+			const morphArray = [];
+			const morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes
+
+			for ( let i = 0, il = morphAttribute.length; i < il; i ++ ) {
+
+				const attribute = morphAttribute[ i ];
+
+				const newAttribute = convertBufferAttribute( attribute, indices );
+
+				morphArray.push( newAttribute );
+
+			}
+
+			geometry2.morphAttributes[ name ] = morphArray;
+
+		}
+
+		geometry2.morphTargetsRelative = this.morphTargetsRelative;
+
+		// groups
+
+		const groups = this.groups;
+
+		for ( let i = 0, l = groups.length; i < l; i ++ ) {
+
+			const group = groups[ i ];
+			geometry2.addGroup( group.start, group.count, group.materialIndex );
+
+		}
+
+		return geometry2;
+
+	}
+
+	toJSON() {
+
+		const data = {
+			metadata: {
+				version: 4.5,
+				type: 'BufferGeometry',
+				generator: 'BufferGeometry.toJSON'
+			}
+		};
+
+		// standard BufferGeometry serialization
+
+		data.uuid = this.uuid;
+		data.type = this.type;
+		if ( this.name !== '' ) data.name = this.name;
+		if ( Object.keys( this.userData ).length > 0 ) data.userData = this.userData;
+
+		if ( this.parameters !== undefined ) {
+
+			const parameters = this.parameters;
+
+			for ( const key in parameters ) {
+
+				if ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];
+
+			}
+
+			return data;
+
+		}
+
+		// for simplicity the code assumes attributes are not shared across geometries, see #15811
+
+		data.data = { attributes: {} };
+
+		const index = this.index;
+
+		if ( index !== null ) {
+
+			data.data.index = {
+				type: index.array.constructor.name,
+				array: Array.prototype.slice.call( index.array )
+			};
+
+		}
+
+		const attributes = this.attributes;
+
+		for ( const key in attributes ) {
+
+			const attribute = attributes[ key ];
+
+			data.data.attributes[ key ] = attribute.toJSON( data.data );
+
+		}
+
+		const morphAttributes = {};
+		let hasMorphAttributes = false;
+
+		for ( const key in this.morphAttributes ) {
+
+			const attributeArray = this.morphAttributes[ key ];
+
+			const array = [];
+
+			for ( let i = 0, il = attributeArray.length; i < il; i ++ ) {
+
+				const attribute = attributeArray[ i ];
+
+				array.push( attribute.toJSON( data.data ) );
+
+			}
+
+			if ( array.length > 0 ) {
+
+				morphAttributes[ key ] = array;
+
+				hasMorphAttributes = true;
+
+			}
+
+		}
+
+		if ( hasMorphAttributes ) {
+
+			data.data.morphAttributes = morphAttributes;
+			data.data.morphTargetsRelative = this.morphTargetsRelative;
+
+		}
+
+		const groups = this.groups;
+
+		if ( groups.length > 0 ) {
+
+			data.data.groups = JSON.parse( JSON.stringify( groups ) );
+
+		}
+
+		const boundingSphere = this.boundingSphere;
+
+		if ( boundingSphere !== null ) {
+
+			data.data.boundingSphere = {
+				center: boundingSphere.center.toArray(),
+				radius: boundingSphere.radius
+			};
+
+		}
+
+		return data;
+
+	}
+
+	clone() {
+
+		 return new this.constructor().copy( this );
+
+	}
+
+	copy( source ) {
+
+		// reset
+
+		this.index = null;
+		this.attributes = {};
+		this.morphAttributes = {};
+		this.groups = [];
+		this.boundingBox = null;
+		this.boundingSphere = null;
+
+		// used for storing cloned, shared data
+
+		const data = {};
+
+		// name
+
+		this.name = source.name;
+
+		// index
+
+		const index = source.index;
+
+		if ( index !== null ) {
+
+			this.setIndex( index.clone( data ) );
+
+		}
+
+		// attributes
+
+		const attributes = source.attributes;
+
+		for ( const name in attributes ) {
+
+			const attribute = attributes[ name ];
+			this.setAttribute( name, attribute.clone( data ) );
+
+		}
+
+		// morph attributes
+
+		const morphAttributes = source.morphAttributes;
+
+		for ( const name in morphAttributes ) {
+
+			const array = [];
+			const morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes
+
+			for ( let i = 0, l = morphAttribute.length; i < l; i ++ ) {
+
+				array.push( morphAttribute[ i ].clone( data ) );
+
+			}
+
+			this.morphAttributes[ name ] = array;
+
+		}
+
+		this.morphTargetsRelative = source.morphTargetsRelative;
+
+		// groups
+
+		const groups = source.groups;
+
+		for ( let i = 0, l = groups.length; i < l; i ++ ) {
+
+			const group = groups[ i ];
+			this.addGroup( group.start, group.count, group.materialIndex );
+
+		}
+
+		// bounding box
+
+		const boundingBox = source.boundingBox;
+
+		if ( boundingBox !== null ) {
+
+			this.boundingBox = boundingBox.clone();
+
+		}
+
+		// bounding sphere
+
+		const boundingSphere = source.boundingSphere;
+
+		if ( boundingSphere !== null ) {
+
+			this.boundingSphere = boundingSphere.clone();
+
+		}
+
+		// draw range
+
+		this.drawRange.start = source.drawRange.start;
+		this.drawRange.count = source.drawRange.count;
+
+		// user data
+
+		this.userData = source.userData;
+
+		// geometry generator parameters
+
+		if ( source.parameters !== undefined ) this.parameters = Object.assign( {}, source.parameters );
+
+		return this;
+
+	}
+
+	dispose() {
+
+		this.dispatchEvent( { type: 'dispose' } );
+
+	}
+
+}
+
+BufferGeometry.prototype.isBufferGeometry = true;
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/geometries/BoxGeometry.js
+
+
+
+
+class BoxGeometry extends BufferGeometry {
+
+	constructor( width = 1, height = 1, depth = 1, widthSegments = 1, heightSegments = 1, depthSegments = 1 ) {
+
+		super();
+
+		this.type = 'BoxGeometry';
+
+		this.parameters = {
+			width: width,
+			height: height,
+			depth: depth,
+			widthSegments: widthSegments,
+			heightSegments: heightSegments,
+			depthSegments: depthSegments
+		};
+
+		const scope = this;
+
+		// segments
+
+		widthSegments = Math.floor( widthSegments );
+		heightSegments = Math.floor( heightSegments );
+		depthSegments = Math.floor( depthSegments );
+
+		// buffers
+
+		const indices = [];
+		const vertices = [];
+		const normals = [];
+		const uvs = [];
+
+		// helper variables
+
+		let numberOfVertices = 0;
+		let groupStart = 0;
+
+		// build each side of the box geometry
+
+		buildPlane( 'z', 'y', 'x', - 1, - 1, depth, height, width, depthSegments, heightSegments, 0 ); // px
+		buildPlane( 'z', 'y', 'x', 1, - 1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx
+		buildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py
+		buildPlane( 'x', 'z', 'y', 1, - 1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny
+		buildPlane( 'x', 'y', 'z', 1, - 1, width, height, depth, widthSegments, heightSegments, 4 ); // pz
+		buildPlane( 'x', 'y', 'z', - 1, - 1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz
+
+		// build geometry
+
+		this.setIndex( indices );
+		this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
+		this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
+		this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
+
+		function buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) {
+
+			const segmentWidth = width / gridX;
+			const segmentHeight = height / gridY;
+
+			const widthHalf = width / 2;
+			const heightHalf = height / 2;
+			const depthHalf = depth / 2;
+
+			const gridX1 = gridX + 1;
+			const gridY1 = gridY + 1;
+
+			let vertexCounter = 0;
+			let groupCount = 0;
+
+			const vector = new Vector3();
+
+			// generate vertices, normals and uvs
+
+			for ( let iy = 0; iy < gridY1; iy ++ ) {
+
+				const y = iy * segmentHeight - heightHalf;
+
+				for ( let ix = 0; ix < gridX1; ix ++ ) {
+
+					const x = ix * segmentWidth - widthHalf;
+
+					// set values to correct vector component
+
+					vector[ u ] = x * udir;
+					vector[ v ] = y * vdir;
+					vector[ w ] = depthHalf;
+
+					// now apply vector to vertex buffer
+
+					vertices.push( vector.x, vector.y, vector.z );
+
+					// set values to correct vector component
+
+					vector[ u ] = 0;
+					vector[ v ] = 0;
+					vector[ w ] = depth > 0 ? 1 : - 1;
+
+					// now apply vector to normal buffer
+
+					normals.push( vector.x, vector.y, vector.z );
+
+					// uvs
+
+					uvs.push( ix / gridX );
+					uvs.push( 1 - ( iy / gridY ) );
+
+					// counters
+
+					vertexCounter += 1;
+
+				}
+
+			}
+
+			// indices
+
+			// 1. you need three indices to draw a single face
+			// 2. a single segment consists of two faces
+			// 3. so we need to generate six (2*3) indices per segment
+
+			for ( let iy = 0; iy < gridY; iy ++ ) {
+
+				for ( let ix = 0; ix < gridX; ix ++ ) {
+
+					const a = numberOfVertices + ix + gridX1 * iy;
+					const b = numberOfVertices + ix + gridX1 * ( iy + 1 );
+					const c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 );
+					const d = numberOfVertices + ( ix + 1 ) + gridX1 * iy;
+
+					// faces
+
+					indices.push( a, b, d );
+					indices.push( b, c, d );
+
+					// increase counter
+
+					groupCount += 6;
+
+				}
+
+			}
+
+			// add a group to the geometry. this will ensure multi material support
+
+			scope.addGroup( groupStart, groupCount, materialIndex );
+
+			// calculate new start value for groups
+
+			groupStart += groupCount;
+
+			// update total number of vertices
+
+			numberOfVertices += vertexCounter;
+
+		}
+
+	}
+
+	static fromJSON( data ) {
+
+		return new BoxGeometry( data.width, data.height, data.depth, data.widthSegments, data.heightSegments, data.depthSegments );
+
+	}
+
+}
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/geometries/PlaneGeometry.js
+
+
+
+class PlaneGeometry extends BufferGeometry {
+
+	constructor( width = 1, height = 1, widthSegments = 1, heightSegments = 1 ) {
+
+		super();
+		this.type = 'PlaneGeometry';
+
+		this.parameters = {
+			width: width,
+			height: height,
+			widthSegments: widthSegments,
+			heightSegments: heightSegments
+		};
+
+		const width_half = width / 2;
+		const height_half = height / 2;
+
+		const gridX = Math.floor( widthSegments );
+		const gridY = Math.floor( heightSegments );
+
+		const gridX1 = gridX + 1;
+		const gridY1 = gridY + 1;
+
+		const segment_width = width / gridX;
+		const segment_height = height / gridY;
+
+		//
+
+		const indices = [];
+		const vertices = [];
+		const normals = [];
+		const uvs = [];
+
+		for ( let iy = 0; iy < gridY1; iy ++ ) {
+
+			const y = iy * segment_height - height_half;
+
+			for ( let ix = 0; ix < gridX1; ix ++ ) {
+
+				const x = ix * segment_width - width_half;
+
+				vertices.push( x, - y, 0 );
+
+				normals.push( 0, 0, 1 );
+
+				uvs.push( ix / gridX );
+				uvs.push( 1 - ( iy / gridY ) );
+
+			}
+
+		}
+
+		for ( let iy = 0; iy < gridY; iy ++ ) {
+
+			for ( let ix = 0; ix < gridX; ix ++ ) {
+
+				const a = ix + gridX1 * iy;
+				const b = ix + gridX1 * ( iy + 1 );
+				const c = ( ix + 1 ) + gridX1 * ( iy + 1 );
+				const d = ( ix + 1 ) + gridX1 * iy;
+
+				indices.push( a, b, d );
+				indices.push( b, c, d );
+
+			}
+
+		}
+
+		this.setIndex( indices );
+		this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
+		this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
+		this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
+
+	}
+
+	static fromJSON( data ) {
+
+		return new PlaneGeometry( data.width, data.height, data.widthSegments, data.heightSegments );
+
+	}
+
+}
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/materials/Material.js
+
+
+
+
+let materialId = 0;
+
+class Material extends EventDispatcher {
+
+	constructor() {
+
+		super();
+
+		Object.defineProperty( this, 'id', { value: materialId ++ } );
+
+		this.uuid = generateUUID();
+
+		this.name = '';
+		this.type = 'Material';
+
+		this.fog = true;
+
+		this.blending = NormalBlending;
+		this.side = FrontSide;
+		this.vertexColors = false;
+
+		this.opacity = 1;
+		this.transparent = false;
+
+		this.blendSrc = SrcAlphaFactor;
+		this.blendDst = OneMinusSrcAlphaFactor;
+		this.blendEquation = AddEquation;
+		this.blendSrcAlpha = null;
+		this.blendDstAlpha = null;
+		this.blendEquationAlpha = null;
+
+		this.depthFunc = LessEqualDepth;
+		this.depthTest = true;
+		this.depthWrite = true;
+
+		this.stencilWriteMask = 0xff;
+		this.stencilFunc = AlwaysStencilFunc;
+		this.stencilRef = 0;
+		this.stencilFuncMask = 0xff;
+		this.stencilFail = KeepStencilOp;
+		this.stencilZFail = KeepStencilOp;
+		this.stencilZPass = KeepStencilOp;
+		this.stencilWrite = false;
+
+		this.clippingPlanes = null;
+		this.clipIntersection = false;
+		this.clipShadows = false;
+
+		this.shadowSide = null;
+
+		this.colorWrite = true;
+
+		this.precision = null; // override the renderer's default precision for this material
+
+		this.polygonOffset = false;
+		this.polygonOffsetFactor = 0;
+		this.polygonOffsetUnits = 0;
+
+		this.dithering = false;
+
+		this.alphaToCoverage = false;
+		this.premultipliedAlpha = false;
+
+		this.visible = true;
+
+		this.toneMapped = true;
+
+		this.userData = {};
+
+		this.version = 0;
+
+		this._alphaTest = 0;
+
+	}
+
+	get alphaTest() {
+
+		return this._alphaTest;
+
+	}
+
+	set alphaTest( value ) {
+
+		if ( this._alphaTest > 0 !== value > 0 ) {
+
+			this.version ++;
+
+		}
+
+		this._alphaTest = value;
+
+	}
+
+	onBuild( /* shaderobject, renderer */ ) {}
+
+	onBeforeRender( /* renderer, scene, camera, geometry, object, group */ ) {}
+
+	onBeforeCompile( /* shaderobject, renderer */ ) {}
+
+	customProgramCacheKey() {
+
+		return this.onBeforeCompile.toString();
+
+	}
+
+	setValues( values ) {
+
+		if ( values === undefined ) return;
+
+		for ( const key in values ) {
+
+			const newValue = values[ key ];
+
+			if ( newValue === undefined ) {
+
+				console.warn( 'THREE.Material: \'' + key + '\' parameter is undefined.' );
+				continue;
+
+			}
+
+			// for backward compatability if shading is set in the constructor
+			if ( key === 'shading' ) {
+
+				console.warn( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' );
+				this.flatShading = ( newValue === FlatShading ) ? true : false;
+				continue;
+
+			}
+
+			const currentValue = this[ key ];
+
+			if ( currentValue === undefined ) {
+
+				console.warn( 'THREE.' + this.type + ': \'' + key + '\' is not a property of this material.' );
+				continue;
+
+			}
+
+			if ( currentValue && currentValue.isColor ) {
+
+				currentValue.set( newValue );
+
+			} else if ( ( currentValue && currentValue.isVector3 ) && ( newValue && newValue.isVector3 ) ) {
+
+				currentValue.copy( newValue );
+
+			} else {
+
+				this[ key ] = newValue;
+
+			}
+
+		}
+
+	}
+
+	toJSON( meta ) {
+
+		const isRoot = ( meta === undefined || typeof meta === 'string' );
+
+		if ( isRoot ) {
+
+			meta = {
+				textures: {},
+				images: {}
+			};
+
+		}
+
+		const data = {
+			metadata: {
+				version: 4.5,
+				type: 'Material',
+				generator: 'Material.toJSON'
+			}
+		};
+
+		// standard Material serialization
+		data.uuid = this.uuid;
+		data.type = this.type;
+
+		if ( this.name !== '' ) data.name = this.name;
+
+		if ( this.color && this.color.isColor ) data.color = this.color.getHex();
+
+		if ( this.roughness !== undefined ) data.roughness = this.roughness;
+		if ( this.metalness !== undefined ) data.metalness = this.metalness;
+
+		if ( this.sheen !== undefined ) data.sheen = this.sheen;
+		if ( this.sheenColor && this.sheenColor.isColor ) data.sheenColor = this.sheenColor.getHex();
+		if ( this.sheenRoughness !== undefined ) data.sheenRoughness = this.sheenRoughness;
+		if ( this.emissive && this.emissive.isColor ) data.emissive = this.emissive.getHex();
+		if ( this.emissiveIntensity && this.emissiveIntensity !== 1 ) data.emissiveIntensity = this.emissiveIntensity;
+
+		if ( this.specular && this.specular.isColor ) data.specular = this.specular.getHex();
+		if ( this.specularIntensity !== undefined ) data.specularIntensity = this.specularIntensity;
+		if ( this.specularColor && this.specularColor.isColor ) data.specularColor = this.specularColor.getHex();
+		if ( this.shininess !== undefined ) data.shininess = this.shininess;
+		if ( this.clearcoat !== undefined ) data.clearcoat = this.clearcoat;
+		if ( this.clearcoatRoughness !== undefined ) data.clearcoatRoughness = this.clearcoatRoughness;
+
+		if ( this.clearcoatMap && this.clearcoatMap.isTexture ) {
+
+			data.clearcoatMap = this.clearcoatMap.toJSON( meta ).uuid;
+
+		}
+
+		if ( this.clearcoatRoughnessMap && this.clearcoatRoughnessMap.isTexture ) {
+
+			data.clearcoatRoughnessMap = this.clearcoatRoughnessMap.toJSON( meta ).uuid;
+
+		}
+
+		if ( this.clearcoatNormalMap && this.clearcoatNormalMap.isTexture ) {
+
+			data.clearcoatNormalMap = this.clearcoatNormalMap.toJSON( meta ).uuid;
+			data.clearcoatNormalScale = this.clearcoatNormalScale.toArray();
+
+		}
+
+		if ( this.map && this.map.isTexture ) data.map = this.map.toJSON( meta ).uuid;
+		if ( this.matcap && this.matcap.isTexture ) data.matcap = this.matcap.toJSON( meta ).uuid;
+		if ( this.alphaMap && this.alphaMap.isTexture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid;
+
+		if ( this.lightMap && this.lightMap.isTexture ) {
+
+			data.lightMap = this.lightMap.toJSON( meta ).uuid;
+			data.lightMapIntensity = this.lightMapIntensity;
+
+		}
+
+		if ( this.aoMap && this.aoMap.isTexture ) {
+
+			data.aoMap = this.aoMap.toJSON( meta ).uuid;
+			data.aoMapIntensity = this.aoMapIntensity;
+
+		}
+
+		if ( this.bumpMap && this.bumpMap.isTexture ) {
+
+			data.bumpMap = this.bumpMap.toJSON( meta ).uuid;
+			data.bumpScale = this.bumpScale;
+
+		}
+
+		if ( this.normalMap && this.normalMap.isTexture ) {
+
+			data.normalMap = this.normalMap.toJSON( meta ).uuid;
+			data.normalMapType = this.normalMapType;
+			data.normalScale = this.normalScale.toArray();
+
+		}
+
+		if ( this.displacementMap && this.displacementMap.isTexture ) {
+
+			data.displacementMap = this.displacementMap.toJSON( meta ).uuid;
+			data.displacementScale = this.displacementScale;
+			data.displacementBias = this.displacementBias;
+
+		}
+
+		if ( this.roughnessMap && this.roughnessMap.isTexture ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid;
+		if ( this.metalnessMap && this.metalnessMap.isTexture ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid;
+
+		if ( this.emissiveMap && this.emissiveMap.isTexture ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid;
+		if ( this.specularMap && this.specularMap.isTexture ) data.specularMap = this.specularMap.toJSON( meta ).uuid;
+		if ( this.specularIntensityMap && this.specularIntensityMap.isTexture ) data.specularIntensityMap = this.specularIntensityMap.toJSON( meta ).uuid;
+		if ( this.specularColorMap && this.specularColorMap.isTexture ) data.specularColorMap = this.specularColorMap.toJSON( meta ).uuid;
+
+		if ( this.envMap && this.envMap.isTexture ) {
+
+			data.envMap = this.envMap.toJSON( meta ).uuid;
+
+			if ( this.combine !== undefined ) data.combine = this.combine;
+
+		}
+
+		if ( this.envMapIntensity !== undefined ) data.envMapIntensity = this.envMapIntensity;
+		if ( this.reflectivity !== undefined ) data.reflectivity = this.reflectivity;
+		if ( this.refractionRatio !== undefined ) data.refractionRatio = this.refractionRatio;
+
+		if ( this.gradientMap && this.gradientMap.isTexture ) {
+
+			data.gradientMap = this.gradientMap.toJSON( meta ).uuid;
+
+		}
+
+		if ( this.transmission !== undefined ) data.transmission = this.transmission;
+		if ( this.transmissionMap && this.transmissionMap.isTexture ) data.transmissionMap = this.transmissionMap.toJSON( meta ).uuid;
+		if ( this.thickness !== undefined ) data.thickness = this.thickness;
+		if ( this.thicknessMap && this.thicknessMap.isTexture ) data.thicknessMap = this.thicknessMap.toJSON( meta ).uuid;
+		if ( this.attenuationDistance !== undefined ) data.attenuationDistance = this.attenuationDistance;
+		if ( this.attenuationColor !== undefined ) data.attenuationColor = this.attenuationColor.getHex();
+
+		if ( this.size !== undefined ) data.size = this.size;
+		if ( this.shadowSide !== null ) data.shadowSide = this.shadowSide;
+		if ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation;
+
+		if ( this.blending !== NormalBlending ) data.blending = this.blending;
+		if ( this.side !== FrontSide ) data.side = this.side;
+		if ( this.vertexColors ) data.vertexColors = true;
+
+		if ( this.opacity < 1 ) data.opacity = this.opacity;
+		if ( this.transparent === true ) data.transparent = this.transparent;
+
+		data.depthFunc = this.depthFunc;
+		data.depthTest = this.depthTest;
+		data.depthWrite = this.depthWrite;
+		data.colorWrite = this.colorWrite;
+
+		data.stencilWrite = this.stencilWrite;
+		data.stencilWriteMask = this.stencilWriteMask;
+		data.stencilFunc = this.stencilFunc;
+		data.stencilRef = this.stencilRef;
+		data.stencilFuncMask = this.stencilFuncMask;
+		data.stencilFail = this.stencilFail;
+		data.stencilZFail = this.stencilZFail;
+		data.stencilZPass = this.stencilZPass;
+
+		// rotation (SpriteMaterial)
+		if ( this.rotation && this.rotation !== 0 ) data.rotation = this.rotation;
+
+		if ( this.polygonOffset === true ) data.polygonOffset = true;
+		if ( this.polygonOffsetFactor !== 0 ) data.polygonOffsetFactor = this.polygonOffsetFactor;
+		if ( this.polygonOffsetUnits !== 0 ) data.polygonOffsetUnits = this.polygonOffsetUnits;
+
+		if ( this.linewidth && this.linewidth !== 1 ) data.linewidth = this.linewidth;
+		if ( this.dashSize !== undefined ) data.dashSize = this.dashSize;
+		if ( this.gapSize !== undefined ) data.gapSize = this.gapSize;
+		if ( this.scale !== undefined ) data.scale = this.scale;
+
+		if ( this.dithering === true ) data.dithering = true;
+
+		if ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest;
+		if ( this.alphaToCoverage === true ) data.alphaToCoverage = this.alphaToCoverage;
+		if ( this.premultipliedAlpha === true ) data.premultipliedAlpha = this.premultipliedAlpha;
+
+		if ( this.wireframe === true ) data.wireframe = this.wireframe;
+		if ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth;
+		if ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap;
+		if ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin;
+
+		if ( this.flatShading === true ) data.flatShading = this.flatShading;
+
+		if ( this.visible === false ) data.visible = false;
+
+		if ( this.toneMapped === false ) data.toneMapped = false;
+
+		if ( JSON.stringify( this.userData ) !== '{}' ) data.userData = this.userData;
+
+		// TODO: Copied from Object3D.toJSON
+
+		function extractFromCache( cache ) {
+
+			const values = [];
+
+			for ( const key in cache ) {
+
+				const data = cache[ key ];
+				delete data.metadata;
+				values.push( data );
+
+			}
+
+			return values;
+
+		}
+
+		if ( isRoot ) {
+
+			const textures = extractFromCache( meta.textures );
+			const images = extractFromCache( meta.images );
+
+			if ( textures.length > 0 ) data.textures = textures;
+			if ( images.length > 0 ) data.images = images;
+
+		}
+
+		return data;
+
+	}
+
+	clone() {
+
+		return new this.constructor().copy( this );
+
+	}
+
+	copy( source ) {
+
+		this.name = source.name;
+
+		this.fog = source.fog;
+
+		this.blending = source.blending;
+		this.side = source.side;
+		this.vertexColors = source.vertexColors;
+
+		this.opacity = source.opacity;
+		this.transparent = source.transparent;
+
+		this.blendSrc = source.blendSrc;
+		this.blendDst = source.blendDst;
+		this.blendEquation = source.blendEquation;
+		this.blendSrcAlpha = source.blendSrcAlpha;
+		this.blendDstAlpha = source.blendDstAlpha;
+		this.blendEquationAlpha = source.blendEquationAlpha;
+
+		this.depthFunc = source.depthFunc;
+		this.depthTest = source.depthTest;
+		this.depthWrite = source.depthWrite;
+
+		this.stencilWriteMask = source.stencilWriteMask;
+		this.stencilFunc = source.stencilFunc;
+		this.stencilRef = source.stencilRef;
+		this.stencilFuncMask = source.stencilFuncMask;
+		this.stencilFail = source.stencilFail;
+		this.stencilZFail = source.stencilZFail;
+		this.stencilZPass = source.stencilZPass;
+		this.stencilWrite = source.stencilWrite;
+
+		const srcPlanes = source.clippingPlanes;
+		let dstPlanes = null;
+
+		if ( srcPlanes !== null ) {
+
+			const n = srcPlanes.length;
+			dstPlanes = new Array( n );
+
+			for ( let i = 0; i !== n; ++ i ) {
+
+				dstPlanes[ i ] = srcPlanes[ i ].clone();
+
+			}
+
+		}
+
+		this.clippingPlanes = dstPlanes;
+		this.clipIntersection = source.clipIntersection;
+		this.clipShadows = source.clipShadows;
+
+		this.shadowSide = source.shadowSide;
+
+		this.colorWrite = source.colorWrite;
+
+		this.precision = source.precision;
+
+		this.polygonOffset = source.polygonOffset;
+		this.polygonOffsetFactor = source.polygonOffsetFactor;
+		this.polygonOffsetUnits = source.polygonOffsetUnits;
+
+		this.dithering = source.dithering;
+
+		this.alphaTest = source.alphaTest;
+		this.alphaToCoverage = source.alphaToCoverage;
+		this.premultipliedAlpha = source.premultipliedAlpha;
+
+		this.visible = source.visible;
+
+		this.toneMapped = source.toneMapped;
+
+		this.userData = JSON.parse( JSON.stringify( source.userData ) );
+
+		return this;
+
+	}
+
+	dispose() {
+
+		this.dispatchEvent( { type: 'dispose' } );
+
+	}
+
+	set needsUpdate( value ) {
+
+		if ( value === true ) this.version ++;
+
+	}
+
+}
+
+Material.prototype.isMaterial = true;
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/UniformsUtils.js
+/**
+ * Uniform Utilities
+ */
+
+function cloneUniforms( src ) {
+
+	const dst = {};
+
+	for ( const u in src ) {
+
+		dst[ u ] = {};
+
+		for ( const p in src[ u ] ) {
+
+			const property = src[ u ][ p ];
+
+			if ( property && ( property.isColor ||
+				property.isMatrix3 || property.isMatrix4 ||
+				property.isVector2 || property.isVector3 || property.isVector4 ||
+				property.isTexture || property.isQuaternion ) ) {
+
+				dst[ u ][ p ] = property.clone();
+
+			} else if ( Array.isArray( property ) ) {
+
+				dst[ u ][ p ] = property.slice();
+
+			} else {
+
+				dst[ u ][ p ] = property;
+
+			}
+
+		}
+
+	}
+
+	return dst;
+
+}
+
+function mergeUniforms( uniforms ) {
+
+	const merged = {};
+
+	for ( let u = 0; u < uniforms.length; u ++ ) {
+
+		const tmp = cloneUniforms( uniforms[ u ] );
+
+		for ( const p in tmp ) {
+
+			merged[ p ] = tmp[ p ];
+
+		}
+
+	}
+
+	return merged;
+
+}
+
+// Legacy
+
+const UniformsUtils = { clone: cloneUniforms, merge: mergeUniforms };
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/default_vertex.glsl.js
+/* harmony default export */ const default_vertex_glsl = (/* glsl */`
+void main() {
+	gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
+}
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/default_fragment.glsl.js
+/* harmony default export */ const default_fragment_glsl = (/* glsl */`
+void main() {
+	gl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );
+}
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/materials/ShaderMaterial.js
+
+
+
+
+
+
+/**
+ * parameters = {
+ *  defines: { "label" : "value" },
+ *  uniforms: { "parameter1": { value: 1.0 }, "parameter2": { value2: 2 } },
+ *
+ *  fragmentShader: <string>,
+ *  vertexShader: <string>,
+ *
+ *  wireframe: <boolean>,
+ *  wireframeLinewidth: <float>,
+ *
+ *  lights: <bool>
+ * }
+ */
+
+class ShaderMaterial extends Material {
+
+	constructor( parameters ) {
+
+		super();
+
+		this.type = 'ShaderMaterial';
+
+		this.defines = {};
+		this.uniforms = {};
+
+		this.vertexShader = default_vertex_glsl;
+		this.fragmentShader = default_fragment_glsl;
+
+		this.linewidth = 1;
+
+		this.wireframe = false;
+		this.wireframeLinewidth = 1;
+
+		this.fog = false; // set to use scene fog
+		this.lights = false; // set to use scene lights
+		this.clipping = false; // set to use user-defined clipping planes
+
+		this.extensions = {
+			derivatives: false, // set to use derivatives
+			fragDepth: false, // set to use fragment depth values
+			drawBuffers: false, // set to use draw buffers
+			shaderTextureLOD: false // set to use shader texture LOD
+		};
+
+		// When rendered geometry doesn't include these attributes but the material does,
+		// use these default values in WebGL. This avoids errors when buffer data is missing.
+		this.defaultAttributeValues = {
+			'color': [ 1, 1, 1 ],
+			'uv': [ 0, 0 ],
+			'uv2': [ 0, 0 ]
+		};
+
+		this.index0AttributeName = undefined;
+		this.uniformsNeedUpdate = false;
+
+		this.glslVersion = null;
+
+		if ( parameters !== undefined ) {
+
+			if ( parameters.attributes !== undefined ) {
+
+				console.error( 'THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.' );
+
+			}
+
+			this.setValues( parameters );
+
+		}
+
+	}
+
+	copy( source ) {
+
+		super.copy( source );
+
+		this.fragmentShader = source.fragmentShader;
+		this.vertexShader = source.vertexShader;
+
+		this.uniforms = cloneUniforms( source.uniforms );
+
+		this.defines = Object.assign( {}, source.defines );
+
+		this.wireframe = source.wireframe;
+		this.wireframeLinewidth = source.wireframeLinewidth;
+
+		this.lights = source.lights;
+		this.clipping = source.clipping;
+
+		this.extensions = Object.assign( {}, source.extensions );
+
+		this.glslVersion = source.glslVersion;
+
+		return this;
+
+	}
+
+	toJSON( meta ) {
+
+		const data = super.toJSON( meta );
+
+		data.glslVersion = this.glslVersion;
+		data.uniforms = {};
+
+		for ( const name in this.uniforms ) {
+
+			const uniform = this.uniforms[ name ];
+			const value = uniform.value;
+
+			if ( value && value.isTexture ) {
+
+				data.uniforms[ name ] = {
+					type: 't',
+					value: value.toJSON( meta ).uuid
+				};
+
+			} else if ( value && value.isColor ) {
+
+				data.uniforms[ name ] = {
+					type: 'c',
+					value: value.getHex()
+				};
+
+			} else if ( value && value.isVector2 ) {
+
+				data.uniforms[ name ] = {
+					type: 'v2',
+					value: value.toArray()
+				};
+
+			} else if ( value && value.isVector3 ) {
+
+				data.uniforms[ name ] = {
+					type: 'v3',
+					value: value.toArray()
+				};
+
+			} else if ( value && value.isVector4 ) {
+
+				data.uniforms[ name ] = {
+					type: 'v4',
+					value: value.toArray()
+				};
+
+			} else if ( value && value.isMatrix3 ) {
+
+				data.uniforms[ name ] = {
+					type: 'm3',
+					value: value.toArray()
+				};
+
+			} else if ( value && value.isMatrix4 ) {
+
+				data.uniforms[ name ] = {
+					type: 'm4',
+					value: value.toArray()
+				};
+
+			} else {
+
+				data.uniforms[ name ] = {
+					value: value
+				};
+
+				// note: the array variants v2v, v3v, v4v, m4v and tv are not supported so far
+
+			}
+
+		}
+
+		if ( Object.keys( this.defines ).length > 0 ) data.defines = this.defines;
+
+		data.vertexShader = this.vertexShader;
+		data.fragmentShader = this.fragmentShader;
+
+		const extensions = {};
+
+		for ( const key in this.extensions ) {
+
+			if ( this.extensions[ key ] === true ) extensions[ key ] = true;
+
+		}
+
+		if ( Object.keys( extensions ).length > 0 ) data.extensions = extensions;
+
+		return data;
+
+	}
+
+}
+
+ShaderMaterial.prototype.isShaderMaterial = true;
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/math/Ray.js
+
+
+const Ray_vector = /*@__PURE__*/ new Vector3();
+const _segCenter = /*@__PURE__*/ new Vector3();
+const _segDir = /*@__PURE__*/ new Vector3();
+const _diff = /*@__PURE__*/ new Vector3();
+
+const _edge1 = /*@__PURE__*/ new Vector3();
+const _edge2 = /*@__PURE__*/ new Vector3();
+const _normal = /*@__PURE__*/ new Vector3();
+
+class Ray {
+
+	constructor( origin = new Vector3(), direction = new Vector3( 0, 0, - 1 ) ) {
+
+		this.origin = origin;
+		this.direction = direction;
+
+	}
+
+	set( origin, direction ) {
+
+		this.origin.copy( origin );
+		this.direction.copy( direction );
+
+		return this;
+
+	}
+
+	copy( ray ) {
+
+		this.origin.copy( ray.origin );
+		this.direction.copy( ray.direction );
+
+		return this;
+
+	}
+
+	at( t, target ) {
+
+		return target.copy( this.direction ).multiplyScalar( t ).add( this.origin );
+
+	}
+
+	lookAt( v ) {
+
+		this.direction.copy( v ).sub( this.origin ).normalize();
+
+		return this;
+
+	}
+
+	recast( t ) {
+
+		this.origin.copy( this.at( t, Ray_vector ) );
+
+		return this;
+
+	}
+
+	closestPointToPoint( point, target ) {
+
+		target.subVectors( point, this.origin );
+
+		const directionDistance = target.dot( this.direction );
+
+		if ( directionDistance < 0 ) {
+
+			return target.copy( this.origin );
+
+		}
+
+		return target.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );
+
+	}
+
+	distanceToPoint( point ) {
+
+		return Math.sqrt( this.distanceSqToPoint( point ) );
+
+	}
+
+	distanceSqToPoint( point ) {
+
+		const directionDistance = Ray_vector.subVectors( point, this.origin ).dot( this.direction );
+
+		// point behind the ray
+
+		if ( directionDistance < 0 ) {
+
+			return this.origin.distanceToSquared( point );
+
+		}
+
+		Ray_vector.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );
+
+		return Ray_vector.distanceToSquared( point );
+
+	}
+
+	distanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) {
+
+		// from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteDistRaySegment.h
+		// It returns the min distance between the ray and the segment
+		// defined by v0 and v1
+		// It can also set two optional targets :
+		// - The closest point on the ray
+		// - The closest point on the segment
+
+		_segCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 );
+		_segDir.copy( v1 ).sub( v0 ).normalize();
+		_diff.copy( this.origin ).sub( _segCenter );
+
+		const segExtent = v0.distanceTo( v1 ) * 0.5;
+		const a01 = - this.direction.dot( _segDir );
+		const b0 = _diff.dot( this.direction );
+		const b1 = - _diff.dot( _segDir );
+		const c = _diff.lengthSq();
+		const det = Math.abs( 1 - a01 * a01 );
+		let s0, s1, sqrDist, extDet;
+
+		if ( det > 0 ) {
+
+			// The ray and segment are not parallel.
+
+			s0 = a01 * b1 - b0;
+			s1 = a01 * b0 - b1;
+			extDet = segExtent * det;
+
+			if ( s0 >= 0 ) {
+
+				if ( s1 >= - extDet ) {
+
+					if ( s1 <= extDet ) {
+
+						// region 0
+						// Minimum at interior points of ray and segment.
+
+						const invDet = 1 / det;
+						s0 *= invDet;
+						s1 *= invDet;
+						sqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c;
+
+					} else {
+
+						// region 1
+
+						s1 = segExtent;
+						s0 = Math.max( 0, - ( a01 * s1 + b0 ) );
+						sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;
+
+					}
+
+				} else {
+
+					// region 5
+
+					s1 = - segExtent;
+					s0 = Math.max( 0, - ( a01 * s1 + b0 ) );
+					sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;
+
+				}
+
+			} else {
+
+				if ( s1 <= - extDet ) {
+
+					// region 4
+
+					s0 = Math.max( 0, - ( - a01 * segExtent + b0 ) );
+					s1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );
+					sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;
+
+				} else if ( s1 <= extDet ) {
+
+					// region 3
+
+					s0 = 0;
+					s1 = Math.min( Math.max( - segExtent, - b1 ), segExtent );
+					sqrDist = s1 * ( s1 + 2 * b1 ) + c;
+
+				} else {
+
+					// region 2
+
+					s0 = Math.max( 0, - ( a01 * segExtent + b0 ) );
+					s1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );
+					sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;
+
+				}
+
+			}
+
+		} else {
+
+			// Ray and segment are parallel.
+
+			s1 = ( a01 > 0 ) ? - segExtent : segExtent;
+			s0 = Math.max( 0, - ( a01 * s1 + b0 ) );
+			sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;
+
+		}
+
+		if ( optionalPointOnRay ) {
+
+			optionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin );
+
+		}
+
+		if ( optionalPointOnSegment ) {
+
+			optionalPointOnSegment.copy( _segDir ).multiplyScalar( s1 ).add( _segCenter );
+
+		}
+
+		return sqrDist;
+
+	}
+
+	intersectSphere( sphere, target ) {
+
+		Ray_vector.subVectors( sphere.center, this.origin );
+		const tca = Ray_vector.dot( this.direction );
+		const d2 = Ray_vector.dot( Ray_vector ) - tca * tca;
+		const radius2 = sphere.radius * sphere.radius;
+
+		if ( d2 > radius2 ) return null;
+
+		const thc = Math.sqrt( radius2 - d2 );
+
+		// t0 = first intersect point - entrance on front of sphere
+		const t0 = tca - thc;
+
+		// t1 = second intersect point - exit point on back of sphere
+		const t1 = tca + thc;
+
+		// test to see if both t0 and t1 are behind the ray - if so, return null
+		if ( t0 < 0 && t1 < 0 ) return null;
+
+		// test to see if t0 is behind the ray:
+		// if it is, the ray is inside the sphere, so return the second exit point scaled by t1,
+		// in order to always return an intersect point that is in front of the ray.
+		if ( t0 < 0 ) return this.at( t1, target );
+
+		// else t0 is in front of the ray, so return the first collision point scaled by t0
+		return this.at( t0, target );
+
+	}
+
+	intersectsSphere( sphere ) {
+
+		return this.distanceSqToPoint( sphere.center ) <= ( sphere.radius * sphere.radius );
+
+	}
+
+	distanceToPlane( plane ) {
+
+		const denominator = plane.normal.dot( this.direction );
+
+		if ( denominator === 0 ) {
+
+			// line is coplanar, return origin
+			if ( plane.distanceToPoint( this.origin ) === 0 ) {
+
+				return 0;
+
+			}
+
+			// Null is preferable to undefined since undefined means.... it is undefined
+
+			return null;
+
+		}
+
+		const t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator;
+
+		// Return if the ray never intersects the plane
+
+		return t >= 0 ? t : null;
+
+	}
+
+	intersectPlane( plane, target ) {
+
+		const t = this.distanceToPlane( plane );
+
+		if ( t === null ) {
+
+			return null;
+
+		}
+
+		return this.at( t, target );
+
+	}
+
+	intersectsPlane( plane ) {
+
+		// check if the ray lies on the plane first
+
+		const distToPoint = plane.distanceToPoint( this.origin );
+
+		if ( distToPoint === 0 ) {
+
+			return true;
+
+		}
+
+		const denominator = plane.normal.dot( this.direction );
+
+		if ( denominator * distToPoint < 0 ) {
+
+			return true;
+
+		}
+
+		// ray origin is behind the plane (and is pointing behind it)
+
+		return false;
+
+	}
+
+	intersectBox( box, target ) {
+
+		let tmin, tmax, tymin, tymax, tzmin, tzmax;
+
+		const invdirx = 1 / this.direction.x,
+			invdiry = 1 / this.direction.y,
+			invdirz = 1 / this.direction.z;
+
+		const origin = this.origin;
+
+		if ( invdirx >= 0 ) {
+
+			tmin = ( box.min.x - origin.x ) * invdirx;
+			tmax = ( box.max.x - origin.x ) * invdirx;
+
+		} else {
+
+			tmin = ( box.max.x - origin.x ) * invdirx;
+			tmax = ( box.min.x - origin.x ) * invdirx;
+
+		}
+
+		if ( invdiry >= 0 ) {
+
+			tymin = ( box.min.y - origin.y ) * invdiry;
+			tymax = ( box.max.y - origin.y ) * invdiry;
+
+		} else {
+
+			tymin = ( box.max.y - origin.y ) * invdiry;
+			tymax = ( box.min.y - origin.y ) * invdiry;
+
+		}
+
+		if ( ( tmin > tymax ) || ( tymin > tmax ) ) return null;
+
+		// These lines also handle the case where tmin or tmax is NaN
+		// (result of 0 * Infinity). x !== x returns true if x is NaN
+
+		if ( tymin > tmin || tmin !== tmin ) tmin = tymin;
+
+		if ( tymax < tmax || tmax !== tmax ) tmax = tymax;
+
+		if ( invdirz >= 0 ) {
+
+			tzmin = ( box.min.z - origin.z ) * invdirz;
+			tzmax = ( box.max.z - origin.z ) * invdirz;
+
+		} else {
+
+			tzmin = ( box.max.z - origin.z ) * invdirz;
+			tzmax = ( box.min.z - origin.z ) * invdirz;
+
+		}
+
+		if ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null;
+
+		if ( tzmin > tmin || tmin !== tmin ) tmin = tzmin;
+
+		if ( tzmax < tmax || tmax !== tmax ) tmax = tzmax;
+
+		//return point closest to the ray (positive side)
+
+		if ( tmax < 0 ) return null;
+
+		return this.at( tmin >= 0 ? tmin : tmax, target );
+
+	}
+
+	intersectsBox( box ) {
+
+		return this.intersectBox( box, Ray_vector ) !== null;
+
+	}
+
+	intersectTriangle( a, b, c, backfaceCulling, target ) {
+
+		// Compute the offset origin, edges, and normal.
+
+		// from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h
+
+		_edge1.subVectors( b, a );
+		_edge2.subVectors( c, a );
+		_normal.crossVectors( _edge1, _edge2 );
+
+		// Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,
+		// E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by
+		//   |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))
+		//   |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))
+		//   |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)
+		let DdN = this.direction.dot( _normal );
+		let sign;
+
+		if ( DdN > 0 ) {
+
+			if ( backfaceCulling ) return null;
+			sign = 1;
+
+		} else if ( DdN < 0 ) {
+
+			sign = - 1;
+			DdN = - DdN;
+
+		} else {
+
+			return null;
+
+		}
+
+		_diff.subVectors( this.origin, a );
+		const DdQxE2 = sign * this.direction.dot( _edge2.crossVectors( _diff, _edge2 ) );
+
+		// b1 < 0, no intersection
+		if ( DdQxE2 < 0 ) {
+
+			return null;
+
+		}
+
+		const DdE1xQ = sign * this.direction.dot( _edge1.cross( _diff ) );
+
+		// b2 < 0, no intersection
+		if ( DdE1xQ < 0 ) {
+
+			return null;
+
+		}
+
+		// b1+b2 > 1, no intersection
+		if ( DdQxE2 + DdE1xQ > DdN ) {
+
+			return null;
+
+		}
+
+		// Line intersects triangle, check if ray does.
+		const QdN = - sign * _diff.dot( _normal );
+
+		// t < 0, no intersection
+		if ( QdN < 0 ) {
+
+			return null;
+
+		}
+
+		// Ray intersects triangle.
+		return this.at( QdN / DdN, target );
+
+	}
+
+	applyMatrix4( matrix4 ) {
+
+		this.origin.applyMatrix4( matrix4 );
+		this.direction.transformDirection( matrix4 );
+
+		return this;
+
+	}
+
+	equals( ray ) {
+
+		return ray.origin.equals( this.origin ) && ray.direction.equals( this.direction );
+
+	}
+
+	clone() {
+
+		return new this.constructor().copy( this );
+
+	}
+
+}
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/math/Triangle.js
+
+
+const Triangle_v0 = /*@__PURE__*/ new Vector3();
+const Triangle_v1 = /*@__PURE__*/ new Vector3();
+const Triangle_v2 = /*@__PURE__*/ new Vector3();
+const _v3 = /*@__PURE__*/ new Vector3();
+
+const _vab = /*@__PURE__*/ new Vector3();
+const _vac = /*@__PURE__*/ new Vector3();
+const _vbc = /*@__PURE__*/ new Vector3();
+const _vap = /*@__PURE__*/ new Vector3();
+const _vbp = /*@__PURE__*/ new Vector3();
+const _vcp = /*@__PURE__*/ new Vector3();
+
+class Triangle {
+
+	constructor( a = new Vector3(), b = new Vector3(), c = new Vector3() ) {
+
+		this.a = a;
+		this.b = b;
+		this.c = c;
+
+	}
+
+	static getNormal( a, b, c, target ) {
+
+		target.subVectors( c, b );
+		Triangle_v0.subVectors( a, b );
+		target.cross( Triangle_v0 );
+
+		const targetLengthSq = target.lengthSq();
+		if ( targetLengthSq > 0 ) {
+
+			return target.multiplyScalar( 1 / Math.sqrt( targetLengthSq ) );
+
+		}
+
+		return target.set( 0, 0, 0 );
+
+	}
+
+	// static/instance method to calculate barycentric coordinates
+	// based on: http://www.blackpawn.com/texts/pointinpoly/default.html
+	static getBarycoord( point, a, b, c, target ) {
+
+		Triangle_v0.subVectors( c, a );
+		Triangle_v1.subVectors( b, a );
+		Triangle_v2.subVectors( point, a );
+
+		const dot00 = Triangle_v0.dot( Triangle_v0 );
+		const dot01 = Triangle_v0.dot( Triangle_v1 );
+		const dot02 = Triangle_v0.dot( Triangle_v2 );
+		const dot11 = Triangle_v1.dot( Triangle_v1 );
+		const dot12 = Triangle_v1.dot( Triangle_v2 );
+
+		const denom = ( dot00 * dot11 - dot01 * dot01 );
+
+		// collinear or singular triangle
+		if ( denom === 0 ) {
+
+			// arbitrary location outside of triangle?
+			// not sure if this is the best idea, maybe should be returning undefined
+			return target.set( - 2, - 1, - 1 );
+
+		}
+
+		const invDenom = 1 / denom;
+		const u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;
+		const v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;
+
+		// barycentric coordinates must always sum to 1
+		return target.set( 1 - u - v, v, u );
+
+	}
+
+	static containsPoint( point, a, b, c ) {
+
+		this.getBarycoord( point, a, b, c, _v3 );
+
+		return ( _v3.x >= 0 ) && ( _v3.y >= 0 ) && ( ( _v3.x + _v3.y ) <= 1 );
+
+	}
+
+	static getUV( point, p1, p2, p3, uv1, uv2, uv3, target ) {
+
+		this.getBarycoord( point, p1, p2, p3, _v3 );
+
+		target.set( 0, 0 );
+		target.addScaledVector( uv1, _v3.x );
+		target.addScaledVector( uv2, _v3.y );
+		target.addScaledVector( uv3, _v3.z );
+
+		return target;
+
+	}
+
+	static isFrontFacing( a, b, c, direction ) {
+
+		Triangle_v0.subVectors( c, b );
+		Triangle_v1.subVectors( a, b );
+
+		// strictly front facing
+		return ( Triangle_v0.cross( Triangle_v1 ).dot( direction ) < 0 ) ? true : false;
+
+	}
+
+	set( a, b, c ) {
+
+		this.a.copy( a );
+		this.b.copy( b );
+		this.c.copy( c );
+
+		return this;
+
+	}
+
+	setFromPointsAndIndices( points, i0, i1, i2 ) {
+
+		this.a.copy( points[ i0 ] );
+		this.b.copy( points[ i1 ] );
+		this.c.copy( points[ i2 ] );
+
+		return this;
+
+	}
+
+	setFromAttributeAndIndices( attribute, i0, i1, i2 ) {
+
+		this.a.fromBufferAttribute( attribute, i0 );
+		this.b.fromBufferAttribute( attribute, i1 );
+		this.c.fromBufferAttribute( attribute, i2 );
+
+		return this;
+
+	}
+
+	clone() {
+
+		return new this.constructor().copy( this );
+
+	}
+
+	copy( triangle ) {
+
+		this.a.copy( triangle.a );
+		this.b.copy( triangle.b );
+		this.c.copy( triangle.c );
+
+		return this;
+
+	}
+
+	getArea() {
+
+		Triangle_v0.subVectors( this.c, this.b );
+		Triangle_v1.subVectors( this.a, this.b );
+
+		return Triangle_v0.cross( Triangle_v1 ).length() * 0.5;
+
+	}
+
+	getMidpoint( target ) {
+
+		return target.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 );
+
+	}
+
+	getNormal( target ) {
+
+		return Triangle.getNormal( this.a, this.b, this.c, target );
+
+	}
+
+	getPlane( target ) {
+
+		return target.setFromCoplanarPoints( this.a, this.b, this.c );
+
+	}
+
+	getBarycoord( point, target ) {
+
+		return Triangle.getBarycoord( point, this.a, this.b, this.c, target );
+
+	}
+
+	getUV( point, uv1, uv2, uv3, target ) {
+
+		return Triangle.getUV( point, this.a, this.b, this.c, uv1, uv2, uv3, target );
+
+	}
+
+	containsPoint( point ) {
+
+		return Triangle.containsPoint( point, this.a, this.b, this.c );
+
+	}
+
+	isFrontFacing( direction ) {
+
+		return Triangle.isFrontFacing( this.a, this.b, this.c, direction );
+
+	}
+
+	intersectsBox( box ) {
+
+		return box.intersectsTriangle( this );
+
+	}
+
+	closestPointToPoint( p, target ) {
+
+		const a = this.a, b = this.b, c = this.c;
+		let v, w;
+
+		// algorithm thanks to Real-Time Collision Detection by Christer Ericson,
+		// published by Morgan Kaufmann Publishers, (c) 2005 Elsevier Inc.,
+		// under the accompanying license; see chapter 5.1.5 for detailed explanation.
+		// basically, we're distinguishing which of the voronoi regions of the triangle
+		// the point lies in with the minimum amount of redundant computation.
+
+		_vab.subVectors( b, a );
+		_vac.subVectors( c, a );
+		_vap.subVectors( p, a );
+		const d1 = _vab.dot( _vap );
+		const d2 = _vac.dot( _vap );
+		if ( d1 <= 0 && d2 <= 0 ) {
+
+			// vertex region of A; barycentric coords (1, 0, 0)
+			return target.copy( a );
+
+		}
+
+		_vbp.subVectors( p, b );
+		const d3 = _vab.dot( _vbp );
+		const d4 = _vac.dot( _vbp );
+		if ( d3 >= 0 && d4 <= d3 ) {
+
+			// vertex region of B; barycentric coords (0, 1, 0)
+			return target.copy( b );
+
+		}
+
+		const vc = d1 * d4 - d3 * d2;
+		if ( vc <= 0 && d1 >= 0 && d3 <= 0 ) {
+
+			v = d1 / ( d1 - d3 );
+			// edge region of AB; barycentric coords (1-v, v, 0)
+			return target.copy( a ).addScaledVector( _vab, v );
+
+		}
+
+		_vcp.subVectors( p, c );
+		const d5 = _vab.dot( _vcp );
+		const d6 = _vac.dot( _vcp );
+		if ( d6 >= 0 && d5 <= d6 ) {
+
+			// vertex region of C; barycentric coords (0, 0, 1)
+			return target.copy( c );
+
+		}
+
+		const vb = d5 * d2 - d1 * d6;
+		if ( vb <= 0 && d2 >= 0 && d6 <= 0 ) {
+
+			w = d2 / ( d2 - d6 );
+			// edge region of AC; barycentric coords (1-w, 0, w)
+			return target.copy( a ).addScaledVector( _vac, w );
+
+		}
+
+		const va = d3 * d6 - d5 * d4;
+		if ( va <= 0 && ( d4 - d3 ) >= 0 && ( d5 - d6 ) >= 0 ) {
+
+			_vbc.subVectors( c, b );
+			w = ( d4 - d3 ) / ( ( d4 - d3 ) + ( d5 - d6 ) );
+			// edge region of BC; barycentric coords (0, 1-w, w)
+			return target.copy( b ).addScaledVector( _vbc, w ); // edge region of BC
+
+		}
+
+		// face region
+		const denom = 1 / ( va + vb + vc );
+		// u = va * denom
+		v = vb * denom;
+		w = vc * denom;
+
+		return target.copy( a ).addScaledVector( _vab, v ).addScaledVector( _vac, w );
+
+	}
+
+	equals( triangle ) {
+
+		return triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c );
+
+	}
+
+}
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/materials/MeshBasicMaterial.js
+
+
+
+
+/**
+ * parameters = {
+ *  color: <hex>,
+ *  opacity: <float>,
+ *  map: new THREE.Texture( <Image> ),
+ *
+ *  lightMap: new THREE.Texture( <Image> ),
+ *  lightMapIntensity: <float>
+ *
+ *  aoMap: new THREE.Texture( <Image> ),
+ *  aoMapIntensity: <float>
+ *
+ *  specularMap: new THREE.Texture( <Image> ),
+ *
+ *  alphaMap: new THREE.Texture( <Image> ),
+ *
+ *  envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),
+ *  combine: THREE.Multiply,
+ *  reflectivity: <float>,
+ *  refractionRatio: <float>,
+ *
+ *  depthTest: <bool>,
+ *  depthWrite: <bool>,
+ *
+ *  wireframe: <boolean>,
+ *  wireframeLinewidth: <float>,
+ * }
+ */
+
+class MeshBasicMaterial extends Material {
+
+	constructor( parameters ) {
+
+		super();
+
+		this.type = 'MeshBasicMaterial';
+
+		this.color = new Color( 0xffffff ); // emissive
+
+		this.map = null;
+
+		this.lightMap = null;
+		this.lightMapIntensity = 1.0;
+
+		this.aoMap = null;
+		this.aoMapIntensity = 1.0;
+
+		this.specularMap = null;
+
+		this.alphaMap = null;
+
+		this.envMap = null;
+		this.combine = MultiplyOperation;
+		this.reflectivity = 1;
+		this.refractionRatio = 0.98;
+
+		this.wireframe = false;
+		this.wireframeLinewidth = 1;
+		this.wireframeLinecap = 'round';
+		this.wireframeLinejoin = 'round';
+
+		this.setValues( parameters );
+
+	}
+
+	copy( source ) {
+
+		super.copy( source );
+
+		this.color.copy( source.color );
+
+		this.map = source.map;
+
+		this.lightMap = source.lightMap;
+		this.lightMapIntensity = source.lightMapIntensity;
+
+		this.aoMap = source.aoMap;
+		this.aoMapIntensity = source.aoMapIntensity;
+
+		this.specularMap = source.specularMap;
+
+		this.alphaMap = source.alphaMap;
+
+		this.envMap = source.envMap;
+		this.combine = source.combine;
+		this.reflectivity = source.reflectivity;
+		this.refractionRatio = source.refractionRatio;
+
+		this.wireframe = source.wireframe;
+		this.wireframeLinewidth = source.wireframeLinewidth;
+		this.wireframeLinecap = source.wireframeLinecap;
+		this.wireframeLinejoin = source.wireframeLinejoin;
+
+		return this;
+
+	}
+
+}
+
+MeshBasicMaterial.prototype.isMeshBasicMaterial = true;
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/objects/Mesh.js
+
+
+
+
+
+
+
+
+
+
+
+const _inverseMatrix = /*@__PURE__*/ new Matrix4_Matrix4();
+const _ray = /*@__PURE__*/ new Ray();
+const Mesh_sphere = /*@__PURE__*/ new Sphere();
+
+const _vA = /*@__PURE__*/ new Vector3();
+const _vB = /*@__PURE__*/ new Vector3();
+const _vC = /*@__PURE__*/ new Vector3();
+
+const _tempA = /*@__PURE__*/ new Vector3();
+const _tempB = /*@__PURE__*/ new Vector3();
+const _tempC = /*@__PURE__*/ new Vector3();
+
+const _morphA = /*@__PURE__*/ new Vector3();
+const _morphB = /*@__PURE__*/ new Vector3();
+const _morphC = /*@__PURE__*/ new Vector3();
+
+const _uvA = /*@__PURE__*/ new Vector2();
+const _uvB = /*@__PURE__*/ new Vector2();
+const _uvC = /*@__PURE__*/ new Vector2();
+
+const _intersectionPoint = /*@__PURE__*/ new Vector3();
+const _intersectionPointWorld = /*@__PURE__*/ new Vector3();
+
+class Mesh extends Object3D {
+
+	constructor( geometry = new BufferGeometry(), material = new MeshBasicMaterial() ) {
+
+		super();
+
+		this.type = 'Mesh';
+
+		this.geometry = geometry;
+		this.material = material;
+
+		this.updateMorphTargets();
+
+	}
+
+	copy( source ) {
+
+		super.copy( source );
+
+		if ( source.morphTargetInfluences !== undefined ) {
+
+			this.morphTargetInfluences = source.morphTargetInfluences.slice();
+
+		}
+
+		if ( source.morphTargetDictionary !== undefined ) {
+
+			this.morphTargetDictionary = Object.assign( {}, source.morphTargetDictionary );
+
+		}
+
+		this.material = source.material;
+		this.geometry = source.geometry;
+
+		return this;
+
+	}
+
+	updateMorphTargets() {
+
+		const geometry = this.geometry;
+
+		if ( geometry.isBufferGeometry ) {
+
+			const morphAttributes = geometry.morphAttributes;
+			const keys = Object.keys( morphAttributes );
+
+			if ( keys.length > 0 ) {
+
+				const morphAttribute = morphAttributes[ keys[ 0 ] ];
+
+				if ( morphAttribute !== undefined ) {
+
+					this.morphTargetInfluences = [];
+					this.morphTargetDictionary = {};
+
+					for ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {
+
+						const name = morphAttribute[ m ].name || String( m );
+
+						this.morphTargetInfluences.push( 0 );
+						this.morphTargetDictionary[ name ] = m;
+
+					}
+
+				}
+
+			}
+
+		} else {
+
+			const morphTargets = geometry.morphTargets;
+
+			if ( morphTargets !== undefined && morphTargets.length > 0 ) {
+
+				console.error( 'THREE.Mesh.updateMorphTargets() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' );
+
+			}
+
+		}
+
+	}
+
+	raycast( raycaster, intersects ) {
+
+		const geometry = this.geometry;
+		const material = this.material;
+		const matrixWorld = this.matrixWorld;
+
+		if ( material === undefined ) return;
+
+		// Checking boundingSphere distance to ray
+
+		if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();
+
+		Mesh_sphere.copy( geometry.boundingSphere );
+		Mesh_sphere.applyMatrix4( matrixWorld );
+
+		if ( raycaster.ray.intersectsSphere( Mesh_sphere ) === false ) return;
+
+		//
+
+		_inverseMatrix.copy( matrixWorld ).invert();
+		_ray.copy( raycaster.ray ).applyMatrix4( _inverseMatrix );
+
+		// Check boundingBox before continuing
+
+		if ( geometry.boundingBox !== null ) {
+
+			if ( _ray.intersectsBox( geometry.boundingBox ) === false ) return;
+
+		}
+
+		let intersection;
+
+		if ( geometry.isBufferGeometry ) {
+
+			const index = geometry.index;
+			const position = geometry.attributes.position;
+			const morphPosition = geometry.morphAttributes.position;
+			const morphTargetsRelative = geometry.morphTargetsRelative;
+			const uv = geometry.attributes.uv;
+			const uv2 = geometry.attributes.uv2;
+			const groups = geometry.groups;
+			const drawRange = geometry.drawRange;
+
+			if ( index !== null ) {
+
+				// indexed buffer geometry
+
+				if ( Array.isArray( material ) ) {
+
+					for ( let i = 0, il = groups.length; i < il; i ++ ) {
+
+						const group = groups[ i ];
+						const groupMaterial = material[ group.materialIndex ];
+
+						const start = Math.max( group.start, drawRange.start );
+						const end = Math.min( index.count, Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ) );
+
+						for ( let j = start, jl = end; j < jl; j += 3 ) {
+
+							const a = index.getX( j );
+							const b = index.getX( j + 1 );
+							const c = index.getX( j + 2 );
+
+							intersection = checkBufferGeometryIntersection( this, groupMaterial, raycaster, _ray, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c );
+
+							if ( intersection ) {
+
+								intersection.faceIndex = Math.floor( j / 3 ); // triangle number in indexed buffer semantics
+								intersection.face.materialIndex = group.materialIndex;
+								intersects.push( intersection );
+
+							}
+
+						}
+
+					}
+
+				} else {
+
+					const start = Math.max( 0, drawRange.start );
+					const end = Math.min( index.count, ( drawRange.start + drawRange.count ) );
+
+					for ( let i = start, il = end; i < il; i += 3 ) {
+
+						const a = index.getX( i );
+						const b = index.getX( i + 1 );
+						const c = index.getX( i + 2 );
+
+						intersection = checkBufferGeometryIntersection( this, material, raycaster, _ray, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c );
+
+						if ( intersection ) {
+
+							intersection.faceIndex = Math.floor( i / 3 ); // triangle number in indexed buffer semantics
+							intersects.push( intersection );
+
+						}
+
+					}
+
+				}
+
+			} else if ( position !== undefined ) {
+
+				// non-indexed buffer geometry
+
+				if ( Array.isArray( material ) ) {
+
+					for ( let i = 0, il = groups.length; i < il; i ++ ) {
+
+						const group = groups[ i ];
+						const groupMaterial = material[ group.materialIndex ];
+
+						const start = Math.max( group.start, drawRange.start );
+						const end = Math.min( position.count, Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ) );
+
+						for ( let j = start, jl = end; j < jl; j += 3 ) {
+
+							const a = j;
+							const b = j + 1;
+							const c = j + 2;
+
+							intersection = checkBufferGeometryIntersection( this, groupMaterial, raycaster, _ray, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c );
+
+							if ( intersection ) {
+
+								intersection.faceIndex = Math.floor( j / 3 ); // triangle number in non-indexed buffer semantics
+								intersection.face.materialIndex = group.materialIndex;
+								intersects.push( intersection );
+
+							}
+
+						}
+
+					}
+
+				} else {
+
+					const start = Math.max( 0, drawRange.start );
+					const end = Math.min( position.count, ( drawRange.start + drawRange.count ) );
+
+					for ( let i = start, il = end; i < il; i += 3 ) {
+
+						const a = i;
+						const b = i + 1;
+						const c = i + 2;
+
+						intersection = checkBufferGeometryIntersection( this, material, raycaster, _ray, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c );
+
+						if ( intersection ) {
+
+							intersection.faceIndex = Math.floor( i / 3 ); // triangle number in non-indexed buffer semantics
+							intersects.push( intersection );
+
+						}
+
+					}
+
+				}
+
+			}
+
+		} else if ( geometry.isGeometry ) {
+
+			console.error( 'THREE.Mesh.raycast() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' );
+
+		}
+
+	}
+
+}
+
+Mesh.prototype.isMesh = true;
+
+function checkIntersection( object, material, raycaster, ray, pA, pB, pC, point ) {
+
+	let intersect;
+
+	if ( material.side === BackSide ) {
+
+		intersect = ray.intersectTriangle( pC, pB, pA, true, point );
+
+	} else {
+
+		intersect = ray.intersectTriangle( pA, pB, pC, material.side !== DoubleSide, point );
+
+	}
+
+	if ( intersect === null ) return null;
+
+	_intersectionPointWorld.copy( point );
+	_intersectionPointWorld.applyMatrix4( object.matrixWorld );
+
+	const distance = raycaster.ray.origin.distanceTo( _intersectionPointWorld );
+
+	if ( distance < raycaster.near || distance > raycaster.far ) return null;
+
+	return {
+		distance: distance,
+		point: _intersectionPointWorld.clone(),
+		object: object
+	};
+
+}
+
+function checkBufferGeometryIntersection( object, material, raycaster, ray, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c ) {
+
+	_vA.fromBufferAttribute( position, a );
+	_vB.fromBufferAttribute( position, b );
+	_vC.fromBufferAttribute( position, c );
+
+	const morphInfluences = object.morphTargetInfluences;
+
+	if ( morphPosition && morphInfluences ) {
+
+		_morphA.set( 0, 0, 0 );
+		_morphB.set( 0, 0, 0 );
+		_morphC.set( 0, 0, 0 );
+
+		for ( let i = 0, il = morphPosition.length; i < il; i ++ ) {
+
+			const influence = morphInfluences[ i ];
+			const morphAttribute = morphPosition[ i ];
+
+			if ( influence === 0 ) continue;
+
+			_tempA.fromBufferAttribute( morphAttribute, a );
+			_tempB.fromBufferAttribute( morphAttribute, b );
+			_tempC.fromBufferAttribute( morphAttribute, c );
+
+			if ( morphTargetsRelative ) {
+
+				_morphA.addScaledVector( _tempA, influence );
+				_morphB.addScaledVector( _tempB, influence );
+				_morphC.addScaledVector( _tempC, influence );
+
+			} else {
+
+				_morphA.addScaledVector( _tempA.sub( _vA ), influence );
+				_morphB.addScaledVector( _tempB.sub( _vB ), influence );
+				_morphC.addScaledVector( _tempC.sub( _vC ), influence );
+
+			}
+
+		}
+
+		_vA.add( _morphA );
+		_vB.add( _morphB );
+		_vC.add( _morphC );
+
+	}
+
+	if ( object.isSkinnedMesh ) {
+
+		object.boneTransform( a, _vA );
+		object.boneTransform( b, _vB );
+		object.boneTransform( c, _vC );
+
+	}
+
+	const intersection = checkIntersection( object, material, raycaster, ray, _vA, _vB, _vC, _intersectionPoint );
+
+	if ( intersection ) {
+
+		if ( uv ) {
+
+			_uvA.fromBufferAttribute( uv, a );
+			_uvB.fromBufferAttribute( uv, b );
+			_uvC.fromBufferAttribute( uv, c );
+
+			intersection.uv = Triangle.getUV( _intersectionPoint, _vA, _vB, _vC, _uvA, _uvB, _uvC, new Vector2() );
+
+		}
+
+		if ( uv2 ) {
+
+			_uvA.fromBufferAttribute( uv2, a );
+			_uvB.fromBufferAttribute( uv2, b );
+			_uvC.fromBufferAttribute( uv2, c );
+
+			intersection.uv2 = Triangle.getUV( _intersectionPoint, _vA, _vB, _vC, _uvA, _uvB, _uvC, new Vector2() );
+
+		}
+
+		const face = {
+			a: a,
+			b: b,
+			c: c,
+			normal: new Vector3(),
+			materialIndex: 0
+		};
+
+		Triangle.getNormal( _vA, _vB, _vC, face.normal );
+
+		intersection.face = face;
+
+	}
+
+	return intersection;
+
+}
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/alphamap_fragment.glsl.js
+/* harmony default export */ const alphamap_fragment_glsl = (/* glsl */`
+#ifdef USE_ALPHAMAP
+
+	diffuseColor.a *= texture2D( alphaMap, vUv ).g;
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/alphamap_pars_fragment.glsl.js
+/* harmony default export */ const alphamap_pars_fragment_glsl = (/* glsl */`
+#ifdef USE_ALPHAMAP
+
+	uniform sampler2D alphaMap;
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/alphatest_fragment.glsl.js
+/* harmony default export */ const alphatest_fragment_glsl = (/* glsl */`
+#ifdef USE_ALPHATEST
+
+	if ( diffuseColor.a < alphaTest ) discard;
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/alphatest_pars_fragment.glsl.js
+/* harmony default export */ const alphatest_pars_fragment_glsl = (/* glsl */`
+#ifdef USE_ALPHATEST
+	uniform float alphaTest;
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/aomap_fragment.glsl.js
+/* harmony default export */ const aomap_fragment_glsl = (/* glsl */`
+#ifdef USE_AOMAP
+
+	// reads channel R, compatible with a combined OcclusionRoughnessMetallic (RGB) texture
+	float ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;
+
+	reflectedLight.indirectDiffuse *= ambientOcclusion;
+
+	#if defined( USE_ENVMAP ) && defined( STANDARD )
+
+		float dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );
+
+		reflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.roughness );
+
+	#endif
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/aomap_pars_fragment.glsl.js
+/* harmony default export */ const aomap_pars_fragment_glsl = (/* glsl */`
+#ifdef USE_AOMAP
+
+	uniform sampler2D aoMap;
+	uniform float aoMapIntensity;
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/begin_vertex.glsl.js
+/* harmony default export */ const begin_vertex_glsl = (/* glsl */`
+vec3 transformed = vec3( position );
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/beginnormal_vertex.glsl.js
+/* harmony default export */ const beginnormal_vertex_glsl = (/* glsl */`
+vec3 objectNormal = vec3( normal );
+
+#ifdef USE_TANGENT
+
+	vec3 objectTangent = vec3( tangent.xyz );
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/bsdfs.glsl.js
+/* harmony default export */ const bsdfs_glsl = (/* glsl */`
+
+vec3 BRDF_Lambert( const in vec3 diffuseColor ) {
+
+	return RECIPROCAL_PI * diffuseColor;
+
+} // validated
+
+vec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) {
+
+	// Original approximation by Christophe Schlick '94
+	// float fresnel = pow( 1.0 - dotVH, 5.0 );
+
+	// Optimized variant (presented by Epic at SIGGRAPH '13)
+	// https://cdn2.unrealengine.com/Resources/files/2013SiggraphPresentationsNotes-26915738.pdf
+	float fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );
+
+	return f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );
+
+} // validated
+
+// Moving Frostbite to Physically Based Rendering 3.0 - page 12, listing 2
+// https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf
+float V_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {
+
+	float a2 = pow2( alpha );
+
+	float gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );
+	float gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );
+
+	return 0.5 / max( gv + gl, EPSILON );
+
+}
+
+// Microfacet Models for Refraction through Rough Surfaces - equation (33)
+// http://graphicrants.blogspot.com/2013/08/specular-brdf-reference.html
+// alpha is "roughness squared" in Disney’s reparameterization
+float D_GGX( const in float alpha, const in float dotNH ) {
+
+	float a2 = pow2( alpha );
+
+	float denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0; // avoid alpha = 0 with dotNH = 1
+
+	return RECIPROCAL_PI * a2 / pow2( denom );
+
+}
+
+// GGX Distribution, Schlick Fresnel, GGX_SmithCorrelated Visibility
+vec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in vec3 f0, const in float f90, const in float roughness ) {
+
+	float alpha = pow2( roughness ); // UE4's roughness
+
+	vec3 halfDir = normalize( lightDir + viewDir );
+
+	float dotNL = saturate( dot( normal, lightDir ) );
+	float dotNV = saturate( dot( normal, viewDir ) );
+	float dotNH = saturate( dot( normal, halfDir ) );
+	float dotVH = saturate( dot( viewDir, halfDir ) );
+
+	vec3 F = F_Schlick( f0, f90, dotVH );
+
+	float V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );
+
+	float D = D_GGX( alpha, dotNH );
+
+	return F * ( V * D );
+
+}
+
+// Rect Area Light
+
+// Real-Time Polygonal-Light Shading with Linearly Transformed Cosines
+// by Eric Heitz, Jonathan Dupuy, Stephen Hill and David Neubelt
+// code: https://github.com/selfshadow/ltc_code/
+
+vec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {
+
+	const float LUT_SIZE = 64.0;
+	const float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;
+	const float LUT_BIAS = 0.5 / LUT_SIZE;
+
+	float dotNV = saturate( dot( N, V ) );
+
+	// texture parameterized by sqrt( GGX alpha ) and sqrt( 1 - cos( theta ) )
+	vec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );
+
+	uv = uv * LUT_SCALE + LUT_BIAS;
+
+	return uv;
+
+}
+
+float LTC_ClippedSphereFormFactor( const in vec3 f ) {
+
+	// Real-Time Area Lighting: a Journey from Research to Production (p.102)
+	// An approximation of the form factor of a horizon-clipped rectangle.
+
+	float l = length( f );
+
+	return max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );
+
+}
+
+vec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {
+
+	float x = dot( v1, v2 );
+
+	float y = abs( x );
+
+	// rational polynomial approximation to theta / sin( theta ) / 2PI
+	float a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;
+	float b = 3.4175940 + ( 4.1616724 + y ) * y;
+	float v = a / b;
+
+	float theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;
+
+	return cross( v1, v2 ) * theta_sintheta;
+
+}
+
+vec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {
+
+	// bail if point is on back side of plane of light
+	// assumes ccw winding order of light vertices
+	vec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];
+	vec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];
+	vec3 lightNormal = cross( v1, v2 );
+
+	if( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );
+
+	// construct orthonormal basis around N
+	vec3 T1, T2;
+	T1 = normalize( V - N * dot( V, N ) );
+	T2 = - cross( N, T1 ); // negated from paper; possibly due to a different handedness of world coordinate system
+
+	// compute transform
+	mat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );
+
+	// transform rect
+	vec3 coords[ 4 ];
+	coords[ 0 ] = mat * ( rectCoords[ 0 ] - P );
+	coords[ 1 ] = mat * ( rectCoords[ 1 ] - P );
+	coords[ 2 ] = mat * ( rectCoords[ 2 ] - P );
+	coords[ 3 ] = mat * ( rectCoords[ 3 ] - P );
+
+	// project rect onto sphere
+	coords[ 0 ] = normalize( coords[ 0 ] );
+	coords[ 1 ] = normalize( coords[ 1 ] );
+	coords[ 2 ] = normalize( coords[ 2 ] );
+	coords[ 3 ] = normalize( coords[ 3 ] );
+
+	// calculate vector form factor
+	vec3 vectorFormFactor = vec3( 0.0 );
+	vectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );
+	vectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );
+	vectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );
+	vectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );
+
+	// adjust for horizon clipping
+	float result = LTC_ClippedSphereFormFactor( vectorFormFactor );
+
+/*
+	// alternate method of adjusting for horizon clipping (see referece)
+	// refactoring required
+	float len = length( vectorFormFactor );
+	float z = vectorFormFactor.z / len;
+
+	const float LUT_SIZE = 64.0;
+	const float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;
+	const float LUT_BIAS = 0.5 / LUT_SIZE;
+
+	// tabulated horizon-clipped sphere, apparently...
+	vec2 uv = vec2( z * 0.5 + 0.5, len );
+	uv = uv * LUT_SCALE + LUT_BIAS;
+
+	float scale = texture2D( ltc_2, uv ).w;
+
+	float result = len * scale;
+*/
+
+	return vec3( result );
+
+}
+
+// End Rect Area Light
+
+
+float G_BlinnPhong_Implicit( /* const in float dotNL, const in float dotNV */ ) {
+
+	// geometry term is (n dot l)(n dot v) / 4(n dot l)(n dot v)
+	return 0.25;
+
+}
+
+float D_BlinnPhong( const in float shininess, const in float dotNH ) {
+
+	return RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );
+
+}
+
+vec3 BRDF_BlinnPhong( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float shininess ) {
+
+	vec3 halfDir = normalize( lightDir + viewDir );
+
+	float dotNH = saturate( dot( normal, halfDir ) );
+	float dotVH = saturate( dot( viewDir, halfDir ) );
+
+	vec3 F = F_Schlick( specularColor, 1.0, dotVH );
+
+	float G = G_BlinnPhong_Implicit( /* dotNL, dotNV */ );
+
+	float D = D_BlinnPhong( shininess, dotNH );
+
+	return F * ( G * D );
+
+} // validated
+
+#if defined( USE_SHEEN )
+
+// https://github.com/google/filament/blob/master/shaders/src/brdf.fs
+float D_Charlie( float roughness, float dotNH ) {
+
+	float alpha = pow2( roughness );
+
+	// Estevez and Kulla 2017, "Production Friendly Microfacet Sheen BRDF"
+	float invAlpha = 1.0 / alpha;
+	float cos2h = dotNH * dotNH;
+	float sin2h = max( 1.0 - cos2h, 0.0078125 ); // 2^(-14/2), so sin2h^2 > 0 in fp16
+
+	return ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );
+
+}
+
+// https://github.com/google/filament/blob/master/shaders/src/brdf.fs
+float V_Neubelt( float dotNV, float dotNL ) {
+
+	// Neubelt and Pettineo 2013, "Crafting a Next-gen Material Pipeline for The Order: 1886"
+	return saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );
+
+}
+
+vec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {
+
+	vec3 halfDir = normalize( lightDir + viewDir );
+
+	float dotNL = saturate( dot( normal, lightDir ) );
+	float dotNV = saturate( dot( normal, viewDir ) );
+	float dotNH = saturate( dot( normal, halfDir ) );
+
+	float D = D_Charlie( sheenRoughness, dotNH );
+	float V = V_Neubelt( dotNV, dotNL );
+
+	return sheenColor * ( D * V );
+
+}
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/bumpmap_pars_fragment.glsl.js
+/* harmony default export */ const bumpmap_pars_fragment_glsl = (/* glsl */`
+#ifdef USE_BUMPMAP
+
+	uniform sampler2D bumpMap;
+	uniform float bumpScale;
+
+	// Bump Mapping Unparametrized Surfaces on the GPU by Morten S. Mikkelsen
+	// https://mmikk.github.io/papers3d/mm_sfgrad_bump.pdf
+
+	// Evaluate the derivative of the height w.r.t. screen-space using forward differencing (listing 2)
+
+	vec2 dHdxy_fwd() {
+
+		vec2 dSTdx = dFdx( vUv );
+		vec2 dSTdy = dFdy( vUv );
+
+		float Hll = bumpScale * texture2D( bumpMap, vUv ).x;
+		float dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;
+		float dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;
+
+		return vec2( dBx, dBy );
+
+	}
+
+	vec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy, float faceDirection ) {
+
+		// Workaround for Adreno 3XX dFd*( vec3 ) bug. See #9988
+
+		vec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );
+		vec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );
+		vec3 vN = surf_norm;		// normalized
+
+		vec3 R1 = cross( vSigmaY, vN );
+		vec3 R2 = cross( vN, vSigmaX );
+
+		float fDet = dot( vSigmaX, R1 ) * faceDirection;
+
+		vec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );
+		return normalize( abs( fDet ) * surf_norm - vGrad );
+
+	}
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/clipping_planes_fragment.glsl.js
+/* harmony default export */ const clipping_planes_fragment_glsl = (/* glsl */`
+#if NUM_CLIPPING_PLANES > 0
+
+	vec4 plane;
+
+	#pragma unroll_loop_start
+	for ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {
+
+		plane = clippingPlanes[ i ];
+		if ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;
+
+	}
+	#pragma unroll_loop_end
+
+	#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES
+
+		bool clipped = true;
+
+		#pragma unroll_loop_start
+		for ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {
+
+			plane = clippingPlanes[ i ];
+			clipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;
+
+		}
+		#pragma unroll_loop_end
+
+		if ( clipped ) discard;
+
+	#endif
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/clipping_planes_pars_fragment.glsl.js
+/* harmony default export */ const clipping_planes_pars_fragment_glsl = (/* glsl */`
+#if NUM_CLIPPING_PLANES > 0
+
+	varying vec3 vClipPosition;
+
+	uniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/clipping_planes_pars_vertex.glsl.js
+/* harmony default export */ const clipping_planes_pars_vertex_glsl = (/* glsl */`
+#if NUM_CLIPPING_PLANES > 0
+
+	varying vec3 vClipPosition;
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/clipping_planes_vertex.glsl.js
+/* harmony default export */ const clipping_planes_vertex_glsl = (/* glsl */`
+#if NUM_CLIPPING_PLANES > 0
+
+	vClipPosition = - mvPosition.xyz;
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js
+/* harmony default export */ const color_fragment_glsl = (/* glsl */`
+#if defined( USE_COLOR_ALPHA )
+
+	diffuseColor *= vColor;
+
+#elif defined( USE_COLOR )
+
+	diffuseColor.rgb *= vColor;
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js
+/* harmony default export */ const color_pars_fragment_glsl = (/* glsl */`
+#if defined( USE_COLOR_ALPHA )
+
+	varying vec4 vColor;
+
+#elif defined( USE_COLOR )
+
+	varying vec3 vColor;
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js
+/* harmony default export */ const color_pars_vertex_glsl = (/* glsl */`
+#if defined( USE_COLOR_ALPHA )
+
+	varying vec4 vColor;
+
+#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )
+
+	varying vec3 vColor;
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js
+/* harmony default export */ const color_vertex_glsl = (/* glsl */`
+#if defined( USE_COLOR_ALPHA )
+
+	vColor = vec4( 1.0 );
+
+#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )
+
+	vColor = vec3( 1.0 );
+
+#endif
+
+#ifdef USE_COLOR
+
+	vColor *= color;
+
+#endif
+
+#ifdef USE_INSTANCING_COLOR
+
+	vColor.xyz *= instanceColor.xyz;
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/common.glsl.js
+/* harmony default export */ const common_glsl = (/* glsl */`
+#define PI 3.141592653589793
+#define PI2 6.283185307179586
+#define PI_HALF 1.5707963267948966
+#define RECIPROCAL_PI 0.3183098861837907
+#define RECIPROCAL_PI2 0.15915494309189535
+#define EPSILON 1e-6
+
+#ifndef saturate
+// <tonemapping_pars_fragment> may have defined saturate() already
+#define saturate( a ) clamp( a, 0.0, 1.0 )
+#endif
+#define whiteComplement( a ) ( 1.0 - saturate( a ) )
+
+float pow2( const in float x ) { return x*x; }
+float pow3( const in float x ) { return x*x*x; }
+float pow4( const in float x ) { float x2 = x*x; return x2*x2; }
+float max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }
+float average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }
+
+// expects values in the range of [0,1]x[0,1], returns values in the [0,1] range.
+// do not collapse into a single function per: http://byteblacksmith.com/improvements-to-the-canonical-one-liner-glsl-rand-for-opengl-es-2-0/
+highp float rand( const in vec2 uv ) {
+
+	const highp float a = 12.9898, b = 78.233, c = 43758.5453;
+	highp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );
+
+	return fract( sin( sn ) * c );
+
+}
+
+#ifdef HIGH_PRECISION
+	float precisionSafeLength( vec3 v ) { return length( v ); }
+#else
+	float precisionSafeLength( vec3 v ) {
+		float maxComponent = max3( abs( v ) );
+		return length( v / maxComponent ) * maxComponent;
+	}
+#endif
+
+struct IncidentLight {
+	vec3 color;
+	vec3 direction;
+	bool visible;
+};
+
+struct ReflectedLight {
+	vec3 directDiffuse;
+	vec3 directSpecular;
+	vec3 indirectDiffuse;
+	vec3 indirectSpecular;
+};
+
+struct GeometricContext {
+	vec3 position;
+	vec3 normal;
+	vec3 viewDir;
+#ifdef USE_CLEARCOAT
+	vec3 clearcoatNormal;
+#endif
+};
+
+vec3 transformDirection( in vec3 dir, in mat4 matrix ) {
+
+	return normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );
+
+}
+
+vec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {
+
+	// dir can be either a direction vector or a normal vector
+	// upper-left 3x3 of matrix is assumed to be orthogonal
+
+	return normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );
+
+}
+
+mat3 transposeMat3( const in mat3 m ) {
+
+	mat3 tmp;
+
+	tmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );
+	tmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );
+	tmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );
+
+	return tmp;
+
+}
+
+// https://en.wikipedia.org/wiki/Relative_luminance
+float linearToRelativeLuminance( const in vec3 color ) {
+
+	vec3 weights = vec3( 0.2126, 0.7152, 0.0722 );
+
+	return dot( weights, color.rgb );
+
+}
+
+bool isPerspectiveMatrix( mat4 m ) {
+
+	return m[ 2 ][ 3 ] == - 1.0;
+
+}
+
+vec2 equirectUv( in vec3 dir ) {
+
+	// dir is assumed to be unit length
+
+	float u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;
+
+	float v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;
+
+	return vec2( u, v );
+
+}
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js
+/* harmony default export */ const cube_uv_reflection_fragment_glsl = (/* glsl */`
+#ifdef ENVMAP_TYPE_CUBE_UV
+
+	#define cubeUV_maxMipLevel 8.0
+	#define cubeUV_minMipLevel 4.0
+	#define cubeUV_maxTileSize 256.0
+	#define cubeUV_minTileSize 16.0
+
+	// These shader functions convert between the UV coordinates of a single face of
+	// a cubemap, the 0-5 integer index of a cube face, and the direction vector for
+	// sampling a textureCube (not generally normalized ).
+
+	float getFace( vec3 direction ) {
+
+		vec3 absDirection = abs( direction );
+
+		float face = - 1.0;
+
+		if ( absDirection.x > absDirection.z ) {
+
+			if ( absDirection.x > absDirection.y )
+
+				face = direction.x > 0.0 ? 0.0 : 3.0;
+
+			else
+
+				face = direction.y > 0.0 ? 1.0 : 4.0;
+
+		} else {
+
+			if ( absDirection.z > absDirection.y )
+
+				face = direction.z > 0.0 ? 2.0 : 5.0;
+
+			else
+
+				face = direction.y > 0.0 ? 1.0 : 4.0;
+
+		}
+
+		return face;
+
+	}
+
+	// RH coordinate system; PMREM face-indexing convention
+	vec2 getUV( vec3 direction, float face ) {
+
+		vec2 uv;
+
+		if ( face == 0.0 ) {
+
+			uv = vec2( direction.z, direction.y ) / abs( direction.x ); // pos x
+
+		} else if ( face == 1.0 ) {
+
+			uv = vec2( - direction.x, - direction.z ) / abs( direction.y ); // pos y
+
+		} else if ( face == 2.0 ) {
+
+			uv = vec2( - direction.x, direction.y ) / abs( direction.z ); // pos z
+
+		} else if ( face == 3.0 ) {
+
+			uv = vec2( - direction.z, direction.y ) / abs( direction.x ); // neg x
+
+		} else if ( face == 4.0 ) {
+
+			uv = vec2( - direction.x, direction.z ) / abs( direction.y ); // neg y
+
+		} else {
+
+			uv = vec2( direction.x, direction.y ) / abs( direction.z ); // neg z
+
+		}
+
+		return 0.5 * ( uv + 1.0 );
+
+	}
+
+	vec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {
+
+		float face = getFace( direction );
+
+		float filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );
+
+		mipInt = max( mipInt, cubeUV_minMipLevel );
+
+		float faceSize = exp2( mipInt );
+
+		float texelSize = 1.0 / ( 3.0 * cubeUV_maxTileSize );
+
+		vec2 uv = getUV( direction, face ) * ( faceSize - 1.0 ) + 0.5;
+
+		if ( face > 2.0 ) {
+
+			uv.y += faceSize;
+
+			face -= 3.0;
+
+		}
+
+		uv.x += face * faceSize;
+
+		if ( mipInt < cubeUV_maxMipLevel ) {
+
+			uv.y += 2.0 * cubeUV_maxTileSize;
+
+		}
+
+		uv.y += filterInt * 2.0 * cubeUV_minTileSize;
+
+		uv.x += 3.0 * max( 0.0, cubeUV_maxTileSize - 2.0 * faceSize );
+
+		uv *= texelSize;
+
+		return texture2D( envMap, uv ).rgb;
+
+	}
+
+	// These defines must match with PMREMGenerator
+
+	#define r0 1.0
+	#define v0 0.339
+	#define m0 - 2.0
+	#define r1 0.8
+	#define v1 0.276
+	#define m1 - 1.0
+	#define r4 0.4
+	#define v4 0.046
+	#define m4 2.0
+	#define r5 0.305
+	#define v5 0.016
+	#define m5 3.0
+	#define r6 0.21
+	#define v6 0.0038
+	#define m6 4.0
+
+	float roughnessToMip( float roughness ) {
+
+		float mip = 0.0;
+
+		if ( roughness >= r1 ) {
+
+			mip = ( r0 - roughness ) * ( m1 - m0 ) / ( r0 - r1 ) + m0;
+
+		} else if ( roughness >= r4 ) {
+
+			mip = ( r1 - roughness ) * ( m4 - m1 ) / ( r1 - r4 ) + m1;
+
+		} else if ( roughness >= r5 ) {
+
+			mip = ( r4 - roughness ) * ( m5 - m4 ) / ( r4 - r5 ) + m4;
+
+		} else if ( roughness >= r6 ) {
+
+			mip = ( r5 - roughness ) * ( m6 - m5 ) / ( r5 - r6 ) + m5;
+
+		} else {
+
+			mip = - 2.0 * log2( 1.16 * roughness ); // 1.16 = 1.79^0.25
+		}
+
+		return mip;
+
+	}
+
+	vec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {
+
+		float mip = clamp( roughnessToMip( roughness ), m0, cubeUV_maxMipLevel );
+
+		float mipF = fract( mip );
+
+		float mipInt = floor( mip );
+
+		vec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );
+
+		if ( mipF == 0.0 ) {
+
+			return vec4( color0, 1.0 );
+
+		} else {
+
+			vec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );
+
+			return vec4( mix( color0, color1, mipF ), 1.0 );
+
+		}
+
+	}
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js
+/* harmony default export */ const defaultnormal_vertex_glsl = (/* glsl */`
+vec3 transformedNormal = objectNormal;
+
+#ifdef USE_INSTANCING
+
+	// this is in lieu of a per-instance normal-matrix
+	// shear transforms in the instance matrix are not supported
+
+	mat3 m = mat3( instanceMatrix );
+
+	transformedNormal /= vec3( dot( m[ 0 ], m[ 0 ] ), dot( m[ 1 ], m[ 1 ] ), dot( m[ 2 ], m[ 2 ] ) );
+
+	transformedNormal = m * transformedNormal;
+
+#endif
+
+transformedNormal = normalMatrix * transformedNormal;
+
+#ifdef FLIP_SIDED
+
+	transformedNormal = - transformedNormal;
+
+#endif
+
+#ifdef USE_TANGENT
+
+	vec3 transformedTangent = ( modelViewMatrix * vec4( objectTangent, 0.0 ) ).xyz;
+
+	#ifdef FLIP_SIDED
+
+		transformedTangent = - transformedTangent;
+
+	#endif
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/displacementmap_pars_vertex.glsl.js
+/* harmony default export */ const displacementmap_pars_vertex_glsl = (/* glsl */`
+#ifdef USE_DISPLACEMENTMAP
+
+	uniform sampler2D displacementMap;
+	uniform float displacementScale;
+	uniform float displacementBias;
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/displacementmap_vertex.glsl.js
+/* harmony default export */ const displacementmap_vertex_glsl = (/* glsl */`
+#ifdef USE_DISPLACEMENTMAP
+
+	transformed += normalize( objectNormal ) * ( texture2D( displacementMap, vUv ).x * displacementScale + displacementBias );
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/emissivemap_fragment.glsl.js
+/* harmony default export */ const emissivemap_fragment_glsl = (/* glsl */`
+#ifdef USE_EMISSIVEMAP
+
+	vec4 emissiveColor = texture2D( emissiveMap, vUv );
+
+	totalEmissiveRadiance *= emissiveColor.rgb;
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/emissivemap_pars_fragment.glsl.js
+/* harmony default export */ const emissivemap_pars_fragment_glsl = (/* glsl */`
+#ifdef USE_EMISSIVEMAP
+
+	uniform sampler2D emissiveMap;
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/encodings_fragment.glsl.js
+/* harmony default export */ const encodings_fragment_glsl = (/* glsl */`
+gl_FragColor = linearToOutputTexel( gl_FragColor );
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/encodings_pars_fragment.glsl.js
+/* harmony default export */ const encodings_pars_fragment_glsl = (/* glsl */`
+
+vec4 LinearToLinear( in vec4 value ) {
+	return value;
+}
+
+vec4 LinearTosRGB( in vec4 value ) {
+	return vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );
+}
+
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js
+/* harmony default export */ const envmap_fragment_glsl = (/* glsl */`
+#ifdef USE_ENVMAP
+
+	#ifdef ENV_WORLDPOS
+
+		vec3 cameraToFrag;
+
+		if ( isOrthographic ) {
+
+			cameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );
+
+		} else {
+
+			cameraToFrag = normalize( vWorldPosition - cameraPosition );
+
+		}
+
+		// Transforming Normal Vectors with the Inverse Transformation
+		vec3 worldNormal = inverseTransformDirection( normal, viewMatrix );
+
+		#ifdef ENVMAP_MODE_REFLECTION
+
+			vec3 reflectVec = reflect( cameraToFrag, worldNormal );
+
+		#else
+
+			vec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );
+
+		#endif
+
+	#else
+
+		vec3 reflectVec = vReflect;
+
+	#endif
+
+	#ifdef ENVMAP_TYPE_CUBE
+
+		vec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );
+
+	#elif defined( ENVMAP_TYPE_CUBE_UV )
+
+		vec4 envColor = textureCubeUV( envMap, reflectVec, 0.0 );
+
+	#else
+
+		vec4 envColor = vec4( 0.0 );
+
+	#endif
+
+	#ifdef ENVMAP_BLENDING_MULTIPLY
+
+		outgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );
+
+	#elif defined( ENVMAP_BLENDING_MIX )
+
+		outgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );
+
+	#elif defined( ENVMAP_BLENDING_ADD )
+
+		outgoingLight += envColor.xyz * specularStrength * reflectivity;
+
+	#endif
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js
+/* harmony default export */ const envmap_common_pars_fragment_glsl = (/* glsl */`
+#ifdef USE_ENVMAP
+
+	uniform float envMapIntensity;
+	uniform float flipEnvMap;
+
+	#ifdef ENVMAP_TYPE_CUBE
+		uniform samplerCube envMap;
+	#else
+		uniform sampler2D envMap;
+	#endif
+	
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/envmap_pars_fragment.glsl.js
+/* harmony default export */ const envmap_pars_fragment_glsl = (/* glsl */`
+#ifdef USE_ENVMAP
+
+	uniform float reflectivity;
+
+	#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )
+
+		#define ENV_WORLDPOS
+
+	#endif
+
+	#ifdef ENV_WORLDPOS
+
+		varying vec3 vWorldPosition;
+		uniform float refractionRatio;
+	#else
+		varying vec3 vReflect;
+	#endif
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/envmap_pars_vertex.glsl.js
+/* harmony default export */ const envmap_pars_vertex_glsl = (/* glsl */`
+#ifdef USE_ENVMAP
+
+	#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) ||defined( PHONG )
+
+		#define ENV_WORLDPOS
+
+	#endif
+
+	#ifdef ENV_WORLDPOS
+		
+		varying vec3 vWorldPosition;
+
+	#else
+
+		varying vec3 vReflect;
+		uniform float refractionRatio;
+
+	#endif
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/envmap_vertex.glsl.js
+/* harmony default export */ const envmap_vertex_glsl = (/* glsl */`
+#ifdef USE_ENVMAP
+
+	#ifdef ENV_WORLDPOS
+
+		vWorldPosition = worldPosition.xyz;
+
+	#else
+
+		vec3 cameraToVertex;
+
+		if ( isOrthographic ) {
+
+			cameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );
+
+		} else {
+
+			cameraToVertex = normalize( worldPosition.xyz - cameraPosition );
+
+		}
+
+		vec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );
+
+		#ifdef ENVMAP_MODE_REFLECTION
+
+			vReflect = reflect( cameraToVertex, worldNormal );
+
+		#else
+
+			vReflect = refract( cameraToVertex, worldNormal, refractionRatio );
+
+		#endif
+
+	#endif
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/fog_vertex.glsl.js
+/* harmony default export */ const fog_vertex_glsl = (/* glsl */`
+#ifdef USE_FOG
+
+	vFogDepth = - mvPosition.z;
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/fog_pars_vertex.glsl.js
+/* harmony default export */ const fog_pars_vertex_glsl = (/* glsl */`
+#ifdef USE_FOG
+
+	varying float vFogDepth;
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/fog_fragment.glsl.js
+/* harmony default export */ const fog_fragment_glsl = (/* glsl */`
+#ifdef USE_FOG
+
+	#ifdef FOG_EXP2
+
+		float fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth );
+
+	#else
+
+		float fogFactor = smoothstep( fogNear, fogFar, vFogDepth );
+
+	#endif
+
+	gl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/fog_pars_fragment.glsl.js
+/* harmony default export */ const fog_pars_fragment_glsl = (/* glsl */`
+#ifdef USE_FOG
+
+	uniform vec3 fogColor;
+	varying float vFogDepth;
+
+	#ifdef FOG_EXP2
+
+		uniform float fogDensity;
+
+	#else
+
+		uniform float fogNear;
+		uniform float fogFar;
+
+	#endif
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/gradientmap_pars_fragment.glsl.js
+/* harmony default export */ const gradientmap_pars_fragment_glsl = (/* glsl */`
+
+#ifdef USE_GRADIENTMAP
+
+	uniform sampler2D gradientMap;
+
+#endif
+
+vec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {
+
+	// dotNL will be from -1.0 to 1.0
+	float dotNL = dot( normal, lightDirection );
+	vec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );
+
+	#ifdef USE_GRADIENTMAP
+
+		return vec3( texture2D( gradientMap, coord ).r );
+
+	#else
+
+		return ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );
+
+	#endif
+
+}
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/lightmap_fragment.glsl.js
+/* harmony default export */ const lightmap_fragment_glsl = (/* glsl */`
+#ifdef USE_LIGHTMAP
+
+	vec4 lightMapTexel = texture2D( lightMap, vUv2 );
+	vec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;
+
+	#ifndef PHYSICALLY_CORRECT_LIGHTS
+
+		lightMapIrradiance *= PI;
+
+	#endif
+
+	reflectedLight.indirectDiffuse += lightMapIrradiance;
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/lightmap_pars_fragment.glsl.js
+/* harmony default export */ const lightmap_pars_fragment_glsl = (/* glsl */`
+#ifdef USE_LIGHTMAP
+
+	uniform sampler2D lightMap;
+	uniform float lightMapIntensity;
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/lights_lambert_vertex.glsl.js
+/* harmony default export */ const lights_lambert_vertex_glsl = (/* glsl */`
+vec3 diffuse = vec3( 1.0 );
+
+GeometricContext geometry;
+geometry.position = mvPosition.xyz;
+geometry.normal = normalize( transformedNormal );
+geometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( -mvPosition.xyz );
+
+GeometricContext backGeometry;
+backGeometry.position = geometry.position;
+backGeometry.normal = -geometry.normal;
+backGeometry.viewDir = geometry.viewDir;
+
+vLightFront = vec3( 0.0 );
+vIndirectFront = vec3( 0.0 );
+#ifdef DOUBLE_SIDED
+	vLightBack = vec3( 0.0 );
+	vIndirectBack = vec3( 0.0 );
+#endif
+
+IncidentLight directLight;
+float dotNL;
+vec3 directLightColor_Diffuse;
+
+vIndirectFront += getAmbientLightIrradiance( ambientLightColor );
+
+vIndirectFront += getLightProbeIrradiance( lightProbe, geometry.normal );
+
+#ifdef DOUBLE_SIDED
+
+	vIndirectBack += getAmbientLightIrradiance( ambientLightColor );
+
+	vIndirectBack += getLightProbeIrradiance( lightProbe, backGeometry.normal );
+
+#endif
+
+#if NUM_POINT_LIGHTS > 0
+
+	#pragma unroll_loop_start
+	for ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {
+
+		getPointLightInfo( pointLights[ i ], geometry, directLight );
+
+		dotNL = dot( geometry.normal, directLight.direction );
+		directLightColor_Diffuse = directLight.color;
+
+		vLightFront += saturate( dotNL ) * directLightColor_Diffuse;
+
+		#ifdef DOUBLE_SIDED
+
+			vLightBack += saturate( - dotNL ) * directLightColor_Diffuse;
+
+		#endif
+
+	}
+	#pragma unroll_loop_end
+
+#endif
+
+#if NUM_SPOT_LIGHTS > 0
+
+	#pragma unroll_loop_start
+	for ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {
+
+		getSpotLightInfo( spotLights[ i ], geometry, directLight );
+
+		dotNL = dot( geometry.normal, directLight.direction );
+		directLightColor_Diffuse = directLight.color;
+
+		vLightFront += saturate( dotNL ) * directLightColor_Diffuse;
+
+		#ifdef DOUBLE_SIDED
+
+			vLightBack += saturate( - dotNL ) * directLightColor_Diffuse;
+
+		#endif
+	}
+	#pragma unroll_loop_end
+
+#endif
+
+#if NUM_DIR_LIGHTS > 0
+
+	#pragma unroll_loop_start
+	for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {
+
+		getDirectionalLightInfo( directionalLights[ i ], geometry, directLight );
+
+		dotNL = dot( geometry.normal, directLight.direction );
+		directLightColor_Diffuse = directLight.color;
+
+		vLightFront += saturate( dotNL ) * directLightColor_Diffuse;
+
+		#ifdef DOUBLE_SIDED
+
+			vLightBack += saturate( - dotNL ) * directLightColor_Diffuse;
+
+		#endif
+
+	}
+	#pragma unroll_loop_end
+
+#endif
+
+#if NUM_HEMI_LIGHTS > 0
+
+	#pragma unroll_loop_start
+	for ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {
+
+		vIndirectFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry.normal );
+
+		#ifdef DOUBLE_SIDED
+
+			vIndirectBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry.normal );
+
+		#endif
+
+	}
+	#pragma unroll_loop_end
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js
+/* harmony default export */ const lights_pars_begin_glsl = (/* glsl */`
+uniform bool receiveShadow;
+uniform vec3 ambientLightColor;
+uniform vec3 lightProbe[ 9 ];
+
+// get the irradiance (radiance convolved with cosine lobe) at the point 'normal' on the unit sphere
+// source: https://graphics.stanford.edu/papers/envmap/envmap.pdf
+vec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {
+
+	// normal is assumed to have unit length
+
+	float x = normal.x, y = normal.y, z = normal.z;
+
+	// band 0
+	vec3 result = shCoefficients[ 0 ] * 0.886227;
+
+	// band 1
+	result += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;
+	result += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;
+	result += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;
+
+	// band 2
+	result += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;
+	result += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;
+	result += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );
+	result += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;
+	result += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );
+
+	return result;
+
+}
+
+vec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) {
+
+	vec3 worldNormal = inverseTransformDirection( normal, viewMatrix );
+
+	vec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );
+
+	return irradiance;
+
+}
+
+vec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {
+
+	vec3 irradiance = ambientLightColor;
+
+	return irradiance;
+
+}
+
+float getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {
+
+	#if defined ( PHYSICALLY_CORRECT_LIGHTS )
+
+		// based upon Frostbite 3 Moving to Physically-based Rendering
+		// page 32, equation 26: E[window1]
+		// https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf
+		float distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );
+
+		if ( cutoffDistance > 0.0 ) {
+
+			distanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );
+
+		}
+
+		return distanceFalloff;
+
+	#else
+
+		if ( cutoffDistance > 0.0 && decayExponent > 0.0 ) {
+
+			return pow( saturate( - lightDistance / cutoffDistance + 1.0 ), decayExponent );
+
+		}
+
+		return 1.0;
+
+	#endif
+
+}
+
+float getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {
+
+	return smoothstep( coneCosine, penumbraCosine, angleCosine );
+
+}
+
+#if NUM_DIR_LIGHTS > 0
+
+	struct DirectionalLight {
+		vec3 direction;
+		vec3 color;
+	};
+
+	uniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];
+
+	void getDirectionalLightInfo( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight light ) {
+
+		light.color = directionalLight.color;
+		light.direction = directionalLight.direction;
+		light.visible = true;
+
+	}
+
+#endif
+
+
+#if NUM_POINT_LIGHTS > 0
+
+	struct PointLight {
+		vec3 position;
+		vec3 color;
+		float distance;
+		float decay;
+	};
+
+	uniform PointLight pointLights[ NUM_POINT_LIGHTS ];
+
+	// light is an out parameter as having it as a return value caused compiler errors on some devices
+	void getPointLightInfo( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight light ) {
+
+		vec3 lVector = pointLight.position - geometry.position;
+
+		light.direction = normalize( lVector );
+
+		float lightDistance = length( lVector );
+
+		light.color = pointLight.color;
+		light.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );
+		light.visible = ( light.color != vec3( 0.0 ) );
+
+	}
+
+#endif
+
+
+#if NUM_SPOT_LIGHTS > 0
+
+	struct SpotLight {
+		vec3 position;
+		vec3 direction;
+		vec3 color;
+		float distance;
+		float decay;
+		float coneCos;
+		float penumbraCos;
+	};
+
+	uniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];
+
+	// light is an out parameter as having it as a return value caused compiler errors on some devices
+	void getSpotLightInfo( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight light ) {
+
+		vec3 lVector = spotLight.position - geometry.position;
+
+		light.direction = normalize( lVector );
+
+		float angleCos = dot( light.direction, spotLight.direction );
+
+		float spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );
+
+		if ( spotAttenuation > 0.0 ) {
+
+			float lightDistance = length( lVector );
+
+			light.color = spotLight.color * spotAttenuation;
+			light.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );
+			light.visible = ( light.color != vec3( 0.0 ) );
+
+		} else {
+
+			light.color = vec3( 0.0 );
+			light.visible = false;
+
+		}
+
+	}
+
+#endif
+
+
+#if NUM_RECT_AREA_LIGHTS > 0
+
+	struct RectAreaLight {
+		vec3 color;
+		vec3 position;
+		vec3 halfWidth;
+		vec3 halfHeight;
+	};
+
+	// Pre-computed values of LinearTransformedCosine approximation of BRDF
+	// BRDF approximation Texture is 64x64
+	uniform sampler2D ltc_1; // RGBA Float
+	uniform sampler2D ltc_2; // RGBA Float
+
+	uniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];
+
+#endif
+
+
+#if NUM_HEMI_LIGHTS > 0
+
+	struct HemisphereLight {
+		vec3 direction;
+		vec3 skyColor;
+		vec3 groundColor;
+	};
+
+	uniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];
+
+	vec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in vec3 normal ) {
+
+		float dotNL = dot( normal, hemiLight.direction );
+		float hemiDiffuseWeight = 0.5 * dotNL + 0.5;
+
+		vec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );
+
+		return irradiance;
+
+	}
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js
+/* harmony default export */ const envmap_physical_pars_fragment_glsl = (/* glsl */`
+#if defined( USE_ENVMAP )
+
+	#ifdef ENVMAP_MODE_REFRACTION
+
+		uniform float refractionRatio;
+
+	#endif
+
+	vec3 getIBLIrradiance( const in vec3 normal ) {
+
+		#if defined( ENVMAP_TYPE_CUBE_UV )
+
+			vec3 worldNormal = inverseTransformDirection( normal, viewMatrix );
+
+			vec4 envMapColor = textureCubeUV( envMap, worldNormal, 1.0 );
+
+			return PI * envMapColor.rgb * envMapIntensity;
+
+		#else
+
+			return vec3( 0.0 );
+
+		#endif
+
+	}
+
+	vec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {
+
+		#if defined( ENVMAP_TYPE_CUBE_UV )
+
+			vec3 reflectVec;
+
+			#ifdef ENVMAP_MODE_REFLECTION
+
+				reflectVec = reflect( - viewDir, normal );
+
+				// Mixing the reflection with the normal is more accurate and keeps rough objects from gathering light from behind their tangent plane.
+				reflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );
+
+			#else
+
+				reflectVec = refract( - viewDir, normal, refractionRatio );
+
+			#endif
+
+			reflectVec = inverseTransformDirection( reflectVec, viewMatrix );
+
+			vec4 envMapColor = textureCubeUV( envMap, reflectVec, roughness );
+
+			return envMapColor.rgb * envMapIntensity;
+
+		#else
+
+			return vec3( 0.0 );
+
+		#endif
+
+	}
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/lights_toon_fragment.glsl.js
+/* harmony default export */ const lights_toon_fragment_glsl = (/* glsl */`
+ToonMaterial material;
+material.diffuseColor = diffuseColor.rgb;
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/lights_toon_pars_fragment.glsl.js
+/* harmony default export */ const lights_toon_pars_fragment_glsl = (/* glsl */`
+varying vec3 vViewPosition;
+
+struct ToonMaterial {
+
+	vec3 diffuseColor;
+
+};
+
+void RE_Direct_Toon( const in IncidentLight directLight, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {
+
+	vec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;
+
+	reflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );
+
+}
+
+void RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {
+
+	reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );
+
+}
+
+#define RE_Direct				RE_Direct_Toon
+#define RE_IndirectDiffuse		RE_IndirectDiffuse_Toon
+
+#define Material_LightProbeLOD( material )	(0)
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/lights_phong_fragment.glsl.js
+/* harmony default export */ const lights_phong_fragment_glsl = (/* glsl */`
+BlinnPhongMaterial material;
+material.diffuseColor = diffuseColor.rgb;
+material.specularColor = specular;
+material.specularShininess = shininess;
+material.specularStrength = specularStrength;
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/lights_phong_pars_fragment.glsl.js
+/* harmony default export */ const lights_phong_pars_fragment_glsl = (/* glsl */`
+varying vec3 vViewPosition;
+
+struct BlinnPhongMaterial {
+
+	vec3 diffuseColor;
+	vec3 specularColor;
+	float specularShininess;
+	float specularStrength;
+
+};
+
+void RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {
+
+	float dotNL = saturate( dot( geometry.normal, directLight.direction ) );
+	vec3 irradiance = dotNL * directLight.color;
+
+	reflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );
+
+	reflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometry.viewDir, geometry.normal, material.specularColor, material.specularShininess ) * material.specularStrength;
+
+}
+
+void RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {
+
+	reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );
+
+}
+
+#define RE_Direct				RE_Direct_BlinnPhong
+#define RE_IndirectDiffuse		RE_IndirectDiffuse_BlinnPhong
+
+#define Material_LightProbeLOD( material )	(0)
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js
+/* harmony default export */ const lights_physical_fragment_glsl = (/* glsl */`
+PhysicalMaterial material;
+material.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );
+
+vec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );
+float geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );
+
+material.roughness = max( roughnessFactor, 0.0525 );// 0.0525 corresponds to the base mip of a 256 cubemap.
+material.roughness += geometryRoughness;
+material.roughness = min( material.roughness, 1.0 );
+
+#ifdef IOR
+
+	#ifdef SPECULAR
+
+		float specularIntensityFactor = specularIntensity;
+		vec3 specularColorFactor = specularColor;
+
+		#ifdef USE_SPECULARINTENSITYMAP
+
+			specularIntensityFactor *= texture2D( specularIntensityMap, vUv ).a;
+
+		#endif
+
+		#ifdef USE_SPECULARCOLORMAP
+
+			specularColorFactor *= texture2D( specularColorMap, vUv ).rgb;
+
+		#endif
+
+		material.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );
+
+	#else
+
+		float specularIntensityFactor = 1.0;
+		vec3 specularColorFactor = vec3( 1.0 );
+		material.specularF90 = 1.0;
+
+	#endif
+
+	material.specularColor = mix( min( pow2( ( ior - 1.0 ) / ( ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor );
+
+#else
+
+	material.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor );
+	material.specularF90 = 1.0;
+
+#endif
+
+#ifdef USE_CLEARCOAT
+
+	material.clearcoat = clearcoat;
+	material.clearcoatRoughness = clearcoatRoughness;
+	material.clearcoatF0 = vec3( 0.04 );
+	material.clearcoatF90 = 1.0;
+
+	#ifdef USE_CLEARCOATMAP
+
+		material.clearcoat *= texture2D( clearcoatMap, vUv ).x;
+
+	#endif
+
+	#ifdef USE_CLEARCOAT_ROUGHNESSMAP
+
+		material.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vUv ).y;
+
+	#endif
+
+	material.clearcoat = saturate( material.clearcoat ); // Burley clearcoat model
+	material.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );
+	material.clearcoatRoughness += geometryRoughness;
+	material.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );
+
+#endif
+
+#ifdef USE_SHEEN
+
+	material.sheenColor = sheenColor;
+
+	#ifdef USE_SHEENCOLORMAP
+
+		material.sheenColor *= texture2D( sheenColorMap, vUv ).rgb;
+
+	#endif
+
+	material.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 );
+
+	#ifdef USE_SHEENROUGHNESSMAP
+
+		material.sheenRoughness *= texture2D( sheenRoughnessMap, vUv ).a;
+
+	#endif
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js
+/* harmony default export */ const lights_physical_pars_fragment_glsl = (/* glsl */`
+struct PhysicalMaterial {
+
+	vec3 diffuseColor;
+	float roughness;
+	vec3 specularColor;
+	float specularF90;
+
+	#ifdef USE_CLEARCOAT
+		float clearcoat;
+		float clearcoatRoughness;
+		vec3 clearcoatF0;
+		float clearcoatF90;
+	#endif
+
+	#ifdef USE_SHEEN
+		vec3 sheenColor;
+		float sheenRoughness;
+	#endif
+
+};
+
+// temporary
+vec3 clearcoatSpecular = vec3( 0.0 );
+vec3 sheenSpecular = vec3( 0.0 );
+
+// This is a curve-fit approxmation to the "Charlie sheen" BRDF integrated over the hemisphere from 
+// Estevez and Kulla 2017, "Production Friendly Microfacet Sheen BRDF". The analysis can be found
+// in the Sheen section of https://drive.google.com/file/d/1T0D1VSyR4AllqIJTQAraEIzjlb5h4FKH/view?usp=sharing
+float IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness) {
+
+	float dotNV = saturate( dot( normal, viewDir ) );
+
+	float r2 = roughness * roughness;
+
+	float a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95;
+
+	float b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72;
+
+	float DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) );
+
+	return saturate( DG * RECIPROCAL_PI );
+
+}
+
+// Analytical approximation of the DFG LUT, one half of the
+// split-sum approximation used in indirect specular lighting.
+// via 'environmentBRDF' from "Physically Based Shading on Mobile"
+// https://www.unrealengine.com/blog/physically-based-shading-on-mobile
+vec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {
+
+	float dotNV = saturate( dot( normal, viewDir ) );
+
+	const vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );
+
+	const vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );
+
+	vec4 r = roughness * c0 + c1;
+
+	float a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;
+
+	vec2 fab = vec2( - 1.04, 1.04 ) * a004 + r.zw;
+
+	return fab;
+
+}
+
+vec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {
+
+	vec2 fab = DFGApprox( normal, viewDir, roughness );
+
+	return specularColor * fab.x + specularF90 * fab.y;
+
+}
+
+// Fdez-Agüera's "Multiple-Scattering Microfacet Model for Real-Time Image Based Lighting"
+// Approximates multiscattering in order to preserve energy.
+// http://www.jcgt.org/published/0008/01/03/
+void computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {
+
+	vec2 fab = DFGApprox( normal, viewDir, roughness );
+
+	vec3 FssEss = specularColor * fab.x + specularF90 * fab.y;
+
+	float Ess = fab.x + fab.y;
+	float Ems = 1.0 - Ess;
+
+	vec3 Favg = specularColor + ( 1.0 - specularColor ) * 0.047619; // 1/21
+	vec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );
+
+	singleScatter += FssEss;
+	multiScatter += Fms * Ems;
+
+}
+
+#if NUM_RECT_AREA_LIGHTS > 0
+
+	void RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {
+
+		vec3 normal = geometry.normal;
+		vec3 viewDir = geometry.viewDir;
+		vec3 position = geometry.position;
+		vec3 lightPos = rectAreaLight.position;
+		vec3 halfWidth = rectAreaLight.halfWidth;
+		vec3 halfHeight = rectAreaLight.halfHeight;
+		vec3 lightColor = rectAreaLight.color;
+		float roughness = material.roughness;
+
+		vec3 rectCoords[ 4 ];
+		rectCoords[ 0 ] = lightPos + halfWidth - halfHeight; // counterclockwise; light shines in local neg z direction
+		rectCoords[ 1 ] = lightPos - halfWidth - halfHeight;
+		rectCoords[ 2 ] = lightPos - halfWidth + halfHeight;
+		rectCoords[ 3 ] = lightPos + halfWidth + halfHeight;
+
+		vec2 uv = LTC_Uv( normal, viewDir, roughness );
+
+		vec4 t1 = texture2D( ltc_1, uv );
+		vec4 t2 = texture2D( ltc_2, uv );
+
+		mat3 mInv = mat3(
+			vec3( t1.x, 0, t1.y ),
+			vec3(    0, 1,    0 ),
+			vec3( t1.z, 0, t1.w )
+		);
+
+		// LTC Fresnel Approximation by Stephen Hill
+		// http://blog.selfshadow.com/publications/s2016-advances/s2016_ltc_fresnel.pdf
+		vec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );
+
+		reflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );
+
+		reflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );
+
+	}
+
+#endif
+
+void RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {
+
+	float dotNL = saturate( dot( geometry.normal, directLight.direction ) );
+
+	vec3 irradiance = dotNL * directLight.color;
+
+	#ifdef USE_CLEARCOAT
+
+		float dotNLcc = saturate( dot( geometry.clearcoatNormal, directLight.direction ) );
+
+		vec3 ccIrradiance = dotNLcc * directLight.color;
+
+		clearcoatSpecular += ccIrradiance * BRDF_GGX( directLight.direction, geometry.viewDir, geometry.clearcoatNormal, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );
+
+	#endif
+
+	#ifdef USE_SHEEN
+
+		sheenSpecular += irradiance * BRDF_Sheen( directLight.direction, geometry.viewDir, geometry.normal, material.sheenColor, material.sheenRoughness );
+
+	#endif
+
+	reflectedLight.directSpecular += irradiance * BRDF_GGX( directLight.direction, geometry.viewDir, geometry.normal, material.specularColor, material.specularF90, material.roughness );
+
+
+	reflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );
+}
+
+void RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {
+
+	reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );
+
+}
+
+void RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {
+
+	#ifdef USE_CLEARCOAT
+
+		clearcoatSpecular += clearcoatRadiance * EnvironmentBRDF( geometry.clearcoatNormal, geometry.viewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );
+
+	#endif
+
+	#ifdef USE_SHEEN
+
+		sheenSpecular += irradiance * material.sheenColor * IBLSheenBRDF( geometry.normal, geometry.viewDir, material.sheenRoughness );
+
+	#endif
+
+	// Both indirect specular and indirect diffuse light accumulate here
+
+	vec3 singleScattering = vec3( 0.0 );
+	vec3 multiScattering = vec3( 0.0 );
+	vec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;
+
+	computeMultiscattering( geometry.normal, geometry.viewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );
+
+	vec3 diffuse = material.diffuseColor * ( 1.0 - ( singleScattering + multiScattering ) );
+
+	reflectedLight.indirectSpecular += radiance * singleScattering;
+	reflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;
+
+	reflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;
+
+}
+
+#define RE_Direct				RE_Direct_Physical
+#define RE_Direct_RectArea		RE_Direct_RectArea_Physical
+#define RE_IndirectDiffuse		RE_IndirectDiffuse_Physical
+#define RE_IndirectSpecular		RE_IndirectSpecular_Physical
+
+// ref: https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf
+float computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {
+
+	return saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );
+
+}
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js
+/* harmony default export */ const lights_fragment_begin_glsl = (/* glsl */`
+/**
+ * This is a template that can be used to light a material, it uses pluggable
+ * RenderEquations (RE)for specific lighting scenarios.
+ *
+ * Instructions for use:
+ * - Ensure that both RE_Direct, RE_IndirectDiffuse and RE_IndirectSpecular are defined
+ * - If you have defined an RE_IndirectSpecular, you need to also provide a Material_LightProbeLOD. <---- ???
+ * - Create a material parameter that is to be passed as the third parameter to your lighting functions.
+ *
+ * TODO:
+ * - Add area light support.
+ * - Add sphere light support.
+ * - Add diffuse light probe (irradiance cubemap) support.
+ */
+
+GeometricContext geometry;
+
+geometry.position = - vViewPosition;
+geometry.normal = normal;
+geometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );
+
+#ifdef USE_CLEARCOAT
+
+	geometry.clearcoatNormal = clearcoatNormal;
+
+#endif
+
+IncidentLight directLight;
+
+#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )
+
+	PointLight pointLight;
+	#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0
+	PointLightShadow pointLightShadow;
+	#endif
+
+	#pragma unroll_loop_start
+	for ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {
+
+		pointLight = pointLights[ i ];
+
+		getPointLightInfo( pointLight, geometry, directLight );
+
+		#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )
+		pointLightShadow = pointLightShadows[ i ];
+		directLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;
+		#endif
+
+		RE_Direct( directLight, geometry, material, reflectedLight );
+
+	}
+	#pragma unroll_loop_end
+
+#endif
+
+#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )
+
+	SpotLight spotLight;
+	#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0
+	SpotLightShadow spotLightShadow;
+	#endif
+
+	#pragma unroll_loop_start
+	for ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {
+
+		spotLight = spotLights[ i ];
+
+		getSpotLightInfo( spotLight, geometry, directLight );
+
+		#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )
+		spotLightShadow = spotLightShadows[ i ];
+		directLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;
+		#endif
+
+		RE_Direct( directLight, geometry, material, reflectedLight );
+
+	}
+	#pragma unroll_loop_end
+
+#endif
+
+#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )
+
+	DirectionalLight directionalLight;
+	#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0
+	DirectionalLightShadow directionalLightShadow;
+	#endif
+
+	#pragma unroll_loop_start
+	for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {
+
+		directionalLight = directionalLights[ i ];
+
+		getDirectionalLightInfo( directionalLight, geometry, directLight );
+
+		#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )
+		directionalLightShadow = directionalLightShadows[ i ];
+		directLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;
+		#endif
+
+		RE_Direct( directLight, geometry, material, reflectedLight );
+
+	}
+	#pragma unroll_loop_end
+
+#endif
+
+#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )
+
+	RectAreaLight rectAreaLight;
+
+	#pragma unroll_loop_start
+	for ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {
+
+		rectAreaLight = rectAreaLights[ i ];
+		RE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );
+
+	}
+	#pragma unroll_loop_end
+
+#endif
+
+#if defined( RE_IndirectDiffuse )
+
+	vec3 iblIrradiance = vec3( 0.0 );
+
+	vec3 irradiance = getAmbientLightIrradiance( ambientLightColor );
+
+	irradiance += getLightProbeIrradiance( lightProbe, geometry.normal );
+
+	#if ( NUM_HEMI_LIGHTS > 0 )
+
+		#pragma unroll_loop_start
+		for ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {
+
+			irradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry.normal );
+
+		}
+		#pragma unroll_loop_end
+
+	#endif
+
+#endif
+
+#if defined( RE_IndirectSpecular )
+
+	vec3 radiance = vec3( 0.0 );
+	vec3 clearcoatRadiance = vec3( 0.0 );
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js
+/* harmony default export */ const lights_fragment_maps_glsl = (/* glsl */`
+#if defined( RE_IndirectDiffuse )
+
+	#ifdef USE_LIGHTMAP
+
+		vec4 lightMapTexel = texture2D( lightMap, vUv2 );
+		vec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;
+
+		#ifndef PHYSICALLY_CORRECT_LIGHTS
+
+			lightMapIrradiance *= PI;
+
+		#endif
+
+		irradiance += lightMapIrradiance;
+
+	#endif
+
+	#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )
+
+		iblIrradiance += getIBLIrradiance( geometry.normal );
+
+	#endif
+
+#endif
+
+#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )
+
+	radiance += getIBLRadiance( geometry.viewDir, geometry.normal, material.roughness );
+
+	#ifdef USE_CLEARCOAT
+
+		clearcoatRadiance += getIBLRadiance( geometry.viewDir, geometry.clearcoatNormal, material.clearcoatRoughness );
+
+	#endif
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js
+/* harmony default export */ const lights_fragment_end_glsl = (/* glsl */`
+#if defined( RE_IndirectDiffuse )
+
+	RE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );
+
+#endif
+
+#if defined( RE_IndirectSpecular )
+
+	RE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometry, material, reflectedLight );
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js
+/* harmony default export */ const logdepthbuf_fragment_glsl = (/* glsl */`
+#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )
+
+	// Doing a strict comparison with == 1.0 can cause noise artifacts
+	// on some platforms. See issue #17623.
+	gl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js
+/* harmony default export */ const logdepthbuf_pars_fragment_glsl = (/* glsl */`
+#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )
+
+	uniform float logDepthBufFC;
+	varying float vFragDepth;
+	varying float vIsPerspective;
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js
+/* harmony default export */ const logdepthbuf_pars_vertex_glsl = (/* glsl */`
+#ifdef USE_LOGDEPTHBUF
+
+	#ifdef USE_LOGDEPTHBUF_EXT
+
+		varying float vFragDepth;
+		varying float vIsPerspective;
+
+	#else
+
+		uniform float logDepthBufFC;
+
+	#endif
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js
+/* harmony default export */ const logdepthbuf_vertex_glsl = (/* glsl */`
+#ifdef USE_LOGDEPTHBUF
+
+	#ifdef USE_LOGDEPTHBUF_EXT
+
+		vFragDepth = 1.0 + gl_Position.w;
+		vIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );
+
+	#else
+
+		if ( isPerspectiveMatrix( projectionMatrix ) ) {
+
+			gl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;
+
+			gl_Position.z *= gl_Position.w;
+
+		}
+
+	#endif
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/map_fragment.glsl.js
+/* harmony default export */ const map_fragment_glsl = (/* glsl */`
+#ifdef USE_MAP
+
+	vec4 sampledDiffuseColor = texture2D( map, vUv );
+
+	#ifdef DECODE_VIDEO_TEXTURE
+
+		// inline sRGB decode (TODO: Remove this code when https://crbug.com/1256340 is solved)
+
+		sampledDiffuseColor = vec4( mix( pow( sampledDiffuseColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), sampledDiffuseColor.rgb * 0.0773993808, vec3( lessThanEqual( sampledDiffuseColor.rgb, vec3( 0.04045 ) ) ) ), sampledDiffuseColor.w );
+
+	#endif
+
+	diffuseColor *= sampledDiffuseColor;
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/map_pars_fragment.glsl.js
+/* harmony default export */ const map_pars_fragment_glsl = (/* glsl */`
+#ifdef USE_MAP
+
+	uniform sampler2D map;
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/map_particle_fragment.glsl.js
+/* harmony default export */ const map_particle_fragment_glsl = (/* glsl */`
+#if defined( USE_MAP ) || defined( USE_ALPHAMAP )
+
+	vec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;
+
+#endif
+
+#ifdef USE_MAP
+
+	diffuseColor *= texture2D( map, uv );
+
+#endif
+
+#ifdef USE_ALPHAMAP
+
+	diffuseColor.a *= texture2D( alphaMap, uv ).g;
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/map_particle_pars_fragment.glsl.js
+/* harmony default export */ const map_particle_pars_fragment_glsl = (/* glsl */`
+#if defined( USE_MAP ) || defined( USE_ALPHAMAP )
+
+	uniform mat3 uvTransform;
+
+#endif
+
+#ifdef USE_MAP
+
+	uniform sampler2D map;
+
+#endif
+
+#ifdef USE_ALPHAMAP
+
+	uniform sampler2D alphaMap;
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/metalnessmap_fragment.glsl.js
+/* harmony default export */ const metalnessmap_fragment_glsl = (/* glsl */`
+float metalnessFactor = metalness;
+
+#ifdef USE_METALNESSMAP
+
+	vec4 texelMetalness = texture2D( metalnessMap, vUv );
+
+	// reads channel B, compatible with a combined OcclusionRoughnessMetallic (RGB) texture
+	metalnessFactor *= texelMetalness.b;
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/metalnessmap_pars_fragment.glsl.js
+/* harmony default export */ const metalnessmap_pars_fragment_glsl = (/* glsl */`
+#ifdef USE_METALNESSMAP
+
+	uniform sampler2D metalnessMap;
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/morphnormal_vertex.glsl.js
+/* harmony default export */ const morphnormal_vertex_glsl = (/* glsl */`
+#ifdef USE_MORPHNORMALS
+
+	// morphTargetBaseInfluence is set based on BufferGeometry.morphTargetsRelative value:
+	// When morphTargetsRelative is false, this is set to 1 - sum(influences); this results in normal = sum((target - base) * influence)
+	// When morphTargetsRelative is true, this is set to 1; as a result, all morph targets are simply added to the base after weighting
+	objectNormal *= morphTargetBaseInfluence;
+
+	#ifdef MORPHTARGETS_TEXTURE
+
+		for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {
+
+			if ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1, 2 ) * morphTargetInfluences[ i ];
+
+		}
+
+	#else
+
+		objectNormal += morphNormal0 * morphTargetInfluences[ 0 ];
+		objectNormal += morphNormal1 * morphTargetInfluences[ 1 ];
+		objectNormal += morphNormal2 * morphTargetInfluences[ 2 ];
+		objectNormal += morphNormal3 * morphTargetInfluences[ 3 ];
+
+	#endif
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/morphtarget_pars_vertex.glsl.js
+/* harmony default export */ const morphtarget_pars_vertex_glsl = (/* glsl */`
+#ifdef USE_MORPHTARGETS
+
+	uniform float morphTargetBaseInfluence;
+
+	#ifdef MORPHTARGETS_TEXTURE
+
+		uniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];
+		uniform sampler2DArray morphTargetsTexture;
+		uniform vec2 morphTargetsTextureSize;
+
+		vec3 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset, const in int stride ) {
+
+			float texelIndex = float( vertexIndex * stride + offset );
+			float y = floor( texelIndex / morphTargetsTextureSize.x );
+			float x = texelIndex - y * morphTargetsTextureSize.x;
+
+			vec3 morphUV = vec3( ( x + 0.5 ) / morphTargetsTextureSize.x, y / morphTargetsTextureSize.y, morphTargetIndex );
+			return texture( morphTargetsTexture, morphUV ).xyz;
+
+		}
+
+	#else
+
+		#ifndef USE_MORPHNORMALS
+
+			uniform float morphTargetInfluences[ 8 ];
+
+		#else
+
+			uniform float morphTargetInfluences[ 4 ];
+
+		#endif
+
+	#endif
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/morphtarget_vertex.glsl.js
+/* harmony default export */ const morphtarget_vertex_glsl = (/* glsl */`
+#ifdef USE_MORPHTARGETS
+
+	// morphTargetBaseInfluence is set based on BufferGeometry.morphTargetsRelative value:
+	// When morphTargetsRelative is false, this is set to 1 - sum(influences); this results in position = sum((target - base) * influence)
+	// When morphTargetsRelative is true, this is set to 1; as a result, all morph targets are simply added to the base after weighting
+	transformed *= morphTargetBaseInfluence;
+
+	#ifdef MORPHTARGETS_TEXTURE
+
+		for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {
+
+			#ifndef USE_MORPHNORMALS
+
+				if ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0, 1 ) * morphTargetInfluences[ i ];
+
+			#else
+
+				if ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0, 2 ) * morphTargetInfluences[ i ];
+
+			#endif
+
+		}
+
+	#else
+
+		transformed += morphTarget0 * morphTargetInfluences[ 0 ];
+		transformed += morphTarget1 * morphTargetInfluences[ 1 ];
+		transformed += morphTarget2 * morphTargetInfluences[ 2 ];
+		transformed += morphTarget3 * morphTargetInfluences[ 3 ];
+
+		#ifndef USE_MORPHNORMALS
+
+			transformed += morphTarget4 * morphTargetInfluences[ 4 ];
+			transformed += morphTarget5 * morphTargetInfluences[ 5 ];
+			transformed += morphTarget6 * morphTargetInfluences[ 6 ];
+			transformed += morphTarget7 * morphTargetInfluences[ 7 ];
+
+		#endif
+
+	#endif
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl.js
+/* harmony default export */ const normal_fragment_begin_glsl = (/* glsl */`
+float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;
+
+#ifdef FLAT_SHADED
+
+	// Workaround for Adreno GPUs not able to do dFdx( vViewPosition )
+
+	vec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );
+	vec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );
+	vec3 normal = normalize( cross( fdx, fdy ) );
+
+#else
+
+	vec3 normal = normalize( vNormal );
+
+	#ifdef DOUBLE_SIDED
+
+		normal = normal * faceDirection;
+
+	#endif
+
+	#ifdef USE_TANGENT
+
+		vec3 tangent = normalize( vTangent );
+		vec3 bitangent = normalize( vBitangent );
+
+		#ifdef DOUBLE_SIDED
+
+			tangent = tangent * faceDirection;
+			bitangent = bitangent * faceDirection;
+
+		#endif
+
+		#if defined( TANGENTSPACE_NORMALMAP ) || defined( USE_CLEARCOAT_NORMALMAP )
+
+			mat3 vTBN = mat3( tangent, bitangent, normal );
+
+		#endif
+
+	#endif
+
+#endif
+
+// non perturbed normal for clearcoat among others
+
+vec3 geometryNormal = normal;
+
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js
+/* harmony default export */ const normal_fragment_maps_glsl = (/* glsl */`
+
+#ifdef OBJECTSPACE_NORMALMAP
+
+	normal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0; // overrides both flatShading and attribute normals
+
+	#ifdef FLIP_SIDED
+
+		normal = - normal;
+
+	#endif
+
+	#ifdef DOUBLE_SIDED
+
+		normal = normal * faceDirection;
+
+	#endif
+
+	normal = normalize( normalMatrix * normal );
+
+#elif defined( TANGENTSPACE_NORMALMAP )
+
+	vec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;
+	mapN.xy *= normalScale;
+
+	#ifdef USE_TANGENT
+
+		normal = normalize( vTBN * mapN );
+
+	#else
+
+		normal = perturbNormal2Arb( - vViewPosition, normal, mapN, faceDirection );
+
+	#endif
+
+#elif defined( USE_BUMPMAP )
+
+	normal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/normal_pars_fragment.glsl.js
+/* harmony default export */ const normal_pars_fragment_glsl = (/* glsl */`
+#ifndef FLAT_SHADED
+
+	varying vec3 vNormal;
+
+	#ifdef USE_TANGENT
+
+		varying vec3 vTangent;
+		varying vec3 vBitangent;
+
+	#endif
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/normal_pars_vertex.glsl.js
+/* harmony default export */ const normal_pars_vertex_glsl = (/* glsl */`
+#ifndef FLAT_SHADED
+
+	varying vec3 vNormal;
+
+	#ifdef USE_TANGENT
+
+		varying vec3 vTangent;
+		varying vec3 vBitangent;
+
+	#endif
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/normal_vertex.glsl.js
+/* harmony default export */ const normal_vertex_glsl = (/* glsl */`
+#ifndef FLAT_SHADED // normal is computed with derivatives when FLAT_SHADED
+
+	vNormal = normalize( transformedNormal );
+
+	#ifdef USE_TANGENT
+
+		vTangent = normalize( transformedTangent );
+		vBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );
+
+	#endif
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/normalmap_pars_fragment.glsl.js
+/* harmony default export */ const normalmap_pars_fragment_glsl = (/* glsl */`
+#ifdef USE_NORMALMAP
+
+	uniform sampler2D normalMap;
+	uniform vec2 normalScale;
+
+#endif
+
+#ifdef OBJECTSPACE_NORMALMAP
+
+	uniform mat3 normalMatrix;
+
+#endif
+
+#if ! defined ( USE_TANGENT ) && ( defined ( TANGENTSPACE_NORMALMAP ) || defined ( USE_CLEARCOAT_NORMALMAP ) )
+
+	// Normal Mapping Without Precomputed Tangents
+	// http://www.thetenthplanet.de/archives/1180
+
+	vec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm, vec3 mapN, float faceDirection ) {
+
+		// Workaround for Adreno 3XX dFd*( vec3 ) bug. See #9988
+
+		vec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );
+		vec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );
+		vec2 st0 = dFdx( vUv.st );
+		vec2 st1 = dFdy( vUv.st );
+
+		vec3 N = surf_norm; // normalized
+
+		vec3 q1perp = cross( q1, N );
+		vec3 q0perp = cross( N, q0 );
+
+		vec3 T = q1perp * st0.x + q0perp * st1.x;
+		vec3 B = q1perp * st0.y + q0perp * st1.y;
+
+		float det = max( dot( T, T ), dot( B, B ) );
+		float scale = ( det == 0.0 ) ? 0.0 : faceDirection * inversesqrt( det );
+
+		return normalize( T * ( mapN.x * scale ) + B * ( mapN.y * scale ) + N * mapN.z );
+
+	}
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/clearcoat_normal_fragment_begin.glsl.js
+/* harmony default export */ const clearcoat_normal_fragment_begin_glsl = (/* glsl */`
+#ifdef USE_CLEARCOAT
+
+	vec3 clearcoatNormal = geometryNormal;
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/clearcoat_normal_fragment_maps.glsl.js
+/* harmony default export */ const clearcoat_normal_fragment_maps_glsl = (/* glsl */`
+#ifdef USE_CLEARCOAT_NORMALMAP
+
+	vec3 clearcoatMapN = texture2D( clearcoatNormalMap, vUv ).xyz * 2.0 - 1.0;
+	clearcoatMapN.xy *= clearcoatNormalScale;
+
+	#ifdef USE_TANGENT
+
+		clearcoatNormal = normalize( vTBN * clearcoatMapN );
+
+	#else
+
+		clearcoatNormal = perturbNormal2Arb( - vViewPosition, clearcoatNormal, clearcoatMapN, faceDirection );
+
+	#endif
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/clearcoat_pars_fragment.glsl.js
+/* harmony default export */ const clearcoat_pars_fragment_glsl = (/* glsl */`
+
+#ifdef USE_CLEARCOATMAP
+
+	uniform sampler2D clearcoatMap;
+
+#endif
+
+#ifdef USE_CLEARCOAT_ROUGHNESSMAP
+
+	uniform sampler2D clearcoatRoughnessMap;
+
+#endif
+
+#ifdef USE_CLEARCOAT_NORMALMAP
+
+	uniform sampler2D clearcoatNormalMap;
+	uniform vec2 clearcoatNormalScale;
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/output_fragment.glsl.js
+/* harmony default export */ const output_fragment_glsl = (/* glsl */`
+#ifdef OPAQUE
+diffuseColor.a = 1.0;
+#endif
+
+// https://github.com/mrdoob/three.js/pull/22425
+#ifdef USE_TRANSMISSION
+diffuseColor.a *= transmissionAlpha + 0.1;
+#endif
+
+gl_FragColor = vec4( outgoingLight, diffuseColor.a );
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/packing.glsl.js
+/* harmony default export */ const packing_glsl = (/* glsl */`
+vec3 packNormalToRGB( const in vec3 normal ) {
+	return normalize( normal ) * 0.5 + 0.5;
+}
+
+vec3 unpackRGBToNormal( const in vec3 rgb ) {
+	return 2.0 * rgb.xyz - 1.0;
+}
+
+const float PackUpscale = 256. / 255.; // fraction -> 0..1 (including 1)
+const float UnpackDownscale = 255. / 256.; // 0..1 -> fraction (excluding 1)
+
+const vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );
+const vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );
+
+const float ShiftRight8 = 1. / 256.;
+
+vec4 packDepthToRGBA( const in float v ) {
+	vec4 r = vec4( fract( v * PackFactors ), v );
+	r.yzw -= r.xyz * ShiftRight8; // tidy overflow
+	return r * PackUpscale;
+}
+
+float unpackRGBAToDepth( const in vec4 v ) {
+	return dot( v, UnpackFactors );
+}
+
+vec4 pack2HalfToRGBA( vec2 v ) {
+	vec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) );
+	return vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w );
+}
+
+vec2 unpackRGBATo2Half( vec4 v ) {
+	return vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );
+}
+
+// NOTE: viewZ/eyeZ is < 0 when in front of the camera per OpenGL conventions
+
+float viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {
+	return ( viewZ + near ) / ( near - far );
+}
+float orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {
+	return linearClipZ * ( near - far ) - near;
+}
+
+// NOTE: https://twitter.com/gonnavis/status/1377183786949959682
+
+float viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {
+	return ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ );
+}
+float perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {
+	return ( near * far ) / ( ( far - near ) * invClipZ - far );
+}
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js
+/* harmony default export */ const premultiplied_alpha_fragment_glsl = (/* glsl */`
+#ifdef PREMULTIPLIED_ALPHA
+
+	// Get get normal blending with premultipled, use with CustomBlending, OneFactor, OneMinusSrcAlphaFactor, AddEquation.
+	gl_FragColor.rgb *= gl_FragColor.a;
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/project_vertex.glsl.js
+/* harmony default export */ const project_vertex_glsl = (/* glsl */`
+vec4 mvPosition = vec4( transformed, 1.0 );
+
+#ifdef USE_INSTANCING
+
+	mvPosition = instanceMatrix * mvPosition;
+
+#endif
+
+mvPosition = modelViewMatrix * mvPosition;
+
+gl_Position = projectionMatrix * mvPosition;
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/dithering_fragment.glsl.js
+/* harmony default export */ const dithering_fragment_glsl = (/* glsl */`
+#ifdef DITHERING
+
+	gl_FragColor.rgb = dithering( gl_FragColor.rgb );
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/dithering_pars_fragment.glsl.js
+/* harmony default export */ const dithering_pars_fragment_glsl = (/* glsl */`
+#ifdef DITHERING
+
+	// based on https://www.shadertoy.com/view/MslGR8
+	vec3 dithering( vec3 color ) {
+		//Calculate grid position
+		float grid_position = rand( gl_FragCoord.xy );
+
+		//Shift the individual colors differently, thus making it even harder to see the dithering pattern
+		vec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );
+
+		//modify shift acording to grid position.
+		dither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );
+
+		//shift the color by dither_shift
+		return color + dither_shift_RGB;
+	}
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/roughnessmap_fragment.glsl.js
+/* harmony default export */ const roughnessmap_fragment_glsl = (/* glsl */`
+float roughnessFactor = roughness;
+
+#ifdef USE_ROUGHNESSMAP
+
+	vec4 texelRoughness = texture2D( roughnessMap, vUv );
+
+	// reads channel G, compatible with a combined OcclusionRoughnessMetallic (RGB) texture
+	roughnessFactor *= texelRoughness.g;
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/roughnessmap_pars_fragment.glsl.js
+/* harmony default export */ const roughnessmap_pars_fragment_glsl = (/* glsl */`
+#ifdef USE_ROUGHNESSMAP
+
+	uniform sampler2D roughnessMap;
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js
+/* harmony default export */ const shadowmap_pars_fragment_glsl = (/* glsl */`
+#ifdef USE_SHADOWMAP
+
+	#if NUM_DIR_LIGHT_SHADOWS > 0
+
+		uniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];
+		varying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];
+
+		struct DirectionalLightShadow {
+			float shadowBias;
+			float shadowNormalBias;
+			float shadowRadius;
+			vec2 shadowMapSize;
+		};
+
+		uniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];
+
+	#endif
+
+	#if NUM_SPOT_LIGHT_SHADOWS > 0
+
+		uniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];
+		varying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];
+
+		struct SpotLightShadow {
+			float shadowBias;
+			float shadowNormalBias;
+			float shadowRadius;
+			vec2 shadowMapSize;
+		};
+
+		uniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];
+
+	#endif
+
+	#if NUM_POINT_LIGHT_SHADOWS > 0
+
+		uniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];
+		varying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];
+
+		struct PointLightShadow {
+			float shadowBias;
+			float shadowNormalBias;
+			float shadowRadius;
+			vec2 shadowMapSize;
+			float shadowCameraNear;
+			float shadowCameraFar;
+		};
+
+		uniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];
+
+	#endif
+
+	/*
+	#if NUM_RECT_AREA_LIGHTS > 0
+
+		// TODO (abelnation): create uniforms for area light shadows
+
+	#endif
+	*/
+
+	float texture2DCompare( sampler2D depths, vec2 uv, float compare ) {
+
+		return step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );
+
+	}
+
+	vec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {
+
+		return unpackRGBATo2Half( texture2D( shadow, uv ) );
+
+	}
+
+	float VSMShadow (sampler2D shadow, vec2 uv, float compare ){
+
+		float occlusion = 1.0;
+
+		vec2 distribution = texture2DDistribution( shadow, uv );
+
+		float hard_shadow = step( compare , distribution.x ); // Hard Shadow
+
+		if (hard_shadow != 1.0 ) {
+
+			float distance = compare - distribution.x ;
+			float variance = max( 0.00000, distribution.y * distribution.y );
+			float softness_probability = variance / (variance + distance * distance ); // Chebeyshevs inequality
+			softness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 ); // 0.3 reduces light bleed
+			occlusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );
+
+		}
+		return occlusion;
+
+	}
+
+	float getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {
+
+		float shadow = 1.0;
+
+		shadowCoord.xyz /= shadowCoord.w;
+		shadowCoord.z += shadowBias;
+
+		// if ( something && something ) breaks ATI OpenGL shader compiler
+		// if ( all( something, something ) ) using this instead
+
+		bvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );
+		bool inFrustum = all( inFrustumVec );
+
+		bvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );
+
+		bool frustumTest = all( frustumTestVec );
+
+		if ( frustumTest ) {
+
+		#if defined( SHADOWMAP_TYPE_PCF )
+
+			vec2 texelSize = vec2( 1.0 ) / shadowMapSize;
+
+			float dx0 = - texelSize.x * shadowRadius;
+			float dy0 = - texelSize.y * shadowRadius;
+			float dx1 = + texelSize.x * shadowRadius;
+			float dy1 = + texelSize.y * shadowRadius;
+			float dx2 = dx0 / 2.0;
+			float dy2 = dy0 / 2.0;
+			float dx3 = dx1 / 2.0;
+			float dy3 = dy1 / 2.0;
+
+			shadow = (
+				texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +
+				texture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +
+				texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +
+				texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +
+				texture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +
+				texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +
+				texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +
+				texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +
+				texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +
+				texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +
+				texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +
+				texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +
+				texture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +
+				texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +
+				texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +
+				texture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +
+				texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )
+			) * ( 1.0 / 17.0 );
+
+		#elif defined( SHADOWMAP_TYPE_PCF_SOFT )
+
+			vec2 texelSize = vec2( 1.0 ) / shadowMapSize;
+			float dx = texelSize.x;
+			float dy = texelSize.y;
+
+			vec2 uv = shadowCoord.xy;
+			vec2 f = fract( uv * shadowMapSize + 0.5 );
+			uv -= f * texelSize;
+
+			shadow = (
+				texture2DCompare( shadowMap, uv, shadowCoord.z ) +
+				texture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +
+				texture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +
+				texture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +
+				mix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ), 
+					 texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),
+					 f.x ) +
+				mix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ), 
+					 texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),
+					 f.x ) +
+				mix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ), 
+					 texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),
+					 f.y ) +
+				mix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ), 
+					 texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),
+					 f.y ) +
+				mix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ), 
+						  texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),
+						  f.x ),
+					 mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ), 
+						  texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),
+						  f.x ),
+					 f.y )
+			) * ( 1.0 / 9.0 );
+
+		#elif defined( SHADOWMAP_TYPE_VSM )
+
+			shadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );
+
+		#else // no percentage-closer filtering:
+
+			shadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );
+
+		#endif
+
+		}
+
+		return shadow;
+
+	}
+
+	// cubeToUV() maps a 3D direction vector suitable for cube texture mapping to a 2D
+	// vector suitable for 2D texture mapping. This code uses the following layout for the
+	// 2D texture:
+	//
+	// xzXZ
+	//  y Y
+	//
+	// Y - Positive y direction
+	// y - Negative y direction
+	// X - Positive x direction
+	// x - Negative x direction
+	// Z - Positive z direction
+	// z - Negative z direction
+	//
+	// Source and test bed:
+	// https://gist.github.com/tschw/da10c43c467ce8afd0c4
+
+	vec2 cubeToUV( vec3 v, float texelSizeY ) {
+
+		// Number of texels to avoid at the edge of each square
+
+		vec3 absV = abs( v );
+
+		// Intersect unit cube
+
+		float scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );
+		absV *= scaleToCube;
+
+		// Apply scale to avoid seams
+
+		// two texels less per square (one texel will do for NEAREST)
+		v *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );
+
+		// Unwrap
+
+		// space: -1 ... 1 range for each square
+		//
+		// #X##		dim    := ( 4 , 2 )
+		//  # #		center := ( 1 , 1 )
+
+		vec2 planar = v.xy;
+
+		float almostATexel = 1.5 * texelSizeY;
+		float almostOne = 1.0 - almostATexel;
+
+		if ( absV.z >= almostOne ) {
+
+			if ( v.z > 0.0 )
+				planar.x = 4.0 - v.x;
+
+		} else if ( absV.x >= almostOne ) {
+
+			float signX = sign( v.x );
+			planar.x = v.z * signX + 2.0 * signX;
+
+		} else if ( absV.y >= almostOne ) {
+
+			float signY = sign( v.y );
+			planar.x = v.x + 2.0 * signY + 2.0;
+			planar.y = v.z * signY - 2.0;
+
+		}
+
+		// Transform to UV space
+
+		// scale := 0.5 / dim
+		// translate := ( center + 0.5 ) / dim
+		return vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );
+
+	}
+
+	float getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {
+
+		vec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );
+
+		// for point lights, the uniform @vShadowCoord is re-purposed to hold
+		// the vector from the light to the world-space position of the fragment.
+		vec3 lightToPosition = shadowCoord.xyz;
+
+		// dp = normalized distance from light to fragment position
+		float dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear ); // need to clamp?
+		dp += shadowBias;
+
+		// bd3D = base direction 3D
+		vec3 bd3D = normalize( lightToPosition );
+
+		#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )
+
+			vec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;
+
+			return (
+				texture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +
+				texture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +
+				texture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +
+				texture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +
+				texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +
+				texture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +
+				texture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +
+				texture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +
+				texture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )
+			) * ( 1.0 / 9.0 );
+
+		#else // no percentage-closer filtering
+
+			return texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );
+
+		#endif
+
+	}
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl.js
+/* harmony default export */ const shadowmap_pars_vertex_glsl = (/* glsl */`
+#ifdef USE_SHADOWMAP
+
+	#if NUM_DIR_LIGHT_SHADOWS > 0
+
+		uniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];
+		varying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];
+
+		struct DirectionalLightShadow {
+			float shadowBias;
+			float shadowNormalBias;
+			float shadowRadius;
+			vec2 shadowMapSize;
+		};
+
+		uniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];
+
+	#endif
+
+	#if NUM_SPOT_LIGHT_SHADOWS > 0
+
+		uniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHT_SHADOWS ];
+		varying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];
+
+		struct SpotLightShadow {
+			float shadowBias;
+			float shadowNormalBias;
+			float shadowRadius;
+			vec2 shadowMapSize;
+		};
+
+		uniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];
+
+	#endif
+
+	#if NUM_POINT_LIGHT_SHADOWS > 0
+
+		uniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];
+		varying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];
+
+		struct PointLightShadow {
+			float shadowBias;
+			float shadowNormalBias;
+			float shadowRadius;
+			vec2 shadowMapSize;
+			float shadowCameraNear;
+			float shadowCameraFar;
+		};
+
+		uniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];
+
+	#endif
+
+	/*
+	#if NUM_RECT_AREA_LIGHTS > 0
+
+		// TODO (abelnation): uniforms for area light shadows
+
+	#endif
+	*/
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js
+/* harmony default export */ const shadowmap_vertex_glsl = (/* glsl */`
+#ifdef USE_SHADOWMAP
+
+	#if NUM_DIR_LIGHT_SHADOWS > 0 || NUM_SPOT_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0
+
+		// Offsetting the position used for querying occlusion along the world normal can be used to reduce shadow acne.
+		vec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );
+		vec4 shadowWorldPosition;
+
+	#endif
+
+	#if NUM_DIR_LIGHT_SHADOWS > 0
+
+	#pragma unroll_loop_start
+	for ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {
+
+		shadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );
+		vDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;
+
+	}
+	#pragma unroll_loop_end
+
+	#endif
+
+	#if NUM_SPOT_LIGHT_SHADOWS > 0
+
+	#pragma unroll_loop_start
+	for ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {
+
+		shadowWorldPosition = worldPosition + vec4( shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias, 0 );
+		vSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * shadowWorldPosition;
+
+	}
+	#pragma unroll_loop_end
+
+	#endif
+
+	#if NUM_POINT_LIGHT_SHADOWS > 0
+
+	#pragma unroll_loop_start
+	for ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {
+
+		shadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );
+		vPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;
+
+	}
+	#pragma unroll_loop_end
+
+	#endif
+
+	/*
+	#if NUM_RECT_AREA_LIGHTS > 0
+
+		// TODO (abelnation): update vAreaShadowCoord with area light info
+
+	#endif
+	*/
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js
+/* harmony default export */ const shadowmask_pars_fragment_glsl = (/* glsl */`
+float getShadowMask() {
+
+	float shadow = 1.0;
+
+	#ifdef USE_SHADOWMAP
+
+	#if NUM_DIR_LIGHT_SHADOWS > 0
+
+	DirectionalLightShadow directionalLight;
+
+	#pragma unroll_loop_start
+	for ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {
+
+		directionalLight = directionalLightShadows[ i ];
+		shadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;
+
+	}
+	#pragma unroll_loop_end
+
+	#endif
+
+	#if NUM_SPOT_LIGHT_SHADOWS > 0
+
+	SpotLightShadow spotLight;
+
+	#pragma unroll_loop_start
+	for ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {
+
+		spotLight = spotLightShadows[ i ];
+		shadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;
+
+	}
+	#pragma unroll_loop_end
+
+	#endif
+
+	#if NUM_POINT_LIGHT_SHADOWS > 0
+
+	PointLightShadow pointLight;
+
+	#pragma unroll_loop_start
+	for ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {
+
+		pointLight = pointLightShadows[ i ];
+		shadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;
+
+	}
+	#pragma unroll_loop_end
+
+	#endif
+
+	/*
+	#if NUM_RECT_AREA_LIGHTS > 0
+
+		// TODO (abelnation): update shadow for Area light
+
+	#endif
+	*/
+
+	#endif
+
+	return shadow;
+
+}
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/skinbase_vertex.glsl.js
+/* harmony default export */ const skinbase_vertex_glsl = (/* glsl */`
+#ifdef USE_SKINNING
+
+	mat4 boneMatX = getBoneMatrix( skinIndex.x );
+	mat4 boneMatY = getBoneMatrix( skinIndex.y );
+	mat4 boneMatZ = getBoneMatrix( skinIndex.z );
+	mat4 boneMatW = getBoneMatrix( skinIndex.w );
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/skinning_pars_vertex.glsl.js
+/* harmony default export */ const skinning_pars_vertex_glsl = (/* glsl */`
+#ifdef USE_SKINNING
+
+	uniform mat4 bindMatrix;
+	uniform mat4 bindMatrixInverse;
+
+	#ifdef BONE_TEXTURE
+
+		uniform highp sampler2D boneTexture;
+		uniform int boneTextureSize;
+
+		mat4 getBoneMatrix( const in float i ) {
+
+			float j = i * 4.0;
+			float x = mod( j, float( boneTextureSize ) );
+			float y = floor( j / float( boneTextureSize ) );
+
+			float dx = 1.0 / float( boneTextureSize );
+			float dy = 1.0 / float( boneTextureSize );
+
+			y = dy * ( y + 0.5 );
+
+			vec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );
+			vec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );
+			vec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );
+			vec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );
+
+			mat4 bone = mat4( v1, v2, v3, v4 );
+
+			return bone;
+
+		}
+
+	#else
+
+		uniform mat4 boneMatrices[ MAX_BONES ];
+
+		mat4 getBoneMatrix( const in float i ) {
+
+			mat4 bone = boneMatrices[ int(i) ];
+			return bone;
+
+		}
+
+	#endif
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/skinning_vertex.glsl.js
+/* harmony default export */ const skinning_vertex_glsl = (/* glsl */`
+#ifdef USE_SKINNING
+
+	vec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );
+
+	vec4 skinned = vec4( 0.0 );
+	skinned += boneMatX * skinVertex * skinWeight.x;
+	skinned += boneMatY * skinVertex * skinWeight.y;
+	skinned += boneMatZ * skinVertex * skinWeight.z;
+	skinned += boneMatW * skinVertex * skinWeight.w;
+
+	transformed = ( bindMatrixInverse * skinned ).xyz;
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/skinnormal_vertex.glsl.js
+/* harmony default export */ const skinnormal_vertex_glsl = (/* glsl */`
+#ifdef USE_SKINNING
+
+	mat4 skinMatrix = mat4( 0.0 );
+	skinMatrix += skinWeight.x * boneMatX;
+	skinMatrix += skinWeight.y * boneMatY;
+	skinMatrix += skinWeight.z * boneMatZ;
+	skinMatrix += skinWeight.w * boneMatW;
+	skinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;
+
+	objectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;
+
+	#ifdef USE_TANGENT
+
+		objectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;
+
+	#endif
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/specularmap_fragment.glsl.js
+/* harmony default export */ const specularmap_fragment_glsl = (/* glsl */`
+float specularStrength;
+
+#ifdef USE_SPECULARMAP
+
+	vec4 texelSpecular = texture2D( specularMap, vUv );
+	specularStrength = texelSpecular.r;
+
+#else
+
+	specularStrength = 1.0;
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/specularmap_pars_fragment.glsl.js
+/* harmony default export */ const specularmap_pars_fragment_glsl = (/* glsl */`
+#ifdef USE_SPECULARMAP
+
+	uniform sampler2D specularMap;
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/tonemapping_fragment.glsl.js
+/* harmony default export */ const tonemapping_fragment_glsl = (/* glsl */`
+#if defined( TONE_MAPPING )
+
+	gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js
+/* harmony default export */ const tonemapping_pars_fragment_glsl = (/* glsl */`
+#ifndef saturate
+// <common> may have defined saturate() already
+#define saturate( a ) clamp( a, 0.0, 1.0 )
+#endif
+
+uniform float toneMappingExposure;
+
+// exposure only
+vec3 LinearToneMapping( vec3 color ) {
+
+	return toneMappingExposure * color;
+
+}
+
+// source: https://www.cs.utah.edu/docs/techreports/2002/pdf/UUCS-02-001.pdf
+vec3 ReinhardToneMapping( vec3 color ) {
+
+	color *= toneMappingExposure;
+	return saturate( color / ( vec3( 1.0 ) + color ) );
+
+}
+
+// source: http://filmicworlds.com/blog/filmic-tonemapping-operators/
+vec3 OptimizedCineonToneMapping( vec3 color ) {
+
+	// optimized filmic operator by Jim Hejl and Richard Burgess-Dawson
+	color *= toneMappingExposure;
+	color = max( vec3( 0.0 ), color - 0.004 );
+	return pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );
+
+}
+
+// source: https://github.com/selfshadow/ltc_code/blob/master/webgl/shaders/ltc/ltc_blit.fs
+vec3 RRTAndODTFit( vec3 v ) {
+
+	vec3 a = v * ( v + 0.0245786 ) - 0.000090537;
+	vec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;
+	return a / b;
+
+}
+
+// this implementation of ACES is modified to accommodate a brighter viewing environment.
+// the scale factor of 1/0.6 is subjective. see discussion in #19621.
+
+vec3 ACESFilmicToneMapping( vec3 color ) {
+
+	// sRGB => XYZ => D65_2_D60 => AP1 => RRT_SAT
+	const mat3 ACESInputMat = mat3(
+		vec3( 0.59719, 0.07600, 0.02840 ), // transposed from source
+		vec3( 0.35458, 0.90834, 0.13383 ),
+		vec3( 0.04823, 0.01566, 0.83777 )
+	);
+
+	// ODT_SAT => XYZ => D60_2_D65 => sRGB
+	const mat3 ACESOutputMat = mat3(
+		vec3(  1.60475, -0.10208, -0.00327 ), // transposed from source
+		vec3( -0.53108,  1.10813, -0.07276 ),
+		vec3( -0.07367, -0.00605,  1.07602 )
+	);
+
+	color *= toneMappingExposure / 0.6;
+
+	color = ACESInputMat * color;
+
+	// Apply RRT and ODT
+	color = RRTAndODTFit( color );
+
+	color = ACESOutputMat * color;
+
+	// Clamp to [0, 1]
+	return saturate( color );
+
+}
+
+vec3 CustomToneMapping( vec3 color ) { return color; }
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js
+/* harmony default export */ const transmission_fragment_glsl = (/* glsl */`
+#ifdef USE_TRANSMISSION
+
+	float transmissionAlpha = 1.0;
+	float transmissionFactor = transmission;
+	float thicknessFactor = thickness;
+
+	#ifdef USE_TRANSMISSIONMAP
+
+		transmissionFactor *= texture2D( transmissionMap, vUv ).r;
+
+	#endif
+
+	#ifdef USE_THICKNESSMAP
+
+		thicknessFactor *= texture2D( thicknessMap, vUv ).g;
+
+	#endif
+
+	vec3 pos = vWorldPosition;
+	vec3 v = normalize( cameraPosition - pos );
+	vec3 n = inverseTransformDirection( normal, viewMatrix );
+
+	vec4 transmission = getIBLVolumeRefraction(
+		n, v, roughnessFactor, material.diffuseColor, material.specularColor, material.specularF90,
+		pos, modelMatrix, viewMatrix, projectionMatrix, ior, thicknessFactor,
+		attenuationColor, attenuationDistance );
+
+	totalDiffuse = mix( totalDiffuse, transmission.rgb, transmissionFactor );
+	transmissionAlpha = mix( transmissionAlpha, transmission.a, transmissionFactor );
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js
+/* harmony default export */ const transmission_pars_fragment_glsl = (/* glsl */`
+#ifdef USE_TRANSMISSION
+
+	// Transmission code is based on glTF-Sampler-Viewer
+	// https://github.com/KhronosGroup/glTF-Sample-Viewer
+
+	uniform float transmission;
+	uniform float thickness;
+	uniform float attenuationDistance;
+	uniform vec3 attenuationColor;
+
+	#ifdef USE_TRANSMISSIONMAP
+
+		uniform sampler2D transmissionMap;
+
+	#endif
+
+	#ifdef USE_THICKNESSMAP
+
+		uniform sampler2D thicknessMap;
+
+	#endif
+
+	uniform vec2 transmissionSamplerSize;
+	uniform sampler2D transmissionSamplerMap;
+
+	uniform mat4 modelMatrix;
+	uniform mat4 projectionMatrix;
+
+	varying vec3 vWorldPosition;
+
+	vec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {
+
+		// Direction of refracted light.
+		vec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );
+
+		// Compute rotation-independant scaling of the model matrix.
+		vec3 modelScale;
+		modelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );
+		modelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );
+		modelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );
+
+		// The thickness is specified in local space.
+		return normalize( refractionVector ) * thickness * modelScale;
+
+	}
+
+	float applyIorToRoughness( const in float roughness, const in float ior ) {
+
+		// Scale roughness with IOR so that an IOR of 1.0 results in no microfacet refraction and
+		// an IOR of 1.5 results in the default amount of microfacet refraction.
+		return roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );
+
+	}
+
+	vec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {
+
+		float framebufferLod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );
+
+		#ifdef TEXTURE_LOD_EXT
+
+			return texture2DLodEXT( transmissionSamplerMap, fragCoord.xy, framebufferLod );
+
+		#else
+
+			return texture2D( transmissionSamplerMap, fragCoord.xy, framebufferLod );
+
+		#endif
+
+	}
+
+	vec3 applyVolumeAttenuation( const in vec3 radiance, const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {
+
+		if ( attenuationDistance == 0.0 ) {
+
+			// Attenuation distance is +∞ (which we indicate by zero), i.e. the transmitted color is not attenuated at all.
+			return radiance;
+
+		} else {
+
+			// Compute light attenuation using Beer's law.
+			vec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;
+			vec3 transmittance = exp( - attenuationCoefficient * transmissionDistance ); // Beer's law
+			return transmittance * radiance;
+
+		}
+
+	}
+
+	vec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,
+		const in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,
+		const in mat4 viewMatrix, const in mat4 projMatrix, const in float ior, const in float thickness,
+		const in vec3 attenuationColor, const in float attenuationDistance ) {
+
+		vec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );
+		vec3 refractedRayExit = position + transmissionRay;
+
+		// Project refracted vector on the framebuffer, while mapping to normalized device coordinates.
+		vec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );
+		vec2 refractionCoords = ndcPos.xy / ndcPos.w;
+		refractionCoords += 1.0;
+		refractionCoords /= 2.0;
+
+		// Sample framebuffer to get pixel the refracted ray hits.
+		vec4 transmittedLight = getTransmissionSample( refractionCoords, roughness, ior );
+
+		vec3 attenuatedColor = applyVolumeAttenuation( transmittedLight.rgb, length( transmissionRay ), attenuationColor, attenuationDistance );
+
+		// Get the specular component.
+		vec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );
+
+		return vec4( ( 1.0 - F ) * attenuatedColor * diffuseColor, transmittedLight.a );
+
+	}
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl.js
+/* harmony default export */ const uv_pars_fragment_glsl = (/* glsl */`
+#if ( defined( USE_UV ) && ! defined( UVS_VERTEX_ONLY ) )
+
+	varying vec2 vUv;
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl.js
+/* harmony default export */ const uv_pars_vertex_glsl = (/* glsl */`
+#ifdef USE_UV
+
+	#ifdef UVS_VERTEX_ONLY
+
+		vec2 vUv;
+
+	#else
+
+		varying vec2 vUv;
+
+	#endif
+
+	uniform mat3 uvTransform;
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/uv_vertex.glsl.js
+/* harmony default export */ const uv_vertex_glsl = (/* glsl */`
+#ifdef USE_UV
+
+	vUv = ( uvTransform * vec3( uv, 1 ) ).xy;
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/uv2_pars_fragment.glsl.js
+/* harmony default export */ const uv2_pars_fragment_glsl = (/* glsl */`
+#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )
+
+	varying vec2 vUv2;
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/uv2_pars_vertex.glsl.js
+/* harmony default export */ const uv2_pars_vertex_glsl = (/* glsl */`
+#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )
+
+	attribute vec2 uv2;
+	varying vec2 vUv2;
+
+	uniform mat3 uv2Transform;
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/uv2_vertex.glsl.js
+/* harmony default export */ const uv2_vertex_glsl = (/* glsl */`
+#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )
+
+	vUv2 = ( uv2Transform * vec3( uv2, 1 ) ).xy;
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk/worldpos_vertex.glsl.js
+/* harmony default export */ const worldpos_vertex_glsl = (/* glsl */`
+#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION )
+
+	vec4 worldPosition = vec4( transformed, 1.0 );
+
+	#ifdef USE_INSTANCING
+
+		worldPosition = instanceMatrix * worldPosition;
+
+	#endif
+
+	worldPosition = modelMatrix * worldPosition;
+
+#endif
+`);
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderLib/background.glsl.js
+const vertex = /* glsl */`
+varying vec2 vUv;
+uniform mat3 uvTransform;
+
+void main() {
+
+	vUv = ( uvTransform * vec3( uv, 1 ) ).xy;
+
+	gl_Position = vec4( position.xy, 1.0, 1.0 );
+
+}
+`;
+
+const fragment = /* glsl */`
+uniform sampler2D t2D;
+
+varying vec2 vUv;
+
+void main() {
+
+	gl_FragColor = texture2D( t2D, vUv );
+
+	#include <tonemapping_fragment>
+	#include <encodings_fragment>
+
+}
+`;
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderLib/cube.glsl.js
+const cube_glsl_vertex = /* glsl */`
+varying vec3 vWorldDirection;
+
+#include <common>
+
+void main() {
+
+	vWorldDirection = transformDirection( position, modelMatrix );
+
+	#include <begin_vertex>
+	#include <project_vertex>
+
+	gl_Position.z = gl_Position.w; // set z to camera.far
+
+}
+`;
+
+const cube_glsl_fragment = /* glsl */`
+#include <envmap_common_pars_fragment>
+uniform float opacity;
+
+varying vec3 vWorldDirection;
+
+#include <cube_uv_reflection_fragment>
+
+void main() {
+
+	vec3 vReflect = vWorldDirection;
+	#include <envmap_fragment>
+
+	gl_FragColor = envColor;
+	gl_FragColor.a *= opacity;
+
+	#include <tonemapping_fragment>
+	#include <encodings_fragment>
+
+}
+`;
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderLib/depth.glsl.js
+const depth_glsl_vertex = /* glsl */`
+#include <common>
+#include <uv_pars_vertex>
+#include <displacementmap_pars_vertex>
+#include <morphtarget_pars_vertex>
+#include <skinning_pars_vertex>
+#include <logdepthbuf_pars_vertex>
+#include <clipping_planes_pars_vertex>
+
+// This is used for computing an equivalent of gl_FragCoord.z that is as high precision as possible.
+// Some platforms compute gl_FragCoord at a lower precision which makes the manually computed value better for
+// depth-based postprocessing effects. Reproduced on iPad with A10 processor / iPadOS 13.3.1.
+varying vec2 vHighPrecisionZW;
+
+void main() {
+
+	#include <uv_vertex>
+
+	#include <skinbase_vertex>
+
+	#ifdef USE_DISPLACEMENTMAP
+
+		#include <beginnormal_vertex>
+		#include <morphnormal_vertex>
+		#include <skinnormal_vertex>
+
+	#endif
+
+	#include <begin_vertex>
+	#include <morphtarget_vertex>
+	#include <skinning_vertex>
+	#include <displacementmap_vertex>
+	#include <project_vertex>
+	#include <logdepthbuf_vertex>
+	#include <clipping_planes_vertex>
+
+	vHighPrecisionZW = gl_Position.zw;
+
+}
+`;
+
+const depth_glsl_fragment = /* glsl */`
+#if DEPTH_PACKING == 3200
+
+	uniform float opacity;
+
+#endif
+
+#include <common>
+#include <packing>
+#include <uv_pars_fragment>
+#include <map_pars_fragment>
+#include <alphamap_pars_fragment>
+#include <alphatest_pars_fragment>
+#include <logdepthbuf_pars_fragment>
+#include <clipping_planes_pars_fragment>
+
+varying vec2 vHighPrecisionZW;
+
+void main() {
+
+	#include <clipping_planes_fragment>
+
+	vec4 diffuseColor = vec4( 1.0 );
+
+	#if DEPTH_PACKING == 3200
+
+		diffuseColor.a = opacity;
+
+	#endif
+
+	#include <map_fragment>
+	#include <alphamap_fragment>
+	#include <alphatest_fragment>
+
+	#include <logdepthbuf_fragment>
+
+	// Higher precision equivalent of gl_FragCoord.z. This assumes depthRange has been left to its default values.
+	float fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;
+
+	#if DEPTH_PACKING == 3200
+
+		gl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );
+
+	#elif DEPTH_PACKING == 3201
+
+		gl_FragColor = packDepthToRGBA( fragCoordZ );
+
+	#endif
+
+}
+`;
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderLib/distanceRGBA.glsl.js
+const distanceRGBA_glsl_vertex = /* glsl */`
+#define DISTANCE
+
+varying vec3 vWorldPosition;
+
+#include <common>
+#include <uv_pars_vertex>
+#include <displacementmap_pars_vertex>
+#include <morphtarget_pars_vertex>
+#include <skinning_pars_vertex>
+#include <clipping_planes_pars_vertex>
+
+void main() {
+
+	#include <uv_vertex>
+
+	#include <skinbase_vertex>
+
+	#ifdef USE_DISPLACEMENTMAP
+
+		#include <beginnormal_vertex>
+		#include <morphnormal_vertex>
+		#include <skinnormal_vertex>
+
+	#endif
+
+	#include <begin_vertex>
+	#include <morphtarget_vertex>
+	#include <skinning_vertex>
+	#include <displacementmap_vertex>
+	#include <project_vertex>
+	#include <worldpos_vertex>
+	#include <clipping_planes_vertex>
+
+	vWorldPosition = worldPosition.xyz;
+
+}
+`;
+
+const distanceRGBA_glsl_fragment = /* glsl */`
+#define DISTANCE
+
+uniform vec3 referencePosition;
+uniform float nearDistance;
+uniform float farDistance;
+varying vec3 vWorldPosition;
+
+#include <common>
+#include <packing>
+#include <uv_pars_fragment>
+#include <map_pars_fragment>
+#include <alphamap_pars_fragment>
+#include <alphatest_pars_fragment>
+#include <clipping_planes_pars_fragment>
+
+void main () {
+
+	#include <clipping_planes_fragment>
+
+	vec4 diffuseColor = vec4( 1.0 );
+
+	#include <map_fragment>
+	#include <alphamap_fragment>
+	#include <alphatest_fragment>
+
+	float dist = length( vWorldPosition - referencePosition );
+	dist = ( dist - nearDistance ) / ( farDistance - nearDistance );
+	dist = saturate( dist ); // clamp to [ 0, 1 ]
+
+	gl_FragColor = packDepthToRGBA( dist );
+
+}
+`;
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderLib/equirect.glsl.js
+const equirect_glsl_vertex = /* glsl */`
+varying vec3 vWorldDirection;
+
+#include <common>
+
+void main() {
+
+	vWorldDirection = transformDirection( position, modelMatrix );
+
+	#include <begin_vertex>
+	#include <project_vertex>
+
+}
+`;
+
+const equirect_glsl_fragment = /* glsl */`
+uniform sampler2D tEquirect;
+
+varying vec3 vWorldDirection;
+
+#include <common>
+
+void main() {
+
+	vec3 direction = normalize( vWorldDirection );
+
+	vec2 sampleUV = equirectUv( direction );
+
+	gl_FragColor = texture2D( tEquirect, sampleUV );
+
+	#include <tonemapping_fragment>
+	#include <encodings_fragment>
+
+}
+`;
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderLib/linedashed.glsl.js
+const linedashed_glsl_vertex = /* glsl */`
+uniform float scale;
+attribute float lineDistance;
+
+varying float vLineDistance;
+
+#include <common>
+#include <color_pars_vertex>
+#include <fog_pars_vertex>
+#include <morphtarget_pars_vertex>
+#include <logdepthbuf_pars_vertex>
+#include <clipping_planes_pars_vertex>
+
+void main() {
+
+	vLineDistance = scale * lineDistance;
+
+	#include <color_vertex>
+	#include <begin_vertex>
+	#include <morphtarget_vertex>
+	#include <project_vertex>
+	#include <logdepthbuf_vertex>
+	#include <clipping_planes_vertex>
+	#include <fog_vertex>
+
+}
+`;
+
+const linedashed_glsl_fragment = /* glsl */`
+uniform vec3 diffuse;
+uniform float opacity;
+
+uniform float dashSize;
+uniform float totalSize;
+
+varying float vLineDistance;
+
+#include <common>
+#include <color_pars_fragment>
+#include <fog_pars_fragment>
+#include <logdepthbuf_pars_fragment>
+#include <clipping_planes_pars_fragment>
+
+void main() {
+
+	#include <clipping_planes_fragment>
+
+	if ( mod( vLineDistance, totalSize ) > dashSize ) {
+
+		discard;
+
+	}
+
+	vec3 outgoingLight = vec3( 0.0 );
+	vec4 diffuseColor = vec4( diffuse, opacity );
+
+	#include <logdepthbuf_fragment>
+	#include <color_fragment>
+
+	outgoingLight = diffuseColor.rgb; // simple shader
+
+	#include <output_fragment>
+	#include <tonemapping_fragment>
+	#include <encodings_fragment>
+	#include <fog_fragment>
+	#include <premultiplied_alpha_fragment>
+
+}
+`;
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderLib/meshbasic.glsl.js
+const meshbasic_glsl_vertex = /* glsl */`
+#include <common>
+#include <uv_pars_vertex>
+#include <uv2_pars_vertex>
+#include <envmap_pars_vertex>
+#include <color_pars_vertex>
+#include <fog_pars_vertex>
+#include <morphtarget_pars_vertex>
+#include <skinning_pars_vertex>
+#include <logdepthbuf_pars_vertex>
+#include <clipping_planes_pars_vertex>
+
+void main() {
+
+	#include <uv_vertex>
+	#include <uv2_vertex>
+	#include <color_vertex>
+
+	#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )
+
+		#include <beginnormal_vertex>
+		#include <morphnormal_vertex>
+		#include <skinbase_vertex>
+		#include <skinnormal_vertex>
+		#include <defaultnormal_vertex>
+
+	#endif
+
+	#include <begin_vertex>
+	#include <morphtarget_vertex>
+	#include <skinning_vertex>
+	#include <project_vertex>
+	#include <logdepthbuf_vertex>
+	#include <clipping_planes_vertex>
+
+	#include <worldpos_vertex>
+	#include <envmap_vertex>
+	#include <fog_vertex>
+
+}
+`;
+
+const meshbasic_glsl_fragment = /* glsl */`
+uniform vec3 diffuse;
+uniform float opacity;
+
+#ifndef FLAT_SHADED
+
+	varying vec3 vNormal;
+
+#endif
+
+#include <common>
+#include <dithering_pars_fragment>
+#include <color_pars_fragment>
+#include <uv_pars_fragment>
+#include <uv2_pars_fragment>
+#include <map_pars_fragment>
+#include <alphamap_pars_fragment>
+#include <alphatest_pars_fragment>
+#include <aomap_pars_fragment>
+#include <lightmap_pars_fragment>
+#include <envmap_common_pars_fragment>
+#include <envmap_pars_fragment>
+#include <cube_uv_reflection_fragment>
+#include <fog_pars_fragment>
+#include <specularmap_pars_fragment>
+#include <logdepthbuf_pars_fragment>
+#include <clipping_planes_pars_fragment>
+
+void main() {
+
+	#include <clipping_planes_fragment>
+
+	vec4 diffuseColor = vec4( diffuse, opacity );
+
+	#include <logdepthbuf_fragment>
+	#include <map_fragment>
+	#include <color_fragment>
+	#include <alphamap_fragment>
+	#include <alphatest_fragment>
+	#include <specularmap_fragment>
+
+	ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );
+
+	// accumulation (baked indirect lighting only)
+	#ifdef USE_LIGHTMAP
+
+		vec4 lightMapTexel= texture2D( lightMap, vUv2 );
+		reflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity;
+
+	#else
+
+		reflectedLight.indirectDiffuse += vec3( 1.0 );
+
+	#endif
+
+	// modulation
+	#include <aomap_fragment>
+
+	reflectedLight.indirectDiffuse *= diffuseColor.rgb;
+
+	vec3 outgoingLight = reflectedLight.indirectDiffuse;
+
+	#include <envmap_fragment>
+
+	#include <output_fragment>
+	#include <tonemapping_fragment>
+	#include <encodings_fragment>
+	#include <fog_fragment>
+	#include <premultiplied_alpha_fragment>
+	#include <dithering_fragment>
+
+}
+`;
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderLib/meshlambert.glsl.js
+const meshlambert_glsl_vertex = /* glsl */`
+#define LAMBERT
+
+varying vec3 vLightFront;
+varying vec3 vIndirectFront;
+
+#ifdef DOUBLE_SIDED
+	varying vec3 vLightBack;
+	varying vec3 vIndirectBack;
+#endif
+
+#include <common>
+#include <uv_pars_vertex>
+#include <uv2_pars_vertex>
+#include <envmap_pars_vertex>
+#include <bsdfs>
+#include <lights_pars_begin>
+#include <color_pars_vertex>
+#include <fog_pars_vertex>
+#include <morphtarget_pars_vertex>
+#include <skinning_pars_vertex>
+#include <shadowmap_pars_vertex>
+#include <logdepthbuf_pars_vertex>
+#include <clipping_planes_pars_vertex>
+
+void main() {
+
+	#include <uv_vertex>
+	#include <uv2_vertex>
+	#include <color_vertex>
+
+	#include <beginnormal_vertex>
+	#include <morphnormal_vertex>
+	#include <skinbase_vertex>
+	#include <skinnormal_vertex>
+	#include <defaultnormal_vertex>
+
+	#include <begin_vertex>
+	#include <morphtarget_vertex>
+	#include <skinning_vertex>
+	#include <project_vertex>
+	#include <logdepthbuf_vertex>
+	#include <clipping_planes_vertex>
+
+	#include <worldpos_vertex>
+	#include <envmap_vertex>
+	#include <lights_lambert_vertex>
+	#include <shadowmap_vertex>
+	#include <fog_vertex>
+}
+`;
+
+const meshlambert_glsl_fragment = /* glsl */`
+uniform vec3 diffuse;
+uniform vec3 emissive;
+uniform float opacity;
+
+varying vec3 vLightFront;
+varying vec3 vIndirectFront;
+
+#ifdef DOUBLE_SIDED
+	varying vec3 vLightBack;
+	varying vec3 vIndirectBack;
+#endif
+
+
+#include <common>
+#include <packing>
+#include <dithering_pars_fragment>
+#include <color_pars_fragment>
+#include <uv_pars_fragment>
+#include <uv2_pars_fragment>
+#include <map_pars_fragment>
+#include <alphamap_pars_fragment>
+#include <alphatest_pars_fragment>
+#include <aomap_pars_fragment>
+#include <lightmap_pars_fragment>
+#include <emissivemap_pars_fragment>
+#include <envmap_common_pars_fragment>
+#include <envmap_pars_fragment>
+#include <cube_uv_reflection_fragment>
+#include <bsdfs>
+#include <lights_pars_begin>
+#include <fog_pars_fragment>
+#include <shadowmap_pars_fragment>
+#include <shadowmask_pars_fragment>
+#include <specularmap_pars_fragment>
+#include <logdepthbuf_pars_fragment>
+#include <clipping_planes_pars_fragment>
+
+void main() {
+
+	#include <clipping_planes_fragment>
+
+	vec4 diffuseColor = vec4( diffuse, opacity );
+	ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );
+	vec3 totalEmissiveRadiance = emissive;
+
+	#include <logdepthbuf_fragment>
+	#include <map_fragment>
+	#include <color_fragment>
+	#include <alphamap_fragment>
+	#include <alphatest_fragment>
+	#include <specularmap_fragment>
+	#include <emissivemap_fragment>
+
+	// accumulation
+
+	#ifdef DOUBLE_SIDED
+
+		reflectedLight.indirectDiffuse += ( gl_FrontFacing ) ? vIndirectFront : vIndirectBack;
+
+	#else
+
+		reflectedLight.indirectDiffuse += vIndirectFront;
+
+	#endif
+
+	#include <lightmap_fragment>
+
+	reflectedLight.indirectDiffuse *= BRDF_Lambert( diffuseColor.rgb );
+
+	#ifdef DOUBLE_SIDED
+
+		reflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;
+
+	#else
+
+		reflectedLight.directDiffuse = vLightFront;
+
+	#endif
+
+	reflectedLight.directDiffuse *= BRDF_Lambert( diffuseColor.rgb ) * getShadowMask();
+
+	// modulation
+
+	#include <aomap_fragment>
+
+	vec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;
+
+	#include <envmap_fragment>
+
+	#include <output_fragment>
+	#include <tonemapping_fragment>
+	#include <encodings_fragment>
+	#include <fog_fragment>
+	#include <premultiplied_alpha_fragment>
+	#include <dithering_fragment>
+}
+`;
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderLib/meshmatcap.glsl.js
+const meshmatcap_glsl_vertex = /* glsl */`
+#define MATCAP
+
+varying vec3 vViewPosition;
+
+#include <common>
+#include <uv_pars_vertex>
+#include <color_pars_vertex>
+#include <displacementmap_pars_vertex>
+#include <fog_pars_vertex>
+#include <normal_pars_vertex>
+#include <morphtarget_pars_vertex>
+#include <skinning_pars_vertex>
+
+#include <logdepthbuf_pars_vertex>
+#include <clipping_planes_pars_vertex>
+
+void main() {
+
+	#include <uv_vertex>
+	#include <color_vertex>
+	#include <beginnormal_vertex>
+	#include <morphnormal_vertex>
+	#include <skinbase_vertex>
+	#include <skinnormal_vertex>
+	#include <defaultnormal_vertex>
+	#include <normal_vertex>
+
+	#include <begin_vertex>
+	#include <morphtarget_vertex>
+	#include <skinning_vertex>
+	#include <displacementmap_vertex>
+	#include <project_vertex>
+
+	#include <logdepthbuf_vertex>
+	#include <clipping_planes_vertex>
+	#include <fog_vertex>
+
+	vViewPosition = - mvPosition.xyz;
+
+}
+`;
+
+const meshmatcap_glsl_fragment = /* glsl */`
+#define MATCAP
+
+uniform vec3 diffuse;
+uniform float opacity;
+uniform sampler2D matcap;
+
+varying vec3 vViewPosition;
+
+#include <common>
+#include <dithering_pars_fragment>
+#include <color_pars_fragment>
+#include <uv_pars_fragment>
+#include <map_pars_fragment>
+#include <alphamap_pars_fragment>
+#include <alphatest_pars_fragment>
+#include <fog_pars_fragment>
+#include <normal_pars_fragment>
+#include <bumpmap_pars_fragment>
+#include <normalmap_pars_fragment>
+#include <logdepthbuf_pars_fragment>
+#include <clipping_planes_pars_fragment>
+
+void main() {
+
+	#include <clipping_planes_fragment>
+
+	vec4 diffuseColor = vec4( diffuse, opacity );
+
+	#include <logdepthbuf_fragment>
+	#include <map_fragment>
+	#include <color_fragment>
+	#include <alphamap_fragment>
+	#include <alphatest_fragment>
+	#include <normal_fragment_begin>
+	#include <normal_fragment_maps>
+
+	vec3 viewDir = normalize( vViewPosition );
+	vec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );
+	vec3 y = cross( viewDir, x );
+	vec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5; // 0.495 to remove artifacts caused by undersized matcap disks
+
+	#ifdef USE_MATCAP
+
+		vec4 matcapColor = texture2D( matcap, uv );
+
+	#else
+
+		vec4 matcapColor = vec4( vec3( mix( 0.2, 0.8, uv.y ) ), 1.0 ); // default if matcap is missing
+
+	#endif
+
+	vec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;
+
+	#include <output_fragment>
+	#include <tonemapping_fragment>
+	#include <encodings_fragment>
+	#include <fog_fragment>
+	#include <premultiplied_alpha_fragment>
+	#include <dithering_fragment>
+
+}
+`;
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderLib/meshnormal.glsl.js
+const meshnormal_glsl_vertex = /* glsl */`
+#define NORMAL
+
+#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )
+
+	varying vec3 vViewPosition;
+
+#endif
+
+#include <common>
+#include <uv_pars_vertex>
+#include <displacementmap_pars_vertex>
+#include <normal_pars_vertex>
+#include <morphtarget_pars_vertex>
+#include <skinning_pars_vertex>
+#include <logdepthbuf_pars_vertex>
+#include <clipping_planes_pars_vertex>
+
+void main() {
+
+	#include <uv_vertex>
+
+	#include <beginnormal_vertex>
+	#include <morphnormal_vertex>
+	#include <skinbase_vertex>
+	#include <skinnormal_vertex>
+	#include <defaultnormal_vertex>
+	#include <normal_vertex>
+
+	#include <begin_vertex>
+	#include <morphtarget_vertex>
+	#include <skinning_vertex>
+	#include <displacementmap_vertex>
+	#include <project_vertex>
+	#include <logdepthbuf_vertex>
+	#include <clipping_planes_vertex>
+
+#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )
+
+	vViewPosition = - mvPosition.xyz;
+
+#endif
+
+}
+`;
+
+const meshnormal_glsl_fragment = /* glsl */`
+#define NORMAL
+
+uniform float opacity;
+
+#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )
+
+	varying vec3 vViewPosition;
+
+#endif
+
+#include <packing>
+#include <uv_pars_fragment>
+#include <normal_pars_fragment>
+#include <bumpmap_pars_fragment>
+#include <normalmap_pars_fragment>
+#include <logdepthbuf_pars_fragment>
+#include <clipping_planes_pars_fragment>
+
+void main() {
+
+	#include <clipping_planes_fragment>
+	#include <logdepthbuf_fragment>
+	#include <normal_fragment_begin>
+	#include <normal_fragment_maps>
+
+	gl_FragColor = vec4( packNormalToRGB( normal ), opacity );
+
+	#ifdef OPAQUE
+
+		gl_FragColor.a = 1.0;
+
+	#endif
+
+}
+`;
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderLib/meshphong.glsl.js
+const meshphong_glsl_vertex = /* glsl */`
+#define PHONG
+
+varying vec3 vViewPosition;
+
+#include <common>
+#include <uv_pars_vertex>
+#include <uv2_pars_vertex>
+#include <displacementmap_pars_vertex>
+#include <envmap_pars_vertex>
+#include <color_pars_vertex>
+#include <fog_pars_vertex>
+#include <normal_pars_vertex>
+#include <morphtarget_pars_vertex>
+#include <skinning_pars_vertex>
+#include <shadowmap_pars_vertex>
+#include <logdepthbuf_pars_vertex>
+#include <clipping_planes_pars_vertex>
+
+void main() {
+
+	#include <uv_vertex>
+	#include <uv2_vertex>
+	#include <color_vertex>
+
+	#include <beginnormal_vertex>
+	#include <morphnormal_vertex>
+	#include <skinbase_vertex>
+	#include <skinnormal_vertex>
+	#include <defaultnormal_vertex>
+	#include <normal_vertex>
+
+	#include <begin_vertex>
+	#include <morphtarget_vertex>
+	#include <skinning_vertex>
+	#include <displacementmap_vertex>
+	#include <project_vertex>
+	#include <logdepthbuf_vertex>
+	#include <clipping_planes_vertex>
+
+	vViewPosition = - mvPosition.xyz;
+
+	#include <worldpos_vertex>
+	#include <envmap_vertex>
+	#include <shadowmap_vertex>
+	#include <fog_vertex>
+
+}
+`;
+
+const meshphong_glsl_fragment = /* glsl */`
+#define PHONG
+
+uniform vec3 diffuse;
+uniform vec3 emissive;
+uniform vec3 specular;
+uniform float shininess;
+uniform float opacity;
+
+#include <common>
+#include <packing>
+#include <dithering_pars_fragment>
+#include <color_pars_fragment>
+#include <uv_pars_fragment>
+#include <uv2_pars_fragment>
+#include <map_pars_fragment>
+#include <alphamap_pars_fragment>
+#include <alphatest_pars_fragment>
+#include <aomap_pars_fragment>
+#include <lightmap_pars_fragment>
+#include <emissivemap_pars_fragment>
+#include <envmap_common_pars_fragment>
+#include <envmap_pars_fragment>
+#include <cube_uv_reflection_fragment>
+#include <fog_pars_fragment>
+#include <bsdfs>
+#include <lights_pars_begin>
+#include <normal_pars_fragment>
+#include <lights_phong_pars_fragment>
+#include <shadowmap_pars_fragment>
+#include <bumpmap_pars_fragment>
+#include <normalmap_pars_fragment>
+#include <specularmap_pars_fragment>
+#include <logdepthbuf_pars_fragment>
+#include <clipping_planes_pars_fragment>
+
+void main() {
+
+	#include <clipping_planes_fragment>
+
+	vec4 diffuseColor = vec4( diffuse, opacity );
+	ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );
+	vec3 totalEmissiveRadiance = emissive;
+
+	#include <logdepthbuf_fragment>
+	#include <map_fragment>
+	#include <color_fragment>
+	#include <alphamap_fragment>
+	#include <alphatest_fragment>
+	#include <specularmap_fragment>
+	#include <normal_fragment_begin>
+	#include <normal_fragment_maps>
+	#include <emissivemap_fragment>
+
+	// accumulation
+	#include <lights_phong_fragment>
+	#include <lights_fragment_begin>
+	#include <lights_fragment_maps>
+	#include <lights_fragment_end>
+
+	// modulation
+	#include <aomap_fragment>
+
+	vec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;
+
+	#include <envmap_fragment>
+	#include <output_fragment>
+	#include <tonemapping_fragment>
+	#include <encodings_fragment>
+	#include <fog_fragment>
+	#include <premultiplied_alpha_fragment>
+	#include <dithering_fragment>
+
+}
+`;
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderLib/meshphysical.glsl.js
+const meshphysical_glsl_vertex = /* glsl */`
+#define STANDARD
+
+varying vec3 vViewPosition;
+
+#ifdef USE_TRANSMISSION
+
+	varying vec3 vWorldPosition;
+
+#endif
+
+#include <common>
+#include <uv_pars_vertex>
+#include <uv2_pars_vertex>
+#include <displacementmap_pars_vertex>
+#include <color_pars_vertex>
+#include <fog_pars_vertex>
+#include <normal_pars_vertex>
+#include <morphtarget_pars_vertex>
+#include <skinning_pars_vertex>
+#include <shadowmap_pars_vertex>
+#include <logdepthbuf_pars_vertex>
+#include <clipping_planes_pars_vertex>
+
+void main() {
+
+	#include <uv_vertex>
+	#include <uv2_vertex>
+	#include <color_vertex>
+
+	#include <beginnormal_vertex>
+	#include <morphnormal_vertex>
+	#include <skinbase_vertex>
+	#include <skinnormal_vertex>
+	#include <defaultnormal_vertex>
+	#include <normal_vertex>
+
+	#include <begin_vertex>
+	#include <morphtarget_vertex>
+	#include <skinning_vertex>
+	#include <displacementmap_vertex>
+	#include <project_vertex>
+	#include <logdepthbuf_vertex>
+	#include <clipping_planes_vertex>
+
+	vViewPosition = - mvPosition.xyz;
+
+	#include <worldpos_vertex>
+	#include <shadowmap_vertex>
+	#include <fog_vertex>
+
+#ifdef USE_TRANSMISSION
+
+	vWorldPosition = worldPosition.xyz;
+
+#endif
+}
+`;
+
+const meshphysical_glsl_fragment = /* glsl */`
+#define STANDARD
+
+#ifdef PHYSICAL
+	#define IOR
+	#define SPECULAR
+#endif
+
+uniform vec3 diffuse;
+uniform vec3 emissive;
+uniform float roughness;
+uniform float metalness;
+uniform float opacity;
+
+#ifdef IOR
+	uniform float ior;
+#endif
+
+#ifdef SPECULAR
+	uniform float specularIntensity;
+	uniform vec3 specularColor;
+
+	#ifdef USE_SPECULARINTENSITYMAP
+		uniform sampler2D specularIntensityMap;
+	#endif
+
+	#ifdef USE_SPECULARCOLORMAP
+		uniform sampler2D specularColorMap;
+	#endif
+#endif
+
+#ifdef USE_CLEARCOAT
+	uniform float clearcoat;
+	uniform float clearcoatRoughness;
+#endif
+
+#ifdef USE_SHEEN
+	uniform vec3 sheenColor;
+	uniform float sheenRoughness;
+
+	#ifdef USE_SHEENCOLORMAP
+		uniform sampler2D sheenColorMap;
+	#endif
+
+	#ifdef USE_SHEENROUGHNESSMAP
+		uniform sampler2D sheenRoughnessMap;
+	#endif
+#endif
+
+varying vec3 vViewPosition;
+
+#include <common>
+#include <packing>
+#include <dithering_pars_fragment>
+#include <color_pars_fragment>
+#include <uv_pars_fragment>
+#include <uv2_pars_fragment>
+#include <map_pars_fragment>
+#include <alphamap_pars_fragment>
+#include <alphatest_pars_fragment>
+#include <aomap_pars_fragment>
+#include <lightmap_pars_fragment>
+#include <emissivemap_pars_fragment>
+#include <bsdfs>
+#include <cube_uv_reflection_fragment>
+#include <envmap_common_pars_fragment>
+#include <envmap_physical_pars_fragment>
+#include <fog_pars_fragment>
+#include <lights_pars_begin>
+#include <normal_pars_fragment>
+#include <lights_physical_pars_fragment>
+#include <transmission_pars_fragment>
+#include <shadowmap_pars_fragment>
+#include <bumpmap_pars_fragment>
+#include <normalmap_pars_fragment>
+#include <clearcoat_pars_fragment>
+#include <roughnessmap_pars_fragment>
+#include <metalnessmap_pars_fragment>
+#include <logdepthbuf_pars_fragment>
+#include <clipping_planes_pars_fragment>
+
+void main() {
+
+	#include <clipping_planes_fragment>
+
+	vec4 diffuseColor = vec4( diffuse, opacity );
+	ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );
+	vec3 totalEmissiveRadiance = emissive;
+
+	#include <logdepthbuf_fragment>
+	#include <map_fragment>
+	#include <color_fragment>
+	#include <alphamap_fragment>
+	#include <alphatest_fragment>
+	#include <roughnessmap_fragment>
+	#include <metalnessmap_fragment>
+	#include <normal_fragment_begin>
+	#include <normal_fragment_maps>
+	#include <clearcoat_normal_fragment_begin>
+	#include <clearcoat_normal_fragment_maps>
+	#include <emissivemap_fragment>
+
+	// accumulation
+	#include <lights_physical_fragment>
+	#include <lights_fragment_begin>
+	#include <lights_fragment_maps>
+	#include <lights_fragment_end>
+
+	// modulation
+	#include <aomap_fragment>
+
+	vec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;
+	vec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;
+
+	#include <transmission_fragment>
+
+	vec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;
+
+	#ifdef USE_SHEEN
+
+		// Sheen energy compensation approximation calculation can be found at the end of
+		// https://drive.google.com/file/d/1T0D1VSyR4AllqIJTQAraEIzjlb5h4FKH/view?usp=sharing
+		float sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor );
+
+		outgoingLight = outgoingLight * sheenEnergyComp + sheenSpecular;
+
+	#endif
+
+	#ifdef USE_CLEARCOAT
+
+		float dotNVcc = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) );
+
+		vec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );
+
+		outgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + clearcoatSpecular * material.clearcoat;
+
+	#endif
+
+	#include <output_fragment>
+	#include <tonemapping_fragment>
+	#include <encodings_fragment>
+	#include <fog_fragment>
+	#include <premultiplied_alpha_fragment>
+	#include <dithering_fragment>
+
+}
+`;
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderLib/meshtoon.glsl.js
+const meshtoon_glsl_vertex = /* glsl */`
+#define TOON
+
+varying vec3 vViewPosition;
+
+#include <common>
+#include <uv_pars_vertex>
+#include <uv2_pars_vertex>
+#include <displacementmap_pars_vertex>
+#include <color_pars_vertex>
+#include <fog_pars_vertex>
+#include <normal_pars_vertex>
+#include <morphtarget_pars_vertex>
+#include <skinning_pars_vertex>
+#include <shadowmap_pars_vertex>
+#include <logdepthbuf_pars_vertex>
+#include <clipping_planes_pars_vertex>
+
+void main() {
+
+	#include <uv_vertex>
+	#include <uv2_vertex>
+	#include <color_vertex>
+
+	#include <beginnormal_vertex>
+	#include <morphnormal_vertex>
+	#include <skinbase_vertex>
+	#include <skinnormal_vertex>
+	#include <defaultnormal_vertex>
+	#include <normal_vertex>
+
+	#include <begin_vertex>
+	#include <morphtarget_vertex>
+	#include <skinning_vertex>
+	#include <displacementmap_vertex>
+	#include <project_vertex>
+	#include <logdepthbuf_vertex>
+	#include <clipping_planes_vertex>
+
+	vViewPosition = - mvPosition.xyz;
+
+	#include <worldpos_vertex>
+	#include <shadowmap_vertex>
+	#include <fog_vertex>
+
+}
+`;
+
+const meshtoon_glsl_fragment = /* glsl */`
+#define TOON
+
+uniform vec3 diffuse;
+uniform vec3 emissive;
+uniform float opacity;
+
+#include <common>
+#include <packing>
+#include <dithering_pars_fragment>
+#include <color_pars_fragment>
+#include <uv_pars_fragment>
+#include <uv2_pars_fragment>
+#include <map_pars_fragment>
+#include <alphamap_pars_fragment>
+#include <alphatest_pars_fragment>
+#include <aomap_pars_fragment>
+#include <lightmap_pars_fragment>
+#include <emissivemap_pars_fragment>
+#include <gradientmap_pars_fragment>
+#include <fog_pars_fragment>
+#include <bsdfs>
+#include <lights_pars_begin>
+#include <normal_pars_fragment>
+#include <lights_toon_pars_fragment>
+#include <shadowmap_pars_fragment>
+#include <bumpmap_pars_fragment>
+#include <normalmap_pars_fragment>
+#include <logdepthbuf_pars_fragment>
+#include <clipping_planes_pars_fragment>
+
+void main() {
+
+	#include <clipping_planes_fragment>
+
+	vec4 diffuseColor = vec4( diffuse, opacity );
+	ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );
+	vec3 totalEmissiveRadiance = emissive;
+
+	#include <logdepthbuf_fragment>
+	#include <map_fragment>
+	#include <color_fragment>
+	#include <alphamap_fragment>
+	#include <alphatest_fragment>
+	#include <normal_fragment_begin>
+	#include <normal_fragment_maps>
+	#include <emissivemap_fragment>
+
+	// accumulation
+	#include <lights_toon_fragment>
+	#include <lights_fragment_begin>
+	#include <lights_fragment_maps>
+	#include <lights_fragment_end>
+
+	// modulation
+	#include <aomap_fragment>
+
+	vec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;
+
+	#include <output_fragment>
+	#include <tonemapping_fragment>
+	#include <encodings_fragment>
+	#include <fog_fragment>
+	#include <premultiplied_alpha_fragment>
+	#include <dithering_fragment>
+
+}
+`;
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderLib/points.glsl.js
+const points_glsl_vertex = /* glsl */`
+uniform float size;
+uniform float scale;
+
+#include <common>
+#include <color_pars_vertex>
+#include <fog_pars_vertex>
+#include <morphtarget_pars_vertex>
+#include <logdepthbuf_pars_vertex>
+#include <clipping_planes_pars_vertex>
+
+void main() {
+
+	#include <color_vertex>
+	#include <begin_vertex>
+	#include <morphtarget_vertex>
+	#include <project_vertex>
+
+	gl_PointSize = size;
+
+	#ifdef USE_SIZEATTENUATION
+
+		bool isPerspective = isPerspectiveMatrix( projectionMatrix );
+
+		if ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );
+
+	#endif
+
+	#include <logdepthbuf_vertex>
+	#include <clipping_planes_vertex>
+	#include <worldpos_vertex>
+	#include <fog_vertex>
+
+}
+`;
+
+const points_glsl_fragment = /* glsl */`
+uniform vec3 diffuse;
+uniform float opacity;
+
+#include <common>
+#include <color_pars_fragment>
+#include <map_particle_pars_fragment>
+#include <alphatest_pars_fragment>
+#include <fog_pars_fragment>
+#include <logdepthbuf_pars_fragment>
+#include <clipping_planes_pars_fragment>
+
+void main() {
+
+	#include <clipping_planes_fragment>
+
+	vec3 outgoingLight = vec3( 0.0 );
+	vec4 diffuseColor = vec4( diffuse, opacity );
+
+	#include <logdepthbuf_fragment>
+	#include <map_particle_fragment>
+	#include <color_fragment>
+	#include <alphatest_fragment>
+
+	outgoingLight = diffuseColor.rgb;
+
+	#include <output_fragment>
+	#include <tonemapping_fragment>
+	#include <encodings_fragment>
+	#include <fog_fragment>
+	#include <premultiplied_alpha_fragment>
+
+}
+`;
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderLib/shadow.glsl.js
+const shadow_glsl_vertex = /* glsl */`
+#include <common>
+#include <fog_pars_vertex>
+#include <morphtarget_pars_vertex>
+#include <skinning_pars_vertex>
+#include <shadowmap_pars_vertex>
+
+void main() {
+
+	#include <beginnormal_vertex>
+	#include <morphnormal_vertex>
+	#include <skinbase_vertex>
+	#include <skinnormal_vertex>
+	#include <defaultnormal_vertex>
+
+	#include <begin_vertex>
+	#include <morphtarget_vertex>
+	#include <skinning_vertex>
+	#include <project_vertex>
+
+	#include <worldpos_vertex>
+	#include <shadowmap_vertex>
+	#include <fog_vertex>
+
+}
+`;
+
+const shadow_glsl_fragment = /* glsl */`
+uniform vec3 color;
+uniform float opacity;
+
+#include <common>
+#include <packing>
+#include <fog_pars_fragment>
+#include <bsdfs>
+#include <lights_pars_begin>
+#include <shadowmap_pars_fragment>
+#include <shadowmask_pars_fragment>
+
+void main() {
+
+	gl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );
+
+	#include <tonemapping_fragment>
+	#include <encodings_fragment>
+	#include <fog_fragment>
+
+}
+`;
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderLib/sprite.glsl.js
+const sprite_glsl_vertex = /* glsl */`
+uniform float rotation;
+uniform vec2 center;
+
+#include <common>
+#include <uv_pars_vertex>
+#include <fog_pars_vertex>
+#include <logdepthbuf_pars_vertex>
+#include <clipping_planes_pars_vertex>
+
+void main() {
+
+	#include <uv_vertex>
+
+	vec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );
+
+	vec2 scale;
+	scale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );
+	scale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );
+
+	#ifndef USE_SIZEATTENUATION
+
+		bool isPerspective = isPerspectiveMatrix( projectionMatrix );
+
+		if ( isPerspective ) scale *= - mvPosition.z;
+
+	#endif
+
+	vec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;
+
+	vec2 rotatedPosition;
+	rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;
+	rotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;
+
+	mvPosition.xy += rotatedPosition;
+
+	gl_Position = projectionMatrix * mvPosition;
+
+	#include <logdepthbuf_vertex>
+	#include <clipping_planes_vertex>
+	#include <fog_vertex>
+
+}
+`;
+
+const sprite_glsl_fragment = /* glsl */`
+uniform vec3 diffuse;
+uniform float opacity;
+
+#include <common>
+#include <uv_pars_fragment>
+#include <map_pars_fragment>
+#include <alphamap_pars_fragment>
+#include <alphatest_pars_fragment>
+#include <fog_pars_fragment>
+#include <logdepthbuf_pars_fragment>
+#include <clipping_planes_pars_fragment>
+
+void main() {
+
+	#include <clipping_planes_fragment>
+
+	vec3 outgoingLight = vec3( 0.0 );
+	vec4 diffuseColor = vec4( diffuse, opacity );
+
+	#include <logdepthbuf_fragment>
+	#include <map_fragment>
+	#include <alphamap_fragment>
+	#include <alphatest_fragment>
+
+	outgoingLight = diffuseColor.rgb;
+
+	#include <output_fragment>
+	#include <tonemapping_fragment>
+	#include <encodings_fragment>
+	#include <fog_fragment>
+
+}
+`;
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderChunk.js
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+const ShaderChunk = {
+	alphamap_fragment: alphamap_fragment_glsl,
+	alphamap_pars_fragment: alphamap_pars_fragment_glsl,
+	alphatest_fragment: alphatest_fragment_glsl,
+	alphatest_pars_fragment: alphatest_pars_fragment_glsl,
+	aomap_fragment: aomap_fragment_glsl,
+	aomap_pars_fragment: aomap_pars_fragment_glsl,
+	begin_vertex: begin_vertex_glsl,
+	beginnormal_vertex: beginnormal_vertex_glsl,
+	bsdfs: bsdfs_glsl,
+	bumpmap_pars_fragment: bumpmap_pars_fragment_glsl,
+	clipping_planes_fragment: clipping_planes_fragment_glsl,
+	clipping_planes_pars_fragment: clipping_planes_pars_fragment_glsl,
+	clipping_planes_pars_vertex: clipping_planes_pars_vertex_glsl,
+	clipping_planes_vertex: clipping_planes_vertex_glsl,
+	color_fragment: color_fragment_glsl,
+	color_pars_fragment: color_pars_fragment_glsl,
+	color_pars_vertex: color_pars_vertex_glsl,
+	color_vertex: color_vertex_glsl,
+	common: common_glsl,
+	cube_uv_reflection_fragment: cube_uv_reflection_fragment_glsl,
+	defaultnormal_vertex: defaultnormal_vertex_glsl,
+	displacementmap_pars_vertex: displacementmap_pars_vertex_glsl,
+	displacementmap_vertex: displacementmap_vertex_glsl,
+	emissivemap_fragment: emissivemap_fragment_glsl,
+	emissivemap_pars_fragment: emissivemap_pars_fragment_glsl,
+	encodings_fragment: encodings_fragment_glsl,
+	encodings_pars_fragment: encodings_pars_fragment_glsl,
+	envmap_fragment: envmap_fragment_glsl,
+	envmap_common_pars_fragment: envmap_common_pars_fragment_glsl,
+	envmap_pars_fragment: envmap_pars_fragment_glsl,
+	envmap_pars_vertex: envmap_pars_vertex_glsl,
+	envmap_physical_pars_fragment: envmap_physical_pars_fragment_glsl,
+	envmap_vertex: envmap_vertex_glsl,
+	fog_vertex: fog_vertex_glsl,
+	fog_pars_vertex: fog_pars_vertex_glsl,
+	fog_fragment: fog_fragment_glsl,
+	fog_pars_fragment: fog_pars_fragment_glsl,
+	gradientmap_pars_fragment: gradientmap_pars_fragment_glsl,
+	lightmap_fragment: lightmap_fragment_glsl,
+	lightmap_pars_fragment: lightmap_pars_fragment_glsl,
+	lights_lambert_vertex: lights_lambert_vertex_glsl,
+	lights_pars_begin: lights_pars_begin_glsl,
+	lights_toon_fragment: lights_toon_fragment_glsl,
+	lights_toon_pars_fragment: lights_toon_pars_fragment_glsl,
+	lights_phong_fragment: lights_phong_fragment_glsl,
+	lights_phong_pars_fragment: lights_phong_pars_fragment_glsl,
+	lights_physical_fragment: lights_physical_fragment_glsl,
+	lights_physical_pars_fragment: lights_physical_pars_fragment_glsl,
+	lights_fragment_begin: lights_fragment_begin_glsl,
+	lights_fragment_maps: lights_fragment_maps_glsl,
+	lights_fragment_end: lights_fragment_end_glsl,
+	logdepthbuf_fragment: logdepthbuf_fragment_glsl,
+	logdepthbuf_pars_fragment: logdepthbuf_pars_fragment_glsl,
+	logdepthbuf_pars_vertex: logdepthbuf_pars_vertex_glsl,
+	logdepthbuf_vertex: logdepthbuf_vertex_glsl,
+	map_fragment: map_fragment_glsl,
+	map_pars_fragment: map_pars_fragment_glsl,
+	map_particle_fragment: map_particle_fragment_glsl,
+	map_particle_pars_fragment: map_particle_pars_fragment_glsl,
+	metalnessmap_fragment: metalnessmap_fragment_glsl,
+	metalnessmap_pars_fragment: metalnessmap_pars_fragment_glsl,
+	morphnormal_vertex: morphnormal_vertex_glsl,
+	morphtarget_pars_vertex: morphtarget_pars_vertex_glsl,
+	morphtarget_vertex: morphtarget_vertex_glsl,
+	normal_fragment_begin: normal_fragment_begin_glsl,
+	normal_fragment_maps: normal_fragment_maps_glsl,
+	normal_pars_fragment: normal_pars_fragment_glsl,
+	normal_pars_vertex: normal_pars_vertex_glsl,
+	normal_vertex: normal_vertex_glsl,
+	normalmap_pars_fragment: normalmap_pars_fragment_glsl,
+	clearcoat_normal_fragment_begin: clearcoat_normal_fragment_begin_glsl,
+	clearcoat_normal_fragment_maps: clearcoat_normal_fragment_maps_glsl,
+	clearcoat_pars_fragment: clearcoat_pars_fragment_glsl,
+	output_fragment: output_fragment_glsl,
+	packing: packing_glsl,
+	premultiplied_alpha_fragment: premultiplied_alpha_fragment_glsl,
+	project_vertex: project_vertex_glsl,
+	dithering_fragment: dithering_fragment_glsl,
+	dithering_pars_fragment: dithering_pars_fragment_glsl,
+	roughnessmap_fragment: roughnessmap_fragment_glsl,
+	roughnessmap_pars_fragment: roughnessmap_pars_fragment_glsl,
+	shadowmap_pars_fragment: shadowmap_pars_fragment_glsl,
+	shadowmap_pars_vertex: shadowmap_pars_vertex_glsl,
+	shadowmap_vertex: shadowmap_vertex_glsl,
+	shadowmask_pars_fragment: shadowmask_pars_fragment_glsl,
+	skinbase_vertex: skinbase_vertex_glsl,
+	skinning_pars_vertex: skinning_pars_vertex_glsl,
+	skinning_vertex: skinning_vertex_glsl,
+	skinnormal_vertex: skinnormal_vertex_glsl,
+	specularmap_fragment: specularmap_fragment_glsl,
+	specularmap_pars_fragment: specularmap_pars_fragment_glsl,
+	tonemapping_fragment: tonemapping_fragment_glsl,
+	tonemapping_pars_fragment: tonemapping_pars_fragment_glsl,
+	transmission_fragment: transmission_fragment_glsl,
+	transmission_pars_fragment: transmission_pars_fragment_glsl,
+	uv_pars_fragment: uv_pars_fragment_glsl,
+	uv_pars_vertex: uv_pars_vertex_glsl,
+	uv_vertex: uv_vertex_glsl,
+	uv2_pars_fragment: uv2_pars_fragment_glsl,
+	uv2_pars_vertex: uv2_pars_vertex_glsl,
+	uv2_vertex: uv2_vertex_glsl,
+	worldpos_vertex: worldpos_vertex_glsl,
+
+	background_vert: vertex,
+	background_frag: fragment,
+	cube_vert: cube_glsl_vertex,
+	cube_frag: cube_glsl_fragment,
+	depth_vert: depth_glsl_vertex,
+	depth_frag: depth_glsl_fragment,
+	distanceRGBA_vert: distanceRGBA_glsl_vertex,
+	distanceRGBA_frag: distanceRGBA_glsl_fragment,
+	equirect_vert: equirect_glsl_vertex,
+	equirect_frag: equirect_glsl_fragment,
+	linedashed_vert: linedashed_glsl_vertex,
+	linedashed_frag: linedashed_glsl_fragment,
+	meshbasic_vert: meshbasic_glsl_vertex,
+	meshbasic_frag: meshbasic_glsl_fragment,
+	meshlambert_vert: meshlambert_glsl_vertex,
+	meshlambert_frag: meshlambert_glsl_fragment,
+	meshmatcap_vert: meshmatcap_glsl_vertex,
+	meshmatcap_frag: meshmatcap_glsl_fragment,
+	meshnormal_vert: meshnormal_glsl_vertex,
+	meshnormal_frag: meshnormal_glsl_fragment,
+	meshphong_vert: meshphong_glsl_vertex,
+	meshphong_frag: meshphong_glsl_fragment,
+	meshphysical_vert: meshphysical_glsl_vertex,
+	meshphysical_frag: meshphysical_glsl_fragment,
+	meshtoon_vert: meshtoon_glsl_vertex,
+	meshtoon_frag: meshtoon_glsl_fragment,
+	points_vert: points_glsl_vertex,
+	points_frag: points_glsl_fragment,
+	shadow_vert: shadow_glsl_vertex,
+	shadow_frag: shadow_glsl_fragment,
+	sprite_vert: sprite_glsl_vertex,
+	sprite_frag: sprite_glsl_fragment
+};
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/UniformsLib.js
+
+
+
+
+/**
+ * Uniforms library for shared webgl shaders
+ */
+
+const UniformsLib = {
+
+	common: {
+
+		diffuse: { value: new Color( 0xffffff ) },
+		opacity: { value: 1.0 },
+
+		map: { value: null },
+		uvTransform: { value: new Matrix3() },
+		uv2Transform: { value: new Matrix3() },
+
+		alphaMap: { value: null },
+		alphaTest: { value: 0 }
+
+	},
+
+	specularmap: {
+
+		specularMap: { value: null },
+
+	},
+
+	envmap: {
+
+		envMap: { value: null },
+		flipEnvMap: { value: - 1 },
+		reflectivity: { value: 1.0 }, // basic, lambert, phong
+		ior: { value: 1.5 }, // standard, physical
+		refractionRatio: { value: 0.98 }
+
+	},
+
+	aomap: {
+
+		aoMap: { value: null },
+		aoMapIntensity: { value: 1 }
+
+	},
+
+	lightmap: {
+
+		lightMap: { value: null },
+		lightMapIntensity: { value: 1 }
+
+	},
+
+	emissivemap: {
+
+		emissiveMap: { value: null }
+
+	},
+
+	bumpmap: {
+
+		bumpMap: { value: null },
+		bumpScale: { value: 1 }
+
+	},
+
+	normalmap: {
+
+		normalMap: { value: null },
+		normalScale: { value: new Vector2( 1, 1 ) }
+
+	},
+
+	displacementmap: {
+
+		displacementMap: { value: null },
+		displacementScale: { value: 1 },
+		displacementBias: { value: 0 }
+
+	},
+
+	roughnessmap: {
+
+		roughnessMap: { value: null }
+
+	},
+
+	metalnessmap: {
+
+		metalnessMap: { value: null }
+
+	},
+
+	gradientmap: {
+
+		gradientMap: { value: null }
+
+	},
+
+	fog: {
+
+		fogDensity: { value: 0.00025 },
+		fogNear: { value: 1 },
+		fogFar: { value: 2000 },
+		fogColor: { value: new Color( 0xffffff ) }
+
+	},
+
+	lights: {
+
+		ambientLightColor: { value: [] },
+
+		lightProbe: { value: [] },
+
+		directionalLights: { value: [], properties: {
+			direction: {},
+			color: {}
+		} },
+
+		directionalLightShadows: { value: [], properties: {
+			shadowBias: {},
+			shadowNormalBias: {},
+			shadowRadius: {},
+			shadowMapSize: {}
+		} },
+
+		directionalShadowMap: { value: [] },
+		directionalShadowMatrix: { value: [] },
+
+		spotLights: { value: [], properties: {
+			color: {},
+			position: {},
+			direction: {},
+			distance: {},
+			coneCos: {},
+			penumbraCos: {},
+			decay: {}
+		} },
+
+		spotLightShadows: { value: [], properties: {
+			shadowBias: {},
+			shadowNormalBias: {},
+			shadowRadius: {},
+			shadowMapSize: {}
+		} },
+
+		spotShadowMap: { value: [] },
+		spotShadowMatrix: { value: [] },
+
+		pointLights: { value: [], properties: {
+			color: {},
+			position: {},
+			decay: {},
+			distance: {}
+		} },
+
+		pointLightShadows: { value: [], properties: {
+			shadowBias: {},
+			shadowNormalBias: {},
+			shadowRadius: {},
+			shadowMapSize: {},
+			shadowCameraNear: {},
+			shadowCameraFar: {}
+		} },
+
+		pointShadowMap: { value: [] },
+		pointShadowMatrix: { value: [] },
+
+		hemisphereLights: { value: [], properties: {
+			direction: {},
+			skyColor: {},
+			groundColor: {}
+		} },
+
+		// TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src
+		rectAreaLights: { value: [], properties: {
+			color: {},
+			position: {},
+			width: {},
+			height: {}
+		} },
+
+		ltc_1: { value: null },
+		ltc_2: { value: null }
+
+	},
+
+	points: {
+
+		diffuse: { value: new Color( 0xffffff ) },
+		opacity: { value: 1.0 },
+		size: { value: 1.0 },
+		scale: { value: 1.0 },
+		map: { value: null },
+		alphaMap: { value: null },
+		alphaTest: { value: 0 },
+		uvTransform: { value: new Matrix3() }
+
+	},
+
+	sprite: {
+
+		diffuse: { value: new Color( 0xffffff ) },
+		opacity: { value: 1.0 },
+		center: { value: new Vector2( 0.5, 0.5 ) },
+		rotation: { value: 0.0 },
+		map: { value: null },
+		alphaMap: { value: null },
+		alphaTest: { value: 0 },
+		uvTransform: { value: new Matrix3() }
+
+	}
+
+};
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderLib.js
+
+
+
+
+
+
+
+
+const ShaderLib = {
+
+	basic: {
+
+		uniforms: mergeUniforms( [
+			UniformsLib.common,
+			UniformsLib.specularmap,
+			UniformsLib.envmap,
+			UniformsLib.aomap,
+			UniformsLib.lightmap,
+			UniformsLib.fog
+		] ),
+
+		vertexShader: ShaderChunk.meshbasic_vert,
+		fragmentShader: ShaderChunk.meshbasic_frag
+
+	},
+
+	lambert: {
+
+		uniforms: mergeUniforms( [
+			UniformsLib.common,
+			UniformsLib.specularmap,
+			UniformsLib.envmap,
+			UniformsLib.aomap,
+			UniformsLib.lightmap,
+			UniformsLib.emissivemap,
+			UniformsLib.fog,
+			UniformsLib.lights,
+			{
+				emissive: { value: new Color( 0x000000 ) }
+			}
+		] ),
+
+		vertexShader: ShaderChunk.meshlambert_vert,
+		fragmentShader: ShaderChunk.meshlambert_frag
+
+	},
+
+	phong: {
+
+		uniforms: mergeUniforms( [
+			UniformsLib.common,
+			UniformsLib.specularmap,
+			UniformsLib.envmap,
+			UniformsLib.aomap,
+			UniformsLib.lightmap,
+			UniformsLib.emissivemap,
+			UniformsLib.bumpmap,
+			UniformsLib.normalmap,
+			UniformsLib.displacementmap,
+			UniformsLib.fog,
+			UniformsLib.lights,
+			{
+				emissive: { value: new Color( 0x000000 ) },
+				specular: { value: new Color( 0x111111 ) },
+				shininess: { value: 30 }
+			}
+		] ),
+
+		vertexShader: ShaderChunk.meshphong_vert,
+		fragmentShader: ShaderChunk.meshphong_frag
+
+	},
+
+	standard: {
+
+		uniforms: mergeUniforms( [
+			UniformsLib.common,
+			UniformsLib.envmap,
+			UniformsLib.aomap,
+			UniformsLib.lightmap,
+			UniformsLib.emissivemap,
+			UniformsLib.bumpmap,
+			UniformsLib.normalmap,
+			UniformsLib.displacementmap,
+			UniformsLib.roughnessmap,
+			UniformsLib.metalnessmap,
+			UniformsLib.fog,
+			UniformsLib.lights,
+			{
+				emissive: { value: new Color( 0x000000 ) },
+				roughness: { value: 1.0 },
+				metalness: { value: 0.0 },
+				envMapIntensity: { value: 1 } // temporary
+			}
+		] ),
+
+		vertexShader: ShaderChunk.meshphysical_vert,
+		fragmentShader: ShaderChunk.meshphysical_frag
+
+	},
+
+	toon: {
+
+		uniforms: mergeUniforms( [
+			UniformsLib.common,
+			UniformsLib.aomap,
+			UniformsLib.lightmap,
+			UniformsLib.emissivemap,
+			UniformsLib.bumpmap,
+			UniformsLib.normalmap,
+			UniformsLib.displacementmap,
+			UniformsLib.gradientmap,
+			UniformsLib.fog,
+			UniformsLib.lights,
+			{
+				emissive: { value: new Color( 0x000000 ) }
+			}
+		] ),
+
+		vertexShader: ShaderChunk.meshtoon_vert,
+		fragmentShader: ShaderChunk.meshtoon_frag
+
+	},
+
+	matcap: {
+
+		uniforms: mergeUniforms( [
+			UniformsLib.common,
+			UniformsLib.bumpmap,
+			UniformsLib.normalmap,
+			UniformsLib.displacementmap,
+			UniformsLib.fog,
+			{
+				matcap: { value: null }
+			}
+		] ),
+
+		vertexShader: ShaderChunk.meshmatcap_vert,
+		fragmentShader: ShaderChunk.meshmatcap_frag
+
+	},
+
+	points: {
+
+		uniforms: mergeUniforms( [
+			UniformsLib.points,
+			UniformsLib.fog
+		] ),
+
+		vertexShader: ShaderChunk.points_vert,
+		fragmentShader: ShaderChunk.points_frag
+
+	},
+
+	dashed: {
+
+		uniforms: mergeUniforms( [
+			UniformsLib.common,
+			UniformsLib.fog,
+			{
+				scale: { value: 1 },
+				dashSize: { value: 1 },
+				totalSize: { value: 2 }
+			}
+		] ),
+
+		vertexShader: ShaderChunk.linedashed_vert,
+		fragmentShader: ShaderChunk.linedashed_frag
+
+	},
+
+	depth: {
+
+		uniforms: mergeUniforms( [
+			UniformsLib.common,
+			UniformsLib.displacementmap
+		] ),
+
+		vertexShader: ShaderChunk.depth_vert,
+		fragmentShader: ShaderChunk.depth_frag
+
+	},
+
+	normal: {
+
+		uniforms: mergeUniforms( [
+			UniformsLib.common,
+			UniformsLib.bumpmap,
+			UniformsLib.normalmap,
+			UniformsLib.displacementmap,
+			{
+				opacity: { value: 1.0 }
+			}
+		] ),
+
+		vertexShader: ShaderChunk.meshnormal_vert,
+		fragmentShader: ShaderChunk.meshnormal_frag
+
+	},
+
+	sprite: {
+
+		uniforms: mergeUniforms( [
+			UniformsLib.sprite,
+			UniformsLib.fog
+		] ),
+
+		vertexShader: ShaderChunk.sprite_vert,
+		fragmentShader: ShaderChunk.sprite_frag
+
+	},
+
+	background: {
+
+		uniforms: {
+			uvTransform: { value: new Matrix3() },
+			t2D: { value: null },
+		},
+
+		vertexShader: ShaderChunk.background_vert,
+		fragmentShader: ShaderChunk.background_frag
+
+	},
+	/* -------------------------------------------------------------------------
+	//	Cube map shader
+	 ------------------------------------------------------------------------- */
+
+	cube: {
+
+		uniforms: mergeUniforms( [
+			UniformsLib.envmap,
+			{
+				opacity: { value: 1.0 }
+			}
+		] ),
+
+		vertexShader: ShaderChunk.cube_vert,
+		fragmentShader: ShaderChunk.cube_frag
+
+	},
+
+	equirect: {
+
+		uniforms: {
+			tEquirect: { value: null },
+		},
+
+		vertexShader: ShaderChunk.equirect_vert,
+		fragmentShader: ShaderChunk.equirect_frag
+
+	},
+
+	distanceRGBA: {
+
+		uniforms: mergeUniforms( [
+			UniformsLib.common,
+			UniformsLib.displacementmap,
+			{
+				referencePosition: { value: new Vector3() },
+				nearDistance: { value: 1 },
+				farDistance: { value: 1000 }
+			}
+		] ),
+
+		vertexShader: ShaderChunk.distanceRGBA_vert,
+		fragmentShader: ShaderChunk.distanceRGBA_frag
+
+	},
+
+	shadow: {
+
+		uniforms: mergeUniforms( [
+			UniformsLib.lights,
+			UniformsLib.fog,
+			{
+				color: { value: new Color( 0x00000 ) },
+				opacity: { value: 1.0 }
+			},
+		] ),
+
+		vertexShader: ShaderChunk.shadow_vert,
+		fragmentShader: ShaderChunk.shadow_frag
+
+	}
+
+};
+
+ShaderLib.physical = {
+
+	uniforms: mergeUniforms( [
+		ShaderLib.standard.uniforms,
+		{
+			clearcoat: { value: 0 },
+			clearcoatMap: { value: null },
+			clearcoatRoughness: { value: 0 },
+			clearcoatRoughnessMap: { value: null },
+			clearcoatNormalScale: { value: new Vector2( 1, 1 ) },
+			clearcoatNormalMap: { value: null },
+			sheen: { value: 0 },
+			sheenColor: { value: new Color( 0x000000 ) },
+			sheenColorMap: { value: null },
+			sheenRoughness: { value: 1 },
+			sheenRoughnessMap: { value: null },
+			transmission: { value: 0 },
+			transmissionMap: { value: null },
+			transmissionSamplerSize: { value: new Vector2() },
+			transmissionSamplerMap: { value: null },
+			thickness: { value: 0 },
+			thicknessMap: { value: null },
+			attenuationDistance: { value: 0 },
+			attenuationColor: { value: new Color( 0x000000 ) },
+			specularIntensity: { value: 1 },
+			specularIntensityMap: { value: null },
+			specularColor: { value: new Color( 1, 1, 1 ) },
+			specularColorMap: { value: null },
+		}
+	] ),
+
+	vertexShader: ShaderChunk.meshphysical_vert,
+	fragmentShader: ShaderChunk.meshphysical_frag
+
+};
+
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/webgl/WebGLBackground.js
+
+
+
+
+
+
+
+
+
+function WebGLBackground( renderer, cubemaps, state, objects, alpha, premultipliedAlpha ) {
+
+	const clearColor = new Color( 0x000000 );
+	let clearAlpha = alpha === true ? 0 : 1;
+
+	let planeMesh;
+	let boxMesh;
+
+	let currentBackground = null;
+	let currentBackgroundVersion = 0;
+	let currentTonemapping = null;
+
+	function render( renderList, scene ) {
+
+		let forceClear = false;
+		let background = scene.isScene === true ? scene.background : null;
+
+		if ( background && background.isTexture ) {
+
+			background = cubemaps.get( background );
+
+		}
+
+		// Ignore background in AR
+		// TODO: Reconsider this.
+
+		const xr = renderer.xr;
+		const session = xr.getSession && xr.getSession();
+
+		if ( session && session.environmentBlendMode === 'additive' ) {
+
+			background = null;
+
+		}
+
+		if ( background === null ) {
+
+			setClear( clearColor, clearAlpha );
+
+		} else if ( background && background.isColor ) {
+
+			setClear( background, 1 );
+			forceClear = true;
+
+		}
+
+		if ( renderer.autoClear || forceClear ) {
+
+			renderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );
+
+		}
+
+		if ( background && ( background.isCubeTexture || background.mapping === CubeUVReflectionMapping ) ) {
+
+			if ( boxMesh === undefined ) {
+
+				boxMesh = new Mesh(
+					new BoxGeometry( 1, 1, 1 ),
+					new ShaderMaterial( {
+						name: 'BackgroundCubeMaterial',
+						uniforms: cloneUniforms( ShaderLib.cube.uniforms ),
+						vertexShader: ShaderLib.cube.vertexShader,
+						fragmentShader: ShaderLib.cube.fragmentShader,
+						side: BackSide,
+						depthTest: false,
+						depthWrite: false,
+						fog: false
+					} )
+				);
+
+				boxMesh.geometry.deleteAttribute( 'normal' );
+				boxMesh.geometry.deleteAttribute( 'uv' );
+
+				boxMesh.onBeforeRender = function ( renderer, scene, camera ) {
+
+					this.matrixWorld.copyPosition( camera.matrixWorld );
+
+				};
+
+				// enable code injection for non-built-in material
+				Object.defineProperty( boxMesh.material, 'envMap', {
+
+					get: function () {
+
+						return this.uniforms.envMap.value;
+
+					}
+
+				} );
+
+				objects.update( boxMesh );
+
+			}
+
+			boxMesh.material.uniforms.envMap.value = background;
+			boxMesh.material.uniforms.flipEnvMap.value = ( background.isCubeTexture && background.isRenderTargetTexture === false ) ? - 1 : 1;
+
+			if ( currentBackground !== background ||
+				currentBackgroundVersion !== background.version ||
+				currentTonemapping !== renderer.toneMapping ) {
+
+				boxMesh.material.needsUpdate = true;
+
+				currentBackground = background;
+				currentBackgroundVersion = background.version;
+				currentTonemapping = renderer.toneMapping;
+
+			}
+
+			// push to the pre-sorted opaque render list
+			renderList.unshift( boxMesh, boxMesh.geometry, boxMesh.material, 0, 0, null );
+
+		} else if ( background && background.isTexture ) {
+
+			if ( planeMesh === undefined ) {
+
+				planeMesh = new Mesh(
+					new PlaneGeometry( 2, 2 ),
+					new ShaderMaterial( {
+						name: 'BackgroundMaterial',
+						uniforms: cloneUniforms( ShaderLib.background.uniforms ),
+						vertexShader: ShaderLib.background.vertexShader,
+						fragmentShader: ShaderLib.background.fragmentShader,
+						side: FrontSide,
+						depthTest: false,
+						depthWrite: false,
+						fog: false
+					} )
+				);
+
+				planeMesh.geometry.deleteAttribute( 'normal' );
+
+				// enable code injection for non-built-in material
+				Object.defineProperty( planeMesh.material, 'map', {
+
+					get: function () {
+
+						return this.uniforms.t2D.value;
+
+					}
+
+				} );
+
+				objects.update( planeMesh );
+
+			}
+
+			planeMesh.material.uniforms.t2D.value = background;
+
+			if ( background.matrixAutoUpdate === true ) {
+
+				background.updateMatrix();
+
+			}
+
+			planeMesh.material.uniforms.uvTransform.value.copy( background.matrix );
+
+			if ( currentBackground !== background ||
+				currentBackgroundVersion !== background.version ||
+				currentTonemapping !== renderer.toneMapping ) {
+
+				planeMesh.material.needsUpdate = true;
+
+				currentBackground = background;
+				currentBackgroundVersion = background.version;
+				currentTonemapping = renderer.toneMapping;
+
+			}
+
+
+			// push to the pre-sorted opaque render list
+			renderList.unshift( planeMesh, planeMesh.geometry, planeMesh.material, 0, 0, null );
+
+		}
+
+	}
+
+	function setClear( color, alpha ) {
+
+		state.buffers.color.setClear( color.r, color.g, color.b, alpha, premultipliedAlpha );
+
+	}
+
+	return {
+
+		getClearColor: function () {
+
+			return clearColor;
+
+		},
+		setClearColor: function ( color, alpha = 1 ) {
+
+			clearColor.set( color );
+			clearAlpha = alpha;
+			setClear( clearColor, clearAlpha );
+
+		},
+		getClearAlpha: function () {
+
+			return clearAlpha;
+
+		},
+		setClearAlpha: function ( alpha ) {
+
+			clearAlpha = alpha;
+			setClear( clearColor, clearAlpha );
+
+		},
+		render: render
+
+	};
+
+}
+
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/webgl/WebGLBindingStates.js
+function WebGLBindingStates( gl, extensions, attributes, capabilities ) {
+
+	const maxVertexAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );
+
+	const extension = capabilities.isWebGL2 ? null : extensions.get( 'OES_vertex_array_object' );
+	const vaoAvailable = capabilities.isWebGL2 || extension !== null;
+
+	const bindingStates = {};
+
+	const defaultState = createBindingState( null );
+	let currentState = defaultState;
+
+	function setup( object, material, program, geometry, index ) {
+
+		let updateBuffers = false;
+
+		if ( vaoAvailable ) {
+
+			const state = getBindingState( geometry, program, material );
+
+			if ( currentState !== state ) {
+
+				currentState = state;
+				bindVertexArrayObject( currentState.object );
+
+			}
+
+			updateBuffers = needsUpdate( geometry, index );
+
+			if ( updateBuffers ) saveCache( geometry, index );
+
+		} else {
+
+			const wireframe = ( material.wireframe === true );
+
+			if ( currentState.geometry !== geometry.id ||
+				currentState.program !== program.id ||
+				currentState.wireframe !== wireframe ) {
+
+				currentState.geometry = geometry.id;
+				currentState.program = program.id;
+				currentState.wireframe = wireframe;
+
+				updateBuffers = true;
+
+			}
+
+		}
+
+		if ( object.isInstancedMesh === true ) {
+
+			updateBuffers = true;
+
+		}
+
+		if ( index !== null ) {
+
+			attributes.update( index, gl.ELEMENT_ARRAY_BUFFER );
+
+		}
+
+		if ( updateBuffers ) {
+
+			setupVertexAttributes( object, material, program, geometry );
+
+			if ( index !== null ) {
+
+				gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, attributes.get( index ).buffer );
+
+			}
+
+		}
+
+	}
+
+	function createVertexArrayObject() {
+
+		if ( capabilities.isWebGL2 ) return gl.createVertexArray();
+
+		return extension.createVertexArrayOES();
+
+	}
+
+	function bindVertexArrayObject( vao ) {
+
+		if ( capabilities.isWebGL2 ) return gl.bindVertexArray( vao );
+
+		return extension.bindVertexArrayOES( vao );
+
+	}
+
+	function deleteVertexArrayObject( vao ) {
+
+		if ( capabilities.isWebGL2 ) return gl.deleteVertexArray( vao );
+
+		return extension.deleteVertexArrayOES( vao );
+
+	}
+
+	function getBindingState( geometry, program, material ) {
+
+		const wireframe = ( material.wireframe === true );
+
+		let programMap = bindingStates[ geometry.id ];
+
+		if ( programMap === undefined ) {
+
+			programMap = {};
+			bindingStates[ geometry.id ] = programMap;
+
+		}
+
+		let stateMap = programMap[ program.id ];
+
+		if ( stateMap === undefined ) {
+
+			stateMap = {};
+			programMap[ program.id ] = stateMap;
+
+		}
+
+		let state = stateMap[ wireframe ];
+
+		if ( state === undefined ) {
+
+			state = createBindingState( createVertexArrayObject() );
+			stateMap[ wireframe ] = state;
+
+		}
+
+		return state;
+
+	}
+
+	function createBindingState( vao ) {
+
+		const newAttributes = [];
+		const enabledAttributes = [];
+		const attributeDivisors = [];
+
+		for ( let i = 0; i < maxVertexAttributes; i ++ ) {
+
+			newAttributes[ i ] = 0;
+			enabledAttributes[ i ] = 0;
+			attributeDivisors[ i ] = 0;
+
+		}
+
+		return {
+
+			// for backward compatibility on non-VAO support browser
+			geometry: null,
+			program: null,
+			wireframe: false,
+
+			newAttributes: newAttributes,
+			enabledAttributes: enabledAttributes,
+			attributeDivisors: attributeDivisors,
+			object: vao,
+			attributes: {},
+			index: null
+
+		};
+
+	}
+
+	function needsUpdate( geometry, index ) {
+
+		const cachedAttributes = currentState.attributes;
+		const geometryAttributes = geometry.attributes;
+
+		let attributesNum = 0;
+
+		for ( const key in geometryAttributes ) {
+
+			const cachedAttribute = cachedAttributes[ key ];
+			const geometryAttribute = geometryAttributes[ key ];
+
+			if ( cachedAttribute === undefined ) return true;
+
+			if ( cachedAttribute.attribute !== geometryAttribute ) return true;
+
+			if ( cachedAttribute.data !== geometryAttribute.data ) return true;
+
+			attributesNum ++;
+
+		}
+
+		if ( currentState.attributesNum !== attributesNum ) return true;
+
+		if ( currentState.index !== index ) return true;
+
+		return false;
+
+	}
+
+	function saveCache( geometry, index ) {
+
+		const cache = {};
+		const attributes = geometry.attributes;
+		let attributesNum = 0;
+
+		for ( const key in attributes ) {
+
+			const attribute = attributes[ key ];
+
+			const data = {};
+			data.attribute = attribute;
+
+			if ( attribute.data ) {
+
+				data.data = attribute.data;
+
+			}
+
+			cache[ key ] = data;
+
+			attributesNum ++;
+
+		}
+
+		currentState.attributes = cache;
+		currentState.attributesNum = attributesNum;
+
+		currentState.index = index;
+
+	}
+
+	function initAttributes() {
+
+		const newAttributes = currentState.newAttributes;
+
+		for ( let i = 0, il = newAttributes.length; i < il; i ++ ) {
+
+			newAttributes[ i ] = 0;
+
+		}
+
+	}
+
+	function enableAttribute( attribute ) {
+
+		enableAttributeAndDivisor( attribute, 0 );
+
+	}
+
+	function enableAttributeAndDivisor( attribute, meshPerAttribute ) {
+
+		const newAttributes = currentState.newAttributes;
+		const enabledAttributes = currentState.enabledAttributes;
+		const attributeDivisors = currentState.attributeDivisors;
+
+		newAttributes[ attribute ] = 1;
+
+		if ( enabledAttributes[ attribute ] === 0 ) {
+
+			gl.enableVertexAttribArray( attribute );
+			enabledAttributes[ attribute ] = 1;
+
+		}
+
+		if ( attributeDivisors[ attribute ] !== meshPerAttribute ) {
+
+			const extension = capabilities.isWebGL2 ? gl : extensions.get( 'ANGLE_instanced_arrays' );
+
+			extension[ capabilities.isWebGL2 ? 'vertexAttribDivisor' : 'vertexAttribDivisorANGLE' ]( attribute, meshPerAttribute );
+			attributeDivisors[ attribute ] = meshPerAttribute;
+
+		}
+
+	}
+
+	function disableUnusedAttributes() {
+
+		const newAttributes = currentState.newAttributes;
+		const enabledAttributes = currentState.enabledAttributes;
+
+		for ( let i = 0, il = enabledAttributes.length; i < il; i ++ ) {
+
+			if ( enabledAttributes[ i ] !== newAttributes[ i ] ) {
+
+				gl.disableVertexAttribArray( i );
+				enabledAttributes[ i ] = 0;
+
+			}
+
+		}
+
+	}
+
+	function vertexAttribPointer( index, size, type, normalized, stride, offset ) {
+
+		if ( capabilities.isWebGL2 === true && ( type === gl.INT || type === gl.UNSIGNED_INT ) ) {
+
+			gl.vertexAttribIPointer( index, size, type, stride, offset );
+
+		} else {
+
+			gl.vertexAttribPointer( index, size, type, normalized, stride, offset );
+
+		}
+
+	}
+
+	function setupVertexAttributes( object, material, program, geometry ) {
+
+		if ( capabilities.isWebGL2 === false && ( object.isInstancedMesh || geometry.isInstancedBufferGeometry ) ) {
+
+			if ( extensions.get( 'ANGLE_instanced_arrays' ) === null ) return;
+
+		}
+
+		initAttributes();
+
+		const geometryAttributes = geometry.attributes;
+
+		const programAttributes = program.getAttributes();
+
+		const materialDefaultAttributeValues = material.defaultAttributeValues;
+
+		for ( const name in programAttributes ) {
+
+			const programAttribute = programAttributes[ name ];
+
+			if ( programAttribute.location >= 0 ) {
+
+				let geometryAttribute = geometryAttributes[ name ];
+
+				if ( geometryAttribute === undefined ) {
+
+					if ( name === 'instanceMatrix' && object.instanceMatrix ) geometryAttribute = object.instanceMatrix;
+					if ( name === 'instanceColor' && object.instanceColor ) geometryAttribute = object.instanceColor;
+
+				}
+
+				if ( geometryAttribute !== undefined ) {
+
+					const normalized = geometryAttribute.normalized;
+					const size = geometryAttribute.itemSize;
+
+					const attribute = attributes.get( geometryAttribute );
+
+					// TODO Attribute may not be available on context restore
+
+					if ( attribute === undefined ) continue;
+
+					const buffer = attribute.buffer;
+					const type = attribute.type;
+					const bytesPerElement = attribute.bytesPerElement;
+
+					if ( geometryAttribute.isInterleavedBufferAttribute ) {
+
+						const data = geometryAttribute.data;
+						const stride = data.stride;
+						const offset = geometryAttribute.offset;
+
+						if ( data && data.isInstancedInterleavedBuffer ) {
+
+							for ( let i = 0; i < programAttribute.locationSize; i ++ ) {
+
+								enableAttributeAndDivisor( programAttribute.location + i, data.meshPerAttribute );
+
+							}
+
+							if ( object.isInstancedMesh !== true && geometry._maxInstanceCount === undefined ) {
+
+								geometry._maxInstanceCount = data.meshPerAttribute * data.count;
+
+							}
+
+						} else {
+
+							for ( let i = 0; i < programAttribute.locationSize; i ++ ) {
+
+								enableAttribute( programAttribute.location + i );
+
+							}
+
+						}
+
+						gl.bindBuffer( gl.ARRAY_BUFFER, buffer );
+
+						for ( let i = 0; i < programAttribute.locationSize; i ++ ) {
+
+							vertexAttribPointer(
+								programAttribute.location + i,
+								size / programAttribute.locationSize,
+								type,
+								normalized,
+								stride * bytesPerElement,
+								( offset + ( size / programAttribute.locationSize ) * i ) * bytesPerElement
+							);
+
+						}
+
+					} else {
+
+						if ( geometryAttribute.isInstancedBufferAttribute ) {
+
+							for ( let i = 0; i < programAttribute.locationSize; i ++ ) {
+
+								enableAttributeAndDivisor( programAttribute.location + i, geometryAttribute.meshPerAttribute );
+
+							}
+
+							if ( object.isInstancedMesh !== true && geometry._maxInstanceCount === undefined ) {
+
+								geometry._maxInstanceCount = geometryAttribute.meshPerAttribute * geometryAttribute.count;
+
+							}
+
+						} else {
+
+							for ( let i = 0; i < programAttribute.locationSize; i ++ ) {
+
+								enableAttribute( programAttribute.location + i );
+
+							}
+
+						}
+
+						gl.bindBuffer( gl.ARRAY_BUFFER, buffer );
+
+						for ( let i = 0; i < programAttribute.locationSize; i ++ ) {
+
+							vertexAttribPointer(
+								programAttribute.location + i,
+								size / programAttribute.locationSize,
+								type,
+								normalized,
+								size * bytesPerElement,
+								( size / programAttribute.locationSize ) * i * bytesPerElement
+							);
+
+						}
+
+					}
+
+				} else if ( materialDefaultAttributeValues !== undefined ) {
+
+					const value = materialDefaultAttributeValues[ name ];
+
+					if ( value !== undefined ) {
+
+						switch ( value.length ) {
+
+							case 2:
+								gl.vertexAttrib2fv( programAttribute.location, value );
+								break;
+
+							case 3:
+								gl.vertexAttrib3fv( programAttribute.location, value );
+								break;
+
+							case 4:
+								gl.vertexAttrib4fv( programAttribute.location, value );
+								break;
+
+							default:
+								gl.vertexAttrib1fv( programAttribute.location, value );
+
+						}
+
+					}
+
+				}
+
+			}
+
+		}
+
+		disableUnusedAttributes();
+
+	}
+
+	function dispose() {
+
+		reset();
+
+		for ( const geometryId in bindingStates ) {
+
+			const programMap = bindingStates[ geometryId ];
+
+			for ( const programId in programMap ) {
+
+				const stateMap = programMap[ programId ];
+
+				for ( const wireframe in stateMap ) {
+
+					deleteVertexArrayObject( stateMap[ wireframe ].object );
+
+					delete stateMap[ wireframe ];
+
+				}
+
+				delete programMap[ programId ];
+
+			}
+
+			delete bindingStates[ geometryId ];
+
+		}
+
+	}
+
+	function releaseStatesOfGeometry( geometry ) {
+
+		if ( bindingStates[ geometry.id ] === undefined ) return;
+
+		const programMap = bindingStates[ geometry.id ];
+
+		for ( const programId in programMap ) {
+
+			const stateMap = programMap[ programId ];
+
+			for ( const wireframe in stateMap ) {
+
+				deleteVertexArrayObject( stateMap[ wireframe ].object );
+
+				delete stateMap[ wireframe ];
+
+			}
+
+			delete programMap[ programId ];
+
+		}
+
+		delete bindingStates[ geometry.id ];
+
+	}
+
+	function releaseStatesOfProgram( program ) {
+
+		for ( const geometryId in bindingStates ) {
+
+			const programMap = bindingStates[ geometryId ];
+
+			if ( programMap[ program.id ] === undefined ) continue;
+
+			const stateMap = programMap[ program.id ];
+
+			for ( const wireframe in stateMap ) {
+
+				deleteVertexArrayObject( stateMap[ wireframe ].object );
+
+				delete stateMap[ wireframe ];
+
+			}
+
+			delete programMap[ program.id ];
+
+		}
+
+	}
+
+	function reset() {
+
+		resetDefaultState();
+
+		if ( currentState === defaultState ) return;
+
+		currentState = defaultState;
+		bindVertexArrayObject( currentState.object );
+
+	}
+
+	// for backward-compatilibity
+
+	function resetDefaultState() {
+
+		defaultState.geometry = null;
+		defaultState.program = null;
+		defaultState.wireframe = false;
+
+	}
+
+	return {
+
+		setup: setup,
+		reset: reset,
+		resetDefaultState: resetDefaultState,
+		dispose: dispose,
+		releaseStatesOfGeometry: releaseStatesOfGeometry,
+		releaseStatesOfProgram: releaseStatesOfProgram,
+
+		initAttributes: initAttributes,
+		enableAttribute: enableAttribute,
+		disableUnusedAttributes: disableUnusedAttributes
+
+	};
+
+}
+
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/webgl/WebGLBufferRenderer.js
+function WebGLBufferRenderer( gl, extensions, info, capabilities ) {
+
+	const isWebGL2 = capabilities.isWebGL2;
+
+	let mode;
+
+	function setMode( value ) {
+
+		mode = value;
+
+	}
+
+	function render( start, count ) {
+
+		gl.drawArrays( mode, start, count );
+
+		info.update( count, mode, 1 );
+
+	}
+
+	function renderInstances( start, count, primcount ) {
+
+		if ( primcount === 0 ) return;
+
+		let extension, methodName;
+
+		if ( isWebGL2 ) {
+
+			extension = gl;
+			methodName = 'drawArraysInstanced';
+
+		} else {
+
+			extension = extensions.get( 'ANGLE_instanced_arrays' );
+			methodName = 'drawArraysInstancedANGLE';
+
+			if ( extension === null ) {
+
+				console.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );
+				return;
+
+			}
+
+		}
+
+		extension[ methodName ]( mode, start, count, primcount );
+
+		info.update( count, mode, primcount );
+
+	}
+
+	//
+
+	this.setMode = setMode;
+	this.render = render;
+	this.renderInstances = renderInstances;
+
+}
+
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/webgl/WebGLCapabilities.js
+function WebGLCapabilities( gl, extensions, parameters ) {
+
+	let maxAnisotropy;
+
+	function getMaxAnisotropy() {
+
+		if ( maxAnisotropy !== undefined ) return maxAnisotropy;
+
+		if ( extensions.has( 'EXT_texture_filter_anisotropic' ) === true ) {
+
+			const extension = extensions.get( 'EXT_texture_filter_anisotropic' );
+
+			maxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT );
+
+		} else {
+
+			maxAnisotropy = 0;
+
+		}
+
+		return maxAnisotropy;
+
+	}
+
+	function getMaxPrecision( precision ) {
+
+		if ( precision === 'highp' ) {
+
+			if ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.HIGH_FLOAT ).precision > 0 &&
+				gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision > 0 ) {
+
+				return 'highp';
+
+			}
+
+			precision = 'mediump';
+
+		}
+
+		if ( precision === 'mediump' ) {
+
+			if ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.MEDIUM_FLOAT ).precision > 0 &&
+				gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision > 0 ) {
+
+				return 'mediump';
+
+			}
+
+		}
+
+		return 'lowp';
+
+	}
+
+	const isWebGL2 = ( typeof WebGL2RenderingContext !== 'undefined' && gl instanceof WebGL2RenderingContext ) ||
+		( typeof WebGL2ComputeRenderingContext !== 'undefined' && gl instanceof WebGL2ComputeRenderingContext );
+
+	let precision = parameters.precision !== undefined ? parameters.precision : 'highp';
+	const maxPrecision = getMaxPrecision( precision );
+
+	if ( maxPrecision !== precision ) {
+
+		console.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' );
+		precision = maxPrecision;
+
+	}
+
+	const drawBuffers = isWebGL2 || extensions.has( 'WEBGL_draw_buffers' );
+
+	const logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true;
+
+	const maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );
+	const maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );
+	const maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE );
+	const maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE );
+
+	const maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );
+	const maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS );
+	const maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS );
+	const maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS );
+
+	const vertexTextures = maxVertexTextures > 0;
+	const floatFragmentTextures = isWebGL2 || extensions.has( 'OES_texture_float' );
+	const floatVertexTextures = vertexTextures && floatFragmentTextures;
+
+	const maxSamples = isWebGL2 ? gl.getParameter( gl.MAX_SAMPLES ) : 0;
+
+	return {
+
+		isWebGL2: isWebGL2,
+
+		drawBuffers: drawBuffers,
+
+		getMaxAnisotropy: getMaxAnisotropy,
+		getMaxPrecision: getMaxPrecision,
+
+		precision: precision,
+		logarithmicDepthBuffer: logarithmicDepthBuffer,
+
+		maxTextures: maxTextures,
+		maxVertexTextures: maxVertexTextures,
+		maxTextureSize: maxTextureSize,
+		maxCubemapSize: maxCubemapSize,
+
+		maxAttributes: maxAttributes,
+		maxVertexUniforms: maxVertexUniforms,
+		maxVaryings: maxVaryings,
+		maxFragmentUniforms: maxFragmentUniforms,
+
+		vertexTextures: vertexTextures,
+		floatFragmentTextures: floatFragmentTextures,
+		floatVertexTextures: floatVertexTextures,
+
+		maxSamples: maxSamples
+
+	};
+
+}
+
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/webgl/WebGLClipping.js
+
+
+
+function WebGLClipping( properties ) {
+
+	const scope = this;
+
+	let globalState = null,
+		numGlobalPlanes = 0,
+		localClippingEnabled = false,
+		renderingShadows = false;
+
+	const plane = new Plane(),
+		viewNormalMatrix = new Matrix3(),
+
+		uniform = { value: null, needsUpdate: false };
+
+	this.uniform = uniform;
+	this.numPlanes = 0;
+	this.numIntersection = 0;
+
+	this.init = function ( planes, enableLocalClipping, camera ) {
+
+		const enabled =
+			planes.length !== 0 ||
+			enableLocalClipping ||
+			// enable state of previous frame - the clipping code has to
+			// run another frame in order to reset the state:
+			numGlobalPlanes !== 0 ||
+			localClippingEnabled;
+
+		localClippingEnabled = enableLocalClipping;
+
+		globalState = projectPlanes( planes, camera, 0 );
+		numGlobalPlanes = planes.length;
+
+		return enabled;
+
+	};
+
+	this.beginShadows = function () {
+
+		renderingShadows = true;
+		projectPlanes( null );
+
+	};
+
+	this.endShadows = function () {
+
+		renderingShadows = false;
+		resetGlobalState();
+
+	};
+
+	this.setState = function ( material, camera, useCache ) {
+
+		const planes = material.clippingPlanes,
+			clipIntersection = material.clipIntersection,
+			clipShadows = material.clipShadows;
+
+		const materialProperties = properties.get( material );
+
+		if ( ! localClippingEnabled || planes === null || planes.length === 0 || renderingShadows && ! clipShadows ) {
+
+			// there's no local clipping
+
+			if ( renderingShadows ) {
+
+				// there's no global clipping
+
+				projectPlanes( null );
+
+			} else {
+
+				resetGlobalState();
+
+			}
+
+		} else {
+
+			const nGlobal = renderingShadows ? 0 : numGlobalPlanes,
+				lGlobal = nGlobal * 4;
+
+			let dstArray = materialProperties.clippingState || null;
+
+			uniform.value = dstArray; // ensure unique state
+
+			dstArray = projectPlanes( planes, camera, lGlobal, useCache );
+
+			for ( let i = 0; i !== lGlobal; ++ i ) {
+
+				dstArray[ i ] = globalState[ i ];
+
+			}
+
+			materialProperties.clippingState = dstArray;
+			this.numIntersection = clipIntersection ? this.numPlanes : 0;
+			this.numPlanes += nGlobal;
+
+		}
+
+
+	};
+
+	function resetGlobalState() {
+
+		if ( uniform.value !== globalState ) {
+
+			uniform.value = globalState;
+			uniform.needsUpdate = numGlobalPlanes > 0;
+
+		}
+
+		scope.numPlanes = numGlobalPlanes;
+		scope.numIntersection = 0;
+
+	}
+
+	function projectPlanes( planes, camera, dstOffset, skipTransform ) {
+
+		const nPlanes = planes !== null ? planes.length : 0;
+		let dstArray = null;
+
+		if ( nPlanes !== 0 ) {
+
+			dstArray = uniform.value;
+
+			if ( skipTransform !== true || dstArray === null ) {
+
+				const flatSize = dstOffset + nPlanes * 4,
+					viewMatrix = camera.matrixWorldInverse;
+
+				viewNormalMatrix.getNormalMatrix( viewMatrix );
+
+				if ( dstArray === null || dstArray.length < flatSize ) {
+
+					dstArray = new Float32Array( flatSize );
+
+				}
+
+				for ( let i = 0, i4 = dstOffset; i !== nPlanes; ++ i, i4 += 4 ) {
+
+					plane.copy( planes[ i ] ).applyMatrix4( viewMatrix, viewNormalMatrix );
+
+					plane.normal.toArray( dstArray, i4 );
+					dstArray[ i4 + 3 ] = plane.constant;
+
+				}
+
+			}
+
+			uniform.value = dstArray;
+			uniform.needsUpdate = true;
+
+		}
+
+		scope.numPlanes = nPlanes;
+		scope.numIntersection = 0;
+
+		return dstArray;
+
+	}
+
+}
+
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/extras/ImageUtils.js
+
+
+
+let _canvas;
+
+class ImageUtils {
+
+	static getDataURL( image ) {
+
+		if ( /^data:/i.test( image.src ) ) {
+
+			return image.src;
+
+		}
+
+		if ( typeof HTMLCanvasElement == 'undefined' ) {
+
+			return image.src;
+
+		}
+
+		let canvas;
+
+		if ( image instanceof HTMLCanvasElement ) {
+
+			canvas = image;
+
+		} else {
+
+			if ( _canvas === undefined ) _canvas = createElementNS( 'canvas' );
+
+			_canvas.width = image.width;
+			_canvas.height = image.height;
+
+			const context = _canvas.getContext( '2d' );
+
+			if ( image instanceof ImageData ) {
+
+				context.putImageData( image, 0, 0 );
+
+			} else {
+
+				context.drawImage( image, 0, 0, image.width, image.height );
+
+			}
+
+			canvas = _canvas;
+
+		}
+
+		if ( canvas.width > 2048 || canvas.height > 2048 ) {
+
+			console.warn( 'THREE.ImageUtils.getDataURL: Image converted to jpg for performance reasons', image );
+
+			return canvas.toDataURL( 'image/jpeg', 0.6 );
+
+		} else {
+
+			return canvas.toDataURL( 'image/png' );
+
+		}
+
+	}
+
+	static sRGBToLinear( image ) {
+
+		if ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||
+			( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||
+			( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {
+
+			const canvas = createElementNS( 'canvas' );
+
+			canvas.width = image.width;
+			canvas.height = image.height;
+
+			const context = canvas.getContext( '2d' );
+			context.drawImage( image, 0, 0, image.width, image.height );
+
+			const imageData = context.getImageData( 0, 0, image.width, image.height );
+			const data = imageData.data;
+
+			for ( let i = 0; i < data.length; i ++ ) {
+
+				data[ i ] = SRGBToLinear( data[ i ] / 255 ) * 255;
+
+			}
+
+			context.putImageData( imageData, 0, 0 );
+
+			return canvas;
+
+		} else if ( image.data ) {
+
+			const data = image.data.slice( 0 );
+
+			for ( let i = 0; i < data.length; i ++ ) {
+
+				if ( data instanceof Uint8Array || data instanceof Uint8ClampedArray ) {
+
+					data[ i ] = Math.floor( SRGBToLinear( data[ i ] / 255 ) * 255 );
+
+				} else {
+
+					// assuming float
+
+					data[ i ] = SRGBToLinear( data[ i ] );
+
+				}
+
+			}
+
+			return {
+				data: data,
+				width: image.width,
+				height: image.height
+			};
+
+		} else {
+
+			console.warn( 'THREE.ImageUtils.sRGBToLinear(): Unsupported image type. No color space conversion applied.' );
+			return image;
+
+		}
+
+	}
+
+}
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/textures/Texture.js
+
+
+
+
+
+
+
+let textureId = 0;
+
+class Texture extends EventDispatcher {
+
+	constructor( image = Texture.DEFAULT_IMAGE, mapping = Texture.DEFAULT_MAPPING, wrapS = ClampToEdgeWrapping, wrapT = ClampToEdgeWrapping, magFilter = LinearFilter, minFilter = LinearMipmapLinearFilter, format = RGBAFormat, type = UnsignedByteType, anisotropy = 1, encoding = LinearEncoding ) {
+
+		super();
+
+		Object.defineProperty( this, 'id', { value: textureId ++ } );
+
+		this.uuid = generateUUID();
+
+		this.name = '';
+
+		this.image = image;
+		this.mipmaps = [];
+
+		this.mapping = mapping;
+
+		this.wrapS = wrapS;
+		this.wrapT = wrapT;
+
+		this.magFilter = magFilter;
+		this.minFilter = minFilter;
+
+		this.anisotropy = anisotropy;
+
+		this.format = format;
+		this.internalFormat = null;
+		this.type = type;
+
+		this.offset = new Vector2( 0, 0 );
+		this.repeat = new Vector2( 1, 1 );
+		this.center = new Vector2( 0, 0 );
+		this.rotation = 0;
+
+		this.matrixAutoUpdate = true;
+		this.matrix = new Matrix3();
+
+		this.generateMipmaps = true;
+		this.premultiplyAlpha = false;
+		this.flipY = true;
+		this.unpackAlignment = 4;	// valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml)
+
+		// Values of encoding !== THREE.LinearEncoding only supported on map, envMap and emissiveMap.
+		//
+		// Also changing the encoding after already used by a Material will not automatically make the Material
+		// update. You need to explicitly call Material.needsUpdate to trigger it to recompile.
+		this.encoding = encoding;
+
+		this.userData = {};
+
+		this.version = 0;
+		this.onUpdate = null;
+
+		this.isRenderTargetTexture = false; // indicates whether a texture belongs to a render target or not
+		this.needsPMREMUpdate = false; // indicates whether this texture should be processed by PMREMGenerator or not (only relevant for render target textures)
+
+	}
+
+	updateMatrix() {
+
+		this.matrix.setUvTransform( this.offset.x, this.offset.y, this.repeat.x, this.repeat.y, this.rotation, this.center.x, this.center.y );
+
+	}
+
+	clone() {
+
+		return new this.constructor().copy( this );
+
+	}
+
+	copy( source ) {
+
+		this.name = source.name;
+
+		this.image = source.image;
+		this.mipmaps = source.mipmaps.slice( 0 );
+
+		this.mapping = source.mapping;
+
+		this.wrapS = source.wrapS;
+		this.wrapT = source.wrapT;
+
+		this.magFilter = source.magFilter;
+		this.minFilter = source.minFilter;
+
+		this.anisotropy = source.anisotropy;
+
+		this.format = source.format;
+		this.internalFormat = source.internalFormat;
+		this.type = source.type;
+
+		this.offset.copy( source.offset );
+		this.repeat.copy( source.repeat );
+		this.center.copy( source.center );
+		this.rotation = source.rotation;
+
+		this.matrixAutoUpdate = source.matrixAutoUpdate;
+		this.matrix.copy( source.matrix );
+
+		this.generateMipmaps = source.generateMipmaps;
+		this.premultiplyAlpha = source.premultiplyAlpha;
+		this.flipY = source.flipY;
+		this.unpackAlignment = source.unpackAlignment;
+		this.encoding = source.encoding;
+
+		this.userData = JSON.parse( JSON.stringify( source.userData ) );
+
+		return this;
+
+	}
+
+	toJSON( meta ) {
+
+		const isRootObject = ( meta === undefined || typeof meta === 'string' );
+
+		if ( ! isRootObject && meta.textures[ this.uuid ] !== undefined ) {
+
+			return meta.textures[ this.uuid ];
+
+		}
+
+		const output = {
+
+			metadata: {
+				version: 4.5,
+				type: 'Texture',
+				generator: 'Texture.toJSON'
+			},
+
+			uuid: this.uuid,
+			name: this.name,
+
+			mapping: this.mapping,
+
+			repeat: [ this.repeat.x, this.repeat.y ],
+			offset: [ this.offset.x, this.offset.y ],
+			center: [ this.center.x, this.center.y ],
+			rotation: this.rotation,
+
+			wrap: [ this.wrapS, this.wrapT ],
+
+			format: this.format,
+			type: this.type,
+			encoding: this.encoding,
+
+			minFilter: this.minFilter,
+			magFilter: this.magFilter,
+			anisotropy: this.anisotropy,
+
+			flipY: this.flipY,
+
+			premultiplyAlpha: this.premultiplyAlpha,
+			unpackAlignment: this.unpackAlignment
+
+		};
+
+		if ( this.image !== undefined ) {
+
+			// TODO: Move to THREE.Image
+
+			const image = this.image;
+
+			if ( image.uuid === undefined ) {
+
+				image.uuid = generateUUID(); // UGH
+
+			}
+
+			if ( ! isRootObject && meta.images[ image.uuid ] === undefined ) {
+
+				let url;
+
+				if ( Array.isArray( image ) ) {
+
+					// process array of images e.g. CubeTexture
+
+					url = [];
+
+					for ( let i = 0, l = image.length; i < l; i ++ ) {
+
+						// check cube texture with data textures
+
+						if ( image[ i ].isDataTexture ) {
+
+							url.push( serializeImage( image[ i ].image ) );
+
+						} else {
+
+							url.push( serializeImage( image[ i ] ) );
+
+						}
+
+					}
+
+				} else {
+
+					// process single image
+
+					url = serializeImage( image );
+
+				}
+
+				meta.images[ image.uuid ] = {
+					uuid: image.uuid,
+					url: url
+				};
+
+			}
+
+			output.image = image.uuid;
+
+		}
+
+		if ( JSON.stringify( this.userData ) !== '{}' ) output.userData = this.userData;
+
+		if ( ! isRootObject ) {
+
+			meta.textures[ this.uuid ] = output;
+
+		}
+
+		return output;
+
+	}
+
+	dispose() {
+
+		this.dispatchEvent( { type: 'dispose' } );
+
+	}
+
+	transformUv( uv ) {
+
+		if ( this.mapping !== UVMapping ) return uv;
+
+		uv.applyMatrix3( this.matrix );
+
+		if ( uv.x < 0 || uv.x > 1 ) {
+
+			switch ( this.wrapS ) {
+
+				case RepeatWrapping:
+
+					uv.x = uv.x - Math.floor( uv.x );
+					break;
+
+				case ClampToEdgeWrapping:
+
+					uv.x = uv.x < 0 ? 0 : 1;
+					break;
+
+				case MirroredRepeatWrapping:
+
+					if ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) {
+
+						uv.x = Math.ceil( uv.x ) - uv.x;
+
+					} else {
+
+						uv.x = uv.x - Math.floor( uv.x );
+
+					}
+
+					break;
+
+			}
+
+		}
+
+		if ( uv.y < 0 || uv.y > 1 ) {
+
+			switch ( this.wrapT ) {
+
+				case RepeatWrapping:
+
+					uv.y = uv.y - Math.floor( uv.y );
+					break;
+
+				case ClampToEdgeWrapping:
+
+					uv.y = uv.y < 0 ? 0 : 1;
+					break;
+
+				case MirroredRepeatWrapping:
+
+					if ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) {
+
+						uv.y = Math.ceil( uv.y ) - uv.y;
+
+					} else {
+
+						uv.y = uv.y - Math.floor( uv.y );
+
+					}
+
+					break;
+
+			}
+
+		}
+
+		if ( this.flipY ) {
+
+			uv.y = 1 - uv.y;
+
+		}
+
+		return uv;
+
+	}
+
+	set needsUpdate( value ) {
+
+		if ( value === true ) this.version ++;
+
+	}
+
+}
+
+Texture.DEFAULT_IMAGE = undefined;
+Texture.DEFAULT_MAPPING = UVMapping;
+
+Texture.prototype.isTexture = true;
+
+function serializeImage( image ) {
+
+	if ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||
+		( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||
+		( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {
+
+		// default images
+
+		return ImageUtils.getDataURL( image );
+
+	} else {
+
+		if ( image.data ) {
+
+			// images of DataTexture
+
+			return {
+				data: Array.prototype.slice.call( image.data ),
+				width: image.width,
+				height: image.height,
+				type: image.data.constructor.name
+			};
+
+		} else {
+
+			console.warn( 'THREE.Texture: Unable to serialize Texture.' );
+			return {};
+
+		}
+
+	}
+
+}
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/WebGLRenderTarget.js
+
+
+
+
+
+/*
+ In options, we can specify:
+ * Texture parameters for an auto-generated target texture
+ * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers
+*/
+class WebGLRenderTarget extends EventDispatcher {
+
+	constructor( width, height, options = {} ) {
+
+		super();
+
+		this.width = width;
+		this.height = height;
+		this.depth = 1;
+
+		this.scissor = new Vector4( 0, 0, width, height );
+		this.scissorTest = false;
+
+		this.viewport = new Vector4( 0, 0, width, height );
+
+		this.texture = new Texture( undefined, options.mapping, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding );
+		this.texture.isRenderTargetTexture = true;
+
+		this.texture.image = { width: width, height: height, depth: 1 };
+
+		this.texture.generateMipmaps = options.generateMipmaps !== undefined ? options.generateMipmaps : false;
+		this.texture.internalFormat = options.internalFormat !== undefined ? options.internalFormat : null;
+		this.texture.minFilter = options.minFilter !== undefined ? options.minFilter : LinearFilter;
+
+		this.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true;
+		this.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : false;
+		this.depthTexture = options.depthTexture !== undefined ? options.depthTexture : null;
+
+	}
+
+	setTexture( texture ) {
+
+		texture.image = {
+			width: this.width,
+			height: this.height,
+			depth: this.depth
+		};
+
+		this.texture = texture;
+
+	}
+
+	setSize( width, height, depth = 1 ) {
+
+		if ( this.width !== width || this.height !== height || this.depth !== depth ) {
+
+			this.width = width;
+			this.height = height;
+			this.depth = depth;
+
+			this.texture.image.width = width;
+			this.texture.image.height = height;
+			this.texture.image.depth = depth;
+
+			this.dispose();
+
+		}
+
+		this.viewport.set( 0, 0, width, height );
+		this.scissor.set( 0, 0, width, height );
+
+	}
+
+	clone() {
+
+		return new this.constructor().copy( this );
+
+	}
+
+	copy( source ) {
+
+		this.width = source.width;
+		this.height = source.height;
+		this.depth = source.depth;
+
+		this.viewport.copy( source.viewport );
+
+		this.texture = source.texture.clone();
+
+		// ensure image object is not shared, see #20328
+
+		this.texture.image = Object.assign( {}, source.texture.image );
+
+		this.depthBuffer = source.depthBuffer;
+		this.stencilBuffer = source.stencilBuffer;
+		this.depthTexture = source.depthTexture;
+
+		return this;
+
+	}
+
+	dispose() {
+
+		this.dispatchEvent( { type: 'dispose' } );
+
+	}
+
+}
+
+WebGLRenderTarget.prototype.isWebGLRenderTarget = true;
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/cameras/PerspectiveCamera.js
+
+
+
+class PerspectiveCamera extends Camera {
+
+	constructor( fov = 50, aspect = 1, near = 0.1, far = 2000 ) {
+
+		super();
+
+		this.type = 'PerspectiveCamera';
+
+		this.fov = fov;
+		this.zoom = 1;
+
+		this.near = near;
+		this.far = far;
+		this.focus = 10;
+
+		this.aspect = aspect;
+		this.view = null;
+
+		this.filmGauge = 35;	// width of the film (default in millimeters)
+		this.filmOffset = 0;	// horizontal film offset (same unit as gauge)
+
+		this.updateProjectionMatrix();
+
+	}
+
+	copy( source, recursive ) {
+
+		super.copy( source, recursive );
+
+		this.fov = source.fov;
+		this.zoom = source.zoom;
+
+		this.near = source.near;
+		this.far = source.far;
+		this.focus = source.focus;
+
+		this.aspect = source.aspect;
+		this.view = source.view === null ? null : Object.assign( {}, source.view );
+
+		this.filmGauge = source.filmGauge;
+		this.filmOffset = source.filmOffset;
+
+		return this;
+
+	}
+
+	/**
+	 * Sets the FOV by focal length in respect to the current .filmGauge.
+	 *
+	 * The default film gauge is 35, so that the focal length can be specified for
+	 * a 35mm (full frame) camera.
+	 *
+	 * Values for focal length and film gauge must have the same unit.
+	 */
+	setFocalLength( focalLength ) {
+
+		/** see {@link http://www.bobatkins.com/photography/technical/field_of_view.html} */
+		const vExtentSlope = 0.5 * this.getFilmHeight() / focalLength;
+
+		this.fov = RAD2DEG * 2 * Math.atan( vExtentSlope );
+		this.updateProjectionMatrix();
+
+	}
+
+	/**
+	 * Calculates the focal length from the current .fov and .filmGauge.
+	 */
+	getFocalLength() {
+
+		const vExtentSlope = Math.tan( DEG2RAD * 0.5 * this.fov );
+
+		return 0.5 * this.getFilmHeight() / vExtentSlope;
+
+	}
+
+	getEffectiveFOV() {
+
+		return RAD2DEG * 2 * Math.atan(
+			Math.tan( DEG2RAD * 0.5 * this.fov ) / this.zoom );
+
+	}
+
+	getFilmWidth() {
+
+		// film not completely covered in portrait format (aspect < 1)
+		return this.filmGauge * Math.min( this.aspect, 1 );
+
+	}
+
+	getFilmHeight() {
+
+		// film not completely covered in landscape format (aspect > 1)
+		return this.filmGauge / Math.max( this.aspect, 1 );
+
+	}
+
+	/**
+	 * Sets an offset in a larger frustum. This is useful for multi-window or
+	 * multi-monitor/multi-machine setups.
+	 *
+	 * For example, if you have 3x2 monitors and each monitor is 1920x1080 and
+	 * the monitors are in grid like this
+	 *
+	 *   +---+---+---+
+	 *   | A | B | C |
+	 *   +---+---+---+
+	 *   | D | E | F |
+	 *   +---+---+---+
+	 *
+	 * then for each monitor you would call it like this
+	 *
+	 *   const w = 1920;
+	 *   const h = 1080;
+	 *   const fullWidth = w * 3;
+	 *   const fullHeight = h * 2;
+	 *
+	 *   --A--
+	 *   camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 0, w, h );
+	 *   --B--
+	 *   camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 0, w, h );
+	 *   --C--
+	 *   camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 0, w, h );
+	 *   --D--
+	 *   camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 1, w, h );
+	 *   --E--
+	 *   camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 1, w, h );
+	 *   --F--
+	 *   camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 1, w, h );
+	 *
+	 *   Note there is no reason monitors have to be the same size or in a grid.
+	 */
+	setViewOffset( fullWidth, fullHeight, x, y, width, height ) {
+
+		this.aspect = fullWidth / fullHeight;
+
+		if ( this.view === null ) {
+
+			this.view = {
+				enabled: true,
+				fullWidth: 1,
+				fullHeight: 1,
+				offsetX: 0,
+				offsetY: 0,
+				width: 1,
+				height: 1
+			};
+
+		}
+
+		this.view.enabled = true;
+		this.view.fullWidth = fullWidth;
+		this.view.fullHeight = fullHeight;
+		this.view.offsetX = x;
+		this.view.offsetY = y;
+		this.view.width = width;
+		this.view.height = height;
+
+		this.updateProjectionMatrix();
+
+	}
+
+	clearViewOffset() {
+
+		if ( this.view !== null ) {
+
+			this.view.enabled = false;
+
+		}
+
+		this.updateProjectionMatrix();
+
+	}
+
+	updateProjectionMatrix() {
+
+		const near = this.near;
+		let top = near * Math.tan( DEG2RAD * 0.5 * this.fov ) / this.zoom;
+		let height = 2 * top;
+		let width = this.aspect * height;
+		let left = - 0.5 * width;
+		const view = this.view;
+
+		if ( this.view !== null && this.view.enabled ) {
+
+			const fullWidth = view.fullWidth,
+				fullHeight = view.fullHeight;
+
+			left += view.offsetX * width / fullWidth;
+			top -= view.offsetY * height / fullHeight;
+			width *= view.width / fullWidth;
+			height *= view.height / fullHeight;
+
+		}
+
+		const skew = this.filmOffset;
+		if ( skew !== 0 ) left += near * skew / this.getFilmWidth();
+
+		this.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far );
+
+		this.projectionMatrixInverse.copy( this.projectionMatrix ).invert();
+
+	}
+
+	toJSON( meta ) {
+
+		const data = super.toJSON( meta );
+
+		data.object.fov = this.fov;
+		data.object.zoom = this.zoom;
+
+		data.object.near = this.near;
+		data.object.far = this.far;
+		data.object.focus = this.focus;
+
+		data.object.aspect = this.aspect;
+
+		if ( this.view !== null ) data.object.view = Object.assign( {}, this.view );
+
+		data.object.filmGauge = this.filmGauge;
+		data.object.filmOffset = this.filmOffset;
+
+		return data;
+
+	}
+
+}
+
+PerspectiveCamera.prototype.isPerspectiveCamera = true;
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/cameras/CubeCamera.js
+
+
+
+
+const fov = 90, aspect = 1;
+
+class CubeCamera extends Object3D {
+
+	constructor( near, far, renderTarget ) {
+
+		super();
+
+		this.type = 'CubeCamera';
+
+		if ( renderTarget.isWebGLCubeRenderTarget !== true ) {
+
+			console.error( 'THREE.CubeCamera: The constructor now expects an instance of WebGLCubeRenderTarget as third parameter.' );
+			return;
+
+		}
+
+		this.renderTarget = renderTarget;
+
+		const cameraPX = new PerspectiveCamera( fov, aspect, near, far );
+		cameraPX.layers = this.layers;
+		cameraPX.up.set( 0, - 1, 0 );
+		cameraPX.lookAt( new Vector3( 1, 0, 0 ) );
+		this.add( cameraPX );
+
+		const cameraNX = new PerspectiveCamera( fov, aspect, near, far );
+		cameraNX.layers = this.layers;
+		cameraNX.up.set( 0, - 1, 0 );
+		cameraNX.lookAt( new Vector3( - 1, 0, 0 ) );
+		this.add( cameraNX );
+
+		const cameraPY = new PerspectiveCamera( fov, aspect, near, far );
+		cameraPY.layers = this.layers;
+		cameraPY.up.set( 0, 0, 1 );
+		cameraPY.lookAt( new Vector3( 0, 1, 0 ) );
+		this.add( cameraPY );
+
+		const cameraNY = new PerspectiveCamera( fov, aspect, near, far );
+		cameraNY.layers = this.layers;
+		cameraNY.up.set( 0, 0, - 1 );
+		cameraNY.lookAt( new Vector3( 0, - 1, 0 ) );
+		this.add( cameraNY );
+
+		const cameraPZ = new PerspectiveCamera( fov, aspect, near, far );
+		cameraPZ.layers = this.layers;
+		cameraPZ.up.set( 0, - 1, 0 );
+		cameraPZ.lookAt( new Vector3( 0, 0, 1 ) );
+		this.add( cameraPZ );
+
+		const cameraNZ = new PerspectiveCamera( fov, aspect, near, far );
+		cameraNZ.layers = this.layers;
+		cameraNZ.up.set( 0, - 1, 0 );
+		cameraNZ.lookAt( new Vector3( 0, 0, - 1 ) );
+		this.add( cameraNZ );
+
+	}
+
+	update( renderer, scene ) {
+
+		if ( this.parent === null ) this.updateMatrixWorld();
+
+		const renderTarget = this.renderTarget;
+
+		const [ cameraPX, cameraNX, cameraPY, cameraNY, cameraPZ, cameraNZ ] = this.children;
+
+		const currentXrEnabled = renderer.xr.enabled;
+		const currentRenderTarget = renderer.getRenderTarget();
+
+		renderer.xr.enabled = false;
+
+		const generateMipmaps = renderTarget.texture.generateMipmaps;
+
+		renderTarget.texture.generateMipmaps = false;
+
+		renderer.setRenderTarget( renderTarget, 0 );
+		renderer.render( scene, cameraPX );
+
+		renderer.setRenderTarget( renderTarget, 1 );
+		renderer.render( scene, cameraNX );
+
+		renderer.setRenderTarget( renderTarget, 2 );
+		renderer.render( scene, cameraPY );
+
+		renderer.setRenderTarget( renderTarget, 3 );
+		renderer.render( scene, cameraNY );
+
+		renderer.setRenderTarget( renderTarget, 4 );
+		renderer.render( scene, cameraPZ );
+
+		renderTarget.texture.generateMipmaps = generateMipmaps;
+
+		renderer.setRenderTarget( renderTarget, 5 );
+		renderer.render( scene, cameraNZ );
+
+		renderer.setRenderTarget( currentRenderTarget );
+
+		renderer.xr.enabled = currentXrEnabled;
+
+		renderTarget.texture.needsPMREMUpdate = true;
+
+	}
+
+}
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/textures/CubeTexture.js
+
+
+
+class CubeTexture extends Texture {
+
+	constructor( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {
+
+		images = images !== undefined ? images : [];
+		mapping = mapping !== undefined ? mapping : CubeReflectionMapping;
+
+		super( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );
+
+		this.flipY = false;
+
+	}
+
+	get images() {
+
+		return this.image;
+
+	}
+
+	set images( value ) {
+
+		this.image = value;
+
+	}
+
+}
+
+CubeTexture.prototype.isCubeTexture = true;
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/WebGLCubeRenderTarget.js
+
+
+
+
+
+
+
+
+
+class WebGLCubeRenderTarget extends WebGLRenderTarget {
+
+	constructor( size, options, dummy ) {
+
+		if ( Number.isInteger( options ) ) {
+
+			console.warn( 'THREE.WebGLCubeRenderTarget: constructor signature is now WebGLCubeRenderTarget( size, options )' );
+
+			options = dummy;
+
+		}
+
+		super( size, size, options );
+
+		options = options || {};
+
+		// By convention -- likely based on the RenderMan spec from the 1990's -- cube maps are specified by WebGL (and three.js)
+		// in a coordinate system in which positive-x is to the right when looking up the positive-z axis -- in other words,
+		// in a left-handed coordinate system. By continuing this convention, preexisting cube maps continued to render correctly.
+
+		// three.js uses a right-handed coordinate system. So environment maps used in three.js appear to have px and nx swapped
+		// and the flag isRenderTargetTexture controls this conversion. The flip is not required when using WebGLCubeRenderTarget.texture
+		// as a cube texture (this is detected when isRenderTargetTexture is set to true for cube textures).
+
+		this.texture = new CubeTexture( undefined, options.mapping, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding );
+		this.texture.isRenderTargetTexture = true;
+
+		this.texture.generateMipmaps = options.generateMipmaps !== undefined ? options.generateMipmaps : false;
+		this.texture.minFilter = options.minFilter !== undefined ? options.minFilter : LinearFilter;
+
+	}
+
+	fromEquirectangularTexture( renderer, texture ) {
+
+		this.texture.type = texture.type;
+		this.texture.format = RGBAFormat; // see #18859
+		this.texture.encoding = texture.encoding;
+
+		this.texture.generateMipmaps = texture.generateMipmaps;
+		this.texture.minFilter = texture.minFilter;
+		this.texture.magFilter = texture.magFilter;
+
+		const shader = {
+
+			uniforms: {
+				tEquirect: { value: null },
+			},
+
+			vertexShader: /* glsl */`
+
+				varying vec3 vWorldDirection;
+
+				vec3 transformDirection( in vec3 dir, in mat4 matrix ) {
+
+					return normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );
+
+				}
+
+				void main() {
+
+					vWorldDirection = transformDirection( position, modelMatrix );
+
+					#include <begin_vertex>
+					#include <project_vertex>
+
+				}
+			`,
+
+			fragmentShader: /* glsl */`
+
+				uniform sampler2D tEquirect;
+
+				varying vec3 vWorldDirection;
+
+				#include <common>
+
+				void main() {
+
+					vec3 direction = normalize( vWorldDirection );
+
+					vec2 sampleUV = equirectUv( direction );
+
+					gl_FragColor = texture2D( tEquirect, sampleUV );
+
+				}
+			`
+		};
+
+		const geometry = new BoxGeometry( 5, 5, 5 );
+
+		const material = new ShaderMaterial( {
+
+			name: 'CubemapFromEquirect',
+
+			uniforms: cloneUniforms( shader.uniforms ),
+			vertexShader: shader.vertexShader,
+			fragmentShader: shader.fragmentShader,
+			side: BackSide,
+			blending: NoBlending
+
+		} );
+
+		material.uniforms.tEquirect.value = texture;
+
+		const mesh = new Mesh( geometry, material );
+
+		const currentMinFilter = texture.minFilter;
+
+		// Avoid blurred poles
+		if ( texture.minFilter === LinearMipmapLinearFilter ) texture.minFilter = LinearFilter;
+
+		const camera = new CubeCamera( 1, 10, this );
+		camera.update( renderer, mesh );
+
+		texture.minFilter = currentMinFilter;
+
+		mesh.geometry.dispose();
+		mesh.material.dispose();
+
+		return this;
+
+	}
+
+	clear( renderer, color, depth, stencil ) {
+
+		const currentRenderTarget = renderer.getRenderTarget();
+
+		for ( let i = 0; i < 6; i ++ ) {
+
+			renderer.setRenderTarget( this, i );
+
+			renderer.clear( color, depth, stencil );
+
+		}
+
+		renderer.setRenderTarget( currentRenderTarget );
+
+	}
+
+}
+
+WebGLCubeRenderTarget.prototype.isWebGLCubeRenderTarget = true;
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/webgl/WebGLCubeMaps.js
+
+
+
+function WebGLCubeMaps( renderer ) {
+
+	let cubemaps = new WeakMap();
+
+	function mapTextureMapping( texture, mapping ) {
+
+		if ( mapping === EquirectangularReflectionMapping ) {
+
+			texture.mapping = CubeReflectionMapping;
+
+		} else if ( mapping === EquirectangularRefractionMapping ) {
+
+			texture.mapping = CubeRefractionMapping;
+
+		}
+
+		return texture;
+
+	}
+
+	function get( texture ) {
+
+		if ( texture && texture.isTexture && texture.isRenderTargetTexture === false ) {
+
+			const mapping = texture.mapping;
+
+			if ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping ) {
+
+				if ( cubemaps.has( texture ) ) {
+
+					const cubemap = cubemaps.get( texture ).texture;
+					return mapTextureMapping( cubemap, texture.mapping );
+
+				} else {
+
+					const image = texture.image;
+
+					if ( image && image.height > 0 ) {
+
+						const renderTarget = new WebGLCubeRenderTarget( image.height / 2 );
+						renderTarget.fromEquirectangularTexture( renderer, texture );
+						cubemaps.set( texture, renderTarget );
+
+						texture.addEventListener( 'dispose', onTextureDispose );
+
+						return mapTextureMapping( renderTarget.texture, texture.mapping );
+
+					} else {
+
+						// image not yet ready. try the conversion next frame
+
+						return null;
+
+					}
+
+				}
+
+			}
+
+		}
+
+		return texture;
+
+	}
+
+	function onTextureDispose( event ) {
+
+		const texture = event.target;
+
+		texture.removeEventListener( 'dispose', onTextureDispose );
+
+		const cubemap = cubemaps.get( texture );
+
+		if ( cubemap !== undefined ) {
+
+			cubemaps.delete( texture );
+			cubemap.dispose();
+
+		}
+
+	}
+
+	function dispose() {
+
+		cubemaps = new WeakMap();
+
+	}
+
+	return {
+		get: get,
+		dispose: dispose
+	};
+
+}
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/materials/RawShaderMaterial.js
+
+
+class RawShaderMaterial extends ShaderMaterial {
+
+	constructor( parameters ) {
+
+		super( parameters );
+
+		this.type = 'RawShaderMaterial';
+
+	}
+
+}
+
+RawShaderMaterial.prototype.isRawShaderMaterial = true;
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/extras/PMREMGenerator.js
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+const LOD_MIN = 4;
+const LOD_MAX = 8;
+const SIZE_MAX = Math.pow( 2, LOD_MAX );
+
+// The standard deviations (radians) associated with the extra mips. These are
+// chosen to approximate a Trowbridge-Reitz distribution function times the
+// geometric shadowing function. These sigma values squared must match the
+// variance #defines in cube_uv_reflection_fragment.glsl.js.
+const EXTRA_LOD_SIGMA = [ 0.125, 0.215, 0.35, 0.446, 0.526, 0.582 ];
+
+const TOTAL_LODS = LOD_MAX - LOD_MIN + 1 + EXTRA_LOD_SIGMA.length;
+
+// The maximum length of the blur for loop. Smaller sigmas will use fewer
+// samples and exit early, but not recompile the shader.
+const MAX_SAMPLES = 20;
+
+const _flatCamera = /*@__PURE__*/ new OrthographicCamera();
+const { _lodPlanes, _sizeLods, _sigmas } = /*@__PURE__*/ _createPlanes();
+const _clearColor = /*@__PURE__*/ new Color();
+let _oldTarget = null;
+
+// Golden Ratio
+const PHI = ( 1 + Math.sqrt( 5 ) ) / 2;
+const INV_PHI = 1 / PHI;
+
+// Vertices of a dodecahedron (except the opposites, which represent the
+// same axis), used as axis directions evenly spread on a sphere.
+const _axisDirections = [
+	/*@__PURE__*/ new Vector3( 1, 1, 1 ),
+	/*@__PURE__*/ new Vector3( - 1, 1, 1 ),
+	/*@__PURE__*/ new Vector3( 1, 1, - 1 ),
+	/*@__PURE__*/ new Vector3( - 1, 1, - 1 ),
+	/*@__PURE__*/ new Vector3( 0, PHI, INV_PHI ),
+	/*@__PURE__*/ new Vector3( 0, PHI, - INV_PHI ),
+	/*@__PURE__*/ new Vector3( INV_PHI, 0, PHI ),
+	/*@__PURE__*/ new Vector3( - INV_PHI, 0, PHI ),
+	/*@__PURE__*/ new Vector3( PHI, INV_PHI, 0 ),
+	/*@__PURE__*/ new Vector3( - PHI, INV_PHI, 0 ) ];
+
+/**
+ * This class generates a Prefiltered, Mipmapped Radiance Environment Map
+ * (PMREM) from a cubeMap environment texture. This allows different levels of
+ * blur to be quickly accessed based on material roughness. It is packed into a
+ * special CubeUV format that allows us to perform custom interpolation so that
+ * we can support nonlinear formats such as RGBE. Unlike a traditional mipmap
+ * chain, it only goes down to the LOD_MIN level (above), and then creates extra
+ * even more filtered 'mips' at the same LOD_MIN resolution, associated with
+ * higher roughness levels. In this way we maintain resolution to smoothly
+ * interpolate diffuse lighting while limiting sampling computation.
+ *
+ * Paper: Fast, Accurate Image-Based Lighting
+ * https://drive.google.com/file/d/15y8r_UpKlU9SvV4ILb0C3qCPecS8pvLz/view
+*/
+
+class PMREMGenerator {
+
+	constructor( renderer ) {
+
+		this._renderer = renderer;
+		this._pingPongRenderTarget = null;
+
+		this._blurMaterial = _getBlurShader( MAX_SAMPLES );
+		this._equirectShader = null;
+		this._cubemapShader = null;
+
+		this._compileMaterial( this._blurMaterial );
+
+	}
+
+	/**
+	 * Generates a PMREM from a supplied Scene, which can be faster than using an
+	 * image if networking bandwidth is low. Optional sigma specifies a blur radius
+	 * in radians to be applied to the scene before PMREM generation. Optional near
+	 * and far planes ensure the scene is rendered in its entirety (the cubeCamera
+	 * is placed at the origin).
+	 */
+	fromScene( scene, sigma = 0, near = 0.1, far = 100 ) {
+
+		_oldTarget = this._renderer.getRenderTarget();
+		const cubeUVRenderTarget = this._allocateTargets();
+
+		this._sceneToCubeUV( scene, near, far, cubeUVRenderTarget );
+		if ( sigma > 0 ) {
+
+			this._blur( cubeUVRenderTarget, 0, 0, sigma );
+
+		}
+
+		this._applyPMREM( cubeUVRenderTarget );
+		this._cleanup( cubeUVRenderTarget );
+
+		return cubeUVRenderTarget;
+
+	}
+
+	/**
+	 * Generates a PMREM from an equirectangular texture, which can be either LDR
+	 * or HDR. The ideal input image size is 1k (1024 x 512),
+	 * as this matches best with the 256 x 256 cubemap output.
+	 */
+	fromEquirectangular( equirectangular, renderTarget = null ) {
+
+		return this._fromTexture( equirectangular, renderTarget );
+
+	}
+
+	/**
+	 * Generates a PMREM from an cubemap texture, which can be either LDR
+	 * or HDR. The ideal input cube size is 256 x 256,
+	 * as this matches best with the 256 x 256 cubemap output.
+	 */
+	fromCubemap( cubemap, renderTarget = null ) {
+
+		return this._fromTexture( cubemap, renderTarget );
+
+	}
+
+	/**
+	 * Pre-compiles the cubemap shader. You can get faster start-up by invoking this method during
+	 * your texture's network fetch for increased concurrency.
+	 */
+	compileCubemapShader() {
+
+		if ( this._cubemapShader === null ) {
+
+			this._cubemapShader = _getCubemapShader();
+			this._compileMaterial( this._cubemapShader );
+
+		}
+
+	}
+
+	/**
+	 * Pre-compiles the equirectangular shader. You can get faster start-up by invoking this method during
+	 * your texture's network fetch for increased concurrency.
+	 */
+	compileEquirectangularShader() {
+
+		if ( this._equirectShader === null ) {
+
+			this._equirectShader = _getEquirectShader();
+			this._compileMaterial( this._equirectShader );
+
+		}
+
+	}
+
+	/**
+	 * Disposes of the PMREMGenerator's internal memory. Note that PMREMGenerator is a static class,
+	 * so you should not need more than one PMREMGenerator object. If you do, calling dispose() on
+	 * one of them will cause any others to also become unusable.
+	 */
+	dispose() {
+
+		this._blurMaterial.dispose();
+
+		if ( this._pingPongRenderTarget !== null ) this._pingPongRenderTarget.dispose();
+
+		if ( this._cubemapShader !== null ) this._cubemapShader.dispose();
+		if ( this._equirectShader !== null ) this._equirectShader.dispose();
+
+		for ( let i = 0; i < _lodPlanes.length; i ++ ) {
+
+			_lodPlanes[ i ].dispose();
+
+		}
+
+	}
+
+	// private interface
+
+	_cleanup( outputTarget ) {
+
+		this._renderer.setRenderTarget( _oldTarget );
+		outputTarget.scissorTest = false;
+		_setViewport( outputTarget, 0, 0, outputTarget.width, outputTarget.height );
+
+	}
+
+	_fromTexture( texture, renderTarget ) {
+
+		_oldTarget = this._renderer.getRenderTarget();
+		const cubeUVRenderTarget = renderTarget || this._allocateTargets( texture );
+		this._textureToCubeUV( texture, cubeUVRenderTarget );
+		this._applyPMREM( cubeUVRenderTarget );
+		this._cleanup( cubeUVRenderTarget );
+
+		return cubeUVRenderTarget;
+
+	}
+
+	_allocateTargets( texture ) { // warning: null texture is valid
+
+		const params = {
+			magFilter: LinearFilter,
+			minFilter: LinearFilter,
+			generateMipmaps: false,
+			type: HalfFloatType,
+			format: RGBAFormat,
+			encoding: LinearEncoding,
+			depthBuffer: false
+		};
+
+		const cubeUVRenderTarget = _createRenderTarget( params );
+		cubeUVRenderTarget.depthBuffer = texture ? false : true;
+
+		if ( this._pingPongRenderTarget === null ) {
+
+			this._pingPongRenderTarget = _createRenderTarget( params );
+
+		}
+
+		return cubeUVRenderTarget;
+
+	}
+
+	_compileMaterial( material ) {
+
+		const tmpMesh = new Mesh( _lodPlanes[ 0 ], material );
+		this._renderer.compile( tmpMesh, _flatCamera );
+
+	}
+
+	_sceneToCubeUV( scene, near, far, cubeUVRenderTarget ) {
+
+		const fov = 90;
+		const aspect = 1;
+		const cubeCamera = new PerspectiveCamera( fov, aspect, near, far );
+		const upSign = [ 1, - 1, 1, 1, 1, 1 ];
+		const forwardSign = [ 1, 1, 1, - 1, - 1, - 1 ];
+		const renderer = this._renderer;
+
+		const originalAutoClear = renderer.autoClear;
+		const toneMapping = renderer.toneMapping;
+		renderer.getClearColor( _clearColor );
+
+		renderer.toneMapping = NoToneMapping;
+		renderer.autoClear = false;
+
+		const backgroundMaterial = new MeshBasicMaterial( {
+			name: 'PMREM.Background',
+			side: BackSide,
+			depthWrite: false,
+			depthTest: false,
+		} );
+
+		const backgroundBox = new Mesh( new BoxGeometry(), backgroundMaterial );
+
+		let useSolidColor = false;
+		const background = scene.background;
+
+		if ( background ) {
+
+			if ( background.isColor ) {
+
+				backgroundMaterial.color.copy( background );
+				scene.background = null;
+				useSolidColor = true;
+
+			}
+
+		} else {
+
+			backgroundMaterial.color.copy( _clearColor );
+			useSolidColor = true;
+
+		}
+
+		for ( let i = 0; i < 6; i ++ ) {
+
+			const col = i % 3;
+			if ( col === 0 ) {
+
+				cubeCamera.up.set( 0, upSign[ i ], 0 );
+				cubeCamera.lookAt( forwardSign[ i ], 0, 0 );
+
+			} else if ( col === 1 ) {
+
+				cubeCamera.up.set( 0, 0, upSign[ i ] );
+				cubeCamera.lookAt( 0, forwardSign[ i ], 0 );
+
+			} else {
+
+				cubeCamera.up.set( 0, upSign[ i ], 0 );
+				cubeCamera.lookAt( 0, 0, forwardSign[ i ] );
+
+			}
+
+			_setViewport( cubeUVRenderTarget,
+				col * SIZE_MAX, i > 2 ? SIZE_MAX : 0, SIZE_MAX, SIZE_MAX );
+			renderer.setRenderTarget( cubeUVRenderTarget );
+
+			if ( useSolidColor ) {
+
+				renderer.render( backgroundBox, cubeCamera );
+
+			}
+
+			renderer.render( scene, cubeCamera );
+
+		}
+
+		backgroundBox.geometry.dispose();
+		backgroundBox.material.dispose();
+
+		renderer.toneMapping = toneMapping;
+		renderer.autoClear = originalAutoClear;
+		scene.background = background;
+
+	}
+
+	_textureToCubeUV( texture, cubeUVRenderTarget ) {
+
+		const renderer = this._renderer;
+
+		const isCubeTexture = ( texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping );
+
+		if ( isCubeTexture ) {
+
+			if ( this._cubemapShader === null ) {
+
+				this._cubemapShader = _getCubemapShader();
+
+			}
+
+			this._cubemapShader.uniforms.flipEnvMap.value = ( texture.isRenderTargetTexture === false ) ? - 1 : 1;
+
+		} else {
+
+			if ( this._equirectShader === null ) {
+
+				this._equirectShader = _getEquirectShader();
+
+			}
+
+		}
+
+		const material = isCubeTexture ? this._cubemapShader : this._equirectShader;
+		const mesh = new Mesh( _lodPlanes[ 0 ], material );
+
+		const uniforms = material.uniforms;
+
+		uniforms[ 'envMap' ].value = texture;
+
+		if ( ! isCubeTexture ) {
+
+			uniforms[ 'texelSize' ].value.set( 1.0 / texture.image.width, 1.0 / texture.image.height );
+
+		}
+
+		_setViewport( cubeUVRenderTarget, 0, 0, 3 * SIZE_MAX, 2 * SIZE_MAX );
+
+		renderer.setRenderTarget( cubeUVRenderTarget );
+		renderer.render( mesh, _flatCamera );
+
+	}
+
+	_applyPMREM( cubeUVRenderTarget ) {
+
+		const renderer = this._renderer;
+		const autoClear = renderer.autoClear;
+		renderer.autoClear = false;
+
+		for ( let i = 1; i < TOTAL_LODS; i ++ ) {
+
+			const sigma = Math.sqrt( _sigmas[ i ] * _sigmas[ i ] - _sigmas[ i - 1 ] * _sigmas[ i - 1 ] );
+
+			const poleAxis = _axisDirections[ ( i - 1 ) % _axisDirections.length ];
+
+			this._blur( cubeUVRenderTarget, i - 1, i, sigma, poleAxis );
+
+		}
+
+		renderer.autoClear = autoClear;
+
+	}
+
+	/**
+	 * This is a two-pass Gaussian blur for a cubemap. Normally this is done
+	 * vertically and horizontally, but this breaks down on a cube. Here we apply
+	 * the blur latitudinally (around the poles), and then longitudinally (towards
+	 * the poles) to approximate the orthogonally-separable blur. It is least
+	 * accurate at the poles, but still does a decent job.
+	 */
+	_blur( cubeUVRenderTarget, lodIn, lodOut, sigma, poleAxis ) {
+
+		const pingPongRenderTarget = this._pingPongRenderTarget;
+
+		this._halfBlur(
+			cubeUVRenderTarget,
+			pingPongRenderTarget,
+			lodIn,
+			lodOut,
+			sigma,
+			'latitudinal',
+			poleAxis );
+
+		this._halfBlur(
+			pingPongRenderTarget,
+			cubeUVRenderTarget,
+			lodOut,
+			lodOut,
+			sigma,
+			'longitudinal',
+			poleAxis );
+
+	}
+
+	_halfBlur( targetIn, targetOut, lodIn, lodOut, sigmaRadians, direction, poleAxis ) {
+
+		const renderer = this._renderer;
+		const blurMaterial = this._blurMaterial;
+
+		if ( direction !== 'latitudinal' && direction !== 'longitudinal' ) {
+
+			console.error(
+				'blur direction must be either latitudinal or longitudinal!' );
+
+		}
+
+		// Number of standard deviations at which to cut off the discrete approximation.
+		const STANDARD_DEVIATIONS = 3;
+
+		const blurMesh = new Mesh( _lodPlanes[ lodOut ], blurMaterial );
+		const blurUniforms = blurMaterial.uniforms;
+
+		const pixels = _sizeLods[ lodIn ] - 1;
+		const radiansPerPixel = isFinite( sigmaRadians ) ? Math.PI / ( 2 * pixels ) : 2 * Math.PI / ( 2 * MAX_SAMPLES - 1 );
+		const sigmaPixels = sigmaRadians / radiansPerPixel;
+		const samples = isFinite( sigmaRadians ) ? 1 + Math.floor( STANDARD_DEVIATIONS * sigmaPixels ) : MAX_SAMPLES;
+
+		if ( samples > MAX_SAMPLES ) {
+
+			console.warn( `sigmaRadians, ${
+				sigmaRadians}, is too large and will clip, as it requested ${
+				samples} samples when the maximum is set to ${MAX_SAMPLES}` );
+
+		}
+
+		const weights = [];
+		let sum = 0;
+
+		for ( let i = 0; i < MAX_SAMPLES; ++ i ) {
+
+			const x = i / sigmaPixels;
+			const weight = Math.exp( - x * x / 2 );
+			weights.push( weight );
+
+			if ( i === 0 ) {
+
+				sum += weight;
+
+			} else if ( i < samples ) {
+
+				sum += 2 * weight;
+
+			}
+
+		}
+
+		for ( let i = 0; i < weights.length; i ++ ) {
+
+			weights[ i ] = weights[ i ] / sum;
+
+		}
+
+		blurUniforms[ 'envMap' ].value = targetIn.texture;
+		blurUniforms[ 'samples' ].value = samples;
+		blurUniforms[ 'weights' ].value = weights;
+		blurUniforms[ 'latitudinal' ].value = direction === 'latitudinal';
+
+		if ( poleAxis ) {
+
+			blurUniforms[ 'poleAxis' ].value = poleAxis;
+
+		}
+
+		blurUniforms[ 'dTheta' ].value = radiansPerPixel;
+		blurUniforms[ 'mipInt' ].value = LOD_MAX - lodIn;
+
+		const outputSize = _sizeLods[ lodOut ];
+		const x = 3 * Math.max( 0, SIZE_MAX - 2 * outputSize );
+		const y = ( lodOut === 0 ? 0 : 2 * SIZE_MAX ) + 2 * outputSize * ( lodOut > LOD_MAX - LOD_MIN ? lodOut - LOD_MAX + LOD_MIN : 0 );
+
+		_setViewport( targetOut, x, y, 3 * outputSize, 2 * outputSize );
+		renderer.setRenderTarget( targetOut );
+		renderer.render( blurMesh, _flatCamera );
+
+	}
+
+}
+
+function _createPlanes() {
+
+	const _lodPlanes = [];
+	const _sizeLods = [];
+	const _sigmas = [];
+
+	let lod = LOD_MAX;
+
+	for ( let i = 0; i < TOTAL_LODS; i ++ ) {
+
+		const sizeLod = Math.pow( 2, lod );
+		_sizeLods.push( sizeLod );
+		let sigma = 1.0 / sizeLod;
+
+		if ( i > LOD_MAX - LOD_MIN ) {
+
+			sigma = EXTRA_LOD_SIGMA[ i - LOD_MAX + LOD_MIN - 1 ];
+
+		} else if ( i === 0 ) {
+
+			sigma = 0;
+
+		}
+
+		_sigmas.push( sigma );
+
+		const texelSize = 1.0 / ( sizeLod - 1 );
+		const min = - texelSize / 2;
+		const max = 1 + texelSize / 2;
+		const uv1 = [ min, min, max, min, max, max, min, min, max, max, min, max ];
+
+		const cubeFaces = 6;
+		const vertices = 6;
+		const positionSize = 3;
+		const uvSize = 2;
+		const faceIndexSize = 1;
+
+		const position = new Float32Array( positionSize * vertices * cubeFaces );
+		const uv = new Float32Array( uvSize * vertices * cubeFaces );
+		const faceIndex = new Float32Array( faceIndexSize * vertices * cubeFaces );
+
+		for ( let face = 0; face < cubeFaces; face ++ ) {
+
+			const x = ( face % 3 ) * 2 / 3 - 1;
+			const y = face > 2 ? 0 : - 1;
+			const coordinates = [
+				x, y, 0,
+				x + 2 / 3, y, 0,
+				x + 2 / 3, y + 1, 0,
+				x, y, 0,
+				x + 2 / 3, y + 1, 0,
+				x, y + 1, 0
+			];
+			position.set( coordinates, positionSize * vertices * face );
+			uv.set( uv1, uvSize * vertices * face );
+			const fill = [ face, face, face, face, face, face ];
+			faceIndex.set( fill, faceIndexSize * vertices * face );
+
+		}
+
+		const planes = new BufferGeometry();
+		planes.setAttribute( 'position', new BufferAttribute( position, positionSize ) );
+		planes.setAttribute( 'uv', new BufferAttribute( uv, uvSize ) );
+		planes.setAttribute( 'faceIndex', new BufferAttribute( faceIndex, faceIndexSize ) );
+		_lodPlanes.push( planes );
+
+		if ( lod > LOD_MIN ) {
+
+			lod --;
+
+		}
+
+	}
+
+	return { _lodPlanes, _sizeLods, _sigmas };
+
+}
+
+function _createRenderTarget( params ) {
+
+	const cubeUVRenderTarget = new WebGLRenderTarget( 3 * SIZE_MAX, 3 * SIZE_MAX, params );
+	cubeUVRenderTarget.texture.mapping = CubeUVReflectionMapping;
+	cubeUVRenderTarget.texture.name = 'PMREM.cubeUv';
+	cubeUVRenderTarget.scissorTest = true;
+	return cubeUVRenderTarget;
+
+}
+
+function _setViewport( target, x, y, width, height ) {
+
+	target.viewport.set( x, y, width, height );
+	target.scissor.set( x, y, width, height );
+
+}
+
+function _getBlurShader( maxSamples ) {
+
+	const weights = new Float32Array( maxSamples );
+	const poleAxis = new Vector3( 0, 1, 0 );
+	const shaderMaterial = new RawShaderMaterial( {
+
+		name: 'SphericalGaussianBlur',
+
+		defines: { 'n': maxSamples },
+
+		uniforms: {
+			'envMap': { value: null },
+			'samples': { value: 1 },
+			'weights': { value: weights },
+			'latitudinal': { value: false },
+			'dTheta': { value: 0 },
+			'mipInt': { value: 0 },
+			'poleAxis': { value: poleAxis }
+		},
+
+		vertexShader: _getCommonVertexShader(),
+
+		fragmentShader: /* glsl */`
+
+			precision mediump float;
+			precision mediump int;
+
+			varying vec3 vOutputDirection;
+
+			uniform sampler2D envMap;
+			uniform int samples;
+			uniform float weights[ n ];
+			uniform bool latitudinal;
+			uniform float dTheta;
+			uniform float mipInt;
+			uniform vec3 poleAxis;
+
+			#define ENVMAP_TYPE_CUBE_UV
+			#include <cube_uv_reflection_fragment>
+
+			vec3 getSample( float theta, vec3 axis ) {
+
+				float cosTheta = cos( theta );
+				// Rodrigues' axis-angle rotation
+				vec3 sampleDirection = vOutputDirection * cosTheta
+					+ cross( axis, vOutputDirection ) * sin( theta )
+					+ axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );
+
+				return bilinearCubeUV( envMap, sampleDirection, mipInt );
+
+			}
+
+			void main() {
+
+				vec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );
+
+				if ( all( equal( axis, vec3( 0.0 ) ) ) ) {
+
+					axis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );
+
+				}
+
+				axis = normalize( axis );
+
+				gl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );
+				gl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );
+
+				for ( int i = 1; i < n; i++ ) {
+
+					if ( i >= samples ) {
+
+						break;
+
+					}
+
+					float theta = dTheta * float( i );
+					gl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );
+					gl_FragColor.rgb += weights[ i ] * getSample( theta, axis );
+
+				}
+
+			}
+		`,
+
+		blending: NoBlending,
+		depthTest: false,
+		depthWrite: false
+
+	} );
+
+	return shaderMaterial;
+
+}
+
+function _getEquirectShader() {
+
+	const texelSize = new Vector2( 1, 1 );
+	const shaderMaterial = new RawShaderMaterial( {
+
+		name: 'EquirectangularToCubeUV',
+
+		uniforms: {
+			'envMap': { value: null },
+			'texelSize': { value: texelSize }
+		},
+
+		vertexShader: _getCommonVertexShader(),
+
+		fragmentShader: /* glsl */`
+
+			precision mediump float;
+			precision mediump int;
+
+			varying vec3 vOutputDirection;
+
+			uniform sampler2D envMap;
+			uniform vec2 texelSize;
+
+			#include <common>
+
+			void main() {
+
+				gl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );
+
+				vec3 outputDirection = normalize( vOutputDirection );
+				vec2 uv = equirectUv( outputDirection );
+
+				vec2 f = fract( uv / texelSize - 0.5 );
+				uv -= f * texelSize;
+				vec3 tl = texture2D ( envMap, uv ).rgb;
+				uv.x += texelSize.x;
+				vec3 tr = texture2D ( envMap, uv ).rgb;
+				uv.y += texelSize.y;
+				vec3 br = texture2D ( envMap, uv ).rgb;
+				uv.x -= texelSize.x;
+				vec3 bl = texture2D ( envMap, uv ).rgb;
+
+				vec3 tm = mix( tl, tr, f.x );
+				vec3 bm = mix( bl, br, f.x );
+				gl_FragColor.rgb = mix( tm, bm, f.y );
+
+			}
+		`,
+
+		blending: NoBlending,
+		depthTest: false,
+		depthWrite: false
+
+	} );
+
+	return shaderMaterial;
+
+}
+
+function _getCubemapShader() {
+
+	const shaderMaterial = new RawShaderMaterial( {
+
+		name: 'CubemapToCubeUV',
+
+		uniforms: {
+			'envMap': { value: null },
+			'flipEnvMap': { value: - 1 }
+		},
+
+		vertexShader: _getCommonVertexShader(),
+
+		fragmentShader: /* glsl */`
+
+			precision mediump float;
+			precision mediump int;
+
+			uniform float flipEnvMap;
+
+			varying vec3 vOutputDirection;
+
+			uniform samplerCube envMap;
+
+			void main() {
+
+				gl_FragColor = textureCube( envMap, vec3( flipEnvMap * vOutputDirection.x, vOutputDirection.yz ) );
+
+			}
+		`,
+
+		blending: NoBlending,
+		depthTest: false,
+		depthWrite: false
+
+	} );
+
+	return shaderMaterial;
+
+}
+
+function _getCommonVertexShader() {
+
+	return /* glsl */`
+
+		precision mediump float;
+		precision mediump int;
+
+		attribute vec3 position;
+		attribute vec2 uv;
+		attribute float faceIndex;
+
+		varying vec3 vOutputDirection;
+
+		// RH coordinate system; PMREM face-indexing convention
+		vec3 getDirection( vec2 uv, float face ) {
+
+			uv = 2.0 * uv - 1.0;
+
+			vec3 direction = vec3( uv, 1.0 );
+
+			if ( face == 0.0 ) {
+
+				direction = direction.zyx; // ( 1, v, u ) pos x
+
+			} else if ( face == 1.0 ) {
+
+				direction = direction.xzy;
+				direction.xz *= -1.0; // ( -u, 1, -v ) pos y
+
+			} else if ( face == 2.0 ) {
+
+				direction.x *= -1.0; // ( -u, v, 1 ) pos z
+
+			} else if ( face == 3.0 ) {
+
+				direction = direction.zyx;
+				direction.xz *= -1.0; // ( -1, v, -u ) neg x
+
+			} else if ( face == 4.0 ) {
+
+				direction = direction.xzy;
+				direction.xy *= -1.0; // ( -u, -1, v ) neg y
+
+			} else if ( face == 5.0 ) {
+
+				direction.z *= -1.0; // ( u, v, -1 ) neg z
+
+			}
+
+			return direction;
+
+		}
+
+		void main() {
+
+			vOutputDirection = getDirection( uv, faceIndex );
+			gl_Position = vec4( position, 1.0 );
+
+		}
+	`;
+
+}
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/webgl/WebGLCubeUVMaps.js
+
+
+
+function WebGLCubeUVMaps( renderer ) {
+
+	let cubeUVmaps = new WeakMap();
+
+	let pmremGenerator = null;
+
+	function get( texture ) {
+
+		if ( texture && texture.isTexture ) {
+
+			const mapping = texture.mapping;
+
+			const isEquirectMap = ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping );
+			const isCubeMap = ( mapping === CubeReflectionMapping || mapping === CubeRefractionMapping );
+
+			// equirect/cube map to cubeUV conversion
+
+			if ( isEquirectMap || isCubeMap ) {
+
+				if ( texture.isRenderTargetTexture && texture.needsPMREMUpdate === true ) {
+
+					texture.needsPMREMUpdate = false;
+
+					let renderTarget = cubeUVmaps.get( texture );
+
+					if ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer );
+
+					renderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture, renderTarget ) : pmremGenerator.fromCubemap( texture, renderTarget );
+					cubeUVmaps.set( texture, renderTarget );
+
+					return renderTarget.texture;
+
+				} else {
+
+					if ( cubeUVmaps.has( texture ) ) {
+
+						return cubeUVmaps.get( texture ).texture;
+
+					} else {
+
+						const image = texture.image;
+
+						if ( ( isEquirectMap && image && image.height > 0 ) || ( isCubeMap && image && isCubeTextureComplete( image ) ) ) {
+
+							if ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer );
+
+							const renderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture ) : pmremGenerator.fromCubemap( texture );
+							cubeUVmaps.set( texture, renderTarget );
+
+							texture.addEventListener( 'dispose', onTextureDispose );
+
+							return renderTarget.texture;
+
+						} else {
+
+							// image not yet ready. try the conversion next frame
+
+							return null;
+
+						}
+
+					}
+
+				}
+
+			}
+
+		}
+
+		return texture;
+
+	}
+
+	function isCubeTextureComplete( image ) {
+
+		let count = 0;
+		const length = 6;
+
+		for ( let i = 0; i < length; i ++ ) {
+
+			if ( image[ i ] !== undefined ) count ++;
+
+		}
+
+		return count === length;
+
+
+	}
+
+	function onTextureDispose( event ) {
+
+		const texture = event.target;
+
+		texture.removeEventListener( 'dispose', onTextureDispose );
+
+		const cubemapUV = cubeUVmaps.get( texture );
+
+		if ( cubemapUV !== undefined ) {
+
+			cubeUVmaps.delete( texture );
+			cubemapUV.dispose();
+
+		}
+
+	}
+
+	function dispose() {
+
+		cubeUVmaps = new WeakMap();
+
+		if ( pmremGenerator !== null ) {
+
+			pmremGenerator.dispose();
+			pmremGenerator = null;
+
+		}
+
+	}
+
+	return {
+		get: get,
+		dispose: dispose
+	};
+
+}
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/webgl/WebGLExtensions.js
+function WebGLExtensions( gl ) {
+
+	const extensions = {};
+
+	function getExtension( name ) {
+
+		if ( extensions[ name ] !== undefined ) {
+
+			return extensions[ name ];
+
+		}
+
+		let extension;
+
+		switch ( name ) {
+
+			case 'WEBGL_depth_texture':
+				extension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' );
+				break;
+
+			case 'EXT_texture_filter_anisotropic':
+				extension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' );
+				break;
+
+			case 'WEBGL_compressed_texture_s3tc':
+				extension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' );
+				break;
+
+			case 'WEBGL_compressed_texture_pvrtc':
+				extension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' );
+				break;
+
+			default:
+				extension = gl.getExtension( name );
+
+		}
+
+		extensions[ name ] = extension;
+
+		return extension;
+
+	}
+
+	return {
+
+		has: function ( name ) {
+
+			return getExtension( name ) !== null;
+
+		},
+
+		init: function ( capabilities ) {
+
+			if ( capabilities.isWebGL2 ) {
+
+				getExtension( 'EXT_color_buffer_float' );
+
+			} else {
+
+				getExtension( 'WEBGL_depth_texture' );
+				getExtension( 'OES_texture_float' );
+				getExtension( 'OES_texture_half_float' );
+				getExtension( 'OES_texture_half_float_linear' );
+				getExtension( 'OES_standard_derivatives' );
+				getExtension( 'OES_element_index_uint' );
+				getExtension( 'OES_vertex_array_object' );
+				getExtension( 'ANGLE_instanced_arrays' );
+
+			}
+
+			getExtension( 'OES_texture_float_linear' );
+			getExtension( 'EXT_color_buffer_half_float' );
+			getExtension( 'WEBGL_multisampled_render_to_texture' );
+
+		},
+
+		get: function ( name ) {
+
+			const extension = getExtension( name );
+
+			if ( extension === null ) {
+
+				console.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' );
+
+			}
+
+			return extension;
+
+		}
+
+	};
+
+}
+
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/webgl/WebGLGeometries.js
+
+
+
+function WebGLGeometries( gl, attributes, info, bindingStates ) {
+
+	const geometries = {};
+	const wireframeAttributes = new WeakMap();
+
+	function onGeometryDispose( event ) {
+
+		const geometry = event.target;
+
+		if ( geometry.index !== null ) {
+
+			attributes.remove( geometry.index );
+
+		}
+
+		for ( const name in geometry.attributes ) {
+
+			attributes.remove( geometry.attributes[ name ] );
+
+		}
+
+		geometry.removeEventListener( 'dispose', onGeometryDispose );
+
+		delete geometries[ geometry.id ];
+
+		const attribute = wireframeAttributes.get( geometry );
+
+		if ( attribute ) {
+
+			attributes.remove( attribute );
+			wireframeAttributes.delete( geometry );
+
+		}
+
+		bindingStates.releaseStatesOfGeometry( geometry );
+
+		if ( geometry.isInstancedBufferGeometry === true ) {
+
+			delete geometry._maxInstanceCount;
+
+		}
+
+		//
+
+		info.memory.geometries --;
+
+	}
+
+	function get( object, geometry ) {
+
+		if ( geometries[ geometry.id ] === true ) return geometry;
+
+		geometry.addEventListener( 'dispose', onGeometryDispose );
+
+		geometries[ geometry.id ] = true;
+
+		info.memory.geometries ++;
+
+		return geometry;
+
+	}
+
+	function update( geometry ) {
+
+		const geometryAttributes = geometry.attributes;
+
+		// Updating index buffer in VAO now. See WebGLBindingStates.
+
+		for ( const name in geometryAttributes ) {
+
+			attributes.update( geometryAttributes[ name ], gl.ARRAY_BUFFER );
+
+		}
+
+		// morph targets
+
+		const morphAttributes = geometry.morphAttributes;
+
+		for ( const name in morphAttributes ) {
+
+			const array = morphAttributes[ name ];
+
+			for ( let i = 0, l = array.length; i < l; i ++ ) {
+
+				attributes.update( array[ i ], gl.ARRAY_BUFFER );
+
+			}
+
+		}
+
+	}
+
+	function updateWireframeAttribute( geometry ) {
+
+		const indices = [];
+
+		const geometryIndex = geometry.index;
+		const geometryPosition = geometry.attributes.position;
+		let version = 0;
+
+		if ( geometryIndex !== null ) {
+
+			const array = geometryIndex.array;
+			version = geometryIndex.version;
+
+			for ( let i = 0, l = array.length; i < l; i += 3 ) {
+
+				const a = array[ i + 0 ];
+				const b = array[ i + 1 ];
+				const c = array[ i + 2 ];
+
+				indices.push( a, b, b, c, c, a );
+
+			}
+
+		} else {
+
+			const array = geometryPosition.array;
+			version = geometryPosition.version;
+
+			for ( let i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) {
+
+				const a = i + 0;
+				const b = i + 1;
+				const c = i + 2;
+
+				indices.push( a, b, b, c, c, a );
+
+			}
+
+		}
+
+		const attribute = new ( arrayNeedsUint32( indices ) ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 );
+		attribute.version = version;
+
+		// Updating index buffer in VAO now. See WebGLBindingStates
+
+		//
+
+		const previousAttribute = wireframeAttributes.get( geometry );
+
+		if ( previousAttribute ) attributes.remove( previousAttribute );
+
+		//
+
+		wireframeAttributes.set( geometry, attribute );
+
+	}
+
+	function getWireframeAttribute( geometry ) {
+
+		const currentAttribute = wireframeAttributes.get( geometry );
+
+		if ( currentAttribute ) {
+
+			const geometryIndex = geometry.index;
+
+			if ( geometryIndex !== null ) {
+
+				// if the attribute is obsolete, create a new one
+
+				if ( currentAttribute.version < geometryIndex.version ) {
+
+					updateWireframeAttribute( geometry );
+
+				}
+
+			}
+
+		} else {
+
+			updateWireframeAttribute( geometry );
+
+		}
+
+		return wireframeAttributes.get( geometry );
+
+	}
+
+	return {
+
+		get: get,
+		update: update,
+
+		getWireframeAttribute: getWireframeAttribute
+
+	};
+
+}
+
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/webgl/WebGLIndexedBufferRenderer.js
+function WebGLIndexedBufferRenderer( gl, extensions, info, capabilities ) {
+
+	const isWebGL2 = capabilities.isWebGL2;
+
+	let mode;
+
+	function setMode( value ) {
+
+		mode = value;
+
+	}
+
+	let type, bytesPerElement;
+
+	function setIndex( value ) {
+
+		type = value.type;
+		bytesPerElement = value.bytesPerElement;
+
+	}
+
+	function render( start, count ) {
+
+		gl.drawElements( mode, count, type, start * bytesPerElement );
+
+		info.update( count, mode, 1 );
+
+	}
+
+	function renderInstances( start, count, primcount ) {
+
+		if ( primcount === 0 ) return;
+
+		let extension, methodName;
+
+		if ( isWebGL2 ) {
+
+			extension = gl;
+			methodName = 'drawElementsInstanced';
+
+		} else {
+
+			extension = extensions.get( 'ANGLE_instanced_arrays' );
+			methodName = 'drawElementsInstancedANGLE';
+
+			if ( extension === null ) {
+
+				console.error( 'THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );
+				return;
+
+			}
+
+		}
+
+		extension[ methodName ]( mode, count, type, start * bytesPerElement, primcount );
+
+		info.update( count, mode, primcount );
+
+	}
+
+	//
+
+	this.setMode = setMode;
+	this.setIndex = setIndex;
+	this.render = render;
+	this.renderInstances = renderInstances;
+
+}
+
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/webgl/WebGLInfo.js
+function WebGLInfo( gl ) {
+
+	const memory = {
+		geometries: 0,
+		textures: 0
+	};
+
+	const render = {
+		frame: 0,
+		calls: 0,
+		triangles: 0,
+		points: 0,
+		lines: 0
+	};
+
+	function update( count, mode, instanceCount ) {
+
+		render.calls ++;
+
+		switch ( mode ) {
+
+			case gl.TRIANGLES:
+				render.triangles += instanceCount * ( count / 3 );
+				break;
+
+			case gl.LINES:
+				render.lines += instanceCount * ( count / 2 );
+				break;
+
+			case gl.LINE_STRIP:
+				render.lines += instanceCount * ( count - 1 );
+				break;
+
+			case gl.LINE_LOOP:
+				render.lines += instanceCount * count;
+				break;
+
+			case gl.POINTS:
+				render.points += instanceCount * count;
+				break;
+
+			default:
+				console.error( 'THREE.WebGLInfo: Unknown draw mode:', mode );
+				break;
+
+		}
+
+	}
+
+	function reset() {
+
+		render.frame ++;
+		render.calls = 0;
+		render.triangles = 0;
+		render.points = 0;
+		render.lines = 0;
+
+	}
+
+	return {
+		memory: memory,
+		render: render,
+		programs: null,
+		autoReset: true,
+		reset: reset,
+		update: update
+	};
+
+}
+
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/textures/DataTexture2DArray.js
+
+
+
+class DataTexture2DArray extends Texture {
+
+	constructor( data = null, width = 1, height = 1, depth = 1 ) {
+
+		super( null );
+
+		this.image = { data, width, height, depth };
+
+		this.magFilter = NearestFilter;
+		this.minFilter = NearestFilter;
+
+		this.wrapR = ClampToEdgeWrapping;
+
+		this.generateMipmaps = false;
+		this.flipY = false;
+		this.unpackAlignment = 1;
+
+	}
+
+}
+
+DataTexture2DArray.prototype.isDataTexture2DArray = true;
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/webgl/WebGLMorphtargets.js
+
+
+
+
+
+function numericalSort( a, b ) {
+
+	return a[ 0 ] - b[ 0 ];
+
+}
+
+function absNumericalSort( a, b ) {
+
+	return Math.abs( b[ 1 ] ) - Math.abs( a[ 1 ] );
+
+}
+
+function denormalize( morph, attribute ) {
+
+	let denominator = 1;
+	const array = attribute.isInterleavedBufferAttribute ? attribute.data.array : attribute.array;
+
+	if ( array instanceof Int8Array ) denominator = 127;
+	else if ( array instanceof Int16Array ) denominator = 32767;
+	else if ( array instanceof Int32Array ) denominator = 2147483647;
+	else console.error( 'THREE.WebGLMorphtargets: Unsupported morph attribute data type: ', array );
+
+	morph.divideScalar( denominator );
+
+}
+
+function WebGLMorphtargets( gl, capabilities, textures ) {
+
+	const influencesList = {};
+	const morphInfluences = new Float32Array( 8 );
+	const morphTextures = new WeakMap();
+	const morph = new Vector3();
+
+	const workInfluences = [];
+
+	for ( let i = 0; i < 8; i ++ ) {
+
+		workInfluences[ i ] = [ i, 0 ];
+
+	}
+
+	function update( object, geometry, material, program ) {
+
+		const objectInfluences = object.morphTargetInfluences;
+
+		if ( capabilities.isWebGL2 === true ) {
+
+			// instead of using attributes, the WebGL 2 code path encodes morph targets
+			// into an array of data textures. Each layer represents a single morph target.
+
+			const numberOfMorphTargets = geometry.morphAttributes.position.length;
+
+			let entry = morphTextures.get( geometry );
+
+			if ( entry === undefined || entry.count !== numberOfMorphTargets ) {
+
+				if ( entry !== undefined ) entry.texture.dispose();
+
+				const hasMorphNormals = geometry.morphAttributes.normal !== undefined;
+
+				const morphTargets = geometry.morphAttributes.position;
+				const morphNormals = geometry.morphAttributes.normal || [];
+
+				const numberOfVertices = geometry.attributes.position.count;
+				const numberOfVertexData = ( hasMorphNormals === true ) ? 2 : 1; // (v,n) vs. (v)
+
+				let width = numberOfVertices * numberOfVertexData;
+				let height = 1;
+
+				if ( width > capabilities.maxTextureSize ) {
+
+					height = Math.ceil( width / capabilities.maxTextureSize );
+					width = capabilities.maxTextureSize;
+
+				}
+
+				const buffer = new Float32Array( width * height * 4 * numberOfMorphTargets );
+
+				const texture = new DataTexture2DArray( buffer, width, height, numberOfMorphTargets );
+				texture.format = RGBAFormat; // using RGBA since RGB might be emulated (and is thus slower)
+				texture.type = FloatType;
+				texture.needsUpdate = true;
+
+				// fill buffer
+
+				const vertexDataStride = numberOfVertexData * 4;
+
+				for ( let i = 0; i < numberOfMorphTargets; i ++ ) {
+
+					const morphTarget = morphTargets[ i ];
+					const morphNormal = morphNormals[ i ];
+
+					const offset = width * height * 4 * i;
+
+					for ( let j = 0; j < morphTarget.count; j ++ ) {
+
+						morph.fromBufferAttribute( morphTarget, j );
+
+						if ( morphTarget.normalized === true ) denormalize( morph, morphTarget );
+
+						const stride = j * vertexDataStride;
+
+						buffer[ offset + stride + 0 ] = morph.x;
+						buffer[ offset + stride + 1 ] = morph.y;
+						buffer[ offset + stride + 2 ] = morph.z;
+						buffer[ offset + stride + 3 ] = 0;
+
+						if ( hasMorphNormals === true ) {
+
+							morph.fromBufferAttribute( morphNormal, j );
+
+							if ( morphNormal.normalized === true ) denormalize( morph, morphNormal );
+
+							buffer[ offset + stride + 4 ] = morph.x;
+							buffer[ offset + stride + 5 ] = morph.y;
+							buffer[ offset + stride + 6 ] = morph.z;
+							buffer[ offset + stride + 7 ] = 0;
+
+						}
+
+					}
+
+				}
+
+				entry = {
+					count: numberOfMorphTargets,
+					texture: texture,
+					size: new Vector2( width, height )
+				};
+
+				morphTextures.set( geometry, entry );
+
+				function disposeTexture() {
+
+					texture.dispose();
+
+					morphTextures.delete( geometry );
+
+					geometry.removeEventListener( 'dispose', disposeTexture );
+
+				}
+
+				geometry.addEventListener( 'dispose', disposeTexture );
+
+			}
+
+			//
+
+			let morphInfluencesSum = 0;
+
+			for ( let i = 0; i < objectInfluences.length; i ++ ) {
+
+				morphInfluencesSum += objectInfluences[ i ];
+
+			}
+
+			const morphBaseInfluence = geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum;
+
+			program.getUniforms().setValue( gl, 'morphTargetBaseInfluence', morphBaseInfluence );
+			program.getUniforms().setValue( gl, 'morphTargetInfluences', objectInfluences );
+
+			program.getUniforms().setValue( gl, 'morphTargetsTexture', entry.texture, textures );
+			program.getUniforms().setValue( gl, 'morphTargetsTextureSize', entry.size );
+
+
+		} else {
+
+			// When object doesn't have morph target influences defined, we treat it as a 0-length array
+			// This is important to make sure we set up morphTargetBaseInfluence / morphTargetInfluences
+
+			const length = objectInfluences === undefined ? 0 : objectInfluences.length;
+
+			let influences = influencesList[ geometry.id ];
+
+			if ( influences === undefined || influences.length !== length ) {
+
+				// initialise list
+
+				influences = [];
+
+				for ( let i = 0; i < length; i ++ ) {
+
+					influences[ i ] = [ i, 0 ];
+
+				}
+
+				influencesList[ geometry.id ] = influences;
+
+			}
+
+			// Collect influences
+
+			for ( let i = 0; i < length; i ++ ) {
+
+				const influence = influences[ i ];
+
+				influence[ 0 ] = i;
+				influence[ 1 ] = objectInfluences[ i ];
+
+			}
+
+			influences.sort( absNumericalSort );
+
+			for ( let i = 0; i < 8; i ++ ) {
+
+				if ( i < length && influences[ i ][ 1 ] ) {
+
+					workInfluences[ i ][ 0 ] = influences[ i ][ 0 ];
+					workInfluences[ i ][ 1 ] = influences[ i ][ 1 ];
+
+				} else {
+
+					workInfluences[ i ][ 0 ] = Number.MAX_SAFE_INTEGER;
+					workInfluences[ i ][ 1 ] = 0;
+
+				}
+
+			}
+
+			workInfluences.sort( numericalSort );
+
+			const morphTargets = geometry.morphAttributes.position;
+			const morphNormals = geometry.morphAttributes.normal;
+
+			let morphInfluencesSum = 0;
+
+			for ( let i = 0; i < 8; i ++ ) {
+
+				const influence = workInfluences[ i ];
+				const index = influence[ 0 ];
+				const value = influence[ 1 ];
+
+				if ( index !== Number.MAX_SAFE_INTEGER && value ) {
+
+					if ( morphTargets && geometry.getAttribute( 'morphTarget' + i ) !== morphTargets[ index ] ) {
+
+						geometry.setAttribute( 'morphTarget' + i, morphTargets[ index ] );
+
+					}
+
+					if ( morphNormals && geometry.getAttribute( 'morphNormal' + i ) !== morphNormals[ index ] ) {
+
+						geometry.setAttribute( 'morphNormal' + i, morphNormals[ index ] );
+
+					}
+
+					morphInfluences[ i ] = value;
+					morphInfluencesSum += value;
+
+				} else {
+
+					if ( morphTargets && geometry.hasAttribute( 'morphTarget' + i ) === true ) {
+
+						geometry.deleteAttribute( 'morphTarget' + i );
+
+					}
+
+					if ( morphNormals && geometry.hasAttribute( 'morphNormal' + i ) === true ) {
+
+						geometry.deleteAttribute( 'morphNormal' + i );
+
+					}
+
+					morphInfluences[ i ] = 0;
+
+				}
+
+			}
+
+			// GLSL shader uses formula baseinfluence * base + sum(target * influence)
+			// This allows us to switch between absolute morphs and relative morphs without changing shader code
+			// When baseinfluence = 1 - sum(influence), the above is equivalent to sum((target - base) * influence)
+			const morphBaseInfluence = geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum;
+
+			program.getUniforms().setValue( gl, 'morphTargetBaseInfluence', morphBaseInfluence );
+			program.getUniforms().setValue( gl, 'morphTargetInfluences', morphInfluences );
+
+		}
+
+	}
+
+	return {
+
+		update: update
+
+	};
+
+}
+
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/WebGLMultisampleRenderTarget.js
+
+
+class WebGLMultisampleRenderTarget extends WebGLRenderTarget {
+
+	constructor( width, height, options = {} ) {
+
+		super( width, height, options );
+
+		this.samples = 4;
+
+		this.ignoreDepthForMultisampleCopy = options.ignoreDepth !== undefined ? options.ignoreDepth : true;
+		this.useRenderToTexture = ( options.useRenderToTexture !== undefined ) ? options.useRenderToTexture : false;
+		this.useRenderbuffer = this.useRenderToTexture === false;
+
+	}
+
+	copy( source ) {
+
+		super.copy.call( this, source );
+
+		this.samples = source.samples;
+		this.useRenderToTexture = source.useRenderToTexture;
+		this.useRenderbuffer = source.useRenderbuffer;
+
+		return this;
+
+	}
+
+}
+
+WebGLMultisampleRenderTarget.prototype.isWebGLMultisampleRenderTarget = true;
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/webgl/WebGLObjects.js
+function WebGLObjects( gl, geometries, attributes, info ) {
+
+	let updateMap = new WeakMap();
+
+	function update( object ) {
+
+		const frame = info.render.frame;
+
+		const geometry = object.geometry;
+		const buffergeometry = geometries.get( object, geometry );
+
+		// Update once per frame
+
+		if ( updateMap.get( buffergeometry ) !== frame ) {
+
+			geometries.update( buffergeometry );
+
+			updateMap.set( buffergeometry, frame );
+
+		}
+
+		if ( object.isInstancedMesh ) {
+
+			if ( object.hasEventListener( 'dispose', onInstancedMeshDispose ) === false ) {
+
+				object.addEventListener( 'dispose', onInstancedMeshDispose );
+
+			}
+
+			attributes.update( object.instanceMatrix, gl.ARRAY_BUFFER );
+
+			if ( object.instanceColor !== null ) {
+
+				attributes.update( object.instanceColor, gl.ARRAY_BUFFER );
+
+			}
+
+		}
+
+		return buffergeometry;
+
+	}
+
+	function dispose() {
+
+		updateMap = new WeakMap();
+
+	}
+
+	function onInstancedMeshDispose( event ) {
+
+		const instancedMesh = event.target;
+
+		instancedMesh.removeEventListener( 'dispose', onInstancedMeshDispose );
+
+		attributes.remove( instancedMesh.instanceMatrix );
+
+		if ( instancedMesh.instanceColor !== null ) attributes.remove( instancedMesh.instanceColor );
+
+	}
+
+	return {
+
+		update: update,
+		dispose: dispose
+
+	};
+
+}
+
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/textures/DataTexture3D.js
+
+
+
+class DataTexture3D extends Texture {
+
+	constructor( data = null, width = 1, height = 1, depth = 1 ) {
+
+		// We're going to add .setXXX() methods for setting properties later.
+		// Users can still set in DataTexture3D directly.
+		//
+		//	const texture = new THREE.DataTexture3D( data, width, height, depth );
+		// 	texture.anisotropy = 16;
+		//
+		// See #14839
+
+		super( null );
+
+		this.image = { data, width, height, depth };
+
+		this.magFilter = NearestFilter;
+		this.minFilter = NearestFilter;
+
+		this.wrapR = ClampToEdgeWrapping;
+
+		this.generateMipmaps = false;
+		this.flipY = false;
+		this.unpackAlignment = 1;
+
+	}
+
+}
+
+DataTexture3D.prototype.isDataTexture3D = true;
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/webgl/WebGLUniforms.js
+/**
+ * Uniforms of a program.
+ * Those form a tree structure with a special top-level container for the root,
+ * which you get by calling 'new WebGLUniforms( gl, program )'.
+ *
+ *
+ * Properties of inner nodes including the top-level container:
+ *
+ * .seq - array of nested uniforms
+ * .map - nested uniforms by name
+ *
+ *
+ * Methods of all nodes except the top-level container:
+ *
+ * .setValue( gl, value, [textures] )
+ *
+ * 		uploads a uniform value(s)
+ *  	the 'textures' parameter is needed for sampler uniforms
+ *
+ *
+ * Static methods of the top-level container (textures factorizations):
+ *
+ * .upload( gl, seq, values, textures )
+ *
+ * 		sets uniforms in 'seq' to 'values[id].value'
+ *
+ * .seqWithValue( seq, values ) : filteredSeq
+ *
+ * 		filters 'seq' entries with corresponding entry in values
+ *
+ *
+ * Methods of the top-level container (textures factorizations):
+ *
+ * .setValue( gl, name, value, textures )
+ *
+ * 		sets uniform with  name 'name' to 'value'
+ *
+ * .setOptional( gl, obj, prop )
+ *
+ * 		like .set for an optional property of the object
+ *
+ */
+
+
+
+
+
+
+const emptyTexture = new Texture();
+const emptyTexture2dArray = new DataTexture2DArray();
+const emptyTexture3d = new DataTexture3D();
+const emptyCubeTexture = new CubeTexture();
+
+// --- Utilities ---
+
+// Array Caches (provide typed arrays for temporary by size)
+
+const arrayCacheF32 = [];
+const arrayCacheI32 = [];
+
+// Float32Array caches used for uploading Matrix uniforms
+
+const mat4array = new Float32Array( 16 );
+const mat3array = new Float32Array( 9 );
+const mat2array = new Float32Array( 4 );
+
+// Flattening for arrays of vectors and matrices
+
+function flatten( array, nBlocks, blockSize ) {
+
+	const firstElem = array[ 0 ];
+
+	if ( firstElem <= 0 || firstElem > 0 ) return array;
+	// unoptimized: ! isNaN( firstElem )
+	// see http://jacksondunstan.com/articles/983
+
+	const n = nBlocks * blockSize;
+	let r = arrayCacheF32[ n ];
+
+	if ( r === undefined ) {
+
+		r = new Float32Array( n );
+		arrayCacheF32[ n ] = r;
+
+	}
+
+	if ( nBlocks !== 0 ) {
+
+		firstElem.toArray( r, 0 );
+
+		for ( let i = 1, offset = 0; i !== nBlocks; ++ i ) {
+
+			offset += blockSize;
+			array[ i ].toArray( r, offset );
+
+		}
+
+	}
+
+	return r;
+
+}
+
+function arraysEqual( a, b ) {
+
+	if ( a.length !== b.length ) return false;
+
+	for ( let i = 0, l = a.length; i < l; i ++ ) {
+
+		if ( a[ i ] !== b[ i ] ) return false;
+
+	}
+
+	return true;
+
+}
+
+function copyArray( a, b ) {
+
+	for ( let i = 0, l = b.length; i < l; i ++ ) {
+
+		a[ i ] = b[ i ];
+
+	}
+
+}
+
+// Texture unit allocation
+
+function allocTexUnits( textures, n ) {
+
+	let r = arrayCacheI32[ n ];
+
+	if ( r === undefined ) {
+
+		r = new Int32Array( n );
+		arrayCacheI32[ n ] = r;
+
+	}
+
+	for ( let i = 0; i !== n; ++ i ) {
+
+		r[ i ] = textures.allocateTextureUnit();
+
+	}
+
+	return r;
+
+}
+
+// --- Setters ---
+
+// Note: Defining these methods externally, because they come in a bunch
+// and this way their names minify.
+
+// Single scalar
+
+function setValueV1f( gl, v ) {
+
+	const cache = this.cache;
+
+	if ( cache[ 0 ] === v ) return;
+
+	gl.uniform1f( this.addr, v );
+
+	cache[ 0 ] = v;
+
+}
+
+// Single float vector (from flat array or THREE.VectorN)
+
+function setValueV2f( gl, v ) {
+
+	const cache = this.cache;
+
+	if ( v.x !== undefined ) {
+
+		if ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {
+
+			gl.uniform2f( this.addr, v.x, v.y );
+
+			cache[ 0 ] = v.x;
+			cache[ 1 ] = v.y;
+
+		}
+
+	} else {
+
+		if ( arraysEqual( cache, v ) ) return;
+
+		gl.uniform2fv( this.addr, v );
+
+		copyArray( cache, v );
+
+	}
+
+}
+
+function setValueV3f( gl, v ) {
+
+	const cache = this.cache;
+
+	if ( v.x !== undefined ) {
+
+		if ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {
+
+			gl.uniform3f( this.addr, v.x, v.y, v.z );
+
+			cache[ 0 ] = v.x;
+			cache[ 1 ] = v.y;
+			cache[ 2 ] = v.z;
+
+		}
+
+	} else if ( v.r !== undefined ) {
+
+		if ( cache[ 0 ] !== v.r || cache[ 1 ] !== v.g || cache[ 2 ] !== v.b ) {
+
+			gl.uniform3f( this.addr, v.r, v.g, v.b );
+
+			cache[ 0 ] = v.r;
+			cache[ 1 ] = v.g;
+			cache[ 2 ] = v.b;
+
+		}
+
+	} else {
+
+		if ( arraysEqual( cache, v ) ) return;
+
+		gl.uniform3fv( this.addr, v );
+
+		copyArray( cache, v );
+
+	}
+
+}
+
+function setValueV4f( gl, v ) {
+
+	const cache = this.cache;
+
+	if ( v.x !== undefined ) {
+
+		if ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {
+
+			gl.uniform4f( this.addr, v.x, v.y, v.z, v.w );
+
+			cache[ 0 ] = v.x;
+			cache[ 1 ] = v.y;
+			cache[ 2 ] = v.z;
+			cache[ 3 ] = v.w;
+
+		}
+
+	} else {
+
+		if ( arraysEqual( cache, v ) ) return;
+
+		gl.uniform4fv( this.addr, v );
+
+		copyArray( cache, v );
+
+	}
+
+}
+
+// Single matrix (from flat array or THREE.MatrixN)
+
+function setValueM2( gl, v ) {
+
+	const cache = this.cache;
+	const elements = v.elements;
+
+	if ( elements === undefined ) {
+
+		if ( arraysEqual( cache, v ) ) return;
+
+		gl.uniformMatrix2fv( this.addr, false, v );
+
+		copyArray( cache, v );
+
+	} else {
+
+		if ( arraysEqual( cache, elements ) ) return;
+
+		mat2array.set( elements );
+
+		gl.uniformMatrix2fv( this.addr, false, mat2array );
+
+		copyArray( cache, elements );
+
+	}
+
+}
+
+function setValueM3( gl, v ) {
+
+	const cache = this.cache;
+	const elements = v.elements;
+
+	if ( elements === undefined ) {
+
+		if ( arraysEqual( cache, v ) ) return;
+
+		gl.uniformMatrix3fv( this.addr, false, v );
+
+		copyArray( cache, v );
+
+	} else {
+
+		if ( arraysEqual( cache, elements ) ) return;
+
+		mat3array.set( elements );
+
+		gl.uniformMatrix3fv( this.addr, false, mat3array );
+
+		copyArray( cache, elements );
+
+	}
+
+}
+
+function setValueM4( gl, v ) {
+
+	const cache = this.cache;
+	const elements = v.elements;
+
+	if ( elements === undefined ) {
+
+		if ( arraysEqual( cache, v ) ) return;
+
+		gl.uniformMatrix4fv( this.addr, false, v );
+
+		copyArray( cache, v );
+
+	} else {
+
+		if ( arraysEqual( cache, elements ) ) return;
+
+		mat4array.set( elements );
+
+		gl.uniformMatrix4fv( this.addr, false, mat4array );
+
+		copyArray( cache, elements );
+
+	}
+
+}
+
+// Single integer / boolean
+
+function setValueV1i( gl, v ) {
+
+	const cache = this.cache;
+
+	if ( cache[ 0 ] === v ) return;
+
+	gl.uniform1i( this.addr, v );
+
+	cache[ 0 ] = v;
+
+}
+
+// Single integer / boolean vector (from flat array)
+
+function setValueV2i( gl, v ) {
+
+	const cache = this.cache;
+
+	if ( arraysEqual( cache, v ) ) return;
+
+	gl.uniform2iv( this.addr, v );
+
+	copyArray( cache, v );
+
+}
+
+function setValueV3i( gl, v ) {
+
+	const cache = this.cache;
+
+	if ( arraysEqual( cache, v ) ) return;
+
+	gl.uniform3iv( this.addr, v );
+
+	copyArray( cache, v );
+
+}
+
+function setValueV4i( gl, v ) {
+
+	const cache = this.cache;
+
+	if ( arraysEqual( cache, v ) ) return;
+
+	gl.uniform4iv( this.addr, v );
+
+	copyArray( cache, v );
+
+}
+
+// Single unsigned integer
+
+function setValueV1ui( gl, v ) {
+
+	const cache = this.cache;
+
+	if ( cache[ 0 ] === v ) return;
+
+	gl.uniform1ui( this.addr, v );
+
+	cache[ 0 ] = v;
+
+}
+
+// Single unsigned integer vector (from flat array)
+
+function setValueV2ui( gl, v ) {
+
+	const cache = this.cache;
+
+	if ( arraysEqual( cache, v ) ) return;
+
+	gl.uniform2uiv( this.addr, v );
+
+	copyArray( cache, v );
+
+}
+
+function setValueV3ui( gl, v ) {
+
+	const cache = this.cache;
+
+	if ( arraysEqual( cache, v ) ) return;
+
+	gl.uniform3uiv( this.addr, v );
+
+	copyArray( cache, v );
+
+}
+
+function setValueV4ui( gl, v ) {
+
+	const cache = this.cache;
+
+	if ( arraysEqual( cache, v ) ) return;
+
+	gl.uniform4uiv( this.addr, v );
+
+	copyArray( cache, v );
+
+}
+
+
+// Single texture (2D / Cube)
+
+function setValueT1( gl, v, textures ) {
+
+	const cache = this.cache;
+	const unit = textures.allocateTextureUnit();
+
+	if ( cache[ 0 ] !== unit ) {
+
+		gl.uniform1i( this.addr, unit );
+		cache[ 0 ] = unit;
+
+	}
+
+	textures.safeSetTexture2D( v || emptyTexture, unit );
+
+}
+
+function setValueT3D1( gl, v, textures ) {
+
+	const cache = this.cache;
+	const unit = textures.allocateTextureUnit();
+
+	if ( cache[ 0 ] !== unit ) {
+
+		gl.uniform1i( this.addr, unit );
+		cache[ 0 ] = unit;
+
+	}
+
+	textures.setTexture3D( v || emptyTexture3d, unit );
+
+}
+
+function setValueT6( gl, v, textures ) {
+
+	const cache = this.cache;
+	const unit = textures.allocateTextureUnit();
+
+	if ( cache[ 0 ] !== unit ) {
+
+		gl.uniform1i( this.addr, unit );
+		cache[ 0 ] = unit;
+
+	}
+
+	textures.safeSetTextureCube( v || emptyCubeTexture, unit );
+
+}
+
+function setValueT2DArray1( gl, v, textures ) {
+
+	const cache = this.cache;
+	const unit = textures.allocateTextureUnit();
+
+	if ( cache[ 0 ] !== unit ) {
+
+		gl.uniform1i( this.addr, unit );
+		cache[ 0 ] = unit;
+
+	}
+
+	textures.setTexture2DArray( v || emptyTexture2dArray, unit );
+
+}
+
+// Helper to pick the right setter for the singular case
+
+function getSingularSetter( type ) {
+
+	switch ( type ) {
+
+		case 0x1406: return setValueV1f; // FLOAT
+		case 0x8b50: return setValueV2f; // _VEC2
+		case 0x8b51: return setValueV3f; // _VEC3
+		case 0x8b52: return setValueV4f; // _VEC4
+
+		case 0x8b5a: return setValueM2; // _MAT2
+		case 0x8b5b: return setValueM3; // _MAT3
+		case 0x8b5c: return setValueM4; // _MAT4
+
+		case 0x1404: case 0x8b56: return setValueV1i; // INT, BOOL
+		case 0x8b53: case 0x8b57: return setValueV2i; // _VEC2
+		case 0x8b54: case 0x8b58: return setValueV3i; // _VEC3
+		case 0x8b55: case 0x8b59: return setValueV4i; // _VEC4
+
+		case 0x1405: return setValueV1ui; // UINT
+		case 0x8dc6: return setValueV2ui; // _VEC2
+		case 0x8dc7: return setValueV3ui; // _VEC3
+		case 0x8dc8: return setValueV4ui; // _VEC4
+
+		case 0x8b5e: // SAMPLER_2D
+		case 0x8d66: // SAMPLER_EXTERNAL_OES
+		case 0x8dca: // INT_SAMPLER_2D
+		case 0x8dd2: // UNSIGNED_INT_SAMPLER_2D
+		case 0x8b62: // SAMPLER_2D_SHADOW
+			return setValueT1;
+
+		case 0x8b5f: // SAMPLER_3D
+		case 0x8dcb: // INT_SAMPLER_3D
+		case 0x8dd3: // UNSIGNED_INT_SAMPLER_3D
+			return setValueT3D1;
+
+		case 0x8b60: // SAMPLER_CUBE
+		case 0x8dcc: // INT_SAMPLER_CUBE
+		case 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE
+		case 0x8dc5: // SAMPLER_CUBE_SHADOW
+			return setValueT6;
+
+		case 0x8dc1: // SAMPLER_2D_ARRAY
+		case 0x8dcf: // INT_SAMPLER_2D_ARRAY
+		case 0x8dd7: // UNSIGNED_INT_SAMPLER_2D_ARRAY
+		case 0x8dc4: // SAMPLER_2D_ARRAY_SHADOW
+			return setValueT2DArray1;
+
+	}
+
+}
+
+
+// Array of scalars
+
+function setValueV1fArray( gl, v ) {
+
+	gl.uniform1fv( this.addr, v );
+
+}
+
+// Array of vectors (from flat array or array of THREE.VectorN)
+
+function setValueV2fArray( gl, v ) {
+
+	const data = flatten( v, this.size, 2 );
+
+	gl.uniform2fv( this.addr, data );
+
+}
+
+function setValueV3fArray( gl, v ) {
+
+	const data = flatten( v, this.size, 3 );
+
+	gl.uniform3fv( this.addr, data );
+
+}
+
+function setValueV4fArray( gl, v ) {
+
+	const data = flatten( v, this.size, 4 );
+
+	gl.uniform4fv( this.addr, data );
+
+}
+
+// Array of matrices (from flat array or array of THREE.MatrixN)
+
+function setValueM2Array( gl, v ) {
+
+	const data = flatten( v, this.size, 4 );
+
+	gl.uniformMatrix2fv( this.addr, false, data );
+
+}
+
+function setValueM3Array( gl, v ) {
+
+	const data = flatten( v, this.size, 9 );
+
+	gl.uniformMatrix3fv( this.addr, false, data );
+
+}
+
+function setValueM4Array( gl, v ) {
+
+	const data = flatten( v, this.size, 16 );
+
+	gl.uniformMatrix4fv( this.addr, false, data );
+
+}
+
+// Array of integer / boolean
+
+function setValueV1iArray( gl, v ) {
+
+	gl.uniform1iv( this.addr, v );
+
+}
+
+// Array of integer / boolean vectors (from flat array)
+
+function setValueV2iArray( gl, v ) {
+
+	gl.uniform2iv( this.addr, v );
+
+}
+
+function setValueV3iArray( gl, v ) {
+
+	gl.uniform3iv( this.addr, v );
+
+}
+
+function setValueV4iArray( gl, v ) {
+
+	gl.uniform4iv( this.addr, v );
+
+}
+
+// Array of unsigned integer
+
+function setValueV1uiArray( gl, v ) {
+
+	gl.uniform1uiv( this.addr, v );
+
+}
+
+// Array of unsigned integer vectors (from flat array)
+
+function setValueV2uiArray( gl, v ) {
+
+	gl.uniform2uiv( this.addr, v );
+
+}
+
+function setValueV3uiArray( gl, v ) {
+
+	gl.uniform3uiv( this.addr, v );
+
+}
+
+function setValueV4uiArray( gl, v ) {
+
+	gl.uniform4uiv( this.addr, v );
+
+}
+
+
+// Array of textures (2D / 3D / Cube / 2DArray)
+
+function setValueT1Array( gl, v, textures ) {
+
+	const n = v.length;
+
+	const units = allocTexUnits( textures, n );
+
+	gl.uniform1iv( this.addr, units );
+
+	for ( let i = 0; i !== n; ++ i ) {
+
+		textures.safeSetTexture2D( v[ i ] || emptyTexture, units[ i ] );
+
+	}
+
+}
+
+function setValueT3DArray( gl, v, textures ) {
+
+	const n = v.length;
+
+	const units = allocTexUnits( textures, n );
+
+	gl.uniform1iv( this.addr, units );
+
+	for ( let i = 0; i !== n; ++ i ) {
+
+		textures.setTexture3D( v[ i ] || emptyTexture3d, units[ i ] );
+
+	}
+
+}
+
+function setValueT6Array( gl, v, textures ) {
+
+	const n = v.length;
+
+	const units = allocTexUnits( textures, n );
+
+	gl.uniform1iv( this.addr, units );
+
+	for ( let i = 0; i !== n; ++ i ) {
+
+		textures.safeSetTextureCube( v[ i ] || emptyCubeTexture, units[ i ] );
+
+	}
+
+}
+
+function setValueT2DArrayArray( gl, v, textures ) {
+
+	const n = v.length;
+
+	const units = allocTexUnits( textures, n );
+
+	gl.uniform1iv( this.addr, units );
+
+	for ( let i = 0; i !== n; ++ i ) {
+
+		textures.setTexture2DArray( v[ i ] || emptyTexture2dArray, units[ i ] );
+
+	}
+
+}
+
+
+// Helper to pick the right setter for a pure (bottom-level) array
+
+function getPureArraySetter( type ) {
+
+	switch ( type ) {
+
+		case 0x1406: return setValueV1fArray; // FLOAT
+		case 0x8b50: return setValueV2fArray; // _VEC2
+		case 0x8b51: return setValueV3fArray; // _VEC3
+		case 0x8b52: return setValueV4fArray; // _VEC4
+
+		case 0x8b5a: return setValueM2Array; // _MAT2
+		case 0x8b5b: return setValueM3Array; // _MAT3
+		case 0x8b5c: return setValueM4Array; // _MAT4
+
+		case 0x1404: case 0x8b56: return setValueV1iArray; // INT, BOOL
+		case 0x8b53: case 0x8b57: return setValueV2iArray; // _VEC2
+		case 0x8b54: case 0x8b58: return setValueV3iArray; // _VEC3
+		case 0x8b55: case 0x8b59: return setValueV4iArray; // _VEC4
+
+		case 0x1405: return setValueV1uiArray; // UINT
+		case 0x8dc6: return setValueV2uiArray; // _VEC2
+		case 0x8dc7: return setValueV3uiArray; // _VEC3
+		case 0x8dc8: return setValueV4uiArray; // _VEC4
+
+		case 0x8b5e: // SAMPLER_2D
+		case 0x8d66: // SAMPLER_EXTERNAL_OES
+		case 0x8dca: // INT_SAMPLER_2D
+		case 0x8dd2: // UNSIGNED_INT_SAMPLER_2D
+		case 0x8b62: // SAMPLER_2D_SHADOW
+			return setValueT1Array;
+
+		case 0x8b5f: // SAMPLER_3D
+		case 0x8dcb: // INT_SAMPLER_3D
+		case 0x8dd3: // UNSIGNED_INT_SAMPLER_3D
+			return setValueT3DArray;
+
+		case 0x8b60: // SAMPLER_CUBE
+		case 0x8dcc: // INT_SAMPLER_CUBE
+		case 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE
+		case 0x8dc5: // SAMPLER_CUBE_SHADOW
+			return setValueT6Array;
+
+		case 0x8dc1: // SAMPLER_2D_ARRAY
+		case 0x8dcf: // INT_SAMPLER_2D_ARRAY
+		case 0x8dd7: // UNSIGNED_INT_SAMPLER_2D_ARRAY
+		case 0x8dc4: // SAMPLER_2D_ARRAY_SHADOW
+			return setValueT2DArrayArray;
+
+	}
+
+}
+
+// --- Uniform Classes ---
+
+function SingleUniform( id, activeInfo, addr ) {
+
+	this.id = id;
+	this.addr = addr;
+	this.cache = [];
+	this.setValue = getSingularSetter( activeInfo.type );
+
+	// this.path = activeInfo.name; // DEBUG
+
+}
+
+function PureArrayUniform( id, activeInfo, addr ) {
+
+	this.id = id;
+	this.addr = addr;
+	this.cache = [];
+	this.size = activeInfo.size;
+	this.setValue = getPureArraySetter( activeInfo.type );
+
+	// this.path = activeInfo.name; // DEBUG
+
+}
+
+PureArrayUniform.prototype.updateCache = function ( data ) {
+
+	const cache = this.cache;
+
+	if ( data instanceof Float32Array && cache.length !== data.length ) {
+
+		this.cache = new Float32Array( data.length );
+
+	}
+
+	copyArray( cache, data );
+
+};
+
+function StructuredUniform( id ) {
+
+	this.id = id;
+
+	this.seq = [];
+	this.map = {};
+
+}
+
+StructuredUniform.prototype.setValue = function ( gl, value, textures ) {
+
+	const seq = this.seq;
+
+	for ( let i = 0, n = seq.length; i !== n; ++ i ) {
+
+		const u = seq[ i ];
+		u.setValue( gl, value[ u.id ], textures );
+
+	}
+
+};
+
+// --- Top-level ---
+
+// Parser - builds up the property tree from the path strings
+
+const RePathPart = /(\w+)(\])?(\[|\.)?/g;
+
+// extracts
+// 	- the identifier (member name or array index)
+//  - followed by an optional right bracket (found when array index)
+//  - followed by an optional left bracket or dot (type of subscript)
+//
+// Note: These portions can be read in a non-overlapping fashion and
+// allow straightforward parsing of the hierarchy that WebGL encodes
+// in the uniform names.
+
+function addUniform( container, uniformObject ) {
+
+	container.seq.push( uniformObject );
+	container.map[ uniformObject.id ] = uniformObject;
+
+}
+
+function parseUniform( activeInfo, addr, container ) {
+
+	const path = activeInfo.name,
+		pathLength = path.length;
+
+	// reset RegExp object, because of the early exit of a previous run
+	RePathPart.lastIndex = 0;
+
+	while ( true ) {
+
+		const match = RePathPart.exec( path ),
+			matchEnd = RePathPart.lastIndex;
+
+		let id = match[ 1 ];
+		const idIsIndex = match[ 2 ] === ']',
+			subscript = match[ 3 ];
+
+		if ( idIsIndex ) id = id | 0; // convert to integer
+
+		if ( subscript === undefined || subscript === '[' && matchEnd + 2 === pathLength ) {
+
+			// bare name or "pure" bottom-level array "[0]" suffix
+
+			addUniform( container, subscript === undefined ?
+				new SingleUniform( id, activeInfo, addr ) :
+				new PureArrayUniform( id, activeInfo, addr ) );
+
+			break;
+
+		} else {
+
+			// step into inner node / create it in case it doesn't exist
+
+			const map = container.map;
+			let next = map[ id ];
+
+			if ( next === undefined ) {
+
+				next = new StructuredUniform( id );
+				addUniform( container, next );
+
+			}
+
+			container = next;
+
+		}
+
+	}
+
+}
+
+// Root Container
+
+function WebGLUniforms( gl, program ) {
+
+	this.seq = [];
+	this.map = {};
+
+	const n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS );
+
+	for ( let i = 0; i < n; ++ i ) {
+
+		const info = gl.getActiveUniform( program, i ),
+			addr = gl.getUniformLocation( program, info.name );
+
+		parseUniform( info, addr, this );
+
+	}
+
+}
+
+WebGLUniforms.prototype.setValue = function ( gl, name, value, textures ) {
+
+	const u = this.map[ name ];
+
+	if ( u !== undefined ) u.setValue( gl, value, textures );
+
+};
+
+WebGLUniforms.prototype.setOptional = function ( gl, object, name ) {
+
+	const v = object[ name ];
+
+	if ( v !== undefined ) this.setValue( gl, name, v );
+
+};
+
+
+// Static interface
+
+WebGLUniforms.upload = function ( gl, seq, values, textures ) {
+
+	for ( let i = 0, n = seq.length; i !== n; ++ i ) {
+
+		const u = seq[ i ],
+			v = values[ u.id ];
+
+		if ( v.needsUpdate !== false ) {
+
+			// note: always updating when .needsUpdate is undefined
+			u.setValue( gl, v.value, textures );
+
+		}
+
+	}
+
+};
+
+WebGLUniforms.seqWithValue = function ( seq, values ) {
+
+	const r = [];
+
+	for ( let i = 0, n = seq.length; i !== n; ++ i ) {
+
+		const u = seq[ i ];
+		if ( u.id in values ) r.push( u );
+
+	}
+
+	return r;
+
+};
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/webgl/WebGLShader.js
+function WebGLShader( gl, type, string ) {
+
+	const shader = gl.createShader( type );
+
+	gl.shaderSource( shader, string );
+	gl.compileShader( shader );
+
+	return shader;
+
+}
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/webgl/WebGLProgram.js
+
+
+
+
+
+let programIdCount = 0;
+
+function addLineNumbers( string ) {
+
+	const lines = string.split( '\n' );
+
+	for ( let i = 0; i < lines.length; i ++ ) {
+
+		lines[ i ] = ( i + 1 ) + ': ' + lines[ i ];
+
+	}
+
+	return lines.join( '\n' );
+
+}
+
+function getEncodingComponents( encoding ) {
+
+	switch ( encoding ) {
+
+		case LinearEncoding:
+			return [ 'Linear', '( value )' ];
+		case sRGBEncoding:
+			return [ 'sRGB', '( value )' ];
+		default:
+			console.warn( 'THREE.WebGLProgram: Unsupported encoding:', encoding );
+			return [ 'Linear', '( value )' ];
+
+	}
+
+}
+
+function getShaderErrors( gl, shader, type ) {
+
+	const status = gl.getShaderParameter( shader, gl.COMPILE_STATUS );
+	const errors = gl.getShaderInfoLog( shader ).trim();
+
+	if ( status && errors === '' ) return '';
+
+	// --enable-privileged-webgl-extension
+	// console.log( '**' + type + '**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) );
+
+	return type.toUpperCase() + '\n\n' + errors + '\n\n' + addLineNumbers( gl.getShaderSource( shader ) );
+
+}
+
+function getTexelEncodingFunction( functionName, encoding ) {
+
+	const components = getEncodingComponents( encoding );
+	return 'vec4 ' + functionName + '( vec4 value ) { return LinearTo' + components[ 0 ] + components[ 1 ] + '; }';
+
+}
+
+function getToneMappingFunction( functionName, toneMapping ) {
+
+	let toneMappingName;
+
+	switch ( toneMapping ) {
+
+		case LinearToneMapping:
+			toneMappingName = 'Linear';
+			break;
+
+		case ReinhardToneMapping:
+			toneMappingName = 'Reinhard';
+			break;
+
+		case CineonToneMapping:
+			toneMappingName = 'OptimizedCineon';
+			break;
+
+		case ACESFilmicToneMapping:
+			toneMappingName = 'ACESFilmic';
+			break;
+
+		case CustomToneMapping:
+			toneMappingName = 'Custom';
+			break;
+
+		default:
+			console.warn( 'THREE.WebGLProgram: Unsupported toneMapping:', toneMapping );
+			toneMappingName = 'Linear';
+
+	}
+
+	return 'vec3 ' + functionName + '( vec3 color ) { return ' + toneMappingName + 'ToneMapping( color ); }';
+
+}
+
+function generateExtensions( parameters ) {
+
+	const chunks = [
+		( parameters.extensionDerivatives || parameters.envMapCubeUV || parameters.bumpMap || parameters.tangentSpaceNormalMap || parameters.clearcoatNormalMap || parameters.flatShading || parameters.shaderID === 'physical' ) ? '#extension GL_OES_standard_derivatives : enable' : '',
+		( parameters.extensionFragDepth || parameters.logarithmicDepthBuffer ) && parameters.rendererExtensionFragDepth ? '#extension GL_EXT_frag_depth : enable' : '',
+		( parameters.extensionDrawBuffers && parameters.rendererExtensionDrawBuffers ) ? '#extension GL_EXT_draw_buffers : require' : '',
+		( parameters.extensionShaderTextureLOD || parameters.envMap || parameters.transmission ) && parameters.rendererExtensionShaderTextureLod ? '#extension GL_EXT_shader_texture_lod : enable' : ''
+	];
+
+	return chunks.filter( filterEmptyLine ).join( '\n' );
+
+}
+
+function generateDefines( defines ) {
+
+	const chunks = [];
+
+	for ( const name in defines ) {
+
+		const value = defines[ name ];
+
+		if ( value === false ) continue;
+
+		chunks.push( '#define ' + name + ' ' + value );
+
+	}
+
+	return chunks.join( '\n' );
+
+}
+
+function fetchAttributeLocations( gl, program ) {
+
+	const attributes = {};
+
+	const n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES );
+
+	for ( let i = 0; i < n; i ++ ) {
+
+		const info = gl.getActiveAttrib( program, i );
+		const name = info.name;
+
+		let locationSize = 1;
+		if ( info.type === gl.FLOAT_MAT2 ) locationSize = 2;
+		if ( info.type === gl.FLOAT_MAT3 ) locationSize = 3;
+		if ( info.type === gl.FLOAT_MAT4 ) locationSize = 4;
+
+		// console.log( 'THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:', name, i );
+
+		attributes[ name ] = {
+			type: info.type,
+			location: gl.getAttribLocation( program, name ),
+			locationSize: locationSize
+		};
+
+	}
+
+	return attributes;
+
+}
+
+function filterEmptyLine( string ) {
+
+	return string !== '';
+
+}
+
+function replaceLightNums( string, parameters ) {
+
+	return string
+		.replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights )
+		.replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights )
+		.replace( /NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights )
+		.replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights )
+		.replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights )
+		.replace( /NUM_DIR_LIGHT_SHADOWS/g, parameters.numDirLightShadows )
+		.replace( /NUM_SPOT_LIGHT_SHADOWS/g, parameters.numSpotLightShadows )
+		.replace( /NUM_POINT_LIGHT_SHADOWS/g, parameters.numPointLightShadows );
+
+}
+
+function replaceClippingPlaneNums( string, parameters ) {
+
+	return string
+		.replace( /NUM_CLIPPING_PLANES/g, parameters.numClippingPlanes )
+		.replace( /UNION_CLIPPING_PLANES/g, ( parameters.numClippingPlanes - parameters.numClipIntersection ) );
+
+}
+
+// Resolve Includes
+
+const includePattern = /^[ \t]*#include +<([\w\d./]+)>/gm;
+
+function resolveIncludes( string ) {
+
+	return string.replace( includePattern, includeReplacer );
+
+}
+
+function includeReplacer( match, include ) {
+
+	const string = ShaderChunk[ include ];
+
+	if ( string === undefined ) {
+
+		throw new Error( 'Can not resolve #include <' + include + '>' );
+
+	}
+
+	return resolveIncludes( string );
+
+}
+
+// Unroll Loops
+
+const deprecatedUnrollLoopPattern = /#pragma unroll_loop[\s]+?for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g;
+const unrollLoopPattern = /#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g;
+
+function unrollLoops( string ) {
+
+	return string
+		.replace( unrollLoopPattern, loopReplacer )
+		.replace( deprecatedUnrollLoopPattern, deprecatedLoopReplacer );
+
+}
+
+function deprecatedLoopReplacer( match, start, end, snippet ) {
+
+	console.warn( 'WebGLProgram: #pragma unroll_loop shader syntax is deprecated. Please use #pragma unroll_loop_start syntax instead.' );
+	return loopReplacer( match, start, end, snippet );
+
+}
+
+function loopReplacer( match, start, end, snippet ) {
+
+	let string = '';
+
+	for ( let i = parseInt( start ); i < parseInt( end ); i ++ ) {
+
+		string += snippet
+			.replace( /\[\s*i\s*\]/g, '[ ' + i + ' ]' )
+			.replace( /UNROLLED_LOOP_INDEX/g, i );
+
+	}
+
+	return string;
+
+}
+
+//
+
+function generatePrecision( parameters ) {
+
+	let precisionstring = 'precision ' + parameters.precision + ' float;\nprecision ' + parameters.precision + ' int;';
+
+	if ( parameters.precision === 'highp' ) {
+
+		precisionstring += '\n#define HIGH_PRECISION';
+
+	} else if ( parameters.precision === 'mediump' ) {
+
+		precisionstring += '\n#define MEDIUM_PRECISION';
+
+	} else if ( parameters.precision === 'lowp' ) {
+
+		precisionstring += '\n#define LOW_PRECISION';
+
+	}
+
+	return precisionstring;
+
+}
+
+function generateShadowMapTypeDefine( parameters ) {
+
+	let shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC';
+
+	if ( parameters.shadowMapType === PCFShadowMap ) {
+
+		shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF';
+
+	} else if ( parameters.shadowMapType === PCFSoftShadowMap ) {
+
+		shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT';
+
+	} else if ( parameters.shadowMapType === VSMShadowMap ) {
+
+		shadowMapTypeDefine = 'SHADOWMAP_TYPE_VSM';
+
+	}
+
+	return shadowMapTypeDefine;
+
+}
+
+function generateEnvMapTypeDefine( parameters ) {
+
+	let envMapTypeDefine = 'ENVMAP_TYPE_CUBE';
+
+	if ( parameters.envMap ) {
+
+		switch ( parameters.envMapMode ) {
+
+			case CubeReflectionMapping:
+			case CubeRefractionMapping:
+				envMapTypeDefine = 'ENVMAP_TYPE_CUBE';
+				break;
+
+			case CubeUVReflectionMapping:
+			case CubeUVRefractionMapping:
+				envMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV';
+				break;
+
+		}
+
+	}
+
+	return envMapTypeDefine;
+
+}
+
+function generateEnvMapModeDefine( parameters ) {
+
+	let envMapModeDefine = 'ENVMAP_MODE_REFLECTION';
+
+	if ( parameters.envMap ) {
+
+		switch ( parameters.envMapMode ) {
+
+			case CubeRefractionMapping:
+			case CubeUVRefractionMapping:
+
+				envMapModeDefine = 'ENVMAP_MODE_REFRACTION';
+				break;
+
+		}
+
+	}
+
+	return envMapModeDefine;
+
+}
+
+function generateEnvMapBlendingDefine( parameters ) {
+
+	let envMapBlendingDefine = 'ENVMAP_BLENDING_NONE';
+
+	if ( parameters.envMap ) {
+
+		switch ( parameters.combine ) {
+
+			case MultiplyOperation:
+				envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';
+				break;
+
+			case MixOperation:
+				envMapBlendingDefine = 'ENVMAP_BLENDING_MIX';
+				break;
+
+			case AddOperation:
+				envMapBlendingDefine = 'ENVMAP_BLENDING_ADD';
+				break;
+
+		}
+
+	}
+
+	return envMapBlendingDefine;
+
+}
+
+function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
+
+	// TODO Send this event to Three.js DevTools
+	// console.log( 'WebGLProgram', cacheKey );
+
+	const gl = renderer.getContext();
+
+	const defines = parameters.defines;
+
+	let vertexShader = parameters.vertexShader;
+	let fragmentShader = parameters.fragmentShader;
+
+	const shadowMapTypeDefine = generateShadowMapTypeDefine( parameters );
+	const envMapTypeDefine = generateEnvMapTypeDefine( parameters );
+	const envMapModeDefine = generateEnvMapModeDefine( parameters );
+	const envMapBlendingDefine = generateEnvMapBlendingDefine( parameters );
+
+	const customExtensions = parameters.isWebGL2 ? '' : generateExtensions( parameters );
+
+	const customDefines = generateDefines( defines );
+
+	const program = gl.createProgram();
+
+	let prefixVertex, prefixFragment;
+	let versionString = parameters.glslVersion ? '#version ' + parameters.glslVersion + '\n' : '';
+
+	if ( parameters.isRawShaderMaterial ) {
+
+		prefixVertex = [
+
+			customDefines
+
+		].filter( filterEmptyLine ).join( '\n' );
+
+		if ( prefixVertex.length > 0 ) {
+
+			prefixVertex += '\n';
+
+		}
+
+		prefixFragment = [
+
+			customExtensions,
+			customDefines
+
+		].filter( filterEmptyLine ).join( '\n' );
+
+		if ( prefixFragment.length > 0 ) {
+
+			prefixFragment += '\n';
+
+		}
+
+	} else {
+
+		prefixVertex = [
+
+			generatePrecision( parameters ),
+
+			'#define SHADER_NAME ' + parameters.shaderName,
+
+			customDefines,
+
+			parameters.instancing ? '#define USE_INSTANCING' : '',
+			parameters.instancingColor ? '#define USE_INSTANCING_COLOR' : '',
+
+			parameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '',
+
+			'#define MAX_BONES ' + parameters.maxBones,
+			( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',
+			( parameters.useFog && parameters.fogExp2 ) ? '#define FOG_EXP2' : '',
+
+			parameters.map ? '#define USE_MAP' : '',
+			parameters.envMap ? '#define USE_ENVMAP' : '',
+			parameters.envMap ? '#define ' + envMapModeDefine : '',
+			parameters.lightMap ? '#define USE_LIGHTMAP' : '',
+			parameters.aoMap ? '#define USE_AOMAP' : '',
+			parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',
+			parameters.bumpMap ? '#define USE_BUMPMAP' : '',
+			parameters.normalMap ? '#define USE_NORMALMAP' : '',
+			( parameters.normalMap && parameters.objectSpaceNormalMap ) ? '#define OBJECTSPACE_NORMALMAP' : '',
+			( parameters.normalMap && parameters.tangentSpaceNormalMap ) ? '#define TANGENTSPACE_NORMALMAP' : '',
+
+			parameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',
+			parameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',
+			parameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',
+
+			parameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '',
+
+			parameters.specularMap ? '#define USE_SPECULARMAP' : '',
+			parameters.specularIntensityMap ? '#define USE_SPECULARINTENSITYMAP' : '',
+			parameters.specularColorMap ? '#define USE_SPECULARCOLORMAP' : '',
+
+			parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',
+			parameters.metalnessMap ? '#define USE_METALNESSMAP' : '',
+			parameters.alphaMap ? '#define USE_ALPHAMAP' : '',
+
+			parameters.transmission ? '#define USE_TRANSMISSION' : '',
+			parameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '',
+			parameters.thicknessMap ? '#define USE_THICKNESSMAP' : '',
+
+			parameters.sheenColorMap ? '#define USE_SHEENCOLORMAP' : '',
+			parameters.sheenRoughnessMap ? '#define USE_SHEENROUGHNESSMAP' : '',
+
+			parameters.vertexTangents ? '#define USE_TANGENT' : '',
+			parameters.vertexColors ? '#define USE_COLOR' : '',
+			parameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '',
+			parameters.vertexUvs ? '#define USE_UV' : '',
+			parameters.uvsVertexOnly ? '#define UVS_VERTEX_ONLY' : '',
+
+			parameters.flatShading ? '#define FLAT_SHADED' : '',
+
+			parameters.skinning ? '#define USE_SKINNING' : '',
+			parameters.useVertexTexture ? '#define BONE_TEXTURE' : '',
+
+			parameters.morphTargets ? '#define USE_MORPHTARGETS' : '',
+			parameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '',
+			( parameters.morphTargets && parameters.isWebGL2 ) ? '#define MORPHTARGETS_TEXTURE' : '',
+			( parameters.morphTargets && parameters.isWebGL2 ) ? '#define MORPHTARGETS_COUNT ' + parameters.morphTargetsCount : '',
+			parameters.doubleSided ? '#define DOUBLE_SIDED' : '',
+			parameters.flipSided ? '#define FLIP_SIDED' : '',
+
+			parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',
+			parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',
+
+			parameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '',
+
+			parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',
+			( parameters.logarithmicDepthBuffer && parameters.rendererExtensionFragDepth ) ? '#define USE_LOGDEPTHBUF_EXT' : '',
+
+			'uniform mat4 modelMatrix;',
+			'uniform mat4 modelViewMatrix;',
+			'uniform mat4 projectionMatrix;',
+			'uniform mat4 viewMatrix;',
+			'uniform mat3 normalMatrix;',
+			'uniform vec3 cameraPosition;',
+			'uniform bool isOrthographic;',
+
+			'#ifdef USE_INSTANCING',
+
+			'	attribute mat4 instanceMatrix;',
+
+			'#endif',
+
+			'#ifdef USE_INSTANCING_COLOR',
+
+			'	attribute vec3 instanceColor;',
+
+			'#endif',
+
+			'attribute vec3 position;',
+			'attribute vec3 normal;',
+			'attribute vec2 uv;',
+
+			'#ifdef USE_TANGENT',
+
+			'	attribute vec4 tangent;',
+
+			'#endif',
+
+			'#if defined( USE_COLOR_ALPHA )',
+
+			'	attribute vec4 color;',
+
+			'#elif defined( USE_COLOR )',
+
+			'	attribute vec3 color;',
+
+			'#endif',
+
+			'#if ( defined( USE_MORPHTARGETS ) && ! defined( MORPHTARGETS_TEXTURE ) )',
+
+			'	attribute vec3 morphTarget0;',
+			'	attribute vec3 morphTarget1;',
+			'	attribute vec3 morphTarget2;',
+			'	attribute vec3 morphTarget3;',
+
+			'	#ifdef USE_MORPHNORMALS',
+
+			'		attribute vec3 morphNormal0;',
+			'		attribute vec3 morphNormal1;',
+			'		attribute vec3 morphNormal2;',
+			'		attribute vec3 morphNormal3;',
+
+			'	#else',
+
+			'		attribute vec3 morphTarget4;',
+			'		attribute vec3 morphTarget5;',
+			'		attribute vec3 morphTarget6;',
+			'		attribute vec3 morphTarget7;',
+
+			'	#endif',
+
+			'#endif',
+
+			'#ifdef USE_SKINNING',
+
+			'	attribute vec4 skinIndex;',
+			'	attribute vec4 skinWeight;',
+
+			'#endif',
+
+			'\n'
+
+		].filter( filterEmptyLine ).join( '\n' );
+
+		prefixFragment = [
+
+			customExtensions,
+
+			generatePrecision( parameters ),
+
+			'#define SHADER_NAME ' + parameters.shaderName,
+
+			customDefines,
+
+			( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',
+			( parameters.useFog && parameters.fogExp2 ) ? '#define FOG_EXP2' : '',
+
+			parameters.map ? '#define USE_MAP' : '',
+			parameters.matcap ? '#define USE_MATCAP' : '',
+			parameters.envMap ? '#define USE_ENVMAP' : '',
+			parameters.envMap ? '#define ' + envMapTypeDefine : '',
+			parameters.envMap ? '#define ' + envMapModeDefine : '',
+			parameters.envMap ? '#define ' + envMapBlendingDefine : '',
+			parameters.lightMap ? '#define USE_LIGHTMAP' : '',
+			parameters.aoMap ? '#define USE_AOMAP' : '',
+			parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',
+			parameters.bumpMap ? '#define USE_BUMPMAP' : '',
+			parameters.normalMap ? '#define USE_NORMALMAP' : '',
+			( parameters.normalMap && parameters.objectSpaceNormalMap ) ? '#define OBJECTSPACE_NORMALMAP' : '',
+			( parameters.normalMap && parameters.tangentSpaceNormalMap ) ? '#define TANGENTSPACE_NORMALMAP' : '',
+
+			parameters.clearcoat ? '#define USE_CLEARCOAT' : '',
+			parameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',
+			parameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',
+			parameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',
+
+			parameters.specularMap ? '#define USE_SPECULARMAP' : '',
+			parameters.specularIntensityMap ? '#define USE_SPECULARINTENSITYMAP' : '',
+			parameters.specularColorMap ? '#define USE_SPECULARCOLORMAP' : '',
+			parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',
+			parameters.metalnessMap ? '#define USE_METALNESSMAP' : '',
+
+			parameters.alphaMap ? '#define USE_ALPHAMAP' : '',
+			parameters.alphaTest ? '#define USE_ALPHATEST' : '',
+
+			parameters.sheen ? '#define USE_SHEEN' : '',
+			parameters.sheenColorMap ? '#define USE_SHEENCOLORMAP' : '',
+			parameters.sheenRoughnessMap ? '#define USE_SHEENROUGHNESSMAP' : '',
+
+			parameters.transmission ? '#define USE_TRANSMISSION' : '',
+			parameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '',
+			parameters.thicknessMap ? '#define USE_THICKNESSMAP' : '',
+
+			parameters.decodeVideoTexture ? '#define DECODE_VIDEO_TEXTURE' : '',
+
+			parameters.vertexTangents ? '#define USE_TANGENT' : '',
+			parameters.vertexColors || parameters.instancingColor ? '#define USE_COLOR' : '',
+			parameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '',
+			parameters.vertexUvs ? '#define USE_UV' : '',
+			parameters.uvsVertexOnly ? '#define UVS_VERTEX_ONLY' : '',
+
+			parameters.gradientMap ? '#define USE_GRADIENTMAP' : '',
+
+			parameters.flatShading ? '#define FLAT_SHADED' : '',
+
+			parameters.doubleSided ? '#define DOUBLE_SIDED' : '',
+			parameters.flipSided ? '#define FLIP_SIDED' : '',
+
+			parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',
+			parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',
+
+			parameters.premultipliedAlpha ? '#define PREMULTIPLIED_ALPHA' : '',
+
+			parameters.physicallyCorrectLights ? '#define PHYSICALLY_CORRECT_LIGHTS' : '',
+
+			parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',
+			( parameters.logarithmicDepthBuffer && parameters.rendererExtensionFragDepth ) ? '#define USE_LOGDEPTHBUF_EXT' : '',
+
+			( ( parameters.extensionShaderTextureLOD || parameters.envMap ) && parameters.rendererExtensionShaderTextureLod ) ? '#define TEXTURE_LOD_EXT' : '',
+
+			'uniform mat4 viewMatrix;',
+			'uniform vec3 cameraPosition;',
+			'uniform bool isOrthographic;',
+
+			( parameters.toneMapping !== NoToneMapping ) ? '#define TONE_MAPPING' : '',
+			( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk.tonemapping_pars_fragment : '', // this code is required here because it is used by the toneMapping() function defined below
+			( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( 'toneMapping', parameters.toneMapping ) : '',
+
+			parameters.dithering ? '#define DITHERING' : '',
+			parameters.transparent ? '' : '#define OPAQUE',
+
+			ShaderChunk.encodings_pars_fragment, // this code is required here because it is used by the various encoding/decoding function defined below
+			getTexelEncodingFunction( 'linearToOutputTexel', parameters.outputEncoding ),
+
+			parameters.depthPacking ? '#define DEPTH_PACKING ' + parameters.depthPacking : '',
+
+			'\n'
+
+		].filter( filterEmptyLine ).join( '\n' );
+
+	}
+
+	vertexShader = resolveIncludes( vertexShader );
+	vertexShader = replaceLightNums( vertexShader, parameters );
+	vertexShader = replaceClippingPlaneNums( vertexShader, parameters );
+
+	fragmentShader = resolveIncludes( fragmentShader );
+	fragmentShader = replaceLightNums( fragmentShader, parameters );
+	fragmentShader = replaceClippingPlaneNums( fragmentShader, parameters );
+
+	vertexShader = unrollLoops( vertexShader );
+	fragmentShader = unrollLoops( fragmentShader );
+
+	if ( parameters.isWebGL2 && parameters.isRawShaderMaterial !== true ) {
+
+		// GLSL 3.0 conversion for built-in materials and ShaderMaterial
+
+		versionString = '#version 300 es\n';
+
+		prefixVertex = [
+			'precision mediump sampler2DArray;',
+			'#define attribute in',
+			'#define varying out',
+			'#define texture2D texture'
+		].join( '\n' ) + '\n' + prefixVertex;
+
+		prefixFragment = [
+			'#define varying in',
+			( parameters.glslVersion === GLSL3 ) ? '' : 'layout(location = 0) out highp vec4 pc_fragColor;',
+			( parameters.glslVersion === GLSL3 ) ? '' : '#define gl_FragColor pc_fragColor',
+			'#define gl_FragDepthEXT gl_FragDepth',
+			'#define texture2D texture',
+			'#define textureCube texture',
+			'#define texture2DProj textureProj',
+			'#define texture2DLodEXT textureLod',
+			'#define texture2DProjLodEXT textureProjLod',
+			'#define textureCubeLodEXT textureLod',
+			'#define texture2DGradEXT textureGrad',
+			'#define texture2DProjGradEXT textureProjGrad',
+			'#define textureCubeGradEXT textureGrad'
+		].join( '\n' ) + '\n' + prefixFragment;
+
+	}
+
+	const vertexGlsl = versionString + prefixVertex + vertexShader;
+	const fragmentGlsl = versionString + prefixFragment + fragmentShader;
+
+	// console.log( '*VERTEX*', vertexGlsl );
+	// console.log( '*FRAGMENT*', fragmentGlsl );
+
+	const glVertexShader = WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl );
+	const glFragmentShader = WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl );
+
+	gl.attachShader( program, glVertexShader );
+	gl.attachShader( program, glFragmentShader );
+
+	// Force a particular attribute to index 0.
+
+	if ( parameters.index0AttributeName !== undefined ) {
+
+		gl.bindAttribLocation( program, 0, parameters.index0AttributeName );
+
+	} else if ( parameters.morphTargets === true ) {
+
+		// programs with morphTargets displace position out of attribute 0
+		gl.bindAttribLocation( program, 0, 'position' );
+
+	}
+
+	gl.linkProgram( program );
+
+	// check for link errors
+	if ( renderer.debug.checkShaderErrors ) {
+
+		const programLog = gl.getProgramInfoLog( program ).trim();
+		const vertexLog = gl.getShaderInfoLog( glVertexShader ).trim();
+		const fragmentLog = gl.getShaderInfoLog( glFragmentShader ).trim();
+
+		let runnable = true;
+		let haveDiagnostics = true;
+
+		if ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) {
+
+			runnable = false;
+
+			const vertexErrors = getShaderErrors( gl, glVertexShader, 'vertex' );
+			const fragmentErrors = getShaderErrors( gl, glFragmentShader, 'fragment' );
+
+			console.error(
+				'THREE.WebGLProgram: Shader Error ' + gl.getError() + ' - ' +
+				'VALIDATE_STATUS ' + gl.getProgramParameter( program, gl.VALIDATE_STATUS ) + '\n\n' +
+				'Program Info Log: ' + programLog + '\n' +
+				vertexErrors + '\n' +
+				fragmentErrors
+			);
+
+		} else if ( programLog !== '' ) {
+
+			console.warn( 'THREE.WebGLProgram: Program Info Log:', programLog );
+
+		} else if ( vertexLog === '' || fragmentLog === '' ) {
+
+			haveDiagnostics = false;
+
+		}
+
+		if ( haveDiagnostics ) {
+
+			this.diagnostics = {
+
+				runnable: runnable,
+
+				programLog: programLog,
+
+				vertexShader: {
+
+					log: vertexLog,
+					prefix: prefixVertex
+
+				},
+
+				fragmentShader: {
+
+					log: fragmentLog,
+					prefix: prefixFragment
+
+				}
+
+			};
+
+		}
+
+	}
+
+	// Clean up
+
+	// Crashes in iOS9 and iOS10. #18402
+	// gl.detachShader( program, glVertexShader );
+	// gl.detachShader( program, glFragmentShader );
+
+	gl.deleteShader( glVertexShader );
+	gl.deleteShader( glFragmentShader );
+
+	// set up caching for uniform locations
+
+	let cachedUniforms;
+
+	this.getUniforms = function () {
+
+		if ( cachedUniforms === undefined ) {
+
+			cachedUniforms = new WebGLUniforms( gl, program );
+
+		}
+
+		return cachedUniforms;
+
+	};
+
+	// set up caching for attribute locations
+
+	let cachedAttributes;
+
+	this.getAttributes = function () {
+
+		if ( cachedAttributes === undefined ) {
+
+			cachedAttributes = fetchAttributeLocations( gl, program );
+
+		}
+
+		return cachedAttributes;
+
+	};
+
+	// free resource
+
+	this.destroy = function () {
+
+		bindingStates.releaseStatesOfProgram( this );
+
+		gl.deleteProgram( program );
+		this.program = undefined;
+
+	};
+
+	//
+
+	this.name = parameters.shaderName;
+	this.id = programIdCount ++;
+	this.cacheKey = cacheKey;
+	this.usedTimes = 1;
+	this.program = program;
+	this.vertexShader = glVertexShader;
+	this.fragmentShader = glFragmentShader;
+
+	return this;
+
+}
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/webgl/WebGLShaderCache.js
+let WebGLShaderCache_id = 0;
+
+class WebGLShaderCache {
+
+	constructor() {
+
+		this.shaderCache = new Map();
+		this.materialCache = new Map();
+
+	}
+
+	update( material ) {
+
+		const vertexShader = material.vertexShader;
+		const fragmentShader = material.fragmentShader;
+
+		const vertexShaderStage = this._getShaderStage( vertexShader );
+		const fragmentShaderStage = this._getShaderStage( fragmentShader );
+
+		const materialShaders = this._getShaderCacheForMaterial( material );
+
+		if ( materialShaders.has( vertexShaderStage ) === false ) {
+
+			materialShaders.add( vertexShaderStage );
+			vertexShaderStage.usedTimes ++;
+
+		}
+
+		if ( materialShaders.has( fragmentShaderStage ) === false ) {
+
+			materialShaders.add( fragmentShaderStage );
+			fragmentShaderStage.usedTimes ++;
+
+		}
+
+		return this;
+
+	}
+
+	remove( material ) {
+
+		const materialShaders = this.materialCache.get( material );
+
+		for ( const shaderStage of materialShaders ) {
+
+			shaderStage.usedTimes --;
+
+			if ( shaderStage.usedTimes === 0 ) this.shaderCache.delete( shaderStage );
+
+		}
+
+		this.materialCache.delete( material );
+
+		return this;
+
+	}
+
+	getVertexShaderID( material ) {
+
+		return this._getShaderStage( material.vertexShader ).id;
+
+	}
+
+	getFragmentShaderID( material ) {
+
+		return this._getShaderStage( material.fragmentShader ).id;
+
+	}
+
+	dispose() {
+
+		this.shaderCache.clear();
+		this.materialCache.clear();
+
+	}
+
+	_getShaderCacheForMaterial( material ) {
+
+		const cache = this.materialCache;
+
+		if ( cache.has( material ) === false ) {
+
+			cache.set( material, new Set() );
+
+		}
+
+		return cache.get( material );
+
+	}
+
+	_getShaderStage( code ) {
+
+		const cache = this.shaderCache;
+
+		if ( cache.has( code ) === false ) {
+
+			const stage = new WebGLShaderStage();
+			cache.set( code, stage );
+
+		}
+
+		return cache.get( code );
+
+	}
+
+}
+
+class WebGLShaderStage {
+
+	constructor() {
+
+		this.id = WebGLShaderCache_id ++;
+
+		this.usedTimes = 0;
+
+	}
+
+}
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/webgl/WebGLPrograms.js
+
+
+
+
+
+
+
+function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping ) {
+
+	const _programLayers = new Layers();
+	const _customShaders = new WebGLShaderCache();
+	const programs = [];
+
+	const isWebGL2 = capabilities.isWebGL2;
+	const logarithmicDepthBuffer = capabilities.logarithmicDepthBuffer;
+	const floatVertexTextures = capabilities.floatVertexTextures;
+	const maxVertexUniforms = capabilities.maxVertexUniforms;
+	const vertexTextures = capabilities.vertexTextures;
+	let precision = capabilities.precision;
+
+	const shaderIDs = {
+		MeshDepthMaterial: 'depth',
+		MeshDistanceMaterial: 'distanceRGBA',
+		MeshNormalMaterial: 'normal',
+		MeshBasicMaterial: 'basic',
+		MeshLambertMaterial: 'lambert',
+		MeshPhongMaterial: 'phong',
+		MeshToonMaterial: 'toon',
+		MeshStandardMaterial: 'physical',
+		MeshPhysicalMaterial: 'physical',
+		MeshMatcapMaterial: 'matcap',
+		LineBasicMaterial: 'basic',
+		LineDashedMaterial: 'dashed',
+		PointsMaterial: 'points',
+		ShadowMaterial: 'shadow',
+		SpriteMaterial: 'sprite'
+	};
+
+	function getMaxBones( object ) {
+
+		const skeleton = object.skeleton;
+		const bones = skeleton.bones;
+
+		if ( floatVertexTextures ) {
+
+			return 1024;
+
+		} else {
+
+			// default for when object is not specified
+			// ( for example when prebuilding shader to be used with multiple objects )
+			//
+			//  - leave some extra space for other uniforms
+			//  - limit here is ANGLE's 254 max uniform vectors
+			//    (up to 54 should be safe)
+
+			const nVertexUniforms = maxVertexUniforms;
+			const nVertexMatrices = Math.floor( ( nVertexUniforms - 20 ) / 4 );
+
+			const maxBones = Math.min( nVertexMatrices, bones.length );
+
+			if ( maxBones < bones.length ) {
+
+				console.warn( 'THREE.WebGLRenderer: Skeleton has ' + bones.length + ' bones. This GPU supports ' + maxBones + '.' );
+				return 0;
+
+			}
+
+			return maxBones;
+
+		}
+
+	}
+
+	function getParameters( material, lights, shadows, scene, object ) {
+
+		const fog = scene.fog;
+		const environment = material.isMeshStandardMaterial ? scene.environment : null;
+
+		const envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment );
+
+		const shaderID = shaderIDs[ material.type ];
+
+		// heuristics to create shader parameters according to lights in the scene
+		// (not to blow over maxLights budget)
+
+		const maxBones = object.isSkinnedMesh ? getMaxBones( object ) : 0;
+
+		if ( material.precision !== null ) {
+
+			precision = capabilities.getMaxPrecision( material.precision );
+
+			if ( precision !== material.precision ) {
+
+				console.warn( 'THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' );
+
+			}
+
+		}
+
+		let vertexShader, fragmentShader;
+		let customVertexShaderID, customFragmentShaderID;
+
+		if ( shaderID ) {
+
+			const shader = ShaderLib[ shaderID ];
+
+			vertexShader = shader.vertexShader;
+			fragmentShader = shader.fragmentShader;
+
+		} else {
+
+			vertexShader = material.vertexShader;
+			fragmentShader = material.fragmentShader;
+
+			_customShaders.update( material );
+
+			customVertexShaderID = _customShaders.getVertexShaderID( material );
+			customFragmentShaderID = _customShaders.getFragmentShaderID( material );
+
+		}
+
+		const currentRenderTarget = renderer.getRenderTarget();
+
+		const useAlphaTest = material.alphaTest > 0;
+		const useClearcoat = material.clearcoat > 0;
+
+		const parameters = {
+
+			isWebGL2: isWebGL2,
+
+			shaderID: shaderID,
+			shaderName: material.type,
+
+			vertexShader: vertexShader,
+			fragmentShader: fragmentShader,
+			defines: material.defines,
+
+			customVertexShaderID: customVertexShaderID,
+			customFragmentShaderID: customFragmentShaderID,
+
+			isRawShaderMaterial: material.isRawShaderMaterial === true,
+			glslVersion: material.glslVersion,
+
+			precision: precision,
+
+			instancing: object.isInstancedMesh === true,
+			instancingColor: object.isInstancedMesh === true && object.instanceColor !== null,
+
+			supportsVertexTextures: vertexTextures,
+			outputEncoding: ( currentRenderTarget === null ) ? renderer.outputEncoding : ( currentRenderTarget.isXRRenderTarget === true ? currentRenderTarget.texture.encoding : LinearEncoding ),
+			map: !! material.map,
+			matcap: !! material.matcap,
+			envMap: !! envMap,
+			envMapMode: envMap && envMap.mapping,
+			envMapCubeUV: ( !! envMap ) && ( ( envMap.mapping === CubeUVReflectionMapping ) || ( envMap.mapping === CubeUVRefractionMapping ) ),
+			lightMap: !! material.lightMap,
+			aoMap: !! material.aoMap,
+			emissiveMap: !! material.emissiveMap,
+			bumpMap: !! material.bumpMap,
+			normalMap: !! material.normalMap,
+			objectSpaceNormalMap: material.normalMapType === ObjectSpaceNormalMap,
+			tangentSpaceNormalMap: material.normalMapType === TangentSpaceNormalMap,
+
+			decodeVideoTexture: !! material.map && ( material.map.isVideoTexture === true ) && ( material.map.encoding === sRGBEncoding ),
+
+			clearcoat: useClearcoat,
+			clearcoatMap: useClearcoat && !! material.clearcoatMap,
+			clearcoatRoughnessMap: useClearcoat && !! material.clearcoatRoughnessMap,
+			clearcoatNormalMap: useClearcoat && !! material.clearcoatNormalMap,
+
+			displacementMap: !! material.displacementMap,
+			roughnessMap: !! material.roughnessMap,
+			metalnessMap: !! material.metalnessMap,
+			specularMap: !! material.specularMap,
+			specularIntensityMap: !! material.specularIntensityMap,
+			specularColorMap: !! material.specularColorMap,
+
+			transparent: material.transparent,
+
+			alphaMap: !! material.alphaMap,
+			alphaTest: useAlphaTest,
+
+			gradientMap: !! material.gradientMap,
+
+			sheen: material.sheen > 0,
+			sheenColorMap: !! material.sheenColorMap,
+			sheenRoughnessMap: !! material.sheenRoughnessMap,
+
+			transmission: material.transmission > 0,
+			transmissionMap: !! material.transmissionMap,
+			thicknessMap: !! material.thicknessMap,
+
+			combine: material.combine,
+
+			vertexTangents: ( !! material.normalMap && !! object.geometry && !! object.geometry.attributes.tangent ),
+			vertexColors: material.vertexColors,
+			vertexAlphas: material.vertexColors === true && !! object.geometry && !! object.geometry.attributes.color && object.geometry.attributes.color.itemSize === 4,
+			vertexUvs: !! material.map || !! material.bumpMap || !! material.normalMap || !! material.specularMap || !! material.alphaMap || !! material.emissiveMap || !! material.roughnessMap || !! material.metalnessMap || !! material.clearcoatMap || !! material.clearcoatRoughnessMap || !! material.clearcoatNormalMap || !! material.displacementMap || !! material.transmissionMap || !! material.thicknessMap || !! material.specularIntensityMap || !! material.specularColorMap || !! material.sheenColorMap || !! material.sheenRoughnessMap,
+			uvsVertexOnly: ! ( !! material.map || !! material.bumpMap || !! material.normalMap || !! material.specularMap || !! material.alphaMap || !! material.emissiveMap || !! material.roughnessMap || !! material.metalnessMap || !! material.clearcoatNormalMap || material.transmission > 0 || !! material.transmissionMap || !! material.thicknessMap || !! material.specularIntensityMap || !! material.specularColorMap || material.sheen > 0 || !! material.sheenColorMap || !! material.sheenRoughnessMap ) && !! material.displacementMap,
+
+			fog: !! fog,
+			useFog: material.fog,
+			fogExp2: ( fog && fog.isFogExp2 ),
+
+			flatShading: !! material.flatShading,
+
+			sizeAttenuation: material.sizeAttenuation,
+			logarithmicDepthBuffer: logarithmicDepthBuffer,
+
+			skinning: object.isSkinnedMesh === true && maxBones > 0,
+			maxBones: maxBones,
+			useVertexTexture: floatVertexTextures,
+
+			morphTargets: !! object.geometry && !! object.geometry.morphAttributes.position,
+			morphNormals: !! object.geometry && !! object.geometry.morphAttributes.normal,
+			morphTargetsCount: ( !! object.geometry && !! object.geometry.morphAttributes.position ) ? object.geometry.morphAttributes.position.length : 0,
+
+			numDirLights: lights.directional.length,
+			numPointLights: lights.point.length,
+			numSpotLights: lights.spot.length,
+			numRectAreaLights: lights.rectArea.length,
+			numHemiLights: lights.hemi.length,
+
+			numDirLightShadows: lights.directionalShadowMap.length,
+			numPointLightShadows: lights.pointShadowMap.length,
+			numSpotLightShadows: lights.spotShadowMap.length,
+
+			numClippingPlanes: clipping.numPlanes,
+			numClipIntersection: clipping.numIntersection,
+
+			dithering: material.dithering,
+
+			shadowMapEnabled: renderer.shadowMap.enabled && shadows.length > 0,
+			shadowMapType: renderer.shadowMap.type,
+
+			toneMapping: material.toneMapped ? renderer.toneMapping : NoToneMapping,
+			physicallyCorrectLights: renderer.physicallyCorrectLights,
+
+			premultipliedAlpha: material.premultipliedAlpha,
+
+			doubleSided: material.side === DoubleSide,
+			flipSided: material.side === BackSide,
+
+			depthPacking: ( material.depthPacking !== undefined ) ? material.depthPacking : false,
+
+			index0AttributeName: material.index0AttributeName,
+
+			extensionDerivatives: material.extensions && material.extensions.derivatives,
+			extensionFragDepth: material.extensions && material.extensions.fragDepth,
+			extensionDrawBuffers: material.extensions && material.extensions.drawBuffers,
+			extensionShaderTextureLOD: material.extensions && material.extensions.shaderTextureLOD,
+
+			rendererExtensionFragDepth: isWebGL2 || extensions.has( 'EXT_frag_depth' ),
+			rendererExtensionDrawBuffers: isWebGL2 || extensions.has( 'WEBGL_draw_buffers' ),
+			rendererExtensionShaderTextureLod: isWebGL2 || extensions.has( 'EXT_shader_texture_lod' ),
+
+			customProgramCacheKey: material.customProgramCacheKey()
+
+		};
+
+		return parameters;
+
+	}
+
+	function getProgramCacheKey( parameters ) {
+
+		const array = [];
+
+		if ( parameters.shaderID ) {
+
+			array.push( parameters.shaderID );
+
+		} else {
+
+			array.push( parameters.customVertexShaderID );
+			array.push( parameters.customFragmentShaderID );
+
+		}
+
+		if ( parameters.defines !== undefined ) {
+
+			for ( const name in parameters.defines ) {
+
+				array.push( name );
+				array.push( parameters.defines[ name ] );
+
+			}
+
+		}
+
+		if ( parameters.isRawShaderMaterial === false ) {
+
+			getProgramCacheKeyParameters( array, parameters );
+			getProgramCacheKeyBooleans( array, parameters );
+			array.push( renderer.outputEncoding );
+
+		}
+
+		array.push( parameters.customProgramCacheKey );
+
+		return array.join();
+
+	}
+
+	function getProgramCacheKeyParameters( array, parameters ) {
+
+		array.push( parameters.precision );
+		array.push( parameters.outputEncoding );
+		array.push( parameters.envMapMode );
+		array.push( parameters.combine );
+		array.push( parameters.vertexUvs );
+		array.push( parameters.fogExp2 );
+		array.push( parameters.sizeAttenuation );
+		array.push( parameters.maxBones );
+		array.push( parameters.morphTargetsCount );
+		array.push( parameters.numDirLights );
+		array.push( parameters.numPointLights );
+		array.push( parameters.numSpotLights );
+		array.push( parameters.numHemiLights );
+		array.push( parameters.numRectAreaLights );
+		array.push( parameters.numDirLightShadows );
+		array.push( parameters.numPointLightShadows );
+		array.push( parameters.numSpotLightShadows );
+		array.push( parameters.shadowMapType );
+		array.push( parameters.toneMapping );
+		array.push( parameters.numClippingPlanes );
+		array.push( parameters.numClipIntersection );
+
+	}
+
+	function getProgramCacheKeyBooleans( array, parameters ) {
+
+		_programLayers.disableAll();
+
+		if ( parameters.isWebGL2 )
+			_programLayers.enable( 0 );
+		if ( parameters.supportsVertexTextures )
+			_programLayers.enable( 1 );
+		if ( parameters.instancing )
+			_programLayers.enable( 2 );
+		if ( parameters.instancingColor )
+			_programLayers.enable( 3 );
+		if ( parameters.map )
+			_programLayers.enable( 4 );
+		if ( parameters.matcap )
+			_programLayers.enable( 5 );
+		if ( parameters.envMap )
+			_programLayers.enable( 6 );
+		if ( parameters.envMapCubeUV )
+			_programLayers.enable( 7 );
+		if ( parameters.lightMap )
+			_programLayers.enable( 8 );
+		if ( parameters.aoMap )
+			_programLayers.enable( 9 );
+		if ( parameters.emissiveMap )
+			_programLayers.enable( 10 );
+		if ( parameters.bumpMap )
+			_programLayers.enable( 11 );
+		if ( parameters.normalMap )
+			_programLayers.enable( 12 );
+		if ( parameters.objectSpaceNormalMap )
+			_programLayers.enable( 13 );
+		if ( parameters.tangentSpaceNormalMap )
+			_programLayers.enable( 14 );
+		if ( parameters.clearcoat )
+			_programLayers.enable( 15 );
+		if ( parameters.clearcoatMap )
+			_programLayers.enable( 16 );
+		if ( parameters.clearcoatRoughnessMap )
+			_programLayers.enable( 17 );
+		if ( parameters.clearcoatNormalMap )
+			_programLayers.enable( 18 );
+		if ( parameters.displacementMap )
+			_programLayers.enable( 19 );
+		if ( parameters.specularMap )
+			_programLayers.enable( 20 );
+		if ( parameters.roughnessMap )
+			_programLayers.enable( 21 );
+		if ( parameters.metalnessMap )
+			_programLayers.enable( 22 );
+		if ( parameters.gradientMap )
+			_programLayers.enable( 23 );
+		if ( parameters.alphaMap )
+			_programLayers.enable( 24 );
+		if ( parameters.alphaTest )
+			_programLayers.enable( 25 );
+		if ( parameters.vertexColors )
+			_programLayers.enable( 26 );
+		if ( parameters.vertexAlphas )
+			_programLayers.enable( 27 );
+		if ( parameters.vertexUvs )
+			_programLayers.enable( 28 );
+		if ( parameters.vertexTangents )
+			_programLayers.enable( 29 );
+		if ( parameters.uvsVertexOnly )
+			_programLayers.enable( 30 );
+		if ( parameters.fog )
+			_programLayers.enable( 31 );
+
+		array.push( _programLayers.mask );
+		_programLayers.disableAll();
+
+		if ( parameters.useFog )
+			_programLayers.enable( 0 );
+		if ( parameters.flatShading )
+			_programLayers.enable( 1 );
+		if ( parameters.logarithmicDepthBuffer )
+			_programLayers.enable( 2 );
+		if ( parameters.skinning )
+			_programLayers.enable( 3 );
+		if ( parameters.useVertexTexture )
+			_programLayers.enable( 4 );
+		if ( parameters.morphTargets )
+			_programLayers.enable( 5 );
+		if ( parameters.morphNormals )
+			_programLayers.enable( 6 );
+		if ( parameters.premultipliedAlpha )
+			_programLayers.enable( 7 );
+		if ( parameters.shadowMapEnabled )
+			_programLayers.enable( 8 );
+		if ( parameters.physicallyCorrectLights )
+			_programLayers.enable( 9 );
+		if ( parameters.doubleSided )
+			_programLayers.enable( 10 );
+		if ( parameters.flipSided )
+			_programLayers.enable( 11 );
+		if ( parameters.depthPacking )
+			_programLayers.enable( 12 );
+		if ( parameters.dithering )
+			_programLayers.enable( 13 );
+		if ( parameters.specularIntensityMap )
+			_programLayers.enable( 14 );
+		if ( parameters.specularColorMap )
+			_programLayers.enable( 15 );
+		if ( parameters.transmission )
+			_programLayers.enable( 16 );
+		if ( parameters.transmissionMap )
+			_programLayers.enable( 17 );
+		if ( parameters.thicknessMap )
+			_programLayers.enable( 18 );
+		if ( parameters.sheen )
+			_programLayers.enable( 19 );
+		if ( parameters.sheenColorMap )
+			_programLayers.enable( 20 );
+		if ( parameters.sheenRoughnessMap )
+			_programLayers.enable( 21 );
+		if ( parameters.decodeVideoTexture )
+			_programLayers.enable( 22 );
+		if ( parameters.transparent )
+			_programLayers.enable( 23 );
+
+		array.push( _programLayers.mask );
+
+	}
+
+	function getUniforms( material ) {
+
+		const shaderID = shaderIDs[ material.type ];
+		let uniforms;
+
+		if ( shaderID ) {
+
+			const shader = ShaderLib[ shaderID ];
+			uniforms = UniformsUtils.clone( shader.uniforms );
+
+		} else {
+
+			uniforms = material.uniforms;
+
+		}
+
+		return uniforms;
+
+	}
+
+	function acquireProgram( parameters, cacheKey ) {
+
+		let program;
+
+		// Check if code has been already compiled
+		for ( let p = 0, pl = programs.length; p < pl; p ++ ) {
+
+			const preexistingProgram = programs[ p ];
+
+			if ( preexistingProgram.cacheKey === cacheKey ) {
+
+				program = preexistingProgram;
+				++ program.usedTimes;
+
+				break;
+
+			}
+
+		}
+
+		if ( program === undefined ) {
+
+			program = new WebGLProgram( renderer, cacheKey, parameters, bindingStates );
+			programs.push( program );
+
+		}
+
+		return program;
+
+	}
+
+	function releaseProgram( program ) {
+
+		if ( -- program.usedTimes === 0 ) {
+
+			// Remove from unordered set
+			const i = programs.indexOf( program );
+			programs[ i ] = programs[ programs.length - 1 ];
+			programs.pop();
+
+			// Free WebGL resources
+			program.destroy();
+
+		}
+
+	}
+
+	function releaseShaderCache( material ) {
+
+		_customShaders.remove( material );
+
+	}
+
+	function dispose() {
+
+		_customShaders.dispose();
+
+	}
+
+	return {
+		getParameters: getParameters,
+		getProgramCacheKey: getProgramCacheKey,
+		getUniforms: getUniforms,
+		acquireProgram: acquireProgram,
+		releaseProgram: releaseProgram,
+		releaseShaderCache: releaseShaderCache,
+		// Exposed for resource monitoring & error feedback via renderer.info:
+		programs: programs,
+		dispose: dispose
+	};
+
+}
+
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/webgl/WebGLProperties.js
+function WebGLProperties() {
+
+	let properties = new WeakMap();
+
+	function get( object ) {
+
+		let map = properties.get( object );
+
+		if ( map === undefined ) {
+
+			map = {};
+			properties.set( object, map );
+
+		}
+
+		return map;
+
+	}
+
+	function remove( object ) {
+
+		properties.delete( object );
+
+	}
+
+	function update( object, key, value ) {
+
+		properties.get( object )[ key ] = value;
+
+	}
+
+	function dispose() {
+
+		properties = new WeakMap();
+
+	}
+
+	return {
+		get: get,
+		remove: remove,
+		update: update,
+		dispose: dispose
+	};
+
+}
+
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/webgl/WebGLRenderLists.js
+function painterSortStable( a, b ) {
+
+	if ( a.groupOrder !== b.groupOrder ) {
+
+		return a.groupOrder - b.groupOrder;
+
+	} else if ( a.renderOrder !== b.renderOrder ) {
+
+		return a.renderOrder - b.renderOrder;
+
+	} else if ( a.material.id !== b.material.id ) {
+
+		return a.material.id - b.material.id;
+
+	} else if ( a.z !== b.z ) {
+
+		return a.z - b.z;
+
+	} else {
+
+		return a.id - b.id;
+
+	}
+
+}
+
+function reversePainterSortStable( a, b ) {
+
+	if ( a.groupOrder !== b.groupOrder ) {
+
+		return a.groupOrder - b.groupOrder;
+
+	} else if ( a.renderOrder !== b.renderOrder ) {
+
+		return a.renderOrder - b.renderOrder;
+
+	} else if ( a.z !== b.z ) {
+
+		return b.z - a.z;
+
+	} else {
+
+		return a.id - b.id;
+
+	}
+
+}
+
+
+function WebGLRenderList() {
+
+	const renderItems = [];
+	let renderItemsIndex = 0;
+
+	const opaque = [];
+	const transmissive = [];
+	const transparent = [];
+
+	function init() {
+
+		renderItemsIndex = 0;
+
+		opaque.length = 0;
+		transmissive.length = 0;
+		transparent.length = 0;
+
+	}
+
+	function getNextRenderItem( object, geometry, material, groupOrder, z, group ) {
+
+		let renderItem = renderItems[ renderItemsIndex ];
+
+		if ( renderItem === undefined ) {
+
+			renderItem = {
+				id: object.id,
+				object: object,
+				geometry: geometry,
+				material: material,
+				groupOrder: groupOrder,
+				renderOrder: object.renderOrder,
+				z: z,
+				group: group
+			};
+
+			renderItems[ renderItemsIndex ] = renderItem;
+
+		} else {
+
+			renderItem.id = object.id;
+			renderItem.object = object;
+			renderItem.geometry = geometry;
+			renderItem.material = material;
+			renderItem.groupOrder = groupOrder;
+			renderItem.renderOrder = object.renderOrder;
+			renderItem.z = z;
+			renderItem.group = group;
+
+		}
+
+		renderItemsIndex ++;
+
+		return renderItem;
+
+	}
+
+	function push( object, geometry, material, groupOrder, z, group ) {
+
+		const renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group );
+
+		if ( material.transmission > 0.0 ) {
+
+			transmissive.push( renderItem );
+
+		} else if ( material.transparent === true ) {
+
+			transparent.push( renderItem );
+
+		} else {
+
+			opaque.push( renderItem );
+
+		}
+
+	}
+
+	function unshift( object, geometry, material, groupOrder, z, group ) {
+
+		const renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group );
+
+		if ( material.transmission > 0.0 ) {
+
+			transmissive.unshift( renderItem );
+
+		} else if ( material.transparent === true ) {
+
+			transparent.unshift( renderItem );
+
+		} else {
+
+			opaque.unshift( renderItem );
+
+		}
+
+	}
+
+	function sort( customOpaqueSort, customTransparentSort ) {
+
+		if ( opaque.length > 1 ) opaque.sort( customOpaqueSort || painterSortStable );
+		if ( transmissive.length > 1 ) transmissive.sort( customTransparentSort || reversePainterSortStable );
+		if ( transparent.length > 1 ) transparent.sort( customTransparentSort || reversePainterSortStable );
+
+	}
+
+	function finish() {
+
+		// Clear references from inactive renderItems in the list
+
+		for ( let i = renderItemsIndex, il = renderItems.length; i < il; i ++ ) {
+
+			const renderItem = renderItems[ i ];
+
+			if ( renderItem.id === null ) break;
+
+			renderItem.id = null;
+			renderItem.object = null;
+			renderItem.geometry = null;
+			renderItem.material = null;
+			renderItem.group = null;
+
+		}
+
+	}
+
+	return {
+
+		opaque: opaque,
+		transmissive: transmissive,
+		transparent: transparent,
+
+		init: init,
+		push: push,
+		unshift: unshift,
+		finish: finish,
+
+		sort: sort
+	};
+
+}
+
+function WebGLRenderLists() {
+
+	let lists = new WeakMap();
+
+	function get( scene, renderCallDepth ) {
+
+		let list;
+
+		if ( lists.has( scene ) === false ) {
+
+			list = new WebGLRenderList();
+			lists.set( scene, [ list ] );
+
+		} else {
+
+			if ( renderCallDepth >= lists.get( scene ).length ) {
+
+				list = new WebGLRenderList();
+				lists.get( scene ).push( list );
+
+			} else {
+
+				list = lists.get( scene )[ renderCallDepth ];
+
+			}
+
+		}
+
+		return list;
+
+	}
+
+	function dispose() {
+
+		lists = new WeakMap();
+
+	}
+
+	return {
+		get: get,
+		dispose: dispose
+	};
+
+}
+
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/webgl/WebGLLights.js
+
+
+
+
+
+
+function UniformsCache() {
+
+	const lights = {};
+
+	return {
+
+		get: function ( light ) {
+
+			if ( lights[ light.id ] !== undefined ) {
+
+				return lights[ light.id ];
+
+			}
+
+			let uniforms;
+
+			switch ( light.type ) {
+
+				case 'DirectionalLight':
+					uniforms = {
+						direction: new Vector3(),
+						color: new Color()
+					};
+					break;
+
+				case 'SpotLight':
+					uniforms = {
+						position: new Vector3(),
+						direction: new Vector3(),
+						color: new Color(),
+						distance: 0,
+						coneCos: 0,
+						penumbraCos: 0,
+						decay: 0
+					};
+					break;
+
+				case 'PointLight':
+					uniforms = {
+						position: new Vector3(),
+						color: new Color(),
+						distance: 0,
+						decay: 0
+					};
+					break;
+
+				case 'HemisphereLight':
+					uniforms = {
+						direction: new Vector3(),
+						skyColor: new Color(),
+						groundColor: new Color()
+					};
+					break;
+
+				case 'RectAreaLight':
+					uniforms = {
+						color: new Color(),
+						position: new Vector3(),
+						halfWidth: new Vector3(),
+						halfHeight: new Vector3()
+					};
+					break;
+
+			}
+
+			lights[ light.id ] = uniforms;
+
+			return uniforms;
+
+		}
+
+	};
+
+}
+
+function ShadowUniformsCache() {
+
+	const lights = {};
+
+	return {
+
+		get: function ( light ) {
+
+			if ( lights[ light.id ] !== undefined ) {
+
+				return lights[ light.id ];
+
+			}
+
+			let uniforms;
+
+			switch ( light.type ) {
+
+				case 'DirectionalLight':
+					uniforms = {
+						shadowBias: 0,
+						shadowNormalBias: 0,
+						shadowRadius: 1,
+						shadowMapSize: new Vector2()
+					};
+					break;
+
+				case 'SpotLight':
+					uniforms = {
+						shadowBias: 0,
+						shadowNormalBias: 0,
+						shadowRadius: 1,
+						shadowMapSize: new Vector2()
+					};
+					break;
+
+				case 'PointLight':
+					uniforms = {
+						shadowBias: 0,
+						shadowNormalBias: 0,
+						shadowRadius: 1,
+						shadowMapSize: new Vector2(),
+						shadowCameraNear: 1,
+						shadowCameraFar: 1000
+					};
+					break;
+
+				// TODO (abelnation): set RectAreaLight shadow uniforms
+
+			}
+
+			lights[ light.id ] = uniforms;
+
+			return uniforms;
+
+		}
+
+	};
+
+}
+
+
+
+let nextVersion = 0;
+
+function shadowCastingLightsFirst( lightA, lightB ) {
+
+	return ( lightB.castShadow ? 1 : 0 ) - ( lightA.castShadow ? 1 : 0 );
+
+}
+
+function WebGLLights( extensions, capabilities ) {
+
+	const cache = new UniformsCache();
+
+	const shadowCache = ShadowUniformsCache();
+
+	const state = {
+
+		version: 0,
+
+		hash: {
+			directionalLength: - 1,
+			pointLength: - 1,
+			spotLength: - 1,
+			rectAreaLength: - 1,
+			hemiLength: - 1,
+
+			numDirectionalShadows: - 1,
+			numPointShadows: - 1,
+			numSpotShadows: - 1
+		},
+
+		ambient: [ 0, 0, 0 ],
+		probe: [],
+		directional: [],
+		directionalShadow: [],
+		directionalShadowMap: [],
+		directionalShadowMatrix: [],
+		spot: [],
+		spotShadow: [],
+		spotShadowMap: [],
+		spotShadowMatrix: [],
+		rectArea: [],
+		rectAreaLTC1: null,
+		rectAreaLTC2: null,
+		point: [],
+		pointShadow: [],
+		pointShadowMap: [],
+		pointShadowMatrix: [],
+		hemi: []
+
+	};
+
+	for ( let i = 0; i < 9; i ++ ) state.probe.push( new Vector3() );
+
+	const vector3 = new Vector3();
+	const matrix4 = new Matrix4_Matrix4();
+	const matrix42 = new Matrix4_Matrix4();
+
+	function setup( lights, physicallyCorrectLights ) {
+
+		let r = 0, g = 0, b = 0;
+
+		for ( let i = 0; i < 9; i ++ ) state.probe[ i ].set( 0, 0, 0 );
+
+		let directionalLength = 0;
+		let pointLength = 0;
+		let spotLength = 0;
+		let rectAreaLength = 0;
+		let hemiLength = 0;
+
+		let numDirectionalShadows = 0;
+		let numPointShadows = 0;
+		let numSpotShadows = 0;
+
+		lights.sort( shadowCastingLightsFirst );
+
+		// artist-friendly light intensity scaling factor
+		const scaleFactor = ( physicallyCorrectLights !== true ) ? Math.PI : 1;
+
+		for ( let i = 0, l = lights.length; i < l; i ++ ) {
+
+			const light = lights[ i ];
+
+			const color = light.color;
+			const intensity = light.intensity;
+			const distance = light.distance;
+
+			const shadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null;
+
+			if ( light.isAmbientLight ) {
+
+				r += color.r * intensity * scaleFactor;
+				g += color.g * intensity * scaleFactor;
+				b += color.b * intensity * scaleFactor;
+
+			} else if ( light.isLightProbe ) {
+
+				for ( let j = 0; j < 9; j ++ ) {
+
+					state.probe[ j ].addScaledVector( light.sh.coefficients[ j ], intensity );
+
+				}
+
+			} else if ( light.isDirectionalLight ) {
+
+				const uniforms = cache.get( light );
+
+				uniforms.color.copy( light.color ).multiplyScalar( light.intensity * scaleFactor );
+
+				if ( light.castShadow ) {
+
+					const shadow = light.shadow;
+
+					const shadowUniforms = shadowCache.get( light );
+
+					shadowUniforms.shadowBias = shadow.bias;
+					shadowUniforms.shadowNormalBias = shadow.normalBias;
+					shadowUniforms.shadowRadius = shadow.radius;
+					shadowUniforms.shadowMapSize = shadow.mapSize;
+
+					state.directionalShadow[ directionalLength ] = shadowUniforms;
+					state.directionalShadowMap[ directionalLength ] = shadowMap;
+					state.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix;
+
+					numDirectionalShadows ++;
+
+				}
+
+				state.directional[ directionalLength ] = uniforms;
+
+				directionalLength ++;
+
+			} else if ( light.isSpotLight ) {
+
+				const uniforms = cache.get( light );
+
+				uniforms.position.setFromMatrixPosition( light.matrixWorld );
+
+				uniforms.color.copy( color ).multiplyScalar( intensity * scaleFactor );
+				uniforms.distance = distance;
+
+				uniforms.coneCos = Math.cos( light.angle );
+				uniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) );
+				uniforms.decay = light.decay;
+
+				if ( light.castShadow ) {
+
+					const shadow = light.shadow;
+
+					const shadowUniforms = shadowCache.get( light );
+
+					shadowUniforms.shadowBias = shadow.bias;
+					shadowUniforms.shadowNormalBias = shadow.normalBias;
+					shadowUniforms.shadowRadius = shadow.radius;
+					shadowUniforms.shadowMapSize = shadow.mapSize;
+
+					state.spotShadow[ spotLength ] = shadowUniforms;
+					state.spotShadowMap[ spotLength ] = shadowMap;
+					state.spotShadowMatrix[ spotLength ] = light.shadow.matrix;
+
+					numSpotShadows ++;
+
+				}
+
+				state.spot[ spotLength ] = uniforms;
+
+				spotLength ++;
+
+			} else if ( light.isRectAreaLight ) {
+
+				const uniforms = cache.get( light );
+
+				// (a) intensity is the total visible light emitted
+				//uniforms.color.copy( color ).multiplyScalar( intensity / ( light.width * light.height * Math.PI ) );
+
+				// (b) intensity is the brightness of the light
+				uniforms.color.copy( color ).multiplyScalar( intensity );
+
+				uniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );
+				uniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );
+
+				state.rectArea[ rectAreaLength ] = uniforms;
+
+				rectAreaLength ++;
+
+			} else if ( light.isPointLight ) {
+
+				const uniforms = cache.get( light );
+
+				uniforms.color.copy( light.color ).multiplyScalar( light.intensity * scaleFactor );
+				uniforms.distance = light.distance;
+				uniforms.decay = light.decay;
+
+				if ( light.castShadow ) {
+
+					const shadow = light.shadow;
+
+					const shadowUniforms = shadowCache.get( light );
+
+					shadowUniforms.shadowBias = shadow.bias;
+					shadowUniforms.shadowNormalBias = shadow.normalBias;
+					shadowUniforms.shadowRadius = shadow.radius;
+					shadowUniforms.shadowMapSize = shadow.mapSize;
+					shadowUniforms.shadowCameraNear = shadow.camera.near;
+					shadowUniforms.shadowCameraFar = shadow.camera.far;
+
+					state.pointShadow[ pointLength ] = shadowUniforms;
+					state.pointShadowMap[ pointLength ] = shadowMap;
+					state.pointShadowMatrix[ pointLength ] = light.shadow.matrix;
+
+					numPointShadows ++;
+
+				}
+
+				state.point[ pointLength ] = uniforms;
+
+				pointLength ++;
+
+			} else if ( light.isHemisphereLight ) {
+
+				const uniforms = cache.get( light );
+
+				uniforms.skyColor.copy( light.color ).multiplyScalar( intensity * scaleFactor );
+				uniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity * scaleFactor );
+
+				state.hemi[ hemiLength ] = uniforms;
+
+				hemiLength ++;
+
+			}
+
+		}
+
+		if ( rectAreaLength > 0 ) {
+
+			if ( capabilities.isWebGL2 ) {
+
+				// WebGL 2
+
+				state.rectAreaLTC1 = UniformsLib.LTC_FLOAT_1;
+				state.rectAreaLTC2 = UniformsLib.LTC_FLOAT_2;
+
+			} else {
+
+				// WebGL 1
+
+				if ( extensions.has( 'OES_texture_float_linear' ) === true ) {
+
+					state.rectAreaLTC1 = UniformsLib.LTC_FLOAT_1;
+					state.rectAreaLTC2 = UniformsLib.LTC_FLOAT_2;
+
+				} else if ( extensions.has( 'OES_texture_half_float_linear' ) === true ) {
+
+					state.rectAreaLTC1 = UniformsLib.LTC_HALF_1;
+					state.rectAreaLTC2 = UniformsLib.LTC_HALF_2;
+
+				} else {
+
+					console.error( 'THREE.WebGLRenderer: Unable to use RectAreaLight. Missing WebGL extensions.' );
+
+				}
+
+			}
+
+		}
+
+		state.ambient[ 0 ] = r;
+		state.ambient[ 1 ] = g;
+		state.ambient[ 2 ] = b;
+
+		const hash = state.hash;
+
+		if ( hash.directionalLength !== directionalLength ||
+			hash.pointLength !== pointLength ||
+			hash.spotLength !== spotLength ||
+			hash.rectAreaLength !== rectAreaLength ||
+			hash.hemiLength !== hemiLength ||
+			hash.numDirectionalShadows !== numDirectionalShadows ||
+			hash.numPointShadows !== numPointShadows ||
+			hash.numSpotShadows !== numSpotShadows ) {
+
+			state.directional.length = directionalLength;
+			state.spot.length = spotLength;
+			state.rectArea.length = rectAreaLength;
+			state.point.length = pointLength;
+			state.hemi.length = hemiLength;
+
+			state.directionalShadow.length = numDirectionalShadows;
+			state.directionalShadowMap.length = numDirectionalShadows;
+			state.pointShadow.length = numPointShadows;
+			state.pointShadowMap.length = numPointShadows;
+			state.spotShadow.length = numSpotShadows;
+			state.spotShadowMap.length = numSpotShadows;
+			state.directionalShadowMatrix.length = numDirectionalShadows;
+			state.pointShadowMatrix.length = numPointShadows;
+			state.spotShadowMatrix.length = numSpotShadows;
+
+			hash.directionalLength = directionalLength;
+			hash.pointLength = pointLength;
+			hash.spotLength = spotLength;
+			hash.rectAreaLength = rectAreaLength;
+			hash.hemiLength = hemiLength;
+
+			hash.numDirectionalShadows = numDirectionalShadows;
+			hash.numPointShadows = numPointShadows;
+			hash.numSpotShadows = numSpotShadows;
+
+			state.version = nextVersion ++;
+
+		}
+
+	}
+
+	function setupView( lights, camera ) {
+
+		let directionalLength = 0;
+		let pointLength = 0;
+		let spotLength = 0;
+		let rectAreaLength = 0;
+		let hemiLength = 0;
+
+		const viewMatrix = camera.matrixWorldInverse;
+
+		for ( let i = 0, l = lights.length; i < l; i ++ ) {
+
+			const light = lights[ i ];
+
+			if ( light.isDirectionalLight ) {
+
+				const uniforms = state.directional[ directionalLength ];
+
+				uniforms.direction.setFromMatrixPosition( light.matrixWorld );
+				vector3.setFromMatrixPosition( light.target.matrixWorld );
+				uniforms.direction.sub( vector3 );
+				uniforms.direction.transformDirection( viewMatrix );
+
+				directionalLength ++;
+
+			} else if ( light.isSpotLight ) {
+
+				const uniforms = state.spot[ spotLength ];
+
+				uniforms.position.setFromMatrixPosition( light.matrixWorld );
+				uniforms.position.applyMatrix4( viewMatrix );
+
+				uniforms.direction.setFromMatrixPosition( light.matrixWorld );
+				vector3.setFromMatrixPosition( light.target.matrixWorld );
+				uniforms.direction.sub( vector3 );
+				uniforms.direction.transformDirection( viewMatrix );
+
+				spotLength ++;
+
+			} else if ( light.isRectAreaLight ) {
+
+				const uniforms = state.rectArea[ rectAreaLength ];
+
+				uniforms.position.setFromMatrixPosition( light.matrixWorld );
+				uniforms.position.applyMatrix4( viewMatrix );
+
+				// extract local rotation of light to derive width/height half vectors
+				matrix42.identity();
+				matrix4.copy( light.matrixWorld );
+				matrix4.premultiply( viewMatrix );
+				matrix42.extractRotation( matrix4 );
+
+				uniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );
+				uniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );
+
+				uniforms.halfWidth.applyMatrix4( matrix42 );
+				uniforms.halfHeight.applyMatrix4( matrix42 );
+
+				rectAreaLength ++;
+
+			} else if ( light.isPointLight ) {
+
+				const uniforms = state.point[ pointLength ];
+
+				uniforms.position.setFromMatrixPosition( light.matrixWorld );
+				uniforms.position.applyMatrix4( viewMatrix );
+
+				pointLength ++;
+
+			} else if ( light.isHemisphereLight ) {
+
+				const uniforms = state.hemi[ hemiLength ];
+
+				uniforms.direction.setFromMatrixPosition( light.matrixWorld );
+				uniforms.direction.transformDirection( viewMatrix );
+				uniforms.direction.normalize();
+
+				hemiLength ++;
+
+			}
+
+		}
+
+	}
+
+	return {
+		setup: setup,
+		setupView: setupView,
+		state: state
+	};
+
+}
+
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/webgl/WebGLRenderStates.js
+
+
+function WebGLRenderState( extensions, capabilities ) {
+
+	const lights = new WebGLLights( extensions, capabilities );
+
+	const lightsArray = [];
+	const shadowsArray = [];
+
+	function init() {
+
+		lightsArray.length = 0;
+		shadowsArray.length = 0;
+
+	}
+
+	function pushLight( light ) {
+
+		lightsArray.push( light );
+
+	}
+
+	function pushShadow( shadowLight ) {
+
+		shadowsArray.push( shadowLight );
+
+	}
+
+	function setupLights( physicallyCorrectLights ) {
+
+		lights.setup( lightsArray, physicallyCorrectLights );
+
+	}
+
+	function setupLightsView( camera ) {
+
+		lights.setupView( lightsArray, camera );
+
+	}
+
+	const state = {
+		lightsArray: lightsArray,
+		shadowsArray: shadowsArray,
+
+		lights: lights
+	};
+
+	return {
+		init: init,
+		state: state,
+		setupLights: setupLights,
+		setupLightsView: setupLightsView,
+
+		pushLight: pushLight,
+		pushShadow: pushShadow
+	};
+
+}
+
+function WebGLRenderStates( extensions, capabilities ) {
+
+	let renderStates = new WeakMap();
+
+	function get( scene, renderCallDepth = 0 ) {
+
+		let renderState;
+
+		if ( renderStates.has( scene ) === false ) {
+
+			renderState = new WebGLRenderState( extensions, capabilities );
+			renderStates.set( scene, [ renderState ] );
+
+		} else {
+
+			if ( renderCallDepth >= renderStates.get( scene ).length ) {
+
+				renderState = new WebGLRenderState( extensions, capabilities );
+				renderStates.get( scene ).push( renderState );
+
+			} else {
+
+				renderState = renderStates.get( scene )[ renderCallDepth ];
+
+			}
+
+		}
+
+		return renderState;
+
+	}
+
+	function dispose() {
+
+		renderStates = new WeakMap();
+
+	}
+
+	return {
+		get: get,
+		dispose: dispose
+	};
+
+}
+
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/materials/MeshDepthMaterial.js
+
+
+
+/**
+ * parameters = {
+ *
+ *  opacity: <float>,
+ *
+ *  map: new THREE.Texture( <Image> ),
+ *
+ *  alphaMap: new THREE.Texture( <Image> ),
+ *
+ *  displacementMap: new THREE.Texture( <Image> ),
+ *  displacementScale: <float>,
+ *  displacementBias: <float>,
+ *
+ *  wireframe: <boolean>,
+ *  wireframeLinewidth: <float>
+ * }
+ */
+
+class MeshDepthMaterial extends Material {
+
+	constructor( parameters ) {
+
+		super();
+
+		this.type = 'MeshDepthMaterial';
+
+		this.depthPacking = BasicDepthPacking;
+
+		this.map = null;
+
+		this.alphaMap = null;
+
+		this.displacementMap = null;
+		this.displacementScale = 1;
+		this.displacementBias = 0;
+
+		this.wireframe = false;
+		this.wireframeLinewidth = 1;
+
+		this.fog = false;
+
+		this.setValues( parameters );
+
+	}
+
+	copy( source ) {
+
+		super.copy( source );
+
+		this.depthPacking = source.depthPacking;
+
+		this.map = source.map;
+
+		this.alphaMap = source.alphaMap;
+
+		this.displacementMap = source.displacementMap;
+		this.displacementScale = source.displacementScale;
+		this.displacementBias = source.displacementBias;
+
+		this.wireframe = source.wireframe;
+		this.wireframeLinewidth = source.wireframeLinewidth;
+
+		return this;
+
+	}
+
+}
+
+MeshDepthMaterial.prototype.isMeshDepthMaterial = true;
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/materials/MeshDistanceMaterial.js
+
+
+
+/**
+ * parameters = {
+ *
+ *  referencePosition: <float>,
+ *  nearDistance: <float>,
+ *  farDistance: <float>,
+ *
+ *  map: new THREE.Texture( <Image> ),
+ *
+ *  alphaMap: new THREE.Texture( <Image> ),
+ *
+ *  displacementMap: new THREE.Texture( <Image> ),
+ *  displacementScale: <float>,
+ *  displacementBias: <float>
+ *
+ * }
+ */
+
+class MeshDistanceMaterial extends Material {
+
+	constructor( parameters ) {
+
+		super();
+
+		this.type = 'MeshDistanceMaterial';
+
+		this.referencePosition = new Vector3();
+		this.nearDistance = 1;
+		this.farDistance = 1000;
+
+		this.map = null;
+
+		this.alphaMap = null;
+
+		this.displacementMap = null;
+		this.displacementScale = 1;
+		this.displacementBias = 0;
+
+		this.fog = false;
+
+		this.setValues( parameters );
+
+	}
+
+	copy( source ) {
+
+		super.copy( source );
+
+		this.referencePosition.copy( source.referencePosition );
+		this.nearDistance = source.nearDistance;
+		this.farDistance = source.farDistance;
+
+		this.map = source.map;
+
+		this.alphaMap = source.alphaMap;
+
+		this.displacementMap = source.displacementMap;
+		this.displacementScale = source.displacementScale;
+		this.displacementBias = source.displacementBias;
+
+		return this;
+
+	}
+
+}
+
+MeshDistanceMaterial.prototype.isMeshDistanceMaterial = true;
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/shaders/ShaderLib/vsm.glsl.js
+const vsm_glsl_vertex = /* glsl */`
+void main() {
+
+	gl_Position = vec4( position, 1.0 );
+
+}
+`;
+
+const vsm_glsl_fragment = /* glsl */`
+uniform sampler2D shadow_pass;
+uniform vec2 resolution;
+uniform float radius;
+
+#include <packing>
+
+void main() {
+
+	const float samples = float( VSM_SAMPLES );
+
+	float mean = 0.0;
+	float squared_mean = 0.0;
+
+	// This seems totally useless but it's a crazy work around for a Adreno compiler bug
+	// float depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy ) / resolution ) );
+
+	float uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );
+	float uvStart = samples <= 1.0 ? 0.0 : - 1.0;
+	for ( float i = 0.0; i < samples; i ++ ) {
+
+		float uvOffset = uvStart + i * uvStride;
+
+		#ifdef HORIZONTAL_PASS
+
+			vec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ) );
+			mean += distribution.x;
+			squared_mean += distribution.y * distribution.y + distribution.x * distribution.x;
+
+		#else
+
+			float depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ) );
+			mean += depth;
+			squared_mean += depth * depth;
+
+		#endif
+
+	}
+
+	mean = mean / samples;
+	squared_mean = squared_mean / samples;
+
+	float std_dev = sqrt( squared_mean - mean * mean );
+
+	gl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );
+
+}
+`;
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/webgl/WebGLShadowMap.js
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+function WebGLShadowMap( _renderer, _objects, _capabilities ) {
+
+	let _frustum = new Frustum();
+
+	const _shadowMapSize = new Vector2(),
+		_viewportSize = new Vector2(),
+
+		_viewport = new Vector4(),
+
+		_depthMaterial = new MeshDepthMaterial( { depthPacking: RGBADepthPacking } ),
+		_distanceMaterial = new MeshDistanceMaterial(),
+
+		_materialCache = {},
+
+		_maxTextureSize = _capabilities.maxTextureSize;
+
+	const shadowSide = { 0: BackSide, 1: FrontSide, 2: DoubleSide };
+
+	const shadowMaterialVertical = new ShaderMaterial( {
+		defines: {
+			VSM_SAMPLES: 8
+		},
+		uniforms: {
+			shadow_pass: { value: null },
+			resolution: { value: new Vector2() },
+			radius: { value: 4.0 }
+		},
+
+		vertexShader: vsm_glsl_vertex,
+		fragmentShader: vsm_glsl_fragment
+
+	} );
+
+	const shadowMaterialHorizontal = shadowMaterialVertical.clone();
+	shadowMaterialHorizontal.defines.HORIZONTAL_PASS = 1;
+
+	const fullScreenTri = new BufferGeometry();
+	fullScreenTri.setAttribute(
+		'position',
+		new BufferAttribute(
+			new Float32Array( [ - 1, - 1, 0.5, 3, - 1, 0.5, - 1, 3, 0.5 ] ),
+			3
+		)
+	);
+
+	const fullScreenMesh = new Mesh( fullScreenTri, shadowMaterialVertical );
+
+	const scope = this;
+
+	this.enabled = false;
+
+	this.autoUpdate = true;
+	this.needsUpdate = false;
+
+	this.type = PCFShadowMap;
+
+	this.render = function ( lights, scene, camera ) {
+
+		if ( scope.enabled === false ) return;
+		if ( scope.autoUpdate === false && scope.needsUpdate === false ) return;
+
+		if ( lights.length === 0 ) return;
+
+		const currentRenderTarget = _renderer.getRenderTarget();
+		const activeCubeFace = _renderer.getActiveCubeFace();
+		const activeMipmapLevel = _renderer.getActiveMipmapLevel();
+
+		const _state = _renderer.state;
+
+		// Set GL state for depth map.
+		_state.setBlending( NoBlending );
+		_state.buffers.color.setClear( 1, 1, 1, 1 );
+		_state.buffers.depth.setTest( true );
+		_state.setScissorTest( false );
+
+		// render depth map
+
+		for ( let i = 0, il = lights.length; i < il; i ++ ) {
+
+			const light = lights[ i ];
+			const shadow = light.shadow;
+
+			if ( shadow === undefined ) {
+
+				console.warn( 'THREE.WebGLShadowMap:', light, 'has no shadow.' );
+				continue;
+
+			}
+
+			if ( shadow.autoUpdate === false && shadow.needsUpdate === false ) continue;
+
+			_shadowMapSize.copy( shadow.mapSize );
+
+			const shadowFrameExtents = shadow.getFrameExtents();
+
+			_shadowMapSize.multiply( shadowFrameExtents );
+
+			_viewportSize.copy( shadow.mapSize );
+
+			if ( _shadowMapSize.x > _maxTextureSize || _shadowMapSize.y > _maxTextureSize ) {
+
+				if ( _shadowMapSize.x > _maxTextureSize ) {
+
+					_viewportSize.x = Math.floor( _maxTextureSize / shadowFrameExtents.x );
+					_shadowMapSize.x = _viewportSize.x * shadowFrameExtents.x;
+					shadow.mapSize.x = _viewportSize.x;
+
+				}
+
+				if ( _shadowMapSize.y > _maxTextureSize ) {
+
+					_viewportSize.y = Math.floor( _maxTextureSize / shadowFrameExtents.y );
+					_shadowMapSize.y = _viewportSize.y * shadowFrameExtents.y;
+					shadow.mapSize.y = _viewportSize.y;
+
+				}
+
+			}
+
+			if ( shadow.map === null && ! shadow.isPointLightShadow && this.type === VSMShadowMap ) {
+
+				const pars = { minFilter: LinearFilter, magFilter: LinearFilter, format: RGBAFormat };
+
+				shadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );
+				shadow.map.texture.name = light.name + '.shadowMap';
+
+				shadow.mapPass = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );
+
+				shadow.camera.updateProjectionMatrix();
+
+			}
+
+			if ( shadow.map === null ) {
+
+				const pars = { minFilter: NearestFilter, magFilter: NearestFilter, format: RGBAFormat };
+
+				shadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );
+				shadow.map.texture.name = light.name + '.shadowMap';
+
+				shadow.camera.updateProjectionMatrix();
+
+			}
+
+			_renderer.setRenderTarget( shadow.map );
+			_renderer.clear();
+
+			const viewportCount = shadow.getViewportCount();
+
+			for ( let vp = 0; vp < viewportCount; vp ++ ) {
+
+				const viewport = shadow.getViewport( vp );
+
+				_viewport.set(
+					_viewportSize.x * viewport.x,
+					_viewportSize.y * viewport.y,
+					_viewportSize.x * viewport.z,
+					_viewportSize.y * viewport.w
+				);
+
+				_state.viewport( _viewport );
+
+				shadow.updateMatrices( light, vp );
+
+				_frustum = shadow.getFrustum();
+
+				renderObject( scene, camera, shadow.camera, light, this.type );
+
+			}
+
+			// do blur pass for VSM
+
+			if ( ! shadow.isPointLightShadow && this.type === VSMShadowMap ) {
+
+				VSMPass( shadow, camera );
+
+			}
+
+			shadow.needsUpdate = false;
+
+		}
+
+		scope.needsUpdate = false;
+
+		_renderer.setRenderTarget( currentRenderTarget, activeCubeFace, activeMipmapLevel );
+
+	};
+
+	function VSMPass( shadow, camera ) {
+
+		const geometry = _objects.update( fullScreenMesh );
+
+		if ( shadowMaterialVertical.defines.VSM_SAMPLES !== shadow.blurSamples ) {
+
+			shadowMaterialVertical.defines.VSM_SAMPLES = shadow.blurSamples;
+			shadowMaterialHorizontal.defines.VSM_SAMPLES = shadow.blurSamples;
+
+			shadowMaterialVertical.needsUpdate = true;
+			shadowMaterialHorizontal.needsUpdate = true;
+
+		}
+
+		// vertical pass
+
+		shadowMaterialVertical.uniforms.shadow_pass.value = shadow.map.texture;
+		shadowMaterialVertical.uniforms.resolution.value = shadow.mapSize;
+		shadowMaterialVertical.uniforms.radius.value = shadow.radius;
+		_renderer.setRenderTarget( shadow.mapPass );
+		_renderer.clear();
+		_renderer.renderBufferDirect( camera, null, geometry, shadowMaterialVertical, fullScreenMesh, null );
+
+		// horizontal pass
+
+		shadowMaterialHorizontal.uniforms.shadow_pass.value = shadow.mapPass.texture;
+		shadowMaterialHorizontal.uniforms.resolution.value = shadow.mapSize;
+		shadowMaterialHorizontal.uniforms.radius.value = shadow.radius;
+		_renderer.setRenderTarget( shadow.map );
+		_renderer.clear();
+		_renderer.renderBufferDirect( camera, null, geometry, shadowMaterialHorizontal, fullScreenMesh, null );
+
+	}
+
+	function getDepthMaterial( object, geometry, material, light, shadowCameraNear, shadowCameraFar, type ) {
+
+		let result = null;
+
+		const customMaterial = ( light.isPointLight === true ) ? object.customDistanceMaterial : object.customDepthMaterial;
+
+		if ( customMaterial !== undefined ) {
+
+			result = customMaterial;
+
+		} else {
+
+			result = ( light.isPointLight === true ) ? _distanceMaterial : _depthMaterial;
+
+		}
+
+		if ( ( _renderer.localClippingEnabled && material.clipShadows === true && material.clippingPlanes.length !== 0 ) ||
+			( material.displacementMap && material.displacementScale !== 0 ) ||
+			( material.alphaMap && material.alphaTest > 0 ) ) {
+
+			// in this case we need a unique material instance reflecting the
+			// appropriate state
+
+			const keyA = result.uuid, keyB = material.uuid;
+
+			let materialsForVariant = _materialCache[ keyA ];
+
+			if ( materialsForVariant === undefined ) {
+
+				materialsForVariant = {};
+				_materialCache[ keyA ] = materialsForVariant;
+
+			}
+
+			let cachedMaterial = materialsForVariant[ keyB ];
+
+			if ( cachedMaterial === undefined ) {
+
+				cachedMaterial = result.clone();
+				materialsForVariant[ keyB ] = cachedMaterial;
+
+			}
+
+			result = cachedMaterial;
+
+		}
+
+		result.visible = material.visible;
+		result.wireframe = material.wireframe;
+
+		if ( type === VSMShadowMap ) {
+
+			result.side = ( material.shadowSide !== null ) ? material.shadowSide : material.side;
+
+		} else {
+
+			result.side = ( material.shadowSide !== null ) ? material.shadowSide : shadowSide[ material.side ];
+
+		}
+
+		result.alphaMap = material.alphaMap;
+		result.alphaTest = material.alphaTest;
+
+		result.clipShadows = material.clipShadows;
+		result.clippingPlanes = material.clippingPlanes;
+		result.clipIntersection = material.clipIntersection;
+
+		result.displacementMap = material.displacementMap;
+		result.displacementScale = material.displacementScale;
+		result.displacementBias = material.displacementBias;
+
+		result.wireframeLinewidth = material.wireframeLinewidth;
+		result.linewidth = material.linewidth;
+
+		if ( light.isPointLight === true && result.isMeshDistanceMaterial === true ) {
+
+			result.referencePosition.setFromMatrixPosition( light.matrixWorld );
+			result.nearDistance = shadowCameraNear;
+			result.farDistance = shadowCameraFar;
+
+		}
+
+		return result;
+
+	}
+
+	function renderObject( object, camera, shadowCamera, light, type ) {
+
+		if ( object.visible === false ) return;
+
+		const visible = object.layers.test( camera.layers );
+
+		if ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) {
+
+			if ( ( object.castShadow || ( object.receiveShadow && type === VSMShadowMap ) ) && ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) ) {
+
+				object.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld );
+
+				const geometry = _objects.update( object );
+				const material = object.material;
+
+				if ( Array.isArray( material ) ) {
+
+					const groups = geometry.groups;
+
+					for ( let k = 0, kl = groups.length; k < kl; k ++ ) {
+
+						const group = groups[ k ];
+						const groupMaterial = material[ group.materialIndex ];
+
+						if ( groupMaterial && groupMaterial.visible ) {
+
+							const depthMaterial = getDepthMaterial( object, geometry, groupMaterial, light, shadowCamera.near, shadowCamera.far, type );
+
+							_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group );
+
+						}
+
+					}
+
+				} else if ( material.visible ) {
+
+					const depthMaterial = getDepthMaterial( object, geometry, material, light, shadowCamera.near, shadowCamera.far, type );
+
+					_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null );
+
+				}
+
+			}
+
+		}
+
+		const children = object.children;
+
+		for ( let i = 0, l = children.length; i < l; i ++ ) {
+
+			renderObject( children[ i ], camera, shadowCamera, light, type );
+
+		}
+
+	}
+
+}
+
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/webgl/WebGLState.js
+
+
+
+function WebGLState( gl, extensions, capabilities ) {
+
+	const isWebGL2 = capabilities.isWebGL2;
+
+	function ColorBuffer() {
+
+		let locked = false;
+
+		const color = new Vector4();
+		let currentColorMask = null;
+		const currentColorClear = new Vector4( 0, 0, 0, 0 );
+
+		return {
+
+			setMask: function ( colorMask ) {
+
+				if ( currentColorMask !== colorMask && ! locked ) {
+
+					gl.colorMask( colorMask, colorMask, colorMask, colorMask );
+					currentColorMask = colorMask;
+
+				}
+
+			},
+
+			setLocked: function ( lock ) {
+
+				locked = lock;
+
+			},
+
+			setClear: function ( r, g, b, a, premultipliedAlpha ) {
+
+				if ( premultipliedAlpha === true ) {
+
+					r *= a; g *= a; b *= a;
+
+				}
+
+				color.set( r, g, b, a );
+
+				if ( currentColorClear.equals( color ) === false ) {
+
+					gl.clearColor( r, g, b, a );
+					currentColorClear.copy( color );
+
+				}
+
+			},
+
+			reset: function () {
+
+				locked = false;
+
+				currentColorMask = null;
+				currentColorClear.set( - 1, 0, 0, 0 ); // set to invalid state
+
+			}
+
+		};
+
+	}
+
+	function DepthBuffer() {
+
+		let locked = false;
+
+		let currentDepthMask = null;
+		let currentDepthFunc = null;
+		let currentDepthClear = null;
+
+		return {
+
+			setTest: function ( depthTest ) {
+
+				if ( depthTest ) {
+
+					enable( gl.DEPTH_TEST );
+
+				} else {
+
+					disable( gl.DEPTH_TEST );
+
+				}
+
+			},
+
+			setMask: function ( depthMask ) {
+
+				if ( currentDepthMask !== depthMask && ! locked ) {
+
+					gl.depthMask( depthMask );
+					currentDepthMask = depthMask;
+
+				}
+
+			},
+
+			setFunc: function ( depthFunc ) {
+
+				if ( currentDepthFunc !== depthFunc ) {
+
+					if ( depthFunc ) {
+
+						switch ( depthFunc ) {
+
+							case NeverDepth:
+
+								gl.depthFunc( gl.NEVER );
+								break;
+
+							case AlwaysDepth:
+
+								gl.depthFunc( gl.ALWAYS );
+								break;
+
+							case LessDepth:
+
+								gl.depthFunc( gl.LESS );
+								break;
+
+							case LessEqualDepth:
+
+								gl.depthFunc( gl.LEQUAL );
+								break;
+
+							case EqualDepth:
+
+								gl.depthFunc( gl.EQUAL );
+								break;
+
+							case GreaterEqualDepth:
+
+								gl.depthFunc( gl.GEQUAL );
+								break;
+
+							case GreaterDepth:
+
+								gl.depthFunc( gl.GREATER );
+								break;
+
+							case NotEqualDepth:
+
+								gl.depthFunc( gl.NOTEQUAL );
+								break;
+
+							default:
+
+								gl.depthFunc( gl.LEQUAL );
+
+						}
+
+					} else {
+
+						gl.depthFunc( gl.LEQUAL );
+
+					}
+
+					currentDepthFunc = depthFunc;
+
+				}
+
+			},
+
+			setLocked: function ( lock ) {
+
+				locked = lock;
+
+			},
+
+			setClear: function ( depth ) {
+
+				if ( currentDepthClear !== depth ) {
+
+					gl.clearDepth( depth );
+					currentDepthClear = depth;
+
+				}
+
+			},
+
+			reset: function () {
+
+				locked = false;
+
+				currentDepthMask = null;
+				currentDepthFunc = null;
+				currentDepthClear = null;
+
+			}
+
+		};
+
+	}
+
+	function StencilBuffer() {
+
+		let locked = false;
+
+		let currentStencilMask = null;
+		let currentStencilFunc = null;
+		let currentStencilRef = null;
+		let currentStencilFuncMask = null;
+		let currentStencilFail = null;
+		let currentStencilZFail = null;
+		let currentStencilZPass = null;
+		let currentStencilClear = null;
+
+		return {
+
+			setTest: function ( stencilTest ) {
+
+				if ( ! locked ) {
+
+					if ( stencilTest ) {
+
+						enable( gl.STENCIL_TEST );
+
+					} else {
+
+						disable( gl.STENCIL_TEST );
+
+					}
+
+				}
+
+			},
+
+			setMask: function ( stencilMask ) {
+
+				if ( currentStencilMask !== stencilMask && ! locked ) {
+
+					gl.stencilMask( stencilMask );
+					currentStencilMask = stencilMask;
+
+				}
+
+			},
+
+			setFunc: function ( stencilFunc, stencilRef, stencilMask ) {
+
+				if ( currentStencilFunc !== stencilFunc ||
+				     currentStencilRef !== stencilRef ||
+				     currentStencilFuncMask !== stencilMask ) {
+
+					gl.stencilFunc( stencilFunc, stencilRef, stencilMask );
+
+					currentStencilFunc = stencilFunc;
+					currentStencilRef = stencilRef;
+					currentStencilFuncMask = stencilMask;
+
+				}
+
+			},
+
+			setOp: function ( stencilFail, stencilZFail, stencilZPass ) {
+
+				if ( currentStencilFail !== stencilFail ||
+				     currentStencilZFail !== stencilZFail ||
+				     currentStencilZPass !== stencilZPass ) {
+
+					gl.stencilOp( stencilFail, stencilZFail, stencilZPass );
+
+					currentStencilFail = stencilFail;
+					currentStencilZFail = stencilZFail;
+					currentStencilZPass = stencilZPass;
+
+				}
+
+			},
+
+			setLocked: function ( lock ) {
+
+				locked = lock;
+
+			},
+
+			setClear: function ( stencil ) {
+
+				if ( currentStencilClear !== stencil ) {
+
+					gl.clearStencil( stencil );
+					currentStencilClear = stencil;
+
+				}
+
+			},
+
+			reset: function () {
+
+				locked = false;
+
+				currentStencilMask = null;
+				currentStencilFunc = null;
+				currentStencilRef = null;
+				currentStencilFuncMask = null;
+				currentStencilFail = null;
+				currentStencilZFail = null;
+				currentStencilZPass = null;
+				currentStencilClear = null;
+
+			}
+
+		};
+
+	}
+
+	//
+
+	const colorBuffer = new ColorBuffer();
+	const depthBuffer = new DepthBuffer();
+	const stencilBuffer = new StencilBuffer();
+
+	let enabledCapabilities = {};
+
+	let currentBoundFramebuffers = {};
+	let currentDrawbuffers = new WeakMap();
+	let defaultDrawbuffers = [];
+
+	let currentProgram = null;
+
+	let currentBlendingEnabled = false;
+	let currentBlending = null;
+	let currentBlendEquation = null;
+	let currentBlendSrc = null;
+	let currentBlendDst = null;
+	let currentBlendEquationAlpha = null;
+	let currentBlendSrcAlpha = null;
+	let currentBlendDstAlpha = null;
+	let currentPremultipledAlpha = false;
+
+	let currentFlipSided = null;
+	let currentCullFace = null;
+
+	let currentLineWidth = null;
+
+	let currentPolygonOffsetFactor = null;
+	let currentPolygonOffsetUnits = null;
+
+	const maxTextures = gl.getParameter( gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS );
+
+	let lineWidthAvailable = false;
+	let version = 0;
+	const glVersion = gl.getParameter( gl.VERSION );
+
+	if ( glVersion.indexOf( 'WebGL' ) !== - 1 ) {
+
+		version = parseFloat( /^WebGL (\d)/.exec( glVersion )[ 1 ] );
+		lineWidthAvailable = ( version >= 1.0 );
+
+	} else if ( glVersion.indexOf( 'OpenGL ES' ) !== - 1 ) {
+
+		version = parseFloat( /^OpenGL ES (\d)/.exec( glVersion )[ 1 ] );
+		lineWidthAvailable = ( version >= 2.0 );
+
+	}
+
+	let currentTextureSlot = null;
+	let currentBoundTextures = {};
+
+	const scissorParam = gl.getParameter( gl.SCISSOR_BOX );
+	const viewportParam = gl.getParameter( gl.VIEWPORT );
+
+	const currentScissor = new Vector4().fromArray( scissorParam );
+	const currentViewport = new Vector4().fromArray( viewportParam );
+
+	function createTexture( type, target, count ) {
+
+		const data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4.
+		const texture = gl.createTexture();
+
+		gl.bindTexture( type, texture );
+		gl.texParameteri( type, gl.TEXTURE_MIN_FILTER, gl.NEAREST );
+		gl.texParameteri( type, gl.TEXTURE_MAG_FILTER, gl.NEAREST );
+
+		for ( let i = 0; i < count; i ++ ) {
+
+			gl.texImage2D( target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data );
+
+		}
+
+		return texture;
+
+	}
+
+	const emptyTextures = {};
+	emptyTextures[ gl.TEXTURE_2D ] = createTexture( gl.TEXTURE_2D, gl.TEXTURE_2D, 1 );
+	emptyTextures[ gl.TEXTURE_CUBE_MAP ] = createTexture( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6 );
+
+	// init
+
+	colorBuffer.setClear( 0, 0, 0, 1 );
+	depthBuffer.setClear( 1 );
+	stencilBuffer.setClear( 0 );
+
+	enable( gl.DEPTH_TEST );
+	depthBuffer.setFunc( LessEqualDepth );
+
+	setFlipSided( false );
+	setCullFace( CullFaceBack );
+	enable( gl.CULL_FACE );
+
+	setBlending( NoBlending );
+
+	//
+
+	function enable( id ) {
+
+		if ( enabledCapabilities[ id ] !== true ) {
+
+			gl.enable( id );
+			enabledCapabilities[ id ] = true;
+
+		}
+
+	}
+
+	function disable( id ) {
+
+		if ( enabledCapabilities[ id ] !== false ) {
+
+			gl.disable( id );
+			enabledCapabilities[ id ] = false;
+
+		}
+
+	}
+
+	function bindFramebuffer( target, framebuffer ) {
+
+		if ( currentBoundFramebuffers[ target ] !== framebuffer ) {
+
+			gl.bindFramebuffer( target, framebuffer );
+
+			currentBoundFramebuffers[ target ] = framebuffer;
+
+			if ( isWebGL2 ) {
+
+				// gl.DRAW_FRAMEBUFFER is equivalent to gl.FRAMEBUFFER
+
+				if ( target === gl.DRAW_FRAMEBUFFER ) {
+
+					currentBoundFramebuffers[ gl.FRAMEBUFFER ] = framebuffer;
+
+				}
+
+				if ( target === gl.FRAMEBUFFER ) {
+
+					currentBoundFramebuffers[ gl.DRAW_FRAMEBUFFER ] = framebuffer;
+
+				}
+
+			}
+
+			return true;
+
+		}
+
+		return false;
+
+	}
+
+	function drawBuffers( renderTarget, framebuffer ) {
+
+		let drawBuffers = defaultDrawbuffers;
+
+		let needsUpdate = false;
+
+		if ( renderTarget ) {
+
+			drawBuffers = currentDrawbuffers.get( framebuffer );
+
+			if ( drawBuffers === undefined ) {
+
+				drawBuffers = [];
+				currentDrawbuffers.set( framebuffer, drawBuffers );
+
+			}
+
+			if ( renderTarget.isWebGLMultipleRenderTargets ) {
+
+				const textures = renderTarget.texture;
+
+				if ( drawBuffers.length !== textures.length || drawBuffers[ 0 ] !== gl.COLOR_ATTACHMENT0 ) {
+
+					for ( let i = 0, il = textures.length; i < il; i ++ ) {
+
+						drawBuffers[ i ] = gl.COLOR_ATTACHMENT0 + i;
+
+					}
+
+					drawBuffers.length = textures.length;
+
+					needsUpdate = true;
+
+				}
+
+			} else {
+
+				if ( drawBuffers[ 0 ] !== gl.COLOR_ATTACHMENT0 ) {
+
+					drawBuffers[ 0 ] = gl.COLOR_ATTACHMENT0;
+
+					needsUpdate = true;
+
+				}
+
+			}
+
+		} else {
+
+			if ( drawBuffers[ 0 ] !== gl.BACK ) {
+
+				drawBuffers[ 0 ] = gl.BACK;
+
+				needsUpdate = true;
+
+			}
+
+		}
+
+		if ( needsUpdate ) {
+
+			if ( capabilities.isWebGL2 ) {
+
+				gl.drawBuffers( drawBuffers );
+
+			} else {
+
+				extensions.get( 'WEBGL_draw_buffers' ).drawBuffersWEBGL( drawBuffers );
+
+			}
+
+		}
+
+
+	}
+
+	function useProgram( program ) {
+
+		if ( currentProgram !== program ) {
+
+			gl.useProgram( program );
+
+			currentProgram = program;
+
+			return true;
+
+		}
+
+		return false;
+
+	}
+
+	const equationToGL = {
+		[ AddEquation ]: gl.FUNC_ADD,
+		[ SubtractEquation ]: gl.FUNC_SUBTRACT,
+		[ ReverseSubtractEquation ]: gl.FUNC_REVERSE_SUBTRACT
+	};
+
+	if ( isWebGL2 ) {
+
+		equationToGL[ MinEquation ] = gl.MIN;
+		equationToGL[ MaxEquation ] = gl.MAX;
+
+	} else {
+
+		const extension = extensions.get( 'EXT_blend_minmax' );
+
+		if ( extension !== null ) {
+
+			equationToGL[ MinEquation ] = extension.MIN_EXT;
+			equationToGL[ MaxEquation ] = extension.MAX_EXT;
+
+		}
+
+	}
+
+	const factorToGL = {
+		[ ZeroFactor ]: gl.ZERO,
+		[ OneFactor ]: gl.ONE,
+		[ SrcColorFactor ]: gl.SRC_COLOR,
+		[ SrcAlphaFactor ]: gl.SRC_ALPHA,
+		[ SrcAlphaSaturateFactor ]: gl.SRC_ALPHA_SATURATE,
+		[ DstColorFactor ]: gl.DST_COLOR,
+		[ DstAlphaFactor ]: gl.DST_ALPHA,
+		[ OneMinusSrcColorFactor ]: gl.ONE_MINUS_SRC_COLOR,
+		[ OneMinusSrcAlphaFactor ]: gl.ONE_MINUS_SRC_ALPHA,
+		[ OneMinusDstColorFactor ]: gl.ONE_MINUS_DST_COLOR,
+		[ OneMinusDstAlphaFactor ]: gl.ONE_MINUS_DST_ALPHA
+	};
+
+	function setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha ) {
+
+		if ( blending === NoBlending ) {
+
+			if ( currentBlendingEnabled === true ) {
+
+				disable( gl.BLEND );
+				currentBlendingEnabled = false;
+
+			}
+
+			return;
+
+		}
+
+		if ( currentBlendingEnabled === false ) {
+
+			enable( gl.BLEND );
+			currentBlendingEnabled = true;
+
+		}
+
+		if ( blending !== CustomBlending ) {
+
+			if ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) {
+
+				if ( currentBlendEquation !== AddEquation || currentBlendEquationAlpha !== AddEquation ) {
+
+					gl.blendEquation( gl.FUNC_ADD );
+
+					currentBlendEquation = AddEquation;
+					currentBlendEquationAlpha = AddEquation;
+
+				}
+
+				if ( premultipliedAlpha ) {
+
+					switch ( blending ) {
+
+						case NormalBlending:
+							gl.blendFuncSeparate( gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );
+							break;
+
+						case AdditiveBlending:
+							gl.blendFunc( gl.ONE, gl.ONE );
+							break;
+
+						case SubtractiveBlending:
+							gl.blendFuncSeparate( gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ZERO, gl.ONE );
+							break;
+
+						case MultiplyBlending:
+							gl.blendFuncSeparate( gl.ZERO, gl.SRC_COLOR, gl.ZERO, gl.SRC_ALPHA );
+							break;
+
+						default:
+							console.error( 'THREE.WebGLState: Invalid blending: ', blending );
+							break;
+
+					}
+
+				} else {
+
+					switch ( blending ) {
+
+						case NormalBlending:
+							gl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );
+							break;
+
+						case AdditiveBlending:
+							gl.blendFunc( gl.SRC_ALPHA, gl.ONE );
+							break;
+
+						case SubtractiveBlending:
+							gl.blendFuncSeparate( gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ZERO, gl.ONE );
+							break;
+
+						case MultiplyBlending:
+							gl.blendFunc( gl.ZERO, gl.SRC_COLOR );
+							break;
+
+						default:
+							console.error( 'THREE.WebGLState: Invalid blending: ', blending );
+							break;
+
+					}
+
+				}
+
+				currentBlendSrc = null;
+				currentBlendDst = null;
+				currentBlendSrcAlpha = null;
+				currentBlendDstAlpha = null;
+
+				currentBlending = blending;
+				currentPremultipledAlpha = premultipliedAlpha;
+
+			}
+
+			return;
+
+		}
+
+		// custom blending
+
+		blendEquationAlpha = blendEquationAlpha || blendEquation;
+		blendSrcAlpha = blendSrcAlpha || blendSrc;
+		blendDstAlpha = blendDstAlpha || blendDst;
+
+		if ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) {
+
+			gl.blendEquationSeparate( equationToGL[ blendEquation ], equationToGL[ blendEquationAlpha ] );
+
+			currentBlendEquation = blendEquation;
+			currentBlendEquationAlpha = blendEquationAlpha;
+
+		}
+
+		if ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) {
+
+			gl.blendFuncSeparate( factorToGL[ blendSrc ], factorToGL[ blendDst ], factorToGL[ blendSrcAlpha ], factorToGL[ blendDstAlpha ] );
+
+			currentBlendSrc = blendSrc;
+			currentBlendDst = blendDst;
+			currentBlendSrcAlpha = blendSrcAlpha;
+			currentBlendDstAlpha = blendDstAlpha;
+
+		}
+
+		currentBlending = blending;
+		currentPremultipledAlpha = null;
+
+	}
+
+	function setMaterial( material, frontFaceCW ) {
+
+		material.side === DoubleSide
+			? disable( gl.CULL_FACE )
+			: enable( gl.CULL_FACE );
+
+		let flipSided = ( material.side === BackSide );
+		if ( frontFaceCW ) flipSided = ! flipSided;
+
+		setFlipSided( flipSided );
+
+		( material.blending === NormalBlending && material.transparent === false )
+			? setBlending( NoBlending )
+			: setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha );
+
+		depthBuffer.setFunc( material.depthFunc );
+		depthBuffer.setTest( material.depthTest );
+		depthBuffer.setMask( material.depthWrite );
+		colorBuffer.setMask( material.colorWrite );
+
+		const stencilWrite = material.stencilWrite;
+		stencilBuffer.setTest( stencilWrite );
+		if ( stencilWrite ) {
+
+			stencilBuffer.setMask( material.stencilWriteMask );
+			stencilBuffer.setFunc( material.stencilFunc, material.stencilRef, material.stencilFuncMask );
+			stencilBuffer.setOp( material.stencilFail, material.stencilZFail, material.stencilZPass );
+
+		}
+
+		setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );
+
+		material.alphaToCoverage === true
+			? enable( gl.SAMPLE_ALPHA_TO_COVERAGE )
+			: disable( gl.SAMPLE_ALPHA_TO_COVERAGE );
+
+	}
+
+	//
+
+	function setFlipSided( flipSided ) {
+
+		if ( currentFlipSided !== flipSided ) {
+
+			if ( flipSided ) {
+
+				gl.frontFace( gl.CW );
+
+			} else {
+
+				gl.frontFace( gl.CCW );
+
+			}
+
+			currentFlipSided = flipSided;
+
+		}
+
+	}
+
+	function setCullFace( cullFace ) {
+
+		if ( cullFace !== CullFaceNone ) {
+
+			enable( gl.CULL_FACE );
+
+			if ( cullFace !== currentCullFace ) {
+
+				if ( cullFace === CullFaceBack ) {
+
+					gl.cullFace( gl.BACK );
+
+				} else if ( cullFace === CullFaceFront ) {
+
+					gl.cullFace( gl.FRONT );
+
+				} else {
+
+					gl.cullFace( gl.FRONT_AND_BACK );
+
+				}
+
+			}
+
+		} else {
+
+			disable( gl.CULL_FACE );
+
+		}
+
+		currentCullFace = cullFace;
+
+	}
+
+	function setLineWidth( width ) {
+
+		if ( width !== currentLineWidth ) {
+
+			if ( lineWidthAvailable ) gl.lineWidth( width );
+
+			currentLineWidth = width;
+
+		}
+
+	}
+
+	function setPolygonOffset( polygonOffset, factor, units ) {
+
+		if ( polygonOffset ) {
+
+			enable( gl.POLYGON_OFFSET_FILL );
+
+			if ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) {
+
+				gl.polygonOffset( factor, units );
+
+				currentPolygonOffsetFactor = factor;
+				currentPolygonOffsetUnits = units;
+
+			}
+
+		} else {
+
+			disable( gl.POLYGON_OFFSET_FILL );
+
+		}
+
+	}
+
+	function setScissorTest( scissorTest ) {
+
+		if ( scissorTest ) {
+
+			enable( gl.SCISSOR_TEST );
+
+		} else {
+
+			disable( gl.SCISSOR_TEST );
+
+		}
+
+	}
+
+	// texture
+
+	function activeTexture( webglSlot ) {
+
+		if ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1;
+
+		if ( currentTextureSlot !== webglSlot ) {
+
+			gl.activeTexture( webglSlot );
+			currentTextureSlot = webglSlot;
+
+		}
+
+	}
+
+	function bindTexture( webglType, webglTexture ) {
+
+		if ( currentTextureSlot === null ) {
+
+			activeTexture();
+
+		}
+
+		let boundTexture = currentBoundTextures[ currentTextureSlot ];
+
+		if ( boundTexture === undefined ) {
+
+			boundTexture = { type: undefined, texture: undefined };
+			currentBoundTextures[ currentTextureSlot ] = boundTexture;
+
+		}
+
+		if ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) {
+
+			gl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] );
+
+			boundTexture.type = webglType;
+			boundTexture.texture = webglTexture;
+
+		}
+
+	}
+
+	function unbindTexture() {
+
+		const boundTexture = currentBoundTextures[ currentTextureSlot ];
+
+		if ( boundTexture !== undefined && boundTexture.type !== undefined ) {
+
+			gl.bindTexture( boundTexture.type, null );
+
+			boundTexture.type = undefined;
+			boundTexture.texture = undefined;
+
+		}
+
+	}
+
+	function compressedTexImage2D() {
+
+		try {
+
+			gl.compressedTexImage2D.apply( gl, arguments );
+
+		} catch ( error ) {
+
+			console.error( 'THREE.WebGLState:', error );
+
+		}
+
+	}
+
+	function texSubImage2D() {
+
+		try {
+
+			gl.texSubImage2D.apply( gl, arguments );
+
+		} catch ( error ) {
+
+			console.error( 'THREE.WebGLState:', error );
+
+		}
+
+	}
+
+	function texSubImage3D() {
+
+		try {
+
+			gl.texSubImage3D.apply( gl, arguments );
+
+		} catch ( error ) {
+
+			console.error( 'THREE.WebGLState:', error );
+
+		}
+
+	}
+
+	function compressedTexSubImage2D() {
+
+		try {
+
+			gl.compressedTexSubImage2D.apply( gl, arguments );
+
+		} catch ( error ) {
+
+			console.error( 'THREE.WebGLState:', error );
+
+		}
+
+	}
+
+	function texStorage2D() {
+
+		try {
+
+			gl.texStorage2D.apply( gl, arguments );
+
+		} catch ( error ) {
+
+			console.error( 'THREE.WebGLState:', error );
+
+		}
+
+	}
+
+	function texStorage3D() {
+
+		try {
+
+			gl.texStorage3D.apply( gl, arguments );
+
+		} catch ( error ) {
+
+			console.error( 'THREE.WebGLState:', error );
+
+		}
+
+	}
+
+	function texImage2D() {
+
+		try {
+
+			gl.texImage2D.apply( gl, arguments );
+
+		} catch ( error ) {
+
+			console.error( 'THREE.WebGLState:', error );
+
+		}
+
+	}
+
+	function texImage3D() {
+
+		try {
+
+			gl.texImage3D.apply( gl, arguments );
+
+		} catch ( error ) {
+
+			console.error( 'THREE.WebGLState:', error );
+
+		}
+
+	}
+
+	//
+
+	function scissor( scissor ) {
+
+		if ( currentScissor.equals( scissor ) === false ) {
+
+			gl.scissor( scissor.x, scissor.y, scissor.z, scissor.w );
+			currentScissor.copy( scissor );
+
+		}
+
+	}
+
+	function viewport( viewport ) {
+
+		if ( currentViewport.equals( viewport ) === false ) {
+
+			gl.viewport( viewport.x, viewport.y, viewport.z, viewport.w );
+			currentViewport.copy( viewport );
+
+		}
+
+	}
+
+	//
+
+	function reset() {
+
+		// reset state
+
+		gl.disable( gl.BLEND );
+		gl.disable( gl.CULL_FACE );
+		gl.disable( gl.DEPTH_TEST );
+		gl.disable( gl.POLYGON_OFFSET_FILL );
+		gl.disable( gl.SCISSOR_TEST );
+		gl.disable( gl.STENCIL_TEST );
+		gl.disable( gl.SAMPLE_ALPHA_TO_COVERAGE );
+
+		gl.blendEquation( gl.FUNC_ADD );
+		gl.blendFunc( gl.ONE, gl.ZERO );
+		gl.blendFuncSeparate( gl.ONE, gl.ZERO, gl.ONE, gl.ZERO );
+
+		gl.colorMask( true, true, true, true );
+		gl.clearColor( 0, 0, 0, 0 );
+
+		gl.depthMask( true );
+		gl.depthFunc( gl.LESS );
+		gl.clearDepth( 1 );
+
+		gl.stencilMask( 0xffffffff );
+		gl.stencilFunc( gl.ALWAYS, 0, 0xffffffff );
+		gl.stencilOp( gl.KEEP, gl.KEEP, gl.KEEP );
+		gl.clearStencil( 0 );
+
+		gl.cullFace( gl.BACK );
+		gl.frontFace( gl.CCW );
+
+		gl.polygonOffset( 0, 0 );
+
+		gl.activeTexture( gl.TEXTURE0 );
+
+		gl.bindFramebuffer( gl.FRAMEBUFFER, null );
+
+		if ( isWebGL2 === true ) {
+
+			gl.bindFramebuffer( gl.DRAW_FRAMEBUFFER, null );
+			gl.bindFramebuffer( gl.READ_FRAMEBUFFER, null );
+
+		}
+
+		gl.useProgram( null );
+
+		gl.lineWidth( 1 );
+
+		gl.scissor( 0, 0, gl.canvas.width, gl.canvas.height );
+		gl.viewport( 0, 0, gl.canvas.width, gl.canvas.height );
+
+		// reset internals
+
+		enabledCapabilities = {};
+
+		currentTextureSlot = null;
+		currentBoundTextures = {};
+
+		currentBoundFramebuffers = {};
+		currentDrawbuffers = new WeakMap();
+		defaultDrawbuffers = [];
+
+		currentProgram = null;
+
+		currentBlendingEnabled = false;
+		currentBlending = null;
+		currentBlendEquation = null;
+		currentBlendSrc = null;
+		currentBlendDst = null;
+		currentBlendEquationAlpha = null;
+		currentBlendSrcAlpha = null;
+		currentBlendDstAlpha = null;
+		currentPremultipledAlpha = false;
+
+		currentFlipSided = null;
+		currentCullFace = null;
+
+		currentLineWidth = null;
+
+		currentPolygonOffsetFactor = null;
+		currentPolygonOffsetUnits = null;
+
+		currentScissor.set( 0, 0, gl.canvas.width, gl.canvas.height );
+		currentViewport.set( 0, 0, gl.canvas.width, gl.canvas.height );
+
+		colorBuffer.reset();
+		depthBuffer.reset();
+		stencilBuffer.reset();
+
+	}
+
+	return {
+
+		buffers: {
+			color: colorBuffer,
+			depth: depthBuffer,
+			stencil: stencilBuffer
+		},
+
+		enable: enable,
+		disable: disable,
+
+		bindFramebuffer: bindFramebuffer,
+		drawBuffers: drawBuffers,
+
+		useProgram: useProgram,
+
+		setBlending: setBlending,
+		setMaterial: setMaterial,
+
+		setFlipSided: setFlipSided,
+		setCullFace: setCullFace,
+
+		setLineWidth: setLineWidth,
+		setPolygonOffset: setPolygonOffset,
+
+		setScissorTest: setScissorTest,
+
+		activeTexture: activeTexture,
+		bindTexture: bindTexture,
+		unbindTexture: unbindTexture,
+		compressedTexImage2D: compressedTexImage2D,
+		texImage2D: texImage2D,
+		texImage3D: texImage3D,
+
+		texStorage2D: texStorage2D,
+		texStorage3D: texStorage3D,
+		texSubImage2D: texSubImage2D,
+		texSubImage3D: texSubImage3D,
+		compressedTexSubImage2D: compressedTexSubImage2D,
+
+		scissor: scissor,
+		viewport: viewport,
+
+		reset: reset
+
+	};
+
+}
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/webgl/WebGLTextures.js
+
+
+
+
+
+function WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ) {
+
+	const isWebGL2 = capabilities.isWebGL2;
+	const maxTextures = capabilities.maxTextures;
+	const maxCubemapSize = capabilities.maxCubemapSize;
+	const maxTextureSize = capabilities.maxTextureSize;
+	const maxSamples = capabilities.maxSamples;
+	const hasMultisampledRenderToTexture = extensions.has( 'WEBGL_multisampled_render_to_texture' );
+	const MultisampledRenderToTextureExtension = hasMultisampledRenderToTexture ? extensions.get( 'WEBGL_multisampled_render_to_texture' ) : undefined;
+
+	const _videoTextures = new WeakMap();
+	let _canvas;
+
+	// cordova iOS (as of 5.0) still uses UIWebView, which provides OffscreenCanvas,
+	// also OffscreenCanvas.getContext("webgl"), but not OffscreenCanvas.getContext("2d")!
+	// Some implementations may only implement OffscreenCanvas partially (e.g. lacking 2d).
+
+	let useOffscreenCanvas = false;
+
+	try {
+
+		useOffscreenCanvas = typeof OffscreenCanvas !== 'undefined'
+			&& ( new OffscreenCanvas( 1, 1 ).getContext( '2d' ) ) !== null;
+
+	} catch ( err ) {
+
+		// Ignore any errors
+
+	}
+
+	function createCanvas( width, height ) {
+
+		// Use OffscreenCanvas when available. Specially needed in web workers
+
+		return useOffscreenCanvas ?
+			new OffscreenCanvas( width, height ) : createElementNS( 'canvas' );
+
+	}
+
+	function resizeImage( image, needsPowerOfTwo, needsNewCanvas, maxSize ) {
+
+		let scale = 1;
+
+		// handle case if texture exceeds max size
+
+		if ( image.width > maxSize || image.height > maxSize ) {
+
+			scale = maxSize / Math.max( image.width, image.height );
+
+		}
+
+		// only perform resize if necessary
+
+		if ( scale < 1 || needsPowerOfTwo === true ) {
+
+			// only perform resize for certain image types
+
+			if ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||
+				( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||
+				( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {
+
+				const floor = needsPowerOfTwo ? floorPowerOfTwo : Math.floor;
+
+				const width = floor( scale * image.width );
+				const height = floor( scale * image.height );
+
+				if ( _canvas === undefined ) _canvas = createCanvas( width, height );
+
+				// cube textures can't reuse the same canvas
+
+				const canvas = needsNewCanvas ? createCanvas( width, height ) : _canvas;
+
+				canvas.width = width;
+				canvas.height = height;
+
+				const context = canvas.getContext( '2d' );
+				context.drawImage( image, 0, 0, width, height );
+
+				console.warn( 'THREE.WebGLRenderer: Texture has been resized from (' + image.width + 'x' + image.height + ') to (' + width + 'x' + height + ').' );
+
+				return canvas;
+
+			} else {
+
+				if ( 'data' in image ) {
+
+					console.warn( 'THREE.WebGLRenderer: Image in DataTexture is too big (' + image.width + 'x' + image.height + ').' );
+
+				}
+
+				return image;
+
+			}
+
+		}
+
+		return image;
+
+	}
+
+	function isPowerOfTwo( image ) {
+
+		return MathUtils_isPowerOfTwo( image.width ) && MathUtils_isPowerOfTwo( image.height );
+
+	}
+
+	function textureNeedsPowerOfTwo( texture ) {
+
+		if ( isWebGL2 ) return false;
+
+		return ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) ||
+			( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter );
+
+	}
+
+	function textureNeedsGenerateMipmaps( texture, supportsMips ) {
+
+		return texture.generateMipmaps && supportsMips &&
+			texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter;
+
+	}
+
+	function generateMipmap( target ) {
+
+		_gl.generateMipmap( target );
+
+	}
+
+	function getInternalFormat( internalFormatName, glFormat, glType, encoding, isVideoTexture = false ) {
+
+		if ( isWebGL2 === false ) return glFormat;
+
+		if ( internalFormatName !== null ) {
+
+			if ( _gl[ internalFormatName ] !== undefined ) return _gl[ internalFormatName ];
+
+			console.warn( 'THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format \'' + internalFormatName + '\'' );
+
+		}
+
+		let internalFormat = glFormat;
+
+		if ( glFormat === _gl.RED ) {
+
+			if ( glType === _gl.FLOAT ) internalFormat = _gl.R32F;
+			if ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.R16F;
+			if ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.R8;
+
+		}
+
+		if ( glFormat === _gl.RG ) {
+
+			if ( glType === _gl.FLOAT ) internalFormat = _gl.RG32F;
+			if ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.RG16F;
+			if ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RG8;
+
+		}
+
+		if ( glFormat === _gl.RGBA ) {
+
+			if ( glType === _gl.FLOAT ) internalFormat = _gl.RGBA32F;
+			if ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.RGBA16F;
+			if ( glType === _gl.UNSIGNED_BYTE ) internalFormat = ( encoding === sRGBEncoding && isVideoTexture === false ) ? _gl.SRGB8_ALPHA8 : _gl.RGBA8;
+			if ( glType === _gl.UNSIGNED_SHORT_4_4_4_4 ) internalFormat = _gl.RGBA4;
+			if ( glType === _gl.UNSIGNED_SHORT_5_5_5_1 ) internalFormat = _gl.RGB5_A1;
+
+		}
+
+		if ( internalFormat === _gl.R16F || internalFormat === _gl.R32F ||
+			internalFormat === _gl.RG16F || internalFormat === _gl.RG32F ||
+			internalFormat === _gl.RGBA16F || internalFormat === _gl.RGBA32F ) {
+
+			extensions.get( 'EXT_color_buffer_float' );
+
+		}
+
+		return internalFormat;
+
+	}
+
+	function getMipLevels( texture, image, supportsMips ) {
+
+		if ( textureNeedsGenerateMipmaps( texture, supportsMips ) === true || ( texture.isFramebufferTexture && texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) ) {
+
+			return Math.log2( Math.max( image.width, image.height ) ) + 1;
+
+		} else if ( texture.mipmaps !== undefined && texture.mipmaps.length > 0 ) {
+
+			// user-defined mipmaps
+
+			return texture.mipmaps.length;
+
+		} else if ( texture.isCompressedTexture && Array.isArray( texture.image ) ) {
+
+			return image.mipmaps.length;
+
+		} else {
+
+			// texture without mipmaps (only base level)
+
+			return 1;
+
+		}
+
+	}
+
+	// Fallback filters for non-power-of-2 textures
+
+	function filterFallback( f ) {
+
+		if ( f === NearestFilter || f === NearestMipmapNearestFilter || f === NearestMipmapLinearFilter ) {
+
+			return _gl.NEAREST;
+
+		}
+
+		return _gl.LINEAR;
+
+	}
+
+	//
+
+	function onTextureDispose( event ) {
+
+		const texture = event.target;
+
+		texture.removeEventListener( 'dispose', onTextureDispose );
+
+		deallocateTexture( texture );
+
+		if ( texture.isVideoTexture ) {
+
+			_videoTextures.delete( texture );
+
+		}
+
+		info.memory.textures --;
+
+	}
+
+	function onRenderTargetDispose( event ) {
+
+		const renderTarget = event.target;
+
+		renderTarget.removeEventListener( 'dispose', onRenderTargetDispose );
+
+		deallocateRenderTarget( renderTarget );
+
+	}
+
+	//
+
+	function deallocateTexture( texture ) {
+
+		const textureProperties = properties.get( texture );
+
+		if ( textureProperties.__webglInit === undefined ) return;
+
+		_gl.deleteTexture( textureProperties.__webglTexture );
+
+		properties.remove( texture );
+
+	}
+
+	function deallocateRenderTarget( renderTarget ) {
+
+		const texture = renderTarget.texture;
+
+		const renderTargetProperties = properties.get( renderTarget );
+		const textureProperties = properties.get( texture );
+
+		if ( ! renderTarget ) return;
+
+		if ( textureProperties.__webglTexture !== undefined ) {
+
+			_gl.deleteTexture( textureProperties.__webglTexture );
+
+			info.memory.textures --;
+
+		}
+
+		if ( renderTarget.depthTexture ) {
+
+			renderTarget.depthTexture.dispose();
+
+		}
+
+		if ( renderTarget.isWebGLCubeRenderTarget ) {
+
+			for ( let i = 0; i < 6; i ++ ) {
+
+				_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );
+				if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] );
+
+			}
+
+		} else {
+
+			_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );
+			if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );
+			if ( renderTargetProperties.__webglMultisampledFramebuffer ) _gl.deleteFramebuffer( renderTargetProperties.__webglMultisampledFramebuffer );
+			if ( renderTargetProperties.__webglColorRenderbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglColorRenderbuffer );
+			if ( renderTargetProperties.__webglDepthRenderbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthRenderbuffer );
+
+		}
+
+		if ( renderTarget.isWebGLMultipleRenderTargets ) {
+
+			for ( let i = 0, il = texture.length; i < il; i ++ ) {
+
+				const attachmentProperties = properties.get( texture[ i ] );
+
+				if ( attachmentProperties.__webglTexture ) {
+
+					_gl.deleteTexture( attachmentProperties.__webglTexture );
+
+					info.memory.textures --;
+
+				}
+
+				properties.remove( texture[ i ] );
+
+			}
+
+		}
+
+		properties.remove( texture );
+		properties.remove( renderTarget );
+
+	}
+
+	//
+
+	let textureUnits = 0;
+
+	function resetTextureUnits() {
+
+		textureUnits = 0;
+
+	}
+
+	function allocateTextureUnit() {
+
+		const textureUnit = textureUnits;
+
+		if ( textureUnit >= maxTextures ) {
+
+			console.warn( 'THREE.WebGLTextures: Trying to use ' + textureUnit + ' texture units while this GPU supports only ' + maxTextures );
+
+		}
+
+		textureUnits += 1;
+
+		return textureUnit;
+
+	}
+
+	//
+
+	function setTexture2D( texture, slot ) {
+
+		const textureProperties = properties.get( texture );
+
+		if ( texture.isVideoTexture ) updateVideoTexture( texture );
+
+		if ( texture.version > 0 && textureProperties.__version !== texture.version ) {
+
+			const image = texture.image;
+
+			if ( image === undefined ) {
+
+				console.warn( 'THREE.WebGLRenderer: Texture marked for update but image is undefined' );
+
+			} else if ( image.complete === false ) {
+
+				console.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete' );
+
+			} else {
+
+				uploadTexture( textureProperties, texture, slot );
+				return;
+
+			}
+
+		}
+
+		state.activeTexture( _gl.TEXTURE0 + slot );
+		state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );
+
+	}
+
+	function setTexture2DArray( texture, slot ) {
+
+		const textureProperties = properties.get( texture );
+
+		if ( texture.version > 0 && textureProperties.__version !== texture.version ) {
+
+			uploadTexture( textureProperties, texture, slot );
+			return;
+
+		}
+
+		state.activeTexture( _gl.TEXTURE0 + slot );
+		state.bindTexture( _gl.TEXTURE_2D_ARRAY, textureProperties.__webglTexture );
+
+	}
+
+	function setTexture3D( texture, slot ) {
+
+		const textureProperties = properties.get( texture );
+
+		if ( texture.version > 0 && textureProperties.__version !== texture.version ) {
+
+			uploadTexture( textureProperties, texture, slot );
+			return;
+
+		}
+
+		state.activeTexture( _gl.TEXTURE0 + slot );
+		state.bindTexture( _gl.TEXTURE_3D, textureProperties.__webglTexture );
+
+	}
+
+	function setTextureCube( texture, slot ) {
+
+		const textureProperties = properties.get( texture );
+
+		if ( texture.version > 0 && textureProperties.__version !== texture.version ) {
+
+			uploadCubeTexture( textureProperties, texture, slot );
+			return;
+
+		}
+
+		state.activeTexture( _gl.TEXTURE0 + slot );
+		state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );
+
+	}
+
+	const wrappingToGL = {
+		[ RepeatWrapping ]: _gl.REPEAT,
+		[ ClampToEdgeWrapping ]: _gl.CLAMP_TO_EDGE,
+		[ MirroredRepeatWrapping ]: _gl.MIRRORED_REPEAT
+	};
+
+	const filterToGL = {
+		[ NearestFilter ]: _gl.NEAREST,
+		[ NearestMipmapNearestFilter ]: _gl.NEAREST_MIPMAP_NEAREST,
+		[ NearestMipmapLinearFilter ]: _gl.NEAREST_MIPMAP_LINEAR,
+
+		[ LinearFilter ]: _gl.LINEAR,
+		[ LinearMipmapNearestFilter ]: _gl.LINEAR_MIPMAP_NEAREST,
+		[ LinearMipmapLinearFilter ]: _gl.LINEAR_MIPMAP_LINEAR
+	};
+
+	function setTextureParameters( textureType, texture, supportsMips ) {
+
+		if ( supportsMips ) {
+
+			_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, wrappingToGL[ texture.wrapS ] );
+			_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, wrappingToGL[ texture.wrapT ] );
+
+			if ( textureType === _gl.TEXTURE_3D || textureType === _gl.TEXTURE_2D_ARRAY ) {
+
+				_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_R, wrappingToGL[ texture.wrapR ] );
+
+			}
+
+			_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterToGL[ texture.magFilter ] );
+			_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterToGL[ texture.minFilter ] );
+
+		} else {
+
+			_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE );
+			_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE );
+
+			if ( textureType === _gl.TEXTURE_3D || textureType === _gl.TEXTURE_2D_ARRAY ) {
+
+				_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_R, _gl.CLAMP_TO_EDGE );
+
+			}
+
+			if ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) {
+
+				console.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.' );
+
+			}
+
+			_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterFallback( texture.magFilter ) );
+			_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterFallback( texture.minFilter ) );
+
+			if ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) {
+
+				console.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.' );
+
+			}
+
+		}
+
+		if ( extensions.has( 'EXT_texture_filter_anisotropic' ) === true ) {
+
+			const extension = extensions.get( 'EXT_texture_filter_anisotropic' );
+
+			if ( texture.type === FloatType && extensions.has( 'OES_texture_float_linear' ) === false ) return; // verify extension for WebGL 1 and WebGL 2
+			if ( isWebGL2 === false && ( texture.type === HalfFloatType && extensions.has( 'OES_texture_half_float_linear' ) === false ) ) return; // verify extension for WebGL 1 only
+
+			if ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) {
+
+				_gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) );
+				properties.get( texture ).__currentAnisotropy = texture.anisotropy;
+
+			}
+
+		}
+
+	}
+
+	function initTexture( textureProperties, texture ) {
+
+		if ( textureProperties.__webglInit === undefined ) {
+
+			textureProperties.__webglInit = true;
+
+			texture.addEventListener( 'dispose', onTextureDispose );
+
+			textureProperties.__webglTexture = _gl.createTexture();
+
+			info.memory.textures ++;
+
+		}
+
+	}
+
+	function uploadTexture( textureProperties, texture, slot ) {
+
+		let textureType = _gl.TEXTURE_2D;
+
+		if ( texture.isDataTexture2DArray ) textureType = _gl.TEXTURE_2D_ARRAY;
+		if ( texture.isDataTexture3D ) textureType = _gl.TEXTURE_3D;
+
+		initTexture( textureProperties, texture );
+
+		state.activeTexture( _gl.TEXTURE0 + slot );
+		state.bindTexture( textureType, textureProperties.__webglTexture );
+
+		_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );
+		_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );
+		_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );
+		_gl.pixelStorei( _gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, _gl.NONE );
+
+		const needsPowerOfTwo = textureNeedsPowerOfTwo( texture ) && isPowerOfTwo( texture.image ) === false;
+		let image = resizeImage( texture.image, needsPowerOfTwo, false, maxTextureSize );
+		image = verifyColorSpace( texture, image );
+
+		const supportsMips = isPowerOfTwo( image ) || isWebGL2,
+			glFormat = utils.convert( texture.format, texture.encoding );
+
+		let glType = utils.convert( texture.type ),
+			glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding, texture.isVideoTexture );
+
+		setTextureParameters( textureType, texture, supportsMips );
+
+		let mipmap;
+		const mipmaps = texture.mipmaps;
+
+		const useTexStorage = ( isWebGL2 && texture.isVideoTexture !== true );
+		const allocateMemory = ( textureProperties.__version === undefined );
+		const levels = getMipLevels( texture, image, supportsMips );
+
+		if ( texture.isDepthTexture ) {
+
+			// populate depth texture with dummy data
+
+			glInternalFormat = _gl.DEPTH_COMPONENT;
+
+			if ( isWebGL2 ) {
+
+				if ( texture.type === FloatType ) {
+
+					glInternalFormat = _gl.DEPTH_COMPONENT32F;
+
+				} else if ( texture.type === UnsignedIntType ) {
+
+					glInternalFormat = _gl.DEPTH_COMPONENT24;
+
+				} else if ( texture.type === UnsignedInt248Type ) {
+
+					glInternalFormat = _gl.DEPTH24_STENCIL8;
+
+				} else {
+
+					glInternalFormat = _gl.DEPTH_COMPONENT16; // WebGL2 requires sized internalformat for glTexImage2D
+
+				}
+
+			} else {
+
+				if ( texture.type === FloatType ) {
+
+					console.error( 'WebGLRenderer: Floating point depth texture requires WebGL2.' );
+
+				}
+
+			}
+
+			// validation checks for WebGL 1
+
+			if ( texture.format === DepthFormat && glInternalFormat === _gl.DEPTH_COMPONENT ) {
+
+				// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are
+				// DEPTH_COMPONENT and type is not UNSIGNED_SHORT or UNSIGNED_INT
+				// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)
+				if ( texture.type !== UnsignedShortType && texture.type !== UnsignedIntType ) {
+
+					console.warn( 'THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.' );
+
+					texture.type = UnsignedShortType;
+					glType = utils.convert( texture.type );
+
+				}
+
+			}
+
+			if ( texture.format === DepthStencilFormat && glInternalFormat === _gl.DEPTH_COMPONENT ) {
+
+				// Depth stencil textures need the DEPTH_STENCIL internal format
+				// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)
+				glInternalFormat = _gl.DEPTH_STENCIL;
+
+				// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are
+				// DEPTH_STENCIL and type is not UNSIGNED_INT_24_8_WEBGL.
+				// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)
+				if ( texture.type !== UnsignedInt248Type ) {
+
+					console.warn( 'THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.' );
+
+					texture.type = UnsignedInt248Type;
+					glType = utils.convert( texture.type );
+
+				}
+
+			}
+
+			//
+
+			if ( useTexStorage && allocateMemory ) {
+
+				state.texStorage2D( _gl.TEXTURE_2D, 1, glInternalFormat, image.width, image.height );
+
+			} else {
+
+				state.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, null );
+
+			}
+
+		} else if ( texture.isDataTexture ) {
+
+			// use manually created mipmaps if available
+			// if there are no manual mipmaps
+			// set 0 level mipmap and then use GL to generate other mipmap levels
+
+			if ( mipmaps.length > 0 && supportsMips ) {
+
+				if ( useTexStorage && allocateMemory ) {
+
+					state.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );
+
+				}
+
+				for ( let i = 0, il = mipmaps.length; i < il; i ++ ) {
+
+					mipmap = mipmaps[ i ];
+
+					if ( useTexStorage ) {
+
+						state.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );
+
+					} else {
+
+						state.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );
+
+					}
+
+				}
+
+				texture.generateMipmaps = false;
+
+			} else {
+
+				if ( useTexStorage ) {
+
+					if ( allocateMemory ) {
+
+						state.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height );
+
+					}
+
+					state.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, image.width, image.height, glFormat, glType, image.data );
+
+				} else {
+
+					state.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, image.data );
+
+				}
+
+			}
+
+		} else if ( texture.isCompressedTexture ) {
+
+			if ( useTexStorage && allocateMemory ) {
+
+				state.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );
+
+			}
+
+			for ( let i = 0, il = mipmaps.length; i < il; i ++ ) {
+
+				mipmap = mipmaps[ i ];
+
+				if ( texture.format !== RGBAFormat ) {
+
+					if ( glFormat !== null ) {
+
+						if ( useTexStorage ) {
+
+							state.compressedTexSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );
+
+						} else {
+
+							state.compressedTexImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );
+
+						}
+
+					} else {
+
+						console.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' );
+
+					}
+
+				} else {
+
+					if ( useTexStorage ) {
+
+						state.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );
+
+					} else {
+
+						state.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );
+
+					}
+
+				}
+
+			}
+
+		} else if ( texture.isDataTexture2DArray ) {
+
+			if ( useTexStorage ) {
+
+				if ( allocateMemory ) {
+
+					state.texStorage3D( _gl.TEXTURE_2D_ARRAY, levels, glInternalFormat, image.width, image.height, image.depth );
+
+				}
+
+				state.texSubImage3D( _gl.TEXTURE_2D_ARRAY, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );
+
+			} else {
+
+				state.texImage3D( _gl.TEXTURE_2D_ARRAY, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );
+
+			}
+
+		} else if ( texture.isDataTexture3D ) {
+
+			if ( useTexStorage ) {
+
+				if ( allocateMemory ) {
+
+					state.texStorage3D( _gl.TEXTURE_3D, levels, glInternalFormat, image.width, image.height, image.depth );
+
+				}
+
+				state.texSubImage3D( _gl.TEXTURE_3D, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );
+
+			} else {
+
+				state.texImage3D( _gl.TEXTURE_3D, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );
+
+			}
+
+		} else if ( texture.isFramebufferTexture ) {
+
+			if ( useTexStorage && allocateMemory ) {
+
+				state.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height );
+
+			} else {
+
+				state.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, null );
+
+			}
+
+		} else {
+
+			// regular Texture (image, video, canvas)
+
+			// use manually created mipmaps if available
+			// if there are no manual mipmaps
+			// set 0 level mipmap and then use GL to generate other mipmap levels
+
+			if ( mipmaps.length > 0 && supportsMips ) {
+
+				if ( useTexStorage && allocateMemory ) {
+
+					state.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );
+
+				}
+
+				for ( let i = 0, il = mipmaps.length; i < il; i ++ ) {
+
+					mipmap = mipmaps[ i ];
+
+					if ( useTexStorage ) {
+
+						state.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, glFormat, glType, mipmap );
+
+					} else {
+
+						state.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, glFormat, glType, mipmap );
+
+					}
+
+				}
+
+				texture.generateMipmaps = false;
+
+			} else {
+
+				if ( useTexStorage ) {
+
+					if ( allocateMemory ) {
+
+						state.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height );
+
+					}
+
+					state.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, glFormat, glType, image );
+
+				} else {
+
+					state.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, glFormat, glType, image );
+
+				}
+
+			}
+
+		}
+
+		if ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {
+
+			generateMipmap( textureType );
+
+		}
+
+		textureProperties.__version = texture.version;
+
+		if ( texture.onUpdate ) texture.onUpdate( texture );
+
+	}
+
+	function uploadCubeTexture( textureProperties, texture, slot ) {
+
+		if ( texture.image.length !== 6 ) return;
+
+		initTexture( textureProperties, texture );
+
+		state.activeTexture( _gl.TEXTURE0 + slot );
+		state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );
+
+		_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );
+		_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );
+		_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );
+		_gl.pixelStorei( _gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, _gl.NONE );
+
+		const isCompressed = ( texture && ( texture.isCompressedTexture || texture.image[ 0 ].isCompressedTexture ) );
+		const isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture );
+
+		const cubeImage = [];
+
+		for ( let i = 0; i < 6; i ++ ) {
+
+			if ( ! isCompressed && ! isDataTexture ) {
+
+				cubeImage[ i ] = resizeImage( texture.image[ i ], false, true, maxCubemapSize );
+
+			} else {
+
+				cubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ];
+
+			}
+
+			cubeImage[ i ] = verifyColorSpace( texture, cubeImage[ i ] );
+
+		}
+
+		const image = cubeImage[ 0 ],
+			supportsMips = isPowerOfTwo( image ) || isWebGL2,
+			glFormat = utils.convert( texture.format, texture.encoding ),
+			glType = utils.convert( texture.type ),
+			glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );
+
+		const useTexStorage = ( isWebGL2 && texture.isVideoTexture !== true );
+		const allocateMemory = ( textureProperties.__version === undefined );
+		let levels = getMipLevels( texture, image, supportsMips );
+
+		setTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, supportsMips );
+
+		let mipmaps;
+
+		if ( isCompressed ) {
+
+			if ( useTexStorage && allocateMemory ) {
+
+				state.texStorage2D( _gl.TEXTURE_CUBE_MAP, levels, glInternalFormat, image.width, image.height );
+
+			}
+
+			for ( let i = 0; i < 6; i ++ ) {
+
+				mipmaps = cubeImage[ i ].mipmaps;
+
+				for ( let j = 0; j < mipmaps.length; j ++ ) {
+
+					const mipmap = mipmaps[ j ];
+
+					if ( texture.format !== RGBAFormat ) {
+
+						if ( glFormat !== null ) {
+
+							if ( useTexStorage ) {
+
+								state.compressedTexSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );
+
+							} else {
+
+								state.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );
+
+							}
+
+						} else {
+
+							console.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()' );
+
+						}
+
+					} else {
+
+						if ( useTexStorage ) {
+
+							state.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );
+
+						} else {
+
+							state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );
+
+						}
+
+					}
+
+				}
+
+			}
+
+		} else {
+
+			mipmaps = texture.mipmaps;
+
+			if ( useTexStorage && allocateMemory ) {
+
+				// TODO: Uniformly handle mipmap definitions
+				// Normal textures and compressed cube textures define base level + mips with their mipmap array
+				// Uncompressed cube textures use their mipmap array only for mips (no base level)
+
+				if ( mipmaps.length > 0 ) levels ++;
+
+				state.texStorage2D( _gl.TEXTURE_CUBE_MAP, levels, glInternalFormat, cubeImage[ 0 ].width, cubeImage[ 0 ].height );
+
+			}
+
+			for ( let i = 0; i < 6; i ++ ) {
+
+				if ( isDataTexture ) {
+
+					if ( useTexStorage ) {
+
+						state.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, cubeImage[ i ].width, cubeImage[ i ].height, glFormat, glType, cubeImage[ i ].data );
+
+					} else {
+
+						state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data );
+
+					}
+
+					for ( let j = 0; j < mipmaps.length; j ++ ) {
+
+						const mipmap = mipmaps[ j ];
+						const mipmapImage = mipmap.image[ i ].image;
+
+						if ( useTexStorage ) {
+
+							state.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, 0, 0, mipmapImage.width, mipmapImage.height, glFormat, glType, mipmapImage.data );
+
+						} else {
+
+							state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, mipmapImage.width, mipmapImage.height, 0, glFormat, glType, mipmapImage.data );
+
+						}
+
+					}
+
+				} else {
+
+					if ( useTexStorage ) {
+
+						state.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, glFormat, glType, cubeImage[ i ] );
+
+					} else {
+
+						state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, glFormat, glType, cubeImage[ i ] );
+
+					}
+
+					for ( let j = 0; j < mipmaps.length; j ++ ) {
+
+						const mipmap = mipmaps[ j ];
+
+						if ( useTexStorage ) {
+
+							state.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, 0, 0, glFormat, glType, mipmap.image[ i ] );
+
+						} else {
+
+							state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, glFormat, glType, mipmap.image[ i ] );
+
+						}
+
+					}
+
+				}
+
+			}
+
+		}
+
+		if ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {
+
+			// We assume images for cube map have the same size.
+			generateMipmap( _gl.TEXTURE_CUBE_MAP );
+
+		}
+
+		textureProperties.__version = texture.version;
+
+		if ( texture.onUpdate ) texture.onUpdate( texture );
+
+	}
+
+	// Render targets
+
+	// Setup storage for target texture and bind it to correct framebuffer
+	function setupFrameBufferTexture( framebuffer, renderTarget, texture, attachment, textureTarget ) {
+
+		const glFormat = utils.convert( texture.format, texture.encoding );
+		const glType = utils.convert( texture.type );
+		const glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );
+		const renderTargetProperties = properties.get( renderTarget );
+
+		if ( ! renderTargetProperties.__hasExternalTextures ) {
+
+			if ( textureTarget === _gl.TEXTURE_3D || textureTarget === _gl.TEXTURE_2D_ARRAY ) {
+
+				state.texImage3D( textureTarget, 0, glInternalFormat, renderTarget.width, renderTarget.height, renderTarget.depth, 0, glFormat, glType, null );
+
+			} else {
+
+				state.texImage2D( textureTarget, 0, glInternalFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );
+
+			}
+
+		}
+
+		state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
+		if ( renderTarget.useRenderToTexture ) {
+
+			MultisampledRenderToTextureExtension.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( texture ).__webglTexture, 0, getRenderTargetSamples( renderTarget ) );
+
+		} else {
+
+			_gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( texture ).__webglTexture, 0 );
+
+		}
+
+		state.bindFramebuffer( _gl.FRAMEBUFFER, null );
+
+	}
+
+
+	// Setup storage for internal depth/stencil buffers and bind to correct framebuffer
+	function setupRenderBufferStorage( renderbuffer, renderTarget, isMultisample ) {
+
+		_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );
+
+		if ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) {
+
+			let glInternalFormat = _gl.DEPTH_COMPONENT16;
+
+			if ( isMultisample || renderTarget.useRenderToTexture ) {
+
+				const depthTexture = renderTarget.depthTexture;
+
+				if ( depthTexture && depthTexture.isDepthTexture ) {
+
+					if ( depthTexture.type === FloatType ) {
+
+						glInternalFormat = _gl.DEPTH_COMPONENT32F;
+
+					} else if ( depthTexture.type === UnsignedIntType ) {
+
+						glInternalFormat = _gl.DEPTH_COMPONENT24;
+
+					}
+
+				}
+
+				const samples = getRenderTargetSamples( renderTarget );
+
+				if ( renderTarget.useRenderToTexture ) {
+
+					MultisampledRenderToTextureExtension.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );
+
+				} else {
+
+					_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );
+
+				}
+
+			} else {
+
+				_gl.renderbufferStorage( _gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height );
+
+			}
+
+			_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );
+
+		} else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) {
+
+			const samples = getRenderTargetSamples( renderTarget );
+
+			if ( isMultisample && renderTarget.useRenderbuffer ) {
+
+				_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, _gl.DEPTH24_STENCIL8, renderTarget.width, renderTarget.height );
+
+			} else if ( renderTarget.useRenderToTexture ) {
+
+				MultisampledRenderToTextureExtension.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, _gl.DEPTH24_STENCIL8, renderTarget.width, renderTarget.height );
+
+			} else {
+
+				_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height );
+
+			}
+
+
+			_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );
+
+		} else {
+
+			// Use the first texture for MRT so far
+			const texture = renderTarget.isWebGLMultipleRenderTargets === true ? renderTarget.texture[ 0 ] : renderTarget.texture;
+
+			const glFormat = utils.convert( texture.format, texture.encoding );
+			const glType = utils.convert( texture.type );
+			const glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );
+			const samples = getRenderTargetSamples( renderTarget );
+
+			if ( isMultisample && renderTarget.useRenderbuffer ) {
+
+				_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );
+
+			} else if ( renderTarget.useRenderToTexture ) {
+
+				MultisampledRenderToTextureExtension.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );
+
+			} else {
+
+				_gl.renderbufferStorage( _gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height );
+
+			}
+
+		}
+
+		_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );
+
+	}
+
+	// Setup resources for a Depth Texture for a FBO (needs an extension)
+	function setupDepthTexture( framebuffer, renderTarget ) {
+
+		const isCube = ( renderTarget && renderTarget.isWebGLCubeRenderTarget );
+		if ( isCube ) throw new Error( 'Depth Texture with cube render targets is not supported' );
+
+		state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
+
+		if ( ! ( renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture ) ) {
+
+			throw new Error( 'renderTarget.depthTexture must be an instance of THREE.DepthTexture' );
+
+		}
+
+		// upload an empty depth texture with framebuffer size
+		if ( ! properties.get( renderTarget.depthTexture ).__webglTexture ||
+				renderTarget.depthTexture.image.width !== renderTarget.width ||
+				renderTarget.depthTexture.image.height !== renderTarget.height ) {
+
+			renderTarget.depthTexture.image.width = renderTarget.width;
+			renderTarget.depthTexture.image.height = renderTarget.height;
+			renderTarget.depthTexture.needsUpdate = true;
+
+		}
+
+		setTexture2D( renderTarget.depthTexture, 0 );
+
+		const webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture;
+		const samples = getRenderTargetSamples( renderTarget );
+
+		if ( renderTarget.depthTexture.format === DepthFormat ) {
+
+			if ( renderTarget.useRenderToTexture ) {
+
+				MultisampledRenderToTextureExtension.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0, samples );
+
+			} else {
+
+				_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );
+
+			}
+
+		} else if ( renderTarget.depthTexture.format === DepthStencilFormat ) {
+
+			if ( renderTarget.useRenderToTexture ) {
+
+				MultisampledRenderToTextureExtension.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0, samples );
+
+			} else {
+
+				_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );
+
+			}
+
+		} else {
+
+			throw new Error( 'Unknown depthTexture format' );
+
+		}
+
+	}
+
+	// Setup GL resources for a non-texture depth buffer
+	function setupDepthRenderbuffer( renderTarget ) {
+
+		const renderTargetProperties = properties.get( renderTarget );
+		const isCube = ( renderTarget.isWebGLCubeRenderTarget === true );
+
+		if ( renderTarget.depthTexture && ! renderTargetProperties.__autoAllocateDepthBuffer ) {
+
+			if ( isCube ) throw new Error( 'target.depthTexture not supported in Cube render targets' );
+
+			setupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget );
+
+		} else {
+
+			if ( isCube ) {
+
+				renderTargetProperties.__webglDepthbuffer = [];
+
+				for ( let i = 0; i < 6; i ++ ) {
+
+					state.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ] );
+					renderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer();
+					setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget, false );
+
+				}
+
+			} else {
+
+				state.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );
+				renderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer();
+				setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget, false );
+
+			}
+
+		}
+
+		state.bindFramebuffer( _gl.FRAMEBUFFER, null );
+
+	}
+
+	// rebind framebuffer with external textures
+	function rebindTextures( renderTarget, colorTexture, depthTexture ) {
+
+		const renderTargetProperties = properties.get( renderTarget );
+
+		if ( colorTexture !== undefined ) {
+
+			setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, renderTarget.texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D );
+
+		}
+
+		if ( depthTexture !== undefined ) {
+
+			setupDepthRenderbuffer( renderTarget );
+
+		}
+
+	}
+
+	// Set up GL resources for the render target
+	function setupRenderTarget( renderTarget ) {
+
+		const texture = renderTarget.texture;
+
+		const renderTargetProperties = properties.get( renderTarget );
+		const textureProperties = properties.get( texture );
+
+		renderTarget.addEventListener( 'dispose', onRenderTargetDispose );
+
+		if ( renderTarget.isWebGLMultipleRenderTargets !== true ) {
+
+			if ( textureProperties.__webglTexture === undefined ) {
+
+				textureProperties.__webglTexture = _gl.createTexture();
+
+			}
+
+			textureProperties.__version = texture.version;
+			info.memory.textures ++;
+
+		}
+
+		const isCube = ( renderTarget.isWebGLCubeRenderTarget === true );
+		const isMultipleRenderTargets = ( renderTarget.isWebGLMultipleRenderTargets === true );
+		const isRenderTarget3D = texture.isDataTexture3D || texture.isDataTexture2DArray;
+		const supportsMips = isPowerOfTwo( renderTarget ) || isWebGL2;
+
+		// Setup framebuffer
+
+		if ( isCube ) {
+
+			renderTargetProperties.__webglFramebuffer = [];
+
+			for ( let i = 0; i < 6; i ++ ) {
+
+				renderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer();
+
+			}
+
+		} else {
+
+			renderTargetProperties.__webglFramebuffer = _gl.createFramebuffer();
+
+			if ( isMultipleRenderTargets ) {
+
+				if ( capabilities.drawBuffers ) {
+
+					const textures = renderTarget.texture;
+
+					for ( let i = 0, il = textures.length; i < il; i ++ ) {
+
+						const attachmentProperties = properties.get( textures[ i ] );
+
+						if ( attachmentProperties.__webglTexture === undefined ) {
+
+							attachmentProperties.__webglTexture = _gl.createTexture();
+
+							info.memory.textures ++;
+
+						}
+
+					}
+
+				} else {
+
+					console.warn( 'THREE.WebGLRenderer: WebGLMultipleRenderTargets can only be used with WebGL2 or WEBGL_draw_buffers extension.' );
+
+				}
+
+			} else if ( renderTarget.useRenderbuffer ) {
+
+				if ( isWebGL2 ) {
+
+					renderTargetProperties.__webglMultisampledFramebuffer = _gl.createFramebuffer();
+					renderTargetProperties.__webglColorRenderbuffer = _gl.createRenderbuffer();
+
+					_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer );
+
+					const glFormat = utils.convert( texture.format, texture.encoding );
+					const glType = utils.convert( texture.type );
+					const glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );
+					const samples = getRenderTargetSamples( renderTarget );
+					_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );
+
+					state.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );
+					_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer );
+					_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );
+
+					if ( renderTarget.depthBuffer ) {
+
+						renderTargetProperties.__webglDepthRenderbuffer = _gl.createRenderbuffer();
+						setupRenderBufferStorage( renderTargetProperties.__webglDepthRenderbuffer, renderTarget, true );
+
+					}
+
+					state.bindFramebuffer( _gl.FRAMEBUFFER, null );
+
+
+				} else {
+
+					console.warn( 'THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.' );
+
+				}
+
+			}
+
+		}
+
+		// Setup color buffer
+
+		if ( isCube ) {
+
+			state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );
+			setTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, supportsMips );
+
+			for ( let i = 0; i < 6; i ++ ) {
+
+				setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i );
+
+			}
+
+			if ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {
+
+				generateMipmap( _gl.TEXTURE_CUBE_MAP );
+
+			}
+
+			state.unbindTexture();
+
+		} else if ( isMultipleRenderTargets ) {
+
+			const textures = renderTarget.texture;
+
+			for ( let i = 0, il = textures.length; i < il; i ++ ) {
+
+				const attachment = textures[ i ];
+				const attachmentProperties = properties.get( attachment );
+
+				state.bindTexture( _gl.TEXTURE_2D, attachmentProperties.__webglTexture );
+				setTextureParameters( _gl.TEXTURE_2D, attachment, supportsMips );
+				setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, attachment, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D );
+
+				if ( textureNeedsGenerateMipmaps( attachment, supportsMips ) ) {
+
+					generateMipmap( _gl.TEXTURE_2D );
+
+				}
+
+			}
+
+			state.unbindTexture();
+
+		} else {
+
+			let glTextureType = _gl.TEXTURE_2D;
+
+			if ( isRenderTarget3D ) {
+
+				// Render targets containing layers, i.e: Texture 3D and 2d arrays
+
+				if ( isWebGL2 ) {
+
+					const isTexture3D = texture.isDataTexture3D;
+					glTextureType = isTexture3D ? _gl.TEXTURE_3D : _gl.TEXTURE_2D_ARRAY;
+
+				} else {
+
+					console.warn( 'THREE.DataTexture3D and THREE.DataTexture2DArray only supported with WebGL2.' );
+
+				}
+
+			}
+
+			state.bindTexture( glTextureType, textureProperties.__webglTexture );
+			setTextureParameters( glTextureType, texture, supportsMips );
+			setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, texture, _gl.COLOR_ATTACHMENT0, glTextureType );
+
+			if ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {
+
+				generateMipmap( glTextureType );
+
+			}
+
+			state.unbindTexture();
+
+		}
+
+		// Setup depth and stencil buffers
+
+		if ( renderTarget.depthBuffer ) {
+
+			setupDepthRenderbuffer( renderTarget );
+
+		}
+
+	}
+
+	function updateRenderTargetMipmap( renderTarget ) {
+
+		const supportsMips = isPowerOfTwo( renderTarget ) || isWebGL2;
+
+		const textures = renderTarget.isWebGLMultipleRenderTargets === true ? renderTarget.texture : [ renderTarget.texture ];
+
+		for ( let i = 0, il = textures.length; i < il; i ++ ) {
+
+			const texture = textures[ i ];
+
+			if ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {
+
+				const target = renderTarget.isWebGLCubeRenderTarget ? _gl.TEXTURE_CUBE_MAP : _gl.TEXTURE_2D;
+				const webglTexture = properties.get( texture ).__webglTexture;
+
+				state.bindTexture( target, webglTexture );
+				generateMipmap( target );
+				state.unbindTexture();
+
+			}
+
+		}
+
+	}
+
+	function updateMultisampleRenderTarget( renderTarget ) {
+
+		if ( renderTarget.useRenderbuffer ) {
+
+			if ( isWebGL2 ) {
+
+				const width = renderTarget.width;
+				const height = renderTarget.height;
+				let mask = _gl.COLOR_BUFFER_BIT;
+				const invalidationArray = [ _gl.COLOR_ATTACHMENT0 ];
+				const depthStyle = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;
+
+				if ( renderTarget.depthBuffer ) {
+
+					invalidationArray.push( depthStyle );
+
+				}
+
+				if ( ! renderTarget.ignoreDepthForMultisampleCopy ) {
+
+					if ( renderTarget.depthBuffer ) mask |= _gl.DEPTH_BUFFER_BIT;
+					if ( renderTarget.stencilBuffer ) mask |= _gl.STENCIL_BUFFER_BIT;
+
+				}
+
+				const renderTargetProperties = properties.get( renderTarget );
+
+				state.bindFramebuffer( _gl.READ_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );
+				state.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );
+
+				if ( renderTarget.ignoreDepthForMultisampleCopy ) {
+
+					_gl.invalidateFramebuffer( _gl.READ_FRAMEBUFFER, [ depthStyle ] );
+					_gl.invalidateFramebuffer( _gl.DRAW_FRAMEBUFFER, [ depthStyle ] );
+
+				}
+
+				_gl.blitFramebuffer( 0, 0, width, height, 0, 0, width, height, mask, _gl.NEAREST );
+				_gl.invalidateFramebuffer( _gl.READ_FRAMEBUFFER, invalidationArray );
+
+				state.bindFramebuffer( _gl.READ_FRAMEBUFFER, null );
+				state.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );
+
+			} else {
+
+				console.warn( 'THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.' );
+
+			}
+
+		}
+
+	}
+
+	function getRenderTargetSamples( renderTarget ) {
+
+		return ( isWebGL2 && ( renderTarget.useRenderbuffer || renderTarget.useRenderToTexture ) ) ?
+			Math.min( maxSamples, renderTarget.samples ) : 0;
+
+	}
+
+	function updateVideoTexture( texture ) {
+
+		const frame = info.render.frame;
+
+		// Check the last frame we updated the VideoTexture
+
+		if ( _videoTextures.get( texture ) !== frame ) {
+
+			_videoTextures.set( texture, frame );
+			texture.update();
+
+		}
+
+	}
+
+	function verifyColorSpace( texture, image ) {
+
+		const encoding = texture.encoding;
+		const format = texture.format;
+		const type = texture.type;
+
+		if ( texture.isCompressedTexture === true || texture.isVideoTexture === true || texture.format === _SRGBAFormat ) return image;
+
+		if ( encoding !== LinearEncoding ) {
+
+			// sRGB
+
+			if ( encoding === sRGBEncoding ) {
+
+				if ( isWebGL2 === false ) {
+
+					// in WebGL 1, try to use EXT_sRGB extension and unsized formats
+
+					if ( extensions.has( 'EXT_sRGB' ) === true && format === RGBAFormat ) {
+
+						texture.format = _SRGBAFormat;
+
+						// it's not possible to generate mips in WebGL 1 with this extension
+
+						texture.minFilter = LinearFilter;
+						texture.generateMipmaps = false;
+
+					} else {
+
+						// slow fallback (CPU decode)
+
+						image = ImageUtils.sRGBToLinear( image );
+
+					}
+
+				} else {
+
+					// in WebGL 2 uncompressed textures can only be sRGB encoded if they have the RGBA8 format
+
+					if ( format !== RGBAFormat || type !== UnsignedByteType ) {
+
+						console.warn( 'THREE.WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType.' );
+
+					}
+
+				}
+
+			} else {
+
+				console.error( 'THREE.WebGLTextures: Unsupported texture encoding:', encoding );
+
+			}
+
+		}
+
+		return image;
+
+	}
+
+	// backwards compatibility
+
+	let warnedTexture2D = false;
+	let warnedTextureCube = false;
+
+	function safeSetTexture2D( texture, slot ) {
+
+		if ( texture && texture.isWebGLRenderTarget ) {
+
+			if ( warnedTexture2D === false ) {
+
+				console.warn( 'THREE.WebGLTextures.safeSetTexture2D: don\'t use render targets as textures. Use their .texture property instead.' );
+				warnedTexture2D = true;
+
+			}
+
+			texture = texture.texture;
+
+		}
+
+		setTexture2D( texture, slot );
+
+	}
+
+	function safeSetTextureCube( texture, slot ) {
+
+		if ( texture && texture.isWebGLCubeRenderTarget ) {
+
+			if ( warnedTextureCube === false ) {
+
+				console.warn( 'THREE.WebGLTextures.safeSetTextureCube: don\'t use cube render targets as textures. Use their .texture property instead.' );
+				warnedTextureCube = true;
+
+			}
+
+			texture = texture.texture;
+
+		}
+
+
+		setTextureCube( texture, slot );
+
+	}
+
+	//
+
+	this.allocateTextureUnit = allocateTextureUnit;
+	this.resetTextureUnits = resetTextureUnits;
+
+	this.setTexture2D = setTexture2D;
+	this.setTexture2DArray = setTexture2DArray;
+	this.setTexture3D = setTexture3D;
+	this.setTextureCube = setTextureCube;
+	this.rebindTextures = rebindTextures;
+	this.setupRenderTarget = setupRenderTarget;
+	this.updateRenderTargetMipmap = updateRenderTargetMipmap;
+	this.updateMultisampleRenderTarget = updateMultisampleRenderTarget;
+	this.setupDepthRenderbuffer = setupDepthRenderbuffer;
+	this.setupFrameBufferTexture = setupFrameBufferTexture;
+
+	this.safeSetTexture2D = safeSetTexture2D;
+	this.safeSetTextureCube = safeSetTextureCube;
+
+}
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/webgl/WebGLUtils.js
+
+
+function WebGLUtils( gl, extensions, capabilities ) {
+
+	const isWebGL2 = capabilities.isWebGL2;
+
+	function convert( p, encoding = null ) {
+
+		let extension;
+
+		if ( p === UnsignedByteType ) return gl.UNSIGNED_BYTE;
+		if ( p === UnsignedShort4444Type ) return gl.UNSIGNED_SHORT_4_4_4_4;
+		if ( p === UnsignedShort5551Type ) return gl.UNSIGNED_SHORT_5_5_5_1;
+
+		if ( p === ByteType ) return gl.BYTE;
+		if ( p === ShortType ) return gl.SHORT;
+		if ( p === UnsignedShortType ) return gl.UNSIGNED_SHORT;
+		if ( p === IntType ) return gl.INT;
+		if ( p === UnsignedIntType ) return gl.UNSIGNED_INT;
+		if ( p === FloatType ) return gl.FLOAT;
+
+		if ( p === HalfFloatType ) {
+
+			if ( isWebGL2 ) return gl.HALF_FLOAT;
+
+			extension = extensions.get( 'OES_texture_half_float' );
+
+			if ( extension !== null ) {
+
+				return extension.HALF_FLOAT_OES;
+
+			} else {
+
+				return null;
+
+			}
+
+		}
+
+		if ( p === AlphaFormat ) return gl.ALPHA;
+		if ( p === RGBAFormat ) return gl.RGBA;
+		if ( p === LuminanceFormat ) return gl.LUMINANCE;
+		if ( p === LuminanceAlphaFormat ) return gl.LUMINANCE_ALPHA;
+		if ( p === DepthFormat ) return gl.DEPTH_COMPONENT;
+		if ( p === DepthStencilFormat ) return gl.DEPTH_STENCIL;
+		if ( p === RedFormat ) return gl.RED;
+
+		if ( p === RGBFormat ) {
+
+			console.warn( 'THREE.WebGLRenderer: THREE.RGBFormat has been removed. Use THREE.RGBAFormat instead. https://github.com/mrdoob/three.js/pull/23228' );
+			return gl.RGBA;
+
+		}
+
+		// WebGL 1 sRGB fallback
+
+		if ( p === _SRGBAFormat ) {
+
+			extension = extensions.get( 'EXT_sRGB' );
+
+			if ( extension !== null ) {
+
+				return extension.SRGB_ALPHA_EXT;
+
+			} else {
+
+				return null;
+
+			}
+
+		}
+
+		// WebGL2 formats.
+
+		if ( p === RedIntegerFormat ) return gl.RED_INTEGER;
+		if ( p === RGFormat ) return gl.RG;
+		if ( p === RGIntegerFormat ) return gl.RG_INTEGER;
+		if ( p === RGBAIntegerFormat ) return gl.RGBA_INTEGER;
+
+		// S3TC
+
+		if ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format || p === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) {
+
+			if ( encoding === sRGBEncoding ) {
+
+				extension = extensions.get( 'WEBGL_compressed_texture_s3tc_srgb' );
+
+				if ( extension !== null ) {
+
+					if ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_SRGB_S3TC_DXT1_EXT;
+					if ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;
+					if ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;
+					if ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT;
+
+				} else {
+
+					return null;
+
+				}
+
+			} else {
+
+				extension = extensions.get( 'WEBGL_compressed_texture_s3tc' );
+
+				if ( extension !== null ) {
+
+					if ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;
+					if ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;
+					if ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;
+					if ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT;
+
+				} else {
+
+					return null;
+
+				}
+
+			}
+
+		}
+
+		// PVRTC
+
+		if ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format || p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) {
+
+			extension = extensions.get( 'WEBGL_compressed_texture_pvrtc' );
+
+			if ( extension !== null ) {
+
+				if ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;
+				if ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;
+				if ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;
+				if ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;
+
+			} else {
+
+				return null;
+
+			}
+
+		}
+
+		// ETC1
+
+		if ( p === RGB_ETC1_Format ) {
+
+			extension = extensions.get( 'WEBGL_compressed_texture_etc1' );
+
+			if ( extension !== null ) {
+
+				return extension.COMPRESSED_RGB_ETC1_WEBGL;
+
+			} else {
+
+				return null;
+
+			}
+
+		}
+
+		// ETC2
+
+		if ( p === RGB_ETC2_Format || p === RGBA_ETC2_EAC_Format ) {
+
+			extension = extensions.get( 'WEBGL_compressed_texture_etc' );
+
+			if ( extension !== null ) {
+
+				if ( p === RGB_ETC2_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ETC2 : extension.COMPRESSED_RGB8_ETC2;
+				if ( p === RGBA_ETC2_EAC_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC : extension.COMPRESSED_RGBA8_ETC2_EAC;
+
+			} else {
+
+				return null;
+
+			}
+
+		}
+
+		// ASTC
+
+		if ( p === RGBA_ASTC_4x4_Format || p === RGBA_ASTC_5x4_Format || p === RGBA_ASTC_5x5_Format ||
+			p === RGBA_ASTC_6x5_Format || p === RGBA_ASTC_6x6_Format || p === RGBA_ASTC_8x5_Format ||
+			p === RGBA_ASTC_8x6_Format || p === RGBA_ASTC_8x8_Format || p === RGBA_ASTC_10x5_Format ||
+			p === RGBA_ASTC_10x6_Format || p === RGBA_ASTC_10x8_Format || p === RGBA_ASTC_10x10_Format ||
+			p === RGBA_ASTC_12x10_Format || p === RGBA_ASTC_12x12_Format ) {
+
+			extension = extensions.get( 'WEBGL_compressed_texture_astc' );
+
+			if ( extension !== null ) {
+
+				if ( p === RGBA_ASTC_4x4_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR : extension.COMPRESSED_RGBA_ASTC_4x4_KHR;
+				if ( p === RGBA_ASTC_5x4_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR : extension.COMPRESSED_RGBA_ASTC_5x4_KHR;
+				if ( p === RGBA_ASTC_5x5_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR : extension.COMPRESSED_RGBA_ASTC_5x5_KHR;
+				if ( p === RGBA_ASTC_6x5_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR : extension.COMPRESSED_RGBA_ASTC_6x5_KHR;
+				if ( p === RGBA_ASTC_6x6_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR : extension.COMPRESSED_RGBA_ASTC_6x6_KHR;
+				if ( p === RGBA_ASTC_8x5_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR : extension.COMPRESSED_RGBA_ASTC_8x5_KHR;
+				if ( p === RGBA_ASTC_8x6_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR : extension.COMPRESSED_RGBA_ASTC_8x6_KHR;
+				if ( p === RGBA_ASTC_8x8_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR : extension.COMPRESSED_RGBA_ASTC_8x8_KHR;
+				if ( p === RGBA_ASTC_10x5_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR : extension.COMPRESSED_RGBA_ASTC_10x5_KHR;
+				if ( p === RGBA_ASTC_10x6_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR : extension.COMPRESSED_RGBA_ASTC_10x6_KHR;
+				if ( p === RGBA_ASTC_10x8_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR : extension.COMPRESSED_RGBA_ASTC_10x8_KHR;
+				if ( p === RGBA_ASTC_10x10_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR : extension.COMPRESSED_RGBA_ASTC_10x10_KHR;
+				if ( p === RGBA_ASTC_12x10_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR : extension.COMPRESSED_RGBA_ASTC_12x10_KHR;
+				if ( p === RGBA_ASTC_12x12_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR : extension.COMPRESSED_RGBA_ASTC_12x12_KHR;
+
+			} else {
+
+				return null;
+
+			}
+
+		}
+
+		// BPTC
+
+		if ( p === RGBA_BPTC_Format ) {
+
+			extension = extensions.get( 'EXT_texture_compression_bptc' );
+
+			if ( extension !== null ) {
+
+				if ( p === RGBA_BPTC_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT : extension.COMPRESSED_RGBA_BPTC_UNORM_EXT;
+
+			} else {
+
+				return null;
+
+			}
+
+		}
+
+		//
+
+		if ( p === UnsignedInt248Type ) {
+
+			if ( isWebGL2 ) return gl.UNSIGNED_INT_24_8;
+
+			extension = extensions.get( 'WEBGL_depth_texture' );
+
+			if ( extension !== null ) {
+
+				return extension.UNSIGNED_INT_24_8_WEBGL;
+
+			} else {
+
+				return null;
+
+			}
+
+		}
+
+	}
+
+	return { convert: convert };
+
+}
+
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/cameras/ArrayCamera.js
+
+
+class ArrayCamera extends PerspectiveCamera {
+
+	constructor( array = [] ) {
+
+		super();
+
+		this.cameras = array;
+
+	}
+
+}
+
+ArrayCamera.prototype.isArrayCamera = true;
+
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/objects/Group.js
+
+
+class Group extends Object3D {
+
+	constructor() {
+
+		super();
+
+		this.type = 'Group';
+
+	}
+
+}
+
+Group.prototype.isGroup = true;
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/webxr/WebXRController.js
+
+
+
+const _moveEvent = { type: 'move' };
+
+class WebXRController {
+
+	constructor() {
+
+		this._targetRay = null;
+		this._grip = null;
+		this._hand = null;
+
+	}
+
+	getHandSpace() {
+
+		if ( this._hand === null ) {
+
+			this._hand = new Group();
+			this._hand.matrixAutoUpdate = false;
+			this._hand.visible = false;
+
+			this._hand.joints = {};
+			this._hand.inputState = { pinching: false };
+
+		}
+
+		return this._hand;
+
+	}
+
+	getTargetRaySpace() {
+
+		if ( this._targetRay === null ) {
+
+			this._targetRay = new Group();
+			this._targetRay.matrixAutoUpdate = false;
+			this._targetRay.visible = false;
+			this._targetRay.hasLinearVelocity = false;
+			this._targetRay.linearVelocity = new Vector3();
+			this._targetRay.hasAngularVelocity = false;
+			this._targetRay.angularVelocity = new Vector3();
+
+		}
+
+		return this._targetRay;
+
+	}
+
+	getGripSpace() {
+
+		if ( this._grip === null ) {
+
+			this._grip = new Group();
+			this._grip.matrixAutoUpdate = false;
+			this._grip.visible = false;
+			this._grip.hasLinearVelocity = false;
+			this._grip.linearVelocity = new Vector3();
+			this._grip.hasAngularVelocity = false;
+			this._grip.angularVelocity = new Vector3();
+
+		}
+
+		return this._grip;
+
+	}
+
+	dispatchEvent( event ) {
+
+		if ( this._targetRay !== null ) {
+
+			this._targetRay.dispatchEvent( event );
+
+		}
+
+		if ( this._grip !== null ) {
+
+			this._grip.dispatchEvent( event );
+
+		}
+
+		if ( this._hand !== null ) {
+
+			this._hand.dispatchEvent( event );
+
+		}
+
+		return this;
+
+	}
+
+	disconnect( inputSource ) {
+
+		this.dispatchEvent( { type: 'disconnected', data: inputSource } );
+
+		if ( this._targetRay !== null ) {
+
+			this._targetRay.visible = false;
+
+		}
+
+		if ( this._grip !== null ) {
+
+			this._grip.visible = false;
+
+		}
+
+		if ( this._hand !== null ) {
+
+			this._hand.visible = false;
+
+		}
+
+		return this;
+
+	}
+
+	update( inputSource, frame, referenceSpace ) {
+
+		let inputPose = null;
+		let gripPose = null;
+		let handPose = null;
+
+		const targetRay = this._targetRay;
+		const grip = this._grip;
+		const hand = this._hand;
+
+		if ( inputSource && frame.session.visibilityState !== 'visible-blurred' ) {
+
+			if ( targetRay !== null ) {
+
+				inputPose = frame.getPose( inputSource.targetRaySpace, referenceSpace );
+
+				if ( inputPose !== null ) {
+
+					targetRay.matrix.fromArray( inputPose.transform.matrix );
+					targetRay.matrix.decompose( targetRay.position, targetRay.rotation, targetRay.scale );
+
+					if ( inputPose.linearVelocity ) {
+
+						targetRay.hasLinearVelocity = true;
+						targetRay.linearVelocity.copy( inputPose.linearVelocity );
+
+					} else {
+
+						targetRay.hasLinearVelocity = false;
+
+					}
+
+					if ( inputPose.angularVelocity ) {
+
+						targetRay.hasAngularVelocity = true;
+						targetRay.angularVelocity.copy( inputPose.angularVelocity );
+
+					} else {
+
+						targetRay.hasAngularVelocity = false;
+
+					}
+
+					this.dispatchEvent( _moveEvent );
+
+				}
+
+			}
+
+			if ( hand && inputSource.hand ) {
+
+				handPose = true;
+
+				for ( const inputjoint of inputSource.hand.values() ) {
+
+					// Update the joints groups with the XRJoint poses
+					const jointPose = frame.getJointPose( inputjoint, referenceSpace );
+
+					if ( hand.joints[ inputjoint.jointName ] === undefined ) {
+
+						// The transform of this joint will be updated with the joint pose on each frame
+						const joint = new Group();
+						joint.matrixAutoUpdate = false;
+						joint.visible = false;
+						hand.joints[ inputjoint.jointName ] = joint;
+						// ??
+						hand.add( joint );
+
+					}
+
+					const joint = hand.joints[ inputjoint.jointName ];
+
+					if ( jointPose !== null ) {
+
+						joint.matrix.fromArray( jointPose.transform.matrix );
+						joint.matrix.decompose( joint.position, joint.rotation, joint.scale );
+						joint.jointRadius = jointPose.radius;
+
+					}
+
+					joint.visible = jointPose !== null;
+
+				}
+
+				// Custom events
+
+				// Check pinchz
+				const indexTip = hand.joints[ 'index-finger-tip' ];
+				const thumbTip = hand.joints[ 'thumb-tip' ];
+				const distance = indexTip.position.distanceTo( thumbTip.position );
+
+				const distanceToPinch = 0.02;
+				const threshold = 0.005;
+
+				if ( hand.inputState.pinching && distance > distanceToPinch + threshold ) {
+
+					hand.inputState.pinching = false;
+					this.dispatchEvent( {
+						type: 'pinchend',
+						handedness: inputSource.handedness,
+						target: this
+					} );
+
+				} else if ( ! hand.inputState.pinching && distance <= distanceToPinch - threshold ) {
+
+					hand.inputState.pinching = true;
+					this.dispatchEvent( {
+						type: 'pinchstart',
+						handedness: inputSource.handedness,
+						target: this
+					} );
+
+				}
+
+			} else {
+
+				if ( grip !== null && inputSource.gripSpace ) {
+
+					gripPose = frame.getPose( inputSource.gripSpace, referenceSpace );
+
+					if ( gripPose !== null ) {
+
+						grip.matrix.fromArray( gripPose.transform.matrix );
+						grip.matrix.decompose( grip.position, grip.rotation, grip.scale );
+
+						if ( gripPose.linearVelocity ) {
+
+							grip.hasLinearVelocity = true;
+							grip.linearVelocity.copy( gripPose.linearVelocity );
+
+						} else {
+
+							grip.hasLinearVelocity = false;
+
+						}
+
+						if ( gripPose.angularVelocity ) {
+
+							grip.hasAngularVelocity = true;
+							grip.angularVelocity.copy( gripPose.angularVelocity );
+
+						} else {
+
+							grip.hasAngularVelocity = false;
+
+						}
+
+					}
+
+				}
+
+			}
+
+		}
+
+		if ( targetRay !== null ) {
+
+			targetRay.visible = ( inputPose !== null );
+
+		}
+
+		if ( grip !== null ) {
+
+			grip.visible = ( gripPose !== null );
+
+		}
+
+		if ( hand !== null ) {
+
+			hand.visible = ( handPose !== null );
+
+		}
+
+		return this;
+
+	}
+
+}
+
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/textures/DepthTexture.js
+
+
+
+class DepthTexture extends Texture {
+
+	constructor( width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format ) {
+
+		format = format !== undefined ? format : DepthFormat;
+
+		if ( format !== DepthFormat && format !== DepthStencilFormat ) {
+
+			throw new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' );
+
+		}
+
+		if ( type === undefined && format === DepthFormat ) type = UnsignedShortType;
+		if ( type === undefined && format === DepthStencilFormat ) type = UnsignedInt248Type;
+
+		super( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );
+
+		this.image = { width: width, height: height };
+
+		this.magFilter = magFilter !== undefined ? magFilter : NearestFilter;
+		this.minFilter = minFilter !== undefined ? minFilter : NearestFilter;
+
+		this.flipY = false;
+		this.generateMipmaps	= false;
+
+	}
+
+
+}
+
+DepthTexture.prototype.isDepthTexture = true;
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/webxr/WebXRManager.js
+
+
+
+
+
+
+
+
+
+
+
+
+class WebXRManager extends EventDispatcher {
+
+	constructor( renderer, gl ) {
+
+		super();
+
+		const scope = this;
+
+		let session = null;
+		let framebufferScaleFactor = 1.0;
+
+		let referenceSpace = null;
+		let referenceSpaceType = 'local-floor';
+		const hasMultisampledRenderToTexture = renderer.extensions.has( 'WEBGL_multisampled_render_to_texture' );
+
+		let pose = null;
+		let glBinding = null;
+		let glProjLayer = null;
+		let glBaseLayer = null;
+		let isMultisample = false;
+		let xrFrame = null;
+		const attributes = gl.getContextAttributes();
+		let initialRenderTarget = null;
+		let newRenderTarget = null;
+
+		const controllers = [];
+		const inputSourcesMap = new Map();
+
+		//
+
+		const cameraL = new PerspectiveCamera();
+		cameraL.layers.enable( 1 );
+		cameraL.viewport = new Vector4();
+
+		const cameraR = new PerspectiveCamera();
+		cameraR.layers.enable( 2 );
+		cameraR.viewport = new Vector4();
+
+		const cameras = [ cameraL, cameraR ];
+
+		const cameraVR = new ArrayCamera();
+		cameraVR.layers.enable( 1 );
+		cameraVR.layers.enable( 2 );
+
+		let _currentDepthNear = null;
+		let _currentDepthFar = null;
+
+		//
+
+		this.cameraAutoUpdate = true;
+		this.enabled = false;
+
+		this.isPresenting = false;
+
+		this.getController = function ( index ) {
+
+			let controller = controllers[ index ];
+
+			if ( controller === undefined ) {
+
+				controller = new WebXRController();
+				controllers[ index ] = controller;
+
+			}
+
+			return controller.getTargetRaySpace();
+
+		};
+
+		this.getControllerGrip = function ( index ) {
+
+			let controller = controllers[ index ];
+
+			if ( controller === undefined ) {
+
+				controller = new WebXRController();
+				controllers[ index ] = controller;
+
+			}
+
+			return controller.getGripSpace();
+
+		};
+
+		this.getHand = function ( index ) {
+
+			let controller = controllers[ index ];
+
+			if ( controller === undefined ) {
+
+				controller = new WebXRController();
+				controllers[ index ] = controller;
+
+			}
+
+			return controller.getHandSpace();
+
+		};
+
+		//
+
+		function onSessionEvent( event ) {
+
+			const controller = inputSourcesMap.get( event.inputSource );
+
+			if ( controller ) {
+
+				controller.dispatchEvent( { type: event.type, data: event.inputSource } );
+
+			}
+
+		}
+
+		function onSessionEnd() {
+
+			inputSourcesMap.forEach( function ( controller, inputSource ) {
+
+				controller.disconnect( inputSource );
+
+			} );
+
+			inputSourcesMap.clear();
+
+			_currentDepthNear = null;
+			_currentDepthFar = null;
+
+			// restore framebuffer/rendering state
+
+			renderer.setRenderTarget( initialRenderTarget );
+
+			glBaseLayer = null;
+			glProjLayer = null;
+			glBinding = null;
+			session = null;
+			newRenderTarget = null;
+
+			//
+
+			animation.stop();
+
+			scope.isPresenting = false;
+
+			scope.dispatchEvent( { type: 'sessionend' } );
+
+		}
+
+		this.setFramebufferScaleFactor = function ( value ) {
+
+			framebufferScaleFactor = value;
+
+			if ( scope.isPresenting === true ) {
+
+				console.warn( 'THREE.WebXRManager: Cannot change framebuffer scale while presenting.' );
+
+			}
+
+		};
+
+		this.setReferenceSpaceType = function ( value ) {
+
+			referenceSpaceType = value;
+
+			if ( scope.isPresenting === true ) {
+
+				console.warn( 'THREE.WebXRManager: Cannot change reference space type while presenting.' );
+
+			}
+
+		};
+
+		this.getReferenceSpace = function () {
+
+			return referenceSpace;
+
+		};
+
+		this.getBaseLayer = function () {
+
+			return glProjLayer !== null ? glProjLayer : glBaseLayer;
+
+		};
+
+		this.getBinding = function () {
+
+			return glBinding;
+
+		};
+
+		this.getFrame = function () {
+
+			return xrFrame;
+
+		};
+
+		this.getSession = function () {
+
+			return session;
+
+		};
+
+		this.setSession = async function ( value ) {
+
+			session = value;
+
+			if ( session !== null ) {
+
+				initialRenderTarget = renderer.getRenderTarget();
+
+				session.addEventListener( 'select', onSessionEvent );
+				session.addEventListener( 'selectstart', onSessionEvent );
+				session.addEventListener( 'selectend', onSessionEvent );
+				session.addEventListener( 'squeeze', onSessionEvent );
+				session.addEventListener( 'squeezestart', onSessionEvent );
+				session.addEventListener( 'squeezeend', onSessionEvent );
+				session.addEventListener( 'end', onSessionEnd );
+				session.addEventListener( 'inputsourceschange', onInputSourcesChange );
+
+				if ( attributes.xrCompatible !== true ) {
+
+					await gl.makeXRCompatible();
+
+				}
+
+				if ( ( session.renderState.layers === undefined ) || ( renderer.capabilities.isWebGL2 === false ) ) {
+
+					const layerInit = {
+						antialias: ( session.renderState.layers === undefined ) ? attributes.antialias : true,
+						alpha: attributes.alpha,
+						depth: attributes.depth,
+						stencil: attributes.stencil,
+						framebufferScaleFactor: framebufferScaleFactor
+					};
+
+					glBaseLayer = new XRWebGLLayer( session, gl, layerInit );
+
+					session.updateRenderState( { baseLayer: glBaseLayer } );
+
+					newRenderTarget = new WebGLRenderTarget(
+						glBaseLayer.framebufferWidth,
+						glBaseLayer.framebufferHeight,
+						{
+							format: RGBAFormat,
+							type: UnsignedByteType,
+							encoding: renderer.outputEncoding
+						}
+					);
+
+				} else {
+
+					isMultisample = attributes.antialias;
+					let depthFormat = null;
+					let depthType = null;
+					let glDepthFormat = null;
+
+					if ( attributes.depth ) {
+
+						glDepthFormat = attributes.stencil ? gl.DEPTH24_STENCIL8 : gl.DEPTH_COMPONENT24;
+						depthFormat = attributes.stencil ? DepthStencilFormat : DepthFormat;
+						depthType = attributes.stencil ? UnsignedInt248Type : UnsignedShortType;
+
+					}
+
+					const projectionlayerInit = {
+						colorFormat: ( renderer.outputEncoding === sRGBEncoding ) ? gl.SRGB8_ALPHA8 : gl.RGBA8,
+						depthFormat: glDepthFormat,
+						scaleFactor: framebufferScaleFactor
+					};
+
+					glBinding = new XRWebGLBinding( session, gl );
+
+					glProjLayer = glBinding.createProjectionLayer( projectionlayerInit );
+
+					session.updateRenderState( { layers: [ glProjLayer ] } );
+
+					if ( isMultisample ) {
+
+						newRenderTarget = new WebGLMultisampleRenderTarget(
+							glProjLayer.textureWidth,
+							glProjLayer.textureHeight,
+							{
+								format: RGBAFormat,
+								type: UnsignedByteType,
+								depthTexture: new DepthTexture( glProjLayer.textureWidth, glProjLayer.textureHeight, depthType, undefined, undefined, undefined, undefined, undefined, undefined, depthFormat ),
+								stencilBuffer: attributes.stencil,
+								ignoreDepth: glProjLayer.ignoreDepthValues,
+								useRenderToTexture: hasMultisampledRenderToTexture,
+								encoding: renderer.outputEncoding
+							} );
+
+					} else {
+
+						newRenderTarget = new WebGLRenderTarget(
+							glProjLayer.textureWidth,
+							glProjLayer.textureHeight,
+							{
+								format: RGBAFormat,
+								type: UnsignedByteType,
+								depthTexture: new DepthTexture( glProjLayer.textureWidth, glProjLayer.textureHeight, depthType, undefined, undefined, undefined, undefined, undefined, undefined, depthFormat ),
+								stencilBuffer: attributes.stencil,
+								ignoreDepth: glProjLayer.ignoreDepthValues,
+								encoding: renderer.outputEncoding
+							} );
+
+					}
+
+				}
+
+				newRenderTarget.isXRRenderTarget = true; // TODO Remove this when possible, see #23278
+
+				// Set foveation to maximum.
+				this.setFoveation( 1.0 );
+
+				referenceSpace = await session.requestReferenceSpace( referenceSpaceType );
+
+				animation.setContext( session );
+				animation.start();
+
+				scope.isPresenting = true;
+
+				scope.dispatchEvent( { type: 'sessionstart' } );
+
+			}
+
+		};
+
+		function onInputSourcesChange( event ) {
+
+			const inputSources = session.inputSources;
+
+			// Assign inputSources to available controllers
+
+			for ( let i = 0; i < controllers.length; i ++ ) {
+
+				inputSourcesMap.set( inputSources[ i ], controllers[ i ] );
+
+			}
+
+			// Notify disconnected
+
+			for ( let i = 0; i < event.removed.length; i ++ ) {
+
+				const inputSource = event.removed[ i ];
+				const controller = inputSourcesMap.get( inputSource );
+
+				if ( controller ) {
+
+					controller.dispatchEvent( { type: 'disconnected', data: inputSource } );
+					inputSourcesMap.delete( inputSource );
+
+				}
+
+			}
+
+			// Notify connected
+
+			for ( let i = 0; i < event.added.length; i ++ ) {
+
+				const inputSource = event.added[ i ];
+				const controller = inputSourcesMap.get( inputSource );
+
+				if ( controller ) {
+
+					controller.dispatchEvent( { type: 'connected', data: inputSource } );
+
+				}
+
+			}
+
+		}
+
+		//
+
+		const cameraLPos = new Vector3();
+		const cameraRPos = new Vector3();
+
+		/**
+		 * Assumes 2 cameras that are parallel and share an X-axis, and that
+		 * the cameras' projection and world matrices have already been set.
+		 * And that near and far planes are identical for both cameras.
+		 * Visualization of this technique: https://computergraphics.stackexchange.com/a/4765
+		 */
+		function setProjectionFromUnion( camera, cameraL, cameraR ) {
+
+			cameraLPos.setFromMatrixPosition( cameraL.matrixWorld );
+			cameraRPos.setFromMatrixPosition( cameraR.matrixWorld );
+
+			const ipd = cameraLPos.distanceTo( cameraRPos );
+
+			const projL = cameraL.projectionMatrix.elements;
+			const projR = cameraR.projectionMatrix.elements;
+
+			// VR systems will have identical far and near planes, and
+			// most likely identical top and bottom frustum extents.
+			// Use the left camera for these values.
+			const near = projL[ 14 ] / ( projL[ 10 ] - 1 );
+			const far = projL[ 14 ] / ( projL[ 10 ] + 1 );
+			const topFov = ( projL[ 9 ] + 1 ) / projL[ 5 ];
+			const bottomFov = ( projL[ 9 ] - 1 ) / projL[ 5 ];
+
+			const leftFov = ( projL[ 8 ] - 1 ) / projL[ 0 ];
+			const rightFov = ( projR[ 8 ] + 1 ) / projR[ 0 ];
+			const left = near * leftFov;
+			const right = near * rightFov;
+
+			// Calculate the new camera's position offset from the
+			// left camera. xOffset should be roughly half `ipd`.
+			const zOffset = ipd / ( - leftFov + rightFov );
+			const xOffset = zOffset * - leftFov;
+
+			// TODO: Better way to apply this offset?
+			cameraL.matrixWorld.decompose( camera.position, camera.quaternion, camera.scale );
+			camera.translateX( xOffset );
+			camera.translateZ( zOffset );
+			camera.matrixWorld.compose( camera.position, camera.quaternion, camera.scale );
+			camera.matrixWorldInverse.copy( camera.matrixWorld ).invert();
+
+			// Find the union of the frustum values of the cameras and scale
+			// the values so that the near plane's position does not change in world space,
+			// although must now be relative to the new union camera.
+			const near2 = near + zOffset;
+			const far2 = far + zOffset;
+			const left2 = left - xOffset;
+			const right2 = right + ( ipd - xOffset );
+			const top2 = topFov * far / far2 * near2;
+			const bottom2 = bottomFov * far / far2 * near2;
+
+			camera.projectionMatrix.makePerspective( left2, right2, top2, bottom2, near2, far2 );
+
+		}
+
+		function updateCamera( camera, parent ) {
+
+			if ( parent === null ) {
+
+				camera.matrixWorld.copy( camera.matrix );
+
+			} else {
+
+				camera.matrixWorld.multiplyMatrices( parent.matrixWorld, camera.matrix );
+
+			}
+
+			camera.matrixWorldInverse.copy( camera.matrixWorld ).invert();
+
+		}
+
+		this.updateCamera = function ( camera ) {
+
+			if ( session === null ) return;
+
+			cameraVR.near = cameraR.near = cameraL.near = camera.near;
+			cameraVR.far = cameraR.far = cameraL.far = camera.far;
+
+			if ( _currentDepthNear !== cameraVR.near || _currentDepthFar !== cameraVR.far ) {
+
+				// Note that the new renderState won't apply until the next frame. See #18320
+
+				session.updateRenderState( {
+					depthNear: cameraVR.near,
+					depthFar: cameraVR.far
+				} );
+
+				_currentDepthNear = cameraVR.near;
+				_currentDepthFar = cameraVR.far;
+
+			}
+
+			const parent = camera.parent;
+			const cameras = cameraVR.cameras;
+
+			updateCamera( cameraVR, parent );
+
+			for ( let i = 0; i < cameras.length; i ++ ) {
+
+				updateCamera( cameras[ i ], parent );
+
+			}
+
+			cameraVR.matrixWorld.decompose( cameraVR.position, cameraVR.quaternion, cameraVR.scale );
+
+			// update user camera and its children
+
+			camera.position.copy( cameraVR.position );
+			camera.quaternion.copy( cameraVR.quaternion );
+			camera.scale.copy( cameraVR.scale );
+			camera.matrix.copy( cameraVR.matrix );
+			camera.matrixWorld.copy( cameraVR.matrixWorld );
+
+			const children = camera.children;
+
+			for ( let i = 0, l = children.length; i < l; i ++ ) {
+
+				children[ i ].updateMatrixWorld( true );
+
+			}
+
+			// update projection matrix for proper view frustum culling
+
+			if ( cameras.length === 2 ) {
+
+				setProjectionFromUnion( cameraVR, cameraL, cameraR );
+
+			} else {
+
+				// assume single camera setup (AR)
+
+				cameraVR.projectionMatrix.copy( cameraL.projectionMatrix );
+
+			}
+
+		};
+
+		this.getCamera = function () {
+
+			return cameraVR;
+
+		};
+
+		this.getFoveation = function () {
+
+			if ( glProjLayer !== null ) {
+
+				return glProjLayer.fixedFoveation;
+
+			}
+
+			if ( glBaseLayer !== null ) {
+
+				return glBaseLayer.fixedFoveation;
+
+			}
+
+			return undefined;
+
+		};
+
+		this.setFoveation = function ( foveation ) {
+
+			// 0 = no foveation = full resolution
+			// 1 = maximum foveation = the edges render at lower resolution
+
+			if ( glProjLayer !== null ) {
+
+				glProjLayer.fixedFoveation = foveation;
+
+			}
+
+			if ( glBaseLayer !== null && glBaseLayer.fixedFoveation !== undefined ) {
+
+				glBaseLayer.fixedFoveation = foveation;
+
+			}
+
+		};
+
+		// Animation Loop
+
+		let onAnimationFrameCallback = null;
+
+		function onAnimationFrame( time, frame ) {
+
+			pose = frame.getViewerPose( referenceSpace );
+			xrFrame = frame;
+
+			if ( pose !== null ) {
+
+				const views = pose.views;
+
+				if ( glBaseLayer !== null ) {
+
+					renderer.setRenderTargetFramebuffer( newRenderTarget, glBaseLayer.framebuffer );
+					renderer.setRenderTarget( newRenderTarget );
+
+				}
+
+				let cameraVRNeedsUpdate = false;
+
+				// check if it's necessary to rebuild cameraVR's camera list
+
+				if ( views.length !== cameraVR.cameras.length ) {
+
+					cameraVR.cameras.length = 0;
+					cameraVRNeedsUpdate = true;
+
+				}
+
+				for ( let i = 0; i < views.length; i ++ ) {
+
+					const view = views[ i ];
+
+					let viewport = null;
+
+					if ( glBaseLayer !== null ) {
+
+						viewport = glBaseLayer.getViewport( view );
+
+					} else {
+
+						const glSubImage = glBinding.getViewSubImage( glProjLayer, view );
+						viewport = glSubImage.viewport;
+
+						// For side-by-side projection, we only produce a single texture for both eyes.
+						if ( i === 0 ) {
+
+							renderer.setRenderTargetTextures(
+								newRenderTarget,
+								glSubImage.colorTexture,
+								glProjLayer.ignoreDepthValues ? undefined : glSubImage.depthStencilTexture );
+
+							renderer.setRenderTarget( newRenderTarget );
+
+						}
+
+					}
+
+					const camera = cameras[ i ];
+
+					camera.matrix.fromArray( view.transform.matrix );
+					camera.projectionMatrix.fromArray( view.projectionMatrix );
+					camera.viewport.set( viewport.x, viewport.y, viewport.width, viewport.height );
+
+					if ( i === 0 ) {
+
+						cameraVR.matrix.copy( camera.matrix );
+
+					}
+
+					if ( cameraVRNeedsUpdate === true ) {
+
+						cameraVR.cameras.push( camera );
+
+					}
+
+				}
+
+			}
+
+			//
+
+			const inputSources = session.inputSources;
+
+			for ( let i = 0; i < controllers.length; i ++ ) {
+
+				const controller = controllers[ i ];
+				const inputSource = inputSources[ i ];
+
+				controller.update( inputSource, frame, referenceSpace );
+
+			}
+
+			if ( onAnimationFrameCallback ) onAnimationFrameCallback( time, frame );
+
+			xrFrame = null;
+
+		}
+
+		const animation = new WebGLAnimation();
+
+		animation.setAnimationLoop( onAnimationFrame );
+
+		this.setAnimationLoop = function ( callback ) {
+
+			onAnimationFrameCallback = callback;
+
+		};
+
+		this.dispose = function () {};
+
+	}
+
+}
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/webgl/WebGLMaterials.js
+
+
+function WebGLMaterials( properties ) {
+
+	function refreshFogUniforms( uniforms, fog ) {
+
+		uniforms.fogColor.value.copy( fog.color );
+
+		if ( fog.isFog ) {
+
+			uniforms.fogNear.value = fog.near;
+			uniforms.fogFar.value = fog.far;
+
+		} else if ( fog.isFogExp2 ) {
+
+			uniforms.fogDensity.value = fog.density;
+
+		}
+
+	}
+
+	function refreshMaterialUniforms( uniforms, material, pixelRatio, height, transmissionRenderTarget ) {
+
+		if ( material.isMeshBasicMaterial ) {
+
+			refreshUniformsCommon( uniforms, material );
+
+		} else if ( material.isMeshLambertMaterial ) {
+
+			refreshUniformsCommon( uniforms, material );
+			refreshUniformsLambert( uniforms, material );
+
+		} else if ( material.isMeshToonMaterial ) {
+
+			refreshUniformsCommon( uniforms, material );
+			refreshUniformsToon( uniforms, material );
+
+		} else if ( material.isMeshPhongMaterial ) {
+
+			refreshUniformsCommon( uniforms, material );
+			refreshUniformsPhong( uniforms, material );
+
+		} else if ( material.isMeshStandardMaterial ) {
+
+			refreshUniformsCommon( uniforms, material );
+
+			if ( material.isMeshPhysicalMaterial ) {
+
+				refreshUniformsPhysical( uniforms, material, transmissionRenderTarget );
+
+			} else {
+
+				refreshUniformsStandard( uniforms, material );
+
+			}
+
+		} else if ( material.isMeshMatcapMaterial ) {
+
+			refreshUniformsCommon( uniforms, material );
+			refreshUniformsMatcap( uniforms, material );
+
+		} else if ( material.isMeshDepthMaterial ) {
+
+			refreshUniformsCommon( uniforms, material );
+			refreshUniformsDepth( uniforms, material );
+
+		} else if ( material.isMeshDistanceMaterial ) {
+
+			refreshUniformsCommon( uniforms, material );
+			refreshUniformsDistance( uniforms, material );
+
+		} else if ( material.isMeshNormalMaterial ) {
+
+			refreshUniformsCommon( uniforms, material );
+			refreshUniformsNormal( uniforms, material );
+
+		} else if ( material.isLineBasicMaterial ) {
+
+			refreshUniformsLine( uniforms, material );
+
+			if ( material.isLineDashedMaterial ) {
+
+				refreshUniformsDash( uniforms, material );
+
+			}
+
+		} else if ( material.isPointsMaterial ) {
+
+			refreshUniformsPoints( uniforms, material, pixelRatio, height );
+
+		} else if ( material.isSpriteMaterial ) {
+
+			refreshUniformsSprites( uniforms, material );
+
+		} else if ( material.isShadowMaterial ) {
+
+			uniforms.color.value.copy( material.color );
+			uniforms.opacity.value = material.opacity;
+
+		} else if ( material.isShaderMaterial ) {
+
+			material.uniformsNeedUpdate = false; // #15581
+
+		}
+
+	}
+
+	function refreshUniformsCommon( uniforms, material ) {
+
+		uniforms.opacity.value = material.opacity;
+
+		if ( material.color ) {
+
+			uniforms.diffuse.value.copy( material.color );
+
+		}
+
+		if ( material.emissive ) {
+
+			uniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity );
+
+		}
+
+		if ( material.map ) {
+
+			uniforms.map.value = material.map;
+
+		}
+
+		if ( material.alphaMap ) {
+
+			uniforms.alphaMap.value = material.alphaMap;
+
+		}
+
+		if ( material.specularMap ) {
+
+			uniforms.specularMap.value = material.specularMap;
+
+		}
+
+		if ( material.alphaTest > 0 ) {
+
+			uniforms.alphaTest.value = material.alphaTest;
+
+		}
+
+		const envMap = properties.get( material ).envMap;
+
+		if ( envMap ) {
+
+			uniforms.envMap.value = envMap;
+
+			uniforms.flipEnvMap.value = ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) ? - 1 : 1;
+
+			uniforms.reflectivity.value = material.reflectivity;
+			uniforms.ior.value = material.ior;
+			uniforms.refractionRatio.value = material.refractionRatio;
+
+		}
+
+		if ( material.lightMap ) {
+
+			uniforms.lightMap.value = material.lightMap;
+			uniforms.lightMapIntensity.value = material.lightMapIntensity;
+
+		}
+
+		if ( material.aoMap ) {
+
+			uniforms.aoMap.value = material.aoMap;
+			uniforms.aoMapIntensity.value = material.aoMapIntensity;
+
+		}
+
+		// uv repeat and offset setting priorities
+		// 1. color map
+		// 2. specular map
+		// 3. displacementMap map
+		// 4. normal map
+		// 5. bump map
+		// 6. roughnessMap map
+		// 7. metalnessMap map
+		// 8. alphaMap map
+		// 9. emissiveMap map
+		// 10. clearcoat map
+		// 11. clearcoat normal map
+		// 12. clearcoat roughnessMap map
+		// 13. specular intensity map
+		// 14. specular tint map
+		// 15. transmission map
+		// 16. thickness map
+
+		let uvScaleMap;
+
+		if ( material.map ) {
+
+			uvScaleMap = material.map;
+
+		} else if ( material.specularMap ) {
+
+			uvScaleMap = material.specularMap;
+
+		} else if ( material.displacementMap ) {
+
+			uvScaleMap = material.displacementMap;
+
+		} else if ( material.normalMap ) {
+
+			uvScaleMap = material.normalMap;
+
+		} else if ( material.bumpMap ) {
+
+			uvScaleMap = material.bumpMap;
+
+		} else if ( material.roughnessMap ) {
+
+			uvScaleMap = material.roughnessMap;
+
+		} else if ( material.metalnessMap ) {
+
+			uvScaleMap = material.metalnessMap;
+
+		} else if ( material.alphaMap ) {
+
+			uvScaleMap = material.alphaMap;
+
+		} else if ( material.emissiveMap ) {
+
+			uvScaleMap = material.emissiveMap;
+
+		} else if ( material.clearcoatMap ) {
+
+			uvScaleMap = material.clearcoatMap;
+
+		} else if ( material.clearcoatNormalMap ) {
+
+			uvScaleMap = material.clearcoatNormalMap;
+
+		} else if ( material.clearcoatRoughnessMap ) {
+
+			uvScaleMap = material.clearcoatRoughnessMap;
+
+		} else if ( material.specularIntensityMap ) {
+
+			uvScaleMap = material.specularIntensityMap;
+
+		} else if ( material.specularColorMap ) {
+
+			uvScaleMap = material.specularColorMap;
+
+		} else if ( material.transmissionMap ) {
+
+			uvScaleMap = material.transmissionMap;
+
+		} else if ( material.thicknessMap ) {
+
+			uvScaleMap = material.thicknessMap;
+
+		} else if ( material.sheenColorMap ) {
+
+			uvScaleMap = material.sheenColorMap;
+
+		} else if ( material.sheenRoughnessMap ) {
+
+			uvScaleMap = material.sheenRoughnessMap;
+
+		}
+
+		if ( uvScaleMap !== undefined ) {
+
+			// backwards compatibility
+			if ( uvScaleMap.isWebGLRenderTarget ) {
+
+				uvScaleMap = uvScaleMap.texture;
+
+			}
+
+			if ( uvScaleMap.matrixAutoUpdate === true ) {
+
+				uvScaleMap.updateMatrix();
+
+			}
+
+			uniforms.uvTransform.value.copy( uvScaleMap.matrix );
+
+		}
+
+		// uv repeat and offset setting priorities for uv2
+		// 1. ao map
+		// 2. light map
+
+		let uv2ScaleMap;
+
+		if ( material.aoMap ) {
+
+			uv2ScaleMap = material.aoMap;
+
+		} else if ( material.lightMap ) {
+
+			uv2ScaleMap = material.lightMap;
+
+		}
+
+		if ( uv2ScaleMap !== undefined ) {
+
+			// backwards compatibility
+			if ( uv2ScaleMap.isWebGLRenderTarget ) {
+
+				uv2ScaleMap = uv2ScaleMap.texture;
+
+			}
+
+			if ( uv2ScaleMap.matrixAutoUpdate === true ) {
+
+				uv2ScaleMap.updateMatrix();
+
+			}
+
+			uniforms.uv2Transform.value.copy( uv2ScaleMap.matrix );
+
+		}
+
+	}
+
+	function refreshUniformsLine( uniforms, material ) {
+
+		uniforms.diffuse.value.copy( material.color );
+		uniforms.opacity.value = material.opacity;
+
+	}
+
+	function refreshUniformsDash( uniforms, material ) {
+
+		uniforms.dashSize.value = material.dashSize;
+		uniforms.totalSize.value = material.dashSize + material.gapSize;
+		uniforms.scale.value = material.scale;
+
+	}
+
+	function refreshUniformsPoints( uniforms, material, pixelRatio, height ) {
+
+		uniforms.diffuse.value.copy( material.color );
+		uniforms.opacity.value = material.opacity;
+		uniforms.size.value = material.size * pixelRatio;
+		uniforms.scale.value = height * 0.5;
+
+		if ( material.map ) {
+
+			uniforms.map.value = material.map;
+
+		}
+
+		if ( material.alphaMap ) {
+
+			uniforms.alphaMap.value = material.alphaMap;
+
+		}
+
+		if ( material.alphaTest > 0 ) {
+
+			uniforms.alphaTest.value = material.alphaTest;
+
+		}
+
+		// uv repeat and offset setting priorities
+		// 1. color map
+		// 2. alpha map
+
+		let uvScaleMap;
+
+		if ( material.map ) {
+
+			uvScaleMap = material.map;
+
+		} else if ( material.alphaMap ) {
+
+			uvScaleMap = material.alphaMap;
+
+		}
+
+		if ( uvScaleMap !== undefined ) {
+
+			if ( uvScaleMap.matrixAutoUpdate === true ) {
+
+				uvScaleMap.updateMatrix();
+
+			}
+
+			uniforms.uvTransform.value.copy( uvScaleMap.matrix );
+
+		}
+
+	}
+
+	function refreshUniformsSprites( uniforms, material ) {
+
+		uniforms.diffuse.value.copy( material.color );
+		uniforms.opacity.value = material.opacity;
+		uniforms.rotation.value = material.rotation;
+
+		if ( material.map ) {
+
+			uniforms.map.value = material.map;
+
+		}
+
+		if ( material.alphaMap ) {
+
+			uniforms.alphaMap.value = material.alphaMap;
+
+		}
+
+		if ( material.alphaTest > 0 ) {
+
+			uniforms.alphaTest.value = material.alphaTest;
+
+		}
+
+		// uv repeat and offset setting priorities
+		// 1. color map
+		// 2. alpha map
+
+		let uvScaleMap;
+
+		if ( material.map ) {
+
+			uvScaleMap = material.map;
+
+		} else if ( material.alphaMap ) {
+
+			uvScaleMap = material.alphaMap;
+
+		}
+
+		if ( uvScaleMap !== undefined ) {
+
+			if ( uvScaleMap.matrixAutoUpdate === true ) {
+
+				uvScaleMap.updateMatrix();
+
+			}
+
+			uniforms.uvTransform.value.copy( uvScaleMap.matrix );
+
+		}
+
+	}
+
+	function refreshUniformsLambert( uniforms, material ) {
+
+		if ( material.emissiveMap ) {
+
+			uniforms.emissiveMap.value = material.emissiveMap;
+
+		}
+
+	}
+
+	function refreshUniformsPhong( uniforms, material ) {
+
+		uniforms.specular.value.copy( material.specular );
+		uniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 )
+
+		if ( material.emissiveMap ) {
+
+			uniforms.emissiveMap.value = material.emissiveMap;
+
+		}
+
+		if ( material.bumpMap ) {
+
+			uniforms.bumpMap.value = material.bumpMap;
+			uniforms.bumpScale.value = material.bumpScale;
+			if ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;
+
+		}
+
+		if ( material.normalMap ) {
+
+			uniforms.normalMap.value = material.normalMap;
+			uniforms.normalScale.value.copy( material.normalScale );
+			if ( material.side === BackSide ) uniforms.normalScale.value.negate();
+
+		}
+
+		if ( material.displacementMap ) {
+
+			uniforms.displacementMap.value = material.displacementMap;
+			uniforms.displacementScale.value = material.displacementScale;
+			uniforms.displacementBias.value = material.displacementBias;
+
+		}
+
+	}
+
+	function refreshUniformsToon( uniforms, material ) {
+
+		if ( material.gradientMap ) {
+
+			uniforms.gradientMap.value = material.gradientMap;
+
+		}
+
+		if ( material.emissiveMap ) {
+
+			uniforms.emissiveMap.value = material.emissiveMap;
+
+		}
+
+		if ( material.bumpMap ) {
+
+			uniforms.bumpMap.value = material.bumpMap;
+			uniforms.bumpScale.value = material.bumpScale;
+			if ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;
+
+		}
+
+		if ( material.normalMap ) {
+
+			uniforms.normalMap.value = material.normalMap;
+			uniforms.normalScale.value.copy( material.normalScale );
+			if ( material.side === BackSide ) uniforms.normalScale.value.negate();
+
+		}
+
+		if ( material.displacementMap ) {
+
+			uniforms.displacementMap.value = material.displacementMap;
+			uniforms.displacementScale.value = material.displacementScale;
+			uniforms.displacementBias.value = material.displacementBias;
+
+		}
+
+	}
+
+	function refreshUniformsStandard( uniforms, material ) {
+
+		uniforms.roughness.value = material.roughness;
+		uniforms.metalness.value = material.metalness;
+
+		if ( material.roughnessMap ) {
+
+			uniforms.roughnessMap.value = material.roughnessMap;
+
+		}
+
+		if ( material.metalnessMap ) {
+
+			uniforms.metalnessMap.value = material.metalnessMap;
+
+		}
+
+		if ( material.emissiveMap ) {
+
+			uniforms.emissiveMap.value = material.emissiveMap;
+
+		}
+
+		if ( material.bumpMap ) {
+
+			uniforms.bumpMap.value = material.bumpMap;
+			uniforms.bumpScale.value = material.bumpScale;
+			if ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;
+
+		}
+
+		if ( material.normalMap ) {
+
+			uniforms.normalMap.value = material.normalMap;
+			uniforms.normalScale.value.copy( material.normalScale );
+			if ( material.side === BackSide ) uniforms.normalScale.value.negate();
+
+		}
+
+		if ( material.displacementMap ) {
+
+			uniforms.displacementMap.value = material.displacementMap;
+			uniforms.displacementScale.value = material.displacementScale;
+			uniforms.displacementBias.value = material.displacementBias;
+
+		}
+
+		const envMap = properties.get( material ).envMap;
+
+		if ( envMap ) {
+
+			//uniforms.envMap.value = material.envMap; // part of uniforms common
+			uniforms.envMapIntensity.value = material.envMapIntensity;
+
+		}
+
+	}
+
+	function refreshUniformsPhysical( uniforms, material, transmissionRenderTarget ) {
+
+		refreshUniformsStandard( uniforms, material );
+
+		uniforms.ior.value = material.ior; // also part of uniforms common
+
+		if ( material.sheen > 0 ) {
+
+			uniforms.sheenColor.value.copy( material.sheenColor ).multiplyScalar( material.sheen );
+
+			uniforms.sheenRoughness.value = material.sheenRoughness;
+
+			if ( material.sheenColorMap ) {
+
+				uniforms.sheenColorMap.value = material.sheenColorMap;
+
+			}
+
+			if ( material.sheenRoughnessMap ) {
+
+				uniforms.sheenRoughnessMap.value = material.sheenRoughnessMap;
+
+			}
+
+		}
+
+		if ( material.clearcoat > 0 ) {
+
+			uniforms.clearcoat.value = material.clearcoat;
+			uniforms.clearcoatRoughness.value = material.clearcoatRoughness;
+
+			if ( material.clearcoatMap ) {
+
+				uniforms.clearcoatMap.value = material.clearcoatMap;
+
+			}
+
+			if ( material.clearcoatRoughnessMap ) {
+
+				uniforms.clearcoatRoughnessMap.value = material.clearcoatRoughnessMap;
+
+			}
+
+			if ( material.clearcoatNormalMap ) {
+
+				uniforms.clearcoatNormalScale.value.copy( material.clearcoatNormalScale );
+				uniforms.clearcoatNormalMap.value = material.clearcoatNormalMap;
+
+				if ( material.side === BackSide ) {
+
+					uniforms.clearcoatNormalScale.value.negate();
+
+				}
+
+			}
+
+		}
+
+		if ( material.transmission > 0 ) {
+
+			uniforms.transmission.value = material.transmission;
+			uniforms.transmissionSamplerMap.value = transmissionRenderTarget.texture;
+			uniforms.transmissionSamplerSize.value.set( transmissionRenderTarget.width, transmissionRenderTarget.height );
+
+			if ( material.transmissionMap ) {
+
+				uniforms.transmissionMap.value = material.transmissionMap;
+
+			}
+
+			uniforms.thickness.value = material.thickness;
+
+			if ( material.thicknessMap ) {
+
+				uniforms.thicknessMap.value = material.thicknessMap;
+
+			}
+
+			uniforms.attenuationDistance.value = material.attenuationDistance;
+			uniforms.attenuationColor.value.copy( material.attenuationColor );
+
+		}
+
+		uniforms.specularIntensity.value = material.specularIntensity;
+		uniforms.specularColor.value.copy( material.specularColor );
+
+		if ( material.specularIntensityMap ) {
+
+			uniforms.specularIntensityMap.value = material.specularIntensityMap;
+
+		}
+
+		if ( material.specularColorMap ) {
+
+			uniforms.specularColorMap.value = material.specularColorMap;
+
+		}
+
+	}
+
+	function refreshUniformsMatcap( uniforms, material ) {
+
+		if ( material.matcap ) {
+
+			uniforms.matcap.value = material.matcap;
+
+		}
+
+		if ( material.bumpMap ) {
+
+			uniforms.bumpMap.value = material.bumpMap;
+			uniforms.bumpScale.value = material.bumpScale;
+			if ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;
+
+		}
+
+		if ( material.normalMap ) {
+
+			uniforms.normalMap.value = material.normalMap;
+			uniforms.normalScale.value.copy( material.normalScale );
+			if ( material.side === BackSide ) uniforms.normalScale.value.negate();
+
+		}
+
+		if ( material.displacementMap ) {
+
+			uniforms.displacementMap.value = material.displacementMap;
+			uniforms.displacementScale.value = material.displacementScale;
+			uniforms.displacementBias.value = material.displacementBias;
+
+		}
+
+	}
+
+	function refreshUniformsDepth( uniforms, material ) {
+
+		if ( material.displacementMap ) {
+
+			uniforms.displacementMap.value = material.displacementMap;
+			uniforms.displacementScale.value = material.displacementScale;
+			uniforms.displacementBias.value = material.displacementBias;
+
+		}
+
+	}
+
+	function refreshUniformsDistance( uniforms, material ) {
+
+		if ( material.displacementMap ) {
+
+			uniforms.displacementMap.value = material.displacementMap;
+			uniforms.displacementScale.value = material.displacementScale;
+			uniforms.displacementBias.value = material.displacementBias;
+
+		}
+
+		uniforms.referencePosition.value.copy( material.referencePosition );
+		uniforms.nearDistance.value = material.nearDistance;
+		uniforms.farDistance.value = material.farDistance;
+
+	}
+
+	function refreshUniformsNormal( uniforms, material ) {
+
+		if ( material.bumpMap ) {
+
+			uniforms.bumpMap.value = material.bumpMap;
+			uniforms.bumpScale.value = material.bumpScale;
+			if ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;
+
+		}
+
+		if ( material.normalMap ) {
+
+			uniforms.normalMap.value = material.normalMap;
+			uniforms.normalScale.value.copy( material.normalScale );
+			if ( material.side === BackSide ) uniforms.normalScale.value.negate();
+
+		}
+
+		if ( material.displacementMap ) {
+
+			uniforms.displacementMap.value = material.displacementMap;
+			uniforms.displacementScale.value = material.displacementScale;
+			uniforms.displacementBias.value = material.displacementBias;
+
+		}
+
+	}
+
+	return {
+		refreshFogUniforms: refreshFogUniforms,
+		refreshMaterialUniforms: refreshMaterialUniforms
+	};
+
+}
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/WebGLRenderer.js
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+function createCanvasElement() {
+
+	const canvas = createElementNS( 'canvas' );
+	canvas.style.display = 'block';
+	return canvas;
+
+}
+
+function WebGLRenderer( parameters = {} ) {
+
+	const _canvas = parameters.canvas !== undefined ? parameters.canvas : createCanvasElement(),
+		_context = parameters.context !== undefined ? parameters.context : null,
+
+		_alpha = parameters.alpha !== undefined ? parameters.alpha : false,
+		_depth = parameters.depth !== undefined ? parameters.depth : true,
+		_stencil = parameters.stencil !== undefined ? parameters.stencil : true,
+		_antialias = parameters.antialias !== undefined ? parameters.antialias : false,
+		_premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true,
+		_preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false,
+		_powerPreference = parameters.powerPreference !== undefined ? parameters.powerPreference : 'default',
+		_failIfMajorPerformanceCaveat = parameters.failIfMajorPerformanceCaveat !== undefined ? parameters.failIfMajorPerformanceCaveat : false;
+
+	let currentRenderList = null;
+	let currentRenderState = null;
+
+	// render() can be called from within a callback triggered by another render.
+	// We track this so that the nested render call gets its list and state isolated from the parent render call.
+
+	const renderListStack = [];
+	const renderStateStack = [];
+
+	// public properties
+
+	this.domElement = _canvas;
+
+	// Debug configuration container
+	this.debug = {
+
+		/**
+		 * Enables error checking and reporting when shader programs are being compiled
+		 * @type {boolean}
+		 */
+		checkShaderErrors: true
+	};
+
+	// clearing
+
+	this.autoClear = true;
+	this.autoClearColor = true;
+	this.autoClearDepth = true;
+	this.autoClearStencil = true;
+
+	// scene graph
+
+	this.sortObjects = true;
+
+	// user-defined clipping
+
+	this.clippingPlanes = [];
+	this.localClippingEnabled = false;
+
+	// physically based shading
+
+	this.outputEncoding = LinearEncoding;
+
+	// physical lights
+
+	this.physicallyCorrectLights = false;
+
+	// tone mapping
+
+	this.toneMapping = NoToneMapping;
+	this.toneMappingExposure = 1.0;
+
+	// internal properties
+
+	const _this = this;
+
+	let _isContextLost = false;
+
+	// internal state cache
+
+	let _currentActiveCubeFace = 0;
+	let _currentActiveMipmapLevel = 0;
+	let _currentRenderTarget = null;
+	let _currentMaterialId = - 1;
+
+	let _currentCamera = null;
+
+	const _currentViewport = new Vector4();
+	const _currentScissor = new Vector4();
+	let _currentScissorTest = null;
+
+	//
+
+	let _width = _canvas.width;
+	let _height = _canvas.height;
+
+	let _pixelRatio = 1;
+	let _opaqueSort = null;
+	let _transparentSort = null;
+
+	const _viewport = new Vector4( 0, 0, _width, _height );
+	const _scissor = new Vector4( 0, 0, _width, _height );
+	let _scissorTest = false;
+
+	// frustum
+
+	const _frustum = new Frustum();
+
+	// clipping
+
+	let _clippingEnabled = false;
+	let _localClippingEnabled = false;
+
+	// transmission
+
+	let _transmissionRenderTarget = null;
+
+	// camera matrices cache
+
+	const _projScreenMatrix = new Matrix4_Matrix4();
+
+	const _vector3 = new Vector3();
+
+	const _emptyScene = { background: null, fog: null, environment: null, overrideMaterial: null, isScene: true };
+
+	function getTargetPixelRatio() {
+
+		return _currentRenderTarget === null ? _pixelRatio : 1;
+
+	}
+
+	// initialize
+
+	let _gl = _context;
+
+	function getContext( contextNames, contextAttributes ) {
+
+		for ( let i = 0; i < contextNames.length; i ++ ) {
+
+			const contextName = contextNames[ i ];
+			const context = _canvas.getContext( contextName, contextAttributes );
+			if ( context !== null ) return context;
+
+		}
+
+		return null;
+
+	}
+
+	try {
+
+		const contextAttributes = {
+			alpha: true,
+			depth: _depth,
+			stencil: _stencil,
+			antialias: _antialias,
+			premultipliedAlpha: _premultipliedAlpha,
+			preserveDrawingBuffer: _preserveDrawingBuffer,
+			powerPreference: _powerPreference,
+			failIfMajorPerformanceCaveat: _failIfMajorPerformanceCaveat
+		};
+
+		// OffscreenCanvas does not have setAttribute, see #22811
+		if ( 'setAttribute' in _canvas ) _canvas.setAttribute( 'data-engine', `three.js r${constants_REVISION}` );
+
+		// event listeners must be registered before WebGL context is created, see #12753
+		_canvas.addEventListener( 'webglcontextlost', onContextLost, false );
+		_canvas.addEventListener( 'webglcontextrestored', onContextRestore, false );
+
+		if ( _gl === null ) {
+
+			const contextNames = [ 'webgl2', 'webgl', 'experimental-webgl' ];
+
+			if ( _this.isWebGL1Renderer === true ) {
+
+				contextNames.shift();
+
+			}
+
+			_gl = getContext( contextNames, contextAttributes );
+
+			if ( _gl === null ) {
+
+				if ( getContext( contextNames ) ) {
+
+					throw new Error( 'Error creating WebGL context with your selected attributes.' );
+
+				} else {
+
+					throw new Error( 'Error creating WebGL context.' );
+
+				}
+
+			}
+
+		}
+
+		// Some experimental-webgl implementations do not have getShaderPrecisionFormat
+
+		if ( _gl.getShaderPrecisionFormat === undefined ) {
+
+			_gl.getShaderPrecisionFormat = function () {
+
+				return { 'rangeMin': 1, 'rangeMax': 1, 'precision': 1 };
+
+			};
+
+		}
+
+	} catch ( error ) {
+
+		console.error( 'THREE.WebGLRenderer: ' + error.message );
+		throw error;
+
+	}
+
+	let extensions, capabilities, state, info;
+	let properties, textures, cubemaps, cubeuvmaps, attributes, geometries, objects;
+	let programCache, materials, renderLists, renderStates, clipping, shadowMap;
+
+	let background, morphtargets, bufferRenderer, indexedBufferRenderer;
+
+	let utils, bindingStates;
+
+	function initGLContext() {
+
+		extensions = new WebGLExtensions( _gl );
+
+		capabilities = new WebGLCapabilities( _gl, extensions, parameters );
+
+		extensions.init( capabilities );
+
+		utils = new WebGLUtils( _gl, extensions, capabilities );
+
+		state = new WebGLState( _gl, extensions, capabilities );
+
+		info = new WebGLInfo( _gl );
+		properties = new WebGLProperties();
+		textures = new WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info );
+		cubemaps = new WebGLCubeMaps( _this );
+		cubeuvmaps = new WebGLCubeUVMaps( _this );
+		attributes = new WebGLAttributes( _gl, capabilities );
+		bindingStates = new WebGLBindingStates( _gl, extensions, attributes, capabilities );
+		geometries = new WebGLGeometries( _gl, attributes, info, bindingStates );
+		objects = new WebGLObjects( _gl, geometries, attributes, info );
+		morphtargets = new WebGLMorphtargets( _gl, capabilities, textures );
+		clipping = new WebGLClipping( properties );
+		programCache = new WebGLPrograms( _this, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping );
+		materials = new WebGLMaterials( properties );
+		renderLists = new WebGLRenderLists();
+		renderStates = new WebGLRenderStates( extensions, capabilities );
+		background = new WebGLBackground( _this, cubemaps, state, objects, _alpha, _premultipliedAlpha );
+		shadowMap = new WebGLShadowMap( _this, objects, capabilities );
+
+		bufferRenderer = new WebGLBufferRenderer( _gl, extensions, info, capabilities );
+		indexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, info, capabilities );
+
+		info.programs = programCache.programs;
+
+		_this.capabilities = capabilities;
+		_this.extensions = extensions;
+		_this.properties = properties;
+		_this.renderLists = renderLists;
+		_this.shadowMap = shadowMap;
+		_this.state = state;
+		_this.info = info;
+
+	}
+
+	initGLContext();
+
+	// xr
+
+	const xr = new WebXRManager( _this, _gl );
+
+	this.xr = xr;
+
+	// API
+
+	this.getContext = function () {
+
+		return _gl;
+
+	};
+
+	this.getContextAttributes = function () {
+
+		return _gl.getContextAttributes();
+
+	};
+
+	this.forceContextLoss = function () {
+
+		const extension = extensions.get( 'WEBGL_lose_context' );
+		if ( extension ) extension.loseContext();
+
+	};
+
+	this.forceContextRestore = function () {
+
+		const extension = extensions.get( 'WEBGL_lose_context' );
+		if ( extension ) extension.restoreContext();
+
+	};
+
+	this.getPixelRatio = function () {
+
+		return _pixelRatio;
+
+	};
+
+	this.setPixelRatio = function ( value ) {
+
+		if ( value === undefined ) return;
+
+		_pixelRatio = value;
+
+		this.setSize( _width, _height, false );
+
+	};
+
+	this.getSize = function ( target ) {
+
+		return target.set( _width, _height );
+
+	};
+
+	this.setSize = function ( width, height, updateStyle ) {
+
+		if ( xr.isPresenting ) {
+
+			console.warn( 'THREE.WebGLRenderer: Can\'t change size while VR device is presenting.' );
+			return;
+
+		}
+
+		_width = width;
+		_height = height;
+
+		_canvas.width = Math.floor( width * _pixelRatio );
+		_canvas.height = Math.floor( height * _pixelRatio );
+
+		if ( updateStyle !== false ) {
+
+			_canvas.style.width = width + 'px';
+			_canvas.style.height = height + 'px';
+
+		}
+
+		this.setViewport( 0, 0, width, height );
+
+	};
+
+	this.getDrawingBufferSize = function ( target ) {
+
+		return target.set( _width * _pixelRatio, _height * _pixelRatio ).floor();
+
+	};
+
+	this.setDrawingBufferSize = function ( width, height, pixelRatio ) {
+
+		_width = width;
+		_height = height;
+
+		_pixelRatio = pixelRatio;
+
+		_canvas.width = Math.floor( width * pixelRatio );
+		_canvas.height = Math.floor( height * pixelRatio );
+
+		this.setViewport( 0, 0, width, height );
+
+	};
+
+	this.getCurrentViewport = function ( target ) {
+
+		return target.copy( _currentViewport );
+
+	};
+
+	this.getViewport = function ( target ) {
+
+		return target.copy( _viewport );
+
+	};
+
+	this.setViewport = function ( x, y, width, height ) {
+
+		if ( x.isVector4 ) {
+
+			_viewport.set( x.x, x.y, x.z, x.w );
+
+		} else {
+
+			_viewport.set( x, y, width, height );
+
+		}
+
+		state.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).floor() );
+
+	};
+
+	this.getScissor = function ( target ) {
+
+		return target.copy( _scissor );
+
+	};
+
+	this.setScissor = function ( x, y, width, height ) {
+
+		if ( x.isVector4 ) {
+
+			_scissor.set( x.x, x.y, x.z, x.w );
+
+		} else {
+
+			_scissor.set( x, y, width, height );
+
+		}
+
+		state.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).floor() );
+
+	};
+
+	this.getScissorTest = function () {
+
+		return _scissorTest;
+
+	};
+
+	this.setScissorTest = function ( boolean ) {
+
+		state.setScissorTest( _scissorTest = boolean );
+
+	};
+
+	this.setOpaqueSort = function ( method ) {
+
+		_opaqueSort = method;
+
+	};
+
+	this.setTransparentSort = function ( method ) {
+
+		_transparentSort = method;
+
+	};
+
+	// Clearing
+
+	this.getClearColor = function ( target ) {
+
+		return target.copy( background.getClearColor() );
+
+	};
+
+	this.setClearColor = function () {
+
+		background.setClearColor.apply( background, arguments );
+
+	};
+
+	this.getClearAlpha = function () {
+
+		return background.getClearAlpha();
+
+	};
+
+	this.setClearAlpha = function () {
+
+		background.setClearAlpha.apply( background, arguments );
+
+	};
+
+	this.clear = function ( color, depth, stencil ) {
+
+		let bits = 0;
+
+		if ( color === undefined || color ) bits |= _gl.COLOR_BUFFER_BIT;
+		if ( depth === undefined || depth ) bits |= _gl.DEPTH_BUFFER_BIT;
+		if ( stencil === undefined || stencil ) bits |= _gl.STENCIL_BUFFER_BIT;
+
+		_gl.clear( bits );
+
+	};
+
+	this.clearColor = function () {
+
+		this.clear( true, false, false );
+
+	};
+
+	this.clearDepth = function () {
+
+		this.clear( false, true, false );
+
+	};
+
+	this.clearStencil = function () {
+
+		this.clear( false, false, true );
+
+	};
+
+	//
+
+	this.dispose = function () {
+
+		_canvas.removeEventListener( 'webglcontextlost', onContextLost, false );
+		_canvas.removeEventListener( 'webglcontextrestored', onContextRestore, false );
+
+		renderLists.dispose();
+		renderStates.dispose();
+		properties.dispose();
+		cubemaps.dispose();
+		cubeuvmaps.dispose();
+		objects.dispose();
+		bindingStates.dispose();
+		programCache.dispose();
+
+		xr.dispose();
+
+		xr.removeEventListener( 'sessionstart', onXRSessionStart );
+		xr.removeEventListener( 'sessionend', onXRSessionEnd );
+
+		if ( _transmissionRenderTarget ) {
+
+			_transmissionRenderTarget.dispose();
+			_transmissionRenderTarget = null;
+
+		}
+
+		animation.stop();
+
+	};
+
+	// Events
+
+	function onContextLost( event ) {
+
+		event.preventDefault();
+
+		console.log( 'THREE.WebGLRenderer: Context Lost.' );
+
+		_isContextLost = true;
+
+	}
+
+	function onContextRestore( /* event */ ) {
+
+		console.log( 'THREE.WebGLRenderer: Context Restored.' );
+
+		_isContextLost = false;
+
+		const infoAutoReset = info.autoReset;
+		const shadowMapEnabled = shadowMap.enabled;
+		const shadowMapAutoUpdate = shadowMap.autoUpdate;
+		const shadowMapNeedsUpdate = shadowMap.needsUpdate;
+		const shadowMapType = shadowMap.type;
+
+		initGLContext();
+
+		info.autoReset = infoAutoReset;
+		shadowMap.enabled = shadowMapEnabled;
+		shadowMap.autoUpdate = shadowMapAutoUpdate;
+		shadowMap.needsUpdate = shadowMapNeedsUpdate;
+		shadowMap.type = shadowMapType;
+
+	}
+
+	function onMaterialDispose( event ) {
+
+		const material = event.target;
+
+		material.removeEventListener( 'dispose', onMaterialDispose );
+
+		deallocateMaterial( material );
+
+	}
+
+	// Buffer deallocation
+
+	function deallocateMaterial( material ) {
+
+		releaseMaterialProgramReferences( material );
+
+		properties.remove( material );
+
+	}
+
+
+	function releaseMaterialProgramReferences( material ) {
+
+		const programs = properties.get( material ).programs;
+
+		if ( programs !== undefined ) {
+
+			programs.forEach( function ( program ) {
+
+				programCache.releaseProgram( program );
+
+			} );
+
+			if ( material.isShaderMaterial ) {
+
+				programCache.releaseShaderCache( material );
+
+			}
+
+		}
+
+	}
+
+	// Buffer rendering
+
+	this.renderBufferDirect = function ( camera, scene, geometry, material, object, group ) {
+
+		if ( scene === null ) scene = _emptyScene; // renderBufferDirect second parameter used to be fog (could be null)
+
+		const frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 );
+
+		const program = setProgram( camera, scene, geometry, material, object );
+
+		state.setMaterial( material, frontFaceCW );
+
+		//
+
+		let index = geometry.index;
+		const position = geometry.attributes.position;
+
+		//
+
+		if ( index === null ) {
+
+			if ( position === undefined || position.count === 0 ) return;
+
+		} else if ( index.count === 0 ) {
+
+			return;
+
+		}
+
+		//
+
+		let rangeFactor = 1;
+
+		if ( material.wireframe === true ) {
+
+			index = geometries.getWireframeAttribute( geometry );
+			rangeFactor = 2;
+
+		}
+
+		bindingStates.setup( object, material, program, geometry, index );
+
+		let attribute;
+		let renderer = bufferRenderer;
+
+		if ( index !== null ) {
+
+			attribute = attributes.get( index );
+
+			renderer = indexedBufferRenderer;
+			renderer.setIndex( attribute );
+
+		}
+
+		//
+
+		const dataCount = ( index !== null ) ? index.count : position.count;
+
+		const rangeStart = geometry.drawRange.start * rangeFactor;
+		const rangeCount = geometry.drawRange.count * rangeFactor;
+
+		const groupStart = group !== null ? group.start * rangeFactor : 0;
+		const groupCount = group !== null ? group.count * rangeFactor : Infinity;
+
+		const drawStart = Math.max( rangeStart, groupStart );
+		const drawEnd = Math.min( dataCount, rangeStart + rangeCount, groupStart + groupCount ) - 1;
+
+		const drawCount = Math.max( 0, drawEnd - drawStart + 1 );
+
+		if ( drawCount === 0 ) return;
+
+		//
+
+		if ( object.isMesh ) {
+
+			if ( material.wireframe === true ) {
+
+				state.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() );
+				renderer.setMode( _gl.LINES );
+
+			} else {
+
+				renderer.setMode( _gl.TRIANGLES );
+
+			}
+
+		} else if ( object.isLine ) {
+
+			let lineWidth = material.linewidth;
+
+			if ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material
+
+			state.setLineWidth( lineWidth * getTargetPixelRatio() );
+
+			if ( object.isLineSegments ) {
+
+				renderer.setMode( _gl.LINES );
+
+			} else if ( object.isLineLoop ) {
+
+				renderer.setMode( _gl.LINE_LOOP );
+
+			} else {
+
+				renderer.setMode( _gl.LINE_STRIP );
+
+			}
+
+		} else if ( object.isPoints ) {
+
+			renderer.setMode( _gl.POINTS );
+
+		} else if ( object.isSprite ) {
+
+			renderer.setMode( _gl.TRIANGLES );
+
+		}
+
+		if ( object.isInstancedMesh ) {
+
+			renderer.renderInstances( drawStart, drawCount, object.count );
+
+		} else if ( geometry.isInstancedBufferGeometry ) {
+
+			const instanceCount = Math.min( geometry.instanceCount, geometry._maxInstanceCount );
+
+			renderer.renderInstances( drawStart, drawCount, instanceCount );
+
+		} else {
+
+			renderer.render( drawStart, drawCount );
+
+		}
+
+	};
+
+	// Compile
+
+	this.compile = function ( scene, camera ) {
+
+		currentRenderState = renderStates.get( scene );
+		currentRenderState.init();
+
+		renderStateStack.push( currentRenderState );
+
+		scene.traverseVisible( function ( object ) {
+
+			if ( object.isLight && object.layers.test( camera.layers ) ) {
+
+				currentRenderState.pushLight( object );
+
+				if ( object.castShadow ) {
+
+					currentRenderState.pushShadow( object );
+
+				}
+
+			}
+
+		} );
+
+		currentRenderState.setupLights( _this.physicallyCorrectLights );
+
+		scene.traverse( function ( object ) {
+
+			const material = object.material;
+
+			if ( material ) {
+
+				if ( Array.isArray( material ) ) {
+
+					for ( let i = 0; i < material.length; i ++ ) {
+
+						const material2 = material[ i ];
+
+						getProgram( material2, scene, object );
+
+					}
+
+				} else {
+
+					getProgram( material, scene, object );
+
+				}
+
+			}
+
+		} );
+
+		renderStateStack.pop();
+		currentRenderState = null;
+
+	};
+
+	// Animation Loop
+
+	let onAnimationFrameCallback = null;
+
+	function onAnimationFrame( time ) {
+
+		if ( onAnimationFrameCallback ) onAnimationFrameCallback( time );
+
+	}
+
+	function onXRSessionStart() {
+
+		animation.stop();
+
+	}
+
+	function onXRSessionEnd() {
+
+		animation.start();
+
+	}
+
+	const animation = new WebGLAnimation();
+	animation.setAnimationLoop( onAnimationFrame );
+
+	if ( typeof window !== 'undefined' ) animation.setContext( window );
+
+	this.setAnimationLoop = function ( callback ) {
+
+		onAnimationFrameCallback = callback;
+		xr.setAnimationLoop( callback );
+
+		( callback === null ) ? animation.stop() : animation.start();
+
+	};
+
+	xr.addEventListener( 'sessionstart', onXRSessionStart );
+	xr.addEventListener( 'sessionend', onXRSessionEnd );
+
+	// Rendering
+
+	this.render = function ( scene, camera ) {
+
+		if ( camera !== undefined && camera.isCamera !== true ) {
+
+			console.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' );
+			return;
+
+		}
+
+		if ( _isContextLost === true ) return;
+
+		// update scene graph
+
+		if ( scene.autoUpdate === true ) scene.updateMatrixWorld();
+
+		// update camera matrices and frustum
+
+		if ( camera.parent === null ) camera.updateMatrixWorld();
+
+		if ( xr.enabled === true && xr.isPresenting === true ) {
+
+			if ( xr.cameraAutoUpdate === true ) xr.updateCamera( camera );
+
+			camera = xr.getCamera(); // use XR camera for rendering
+
+		}
+
+		//
+		if ( scene.isScene === true ) scene.onBeforeRender( _this, scene, camera, _currentRenderTarget );
+
+		currentRenderState = renderStates.get( scene, renderStateStack.length );
+		currentRenderState.init();
+
+		renderStateStack.push( currentRenderState );
+
+		_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );
+		_frustum.setFromProjectionMatrix( _projScreenMatrix );
+
+		_localClippingEnabled = this.localClippingEnabled;
+		_clippingEnabled = clipping.init( this.clippingPlanes, _localClippingEnabled, camera );
+
+		currentRenderList = renderLists.get( scene, renderListStack.length );
+		currentRenderList.init();
+
+		renderListStack.push( currentRenderList );
+
+		projectObject( scene, camera, 0, _this.sortObjects );
+
+		currentRenderList.finish();
+
+		if ( _this.sortObjects === true ) {
+
+			currentRenderList.sort( _opaqueSort, _transparentSort );
+
+		}
+
+		//
+
+		if ( _clippingEnabled === true ) clipping.beginShadows();
+
+		const shadowsArray = currentRenderState.state.shadowsArray;
+
+		shadowMap.render( shadowsArray, scene, camera );
+
+		if ( _clippingEnabled === true ) clipping.endShadows();
+
+		//
+
+		if ( this.info.autoReset === true ) this.info.reset();
+
+		//
+
+		background.render( currentRenderList, scene );
+
+		// render scene
+
+		currentRenderState.setupLights( _this.physicallyCorrectLights );
+
+		if ( camera.isArrayCamera ) {
+
+			const cameras = camera.cameras;
+
+			for ( let i = 0, l = cameras.length; i < l; i ++ ) {
+
+				const camera2 = cameras[ i ];
+
+				renderScene( currentRenderList, scene, camera2, camera2.viewport );
+
+			}
+
+		} else {
+
+			renderScene( currentRenderList, scene, camera );
+
+		}
+
+		//
+
+		if ( _currentRenderTarget !== null ) {
+
+			// resolve multisample renderbuffers to a single-sample texture if necessary
+
+			textures.updateMultisampleRenderTarget( _currentRenderTarget );
+
+			// Generate mipmap if we're using any kind of mipmap filtering
+
+			textures.updateRenderTargetMipmap( _currentRenderTarget );
+
+		}
+
+		//
+
+		if ( scene.isScene === true ) scene.onAfterRender( _this, scene, camera );
+
+		// Ensure depth buffer writing is enabled so it can be cleared on next render
+
+		state.buffers.depth.setTest( true );
+		state.buffers.depth.setMask( true );
+		state.buffers.color.setMask( true );
+
+		state.setPolygonOffset( false );
+
+		// _gl.finish();
+
+		bindingStates.resetDefaultState();
+		_currentMaterialId = - 1;
+		_currentCamera = null;
+
+		renderStateStack.pop();
+
+		if ( renderStateStack.length > 0 ) {
+
+			currentRenderState = renderStateStack[ renderStateStack.length - 1 ];
+
+		} else {
+
+			currentRenderState = null;
+
+		}
+
+		renderListStack.pop();
+
+		if ( renderListStack.length > 0 ) {
+
+			currentRenderList = renderListStack[ renderListStack.length - 1 ];
+
+		} else {
+
+			currentRenderList = null;
+
+		}
+
+	};
+
+	function projectObject( object, camera, groupOrder, sortObjects ) {
+
+		if ( object.visible === false ) return;
+
+		const visible = object.layers.test( camera.layers );
+
+		if ( visible ) {
+
+			if ( object.isGroup ) {
+
+				groupOrder = object.renderOrder;
+
+			} else if ( object.isLOD ) {
+
+				if ( object.autoUpdate === true ) object.update( camera );
+
+			} else if ( object.isLight ) {
+
+				currentRenderState.pushLight( object );
+
+				if ( object.castShadow ) {
+
+					currentRenderState.pushShadow( object );
+
+				}
+
+			} else if ( object.isSprite ) {
+
+				if ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) {
+
+					if ( sortObjects ) {
+
+						_vector3.setFromMatrixPosition( object.matrixWorld )
+							.applyMatrix4( _projScreenMatrix );
+
+					}
+
+					const geometry = objects.update( object );
+					const material = object.material;
+
+					if ( material.visible ) {
+
+						currentRenderList.push( object, geometry, material, groupOrder, _vector3.z, null );
+
+					}
+
+				}
+
+			} else if ( object.isMesh || object.isLine || object.isPoints ) {
+
+				if ( object.isSkinnedMesh ) {
+
+					// update skeleton only once in a frame
+
+					if ( object.skeleton.frame !== info.render.frame ) {
+
+						object.skeleton.update();
+						object.skeleton.frame = info.render.frame;
+
+					}
+
+				}
+
+				if ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) {
+
+					if ( sortObjects ) {
+
+						_vector3.setFromMatrixPosition( object.matrixWorld )
+							.applyMatrix4( _projScreenMatrix );
+
+					}
+
+					const geometry = objects.update( object );
+					const material = object.material;
+
+					if ( Array.isArray( material ) ) {
+
+						const groups = geometry.groups;
+
+						for ( let i = 0, l = groups.length; i < l; i ++ ) {
+
+							const group = groups[ i ];
+							const groupMaterial = material[ group.materialIndex ];
+
+							if ( groupMaterial && groupMaterial.visible ) {
+
+								currentRenderList.push( object, geometry, groupMaterial, groupOrder, _vector3.z, group );
+
+							}
+
+						}
+
+					} else if ( material.visible ) {
+
+						currentRenderList.push( object, geometry, material, groupOrder, _vector3.z, null );
+
+					}
+
+				}
+
+			}
+
+		}
+
+		const children = object.children;
+
+		for ( let i = 0, l = children.length; i < l; i ++ ) {
+
+			projectObject( children[ i ], camera, groupOrder, sortObjects );
+
+		}
+
+	}
+
+	function renderScene( currentRenderList, scene, camera, viewport ) {
+
+		const opaqueObjects = currentRenderList.opaque;
+		const transmissiveObjects = currentRenderList.transmissive;
+		const transparentObjects = currentRenderList.transparent;
+
+		currentRenderState.setupLightsView( camera );
+
+		if ( transmissiveObjects.length > 0 ) renderTransmissionPass( opaqueObjects, scene, camera );
+
+		if ( viewport ) state.viewport( _currentViewport.copy( viewport ) );
+
+		if ( opaqueObjects.length > 0 ) renderObjects( opaqueObjects, scene, camera );
+		if ( transmissiveObjects.length > 0 ) renderObjects( transmissiveObjects, scene, camera );
+		if ( transparentObjects.length > 0 ) renderObjects( transparentObjects, scene, camera );
+
+	}
+
+	function renderTransmissionPass( opaqueObjects, scene, camera ) {
+
+		if ( _transmissionRenderTarget === null ) {
+
+			const needsAntialias = _antialias === true && capabilities.isWebGL2 === true;
+			const renderTargetType = needsAntialias ? WebGLMultisampleRenderTarget : WebGLRenderTarget;
+
+			_transmissionRenderTarget = new renderTargetType( 1024, 1024, {
+				generateMipmaps: true,
+				type: utils.convert( HalfFloatType ) !== null ? HalfFloatType : UnsignedByteType,
+				minFilter: LinearMipmapLinearFilter,
+				magFilter: NearestFilter,
+				wrapS: ClampToEdgeWrapping,
+				wrapT: ClampToEdgeWrapping,
+				useRenderToTexture: extensions.has( 'WEBGL_multisampled_render_to_texture' )
+			} );
+
+		}
+
+		const currentRenderTarget = _this.getRenderTarget();
+		_this.setRenderTarget( _transmissionRenderTarget );
+		_this.clear();
+
+		// Turn off the features which can affect the frag color for opaque objects pass.
+		// Otherwise they are applied twice in opaque objects pass and transmission objects pass.
+		const currentToneMapping = _this.toneMapping;
+		_this.toneMapping = NoToneMapping;
+
+		renderObjects( opaqueObjects, scene, camera );
+
+		_this.toneMapping = currentToneMapping;
+
+		textures.updateMultisampleRenderTarget( _transmissionRenderTarget );
+		textures.updateRenderTargetMipmap( _transmissionRenderTarget );
+
+		_this.setRenderTarget( currentRenderTarget );
+
+	}
+
+	function renderObjects( renderList, scene, camera ) {
+
+		const overrideMaterial = scene.isScene === true ? scene.overrideMaterial : null;
+
+		for ( let i = 0, l = renderList.length; i < l; i ++ ) {
+
+			const renderItem = renderList[ i ];
+
+			const object = renderItem.object;
+			const geometry = renderItem.geometry;
+			const material = overrideMaterial === null ? renderItem.material : overrideMaterial;
+			const group = renderItem.group;
+
+			if ( object.layers.test( camera.layers ) ) {
+
+				renderObject( object, scene, camera, geometry, material, group );
+
+			}
+
+		}
+
+	}
+
+	function renderObject( object, scene, camera, geometry, material, group ) {
+
+		object.onBeforeRender( _this, scene, camera, geometry, material, group );
+
+		object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );
+		object.normalMatrix.getNormalMatrix( object.modelViewMatrix );
+
+		material.onBeforeRender( _this, scene, camera, geometry, object, group );
+
+		if ( material.transparent === true && material.side === DoubleSide ) {
+
+			material.side = BackSide;
+			material.needsUpdate = true;
+			_this.renderBufferDirect( camera, scene, geometry, material, object, group );
+
+			material.side = FrontSide;
+			material.needsUpdate = true;
+			_this.renderBufferDirect( camera, scene, geometry, material, object, group );
+
+			material.side = DoubleSide;
+
+		} else {
+
+			_this.renderBufferDirect( camera, scene, geometry, material, object, group );
+
+		}
+
+		object.onAfterRender( _this, scene, camera, geometry, material, group );
+
+	}
+
+	function getProgram( material, scene, object ) {
+
+		if ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ...
+
+		const materialProperties = properties.get( material );
+
+		const lights = currentRenderState.state.lights;
+		const shadowsArray = currentRenderState.state.shadowsArray;
+
+		const lightsStateVersion = lights.state.version;
+
+		const parameters = programCache.getParameters( material, lights.state, shadowsArray, scene, object );
+		const programCacheKey = programCache.getProgramCacheKey( parameters );
+
+		let programs = materialProperties.programs;
+
+		// always update environment and fog - changing these trigger an getProgram call, but it's possible that the program doesn't change
+
+		materialProperties.environment = material.isMeshStandardMaterial ? scene.environment : null;
+		materialProperties.fog = scene.fog;
+		materialProperties.envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || materialProperties.environment );
+
+		if ( programs === undefined ) {
+
+			// new material
+
+			material.addEventListener( 'dispose', onMaterialDispose );
+
+			programs = new Map();
+			materialProperties.programs = programs;
+
+		}
+
+		let program = programs.get( programCacheKey );
+
+		if ( program !== undefined ) {
+
+			// early out if program and light state is identical
+
+			if ( materialProperties.currentProgram === program && materialProperties.lightsStateVersion === lightsStateVersion ) {
+
+				updateCommonMaterialProperties( material, parameters );
+
+				return program;
+
+			}
+
+		} else {
+
+			parameters.uniforms = programCache.getUniforms( material );
+
+			material.onBuild( object, parameters, _this );
+
+			material.onBeforeCompile( parameters, _this );
+
+			program = programCache.acquireProgram( parameters, programCacheKey );
+			programs.set( programCacheKey, program );
+
+			materialProperties.uniforms = parameters.uniforms;
+
+		}
+
+		const uniforms = materialProperties.uniforms;
+
+		if ( ( ! material.isShaderMaterial && ! material.isRawShaderMaterial ) || material.clipping === true ) {
+
+			uniforms.clippingPlanes = clipping.uniform;
+
+		}
+
+		updateCommonMaterialProperties( material, parameters );
+
+		// store the light setup it was created for
+
+		materialProperties.needsLights = materialNeedsLights( material );
+		materialProperties.lightsStateVersion = lightsStateVersion;
+
+		if ( materialProperties.needsLights ) {
+
+			// wire up the material to this renderer's lighting state
+
+			uniforms.ambientLightColor.value = lights.state.ambient;
+			uniforms.lightProbe.value = lights.state.probe;
+			uniforms.directionalLights.value = lights.state.directional;
+			uniforms.directionalLightShadows.value = lights.state.directionalShadow;
+			uniforms.spotLights.value = lights.state.spot;
+			uniforms.spotLightShadows.value = lights.state.spotShadow;
+			uniforms.rectAreaLights.value = lights.state.rectArea;
+			uniforms.ltc_1.value = lights.state.rectAreaLTC1;
+			uniforms.ltc_2.value = lights.state.rectAreaLTC2;
+			uniforms.pointLights.value = lights.state.point;
+			uniforms.pointLightShadows.value = lights.state.pointShadow;
+			uniforms.hemisphereLights.value = lights.state.hemi;
+
+			uniforms.directionalShadowMap.value = lights.state.directionalShadowMap;
+			uniforms.directionalShadowMatrix.value = lights.state.directionalShadowMatrix;
+			uniforms.spotShadowMap.value = lights.state.spotShadowMap;
+			uniforms.spotShadowMatrix.value = lights.state.spotShadowMatrix;
+			uniforms.pointShadowMap.value = lights.state.pointShadowMap;
+			uniforms.pointShadowMatrix.value = lights.state.pointShadowMatrix;
+			// TODO (abelnation): add area lights shadow info to uniforms
+
+		}
+
+		const progUniforms = program.getUniforms();
+		const uniformsList = WebGLUniforms.seqWithValue( progUniforms.seq, uniforms );
+
+		materialProperties.currentProgram = program;
+		materialProperties.uniformsList = uniformsList;
+
+		return program;
+
+	}
+
+	function updateCommonMaterialProperties( material, parameters ) {
+
+		const materialProperties = properties.get( material );
+
+		materialProperties.outputEncoding = parameters.outputEncoding;
+		materialProperties.instancing = parameters.instancing;
+		materialProperties.skinning = parameters.skinning;
+		materialProperties.morphTargets = parameters.morphTargets;
+		materialProperties.morphNormals = parameters.morphNormals;
+		materialProperties.morphTargetsCount = parameters.morphTargetsCount;
+		materialProperties.numClippingPlanes = parameters.numClippingPlanes;
+		materialProperties.numIntersection = parameters.numClipIntersection;
+		materialProperties.vertexAlphas = parameters.vertexAlphas;
+		materialProperties.vertexTangents = parameters.vertexTangents;
+		materialProperties.toneMapping = parameters.toneMapping;
+
+	}
+
+	function setProgram( camera, scene, geometry, material, object ) {
+
+		if ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ...
+
+		textures.resetTextureUnits();
+
+		const fog = scene.fog;
+		const environment = material.isMeshStandardMaterial ? scene.environment : null;
+		const encoding = ( _currentRenderTarget === null ) ? _this.outputEncoding : ( _currentRenderTarget.isXRRenderTarget === true ? _currentRenderTarget.texture.encoding : LinearEncoding );
+		const envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment );
+		const vertexAlphas = material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4;
+		const vertexTangents = !! material.normalMap && !! geometry.attributes.tangent;
+		const morphTargets = !! geometry.morphAttributes.position;
+		const morphNormals = !! geometry.morphAttributes.normal;
+		const morphTargetsCount = !! geometry.morphAttributes.position ? geometry.morphAttributes.position.length : 0;
+		const toneMapping = material.toneMapped ? _this.toneMapping : NoToneMapping;
+
+		const materialProperties = properties.get( material );
+		const lights = currentRenderState.state.lights;
+
+		if ( _clippingEnabled === true ) {
+
+			if ( _localClippingEnabled === true || camera !== _currentCamera ) {
+
+				const useCache =
+					camera === _currentCamera &&
+					material.id === _currentMaterialId;
+
+				// we might want to call this function with some ClippingGroup
+				// object instead of the material, once it becomes feasible
+				// (#8465, #8379)
+				clipping.setState( material, camera, useCache );
+
+			}
+
+		}
+
+		//
+
+		let needsProgramChange = false;
+
+		if ( material.version === materialProperties.__version ) {
+
+			if ( materialProperties.needsLights && ( materialProperties.lightsStateVersion !== lights.state.version ) ) {
+
+				needsProgramChange = true;
+
+			} else if ( materialProperties.outputEncoding !== encoding ) {
+
+				needsProgramChange = true;
+
+			} else if ( object.isInstancedMesh && materialProperties.instancing === false ) {
+
+				needsProgramChange = true;
+
+			} else if ( ! object.isInstancedMesh && materialProperties.instancing === true ) {
+
+				needsProgramChange = true;
+
+			} else if ( object.isSkinnedMesh && materialProperties.skinning === false ) {
+
+				needsProgramChange = true;
+
+			} else if ( ! object.isSkinnedMesh && materialProperties.skinning === true ) {
+
+				needsProgramChange = true;
+
+			} else if ( materialProperties.envMap !== envMap ) {
+
+				needsProgramChange = true;
+
+			} else if ( material.fog && materialProperties.fog !== fog ) {
+
+				needsProgramChange = true;
+
+			} else if ( materialProperties.numClippingPlanes !== undefined &&
+				( materialProperties.numClippingPlanes !== clipping.numPlanes ||
+				materialProperties.numIntersection !== clipping.numIntersection ) ) {
+
+				needsProgramChange = true;
+
+			} else if ( materialProperties.vertexAlphas !== vertexAlphas ) {
+
+				needsProgramChange = true;
+
+			} else if ( materialProperties.vertexTangents !== vertexTangents ) {
+
+				needsProgramChange = true;
+
+			} else if ( materialProperties.morphTargets !== morphTargets ) {
+
+				needsProgramChange = true;
+
+			} else if ( materialProperties.morphNormals !== morphNormals ) {
+
+				needsProgramChange = true;
+
+			} else if ( materialProperties.toneMapping !== toneMapping ) {
+
+				needsProgramChange = true;
+
+			} else if ( capabilities.isWebGL2 === true && materialProperties.morphTargetsCount !== morphTargetsCount ) {
+
+				needsProgramChange = true;
+
+			}
+
+		} else {
+
+			needsProgramChange = true;
+			materialProperties.__version = material.version;
+
+		}
+
+		//
+
+		let program = materialProperties.currentProgram;
+
+		if ( needsProgramChange === true ) {
+
+			program = getProgram( material, scene, object );
+
+		}
+
+		let refreshProgram = false;
+		let refreshMaterial = false;
+		let refreshLights = false;
+
+		const p_uniforms = program.getUniforms(),
+			m_uniforms = materialProperties.uniforms;
+
+		if ( state.useProgram( program.program ) ) {
+
+			refreshProgram = true;
+			refreshMaterial = true;
+			refreshLights = true;
+
+		}
+
+		if ( material.id !== _currentMaterialId ) {
+
+			_currentMaterialId = material.id;
+
+			refreshMaterial = true;
+
+		}
+
+		if ( refreshProgram || _currentCamera !== camera ) {
+
+			p_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix );
+
+			if ( capabilities.logarithmicDepthBuffer ) {
+
+				p_uniforms.setValue( _gl, 'logDepthBufFC',
+					2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) );
+
+			}
+
+			if ( _currentCamera !== camera ) {
+
+				_currentCamera = camera;
+
+				// lighting uniforms depend on the camera so enforce an update
+				// now, in case this material supports lights - or later, when
+				// the next material that does gets activated:
+
+				refreshMaterial = true;		// set to true on material change
+				refreshLights = true;		// remains set until update done
+
+			}
+
+			// load material specific uniforms
+			// (shader material also gets them for the sake of genericity)
+
+			if ( material.isShaderMaterial ||
+				material.isMeshPhongMaterial ||
+				material.isMeshToonMaterial ||
+				material.isMeshStandardMaterial ||
+				material.envMap ) {
+
+				const uCamPos = p_uniforms.map.cameraPosition;
+
+				if ( uCamPos !== undefined ) {
+
+					uCamPos.setValue( _gl,
+						_vector3.setFromMatrixPosition( camera.matrixWorld ) );
+
+				}
+
+			}
+
+			if ( material.isMeshPhongMaterial ||
+				material.isMeshToonMaterial ||
+				material.isMeshLambertMaterial ||
+				material.isMeshBasicMaterial ||
+				material.isMeshStandardMaterial ||
+				material.isShaderMaterial ) {
+
+				p_uniforms.setValue( _gl, 'isOrthographic', camera.isOrthographicCamera === true );
+
+			}
+
+			if ( material.isMeshPhongMaterial ||
+				material.isMeshToonMaterial ||
+				material.isMeshLambertMaterial ||
+				material.isMeshBasicMaterial ||
+				material.isMeshStandardMaterial ||
+				material.isShaderMaterial ||
+				material.isShadowMaterial ||
+				object.isSkinnedMesh ) {
+
+				p_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );
+
+			}
+
+		}
+
+		// skinning and morph target uniforms must be set even if material didn't change
+		// auto-setting of texture unit for bone and morph texture must go before other textures
+		// otherwise textures used for skinning and morphing can take over texture units reserved for other material textures
+
+		if ( object.isSkinnedMesh ) {
+
+			p_uniforms.setOptional( _gl, object, 'bindMatrix' );
+			p_uniforms.setOptional( _gl, object, 'bindMatrixInverse' );
+
+			const skeleton = object.skeleton;
+
+			if ( skeleton ) {
+
+				if ( capabilities.floatVertexTextures ) {
+
+					if ( skeleton.boneTexture === null ) skeleton.computeBoneTexture();
+
+					p_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture, textures );
+					p_uniforms.setValue( _gl, 'boneTextureSize', skeleton.boneTextureSize );
+
+				} else {
+
+					p_uniforms.setOptional( _gl, skeleton, 'boneMatrices' );
+
+				}
+
+			}
+
+		}
+
+		if ( !! geometry && ( geometry.morphAttributes.position !== undefined || geometry.morphAttributes.normal !== undefined ) ) {
+
+			morphtargets.update( object, geometry, material, program );
+
+		}
+
+
+		if ( refreshMaterial || materialProperties.receiveShadow !== object.receiveShadow ) {
+
+			materialProperties.receiveShadow = object.receiveShadow;
+			p_uniforms.setValue( _gl, 'receiveShadow', object.receiveShadow );
+
+		}
+
+		if ( refreshMaterial ) {
+
+			p_uniforms.setValue( _gl, 'toneMappingExposure', _this.toneMappingExposure );
+
+			if ( materialProperties.needsLights ) {
+
+				// the current material requires lighting info
+
+				// note: all lighting uniforms are always set correctly
+				// they simply reference the renderer's state for their
+				// values
+				//
+				// use the current material's .needsUpdate flags to set
+				// the GL state when required
+
+				markUniformsLightsNeedsUpdate( m_uniforms, refreshLights );
+
+			}
+
+			// refresh uniforms common to several materials
+
+			if ( fog && material.fog ) {
+
+				materials.refreshFogUniforms( m_uniforms, fog );
+
+			}
+
+			materials.refreshMaterialUniforms( m_uniforms, material, _pixelRatio, _height, _transmissionRenderTarget );
+
+			WebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, textures );
+
+		}
+
+		if ( material.isShaderMaterial && material.uniformsNeedUpdate === true ) {
+
+			WebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, textures );
+			material.uniformsNeedUpdate = false;
+
+		}
+
+		if ( material.isSpriteMaterial ) {
+
+			p_uniforms.setValue( _gl, 'center', object.center );
+
+		}
+
+		// common matrices
+
+		p_uniforms.setValue( _gl, 'modelViewMatrix', object.modelViewMatrix );
+		p_uniforms.setValue( _gl, 'normalMatrix', object.normalMatrix );
+		p_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld );
+
+		return program;
+
+	}
+
+	// If uniforms are marked as clean, they don't need to be loaded to the GPU.
+
+	function markUniformsLightsNeedsUpdate( uniforms, value ) {
+
+		uniforms.ambientLightColor.needsUpdate = value;
+		uniforms.lightProbe.needsUpdate = value;
+
+		uniforms.directionalLights.needsUpdate = value;
+		uniforms.directionalLightShadows.needsUpdate = value;
+		uniforms.pointLights.needsUpdate = value;
+		uniforms.pointLightShadows.needsUpdate = value;
+		uniforms.spotLights.needsUpdate = value;
+		uniforms.spotLightShadows.needsUpdate = value;
+		uniforms.rectAreaLights.needsUpdate = value;
+		uniforms.hemisphereLights.needsUpdate = value;
+
+	}
+
+	function materialNeedsLights( material ) {
+
+		return material.isMeshLambertMaterial || material.isMeshToonMaterial || material.isMeshPhongMaterial ||
+			material.isMeshStandardMaterial || material.isShadowMaterial ||
+			( material.isShaderMaterial && material.lights === true );
+
+	}
+
+	this.getActiveCubeFace = function () {
+
+		return _currentActiveCubeFace;
+
+	};
+
+	this.getActiveMipmapLevel = function () {
+
+		return _currentActiveMipmapLevel;
+
+	};
+
+	this.getRenderTarget = function () {
+
+		return _currentRenderTarget;
+
+	};
+
+	this.setRenderTargetTextures = function ( renderTarget, colorTexture, depthTexture ) {
+
+		properties.get( renderTarget.texture ).__webglTexture = colorTexture;
+		properties.get( renderTarget.depthTexture ).__webglTexture = depthTexture;
+
+		const renderTargetProperties = properties.get( renderTarget );
+		renderTargetProperties.__hasExternalTextures = true;
+
+		if ( renderTargetProperties.__hasExternalTextures ) {
+
+			renderTargetProperties.__autoAllocateDepthBuffer = depthTexture === undefined;
+
+			if ( ! renderTargetProperties.__autoAllocateDepthBuffer ) {
+
+				// The multisample_render_to_texture extension doesn't work properly if there
+				// are midframe flushes and an external depth buffer. Disable use of the extension.
+				if ( renderTarget.useRenderToTexture ) {
+
+					console.warn( 'render-to-texture extension was disabled because an external texture was provided' );
+					renderTarget.useRenderToTexture = false;
+					renderTarget.useRenderbuffer = true;
+
+				}
+
+			}
+
+		}
+
+	};
+
+	this.setRenderTargetFramebuffer = function ( renderTarget, defaultFramebuffer ) {
+
+		const renderTargetProperties = properties.get( renderTarget );
+		renderTargetProperties.__webglFramebuffer = defaultFramebuffer;
+		renderTargetProperties.__useDefaultFramebuffer = defaultFramebuffer === undefined;
+
+	};
+
+	this.setRenderTarget = function ( renderTarget, activeCubeFace = 0, activeMipmapLevel = 0 ) {
+
+		_currentRenderTarget = renderTarget;
+		_currentActiveCubeFace = activeCubeFace;
+		_currentActiveMipmapLevel = activeMipmapLevel;
+		let useDefaultFramebuffer = true;
+
+		if ( renderTarget ) {
+
+			const renderTargetProperties = properties.get( renderTarget );
+
+			if ( renderTargetProperties.__useDefaultFramebuffer !== undefined ) {
+
+				// We need to make sure to rebind the framebuffer.
+				state.bindFramebuffer( _gl.FRAMEBUFFER, null );
+				useDefaultFramebuffer = false;
+
+			} else if ( renderTargetProperties.__webglFramebuffer === undefined ) {
+
+				textures.setupRenderTarget( renderTarget );
+
+			} else if ( renderTargetProperties.__hasExternalTextures ) {
+
+				// Color and depth texture must be rebound in order for the swapchain to update.
+				textures.rebindTextures( renderTarget, properties.get( renderTarget.texture ).__webglTexture, properties.get( renderTarget.depthTexture ).__webglTexture );
+
+			}
+
+		}
+
+		let framebuffer = null;
+		let isCube = false;
+		let isRenderTarget3D = false;
+
+		if ( renderTarget ) {
+
+			const texture = renderTarget.texture;
+
+			if ( texture.isDataTexture3D || texture.isDataTexture2DArray ) {
+
+				isRenderTarget3D = true;
+
+			}
+
+			const __webglFramebuffer = properties.get( renderTarget ).__webglFramebuffer;
+
+			if ( renderTarget.isWebGLCubeRenderTarget ) {
+
+				framebuffer = __webglFramebuffer[ activeCubeFace ];
+				isCube = true;
+
+			} else if ( renderTarget.useRenderbuffer ) {
+
+				framebuffer = properties.get( renderTarget ).__webglMultisampledFramebuffer;
+
+			} else {
+
+				framebuffer = __webglFramebuffer;
+
+			}
+
+			_currentViewport.copy( renderTarget.viewport );
+			_currentScissor.copy( renderTarget.scissor );
+			_currentScissorTest = renderTarget.scissorTest;
+
+		} else {
+
+			_currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).floor();
+			_currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).floor();
+			_currentScissorTest = _scissorTest;
+
+		}
+
+		const framebufferBound = state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
+
+		if ( framebufferBound && capabilities.drawBuffers && useDefaultFramebuffer ) {
+
+			state.drawBuffers( renderTarget, framebuffer );
+
+		}
+
+		state.viewport( _currentViewport );
+		state.scissor( _currentScissor );
+		state.setScissorTest( _currentScissorTest );
+
+		if ( isCube ) {
+
+			const textureProperties = properties.get( renderTarget.texture );
+			_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + activeCubeFace, textureProperties.__webglTexture, activeMipmapLevel );
+
+		} else if ( isRenderTarget3D ) {
+
+			const textureProperties = properties.get( renderTarget.texture );
+			const layer = activeCubeFace || 0;
+			_gl.framebufferTextureLayer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, textureProperties.__webglTexture, activeMipmapLevel || 0, layer );
+
+		}
+
+		_currentMaterialId = - 1; // reset current material to ensure correct uniform bindings
+
+	};
+
+	this.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer, activeCubeFaceIndex ) {
+
+		if ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) {
+
+			console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );
+			return;
+
+		}
+
+		let framebuffer = properties.get( renderTarget ).__webglFramebuffer;
+
+		if ( renderTarget.isWebGLCubeRenderTarget && activeCubeFaceIndex !== undefined ) {
+
+			framebuffer = framebuffer[ activeCubeFaceIndex ];
+
+		}
+
+		if ( framebuffer ) {
+
+			state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
+
+			try {
+
+				const texture = renderTarget.texture;
+				const textureFormat = texture.format;
+				const textureType = texture.type;
+
+				if ( textureFormat !== RGBAFormat && utils.convert( textureFormat ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) {
+
+					console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' );
+					return;
+
+				}
+
+				const halfFloatSupportedByExt = ( textureType === HalfFloatType ) && ( extensions.has( 'EXT_color_buffer_half_float' ) || ( capabilities.isWebGL2 && extensions.has( 'EXT_color_buffer_float' ) ) );
+
+				if ( textureType !== UnsignedByteType && utils.convert( textureType ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // Edge and Chrome Mac < 52 (#9513)
+					! ( textureType === FloatType && ( capabilities.isWebGL2 || extensions.has( 'OES_texture_float' ) || extensions.has( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox
+					! halfFloatSupportedByExt ) {
+
+					console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' );
+					return;
+
+				}
+
+				if ( _gl.checkFramebufferStatus( _gl.FRAMEBUFFER ) === _gl.FRAMEBUFFER_COMPLETE ) {
+
+					// the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)
+
+					if ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {
+
+						_gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), buffer );
+
+					}
+
+				} else {
+
+					console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.' );
+
+				}
+
+			} finally {
+
+				// restore framebuffer of current render target if necessary
+
+				const framebuffer = ( _currentRenderTarget !== null ) ? properties.get( _currentRenderTarget ).__webglFramebuffer : null;
+				state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
+
+			}
+
+		}
+
+	};
+
+	this.copyFramebufferToTexture = function ( position, texture, level = 0 ) {
+
+		if ( texture.isFramebufferTexture !== true ) {
+
+			console.error( 'THREE.WebGLRenderer: copyFramebufferToTexture() can only be used with FramebufferTexture.' );
+			return;
+
+		}
+
+		const levelScale = Math.pow( 2, - level );
+		const width = Math.floor( texture.image.width * levelScale );
+		const height = Math.floor( texture.image.height * levelScale );
+
+		textures.setTexture2D( texture, 0 );
+
+		_gl.copyTexSubImage2D( _gl.TEXTURE_2D, level, 0, 0, position.x, position.y, width, height );
+
+		state.unbindTexture();
+
+	};
+
+	this.copyTextureToTexture = function ( position, srcTexture, dstTexture, level = 0 ) {
+
+		const width = srcTexture.image.width;
+		const height = srcTexture.image.height;
+		const glFormat = utils.convert( dstTexture.format );
+		const glType = utils.convert( dstTexture.type );
+
+		textures.setTexture2D( dstTexture, 0 );
+
+		// As another texture upload may have changed pixelStorei
+		// parameters, make sure they are correct for the dstTexture
+		_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, dstTexture.flipY );
+		_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, dstTexture.premultiplyAlpha );
+		_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, dstTexture.unpackAlignment );
+
+		if ( srcTexture.isDataTexture ) {
+
+			_gl.texSubImage2D( _gl.TEXTURE_2D, level, position.x, position.y, width, height, glFormat, glType, srcTexture.image.data );
+
+		} else {
+
+			if ( srcTexture.isCompressedTexture ) {
+
+				_gl.compressedTexSubImage2D( _gl.TEXTURE_2D, level, position.x, position.y, srcTexture.mipmaps[ 0 ].width, srcTexture.mipmaps[ 0 ].height, glFormat, srcTexture.mipmaps[ 0 ].data );
+
+			} else {
+
+				_gl.texSubImage2D( _gl.TEXTURE_2D, level, position.x, position.y, glFormat, glType, srcTexture.image );
+
+			}
+
+		}
+
+		// Generate mipmaps only when copying level 0
+		if ( level === 0 && dstTexture.generateMipmaps ) _gl.generateMipmap( _gl.TEXTURE_2D );
+
+		state.unbindTexture();
+
+	};
+
+	this.copyTextureToTexture3D = function ( sourceBox, position, srcTexture, dstTexture, level = 0 ) {
+
+		if ( _this.isWebGL1Renderer ) {
+
+			console.warn( 'THREE.WebGLRenderer.copyTextureToTexture3D: can only be used with WebGL2.' );
+			return;
+
+		}
+
+		const width = sourceBox.max.x - sourceBox.min.x + 1;
+		const height = sourceBox.max.y - sourceBox.min.y + 1;
+		const depth = sourceBox.max.z - sourceBox.min.z + 1;
+		const glFormat = utils.convert( dstTexture.format );
+		const glType = utils.convert( dstTexture.type );
+		let glTarget;
+
+		if ( dstTexture.isDataTexture3D ) {
+
+			textures.setTexture3D( dstTexture, 0 );
+			glTarget = _gl.TEXTURE_3D;
+
+		} else if ( dstTexture.isDataTexture2DArray ) {
+
+			textures.setTexture2DArray( dstTexture, 0 );
+			glTarget = _gl.TEXTURE_2D_ARRAY;
+
+		} else {
+
+			console.warn( 'THREE.WebGLRenderer.copyTextureToTexture3D: only supports THREE.DataTexture3D and THREE.DataTexture2DArray.' );
+			return;
+
+		}
+
+		_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, dstTexture.flipY );
+		_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, dstTexture.premultiplyAlpha );
+		_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, dstTexture.unpackAlignment );
+
+		const unpackRowLen = _gl.getParameter( _gl.UNPACK_ROW_LENGTH );
+		const unpackImageHeight = _gl.getParameter( _gl.UNPACK_IMAGE_HEIGHT );
+		const unpackSkipPixels = _gl.getParameter( _gl.UNPACK_SKIP_PIXELS );
+		const unpackSkipRows = _gl.getParameter( _gl.UNPACK_SKIP_ROWS );
+		const unpackSkipImages = _gl.getParameter( _gl.UNPACK_SKIP_IMAGES );
+
+		const image = srcTexture.isCompressedTexture ? srcTexture.mipmaps[ 0 ] : srcTexture.image;
+
+		_gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, image.width );
+		_gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, image.height );
+		_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, sourceBox.min.x );
+		_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, sourceBox.min.y );
+		_gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, sourceBox.min.z );
+
+		if ( srcTexture.isDataTexture || srcTexture.isDataTexture3D ) {
+
+			_gl.texSubImage3D( glTarget, level, position.x, position.y, position.z, width, height, depth, glFormat, glType, image.data );
+
+		} else {
+
+			if ( srcTexture.isCompressedTexture ) {
+
+				console.warn( 'THREE.WebGLRenderer.copyTextureToTexture3D: untested support for compressed srcTexture.' );
+				_gl.compressedTexSubImage3D( glTarget, level, position.x, position.y, position.z, width, height, depth, glFormat, image.data );
+
+			} else {
+
+				_gl.texSubImage3D( glTarget, level, position.x, position.y, position.z, width, height, depth, glFormat, glType, image );
+
+			}
+
+		}
+
+		_gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, unpackRowLen );
+		_gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, unpackImageHeight );
+		_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, unpackSkipPixels );
+		_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, unpackSkipRows );
+		_gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, unpackSkipImages );
+
+		// Generate mipmaps only when copying level 0
+		if ( level === 0 && dstTexture.generateMipmaps ) _gl.generateMipmap( glTarget );
+
+		state.unbindTexture();
+
+	};
+
+	this.initTexture = function ( texture ) {
+
+		textures.setTexture2D( texture, 0 );
+
+		state.unbindTexture();
+
+	};
+
+	this.resetState = function () {
+
+		_currentActiveCubeFace = 0;
+		_currentActiveMipmapLevel = 0;
+		_currentRenderTarget = null;
+
+		state.reset();
+		bindingStates.reset();
+
+	};
+
+	if ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {
+
+		__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) );
+
+	}
+
+}
+
+WebGLRenderer.prototype.isWebGLRenderer = true;
+
+
+
+;// CONCATENATED MODULE: ./node_modules/three/src/renderers/WebGL1Renderer.js
+
+
+class WebGL1Renderer extends WebGLRenderer {}
+
+WebGL1Renderer.prototype.isWebGL1Renderer = true;
+
+
+
+;// CONCATENATED MODULE: ./node_modules/threestrap/src/core/renderer.js
+
+
+
+Bootstrap.registerPlugin("renderer", {
+  defaults: {
+    klass: WebGL1Renderer,
+    parameters: {
+      depth: true,
+      stencil: true,
+      preserveDrawingBuffer: true,
+      antialias: true,
+    },
+  },
+
+  listen: ["resize"],
+
+  install: function (three) {
+    // Instantiate Three renderer
+    const renderer = (three.renderer = new this.options.klass(
+      this.options.parameters
+    ));
+    three.canvas = renderer.domElement;
+
+    // Add to DOM
+    three.element.appendChild(renderer.domElement);
+  },
+
+  uninstall: function (three) {
+    // Remove from DOM
+    three.element.removeChild(three.renderer.domElement);
+
+    delete three.renderer;
+    delete three.canvas;
+  },
+
+  resize: function (event, three) {
+    const renderer = three.renderer;
+    const el = renderer.domElement;
+
+    // Resize renderer to render size if it's a canvas
+    if (el && el.tagName == "CANVAS") {
+      renderer.setSize(event.renderWidth, event.renderHeight, false);
+    }
+    // Or view size if it's just a DOM element or multi-renderer
+    else {
+      if (renderer.setRenderSize) {
+        renderer.setRenderSize(event.renderWidth, event.renderHeight);
+      }
+      renderer.setSize(event.viewWidth, event.viewHeight, false);
+    }
+  },
+});
+
+;// CONCATENATED MODULE: ./node_modules/threestrap/src/core/scene.js
+
+
+
+Bootstrap.registerPlugin("scene", {
+  install: function (three) {
+    three.scene = new external_THREE_.Scene();
+  },
+
+  uninstall: function (three) {
+    delete three.scene;
+  },
+});
+
+;// CONCATENATED MODULE: ./node_modules/threestrap/src/core/size.js
+
+
+Bootstrap.registerPlugin("size", {
+  defaults: {
+    width: null,
+    height: null,
+    aspect: null,
+    scale: 1,
+    maxRenderWidth: Infinity,
+    maxRenderHeight: Infinity,
+    devicePixelRatio: true,
+  },
+
+  listen: [
+    "window.resize:queue",
+    "element.resize:queue",
+    "this.change:queue",
+    "ready:resize",
+    "pre:pre",
+  ],
+
+  install: function (three) {
+    three.Size = this.api({
+      renderWidth: 0,
+      renderHeight: 0,
+      viewWidth: 0,
+      viewHeight: 0,
+    });
+
+    this.resized = false;
+  },
+
+  uninstall: function (three) {
+    delete three.Size;
+  },
+
+  queue: function (_event, _three) {
+    this.resized = true;
+  },
+
+  pre: function (event, three) {
+    if (!this.resized) return;
+    this.resized = false;
+    this.resize(event, three);
+  },
+
+  resize: function (event, three) {
+    const options = this.options;
+    const element = three.element;
+    const renderer = three.renderer;
+
+    let w,
+      h,
+      ew,
+      eh,
+      rw,
+      rh,
+      aspect,
+      ratio,
+      ml = 0,
+      mt = 0;
+
+    // Measure element
+    w = ew =
+      options.width === undefined || options.width == null
+        ? element.offsetWidth || element.innerWidth || 0
+        : options.width;
+
+    h = eh =
+      options.height === undefined || options.height == null
+        ? element.offsetHeight || element.innerHeight || 0
+        : options.height;
+
+    // Force aspect ratio
+    aspect = w / h;
+    if (options.aspect) {
+      if (options.aspect > aspect) {
+        h = Math.round(w / options.aspect);
+        mt = Math.floor((eh - h) / 2);
+      } else {
+        w = Math.round(h * options.aspect);
+        ml = Math.floor((ew - w) / 2);
+      }
+      aspect = w / h;
+    }
+
+    // Get device pixel ratio
+    ratio = 1;
+    if (options.devicePixelRatio && typeof window != "undefined") {
+      ratio = window.devicePixelRatio || 1;
+    }
+
+    // Apply scale and resolution max
+    rw = Math.round(
+      Math.min(w * ratio * options.scale, options.maxRenderWidth)
+    );
+    rh = Math.round(
+      Math.min(h * ratio * options.scale, options.maxRenderHeight)
+    );
+
+    // Retain aspect ratio
+    const raspect = rw / rh;
+    if (raspect > aspect) {
+      rw = Math.round(rh * aspect);
+    } else {
+      rh = Math.round(rw / aspect);
+    }
+
+    // Measure final pixel ratio
+    ratio = rh / h;
+
+    // Resize and position renderer element
+    const style = renderer.domElement.style;
+    style.width = w + "px";
+    style.height = h + "px";
+    style.marginLeft = ml + "px";
+    style.marginTop = mt + "px";
+
+    // Notify
+    Object.assign(three.Size, {
+      renderWidth: rw,
+      renderHeight: rh,
+      viewWidth: w,
+      viewHeight: h,
+      aspect: aspect,
+      pixelRatio: ratio,
+    });
+
+    three.trigger({
+      type: "resize",
+      renderWidth: rw,
+      renderHeight: rh,
+      viewWidth: w,
+      viewHeight: h,
+      aspect: aspect,
+      pixelRatio: ratio,
+    });
+  },
+});
+
+;// CONCATENATED MODULE: ./node_modules/threestrap/src/core/time.js
+
+
+Bootstrap.registerPlugin("time", {
+  defaults: {
+    speed: 1, // Clock speed
+    warmup: 0, // Wait N frames before starting clock
+    timeout: 1, // Timeout in seconds. Pause if no tick happens in this time.
+  },
+
+  listen: ["pre:tick", "this.change"],
+
+  now: function () {
+    return +new Date() / 1000;
+  },
+
+  install: function (three) {
+    three.Time = this.api({
+      now: this.now(), // Time since 1970 in seconds
+
+      clock: 0, // Adjustable clock that counts up from 0 seconds
+      step: 1 / 60, // Clock step in seconds
+
+      frames: 0, // Framenumber
+      time: 0, // Real time in seconds
+      delta: 1 / 60, // Frame step in seconds
+
+      average: 0, // Average frame time in seconds
+      fps: 0, // Average frames per second
+    });
+
+    this.last = 0;
+    this.time = 0;
+    this.clock = 0;
+    this.wait = this.options.warmup;
+
+    this.clockStart = 0;
+    this.timeStart = 0;
+  },
+
+  tick: function (event, three) {
+    const speed = this.options.speed;
+    const timeout = this.options.timeout;
+
+    const api = three.Time;
+    const now = (api.now = this.now());
+    const last = this.last;
+    let time = this.time;
+    let clock = this.clock;
+
+    if (last) {
+      let delta = (api.delta = now - last);
+      const average = api.average || delta;
+
+      if (delta > timeout) {
+        delta = 0;
+      }
+
+      const step = delta * speed;
+
+      time += delta;
+      clock += step;
+
+      if (api.frames > 0) {
+        api.average = average + (delta - average) * 0.1;
+        api.fps = 1 / average;
+      }
+
+      api.step = step;
+      api.clock = clock - this.clockStart;
+      api.time = time - this.timeStart;
+
+      api.frames++;
+
+      if (this.wait-- > 0) {
+        this.clockStart = clock;
+        this.timeStart = time;
+        api.clock = 0;
+        api.step = 1e-100;
+      }
+    }
+
+    this.last = now;
+    this.clock = clock;
+    this.time = time;
+  },
+
+  uninstall: function (three) {
+    delete three.Time;
+  },
+});
+
+;// CONCATENATED MODULE: ./node_modules/threestrap/src/core/warmup.js
+
+
+Bootstrap.registerPlugin("warmup", {
+  defaults: {
+    delay: 2,
+  },
+
+  listen: ["ready", "post"],
+
+  ready: function (event, three) {
+    three.renderer.domElement.style.visibility = "hidden";
+    this.frame = 0;
+    this.hidden = true;
+  },
+
+  post: function (event, three) {
+    if (this.hidden && this.frame >= this.options.delay) {
+      three.renderer.domElement.style.visibility = "visible";
+      this.hidden = false;
+    }
+    this.frame++;
+  },
+});
+
+;// CONCATENATED MODULE: ./node_modules/threestrap/src/core/index.js
+
+
+
+
+
+
+
+
+
+
+
+
+;// CONCATENATED MODULE: ./node_modules/threestrap/src/extra/controls.js
+
+
+
+Bootstrap.registerPlugin("controls", {
+  listen: ["update", "resize", "camera", "this.change"],
+
+  defaults: {
+    klass: null,
+    parameters: {},
+  },
+
+  install: function (three) {
+    if (!this.options.klass) throw "Must provide class for `controls.klass`";
+
+    three.controls = null;
+
+    this._camera = three.camera || new external_THREE_.PerspectiveCamera();
+    this.change(null, three);
+  },
+
+  uninstall: function (three) {
+    delete three.controls;
+  },
+
+  change: function (event, three) {
+    if (this.options.klass) {
+      if (!event || event.changes.klass) {
+        three.controls = new this.options.klass(
+          this._camera,
+          three.renderer.domElement
+        );
+      }
+
+      Object.assign(three.controls, this.options.parameters);
+    } else {
+      three.controls = null;
+    }
+  },
+
+  update: function (event, three) {
+    const delta = (three.Time && three.Time.delta) || 1 / 60;
+    const vr = three.VR && three.VR.state;
+
+    if (three.controls.vr) three.controls.vr(vr);
+    three.controls.update(delta);
+  },
+
+  camera: function (event, three) {
+    three.controls.object = this._camera = event.camera;
+  },
+
+  resize: function (event, three) {
+    three.controls.handleResize && three.controls.handleResize();
+  },
+});
+
+;// CONCATENATED MODULE: ./node_modules/threestrap/src/extra/cursor.js
+
+
+Bootstrap.registerPlugin("cursor", {
+  listen: [
+    "update",
+    "this.change",
+    "install:change",
+    "uninstall:change",
+    "element.mousemove",
+    "vr",
+  ],
+
+  defaults: {
+    cursor: null,
+    hide: false,
+    timeout: 3,
+  },
+
+  install: function (three) {
+    this.timeout = this.options.timeout;
+    this.element = three.element;
+    this.change(null, three);
+  },
+
+  uninstall: function (three) {
+    delete three.controls;
+  },
+
+  change: function (event, three) {
+    this.applyCursor(three);
+  },
+
+  mousemove: function (event, three) {
+    if (this.options.hide) {
+      this.applyCursor(three);
+      this.timeout = +this.options.timeout || 0;
+    }
+  },
+
+  update: function (event, three) {
+    const delta = (three.Time && three.Time.delta) || 1 / 60;
+
+    if (this.options.hide) {
+      this.timeout -= delta;
+      if (this.timeout < 0) {
+        this.applyCursor(three, "none");
+      }
+    }
+  },
+
+  vr: function (event, three) {
+    this.hide = event.active && !event.hmd.fake;
+    this.applyCursor(three);
+  },
+
+  applyCursor: function (three, cursor) {
+    const auto = three.controls ? "move" : "";
+    cursor = cursor || this.options.cursor || auto;
+    if (this.hide) cursor = "none";
+    if (this.cursor != cursor) {
+      this.element.style.cursor = cursor;
+    }
+  },
+});
+
+;// CONCATENATED MODULE: ./node_modules/threestrap/src/extra/fullscreen.js
+
+
+Bootstrap.registerPlugin("fullscreen", {
+  defaults: {
+    key: "f",
+  },
+
+  listen: ["ready", "update"],
+
+  install: function (three) {
+    three.Fullscreen = this.api(
+      {
+        active: false,
+        toggle: this.toggle.bind(this),
+      },
+      three
+    );
+  },
+
+  uninstall: function (three) {
+    delete three.Fullscreen;
+  },
+
+  ready: function (event, three) {
+    document.body.addEventListener(
+      "keypress",
+      function (event) {
+        if (
+          this.options.key &&
+          event.charCode == this.options.key.charCodeAt(0)
+        ) {
+          this.toggle(three);
+        }
+      }.bind(this)
+    );
+
+    const changeHandler = function () {
+      const active =
+        !!document.fullscreenElement ||
+        !!document.mozFullScreenElement ||
+        !!document.webkitFullscreenElement ||
+        !!document.msFullscreenElement;
+      three.Fullscreen.active = this.active = active;
+      three.trigger({
+        type: "fullscreen",
+        active: active,
+      });
+    }.bind(this);
+    document.addEventListener("fullscreenchange", changeHandler, false);
+    document.addEventListener("webkitfullscreenchange", changeHandler, false);
+    document.addEventListener("mozfullscreenchange", changeHandler, false);
+  },
+
+  toggle: function (three) {
+    const canvas = three.canvas;
+    const options =
+      three.VR && three.VR.active ? { vrDisplay: three.VR.hmd } : {};
+
+    if (!this.active) {
+      if (canvas.requestFullScreen) {
+        canvas.requestFullScreen(options);
+      } else if (canvas.msRequestFullScreen) {
+        canvas.msRequestFullscreen(options);
+      } else if (canvas.webkitRequestFullscreen) {
+        canvas.webkitRequestFullscreen(options);
+      } else if (canvas.mozRequestFullScreen) {
+        canvas.mozRequestFullScreen(options); // s vs S
+      }
+    } else {
+      if (document.exitFullscreen) {
+        document.exitFullscreen();
+      } else if (document.msExitFullscreen) {
+        document.msExitFullscreen();
+      } else if (document.webkitExitFullscreen) {
+        document.webkitExitFullscreen();
+      } else if (document.mozCancelFullScreen) {
+        document.mozCancelFullScreen(); // s vs S
+      }
+    }
+  },
+});
+
+// EXTERNAL MODULE: ./node_modules/stats.js/build/stats.min.js
+var stats_min = __webpack_require__(3466);
+var stats_min_default = /*#__PURE__*/__webpack_require__.n(stats_min);
+;// CONCATENATED MODULE: ./node_modules/threestrap/src/extra/stats.js
+
+
+
+Bootstrap.registerPlugin("stats", {
+  listen: ["pre", "post"],
+
+  install: function (three) {
+    const stats = (this.stats = new (stats_min_default())());
+    const style = stats.domElement.style;
+
+    style.position = "absolute";
+    style.top = style.left = 0;
+    three.element.appendChild(stats.domElement);
+
+    three.stats = stats;
+  },
+
+  uninstall: function (three) {
+    document.body.removeChild(this.stats.domElement);
+
+    delete three.stats;
+  },
+
+  pre: function (_event, _three) {
+    this.stats.begin();
+  },
+
+  post: function (_event, _three) {
+    this.stats.end();
+  },
+});
+
+;// CONCATENATED MODULE: ./node_modules/threestrap/src/extra/ui.js
+
+
+Bootstrap.registerPlugin("ui", {
+  defaults: {
+    theme: "white",
+    style:
+      ".threestrap-ui { position: absolute; bottom: 5px; right: 5px; float: left; }" +
+      ".threestrap-ui button { border: 0; background: none;" +
+      "  vertical-align: middle; font-weight: bold; } " +
+      ".threestrap-ui .glyphicon { top: 2px; font-weight: bold; } " +
+      "@media (max-width: 640px) { .threestrap-ui button { font-size: 120% } }" +
+      ".threestrap-white button { color: #fff; text-shadow: 0 1px 1px rgba(0, 0, 0, 1), " +
+      "0 1px 3px rgba(0, 0, 0, 1); }" +
+      ".threestrap-black button { color: #000; text-shadow: 0 0px 1px rgba(255, 255, 255, 1), " +
+      "0 0px 2px rgba(255, 255, 255, 1), " +
+      "0 0px 2px rgba(255, 255, 255, 1) }",
+  },
+
+  listen: ["fullscreen"],
+
+  markup: function (three, theme, style) {
+    let url =
+      "//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap-glyphicons.css";
+    if (location.href.match(/^file:\/\//)) url = "http://" + url;
+
+    const buttons = [];
+
+    if (three.Fullscreen) {
+      buttons.push(
+        '<button class="fullscreen" title="Full Screen">' +
+          '<span class="glyphicon glyphicon-fullscreen"></span>' +
+          "</button>"
+      );
+    }
+    if (three.VR) {
+      buttons.push('<button class="vr" title="VR Headset">VR</button>');
+    }
+
+    return (
+      '<style type="text/css">@import url("' +
+      url +
+      '"); ' +
+      style +
+      "</style>" +
+      '<div class="threestrap-ui threestrap-' +
+      theme +
+      '">' +
+      buttons.join("\n") +
+      "</div>"
+    );
+  },
+
+  install: function (three) {
+    const ui = (this.ui = document.createElement("div"));
+    ui.innerHTML = this.markup(three, this.options.theme, this.options.style);
+    document.body.appendChild(ui);
+
+    const fullscreen = (this.ui.fullscreen =
+      ui.querySelector("button.fullscreen"));
+    if (fullscreen) {
+      three.bind([fullscreen, "click:goFullscreen"], this);
+    }
+
+    const vr = (this.ui.vr = ui.querySelector("button.vr"));
+    if (vr && three.VR) {
+      three.VR.set({ mode: "2d" });
+      three.bind([vr, "click:goVR"], this);
+    }
+  },
+
+  fullscreen: function (event, three) {
+    this.ui.style.display = event.active ? "none" : "block";
+    if (!event.active) three.VR && three.VR.set({ mode: "2d" });
+  },
+
+  goFullscreen: function (event, three) {
+    if (three.Fullscreen) {
+      three.Fullscreen.toggle();
+    }
+  },
+
+  goVR: function (event, three) {
+    if (three.VR) {
+      three.VR.set({ mode: "auto" });
+      three.Fullscreen.toggle();
+    }
+  },
+
+  uninstall: function (_three) {
+    document.body.removeChild(this.ui);
+  },
+});
+
+;// CONCATENATED MODULE: ./node_modules/threestrap/src/renderers/VRRenderer.js
+/**
+ * VRRenderer
+ *
+ * @author wwwtyro https://github.com/wwwtyro
+ * @author unconed https://github.com/unconed
+ */
+
+
+
+class VRRenderer {
+  constructor(renderer, hmd) {
+    this.renderer = renderer;
+
+    this.right = new external_THREE_.Vector3();
+    this.cameraLeft = new external_THREE_.PerspectiveCamera();
+    this.cameraRight = new external_THREE_.PerspectiveCamera();
+
+    const et = hmd.getEyeTranslation("left");
+    this.halfIPD = new external_THREE_.Vector3(et.x, et.y, et.z).length();
+    this.fovLeft = hmd.getRecommendedEyeFieldOfView("left");
+    this.fovRight = hmd.getRecommendedEyeFieldOfView("right");
+  }
+
+  FovToNDCScaleOffset(fov) {
+    const pxscale = 2.0 / (fov.leftTan + fov.rightTan);
+    const pxoffset = (fov.leftTan - fov.rightTan) * pxscale * 0.5;
+    const pyscale = 2.0 / (fov.upTan + fov.downTan);
+    const pyoffset = (fov.upTan - fov.downTan) * pyscale * 0.5;
+    return {
+      scale: [pxscale, pyscale],
+      offset: [pxoffset, pyoffset],
+    };
+  }
+
+  FovPortToProjection(
+    matrix,
+    fov,
+    rightHanded /* = true */,
+    zNear /* = 0.01 */,
+    zFar /* = 10000.0 */
+  ) {
+    rightHanded = rightHanded === undefined ? true : rightHanded;
+    zNear = zNear === undefined ? 0.01 : zNear;
+    zFar = zFar === undefined ? 10000.0 : zFar;
+    const handednessScale = rightHanded ? -1.0 : 1.0;
+    const m = matrix.elements;
+    const scaleAndOffset = this.FovToNDCScaleOffset(fov);
+    m[0 * 4 + 0] = scaleAndOffset.scale[0];
+    m[0 * 4 + 1] = 0.0;
+    m[0 * 4 + 2] = scaleAndOffset.offset[0] * handednessScale;
+    m[0 * 4 + 3] = 0.0;
+    m[1 * 4 + 0] = 0.0;
+    m[1 * 4 + 1] = scaleAndOffset.scale[1];
+    m[1 * 4 + 2] = -scaleAndOffset.offset[1] * handednessScale;
+    m[1 * 4 + 3] = 0.0;
+    m[2 * 4 + 0] = 0.0;
+    m[2 * 4 + 1] = 0.0;
+    m[2 * 4 + 2] = (zFar / (zNear - zFar)) * -handednessScale;
+    m[2 * 4 + 3] = (zFar * zNear) / (zNear - zFar);
+    m[3 * 4 + 0] = 0.0;
+    m[3 * 4 + 1] = 0.0;
+    m[3 * 4 + 2] = handednessScale;
+    m[3 * 4 + 3] = 0.0;
+    matrix.transpose();
+  }
+
+  FovToProjection(
+    matrix,
+    fov,
+    rightHanded /* = true */,
+    zNear /* = 0.01 */,
+    zFar /* = 10000.0 */
+  ) {
+    const fovPort = {
+      upTan: Math.tan((fov.upDegrees * Math.PI) / 180.0),
+      downTan: Math.tan((fov.downDegrees * Math.PI) / 180.0),
+      leftTan: Math.tan((fov.leftDegrees * Math.PI) / 180.0),
+      rightTan: Math.tan((fov.rightDegrees * Math.PI) / 180.0),
+    };
+    return this.FovPortToProjection(matrix, fovPort, rightHanded, zNear, zFar);
+  }
+
+  render(scene, camera) {
+    this.FovToProjection(
+      this.cameraLeft.projectionMatrix,
+      this.fovLeft,
+      true,
+      camera.near,
+      camera.far
+    );
+    this.FovToProjection(
+      this.cameraRight.projectionMatrix,
+      this.fovRight,
+      true,
+      camera.near,
+      camera.far
+    );
+
+    this.right.set(this.halfIPD, 0, 0);
+    this.right.applyQuaternion(camera.quaternion);
+
+    this.cameraLeft.position.copy(camera.position).sub(this.right);
+    this.cameraRight.position.copy(camera.position).add(this.right);
+
+    this.cameraLeft.quaternion.copy(camera.quaternion);
+    this.cameraRight.quaternion.copy(camera.quaternion);
+
+    const dpr = this.renderer.devicePixelRatio || 1;
+    const width = this.renderer.domElement.width / 2 / dpr;
+    const height = this.renderer.domElement.height / dpr;
+
+    this.renderer.enableScissorTest(true);
+
+    this.renderer.setViewport(0, 0, width, height);
+    this.renderer.setScissor(0, 0, width, height);
+    this.renderer.render(scene, this.cameraLeft);
+
+    this.renderer.setViewport(width, 0, width, height);
+    this.renderer.setScissor(width, 0, width, height);
+    this.renderer.render(scene, this.cameraRight);
+  }
+}
+
+;// CONCATENATED MODULE: ./node_modules/threestrap/src/extra/vr.js
+
+
+
+/*
+VR sensor / HMD hookup.
+*/
+Bootstrap.registerPlugin("vr", {
+  defaults: {
+    mode: "auto", // 'auto', '2d'
+    device: null,
+    fov: 80, // emulated FOV for fallback
+  },
+
+  listen: ["window.load", "pre", "render", "resize", "this.change"],
+
+  install: function (three) {
+    three.VR = this.api(
+      {
+        active: false,
+        devices: [],
+        hmd: null,
+        sensor: null,
+        renderer: null,
+        state: null,
+      },
+      three
+    );
+  },
+
+  uninstall: function (three) {
+    delete three.VR;
+  },
+
+  mocks: function (three, fov, def) {
+    // Fake VR device for cardboard / desktop
+
+    // Interpuppilary distance
+    const ipd = 0.03;
+
+    // Symmetric eye FOVs (Cardboard style)
+    const getEyeTranslation = function (key) {
+      return { left: { x: -ipd, y: 0, z: 0 }, right: { x: ipd, y: 0, z: 0 } }[
+        key
+      ];
+    };
+    const getRecommendedEyeFieldOfView = function (key) {
+      const camera = three.camera;
+      const aspect = (camera && camera.aspect) || 16 / 9;
+      const fov2 = (fov || (camera && camera.fov) || def) / 2;
+      const fovX =
+        (Math.atan((Math.tan((fov2 * Math.PI) / 180) * aspect) / 2) * 180) /
+        Math.PI;
+      const fovY = fov2;
+
+      return {
+        left: {
+          rightDegrees: fovX,
+          leftDegrees: fovX,
+          downDegrees: fovY,
+          upDegrees: fovY,
+        },
+        right: {
+          rightDegrees: fovX,
+          leftDegrees: fovX,
+          downDegrees: fovY,
+          upDegrees: fovY,
+        },
+      }[key];
+    };
+    // Will be replaced with orbit controls or device orientation controls by VRControls
+    const getState = function () {
+      return {};
+    };
+
+    return [
+      {
+        fake: true,
+        force: 1,
+        deviceId: "emu",
+        deviceName: "Emulated",
+        getEyeTranslation: getEyeTranslation,
+        getRecommendedEyeFieldOfView: getRecommendedEyeFieldOfView,
+      },
+      {
+        force: 2,
+        getState: getState,
+      },
+    ];
+  },
+
+  load: function (event, three) {
+    const callback = function (devs) {
+      this.callback(devs, three);
+    }.bind(this);
+
+    if (navigator.getVRDevices) {
+      navigator.getVRDevices().then(callback);
+    } else if (navigator.mozGetVRDevices) {
+      navigator.mozGetVRDevices(callback);
+    } else {
+      console.warn("No native VR support detected.");
+      callback(this.mocks(three, this.options.fov, this.defaults.fov), three);
+    }
+  },
+
+  callback: function (vrdevs, three) {
+    let hmd, sensor;
+
+    const HMD = window.HMDVRDevice || function () {};
+    const SENSOR = window.PositionSensorVRDevice || function () {};
+
+    // Export list of devices
+    vrdevs = three.VR.devices = vrdevs || three.VR.devices;
+
+    // Get HMD device
+    const deviceId = this.options.device;
+    let dev;
+
+    for (let i = 0; i < vrdevs.length; ++i) {
+      dev = vrdevs[i];
+      if (dev.force == 1 || dev instanceof HMD) {
+        if (deviceId && deviceId != dev.deviceId) continue;
+        hmd = dev;
+        break;
+      }
+    }
+
+    if (hmd) {
+      // Get sensor device
+      let dev;
+      for (let i = 0; i < vrdevs.length; ++i) {
+        dev = vrdevs[i];
+        if (
+          dev.force == 2 ||
+          (dev instanceof SENSOR && dev.hardwareUnitId == hmd.hardwareUnitId)
+        ) {
+          sensor = dev;
+          break;
+        }
+      }
+
+      this.hookup(hmd, sensor, three);
+    }
+  },
+
+  hookup: function (hmd, sensor, three) {
+    if (!VRRenderer) console.log("VRRenderer not found");
+    const klass = VRRenderer || function () {};
+
+    this.renderer = new klass(three.renderer, hmd);
+    this.hmd = hmd;
+    this.sensor = sensor;
+
+    three.VR.renderer = this.renderer;
+    three.VR.hmd = hmd;
+    three.VR.sensor = sensor;
+
+    console.log("VRRenderer", hmd.deviceName);
+  },
+
+  change: function (event, three) {
+    if (event.changes.device) {
+      this.callback(null, three);
+    }
+    this.pre(event, three);
+  },
+
+  pre: function (event, three) {
+    const last = this.active;
+
+    // Global active flag
+    const active = (this.active = this.renderer && this.options.mode != "2d");
+    three.VR.active = active;
+
+    // Load sensor state
+    if (active && this.sensor) {
+      const state = this.sensor.getState();
+      three.VR.state = state;
+    } else {
+      three.VR.state = null;
+    }
+
+    // Notify if VR state changed
+    if (last != this.active) {
+      three.trigger({
+        type: "vr",
+        active: active,
+        hmd: this.hmd,
+        sensor: this.sensor,
+      });
+    }
+  },
+
+  resize: function (_event, _three) {
+    if (this.active) {
+      // Reinit HMD projection
+      this.renderer.initialize();
+    }
+  },
+
+  render: function (event, three) {
+    if (three.scene && three.camera) {
+      const renderer = this.active ? this.renderer : three.renderer;
+
+      if (this.last != renderer) {
+        if (renderer == three.renderer) {
+          // Cleanup leftover renderer state when swapping back to normal
+          const dpr = renderer.getPixelRatio();
+          const width = renderer.domElement.width / dpr;
+          const height = renderer.domElement.height / dpr;
+          renderer.setScissorTest(false);
+          renderer.setViewport(0, 0, width, height);
+        }
+      }
+
+      this.last = renderer;
+
+      renderer.render(three.scene, three.camera);
+    }
+  },
+});
+
+;// CONCATENATED MODULE: ./node_modules/threestrap/src/extra/index.js
+
+
+
+
+
+
+
+;// CONCATENATED MODULE: ./node_modules/threestrap/src/controls/VRControls.js
+/**
+ * @author dmarcos / https://github.com/dmarcos
+ * @author mrdoob / http://mrdoob.com
+ *
+ * VRControls from
+ * https://cdn.jsdelivr.net/npm/three@0.93.0/examples/js/controls/VRControls.js.
+ * Added here so that the existing VR examples still work... this will stay
+ * until we get everything upgraded to the modern three.js approach to VR. See
+ * https://threejs.org/docs/index.html#manual/en/introduction/How-to-create-VR-content
+ * for more info.
+ */
+
+
+
+class VRControls {
+  constructor(object, onError) {
+    this.object = object;
+    this.standingMatrix = new Matrix4();
+    this.frameData = null;
+
+    if ("VRFrameData" in window) {
+      // eslint-disable-next-line no-undef
+      this.frameData = new VRFrameData();
+    }
+
+    function gotVRDisplays(displays) {
+      this.vrDisplays = displays;
+
+      if (displays.length > 0) {
+        this.vrDisplay = displays[0];
+      } else {
+        if (onError) onError("VR input not available.");
+      }
+    }
+
+    if (navigator.getVRDisplays) {
+      navigator
+        .getVRDisplays()
+        .then(gotVRDisplays)
+        .catch(function () {
+          console.warn("VRControls: Unable to get VR Displays");
+        });
+    }
+
+    // the Rift SDK returns the position in meters
+    // this scale factor allows the user to define how meters
+    // are converted to scene units.
+
+    this.scale = 1;
+
+    // If true will use "standing space" coordinate system where y=0 is the
+    // floor and x=0, z=0 is the center of the room.
+    this.standing = false;
+
+    // Distance from the users eyes to the floor in meters. Used when
+    // standing=true but the VRDisplay doesn't provide stageParameters.
+    this.userHeight = 1.6;
+  }
+
+  getVRDisplay() {
+    return this.vrDisplay;
+  }
+
+  setVRDisplay(value) {
+    this.vrDisplay = value;
+  }
+
+  getVRDisplays() {
+    console.warn("VRControls: getVRDisplays() is being deprecated.");
+    return this.vrDisplays;
+  }
+
+  getStandingMatrix() {
+    return this.standingMatrix;
+  }
+
+  update() {
+    if (this.vrDisplay) {
+      let pose;
+
+      if (this.vrDisplay.getFrameData) {
+        this.vrDisplay.getFrameData(this.frameData);
+        pose = this.frameData.pose;
+      } else if (this.vrDisplay.getPose) {
+        pose = this.vrDisplay.getPose();
+      }
+
+      if (pose.orientation !== null) {
+        this.object.quaternion.fromArray(pose.orientation);
+      }
+
+      if (pose.position !== null) {
+        this.object.position.fromArray(pose.position);
+      } else {
+        this.object.position.set(0, 0, 0);
+      }
+
+      if (this.standing) {
+        if (this.vrDisplay.stageParameters) {
+          this.object.updateMatrix();
+
+          this.standingMatrix.fromArray(
+            this.vrDisplay.stageParameters.sittingToStandingTransform
+          );
+          this.object.applyMatrix(this.standingMatrix);
+        } else {
+          this.object.position.setY(this.object.position.y + this.userHeight);
+        }
+      }
+
+      this.object.position.multiplyScalar(this.scale);
+    }
+  }
+
+  dispose() {
+    this.vrDisplay = null;
+  }
+}
+
+;// CONCATENATED MODULE: ./node_modules/threestrap/src/controls/index.js
+
+
+;// CONCATENATED MODULE: ./node_modules/threestrap/src/renderers/MultiRenderer.js
+/**
+ * Allows a stack of renderers to be treated as a single renderer.
+ * @author Gheric Speiginer
+ */
+
+
+class MultiRenderer {
+  constructor(parameters) {
+    console.log("MultiRenderer", REVISION);
+
+    this.domElement = document.createElement("div");
+    this.domElement.style.position = "relative";
+
+    this.renderers = [];
+    this._renderSizeSet = false;
+
+    const rendererClasses = parameters.renderers || [];
+    const rendererParameters = parameters.parameters || [];
+
+    // elements are stacked back-to-front
+    for (let i = 0; i < rendererClasses.length; i++) {
+      const renderer = new rendererClasses[i](rendererParameters[i]);
+      renderer.domElement.style.position = "absolute";
+      renderer.domElement.style.top = "0px";
+      renderer.domElement.style.left = "0px";
+      this.domElement.appendChild(renderer.domElement);
+      this.renderers.push(renderer);
+    }
+  }
+
+  setSize(w, h) {
+    this.domElement.style.width = w + "px";
+    this.domElement.style.height = h + "px";
+
+    for (let i = 0; i < this.renderers.length; i++) {
+      const renderer = this.renderers[i];
+      const el = renderer.domElement;
+
+      if (!this._renderSizeSet || (el && el.tagName !== "CANVAS")) {
+        renderer.setSize(w, h);
+      }
+
+      el.style.width = w + "px";
+      el.style.height = h + "px";
+    }
+  }
+
+  setRenderSize(rw, rh) {
+    this._renderSizeSet = true;
+
+    for (let i = 0; i < this.renderers.length; i++) {
+      const renderer = this.renderers[i];
+      const el = renderer.domElement;
+
+      if (el && el.tagName === "CANVAS") {
+        renderer.setSize(rw, rh, false);
+      }
+    }
+  }
+
+  render(scene, camera) {
+    for (let i = 0; i < this.renderers.length; i++) {
+      this.renderers[i].render(scene, camera);
+    }
+  }
+}
+
+;// CONCATENATED MODULE: ./node_modules/threestrap/src/renderers/index.js
+
+
+
+;// CONCATENATED MODULE: ./node_modules/threestrap/src/index.js
+
+
+
+
+
+
+// These should probably be in their own build!
+
+
+
+
+
+
+
+
+
+
+
+;// CONCATENATED MODULE: ./src/model/attributes.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining
+ * DS104: Avoid inline assignments
+ * DS205: Consider reworking code to avoid use of IIFEs
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+/*
+ Custom attribute model
+ - Organizes attributes by trait in .attributes
+ - Provides constant-time .props / .get() access to flat dictionary
+ - Provides .get(key) with or without trait namespaces
+ - Change attributes with .set(key) or .set(dictionary)
+ - Validation is double-buffered and in-place to detect changes and nops
+ - Change notifications are coalesced per object and per trait, digested later
+ - Values are stored in three.js uniform-style objects so they can be bound as GL uniforms
+ - Originally passed (unnormalized) values are preserved and can be fetched via .orig()
+ - Attributes can be defined as final/const
+ - Attributes can be computed from both public or private expressions with .bind(key, false/true)
+ - Expressions are time-dependent, can be time-travelled with .evaluate()
+ - This enables continous simulation and data logging despite choppy animation updates
+
+  Actual type and trait definitions are injected from Primitives
+*/
+
+class Attributes {
+  constructor(definitions, context) {
+    this.context = context;
+    this.traits = definitions.Traits;
+    this.types = definitions.Types;
+    this.pending = [];
+    this.bound = [];
+    this.last = null;
+  }
+
+  make(type) {
+    return {
+      enum: typeof type.enum === "function" ? type.enum() : undefined,
+      type: typeof type.uniform === "function" ? type.uniform() : undefined, // for three.js
+      value: type.make(),
+    };
+  }
+
+  apply(object, config) {
+    return new Data(object, config, this);
+  }
+
+  bind(callback) {
+    return this.bound.push(callback);
+  }
+  unbind(callback) {
+    return (this.bound = Array.from(this.bound).filter(
+      (cb) => cb !== callback
+    ));
+  }
+
+  queue(callback, object, key, value) {
+    this.lastObject = object;
+    this.lastKey = key;
+    this.lastValue = value;
+    return this.pending.push(callback);
+  }
+
+  invoke(callback) {
+    return callback(this.context.time.clock, this.context.time.step);
+  }
+
+  compute() {
+    if (this.bound.length) {
+      for (const cb of Array.from(this.bound)) {
+        this.invoke(cb);
+      }
+    }
+  }
+
+  digest() {
+    let calls;
+    if (!this.pending.length) {
+      return false;
+    }
+
+    [calls, this.pending] = Array.from([this.pending, []]);
+    for (const callback of Array.from(calls)) {
+      callback();
+    }
+
+    return true;
+  }
+
+  getTrait(name) {
+    return this.traits[name];
+  }
+
+  getLastTrigger() {
+    return `${this.lastObject.toString()} - ${this.lastKey}=\`${
+      this.lastValue
+    }\``;
+  }
+}
+
+const shallowCopy = function (x) {
+  const out = {};
+  for (const k in x) {
+    const v = x[k];
+    out[k] = v;
+  }
+  return out;
+};
+
+class Data {
+  constructor(object, config, _attributes) {
+    let key, ns, oldComputed, oldExpr, oldOrig, oldProps, spec;
+    let { props } = config;
+    const { traits, finals, freeform } = config;
+    const data = this;
+
+    // Save existing (original) values if re-applying
+    if (
+      object.props != null &&
+      object.expr != null &&
+      object.orig != null &&
+      object.computed != null &&
+      object.attributes != null
+    ) {
+      oldProps = shallowCopy(object.props);
+      oldExpr = shallowCopy(object.expr);
+      oldOrig = object.orig();
+      oldComputed = object.computed();
+
+      // Dispose of old attributes/bindings
+      if (object.attributes != null) {
+        object.attributes.dispose();
+      }
+    }
+
+    // Flattened and original values
+    const flattened = {};
+    const originals = {};
+
+    // Aliases
+    const mapTo = {};
+    const to = (name) => (mapTo[name] != null ? mapTo[name] : name);
+    const define = function (name, alias) {
+      if (mapTo[alias]) {
+        throw new Error(
+          `${object.toString()} - Duplicate property \`${alias}\``
+        );
+      }
+      return (mapTo[alias] = name);
+    };
+
+    // Get/set
+    const get = (key) =>
+      (data[key] != null ? data[key].value : undefined) != null
+        ? data[key] != null
+          ? data[key].value
+          : undefined
+        : __guard__(data[to(key)], (x) => x.value);
+    const set = function (key, value, ignore, initial) {
+      let attr;
+      key = to(key);
+
+      // Look for defined attribute
+      if ((attr = data[key]) == null) {
+        if (!freeform) {
+          throw new Error(
+            `${object.toString()} - Setting unknown property \`${key}={${value}}\``
+          );
+        }
+
+        // Define attribute on the fly (placeholder)
+        attr = data[key] = {
+          short: key,
+          type: null,
+          last: null,
+          value: null,
+        };
+        validators[key] = (v) => v;
+      }
+
+      if (!ignore) {
+        // See if prop isn't bound
+        if (_expr[key]) {
+          throw new Error(
+            `${object.toString()} - Can't set bound property \`${key}={${value}}\``
+          );
+        }
+
+        // See if prop isn't computed
+        if (_computed[key]) {
+          throw new Error(
+            `${object.toString()} - Can't set computed property \`${key}={${value}}\``
+          );
+        }
+
+        // See if prop isn't final
+        if (_finals[key]) {
+          throw new Error(
+            `${object.toString()} - Can't set final property \`${key}={${value}}\``
+          );
+        }
+      }
+
+      // Validate new value
+      let valid = true;
+      const validated = validate(key, value, attr.last, function () {
+        valid = false;
+        return null;
+      });
+
+      // Accept and insert into flattened/original list
+      if (valid) {
+        [attr.value, attr.last] = Array.from([validated, attr.value]);
+
+        // Remember in flattened dict
+        const { short } = attr;
+        flattened[short] = validated;
+        if (!ignore) {
+          originals[short] = value;
+        } // Remember original unvalidated value
+
+        // Compare to last value unless setting initial value
+        if (!initial && !equals(key, attr.value, attr.last)) {
+          change(key, value);
+        }
+      }
+
+      return valid;
+    };
+
+    const constant = function (key, value, initial) {
+      key = to(key);
+
+      set(key, value, true, initial);
+      return (_finals[key] = true);
+    };
+
+    // Prop/expression binding
+    const expr = {};
+
+    const _bound = {};
+    const _eval = {};
+    const _expr = {};
+    const _computed = {};
+    const _finals = {};
+
+    const bind = function (key, expression, computed) {
+      if (computed == null) {
+        computed = false;
+      }
+      key = to(key);
+
+      if (typeof expression !== "function") {
+        throw new Error(
+          `${object.toString()} - Expression \`${key}=>{${expr}}\` is not a function`
+        );
+      }
+      if (_expr[key]) {
+        throw new Error(
+          `${object.toString()} - Property \`${key}=>{${expr}}\` is already bound`
+        );
+      }
+      if (_computed[key]) {
+        throw new Error(
+          `${object.toString()} - Property \`${key}\` is computed`
+        );
+      }
+      if (_finals[key]) {
+        throw new Error(`${object.toString()} - Property \`${key}\` is final`);
+      }
+
+      const list = computed ? _computed : _expr;
+      list[key] = expression;
+
+      const short = data[key] != null ? data[key].short : key;
+      if (!computed) {
+        expr[short] = expression;
+      } // flattened
+      _eval[key] = expression;
+
+      expression = expression.bind(object);
+      _bound[key] = function (t, d) {
+        let clock;
+        if (
+          (clock = object.clock != null ? object.clock.getTime() : undefined)
+        ) {
+          t = clock.clock;
+          d = clock.step;
+        }
+
+        return object.set(key, expression(t, d), true);
+      };
+      return _attributes.bind(_bound[key]);
+    };
+
+    const unbind = function (key, computed) {
+      if (computed == null) {
+        computed = false;
+      }
+      key = to(key);
+
+      const list = computed ? _computed : _expr;
+      if (!list[key]) {
+        return;
+      }
+      _attributes.unbind(_bound[key]);
+      delete _bound[key];
+      delete list[key];
+
+      if (data[key] != null) {
+        key = data[key].short;
+      }
+      return delete expr[key];
+    };
+
+    const evaluate = function (key, time) {
+      let left;
+      key = to(key);
+      return (left =
+        typeof _eval[key] === "function" ? _eval[key](time, 0) : undefined) !=
+        null
+        ? left
+        : data[key].value;
+    };
+
+    // Public interface
+    object.expr = expr;
+    object.props = flattened;
+
+    object.evaluate = function (key, time) {
+      if (key != null) {
+        return evaluate(key, time);
+      } else {
+        const out = {};
+        for (key in props) {
+          out[key] = evaluate(key, time);
+        }
+        return out;
+      }
+    };
+
+    object.get = function (key) {
+      if (key != null) {
+        return get(key);
+      } else {
+        return flattened;
+      }
+    };
+
+    object.set = function (key, value, ignore, initial) {
+      if (typeof key === "string") {
+        set(key, value, ignore, initial);
+      } else {
+        initial = ignore;
+        ignore = value;
+        const options = key;
+        for (key in options) {
+          value = options[key];
+          set(key, value, ignore, initial);
+        }
+      }
+    };
+
+    object.bind = function (key, expr, computed) {
+      if (typeof key === "string") {
+        bind(key, expr, computed);
+      } else {
+        computed = expr;
+        const binds = key;
+        for (key in binds) {
+          expr = binds[key];
+          bind(key, expr, computed);
+        }
+      }
+    };
+
+    object.unbind = function (key, computed) {
+      if (typeof key === "string") {
+        unbind(key, computed);
+      } else {
+        computed = expr;
+        const binds = key;
+        for (key in binds) {
+          unbind(key, computed);
+        }
+      }
+    };
+
+    object.attribute = function (key) {
+      if (key != null) {
+        return data[to(key)];
+      } else {
+        return data;
+      }
+    };
+    object.orig = function (key) {
+      if (key != null) {
+        return originals[to(key)];
+      } else {
+        return shallowCopy(originals);
+      }
+    };
+    object.computed = function (key) {
+      if (key != null) {
+        return _computed[to(key)];
+      } else {
+        return shallowCopy(_computed);
+      }
+    };
+
+    // Validate value for key
+    const makers = {};
+    const validators = {};
+    const equalors = {};
+
+    const equals = (key, value, target) => equalors[key](value, target);
+    const validate = (key, value, target, invalid) =>
+      validators[key](value, target, invalid);
+
+    object.validate = function (key, value) {
+      let target;
+      key = to(key);
+      const make = makers[key];
+      if (make != null) {
+        target = make();
+      }
+      return (target = validate(key, value, target, function () {
+        throw new Error(
+          `${object.toString()} - Invalid value \`${key}={${value}}\``
+        );
+      }));
+    };
+
+    // Accumulate changes
+    let dirty = false;
+    let changes = {};
+    let touches = {};
+    let changed = {};
+    let touched = {};
+    const getNS = (key) => key.split(".")[0];
+    const change = function (key, value) {
+      if (!dirty) {
+        dirty = true;
+        _attributes.queue(digest, object, key, value);
+      }
+
+      const trait = getNS(key);
+
+      // Log change
+      changes[key] = true;
+
+      // Mark trait/namespace as dirty
+      return (touches[trait] = true);
+    };
+
+    const event = {
+      type: "change",
+      changed: null,
+      touched: null,
+    };
+
+    // Notify listeners of accumulated changes
+    const digest = function () {
+      // Swap double buffered changes objects
+      let k;
+      event.changed = changes;
+      event.touched = touches;
+      changes = changed;
+      touches = touched;
+      ({ changed } = event);
+      ({ touched } = event);
+
+      // Reset all dirty flags
+      dirty = false;
+      for (k in changes) {
+        changes[k] = false;
+      }
+      for (k in touches) {
+        touches[k] = false;
+      }
+
+      event.type = "change";
+      object.trigger(event);
+
+      return (() => {
+        const result = [];
+        for (const trait in event.touched) {
+          event.type = `change:${trait}`;
+          result.push(object.trigger(event));
+        }
+        return result;
+      })();
+    };
+
+    // Convert name.trait.key into keyName
+    const shorthand = function (name) {
+      const parts = name.split(/\./g);
+      const suffix = parts.pop();
+      parts.pop(); // Discard
+      parts.unshift(suffix);
+      return parts.reduce(
+        (a, b) => a + b.charAt(0).toUpperCase() + b.substring(1)
+      );
+    };
+
+    // Define attributes for given trait spec by namespace
+    const addSpec = (name, spec) =>
+      (() => {
+        const result = [];
+        for (let key in spec) {
+          let value;
+          const type = spec[key];
+          key = [name, key].join(".");
+          const short = shorthand(key);
+
+          // Make attribute object
+          data[key] = {
+            T: type,
+            ns: name,
+            short,
+            enum: typeof type.enum === "function" ? type.enum() : undefined,
+            type:
+              typeof type.uniform === "function" ? type.uniform() : undefined,
+            last: type.make(),
+            value: (value = type.make()),
+          };
+
+          // Define flat namespace alias
+          define(key, short);
+          flattened[short] = value;
+
+          // Collect makers, validators and comparators
+          makers[key] = type.make;
+          validators[key] = type.validate != null ? type.validate : (a) => a;
+          result.push(
+            (equalors[key] =
+              type.equals != null ? type.equals : (a, b) => a === b)
+          );
+        }
+        return result;
+      })();
+
+    // Add in traits
+    const list = [];
+    for (let trait of Array.from(traits)) {
+      [trait, ns] = Array.from(trait.split(":"));
+      const name = ns ? [ns, trait].join(".") : trait;
+      spec = _attributes.getTrait(trait);
+      list.push(trait);
+
+      if (spec != null) {
+        addSpec(name, spec);
+      }
+    }
+
+    // Add custom props by namespace
+    if (props != null) {
+      for (ns in props) {
+        spec = props[ns];
+        addSpec(ns, spec);
+      }
+    }
+
+    // Store array of traits
+    const unique = list.filter((object, i) => list.indexOf(object) === i);
+    object.traits = unique;
+
+    // Set previous internal values
+    if (oldProps != null) {
+      object.set(oldProps, true, true);
+    }
+
+    // Set final props
+    if (finals != null) {
+      for (key in finals) {
+        const value = finals[key];
+        constant(key, value, true);
+      }
+    }
+
+    // Set previous external values
+    if (oldOrig != null) {
+      object.set(oldOrig, false, true);
+    }
+
+    // Bind previous computed props/expressions
+    if (oldComputed != null) {
+      object.bind(oldComputed, true);
+    }
+    if (oldExpr != null) {
+      object.bind(oldExpr, false);
+    }
+
+    // Destructor
+    this.dispose = function () {
+      for (key in _computed) {
+        unbind(key, true);
+      }
+      for (key in _expr) {
+        unbind(key, false);
+      }
+      props = {};
+      delete object.attributes;
+      delete object.get;
+      return delete object.set;
+    };
+
+    null;
+  }
+}
+
+function __guard__(value, transform) {
+  return typeof value !== "undefined" && value !== null
+    ? transform(value)
+    : undefined;
+}
+
+;// CONCATENATED MODULE: ./src/util/pretty.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS205: Consider reworking code to avoid use of IIFEs
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+const NUMBER_PRECISION = 5;
+const NUMBER_THRESHOLD = 0.0001;
+
+const checkFactor = (v, f) =>
+  Math.abs(v / f - Math.round(v / f)) < NUMBER_THRESHOLD;
+const checkUnit = (v) => checkFactor(v, 1);
+
+const formatMultiple = function (v, f, k, compact) {
+  const d = Math.round(v / f);
+  if (d === 1) {
+    return `${k}`;
+  }
+  if (d === -1) {
+    return `-${k}`;
+  }
+  if (k === "1") {
+    return `${d}`;
+  }
+  if (compact) {
+    return `${d}${k}`;
+  } else {
+    return `${d}*${k}`;
+  }
+};
+
+const formatFraction = function (v, f, k, compact) {
+  let d = Math.round(v * f);
+  if (Math.abs(d) === 1) {
+    d = d < 0 ? "-" : "";
+    d += k;
+  } else if (k !== "1") {
+    d += compact ? `${k}` : `*${k}`;
+  }
+
+  return `${d}/${f}`;
+};
+
+const formatFactors = [
+  { 1: 1 },
+  { 1: 1, Ï„: Math.PI * 2 },
+  { 1: 1, π: Math.PI },
+  { 1: 1, τ: Math.PI * 2, π: Math.PI },
+  { 1: 1, e: Math.E },
+  { 1: 1, Ï„: Math.PI * 2, e: Math.E },
+  { 1: 1, π: Math.PI, e: Math.E },
+  { 1: 1, τ: Math.PI * 2, π: Math.PI, e: Math.E },
+];
+const formatPrimes = [
+  // denominators 1-30 + interesting multiples
+  [2 * 2 * 3 * 5 * 7, [2, 3, 5, 7]], // 1-7
+  [2 * 2 * 2 * 3 * 3 * 5 * 5 * 7 * 7, [2, 3, 5, 7]], // 8-11
+  [2 * 2 * 3 * 5 * 7 * 11 * 13, [2, 3, 5, 7, 11, 13]], // 12-16
+  [2 * 2 * 17 * 19 * 23 * 29, [2, 17, 19, 23, 29]], // 17-30
+  [256 * 256, [2]], // Powers of 2
+  [1000000, [2, 5]], // Powers of 10
+];
+
+const prettyNumber = function (options) {
+  let cache, compact, e, pi, tau;
+  if (options) {
+    ({ cache, compact, tau, pi, e } = options);
+  }
+
+  compact = +!!(compact != null ? compact : true);
+  tau = +!!(tau != null ? tau : true);
+  pi = +!!(pi != null ? pi : true);
+  e = +!!(e != null ? e : true);
+  cache = +!!(cache != null ? cache : true);
+
+  const formatIndex = tau + pi * 2 + e * 4;
+
+  const numberCache = cache ? {} : null;
+
+  return function (v) {
+    if (numberCache != null) {
+      let cached;
+      if ((cached = numberCache[v]) != null) {
+        return cached;
+      }
+      if (v === Math.round(v)) {
+        return (numberCache[v] = `${v}`);
+      }
+    }
+
+    let out = `${v}`;
+    let best = out.length + out.indexOf(".") + 2;
+    const match = function (x) {
+      const d = x.length;
+      if (d <= best) {
+        out = `${x}`;
+        return (best = d);
+      }
+    };
+
+    for (const k in formatFactors[formatIndex]) {
+      const f = formatFactors[formatIndex][k];
+      if (checkUnit(v / f)) {
+        match(`${formatMultiple(v / f, 1, k, compact)}`);
+      } else {
+        // eslint-disable-next-line prefer-const
+        for (let [denom, list] of Array.from(formatPrimes)) {
+          let numer = (v / f) * denom;
+          if (checkUnit(numer)) {
+            for (const p of Array.from(list)) {
+              let d, n;
+              while (checkUnit((n = numer / p)) && checkUnit((d = denom / p))) {
+                numer = n;
+                denom = d;
+              }
+            }
+
+            match(`${formatFraction(v / f, denom, k, compact)}`);
+            break;
+          }
+        }
+      }
+    }
+
+    if (`${v}`.length > NUMBER_PRECISION) {
+      match(`${v.toPrecision(NUMBER_PRECISION)}`);
+    }
+
+    if (numberCache != null) {
+      numberCache[v] = out;
+    }
+
+    return out;
+  };
+};
+
+const prettyPrint = function (markup, level) {
+  if (level == null) {
+    level = "info";
+  }
+  markup = prettyMarkup(markup);
+  return console[level].apply(console, markup);
+};
+
+const prettyMarkup = function (markup) {
+  // quick n dirty
+
+  const tag = "color:rgb(128,0,128)";
+  const attr = "color:rgb(144,64,0)";
+  const str = "color:rgb(0,0,192)";
+  const obj = "color:rgb(0,70,156)";
+  const txt = "color:inherit";
+
+  let quoted = false;
+  let nested = 0;
+
+  const args = [];
+  markup = markup.replace(
+    /(\\[<={}> "'])|(=>|[<={}> "'])/g,
+    function (_, escape, char) {
+      if (escape != null ? escape.length : undefined) {
+        return escape;
+      }
+      if (quoted && !['"', "'"].includes(char)) {
+        return char;
+      }
+      if (nested && !['"', "'", "{", "}"].includes(char)) {
+        return char;
+      }
+
+      return (() => {
+        switch (char) {
+          case "<":
+            args.push(tag);
+            return "%c<";
+          case ">":
+            args.push(tag);
+            args.push(txt);
+            return "%c>%c";
+          case " ":
+            args.push(attr);
+            return " %c";
+          case "=":
+          case "=>":
+            args.push(tag);
+            return `%c${char}`;
+          case '"':
+          case "'":
+            quoted = !quoted;
+            if (quoted) {
+              args.push(nested ? attr : str);
+              return `${char}%c`;
+            } else {
+              args.push(nested ? obj : tag);
+              return `%c${char}`;
+            }
+          case "{":
+            if (nested++ === 0) {
+              args.push(obj);
+              return `%c${char}`;
+            } else {
+              return char;
+            }
+          case "}":
+            if (--nested === 0) {
+              args.push(tag);
+              return `${char}%c`;
+            } else {
+              return char;
+            }
+          default:
+            return char;
+        }
+      })();
+    }
+  );
+
+  return [markup].concat(args);
+};
+
+const prettyJSXProp = (k, v) => prettyJSXPair(k, v, "=");
+const prettyJSXBind = (k, v) => prettyJSXPair(k, v, "=>");
+
+const prettyJSXPair = (function () {
+  const formatNumber = prettyNumber({ compact: false });
+
+  return function (k, v, op) {
+    const key = function (k) {
+      if (k === "" + +k || k.match(/^[A-Za-z_][A-Za-z0-9]*$/)) {
+        return k;
+      } else {
+        return JSON.stringify(k);
+      }
+    };
+    const wrap = function (v) {
+      if (v.match('\n*"')) {
+        return v;
+      } else {
+        return `{${v}}`;
+      }
+    };
+    const value = function (v) {
+      if (v instanceof Array) {
+        return `[${v.map(value).join(", ")}]`;
+      }
+
+      switch (typeof v) {
+        case "string":
+          if (v.match("\n")) {
+            return `"\n${v}"\n`;
+          } else {
+            return `"${v}"`;
+          }
+        case "function":
+          v = `${v}`;
+          if (v.match("\n")) {
+            `\n${v}\n`;
+          } else {
+            `${v}`;
+          }
+          v = v.replace(/^function (\([^)]+\))/, "$1 =>");
+          return (v = v.replace(
+            /^(\([^)]+\)) =>\s*{\s*return\s*([^}]+)\s*;\s*}/,
+            "$1 => $2"
+          ));
+        case "number":
+          return formatNumber(v);
+        default:
+          if (v != null && v !== !!v) {
+            if (v._up != null) {
+              return value(v.map((v) => v));
+            }
+            if (v.toMarkup) {
+              return v.toString();
+            } else {
+              return (
+                "{" +
+                (() => {
+                  const result = [];
+                  for (const kk in v) {
+                    const vv = v[kk];
+                    if (Object.prototype.hasOwnProperty.call(v, kk)) {
+                      result.push(`${key(kk)}: ${value(vv)}`);
+                    }
+                  }
+                  return result;
+                })().join(", ") +
+                "}"
+              );
+            }
+          } else {
+            return `${JSON.stringify(v)}`;
+          }
+      }
+    };
+
+    return [k, op, wrap(value(v))].join("");
+  };
+})();
+
+const escapeHTML = function (str) {
+  str = str.replace(/&/g, "&amp;");
+  str = str.replace(/</g, "&lt;");
+  return (str = str.replace(/"/g, "&quot;"));
+};
+
+const prettyFormat = function (str) {
+  const args = [].slice.call(arguments);
+  args.shift();
+
+  let out = "<span>";
+
+  str = escapeHTML(str);
+
+  // eslint-disable-next-line no-unused-vars
+  for (const _arg of Array.from(args)) {
+    str = str.replace(/%([a-z])/, function (_, f) {
+      const v = args.shift();
+      switch (f) {
+        case "c":
+          return `</span><span style="${escapeHTML(v)}">`;
+        default:
+          return escapeHTML(v);
+      }
+    });
+  }
+
+  out += str;
+  return (out += "</span>");
+};
+
+const JSX = { prop: prettyJSXProp, bind: prettyJSXBind };
+
+
+
+/*
+for x in [1, 2, 1/2, 3, 1/3, Math.PI, Math.PI / 2, Math.PI * 2, Math.PI * 3, Math.PI * 4, Math.PI * 3 / 4, Math.E * 100, Math.E / 100]
+  console.log prettyNumber({})(x)
+*/
+
+;// CONCATENATED MODULE: ./src/model/node.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS104: Avoid inline assignments
+ * DS205: Consider reworking code to avoid use of IIFEs
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+let nodeIndex = 0;
+
+class node_Node {
+  constructor(type, defaults, options, binds, config, attributes) {
+    this.type = type;
+    this._id = (++nodeIndex).toString();
+
+    this.configure(config, attributes);
+    this.parent = this.root = this.path = this.index = null;
+
+    this.set(defaults, true, true);
+    this.set(options, false, true);
+    this.bind(binds, false);
+  }
+
+  configure(config, attributes) {
+    let { traits, props, finals, freeform } = config;
+    if (traits == null) {
+      traits =
+        (this._config != null ? this._config.traits : undefined) != null
+          ? this._config != null
+            ? this._config.traits
+            : undefined
+          : [];
+    }
+    if (props == null) {
+      props =
+        (this._config != null ? this._config.props : undefined) != null
+          ? this._config != null
+            ? this._config.props
+            : undefined
+          : {};
+    }
+    if (finals == null) {
+      finals =
+        (this._config != null ? this._config.finals : undefined) != null
+          ? this._config != null
+            ? this._config.finals
+            : undefined
+          : {};
+    }
+    if (freeform == null) {
+      freeform =
+        (this._config != null ? this._config.freeform : undefined) != null
+          ? this._config != null
+            ? this._config.freeform
+            : undefined
+          : false;
+    }
+
+    this._config = { traits, props, finals, freeform };
+    return (this.attributes = attributes.apply(this, this._config));
+  }
+
+  dispose() {
+    this.attributes.dispose();
+    return (this.attributes = null);
+  }
+
+  // Add/removal callback
+  _added(parent) {
+    this.parent = parent;
+    this.root = parent.root;
+
+    // Notify root listeners of child addition
+    const event = {
+      type: "add",
+      node: this,
+      parent: this.parent,
+    };
+    if (this.root) {
+      this.root.trigger(event);
+    }
+
+    // Notify self listeners of own addition
+    event.type = "added";
+    return this.trigger(event);
+  }
+
+  _removed() {
+    // Notify root listeners of child removal
+    const event = {
+      type: "remove",
+      node: this,
+    };
+    if (this.root) {
+      this.root.trigger(event);
+    }
+
+    // Notify self listeners of own removal
+    event.type = "removed";
+    this.trigger(event);
+
+    return (this.root = this.parent = null);
+  }
+
+  // Assign unique indices to nodes to make paths
+  _index(index, parent) {
+    let path;
+    if (parent == null) {
+      ({ parent } = this);
+    }
+    this.index = index;
+    this.path = path =
+      index != null
+        ? ((parent != null ? parent.path : undefined) != null
+            ? parent != null
+              ? parent.path
+              : undefined
+            : []
+          ).concat([index])
+        : null;
+    this.order = path != null ? this._encode(path) : Infinity;
+    if (this.root != null) {
+      return this.trigger({ type: "reindex" });
+    }
+  }
+
+  // Asymptotic arithmetic encoding
+  // Computes invariant node order from path of indices
+  // Goes from 1 at the root [0] of the tree, to 0 at [∞] (best for FP precision).
+  // Divides the interval into countably infinite many intervals, nested recursively.
+  //
+  // (loses precision eventually, it's used cos three.js needs a single numerical order)
+  _encode(path) {
+    // Tune precision between deep and narrow (1) vs shallow and wide (n)
+    const k = 3;
+
+    const map = (x) => k / (x + k);
+    const lerp = (t) => b + (a - b) * t;
+
+    let a = 1 + 1 / k;
+    let b = 0;
+    for (const index of Array.from(path)) {
+      const f = map(index + 1);
+      const g = map(index + 2);
+      [a, b] = Array.from([lerp(f), lerp(g)]);
+    }
+    return a;
+  }
+
+  toString() {
+    const _id = this.id != null ? this.id : this._id;
+
+    const tag = this.type != null ? this.type : "node";
+    let id = tag;
+    id += `#${_id}`;
+    if (this.classes != null ? this.classes.length : undefined) {
+      id += `.${this.classes.join(".")}`;
+    }
+
+    if (this.children != null) {
+      let count;
+      if ((count = this.children.length)) {
+        return `<${id}>…(${count})…</${tag}>`;
+      } else {
+        return `<${id}></${tag}>`;
+      }
+    } else {
+      return `<${id} />`;
+    }
+  }
+
+  toMarkup(selector = null, indent) {
+    let k, v;
+    if (indent == null) {
+      indent = "";
+    }
+    if (selector && typeof selector !== "function") {
+      let left;
+      selector =
+        (left =
+          this.root != null ? this.root.model._matcher(selector) : undefined) !=
+        null
+          ? left
+          : () => true;
+    }
+
+    const tag = this.type != null ? this.type : "node";
+    let { expr } = this;
+
+    // Ensure generated ID goes first
+    const orig = { id: this._id };
+    const object = typeof this.orig === "function" ? this.orig() : undefined;
+    for (k in object) {
+      v = object[k];
+      orig[k] = v;
+    }
+
+    const props = (() => {
+      const result = [];
+      for (k in orig) {
+        v = orig[k];
+        if (!this.expr[k]) {
+          result.push(JSX.prop(k, v));
+        }
+      }
+      return result;
+    })();
+    expr = (() => {
+      const result1 = [];
+      for (k in expr) {
+        v = expr[k];
+        result1.push(JSX.bind(k, v));
+      }
+      return result1;
+    })();
+
+    let attr = [""];
+    if (props.length) {
+      attr = attr.concat(props);
+    }
+    if (expr.length) {
+      attr = attr.concat(expr);
+    }
+    attr = attr.join(" ");
+
+    let child = indent;
+    const recurse = () => {
+      if (!(this.children != null ? this.children.length : undefined)) {
+        return "";
+      }
+      return this.children
+        .map((x) => x.toMarkup(selector, child))
+        .filter((x) => x != null && x.length)
+        .join("\n");
+    };
+
+    if (selector && !selector(this)) {
+      return recurse();
+    }
+
+    if (this.children != null) {
+      const open = `<${tag}${attr}>`;
+      const close = `</${tag}>`;
+
+      child = indent + "  ";
+      let children = recurse();
+      if (children.length) {
+        children = "\n" + children + "\n" + indent;
+      }
+      if (children == null) {
+        children = "";
+      }
+
+      return indent + open + children + close;
+    } else {
+      return `${indent}<${tag}${attr} />`;
+    }
+  }
+
+  print(selector, level) {
+    return prettyPrint(this.toMarkup(selector), level);
+  }
+}
+
+Binder.apply(node_Node.prototype);
+
+;// CONCATENATED MODULE: ./src/model/group.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+class group_Group extends node_Node {
+  constructor(type, defaults, options, binds, config, attributes) {
+    super(type, defaults, options, binds, config, attributes);
+
+    this.children = [];
+    this.on("reindex", (event) =>
+      Array.from(this.children).map((child) => child.trigger(event))
+    );
+  }
+
+  add(node) {
+    if (node.parent != null) {
+      node.parent.remove(node);
+    }
+
+    node._index(this.children.length, this);
+    this.children.push(node);
+    return node._added(this);
+  }
+
+  remove(node) {
+    if (node.children != null ? node.children.length : undefined) {
+      node.empty();
+    }
+
+    const index = this.children.indexOf(node);
+    if (index === -1) {
+      return;
+    }
+
+    this.children.splice(index, 1);
+    node._index(null);
+    node._removed(this);
+
+    for (let i = 0; i < this.children.length; i++) {
+      node = this.children[i];
+      if (i >= index) {
+        node._index(i);
+      }
+    }
+  }
+
+  empty() {
+    const children = this.children.slice().reverse();
+    for (const node of Array.from(children)) {
+      this.remove(node);
+    }
+  }
+}
+
+;// CONCATENATED MODULE: ./src/model/guard.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+class Guard {
+  constructor(limit) {
+    if (limit == null) {
+      limit = 10;
+    }
+    this.limit = limit;
+  }
+  iterate(options) {
+    const { step, last } = options;
+
+    let { limit } = this;
+    while (step()) {
+      if (!--limit) {
+        console.warn(
+          "Last iteration",
+          typeof last === "function" ? last() : undefined
+        );
+        throw new Error("Exceeded iteration limit.");
+      }
+    }
+    return null;
+  }
+}
+
+// EXTERNAL MODULE: ./node_modules/css-select/lib/index.js
+var lib = __webpack_require__(5366);
+;// CONCATENATED MODULE: ./src/model/css-select-adapter.js
+/**
+ * This file contains an *adapter* for css-select. css-select is a CSS selection
+ * engine for HTML that can be used with other data structures (XML, etc) via
+ * adapters. Here we define an adapter for MathBox's vdom.
+ *
+ * The adapter interface is described here:
+ *    https://github.com/fb55/css-select/blob/1aa44bdd64aaf2ebdfd7f338e2e76bed36521957/src/types.ts#L6-L96
+ *
+ * Nodes vs Elements:
+ * In general, CSS Selectors act on a document tree built from nodes, which can
+ * include element nodes and non-element nodes. For example, in HTML, tags are
+ * element nodes but lines of text are non-element node. Non-element text nodes
+ * can influence css selection, e.g., via :first-line pseudoclass, but these
+ * non-element nodes are never returned by selectors.
+ *
+ * Mathbox only has element nodes.
+ */
+
+/**
+ * Is this node an element node? Yes. Mathbox only has element nodes.
+ */
+function isTag(_elem) {
+  return true;
+}
+
+function getChildren(elem) {
+  return elem.children || [];
+}
+
+function getParent(elem) {
+  return elem.parent;
+}
+
+/**
+ * Takes an array of nodes, and removes any duplicates, as well as any
+ * nodes whose ancestors are also in the array.
+ */
+function removeSubsets(nodes) {
+  const deduped = new Set(nodes);
+
+  deduped.forEach((node) => {
+    let ancestor = node.parent;
+    while (ancestor) {
+      if (deduped.has(ancestor)) {
+        deduped.delete(node);
+        return;
+      }
+      ancestor = ancestor.parent;
+    }
+  });
+
+  return Array.from(deduped);
+}
+
+const adapter = {
+  isTag,
+  /**
+   * Does at least one of passed element nodes pass the test predicate?
+   */
+  existsOne(test, elems) {
+    return elems.some((elem) =>
+      isTag(elem)
+        ? test(elem) || adapter.existsOne(test, getChildren(elem))
+        : false
+    );
+  },
+  /**
+   * Get the siblings of the node. Note that unlike jQuery's `siblings` method,
+   * this is expected to include the current node as well
+   */
+  getSiblings(elem) {
+    const parent = getParent(elem);
+    return parent ? getChildren(parent) : [elem];
+  },
+  getChildren,
+  getParent,
+  getAttributeValue(elem, name) {
+    if (name === "class") return elem.props.classes.join(" ");
+    if (name === "id") return elem.id;
+    return "";
+  },
+  hasAttrib(elem, name) {
+    if (name === "id") return !!elem.id;
+    if (name === "class") return elem.props.classes.length > 0;
+    if (!elem.traits.hash) return false;
+    return Object.prototype.hasOwnProperty.call(elem.traits.hash, name);
+  },
+  removeSubsets,
+  getName(elem) {
+    return elem.type ?? "";
+  },
+  /**
+   * Finds the first node in the array that matches the test predicate, or one
+   * of its children.
+   */
+  findOne: function findOne(test, elems) {
+    for (const node of elems) {
+      if (test(node)) {
+        return node;
+      } else {
+        const match = findOne(test, getChildren(node));
+        if (match) return match;
+      }
+    }
+
+    return null;
+  },
+  findAll: function findAll(test, elems) {
+    const result = [];
+    for (const elem of elems) {
+      if (!isTag(elem)) continue;
+      if (test(elem)) {
+        result.push(elem);
+      }
+      result.push(...findAll(test, getChildren(elem)));
+    }
+    return result;
+  },
+  getText: function getText(_elem) {
+    return "";
+  },
+};
+
+/* harmony default export */ const css_select_adapter = (adapter);
+
+;// CONCATENATED MODULE: ./src/model/css-select-adapted.js
+
+
+
+/**
+ * Returns a filtered array of elements which are contained in context.
+ */
+const filter = (nodes, context) => {
+  const out = [];
+  const contextNodes = Array.isArray(context) ? context : [context];
+  const contextSet = new Set(contextNodes);
+  for (const node of Array.from(nodes)) {
+    let ancestor = node;
+    while (ancestor != null) {
+      if (contextSet.has(ancestor)) {
+        out.push(node);
+        break;
+      }
+      ancestor = css_select_adapter.getParent(ancestor);
+    }
+  }
+  return out;
+};
+
+const getRoot = (element) => {
+  let ancestor = element;
+  while (css_select_adapter.getParent(ancestor) !== null) {
+    ancestor = css_select_adapter.getParent(ancestor);
+  }
+  return ancestor;
+};
+
+/**
+ * Finds elements in the given context matching the given css-selector.
+ *
+ * Does NOT throw if css query is invalid.
+ *
+ * @param {string} query A css selector
+ * @param {*} context Element or array of elements
+ * @returns All elements in context matching query
+ */
+const selectAll = (query, context) => {
+  try {
+    /**
+     * Try/catch to tolerate invalid css queries.
+     * See https://gitgud.io/unconed/mathbox/-/issues/23
+     */
+    lib.compile(query);
+  } catch (err) {
+    return [];
+  }
+
+  /**
+   * Delegate to css-select, except always make queries relative to root and
+   * filter matches outside of context ourselves. css-select does not currently
+   * handle contextualized queries relative to root correctly.
+   *
+   * See https://github.com/fb55/css-select/issues/709
+   */
+
+  const isArray = Array.isArray(context);
+  if (isArray && context.length === 0) return [];
+  const root = getRoot(isArray ? context[0] : context);
+  const matches = lib.selectAll(query, root, { adapter: css_select_adapter });
+  if (context) return filter(matches, context);
+  return matches;
+};
+
+const compile = (query) => {
+  try {
+    /**
+     * Try/catch to tolerate invalid css queries.
+     * See https://gitgud.io/unconed/mathbox/-/issues/23
+     */
+    return lib.compile(query, { adapter: css_select_adapter });
+  } catch (err) {
+    return () => false;
+  }
+};
+
+;// CONCATENATED MODULE: ./src/model/model.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS104: Avoid inline assignments
+ * DS205: Consider reworking code to avoid use of IIFEs
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+const AUTO = /^<([0-9]+|<*)$/;
+
+/*
+  Model that wraps a root node and its children.
+
+  Monitors adds, removals and ID/class changes.
+  Enables CSS selectors, both querying and watching.
+
+  Watchers are primed differentially as changes come in,
+  and fired with digest().
+*/
+class Model {
+  constructor(root) {
+    this.root = root;
+    this.root.model = this;
+    this.root.root = this.root;
+
+    this.ids = {};
+    this.classes = {};
+    this.traits = {};
+    this.types = {};
+    this.nodes = [];
+    this.watchers = [];
+    this.fire = false;
+
+    this.lastNode = null;
+
+    this.event = { type: "update" };
+
+    // Triggered by child addition/removal
+    const add = (event) => adopt(event.node);
+    const remove = (event) => dispose(event.node);
+
+    this.root.on("add", add);
+    this.root.on("remove", remove);
+
+    // Track node lifecycle
+    const adopt = (node) => {
+      addNode(node);
+      addType(node);
+      addTraits(node);
+
+      node.on("change:node", update);
+      update(null, node, true);
+      return force(node);
+    };
+
+    const dispose = (node) => {
+      removeNode(node);
+      removeType(node);
+      removeTraits(node);
+      removeID(node.id, node);
+      removeClasses(node.classes, node);
+
+      node.off("change:node", update);
+      return force(node);
+    };
+
+    // Watcher cycle for catching changes in id/classes
+    const prime = (node) => {
+      for (const watcher of Array.from(this.watchers)) {
+        watcher.match = watcher.matcher(node);
+      }
+      return null;
+    };
+
+    const check = (node) => {
+      for (const watcher of Array.from(this.watchers)) {
+        const fire =
+          watcher.fire ||
+          (watcher.fire = watcher.match !== watcher.matcher(node));
+        if (fire) {
+          this.lastNode = node;
+        }
+        if (!this.fire) {
+          this.fire = fire;
+        }
+      }
+      return null;
+    };
+
+    const force = (node) => {
+      for (const watcher of Array.from(this.watchers)) {
+        const fire = watcher.fire || (watcher.fire = watcher.matcher(node));
+        if (fire) {
+          this.lastNode = node;
+        }
+        if (!this.fire) {
+          this.fire = fire;
+        }
+      }
+      return null;
+    };
+
+    this.digest = () => {
+      if (!this.fire) {
+        return false;
+      }
+      for (const watcher of Array.from(this.watchers.slice())) {
+        if (watcher.fire) {
+          watcher.fire = false;
+          watcher.handler();
+        }
+      }
+      this.fire = false;
+      return true;
+    };
+
+    // Track id/class changes
+    const update = (event, node, init) => {
+      const _id = init || event.changed["node.id"];
+      const _klass = init || event.changed["node.classes"];
+      let primed = false;
+
+      if (_id) {
+        const id = node.get("node.id");
+        if (id !== node.id) {
+          if (!init) {
+            prime(node);
+          }
+          primed = true;
+
+          if (node.id != null) {
+            removeID(node.id, node);
+          }
+          addID(id, node);
+        }
+      }
+
+      if (_klass) {
+        let left;
+        let classes = (left = node.get("node.classes")) != null ? left : [];
+        const klass = classes.join(",");
+        if (klass !== (node.classes != null ? node.classes.klass : undefined)) {
+          classes = classes.slice();
+
+          if (!init && !primed) {
+            prime(node);
+          }
+          primed = true;
+
+          if (node.classes != null) {
+            removeClasses(node.classes, node);
+          }
+          addClasses(classes, node);
+
+          node.classes = classes;
+          node.classes.klass = klass;
+        }
+      }
+
+      if (!init && primed) {
+        check(node);
+      }
+      return null;
+    };
+
+    // Manage lookup tables for types/classes/traits
+    const addTags = function (sets, tags, node) {
+      if (tags == null) {
+        return;
+      }
+      for (const k of Array.from(tags)) {
+        const list = sets[k] != null ? sets[k] : [];
+        list.push(node);
+        sets[k] = list;
+      }
+      return null;
+    };
+
+    const removeTags = function (sets, tags, node) {
+      if (tags == null) {
+        return;
+      }
+      for (const k of Array.from(tags)) {
+        const list = sets[k];
+        const index = list.indexOf(node);
+        if (index >= 0) {
+          list.splice(index, 1);
+        }
+        if (list.length === 0) {
+          delete sets[k];
+        }
+      }
+      return null;
+    };
+
+    // Build a hash for an array of tags for quick lookups
+    const hashTags = function (array) {
+      if (!(array.length > 0)) {
+        return;
+      }
+      const hash = (array.hash = {});
+      return Array.from(array).map((klass) => (hash[klass] = true));
+    };
+
+    const unhashTags = (array) => delete array.hash;
+
+    // Track IDs (live)
+    const addID = (id, node) => {
+      if (this.ids[id]) {
+        throw new Error(`Duplicate node id \`${id}\``);
+      }
+
+      if (id != null) {
+        this.ids[id] = [node];
+      }
+      return (node.id = id != null ? id : node._id);
+    };
+
+    const removeID = (id, node) => {
+      if (id != null) {
+        delete this.ids[id];
+      }
+      return (node.id = node._id);
+    };
+
+    // Track classes (live)
+    const addClasses = (classes, node) => {
+      addTags(this.classes, classes, node);
+      if (classes != null) {
+        return hashTags(classes);
+      }
+    };
+
+    const removeClasses = (classes, node) => {
+      removeTags(this.classes, classes, node);
+      if (classes != null) {
+        return unhashTags(classes);
+      }
+    };
+
+    // Track nodes
+    const addNode = (node) => this.nodes.push(node);
+    const removeNode = (node) => this.nodes.splice(this.nodes.indexOf(node), 1);
+
+    // Track nodes by type
+    const addType = (node) => addTags(this.types, [node.type], node);
+    const removeType = (node) => removeTags(this.types, [node.type], node);
+
+    // Track nodes by trait
+    const addTraits = (node) => {
+      addTags(this.traits, node.traits, node);
+      return hashTags(node.traits);
+    };
+
+    const removeTraits = (node) => {
+      removeTags(this.traits, node.traits, node);
+      return unhashTags(node.traits);
+    };
+
+    adopt(this.root);
+    this.root.trigger({ type: "added" });
+  }
+
+  select(query, context) {
+    return selectAll(query, context || this.getRoot());
+  }
+
+  // Watch selector with handler
+  watch(selector, handler) {
+    let watcher;
+    handler.unwatch = () => this.unwatch(handler);
+    handler.watcher = watcher = {
+      selector,
+      handler,
+      matcher: this._matcher(selector),
+      match: false,
+      fire: false,
+    };
+    this.watchers.push(watcher);
+    return this.select(selector);
+  }
+
+  // Unwatch a handler
+  unwatch(handler) {
+    const { watcher } = handler;
+    if (watcher == null) {
+      return;
+    }
+
+    this.watchers.splice(this.watchers.indexOf(watcher), 1);
+    delete handler.unwatch;
+    return delete handler.watcher;
+  }
+
+  // Make a matcher for a single selector
+  _matcher(query) {
+    if (AUTO.test(query)) {
+      throw new Error("Auto-link matcher unsupported");
+    }
+    return compile(query);
+  }
+
+  getRoot() {
+    return this.root;
+  }
+
+  getLastTrigger() {
+    return this.lastNode.toString();
+  }
+}
+
+;// CONCATENATED MODULE: ./src/model/index.js
+
+
+
+
+
+
+;// CONCATENATED MODULE: ./src/overlay/factory.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+class OverlayFactory {
+  constructor(classes, canvas) {
+    this.classes = classes;
+    this.canvas = canvas;
+    const div = document.createElement("div");
+    div.classList.add("mathbox-overlays");
+    this.div = div;
+  }
+
+  inject() {
+    const element = this.canvas.parentNode;
+    if (!element) {
+      throw new Error("Canvas not inserted into document.");
+    }
+    return element.insertBefore(this.div, this.canvas);
+  }
+
+  unject() {
+    const element = this.div.parentNode;
+    return element.removeChild(this.div);
+  }
+
+  getTypes() {
+    return Object.keys(this.classes);
+  }
+
+  make(type, options) {
+    return new this.classes[type](this.div, options);
+  }
+}
+
+;// CONCATENATED MODULE: ./src/util/vdom.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS104: Avoid inline assignments
+ * DS205: Consider reworking code to avoid use of IIFEs
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+// Quick'n'dirty Virtual DOM diffing
+// with a poor man's React for components
+//
+// This is for rendering HTML with data from a GL readback. See DOM examples.
+const HEAP = [];
+let id = 0;
+
+// Static render components
+const Types = {
+  /*
+  * el('example', props, children);
+  example: MathBox.DOM.createClass({
+    render: (el, props, children) ->
+      * VDOM node
+      return el('span', { className: "foo" }, "Hello World")
+  })
+  */
+};
+
+const descriptor = () => ({
+  id: id++,
+  type: null,
+  props: null,
+  children: null,
+  rendered: null,
+  instance: null,
+});
+
+const hint = function (n) {
+  n *= 2;
+  n = Math.max(0, HEAP.length - n);
+  return __range__(0, n, false).map((_i) => HEAP.push(descriptor()));
+};
+
+const vdom_element = function (type, props, children) {
+  const el = HEAP.length ? HEAP.pop() : descriptor();
+
+  el.type = type != null ? type : "div";
+  el.props = props != null ? props : null;
+  el.children = children != null ? children : null;
+  // Can't use `arguments` here to pass children as direct args, it de-optimizes label emitters
+
+  return el;
+};
+
+const recycle = function (el) {
+  if (!el.type) {
+    return;
+  }
+
+  const { children } = el;
+  el.type = el.props = el.children = el.instance = null;
+
+  HEAP.push(el);
+
+  if (children != null) {
+    for (const child of Array.from(children)) {
+      recycle(child);
+    }
+  }
+};
+
+const apply = function (el, last, node, parent, index) {
+  if (el != null) {
+    if (last == null) {
+      // New node
+      return mount(el, parent, index);
+    } else {
+      // Literal DOM node
+      let same;
+      if (el instanceof Node) {
+        same = el === last;
+        if (same) {
+          return;
+        }
+      } else {
+        // Check compatibility
+        same =
+          typeof el === typeof last &&
+          last !== null &&
+          el !== null &&
+          el.type === last.type;
+      }
+
+      if (!same) {
+        // Not compatible: unmount and remount
+        unmount(last.instance, node);
+        node.remove();
+        return mount(el, parent, index);
+      } else {
+        // Maintain component ref
+        let key, ref, value;
+        el.instance = last.instance;
+
+        // Check if it's a component
+        const type = (el.type != null ? el.type.isComponentClass : undefined)
+          ? el.type
+          : Types[el.type];
+
+        // Prepare to diff props and children
+        const props = last != null ? last.props : undefined;
+        const nextProps = el.props;
+        const children =
+          (last != null ? last.children : undefined) != null
+            ? last != null
+              ? last.children
+              : undefined
+            : null;
+        const nextChildren = el.children;
+
+        if (nextProps != null) {
+          nextProps.children = nextChildren;
+        }
+
+        // Component
+        if (type != null) {
+          // See if it changed
+          let dirty = node._COMPONENT_DIRTY;
+
+          if ((props != null) !== (nextProps != null)) {
+            dirty = true;
+          }
+          if (children !== nextChildren) {
+            dirty = true;
+          }
+
+          if (props != null && nextProps != null) {
+            if (!dirty) {
+              for (key in props) {
+                if (!Object.prototype.hasOwnProperty.call(nextProps, key)) {
+                  dirty = true;
+                }
+              }
+            }
+            if (!dirty) {
+              for (key in nextProps) {
+                value = nextProps[key];
+                if ((ref = props[key]) !== value) {
+                  dirty = true;
+                }
+              }
+            }
+          }
+
+          if (dirty) {
+            let left;
+            const comp = last.instance;
+            if (el.props == null) {
+              el.props = {};
+            }
+            for (const k in comp.defaultProps) {
+              const v = comp.defaultProps[k];
+              if (el.props[k] == null) {
+                el.props[k] = v;
+              }
+            }
+            el.props.children = el.children;
+
+            if (typeof comp.willReceiveProps === "function") {
+              comp.willReceiveProps(el.props);
+            }
+            const should =
+              node._COMPONENT_FORCE ||
+              ((left =
+                typeof comp.shouldUpdate === "function"
+                  ? comp.shouldUpdate(el.props)
+                  : undefined) != null
+                ? left
+                : true);
+
+            if (should) {
+              const nextState = comp.getNextState();
+              if (typeof comp.willUpdate === "function") {
+                comp.willUpdate(el.props, nextState);
+              }
+            }
+
+            const prevProps = comp.props;
+            const prevState = comp.applyNextState();
+
+            comp.props = el.props;
+            comp.children = el.children;
+
+            if (should) {
+              el = el.rendered =
+                typeof comp.render === "function"
+                  ? comp.render(vdom_element, el.props, el.children)
+                  : undefined;
+              apply(el, last.rendered, node, parent, index);
+
+              if (typeof comp.didUpdate === "function") {
+                comp.didUpdate(prevProps, prevState);
+              }
+            }
+          }
+
+          return;
+        } else {
+          // VDOM node
+          if (props != null) {
+            for (key in props) {
+              if (!Object.prototype.hasOwnProperty.call(nextProps, key)) {
+                unset(node, key, props[key]);
+              }
+            }
+          }
+          if (nextProps != null) {
+            for (key in nextProps) {
+              value = nextProps[key];
+              if ((ref = props[key]) !== value && key !== "children") {
+                set(node, key, value, ref);
+              }
+            }
+          }
+
+          // Diff children
+          if (nextChildren != null) {
+            if (["string", "number"].includes(typeof nextChildren)) {
+              // Insert text directly
+              if (nextChildren !== children) {
+                node.textContent = nextChildren;
+              }
+            } else {
+              if (nextChildren.type != null) {
+                // Single child
+                apply(nextChildren, children, node.childNodes[0], node, 0);
+              } else {
+                // Diff children
+                let child, i;
+                const { childNodes } = node;
+                if (children != null) {
+                  for (i = 0; i < nextChildren.length; i++) {
+                    child = nextChildren[i];
+                    apply(child, children[i], childNodes[i], node, i);
+                  }
+                } else {
+                  for (i = 0; i < nextChildren.length; i++) {
+                    child = nextChildren[i];
+                    apply(child, null, childNodes[i], node, i);
+                  }
+                }
+              }
+            }
+          } else if (children != null) {
+            // Unmount all child components
+            unmount(null, node);
+
+            // Remove all children
+            node.innerHTML = "";
+          }
+        }
+
+        return;
+      }
+    }
+  }
+
+  if (last != null) {
+    // Removed node
+    unmount(last.instance, node);
+    return last.node.remove();
+  }
+};
+
+const mount = function (el, parent, index) {
+  let node;
+  if (index == null) {
+    index = 0;
+  }
+  const type = (el.type != null ? el.type.isComponentClass : undefined)
+    ? el.type
+    : Types[el.type];
+
+  // Literal DOM node
+  if (el instanceof Node) {
+    node = el;
+  } else {
+    if (type != null) {
+      // Component
+      let comp;
+      const ctor = (el.type != null ? el.type.isComponentClass : undefined)
+        ? el.type
+        : Types[el.type];
+
+      // No component class found
+      if (!ctor) {
+        el = el.rendered = vdom_element("noscript");
+        node = mount(el, parent, index);
+        return node;
+      }
+
+      // Construct component class
+      el.instance = comp = new ctor(parent);
+      if (el.props == null) {
+        el.props = {};
+      }
+      for (const k in comp.defaultProps) {
+        const v = comp.defaultProps[k];
+        if (el.props[k] == null) {
+          el.props[k] = v;
+        }
+      }
+      el.props.children = el.children;
+
+      // Do initial state transition
+      comp.props = el.props;
+      comp.children = el.children;
+      comp.setState(
+        typeof comp.getInitialState === "function"
+          ? comp.getInitialState()
+          : undefined
+      );
+      if (typeof comp.willMount === "function") {
+        comp.willMount();
+      }
+
+      // Render
+      el = el.rendered =
+        typeof comp.render === "function"
+          ? comp.render(vdom_element, el.props, el.children)
+          : undefined;
+      node = mount(el, parent, index);
+
+      // Finish mounting and remember component/node association
+      if (typeof comp.didMount === "function") {
+        comp.didMount(el);
+      }
+      node._COMPONENT = comp;
+
+      return node;
+    } else if (["string", "number"].includes(typeof el)) {
+      // Text
+      node = document.createTextNode(el);
+    } else {
+      // VDOM Node
+      node = document.createElement(el.type);
+      for (const key in el.props) {
+        const value = el.props[key];
+        set(node, key, value);
+      }
+    }
+
+    const { children } = el;
+    if (children != null) {
+      if (["string", "number"].includes(typeof children)) {
+        // Insert text directly
+        node.textContent = children;
+      } else {
+        if (children.type != null) {
+          // Single child
+          mount(children, node, 0);
+        } else {
+          // Insert children
+          for (let i = 0; i < children.length; i++) {
+            const child = children[i];
+            mount(child, node, i);
+          }
+        }
+      }
+    }
+  }
+
+  parent.insertBefore(node, parent.childNodes[index]);
+  return node;
+};
+
+const unmount = function (comp, node) {
+  if (comp) {
+    if (typeof comp.willUnmount === "function") {
+      comp.willUnmount();
+    }
+    for (const k in comp) {
+      delete comp[k];
+    }
+  }
+
+  return (() => {
+    const result = [];
+    for (const child of Array.from(node.childNodes)) {
+      unmount(child._COMPONENT, child);
+      result.push(delete child._COMPONENT);
+    }
+    return result;
+  })();
+};
+
+const prop = function (key) {
+  if (typeof document === "undefined") {
+    return true;
+  }
+  if (document.documentElement.style[key] != null) {
+    return key;
+  }
+
+  key = key[0].toUpperCase() + key.slice(1);
+  const prefixes = ["webkit", "moz", "ms", "o"];
+  for (const prefix of Array.from(prefixes)) {
+    if (document.documentElement.style[prefix + key] != null) {
+      return prefix + key;
+    }
+  }
+};
+
+const map = {};
+for (const key of ["transform"]) {
+  map[key] = prop(key);
+}
+
+const set = function (node, key, value, orig) {
+  if (key === "style") {
+    for (const k in value) {
+      const v = value[k];
+      if ((orig != null ? orig[k] : undefined) !== v) {
+        node.style[map[k] != null ? map[k] : k] = v;
+      }
+    }
+    return;
+  }
+
+  if (node[key] != null) {
+    try {
+      node[key] = value;
+    } catch (e1) {
+      console.log("failed setting " + key);
+    }
+    return;
+  }
+
+  if (node instanceof Node) {
+    node.setAttribute(key, value);
+    return;
+  }
+};
+
+const unset = function (node, key, orig) {
+  if (key === "style") {
+    for (const k in orig) {
+      node.style[map[k] != null ? map[k] : k] = "";
+    }
+    return;
+  }
+
+  if (node[key] != null) {
+    node[key] = undefined;
+  }
+
+  if (node instanceof Node) {
+    node.removeAttribute(key);
+    return;
+  }
+};
+
+const createClass = function (prototype) {
+  let left;
+  const aliases = {
+    willMount: "componentWillMount",
+    didMount: "componentDidMount",
+    willReceiveProps: "componentWillReceiveProps",
+    shouldUpdate: "shouldComponentUpdate",
+    willUpdate: "componentWillUpdate",
+    didUpdate: "componentDidUpdate",
+    willUnmount: "componentWillUnmount",
+  };
+  for (const a in aliases) {
+    const b = aliases[a];
+    if (prototype[a] == null) {
+      prototype[a] = prototype[b];
+    }
+  }
+
+  class Component {
+    constructor(node, props, state = null, children = null) {
+      let k, v;
+      if (props == null) {
+        props = {};
+      }
+      this.props = props;
+      this.state = state;
+      this.children = children;
+      const bind = function (f, self) {
+        if (typeof f === "function") {
+          return f.bind(self);
+        } else {
+          return f;
+        }
+      };
+      for (k in prototype) {
+        v = prototype[k];
+        this[k] = bind(v, this);
+      }
+
+      let nextState = null;
+
+      this.setState = function (state) {
+        if (nextState == null) {
+          nextState = state ? (nextState != null ? nextState : {}) : null;
+        }
+        for (k in state) {
+          v = state[k];
+          nextState[k] = v;
+        }
+        node._COMPONENT_DIRTY = true;
+      };
+
+      this.forceUpdate = function () {
+        node._COMPONENT_FORCE = node._COMPONENT_DIRTY = true;
+
+        let el = node;
+        return (() => {
+          const result = [];
+          while ((el = el.parentNode)) {
+            if (el._COMPONENT) {
+              result.push((el._COMPONENT_FORCE = true));
+            } else {
+              result.push(undefined);
+            }
+          }
+          return result;
+        })();
+      };
+
+      this.getNextState = () => nextState;
+
+      this.applyNextState = function () {
+        node._COMPONENT_FORCE = node._COMPONENT_DIRTY = false;
+        const prevState = this.state;
+        [nextState, this.state] = Array.from([null, nextState]);
+        return prevState;
+      };
+    }
+  }
+
+  Component.isComponentClass = true;
+  Component.prototype.defaultProps =
+    (left =
+      typeof prototype.getDefaultProps === "function"
+        ? prototype.getDefaultProps()
+        : undefined) != null
+      ? left
+      : {};
+  return Component;
+};
+
+function __range__(left, right, inclusive) {
+  const range = [];
+  const ascending = left < right;
+  const end = !inclusive ? right : ascending ? right + 1 : right - 1;
+  for (let i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {
+    range.push(i);
+  }
+  return range;
+}
+
+;// CONCATENATED MODULE: ./src/overlay/overlay.js
+class Overlay {
+  constructor(element, options) {
+    this.element = element;
+    if (typeof this.init === "function") {
+      this.init(options);
+    }
+  }
+
+  dispose() {}
+}
+
+;// CONCATENATED MODULE: ./src/overlay/dom.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+class DOM extends Overlay {
+  static initClass() {
+    this.prototype.el = vdom_element;
+    this.prototype.hint = hint;
+    this.prototype.apply = apply;
+    this.prototype.recycle = recycle;
+  }
+
+  init(_options) {
+    return (this.last = null);
+  }
+
+  dispose() {
+    this.unmount();
+    return super.dispose();
+  }
+
+  mount() {
+    const overlay = document.createElement("div");
+    overlay.classList.add("mathbox-overlay");
+    this.element.appendChild(overlay);
+    return (this.overlay = overlay);
+  }
+
+  unmount(_overlay) {
+    if (this.overlay && this.overlay.parentNode) {
+      this.element.removeChild(this.overlay);
+    }
+    return (this.overlay = null);
+  }
+
+  render(el) {
+    // Lazy mounting
+    if (!this.overlay) {
+      this.mount();
+    }
+
+    // Wrap naked string or array in a div
+    if (["string", "number"].includes(typeof el)) {
+      el = this.el("div", null, el);
+    }
+    if (el instanceof Array) {
+      el = this.el("div", null, el);
+    }
+
+    // Create empty div if el is null
+    if (el == null) {
+      el = this.el("div");
+    }
+
+    // See if it can be mounted directly
+    const naked = el.type === "div";
+
+    // Fetch last DOM state
+    let { last } = this;
+
+    // Start with root node
+    const { overlay } = this;
+    const node = naked ? overlay : overlay.childNodes[0];
+    const parent = naked ? overlay.parentNode : overlay;
+
+    // Create phantom DOM state if mounting into existing element
+    if (!last && node) {
+      last = this.el("div");
+    }
+
+    // Update DOM
+    this.apply(el, last, node, parent, 0);
+    this.last = el;
+
+    // Recycle old descriptors
+    if (last != null) {
+      this.recycle(last);
+    }
+  }
+}
+DOM.initClass();
+
+;// CONCATENATED MODULE: ./src/overlay/classes.js
+
+
+const Classes = { dom: DOM };
+
+;// CONCATENATED MODULE: ./src/overlay/index.js
+
+
+
+
+;// CONCATENATED MODULE: ./src/primitives/primitive.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS104: Avoid inline assignments
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+class Primitive {
+  static initClass() {
+    this.Node = node_Node;
+    this.Group = group_Group;
+
+    // Class default
+    this.model = this.Node;
+    this.defaults = null;
+    this.traits = null;
+    this.props = null;
+    this.finals = null;
+    this.freeform = false;
+  }
+
+  constructor(node, _context, helpers) {
+    this.node = node;
+    this._context = _context;
+    this._renderables = this._context.renderables;
+    this._attributes = this._context.attributes;
+    this._shaders = this._context.shaders;
+    this._overlays = this._context.overlays;
+    this._animator = this._context.animator;
+    this._types = this._attributes.types;
+
+    // Link up node 1-to-1
+    this.node.controller = this;
+
+    // This node has been inserted/removed
+    this.node.on("added", (_event) => this._added());
+    this.node.on("removed", (_event) => this._removed());
+
+    // Property change (if mounted)
+    this.node.on("change", (event) => {
+      if (this._root) {
+        return this.change(event.changed, event.touched);
+      }
+    });
+
+    // Store local refs
+    this.reconfigure();
+
+    // Attribute getter / helpers
+    this._get = this.node.get.bind(this.node);
+    this._helpers = helpers(this, this.node.traits);
+
+    // Keep track of various handlers to do auto-cleanup on unmake()
+    this._handlers = { inherit: {}, listen: [], watch: [], compute: [] };
+
+    // Detached initially
+    this._root = this._parent = null;
+
+    // Friendly constructor
+    this.init();
+  }
+
+  is(trait) {
+    return this.traits.hash[trait];
+  }
+
+  // Primitive lifecycle
+  init() {}
+  make() {}
+  made() {}
+  unmake(_rebuild) {}
+  unmade() {}
+  change(_changed, _touched, _init) {}
+
+  // Force property reinit
+  refresh() {
+    return this.change({}, {}, true);
+  }
+
+  // Destroy and create cycle
+  rebuild() {
+    if (this._root) {
+      this._removed(true);
+      return this._added();
+    }
+  }
+
+  // Reconfigure traits/props
+  reconfigure(config) {
+    if (config != null) {
+      this.node.configure(config, this._attributes);
+    }
+
+    this.traits = this.node.traits;
+    return (this.props = this.node.props);
+  }
+
+  // This node has been inserted
+  _added() {
+    let e, left;
+    this._parent =
+      this.node.parent != null ? this.node.parent.controller : undefined;
+    this._root = this.node.root != null ? this.node.root.controller : undefined;
+
+    this.node.clock =
+      (left = this._inherit("clock")) != null ? left : this._root;
+
+    try {
+      try {
+        this.make();
+        this.refresh();
+        return this.made();
+      } catch (error) {
+        e = error;
+        this.node.print("warn");
+        console.error(e);
+        throw e;
+      }
+    } catch (error1) {
+      e = error1;
+      try {
+        return this._removed();
+        // eslint-disable-next-line no-empty
+      } catch (error2) {}
+    }
+  }
+
+  _removed(rebuild) {
+    if (rebuild == null) {
+      rebuild = false;
+    }
+    this.unmake(rebuild);
+
+    this._unlisten();
+    this._unattach();
+    this._uncompute();
+
+    this._root = null;
+    this._parent = null;
+
+    return this.unmade(rebuild);
+  }
+
+  // Bind event listeners to methods
+  _listen(object, type, method, self) {
+    if (self == null) {
+      self = this;
+    }
+    if (object instanceof Array) {
+      for (const o of Array.from(object)) {
+        return this.__listen(o, type, method, self);
+      }
+    }
+    return this.__listen(object, type, method, self);
+  }
+
+  __listen(object, type, method, self) {
+    if (self == null) {
+      self = this;
+    }
+    if (typeof object === "string") {
+      object = this._inherit(object);
+    }
+
+    if (object != null) {
+      const handler = method.bind(self);
+      handler.node = this.node;
+      object.on(type, handler);
+
+      this._handlers.listen.push([object, type, handler]);
+    }
+    return object;
+  }
+
+  _unlisten() {
+    if (!this._handlers.listen.length) {
+      return;
+    }
+
+    for (const [object, type, handler] of Array.from(this._handlers.listen)) {
+      object.off(type, handler);
+    }
+    return (this._handlers.listen = []);
+  }
+
+  // Find parent with certain trait
+  _inherit(trait) {
+    const cached = this._handlers.inherit[trait];
+    if (cached !== undefined) {
+      return cached;
+    }
+
+    return (this._handlers.inherit[trait] =
+      this._parent != null
+        ? this._parent._find(trait != null ? trait : null)
+        : undefined);
+  }
+
+  _find(trait) {
+    if (this.is(trait)) {
+      return this;
+    }
+    return this._parent != null ? this._parent._find(trait) : undefined;
+  }
+
+  _uninherit() {
+    return (this._handlers.inherit = {});
+  }
+
+  // Attach to controller by trait and watch the selector
+  _attach(selector, trait, method, self, start, optional, multiple) {
+    if (self == null) {
+      self = this;
+    }
+    if (start == null) {
+      start = this;
+    }
+    if (optional == null) {
+      optional = false;
+    }
+    if (multiple == null) {
+      multiple = false;
+    }
+    const filter = function (node) {
+      if (node != null && Array.from(node.traits).includes(trait)) {
+        return node;
+      }
+    };
+    const map = (node) => (node != null ? node.controller : undefined);
+    const flatten = function (list) {
+      if (list == null) {
+        return list;
+      }
+      let out = [];
+      for (const sub of Array.from(list)) {
+        if (sub instanceof Array) {
+          out = out.concat(sub);
+        } else {
+          out.push(sub);
+        }
+      }
+      return out;
+    };
+
+    const resolve = (selector) => {
+      // Direct JS binding, no watcher.
+      let node, nodes;
+      if (typeof selector === "object") {
+        node = selector;
+
+        // API object
+        if (node != null ? node._up : undefined) {
+          selector = multiple ? node._targets : [node[0]];
+          return selector;
+        }
+
+        // Array of things
+        if (node instanceof Array) {
+          selector = multiple ? flatten(node.map(resolve)) : resolve(node[0]);
+          return selector;
+        }
+
+        // Node
+        if (node instanceof node_Node) {
+          return [node];
+        }
+
+        // Auto-link selector '<'
+      } else if (typeof selector === "string" && selector[0] === "<") {
+        let match;
+        let discard = 0;
+        if ((match = selector.match(/^<([0-9])+$/))) {
+          discard = +match[1] - 1;
+        }
+        if (selector.match(/^<+$/)) {
+          discard = +selector.length - 1;
+        }
+
+        nodes = [];
+
+        // Implicitly associated node (scan backwards until we find one)
+        let previous = start.node;
+        while (previous) {
+          // Find previous node
+          const { parent } = previous;
+          if (!parent) {
+            break;
+          }
+          previous = parent.children[previous.index - 1];
+
+          // If we reached the first child, ascend if nothing found yet
+          if (!previous && !nodes.length) {
+            previous = parent;
+          }
+
+          // Include if matched
+          node = null;
+          if (filter(previous)) {
+            node = previous;
+          }
+          if (node != null && discard-- <= 0) {
+            nodes.push(node);
+          }
+
+          // Return solo match
+          if (!multiple && nodes.length) {
+            return nodes;
+          }
+        }
+
+        // Return list match
+        if (multiple && nodes.length) {
+          return nodes;
+        }
+
+        // Selector binding
+      } else if (typeof selector === "string") {
+        const watcher = method.bind(self);
+        this._handlers.watch.push(watcher);
+
+        const selection = this._root.watch(selector, watcher);
+        if (!multiple) {
+          if (filter(selection[0])) {
+            node = selection[0];
+          }
+          if (node != null) {
+            return [node];
+          }
+        } else {
+          nodes = selection.filter(filter);
+          if (nodes.length) {
+            return nodes;
+          }
+        }
+      }
+
+      // Nothing found
+      if (!optional) {
+        console.warn(this.node.toMarkup());
+        throw new Error(
+          `${this.node.toString()} - Could not find ${trait} \`${selector}\``
+        );
+      }
+      if (multiple) {
+        return [];
+      } else {
+        return null;
+      }
+    };
+
+    // Resolve selection recursively
+    const nodes = flatten(resolve(selector));
+
+    // Return node's controllers if found
+    if (multiple) {
+      if (nodes != null) {
+        return nodes.map(map);
+      } else {
+        return null;
+      }
+    } else {
+      if (nodes != null) {
+        return map(nodes[0]);
+      } else {
+        return null;
+      }
+    }
+  }
+
+  // Remove watcher attachments
+  _unattach() {
+    if (!this._handlers.watch.length) {
+      return;
+    }
+
+    for (const watcher of Array.from(this._handlers.watch)) {
+      if (watcher != null) {
+        watcher.unwatch();
+      }
+    }
+    return (this._handlers.watch = []);
+  }
+
+  // Bind a computed value to a prop
+  _compute(key, expr) {
+    this._handlers.compute.push(key);
+    return this.node.bind(key, expr, true);
+  }
+
+  // Remove prop bindings
+  _uncompute() {
+    if (!this._handlers.compute.length) {
+      return;
+    }
+    for (const key of Array.from(this._handlers.compute)) {
+      this.node.unbind(key, true);
+    }
+    return (this._handlers.compute = []);
+  }
+}
+Primitive.initClass();
+
+Binder.apply(Primitive.prototype);
+
+;// CONCATENATED MODULE: ./src/primitives/types/base/parent.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS206: Consider reworking classes to avoid initClass
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+class Parent extends Primitive {
+  static initClass() {
+    this.model = Primitive.Group;
+    this.traits = ["node"];
+  }
+}
+Parent.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/base/group.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+class base_group_Group extends Parent {
+  static initClass() {
+    this.traits = ["node", "object", "entity", "visible", "active"];
+  }
+
+  make() {
+    this._helpers.visible.make();
+    return this._helpers.active.make();
+  }
+
+  unmake() {
+    this._helpers.visible.unmake();
+    return this._helpers.active.unmake();
+  }
+}
+base_group_Group.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/base/inherit.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+class Inherit extends Parent {
+  static initClass() {
+    this.traits = ["node", "bind"];
+  }
+
+  make() {
+    // Bind to attached trait source
+    return this._helpers.bind.make([{ to: "inherit.source", trait: "node" }]);
+  }
+
+  unmake() {
+    return this._helpers.bind.unmake();
+  }
+
+  _find(trait) {
+    if (this.bind.source && Array.from(this.props.traits).includes(trait)) {
+      return this.bind.source._inherit(trait);
+    }
+    return super._find();
+  }
+}
+Inherit.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/base/root.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining
+ * DS104: Avoid inline assignments
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+class Root extends Parent {
+  static initClass() {
+    this.traits = ["node", "root", "clock", "scene", "vertex", "unit"];
+  }
+
+  init() {
+    this.size = null;
+
+    this.cameraEvent = { type: "root.camera" };
+    this.preEvent = { type: "root.pre" };
+    this.updateEvent = { type: "root.update" };
+    this.renderEvent = { type: "root.render" };
+    this.postEvent = { type: "root.post" };
+
+    this.clockEvent = { type: "clock.tick" };
+
+    return (this.camera = null);
+  }
+
+  make() {
+    return this._helpers.unit.make();
+  }
+  unmake() {
+    return this._helpers.unit.unmake();
+  }
+
+  change(changed, touched, init) {
+    if (changed["root.camera"] || init) {
+      this._unattach();
+      this._attach(
+        this.props.camera,
+        "camera",
+        this.setCamera,
+        this,
+        this,
+        true
+      );
+      return this.setCamera();
+    }
+  }
+
+  adopt(renderable) {
+    return Array.from(renderable.renders).map((object) =>
+      this._context.scene.add(object)
+    );
+  }
+  unadopt(renderable) {
+    return Array.from(renderable.renders).map((object) =>
+      this._context.scene.remove(object)
+    );
+  }
+
+  select(selector) {
+    return this.node.model.select(selector);
+  }
+
+  watch(selector, handler) {
+    return this.node.model.watch(selector, handler);
+  }
+
+  unwatch(handler) {
+    return this.node.model.unwatch(handler);
+  }
+
+  resize(size) {
+    this.size = size;
+    return this.trigger({
+      type: "root.resize",
+      size,
+    });
+  }
+
+  getSize() {
+    return this.size;
+  }
+  getSpeed() {
+    return this.props.speed;
+  }
+
+  getUnit() {
+    return this._helpers.unit.get();
+  }
+  getUnitUniforms() {
+    return this._helpers.unit.uniforms();
+  }
+
+  pre() {
+    this.getCamera().updateProjectionMatrix();
+    this.trigger(this.clockEvent);
+    return this.trigger(this.preEvent);
+  }
+
+  update() {
+    return this.trigger(this.updateEvent);
+  }
+  render() {
+    return this.trigger(this.renderEvent);
+  }
+  post() {
+    return this.trigger(this.postEvent);
+  }
+
+  setCamera() {
+    const camera = root_guard_(
+      this.select(this.props.camera)[0],
+      (x) => x.controller
+    );
+    if (this.camera !== camera) {
+      this.camera = camera;
+      return this.trigger({ type: "root.camera" });
+    }
+  }
+
+  getCamera() {
+    let left;
+    return (left = this.camera != null ? this.camera.getCamera() : undefined) !=
+      null
+      ? left
+      : this._context.defaultCamera;
+  }
+
+  getTime() {
+    return this._context.time;
+  }
+
+  // End transform chain here
+  vertex(shader, pass) {
+    if (pass === 2) {
+      return shader.pipe("view.position");
+    }
+    if (pass === 3) {
+      return shader.pipe("root.position");
+    }
+    return shader;
+  }
+}
+Root.initClass();
+
+function root_guard_(value, transform) {
+  return typeof value !== "undefined" && value !== null
+    ? transform(value)
+    : undefined;
+}
+
+;// CONCATENATED MODULE: ./src/primitives/types/base/unit.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS206: Consider reworking classes to avoid initClass
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+class Unit extends Parent {
+  static initClass() {
+    this.traits = ["node", "unit"];
+  }
+
+  make() {
+    return this._helpers.unit.make();
+  }
+  unmake() {
+    return this._helpers.unit.unmake();
+  }
+
+  getUnit() {
+    return this._helpers.unit.get();
+  }
+  getUnitUniforms() {
+    return this._helpers.unit.uniforms();
+  }
+}
+Unit.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/base/index.js
+
+
+
+
+
+;// CONCATENATED MODULE: ./src/util/three.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+
+
+
+const paramToGL = function (gl, p) {
+  if (p === external_THREE_.RepeatWrapping) {
+    return gl.REPEAT;
+  }
+  if (p === external_THREE_.ClampToEdgeWrapping) {
+    return gl.CLAMP_TO_EDGE;
+  }
+  if (p === external_THREE_.MirroredRepeatWrapping) {
+    return gl.MIRRORED_REPEAT;
+  }
+
+  if (p === external_THREE_.NearestFilter) {
+    return gl.NEAREST;
+  }
+  if (p === external_THREE_.NearestMipMapNearestFilter) {
+    return gl.NEAREST_MIPMAP_NEAREST;
+  }
+  if (p === external_THREE_.NearestMipMapLinearFilter) {
+    return gl.NEAREST_MIPMAP_LINEAR;
+  }
+
+  if (p === external_THREE_.LinearFilter) {
+    return gl.LINEAR;
+  }
+  if (p === external_THREE_.LinearMipMapNearestFilter) {
+    return gl.LINEAR_MIPMAP_NEAREST;
+  }
+  if (p === external_THREE_.LinearMipMapLinearFilter) {
+    return gl.LINEAR_MIPMAP_LINEAR;
+  }
+
+  if (p === external_THREE_.UnsignedByteType) {
+    return gl.UNSIGNED_BYTE;
+  }
+  if (p === external_THREE_.UnsignedShort4444Type) {
+    return gl.UNSIGNED_SHORT_4_4_4_4;
+  }
+  if (p === external_THREE_.UnsignedShort5551Type) {
+    return gl.UNSIGNED_SHORT_5_5_5_1;
+  }
+  if (p === external_THREE_.ByteType) {
+    return gl.BYTE;
+  }
+  if (p === external_THREE_.ShortType) {
+    return gl.SHORT;
+  }
+  if (p === external_THREE_.UnsignedShortType) {
+    return gl.UNSIGNED_SHORT;
+  }
+  if (p === external_THREE_.IntType) {
+    return gl.INT;
+  }
+  if (p === external_THREE_.UnsignedIntType) {
+    return gl.UNSIGNED_INT;
+  }
+  if (p === external_THREE_.FloatType) {
+    return gl.FLOAT;
+  }
+
+  if (p === external_THREE_.AlphaFormat) {
+    return gl.ALPHA;
+  }
+  if (p === external_THREE_.RGBAFormat) {
+    return gl.RGBA;
+  }
+  if (p === external_THREE_.LuminanceFormat) {
+    return gl.LUMINANCE;
+  }
+  if (p === external_THREE_.LuminanceAlphaFormat) {
+    return gl.LUMINANCE_ALPHA;
+  }
+
+  if (p === external_THREE_.AddEquation) {
+    return gl.FUNC_ADD;
+  }
+  if (p === external_THREE_.SubtractEquation) {
+    return gl.FUNC_SUBTRACT;
+  }
+  if (p === external_THREE_.ReverseSubtractEquation) {
+    return gl.FUNC_REVERSE_SUBTRACT;
+  }
+
+  if (p === external_THREE_.ZeroFactor) {
+    return gl.ZERO;
+  }
+  if (p === external_THREE_.OneFactor) {
+    return gl.ONE;
+  }
+  if (p === external_THREE_.SrcColorFactor) {
+    return gl.SRC_COLOR;
+  }
+  if (p === external_THREE_.OneMinusSrcColorFactor) {
+    return gl.ONE_MINUS_SRC_COLOR;
+  }
+  if (p === external_THREE_.SrcAlphaFactor) {
+    return gl.SRC_ALPHA;
+  }
+  if (p === external_THREE_.OneMinusSrcAlphaFactor) {
+    return gl.ONE_MINUS_SRC_ALPHA;
+  }
+  if (p === external_THREE_.DstAlphaFactor) {
+    return gl.DST_ALPHA;
+  }
+  if (p === external_THREE_.OneMinusDstAlphaFactor) {
+    return gl.ONE_MINUS_DST_ALPHA;
+  }
+
+  if (p === external_THREE_.DstColorFactor) {
+    return gl.DST_COLOR;
+  }
+  if (p === external_THREE_.OneMinusDstColorFactor) {
+    return gl.ONE_MINUS_DST_COLOR;
+  }
+  if (p === external_THREE_.SrcAlphaSaturateFactor) {
+    return gl.SRC_ALPHA_SATURATE;
+  }
+
+  return 0;
+};
+
+const paramToArrayStorage = function (type) {
+  switch (type) {
+    case external_THREE_.UnsignedByteType:
+      return Uint8Array;
+    case external_THREE_.ByteType:
+      return Int8Array;
+    case external_THREE_.ShortType:
+      return Int16Array;
+    case external_THREE_.UnsignedShortType:
+      return Uint16Array;
+    case external_THREE_.IntType:
+      return Int32Array;
+    case external_THREE_.UnsignedIntType:
+      return Uint32Array;
+    case external_THREE_.FloatType:
+      return Float32Array;
+  }
+};
+
+const swizzleToEulerOrder = (swizzle) =>
+  swizzle.map((i) => ["", "X", "Y", "Z"][i]).join("");
+
+const transformComposer = function () {
+  const euler = new external_THREE_.Euler();
+  const quat = new external_THREE_.Quaternion();
+  const pos = new external_THREE_.Vector3();
+  const scl = new external_THREE_.Vector3();
+  const transform = new external_THREE_.Matrix4();
+
+  return function (position, rotation, quaternion, scale, matrix, eulerOrder) {
+    if (eulerOrder == null) {
+      eulerOrder = "XYZ";
+    }
+    if (rotation != null) {
+      if (eulerOrder instanceof Array) {
+        eulerOrder = swizzleToEulerOrder(eulerOrder);
+      }
+      euler.setFromVector3(rotation, eulerOrder);
+      quat.setFromEuler(euler);
+    } else {
+      quat.set(0, 0, 0, 1);
+    }
+
+    if (quaternion != null) {
+      quat.multiply(quaternion);
+    }
+
+    if (position != null) {
+      pos.copy(position);
+    } else {
+      pos.set(0, 0, 0);
+    }
+
+    if (scale != null) {
+      scl.copy(scale);
+    } else {
+      scl.set(1, 1, 1);
+    }
+
+    transform.compose(pos, quat, scl);
+    if (matrix != null) {
+      transform.multiplyMatrices(transform, matrix);
+    }
+
+    return transform;
+  };
+};
+
+;// CONCATENATED MODULE: ./src/primitives/types/camera/camera.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+
+
+class camera_Camera extends Primitive {
+  static initClass() {
+    this.traits = ["node", "camera"];
+  }
+
+  init() {}
+
+  make() {
+    const camera = this._context.defaultCamera;
+    this.camera = this.props.proxy ? camera : camera.clone();
+
+    this.euler = new external_THREE_.Euler();
+    return (this.quat = new external_THREE_.Quaternion());
+  }
+
+  unmake() {}
+
+  getCamera() {
+    return this.camera;
+  }
+
+  change(changed, touched, init) {
+    if (
+      changed["camera.position"] ||
+      changed["camera.quaternion"] ||
+      changed["camera.rotation"] ||
+      changed["camera.lookAt"] ||
+      changed["camera.up"] ||
+      changed["camera.fov"] ||
+      init
+    ) {
+      const { position, quaternion, rotation, lookAt, up, fov } = this.props;
+
+      // Apply transform conservatively to avoid conflicts with controls / proxy
+      if (position != null) {
+        this.camera.position.copy(position);
+      }
+
+      if (quaternion != null || rotation != null || lookAt != null) {
+        if (lookAt != null) {
+          this.camera.lookAt(lookAt);
+        } else {
+          this.camera.quaternion.set(0, 0, 0, 1);
+        }
+
+        if (rotation != null) {
+          this.euler.setFromVector3(
+            rotation,
+            swizzleToEulerOrder(this.props.eulerOrder)
+          );
+          this.quat.setFromEuler(this.euler);
+          this.camera.quaternion.multiply(this.quat);
+        }
+
+        if (quaternion != null) {
+          this.camera.quaternion.multiply(quaternion);
+        }
+      }
+
+      if (fov != null && this.camera.fov != null) {
+        this.camera.fov = fov;
+      }
+
+      if (up != null) {
+        this.camera.up.copy(up);
+      }
+
+      return this.camera.updateMatrix();
+    }
+  }
+}
+camera_Camera.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/camera/index.js
+
+
+;// CONCATENATED MODULE: ./src/util/data.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS104: Avoid inline assignments
+ * DS202: Simplify dynamic range loops
+ * DS205: Consider reworking code to avoid use of IIFEs
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+const getSizes = function (data) {
+  const sizes = [];
+  let array = data;
+  while (
+    typeof array !== "string" &&
+    (array != null ? array.length : undefined) != null
+  ) {
+    sizes.push(array.length);
+    array = array[0];
+  }
+  return sizes;
+};
+
+const getDimensions = function (data, spec) {
+  let left;
+  if (spec == null) {
+    spec = {};
+  }
+  const { items, channels, width, height, depth } = spec;
+
+  const dims = {};
+
+  if (!data || !data.length) {
+    return {
+      items,
+      channels,
+      width: width != null ? width : 0,
+      height: height != null ? height : 0,
+      depth: depth != null ? depth : 0,
+    };
+  }
+
+  const sizes = getSizes(data);
+  const nesting = sizes.length;
+
+  dims.channels = channels !== 1 && sizes.length > 1 ? sizes.pop() : channels;
+  dims.items = items !== 1 && sizes.length > 1 ? sizes.pop() : items;
+  dims.width = width !== 1 && sizes.length > 1 ? sizes.pop() : width;
+  dims.height = height !== 1 && sizes.length > 1 ? sizes.pop() : height;
+  dims.depth = depth !== 1 && sizes.length > 1 ? sizes.pop() : depth;
+
+  let levels = nesting;
+  if (channels === 1) {
+    levels++;
+  }
+  if (items === 1 && levels > 1) {
+    levels++;
+  }
+  if (width === 1 && levels > 2) {
+    levels++;
+  }
+  if (height === 1 && levels > 3) {
+    levels++;
+  }
+
+  let n = (left = sizes.pop()) != null ? left : 1;
+  if (levels <= 1) {
+    n /= dims.channels != null ? dims.channels : 1;
+  }
+  if (levels <= 2) {
+    n /= dims.items != null ? dims.items : 1;
+  }
+  if (levels <= 3) {
+    n /= dims.width != null ? dims.width : 1;
+  }
+  if (levels <= 4) {
+    n /= dims.height != null ? dims.height : 1;
+  }
+  n = Math.floor(n);
+
+  if (dims.width == null) {
+    dims.width = n;
+    n = 1;
+  }
+  if (dims.height == null) {
+    dims.height = n;
+    n = 1;
+  }
+  if (dims.depth == null) {
+    dims.depth = n;
+    n = 1;
+  }
+
+  return dims;
+};
+
+const repeatCall = function (call, times) {
+  switch (times) {
+    case 0:
+      return () => true;
+    case 1:
+      return () => call();
+    case 2:
+      return function () {
+        call();
+        return call();
+      };
+    case 3:
+      return function () {
+        call();
+        call();
+        call();
+        return call();
+      };
+    case 4:
+      return function () {
+        call();
+        call();
+        call();
+        return call();
+      };
+    case 6:
+      return function () {
+        call();
+        call();
+        call();
+        call();
+        call();
+        return call();
+      };
+    case 8:
+      return function () {
+        call();
+        call();
+        call();
+        call();
+        call();
+        return call();
+      };
+  }
+};
+
+const makeEmitter = function (thunk, items, channels) {
+  let outer;
+  const inner = (() => {
+    switch (channels) {
+      case 0:
+        return () => true;
+      case 1:
+        return (emit) => emit(thunk());
+      case 2:
+        return (emit) => emit(thunk(), thunk());
+      case 3:
+        return (emit) => emit(thunk(), thunk(), thunk());
+      case 4:
+        return (emit) => emit(thunk(), thunk(), thunk(), thunk());
+      case 6:
+        return (emit) =>
+          emit(thunk(), thunk(), thunk(), thunk(), thunk(), thunk());
+      case 8:
+        return (emit) =>
+          emit(
+            thunk(),
+            thunk(),
+            thunk(),
+            thunk(),
+            thunk(),
+            thunk(),
+            thunk(),
+            thunk()
+          );
+    }
+  })();
+
+  let next = null;
+  while (items > 0) {
+    const n = Math.min(items, 8);
+    outer = (() => {
+      switch (n) {
+        case 1:
+          return (emit) => inner(emit);
+        case 2:
+          return function (emit) {
+            inner(emit);
+            return inner(emit);
+          };
+        case 3:
+          return function (emit) {
+            inner(emit);
+            inner(emit);
+            return inner(emit);
+          };
+        case 4:
+          return function (emit) {
+            inner(emit);
+            inner(emit);
+            inner(emit);
+            return inner(emit);
+          };
+        case 5:
+          return function (emit) {
+            inner(emit);
+            inner(emit);
+            inner(emit);
+            inner(emit);
+            return inner(emit);
+          };
+        case 6:
+          return function (emit) {
+            inner(emit);
+            inner(emit);
+            inner(emit);
+            inner(emit);
+            inner(emit);
+            return inner(emit);
+          };
+        case 7:
+          return function (emit) {
+            inner(emit);
+            inner(emit);
+            inner(emit);
+            inner(emit);
+            inner(emit);
+            inner(emit);
+            return inner(emit);
+          };
+        case 8:
+          return function (emit) {
+            inner(emit);
+            inner(emit);
+            inner(emit);
+            inner(emit);
+            inner(emit);
+            inner(emit);
+            inner(emit);
+            return inner(emit);
+          };
+      }
+    })();
+    if (next != null) {
+      next = ((outer, next) =>
+        function (emit) {
+          outer(emit);
+          return next(emit);
+        })(outer, next);
+    } else {
+      next = outer;
+    }
+    items -= n;
+  }
+
+  outer = next != null ? next : () => true;
+  outer.reset = thunk.reset;
+  outer.rebind = thunk.rebind;
+  return outer;
+};
+
+const getThunk = function (data) {
+  let thunk;
+  let j, k, l, m;
+  let sizes = getSizes(data);
+  const nesting = sizes.length;
+
+  let a = sizes.pop();
+  let b = sizes.pop();
+  let c = sizes.pop();
+  const d = sizes.pop();
+
+  let i, first, second, third, fourth;
+
+  switch (nesting) {
+    case 0:
+      thunk = () => 0;
+      thunk.reset = function () {};
+      break;
+
+    case 1:
+      i = 0;
+      thunk = () => data[i++];
+      thunk.reset = () => (i = 0);
+      break;
+
+    case 2:
+      i = j = 0;
+      first = data[j] != null ? data[j] : [];
+
+      thunk = function () {
+        const x = first[i++];
+        if (i === a) {
+          i = 0;
+          j++;
+          first = data[j] != null ? data[j] : [];
+        }
+        return x;
+      };
+
+      thunk.reset = function () {
+        i = j = 0;
+        first = data[j] != null ? data[j] : [];
+      };
+      break;
+
+    case 3:
+      i = j = k = 0;
+      second = data[k] != null ? data[k] : [];
+      first = second[j] != null ? second[j] : [];
+
+      thunk = function () {
+        const x = first[i++];
+        if (i === a) {
+          i = 0;
+          j++;
+          if (j === b) {
+            j = 0;
+            k++;
+            second = data[k] != null ? data[k] : [];
+          }
+          first = second[j] != null ? second[j] : [];
+        }
+        return x;
+      };
+
+      thunk.reset = function () {
+        i = j = k = 0;
+        second = data[k] != null ? data[k] : [];
+        first = second[j] != null ? second[j] : [];
+      };
+      break;
+
+    case 4:
+      i = j = k = l = 0;
+      third = data[l] != null ? data[l] : [];
+      second = third[k] != null ? third[k] : [];
+      first = second[j] != null ? second[j] : [];
+
+      thunk = function () {
+        const x = first[i++];
+        if (i === a) {
+          i = 0;
+          j++;
+          if (j === b) {
+            j = 0;
+            k++;
+            if (k === c) {
+              k = 0;
+              l++;
+              third = data[l] != null ? data[l] : [];
+            }
+            second = third[k] != null ? third[k] : [];
+          }
+          first = second[j] != null ? second[j] : [];
+        }
+        return x;
+      };
+
+      thunk.reset = function () {
+        i = j = k = l = 0;
+        third = data[l] != null ? data[l] : [];
+        second = third[k] != null ? third[k] : [];
+        first = second[j] != null ? second[j] : [];
+      };
+      break;
+
+    case 5:
+      i = j = k = l = m = 0;
+      fourth = data[m] != null ? data[m] : [];
+      third = fourth[l] != null ? fourth[l] : [];
+      second = third[k] != null ? third[k] : [];
+      first = second[j] != null ? second[j] : [];
+
+      thunk = function () {
+        const x = first[i++];
+        if (i === a) {
+          i = 0;
+          j++;
+          if (j === b) {
+            j = 0;
+            k++;
+            if (k === c) {
+              k = 0;
+              l++;
+              if (l === d) {
+                l = 0;
+                m++;
+                fourth = data[m] != null ? data[m] : [];
+              }
+              third = fourth[l] != null ? fourth[l] : [];
+            }
+            second = third[k] != null ? third[k] : [];
+          }
+          first = second[j] != null ? second[j] : [];
+        }
+        return x;
+      };
+
+      thunk.reset = function () {
+        i = j = k = l = m = 0;
+        fourth = data[m] != null ? data[m] : [];
+        third = fourth[l] != null ? fourth[l] : [];
+        second = third[k] != null ? third[k] : [];
+        first = second[j] != null ? second[j] : [];
+      };
+      break;
+  }
+
+  thunk.rebind = function (d) {
+    data = d;
+
+    sizes = getSizes(data);
+    if (sizes.length) {
+      a = sizes.pop();
+    }
+    if (sizes.length) {
+      b = sizes.pop();
+    }
+    if (sizes.length) {
+      c = sizes.pop();
+    }
+    if (sizes.length) {
+      return (d = sizes.pop());
+    }
+  };
+
+  return thunk;
+};
+
+const getStreamer = function (array, samples, channels, items) {
+  let i, j;
+  let limit = (i = j = 0);
+
+  const reset = function () {
+    limit = samples * channels * items;
+    return (i = j = 0);
+  };
+
+  const count = () => j;
+  const done = () => limit - i <= 0;
+
+  const skip = (() => {
+    switch (channels) {
+      case 1:
+        return function (n) {
+          i += n;
+          j += n;
+        };
+
+      case 2:
+        return function (n) {
+          i += n * 2;
+          j += n;
+        };
+
+      case 3:
+        return function (n) {
+          i += n * 3;
+          j += n;
+        };
+
+      case 4:
+        return function (n) {
+          i += n * 4;
+          j += n;
+        };
+    }
+  })();
+
+  const consume = (() => {
+    switch (channels) {
+      case 1:
+        return function (emit) {
+          emit(array[i++]);
+          ++j;
+        };
+
+      case 2:
+        return function (emit) {
+          emit(array[i++], array[i++]);
+          ++j;
+        };
+
+      case 3:
+        return function (emit) {
+          emit(array[i++], array[i++], array[i++]);
+          ++j;
+        };
+
+      case 4:
+        return function (emit) {
+          emit(array[i++], array[i++], array[i++], array[i++]);
+          ++j;
+        };
+    }
+  })();
+
+  const emit = (() => {
+    switch (channels) {
+      case 1:
+        return function (x) {
+          array[i++] = x;
+          ++j;
+        };
+
+      case 2:
+        return function (x, y) {
+          array[i++] = x;
+          array[i++] = y;
+          ++j;
+        };
+
+      case 3:
+        return function (x, y, z) {
+          array[i++] = x;
+          array[i++] = y;
+          array[i++] = z;
+          ++j;
+        };
+
+      case 4:
+        return function (x, y, z, w) {
+          array[i++] = x;
+          array[i++] = y;
+          array[i++] = z;
+          array[i++] = w;
+          ++j;
+        };
+    }
+  })();
+
+  consume.reset = reset;
+  emit.reset = reset;
+
+  reset();
+  return { emit, consume, skip, count, done, reset };
+};
+
+const getLerpEmitter = function (expr1, expr2) {
+  let emitter, lerp2, q, r, s;
+  const scratch = new Float32Array(4096);
+  let lerp1 = (lerp2 = 0.5);
+  let p = (q = r = s = 0);
+
+  const emit1 = function (x, y, z, w) {
+    r++;
+    scratch[p++] = x * lerp1;
+    scratch[p++] = y * lerp1;
+    scratch[p++] = z * lerp1;
+    return (scratch[p++] = w * lerp1);
+  };
+
+  const emit2 = function (x, y, z, w) {
+    s++;
+    scratch[q++] += x * lerp2;
+    scratch[q++] += y * lerp2;
+    scratch[q++] += z * lerp2;
+    return (scratch[q++] += w * lerp2);
+  };
+
+  const args = Math.max(expr1.length, expr2.length);
+
+  if (args <= 3) {
+    emitter = function (emit, x, i) {
+      p = q = r = s = 0;
+      expr1(emit1, x, i);
+      expr2(emit2, x, i);
+      const n = Math.min(r, s);
+      let l = 0;
+      return data_range_(0, n, false).map((_k) =>
+        emit(scratch[l++], scratch[l++], scratch[l++], scratch[l++])
+      );
+    };
+  } else if (args <= 5) {
+    emitter = function (emit, x, y, i, j) {
+      p = q = r = s = 0;
+      expr1(emit1, x, y, i, j);
+      expr2(emit2, x, y, i, j);
+      const n = Math.min(r, s);
+      let l = 0;
+      return data_range_(0, n, false).map((_k) =>
+        emit(scratch[l++], scratch[l++], scratch[l++], scratch[l++])
+      );
+    };
+  } else if (args <= 7) {
+    emitter = function (emit, x, y, z, i, j, k) {
+      p = q = r = s = 0;
+      expr1(emit1, x, y, z, i, j, k);
+      expr2(emit2, x, y, z, i, j, k);
+      const n = Math.min(r, s);
+      let l = 0;
+      return (() => {
+        let asc, end;
+        const result = [];
+        for (
+          k = 0, end = n, asc = 0 <= end;
+          asc ? k < end : k > end;
+          asc ? k++ : k--
+        ) {
+          result.push(
+            emit(scratch[l++], scratch[l++], scratch[l++], scratch[l++])
+          );
+        }
+        return result;
+      })();
+    };
+  } else if (args <= 9) {
+    emitter = function (emit, x, y, z, w, i, j, k, l) {
+      p = q = r = s = 0;
+      expr1(emit1, x, y, z, w, i, j, k, l);
+      expr2(emit2, x, y, z, w, i, j, k, l);
+      const n = Math.min(r, s);
+      l = 0;
+      return (() => {
+        let asc, end;
+        const result = [];
+        for (
+          k = 0, end = n, asc = 0 <= end;
+          asc ? k < end : k > end;
+          asc ? k++ : k--
+        ) {
+          result.push(
+            emit(scratch[l++], scratch[l++], scratch[l++], scratch[l++])
+          );
+        }
+        return result;
+      })();
+    };
+  } else {
+    emitter = function (emit, x, y, z, w, i, j, k, l, d, t) {
+      p = q = 0;
+      expr1(emit1, x, y, z, w, i, j, k, l, d, t);
+      expr2(emit2, x, y, z, w, i, j, k, l, d, t);
+      const n = Math.min(r, s);
+      l = 0;
+      return (() => {
+        let asc, end;
+        const result = [];
+        for (
+          k = 0, end = n, asc = 0 <= end;
+          asc ? k < end : k > end;
+          asc ? k++ : k--
+        ) {
+          result.push(
+            emit(scratch[l++], scratch[l++], scratch[l++], scratch[l++])
+          );
+        }
+        return result;
+      })();
+    };
+  }
+
+  emitter.lerp = function (f) {
+    let ref;
+    return ([lerp1, lerp2] = Array.from((ref = [1 - f, f]))), ref;
+  };
+
+  return emitter;
+};
+
+const getLerpThunk = function (data1, data2) {
+  // Get sizes
+  const n1 = getSizes(data1).reduce((a, b) => a * b);
+  const n2 = getSizes(data2).reduce((a, b) => a * b);
+  const n = Math.min(n1, n2);
+
+  // Create data thunks to copy (multi-)array
+  const thunk1 = getThunk(data1);
+  const thunk2 = getThunk(data2);
+
+  // Create scratch array
+  const scratch = new Float32Array(n);
+
+  scratch.lerp = function (f) {
+    thunk1.reset();
+    thunk2.reset();
+
+    let i = 0;
+    return (() => {
+      const result = [];
+      while (i < n) {
+        const a = thunk1();
+        const b = thunk2();
+        result.push((scratch[i++] = a + (b - a) * f));
+      }
+      return result;
+    })();
+  };
+
+  return scratch;
+};
+
+function data_range_(left, right, inclusive) {
+  const range = [];
+  const ascending = left < right;
+  const end = !inclusive ? right : ascending ? right + 1 : right - 1;
+  for (let i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {
+    range.push(i);
+  }
+  return range;
+}
+
+;// CONCATENATED MODULE: ./src/util/glsl.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+const letters = "xyzw".split("");
+
+const index = {
+  0: -1,
+  x: 0,
+  y: 1,
+  z: 2,
+  w: 3,
+};
+
+const parseOrder = function (order) {
+  if (order === "" + order) {
+    order = order.split("");
+  }
+  if (order === +order) {
+    order = [order];
+  }
+  return order;
+};
+
+const toType = function (type) {
+  if (type === +type) {
+    type = "vec" + type;
+  }
+  if (type === "vec1") {
+    type = "float";
+  }
+  return type;
+};
+
+const toFloatString = function (value) {
+  value = "" + value;
+  if (value.indexOf(".") < 0) {
+    return (value += ".0");
+  }
+};
+
+// Helper for float to byte conversion on the w axis, for readback
+const mapByte2FloatOffset = function (stretch) {
+  if (stretch == null) {
+    stretch = 4;
+  }
+  const factor = toFloatString(stretch);
+  return `\
+vec4 float2ByteIndex(vec4 xyzw, out float channelIndex) {
+  float relative = xyzw.w / ${factor};
+  float w = floor(relative);
+  channelIndex = (relative - w) * ${factor};
+  return vec4(xyzw.xyz, w);
+}\
+`;
+};
+
+// Sample data texture array
+const glsl_sample2DArray = function (textures) {
+  const divide = function (a, b) {
+    let out;
+    if (a === b) {
+      out = `\
+return texture2D(dataTextures[${a}], uv);\
+`;
+    } else {
+      const mid = Math.ceil(a + (b - a) / 2);
+      out = `\
+if (z < ${mid - 0.5}) {
+  ${divide(a, mid - 1)}
+}
+else {
+  ${divide(mid, b)}
+}\
+`;
+    }
+    return (out = out.replace(/\n/g, "\n  "));
+  };
+
+  const body = divide(0, textures - 1);
+
+  return `\
+uniform sampler2D dataTextures[${textures}];
+
+vec4 sample2DArray(vec2 uv, float z) {
+  ${body}
+}\
+`;
+};
+
+// Binary operator
+const binaryOperator = function (type, op, curry) {
+  type = toType(type);
+  if (curry != null) {
+    return `\
+${type} binaryOperator(${type} a) {
+  return a ${op} ${curry};
+}\
+`;
+  } else {
+    return `\
+${type} binaryOperator(${type} a, ${type} b) {
+  return a ${op} b;
+}\
+`;
+  }
+};
+
+// Extend to n-vector with zeroes
+const extendVec = function (from, to, value) {
+  if (value == null) {
+    value = 0;
+  }
+  if (from > to) {
+    return truncateVec(from, to);
+  }
+
+  const diff = to - from;
+
+  from = toType(from);
+  to = toType(to);
+
+  value = toFloatString(value);
+
+  const parts = glsl_range_(0, diff, true).map(function (x) {
+    if (x) {
+      return value;
+    } else {
+      return "v";
+    }
+  });
+  const ctor = parts.join(",");
+
+  return `\
+${to} extendVec(${from} v) { return ${to}(${ctor}); }\
+`;
+};
+
+// Truncate n-vector
+const truncateVec = function (from, to) {
+  if (from < to) {
+    return extendVec(from, to);
+  }
+
+  const swizzle = "." + "xyzw".substr(0, to);
+
+  from = toType(from);
+  to = toType(to);
+
+  return `\
+${to} truncateVec(${from} v) { return v${swizzle}; }\
+`;
+};
+
+// Inject float into 4-component vector
+const injectVec4 = function (order) {
+  const swizzler = ["0.0", "0.0", "0.0", "0.0"];
+
+  order = parseOrder(order);
+  order = order.map(function (v) {
+    if (v === "" + v) {
+      return index[v];
+    } else {
+      return v;
+    }
+  });
+
+  for (let i = 0; i < order.length; i++) {
+    const channel = order[i];
+    swizzler[channel] = ["a", "b", "c", "d"][i];
+  }
+
+  const mask = swizzler.slice(0, 4).join(", ");
+
+  const args = ["float a", "float b", "float c", "float d"].slice(
+    0,
+    order.length
+  );
+
+  return `\
+vec4 inject(${args}) {
+  return vec4(${mask});
+}\
+`;
+};
+
+// Apply 4-component vector swizzle
+const swizzleVec4 = function (order, size = null) {
+  const lookup = ["0.0", "xyzw.x", "xyzw.y", "xyzw.z", "xyzw.w"];
+
+  if (size == null) {
+    size = order.length;
+  }
+
+  order = parseOrder(order);
+  order = order.map(function (v) {
+    if (Array.from([0, 1, 2, 3, 4]).includes(+v)) {
+      v = +v;
+    }
+    if (v === "" + v) {
+      v = index[v] + 1;
+    }
+    return lookup[v];
+  });
+
+  while (order.length < size) {
+    order.push("0.0");
+  }
+  const mask = order.join(", ");
+
+  return `\
+vec${size} swizzle(vec4 xyzw) {
+  return vec${size}(${mask});
+}\
+`.replace(/vec1/g, "float");
+};
+
+// Invert full or truncated swizzles for pointer lookups
+const invertSwizzleVec4 = function (order) {
+  const swizzler = ["0.0", "0.0", "0.0", "0.0"];
+
+  order = parseOrder(order);
+  order = order.map(function (v) {
+    if (v === +v) {
+      return letters[v - 1];
+    } else {
+      return v;
+    }
+  });
+
+  for (let i = 0; i < order.length; i++) {
+    const letter = order[i];
+    const src = letters[i];
+    const j = index[letter];
+
+    swizzler[j] = `xyzw.${src}`;
+  }
+
+  const mask = swizzler.join(", ");
+
+  return `\
+vec4 invertSwizzle(vec4 xyzw) {
+  return vec4(${mask});
+}\
+`;
+};
+
+const identity = function (type) {
+  let args = [].slice.call(arguments);
+  if (args.length > 1) {
+    args = args.map((t, i) =>
+      ["inout", t, String.fromCharCode(97 + i)].join(" ")
+    );
+    args = args.join(", ");
+    return `\
+void identity(${args}) { }\
+`;
+  } else {
+    return `\
+${type} identity(${type} x) {
+  return x;
+}\
+`;
+  }
+};
+
+const constant = (type, value) => `\
+${type} constant() {
+return ${value};
+}\
+`;
+
+function glsl_range_(left, right, inclusive) {
+  const range = [];
+  const ascending = left < right;
+  const end = !inclusive ? right : ascending ? right + 1 : right - 1;
+  for (let i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {
+    range.push(i);
+  }
+  return range;
+}
+
+;// CONCATENATED MODULE: ./src/primitives/types/base/source.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+class Source extends Primitive {
+  static initClass() {
+    this.traits = ["node", "source", "index"];
+  }
+
+  made() {
+    // Notify of buffer reallocation
+    return this.trigger({
+      type: "source.rebuild",
+    });
+  }
+
+  indexShader(shader) {
+    return shader.pipe(identity("vec4"));
+  }
+  sourceShader(shader) {
+    return shader.pipe(identity("vec4"));
+  }
+
+  getDimensions() {
+    return {
+      items: 1,
+      width: 1,
+      height: 1,
+      depth: 1,
+    };
+  }
+
+  getActiveDimensions() {
+    return this.getDimensions();
+  }
+
+  getIndexDimensions() {
+    return this.getActiveDimensions();
+  }
+  getFutureDimensions() {
+    return this.getActiveDimensions();
+  }
+}
+Source.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/data/data.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+class data_Data extends Source {
+  static initClass() {
+    this.traits = ["node", "data", "source", "index", "entity", "active"];
+  }
+
+  init() {
+    this.dataEmitter = null;
+    return (this.dataSizes = null);
+  }
+
+  emitter(channels, items) {
+    let emitter, resolve;
+    const { data, bind, expr } = this.props;
+
+    if (data != null) {
+      // Make new emitter if data geometry doesn't match
+      const last = this.dataSizes;
+      const sizes = getSizes(data);
+
+      if (!last || last.length !== sizes.length) {
+        // Create data thunk to copy (multi-)array
+        const thunk = getThunk(data);
+        this.dataEmitter = this.callback(
+          makeEmitter(thunk, items, channels)
+        );
+        this.dataSizes = sizes;
+      }
+
+      emitter = this.dataEmitter;
+    } else if (resolve != null) {
+      // Hook up data-bound expression to its source
+      resolve = this._inherit("resolve");
+      emitter = this.callback(resolve.callback(bind));
+    } else if (expr != null) {
+      // Convert given free expression to appropriate callback
+      emitter = this.callback(expr);
+    } else {
+      // Passthrough
+      emitter = this.callback(this.passthrough);
+    }
+
+    return emitter;
+  }
+
+  callback(callback) {
+    return callback != null ? callback : function () {};
+  }
+
+  update() {}
+
+  make() {
+    this._helpers.active.make();
+
+    // Always run update at least once to prime JS VM optimization for entering elements
+    this.first = true;
+    return this._listen("root", "root.update", () => {
+      if (this.isActive || this.first) {
+        this.update();
+      }
+      return (this.first = false);
+    });
+  }
+
+  unmake() {
+    this._helpers.active.unmake();
+
+    this.dataEmitter = null;
+    return (this.dataSizes = null);
+  }
+}
+data_Data.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/data/buffer.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS202: Simplify dynamic range loops
+ * DS205: Consider reworking code to avoid use of IIFEs
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+class Buffer extends data_Data {
+  static initClass() {
+    this.traits = [
+      "node",
+      "buffer",
+      "active",
+      "data",
+      "source",
+      "index",
+      "texture",
+    ];
+  }
+
+  init() {
+    this.bufferSlack = 0;
+    this.bufferFrames = 0;
+
+    this.bufferTime = 0;
+    this.bufferDelta = 0;
+
+    this.bufferClock = 0;
+    this.bufferStep = 0;
+    super.init();
+  }
+
+  make() {
+    super.make();
+
+    return (this.clockParent = this._inherit("clock"));
+  }
+
+  unmake() {
+    return super.unmake();
+  }
+
+  rawBuffer() {
+    return this.buffer;
+  }
+
+  emitter() {
+    const { channels, items } = this.props;
+
+    return super.emitter(channels, items);
+  }
+
+  change(changed, touched, init) {
+    if (changed["buffer.fps"] || init) {
+      const { fps } = this.props;
+      return (this.bufferSlack = fps ? 0.5 / fps : 0);
+    }
+  }
+
+  syncBuffer(callback) {
+    let delta, step;
+    if (!this.buffer) {
+      return;
+    }
+    const { live, fps, hurry, limit, realtime, observe } = this.props;
+
+    const filled = this.buffer.getFilled();
+    if (!!filled && !live) {
+      return;
+    }
+
+    const time = this.clockParent.getTime();
+
+    if (fps != null) {
+      const slack = this.bufferSlack;
+      const speed = time.step / time.delta;
+      delta = realtime ? time.delta : time.step;
+      const frame = 1 / fps;
+      step = realtime && observe ? speed * frame : frame;
+
+      this.bufferSlack = Math.min(limit / fps, slack + delta);
+      this.bufferDelta = delta;
+      this.bufferStep = step;
+
+      let frames = Math.min(hurry, Math.floor(slack * fps));
+      if (!filled) {
+        frames = Math.max(1, frames);
+      }
+
+      let stop = false;
+      const abort = () => (stop = true);
+      return (() => {
+        const result = [];
+        for (
+          let i = 0, end = frames, asc = 0 <= end;
+          asc ? i < end : i > end;
+          asc ? i++ : i--
+        ) {
+          this.bufferTime += delta;
+          this.bufferClock += step;
+
+          if (stop) {
+            break;
+          }
+          callback(abort, this.bufferFrames++, i, frames);
+
+          result.push((this.bufferSlack -= frame));
+        }
+        return result;
+      })();
+    } else {
+      this.bufferTime = time.time;
+      this.bufferDelta = time.delta;
+      this.bufferClock = time.clock;
+      this.bufferStep = time.step;
+      return callback(function () {}, this.bufferFrames++, 0, 1);
+    }
+  }
+
+  alignShader(dims, shader) {
+    const { minFilter, magFilter, aligned } = this.props;
+    const mixed =
+      (dims.items > 1 && dims.width > 1) || (dims.height > 1 && dims.depth > 1);
+
+    if (aligned || !mixed) {
+      return;
+    }
+
+    const nearest =
+      minFilter === this.node.attributes["texture.minFilter"].enum.nearest &&
+      magFilter === this.node.attributes["texture.magFilter"].enum.nearest;
+
+    if (!nearest) {
+      console.warn(
+        `${this.node.toString()} - Cannot use linear min/magFilter with 3D/4D sampling`
+      );
+    }
+
+    return shader.pipe("map.xyzw.align");
+  }
+}
+Buffer.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/data/array.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+class Array_ extends Buffer {
+  static initClass() {
+    this.traits = [
+      "node",
+      "buffer",
+      "active",
+      "data",
+      "source",
+      "index",
+      "array",
+      "texture",
+      "raw",
+    ];
+  }
+
+  init() {
+    this.buffer = this.spec = null;
+
+    this.space = {
+      width: 0,
+      history: 0,
+    };
+
+    this.used = { width: 0 };
+
+    this.storage = "arrayBuffer";
+    this.passthrough = (emit, x) => emit(x, 0, 0, 0);
+
+    return super.init();
+  }
+
+  sourceShader(shader) {
+    const dims = this.getDimensions();
+    this.alignShader(dims, shader);
+    return this.buffer.shader(shader);
+  }
+
+  getDimensions() {
+    return {
+      items: this.items,
+      width: this.space.width,
+      height: this.space.history,
+      depth: 1,
+    };
+  }
+
+  getActiveDimensions() {
+    return {
+      items: this.items,
+      width: this.used.width,
+      height: this.buffer.getFilled(),
+      depth: 1,
+    };
+  }
+
+  getFutureDimensions() {
+    return {
+      items: this.items,
+      width: this.used.width,
+      height: this.space.history,
+      depth: 1,
+    };
+  }
+
+  getRawDimensions() {
+    return {
+      items: this.items,
+      width: this.space.width,
+      height: 1,
+      depth: 1,
+    };
+  }
+
+  make() {
+    super.make();
+
+    // Read sampling parameters
+    const minFilter =
+      this.minFilter != null ? this.minFilter : this.props.minFilter;
+    const magFilter =
+      this.magFilter != null ? this.magFilter : this.props.magFilter;
+    const type = this.type != null ? this.type : this.props.type;
+
+    // Read given dimensions
+    const { width } = this.props;
+    const { history } = this.props;
+    const reserve = this.props.bufferWidth;
+    const { channels } = this.props;
+    const { items } = this.props;
+
+    let dims = (this.spec = { channels, items, width });
+
+    this.items = dims.items;
+    this.channels = dims.channels;
+
+    // Init to right size if data supplied
+    const { data } = this.props;
+    dims = getDimensions(data, dims);
+
+    const { space } = this;
+    space.width = Math.max(reserve, dims.width || 1);
+    space.history = history;
+
+    // Create array buffer
+    return (this.buffer = this._renderables.make(this.storage, {
+      width: space.width,
+      history: space.history,
+      channels,
+      items,
+      minFilter,
+      magFilter,
+      type,
+    }));
+  }
+
+  unmake() {
+    super.unmake();
+    if (this.buffer) {
+      this.buffer.dispose();
+      return (this.buffer = this.spec = null);
+    }
+  }
+
+  change(changed, touched, init) {
+    if (
+      touched["texture"] ||
+      changed["history.history"] ||
+      changed["buffer.channels"] ||
+      changed["buffer.items"] ||
+      changed["array.bufferWidth"]
+    ) {
+      return this.rebuild();
+    }
+
+    if (!this.buffer) {
+      return;
+    }
+
+    if (changed["array.width"]) {
+      const { width } = this.props;
+      if (width > this.space.width) {
+        return this.rebuild();
+      }
+    }
+
+    if (
+      changed["data.map"] ||
+      changed["data.data"] ||
+      changed["data.resolve"] ||
+      changed["data.expr"] ||
+      init
+    ) {
+      return this.buffer.setCallback(this.emitter());
+    }
+  }
+
+  callback(callback) {
+    if (callback.length <= 2) {
+      return callback;
+    } else {
+      return (emit, i) => {
+        return callback(emit, i, this.bufferClock, this.bufferStep);
+      };
+    }
+  }
+
+  update() {
+    if (!this.buffer) {
+      return;
+    }
+
+    const { data } = this.props;
+    const { space, used } = this;
+    const l = used.width;
+
+    const filled = this.buffer.getFilled();
+
+    this.syncBuffer((abort) => {
+      if (data != null) {
+        const dims = getDimensions(data, this.spec);
+
+        // Grow width if needed
+        if (dims.width > space.width) {
+          abort();
+          return this.rebuild();
+        }
+
+        used.width = dims.width;
+
+        this.buffer.setActive(used.width);
+        if (typeof this.buffer.callback.rebind === "function") {
+          this.buffer.callback.rebind(data);
+        }
+        return this.buffer.update();
+      } else {
+        let width = this.spec.width || 1;
+
+        this.buffer.setActive(width);
+
+        width = this.buffer.update();
+        return (used.width = width);
+      }
+    });
+
+    if (used.width !== l || filled !== this.buffer.getFilled()) {
+      return this.trigger({
+        type: "source.resize",
+      });
+    }
+  }
+}
+Array_.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/data/interval.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+class Interval extends Array_ {
+  static initClass() {
+    this.traits = [
+      "node",
+      "buffer",
+      "active",
+      "data",
+      "source",
+      "index",
+      "texture",
+      "array",
+      "span",
+      "interval",
+      "sampler",
+      "raw",
+    ];
+  }
+
+  updateSpan() {
+    let inverse;
+    const dimension = this.props.axis;
+    let { width } = this.props;
+    const { centered } = this.props;
+    const pad = this.props.padding;
+
+    const range = this._helpers.span.get("", dimension);
+
+    width += pad * 2;
+
+    this.a = range.x;
+    const span = range.y - range.x;
+
+    if (centered) {
+      inverse = 1 / Math.max(1, width);
+      this.a += (span * inverse) / 2;
+    } else {
+      inverse = 1 / Math.max(1, width - 1);
+    }
+
+    this.b = span * inverse;
+
+    return (this.a += pad * this.b);
+  }
+
+  callback(callback) {
+    this.updateSpan();
+
+    if (this.last === callback) {
+      return this._callback;
+    }
+    this.last = callback;
+
+    if (callback.length <= 3) {
+      return (this._callback = (emit, i) => {
+        const x = this.a + this.b * i;
+        return callback(emit, x, i);
+      });
+    } else {
+      return (this._callback = (emit, i) => {
+        const x = this.a + this.b * i;
+        return callback(emit, x, i, this.bufferClock, this.bufferStep);
+      });
+    }
+  }
+
+  make() {
+    super.make();
+    this._helpers.span.make();
+    return this._listen(this, "span.range", this.updateSpan);
+  }
+
+  unmake() {
+    super.unmake();
+    return this._helpers.span.unmake();
+  }
+}
+Interval.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/data/matrix.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+class Matrix extends Buffer {
+  static initClass() {
+    this.traits = [
+      "node",
+      "buffer",
+      "active",
+      "data",
+      "source",
+      "index",
+      "texture",
+      "matrix",
+      "raw",
+    ];
+  }
+
+  init() {
+    this.buffer = this.spec = null;
+
+    this.space = {
+      width: 0,
+      height: 0,
+      history: 0,
+    };
+
+    this.used = {
+      width: 0,
+      height: 0,
+    };
+
+    this.storage = "matrixBuffer";
+    this.passthrough = (emit, x, y) => emit(x, y, 0, 0);
+
+    return super.init();
+  }
+
+  sourceShader(shader) {
+    const dims = this.getDimensions();
+    this.alignShader(dims, shader);
+    return this.buffer.shader(shader);
+  }
+
+  getDimensions() {
+    return {
+      items: this.items,
+      width: this.space.width,
+      height: this.space.height,
+      depth: this.space.history,
+    };
+  }
+
+  getActiveDimensions() {
+    return {
+      items: this.items,
+      width: this.used.width,
+      height: this.used.height,
+      depth: this.buffer.getFilled(),
+    };
+  }
+
+  getFutureDimensions() {
+    return {
+      items: this.items,
+      width: this.used.width,
+      height: this.used.height,
+      depth: this.space.history,
+    };
+  }
+
+  getRawDimensions() {
+    return {
+      items: this.items,
+      width: this.space.width,
+      height: this.space.height,
+      depth: 1,
+    };
+  }
+
+  make() {
+    super.make();
+
+    // Read sampling parameters
+    const minFilter =
+      this.minFilter != null ? this.minFilter : this.props.minFilter;
+    const magFilter =
+      this.magFilter != null ? this.magFilter : this.props.magFilter;
+    const type = this.type != null ? this.type : this.props.type;
+
+    // Read given dimensions
+    const { width } = this.props;
+    const { height } = this.props;
+    const { history } = this.props;
+    const reserveX = this.props.bufferWidth;
+    const reserveY = this.props.bufferHeight;
+    const { channels } = this.props;
+    const { items } = this.props;
+
+    let dims = (this.spec = { channels, items, width, height });
+
+    this.items = dims.items;
+    this.channels = dims.channels;
+
+    // Init to right size if data supplied
+    const { data } = this.props;
+    dims = getDimensions(data, dims);
+
+    const { space } = this;
+    space.width = Math.max(reserveX, dims.width || 1);
+    space.height = Math.max(reserveY, dims.height || 1);
+    space.history = history;
+
+    // Create matrix buffer
+    return (this.buffer = this._renderables.make(this.storage, {
+      width: space.width,
+      height: space.height,
+      history: space.history,
+      channels,
+      items,
+      minFilter,
+      magFilter,
+      type,
+    }));
+  }
+
+  unmake() {
+    super.unmake();
+    if (this.buffer) {
+      this.buffer.dispose();
+      return (this.buffer = this.spec = null);
+    }
+  }
+
+  change(changed, touched, init) {
+    if (
+      touched["texture"] ||
+      changed["matrix.history"] ||
+      changed["buffer.channels"] ||
+      changed["buffer.items"] ||
+      changed["matrix.bufferWidth"] ||
+      changed["matrix.bufferHeight"]
+    ) {
+      return this.rebuild();
+    }
+
+    if (!this.buffer) {
+      return;
+    }
+
+    if (changed["matrix.width"]) {
+      const { width } = this.props;
+      if (width > this.space.width) {
+        return this.rebuild();
+      }
+    }
+
+    if (changed["matrix.height"]) {
+      const { height } = this.props;
+      if (height > this.space.height) {
+        return this.rebuild();
+      }
+    }
+
+    if (
+      changed["data.map"] ||
+      changed["data.data"] ||
+      changed["data.resolve"] ||
+      changed["data.expr"] ||
+      init
+    ) {
+      return this.buffer.setCallback(this.emitter());
+    }
+  }
+
+  callback(callback) {
+    if (callback.length <= 3) {
+      return callback;
+    } else {
+      return (emit, i, j) => {
+        return callback(emit, i, j, this.bufferClock, this.bufferStep);
+      };
+    }
+  }
+
+  update() {
+    if (!this.buffer) {
+      return;
+    }
+
+    const { data } = this.props;
+    const { space, used } = this;
+    const w = used.width;
+    const h = used.height;
+
+    const filled = this.buffer.getFilled();
+
+    this.syncBuffer((abort) => {
+      if (data != null) {
+        const dims = getDimensions(data, this.spec);
+
+        // Grow if needed
+        if (dims.width > space.width || dims.height > space.height) {
+          abort();
+          return this.rebuild();
+        }
+
+        used.width = dims.width;
+        used.height = dims.height;
+
+        this.buffer.setActive(used.width, used.height);
+        if (typeof this.buffer.callback.rebind === "function") {
+          this.buffer.callback.rebind(data);
+        }
+        return this.buffer.update();
+      } else {
+        let _w;
+        const width = this.spec.width || 1;
+        const height = this.spec.height || 1;
+
+        this.buffer.setActive(width, height);
+
+        const length = this.buffer.update();
+
+        used.width = _w = width;
+        used.height = Math.ceil(length / _w);
+        if (used.height === 1) {
+          return (used.width = length);
+        }
+      }
+    });
+
+    if (
+      used.width !== w ||
+      used.height !== h ||
+      filled !== this.buffer.getFilled()
+    ) {
+      return this.trigger({
+        type: "source.resize",
+      });
+    }
+  }
+}
+Matrix.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/data/area.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+class Area extends Matrix {
+  static initClass() {
+    this.traits = [
+      "node",
+      "buffer",
+      "active",
+      "data",
+      "source",
+      "index",
+      "matrix",
+      "texture",
+      "raw",
+      "span:x",
+      "span:y",
+      "area",
+      "sampler:x",
+      "sampler:y",
+    ];
+  }
+
+  updateSpan() {
+    let inverseX, inverseY;
+    const dimensions = this.props.axes;
+    let { width } = this.props;
+    let { height } = this.props;
+
+    const { centeredX } = this.props;
+    const { centeredY } = this.props;
+
+    const padX = this.props.paddingX;
+    const padY = this.props.paddingY;
+
+    const rangeX = this._helpers.span.get("x.", dimensions[0]);
+    const rangeY = this._helpers.span.get("y.", dimensions[1]);
+
+    this.aX = rangeX.x;
+    this.aY = rangeY.x;
+
+    const spanX = rangeX.y - rangeX.x;
+    const spanY = rangeY.y - rangeY.x;
+
+    width += padX * 2;
+    height += padY * 2;
+
+    if (centeredX) {
+      inverseX = 1 / Math.max(1, width);
+      this.aX += (spanX * inverseX) / 2;
+    } else {
+      inverseX = 1 / Math.max(1, width - 1);
+    }
+
+    if (centeredY) {
+      inverseY = 1 / Math.max(1, height);
+      this.aY += (spanY * inverseY) / 2;
+    } else {
+      inverseY = 1 / Math.max(1, height - 1);
+    }
+
+    this.bX = spanX * inverseX;
+    this.bY = spanY * inverseY;
+
+    this.aX += padX * this.bX;
+    return (this.aY += padY * this.bY);
+  }
+
+  callback(callback) {
+    this.updateSpan();
+
+    if (this.last === callback) {
+      return this._callback;
+    }
+    this.last = callback;
+
+    if (callback.length <= 5) {
+      return (this._callback = (emit, i, j) => {
+        const x = this.aX + this.bX * i;
+        const y = this.aY + this.bY * j;
+        return callback(emit, x, y, i, j);
+      });
+    } else {
+      return (this._callback = (emit, i, j) => {
+        const x = this.aX + this.bX * i;
+        const y = this.aY + this.bY * j;
+        return callback(emit, x, y, i, j, this.bufferClock, this.bufferStep);
+      });
+    }
+  }
+
+  make() {
+    super.make();
+    this._helpers.span.make();
+    return this._listen(this, "span.range", this.updateSpan);
+  }
+
+  unmake() {
+    super.unmake();
+    return this._helpers.span.unmake();
+  }
+}
+Area.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/data/voxel.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS002: Fix invalid constructor
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+class Voxel extends Buffer {
+  constructor(...args) {
+    super(...args);
+    this.update = this.update.bind(this);
+  }
+
+  static initClass() {
+    this.traits = [
+      "node",
+      "buffer",
+      "active",
+      "data",
+      "source",
+      "index",
+      "texture",
+      "voxel",
+      "raw",
+    ];
+  }
+
+  init() {
+    this.buffer = this.spec = null;
+
+    this.space = {
+      width: 0,
+      height: 0,
+      depth: 0,
+    };
+
+    this.used = {
+      width: 0,
+      height: 0,
+      depth: 0,
+    };
+
+    this.storage = "voxelBuffer";
+    this.passthrough = (emit, x, y, z) => emit(x, y, z, 0);
+    super.init();
+  }
+
+  sourceShader(shader) {
+    const dims = this.getDimensions();
+    this.alignShader(dims, shader);
+    return this.buffer.shader(shader);
+  }
+
+  getDimensions() {
+    return {
+      items: this.items,
+      width: this.space.width,
+      height: this.space.height,
+      depth: this.space.depth,
+    };
+  }
+
+  getActiveDimensions() {
+    return {
+      items: this.items,
+      width: this.used.width,
+      height: this.used.height,
+      depth: this.used.depth * this.buffer.getFilled(),
+    };
+  }
+
+  getRawDimensions() {
+    return this.getDimensions();
+  }
+
+  make() {
+    super.make();
+
+    // Read sampling parameters
+    const minFilter =
+      this.minFilter != null ? this.minFilter : this.props.minFilter;
+    const magFilter =
+      this.magFilter != null ? this.magFilter : this.props.magFilter;
+    const type = this.type != null ? this.type : this.props.type;
+
+    // Read given dimensions
+    const { width } = this.props;
+    const { height } = this.props;
+    const { depth } = this.props;
+    const reserveX = this.props.bufferWidth;
+    const reserveY = this.props.bufferHeight;
+    const reserveZ = this.props.bufferDepth;
+    const { channels } = this.props;
+    const { items } = this.props;
+
+    let dims = (this.spec = { channels, items, width, height, depth });
+
+    this.items = dims.items;
+    this.channels = dims.channels;
+
+    // Init to right size if data supplied
+    const { data } = this.props;
+    dims = getDimensions(data, dims);
+
+    const { space } = this;
+    space.width = Math.max(reserveX, dims.width || 1);
+    space.height = Math.max(reserveY, dims.height || 1);
+    space.depth = Math.max(reserveZ, dims.depth || 1);
+
+    // Create voxel buffer
+    return (this.buffer = this._renderables.make(this.storage, {
+      width: space.width,
+      height: space.height,
+      depth: space.depth,
+      channels,
+      items,
+      minFilter,
+      magFilter,
+      type,
+    }));
+  }
+
+  unmake() {
+    super.unmake();
+    if (this.buffer) {
+      this.buffer.dispose();
+      return (this.buffer = this.spec = null);
+    }
+  }
+
+  change(changed, touched, init) {
+    if (
+      touched["texture"] ||
+      changed["buffer.channels"] ||
+      changed["buffer.items"] ||
+      changed["voxel.bufferWidth"] ||
+      changed["voxel.bufferHeight"] ||
+      changed["voxel.bufferDepth"]
+    ) {
+      return this.rebuild();
+    }
+
+    if (!this.buffer) {
+      return;
+    }
+
+    if (changed["voxel.width"]) {
+      const { width } = this.props;
+      if (width > this.space.width) {
+        return this.rebuild();
+      }
+    }
+
+    if (changed["voxel.height"]) {
+      const { height } = this.props;
+      if (height > this.space.height) {
+        return this.rebuild();
+      }
+    }
+
+    if (changed["voxel.depth"]) {
+      const { depth } = this.props;
+      if (depth > this.space.depth) {
+        return this.rebuild();
+      }
+    }
+
+    if (
+      changed["data.map"] ||
+      changed["data.data"] ||
+      changed["data.resolve"] ||
+      changed["data.expr"] ||
+      init
+    ) {
+      return this.buffer.setCallback(this.emitter());
+    }
+  }
+
+  callback(callback) {
+    if (callback.length <= 4) {
+      return callback;
+    } else {
+      return (emit, i, j, k) => {
+        return callback(emit, i, j, k, this.bufferClock, this.bufferStep);
+      };
+    }
+  }
+
+  update() {
+    if (!this.buffer) {
+      return;
+    }
+
+    const { data } = this.props;
+    const { space, used } = this;
+    const w = used.width;
+    const h = used.height;
+    const d = used.depth;
+
+    const filled = this.buffer.getFilled();
+
+    this.syncBuffer((abort) => {
+      if (data != null) {
+        const dims = getDimensions(data, this.spec);
+
+        // Grow dimensions if needed
+        if (
+          dims.width > space.width ||
+          dims.height > space.height ||
+          dims.depth > space.depth
+        ) {
+          abort();
+          return this.rebuild();
+        }
+
+        used.width = dims.width;
+        used.height = dims.height;
+        used.depth = dims.depth;
+
+        this.buffer.setActive(used.width, used.height, used.depth);
+        if (typeof this.buffer.callback.rebind === "function") {
+          this.buffer.callback.rebind(data);
+        }
+        return this.buffer.update();
+      } else {
+        let _h, _w;
+        const width = this.spec.width || 1;
+        const height = this.spec.height || 1;
+        const depth = this.spec.depth || 1;
+
+        this.buffer.setActive(width, height, depth);
+
+        const length = this.buffer.update();
+
+        used.width = _w = width;
+        used.height = _h = height;
+        used.depth = Math.ceil(length / _w / _h);
+
+        if (used.depth === 1) {
+          used.height = Math.ceil(length / _w);
+          if (used.height === 1) {
+            return (used.width = length);
+          }
+        }
+      }
+    });
+
+    if (
+      used.width !== w ||
+      used.height !== h ||
+      used.depth !== d ||
+      filled !== this.buffer.getFilled()
+    ) {
+      return this.trigger({
+        type: "source.resize",
+      });
+    }
+  }
+}
+Voxel.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/data/volume.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+class Volume extends Voxel {
+  static initClass() {
+    this.traits = [
+      "node",
+      "buffer",
+      "active",
+      "data",
+      "source",
+      "index",
+      "texture",
+      "voxel",
+      "span:x",
+      "span:y",
+      "span:z",
+      "volume",
+      "sampler:x",
+      "sampler:y",
+      "sampler:z",
+      "raw",
+    ];
+  }
+
+  updateSpan() {
+    let inverseX, inverseY, inverseZ;
+    const dimensions = this.props.axes;
+    let { width } = this.props;
+    let { height } = this.props;
+    let { depth } = this.props;
+
+    const { centeredX } = this.props;
+    const { centeredY } = this.props;
+    const { centeredZ } = this.props;
+
+    const padX = this.props.paddingX;
+    const padY = this.props.paddingY;
+    const padZ = this.props.paddingZ;
+
+    const rangeX = this._helpers.span.get("x.", dimensions[0]);
+    const rangeY = this._helpers.span.get("y.", dimensions[1]);
+    const rangeZ = this._helpers.span.get("z.", dimensions[2]);
+
+    this.aX = rangeX.x;
+    this.aY = rangeY.x;
+    this.aZ = rangeZ.x;
+
+    const spanX = rangeX.y - rangeX.x;
+    const spanY = rangeY.y - rangeY.x;
+    const spanZ = rangeZ.y - rangeZ.x;
+
+    width += padX * 2;
+    height += padY * 2;
+    depth += padZ * 2;
+
+    if (centeredX) {
+      inverseX = 1 / Math.max(1, width);
+      this.aX += (spanX * inverseX) / 2;
+    } else {
+      inverseX = 1 / Math.max(1, width - 1);
+    }
+
+    if (centeredY) {
+      inverseY = 1 / Math.max(1, height);
+      this.aY += (spanY * inverseY) / 2;
+    } else {
+      inverseY = 1 / Math.max(1, height - 1);
+    }
+
+    if (centeredZ) {
+      inverseZ = 1 / Math.max(1, depth);
+      this.aZ += (spanZ * inverseZ) / 2;
+    } else {
+      inverseZ = 1 / Math.max(1, depth - 1);
+    }
+
+    this.bX = spanX * inverseX;
+    this.bY = spanY * inverseY;
+    this.bZ = spanZ * inverseZ;
+
+    this.aX += this.bX * padX;
+    this.aY += this.bY * padY;
+    return (this.aZ += this.bZ * padY);
+  }
+
+  callback(callback) {
+    this.updateSpan();
+
+    if (this.last === callback) {
+      return this._callback;
+    }
+    this.last = callback;
+
+    if (callback.length <= 7) {
+      return (this._callback = (emit, i, j, k) => {
+        const x = this.aX + this.bX * i;
+        const y = this.aY + this.bY * j;
+        const z = this.aZ + this.bZ * k;
+        return callback(emit, x, y, z, i, j, k);
+      });
+    } else {
+      return (this._callback = (emit, i, j, k) => {
+        const x = this.aX + this.bX * i;
+        const y = this.aY + this.bY * j;
+        const z = this.aZ + this.bZ * k;
+        return callback(
+          emit,
+          x,
+          y,
+          z,
+          i,
+          j,
+          k,
+          this.bufferClock,
+          this.bufferStep
+        );
+      });
+    }
+  }
+
+  make() {
+    super.make();
+    this._helpers.span.make();
+    return this._listen(this, "span.range", this.updateSpan);
+  }
+
+  unmake() {
+    super.unmake();
+    return this._helpers.span.unmake();
+  }
+}
+Volume.initClass();
+
+;// CONCATENATED MODULE: ./src/util/axis.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+const setOrigin = function (vec, dimensions, origin) {
+  if (+dimensions === dimensions) {
+    dimensions = [dimensions];
+  }
+  const x = Array.from(dimensions).includes(1) ? 0 : origin.x;
+  const y = Array.from(dimensions).includes(2) ? 0 : origin.y;
+  const z = Array.from(dimensions).includes(3) ? 0 : origin.z;
+  const w = Array.from(dimensions).includes(4) ? 0 : origin.w;
+  return vec.set(x, y, z, w);
+};
+
+const addOrigin = (function () {
+  const v = new external_THREE_.Vector4();
+  return function (vec, dimension, origin) {
+    setOrigin(v, dimension, origin);
+    return vec.add(v);
+  };
+})();
+
+const setDimension = function (vec, dimension) {
+  const x = dimension === 1 ? 1 : 0;
+  const y = dimension === 2 ? 1 : 0;
+  const z = dimension === 3 ? 1 : 0;
+  const w = dimension === 4 ? 1 : 0;
+  return vec.set(x, y, z, w);
+};
+
+const setDimensionNormal = function (vec, dimension) {
+  const x = dimension === 1 ? 1 : 0;
+  const y = dimension === 2 ? 1 : 0;
+  const z = dimension === 3 ? 1 : 0;
+  const w = dimension === 4 ? 1 : 0;
+  return vec.set(y, z + x, w, 0);
+};
+
+const recenterAxis = (function () {
+  const axis = [0, 0];
+
+  return function (x, dx, bend, f) {
+    if (f == null) {
+      f = 0;
+    }
+    if (bend > 0) {
+      const x1 = x;
+      const x2 = x + dx;
+
+      const abs = Math.max(Math.abs(x1), Math.abs(x2));
+      const fabs = abs * f;
+
+      const min = Math.min(x1, x2);
+      const max = Math.max(x1, x2);
+
+      x = min + (-abs + fabs - min) * bend;
+      dx = max + (abs + fabs - max) * bend - x;
+    }
+
+    axis[0] = x;
+    axis[1] = dx;
+    return axis;
+  };
+})();
+
+;// CONCATENATED MODULE: ./src/primitives/types/data/scale.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+class Scale extends Source {
+  static initClass() {
+    this.traits = [
+      "node",
+      "source",
+      "index",
+      "interval",
+      "span",
+      "scale",
+      "raw",
+      "origin",
+    ];
+  }
+
+  init() {
+    return (this.used = this.space = this.scaleAxis = this.sampler = null);
+  }
+
+  rawBuffer() {
+    return this.buffer;
+  }
+
+  sourceShader(shader) {
+    return shader.pipe(this.sampler);
+  }
+
+  getDimensions() {
+    return {
+      items: 1,
+      width: this.space,
+      height: 1,
+      depth: 1,
+    };
+  }
+
+  getActiveDimensions() {
+    return {
+      items: 1,
+      width: this.used,
+      height: this.buffer.getFilled(),
+      depth: 1,
+    };
+  }
+
+  getRawDimensions() {
+    return this.getDimensions();
+  }
+
+  make() {
+    // Prepare data buffer of tick positions
+    let samples;
+    this.space = samples = this._helpers.scale.divide("");
+
+    this.buffer = this._renderables.make("dataBuffer", {
+      width: samples,
+      channels: 1,
+      items: 1,
+    });
+
+    // Prepare position shader
+    const positionUniforms = {
+      scaleAxis: this._attributes.make(this._types.vec4()),
+      scaleOffset: this._attributes.make(this._types.vec4()),
+    };
+
+    this.scaleAxis = positionUniforms.scaleAxis.value;
+    this.scaleOffset = positionUniforms.scaleOffset.value;
+
+    // Build sampler
+    const p = (this.sampler = this._shaders.shader());
+    // Require buffer sampler as callback
+    p.require(this.buffer.shader(this._shaders.shader(), 1));
+    // Shader to expand scalars to 4D vector on an axis.
+    p.pipe("scale.position", positionUniforms);
+
+    this._helpers.span.make();
+
+    // Monitor view range
+    return this._listen(this, "span.range", this.updateRanges);
+  }
+
+  unmake() {
+    this.scaleAxis = null;
+
+    return this._helpers.span.unmake();
+  }
+
+  change(changed, touched, init) {
+    if (changed["scale.divide"]) {
+      return this.rebuild();
+    }
+
+    if (
+      touched["view"] ||
+      touched["interval"] ||
+      touched["span"] ||
+      touched["scale"] ||
+      init
+    ) {
+      return this.updateRanges();
+    }
+  }
+
+  updateRanges() {
+    const { used } = this;
+
+    // Fetch range along axis
+    const { axis, origin } = this.props;
+    const range = this._helpers.span.get("", axis);
+
+    // Calculate scale along axis
+    const min = range.x;
+    const max = range.y;
+    const ticks = this._helpers.scale.generate("", this.buffer, min, max);
+
+    setDimension(this.scaleAxis, axis);
+    setOrigin(this.scaleOffset, axis, origin);
+
+    // Clip to number of ticks
+    this.used = ticks.length;
+
+    // Notify of resize
+    if (this.used !== used) {
+      return this.trigger({
+        type: "source.resize",
+      });
+    }
+  }
+}
+Scale.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/data/index.js
+
+
+
+
+
+
+
+
+;// CONCATENATED MODULE: ./src/util/js.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+// Merge multiple objects
+const merge = function () {
+  const x = {};
+  for (const obj of Array.from(arguments)) {
+    for (const k in obj) {
+      const v = obj[k];
+      x[k] = v;
+    }
+  }
+  return x;
+};
+
+const clone = (o) => JSON.parse(JSON.serialize(o));
+
+const parseQuoted = function (str) {
+  let accum = "";
+
+  const unescape = (str) => (str = str.replace(/\\/g, ""));
+  const munch = function (next) {
+    if (accum.length) {
+      list.push(unescape(accum));
+    }
+    return (accum = next != null ? next : "");
+  };
+
+  str = str.split(/(?=(?:\\.|["' ,]))/g);
+  let quote = false;
+  const list = [];
+
+  for (const chunk of Array.from(str)) {
+    const char = chunk[0];
+    const token = chunk.slice(1);
+    switch (char) {
+      case '"':
+      case "'":
+        if (quote) {
+          if (quote === char) {
+            quote = false;
+            munch(token);
+          } else {
+            accum += chunk;
+          }
+        } else {
+          if (accum !== "") {
+            throw new Error(
+              `ParseError: String \`${str}\` does not contain comma-separated quoted tokens.`
+            );
+          }
+
+          quote = char;
+          accum += token;
+        }
+        break;
+      case " ":
+      case ",":
+        if (!quote) {
+          munch(token);
+        } else {
+          accum += chunk;
+        }
+        break;
+      default:
+        accum += chunk;
+    }
+  }
+  munch();
+  return list;
+};
+
+;// CONCATENATED MODULE: ./src/primitives/types/draw/axis.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+
+class Axis extends Primitive {
+  static initClass() {
+    this.traits = [
+      "node",
+      "object",
+      "visible",
+      "style",
+      "line",
+      "axis",
+      "span",
+      "interval",
+      "arrow",
+      "position",
+      "origin",
+      "shade",
+    ];
+    this.defaults = {
+      end: true,
+      zBias: -1,
+    };
+  }
+
+  constructor(node, context, helpers) {
+    super(node, context, helpers);
+
+    this.axisPosition =
+      this.axisStep =
+      this.resolution =
+      this.line =
+      this.arrows =
+        null;
+  }
+
+  make() {
+    // Prepare position shader
+    const positionUniforms = {
+      axisPosition: this._attributes.make(this._types.vec4()),
+      axisStep: this._attributes.make(this._types.vec4()),
+    };
+
+    this.axisPosition = positionUniforms.axisPosition.value;
+    this.axisStep = positionUniforms.axisStep.value;
+
+    // Build transform chain
+    let position = this._shaders.shader();
+    position.pipe("axis.position", positionUniforms);
+    position = this._helpers.position.pipeline(position);
+
+    // Prepare bound uniforms
+    const styleUniforms = this._helpers.style.uniforms();
+    const lineUniforms = this._helpers.line.uniforms();
+    const arrowUniforms = this._helpers.arrow.uniforms();
+    const unitUniforms = this._inherit("unit").getUnitUniforms();
+
+    // Line geometry
+    const { detail } = this.props;
+    const samples = detail + 1;
+    this.resolution = 1 / detail;
+
+    // Clip start/end for terminating arrow
+    const { start, end } = this.props;
+
+    // Stroke style
+    const { stroke, join } = this.props;
+
+    // Build transition mask lookup
+    let mask = this._helpers.object.mask();
+
+    // Build fragment material lookup
+    const material = this._helpers.shade.pipeline() || false;
+
+    // Indexing by fixed or by given axis
+    const { crossed, axis } = this.props;
+    if (!crossed && mask != null && axis > 1) {
+      const swizzle = ["x000", "y000", "z000", "w000"][axis];
+      mask = this._helpers.position.swizzle(mask, swizzle);
+    }
+
+    // Make line renderable
+    const uniforms = merge(
+      arrowUniforms,
+      lineUniforms,
+      styleUniforms,
+      unitUniforms
+    );
+    this.line = this._renderables.make("line", {
+      uniforms,
+      samples,
+      position,
+      clip: start || end,
+      stroke,
+      join,
+      mask,
+      material,
+    });
+
+    // Make arrow renderables
+    this.arrows = [];
+    if (start) {
+      this.arrows.push(
+        this._renderables.make("arrow", {
+          uniforms,
+          flip: true,
+          samples,
+          position,
+          mask,
+          material,
+        })
+      );
+    }
+
+    if (end) {
+      this.arrows.push(
+        this._renderables.make("arrow", {
+          uniforms,
+          samples,
+          position,
+          mask,
+          material,
+        })
+      );
+    }
+
+    // Visible, object and span traits
+    this._helpers.visible.make();
+    this._helpers.object.make(this.arrows.concat([this.line]));
+    this._helpers.span.make();
+
+    // Monitor view range
+    return this._listen(this, "span.range", this.updateRanges);
+  }
+
+  unmake() {
+    this._helpers.visible.unmake();
+    this._helpers.object.unmake();
+    return this._helpers.span.unmake();
+  }
+
+  change(changed, touched, init) {
+    if (
+      changed["axis.detail"] ||
+      changed["line.stroke"] ||
+      changed["line.join"] ||
+      changed["axis.crossed"] ||
+      (changed["interval.axis"] && this.props.crossed)
+    ) {
+      return this.rebuild();
+    }
+
+    if (touched["interval"] || touched["span"] || touched["view"] || init) {
+      return this.updateRanges();
+    }
+  }
+
+  updateRanges() {
+    const { axis, origin } = this.props;
+
+    const range = this._helpers.span.get("", axis);
+
+    const min = range.x;
+    const max = range.y;
+
+    setDimension(this.axisPosition, axis).multiplyScalar(min);
+    setDimension(this.axisStep, axis).multiplyScalar(
+      (max - min) * this.resolution
+    );
+
+    return addOrigin(this.axisPosition, axis, origin);
+  }
+}
+Axis.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/draw/face.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+
+class Face extends Primitive {
+  static initClass() {
+    this.traits = [
+      "node",
+      "object",
+      "visible",
+      "style",
+      "line",
+      "mesh",
+      "face",
+      "geometry",
+      "position",
+      "bind",
+      "shade",
+    ];
+  }
+
+  constructor(node, context, helpers) {
+    super(node, context, helpers);
+
+    this.face = null;
+  }
+
+  resize() {
+    if (this.bind.points == null) {
+      return;
+    }
+
+    const dims = this.bind.points.getActiveDimensions();
+    const { items, width, height, depth } = dims;
+
+    if (this.face) {
+      this.face.geometry.clip(width, height, depth, items);
+    }
+    if (this.line) {
+      this.line.geometry.clip(items, width, height, depth);
+    }
+
+    if (this.bind.map != null) {
+      const map = this.bind.map.getActiveDimensions();
+      if (this.face) {
+        return this.face.geometry.map(
+          map.width,
+          map.height,
+          map.depth,
+          map.items
+        );
+      }
+    }
+  }
+
+  make() {
+    // Bind to attached data sources
+    let color, uniforms;
+    this._helpers.bind.make([
+      { to: "geometry.points", trait: "source" },
+      { to: "geometry.colors", trait: "source" },
+      { to: "mesh.map", trait: "source" },
+    ]);
+
+    if (this.bind.points == null) {
+      return;
+    }
+
+    // Fetch position and transform to view
+    let position = this.bind.points.sourceShader(this._shaders.shader());
+    position = this._helpers.position.pipeline(position);
+
+    // Prepare bound uniforms
+    const styleUniforms = this._helpers.style.uniforms();
+    const lineUniforms = this._helpers.line.uniforms();
+    const unitUniforms = this._inherit("unit").getUnitUniforms();
+
+    // Auto z-bias wireframe over surface
+    const wireUniforms = {};
+    wireUniforms.styleZBias = this._attributes.make(this._types.number());
+    this.wireZBias = wireUniforms.styleZBias;
+
+    // Fetch geometry dimensions
+    const dims = this.bind.points.getDimensions();
+    const { items, width, height, depth } = dims;
+
+    // Get display properties
+    const { line, shaded, fill, stroke, join } = this.props;
+
+    // Build color lookup
+    if (this.bind.colors) {
+      color = this._shaders.shader();
+      this.bind.colors.sourceShader(color);
+    }
+
+    // Build transition mask lookup
+    const mask = this._helpers.object.mask();
+
+    // Build texture map lookup
+    const map = this._helpers.shade.map(
+      this.bind.map != null
+        ? this.bind.map.sourceShader(this._shaders.shader())
+        : undefined
+    );
+
+    // Build fragment material lookup
+    const material = this._helpers.shade.pipeline();
+    const faceMaterial = material || shaded;
+    const lineMaterial = material || false;
+
+    const objects = [];
+
+    // Make line renderable
+    if (line) {
+      // Swizzle face edges into segments
+      const swizzle = this._shaders.shader();
+      swizzle.pipe(swizzleVec4("yzwx"));
+      swizzle.pipe(position);
+
+      uniforms = merge(
+        unitUniforms,
+        lineUniforms,
+        styleUniforms,
+        wireUniforms
+      );
+      this.line = this._renderables.make("line", {
+        uniforms,
+        samples: items,
+        strips: width,
+        ribbons: height,
+        layers: depth,
+        position: swizzle,
+        color,
+        stroke,
+        join,
+        material: lineMaterial,
+        mask,
+        closed: true,
+      });
+      objects.push(this.line);
+    }
+
+    // Make face renderable
+    if (fill) {
+      uniforms = merge(unitUniforms, styleUniforms, {});
+      this.face = this._renderables.make("face", {
+        uniforms,
+        width,
+        height,
+        depth,
+        items,
+        position,
+        color,
+        material: faceMaterial,
+        mask,
+        map,
+      });
+      objects.push(this.face);
+    }
+
+    this._helpers.visible.make();
+    return this._helpers.object.make(objects);
+  }
+
+  made() {
+    return this.resize();
+  }
+
+  unmake() {
+    this._helpers.bind.unmake();
+    this._helpers.visible.unmake();
+    this._helpers.object.unmake();
+
+    return (this.face = this.line = null);
+  }
+
+  change(changed, touched, init) {
+    if (changed["geometry.points"] || touched["mesh"]) {
+      return this.rebuild();
+    }
+
+    if (changed["style.zBias"] || changed["mesh.lineBias"] || init) {
+      const { fill, zBias, lineBias } = this.props;
+      return (this.wireZBias.value = zBias + (fill ? lineBias : 0));
+    }
+  }
+}
+Face.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/draw/grid.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS205: Consider reworking code to avoid use of IIFEs
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+
+class Grid extends Primitive {
+  static initClass() {
+    this.traits = [
+      "node",
+      "object",
+      "visible",
+      "style",
+      "line",
+      "grid",
+      "area",
+      "position",
+      "origin",
+      "shade",
+      "axis:x",
+      "axis:y",
+      "scale:x",
+      "scale:y",
+      "span:x",
+      "span:y",
+    ];
+    this.defaults = {
+      width: 1,
+      zBias: -2,
+    };
+  }
+
+  constructor(node, context, helpers) {
+    super(node, context, helpers);
+
+    this.axes = null;
+  }
+
+  make() {
+    // Build transition mask lookup
+    let axis;
+    let mask = this._helpers.object.mask();
+
+    // Build fragment material lookup
+    const material = this._helpers.shade.pipeline() || false;
+
+    axis = (first, second, transpose) => {
+      // Prepare data buffer of tick positions
+      let position;
+      const detail = this._get(first + "axis.detail");
+      const samples = detail + 1;
+      const resolution = 1 / detail;
+
+      const strips = this._helpers.scale.divide(second);
+      const buffer = this._renderables.make("dataBuffer", {
+        width: strips,
+        channels: 1,
+      });
+
+      // Prepare position shader
+      const positionUniforms = {
+        gridPosition: this._attributes.make(this._types.vec4()),
+        gridStep: this._attributes.make(this._types.vec4()),
+        gridAxis: this._attributes.make(this._types.vec4()),
+      };
+
+      const values = {
+        gridPosition: positionUniforms.gridPosition.value,
+        gridStep: positionUniforms.gridStep.value,
+        gridAxis: positionUniforms.gridAxis.value,
+      };
+
+      // Build transform chain
+      const p = (position = this._shaders.shader());
+
+      // Align second grid with first in mask space if requested
+      if (transpose != null && mask != null) {
+        mask = this._helpers.position.swizzle(mask, transpose);
+      }
+
+      // Require buffer sampler as callback
+      p.require(buffer.shader(this._shaders.shader(), 2));
+
+      // Calculate grid position
+      p.pipe("grid.position", positionUniforms);
+
+      // Apply view transform
+      position = this._helpers.position.pipeline(p);
+
+      // Prepare bound uniforms
+      const styleUniforms = this._helpers.style.uniforms();
+      const lineUniforms = this._helpers.line.uniforms();
+      const unitUniforms = this._inherit("unit").getUnitUniforms();
+      const uniforms = merge(lineUniforms, styleUniforms, unitUniforms);
+
+      // Make line renderable
+      const line = this._renderables.make("line", {
+        uniforms,
+        samples,
+        strips,
+        position,
+        stroke,
+        join,
+        mask,
+        material,
+      });
+
+      // Store axis object for manipulation later
+      return { first, second, resolution, samples, line, buffer, values };
+    };
+
+    // Generate both line sets
+    const { lineX, lineY, crossed, axes } = this.props;
+    const transpose = ["0000", "x000", "y000", "z000", "w000"][axes[1]];
+
+    // Stroke style
+    const { stroke, join } = this.props;
+
+    this.axes = [];
+    lineX && this.axes.push(axis("x.", "y.", null));
+    lineY && this.axes.push(axis("y.", "x.", crossed ? null : transpose));
+
+    // Register lines
+    const lines = (() => {
+      const result = [];
+      for (axis of this.axes) {
+        result.push(axis.line);
+      }
+      return result;
+    })();
+    this._helpers.visible.make();
+    this._helpers.object.make(lines);
+    this._helpers.span.make();
+
+    // Monitor view range
+    return this._listen(this, "span.range", this.updateRanges);
+  }
+
+  unmake() {
+    this._helpers.visible.unmake();
+    this._helpers.object.unmake();
+    this._helpers.span.unmake();
+
+    for (const axis of this.axes) {
+      axis.buffer.dispose();
+    }
+
+    this.axes = null;
+  }
+
+  change(changed, touched, init) {
+    if (
+      changed["x.axis.detail"] ||
+      changed["y.axis.detail"] ||
+      changed["x.axis.factor"] ||
+      changed["y.axis.factor"] ||
+      changed["grid.lineX"] ||
+      changed["grid.lineY"] ||
+      changed["line.stroke"] ||
+      changed["line.join"] ||
+      changed["grid.crossed"] ||
+      (changed["grid.axes"] && this.props.crossed)
+    ) {
+      return this.rebuild();
+    }
+
+    if (
+      touched["x"] ||
+      touched["y"] ||
+      touched["area"] ||
+      touched["grid"] ||
+      touched["view"] ||
+      init
+    ) {
+      return this.updateRanges();
+    }
+  }
+
+  updateRanges() {
+    const axis = (x, y, range1, range2, axis) => {
+      const { second, resolution, samples, line, buffer, values } = axis;
+
+      // Set line steps along first axis
+      let min = range1.x;
+      let max = range1.y;
+      setDimension(values.gridPosition, x).multiplyScalar(min);
+      setDimension(values.gridStep, x).multiplyScalar(
+        (max - min) * resolution
+      );
+
+      // Add origin on remaining two axes
+      addOrigin(values.gridPosition, axes, origin);
+
+      // Calculate scale along second axis
+      min = range2.x;
+      max = range2.y;
+      const ticks = this._helpers.scale.generate(second, buffer, min, max);
+      setDimension(values.gridAxis, y);
+
+      // Clip to number of ticks
+      const n = ticks.length;
+      return line.geometry.clip(samples, n, 1, 1);
+    };
+
+    // Fetch grid range in both dimensions
+    const { axes, origin } = this.props;
+    const range1 = this._helpers.span.get("x.", axes[0]);
+    const range2 = this._helpers.span.get("y.", axes[1]);
+
+    // Update both line sets
+    const { lineX, lineY } = this.props;
+
+    if (lineX) {
+      axis(axes[0], axes[1], range1, range2, this.axes[0]);
+    }
+    if (lineY) {
+      axis(axes[1], axes[0], range2, range1, this.axes[+lineX]);
+    }
+    window.cake1 = this.axes[0].buffer;
+    window.cake2 = this.axes[1].buffer;
+    window.cake3 = this.axes[0];
+  }
+}
+Grid.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/draw/line.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+class Line extends Primitive {
+  static initClass() {
+    this.traits = [
+      "node",
+      "object",
+      "visible",
+      "style",
+      "line",
+      "arrow",
+      "geometry",
+      "position",
+      "bind",
+      "shade",
+    ];
+  }
+
+  constructor(node, context, helpers) {
+    super(node, context, helpers);
+
+    this.line = this.arrows = null;
+  }
+
+  resize() {
+    if (this.bind.points == null) {
+      return;
+    }
+    const dims = this.bind.points.getActiveDimensions();
+
+    const samples = dims.width;
+    const strips = dims.height;
+    const ribbons = dims.depth;
+    const layers = dims.items;
+
+    this.line.geometry.clip(samples, strips, ribbons, layers);
+    return Array.from(this.arrows).map((arrow) =>
+      arrow.geometry.clip(samples, strips, ribbons, layers)
+    );
+  }
+
+  make() {
+    // Bind to attached data sources
+    let color;
+    this._helpers.bind.make([
+      { to: "geometry.points", trait: "source" },
+      { to: "geometry.colors", trait: "source" },
+    ]);
+
+    if (this.bind.points == null) {
+      return;
+    }
+
+    // Build transform chain
+    let position = this._shaders.shader();
+
+    // Fetch position
+    position = this.bind.points.sourceShader(position);
+
+    // Transform position to view
+    position = this._helpers.position.pipeline(position);
+
+    // Prepare bound uniforms
+    const styleUniforms = this._helpers.style.uniforms();
+    const lineUniforms = this._helpers.line.uniforms();
+    const arrowUniforms = this._helpers.arrow.uniforms();
+    const unitUniforms = this._inherit("unit").getUnitUniforms();
+
+    // Clip start/end for terminating arrow
+    const { start, end } = this.props;
+
+    // Stroke style
+    const { stroke, join, proximity } = this.props;
+    this.proximity = proximity;
+
+    // Fetch geometry dimensions
+    const dims = this.bind.points.getDimensions();
+    const samples = dims.width;
+    const strips = dims.height;
+    const ribbons = dims.depth;
+    const layers = dims.items;
+
+    // Build color lookup
+    if (this.bind.colors) {
+      color = this._shaders.shader();
+      this.bind.colors.sourceShader(color);
+    }
+
+    // Build transition mask lookup
+    const mask = this._helpers.object.mask();
+
+    // Build fragment material lookup
+    const material = this._helpers.shade.pipeline() || false;
+
+    // Make line renderable
+    const uniforms = merge(
+      arrowUniforms,
+      lineUniforms,
+      styleUniforms,
+      unitUniforms
+    );
+    this.line = this._renderables.make("line", {
+      uniforms,
+      samples,
+      strips,
+      ribbons,
+      layers,
+      position,
+      color,
+      clip: start || end,
+      stroke,
+      join,
+      proximity,
+      mask,
+      material,
+    });
+
+    // Make arrow renderables
+    this.arrows = [];
+    if (start) {
+      this.arrows.push(
+        this._renderables.make("arrow", {
+          uniforms,
+          flip: true,
+          samples,
+          strips,
+          ribbons,
+          layers,
+          position,
+          color,
+          mask,
+          material,
+        })
+      );
+    }
+
+    if (end) {
+      this.arrows.push(
+        this._renderables.make("arrow", {
+          uniforms,
+          samples,
+          strips,
+          ribbons,
+          layers,
+          position,
+          color,
+          mask,
+          material,
+        })
+      );
+    }
+
+    this._helpers.visible.make();
+    return this._helpers.object.make(this.arrows.concat([this.line]));
+  }
+
+  made() {
+    return this.resize();
+  }
+
+  unmake() {
+    this._helpers.bind.unmake();
+    this._helpers.visible.unmake();
+    this._helpers.object.unmake();
+
+    return (this.line = this.arrows = null);
+  }
+
+  change(changed, _touched, _init) {
+    if (
+      changed["geometry.points"] ||
+      changed["line.stroke"] ||
+      changed["line.join"] ||
+      changed["arrow.start"] ||
+      changed["arrow.end"]
+    ) {
+      return this.rebuild();
+    }
+
+    if (changed["line.proximity"]) {
+      if ((this.proximity != null) !== (this.props.proximity != null)) {
+        return this.rebuild();
+      }
+    }
+  }
+}
+Line.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/draw/point.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+class Point extends Primitive {
+  static initClass() {
+    this.traits = [
+      "node",
+      "object",
+      "visible",
+      "style",
+      "point",
+      "geometry",
+      "position",
+      "bind",
+      "shade",
+    ];
+  }
+
+  constructor(node, context, helpers) {
+    super(node, context, helpers);
+
+    this.point = null;
+  }
+
+  resize() {
+    if (this.bind.points == null) {
+      return;
+    }
+
+    const dims = this.bind.points.getActiveDimensions();
+    const { items, width, height, depth } = dims;
+
+    return this.point.geometry.clip(width, height, depth, items);
+  }
+
+  make() {
+    // Bind to attached data sources
+    let color, size;
+    this._helpers.bind.make([
+      { to: "geometry.points", trait: "source" },
+      { to: "geometry.colors", trait: "source" },
+      { to: "point.sizes", trait: "source" },
+    ]);
+
+    if (this.bind.points == null) {
+      return;
+    }
+
+    // Build transform chain
+    let position = this._shaders.shader();
+
+    // Fetch position and transform to view
+    position = this.bind.points.sourceShader(position);
+    position = this._helpers.position.pipeline(position);
+
+    // Fetch geometry dimensions
+    const dims = this.bind.points.getDimensions();
+    const { items, width, height, depth } = dims;
+
+    // Prepare bound uniforms
+    const styleUniforms = this._helpers.style.uniforms();
+    const pointUniforms = this._helpers.point.uniforms();
+    const unitUniforms = this._inherit("unit").getUnitUniforms();
+
+    // Build color lookup
+    if (this.bind.colors) {
+      color = this._shaders.shader();
+      this.bind.colors.sourceShader(color);
+    }
+
+    // Build size lookup
+    if (this.bind.sizes) {
+      size = this._shaders.shader();
+      this.bind.sizes.sourceShader(size);
+    }
+
+    // Build transition mask lookup
+    const mask = this._helpers.object.mask();
+
+    // Build fragment material lookup
+    const material = this._helpers.shade.pipeline() || false;
+
+    // Point style
+    const { shape } = this.props;
+    const { fill } = this.props;
+    const { optical } = this.props;
+
+    // Make point renderable
+    const uniforms = merge(unitUniforms, pointUniforms, styleUniforms);
+    this.point = this._renderables.make("point", {
+      uniforms,
+      width,
+      height,
+      depth,
+      items,
+      position,
+      color,
+      size,
+      shape,
+      optical,
+      fill,
+      mask,
+      material,
+    });
+
+    this._helpers.visible.make();
+    this._helpers.object.make([this.point]);
+  }
+
+  made() {
+    return this.resize();
+  }
+
+  unmake() {
+    this._helpers.bind.unmake();
+    this._helpers.visible.unmake();
+    this._helpers.object.unmake();
+
+    this.point = null;
+  }
+
+  change(changed, _touched, _init) {
+    if (
+      changed["geometry.points"] ||
+      changed["point.shape"] ||
+      changed["point.fill"]
+    ) {
+      return this.rebuild();
+    }
+  }
+}
+Point.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/draw/strip.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+
+class Strip extends Primitive {
+  static initClass() {
+    this.traits = [
+      "node",
+      "object",
+      "visible",
+      "style",
+      "line",
+      "mesh",
+      "strip",
+      "geometry",
+      "position",
+      "bind",
+      "shade",
+    ];
+  }
+
+  constructor(node, context, helpers) {
+    super(node, context, helpers);
+
+    this.strip = null;
+  }
+
+  resize() {
+    if (this.bind.points == null) {
+      return;
+    }
+
+    const dims = this.bind.points.getActiveDimensions();
+    const { items, width, height, depth } = dims;
+
+    if (this.strip) {
+      this.strip.geometry.clip(width, height, depth, items);
+    }
+    if (this.line) {
+      this.line.geometry.clip(items, width, height, depth);
+    }
+
+    if (this.bind.map != null) {
+      const map = this.bind.map.getActiveDimensions();
+      if (this.strip) {
+        return this.strip.geometry.map(
+          map.width,
+          map.height,
+          map.depth,
+          map.items
+        );
+      }
+    }
+  }
+
+  make() {
+    // Bind to attached data sources
+    let color, uniforms;
+    this._helpers.bind.make([
+      { to: "geometry.points", trait: "source" },
+      { to: "geometry.colors", trait: "source" },
+      { to: "mesh.map", trait: "source" },
+    ]);
+
+    if (this.bind.points == null) {
+      return;
+    }
+
+    // Build transform chain
+    let position = this._shaders.shader();
+
+    // Fetch position
+    position = this.bind.points.sourceShader(position);
+
+    // Transform position to view
+    position = this._helpers.position.pipeline(position);
+
+    // Prepare bound uniforms
+    const styleUniforms = this._helpers.style.uniforms();
+    const lineUniforms = this._helpers.line.uniforms();
+    const unitUniforms = this._inherit("unit").getUnitUniforms();
+
+    // Get display properties
+    const { line, shaded, fill, stroke, join } = this.props;
+
+    // Auto z-bias wireframe over surface
+    const wireUniforms = {};
+    wireUniforms.styleZBias = this._attributes.make(this._types.number());
+    this.wireZBias = wireUniforms.styleZBias;
+
+    // Fetch geometry dimensions
+    const dims = this.bind.points.getDimensions();
+    const { items, width, height, depth } = dims;
+
+    // Build color lookup
+    if (this.bind.colors) {
+      color = this._shaders.shader();
+      color = this.bind.colors.sourceShader(color);
+    }
+
+    // Build transition mask lookup
+    const mask = this._helpers.object.mask();
+
+    // Build texture map lookup
+    this._helpers.shade.map(
+      this.bind.map != null
+        ? this.bind.map.sourceShader(this._shaders.shader())
+        : undefined
+    );
+
+    // Build fragment material lookup
+    const material = this._helpers.shade.pipeline();
+    const faceMaterial = material || shaded;
+    const lineMaterial = material || false;
+
+    const objects = [];
+
+    // Make line renderable
+    if (line) {
+      // Swizzle strip edges into segments
+      const swizzle = this._shaders.shader();
+      swizzle.pipe(swizzleVec4("yzwx"));
+      swizzle.pipe(position);
+
+      uniforms = merge(
+        unitUniforms,
+        lineUniforms,
+        styleUniforms,
+        wireUniforms
+      );
+
+      this.line = this._renderables.make("line", {
+        uniforms,
+        samples: items,
+        strips: width,
+        ribbons: height,
+        layers: depth,
+        position: swizzle,
+        color,
+        stroke,
+        join,
+        mask,
+        material: lineMaterial,
+      });
+
+      objects.push(this.line);
+    }
+
+    // Make strip renderable
+    if (fill) {
+      uniforms = merge(styleUniforms, {});
+
+      this.strip = this._renderables.make("strip", {
+        uniforms,
+        width,
+        height,
+        depth,
+        items,
+        position,
+        color,
+        material: faceMaterial,
+      });
+      objects.push(this.strip);
+    }
+
+    this._helpers.visible.make();
+    return this._helpers.object.make(objects);
+  }
+
+  made() {
+    return this.resize();
+  }
+
+  unmake() {
+    this._helpers.bind.unmake();
+    this._helpers.visible.unmake();
+    this._helpers.object.unmake();
+
+    return (this.strip = null);
+  }
+
+  change(changed, touched, init) {
+    if (changed["geometry.points"] || touched["mesh"]) {
+      return this.rebuild();
+    }
+
+    if (changed["style.zBias"] || changed["mesh.lineBias"] || init) {
+      const { fill, zBias, lineBias } = this.props;
+      return (this.wireZBias.value = zBias + (fill ? lineBias : 0));
+    }
+  }
+}
+Strip.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/draw/surface.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+
+class Surface extends Primitive {
+  static initClass() {
+    this.traits = [
+      "node",
+      "object",
+      "visible",
+      "style",
+      "line",
+      "mesh",
+      "geometry",
+      "surface",
+      "position",
+      "grid",
+      "bind",
+      "shade",
+    ];
+    this.defaults = {
+      lineX: false,
+      lineY: false,
+    };
+  }
+
+  constructor(node, context, helpers) {
+    super(node, context, helpers);
+
+    this.lineX = this.lineY = this.surface = null;
+  }
+
+  resize() {
+    if (this.bind.points == null) {
+      return;
+    }
+
+    const dims = this.bind.points.getActiveDimensions();
+    const { width, height, depth, items } = dims;
+
+    if (this.surface) {
+      this.surface.geometry.clip(width, height, depth, items);
+    }
+    if (this.lineX) {
+      this.lineX.geometry.clip(width, height, depth, items);
+    }
+    if (this.lineY) {
+      this.lineY.geometry.clip(height, width, depth, items);
+    }
+
+    if (this.bind.map != null) {
+      const map = this.bind.map.getActiveDimensions();
+      if (this.surface) {
+        return this.surface.geometry.map(
+          map.width,
+          map.height,
+          map.depth,
+          map.items
+        );
+      }
+    }
+  }
+
+  make() {
+    // Bind to attached data sources
+    let color;
+    this._helpers.bind.make([
+      { to: "geometry.points", trait: "source" },
+      { to: "geometry.colors", trait: "source" },
+      { to: "mesh.map", trait: "source" },
+    ]);
+
+    if (this.bind.points == null) {
+      return;
+    }
+
+    // Build transform chain
+    let position = this._shaders.shader();
+
+    // Fetch position and transform to view
+    position = this.bind.points.sourceShader(position);
+    position = this._helpers.position.pipeline(position);
+
+    // Prepare bound uniforms
+    const styleUniforms = this._helpers.style.uniforms();
+    const wireUniforms = this._helpers.style.uniforms();
+    const lineUniforms = this._helpers.line.uniforms();
+    const surfaceUniforms = this._helpers.surface.uniforms();
+    const unitUniforms = this._inherit("unit").getUnitUniforms();
+
+    // Darken wireframe if needed for contrast
+    // Auto z-bias wireframe over surface
+    wireUniforms.styleColor = this._attributes.make(this._types.color());
+    wireUniforms.styleZBias = this._attributes.make(this._types.number());
+    this.wireColor = wireUniforms.styleColor.value;
+    this.wireZBias = wireUniforms.styleZBias;
+    this.wireScratch = new external_THREE_.Color();
+
+    // Fetch geometry dimensions
+    const dims = this.bind.points.getDimensions();
+    const { width, height, depth, items } = dims;
+
+    // Get display properties
+    const {
+      shaded,
+      fill,
+      lineX,
+      lineY,
+      closedX,
+      closedY,
+      stroke,
+      join,
+      proximity,
+      crossed,
+    } = this.props;
+    const objects = [];
+    this.proximity = proximity;
+
+    // Build color lookup
+    if (this.bind.colors) {
+      color = this._shaders.shader();
+      this.bind.colors.sourceShader(color);
+    }
+
+    // Build transition mask lookup
+    const mask = this._helpers.object.mask();
+
+    // Build texture map lookup
+    const map = this._helpers.shade.map(
+      this.bind.map != null
+        ? this.bind.map.sourceShader(this._shaders.shader())
+        : undefined
+    );
+
+    // Build fragment material lookup
+    const material = this._helpers.shade.pipeline();
+    const faceMaterial = material || shaded;
+    const lineMaterial = material || false;
+
+    // Make line and surface renderables
+    const { swizzle, swizzle2 } = this._helpers.position;
+    let uniforms = merge(
+      unitUniforms,
+      lineUniforms,
+      styleUniforms,
+      wireUniforms
+    );
+    const zUnits = lineX || lineY ? -50 : 0;
+    if (lineX) {
+      this.lineX = this._renderables.make("line", {
+        uniforms,
+        samples: width,
+        strips: height,
+        ribbons: depth,
+        layers: items,
+        position,
+        color,
+        zUnits: -zUnits,
+        stroke,
+        join,
+        mask,
+        material: lineMaterial,
+        proximity,
+        closed: closedX || closed,
+      });
+      objects.push(this.lineX);
+    }
+
+    if (lineY) {
+      this.lineY = this._renderables.make("line", {
+        uniforms,
+        samples: height,
+        strips: width,
+        ribbons: depth,
+        layers: items,
+        position: swizzle2(position, "yxzw", "yxzw"),
+        color: swizzle(color, "yxzw"),
+        zUnits: -zUnits,
+        stroke,
+        join,
+        mask: swizzle(mask, crossed ? "xyzw" : "yxzw"),
+        material: lineMaterial,
+        proximity,
+        closed: closedY || closed,
+      });
+      objects.push(this.lineY);
+    }
+
+    if (fill) {
+      uniforms = merge(unitUniforms, surfaceUniforms, styleUniforms);
+      this.surface = this._renderables.make("surface", {
+        uniforms,
+        width,
+        height,
+        surfaces: depth,
+        layers: items,
+        position,
+        color,
+        zUnits,
+        stroke,
+        material: faceMaterial,
+        mask,
+        map,
+        intUV: true,
+        closedX: closedX || closed,
+        closedY: closedY || closed,
+      });
+      objects.push(this.surface);
+    }
+
+    this._helpers.visible.make();
+    return this._helpers.object.make(objects);
+  }
+
+  made() {
+    return this.resize();
+  }
+
+  unmake() {
+    this._helpers.bind.unmake();
+    this._helpers.visible.unmake();
+    this._helpers.object.unmake();
+
+    return (this.lineX = this.lineY = this.surface = null);
+  }
+
+  _convertGammaToLinear(color, gammaFactor = 2.0) {
+    color.r = Math.pow(color.r, gammaFactor);
+    color.g = Math.pow(color.g, gammaFactor);
+    color.b = Math.pow(color.b, gammaFactor);
+
+    return color;
+  }
+
+  _convertLinearToGamma(color, gammaFactor = 2.0) {
+    const safeInverse = gammaFactor > 0 ? 1.0 / gammaFactor : 1.0;
+
+    color.r = Math.pow(color.r, safeInverse);
+    color.g = Math.pow(color.g, safeInverse);
+    color.b = Math.pow(color.b, safeInverse);
+
+    return color;
+  }
+
+  change(changed, touched, init) {
+    if (
+      changed["geometry.points"] ||
+      changed["mesh.shaded"] ||
+      changed["mesh.fill"] ||
+      changed["line.stroke"] ||
+      changed["line.join"] ||
+      touched["grid"]
+    ) {
+      return this.rebuild();
+    }
+
+    if (
+      changed["style.color"] ||
+      changed["style.zBias"] ||
+      changed["mesh.fill"] ||
+      changed["mesh.lineBias"] ||
+      init
+    ) {
+      const { fill, color, zBias, lineBias } = this.props;
+
+      this.wireZBias.value = zBias + (fill ? lineBias : 0);
+      this.wireColor.copy(color);
+      if (fill) {
+        const c = this.wireScratch;
+        c.setRGB(color.x, color.y, color.z);
+        this._convertLinearToGamma(
+          this._convertGammaToLinear(c).multiplyScalar(0.75)
+        );
+        this.wireColor.x = c.r;
+        this.wireColor.y = c.g;
+        this.wireColor.z = c.b;
+      }
+    }
+
+    if (changed["line.proximity"]) {
+      if ((this.proximity != null) !== (this.props.proximity != null)) {
+        return this.rebuild();
+      }
+    }
+  }
+}
+Surface.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/draw/ticks.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+class Ticks extends Primitive {
+  static initClass() {
+    this.traits = [
+      "node",
+      "object",
+      "visible",
+      "style",
+      "line",
+      "ticks",
+      "geometry",
+      "position",
+      "bind",
+      "shade",
+    ];
+  }
+
+  init() {
+    return (this.tickStrip = this.line = null);
+  }
+
+  resize() {
+    if (this.bind.points == null) {
+      return;
+    }
+    const dims = this.bind.points.getActiveDimensions();
+
+    const active = +(dims.items > 0);
+    const strips = dims.width * active;
+    const ribbons = dims.height * active;
+    const layers = dims.depth * active;
+
+    this.line.geometry.clip(2, strips, ribbons, layers);
+    return this.tickStrip.set(0, strips - 1);
+  }
+
+  make() {
+    // Bind to attached data sources
+    let color, position;
+    this._helpers.bind.make([
+      { to: "geometry.points", trait: "source" },
+      { to: "geometry.colors", trait: "source" },
+    ]);
+
+    if (this.bind.points == null) {
+      return;
+    }
+
+    // Prepare bound uniforms
+    const styleUniforms = this._helpers.style.uniforms();
+    const lineUniforms = this._helpers.line.uniforms();
+    const unitUniforms = this._inherit("unit").getUnitUniforms();
+    const uniforms = merge(lineUniforms, styleUniforms, unitUniforms);
+
+    // Prepare position shader
+    const positionUniforms = {
+      tickEpsilon: this.node.attributes["ticks.epsilon"],
+      tickSize: this.node.attributes["ticks.size"],
+      tickNormal: this.node.attributes["ticks.normal"],
+      tickStrip: this._attributes.make(this._types.vec2(0, 0)),
+      worldUnit: uniforms.worldUnit,
+      focusDepth: uniforms.focusDepth,
+    };
+
+    this.tickStrip = positionUniforms.tickStrip.value;
+
+    // Build transform chain
+    const p = (position = this._shaders.shader());
+
+    // Require buffer sampler as callback
+    p.require(this.bind.points.sourceShader(this._shaders.shader()));
+
+    // Require view transform as callback
+    p.require(this._helpers.position.pipeline(this._shaders.shader()));
+
+    // Link to tick shader
+    p.pipe("ticks.position", positionUniforms);
+
+    // Stroke style
+    const { stroke, join } = this.props;
+
+    // Fetch geometry dimensions
+    const dims = this.bind.points.getDimensions();
+    const strips = dims.width;
+    const ribbons = dims.height;
+    const layers = dims.depth;
+
+    // Build color lookup
+    if (this.bind.colors) {
+      color = this._shaders.shader();
+      this.bind.colors.sourceShader(color);
+    }
+
+    // Build transition mask lookup
+    const mask = this._helpers.object.mask();
+
+    // Build fragment material lookup
+    const material = this._helpers.shade.pipeline() || false;
+
+    // Make line renderable
+    const { swizzle } = this._helpers.position;
+    this.line = this._renderables.make("line", {
+      uniforms,
+      samples: 2,
+      strips,
+      ribbons,
+      layers,
+      position,
+      color,
+      stroke,
+      join,
+      mask: swizzle(mask, "yzwx"),
+      material,
+    });
+
+    this._helpers.visible.make();
+    return this._helpers.object.make([this.line]);
+  }
+
+  made() {
+    return this.resize();
+  }
+
+  unmake() {
+    this.line = null;
+
+    this._helpers.visible.unmake();
+    return this._helpers.object.unmake();
+  }
+
+  change(changed, _touched, _init) {
+    if (
+      changed["geometry.points"] ||
+      changed["line.stroke"] ||
+      changed["line.join"]
+    ) {
+      return this.rebuild();
+    }
+  }
+}
+Ticks.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/draw/vector.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+class Vector extends Primitive {
+  static initClass() {
+    this.traits = [
+      "node",
+      "object",
+      "visible",
+      "style",
+      "line",
+      "arrow",
+      "geometry",
+      "position",
+      "bind",
+      "shade",
+    ];
+  }
+
+  constructor(node, context, helpers) {
+    super(node, context, helpers);
+
+    this.line = this.arrows = null;
+  }
+
+  resize() {
+    if (this.bind.points == null) {
+      return;
+    }
+    const dims = this.bind.points.getActiveDimensions();
+
+    const samples = dims.items;
+    const strips = dims.width;
+    const ribbons = dims.height;
+    const layers = dims.depth;
+
+    this.line.geometry.clip(samples, strips, ribbons, layers);
+    return Array.from(this.arrows).map((arrow) =>
+      arrow.geometry.clip(samples, strips, ribbons, layers)
+    );
+  }
+
+  make() {
+    // Bind to attached data sources
+    let color;
+    this._helpers.bind.make([
+      { to: "geometry.points", trait: "source" },
+      { to: "geometry.colors", trait: "source" },
+    ]);
+
+    if (this.bind.points == null) {
+      return;
+    }
+
+    // Build transform chain
+    let position = this._shaders.shader();
+
+    // Fetch position
+    this.bind.points.sourceShader(position);
+
+    // Transform position to view
+    this._helpers.position.pipeline(position);
+
+    // Prepare bound uniforms
+    const styleUniforms = this._helpers.style.uniforms();
+    const lineUniforms = this._helpers.line.uniforms();
+    const arrowUniforms = this._helpers.arrow.uniforms();
+    const unitUniforms = this._inherit("unit").getUnitUniforms();
+
+    // Clip start/end for terminating arrow
+    const { start, end } = this.props;
+
+    // Stroke style
+    const { stroke, join, proximity } = this.props;
+    this.proximity = proximity;
+
+    // Fetch geometry dimensions
+    const dims = this.bind.points.getDimensions();
+    const samples = dims.items;
+    const strips = dims.width;
+    const ribbons = dims.height;
+    const layers = dims.depth;
+
+    // Build color lookup
+    if (this.bind.colors) {
+      color = this._shaders.shader();
+      this.bind.colors.sourceShader(color);
+    }
+
+    // Build transition mask lookup
+    let mask = this._helpers.object.mask();
+
+    // Build fragment material lookup
+    let material = this._helpers.shade.pipeline() || false;
+
+    // Swizzle vector to line
+    const { swizzle, swizzle2 } = this._helpers.position;
+    position = swizzle2(position, "yzwx", "yzwx");
+    color = swizzle(color, "yzwx");
+    mask = swizzle(mask, "yzwx");
+    material = swizzle(material, "yzwx");
+
+    // Make line renderable
+    const uniforms = merge(
+      arrowUniforms,
+      lineUniforms,
+      styleUniforms,
+      unitUniforms
+    );
+    this.line = this._renderables.make("line", {
+      uniforms,
+      samples,
+      ribbons,
+      strips,
+      layers,
+      position,
+      color,
+      clip: start || end,
+      stroke,
+      join,
+      proximity,
+      mask,
+      material,
+    });
+
+    // Make arrow renderables
+    this.arrows = [];
+    if (start) {
+      this.arrows.push(
+        this._renderables.make("arrow", {
+          uniforms,
+          flip: true,
+          samples,
+          ribbons,
+          strips,
+          layers,
+          position,
+          color,
+          mask,
+          material,
+        })
+      );
+    }
+
+    if (end) {
+      this.arrows.push(
+        this._renderables.make("arrow", {
+          uniforms,
+          samples,
+          ribbons,
+          strips,
+          layers,
+          position,
+          color,
+          mask,
+          material,
+        })
+      );
+    }
+
+    this._helpers.visible.make();
+    return this._helpers.object.make(this.arrows.concat([this.line]));
+  }
+
+  made() {
+    return this.resize();
+  }
+
+  unmake() {
+    this._helpers.bind.unmake();
+    this._helpers.visible.unmake();
+    this._helpers.object.unmake();
+
+    return (this.line = this.arrows = null);
+  }
+
+  change(changed, _touched, _init) {
+    if (
+      changed["geometry.points"] ||
+      changed["line.stroke"] ||
+      changed["line.join"] ||
+      changed["arrow.start"] ||
+      changed["arrow.end"]
+    ) {
+      return this.rebuild();
+    }
+
+    if (changed["line.proximity"]) {
+      if ((this.proximity != null) !== (this.props.proximity != null)) {
+        return this.rebuild();
+      }
+    }
+  }
+}
+Vector.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/draw/index.js
+
+
+
+
+
+
+
+
+
+
+;// CONCATENATED MODULE: ./src/primitives/types/overlay/html.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+class HTML extends Voxel {
+  static initClass() {
+    this.traits = ["node", "buffer", "active", "data", "voxel", "html"];
+    this.finals = { channels: 1 };
+  }
+
+  init() {
+    super.init();
+    this.storage = "pushBuffer";
+  }
+
+  make() {
+    super.make();
+
+    // Get our own size
+    const { items, width, height, depth } = this.getDimensions();
+
+    // Prepare DOM element factory
+    this.dom = this._overlays.make("dom");
+    return this.dom.hint(items * width * height * depth);
+  }
+
+  unmake() {
+    super.unmake();
+    if (this.dom != null) {
+      this.dom.dispose();
+      return (this.dom = null);
+    }
+  }
+
+  update() {
+    return super.update();
+  }
+
+  change(changed, touched, init) {
+    if (touched["html"]) {
+      return this.rebuild();
+    }
+    return super.change(changed, touched, init);
+  }
+
+  nodes() {
+    return this.buffer.read();
+  }
+
+  callback(callback) {
+    const { el } = this.dom;
+
+    if (callback.length <= 6) {
+      return (emit, i, j, k, l) => callback(emit, el, i, j, k, l);
+    } else {
+      return (emit, i, j, k, l) => {
+        return callback(
+          emit,
+          el,
+          i,
+          j,
+          k,
+          l,
+          this.bufferClock,
+          this.bufferStep
+        );
+      };
+    }
+  }
+}
+HTML.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/overlay/dom.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+class dom_DOM extends Primitive {
+  static initClass() {
+    this.traits = [
+      "node",
+      "bind",
+      "object",
+      "visible",
+      "overlay",
+      "dom",
+      "attach",
+      "position",
+    ];
+  }
+
+  init() {
+    this.emitter = this.root = null;
+    this.active = {};
+  }
+
+  make() {
+    super.make();
+
+    // Bind to attached objects
+    this._helpers.bind.make([
+      { to: "dom.html", trait: "html" },
+      { to: "dom.points", trait: "source" },
+    ]);
+
+    if (this.bind.points == null || this.bind.html == null) {
+      return;
+    }
+
+    // Listen for updates
+    this.root = this._inherit("root");
+    this._listen("root", "root.update", this.update);
+    this._listen("root", "root.post", this.post);
+
+    // Fetch geometry dimensions
+    const pointDims = this.bind.points.getDimensions();
+    const htmlDims = this.bind.html.getDimensions();
+
+    const items = Math.min(pointDims.items, htmlDims.items);
+    const width = Math.min(pointDims.width, htmlDims.width);
+    const height = Math.min(pointDims.height, htmlDims.height);
+    const depth = Math.min(pointDims.depth, htmlDims.depth);
+
+    // Build shader to sample position data
+    let position = this.bind.points.sourceShader(this._shaders.shader());
+
+    // Transform data into screen space
+    position = this._helpers.position.pipeline(position);
+
+    // Apply global projection
+    const projection = this._shaders.shader({ globals: ["projectionMatrix"] });
+    projection.pipe("project.readback");
+    position.pipe(projection);
+
+    // Build nop index shader
+    const indexer = this._shaders.shader();
+
+    // Prepare readback/memo RTT
+    this.readback = this._renderables.make("readback", {
+      map: position,
+      indexer,
+      items,
+      width,
+      height,
+      depth,
+      channels: 4,
+      stpq: true,
+    });
+
+    // Prepare overlay container VDOM
+    this.dom = this._overlays.make("dom");
+    this.dom.hint(items * width * height * depth * 2);
+    // Make sure we have enough for wrapping each given element once
+
+    // Prepare readback consumer
+    this.emitter = this.callback(this.bind.html.nodes());
+    this.readback.setCallback(this.emitter);
+
+    this._helpers.visible.make();
+  }
+
+  unmake() {
+    if (this.readback != null) {
+      this.readback.dispose();
+      this.dom.dispose();
+      this.readback = this.dom = null;
+
+      this.root = null;
+      this.emitter = null;
+      this.active = {};
+    }
+
+    this._helpers.bind.unmake();
+    this._helpers.visible.unmake();
+  }
+
+  update() {
+    if (this.readback == null) {
+      return;
+    }
+    if (this.props.visible) {
+      this.readback.update(
+        this.root != null ? this.root.getCamera() : undefined
+      );
+      this.readback.post();
+      this.readback.iterate();
+    }
+  }
+
+  post() {
+    if (this.readback == null) {
+      return;
+    }
+    this.dom.render(this.isVisible ? this.emitter.nodes() : null);
+  }
+
+  callback(data) {
+    // Create static consumer for the readback
+    let strideJ, strideK;
+    const uniforms = this._inherit("unit").getUnitUniforms();
+    const width = uniforms.viewWidth;
+    const height = uniforms.viewHeight;
+
+    const attr = this.node.attributes["dom.attributes"];
+    const size = this.node.attributes["dom.size"];
+    const zoom = this.node.attributes["dom.zoom"];
+    const color = this.node.attributes["dom.color"];
+    const outline = this.node.attributes["dom.outline"];
+    const pointer = this.node.attributes["dom.pointerEvents"];
+    const opacity = this.node.attributes["overlay.opacity"];
+    const zIndex = this.node.attributes["overlay.zIndex"];
+    const offset = this.node.attributes["attach.offset"];
+    const depth = this.node.attributes["attach.depth"];
+    const snap = this.node.attributes["attach.snap"];
+    const { el } = this.dom;
+
+    let nodes = [];
+    let styles = null;
+    let className = null;
+
+    let strideI = (strideJ = strideK = 0);
+    let colorString = "";
+
+    const f = function (x, y, z, w, i, j, k, l) {
+      // Get HTML item by offset
+      let v;
+      const index = l + strideI * i + strideJ * j + strideK * k;
+      const children = data[index];
+
+      // Clip behind camera or when invisible
+      const clip = w < 0;
+
+      // Depth blending
+      const iw = 1 / w;
+      const flatZ = 1 + (iw - 1) * depth.value;
+      const scale = clip ? 0 : flatZ;
+
+      // GL to CSS coordinate transform
+      const ox = +offset.value.x * scale;
+      const oy = +offset.value.y * scale;
+      let xx = (x + 1) * width.value * 0.5 + ox;
+      let yy = (y - 1) * height.value * 0.5 + oy;
+
+      // Handle zoom/scale
+      xx /= zoom.value;
+      yy /= zoom.value;
+
+      // Snap to pixel
+      if (snap.value) {
+        xx = Math.round(xx);
+        yy = Math.round(yy);
+      }
+
+      // Clip and apply opacity
+      const alpha = Math.min(0.999, clip ? 0 : opacity.value);
+
+      // Generate div
+      const props = {
+        className,
+        style: {
+          transform: `translate3d(${xx}px, ${-yy}px, ${
+            1 - w
+          }px) translate(-50%, -50%) scale(${scale},${scale})`,
+          opacity: alpha,
+        },
+      };
+      for (k in styles) {
+        v = styles[k];
+        props.style[k] = v;
+      }
+
+      // Merge in external attributes
+      const a = attr.value;
+      if (a != null) {
+        const s = a.style;
+        for (k in a) {
+          v = a[k];
+          if (!["style", "className"].includes(k)) {
+            props[k] = v;
+          }
+        }
+        if (s != null) {
+          for (k in s) {
+            v = s[k];
+            props.style[k] = v;
+          }
+        }
+      }
+      props.className +=
+        " " +
+        ((a != null ? a.className : undefined) != null
+          ? a != null
+            ? a.className
+            : undefined
+          : "mathbox-label");
+
+      // Push node onto list
+      return nodes.push(el("div", props, children));
+    };
+
+    f.reset = () => {
+      nodes = [];
+      [strideI, strideJ, strideK] = Array.from([
+        this.strideI,
+        this.strideJ,
+        this.strideK,
+      ]);
+
+      const c = color.value;
+      const m = (x) => Math.floor(x * 255);
+      colorString = c ? `rgb(${[m(c.x), m(c.y), m(c.z)]})` : "";
+
+      className = `mathbox-outline-${Math.round(outline.value)}`;
+      styles = {};
+      if (c) {
+        styles.color = colorString;
+      }
+      styles.fontSize = `${size.value}px`;
+      if (zoom.value !== 1) {
+        styles.zoom = zoom.value;
+      }
+      if (zIndex.value > 0) {
+        styles.zIndex = zIndex.value;
+      }
+      if (pointer.value) {
+        return (styles.pointerEvents = "auto");
+      }
+    };
+
+    f.nodes = () => nodes;
+    return f;
+  }
+
+  resize() {
+    let sI, sJ;
+    if (this.readback == null) {
+      return;
+    }
+
+    // Fetch geometry/html dimensions
+    const pointDims = this.bind.points.getActiveDimensions();
+    const htmlDims = this.bind.html.getActiveDimensions();
+
+    const items = Math.min(pointDims.items, htmlDims.items);
+    const width = Math.min(pointDims.width, htmlDims.width);
+    const height = Math.min(pointDims.height, htmlDims.height);
+    const depth = Math.min(pointDims.depth, htmlDims.depth);
+
+    // Limit readback to active area
+    this.readback.setActive(items, width, height, depth);
+
+    // Recalculate iteration strides
+    this.strideI = sI = htmlDims.items;
+    this.strideJ = sJ = sI * htmlDims.width;
+    this.strideK = sJ * htmlDims.height;
+  }
+
+  change(changed, _touched, _init) {
+    if (changed["dom.html"] || changed["dom.points"]) {
+      return this.rebuild();
+    }
+  }
+}
+dom_DOM.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/overlay/index.js
+
+
+
+;// CONCATENATED MODULE: ./src/primitives/types/text/text.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+
+
+
+class Text extends Voxel {
+  static initClass() {
+    this.traits = [
+      "node",
+      "buffer",
+      "active",
+      "data",
+      "texture",
+      "voxel",
+      "text",
+      "font",
+    ];
+    this.defaults = {
+      minFilter: "linear",
+      magFilter: "linear",
+    };
+    this.finals = { channels: 1 };
+  }
+
+  init() {
+    super.init();
+    return (this.atlas = null);
+  }
+
+  textShader(shader) {
+    return this.atlas.shader(shader);
+  }
+
+  textIsSDF() {
+    return this.props.sdf > 0;
+  }
+  textHeight() {
+    return this.props.detail;
+  }
+
+  make() {
+    // Read sampling parameters
+    let { minFilter, magFilter, type } = this.props;
+
+    // Read font parameters
+    const { font, style, variant, weight, detail, sdf } = this.props;
+
+    // Prepare text atlas
+    this.atlas = this._renderables.make("textAtlas", {
+      font,
+      size: detail,
+      style,
+      variant,
+      weight,
+      outline: sdf,
+      minFilter,
+      magFilter,
+      type,
+    });
+
+    // Underlying data buffer needs no filtering
+    this.minFilter = external_THREE_.NearestFilter;
+    this.magFilter = external_THREE_.NearestFilter;
+    this.type = external_THREE_.FloatType;
+
+    // Skip voxel::make(), as we need 4 channels internally in our buffer to store sprite x/y/w/h per string
+    Buffer.prototype.make.call(this);
+
+    // Read sampling parameters
+    minFilter = this.minFilter != null ? this.minFilter : this.props.minFilter;
+    magFilter = this.magFilter != null ? this.magFilter : this.props.magFilter;
+    type = this.type != null ? this.type : this.props.type;
+
+    // Read given dimensions
+    const { width } = this.props;
+    const { height } = this.props;
+    const { depth } = this.props;
+    const reserveX = this.props.bufferWidth;
+    const reserveY = this.props.bufferHeight;
+    const reserveZ = this.props.bufferDepth;
+    const { channels } = this.props;
+    const { items } = this.props;
+
+    let dims = (this.spec = { channels, items, width, height, depth });
+
+    this.items = dims.items;
+    this.channels = dims.channels;
+
+    // Init to right size if data supplied
+    const { data } = this.props;
+    dims = getDimensions(data, dims);
+
+    const { space } = this;
+    space.width = Math.max(reserveX, dims.width || 1);
+    space.height = Math.max(reserveY, dims.height || 1);
+    space.depth = Math.max(reserveZ, dims.depth || 1);
+
+    // Create text voxel buffer
+    this.buffer = this._renderables.make(this.storage, {
+      width: space.width,
+      height: space.height,
+      depth: space.depth,
+      channels: 4,
+      items,
+      minFilter,
+      magFilter,
+      type,
+    });
+
+    // Hook buffer emitter to map atlas text
+    const { atlas } = this;
+    const { emit } = this.buffer.streamer;
+    return (this.buffer.streamer.emit = (text) => atlas.map(text, emit));
+  }
+
+  unmake() {
+    super.unmake();
+    if (this.atlas) {
+      this.atlas.dispose();
+      return (this.atlas = null);
+    }
+  }
+
+  update() {
+    this.atlas.begin();
+    super.update();
+    return this.atlas.end();
+  }
+
+  change(changed, touched, init) {
+    if (touched["font"]) {
+      return this.rebuild();
+    }
+    return super.change(changed, touched, init);
+  }
+}
+Text.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/operator/operator.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining
+ * DS206: Consider reworking classes to avoid initClass
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+class Operator extends Source {
+  static initClass() {
+    this.traits = ["node", "bind", "operator", "source", "index"];
+  }
+
+  indexShader(shader) {
+    return __guardMethod__(this.bind.source, "indexShader", (o) =>
+      o.indexShader(shader)
+    );
+  }
+  sourceShader(shader) {
+    return __guardMethod__(this.bind.source, "sourceShader", (o) =>
+      o.sourceShader(shader)
+    );
+  }
+
+  getDimensions() {
+    return this.bind.source.getDimensions();
+  }
+  getFutureDimensions() {
+    return this.bind.source.getFutureDimensions();
+  }
+  getActiveDimensions() {
+    return this.bind.source.getActiveDimensions();
+  }
+  getIndexDimensions() {
+    return this.bind.source.getIndexDimensions();
+  }
+
+  init() {
+    return (this.sourceSpec = [{ to: "operator.source", trait: "source" }]);
+  }
+
+  make() {
+    super.make();
+
+    // Bind to attached data sources
+    return this._helpers.bind.make(this.sourceSpec);
+  }
+
+  made() {
+    this.resize();
+    return super.made();
+  }
+
+  unmake() {
+    return this._helpers.bind.unmake();
+  }
+
+  resize(_rebuild) {
+    return this.trigger({
+      type: "source.resize",
+    });
+  }
+}
+Operator.initClass();
+
+function __guardMethod__(obj, methodName, transform) {
+  if (
+    typeof obj !== "undefined" &&
+    obj !== null &&
+    typeof obj[methodName] === "function"
+  ) {
+    return transform(obj, methodName);
+  } else {
+    return undefined;
+  }
+}
+
+;// CONCATENATED MODULE: ./src/primitives/types/text/format.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+class Format extends Operator {
+  static initClass() {
+    this.traits = [
+      "node",
+      "bind",
+      "operator",
+      "texture",
+      "text",
+      "format",
+      "font",
+    ];
+    this.defaults = {
+      minFilter: "linear",
+      magFilter: "linear",
+    };
+  }
+
+  init() {
+    super.init();
+    this.atlas = this.buffer = this.used = this.time = null;
+    return (this.filled = false);
+  }
+
+  sourceShader(shader) {
+    return this.buffer.shader(shader);
+  }
+
+  textShader(shader) {
+    return this.atlas.shader(shader);
+  }
+
+  textIsSDF() {
+    return this.props.sdf > 0;
+  }
+
+  textHeight() {
+    return this.props.detail;
+  }
+
+  make() {
+    // Bind to attached data sources    # super()
+    this._helpers.bind.make([{ to: "operator.source", trait: "raw" }]);
+
+    // Read sampling parameters
+    let { minFilter, magFilter, type } = this.props;
+
+    // Read font parameters
+    const { font, style, variant, weight, detail, sdf } = this.props;
+
+    // Prepare text atlas
+    this.atlas = this._renderables.make("textAtlas", {
+      font,
+      size: detail,
+      style,
+      variant,
+      weight,
+      outline: sdf,
+      minFilter,
+      magFilter,
+      type,
+    });
+
+    // Underlying data buffer needs no filtering
+    minFilter = external_THREE_.NearestFilter;
+    magFilter = external_THREE_.NearestFilter;
+    type = external_THREE_.FloatType;
+
+    // Fetch geometry dimensions
+    const dims = this.bind.source.getDimensions();
+    const { items, width, height, depth } = dims;
+
+    // Create voxel buffer for text atlas coords
+    this.buffer = this._renderables.make("voxelBuffer", {
+      width,
+      height,
+      depth,
+      channels: 4,
+      items,
+      minFilter,
+      magFilter,
+      type,
+    });
+
+    // Hook buffer emitter to map atlas text
+    const { atlas } = this;
+    const { emit } = this.buffer.streamer;
+    this.buffer.streamer.emit = (t) => atlas.map(t, emit);
+
+    // Grab parent clock
+    this.clockParent = this._inherit("clock");
+    return this._listen("root", "root.update", this.update);
+  }
+
+  made() {
+    super.made();
+    return this.resize();
+  }
+
+  unmake() {
+    super.unmake();
+    if (this.buffer) {
+      this.buffer.dispose();
+      this.buffer = null;
+    }
+
+    if (this.atlas) {
+      this.atlas.dispose();
+      return (this.atlas = null);
+    }
+  }
+
+  update() {
+    if ((this.filled && !this.props.live) || !this.through) {
+      return;
+    }
+
+    this.time = this.clockParent.getTime();
+
+    const { used } = this;
+
+    this.atlas.begin();
+    this.used = this.through();
+    this.buffer.write(this.used);
+    this.atlas.end();
+
+    this.filled = true;
+
+    if (used !== this.used) {
+      return this.trigger({
+        type: "source.resize",
+      });
+    }
+  }
+
+  change(changed, touched, init) {
+    if (touched["font"]) {
+      return this.rebuild();
+    }
+
+    if (
+      changed["format.expr"] ||
+      changed["format.digits"] ||
+      changed["format.data"] ||
+      init
+    ) {
+      let map;
+      let { expr } = this.props;
+      const { digits, data } = this.props;
+
+      if (expr == null) {
+        if (data != null) {
+          expr = (x, y, z, w, i) => data[i];
+        } else {
+          expr = (x) => x;
+        }
+      }
+
+      const { length } = expr;
+
+      if (digits != null) {
+        expr = (
+          (expr) => (x, y, z, w, i, j, k, l, t, d) =>
+            +expr(x, y, z, w, i, j, k, l, t, d).toPrecision(digits)
+        )(expr);
+      }
+
+      // Stream raw source data and format it with expression
+      if (length > 8) {
+        map = (emit, x, y, z, w, i, j, k, l, _t, _d) => {
+          return emit(
+            expr(x, y, z, w, i, j, k, l, this.time.clock, this.time.step)
+          );
+        };
+      } else {
+        map = (emit, x, y, z, w, i, j, k, l) => {
+          return emit(expr(x, y, z, w, i, j, k, l));
+        };
+      }
+
+      return (this.through = this.bind.source
+        .rawBuffer()
+        .through(map, this.buffer));
+    }
+  }
+}
+Format.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/text/label.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+
+class Label extends Primitive {
+  static initClass() {
+    this.traits = [
+      "node",
+      "bind",
+      "object",
+      "visible",
+      "style",
+      "label",
+      "attach",
+      "geometry",
+      "position",
+    ];
+  }
+
+  make() {
+    let color;
+    super.make();
+
+    // Bind to attached objects
+    this._helpers.bind.make([
+      { to: "label.text", trait: "text" },
+      { to: "geometry.points", trait: "source" },
+      { to: "geometry.colors", trait: "source" },
+    ]);
+
+    if (this.bind.points == null) {
+      return;
+    }
+    if (this.bind.text == null) {
+      return;
+    }
+
+    // Fetch geometry/text dimensions
+    const pointDims = this.bind.points.getDimensions();
+    const textDims = this.bind.text.getDimensions();
+    const textIsSDF = this.bind.text.textIsSDF();
+
+    const items = Math.min(pointDims.items, textDims.items);
+    const width = Math.min(pointDims.width, textDims.width);
+    const height = Math.min(pointDims.height, textDims.height);
+    const depth = Math.min(pointDims.depth, textDims.depth);
+
+    // Build shader to sample position data
+    // and transform into screen space
+    let position = this.bind.points.sourceShader(this._shaders.shader());
+    position = this._helpers.position.pipeline(position);
+
+    // Build shader to sample text geometry data
+    const sprite = this.bind.text.sourceShader(this._shaders.shader());
+
+    // Build shader to sample text image data
+    const map = this._shaders.shader().pipe("label.map");
+    map.pipe(this.bind.text.textShader(this._shaders.shader()));
+
+    // Build shader to resolve text data
+    const labelUniforms = {
+      spriteDepth: this.node.attributes["attach.depth"],
+      spriteOffset: this.node.attributes["attach.offset"],
+      spriteSnap: this.node.attributes["attach.snap"],
+      spriteScale: this._attributes.make(this._types.number()),
+      outlineStep: this._attributes.make(this._types.number()),
+      outlineExpand: this._attributes.make(this._types.number()),
+      outlineColor: this.node.attributes["label.background"],
+    };
+
+    this.spriteScale = labelUniforms.spriteScale;
+    this.outlineStep = labelUniforms.outlineStep;
+    this.outlineExpand = labelUniforms.outlineExpand;
+
+    const snippet = textIsSDF ? "label.outline" : "label.alpha";
+    const combine = this._shaders.shader().pipe(snippet, labelUniforms);
+
+    // Build color lookup
+    if (this.bind.colors) {
+      color = this._shaders.shader();
+      this.bind.colors.sourceShader(color);
+    }
+
+    // Build transition mask lookup
+    const mask = this._helpers.object.mask();
+
+    // Prepare bound uniforms
+    const styleUniforms = this._helpers.style.uniforms();
+    const unitUniforms = this._inherit("unit").getUnitUniforms();
+
+    // Make sprite renderable
+    const uniforms = merge(unitUniforms, styleUniforms, labelUniforms);
+    this.sprite = this._renderables.make("sprite", {
+      uniforms,
+      width,
+      height,
+      depth,
+      items,
+      position,
+      sprite,
+      map,
+      combine,
+      color,
+      mask,
+      linear: true,
+    });
+
+    this._helpers.visible.make();
+    return this._helpers.object.make([this.sprite]);
+  }
+
+  unmake() {
+    this._helpers.bind.unmake();
+    this._helpers.visible.unmake();
+    this._helpers.object.unmake();
+
+    return (this.sprite = null);
+  }
+
+  resize() {
+    // Fetch geometry/text dimensions
+    const pointDims = this.bind.points.getActiveDimensions();
+    const textDims = this.bind.text.getActiveDimensions();
+
+    const items = Math.min(pointDims.items, textDims.items);
+    const width = Math.min(pointDims.width, textDims.width);
+    const height = Math.min(pointDims.height, textDims.height);
+    const depth = Math.min(pointDims.depth, textDims.depth);
+
+    return this.sprite.geometry.clip(width, height, depth, items);
+  }
+
+  change(changed, touched, _init) {
+    if (touched["geometry"] || changed["label.text"]) {
+      return this.rebuild();
+    }
+    if (this.bind.points == null) {
+      return;
+    }
+
+    const { size } = this.props;
+    const { outline } = this.props;
+    const { expand } = this.props;
+    const height = this.bind.text.textHeight();
+    const scale = size / height;
+
+    this.outlineExpand.value = ((expand / scale) * 16) / 255;
+    this.outlineStep.value = ((outline / scale) * 16) / 255;
+    return (this.spriteScale.value = scale);
+  }
+}
+Label.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/operator/resample.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+class Resample extends Operator {
+  static initClass() {
+    this.traits = [
+      "node",
+      "bind",
+      "operator",
+      "source",
+      "index",
+      "resample",
+      "sampler:x",
+      "sampler:y",
+      "sampler:z",
+      "sampler:w",
+      "include",
+    ];
+  }
+
+  indexShader(shader) {
+    shader.pipe(this.indexer);
+    return super.indexShader(shader);
+  }
+
+  sourceShader(shader) {
+    return shader.pipe(this.operator);
+  }
+
+  getDimensions() {
+    return this._resample(this.bind.source.getDimensions());
+  }
+  getActiveDimensions() {
+    return this._resample(this.bind.source.getActiveDimensions());
+  }
+  getFutureDimensions() {
+    return this._resample(this.bind.source.getFutureDimensions());
+  }
+  getIndexDimensions() {
+    return this._resample(this.bind.source.getIndexDimensions());
+  }
+
+  _resample(dims) {
+    const r = this.resampled;
+    const c = this.centered;
+    const p = this.padding;
+
+    if (this.relativeSize) {
+      if (!c.items) {
+        dims.items--;
+      }
+      if (!c.width) {
+        dims.width--;
+      }
+      if (!c.height) {
+        dims.height--;
+      }
+      if (!c.depth) {
+        dims.depth--;
+      }
+
+      if (r.items != null) {
+        dims.items *= r.items;
+      }
+      if (r.width != null) {
+        dims.width *= r.width;
+      }
+      if (r.height != null) {
+        dims.height *= r.height;
+      }
+      if (r.depth != null) {
+        dims.depth *= r.depth;
+      }
+
+      if (!c.items) {
+        dims.items++;
+      }
+      if (!c.width) {
+        dims.width++;
+      }
+      if (!c.height) {
+        dims.height++;
+      }
+      if (!c.depth) {
+        dims.depth++;
+      }
+
+      dims.items -= p.items * 2;
+      dims.width -= p.width * 2;
+      dims.height -= p.height * 2;
+      dims.depth -= p.depth * 2;
+    } else {
+      if (r.items != null) {
+        dims.items = r.items;
+      }
+      if (r.width != null) {
+        dims.width = r.width;
+      }
+      if (r.height != null) {
+        dims.height = r.height;
+      }
+      if (r.depth != null) {
+        dims.depth = r.depth;
+      }
+    }
+
+    dims.items = Math.max(0, Math.floor(dims.items));
+    dims.width = Math.max(0, Math.floor(dims.width));
+    dims.height = Math.max(0, Math.floor(dims.height));
+    dims.depth = Math.max(0, Math.floor(dims.depth));
+
+    return dims;
+  }
+
+  make() {
+    super.make();
+    if (this.bind.source == null) {
+      return;
+    }
+
+    // Bind to attached shader
+    this._helpers.bind.make([
+      { to: "include.shader", trait: "shader", optional: true },
+    ]);
+
+    // Get custom shader
+    const { indices, channels } = this.props;
+    const { shader } = this.bind;
+
+    // Get resampled dimensions (if any)
+    const { sample, size, items, width, height, depth } = this.props;
+
+    // Sampler behavior
+    const relativeSample =
+      sample === this.node.attributes["resample.sample"].enum.relative;
+    const relativeSize =
+      size === this.node.attributes["resample.size"].enum.relative;
+
+    this.resampled = {};
+    if (items != null) {
+      this.resampled.items = items;
+    }
+    if (width != null) {
+      this.resampled.width = width;
+    }
+    if (height != null) {
+      this.resampled.height = height;
+    }
+    if (depth != null) {
+      this.resampled.depth = depth;
+    }
+
+    this.centered = {};
+    this.centered.items = this.props.centeredW;
+    this.centered.width = this.props.centeredX;
+    this.centered.height = this.props.centeredY;
+    this.centered.depth = this.props.centeredZ;
+
+    this.padding = {};
+    this.padding.items = this.props.paddingW;
+    this.padding.width = this.props.paddingX;
+    this.padding.height = this.props.paddingY;
+    this.padding.depth = this.props.paddingZ;
+
+    // Build shader to resample data
+    const operator = this._shaders.shader();
+    const indexer = this._shaders.shader();
+
+    // Uniforms
+    const type = [
+      null,
+      this._types.number,
+      this._types.vec2,
+      this._types.vec3,
+      this._types.vec4,
+    ][indices];
+    const uniforms = {
+      dataSize: this._attributes.make(type(0, 0, 0, 0)),
+      dataResolution: this._attributes.make(type(0, 0, 0, 0)),
+
+      targetSize: this._attributes.make(type(0, 0, 0, 0)),
+      targetResolution: this._attributes.make(type(0, 0, 0, 0)),
+
+      resampleFactor: this._attributes.make(this._types.vec4(0, 0, 0, 0)),
+      resampleBias: this._attributes.make(this._types.vec4(0, 0, 0, 0)),
+    };
+
+    this.dataResolution = uniforms.dataResolution;
+    this.dataSize = uniforms.dataSize;
+    this.targetResolution = uniforms.targetResolution;
+    this.targetSize = uniforms.targetSize;
+    this.resampleFactor = uniforms.resampleFactor;
+    this.resampleBias = uniforms.resampleBias;
+
+    // Has resize props?
+    const resize =
+      items != null || width != null || height != null || depth != null;
+
+    // Add padding
+    operator.pipe("resample.padding", uniforms);
+
+    // Add centered sampling offset
+    let vec = [];
+    let any = false;
+    const iterable = ["width", "height", "depth", "items"];
+    for (let i = 0; i < iterable.length; i++) {
+      const key = iterable[i];
+      const centered = this.centered[key];
+      if (!any) {
+        any = centered;
+      }
+      vec[i] = centered ? "0.5" : "0.0";
+    }
+
+    if (any) {
+      vec = `vec4(${vec})`;
+      // TODO is this right? seems like copy paste.
+      operator.pipe(binaryOperator(4, "+", vec));
+      if (resize) {
+        indexer.pipe(binaryOperator(4, "+", vec));
+      }
+    }
+
+    if (relativeSample) {
+      // Addressing relative to target
+      if (resize) {
+        operator.pipe("resample.relative", uniforms);
+        indexer.pipe("resample.relative", uniforms);
+      } else {
+        indexer.pipe(identity("vec4"));
+      }
+    }
+
+    if (shader != null) {
+      if (indices !== 4) {
+        operator.pipe(truncateVec(4, indices));
+      }
+
+      operator.callback();
+      if (indices !== 4) {
+        operator.pipe(extendVec(indices, 4));
+      }
+      if (any) {
+        operator.pipe(binaryOperator(4, "-", vec));
+      }
+      operator.pipe(this.bind.source.sourceShader(this._shaders.shader()));
+      if (channels !== 4) {
+        operator.pipe(truncateVec(4, channels));
+      }
+      operator.join();
+
+      if (this.bind.shader != null) {
+        operator.pipe(this.bind.shader.shaderBind(uniforms));
+      }
+
+      if (channels !== 4) {
+        operator.pipe(extendVec(channels, 4));
+      }
+    } else {
+      if (any) {
+        operator.pipe(binaryOperator(4, "-", vec));
+      }
+      operator.pipe(this.bind.source.sourceShader(this._shaders.shader()));
+    }
+
+    if (any && resize) {
+      indexer.pipe(binaryOperator(4, "-", vec));
+    }
+
+    this.operator = operator;
+    this.indexer = indexer;
+    this.indices = indices;
+
+    this.relativeSample = relativeSample;
+    return (this.relativeSize = relativeSize);
+  }
+
+  unmake() {
+    super.unmake();
+    return (this.operator = null);
+  }
+
+  resize() {
+    if (this.bind.source == null) {
+      return;
+    }
+
+    const dims = this.bind.source.getActiveDimensions();
+    const target = this.getActiveDimensions();
+
+    const axis = (key) => {
+      const centered = this.centered[key];
+      const pad = this.padding[key];
+
+      target[key] += pad * 2;
+
+      const res = centered
+        ? dims[key] / Math.max(1, target[key])
+        : Math.max(1, dims[key] - 1) / Math.max(1, target[key] - 1);
+      return [res, pad];
+    };
+
+    const [rw, bw] = Array.from(axis("width"));
+    const [rh, bh] = Array.from(axis("height"));
+    const [rd, bd] = Array.from(axis("depth"));
+    const [ri, bi] = Array.from(axis("items"));
+
+    if (this.indices === 1) {
+      this.dataResolution.value = 1 / dims.width;
+      this.targetResolution.value = 1 / target.width;
+
+      this.dataSize.value = dims.width;
+      this.targetSize.value = target.width;
+    } else {
+      this.dataResolution.value.set(
+        1 / dims.width,
+        1 / dims.height,
+        1 / dims.depth,
+        1 / dims.items
+      );
+      this.targetResolution.value.set(
+        1 / target.width,
+        1 / target.height,
+        1 / target.depth,
+        1 / target.items
+      );
+
+      this.dataSize.value.set(dims.width, dims.height, dims.depth, dims.items);
+      this.targetSize.value.set(
+        target.width,
+        target.height,
+        target.depth,
+        target.items
+      );
+    }
+
+    this.resampleFactor.value.set(rw, rh, rd, ri);
+    this.resampleBias.value.set(bw, bh, bd, bi);
+
+    return super.resize();
+  }
+
+  change(changed, touched, _init) {
+    if (
+      touched["operator"] ||
+      touched["resample"] ||
+      touched["sampler"] ||
+      touched["include"]
+    ) {
+      return this.rebuild();
+    }
+  }
+}
+Resample.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/text/retext.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+class Retext extends Resample {
+  static initClass() {
+    this.traits = [
+      "node",
+      "bind",
+      "operator",
+      "resample",
+      "sampler:x",
+      "sampler:y",
+      "sampler:z",
+      "sampler:w",
+      "include",
+      "text",
+    ];
+  }
+
+  init() {
+    return (this.sourceSpec = [{ to: "operator.source", trait: "text" }]);
+  }
+
+  textShader(shader) {
+    return this.bind.source.textShader(shader);
+  }
+
+  textIsSDF() {
+    return (
+      (this.bind.source != null ? this.bind.source.props.sdf : undefined) > 0
+    );
+  }
+  textHeight() {
+    return this.bind.source != null ? this.bind.source.props.detail : undefined;
+  }
+}
+Retext.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/text/index.js
+
+
+
+
+
+;// CONCATENATED MODULE: ./src/primitives/types/time/clock.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+class Clock extends Parent {
+  static initClass() {
+    this.traits = ["node", "clock", "seek", "play"];
+  }
+
+  init() {
+    this.skew = 0;
+    this.last = 0;
+    return (this.time = {
+      now: +new Date() / 1000,
+      time: 0,
+      delta: 0,
+      clock: 0,
+      step: 0,
+    });
+  }
+
+  make() {
+    // Listen to parent clock
+    return this._listen("clock", "clock.tick", this.tick);
+  }
+
+  reset() {
+    return (this.skew = 0);
+  }
+
+  tick(e) {
+    const { from, to, speed, seek, pace, delay, realtime } = this.props;
+
+    const parent = this._inherit("clock").getTime();
+
+    const time = realtime ? parent.time : parent.clock;
+    const delta = realtime ? parent.delta : parent.step;
+    const ratio = speed / pace;
+
+    this.skew += delta * (ratio - 1);
+    if (this.last > time) {
+      this.skew = 0;
+    }
+
+    this.time.now = parent.now + this.skew;
+
+    this.time.time = parent.time;
+    this.time.delta = parent.delta;
+
+    const clock = seek != null ? seek : parent.clock + this.skew;
+    this.time.clock = Math.min(to, from + Math.max(0, clock - delay * ratio));
+    this.time.step = delta * ratio;
+
+    this.last = time;
+
+    return this.trigger(e);
+  }
+
+  getTime() {
+    return this.time;
+  }
+}
+Clock.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/time/now.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+class Now extends Parent {
+  static initClass() {
+    this.traits = ["node", "clock", "now"];
+  }
+
+  init() {
+    let now;
+    this.now = now = +new Date() / 1000;
+    this.skew = 0;
+    return (this.time = {
+      now,
+      time: 0,
+      delta: 0,
+      clock: 0,
+      step: 0,
+    });
+  }
+
+  make() {
+    // Listen to parent clock
+    this.clockParent = this._inherit("clock");
+    return this._listen("clock", "clock.tick", this.tick);
+  }
+
+  unmake() {
+    return (this.clockParent = null);
+  }
+
+  change(changed, _touched, _init) {
+    if (changed["date.now"]) {
+      return (this.skew = 0);
+    }
+  }
+
+  tick(e) {
+    const { seek, pace, speed } = this.props;
+
+    const parent = this.clockParent.getTime();
+
+    this.skew += (parent.step * pace) / speed;
+    if (seek != null) {
+      this.skew = seek;
+    }
+
+    this.time.now =
+      this.time.time =
+      this.time.clock =
+        (this.props.now != null ? this.props.now : this.now) + this.skew;
+    this.time.delta = this.time.step = parent.delta;
+
+    return this.trigger(e);
+  }
+
+  getTime() {
+    return this.time;
+  }
+}
+Now.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/time/index.js
+
+
+
+;// CONCATENATED MODULE: ./src/primitives/types/transform/transform.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining
+ * DS104: Avoid inline assignments
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+class Transform extends Parent {
+  static initClass() {
+    this.traits = ["node", "vertex", "fragment"];
+  }
+
+  vertex(shader, pass) {
+    let left;
+    return (left = transform_guard_(this._inherit("vertex"), (x) =>
+      x.vertex(shader, pass)
+    )) != null
+      ? left
+      : shader;
+  }
+
+  fragment(shader, pass) {
+    let left;
+    return (left = transform_guard_(this._inherit("fragment"), (x) =>
+      x.fragment(shader, pass)
+    )) != null
+      ? left
+      : shader;
+  }
+}
+Transform.initClass();
+
+function transform_guard_(value, xform) {
+  return typeof value !== "undefined" && value !== null
+    ? xform(value)
+    : undefined;
+}
+
+;// CONCATENATED MODULE: ./src/primitives/types/transform/transform3.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+class Transform3 extends Transform {
+  static initClass() {
+    this.traits = ["node", "vertex", "transform3"];
+  }
+
+  make() {
+    this.uniforms = {
+      transformMatrix: this._attributes.make(this._types.mat4()),
+    };
+
+    return (this.composer = transformComposer());
+  }
+
+  unmake() {
+    return delete this.uniforms;
+  }
+
+  change(changed, touched, init) {
+    if (changed["transform3.pass"]) {
+      return this.rebuild();
+    }
+    if (!touched["transform3"] && !init) {
+      return;
+    }
+
+    const p = this.props.position;
+    const q = this.props.quaternion;
+    const r = this.props.rotation;
+    const s = this.props.scale;
+    const m = this.props.matrix;
+    const e = this.props.eulerOrder;
+
+    return (this.uniforms.transformMatrix.value = this.composer(
+      p,
+      r,
+      q,
+      s,
+      m,
+      e
+    ));
+  }
+
+  vertex(shader, pass) {
+    if (pass === this.props.pass) {
+      shader.pipe("transform3.position", this.uniforms);
+    }
+    return super.vertex(shader, pass);
+  }
+}
+Transform3.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/transform/transform4.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+class Transform4 extends Transform {
+  static initClass() {
+    this.traits = ["node", "vertex", "transform4"];
+  }
+
+  make() {
+    this.uniforms = {
+      transformMatrix: this._attributes.make(this._types.mat4()),
+      transformOffset: this.node.attributes["transform4.position"],
+    };
+
+    return (this.transformMatrix = this.uniforms.transformMatrix.value);
+  }
+
+  unmake() {
+    return delete this.uniforms;
+  }
+
+  change(changed, touched, init) {
+    if (changed["transform4.pass"]) {
+      return this.rebuild();
+    }
+    if (!touched["transform4"] && !init) {
+      return;
+    }
+
+    const s = this.props.scale;
+    const m = this.props.matrix;
+
+    const t = this.transformMatrix;
+    t.copy(m);
+    return t.scale(s);
+  }
+
+  vertex(shader, pass) {
+    if (pass === this.props.pass) {
+      shader.pipe("transform4.position", this.uniforms);
+    }
+    return super.vertex(shader, pass);
+  }
+}
+Transform4.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/transform/vertex.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+class Vertex extends Transform {
+  static initClass() {
+    this.traits = ["node", "include", "vertex", "bind"];
+  }
+
+  make() {
+    // Bind to attached shader
+    return this._helpers.bind.make([
+      { to: "include.shader", trait: "shader", optional: true },
+    ]);
+  }
+
+  unmake() {
+    return this._helpers.bind.unmake();
+  }
+
+  change(changed, touched, _init) {
+    if (touched["include"]) {
+      return this.rebuild();
+    }
+  }
+
+  vertex(shader, pass) {
+    if (this.bind.shader != null) {
+      if (pass === this.props.pass) {
+        shader.pipe(this.bind.shader.shaderBind());
+      }
+    }
+    return super.vertex(shader, pass);
+  }
+}
+Vertex.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/transform/fragment.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+class Fragment extends Transform {
+  static initClass() {
+    this.traits = ["node", "include", "fragment", "bind"];
+  }
+
+  make() {
+    // Bind to attached shader
+    return this._helpers.bind.make([
+      { to: "include.shader", trait: "shader", optional: true },
+    ]);
+  }
+
+  unmake() {
+    return this._helpers.bind.unmake();
+  }
+
+  change(changed, touched, _init) {
+    if (touched["include"] || changed["fragment.gamma"]) {
+      return this.rebuild();
+    }
+  }
+
+  fragment(shader, pass) {
+    if (this.bind.shader != null) {
+      if (pass === this.props.pass) {
+        if (this.props.gamma) {
+          shader.pipe("mesh.gamma.out");
+        }
+        shader.pipe(this.bind.shader.shaderBind());
+        shader.split();
+        if (this.props.gamma) {
+          shader.pipe("mesh.gamma.in");
+        }
+        shader.pass();
+      }
+    }
+    return super.fragment(shader, pass);
+  }
+}
+Fragment.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/transform/layer.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+class Layer extends Transform {
+  static initClass() {
+    this.traits = ["node", "vertex", "layer"];
+  }
+
+  make() {
+    this._listen("root", "root.resize", this.update);
+
+    return (this.uniforms = {
+      layerScale: this._attributes.make(this._types.vec4()),
+      layerBias: this._attributes.make(this._types.vec4()),
+    });
+  }
+
+  update() {
+    const camera = this._inherit("root").getCamera();
+
+    const aspect = camera.aspect != null ? camera.aspect : 1;
+    const fov = camera.fov != null ? camera.fov : 1;
+
+    const pitch = Math.tan((fov * Math.PI) / 360);
+
+    const _enum = this.node.attributes["layer.fit"].enum;
+
+    let { fit } = this.props;
+    const { depth } = this.props;
+
+    // Convert contain/cover into x/y
+    switch (fit) {
+      case _enum.contain:
+        fit = aspect > 1 ? _enum.y : _enum.x;
+        break;
+      case _enum.cover:
+        fit = aspect > 1 ? _enum.x : _enum.y;
+        break;
+    }
+
+    // Fit x/y
+    switch (fit) {
+      case _enum.x:
+        this.uniforms.layerScale.value.set(pitch * aspect, pitch * aspect);
+        break;
+      case _enum.y:
+        this.uniforms.layerScale.value.set(pitch, pitch);
+        break;
+    }
+
+    return this.uniforms.layerBias.value.set(0, 0, -depth, 0);
+  }
+
+  change(changed, touched, init) {
+    if (changed["layer.fit"] || changed["layer.depth"] || init) {
+      return this.update();
+    }
+  }
+
+  // End transform chain here without applying camera view
+  vertex(shader, pass) {
+    if (pass === 2) {
+      return shader.pipe("layer.position", this.uniforms);
+    }
+    if (pass === 3) {
+      return shader.pipe("root.position");
+    }
+    return shader;
+  }
+}
+Layer.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/transform/mask.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining
+ * DS104: Avoid inline assignments
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+class Mask extends Parent {
+  static initClass() {
+    this.traits = ["node", "include", "mask", "bind"];
+  }
+
+  make() {
+    // Bind to attached shader
+    return this._helpers.bind.make([
+      { to: "include.shader", trait: "shader", optional: true },
+    ]);
+  }
+
+  unmake() {
+    return this._helpers.bind.unmake();
+  }
+
+  change(changed, touched, _init) {
+    if (touched["include"]) {
+      return this.rebuild();
+    }
+  }
+
+  mask(shader) {
+    let left, s;
+    if (this.bind.shader != null) {
+      if (shader) {
+        s = this._shaders.shader();
+        s.pipe(identity("vec4"));
+        s.fan();
+        s.pipe(shader);
+        s.next();
+        s.pipe(this.bind.shader.shaderBind());
+        s.end();
+        s.pipe("float combine(float a, float b) { return min(a, b); }");
+      } else {
+        s = this._shaders.shader();
+        s.pipe(this.bind.shader.shaderBind());
+      }
+    } else {
+      s = shader;
+    }
+
+    return (left = mask_guard_(this._inherit("mask"), (x) => x.mask(s))) != null
+      ? left
+      : s;
+  }
+}
+Mask.initClass();
+
+function mask_guard_(value, transform) {
+  return typeof value !== "undefined" && value !== null
+    ? transform(value)
+    : undefined;
+}
+
+;// CONCATENATED MODULE: ./src/primitives/types/transform/index.js
+
+
+
+
+
+
+
+
+;// CONCATENATED MODULE: ./src/primitives/types/operator/clamp.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+class Clamp extends Operator {
+  static initClass() {
+    this.traits = ["node", "bind", "operator", "source", "index", "clamp"];
+  }
+
+  indexShader(shader) {
+    shader.pipe(this.operator);
+    return super.indexShader(shader);
+  }
+
+  sourceShader(shader) {
+    shader.pipe(this.operator);
+    return super.sourceShader(shader);
+  }
+
+  make() {
+    super.make();
+    if (this.bind.source == null) {
+      return;
+    }
+
+    // Max index on all 4 dimensions
+    const uniforms = { clampLimit: this._attributes.make(this._types.vec4()) };
+    this.clampLimit = uniforms.clampLimit;
+
+    // Build shader to clamp along all dimensions
+    const transform = this._shaders.shader();
+    transform.pipe("clamp.position", uniforms);
+    return (this.operator = transform);
+  }
+
+  unmake() {
+    return super.unmake();
+  }
+
+  resize() {
+    if (this.bind.source != null) {
+      const dims = this.bind.source.getActiveDimensions();
+      this.clampLimit.value.set(
+        dims.width - 1,
+        dims.height - 1,
+        dims.depth - 1,
+        dims.items - 1
+      );
+    }
+
+    return super.resize();
+  }
+
+  change(changed, touched, _init) {
+    if (touched["operator"] || touched["clamp"]) {
+      return this.rebuild();
+    }
+  }
+}
+Clamp.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/operator/grow.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS205: Consider reworking code to avoid use of IIFEs
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+class Grow extends Operator {
+  static initClass() {
+    this.traits = ["node", "bind", "operator", "source", "index", "grow"];
+  }
+
+  sourceShader(shader) {
+    return shader.pipe(this.operator);
+  }
+
+  make() {
+    super.make();
+    if (this.bind.source == null) {
+      return;
+    }
+
+    // Uniforms
+    const uniforms = {
+      growScale: this.node.attributes["grow.scale"],
+      growMask: this._attributes.make(this._types.vec4()),
+      growAnchor: this._attributes.make(this._types.vec4()),
+    };
+
+    this.growMask = uniforms.growMask.value;
+    this.growAnchor = uniforms.growAnchor.value;
+
+    // Build shader to spread data on one dimension
+    const transform = this._shaders.shader();
+    transform.require(this.bind.source.sourceShader(this._shaders.shader()));
+    transform.pipe("grow.position", uniforms);
+
+    return (this.operator = transform);
+  }
+
+  unmake() {
+    return super.unmake();
+  }
+
+  resize() {
+    this.update();
+    return super.resize();
+  }
+
+  update() {
+    // Size to fit to include future history
+    const dims = this.bind.source.getFutureDimensions();
+
+    const order = ["width", "height", "depth", "items"];
+
+    const m = (d, anchor) => ((d || 1) - 1) * (0.5 - anchor * 0.5);
+
+    return (() => {
+      const result = [];
+      for (let i = 0; i < order.length; i++) {
+        const key = order[i];
+        const anchor = this.props[key];
+
+        this.growMask.setComponent(i, +(anchor == null));
+        result.push(
+          this.growAnchor.setComponent(
+            i,
+            anchor != null ? m(dims[key], anchor) : 0
+          )
+        );
+      }
+      return result;
+    })();
+  }
+
+  change(changed, touched, _init) {
+    if (touched["operator"]) {
+      return this.rebuild();
+    }
+
+    if (touched["grow"]) {
+      return this.update();
+    }
+  }
+}
+Grow.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/operator/join.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS104: Avoid inline assignments
+ * DS205: Consider reworking code to avoid use of IIFEs
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+/*
+split:
+  order:       Types.transpose('wxyz')
+  axis:        Types.axis()
+  overlap:     Types.int(0)
+*/
+
+class Join extends Operator {
+  static initClass() {
+    this.traits = ["node", "bind", "operator", "source", "index", "join"];
+  }
+
+  indexShader(shader) {
+    shader.pipe(this.operator);
+    return super.indexShader(shader);
+  }
+
+  sourceShader(shader) {
+    shader.pipe(this.operator);
+    return super.sourceShader(shader);
+  }
+
+  getDimensions() {
+    return this._resample(this.bind.source.getDimensions());
+  }
+  getActiveDimensions() {
+    return this._resample(this.bind.source.getActiveDimensions());
+  }
+  getFutureDimensions() {
+    return this._resample(this.bind.source.getFutureDimensions());
+  }
+  getIndexDimensions() {
+    return this._resample(this.bind.source.getIndexDimensions());
+  }
+
+  _resample(dims) {
+    let left;
+    let dim;
+    const { order, axis, stride } = this;
+
+    const labels = ["width", "height", "depth", "items"];
+    const mapped = order.map((x) => labels[x - 1]);
+    const index = order.indexOf(axis);
+    let set = (() => {
+      const result = [];
+      for (dim of Array.from(mapped)) {
+        result.push(dims[dim]);
+      }
+      return result;
+    })();
+    const product = ((left = set[index + 1]) != null ? left : 1) * stride;
+
+    set.splice(index, 2, product);
+    set = set.slice(0, 3);
+    set.push(1);
+
+    const out = {};
+    for (let i = 0; i < mapped.length; i++) {
+      dim = mapped[i];
+      out[dim] = set[i];
+    }
+
+    //console.log 'join', order, axis, length, stride
+    //console.log dims, out
+
+    return out;
+  }
+
+  make() {
+    super.make();
+    if (this.bind.source == null) {
+      return;
+    }
+
+    const { order } = this.props;
+    let { axis } = this.props;
+    let { overlap } = this.props;
+
+    /*
+    Calculate index transform
+
+    order: wxyz
+    length: 3
+    overlap: 1
+
+    axis: w
+    index: 0
+    rest: 00xy
+
+    axis: x
+    index: 1
+    rest: w00y
+
+    axis: y
+    index: 2
+    rest: wx00
+
+    axis: z
+    index: 3
+    rest: wxy0
+
+    */
+
+    const permute = order.join("");
+    if (axis == null) {
+      axis = order[0];
+    }
+    const index = permute.indexOf(axis);
+    const rest = permute.replace(axis, "00").substring(0, 4);
+
+    const labels = [null, "width", "height", "depth", "items"];
+    const major = labels[axis];
+
+    // Prepare uniforms
+    const dims = this.bind.source.getDimensions();
+    const length = dims[major];
+
+    overlap = Math.min(length - 1, overlap);
+    const stride = length - overlap;
+
+    const uniforms = {
+      joinStride: this._attributes.make(this._types.number(stride)),
+      joinStrideInv: this._attributes.make(this._types.number(1 / stride)),
+    };
+
+    // Build shader to split a dimension into two
+    const transform = this._shaders.shader();
+    transform.require(swizzleVec4(axis, 1));
+    transform.require(swizzleVec4(rest, 4));
+    transform.require(injectVec4([index, index + 1]));
+    transform.pipe("join.position", uniforms);
+    transform.pipe(invertSwizzleVec4(order));
+
+    this.operator = transform;
+
+    this.order = order;
+    this.axis = axis;
+    this.overlap = overlap;
+    this.length = length;
+    return (this.stride = stride);
+  }
+
+  unmake() {
+    return super.unmake();
+  }
+
+  change(changed, touched, _init) {
+    if (touched["join"] || touched["operator"]) {
+      return this.rebuild();
+    }
+  }
+}
+Join.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/operator/lerp.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+class Lerp extends Operator {
+  static initClass() {
+    this.traits = [
+      "node",
+      "bind",
+      "operator",
+      "source",
+      "index",
+      "lerp",
+      "sampler:x",
+      "sampler:y",
+      "sampler:z",
+      "sampler:w",
+    ];
+  }
+
+  indexShader(shader) {
+    shader.pipe(this.indexer);
+    return super.indexShader(shader);
+  }
+
+  sourceShader(shader) {
+    return shader.pipe(this.operator);
+  }
+
+  getDimensions() {
+    return this._resample(this.bind.source.getDimensions());
+  }
+  getActiveDimensions() {
+    return this._resample(this.bind.source.getActiveDimensions());
+  }
+  getFutureDimensions() {
+    return this._resample(this.bind.source.getFutureDimensions());
+  }
+  getIndexDimensions() {
+    return this._resample(this.bind.source.getIndexDimensions());
+  }
+
+  _resample(dims) {
+    const r = this.resampled;
+    const c = this.centered;
+    const p = this.padding;
+
+    if (this.relativeSize) {
+      if (!c.items) {
+        dims.items--;
+      }
+      if (!c.width) {
+        dims.width--;
+      }
+      if (!c.height) {
+        dims.height--;
+      }
+      if (!c.depth) {
+        dims.depth--;
+      }
+
+      if (r.items != null) {
+        dims.items *= r.items;
+      }
+      if (r.width != null) {
+        dims.width *= r.width;
+      }
+      if (r.height != null) {
+        dims.height *= r.height;
+      }
+      if (r.depth != null) {
+        dims.depth *= r.depth;
+      }
+
+      if (!c.items) {
+        dims.items++;
+      }
+      if (!c.width) {
+        dims.width++;
+      }
+      if (!c.height) {
+        dims.height++;
+      }
+      if (!c.depth) {
+        dims.depth++;
+      }
+
+      dims.items -= p.items * 2;
+      dims.width -= p.width * 2;
+      dims.height -= p.height * 2;
+      dims.depth -= p.depth * 2;
+    } else {
+      if (r.items != null) {
+        dims.items = r.items;
+      }
+      if (r.width != null) {
+        dims.width = r.width;
+      }
+      if (r.height != null) {
+        dims.height = r.height;
+      }
+      if (r.depth != null) {
+        dims.depth = r.depth;
+      }
+    }
+
+    dims.items = Math.max(0, Math.floor(dims.items));
+    dims.width = Math.max(0, Math.floor(dims.width));
+    dims.height = Math.max(0, Math.floor(dims.height));
+    dims.depth = Math.max(0, Math.floor(dims.depth));
+
+    return dims;
+  }
+
+  make() {
+    let i, key;
+    super.make();
+    if (this.bind.source == null) {
+      return;
+    }
+
+    // Get resampled dimensions
+    const { size, items, width, height, depth } = this.props;
+
+    // Sampler behavior
+    const relativeSize =
+      size === this.node.attributes["lerp.size"].enum.relative;
+
+    this.resampled = {};
+    if (items != null) {
+      this.resampled.items = items;
+    }
+    if (width != null) {
+      this.resampled.width = width;
+    }
+    if (height != null) {
+      this.resampled.height = height;
+    }
+    if (depth != null) {
+      this.resampled.depth = depth;
+    }
+
+    this.centered = {};
+    this.centered.items = this.props.centeredW;
+    this.centered.width = this.props.centeredX;
+    this.centered.height = this.props.centeredY;
+    this.centered.depth = this.props.centeredZ;
+
+    this.padding = {};
+    this.padding.items = this.props.paddingW;
+    this.padding.width = this.props.paddingX;
+    this.padding.height = this.props.paddingY;
+    this.padding.depth = this.props.paddingZ;
+
+    // Build shader to resample data
+    const operator = this._shaders.shader();
+    const indexer = this._shaders.shader();
+
+    // Uniforms
+    const uniforms = {
+      resampleFactor: this._attributes.make(this._types.vec4(0, 0, 0, 0)),
+      resampleBias: this._attributes.make(this._types.vec4(0, 0, 0, 0)),
+    };
+
+    this.resampleFactor = uniforms.resampleFactor;
+    this.resampleBias = uniforms.resampleBias;
+
+    // Has resize props?
+    const resize =
+      items != null || width != null || height != null || depth != null;
+
+    // Add padding
+    operator.pipe("resample.padding", uniforms);
+
+    // Prepare centered sampling offset
+    const vec = [];
+    let any = false;
+    const iterable = ["width", "height", "depth", "items"];
+    for (i = 0; i < iterable.length; i++) {
+      key = iterable[i];
+      const centered = this.centered[key];
+      if (!any) {
+        any = centered;
+      }
+      vec[i] = centered ? "0.5" : "0.0";
+    }
+
+    let vec4;
+
+    // Add centered sampling offset (from source)
+    if (any && resize) {
+      vec4 = `vec4(${vec})`;
+      operator.pipe(binaryOperator(4, "+", vec4));
+      indexer.pipe(binaryOperator(4, "+", vec4));
+    }
+
+    // Addressing relative to target
+    if (resize) {
+      operator.pipe("resample.relative", uniforms);
+      indexer.pipe("resample.relative", uniforms);
+    } else {
+      operator.pipe(identity("vec4"));
+      indexer.pipe(identity("vec4"));
+    }
+
+    // Remove centered sampling offset (to target)
+    if (any && resize) {
+      operator.pipe(binaryOperator(4, "-", vec4));
+      indexer.pipe(binaryOperator(4, "-", vec4));
+    }
+
+    // Make sampler
+    let sampler = this.bind.source.sourceShader(this._shaders.shader());
+
+    // Iterate over dimensions (items, width, height, depth)
+    const iterable1 = ["width", "height", "depth", "items"];
+    for (i = 0; i < iterable1.length; i++) {
+      key = iterable1[i];
+      const id = `lerp.${key}`;
+
+      if (this.props[key] != null) {
+        sampler = this._shaders.shader().require(sampler);
+        sampler.pipe(id, uniforms);
+      }
+    }
+
+    // Combine operator and composite lerp sampler
+    operator.pipe(sampler);
+
+    this.operator = operator;
+    this.indexer = indexer;
+
+    return (this.relativeSize = relativeSize);
+  }
+
+  unmake() {
+    super.unmake();
+    return (this.operator = null);
+  }
+
+  resize() {
+    if (this.bind.source == null) {
+      return;
+    }
+
+    const dims = this.bind.source.getActiveDimensions();
+    const target = this.getActiveDimensions();
+
+    const axis = (key) => {
+      const centered = this.centered[key];
+      const pad = this.padding[key];
+
+      target[key] += pad * 2;
+
+      const res = centered
+        ? dims[key] / Math.max(1, target[key])
+        : Math.max(1, dims[key] - 1) / Math.max(1, target[key] - 1);
+      return [res, pad];
+    };
+
+    const [rw, bw] = Array.from(axis("width"));
+    const [rh, bh] = Array.from(axis("height"));
+    const [rd, bd] = Array.from(axis("depth"));
+    const [ri, bi] = Array.from(axis("items"));
+
+    this.resampleFactor.value.set(rw, rh, rd, ri);
+    this.resampleBias.value.set(bw, bh, bd, bi);
+
+    return super.resize();
+  }
+
+  change(changed, touched, _init) {
+    if (touched["operator"] || touched["lerp"] || touched["sampler"]) {
+      return this.rebuild();
+    }
+  }
+}
+Lerp.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/operator/memo.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+class Memo extends Operator {
+  static initClass() {
+    this.traits = [
+      "node",
+      "bind",
+      "active",
+      "operator",
+      "source",
+      "index",
+      "texture",
+      "memo",
+    ];
+  }
+
+  sourceShader(shader) {
+    return this.memo.shaderAbsolute(shader, 1);
+  }
+
+  make() {
+    super.make();
+    if (this.bind.source == null) {
+      return;
+    }
+
+    // Listen for updates
+    this._helpers.active.make();
+    this._listen("root", "root.update", () => {
+      if (this.isActive) {
+        return this.update();
+      }
+    });
+
+    // Read sampling parameters
+    const { minFilter, magFilter, type } = this.props;
+
+    // Fetch geometry dimensions
+    const dims = this.bind.source.getDimensions();
+    const { items, width, height, depth } = dims;
+
+    // Prepare memoization RTT
+    this.memo = this._renderables.make("memo", {
+      items,
+      width,
+      height,
+      depth,
+      minFilter,
+      magFilter,
+      type,
+    });
+
+    // Build shader to remap data (do it after RTT creation to allow feedback)
+    const operator = this._shaders.shader();
+    this.bind.source.sourceShader(operator);
+
+    // Make screen renderable inside RTT scene
+    this.compose = this._renderables.make("memoScreen", {
+      map: operator,
+      items,
+      width,
+      height,
+      depth,
+    });
+    this.memo.adopt(this.compose);
+
+    this.objects = [this.compose];
+    return (this.renders = this.compose.renders);
+  }
+
+  unmake() {
+    super.unmake();
+
+    if (this.bind.source != null) {
+      this._helpers.active.unmake();
+
+      this.memo.unadopt(this.compose);
+      this.memo.dispose();
+
+      return (this.memo = this.compose = null);
+    }
+  }
+
+  update() {
+    return this.memo != null ? this.memo.render() : undefined;
+  }
+
+  resize() {
+    if (this.bind.source == null) {
+      return;
+    }
+
+    // Fetch geometry dimensions
+    const dims = this.bind.source.getActiveDimensions();
+    const { width, height, depth } = dims;
+
+    // Cover only part of the RTT viewport
+    this.compose.cover(width, height, depth);
+
+    return super.resize();
+  }
+
+  change(changed, touched, _init) {
+    if (touched["texture"] || touched["operator"]) {
+      return this.rebuild();
+    }
+  }
+}
+Memo.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/operator/readback.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+class Readback extends Primitive {
+  static initClass() {
+    this.traits = ["node", "bind", "operator", "readback", "entity", "active"];
+    this.finals = { channels: 4 };
+  }
+
+  init() {
+    this.emitter = this.root = null;
+    return (this.active = {});
+  }
+
+  make() {
+    super.make();
+
+    this._compute("readback.data", () =>
+      this.readback != null ? this.readback.data : undefined
+    );
+    this._compute("readback.items", () =>
+      this.readback != null ? this.readback.items : undefined
+    );
+    this._compute("readback.width", () =>
+      this.readback != null ? this.readback.width : undefined
+    );
+    this._compute("readback.height", () =>
+      this.readback != null ? this.readback.height : undefined
+    );
+    this._compute("readback.depth", () =>
+      this.readback != null ? this.readback.depth : undefined
+    );
+
+    // Bind to attached objects
+    this._helpers.bind.make([{ to: "operator.source", trait: "source" }]);
+
+    if (this.bind.source == null) {
+      return;
+    }
+
+    // Sampler props
+    const { type, channels, expr } = this.props;
+
+    // Listen for updates
+    this.root = this._inherit("root");
+    this._listen("root", "root.update", this.update);
+
+    // Fetch source dimensions
+    const { items, width, height, depth } = this.bind.source.getDimensions();
+
+    // Build shader to sample source data
+    const sampler = this.bind.source.sourceShader(this._shaders.shader());
+
+    // Prepare readback/memo RTT
+    this.readback = this._renderables.make("readback", {
+      map: sampler,
+      items,
+      width,
+      height,
+      depth,
+      channels,
+      type,
+    });
+
+    // Prepare readback consumer
+    if (expr != null) {
+      this.readback.setCallback(expr);
+    }
+
+    this._helpers.active.make();
+  }
+
+  unmake() {
+    if (this.readback != null) {
+      this.readback.dispose();
+      this.readback = null;
+
+      this.root = null;
+      this.emitter = null;
+      this.active = {};
+    }
+
+    this._helpers.active.unmake();
+    return this._helpers.bind.unmake();
+  }
+
+  update() {
+    if (this.readback == null) {
+      return;
+    }
+    if (this.isActive) {
+      this.readback.update(
+        this.root != null ? this.root.getCamera() : undefined
+      );
+      this.readback.post();
+      if (this.props.expr != null) {
+        this.readback.iterate();
+      }
+    }
+  }
+
+  resize() {
+    let sI, sJ;
+    if (this.readback == null) {
+      return;
+    }
+
+    // Fetch geometry/html dimensions
+    const { items, width, height, depth } =
+      this.bind.source.getActiveDimensions();
+
+    // Limit readback to active area
+    this.readback.setActive(items, width, height, depth);
+
+    // Recalculate iteration strides
+    this.strideI = sI = items;
+    this.strideJ = sJ = sI * width;
+    return (this.strideK = sJ * height);
+  }
+
+  change(changed, _touched, _init) {
+    if (changed["readback.type"]) {
+      return this.rebuild();
+    }
+
+    if (changed["readback.expr"] && this.readback) {
+      return this.readback.setCallback(this.props.expr);
+    }
+  }
+}
+Readback.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/operator/repeat.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+class Repeat extends Operator {
+  static initClass() {
+    this.traits = ["node", "bind", "operator", "source", "index", "repeat"];
+  }
+
+  indexShader(shader) {
+    shader.pipe(this.operator);
+    return super.indexShader(shader);
+  }
+
+  sourceShader(shader) {
+    shader.pipe(this.operator);
+    return super.sourceShader(shader);
+  }
+
+  getDimensions() {
+    return this._resample(this.bind.source.getDimensions());
+  }
+  getActiveDimensions() {
+    return this._resample(this.bind.source.getActiveDimensions());
+  }
+  getFutureDimensions() {
+    return this._resample(this.bind.source.getFutureDimensions());
+  }
+  getIndexDimensions() {
+    return this._resample(this.bind.source.getIndexDimensions());
+  }
+
+  _resample(dims) {
+    const r = this.resample;
+    return {
+      items: r.items * dims.items,
+      width: r.width * dims.width,
+      height: r.height * dims.height,
+      depth: r.depth * dims.depth,
+    };
+  }
+
+  make() {
+    super.make();
+    if (this.bind.source == null) {
+      return;
+    }
+
+    // Repeat multipliers
+    this.resample = {};
+
+    // Modulus on all 4 dimensions
+    const uniforms = {
+      repeatModulus: this._attributes.make(this._types.vec4()),
+    };
+    this.repeatModulus = uniforms.repeatModulus;
+
+    // Build shader to repeat along all dimensions
+    const transform = this._shaders.shader();
+    transform.pipe("repeat.position", uniforms);
+    return (this.operator = transform);
+  }
+
+  unmake() {
+    return super.unmake();
+  }
+
+  resize() {
+    if (this.bind.source != null) {
+      const dims = this.bind.source.getActiveDimensions();
+      this.repeatModulus.value.set(
+        dims.width,
+        dims.height,
+        dims.depth,
+        dims.items
+      );
+    }
+
+    return super.resize();
+  }
+
+  change(changed, touched, init) {
+    if (touched["operator"] || touched["repeat"]) {
+      return this.rebuild();
+    }
+
+    if (init) {
+      return ["items", "width", "height", "depth"].map(
+        (key) => (this.resample[key] = this.props[key])
+      );
+    }
+  }
+}
+Repeat.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/operator/swizzle.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+class Swizzle extends Operator {
+  static initClass() {
+    this.traits = ["node", "bind", "operator", "source", "index", "swizzle"];
+  }
+
+  sourceShader(shader) {
+    shader = super.sourceShader(shader);
+    if (this.swizzler) {
+      shader.pipe(this.swizzler);
+    }
+    return shader;
+  }
+
+  make() {
+    super.make();
+    if (this.bind.source == null) {
+      return;
+    }
+
+    // Swizzling order
+    const { order } = this.props;
+    if (order.join() !== "1234") {
+      return (this.swizzler = swizzleVec4(order, 4));
+    }
+  }
+
+  unmake() {
+    super.unmake();
+    return (this.swizzler = null);
+  }
+
+  change(changed, touched, _init) {
+    if (touched["swizzle"] || touched["operator"]) {
+      return this.rebuild();
+    }
+  }
+}
+Swizzle.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/operator/spread.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS104: Avoid inline assignments
+ * DS205: Consider reworking code to avoid use of IIFEs
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+class Spread extends Operator {
+  static initClass() {
+    this.traits = ["node", "bind", "operator", "source", "index", "spread"];
+  }
+
+  sourceShader(shader) {
+    return shader.pipe(this.operator);
+  }
+
+  make() {
+    super.make();
+    if (this.bind.source == null) {
+      return;
+    }
+
+    // Uniforms
+    const uniforms = {
+      spreadMatrix: this._attributes.make(this._types.mat4()),
+      spreadOffset: this._attributes.make(this._types.vec4()),
+    };
+
+    this.spreadMatrix = uniforms.spreadMatrix;
+    this.spreadOffset = uniforms.spreadOffset;
+
+    // Build shader to spread data on one dimension
+    const transform = this._shaders.shader();
+    transform.require(this.bind.source.sourceShader(this._shaders.shader()));
+    transform.pipe("spread.position", uniforms);
+
+    return (this.operator = transform);
+  }
+
+  unmake() {
+    return super.unmake();
+  }
+
+  resize() {
+    this.update();
+    return super.resize();
+  }
+
+  update() {
+    // Size to fit to include future history
+    let key, i, k, v;
+    const dims = this.bind.source.getFutureDimensions();
+
+    const matrix = this.spreadMatrix.value;
+    const els = matrix.elements;
+
+    const order = ["width", "height", "depth", "items"];
+    const align = ["alignWidth", "alignHeight", "alignDepth", "alignItems"];
+
+    const { unit } = this.props;
+    const unitEnum = this.node.attributes["spread.unit"].enum;
+
+    const map = (() => {
+      switch (unit) {
+        case unitEnum.relative:
+          return (key, i, k, v) =>
+            (els[i * 4 + k] = v / Math.max(1, dims[key] - 1));
+        case unitEnum.absolute:
+          return (key, i, k, v) => (els[i * 4 + k] = v);
+      }
+    })();
+
+    return (() => {
+      const result = [];
+      for (i = 0; i < order.length; i++) {
+        let offset;
+        key = order[i];
+        const spread = this.props[key];
+        const anchor = this.props[align[i]];
+
+        if (spread != null) {
+          const d = dims[key] != null ? dims[key] : 1;
+          offset = -(d - 1) * (0.5 - anchor * 0.5);
+        } else {
+          offset = 0;
+        }
+        this.spreadOffset.value.setComponent(i, offset);
+
+        result.push(
+          (() => {
+            const result1 = [];
+            for (k = 0; k <= 3; k++) {
+              let left;
+              v =
+                (left = spread != null ? spread.getComponent(k) : undefined) !=
+                null
+                  ? left
+                  : 0;
+              result1.push((els[i * 4 + k] = map(key, i, k, v)));
+            }
+            return result1;
+          })()
+        );
+      }
+      return result;
+    })();
+  }
+
+  change(changed, touched, _init) {
+    if (touched["operator"]) {
+      return this.rebuild();
+    }
+
+    if (touched["spread"]) {
+      return this.update();
+    }
+  }
+}
+Spread.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/operator/split.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS104: Avoid inline assignments
+ * DS205: Consider reworking code to avoid use of IIFEs
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+/*
+split:
+  order:       Types.transpose('wxyz')
+  axis:        Types.axis()
+  length:      Types.int(1)
+  overlap:     Types.int(0)
+*/
+
+class Split extends Operator {
+  static initClass() {
+    this.traits = ["node", "bind", "operator", "source", "index", "split"];
+  }
+
+  indexShader(shader) {
+    shader.pipe(this.operator);
+    return super.indexShader(shader);
+  }
+
+  sourceShader(shader) {
+    shader.pipe(this.operator);
+    return super.sourceShader(shader);
+  }
+
+  getDimensions() {
+    return this._resample(this.bind.source.getDimensions());
+  }
+  getActiveDimensions() {
+    return this._resample(this.bind.source.getActiveDimensions());
+  }
+  getFutureDimensions() {
+    return this._resample(this.bind.source.getFutureDimensions());
+  }
+  getIndexDimensions() {
+    return this._resample(this.bind.source.getIndexDimensions());
+  }
+
+  _resample(dims) {
+    let dim;
+    const { order } = this;
+    const { axis } = this;
+    const { overlap } = this;
+    const { length } = this;
+    const { stride } = this;
+
+    const labels = ["width", "height", "depth", "items"];
+    const mapped = order.map((x) => labels[x - 1]);
+    const index = order.indexOf(axis);
+    let set = (() => {
+      const result = [];
+      for (dim of Array.from(mapped)) {
+        result.push(dims[dim]);
+      }
+      return result;
+    })();
+    const remain = Math.floor((set[index] - overlap) / stride);
+
+    set.splice(index, 1, length, remain);
+    set = set.slice(0, 4);
+
+    const out = {};
+    for (let i = 0; i < mapped.length; i++) {
+      dim = mapped[i];
+      out[dim] = set[i];
+    }
+
+    //console.log 'split', order, axis, length, stride
+    //console.log dims, out
+
+    return out;
+  }
+
+  make() {
+    let left;
+    super.make();
+    if (this.bind.source == null) {
+      return;
+    }
+
+    const { order } = this.props;
+    let { axis } = this.props;
+    let { overlap } = this.props;
+    const { length } = this.props;
+
+    /*
+    Calculate index transform
+
+    order: wxyz
+    length: 3
+    overlap: 1
+
+    axis: w
+    index: 0
+    split: wx
+    rest:  0yz0
+           s
+
+    axis: x
+    index: 1
+    split: xy
+    rest:  w0z0
+            s
+
+    axis: y
+    index: 2
+    split: yz
+    rest:  wx00
+             s
+
+    axis: z
+    index: 3
+    split: z0
+    rest: wxy0
+             s
+
+    */
+
+    const permute = order.join("");
+    if (axis == null) {
+      axis = order[0];
+    }
+
+    const index = permute.indexOf(axis);
+    const split =
+      permute[index] + ((left = permute[index + 1]) != null ? left : 0);
+    const rest = permute.replace(split[1], "").replace(split[0], "0") + "0";
+
+    // Prepare uniforms
+    overlap = Math.min(length - 1, overlap);
+    const stride = length - overlap;
+
+    const uniforms = {
+      splitStride: this._attributes.make(this._types.number(stride)),
+    };
+
+    // Build shader to split a dimension into two
+    const transform = this._shaders.shader();
+    transform.require(swizzleVec4(split, 2));
+    transform.require(swizzleVec4(rest, 4));
+    transform.require(injectVec4(index));
+    transform.pipe("split.position", uniforms);
+    transform.pipe(invertSwizzleVec4(order));
+
+    this.operator = transform;
+
+    this.order = order;
+    this.axis = axis;
+    this.overlap = overlap;
+    this.length = length;
+    return (this.stride = stride);
+  }
+
+  unmake() {
+    return super.unmake();
+  }
+
+  change(changed, touched, _init) {
+    if (
+      changed["split.axis"] ||
+      changed["split.order"] ||
+      touched["operator"]
+    ) {
+      return this.rebuild();
+    }
+  }
+}
+Split.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/operator/slice.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+class Slice extends Operator {
+  static initClass() {
+    this.traits = ["node", "bind", "operator", "source", "index", "slice"];
+  }
+
+  getDimensions() {
+    return this._resample(this.bind.source.getDimensions());
+  }
+  getActiveDimensions() {
+    return this._resample(this.bind.source.getActiveDimensions());
+  }
+  getFutureDimensions() {
+    return this._resample(this.bind.source.getFutureDimensions());
+  }
+  getIndexDimensions() {
+    return this._resample(this.bind.source.getIndexDimensions());
+  }
+
+  sourceShader(shader) {
+    shader.pipe("slice.position", this.uniforms);
+    return this.bind.source.sourceShader(shader);
+  }
+
+  _resolve(key, dims) {
+    const range = this.props[key];
+    const dim = dims[key];
+    if (range == null) {
+      return [0, dim];
+    }
+
+    const index = function (i, dim) {
+      if (i < 0) {
+        return dim + i;
+      } else {
+        return i;
+      }
+    };
+
+    const start = index(Math.round(range.x), dim);
+    let end = index(Math.round(range.y), dim);
+
+    end = Math.max(start, end);
+    return [start, end - start];
+  }
+
+  _resample(dims) {
+    dims.width = this._resolve("width", dims)[1];
+    dims.height = this._resolve("height", dims)[1];
+    dims.depth = this._resolve("depth", dims)[1];
+    dims.items = this._resolve("items", dims)[1];
+    return dims;
+  }
+
+  make() {
+    super.make();
+    if (this.bind.source == null) {
+      return;
+    }
+
+    return (this.uniforms = {
+      sliceOffset: this._attributes.make(this._types.vec4()),
+    });
+  }
+
+  unmake() {
+    return super.unmake();
+  }
+
+  resize() {
+    if (this.bind.source == null) {
+      return;
+    }
+
+    const dims = this.bind.source.getActiveDimensions();
+
+    this.uniforms.sliceOffset.value.set(
+      this._resolve("width", dims)[0],
+      this._resolve("height", dims)[0],
+      this._resolve("depth", dims)[0],
+      this._resolve("items", dims)[0]
+    );
+
+    return super.resize();
+  }
+
+  change(changed, touched, _init) {
+    if (touched["operator"]) {
+      return this.rebuild();
+    }
+
+    if (touched["slice"]) {
+      return this.resize();
+    }
+  }
+}
+Slice.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/operator/subdivide.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+class Subdivide extends Operator {
+  static initClass() {
+    this.traits = ["node", "bind", "operator", "source", "index", "subdivide"];
+  }
+
+  indexShader(shader) {
+    shader.pipe(this.indexer);
+    return super.indexShader(shader);
+  }
+
+  sourceShader(shader) {
+    return shader.pipe(this.operator);
+  }
+
+  getDimensions() {
+    return this._resample(this.bind.source.getDimensions());
+  }
+  getActiveDimensions() {
+    return this._resample(this.bind.source.getActiveDimensions());
+  }
+  getFutureDimensions() {
+    return this._resample(this.bind.source.getFutureDimensions());
+  }
+  getIndexDimensions() {
+    return this._resample(this.bind.source.getIndexDimensions());
+  }
+
+  _resample(dims) {
+    const r = this.resampled;
+
+    dims.items--;
+    dims.width--;
+    dims.height--;
+    dims.depth--;
+
+    if (r.items != null) {
+      dims.items *= r.items;
+    }
+    if (r.width != null) {
+      dims.width *= r.width;
+    }
+    if (r.height != null) {
+      dims.height *= r.height;
+    }
+    if (r.depth != null) {
+      dims.depth *= r.depth;
+    }
+
+    dims.items++;
+    dims.width++;
+    dims.height++;
+    dims.depth++;
+
+    return dims;
+  }
+
+  make() {
+    super.make();
+    if (this.bind.source == null) {
+      return;
+    }
+
+    // Get resampled dimensions
+    let { lerp } = this.props;
+    const { items, width, height, depth } = this.props;
+
+    this.resampled = {};
+    if (items != null) {
+      this.resampled.items = items;
+    }
+    if (width != null) {
+      this.resampled.width = width;
+    }
+    if (height != null) {
+      this.resampled.height = height;
+    }
+    if (depth != null) {
+      this.resampled.depth = depth;
+    }
+
+    // Build shader to resample data
+    const operator = this._shaders.shader();
+    const indexer = this._shaders.shader();
+
+    // Uniforms
+    const uniforms = {
+      resampleFactor: this._attributes.make(this._types.vec4(0, 0, 0, 0)),
+      subdivideBevel: this.node.attributes["subdivide.bevel"],
+    };
+
+    this.resampleFactor = uniforms.resampleFactor;
+    this.resampleBias = uniforms.resampleBias;
+
+    // Has resize props?
+    const resize =
+      items != null || width != null || height != null || depth != null;
+
+    // Addressing relative to target
+    if (resize) {
+      operator.pipe("resample.relative", uniforms);
+      indexer.pipe("resample.relative", uniforms);
+    } else {
+      operator.pipe(identity("vec4"));
+      indexer.pipe(identity("vec4"));
+    }
+
+    // Make sampler
+    let sampler = this.bind.source.sourceShader(this._shaders.shader());
+    lerp = lerp ? ".lerp" : "";
+
+    // Iterate over dimensions (items, width, height, depth)
+    const iterable = ["width", "height", "depth", "items"];
+    for (let i = 0; i < iterable.length; i++) {
+      const key = iterable[i];
+      const id = `subdivide.${key}${lerp}`;
+
+      if (this.props[key] != null) {
+        sampler = this._shaders.shader().require(sampler);
+        sampler.pipe(id, uniforms);
+      }
+    }
+
+    // Combine operator and composite lerp sampler
+    operator.pipe(sampler);
+
+    this.operator = operator;
+    return (this.indexer = indexer);
+  }
+
+  unmake() {
+    super.unmake();
+    return (this.operator = null);
+  }
+
+  resize() {
+    if (this.bind.source == null) {
+      return;
+    }
+
+    const dims = this.bind.source.getActiveDimensions();
+    const target = this.getActiveDimensions();
+
+    const axis = (key) =>
+      Math.max(1, dims[key] - 1) / Math.max(1, target[key] - 1);
+
+    const rw = axis("width");
+    const rh = axis("height");
+    const rd = axis("depth");
+    const ri = axis("items");
+
+    this.resampleFactor.value.set(rw, rh, rd, ri);
+
+    return super.resize();
+  }
+
+  change(changed, touched, _init) {
+    if (touched["operator"] || touched["subdivide"]) {
+      return this.rebuild();
+    }
+  }
+}
+Subdivide.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/operator/transpose.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+const labels = {
+  1: "width",
+  2: "height",
+  3: "depth",
+  4: "items",
+};
+
+class Transpose extends Operator {
+  static initClass() {
+    this.traits = ["node", "bind", "operator", "source", "index", "transpose"];
+  }
+
+  indexShader(shader) {
+    if (this.swizzler) {
+      shader.pipe(this.swizzler);
+    }
+    return super.indexShader(shader);
+  }
+
+  sourceShader(shader) {
+    if (this.swizzler) {
+      shader.pipe(this.swizzler);
+    }
+    return super.sourceShader(shader);
+  }
+
+  getDimensions() {
+    return this._remap(this.transpose, this.bind.source.getDimensions());
+  }
+  getActiveDimensions() {
+    return this._remap(this.transpose, this.bind.source.getActiveDimensions());
+  }
+  getFutureDimensions() {
+    return this._remap(this.transpose, this.bind.source.getFutureDimensions());
+  }
+  getIndexDimensions() {
+    return this._remap(this.transpose, this.bind.source.getIndexDimensions());
+  }
+
+  _remap(transpose, dims) {
+    // Map dimensions onto their new axis
+    const out = {};
+
+    for (let i = 0; i <= 3; i++) {
+      const dst = labels[i + 1];
+      const src = labels[transpose[i]];
+      out[dst] = dims[src] != null ? dims[src] : 1;
+    }
+
+    return out;
+  }
+
+  make() {
+    super.make();
+    if (this.bind.source == null) {
+      return;
+    }
+
+    // Transposition order
+    const { order } = this.props;
+    if (order.join() !== "1234") {
+      this.swizzler = invertSwizzleVec4(order);
+    }
+    this.transpose = order;
+
+    // Notify of reallocation
+    return this.trigger({
+      type: "source.rebuild",
+    });
+  }
+
+  unmake() {
+    super.unmake();
+    return (this.swizzler = null);
+  }
+
+  change(changed, touched, _init) {
+    if (touched["transpose"] || touched["operator"]) {
+      return this.rebuild();
+    }
+  }
+}
+Transpose.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/operator/index.js
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+;// CONCATENATED MODULE: ./src/primitives/types/present/transition.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+class Transition extends Parent {
+  static initClass() {
+    this.traits = [
+      "node",
+      "transition",
+      "transform",
+      "mask",
+      "visible",
+      "active",
+    ];
+  }
+
+  init() {
+    this.animate = null;
+    this.uniforms = null;
+
+    this.state = {
+      isVisible: true,
+      isActive: true,
+      enter: 1,
+      exit: 1,
+    };
+
+    this.latched = null;
+    return (this.locked = null);
+  }
+
+  make() {
+    this.uniforms = {
+      transitionFrom: this._attributes.make(this._types.vec4()),
+      transitionTo: this._attributes.make(this._types.vec4()),
+
+      transitionActive: this._attributes.make(this._types.bool()),
+      transitionScale: this._attributes.make(this._types.vec4()),
+      transitionBias: this._attributes.make(this._types.vec4()),
+      transitionEnter: this._attributes.make(this._types.number()),
+      transitionExit: this._attributes.make(this._types.number()),
+      transitionSkew: this._attributes.make(this._types.number()),
+    };
+
+    const slideParent = this._inherit("slide");
+    const visibleParent = this._inherit("visible");
+    const activeParent = this._inherit("active");
+
+    this._listen(slideParent, "transition.latch", (e) => this.latch(e.step));
+    this._listen(slideParent, "transition.release", () => this.release());
+
+    this._listen(visibleParent, "visible.change", () => {
+      //console.log @node.toString(), 'visible.change ^', visibleParent.isVisible
+      return this.update((this.state.isVisible = visibleParent.isVisible));
+    });
+
+    this._listen(activeParent, "active.change", () => {
+      //console.log @node.toString(), 'active.change ^', activeParent.isActive
+      return this.update((this.state.isActive = activeParent.isActive));
+    });
+
+    this.animate = this._animator.make(this._types.vec2(1, 1), {
+      step: (value) => {
+        this.state.enter = value.x;
+        this.state.exit = value.y;
+        return this.update();
+      },
+      complete: (done) => this.complete(done),
+    });
+
+    return (this.move = this.props.from != null || this.props.to != null);
+  }
+
+  //@_helpers.visible.make()
+  //@_helpers.active.make()
+
+  unmake() {
+    return this.animate.dispose();
+  }
+
+  //@_helpers.visible.unmake()
+  //@_helpers.active.unmake()
+
+  latch(step) {
+    let latched;
+    this.locked = null;
+    this.latched = latched = {
+      isVisible: this.state.isVisible,
+      isActive: this.state.isActive,
+      step,
+    };
+
+    // Reset enter/exit animation if invisible
+    const visible = this.isVisible;
+    if (!visible) {
+      const forward = latched.step >= 0;
+      const [enter, exit] = Array.from(forward ? [0, 1] : [1, 0]);
+      return this.animate.set(enter, exit);
+    }
+  }
+
+  //console.log @node.toString(), 'transition::latch', @latched, enter, exit
+
+  release() {
+    // Get before/after and unlatch state
+    const { latched } = this;
+    const { state } = this;
+    this.latched = null;
+
+    //console.log @node.toString(), 'transition::release', JSON.parse JSON.stringify {latched, state}
+
+    //p = @; console.log '-> ', p.node.toString(), p.isVisible while p = p._inherit 'visible'
+
+    // Transition if visibility state change
+    if (latched.isVisible !== state.isVisible) {
+      // Maintain step direction
+      const forward = latched.step >= 0;
+      const visible = state.isVisible;
+      const [enter, exit] = Array.from(
+        visible ? [1, 1] : forward ? [1, 0] : [0, 1]
+      );
+
+      // Get duration
+      let { duration, durationEnter, durationExit } = this.props;
+      if (durationEnter == null) {
+        durationEnter = duration;
+      }
+      if (durationExit == null) {
+        durationExit = duration;
+      }
+      duration = visible * durationEnter + !visible * durationExit;
+
+      // Get delay
+      let { delay, delayEnter, delayExit } = this.props;
+      if (delayEnter == null) {
+        delayEnter = delay;
+      }
+      if (delayExit == null) {
+        delayExit = delay;
+      }
+      delay = visible * delayEnter + !visible * delayExit;
+
+      // Animate enter/exit
+      //console.log @node.toString(), '@animate.immediate', {x: enter, y: exit}, {duration, delay, ease: 'linear'}
+      this.animate.immediate(
+        { x: enter, y: exit },
+        { duration, delay, ease: "linear" }
+      );
+
+      // Lock visibility and active open during transition
+      this.locked = {
+        isVisible: true,
+        isActive: latched.isActive || state.isActive,
+      };
+    }
+
+    return this.update();
+  }
+
+  complete(done) {
+    if (!done) {
+      return;
+    }
+    this.locked = null;
+    return this.update();
+  }
+
+  update() {
+    if (this.latched != null) {
+      return;
+    } // latched
+
+    let { enter, exit } = this.props;
+
+    // Resolve transition state
+    if (enter == null) {
+      ({ enter } = this.state);
+    }
+    if (exit == null) {
+      ({ exit } = this.state);
+    }
+
+    const level = enter * exit;
+    let visible = level > 0;
+    const partial = level < 1;
+
+    this.uniforms.transitionEnter.value = enter;
+    this.uniforms.transitionExit.value = exit;
+    this.uniforms.transitionActive.value = partial;
+
+    // Resolve visibility state
+    if (visible) {
+      visible = !!this.state.isVisible;
+    }
+    if (this.locked != null) {
+      visible = this.locked.isVisible;
+    }
+
+    if (this.isVisible !== visible) {
+      this.isVisible = visible;
+      this.trigger({ type: "visible.change" });
+    }
+
+    // Resolve active state
+    const active = !!(
+      this.state.isActive ||
+      (this.locked != null ? this.locked.isActive : undefined)
+    );
+
+    if (this.isActive !== active) {
+      this.isActive = active;
+      return this.trigger({ type: "active.change" });
+    }
+  }
+
+  //console.log 'transition update', 'enter', enter, 'exit', exit, 'visible', visible, 'active', active
+
+  change(changed, touched, init) {
+    if (changed["transition.enter"] || changed["transition.exit"] || init) {
+      this.update();
+    }
+
+    if (changed["transition.stagger"] || init) {
+      const { stagger } = this.props;
+
+      // Precompute shader constants
+
+      const flipX = stagger.x < 0;
+      const flipY = stagger.y < 0;
+      const flipZ = stagger.z < 0;
+      const flipW = stagger.w < 0;
+
+      const staggerX = Math.abs(stagger.x);
+      const staggerY = Math.abs(stagger.y);
+      const staggerZ = Math.abs(stagger.z);
+      const staggerW = Math.abs(stagger.w);
+
+      this.uniforms.transitionSkew.value =
+        staggerX + staggerY + staggerZ + staggerW;
+
+      this.uniforms.transitionScale.value.set(
+        (1 - flipX * 2) * staggerX,
+        (1 - flipY * 2) * staggerY,
+        (1 - flipZ * 2) * staggerZ,
+        (1 - flipW * 2) * staggerW
+      );
+
+      return this.uniforms.transitionBias.value.set(
+        flipX * staggerX,
+        flipY * staggerY,
+        flipZ * staggerZ,
+        flipW * staggerW
+      );
+    }
+  }
+}
+Transition.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/present/move.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining
+ * DS104: Avoid inline assignments
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+class Move extends Transition {
+  static initClass() {
+    this.traits = ["node", "transition", "vertex", "move", "visible", "active"];
+  }
+
+  make() {
+    super.make();
+
+    const object = {
+      moveFrom: this.node.attributes["move.from"],
+      moveTo: this.node.attributes["move.to"],
+    };
+    for (const k in object) {
+      const v = object[k];
+      this.uniforms[k] = v;
+    }
+  }
+
+  vertex(shader, pass) {
+    let left;
+    if (pass === this.props.pass) {
+      shader.pipe("move.position", this.uniforms);
+    }
+    return (left = move_guard_(this._inherit("vertex"), (x) =>
+      x.vertex(shader, pass)
+    )) != null
+      ? left
+      : shader;
+  }
+}
+Move.initClass();
+
+function move_guard_(value, transform) {
+  return typeof value !== "undefined" && value !== null
+    ? transform(value)
+    : undefined;
+}
+
+;// CONCATENATED MODULE: ./src/util/ease.js
+function ease_clamp(x, a, b) {
+  return Math.max(a, Math.min(b, x));
+}
+
+function cosine(x) {
+  return 0.5 - 0.5 * Math.cos(ease_clamp(x, 0, 1) * Math.PI);
+}
+
+function binary(x) {
+  return +(x >= 0.5);
+}
+
+function hold(x) {
+  return +(x >= 1);
+}
+
+;// CONCATENATED MODULE: ./src/primitives/types/present/track.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS104: Avoid inline assignments
+ * DS205: Consider reworking code to avoid use of IIFEs
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+const deepCopy = function (x) {
+  const out = {};
+  for (const k in x) {
+    const v = x[k];
+    if (v instanceof Array) {
+      out[k] = v.slice();
+    } else if (v != null && typeof v === "object") {
+      out[k] = deepCopy(v);
+    } else {
+      out[k] = v;
+    }
+  }
+
+  return out;
+};
+
+class Track extends Primitive {
+  static initClass() {
+    this.traits = ["node", "track", "seek", "bind"];
+  }
+
+  init() {
+    this.handlers = {};
+    this.script = null;
+    this.values = null;
+    this.playhead = 0;
+    this.velocity = null;
+    this.section = null;
+    return (this.expr = null);
+  }
+
+  make() {
+    // Bind to attached data sources
+    let ref;
+    this._helpers.bind.make([
+      { to: "track.target", trait: "node", callback: null },
+    ]);
+
+    const { script } = this.props;
+    const { node } = this.bind.target;
+
+    this.targetNode = node;
+    return (
+      ([this.script, this.values, this.start, this.end] = Array.from(
+        (ref = this._process(node, script))
+      )),
+      ref
+    );
+  }
+
+  unmake() {
+    this.unbindExpr();
+    this._helpers.bind.unmake();
+    this.script =
+      this.values =
+      this.start =
+      this.end =
+      this.section =
+      this.expr =
+        null;
+    return (this.playhead = 0);
+  }
+
+  // Bind animated expressions
+  bindExpr(expr) {
+    this.unbindExpr();
+    this.expr = expr;
+    this.targetNode.bind(expr, true);
+
+    // Measure playhead velocity on attribute computation
+    const { clock } = this.targetNode;
+    const self = this;
+    return this._attributes.bind(
+      (this.measure = (function () {
+        let playhead = null;
+        return () => {
+          const { step } = clock.getTime();
+          if (playhead != null) {
+            self.velocity = (self.playhead - playhead) / step;
+          }
+          return (playhead = self.playhead);
+        };
+      })())
+    );
+  }
+
+  unbindExpr() {
+    if (this.expr != null) {
+      this.targetNode.unbind(this.expr, true);
+    }
+    if (this.measure != null) {
+      this._attributes.unbind(this.measure);
+    }
+    return (this.expr = this.measure = null);
+  }
+
+  // Process script steps by filling out missing props
+  _process(object, script) {
+    let k, key, last, message, s, step, v;
+    if (script instanceof Array) {
+      // Normalize array to numbered dict
+      s = {};
+      for (let i = 0; i < script.length; i++) {
+        step = script[i];
+        s[i] = step;
+      }
+      script = s;
+    }
+
+    // Normalize keyed steps to array of step objects
+    s = [];
+    for (key in script) {
+      step = script[key];
+      if (step == null) {
+        step = [];
+      }
+
+      if (step instanceof Array) {
+        // [props, expr] array
+        step = {
+          key: +key,
+          props: step[0] != null ? deepCopy(step[0]) : {},
+          expr: step[1] != null ? deepCopy(step[1]) : {},
+        };
+      } else {
+        if (step.key == null && !step.props && !step.expr) {
+          // Direct props object (iffy, but people will do this anyhow)
+          step = { props: deepCopy(step) };
+        } else {
+          // Proper step
+          step = deepCopy(step);
+        }
+
+        // Prepare step object
+        step.key = step.key != null ? +step.key : +key;
+        if (step.props == null) {
+          step.props = {};
+        }
+        if (step.expr == null) {
+          step.expr = {};
+        }
+      }
+
+      s.push(step);
+    }
+    script = s;
+
+    if (!script.length) {
+      return [[], {}, 0, 0];
+    }
+
+    // Sort by keys
+    script.sort((a, b) => a.key - b.key);
+    const start = script[0].key;
+    const end = script[script.length - 1].key;
+
+    // Connect steps
+    for (key in script) {
+      step = script[key];
+      if (last != null) {
+        last.next = step;
+      }
+      last = step;
+    }
+
+    // Last step leads to itself
+    last.next = last;
+    script = s;
+
+    // Determine starting props
+    const props = {};
+    const values = {};
+    for (key in script) {
+      step = script[key];
+      for (k in step.props) {
+        v = step.props[k];
+        props[k] = true;
+      }
+    }
+    for (key in script) {
+      step = script[key];
+      for (k in step.expr) {
+        v = step.expr[k];
+        props[k] = true;
+      }
+    }
+    for (k in props) {
+      props[k] = object.get(k);
+    }
+    try {
+      // Need two sources and one destination value for correct mixing of live expressions
+      for (k in props) {
+        values[k] = [
+          object.attribute(k).T.make(),
+          object.attribute(k).T.make(),
+          object.attribute(k).T.make(),
+        ];
+      }
+    } catch (error) {
+      console.warn(this.node.toMarkup());
+      message = `${this.node.toString()} - Target ${object} has no \`${k}\` property`;
+      throw new Error(message);
+    }
+
+    const result = [];
+
+    // Normalize script props, insert held values
+    for (step of Array.from(script)) {
+      for (k in props) {
+        v = props[k];
+        v = object.validate(k, step.props[k] != null ? step.props[k] : v);
+        props[k] = step.props[k] = v;
+
+        if (step.expr[k] != null && typeof step.expr[k] !== "function") {
+          console.warn(this.node.toMarkup());
+          message = `${this.node.toString()} - Expression \`${
+            step.expr[k]
+          }\` on property \`${k}\` is not a function`;
+          throw new Error(message);
+        }
+      }
+      result.push(step);
+    }
+
+    return [result, values, start, end];
+  }
+
+  update() {
+    let { playhead } = this;
+    const { script } = this;
+    const { ease, seek } = this.props;
+    const node = this.targetNode;
+
+    if (seek != null) {
+      playhead = seek;
+    }
+
+    if (script.length) {
+      let k;
+      const find = function () {
+        let last = script[0];
+        for (let i = 0; i < script.length; i++) {
+          const step = script[i];
+          if (step.key > playhead) {
+            break;
+          }
+          last = step;
+        }
+        return last;
+      };
+
+      let { section } = this;
+      if (!section || playhead < section.key || playhead > section.next.key) {
+        section = find(script, playhead);
+      }
+
+      if (section === this.section) {
+        return;
+      }
+      this.section = section;
+
+      const from = section;
+      const to = section.next;
+      const start = from.key;
+      const end = to.key;
+
+      // Easing of playhead along track
+      const easeMethod = (() => {
+        switch (ease) {
+          case "linear":
+          case 0:
+            return ease_clamp;
+          case "cosine":
+          case 1:
+            return cosine;
+          case "binary":
+          case 2:
+            return binary;
+          case "hold":
+          case 3:
+            return hold;
+          default:
+            return cosine;
+        }
+      })();
+
+      // Callback for live playhead interpolator (linear approx time travel)
+      const { clock } = node;
+      const getPlayhead = (time) => {
+        if (this.velocity == null) {
+          return this.playhead;
+        }
+        const now = clock.getTime();
+        return this.playhead + this.velocity * (time - now.time);
+      };
+
+      const getLerpFactor = (function () {
+        const scale = 1 / Math.max(0.0001, end - start);
+        return (time) => easeMethod((getPlayhead(time) - start) * scale, 0, 1);
+      })();
+
+      // Create prop expression interpolator
+      const live = (key) => {
+        const fromE = from.expr[key];
+        const toE = to.expr[key];
+        const fromP = from.props[key];
+        const toP = to.props[key];
+
+        const invalid = function () {
+          console.warn(node.toMarkup());
+          throw new Error(
+            `${this.node.toString()} - Invalid expression result on track \`${key}\``
+          );
+        };
+
+        const attr = node.attribute(key);
+        const values = this.values[key];
+        const animator = this._animator;
+
+        // Lerp between two expressions
+        if (fromE && toE) {
+          return ((values, _from, _to) =>
+            function (time, delta) {
+              let _from, _to;
+              values[0] = _from = attr.T.validate(
+                fromE(time, delta),
+                values[0],
+                invalid
+              );
+              values[1] = _to = attr.T.validate(
+                toE(time, delta),
+                values[1],
+                invalid
+              );
+              return (values[2] = animator.lerp(
+                attr.T,
+                _from,
+                _to,
+                getLerpFactor(time),
+                values[2]
+              ));
+            })(values, from, to);
+
+          // Lerp between an expression and a constant
+        } else if (fromE) {
+          return ((values, _from, _to) =>
+            function (time, delta) {
+              let _from;
+              values[0] = _from = attr.T.validate(
+                fromE(time, delta),
+                values[0],
+                invalid
+              );
+              return (values[1] = animator.lerp(
+                attr.T,
+                _from,
+                toP,
+                getLerpFactor(time),
+                values[1]
+              ));
+            })(values, from, to);
+
+          // Lerp between a constant and an expression
+        } else if (toE) {
+          return ((values, _from, _to) =>
+            function (time, delta) {
+              let _to;
+              values[0] = _to = attr.T.validate(
+                toE(time, delta),
+                values[0],
+                invalid
+              );
+              return (values[1] = animator.lerp(
+                attr.T,
+                fromP,
+                _to,
+                getLerpFactor(time),
+                values[1]
+              ));
+            })(values, from, to);
+
+          // Lerp between two constants
+        } else {
+          return (
+            (values, _from, _to) => (time, _delta) =>
+              (values[0] = animator.lerp(
+                attr.T,
+                fromP,
+                toP,
+                getLerpFactor(time),
+                values[0]
+              ))
+          )(values, from, to);
+        }
+      };
+
+      // Handle expr / props on both ends
+      const expr = {};
+      for (k in from.expr) {
+        if (expr[k] == null) {
+          expr[k] = live(k);
+        }
+      }
+      for (k in to.expr) {
+        if (expr[k] == null) {
+          expr[k] = live(k);
+        }
+      }
+      for (k in from.props) {
+        if (expr[k] == null) {
+          expr[k] = live(k);
+        }
+      }
+      for (k in to.props) {
+        if (expr[k] == null) {
+          expr[k] = live(k);
+        }
+      }
+
+      // Bind node props
+      return this.bindExpr(expr);
+    }
+  }
+
+  change(changed, touched, init) {
+    if (
+      changed["track.target"] ||
+      changed["track.script"] ||
+      changed["track.mode"]
+    ) {
+      return this.rebuild();
+    }
+
+    if (changed["seek.seek"] || init) {
+      return this.update();
+    }
+  }
+}
+Track.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/present/play.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+class Play extends Track {
+  static initClass() {
+    this.traits = ["node", "track", "trigger", "play", "bind"];
+  }
+
+  init() {
+    super.init();
+    this.skew = null;
+    return (this.start = null);
+  }
+
+  reset(go) {
+    if (go == null) {
+      go = true;
+    }
+    this.skew = go ? 0 : null;
+    return (this.start = null);
+  }
+
+  make() {
+    super.make();
+
+    // Start on slide, or immediately if not inside slide
+    this._listen("slide", "slide.step", (e) => {
+      const { trigger } = this.props;
+      if (trigger != null && e.index === trigger) {
+        return this.reset();
+      }
+      if (trigger != null && e.index === 0) {
+        return this.reset(false);
+      }
+    });
+    if (!this.props.trigger || this._inherit("slide") == null) {
+      this.reset();
+    }
+
+    // Find parent clock
+    const parentClock = this._inherit("clock");
+
+    // Update clock
+    return this._listen(parentClock, "clock.tick", () => {
+      const { from, to, speed, pace, delay, realtime } = this.props;
+
+      const time = parentClock.getTime();
+      if (this.skew != null) {
+        const now = realtime ? time.time : time.clock;
+        const delta = realtime ? time.delta : time.step;
+        const ratio = speed / pace;
+
+        if (this.start == null) {
+          this.start = now;
+        }
+        this.skew += delta * (ratio - 1);
+
+        let offset = Math.max(0, now - this.start + this.skew - delay * ratio);
+        if (this.props.loop) {
+          offset = offset % (to - from);
+        }
+
+        this.playhead = Math.min(to, from + offset);
+      } else {
+        this.playhead = 0;
+      }
+
+      return this.update();
+    });
+  }
+
+  update() {
+    return super.update();
+  }
+
+  change(changed, touched, init) {
+    if (changed["trigger.trigger"] || changed["play.realtime"]) {
+      return this.rebuild();
+    }
+    return super.change(changed, touched, init);
+  }
+}
+Play.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/present/present.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS104: Avoid inline assignments
+ * DS202: Simplify dynamic range loops
+ * DS205: Consider reworking code to avoid use of IIFEs
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+class Present extends Parent {
+  static initClass() {
+    this.traits = ["node", "present"];
+  }
+
+  init() {}
+
+  make() {
+    this.nodes = [];
+    this.steps = [];
+    this.length = 0;
+    this.last = [];
+    this.index = 0;
+    this.dirty = [];
+
+    this._listen("root", "root.update", this.update);
+    return this._compute("present.length", () => this.length);
+  }
+
+  adopt(controller) {
+    const { node } = controller;
+    if (this.nodes.indexOf(controller) < 0) {
+      this.nodes.push(node);
+    }
+    return this.dirty.push(controller);
+  }
+
+  unadopt(controller) {
+    this.nodes = this.nodes.filter((x) => x !== controller);
+    return this.dirty.push(controller);
+  }
+
+  update() {
+    if (!this.dirty.length) {
+      return;
+    }
+
+    for (const controller of Array.from(this.dirty)) {
+      this.slideReset(controller);
+    }
+
+    [this.steps, this.indices] = Array.from(this.process(this.nodes));
+
+    this.length = this.steps.length;
+    this.index = null;
+    this.go(this.props.index);
+
+    return (this.dirty = []);
+  }
+
+  slideLatch(controller, enabled, step) {
+    return controller.slideLatch(enabled, step);
+  }
+  slideStep(controller, index, step) {
+    return controller.slideStep(this.mapIndex(controller, index), step);
+  }
+  slideRelease(controller, _step) {
+    return controller.slideRelease();
+  }
+  slideReset(controller) {
+    return controller.slideReset();
+  }
+
+  mapIndex(controller, index) {
+    return index - this.indices[controller.node._id];
+  }
+
+  process(nodes) {
+    // Grab nodes' path of slide parents
+    const slides = (nodes) =>
+      Array.from(nodes).map((el) => parents(el).filter(isSlide));
+    const traverse = (map) => (el) =>
+      (() => {
+        let ref, ref1;
+        const result = [];
+        while (el && (([el, ref] = Array.from((ref1 = [map(el), el]))), ref1)) {
+          result.push(ref);
+        }
+        return result;
+      })();
+
+    const parents = traverse(function (el) {
+      if (el.parent.traits.hash.present) {
+        return null;
+      } else {
+        return el.parent;
+      }
+    });
+
+    // Helpers
+    const isSlide = (el) => nodes.indexOf(el) >= 0;
+
+    // Order paths (leaf -> parent slide -> ...)
+    const order = (paths) =>
+      paths.sort(function (a, b) {
+        // Path lengths
+        const c = a.length;
+        const d = b.length;
+
+        // Compare from outside in
+        let e = Math.min(c, d);
+        for (
+          let i = 1, end = e, asc = 1 <= end;
+          asc ? i <= end : i >= end;
+          asc ? i++ : i--
+        ) {
+          // inclusive end
+          const nodeA = a[c - i];
+          const nodeB = b[d - i];
+
+          // Explicit sibling order (natural)
+          const f = nodeA.props.order;
+          const g = nodeB.props.order;
+          if (f != null || g != null) {
+            if (f != null && g != null && (e = f - g) !== 0) {
+              return e;
+            }
+            if (f != null) {
+              return -1;
+            }
+            if (g != null) {
+              return 1;
+            }
+          }
+
+          // Document sibling order (inverted)
+          if (nodeB.order !== nodeA.order) {
+            return nodeB.order - nodeA.order;
+          }
+        }
+
+        // Different tree level
+        e = c - d;
+        if (e !== 0) {
+          return e;
+        }
+
+        // Equal
+        return 0;
+      });
+
+    const split = function (steps) {
+      const relative = [];
+      const absolute = [];
+      for (const step of Array.from(steps)) {
+        (step[0].props.steps != null ? relative : absolute).push(step);
+      }
+      return [relative, absolute];
+    };
+
+    const expand = function (lists) {
+      let step;
+      const [relative, absolute] = Array.from(lists);
+
+      const limit = 100;
+
+      const indices = {};
+      let steps = [];
+      const slide = function (step, index) {
+        let node;
+        const { props } = (node = step[0]);
+        const parent = step[1];
+
+        const parentIndex = parent != null ? indices[parent._id] : 0;
+        //throw "parent index missing" if !parentIndex?
+        const childIndex = index;
+
+        let from =
+          props.from != null
+            ? parentIndex + props.from
+            : childIndex - props.early;
+        let to =
+          props.to != null
+            ? parentIndex + props.to
+            : childIndex + props.steps + props.late;
+
+        from = Math.max(0, from);
+        to = Math.min(limit, to);
+
+        if (indices[node._id] == null) {
+          indices[node._id] = from;
+        }
+        for (
+          let i = from, end = to, asc = from <= end;
+          asc ? i < end : i > end;
+          asc ? i++ : i--
+        ) {
+          steps[i] = (steps[i] != null ? steps[i] : (steps[i] = [])).concat(
+            step
+          );
+        }
+
+        return props.steps;
+      };
+
+      let i = 0;
+      for (step of Array.from(relative)) {
+        i += slide(step, i);
+      }
+      for (step of Array.from(absolute)) {
+        slide(step, 0);
+      }
+
+      // Dedupe and order
+      steps = (() => {
+        const result = [];
+        for (step of Array.from(steps)) {
+          result.push(finalize(dedupe(step)));
+        }
+        return result;
+      })();
+
+      return [steps, indices];
+    };
+
+    // Remove duplicates
+    const dedupe = function (step) {
+      if (step) {
+        return (() => {
+          const result = [];
+          for (let i = 0; i < step.length; i++) {
+            const node = step[i];
+            if (step.indexOf(node) === i) {
+              result.push(node);
+            }
+          }
+          return result;
+        })();
+      } else {
+        return [];
+      }
+    };
+
+    // Finalize individual step by document order
+    const finalize = (step) => step.sort((a, b) => a.order - b.order);
+
+    const paths = slides(nodes);
+    const steps = order(paths);
+    return expand(split(steps));
+  }
+
+  go(index) {
+    // Pad with an empty slide before and after for initial enter/final exit
+    let left;
+    let node;
+    index = Math.max(0, Math.min(this.length + 1, +index || 0));
+
+    const active = (left = this.steps[index - 1]) != null ? left : [];
+    const step = this.props.directed ? index - this.index : 1;
+    this.index = index;
+
+    const enter = (() => {
+      const result = [];
+      for (node of Array.from(active)) {
+        if (this.last.indexOf(node) < 0) {
+          result.push(node);
+        }
+      }
+      return result;
+    })();
+    const exit = (() => {
+      const result1 = [];
+      for (node of Array.from(this.last)) {
+        if (active.indexOf(node) < 0) {
+          result1.push(node);
+        }
+      }
+      return result1;
+    })();
+    const stay = (() => {
+      const result2 = [];
+      for (node of Array.from(active)) {
+        if (enter.indexOf(node) < 0 && exit.indexOf(node) < 0) {
+          result2.push(node);
+        }
+      }
+      return result2;
+    })();
+
+    const ascend = (nodes) => nodes.sort((a, b) => a.order - b.order);
+    const descend = (nodes) => nodes.sort((a, b) => b.order - a.order);
+
+    //const toStr = (x) => x.toString();
+    //console.log '============================================================'
+    //console.log 'go',  index, {enter: enter.map(toStr), stay: stay.map(toStr), exit: exit.map(toStr)}
+
+    for (node of Array.from(ascend(enter))) {
+      this.slideLatch(node.controller, true, step);
+    }
+    for (node of Array.from(ascend(stay))) {
+      this.slideLatch(node.controller, null, step);
+    }
+    for (node of Array.from(ascend(exit))) {
+      this.slideLatch(node.controller, false, step);
+    }
+
+    for (node of Array.from(enter)) {
+      this.slideStep(node.controller, index, step);
+    }
+    for (node of Array.from(stay)) {
+      this.slideStep(node.controller, index, step);
+    }
+    for (node of Array.from(exit)) {
+      this.slideStep(node.controller, index, step);
+    }
+
+    for (node of Array.from(descend(enter))) {
+      this.slideRelease(node.controller);
+    }
+    for (node of Array.from(descend(stay))) {
+      this.slideRelease(node.controller);
+    }
+    for (node of Array.from(descend(exit))) {
+      this.slideRelease(node.controller);
+    }
+
+    this.last = active;
+  }
+
+  change(changed, touched, init) {
+    if (changed["present.index"] || init) {
+      return this.go(this.props.index);
+    }
+  }
+}
+Present.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/present/reveal.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining
+ * DS104: Avoid inline assignments
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+class Reveal extends Transition {
+  static initClass() {
+    this.traits = ["node", "transition", "mask", "visible", "active"];
+  }
+
+  mask(shader) {
+    let left, s;
+    if (shader) {
+      s = this._shaders.shader();
+      s.pipe(identity("vec4"));
+      s.fan();
+      s.pipe(shader, this.uniforms);
+      s.next();
+      s.pipe("reveal.mask", this.uniforms);
+      s.end();
+      s.pipe("float combine(float a, float b) { return min(a, b); }");
+    } else {
+      s = this._shaders.shader();
+      s.pipe("reveal.mask", this.uniforms);
+    }
+
+    return (left = reveal_guard_(this._inherit("mask"), (x) => x.mask(s))) != null
+      ? left
+      : s;
+  }
+}
+Reveal.initClass();
+
+function reveal_guard_(value, transform) {
+  return typeof value !== "undefined" && value !== null
+    ? transform(value)
+    : undefined;
+}
+
+;// CONCATENATED MODULE: ./src/primitives/types/present/slide.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+class Slide extends Parent {
+  static initClass() {
+    this.traits = ["node", "slide", "visible", "active"];
+  }
+
+  make() {
+    this._helpers.visible.make();
+    this._helpers.active.make();
+
+    if (!this._inherit("present")) {
+      throw new Error(
+        `${this.node.toString()} must be placed inside <present></present>`
+      );
+    }
+
+    return this._inherit("present").adopt(this);
+  }
+
+  unmake() {
+    this._helpers.visible.unmake();
+    this._helpers.active.unmake();
+
+    return this._inherit("present").unadopt(this);
+  }
+
+  change(changed, _touched, _init) {
+    if (
+      changed["slide.early"] ||
+      changed["slide.late"] ||
+      changed["slide.steps"] ||
+      changed["slide.from"] ||
+      changed["slide.to"]
+    ) {
+      return this.rebuild();
+    }
+  }
+
+  slideLatch(enabled, step) {
+    //console.log 'slide:latch', @node.toString(), enabled, step
+    this.trigger({
+      type: "transition.latch",
+      step: step,
+    });
+
+    if (enabled != null) {
+      return this._instant(enabled);
+    }
+  }
+
+  slideStep(index, step) {
+    //console.log 'slide:step', @node.toString(), index, step
+    return this.trigger({
+      type: "slide.step",
+      index: index,
+      step: step,
+    });
+  }
+
+  slideRelease() {
+    //console.log 'slide:release', @node.toString()
+    return this.trigger({
+      type: "transition.release",
+    });
+  }
+
+  slideReset() {
+    this._instant(false);
+    return this.trigger({
+      type: "slide.reset",
+    });
+  }
+
+  _instant(enabled) {
+    //console.log 'slide:instant', @node.toString(), enabled
+    this.setVisible(enabled);
+    return this.setActive(enabled);
+  }
+}
+Slide.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/present/step.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS104: Avoid inline assignments
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+class Step extends Track {
+  static initClass() {
+    this.traits = ["node", "track", "step", "trigger", "bind"];
+  }
+
+  make() {
+    super.make();
+
+    const clock = this._inherit("clock");
+
+    if (this.actualIndex == null) {
+      this.actualIndex = null;
+    }
+    this.animateIndex = this._animator.make(this._types.number(0), {
+      clock,
+      realtime: this.props.realtime,
+      step: (value) => {
+        return (this.actualIndex = value);
+      },
+    });
+
+    if (this.lastIndex == null) {
+      this.lastIndex = null;
+    }
+    this.animateStep = this._animator.make(this._types.number(0), {
+      clock,
+      realtime: this.props.realtime,
+      step: (value) => {
+        this.playhead = value;
+        return this.update();
+      },
+    });
+
+    this.stops =
+      this.props.stops != null
+        ? this.props.stops
+        : step_range_(0, this.script.length, false);
+
+    // Seek instantly after reset
+    this._listen("slide", "slide.reset", (_e) => {
+      return (this.lastIndex = null);
+    });
+
+    // Update playhead in response to slide change
+    return this._listen("slide", "slide.step", (e) => {
+      let left;
+      let { duration } = this.props;
+      const { delay, pace, speed, playback, rewind, skip, trigger } =
+        this.props;
+
+      // Note: enter phase is from index 0 to 1
+      const i = Math.max(0, Math.min(this.stops.length - 1, e.index - trigger));
+
+      // Animation range
+      const from = this.playhead;
+      const to = this.stops[i];
+
+      // Seek if first step after reset
+      if (this.lastIndex == null && trigger) {
+        this.lastIndex = i;
+        this.animateStep.set(to);
+        this.animateIndex.set(i);
+        return;
+      }
+
+      // Calculate actual step from current offset (may be still animating)
+      let last =
+        (left = this.actualIndex != null ? this.actualIndex : this.lastIndex) !=
+        null
+          ? left
+          : 0;
+      const step = i - last;
+
+      // Don't count duped stops
+      const skips = this.stops.slice(Math.min(last, i), Math.max(last, i));
+      let free = 0;
+      last = skips.shift();
+      for (const stop of Array.from(skips)) {
+        if (last === stop) {
+          free++;
+        }
+        last = stop;
+      }
+
+      // Remember last intended stop
+      this.lastIndex = i;
+
+      // Apply rewind factor
+      let factor = speed * (e.step >= 0 ? 1 : rewind);
+
+      // Pass through multiple steps at faster rate if skip is enabled
+      factor *= skip ? Math.max(1, Math.abs(step) - free) : 1;
+
+      // Apply pace
+      duration += (Math.abs(to - from) * pace) / factor;
+
+      if (from !== to) {
+        this.animateIndex.immediate(i, { delay, duration, ease: playback });
+        return this.animateStep.immediate(to, {
+          delay,
+          duration,
+          ease: playback,
+        });
+      }
+    });
+  }
+
+  made() {
+    return this.update();
+  }
+
+  unmake() {
+    this.animateIndex.dispose();
+    this.animateStep.dispose();
+    this.animateIndex = this.animateStep = null;
+
+    return super.unmake();
+  }
+
+  change(changed, touched, init) {
+    if (changed["step.stops"] || changed["step.realtime"]) {
+      return this.rebuild();
+    }
+    return super.change(changed, touched, init);
+  }
+}
+Step.initClass();
+
+function step_range_(left, right, inclusive) {
+  const range = [];
+  const ascending = left < right;
+  const end = !inclusive ? right : ascending ? right + 1 : right - 1;
+  for (let i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {
+    range.push(i);
+  }
+  return range;
+}
+
+;// CONCATENATED MODULE: ./src/primitives/types/present/index.js
+
+
+
+
+
+
+
+;// CONCATENATED MODULE: ./src/primitives/types/rtt/rtt.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining
+ * DS104: Avoid inline assignments
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+class RTT extends Parent {
+  static initClass() {
+    this.traits = [
+      "node",
+      "root",
+      "scene",
+      "vertex",
+      "texture",
+      "rtt",
+      "source",
+      "index",
+      "image",
+    ];
+    this.defaults = {
+      minFilter: "linear",
+      magFilter: "linear",
+      type: "unsignedByte",
+    };
+  }
+
+  init() {
+    return (this.rtt =
+      this.scene =
+      this.camera =
+      this.width =
+      this.height =
+      this.history =
+      this.rootSize =
+      this.size =
+        null);
+  }
+
+  indexShader(shader) {
+    return shader;
+  }
+  imageShader(shader) {
+    return this.rtt.shaderRelative(shader);
+  }
+  sourceShader(shader) {
+    return this.rtt.shaderAbsolute(shader, this.history);
+  }
+
+  getDimensions() {
+    return {
+      items: 1,
+      width: this.width,
+      height: this.height,
+      depth: this.history,
+    };
+  }
+
+  getActiveDimensions() {
+    return this.getDimensions();
+  }
+
+  make() {
+    let aspect;
+    this.parentRoot = this._inherit("root");
+    this.rootSize = this.parentRoot.getSize();
+
+    this._listen(this.parentRoot, "root.pre", this.pre);
+    this._listen(this.parentRoot, "root.update", this.update);
+    this._listen(this.parentRoot, "root.render", this.render);
+    this._listen(this.parentRoot, "root.post", this.post);
+    this._listen(this.parentRoot, "root.camera", this.setCamera);
+    this._listen(this.parentRoot, "root.resize", function (event) {
+      return this.resize(event.size);
+    });
+
+    if (this.rootSize == null) {
+      return;
+    }
+
+    const { minFilter, magFilter, type } = this.props;
+
+    const { width, height, history, size } = this.props;
+
+    const relativeSize =
+      size === this.node.attributes["rtt.size"].enum.relative;
+    const widthFactor = relativeSize ? this.rootSize.renderWidth : 1;
+    const heightFactor = relativeSize ? this.rootSize.renderHeight : 1;
+
+    this.width = Math.round(
+      width != null ? width * widthFactor : this.rootSize.renderWidth
+    );
+    this.height = Math.round(
+      height != null ? height * heightFactor : this.rootSize.renderHeight
+    );
+    this.history = history;
+    this.aspect = aspect = this.width / this.height;
+
+    if (this.scene == null) {
+      this.scene = this._renderables.make("scene");
+    }
+    this.rtt = this._renderables.make("renderToTexture", {
+      scene: this.scene,
+      camera: this._context.defaultCamera,
+      width: this.width,
+      height: this.height,
+      frames: this.history,
+      minFilter,
+      magFilter,
+      type,
+    });
+
+    aspect = width || height ? aspect : this.rootSize.aspect;
+    const viewWidth = width != null ? width : this.rootSize.viewWidth;
+    const viewHeight = height != null ? height : this.rootSize.viewHeight;
+
+    return (this.size = {
+      renderWidth: this.width,
+      renderHeight: this.height,
+      aspect,
+      viewWidth,
+      viewHeight,
+      pixelRatio: this.height / viewHeight,
+    });
+  }
+
+  made() {
+    // Notify of buffer reallocation
+    this.trigger({
+      type: "source.rebuild",
+    });
+
+    if (this.size) {
+      return this.trigger({
+        type: "root.resize",
+        size: this.size,
+      });
+    }
+  }
+
+  unmake(rebuild) {
+    if (this.rtt == null) {
+      return;
+    }
+
+    this.rtt.dispose();
+    if (!rebuild) {
+      this.scene.dispose();
+    }
+
+    return (this.rtt = this.width = this.height = this.history = null);
+  }
+
+  change(changed, touched, init) {
+    if (touched["texture"] || changed["rtt.width"] || changed["rtt.height"]) {
+      return this.rebuild();
+    }
+
+    if (changed["root.camera"] || init) {
+      this._unattach();
+      this._attach(
+        this.props.camera,
+        "camera",
+        this.setCamera,
+        this,
+        this,
+        true
+      );
+      return this.setCamera();
+    }
+  }
+
+  adopt(renderable) {
+    return Array.from(renderable.renders).map((object) =>
+      this.scene.add(object)
+    );
+  }
+  unadopt(renderable) {
+    return Array.from(renderable.renders).map((object) =>
+      this.scene.remove(object)
+    );
+  }
+
+  resize(size) {
+    let height, width;
+    this.rootSize = size;
+
+    ({ width, height, size } = this.props);
+    const relativeSize =
+      size === this.node.attributes["rtt.size"].enum.relative;
+
+    if (!this.rtt || width == null || height == null || relativeSize) {
+      return this.rebuild();
+    }
+  }
+
+  select(selector) {
+    return this._root.node.model.select(selector, [this.node]);
+  }
+
+  watch(selector, handler) {
+    return this._root.node.model.watch(selector, handler);
+  }
+
+  unwatch(handler) {
+    return this._root.node.model.unwatch(handler);
+  }
+
+  pre(e) {
+    return this.trigger(e);
+  }
+  update(e) {
+    let camera;
+    if ((camera = this.getOwnCamera()) != null) {
+      camera.aspect = this.aspect || 1;
+      camera.updateProjectionMatrix();
+    }
+    return this.trigger(e);
+  }
+  render(e) {
+    this.trigger(e);
+    return this.rtt != null ? this.rtt.render(this.getCamera()) : undefined;
+  }
+  post(e) {
+    return this.trigger(e);
+  }
+
+  setCamera() {
+    const camera = rtt_guard_(
+      this.select(this.props.camera)[0],
+      (x) => x.controller
+    );
+    if (this.camera !== camera) {
+      this.camera = camera;
+      this.rtt.camera = this.getCamera();
+      return this.trigger({ type: "root.camera" });
+    } else if (!this.camera) {
+      return this.trigger({ type: "root.camera" });
+    }
+  }
+
+  getOwnCamera() {
+    return this.camera != null ? this.camera.getCamera() : undefined;
+  }
+  getCamera() {
+    let left;
+    return (left = this.getOwnCamera()) != null
+      ? left
+      : this._inherit("root").getCamera();
+  }
+
+  // End transform chain here
+  vertex(shader, pass) {
+    if (pass === 2) {
+      return shader.pipe("view.position");
+    }
+    if (pass === 3) {
+      return shader.pipe("root.position");
+    }
+    return shader;
+  }
+}
+RTT.initClass();
+
+function rtt_guard_(value, transform) {
+  return typeof value !== "undefined" && value !== null
+    ? transform(value)
+    : undefined;
+}
+
+;// CONCATENATED MODULE: ./src/primitives/types/rtt/compose.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+class Compose extends Primitive {
+  static initClass() {
+    this.traits = [
+      "node",
+      "bind",
+      "object",
+      "visible",
+      "operator",
+      "style",
+      "compose",
+    ];
+    this.defaults = {
+      zWrite: false,
+      zTest: false,
+      color: "#ffffff",
+    };
+  }
+
+  init() {
+    return (this.compose = null);
+  }
+
+  //rebuild: () ->
+  //  console.log 'compose.rebuild', @node.get(null, true), @bind.source?
+  //  super()
+
+  resize() {
+    if (!this.compose || !this.bind.source) {
+      return;
+    }
+
+    const dims = this.bind.source.getActiveDimensions();
+    const { width } = dims;
+    const { height } = dims;
+
+    return this.remapUVScale.set(width, height);
+  }
+
+  make() {
+    // Bind to attached data sources
+    this._helpers.bind.make([{ to: "operator.source", trait: "source" }]);
+
+    if (this.bind.source == null) {
+      return;
+    }
+
+    // Prepare uniforms for remapping to absolute coords on the fly
+    const resampleUniforms = {
+      remapUVScale: this._attributes.make(this._types.vec2()),
+    };
+    this.remapUVScale = resampleUniforms.remapUVScale.value;
+
+    // Build fragment shader
+    let fragment = this._shaders.shader();
+    const { alpha } = this.props;
+
+    if (this.bind.source.is("image")) {
+      // Sample image directly in 2D UV
+      fragment.pipe("screen.pass.uv", resampleUniforms);
+      fragment = this.bind.source.imageShader(fragment);
+    } else {
+      // Sample data source in 4D
+      fragment.pipe("screen.map.xy", resampleUniforms);
+      fragment = this.bind.source.sourceShader(fragment);
+    }
+
+    // Force pixels to solid if requested
+    if (!alpha) {
+      fragment.pipe("color.opaque");
+    }
+
+    // Make screen renderable
+    const composeUniforms = this._helpers.style.uniforms();
+    this.compose = this._renderables.make("screen", {
+      map: fragment,
+      uniforms: composeUniforms,
+      linear: true,
+    });
+
+    this._helpers.visible.make();
+    return this._helpers.object.make([this.compose]);
+  }
+
+  made() {
+    return this.resize();
+  }
+
+  unmake() {
+    this._helpers.bind.unmake();
+    this._helpers.visible.unmake();
+    return this._helpers.object.unmake();
+  }
+
+  change(changed, _touched, _init) {
+    if (changed["operator.source"] || changed["compose.alpha"]) {
+      return this.rebuild();
+    }
+  }
+}
+Compose.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/rtt/index.js
+
+
+
+;// CONCATENATED MODULE: ./src/primitives/types/view/view.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+class View extends Transform {
+  static initClass() {
+    this.traits = ["node", "object", "visible", "view", "vertex"];
+  }
+
+  make() {
+    return this._helpers.visible.make();
+  }
+
+  unmake() {
+    return this._helpers.visible.unmake();
+  }
+
+  axis(dimension) {
+    return this.props.range[dimension - 1];
+  }
+}
+View.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/view/cartesian.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+class Cartesian extends View {
+  static initClass() {
+    this.traits = ["node", "object", "visible", "view", "view3", "vertex"];
+  }
+
+  make() {
+    super.make();
+
+    this.uniforms = { viewMatrix: this._attributes.make(this._types.mat4()) };
+
+    this.viewMatrix = this.uniforms.viewMatrix.value;
+    this.composer = transformComposer();
+  }
+
+  unmake() {
+    super.unmake();
+
+    delete this.viewMatrix;
+    delete this.objectMatrix;
+    delete this.uniforms;
+  }
+
+  change(changed, touched, init) {
+    if (!touched["view"] && !touched["view3"] && !init) {
+      return;
+    }
+
+    const p = this.props.position;
+    const s = this.props.scale;
+    const q = this.props.quaternion;
+    const r = this.props.rotation;
+    const g = this.props.range;
+    const e = this.props.eulerOrder;
+
+    const { x } = g[0];
+    const y = g[1].x;
+    const z = g[2].x;
+    const dx = g[0].y - x || 1;
+    const dy = g[1].y - y || 1;
+    const dz = g[2].y - z || 1;
+
+    // Forward transform
+    this.viewMatrix.set(
+      2 / dx,
+      0,
+      0,
+      -(2 * x + dx) / dx,
+      0,
+      2 / dy,
+      0,
+      -(2 * y + dy) / dy,
+      0,
+      0,
+      2 / dz,
+      -(2 * z + dz) / dz,
+      0,
+      0,
+      0,
+      1
+    );
+
+    const transformMatrix = this.composer(p, r, q, s, null, e);
+    this.viewMatrix.multiplyMatrices(transformMatrix, this.viewMatrix);
+
+    if (changed["view.range"]) {
+      this.trigger({
+        type: "view.range",
+      });
+    }
+  }
+
+  vertex(shader, pass) {
+    if (pass === 1) {
+      shader.pipe("cartesian.position", this.uniforms);
+    }
+    return super.vertex(shader, pass);
+  }
+}
+Cartesian.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/view/cartesian4.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+class Cartesian4 extends View {
+  static initClass() {
+    this.traits = ["node", "object", "visible", "view", "view4", "vertex"];
+  }
+
+  make() {
+    super.make();
+
+    this.uniforms = {
+      basisOffset: this._attributes.make(this._types.vec4()),
+      basisScale: this._attributes.make(this._types.vec4()),
+    };
+
+    this.basisScale = this.uniforms.basisScale.value;
+    return (this.basisOffset = this.uniforms.basisOffset.value);
+  }
+
+  unmake() {
+    super.unmake();
+    delete this.basisScale;
+    delete this.basisOffset;
+    return delete this.uniforms;
+  }
+
+  change(changed, touched, init) {
+    if (!touched["view"] && !touched["view4"] && !init) {
+      return;
+    }
+
+    const p = this.props.position;
+    const s = this.props.scale;
+    const g = this.props.range;
+
+    const { x } = g[0];
+    const y = g[1].x;
+    const z = g[2].x;
+    const w = g[3].x;
+    const dx = g[0].y - x || 1;
+    const dy = g[1].y - y || 1;
+    const dz = g[2].y - z || 1;
+    const dw = g[3].y - w || 1;
+
+    const mult = function (a, b) {
+      a.x *= b.x;
+      a.y *= b.y;
+      a.z *= b.z;
+      return (a.w *= b.w);
+    };
+
+    // 4D axis adjustment
+    this.basisScale.set(2 / dx, 2 / dy, 2 / dz, 2 / dw);
+    this.basisOffset.set(
+      -(2 * x + dx) / dx,
+      -(2 * y + dy) / dy,
+      -(2 * z + dz) / dz,
+      -(2 * w + dw) / dw
+    );
+
+    // 4D scale
+    mult(this.basisScale, s);
+    mult(this.basisOffset, s);
+
+    // 4D position
+    this.basisOffset.add(p);
+
+    if (changed["view.range"]) {
+      return this.trigger({
+        type: "view.range",
+      });
+    }
+  }
+
+  vertex(shader, pass) {
+    if (pass === 1) {
+      shader.pipe("cartesian4.position", this.uniforms);
+    }
+    return super.vertex(shader, pass);
+  }
+}
+Cartesian4.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/view/polar.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+
+
+
+class Polar extends View {
+  static initClass() {
+    this.traits = [
+      "node",
+      "object",
+      "visible",
+      "view",
+      "view3",
+      "polar",
+      "vertex",
+    ];
+  }
+
+  make() {
+    super.make();
+
+    const { types } = this._attributes;
+    this.uniforms = {
+      polarBend: this.node.attributes["polar.bend"],
+      polarHelix: this.node.attributes["polar.helix"],
+      polarFocus: this._attributes.make(types.number()),
+      polarAspect: this._attributes.make(types.number()),
+      viewMatrix: this._attributes.make(types.mat4()),
+    };
+
+    this.viewMatrix = this.uniforms.viewMatrix.value;
+    this.composer = transformComposer();
+
+    return (this.aspect = 1);
+  }
+
+  unmake() {
+    super.unmake();
+
+    delete this.viewMatrix;
+    delete this.objectMatrix;
+    delete this.aspect;
+    return delete this.uniforms;
+  }
+
+  change(changed, touched, init) {
+    let aspect, bend, focus;
+    if (!touched["view"] && !touched["view3"] && !touched["polar"] && !init) {
+      return;
+    }
+
+    this.helix = this.props.helix;
+    this.bend = bend = this.props.bend;
+
+    this.focus = focus = bend > 0 ? 1 / bend - 1 : 0;
+
+    const p = this.props.position;
+    const s = this.props.scale;
+    const q = this.props.quaternion;
+    const r = this.props.rotation;
+    const g = this.props.range;
+    const e = this.props.eulerOrder;
+
+    const { x } = g[0];
+    let y = g[1].x;
+    const z = g[2].x;
+    const dx = g[0].y - x || 1;
+    let dy = g[1].y - y || 1;
+    const dz = g[2].y - z || 1;
+    const sx = s.x;
+    const sy = s.y;
+
+    // Watch for negative scales.
+    const idx = dx > 0 ? 1 : -1;
+
+    // Recenter viewport on origin the more it's bent
+    [y, dy] = Array.from(recenterAxis(y, dy, bend));
+
+    // Adjust viewport range for polar transform.
+    // As the viewport goes polar, the X-range is interpolated to the Y-range instead,
+    // creating a square/circular viewport.
+    const ady = Math.abs(dy);
+    const fdx = dx + (ady * idx - dx) * bend;
+    const sdx = fdx / sx;
+    const sdy = dy / sy;
+    this.aspect = aspect = Math.abs(sdx / sdy);
+
+    this.uniforms.polarFocus.value = focus;
+    this.uniforms.polarAspect.value = aspect;
+
+    // Forward transform
+    this.viewMatrix.set(
+      2 / fdx,
+      0,
+      0,
+      -(2 * x + dx) / dx,
+      0,
+      2 / dy,
+      0,
+      -(2 * y + dy) / dy,
+      0,
+      0,
+      2 / dz,
+      -(2 * z + dz) / dz,
+      0,
+      0,
+      0,
+      1 //,
+    );
+
+    const transformMatrix = this.composer(p, r, q, s, null, e);
+    this.viewMatrix.multiplyMatrices(transformMatrix, this.viewMatrix);
+
+    if (changed["view.range"] || touched["polar"]) {
+      this.trigger({
+        type: "view.range",
+      });
+    }
+  }
+
+  vertex(shader, pass) {
+    if (pass === 1) {
+      shader.pipe("polar.position", this.uniforms);
+    }
+    return super.vertex(shader, pass);
+  }
+
+  axis(dimension) {
+    const range = this.props.range[dimension - 1];
+    let min = range.x;
+    let max = range.y;
+
+    // Correct Y extents during polar warp.
+    if (dimension === 2 && this.bend > 0) {
+      max = Math.max(Math.abs(max), Math.abs(min));
+      min = Math.max(-this.focus / this.aspect, min);
+    }
+
+    return new external_THREE_.Vector2(min, max);
+  }
+}
+Polar.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/view/spherical.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+
+
+
+class Spherical extends View {
+  static initClass() {
+    this.traits = [
+      "node",
+      "object",
+      "visible",
+      "view",
+      "view3",
+      "spherical",
+      "vertex",
+    ];
+  }
+
+  make() {
+    super.make();
+
+    this.uniforms = {
+      sphericalBend: this.node.attributes["spherical.bend"],
+      sphericalFocus: this._attributes.make(this._types.number()),
+      sphericalAspectX: this._attributes.make(this._types.number()),
+      sphericalAspectY: this._attributes.make(this._types.number()),
+      sphericalScaleY: this._attributes.make(this._types.number()),
+      viewMatrix: this._attributes.make(this._types.mat4()),
+    };
+
+    this.viewMatrix = this.uniforms.viewMatrix.value;
+    this.composer = transformComposer();
+
+    this.aspectX = 1;
+    return (this.aspectY = 1);
+  }
+
+  unmake() {
+    super.unmake();
+
+    delete this.viewMatrix;
+    delete this.objectMatrix;
+    delete this.aspectX;
+    delete this.aspectY;
+    return delete this.uniforms;
+  }
+
+  change(changed, touched, init) {
+    let aspectX, aspectY, bend, focus, scaleY;
+    if (
+      !touched["view"] &&
+      !touched["view3"] &&
+      !touched["spherical"] &&
+      !init
+    ) {
+      return;
+    }
+
+    this.bend = bend = this.props.bend;
+    this.focus = focus = bend > 0 ? 1 / bend - 1 : 0;
+
+    const p = this.props.position;
+    const s = this.props.scale;
+    const q = this.props.quaternion;
+    const r = this.props.rotation;
+    const g = this.props.range;
+    const e = this.props.eulerOrder;
+
+    const { x } = g[0];
+    let y = g[1].x;
+    let z = g[2].x;
+    const dx = g[0].y - x || 1;
+    let dy = g[1].y - y || 1;
+    let dz = g[2].y - z || 1;
+    const sx = s.x;
+    const sy = s.y;
+    const sz = s.z;
+
+    // Recenter viewport on origin the more it's bent
+    [y, dy] = Array.from(recenterAxis(y, dy, bend));
+    [z, dz] = Array.from(recenterAxis(z, dz, bend));
+
+    // Watch for negative scales.
+    const idx = dx > 0 ? 1 : -1;
+    const idy = dy > 0 ? 1 : -1;
+
+    // Adjust viewport range for spherical transform.
+    // As the viewport goes spherical, the X/Y-ranges are interpolated to the Z-range,
+    // creating a perfectly spherical viewport.
+    const adz = Math.abs(dz);
+    const fdx = dx + (adz * idx - dx) * bend;
+    const fdy = dy + (adz * idy - dy) * bend;
+    const sdx = fdx / sx;
+    const sdy = fdy / sy;
+    const sdz = dz / sz;
+    this.aspectX = aspectX = Math.abs(sdx / sdz);
+    this.aspectY = aspectY = Math.abs(sdy / sdz / aspectX);
+
+    // Scale Y coordinates before transforming, but cap at aspectY/alpha to prevent from poking through the poles mid-transform.
+    // See shaders/glsl/spherical.position.glsl
+    const aspectZ = (((dy / dx) * sx) / sy) * 2; // Factor of 2 due to the fact that in the Y direction we only go 180º from pole to pole.
+    this.scaleY = scaleY = Math.min(aspectY / bend, 1 + (aspectZ - 1) * bend);
+
+    this.uniforms.sphericalBend.value = bend;
+    this.uniforms.sphericalFocus.value = focus;
+    this.uniforms.sphericalAspectX.value = aspectX;
+    this.uniforms.sphericalAspectY.value = aspectY;
+    this.uniforms.sphericalScaleY.value = scaleY;
+
+    // Forward transform
+    this.viewMatrix.set(
+      2 / fdx,
+      0,
+      0,
+      -(2 * x + dx) / dx,
+      0,
+      2 / fdy,
+      0,
+      -(2 * y + dy) / dy,
+      0,
+      0,
+      2 / dz,
+      -(2 * z + dz) / dz,
+      0,
+      0,
+      0,
+      1 //,
+    );
+
+    const transformMatrix = this.composer(p, r, q, s, null, e);
+    this.viewMatrix.multiplyMatrices(transformMatrix, this.viewMatrix);
+
+    if (changed["view.range"] || touched["spherical"]) {
+      return this.trigger({
+        type: "view.range",
+      });
+    }
+  }
+
+  vertex(shader, pass) {
+    if (pass === 1) {
+      shader.pipe("spherical.position", this.uniforms);
+    }
+    return super.vertex(shader, pass);
+  }
+
+  axis(dimension) {
+    const range = this.props.range[dimension - 1];
+    let min = range.x;
+    let max = range.y;
+
+    // Correct Z extents during polar warp.
+    if (dimension === 3 && this.bend > 0) {
+      max = Math.max(Math.abs(max), Math.abs(min));
+      min = Math.max(-this.focus / this.aspectX + 0.001, min);
+    }
+
+    return new external_THREE_.Vector2(min, max);
+  }
+}
+Spherical.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/view/stereographic.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+
+
+class Stereographic extends View {
+  static initClass() {
+    this.traits = [
+      "node",
+      "object",
+      "visible",
+      "view",
+      "view3",
+      "stereographic",
+      "vertex",
+    ];
+  }
+
+  make() {
+    super.make();
+
+    this.uniforms = {
+      stereoBend: this.node.attributes["stereographic.bend"],
+      viewMatrix: this._attributes.make(this._types.mat4()),
+    };
+
+    this.viewMatrix = this.uniforms.viewMatrix.value;
+    return (this.composer = transformComposer());
+  }
+
+  unmake() {
+    super.unmake();
+
+    delete this.viewMatrix;
+    delete this.rotationMatrix;
+    return delete this.uniforms;
+  }
+
+  change(changed, touched, init) {
+    let bend;
+    if (
+      !touched["view"] &&
+      !touched["view3"] &&
+      !touched["stereographic"] &&
+      !init
+    ) {
+      return;
+    }
+
+    this.bend = bend = this.props.bend;
+
+    const p = this.props.position;
+    const s = this.props.scale;
+    const q = this.props.quaternion;
+    const r = this.props.rotation;
+    const g = this.props.range;
+    const e = this.props.eulerOrder;
+
+    const { x } = g[0];
+    const y = g[1].x;
+    let z = g[2].x;
+    const dx = g[0].y - x || 1;
+    const dy = g[1].y - y || 1;
+    let dz = g[2].y - z || 1;
+
+    // Recenter viewport on projection point the more it's bent
+    [z, dz] = Array.from(recenterAxis(z, dz, bend, 1));
+
+    this.uniforms.stereoBend.value = bend;
+
+    // Forward transform
+    this.viewMatrix.set(
+      2 / dx,
+      0,
+      0,
+      -(2 * x + dx) / dx,
+      0,
+      2 / dy,
+      0,
+      -(2 * y + dy) / dy,
+      0,
+      0,
+      2 / dz,
+      -(2 * z + dz) / dz,
+      0,
+      0,
+      0,
+      1 //,
+    );
+
+    const transformMatrix = this.composer(p, r, q, s, null, e);
+    this.viewMatrix.multiplyMatrices(transformMatrix, this.viewMatrix);
+
+    if (changed["view.range"] || touched["stereographic"]) {
+      return this.trigger({
+        type: "view.range",
+      });
+    }
+  }
+
+  vertex(shader, pass) {
+    if (pass === 1) {
+      shader.pipe("stereographic.position", this.uniforms);
+    }
+    return super.vertex(shader, pass);
+  }
+}
+Stereographic.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/view/stereographic4.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+
+class Stereographic4 extends View {
+  static initClass() {
+    this.traits = [
+      "node",
+      "object",
+      "visible",
+      "view",
+      "view4",
+      "stereographic",
+      "vertex",
+    ];
+  }
+
+  make() {
+    super.make();
+
+    this.uniforms = {
+      basisOffset: this._attributes.make(this._types.vec4()),
+      basisScale: this._attributes.make(this._types.vec4()),
+      stereoBend: this.node.attributes["stereographic.bend"],
+    };
+
+    this.basisScale = this.uniforms.basisScale.value;
+    this.basisOffset = this.uniforms.basisOffset.value;
+  }
+
+  unmake() {
+    super.unmake();
+
+    delete this.basisScale;
+    delete this.basisOffset;
+    delete this.uniforms;
+  }
+
+  change(changed, touched, init) {
+    let bend;
+    if (
+      !touched["view"] &&
+      !touched["view4"] &&
+      !touched["stereographic"] &&
+      !init
+    ) {
+      return;
+    }
+
+    this.bend = bend = this.props.bend;
+
+    const p = this.props.position;
+    const s = this.props.scale;
+    const g = this.props.range;
+
+    const { x } = g[0];
+    const y = g[1].x;
+    const z = g[2].x;
+    let w = g[3].x;
+    const dx = g[0].y - x || 1;
+    const dy = g[1].y - y || 1;
+    const dz = g[2].y - z || 1;
+    let dw = g[3].y - w || 1;
+
+    const mult = function (a, b) {
+      a.x *= b.x;
+      a.y *= b.y;
+      a.z *= b.z;
+      a.w *= b.w;
+    };
+
+    // Recenter viewport on projection point the more it's bent
+    [w, dw] = Array.from(recenterAxis(w, dw, bend, 1));
+
+    // 4D axis adjustment
+    this.basisScale.set(2 / dx, 2 / dy, 2 / dz, 2 / dw);
+    this.basisOffset.set(
+      -(2 * x + dx) / dx,
+      -(2 * y + dy) / dy,
+      -(2 * z + dz) / dz,
+      -(2 * w + dw) / dw
+    );
+
+    // 4D scale
+    mult(this.basisScale, s);
+    mult(this.basisOffset, s);
+
+    // 4D position
+    this.basisOffset.add(p);
+
+    if (changed["view.range"] || touched["stereographic"]) {
+      this.trigger({
+        type: "view.range",
+      });
+    }
+  }
+
+  vertex(shader, pass) {
+    if (pass === 1) {
+      shader.pipe("stereographic4.position", this.uniforms);
+    }
+    return super.vertex(shader, pass);
+  }
+}
+Stereographic4.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/view/index.js
+
+
+
+
+
+
+
+
+;// CONCATENATED MODULE: ./src/primitives/types/shader/shader.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+class Shader extends Primitive {
+  static initClass() {
+    this.traits = ["node", "bind", "shader"];
+    this.freeform = true;
+  }
+
+  init() {
+    return (this.shader = null);
+  }
+
+  make() {
+    const { language, code } = this.props;
+    if (language !== "glsl") {
+      throw new Error("GLSL required");
+    }
+
+    // Bind to attached data sources
+    this._helpers.bind.make([
+      { to: "shader.sources", trait: "source", multiple: true },
+    ]);
+
+    // Parse snippet w/ shadergraph (will do implicit DOM script tag by ID
+    // lookup if simple selector or ID given)
+    const snippet = this._shaders.fetch(code);
+
+    // Convert uniforms to attributes
+    const types = this._types;
+    const uniforms = {};
+    const make = (type) => {
+      let t;
+      switch (type) {
+        case "i":
+          return types.int();
+        case "f":
+          return types.number();
+        case "v2":
+          return types.vec2();
+        case "v3":
+          return types.vec3();
+        case "v4":
+          return types.vec4();
+        case "m3":
+          return types.mat3();
+        case "m4":
+          return types.mat4();
+        case "t":
+          return types.object();
+        default:
+          t = type.split("");
+          if (t.pop() === "v") {
+            return types.array(make(t.join("")));
+          } else {
+            return null;
+          }
+      }
+    };
+
+    for (const def of Array.from(snippet._signatures.uniform)) {
+      let type;
+      if ((type = make(def.type))) {
+        uniforms[def.name] = type;
+      }
+    }
+
+    // Reconfigure node model
+    return this.reconfigure({ props: { uniform: uniforms } });
+  }
+
+  made() {
+    // Notify of shader reallocation
+    return this.trigger({
+      type: "source.rebuild",
+    });
+  }
+
+  unmake() {
+    return (this.shader = null);
+  }
+
+  change(changed, _touched, _init) {
+    if (
+      changed["shader.uniforms"] ||
+      changed["shader.code"] ||
+      changed["shader.language"]
+    ) {
+      return this.rebuild();
+    }
+  }
+
+  shaderBind(uniforms) {
+    let k, u, v;
+    if (uniforms == null) {
+      uniforms = {};
+    }
+    const { code } = this.props;
+
+    // Merge in prop attributes as uniforms
+    for (k in this.node.attributes) {
+      v = this.node.attributes[k];
+      if (v.type != null && v.short != null && v.ns === "uniform") {
+        if (uniforms[v.short] == null) {
+          uniforms[v.short] = v;
+        }
+      }
+    }
+
+    // Merge in explicit uniform object if set
+    if ((u = this.props.uniforms) != null) {
+      for (k in u) {
+        v = u[k];
+        uniforms[k] = v;
+      }
+    }
+
+    // New shader
+    const s = this._shaders.shader();
+
+    // Require sources
+    if (this.bind.sources != null) {
+      for (const source of Array.from(this.bind.sources)) {
+        s.require(source.sourceShader(this._shaders.shader()));
+      }
+    }
+
+    // Build bound shader
+    return s.pipe(code, uniforms);
+  }
+}
+Shader.initClass();
+
+;// CONCATENATED MODULE: ./src/primitives/types/shader/index.js
+
+
+;// CONCATENATED MODULE: ./src/primitives/types/classes.js
+/* eslint-disable sort-imports */
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+const classes_Classes = {
+  axis: Axis,
+  face: Face,
+  grid: Grid,
+  line: Line,
+  point: Point,
+  strip: Strip,
+  surface: Surface,
+  ticks: Ticks,
+  vector: Vector,
+
+  view: View,
+  cartesian: Cartesian,
+  cartesian4: Cartesian4,
+  polar: Polar,
+  spherical: Spherical,
+  stereographic: Stereographic,
+  stereographic4: Stereographic4,
+
+  transform: Transform3,
+  transform4: Transform4,
+  vertex: Vertex,
+  fragment: Fragment,
+  layer: Layer,
+  mask: Mask,
+
+  array: Array_,
+  interval: Interval,
+  matrix: Matrix,
+  area: Area,
+  voxel: Voxel,
+  volume: Volume,
+  scale: Scale,
+
+  html: HTML,
+  dom: dom_DOM,
+
+  text: Text,
+  format: Format,
+  label: Label,
+  retext: Retext,
+
+  clamp: Clamp,
+  grow: Grow,
+  join: Join,
+  lerp: Lerp,
+  memo: Memo,
+  readback: Readback,
+  resample: Resample,
+  repeat: Repeat,
+  swizzle: Swizzle,
+  spread: Spread,
+  split: Split,
+  slice: Slice,
+  subdivide: Subdivide,
+  transpose: Transpose,
+
+  group: base_group_Group,
+  inherit: Inherit,
+  root: Root,
+  unit: Unit,
+
+  shader: Shader,
+
+  camera: camera_Camera,
+
+  rtt: RTT,
+  compose: Compose,
+
+  clock: Clock,
+  now: Now,
+
+  move: Move,
+  play: Play,
+  present: Present,
+  reveal: Reveal,
+  slide: Slide,
+  step: Step,
+};
+
+;// CONCATENATED MODULE: ./src/primitives/types/types.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining
+ * DS104: Avoid inline assignments
+ * DS202: Simplify dynamic range loops
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+
+
+
+
+
+
+
+
+
+// Property types
+//
+// The weird calling convention is for double-buffering the values
+// while validating compound types like arrays and nullables.
+//
+// validate: (value, target, invalid) ->
+//
+//   # Option 1: Call invalid() to reject
+//   return invalid() if value < 0
+//
+//   # Option 2: Change target in-place
+//   target.set(value)
+//   return target
+//
+//   # Option 3: Return new value
+//   return +value
+//
+const _Types = {
+  array(type, size, value = null) {
+    const lerp = type.lerp
+      ? function (a, b, target, f) {
+          const l = Math.min(a.length, b.length);
+          for (
+            let i = 0, end = l, asc = 0 <= end;
+            asc ? i < end : i > end;
+            asc ? i++ : i--
+          ) {
+            target[i] = type.lerp(a[i], b[i], target[i], f);
+          }
+          return target;
+        }
+      : undefined;
+
+    const op = type.op
+      ? function (a, b, target, op) {
+          const l = Math.min(a.length, b.length);
+          for (
+            let i = 0, end = l, asc = 0 <= end;
+            asc ? i < end : i > end;
+            asc ? i++ : i--
+          ) {
+            target[i] = type.op(a[i], b[i], target[i], op);
+          }
+          return target;
+        }
+      : undefined;
+
+    if (value != null && !(value instanceof Array)) {
+      value = [value];
+    }
+
+    return {
+      uniform() {
+        if (type.uniform) {
+          return type.uniform() + "v";
+        } else {
+          return undefined;
+        }
+      },
+      make() {
+        if (value != null) {
+          return value.slice();
+        }
+        if (!size) {
+          return [];
+        }
+        return types_range_(0, size, false).map((_i) => type.make());
+      },
+      validate(value, target, invalid) {
+        if (!(value instanceof Array)) {
+          value = [value];
+        }
+
+        const l = (target.length = size ? size : value.length);
+        for (
+          let i = 0, end = l, asc = 0 <= end;
+          asc ? i < end : i > end;
+          asc ? i++ : i--
+        ) {
+          const input = value[i] != null ? value[i] : type.make();
+          target[i] = type.validate(input, target[i], invalid);
+        }
+
+        return target;
+      },
+      equals(a, b) {
+        const al = a.length;
+        const bl = b.length;
+        if (al !== bl) {
+          return false;
+        }
+
+        const l = Math.min(al, bl);
+        for (
+          let i = 0, end = l, asc = 0 <= end;
+          asc ? i < end : i > end;
+          asc ? i++ : i--
+        ) {
+          if (
+            !(typeof type.equals === "function"
+              ? type.equals(a[i], b[i])
+              : undefined)
+          ) {
+            return false;
+          }
+        }
+        return true;
+      },
+      lerp,
+      op,
+      clone(v) {
+        return Array.from(v).map((x) => type.clone(x));
+      },
+    };
+  },
+
+  letters(type, size, value = null) {
+    if (value != null) {
+      if (value === "" + value) {
+        value = value.split("");
+      }
+      for (let i = 0; i < value.length; i++) {
+        const v = value[i];
+        value[i] = type.validate(v, v);
+      }
+    }
+
+    const array = types_Types.array(type, size, value);
+
+    return {
+      uniform() {
+        return array.uniform();
+      },
+      make() {
+        return array.make();
+      },
+      validate(value, target, invalid) {
+        if (value === "" + value) {
+          value = value.split("");
+        }
+        return array.validate(value, target, invalid);
+      },
+      equals(a, b) {
+        return array.equals(a, b);
+      },
+      clone: array.clone,
+    };
+  },
+
+  nullable(type, make) {
+    if (make == null) {
+      make = false;
+    }
+    let value = make ? type.make() : null;
+
+    const emitter = type.emitter
+      ? function (expr1, expr2) {
+          if (expr2 == null) {
+            return expr1;
+          }
+          if (expr1 == null) {
+            return expr2;
+          }
+          return type.emitter(expr1, expr2);
+        }
+      : undefined;
+
+    const lerp = type.lerp
+      ? function (a, b, target, f) {
+          if (a === null || b === null) {
+            if (f < 0.5) {
+              return a;
+            } else {
+              return b;
+            }
+          }
+          if (target == null) {
+            target = type.make();
+          }
+          value = type.lerp(a, b, target, f);
+          return target;
+        }
+      : undefined;
+
+    const op = type.op
+      ? function (a, b, target, op) {
+          if (a === null || b === null) {
+            return null;
+          }
+          if (target == null) {
+            target = type.make();
+          }
+          value = type.op(a, b, target, op);
+          return value;
+        }
+      : undefined;
+
+    return {
+      make() {
+        return value;
+      },
+      validate(value, target, invalid) {
+        if (value === null) {
+          return value;
+        }
+        if (target === null) {
+          target = type.make();
+        }
+        return type.validate(value, target, invalid);
+      },
+      uniform() {
+        return typeof type.uniform === "function" ? type.uniform() : undefined;
+      },
+      equals(a, b) {
+        let left;
+        const an = a === null;
+        const bn = b === null;
+        if (an && bn) {
+          return true;
+        }
+        if (an ^ bn) {
+          return false;
+        }
+        return (left =
+          typeof type.equals === "function" ? type.equals(a, b) : undefined) !=
+          null
+          ? left
+          : a === b;
+      },
+      lerp,
+      op,
+      emitter,
+    };
+  },
+
+  enum(value, keys, map) {
+    let key;
+    if (keys == null) {
+      keys = [];
+    }
+    if (map == null) {
+      map = {};
+    }
+    let i = 0;
+    const values = {};
+    for (key of Array.from(keys)) {
+      if (key !== +key) {
+        if (map[key] == null) {
+          map[key] = i++;
+        }
+      }
+    }
+    for (key of Array.from(keys)) {
+      if (key === +key) {
+        values[key] = key;
+      }
+    }
+    for (key in map) {
+      i = map[key];
+      values[i] = true;
+    }
+
+    if (values[value] == null) {
+      value = map[value];
+    }
+
+    return {
+      enum() {
+        return map;
+      },
+      make() {
+        return value;
+      },
+      validate(value, target, invalid) {
+        const v = values[value] ? value : map[value];
+        if (v != null) {
+          return v;
+        }
+        return invalid();
+      },
+    };
+  },
+
+  enumber(value, keys, map) {
+    if (map == null) {
+      map = {};
+    }
+    const _enum = types_Types.enum(value, keys, map);
+
+    return {
+      enum: _enum.enum,
+      uniform() {
+        return "f";
+      },
+      make() {
+        let left;
+        return (left = _enum.make()) != null ? left : +value;
+      },
+      validate(value, target, invalid) {
+        if (value === +value) {
+          return value;
+        }
+        return _enum.validate(value, target, invalid);
+      },
+      op(a, b, target, op) {
+        return op(a, b);
+      },
+    };
+  },
+
+  select(value) {
+    if (value == null) {
+      value = "<";
+    }
+    value;
+    return {
+      make() {
+        return value;
+      },
+      validate(value, target, invalid) {
+        if (typeof value === "string") {
+          return value;
+        }
+        if (typeof value === "object") {
+          return value;
+        }
+        return invalid();
+      },
+    };
+  },
+
+  bool(value) {
+    value = !!value;
+    return {
+      uniform() {
+        return "f";
+      },
+      make() {
+        return value;
+      },
+      validate(value, _target, _invalid) {
+        return !!value;
+      },
+    };
+  },
+
+  int(value) {
+    if (value == null) {
+      value = 0;
+    }
+    value = +Math.round(value);
+    return {
+      uniform() {
+        return "i";
+      },
+      make() {
+        return value;
+      },
+      validate(value, target, invalid) {
+        let x;
+        if (value !== (x = +value)) {
+          return invalid();
+        }
+        return Math.round(x) || 0;
+      },
+      op(a, b, target, op) {
+        return op(a, b);
+      },
+    };
+  },
+
+  round(value) {
+    if (value == null) {
+      value = 0;
+    }
+    value = +Math.round(value);
+    return {
+      uniform() {
+        return "f";
+      },
+      make() {
+        return value;
+      },
+      validate(value, target, invalid) {
+        let x;
+        if (value !== (x = +value)) {
+          return invalid();
+        }
+        return Math.round(x) || 0;
+      },
+      op(a, b, target, op) {
+        return op(a, b);
+      },
+    };
+  },
+
+  number(value) {
+    if (value == null) {
+      value = 0;
+    }
+    return {
+      uniform() {
+        return "f";
+      },
+      make() {
+        return +value;
+      },
+      validate(value, target, invalid) {
+        let x;
+        if (value !== (x = +value)) {
+          return invalid();
+        }
+        return x || 0;
+      },
+      op(a, b, target, op) {
+        return op(a, b);
+      },
+    };
+  },
+
+  positive(type, strict) {
+    if (strict == null) {
+      strict = false;
+    }
+    return {
+      uniform: type.uniform,
+      make: type.make,
+      validate(value, target, invalid) {
+        value = type.validate(value, target, invalid);
+        if (value < 0 || (strict && value <= 0)) {
+          return invalid();
+        }
+        return value;
+      },
+      op(a, b, target, op) {
+        return op(a, b);
+      },
+    };
+  },
+
+  string(value) {
+    if (value == null) {
+      value = "";
+    }
+    return {
+      make() {
+        return "" + value;
+      },
+      validate(value, target, invalid) {
+        let x;
+        if (value !== (x = "" + value)) {
+          return invalid();
+        }
+        return x;
+      },
+    };
+  },
+
+  func() {
+    return {
+      make() {
+        return function () {};
+      },
+      validate(value, target, invalid) {
+        if (typeof value === "function") {
+          return value;
+        }
+        return invalid();
+      },
+    };
+  },
+
+  emitter() {
+    return {
+      make() {
+        return (emit) => emit(1, 1, 1, 1);
+      },
+      validate(value, target, invalid) {
+        if (typeof value === "function") {
+          return value;
+        }
+        return invalid();
+      },
+      emitter(a, b) {
+        return getLerpEmitter(a, b);
+      },
+    };
+  },
+
+  object(value) {
+    return {
+      make() {
+        return value != null ? value : {};
+      },
+      validate(value, target, invalid) {
+        if (typeof value === "object") {
+          return value;
+        }
+        return invalid();
+      },
+      clone(v) {
+        return JSON.parse(JSON.stringify(v));
+      },
+    };
+  },
+
+  timestamp(value = null) {
+    if (typeof value === "string") {
+      value = Date.parse(value);
+    }
+
+    return {
+      uniform() {
+        return "f";
+      },
+      make() {
+        return value != null ? value : +new Date();
+      },
+      validate(value, target, invalid) {
+        value = Date.parse(value);
+        if (value !== +value) {
+          return invalid();
+        }
+        return value;
+      },
+      op(a, b, target, op) {
+        return op(a, b);
+      },
+    };
+  },
+
+  vec2(x, y) {
+    if (x == null) {
+      x = 0;
+    }
+    if (y == null) {
+      y = 0;
+    }
+    const defaults = [x, y];
+    return {
+      uniform() {
+        return "v2";
+      },
+      make() {
+        return new external_THREE_.Vector2(x, y);
+      },
+      validate(value, target, invalid) {
+        if (value === +value) {
+          value = [value];
+        }
+
+        if (value instanceof external_THREE_.Vector2) {
+          target.copy(value);
+        } else if (value instanceof Array) {
+          value = value.concat(defaults.slice(value.length));
+          target.set.apply(target, value);
+        } else if (value != null) {
+          const xx = value.x != null ? value.x : x;
+          const yy = value.y != null ? value.y : y;
+          target.set(xx, yy);
+        } else {
+          return invalid();
+        }
+        return target;
+      },
+
+      equals(a, b) {
+        return a.x === b.x && a.y === b.y;
+      },
+      op(a, b, target, op) {
+        target.x = op(a.x, b.x);
+        target.y = op(a.y, b.y);
+        return target;
+      },
+    };
+  },
+
+  ivec2(x, y) {
+    if (x == null) {
+      x = 0;
+    }
+    if (y == null) {
+      y = 0;
+    }
+    const vec2 = types_Types.vec2(x, y);
+    const { validate } = vec2;
+    vec2.validate = function (value, target, invalid) {
+      validate(value, target, invalid);
+      target.x = Math.round(target.x);
+      target.y = Math.round(target.y);
+      return target;
+    };
+    return vec2;
+  },
+
+  vec3(x, y, z) {
+    if (x == null) {
+      x = 0;
+    }
+    if (y == null) {
+      y = 0;
+    }
+    if (z == null) {
+      z = 0;
+    }
+    const defaults = [x, y, z];
+    return {
+      uniform() {
+        return "v3";
+      },
+      make() {
+        return new external_THREE_.Vector3(x, y, z);
+      },
+      validate(value, target, invalid) {
+        if (value === +value) {
+          value = [value];
+        }
+
+        if (value instanceof external_THREE_.Vector3) {
+          target.copy(value);
+        } else if (value instanceof Array) {
+          value = value.concat(defaults.slice(value.length));
+          target.set.apply(target, value);
+        } else if (value != null) {
+          const xx = value.x != null ? value.x : x;
+          const yy = value.y != null ? value.y : y;
+          const zz = value.z != null ? value.z : z;
+          target.set(xx, yy, zz);
+        } else {
+          return invalid();
+        }
+        return target;
+      },
+
+      equals(a, b) {
+        return a.x === b.x && a.y === b.y && a.z === b.z;
+      },
+      op(a, b, target, op) {
+        target.x = op(a.x, b.x);
+        target.y = op(a.y, b.y);
+        target.z = op(a.z, b.z);
+        return target;
+      },
+    };
+  },
+
+  ivec3(x, y, z) {
+    if (x == null) {
+      x = 0;
+    }
+    if (y == null) {
+      y = 0;
+    }
+    if (z == null) {
+      z = 0;
+    }
+    const vec3 = types_Types.vec3(x, y, z);
+    const { validate } = vec3;
+    vec3.validate = function (value, target, invalid) {
+      validate(value, target, invalid);
+      target.x = Math.round(target.x);
+      target.y = Math.round(target.y);
+      target.z = Math.round(target.z);
+      return target;
+    };
+    return vec3;
+  },
+
+  vec4(x, y, z, w) {
+    if (x == null) {
+      x = 0;
+    }
+    if (y == null) {
+      y = 0;
+    }
+    if (z == null) {
+      z = 0;
+    }
+    if (w == null) {
+      w = 0;
+    }
+    const defaults = [x, y, z, w];
+    return {
+      uniform() {
+        return "v4";
+      },
+      make() {
+        return new external_THREE_.Vector4(x, y, z, w);
+      },
+      validate(value, target, invalid) {
+        if (value === +value) {
+          value = [value];
+        }
+
+        if (value instanceof external_THREE_.Vector4) {
+          target.copy(value);
+        } else if (value instanceof Array) {
+          value = value.concat(defaults.slice(value.length));
+          target.set.apply(target, value);
+        } else if (value != null) {
+          const xx = value.x != null ? value.x : x;
+          const yy = value.y != null ? value.y : y;
+          const zz = value.z != null ? value.z : z;
+          const ww = value.w != null ? value.w : w;
+          target.set(xx, yy, zz, ww);
+        } else {
+          return invalid();
+        }
+        return target;
+      },
+      equals(a, b) {
+        return a.x === b.x && a.y === b.y && a.z === b.z && a.w === b.w;
+      },
+      op(a, b, target, op) {
+        target.x = op(a.x, b.x);
+        target.y = op(a.y, b.y);
+        target.z = op(a.z, b.z);
+        target.w = op(a.w, b.w);
+        return target;
+      },
+    };
+  },
+
+  ivec4(x, y, z, w) {
+    if (x == null) {
+      x = 0;
+    }
+    if (y == null) {
+      y = 0;
+    }
+    if (z == null) {
+      z = 0;
+    }
+    if (w == null) {
+      w = 0;
+    }
+    const vec4 = types_Types.vec4(x, y, z, w);
+    const { validate } = vec4;
+    vec4.validate = function (value, target, invalid) {
+      validate(value, target, invalid);
+      target.x = Math.round(target.x);
+      target.y = Math.round(target.y);
+      target.z = Math.round(target.z);
+      target.w = Math.round(target.w);
+      return target;
+    };
+    return vec4;
+  },
+
+  mat3(n11, n12, n13, n21, n22, n23, n31, n32, n33) {
+    if (n11 == null) {
+      n11 = 1;
+    }
+    if (n12 == null) {
+      n12 = 0;
+    }
+    if (n13 == null) {
+      n13 = 0;
+    }
+    if (n21 == null) {
+      n21 = 0;
+    }
+    if (n22 == null) {
+      n22 = 1;
+    }
+    if (n23 == null) {
+      n23 = 0;
+    }
+    if (n31 == null) {
+      n31 = 0;
+    }
+    if (n32 == null) {
+      n32 = 0;
+    }
+    if (n33 == null) {
+      n33 = 1;
+    }
+    const defaults = [n11, n12, n13, n21, n22, n23, n31, n32, n33];
+
+    return {
+      uniform() {
+        return "m4";
+      },
+      make() {
+        const m = new external_THREE_.Matrix3();
+        m.set(n11, n12, n13, n21, n22, n23, n31, n32, n33);
+        return m;
+      },
+      validate(value, target, invalid) {
+        if (value instanceof external_THREE_.Matrix3) {
+          target.copy(value);
+        } else if (value instanceof Array) {
+          value = value.concat(defaults.slice(value.length));
+          target.set.apply(target, value);
+        } else {
+          return invalid();
+        }
+        return target;
+      },
+    };
+  },
+
+  mat4(
+    n11,
+    n12,
+    n13,
+    n14,
+    n21,
+    n22,
+    n23,
+    n24,
+    n31,
+    n32,
+    n33,
+    n34,
+    n41,
+    n42,
+    n43,
+    n44
+  ) {
+    if (n11 == null) {
+      n11 = 1;
+    }
+    if (n12 == null) {
+      n12 = 0;
+    }
+    if (n13 == null) {
+      n13 = 0;
+    }
+    if (n14 == null) {
+      n14 = 0;
+    }
+    if (n21 == null) {
+      n21 = 0;
+    }
+    if (n22 == null) {
+      n22 = 1;
+    }
+    if (n23 == null) {
+      n23 = 0;
+    }
+    if (n24 == null) {
+      n24 = 0;
+    }
+    if (n31 == null) {
+      n31 = 0;
+    }
+    if (n32 == null) {
+      n32 = 0;
+    }
+    if (n33 == null) {
+      n33 = 1;
+    }
+    if (n34 == null) {
+      n34 = 0;
+    }
+    if (n41 == null) {
+      n41 = 0;
+    }
+    if (n42 == null) {
+      n42 = 0;
+    }
+    if (n43 == null) {
+      n43 = 0;
+    }
+    if (n44 == null) {
+      n44 = 1;
+    }
+    const defaults = [
+      n11,
+      n12,
+      n13,
+      n14,
+      n21,
+      n22,
+      n23,
+      n24,
+      n31,
+      n32,
+      n33,
+      n34,
+      n41,
+      n42,
+      n43,
+      n44,
+    ];
+
+    return {
+      uniform() {
+        return "m4";
+      },
+      make() {
+        const m = new external_THREE_.Matrix4();
+        m.set(
+          n11,
+          n12,
+          n13,
+          n14,
+          n21,
+          n22,
+          n23,
+          n24,
+          n31,
+          n32,
+          n33,
+          n34,
+          n41,
+          n42,
+          n43,
+          n44
+        );
+        return m;
+      },
+      validate(value, target, invalid) {
+        if (value instanceof external_THREE_.Matrix4) {
+          target.copy(value);
+        } else if (value instanceof Array) {
+          value = value.concat(defaults.slice(value.length));
+          target.set.apply(target, value);
+        } else {
+          return invalid();
+        }
+        return target;
+      },
+    };
+  },
+
+  quat(x, y, z, w) {
+    if (x == null) {
+      x = 0;
+    }
+    if (y == null) {
+      y = 0;
+    }
+    if (z == null) {
+      z = 0;
+    }
+    if (w == null) {
+      w = 1;
+    }
+    const vec4 = types_Types.vec4(x, y, z, w);
+
+    return {
+      uniform() {
+        return "v4";
+      },
+      make() {
+        return new external_THREE_.Quaternion();
+      },
+      validate(value, target, invalid) {
+        if (value instanceof external_THREE_.Quaternion) {
+          target.copy(value);
+        } else {
+          target = vec4.validate(value, target, invalid);
+        }
+        target.normalize();
+        return target;
+      },
+      equals(a, b) {
+        return a.x === b.x && a.y === b.y && a.z === b.z && a.w === b.w;
+      },
+      op(a, b, target, op) {
+        target.x = op(a.x, b.x);
+        target.y = op(a.y, b.y);
+        target.z = op(a.z, b.z);
+        target.w = op(a.w, b.w);
+        target.normalize();
+        return target;
+      },
+      lerp(a, b, target, f) {
+        if (target.slerpQuaternions) {
+          // NOTE: slerpQuaternions replaced the static slerp method in three.js
+          // r127. This switch removes the deprecation warning and keeps the
+          // project three.js compatible across this version.
+          target.slerpQuaternions(a, b, f);
+        } else {
+          external_THREE_.Quaternion.slerp(a, b, target, f);
+        }
+        return target;
+      },
+    };
+  },
+
+  color(r, g, b) {
+    if (r == null) {
+      r = 0.5;
+    }
+    if (g == null) {
+      g = 0.5;
+    }
+    if (b == null) {
+      b = 0.5;
+    }
+    const defaults = [r, g, b];
+
+    return {
+      uniform() {
+        return "c";
+      },
+      make() {
+        return new external_THREE_.Color(r, g, b);
+      },
+      validate(value, target, invalid) {
+        if (value === "" + value) {
+          value = new external_THREE_.Color().setStyle(value);
+        } else if (value === +value) {
+          value = new external_THREE_.Color(value);
+        }
+
+        if (value instanceof external_THREE_.Color) {
+          target.copy(value);
+        } else if (value instanceof Array) {
+          value = value.concat(defaults.slice(value.length));
+          target.setRGB.apply(target, value);
+        } else if (value != null) {
+          const rr = value.r != null ? value.r : r;
+          const gg = value.g != null ? value.g : g;
+          const bb = value.b != null ? value.b : b;
+          target.set(rr, gg, bb);
+        } else {
+          return invalid();
+        }
+        return target;
+      },
+
+      equals(a, b) {
+        return a.r === b.r && a.g === b.g && a.b === b.b;
+      },
+      op(a, b, target, op) {
+        target.r = op(a.r, b.r);
+        target.g = op(a.g, b.g);
+        target.b = op(a.b, b.b);
+        return target;
+      },
+    };
+  },
+
+  axis(value, allowZero) {
+    let v;
+    if (value == null) {
+      value = 1;
+    }
+    if (allowZero == null) {
+      allowZero = false;
+    }
+    const map = {
+      x: 1,
+      y: 2,
+      z: 3,
+      w: 4,
+      W: 1,
+      H: 2,
+      D: 3,
+      I: 4,
+      zero: 0,
+      null: 0,
+      width: 1,
+      height: 2,
+      depth: 3,
+      items: 4,
+    };
+
+    const range = allowZero ? [0, 1, 2, 3, 4] : [1, 2, 3, 4];
+    if ((v = map[value]) != null) {
+      value = v;
+    }
+
+    return {
+      make() {
+        return value;
+      },
+      validate(value, target, invalid) {
+        let left;
+        if ((v = map[value]) != null) {
+          value = v;
+        }
+        value = (left = Math.round(value)) != null ? left : 0;
+        if (Array.from(range).includes(value)) {
+          return value;
+        }
+        return invalid();
+      },
+    };
+  },
+
+  transpose(order) {
+    if (order == null) {
+      order = [1, 2, 3, 4];
+    }
+    const looseArray = types_Types.letters(types_Types.axis(null, false), 0, order);
+    const axesArray = types_Types.letters(types_Types.axis(null, false), 4, order);
+
+    return {
+      make() {
+        return axesArray.make();
+      },
+      validate(value, target, invalid) {
+        let temp = [1, 2, 3, 4];
+        looseArray.validate(value, temp, invalid);
+
+        if (temp.length < 4) {
+          const missing = [1, 2, 3, 4].filter((x) => temp.indexOf(x) === -1);
+          temp = temp.concat(missing);
+        }
+
+        const unique = Array.from(temp).map(
+          (letter, i) => temp.indexOf(letter) === i
+        );
+        if (unique.indexOf(false) < 0) {
+          return axesArray.validate(temp, target, invalid);
+        }
+        return invalid();
+      },
+      equals: axesArray.equals,
+      clone: axesArray.clone,
+    };
+  },
+
+  swizzle(order, size = null) {
+    if (order == null) {
+      order = [1, 2, 3, 4];
+    }
+    if (size == null) {
+      size = order.length;
+    }
+    order = order.slice(0, size);
+    const looseArray = types_Types.letters(types_Types.axis(null, false), 0, order);
+    const axesArray = types_Types.letters(types_Types.axis(null, true), size, order);
+
+    return {
+      make() {
+        return axesArray.make();
+      },
+      validate(value, target, invalid) {
+        let temp = order.slice();
+        looseArray.validate(value, temp, invalid);
+
+        if (temp.length < size) {
+          temp = temp.concat([0, 0, 0, 0]).slice(0, size);
+        }
+
+        return axesArray.validate(temp, target, invalid);
+      },
+      equals: axesArray.equals,
+      clone: axesArray.clone,
+    };
+  },
+
+  classes() {
+    const stringArray = types_Types.array(types_Types.string());
+
+    return {
+      make() {
+        return stringArray.make();
+      },
+      validate(value, target, invalid) {
+        if (value === "" + value) {
+          value = value.split(" ");
+        }
+        value = value.filter((x) => !!x.length);
+        return stringArray.validate(value, target, invalid);
+      },
+      equals: stringArray.equals,
+      clone: stringArray.clone,
+    };
+  },
+
+  blending(value) {
+    if (value == null) {
+      value = "normal";
+    }
+    const keys = ["no", "normal", "add", "subtract", "multiply", "custom"];
+    return types_Types.enum(value, keys);
+  },
+
+  filter(value) {
+    if (value == null) {
+      value = "nearest";
+    }
+    const map = {
+      nearest: external_THREE_.NearestFilter,
+      nearestMipMapNearest: external_THREE_.NearestMipMapNearestFilter,
+      nearestMipMapLinear: external_THREE_.NearestMipMapLinearFilter,
+      linear: external_THREE_.LinearFilter,
+      linearMipMapNearest: external_THREE_.LinearMipMapNearestFilter,
+      linearMipmapLinear: external_THREE_.LinearMipMapLinearFilter,
+    };
+
+    return types_Types.enum(value, [], map);
+  },
+
+  type(value) {
+    if (value == null) {
+      value = "unsignedByte";
+    }
+    const map = {
+      unsignedByte: external_THREE_.UnsignedByteType,
+      byte: external_THREE_.ByteType,
+      short: external_THREE_.ShortType,
+      unsignedShort: external_THREE_.UnsignedShortType,
+      int: external_THREE_.IntType,
+      unsignedInt: external_THREE_.UnsignedIntType,
+      float: external_THREE_.FloatType,
+    };
+
+    return types_Types.enum(value, [], map);
+  },
+
+  scale(value) {
+    if (value == null) {
+      value = "linear";
+    }
+    const keys = ["linear", "log"];
+    return types_Types.enum(value, keys);
+  },
+
+  mapping(value) {
+    if (value == null) {
+      value = "relative";
+    }
+    const keys = ["relative", "absolute"];
+    return types_Types.enum(value, keys);
+  },
+
+  indexing(value) {
+    if (value == null) {
+      value = "original";
+    }
+    const keys = ["original", "final"];
+    return types_Types.enum(value, keys);
+  },
+
+  shape(value) {
+    if (value == null) {
+      value = "circle";
+    }
+    const keys = ["circle", "square", "diamond", "up", "down", "left", "right"];
+    return types_Types.enum(value, keys);
+  },
+
+  join(value) {
+    if (value == null) {
+      value = "miter";
+    }
+    const keys = ["miter", "round", "bevel"];
+    return types_Types.enum(value, keys);
+  },
+
+  stroke(value) {
+    if (value == null) {
+      value = "solid";
+    }
+    const keys = ["solid", "dotted", "dashed"];
+    return types_Types.enum(value, keys);
+  },
+
+  vertexPass(value) {
+    if (value == null) {
+      value = "view";
+    }
+    const keys = ["data", "view", "world", "eye"];
+    return types_Types.enum(value, keys);
+  },
+
+  fragmentPass(value) {
+    if (value == null) {
+      value = "light";
+    }
+    const keys = ["color", "light", "rgba"];
+    return types_Types.enum(value, keys);
+  },
+
+  ease(value) {
+    if (value == null) {
+      value = "linear";
+    }
+    const keys = ["linear", "cosine", "binary", "hold"];
+    return types_Types.enum(value, keys);
+  },
+
+  fit(value) {
+    if (value == null) {
+      value = "contain";
+    }
+    const keys = ["x", "y", "contain", "cover"];
+    return types_Types.enum(value, keys);
+  },
+
+  anchor(value) {
+    if (value == null) {
+      value = "middle";
+    }
+    const map = {
+      first: 1,
+      middle: 0,
+      last: -1,
+    };
+
+    return types_Types.enumber(value, [], map);
+  },
+
+  transitionState(value) {
+    if (value == null) {
+      value = "enter";
+    }
+    const map = {
+      enter: -1,
+      visible: 0,
+      exit: 1,
+    };
+
+    return types_Types.enumber(value, [], map);
+  },
+
+  font(value) {
+    if (value == null) {
+      value = "sans-serif";
+    }
+    const parse = parseQuoted;
+    if (!(value instanceof Array)) {
+      value = parse(value);
+    }
+    const stringArray = types_Types.array(types_Types.string(), 0, value);
+
+    return {
+      make() {
+        return stringArray.make();
+      },
+      validate(value, target, invalid) {
+        try {
+          if (!(value instanceof Array)) {
+            value = parse(value);
+          }
+        } catch (error) {
+          return invalid();
+        }
+
+        value = value.filter((x) => !!x.length);
+        return stringArray.validate(value, target, invalid);
+      },
+      equals: stringArray.equals,
+      clone: stringArray.clone,
+    };
+  },
+
+  data(value) {
+    if (value == null) {
+      value = [];
+    }
+    return {
+      make() {
+        return [];
+      },
+      validate(value, target, invalid) {
+        if (value instanceof Array) {
+          return value;
+        } else if ((value != null ? value.length : undefined) != null) {
+          return value;
+        } else {
+          return invalid();
+        }
+      },
+
+      emitter(a, b) {
+        return getLerpThunk(a, b);
+      },
+    };
+  },
+};
+
+const decorate = function (types) {
+  for (const k in types) {
+    const type = types[k];
+    types[k] = ((type) =>
+      function () {
+        const t = type.apply(type, arguments);
+        if (t.validate == null) {
+          t.validate = (v) => v != null;
+        }
+        if (t.equals == null) {
+          t.equals = (a, b) => a === b;
+        }
+        if (t.clone == null) {
+          t.clone = function (v) {
+            let left;
+            return (left = types_guardMethod_(v, "clone", (o) => o.clone())) !=
+              null
+              ? left
+              : v;
+          };
+        }
+        return t;
+      })(type);
+  }
+  return types;
+};
+
+const types_Types = decorate(_Types);
+
+function types_range_(left, right, inclusive) {
+  const range = [];
+  const ascending = left < right;
+  const end = !inclusive ? right : ascending ? right + 1 : right - 1;
+  for (let i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {
+    range.push(i);
+  }
+  return range;
+}
+function types_guardMethod_(obj, methodName, transform) {
+  if (
+    typeof obj !== "undefined" &&
+    obj !== null &&
+    typeof obj[methodName] === "function"
+  ) {
+    return transform(obj, methodName);
+  } else {
+    return undefined;
+  }
+}
+
+;// CONCATENATED MODULE: ./src/primitives/types/traits.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+
+
+const Traits = {
+  node: {
+    id: types_Types.nullable(types_Types.string()),
+    classes: types_Types.classes(),
+  },
+
+  entity: {
+    active: types_Types.bool(true),
+  },
+
+  object: {
+    visible: types_Types.bool(true),
+  },
+
+  unit: {
+    scale: types_Types.nullable(types_Types.number()),
+    fov: types_Types.nullable(types_Types.number()),
+    focus: types_Types.nullable(types_Types.number(1), true),
+  },
+
+  span: {
+    range: types_Types.nullable(types_Types.vec2(-1, 1)),
+  },
+  view: {
+    range: types_Types.array(types_Types.vec2(-1, 1), 4),
+  },
+  view3: {
+    position: types_Types.vec3(),
+    quaternion: types_Types.quat(),
+    rotation: types_Types.vec3(),
+    scale: types_Types.vec3(1, 1, 1),
+    eulerOrder: types_Types.swizzle("xyz"),
+  },
+  view4: {
+    position: types_Types.vec4(),
+    scale: types_Types.vec4(1, 1, 1, 1),
+  },
+
+  layer: {
+    depth: types_Types.number(1),
+    fit: types_Types.fit("y"),
+  },
+
+  vertex: {
+    pass: types_Types.vertexPass(),
+  },
+  fragment: {
+    pass: types_Types.fragmentPass(),
+    gamma: types_Types.bool(false),
+  },
+
+  transform3: {
+    position: types_Types.vec3(),
+    quaternion: types_Types.quat(),
+    rotation: types_Types.vec3(),
+    eulerOrder: types_Types.swizzle("xyz"),
+    scale: types_Types.vec3(1, 1, 1),
+    matrix: types_Types.mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1),
+  },
+  transform4: {
+    position: types_Types.vec4(),
+    scale: types_Types.vec4(1, 1, 1, 1),
+    matrix: types_Types.mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1),
+  },
+
+  camera: {
+    proxy: types_Types.bool(false),
+    position: types_Types.nullable(types_Types.vec3()),
+    quaternion: types_Types.nullable(types_Types.quat()),
+    rotation: types_Types.nullable(types_Types.vec3()),
+    lookAt: types_Types.nullable(types_Types.vec3()),
+    up: types_Types.nullable(types_Types.vec3()),
+    eulerOrder: types_Types.swizzle("xyz"),
+    fov: types_Types.nullable(types_Types.number(1)),
+  },
+  //ortho:             Types.nullable(Types.number(0))
+
+  polar: {
+    bend: types_Types.number(1),
+    helix: types_Types.number(0),
+  },
+  spherical: {
+    bend: types_Types.number(1),
+  },
+  stereographic: {
+    bend: types_Types.number(1),
+  },
+
+  interval: {
+    axis: types_Types.axis(),
+  },
+  area: {
+    axes: types_Types.swizzle([1, 2], 2),
+  },
+  volume: {
+    axes: types_Types.swizzle([1, 2, 3], 3),
+  },
+
+  origin: {
+    origin: types_Types.vec4(),
+  },
+  scale: {
+    divide: types_Types.number(10),
+    unit: types_Types.number(1),
+    base: types_Types.number(10),
+    mode: types_Types.scale(),
+    start: types_Types.bool(true),
+    end: types_Types.bool(true),
+    zero: types_Types.bool(true),
+    factor: types_Types.positive(types_Types.number(1)),
+    nice: types_Types.bool(true),
+  },
+  grid: {
+    lineX: types_Types.bool(true),
+    lineY: types_Types.bool(true),
+    crossed: types_Types.bool(false),
+    closedX: types_Types.bool(false),
+    closedY: types_Types.bool(false),
+  },
+  axis: {
+    detail: types_Types.int(1),
+    crossed: types_Types.bool(false),
+  },
+
+  data: {
+    data: types_Types.nullable(types_Types.data()),
+    expr: types_Types.nullable(types_Types.emitter()),
+    bind: types_Types.nullable(types_Types.func()),
+    live: types_Types.bool(true),
+  },
+  buffer: {
+    channels: types_Types["enum"](4, [1, 2, 3, 4]),
+    items: types_Types.int(1),
+    fps: types_Types.nullable(types_Types.int(60)),
+    hurry: types_Types.int(5),
+    limit: types_Types.int(60),
+    realtime: types_Types.bool(false),
+    observe: types_Types.bool(false),
+    aligned: types_Types.bool(false),
+  },
+  sampler: {
+    centered: types_Types.bool(false),
+    padding: types_Types.number(0),
+  },
+  array: {
+    width: types_Types.nullable(types_Types.positive(types_Types.int(1), true)),
+    bufferWidth: types_Types.int(1),
+    history: types_Types.int(1),
+  },
+  matrix: {
+    width: types_Types.nullable(types_Types.positive(types_Types.int(1), true)),
+    height: types_Types.nullable(types_Types.positive(types_Types.int(1), true)),
+    history: types_Types.int(1),
+    bufferWidth: types_Types.int(1),
+    bufferHeight: types_Types.int(1),
+  },
+  voxel: {
+    width: types_Types.nullable(types_Types.positive(types_Types.int(1), true)),
+    height: types_Types.nullable(types_Types.positive(types_Types.int(1), true)),
+    depth: types_Types.nullable(types_Types.positive(types_Types.int(1), true)),
+    bufferWidth: types_Types.int(1),
+    bufferHeight: types_Types.int(1),
+    bufferDepth: types_Types.int(1),
+  },
+
+  resolve: {
+    expr: types_Types.nullable(types_Types.func()),
+    items: types_Types.int(1),
+  },
+
+  style: {
+    opacity: types_Types.positive(types_Types.number(1)),
+    color: types_Types.color(),
+    blending: types_Types.blending(),
+    zWrite: types_Types.bool(true),
+    zTest: types_Types.bool(true),
+    zIndex: types_Types.positive(types_Types.round()),
+    zBias: types_Types.number(0),
+    zOrder: types_Types.nullable(types_Types.int()),
+  },
+
+  geometry: {
+    points: types_Types.select(),
+    colors: types_Types.nullable(types_Types.select()),
+  },
+
+  point: {
+    size: types_Types.positive(types_Types.number(4)),
+    sizes: types_Types.nullable(types_Types.select()),
+
+    shape: types_Types.shape(),
+    optical: types_Types.bool(true),
+    fill: types_Types.bool(true),
+    depth: types_Types.number(1),
+  },
+
+  line: {
+    width: types_Types.positive(types_Types.number(2)),
+    depth: types_Types.positive(types_Types.number(1)),
+    join: types_Types.join(),
+    stroke: types_Types.stroke(),
+    proximity: types_Types.nullable(types_Types.number(Infinity)),
+    closed: types_Types.bool(false),
+  },
+  mesh: {
+    fill: types_Types.bool(true),
+    shaded: types_Types.bool(false),
+    map: types_Types.nullable(types_Types.select()),
+    lineBias: types_Types.number(5),
+  },
+  strip: {
+    line: types_Types.bool(false),
+  },
+  face: {
+    line: types_Types.bool(false),
+  },
+  arrow: {
+    size: types_Types.number(3),
+    start: types_Types.bool(false),
+    end: types_Types.bool(false),
+  },
+  ticks: {
+    normal: types_Types.vec3(0, 0, 1),
+    size: types_Types.positive(types_Types.number(10)),
+    epsilon: types_Types.positive(types_Types.number(0.001)),
+  },
+  attach: {
+    offset: types_Types.vec2(0, -20),
+    snap: types_Types.bool(false),
+    depth: types_Types.number(0),
+  },
+
+  format: {
+    digits: types_Types.nullable(types_Types.positive(types_Types.number(3))),
+    data: types_Types.nullable(types_Types.data()),
+    expr: types_Types.nullable(types_Types.func()),
+    live: types_Types.bool(true),
+  },
+  font: {
+    font: types_Types.font("sans-serif"),
+    style: types_Types.string(),
+    variant: types_Types.string(),
+    weight: types_Types.string(),
+    detail: types_Types.number(24),
+    sdf: types_Types.number(5),
+  },
+  label: {
+    text: types_Types.select(),
+    size: types_Types.number(16),
+    outline: types_Types.number(2),
+    expand: types_Types.number(0),
+    background: types_Types.color(1, 1, 1),
+  },
+
+  overlay: {
+    opacity: types_Types.number(1),
+    zIndex: types_Types.positive(types_Types.round(0)),
+  },
+  dom: {
+    points: types_Types.select(),
+    html: types_Types.select(),
+    size: types_Types.number(16),
+    outline: types_Types.number(2),
+    zoom: types_Types.number(1),
+    color: types_Types.nullable(types_Types.color()),
+    attributes: types_Types.nullable(types_Types.object()),
+    pointerEvents: types_Types.bool(false),
+  },
+
+  texture: {
+    minFilter: types_Types.filter("nearest"),
+    magFilter: types_Types.filter("nearest"),
+    type: types_Types.type("float"),
+  },
+
+  shader: {
+    sources: types_Types.nullable(types_Types.select()),
+    language: types_Types.string("glsl"),
+    code: types_Types.string(),
+    uniforms: types_Types.nullable(types_Types.object()),
+  },
+  include: {
+    shader: types_Types.select(),
+  },
+
+  operator: {
+    source: types_Types.select(),
+  },
+  spread: {
+    unit: types_Types.mapping(),
+    items: types_Types.nullable(types_Types.vec4()),
+    width: types_Types.nullable(types_Types.vec4()),
+    height: types_Types.nullable(types_Types.vec4()),
+    depth: types_Types.nullable(types_Types.vec4()),
+    alignItems: types_Types.anchor(),
+    alignWidth: types_Types.anchor(),
+    alignHeight: types_Types.anchor(),
+    alignDepth: types_Types.anchor(),
+  },
+  grow: {
+    scale: types_Types.number(1),
+    items: types_Types.nullable(types_Types.anchor()),
+    width: types_Types.nullable(types_Types.anchor()),
+    height: types_Types.nullable(types_Types.anchor()),
+    depth: types_Types.nullable(types_Types.anchor()),
+  },
+  split: {
+    order: types_Types.transpose("wxyz"),
+    axis: types_Types.nullable(types_Types.axis()),
+    length: types_Types.int(1),
+    overlap: types_Types.int(0),
+  },
+  join: {
+    order: types_Types.transpose("wxyz"),
+    axis: types_Types.nullable(types_Types.axis()),
+    overlap: types_Types.int(0),
+  },
+  swizzle: {
+    order: types_Types.swizzle(),
+  },
+  transpose: {
+    order: types_Types.transpose(),
+  },
+  repeat: {
+    items: types_Types.number(1),
+    width: types_Types.number(1),
+    height: types_Types.number(1),
+    depth: types_Types.number(1),
+  },
+  slice: {
+    items: types_Types.nullable(types_Types.vec2()),
+    width: types_Types.nullable(types_Types.vec2()),
+    height: types_Types.nullable(types_Types.vec2()),
+    depth: types_Types.nullable(types_Types.vec2()),
+  },
+  lerp: {
+    size: types_Types.mapping("absolute"),
+    items: types_Types.nullable(types_Types.number()),
+    width: types_Types.nullable(types_Types.number()),
+    height: types_Types.nullable(types_Types.number()),
+    depth: types_Types.nullable(types_Types.number()),
+  },
+  subdivide: {
+    items: types_Types.nullable(types_Types.positive(types_Types.int(), true)),
+    width: types_Types.nullable(types_Types.positive(types_Types.int(), true)),
+    height: types_Types.nullable(types_Types.positive(types_Types.int(), true)),
+    depth: types_Types.nullable(types_Types.positive(types_Types.int(), true)),
+    bevel: types_Types.number(1),
+    lerp: types_Types.bool(true),
+  },
+  resample: {
+    indices: types_Types.number(4),
+    channels: types_Types.number(4),
+    sample: types_Types.mapping(),
+    size: types_Types.mapping("absolute"),
+    items: types_Types.nullable(types_Types.number()),
+    width: types_Types.nullable(types_Types.number()),
+    height: types_Types.nullable(types_Types.number()),
+    depth: types_Types.nullable(types_Types.number()),
+  },
+  readback: {
+    type: types_Types.type("float"),
+    expr: types_Types.nullable(types_Types.func()),
+    data: types_Types.data(),
+    channels: types_Types["enum"](4, [1, 2, 3, 4]),
+    items: types_Types.nullable(types_Types.int()),
+    width: types_Types.nullable(types_Types.int()),
+    height: types_Types.nullable(types_Types.int()),
+    depth: types_Types.nullable(types_Types.int()),
+  },
+  root: {
+    speed: types_Types.number(1),
+    camera: types_Types.select("[camera]"),
+  },
+  inherit: {
+    source: types_Types.select(),
+    traits: types_Types.array(types_Types.string()),
+  },
+
+  rtt: {
+    size: types_Types.mapping("absolute"),
+    width: types_Types.nullable(types_Types.number()),
+    height: types_Types.nullable(types_Types.number()),
+    history: types_Types.int(1),
+  },
+  compose: {
+    alpha: types_Types.bool(false),
+  },
+
+  present: {
+    index: types_Types.int(1),
+    directed: types_Types.bool(true),
+    length: types_Types.number(0),
+  },
+  slide: {
+    order: types_Types.nullable(types_Types.int(0)),
+    steps: types_Types.number(1),
+    early: types_Types.int(0),
+    late: types_Types.int(0),
+    from: types_Types.nullable(types_Types.int(0)),
+    to: types_Types.nullable(types_Types.int(1)),
+  },
+
+  transition: {
+    stagger: types_Types.vec4(),
+    enter: types_Types.nullable(types_Types.number(1)),
+    exit: types_Types.nullable(types_Types.number(1)),
+    delay: types_Types.number(0),
+    delayEnter: types_Types.nullable(types_Types.number(0)),
+    delayExit: types_Types.nullable(types_Types.number(0)),
+    duration: types_Types.number(0.3),
+    durationEnter: types_Types.nullable(types_Types.number(0)),
+    durationExit: types_Types.nullable(types_Types.number(0)),
+  },
+  move: {
+    from: types_Types.vec4(),
+    to: types_Types.vec4(),
+  },
+
+  seek: {
+    seek: types_Types.nullable(types_Types.number(0)),
+  },
+  track: {
+    target: types_Types.select(),
+    script: types_Types.object({}),
+    ease: types_Types.ease("cosine"),
+  },
+  trigger: {
+    trigger: types_Types.nullable(types_Types.int(1), true),
+  },
+  step: {
+    playback: types_Types.ease("linear"),
+    stops: types_Types.nullable(types_Types.array(types_Types.number())),
+    delay: types_Types.number(0),
+    duration: types_Types.number(0.3),
+    pace: types_Types.number(0),
+    speed: types_Types.number(1),
+    rewind: types_Types.number(2),
+    skip: types_Types.bool(true),
+    realtime: types_Types.bool(false),
+  },
+  play: {
+    delay: types_Types.number(0),
+    pace: types_Types.number(1),
+    speed: types_Types.number(1),
+    from: types_Types.number(0),
+    to: types_Types.number(Infinity),
+    realtime: types_Types.bool(false),
+    loop: types_Types.bool(false),
+  },
+  now: {
+    now: types_Types.nullable(types_Types.timestamp()),
+    seek: types_Types.nullable(types_Types.number(0)),
+    pace: types_Types.number(1),
+    speed: types_Types.number(1),
+  },
+};
+
+;// CONCATENATED MODULE: ./src/util/ticks.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS202: Simplify dynamic range loops
+ * DS205: Consider reworking code to avoid use of IIFEs
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+/*
+ Generate equally spaced ticks in a range at sensible positions.
+
+ @param min/max - Minimum and maximum of range
+ @param n - Desired number of ticks in range
+ @param unit - Base unit of scale (e.g. 1 or π).
+ @param scale - Division scale (e.g. 2 = binary division, or 10 = decimal division).
+ @param bias - Integer to bias divisions one or more levels up or down (to create nested scales)
+ @param start - Whether to include a tick at the start
+ @param end - Whether to include a tick at the end
+ @param zero - Whether to include zero as a tick
+ @param nice - Whether to round to a more reasonable interval
+*/
+
+const linear = function (
+  min,
+  max,
+  n,
+  unit,
+  base,
+  factor,
+  start,
+  end,
+  zero,
+  nice
+) {
+  let ticks;
+  let i, f;
+  if (nice == null) {
+    nice = true;
+  }
+  if (!n) {
+    n = 10;
+  }
+  if (!unit) {
+    unit = 1;
+  }
+  if (!base) {
+    base = 10;
+  }
+  if (!factor) {
+    factor = 1;
+  }
+
+  // Calculate naive tick size.
+  const span = max - min;
+  const ideal = span / n;
+
+  // Unsnapped division
+  if (!nice) {
+    ticks = (() => {
+      let asc, end1;
+      const result = [];
+      for (
+        i = 0, end1 = n, asc = 0 <= end1;
+        asc ? i <= end1 : i >= end1;
+        asc ? i++ : i--
+      ) {
+        result.push(min + i * ideal);
+      }
+      return result;
+    })();
+    if (!start) {
+      ticks.shift();
+    }
+    if (!end) {
+      ticks.pop();
+    }
+    if (!zero) {
+      ticks = ticks.filter((x) => x !== 0);
+    }
+    return ticks;
+  }
+
+  // Round to the floor'd power of 'scale'
+  if (!unit) {
+    unit = 1;
+  }
+  if (!base) {
+    base = 10;
+  }
+  const ref =
+    unit * Math.pow(base, Math.floor(Math.log(ideal / unit) / Math.log(base)));
+
+  // Make derived steps at sensible factors.
+  const factors =
+    base % 2 === 0
+      ? [base / 2, 1, 1 / 2]
+      : base % 3 === 0
+      ? [base / 3, 1, 1 / 3]
+      : [1];
+  const steps = (() => {
+    const result1 = [];
+    for (f of Array.from(factors)) {
+      result1.push(ref * f);
+    }
+    return result1;
+  })();
+
+  // Find step size closest to ideal.
+  let distance = Infinity;
+  let step = steps.reduce(function (ref, step) {
+    f = step / ideal;
+    const d = Math.max(f, 1 / f);
+
+    if (d < distance) {
+      distance = d;
+      return step;
+    } else {
+      return ref;
+    }
+  }, ref);
+
+  // Scale final step
+  step *= factor;
+
+  // Renormalize min/max onto aligned steps.
+  min = Math.ceil(min / step + +!start) * step;
+  max = (Math.floor(max / step) - +!end) * step;
+  n = Math.ceil((max - min) / step);
+
+  // Generate equally spaced ticks
+  ticks = (() => {
+    let asc1, end2;
+    const result2 = [];
+    for (
+      i = 0, end2 = n, asc1 = 0 <= end2;
+      asc1 ? i <= end2 : i >= end2;
+      asc1 ? i++ : i--
+    ) {
+      result2.push(min + i * step);
+    }
+    return result2;
+  })();
+  if (!zero) {
+    ticks = ticks.filter((x) => x !== 0);
+  }
+  return ticks;
+};
+
+/*
+ Generate logarithmically spaced ticks in a range at sensible positions.
+*/
+
+const log = function (
+  _min,
+  _max,
+  _n,
+  _unit,
+  _base,
+  _bias,
+  _start,
+  _end,
+  _zero,
+  _nice
+) {
+  throw new Error("Log ticks not yet implemented.");
+};
+
+const LINEAR = 0;
+const LOG = 1;
+
+const make = function (
+  type,
+  min,
+  max,
+  n,
+  unit,
+  base,
+  bias,
+  start,
+  end,
+  zero,
+  nice
+) {
+  switch (type) {
+    case LINEAR:
+      return linear(min, max, n, unit, base, bias, start, end, zero, nice);
+    case LOG:
+      return log(min, max, n, unit, base, bias, start, end, zero, nice);
+  }
+};
+
+;// CONCATENATED MODULE: ./src/primitives/types/helpers.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining
+ * DS104: Avoid inline assignments
+ * DS205: Consider reworking code to avoid use of IIFEs
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+
+
+
+/*
+
+This is the general dumping ground for trait behavior.
+
+Helpers are auto-attached to primitives that have the matching trait
+
+*/
+
+const helpers = {
+  bind: {
+    make(slots) {
+      if (this.bind == null) {
+        this.bind = {};
+      }
+      if (this.bound == null) {
+        this.bound = [];
+      }
+
+      // Fetch attached objects and bind to them
+      // Attach rebuild watcher for DOM changes to bound nodes
+      for (const slot of Array.from(slots)) {
+        let { callback } = slot;
+        const { to, trait, optional, unique, multiple } = slot;
+
+        if (callback == null) {
+          callback = this.rebuild;
+        }
+        const name = to.split(/\./g).pop();
+        const selector = this._get(to);
+
+        // Find by selector
+        let source = null;
+        if (selector != null) {
+          let start = this;
+          let done = false;
+          while (!done) {
+            // Keep scanning back until a new node is found
+            start = source = this._attach(
+              selector,
+              trait,
+              callback,
+              this,
+              start,
+              optional,
+              multiple
+            );
+            const isUnique =
+              unique && (source == null || this.bound.indexOf(source) < 0);
+            done = multiple || optional || !unique || isUnique;
+          }
+        }
+
+        // Monitor source for reallocation / resize
+        if (source != null) {
+          if (this.resize != null) {
+            this._listen(source, "source.resize", this.resize);
+          }
+          if (callback) {
+            this._listen(source, "source.rebuild", callback);
+          }
+
+          if (multiple) {
+            for (const s of Array.from(source)) {
+              this.bound.push(s);
+            }
+          } else {
+            this.bound.push(source);
+          }
+        }
+
+        this.bind[name] = source;
+      }
+
+      return null;
+    },
+
+    unmake() {
+      if (!this.bind) {
+        return;
+      }
+      delete this.bind;
+      return delete this.bound;
+    },
+  },
+
+  span: {
+    make() {
+      // Look up nearest view to inherit from
+      // Monitor size changes
+      this.spanView = this._inherit("view");
+      return this._listen("view", "view.range", () =>
+        this.trigger({ type: "span.range" })
+      );
+    },
+
+    unmake() {
+      return delete this.spanView;
+    },
+
+    get: (function () {
+      const def = new external_THREE_.Vector2(-1, 1);
+
+      return function (prefix, dimension) {
+        // Return literal range
+        let left;
+        const range = this._get(prefix + "span.range");
+        if (range != null) {
+          return range;
+        }
+
+        // Inherit from view
+        return (left =
+          this.spanView != null ? this.spanView.axis(dimension) : undefined) !=
+          null
+          ? left
+          : def;
+      };
+    })(),
+  },
+
+  scale: {
+    // Divisions to allocate on scale
+    divide(prefix) {
+      const divide = this._get(prefix + "scale.divide");
+      const factor = this._get(prefix + "scale.factor");
+      return Math.round((divide * 2.5) / factor);
+    },
+
+    // Generate ticks on scale
+    generate(prefix, buffer, min, max) {
+      const mode = this._get(prefix + "scale.mode");
+      const divide = this._get(prefix + "scale.divide");
+      const unit = this._get(prefix + "scale.unit");
+      const base = this._get(prefix + "scale.base");
+      const factor = this._get(prefix + "scale.factor");
+      const start = this._get(prefix + "scale.start");
+      const end = this._get(prefix + "scale.end");
+      const zero = this._get(prefix + "scale.zero");
+      const nice = this._get(prefix + "scale.nice");
+
+      const ticks = make(
+        mode,
+        min,
+        max,
+        divide,
+        unit,
+        base,
+        factor,
+        start,
+        end,
+        zero,
+        nice
+      );
+      buffer.copy(ticks);
+      return ticks;
+    },
+  },
+
+  style: {
+    // Return bound style uniforms
+    uniforms() {
+      return {
+        styleColor: this.node.attributes["style.color"],
+        styleOpacity: this.node.attributes["style.opacity"],
+        styleZBias: this.node.attributes["style.zBias"],
+        styleZIndex: this.node.attributes["style.zIndex"],
+      };
+    },
+  },
+
+  arrow: {
+    // Return bound arrow style uniforms
+    uniforms() {
+      const { start } = this.props;
+      const { end } = this.props;
+
+      const space = this._attributes.make(
+        this._types.number(1.25 / (start + end))
+      );
+      const style = this._attributes.make(this._types.vec2(+start, +end));
+      const size = this.node.attributes["arrow.size"];
+
+      return {
+        clipStyle: style,
+        clipRange: size,
+        clipSpace: space,
+
+        arrowSpace: space,
+        arrowSize: size,
+      };
+    },
+  },
+
+  point: {
+    // Return bound point style uniforms
+    uniforms() {
+      return {
+        pointSize: this.node.attributes["point.size"],
+        pointDepth: this.node.attributes["point.depth"],
+      };
+    },
+  },
+
+  line: {
+    // Return bound line style uniforms
+    uniforms() {
+      return {
+        lineWidth: this.node.attributes["line.width"],
+        lineDepth: this.node.attributes["line.depth"],
+        lineProximity: this.node.attributes["line.proximity"],
+      };
+    },
+  },
+
+  surface: {
+    // Return bound surface style uniforms
+    uniforms() {
+      return {};
+    },
+  },
+
+  shade: {
+    pipeline(shader) {
+      if (!this._inherit("fragment")) {
+        return shader;
+      }
+      if (shader == null) {
+        shader = this._shaders.shader();
+      }
+      for (let pass = 0; pass <= 2; pass++) {
+        shader = helpers_guard_(this._inherit("fragment"), (x) =>
+          x.fragment(shader, pass)
+        );
+      }
+      shader.pipe("fragment.map.rgba");
+      return shader;
+    },
+
+    map(shader) {
+      if (!shader) {
+        return shader;
+      }
+      return (shader = this._shaders
+        .shader()
+        .pipe("mesh.map.uvwo")
+        .pipe(shader));
+    },
+  },
+
+  position: {
+    pipeline(shader) {
+      if (!this._inherit("vertex")) {
+        return shader;
+      }
+      if (shader == null) {
+        shader = this._shaders.shader();
+      }
+      for (let pass = 0; pass <= 3; pass++) {
+        shader = helpers_guard_(this._inherit("vertex"), (x) =>
+          x.vertex(shader, pass)
+        );
+      }
+      return shader;
+    },
+
+    swizzle(shader, order) {
+      if (shader) {
+        return this._shaders
+          .shader()
+          .pipe(swizzleVec4(order))
+          .pipe(shader);
+      }
+    },
+
+    swizzle2(shader, order1, order2) {
+      if (shader) {
+        return this._shaders
+          .shader()
+          .split()
+          .pipe(swizzleVec4(order1))
+          .next()
+          .pipe(swizzleVec4(order2))
+          .join()
+          .pipe(shader);
+      }
+    },
+  },
+
+  visible: {
+    make() {
+      const e = { type: "visible.change" };
+
+      let visible = null;
+      this.setVisible = function (vis) {
+        if (vis != null) {
+          visible = vis;
+        }
+        return onVisible();
+      };
+
+      const onVisible = () => {
+        let left;
+        const last = this.isVisible;
+        let self =
+          (left = visible != null ? visible : this._get("object.visible")) !=
+          null
+            ? left
+            : true;
+        if (visibleParent != null) {
+          if (self) {
+            self = visibleParent.isVisible;
+          }
+        }
+        this.isVisible = self;
+        if (last !== this.isVisible) {
+          return this.trigger(e);
+        }
+      };
+
+      const visibleParent = this._inherit("visible");
+      if (visibleParent) {
+        this._listen(visibleParent, "visible.change", onVisible);
+      }
+      if (this.is("object")) {
+        this._listen(this.node, "change:object", onVisible);
+      }
+
+      return onVisible();
+    },
+
+    unmake() {
+      return delete this.isVisible;
+    },
+  },
+
+  active: {
+    make() {
+      const e = { type: "active.change" };
+
+      let active = null;
+      this.setActive = function (act) {
+        if (act != null) {
+          active = act;
+        }
+        return onActive();
+      };
+
+      const onActive = () => {
+        let left;
+        const last = this.isActive;
+        let self =
+          (left = active != null ? active : this._get("entity.active")) != null
+            ? left
+            : true;
+        if (activeParent != null) {
+          if (self) {
+            self = activeParent.isActive;
+          }
+        }
+        this.isActive = self;
+        if (last !== this.isActive) {
+          return this.trigger(e);
+        }
+      };
+
+      const activeParent = this._inherit("active");
+      if (activeParent) {
+        this._listen(activeParent, "active.change", onActive);
+      }
+      if (this.is("entity")) {
+        this._listen(this.node, "change:entity", onActive);
+      }
+
+      return onActive();
+    },
+
+    unmake() {
+      return delete this.isActive;
+    },
+  },
+
+  object: {
+    // Generic 3D renderable wrapper, handles the fiddly Three.js bits that require a 'style recalculation'.
+    //
+    // Pass renderables to nearest root for rendering
+    // Track visibility from parent and notify children
+    // Track blends / transparency for three.js materials
+    make(objects) {
+      // Aggregate rendered three objects for reference
+      let blending, zOrder;
+      if (objects == null) {
+        objects = [];
+      }
+      this.objects = objects;
+      this.renders = this.objects.reduce((a, b) => a.concat(b.renders), []);
+
+      const objectScene = this._inherit("scene");
+
+      let opacity = (blending = zOrder = null);
+
+      const hasStyle = Array.from(this.traits).includes("style");
+      opacity = 1;
+      blending = external_THREE_.NormalBlending;
+      let zWrite = true;
+      let zTest = true;
+
+      if (hasStyle) {
+        ({ opacity } = this.props);
+        ({ blending } = this.props);
+        ({ zOrder } = this.props);
+        ({ zWrite } = this.props);
+        ({ zTest } = this.props);
+      }
+
+      const onChange = (event) => {
+        const { changed } = event;
+        let refresh = null;
+        if (changed["style.opacity"]) {
+          refresh = opacity = this.props.opacity;
+        }
+        if (changed["style.blending"]) {
+          refresh = blending = this.props.blending;
+        }
+        if (changed["style.zOrder"]) {
+          refresh = zOrder = this.props.zOrder;
+        }
+        if (changed["style.zWrite"]) {
+          refresh = zWrite = this.props.zWrite;
+        }
+        if (changed["style.zTest"]) {
+          refresh = zTest = this.props.zTest;
+        }
+        if (refresh != null) {
+          return onVisible();
+        }
+      };
+
+      const onVisible = () => {
+        const order = zOrder != null ? -zOrder : this.node.order;
+
+        const visible =
+          (this.isVisible != null ? this.isVisible : true) && opacity > 0;
+
+        if (visible) {
+          if (hasStyle) {
+            return (() => {
+              const result = [];
+              for (const o of Array.from(this.objects)) {
+                o.show(opacity < 1, blending, order);
+                result.push(o.depth(zWrite, zTest));
+              }
+              return result;
+            })();
+          } else {
+            return (() => {
+              const result1 = [];
+              for (const o of Array.from(this.objects)) {
+                result1.push(o.show(true, blending, order));
+              }
+              return result1;
+            })();
+          }
+        } else {
+          return (() => {
+            const result2 = [];
+            for (const o of Array.from(this.objects)) {
+              result2.push(o.hide());
+            }
+            return result2;
+          })();
+        }
+      };
+
+      this._listen(this.node, "change:style", onChange);
+      this._listen(this.node, "reindex", onVisible);
+      this._listen(this, "visible.change", onVisible);
+
+      for (const object of Array.from(this.objects)) {
+        objectScene.adopt(object);
+      }
+      return onVisible();
+    },
+
+    unmake(dispose) {
+      let object;
+      if (dispose == null) {
+        dispose = true;
+      }
+      if (!this.objects) {
+        return;
+      }
+
+      const objectScene = this._inherit("scene");
+      for (object of Array.from(this.objects)) {
+        objectScene.unadopt(object);
+      }
+      if (dispose) {
+        return (() => {
+          const result = [];
+          for (object of Array.from(this.objects)) {
+            result.push(object.dispose());
+          }
+          return result;
+        })();
+      }
+    },
+
+    mask() {
+      let mask, shader;
+      if (!(mask = this._inherit("mask"))) {
+        return;
+      }
+      return (shader = mask.mask(shader));
+    },
+  },
+
+  unit: {
+    make() {
+      let focusDepth,
+        pixelRatio,
+        pixelUnit,
+        renderAspect,
+        renderHeight,
+        renderOdd,
+        renderScale,
+        renderScaleInv,
+        renderWidth,
+        viewHeight,
+        viewWidth,
+        worldUnit;
+      let π = Math.PI;
+
+      this.unitUniforms = {
+        renderScaleInv: (renderScaleInv = this._attributes.make(
+          this._types.number(1)
+        )),
+        renderScale: (renderScale = this._attributes.make(
+          this._types.number(1)
+        )),
+        renderAspect: (renderAspect = this._attributes.make(
+          this._types.number(1)
+        )),
+        renderWidth: (renderWidth = this._attributes.make(
+          this._types.number(0)
+        )),
+        renderHeight: (renderHeight = this._attributes.make(
+          this._types.number(0)
+        )),
+        viewWidth: (viewWidth = this._attributes.make(this._types.number(0))),
+        viewHeight: (viewHeight = this._attributes.make(this._types.number(0))),
+        pixelRatio: (pixelRatio = this._attributes.make(this._types.number(1))),
+        pixelUnit: (pixelUnit = this._attributes.make(this._types.number(1))),
+        worldUnit: (worldUnit = this._attributes.make(this._types.number(1))),
+        focusDepth: (focusDepth = this._attributes.make(this._types.number(1))),
+        renderOdd: (renderOdd = this._attributes.make(this._types.vec2())),
+      };
+
+      const top = new external_THREE_.Vector3();
+      const bottom = new external_THREE_.Vector3();
+
+      const handler = () => {
+        let camera, size;
+        if ((size = root != null ? root.getSize() : undefined) == null) {
+          return;
+        }
+
+        π = Math.PI;
+
+        const { scale } = this.props;
+        const { fov } = this.props;
+        const focus =
+          this.props.focus != null
+            ? this.props.focus
+            : this.inherit("unit").props.focus;
+
+        const isAbsolute = scale === null;
+
+        // Measure live FOV to be able to accurately predict anti-aliasing in
+        // perspective
+        let measure = 1;
+        if ((camera = root != null ? root.getCamera() : undefined)) {
+          const m = camera.projectionMatrix;
+
+          // Measure top to bottom
+          top.set(0, -0.5, 1).applyMatrix4(m);
+          bottom.set(0, 0.5, 1).applyMatrix4(m);
+          top.sub(bottom);
+          measure = top.y;
+        }
+
+        // Calculate device pixel ratio
+        const dpr = size.renderHeight / size.viewHeight;
+
+        // Calculate correction for fixed on-screen size regardless of FOV
+        const fovtan = fov != null ? measure * Math.tan((fov * π) / 360) : 1;
+
+        // Calculate device pixels per virtual pixel
+        const pixel = isAbsolute ? dpr : (size.renderHeight / scale) * fovtan;
+
+        // Calculate device pixels per world unit
+        const rscale = (size.renderHeight * measure) / 2;
+
+        // Calculate world units per virtual pixel
+        const world = pixel / rscale;
+
+        viewWidth.value = size.viewWidth;
+        viewHeight.value = size.viewHeight;
+        renderWidth.value = size.renderWidth;
+        renderHeight.value = size.renderHeight;
+        renderAspect.value = size.aspect;
+        renderScale.value = rscale;
+        renderScaleInv.value = 1 / rscale;
+        pixelRatio.value = dpr;
+        pixelUnit.value = pixel;
+        worldUnit.value = world;
+        focusDepth.value = focus;
+
+        return renderOdd.value
+          .set(size.renderWidth % 2, size.renderHeight % 2)
+          .multiplyScalar(0.5);
+      };
+
+      //console.log 'worldUnit', world, pixel, rscale, isAbsolute
+
+      const root = this.is("root") ? this : this._inherit("root");
+      //@_listen root, 'root.resize', handler
+      //@_listen root, 'root.camera', handler
+      //@_listen @node, 'change:unit', handler
+      this._listen(root, "root.update", handler);
+
+      return handler();
+    },
+
+    unmake() {
+      return delete this.unitUniforms;
+    },
+
+    get() {
+      const u = {};
+      for (const k in this.unitUniforms) {
+        const v = this.unitUniforms[k];
+        u[k] = v.value;
+      }
+      return u;
+    },
+
+    uniforms() {
+      return this.unitUniforms;
+    },
+  },
+};
+
+const Helpers = function (object, traits) {
+  const h = {};
+  for (const trait of Array.from(traits)) {
+    let methods;
+    if (!(methods = helpers[trait])) {
+      continue;
+    }
+
+    h[trait] = {};
+    for (const key in methods) {
+      const method = methods[key];
+      h[trait][key] = method.bind(object);
+    }
+  }
+  return h;
+};
+
+function helpers_guard_(value, transform) {
+  return typeof value !== "undefined" && value !== null
+    ? transform(value)
+    : undefined;
+}
+
+;// CONCATENATED MODULE: ./src/primitives/types/index.js
+
+
+
+
+
+;// CONCATENATED MODULE: ./src/primitives/factory.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+class PrimitiveFactory {
+  constructor(definitions, context) {
+    this.context = context;
+    this.classes = definitions.Classes;
+    this.helpers = definitions.Helpers;
+  }
+
+  getTypes() {
+    return Object.keys(this.classes);
+  }
+
+  make(type, options, binds = null) {
+    if (options == null) {
+      options = {};
+    }
+
+    const klass = this.classes[type];
+
+    if (klass == null) {
+      throw new Error(`Unknown primitive class \`${type}\``);
+    }
+
+    const node = new klass.model(
+      type,
+      klass.defaults,
+      options,
+      binds,
+      klass,
+      this.context.attributes
+    );
+
+    // NOTE: keep for side effects.
+    new klass(node, this.context, this.helpers);
+    return node;
+  }
+}
+
+;// CONCATENATED MODULE: ./src/primitives/index.js
+
+
+
+
+const primitives_Types = primitives_types_namespaceObject;
+
+;// CONCATENATED MODULE: ./src/render/renderable.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+class Renderable {
+  constructor(renderer, shaders) {
+    this.renderer = renderer;
+    this.shaders = shaders;
+    this.gl = this.renderer.getContext();
+    if (this.uniforms == null) {
+      this.uniforms = {};
+    }
+  }
+
+  dispose() {
+    this.uniforms = null;
+  }
+
+  _adopt(uniforms) {
+    for (const key in uniforms) {
+      const value = uniforms[key];
+      this.uniforms[key] = value;
+    }
+  }
+
+  _set(uniforms) {
+    for (const key in uniforms) {
+      const value = uniforms[key];
+      if (this.uniforms[key] != null) {
+        this.uniforms[key].value = value;
+      }
+    }
+  }
+}
+
+;// CONCATENATED MODULE: ./src/render/scene.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS202: Simplify dynamic range loops
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+
+
+
+/*
+ All MathBox renderables sit inside this root, to keep things tidy.
+*/
+class MathBox extends external_THREE_.Object3D {
+  constructor() {
+    super();
+    this.rotationAutoUpdate = false;
+    this.frustumCulled = false;
+    this.matrixAutoUpdate = false;
+  }
+}
+
+/*
+ Holds the root and binds to a THREE.Scene
+
+ Will hold objects and inject them a few at a time
+ to avoid long UI blocks.
+
+ Will render injected objects to a 1x1 scratch buffer to ensure availability
+*/
+class Scene extends Renderable {
+  constructor(renderer, shaders, options) {
+    super(renderer, shaders, options);
+    this.root = new MathBox();
+
+    if ((options != null ? options.scene : undefined) != null) {
+      this.scene = options.scene;
+    }
+    if (this.scene == null) {
+      this.scene = new external_THREE_.Scene();
+    }
+
+    this.pending = [];
+    this.async = 0;
+
+    this.scratch = new external_THREE_.WebGLRenderTarget(1, 1);
+    this.camera = new external_THREE_.PerspectiveCamera();
+  }
+
+  inject(scene) {
+    if (scene != null) {
+      this.scene = scene;
+    }
+    return this.scene.add(this.root);
+  }
+
+  unject() {
+    return this.scene != null ? this.scene.remove(this.root) : undefined;
+  }
+
+  add(object) {
+    if (this.async) {
+      return this.pending.push(object);
+    } else {
+      return this._add(object);
+    }
+  }
+
+  remove(object) {
+    this.pending = this.pending.filter((o) => o !== object);
+    if (object.parent != null) {
+      return this._remove(object);
+    }
+  }
+
+  _add(object) {
+    return this.root.add(object);
+  }
+
+  _remove(object) {
+    return this.root.remove(object);
+  }
+
+  dispose() {
+    if (this.root.parent != null) {
+      return this.unject();
+    }
+  }
+
+  warmup(n) {
+    return (this.async = +n || 0);
+  }
+
+  render() {
+    if (!this.pending.length) {
+      return;
+    }
+    const { children } = this.root;
+
+    // Insert up to @async children
+    const added = [];
+    for (
+      let i = 0, end = this.async, asc = 0 <= end;
+      asc ? i < end : i > end;
+      asc ? i++ : i--
+    ) {
+      const pending = this.pending.shift();
+      if (!pending) {
+        break;
+      }
+
+      // Insert new child
+      this._add(pending);
+      added.push(added);
+    }
+
+    // Remember current visibility
+    const visible = children.map(function (o) {
+      return o.visible;
+    });
+
+    // Force only this child visible
+    children.map((o) => (o.visible = !Array.from(added).includes(o)));
+
+    // Render and throw away
+    const currentTarget = this.renderer.getRenderTarget();
+    this.renderer.setRenderTarget(this.scratch);
+    this.renderer.render(this.scene, this.camera);
+    this.renderer.setRenderTarget(currentTarget);
+
+    // Restore visibility
+    return children.map((o, i) => (o.visible = visible[i]));
+  }
+
+  toJSON() {
+    return this.root.toJSON();
+  }
+}
+
+;// CONCATENATED MODULE: ./src/render/factory.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+class RenderFactory {
+  constructor(classes, renderer, shaders) {
+    this.classes = classes;
+    this.renderer = renderer;
+    this.shaders = shaders;
+  }
+
+  getTypes() {
+    return Object.keys(this.classes);
+  }
+
+  make(type, options) {
+    return new this.classes[type](this.renderer, this.shaders, options);
+  }
+}
+
+;// CONCATENATED MODULE: ./src/render/buffer/buffer.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+/*
+ * Base class for sample buffers
+ */
+class buffer_Buffer extends Renderable {
+  constructor(renderer, shaders, options) {
+    super(renderer, shaders);
+
+    if (this.items == null) {
+      this.items = options.items || 1;
+    }
+    if (this.samples == null) {
+      this.samples = options.samples || 1;
+    }
+    if (this.channels == null) {
+      this.channels = options.channels || 4;
+    }
+    if (this.callback == null) {
+      this.callback = options.callback || function () {};
+    }
+  }
+
+  dispose() {
+    return super.dispose();
+  }
+
+  update() {
+    const n = this.fill();
+    this.write(n);
+    return n;
+  }
+
+  setActive(_i, _j, _k, _l) {}
+
+  setCallback(callback) {
+    this.callback = callback;
+  }
+
+  write() {}
+  fill() {}
+  generate(data) {
+    return getStreamer(data, this.samples, this.channels, this.items);
+  }
+}
+
+;// CONCATENATED MODULE: ./src/render/buffer/texture/datatexture.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+
+
+
+/*
+Manually allocated GL texture for data streaming.
+
+Allows partial updates via subImage.
+*/
+class DataTexture {
+  constructor(renderer, width, height, channels, options) {
+    this.renderer = renderer;
+    this.width = width;
+    this.height = height;
+    this.channels = channels;
+    this.n = this.width * this.height * this.channels;
+
+    const gl = this.renderer.getContext();
+    this.gl = gl;
+    const minFilter =
+      (options != null ? options.minFilter : undefined) != null
+        ? options != null
+          ? options.minFilter
+          : undefined
+        : external_THREE_.NearestFilter;
+    const magFilter =
+      (options != null ? options.magFilter : undefined) != null
+        ? options != null
+          ? options.magFilter
+          : undefined
+        : external_THREE_.NearestFilter;
+    const type =
+      (options != null ? options.type : undefined) != null
+        ? options != null
+          ? options.type
+          : undefined
+        : external_THREE_.FloatType;
+
+    this.minFilter = paramToGL(gl, minFilter);
+    this.magFilter = paramToGL(gl, magFilter);
+    this.type = paramToGL(gl, type);
+    this.ctor = paramToArrayStorage(type);
+
+    this.build(options);
+  }
+
+  build(options) {
+    const { gl } = this;
+    const state = this.renderer.state;
+
+    // Make GL texture
+    this.texture = gl.createTexture();
+    this.format = [null, gl.LUMINANCE, gl.LUMINANCE_ALPHA, gl.RGB, gl.RGBA][
+      this.channels
+    ];
+    this.format3 = [
+      null,
+      external_THREE_.LuminanceFormat,
+      external_THREE_.LuminanceAlphaFormat,
+      external_THREE_.RGBFormat,
+      external_THREE_.RGBAFormat,
+    ][this.channels];
+
+    state.bindTexture(gl.TEXTURE_2D, this.texture);
+
+    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
+    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
+    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, this.minFilter);
+    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, this.magFilter);
+
+    // Attach empty data
+    this.data = new this.ctor(this.n);
+    gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);
+    gl.texImage2D(
+      gl.TEXTURE_2D,
+      0,
+      this.format,
+      this.width,
+      this.height,
+      0,
+      this.format,
+      this.type,
+      this.data
+    );
+
+    // Make wrapper texture object.
+    this.textureObject = new external_THREE_.Texture(
+      new Image(),
+      external_THREE_.UVMapping,
+      external_THREE_.ClampToEdgeWrapping,
+      external_THREE_.ClampToEdgeWrapping,
+      options != null ? options.minFilter : undefined,
+      options != null ? options.magFilter : undefined
+    );
+
+    // Pre-init texture to trick WebGLRenderer
+    this.textureProperties = this.renderer.properties.get(this.textureObject);
+    this.textureProperties.__webglInit = true;
+    this.textureProperties.__webglTexture = this.texture;
+
+    this.textureObject.format = this.format3;
+    this.textureObject.type = external_THREE_.FloatType;
+    this.textureObject.unpackAlignment = 1;
+    this.textureObject.flipY = false;
+    this.textureObject.generateMipmaps = false;
+
+    // Create uniforms
+    this.uniforms = {
+      dataResolution: {
+        type: "v2",
+        value: new external_THREE_.Vector2(1 / this.width, 1 / this.height),
+      },
+      dataTexture: {
+        type: "t",
+        value: this.textureObject,
+      },
+    };
+  }
+
+  write(data, x, y, w, h) {
+    const { gl } = this;
+    const state = this.renderer.state;
+
+    // Write to rectangle
+    state.bindTexture(gl.TEXTURE_2D, this.texture);
+    gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);
+    gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);
+    gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);
+    return gl.texSubImage2D(
+      gl.TEXTURE_2D,
+      0,
+      x,
+      y,
+      w,
+      h,
+      this.format,
+      this.type,
+      data
+    );
+  }
+
+  dispose() {
+    this.gl.deleteTexture(this.texture);
+
+    this.textureProperties.__webglInit = false;
+    this.textureProperties.__webglTexture = null;
+    this.textureProperties = null;
+    return (this.textureObject = this.texture = null);
+  }
+}
+
+;// CONCATENATED MODULE: ./src/render/buffer/databuffer.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS202: Simplify dynamic range loops
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+
+
+
+
+/*
+ * Data buffer on the GPU
+ * - Stores samples (1-n) x items (1-n) x channels (1-4)
+ * - Provides generic sampler shader
+ * - Provides generic copy/write handler
+ * => specialized into Array/Matrix/VoxelBuffer
+ */
+class DataBuffer extends buffer_Buffer {
+  constructor(renderer, shaders, options, build) {
+    if (build == null) {
+      build = true;
+    }
+    const width = options.width || 1;
+    const height = options.height || 1;
+    const depth = options.depth || 1;
+    const samples = width * height * depth;
+
+    if (!options.samples) {
+      options.samples = samples;
+    }
+
+    super(renderer, shaders, options);
+
+    this.width = width;
+    this.height = height;
+    this.depth = depth;
+    if (this.samples == null) {
+      this.samples = samples;
+    }
+
+    if (build) {
+      this.build(options);
+    }
+  }
+
+  shader(shader, indices) {
+    if (indices == null) {
+      indices = 4;
+    }
+    if (this.items > 1 || this.depth > 1) {
+      if (indices !== 4) {
+        shader.pipe(extendVec(indices, 4));
+      }
+      shader.pipe("map.xyzw.texture", this.uniforms);
+    } else {
+      if (indices !== 2) {
+        shader.pipe(truncateVec(indices, 2));
+      }
+    }
+
+    const wrap = this.wrap ? ".wrap" : "";
+    shader.pipe(`map.2d.data${wrap}`, this.uniforms);
+    shader.pipe("sample.2d", this.uniforms);
+    if (this.channels < 4) {
+      shader.pipe(
+        swizzleVec4(["0000", "x000", "xw00", "xyz0"][this.channels])
+      );
+    }
+    return shader;
+  }
+
+  build(options) {
+    this.data = new Float32Array(this.samples * this.channels * this.items);
+    this.texture = new DataTexture(
+      this.renderer,
+      this.items * this.width,
+      this.height * this.depth,
+      this.channels,
+      options
+    );
+    this.filled = 0;
+    this.used = 0;
+
+    this._adopt(this.texture.uniforms);
+    this._adopt({
+      dataPointer: { type: "v2", value: new external_THREE_.Vector2() },
+      textureItems: { type: "f", value: this.items },
+      textureHeight: { type: "f", value: this.height },
+    });
+
+    this.dataPointer = this.uniforms.dataPointer.value;
+    this.streamer = this.generate(this.data);
+  }
+
+  dispose() {
+    this.data = null;
+    this.texture.dispose();
+    return super.dispose();
+  }
+
+  getFilled() {
+    return this.filled;
+  }
+  setCallback(callback) {
+    this.callback = callback;
+    return (this.filled = 0);
+  }
+
+  copy(data) {
+    const n = Math.min(data.length, this.samples * this.channels * this.items);
+    const d = this.data;
+    for (
+      let i = 0, end = n, asc = 0 <= end;
+      asc ? i < end : i > end;
+      asc ? i++ : i--
+    ) {
+      d[i] = data[i];
+    }
+    this.write(Math.ceil(n / this.channels / this.items));
+  }
+
+  write(n) {
+    if (n == null) {
+      n = this.samples;
+    }
+    let height = n / this.width;
+    n *= this.items;
+    const width = height < 1 ? n : this.items * this.width;
+    height = Math.ceil(height);
+
+    this.texture.write(this.data, 0, 0, width, height);
+    this.dataPointer.set(0.5, 0.5);
+
+    this.filled = 1;
+    this.used = n;
+  }
+
+  through(callback, target) {
+    let dst, src;
+    const { consume, done } = (src = this.streamer);
+    const { emit } = (dst = target.streamer);
+
+    let i = 0;
+
+    let pipe = () => consume((x, y, z, w) => callback(emit, x, y, z, w, i));
+    pipe = repeatCall(pipe, this.items);
+
+    return () => {
+      src.reset();
+      dst.reset();
+      const limit = this.used;
+      i = 0;
+      while (!done() && i < limit) {
+        pipe();
+        i++;
+      }
+
+      return src.count();
+    };
+  }
+}
+
+;// CONCATENATED MODULE: ./src/render/buffer/arraybuffer.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+/*
+ * 1D + history array
+ */
+class ArrayBuffer_ extends DataBuffer {
+  constructor(renderer, shaders, options) {
+    const width = options.width || 1;
+    const history = options.history || 1;
+
+    options.width = width;
+    options.height = history;
+    options.depth = 1;
+
+    super(renderer, shaders, options, false);
+
+    this.width = width;
+    this.history = history;
+    this.samples = width;
+    this.wrap = history > 1;
+
+    this.build(options);
+  }
+
+  build(_options) {
+    super.build();
+
+    this.index = 0;
+    this.pad = 0;
+    return (this.streamer = this.generate(this.data));
+  }
+
+  setActive(i) {
+    return (this.pad = Math.max(0, this.width - i));
+  }
+
+  fill() {
+    const { callback } = this;
+    if (typeof callback.reset === "function") {
+      callback.reset();
+    }
+
+    const { emit, count, done, reset } = this.streamer;
+    reset();
+
+    const limit = this.samples - this.pad;
+
+    let i = 0;
+    while (!done() && i < limit && callback(emit, i++) !== false) {
+      true;
+    }
+
+    return Math.floor(count() / this.items);
+  }
+
+  write(n) {
+    if (n == null) {
+      n = this.samples;
+    }
+    n *= this.items;
+    this.texture.write(this.data, 0, this.index, n, 1);
+    this.dataPointer.set(0.5, this.index + 0.5);
+    this.index = (this.index + this.history - 1) % this.history;
+    return (this.filled = Math.min(this.history, this.filled + 1));
+  }
+
+  through(callback, target) {
+    let dst, src;
+    const { consume, done } = (src = this.streamer);
+    const { emit } = (dst = target.streamer);
+
+    let i = 0;
+
+    let pipe = () => consume((x, y, z, w) => callback(emit, x, y, z, w, i));
+    pipe = repeatCall(pipe, this.items);
+
+    return () => {
+      src.reset();
+      dst.reset();
+      const limit = this.samples - this.pad;
+      i = 0;
+      while (!done() && i < limit) {
+        pipe();
+        i++;
+      }
+
+      return src.count();
+    };
+  }
+}
+
+;// CONCATENATED MODULE: ./src/render/geometry/geometry.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS202: Simplify dynamic range loops
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+class Geometry extends external_THREE_.BufferGeometry {
+  constructor() {
+    super();
+    new external_THREE_.BufferGeometry(this);
+    if (this.uniforms == null) {
+      this.uniforms = {};
+    }
+    if (this.groups == null) {
+      this.groups = [];
+    }
+  }
+
+  _reduce(dims, maxs) {
+    let multiple = false;
+    for (let i = 0; i < dims.length; i++) {
+      const dim = dims[i];
+      const max = maxs[i];
+      if (multiple) {
+        dims[i] = max;
+      }
+      if (dim > 1) {
+        multiple = true;
+      }
+    }
+
+    return dims.reduce((a, b) => a * b);
+  }
+
+  _emitter(name) {
+    const attribute =
+      name == "index" ? this.getIndex() : this.getAttribute(name);
+    const dimensions = attribute.itemSize;
+    const { array } = attribute;
+
+    let offset = 0;
+    const one = function (a) {
+      array[offset++] = a;
+    };
+    const two = function (a, b) {
+      array[offset++] = a;
+      array[offset++] = b;
+    };
+    const three = function (a, b, c) {
+      array[offset++] = a;
+      array[offset++] = b;
+      array[offset++] = c;
+    };
+    const four = function (a, b, c, d) {
+      array[offset++] = a;
+      array[offset++] = b;
+      array[offset++] = c;
+      array[offset++] = d;
+    };
+
+    return [null, one, two, three, four][dimensions];
+  }
+
+  _finalize() {
+    return;
+  }
+
+  _offsets(offsets) {
+    this.groups = offsets;
+  }
+}
+
+;// CONCATENATED MODULE: ./src/render/geometry/clipgeometry.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+// Instanced geometry that is clippable along 4 dimensions
+class ClipGeometry extends Geometry {
+  _clipUniforms() {
+    this.geometryClip = new external_THREE_.Vector4(1e10, 1e10, 1e10, 1e10);
+    this.geometryResolution = new external_THREE_.Vector4();
+    this.mapSize = new external_THREE_.Vector4();
+
+    if (this.uniforms == null) {
+      this.uniforms = {};
+    }
+    this.uniforms.geometryClip = {
+      type: "v4",
+      value: this.geometryClip,
+    };
+    this.uniforms.geometryResolution = {
+      type: "v4",
+      value: this.geometryResolution,
+    };
+    return (this.uniforms.mapSize = {
+      type: "v4",
+      value: this.mapSize,
+    });
+  }
+
+  _clipGeometry(width, height, depth, items) {
+    const c = (x) => Math.max(0, x - 1);
+    const r = (x) => 1 / Math.max(1, x - 1);
+
+    this.geometryClip.set(c(width), c(height), c(depth), c(items));
+    return this.geometryResolution.set(r(width), r(height), r(depth), r(items));
+  }
+
+  _clipMap(mapWidth, mapHeight, mapDepth, mapItems) {
+    return this.mapSize.set(mapWidth, mapHeight, mapDepth, mapItems);
+  }
+
+  _clipOffsets(
+    factor,
+    width,
+    height,
+    depth,
+    items,
+    _width,
+    _height,
+    _depth,
+    _items
+  ) {
+    const dims = [depth, height, width, items];
+    const maxs = [_depth, _height, _width, _items];
+    const elements = this._reduce(dims, maxs);
+
+    return this._offsets([
+      {
+        start: 0,
+        count: elements * factor,
+        materialIndex: 0,
+      },
+    ]);
+  }
+}
+
+;// CONCATENATED MODULE: ./src/render/geometry/arrowgeometry.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS202: Simplify dynamic range loops
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+/*
+Cones to attach as arrowheads on line strips
+
+.....> .....> .....> .....>
+
+.....> .....> .....> .....>
+
+.....> .....> .....> .....>
+*/
+
+class ArrowGeometry extends ClipGeometry {
+  constructor(options) {
+    let anchor, flip, k, layers, ribbons, samples, sides, strips;
+    let asc, end;
+    super(options);
+
+    this._clipUniforms();
+
+    this.sides = sides = +options.sides || 12;
+    this.samples = samples = +options.samples || 2;
+    this.strips = strips = +options.strips || 1;
+    this.ribbons = ribbons = +options.ribbons || 1;
+    this.layers = layers = +options.layers || 1;
+    this.flip = flip = options.flip != null ? options.flip : false;
+    this.anchor = anchor =
+      options.anchor != null ? options.anchor : flip ? 0 : samples - 1;
+
+    const arrows = strips * ribbons * layers;
+    const points = (sides + 2) * arrows;
+    const triangles = sides * 2 * arrows;
+
+    this.setIndex(new external_THREE_.BufferAttribute(new Uint32Array(triangles * 3), 1));
+
+    this.setAttribute(
+      "position4",
+      new external_THREE_.BufferAttribute(new Float32Array(points * 4), 4)
+    );
+    this.setAttribute(
+      "arrow",
+      new external_THREE_.BufferAttribute(new Float32Array(points * 3), 3)
+    );
+    this.setAttribute(
+      "attach",
+      new external_THREE_.BufferAttribute(new Float32Array(points * 2), 2)
+    );
+
+    const index = this._emitter("index");
+    const position = this._emitter("position4");
+    const arrow = this._emitter("arrow");
+    const attach = this._emitter("attach");
+
+    const circle = [];
+    for (
+      k = 0, end = sides, asc = 0 <= end;
+      asc ? k < end : k > end;
+      asc ? k++ : k--
+    ) {
+      const angle = (k / sides) * 2 * Math.PI;
+      circle.push([Math.cos(angle), Math.sin(angle), 1]);
+    }
+
+    let base = 0;
+    for (
+      let i = 0, end1 = arrows, asc1 = 0 <= end1;
+      asc1 ? i < end1 : i > end1;
+      asc1 ? i++ : i--
+    ) {
+      let asc2, end2;
+      const tip = base++;
+      const back = tip + sides + 1;
+
+      for (
+        k = 0, end2 = sides, asc2 = 0 <= end2;
+        asc2 ? k < end2 : k > end2;
+        asc2 ? k++ : k--
+      ) {
+        const a = base + (k % sides);
+        const b = base + ((k + 1) % sides);
+
+        index(tip);
+        index(a);
+        index(b);
+
+        index(b);
+        index(a);
+        index(back);
+      }
+
+      base += sides + 1;
+    }
+
+    const step = flip ? 1 : -1;
+    const far = flip ? samples - 1 : 0;
+    const near = anchor + step;
+    const x = anchor;
+
+    for (
+      let l = 0, end3 = layers, asc3 = 0 <= end3;
+      asc3 ? l < end3 : l > end3;
+      asc3 ? l++ : l--
+    ) {
+      for (
+        let z = 0, end4 = ribbons, asc4 = 0 <= end4;
+        asc4 ? z < end4 : z > end4;
+        asc4 ? z++ : z--
+      ) {
+        for (
+          let y = 0, end5 = strips, asc5 = 0 <= end5;
+          asc5 ? y < end5 : y > end5;
+          asc5 ? y++ : y--
+        ) {
+          let asc6, end6;
+          position(x, y, z, l);
+          arrow(0, 0, 0);
+          attach(near, far);
+
+          for (
+            k = 0, end6 = sides, asc6 = 0 <= end6;
+            asc6 ? k < end6 : k > end6;
+            asc6 ? k++ : k--
+          ) {
+            position(x, y, z, l);
+
+            const c = circle[k];
+            arrow(c[0], c[1], c[2]);
+            attach(near, far);
+          }
+
+          position(x, y, z, l);
+          arrow(0, 0, 1);
+          attach(near, far);
+        }
+      }
+    }
+
+    this._finalize();
+    this.clip();
+  }
+
+  clip(samples, strips, ribbons, layers) {
+    let quads;
+    if (samples == null) {
+      ({ samples } = this);
+    }
+    if (strips == null) {
+      ({ strips } = this);
+    }
+    if (ribbons == null) {
+      ({ ribbons } = this);
+    }
+    if (layers == null) {
+      ({ layers } = this);
+    }
+
+    this._clipGeometry(samples, strips, ribbons, layers);
+
+    if (samples > this.anchor) {
+      const dims = [layers, ribbons, strips];
+      const maxs = [this.layers, this.ribbons, this.strips];
+      quads = this.sides * this._reduce(dims, maxs);
+    } else {
+      quads = 0;
+    }
+
+    return this._offsets([
+      {
+        start: 0,
+        count: quads * 6,
+        materialIndex: 0,
+      },
+    ]);
+  }
+}
+
+;// CONCATENATED MODULE: ./src/render/meshes/base.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+
+
+class Base extends Renderable {
+  constructor(renderer, shaders, options) {
+    super(renderer, shaders, options);
+    this.zUnits = options.zUnits != null ? options.zUnits : 0;
+  }
+
+  raw() {
+    for (const object of Array.from(this.renders)) {
+      this._raw(object);
+    }
+    return null;
+  }
+
+  depth(write, test) {
+    for (const object of Array.from(this.renders)) {
+      this._depth(object, write, test);
+    }
+    return null;
+  }
+
+  polygonOffset(factor, units) {
+    for (const object of Array.from(this.renders)) {
+      this._polygonOffset(object, factor, units);
+    }
+    return null;
+  }
+
+  show(transparent, blending, order) {
+    return Array.from(this.renders).map((object) =>
+      this._show(object, transparent, blending, order)
+    );
+  }
+
+  hide() {
+    for (const object of Array.from(this.renders)) {
+      this._hide(object);
+    }
+    return null;
+  }
+
+  _material(options) {
+    const precision = this.renderer.capabilities.precision;
+
+    const vertexPrefix = `\
+    precision ${precision} float;
+    precision ${precision} int;
+uniform mat4 modelMatrix;
+uniform mat4 modelViewMatrix;
+uniform mat4 projectionMatrix;
+uniform mat4 viewMatrix;
+uniform mat3 normalMatrix;
+uniform vec3 cameraPosition;\
+`;
+
+    const fragmentPrefix = `\
+    precision ${precision} float;
+    precision ${precision} int;
+uniform mat4 viewMatrix;
+uniform vec3 cameraPosition;\
+`;
+
+    const shaderOptions = {};
+    Object.assign(shaderOptions, options);
+    delete shaderOptions.attributes;
+    delete shaderOptions.varyings;
+    delete shaderOptions.inspect;
+    delete shaderOptions.vertexGraph;
+    delete shaderOptions.fragmentGraph;
+
+    const material = new external_THREE_.RawShaderMaterial(shaderOptions);
+
+    ["vertexGraph", "fragmentGraph", "inspect"].forEach(
+      (key) => (material[key] = options[key])
+    );
+
+    material.vertexShader = [vertexPrefix, material.vertexShader].join("\n");
+    material.fragmentShader = [fragmentPrefix, material.fragmentShader].join(
+      "\n"
+    );
+    return material;
+  }
+
+  _raw(object) {
+    object.rotationAutoUpdate = false;
+    object.frustumCulled = false;
+    object.matrixAutoUpdate = false;
+    object.material.defaultAttributeValues = undefined;
+  }
+
+  _depth(object, write, test) {
+    const m = object.material;
+    m.depthWrite = write;
+    return (m.depthTest = test);
+  }
+
+  _polygonOffset(object, factor, units) {
+    units -= this.zUnits;
+    const enabled = units !== 0;
+
+    const m = object.material;
+
+    m.polygonOffset = enabled;
+    if (enabled) {
+      m.polygonOffsetFactor = factor;
+      return (m.polygonOffsetUnits = units);
+    }
+  }
+
+  _show(object, transparent, blending, order) {
+    // Force transparent to true to ensure all renderables drawn in order
+    transparent = true;
+
+    const m = object.material;
+
+    object.renderOrder = -order;
+    object.visible = true;
+    m.transparent = transparent;
+    m.blending = blending;
+
+    return null;
+  }
+
+  _hide(object) {
+    return (object.visible = false);
+  }
+
+  _vertexColor(color, mask) {
+    if (!color && !mask) {
+      return;
+    }
+
+    const v = this.shaders.shader();
+
+    if (color) {
+      v.require(color);
+      v.pipe("mesh.vertex.color", this.uniforms);
+    }
+
+    if (mask) {
+      v.require(mask);
+      v.pipe("mesh.vertex.mask", this.uniforms);
+    }
+
+    return v;
+  }
+
+  _vertexPosition(position, material, map, channels, stpq) {
+    let defs;
+    const v = this.shaders.shader();
+
+    if (map || (material && material !== true)) {
+      defs = {};
+      if (channels > 0 || stpq) {
+        defs.POSITION_MAP = "";
+      }
+      if (channels > 0) {
+        defs[
+          ["POSITION_U", "POSITION_UV", "POSITION_UVW", "POSITION_UVWO"][
+            channels - 1
+          ]
+        ] = "";
+      }
+      if (stpq) {
+        defs.POSITION_STPQ = "";
+      }
+    }
+
+    v.require(position);
+    return v.pipe("mesh.vertex.position", this.uniforms, defs);
+  }
+
+  _fragmentColor(
+    hasStyle,
+    material,
+    color,
+    mask,
+    map,
+    channels,
+    stpq,
+    combine,
+    linear
+  ) {
+    const f = this.shaders.shader();
+
+    // metacode is terrible
+    let join = false;
+    let gamma = false;
+
+    const defs = {};
+    if (channels > 0) {
+      defs[
+        ["POSITION_U", "POSITION_UV", "POSITION_UVW", "POSITION_UVWO"][
+          channels - 1
+        ]
+      ] = "";
+    }
+    if (stpq) {
+      defs.POSITION_STPQ = "";
+    }
+
+    if (hasStyle) {
+      f.pipe("style.color", this.uniforms);
+      join = true;
+
+      if (color || map || material) {
+        if (!linear || color) {
+          f.pipe("mesh.gamma.in");
+        }
+        gamma = true;
+      }
+    }
+
+    if (color) {
+      f.isolate();
+      f.pipe("mesh.fragment.color", this.uniforms);
+      if (!linear || join) {
+        f.pipe("mesh.gamma.in");
+      }
+      f.end();
+      if (join) {
+        f.pipe(binaryOperator("vec4", "*"));
+      }
+
+      if (linear && join) {
+        f.pipe("mesh.gamma.out");
+      }
+
+      join = true;
+      gamma = true;
+    }
+
+    if (map) {
+      if (!join && combine) {
+        f.pipe(constant("vec4", "vec4(1.0)"));
+      }
+
+      f.isolate();
+      f.require(map);
+      f.pipe("mesh.fragment.map", this.uniforms, defs);
+      if (!linear) {
+        f.pipe("mesh.gamma.in");
+      }
+      f.end();
+
+      if (combine) {
+        f.pipe(combine);
+      } else {
+        if (join) {
+          f.pipe(binaryOperator("vec4", "*"));
+        }
+      }
+
+      join = true;
+      gamma = true;
+    }
+
+    if (material) {
+      if (!join) {
+        f.pipe(constant("vec4", "vec4(1.0)"));
+      }
+      if (material === true) {
+        f.pipe("mesh.fragment.shaded", this.uniforms);
+      } else {
+        f.require(material);
+        f.pipe("mesh.fragment.material", this.uniforms, defs);
+      }
+
+      gamma = true;
+    }
+
+    if (gamma && !linear) {
+      f.pipe("mesh.gamma.out");
+    }
+
+    if (mask) {
+      f.pipe("mesh.fragment.mask", this.uniforms);
+      if (join) {
+        f.pipe(binaryOperator("vec4", "*"));
+      }
+    }
+
+    return f;
+  }
+}
+
+;// CONCATENATED MODULE: ./src/render/meshes/arrow.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+
+
+class Arrow extends Base {
+  constructor(renderer, shaders, options) {
+    let f;
+    super(renderer, shaders, options);
+
+    let { uniforms } = options;
+
+    const { material, position, color, mask, map, combine, stpq, linear } =
+      options;
+    if (uniforms == null) {
+      uniforms = {};
+    }
+
+    const hasStyle = uniforms.styleColor != null;
+
+    this.geometry = new ArrowGeometry({
+      sides: options.sides,
+      samples: options.samples,
+      strips: options.strips,
+      ribbons: options.ribbons,
+      layers: options.layers,
+      anchor: options.anchor,
+      flip: options.flip,
+    });
+
+    this._adopt(uniforms);
+    this._adopt(this.geometry.uniforms);
+
+    const factory = shaders.material();
+
+    const v = factory.vertex;
+
+    v.pipe(this._vertexColor(color, mask));
+
+    v.require(this._vertexPosition(position, material, map, 1, stpq));
+    v.pipe("arrow.position", this.uniforms);
+    v.pipe("project.position", this.uniforms);
+
+    factory.fragment = f = this._fragmentColor(
+      hasStyle,
+      material,
+      color,
+      mask,
+      map,
+      1,
+      stpq,
+      combine,
+      linear
+    );
+
+    f.pipe("fragment.color", this.uniforms);
+
+    const opts = factory.link({
+      side: external_THREE_.DoubleSide,
+    });
+    this.material = this._material(opts);
+
+    const object = new external_THREE_.Mesh(this.geometry, this.material);
+    object.frustumCulled = false;
+    object.matrixAutoUpdate = false;
+    object.userData = opts;
+
+    this._raw(object);
+    this.renders = [object];
+  }
+
+  dispose() {
+    this.geometry.dispose();
+    this.material.dispose();
+    this.renders = this.geometry = this.material = null;
+    return super.dispose();
+  }
+}
+
+;// CONCATENATED MODULE: ./src/render/buffer/texture/backedtexture.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+/*
+Manually allocated GL texture for data streaming, locally backed.
+
+Allows partial updates via subImage.
+Contains local copy of its data to allow quick resizing without gl.copyTexImage2d
+(which requires render-to-framebuffer)
+*/
+class BackedTexture extends DataTexture {
+  constructor(renderer, width, height, channels, options) {
+    super(renderer, width, height, channels, options);
+    this.data = new this.ctor(this.n);
+  }
+
+  resize(width, height) {
+    const old = this.data;
+    const oldWidth = this.width;
+    const oldHeight = this.height;
+
+    this.width = width;
+    this.height = height;
+    this.n = width * height * this.channels;
+    this.data = new this.ctor(this.n);
+
+    const { gl } = this;
+    const state = this.renderer.state;
+    state.bindTexture(gl.TEXTURE_2D, this.texture);
+    gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);
+    gl.texImage2D(
+      gl.TEXTURE_2D,
+      0,
+      this.format,
+      width,
+      height,
+      0,
+      this.format,
+      this.type,
+      this.data
+    );
+
+    this.uniforms.dataResolution.value.set(1 / width, 1 / height);
+
+    return this.write(old, 0, 0, oldWidth, oldHeight);
+  }
+
+  write(src, x, y, w, h) {
+    let j;
+    const { width } = this;
+    const dst = this.data;
+    const { channels } = this;
+
+    let i = 0;
+    if (width === w && x === 0) {
+      j = y * w * channels;
+      const n = w * h * channels;
+      while (i < n) {
+        dst[j++] = src[i++];
+      }
+    } else {
+      const stride = width * channels;
+      const ww = w * channels;
+      const xx = x * channels;
+      let yy = y;
+      const yh = y + h;
+      while (yy < yh) {
+        let k = 0;
+        j = xx + yy * stride;
+        while (k++ < ww) {
+          dst[j++] = src[i++];
+        }
+        yy++;
+      }
+    }
+
+    return super.write(src, x, y, w, h);
+  }
+
+  dispose() {
+    this.data = null;
+    return super.dispose();
+  }
+}
+
+;// CONCATENATED MODULE: ./src/render/buffer/atlas.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining
+ * DS104: Avoid inline assignments
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+
+
+
+
+/*
+ * Dynamic sprite atlas
+ *
+ * - Allocates variable-sized sprites in rows
+ * - Will grow itself when full
+ */
+class Atlas extends Renderable {
+  constructor(renderer, shaders, options, build) {
+    if (build == null) {
+      build = true;
+    }
+    super(renderer, shaders);
+
+    if (this.width == null) {
+      this.width = options.width || 512;
+    }
+    if (this.height == null) {
+      this.height = options.height || 512;
+    }
+    if (this.channels == null) {
+      this.channels = options.channels || 4;
+    }
+    if (this.backed == null) {
+      this.backed = options.backed || false;
+    }
+    this.samples = this.width * this.height;
+
+    if (build) {
+      this.build(options);
+    }
+  }
+
+  shader(shader) {
+    shader.pipe("map.2d.data", this.uniforms);
+    shader.pipe("sample.2d", this.uniforms);
+    if (this.channels < 4) {
+      shader.pipe(
+        swizzleVec4(["0000", "x000", "xw00", "xyz0"][this.channels])
+      );
+    }
+    return shader;
+  }
+
+  build(options) {
+    let klass;
+    this.klass = klass = this.backed ? BackedTexture : DataTexture;
+    this.texture = new klass(
+      this.renderer,
+      this.width,
+      this.height,
+      this.channels,
+      options
+    );
+
+    this.uniforms = {
+      dataPointer: {
+        type: "v2",
+        value: new external_THREE_.Vector2(0, 0),
+      },
+    };
+    this._adopt(this.texture.uniforms);
+
+    return this.reset();
+  }
+
+  reset() {
+    this.rows = [];
+    return (this.bottom = 0);
+  }
+
+  resize(width, height) {
+    if (!this.backed) {
+      throw new Error("Cannot resize unbacked texture atlas");
+    }
+    if (width > 2048 && height > 2048) {
+      console.warn(`Giant text atlas ${width}x${height}.`);
+    } else {
+      console.info(`Resizing text atlas ${width}x${height}.`);
+    }
+
+    this.texture.resize(width, height);
+
+    this.width = width;
+    this.height = height;
+    return (this.samples = width * height);
+  }
+
+  collapse(row) {
+    let left;
+    const { rows } = this;
+    rows.splice(rows.indexOf(row), 1);
+    this.bottom =
+      (left = atlas_guard_(rows[rows.length - 1], (x) => x.bottom)) != null
+        ? left
+        : 0;
+    if (this.last === row) {
+      return (this.last = null);
+    }
+  }
+
+  allocate(key, width, height, emit) {
+    const w = this.width;
+    const h = this.height;
+
+    const max = height * 2;
+
+    if (width > w) {
+      this.resize(w * 2, h * 2);
+      this.last = null;
+      // Try again
+      return this.allocate(key, width, height, emit);
+    }
+
+    // See if we can append to the last used row (fast code path)
+    let row = this.last;
+    if (row != null) {
+      if (row.height >= height && row.height < max && row.width + width <= w) {
+        row.append(key, width, height, emit);
+        return;
+      }
+    }
+
+    // Scan all rows and append to the first suitable one (slower code path)
+    let bottom = 0;
+    let index = -1;
+    let top = 0;
+    for (let i = 0; i < this.rows.length; i++) {
+      // Measure gap between rows
+      // Note suitable holes for later
+      row = this.rows[i];
+      const gap = row.top - bottom;
+      if (gap >= height && index < 0) {
+        index = i;
+        top = bottom;
+      }
+      ({ bottom } = row);
+
+      if (row.height >= height && row.height < max && row.width + width <= w) {
+        row.append(key, width, height, emit);
+        this.last = row;
+        return;
+      }
+    }
+
+    // New row (slowest path)
+    if (index >= 0) {
+      // Fill a gap
+      row = new Row(top, height);
+      this.rows.splice(index, 0, row);
+      //console.log 'fill gap', row
+    } else {
+      // Append to bottom
+      top = bottom;
+      bottom += height;
+
+      // Resize if atlas is full
+      if (bottom >= h) {
+        this.resize(w * 2, h * 2);
+        this.last = null;
+        // Try again
+        return this.allocate(key, width, height, emit);
+      }
+
+      // Add new row to the end
+      row = new Row(top, height);
+      this.rows.push(row);
+      this.bottom = bottom;
+    }
+
+    row.append(key, width, height, emit);
+    this.last = row;
+  }
+
+  read() {
+    return this.texture.textureObject;
+  }
+
+  write(data, x, y, w, h) {
+    return this.texture.write(data, x, y, w, h);
+  }
+
+  dispose() {
+    this.texture.dispose();
+    this.data = null;
+    return super.dispose();
+  }
+}
+
+class Row {
+  constructor(top, height) {
+    this.top = top;
+    this.bottom = top + height;
+    this.width = 0;
+    this.height = height;
+    this.alive = 0;
+    this.keys = [];
+  }
+
+  append(key, width, height, emit) {
+    const x = this.width;
+    const y = this.top;
+    this.alive++;
+    this.width += width;
+    this.keys.push(key);
+    return emit(this, x, y);
+  }
+}
+
+function atlas_guard_(value, transform) {
+  return typeof value !== "undefined" && value !== null
+    ? transform(value)
+    : undefined;
+}
+
+;// CONCATENATED MODULE: ./src/render/meshes/debug.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+
+
+
+class Debug extends Base {
+  constructor(renderer, shaders, options) {
+    super(renderer, shaders, options);
+
+    this.geometry = new external_THREE_.PlaneGeometry(1, 1);
+    this.material = new external_THREE_.MeshBasicMaterial({ map: options.map });
+    this.material.side = external_THREE_.DoubleSide;
+
+    const object = new external_THREE_.Mesh(this.geometry, this.material);
+    object.position.x += options.x || 0;
+    object.position.y += options.y || 0;
+    object.frustumCulled = false;
+    object.scale.set(2, 2, 2);
+    object.__debug = true;
+
+    this.objects = [object];
+  }
+
+  dispose() {
+    this.geometry.dispose();
+    this.material.dispose();
+    this.objects = this.geometry = this.material = null;
+    return super.dispose();
+  }
+}
+
+;// CONCATENATED MODULE: ./src/render/geometry/facegeometry.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS202: Simplify dynamic range loops
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+/*
+(flat) Triangle fans arranged in items, columns and rows
+
++-+     +-+     +-+     +-+
+|\\\    |\\\    |\\\    |\\\
++-+-+   +-+-+   +-+-+   +-+-+
+
++-+     +-+     +-+     +-+
+|\\\    |\\\    |\\\    |\\\
++-+-+   +-+-+   +-+-+   +-+-+
+
++-+     +-+     +-+     +-+
+|\\\    |\\\    |\\\    |\\\
++-+-+   +-+-+   +-+-+   +-+-+
+*/
+
+class FaceGeometry extends ClipGeometry {
+  constructor(options) {
+    let depth, height, items, sides, width;
+    super(options);
+
+    this._clipUniforms();
+
+    this.items = items = +options.items || 2;
+    this.width = width = +options.width || 1;
+    this.height = height = +options.height || 1;
+    this.depth = depth = +options.depth || 1;
+    this.sides = sides = Math.max(0, items - 2);
+
+    const samples = width * height * depth;
+    const points = items * samples;
+    const triangles = sides * samples;
+
+    this.setIndex(new external_THREE_.BufferAttribute(new Uint32Array(triangles * 3), 1));
+
+    this.setAttribute(
+      "position4",
+      new external_THREE_.BufferAttribute(new Float32Array(points * 4), 4)
+    );
+
+    const index = this._emitter("index");
+    const position = this._emitter("position4");
+
+    let base = 0;
+    for (
+      let i = 0, end = samples, asc = 0 <= end;
+      asc ? i < end : i > end;
+      asc ? i++ : i--
+    ) {
+      for (
+        let j = 0, end1 = sides, asc1 = 0 <= end1;
+        asc1 ? j < end1 : j > end1;
+        asc1 ? j++ : j--
+      ) {
+        index(base);
+        index(base + j + 1);
+        index(base + j + 2);
+      }
+
+      base += items;
+    }
+
+    for (
+      let z = 0, end2 = depth, asc2 = 0 <= end2;
+      asc2 ? z < end2 : z > end2;
+      asc2 ? z++ : z--
+    ) {
+      for (
+        let y = 0, end3 = height, asc3 = 0 <= end3;
+        asc3 ? y < end3 : y > end3;
+        asc3 ? y++ : y--
+      ) {
+        for (
+          let x = 0, end4 = width, asc4 = 0 <= end4;
+          asc4 ? x < end4 : x > end4;
+          asc4 ? x++ : x--
+        ) {
+          for (
+            let l = 0, end5 = items, asc5 = 0 <= end5;
+            asc5 ? l < end5 : l > end5;
+            asc5 ? l++ : l--
+          ) {
+            position(x, y, z, l);
+          }
+        }
+      }
+    }
+
+    this._finalize();
+    this.clip();
+  }
+
+  clip(width, height, depth, items) {
+    if (width == null) {
+      ({ width } = this);
+    }
+    if (height == null) {
+      ({ height } = this);
+    }
+    if (depth == null) {
+      ({ depth } = this);
+    }
+    if (items == null) {
+      ({ items } = this);
+    }
+    const sides = Math.max(0, items - 2);
+
+    this._clipGeometry(width, height, depth, items);
+    return this._clipOffsets(
+      3,
+      width,
+      height,
+      depth,
+      sides,
+      this.width,
+      this.height,
+      this.depth,
+      this.sides
+    );
+  }
+}
+
+;// CONCATENATED MODULE: ./src/render/meshes/face.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+
+
+class face_Face extends Base {
+  constructor(renderer, shaders, options) {
+    let f;
+    super(renderer, shaders, options);
+
+    let { uniforms, material } = options;
+    const { position, color, mask, map, combine, stpq, linear } = options;
+
+    if (uniforms == null) {
+      uniforms = {};
+    }
+    if (material == null) {
+      material = true;
+    }
+
+    const hasStyle = uniforms.styleColor != null;
+
+    this.geometry = new FaceGeometry({
+      items: options.items,
+      width: options.width,
+      height: options.height,
+      depth: options.depth,
+    });
+
+    this._adopt(uniforms);
+    this._adopt(this.geometry.uniforms);
+
+    const factory = shaders.material();
+
+    const v = factory.vertex;
+
+    v.pipe(this._vertexColor(color, mask));
+
+    v.require(this._vertexPosition(position, material, map, 2, stpq));
+    if (!material) {
+      v.pipe("face.position", this.uniforms);
+    }
+    if (material) {
+      v.pipe("face.position.normal", this.uniforms);
+    }
+    v.pipe("project.position", this.uniforms);
+
+    factory.fragment = f = this._fragmentColor(
+      hasStyle,
+      material,
+      color,
+      mask,
+      map,
+      2,
+      stpq,
+      combine,
+      linear
+    );
+
+    f.pipe("fragment.color", this.uniforms);
+
+    const opts = factory.link({
+      side: external_THREE_.DoubleSide,
+    });
+    this.material = this._material(opts);
+
+    const object = new external_THREE_.Mesh(this.geometry, this.material);
+    object.userData = opts;
+
+    this._raw(object);
+    this.renders = [object];
+  }
+
+  dispose() {
+    this.geometry.dispose();
+    this.material.dispose();
+    this.renders = this.geometry = this.material = null;
+    return super.dispose();
+  }
+}
+
+;// CONCATENATED MODULE: ./src/render/geometry/linegeometry.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS202: Simplify dynamic range loops
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+/*
+Line strips arranged in columns and rows
+
++----+ +----+ +----+ +----+
+
++----+ +----+ +----+ +----+
+
++----+ +----+ +----+ +----+
+*/
+
+class LineGeometry extends ClipGeometry {
+  constructor(options) {
+    let closed,
+      detail,
+      edge,
+      joint,
+      joints,
+      l,
+      layers,
+      ribbons,
+      samples,
+      segments,
+      strips,
+      vertices,
+      x,
+      y,
+      z;
+    super(options);
+
+    this._clipUniforms();
+
+    this.closed = closed = options.closed || false;
+    this.samples = samples = (+options.samples || 2) + (closed ? 1 : 0);
+    this.strips = strips = +options.strips || 1;
+    this.ribbons = ribbons = +options.ribbons || 1;
+    this.layers = layers = +options.layers || 1;
+    this.detail = detail = +options.detail || 1;
+
+    const lines = samples - 1;
+    this.joints = joints = detail - 1;
+
+    this.vertices = vertices = (lines - 1) * joints + samples;
+    this.segments = segments = (lines - 1) * joints + lines;
+
+    const wrap = samples - (closed ? 1 : 0);
+    const points = vertices * strips * ribbons * layers * 2;
+    const quads = segments * strips * ribbons * layers;
+    const triangles = quads * 2;
+
+    this.setIndex(new external_THREE_.BufferAttribute(new Uint32Array(triangles * 3), 1));
+
+    this.setAttribute(
+      "position4",
+      new external_THREE_.BufferAttribute(new Float32Array(points * 4), 4)
+    );
+    this.setAttribute(
+      "line",
+      new external_THREE_.BufferAttribute(new Float32Array(points * 2), 2)
+    );
+    this.setAttribute(
+      "strip",
+      new external_THREE_.BufferAttribute(new Float32Array(points * 2), 2)
+    );
+    if (detail > 1) {
+      this.setAttribute(
+        "joint",
+        new external_THREE_.BufferAttribute(new Float32Array(points), 1)
+      );
+    }
+
+    const index = this._emitter("index");
+    const position = this._emitter("position4");
+    const line = this._emitter("line");
+    const strip = this._emitter("strip");
+    if (detail > 1) {
+      joint = this._emitter("joint");
+    }
+
+    let base = 0;
+    for (
+      let i = 0, end = ribbons * layers, asc = 0 <= end;
+      asc ? i < end : i > end;
+      asc ? i++ : i--
+    ) {
+      for (
+        let j = 0, end1 = strips, asc1 = 0 <= end1;
+        asc1 ? j < end1 : j > end1;
+        asc1 ? j++ : j--
+      ) {
+        for (
+          let k = 0, end2 = segments, asc2 = 0 <= end2;
+          asc2 ? k < end2 : k > end2;
+          asc2 ? k++ : k--
+        ) {
+          // note implied - 1
+          index(base);
+          index(base + 1);
+          index(base + 2);
+
+          index(base + 2);
+          index(base + 1);
+          index(base + 3);
+
+          base += 2;
+        }
+        base += 2;
+      }
+    }
+
+    const edger = closed
+      ? () => 0
+      : function (x) {
+          if (x === 0) {
+            return -1;
+          } else if (x === samples - 1) {
+            return 1;
+          } else {
+            return 0;
+          }
+        };
+
+    if (detail > 1) {
+      let asc3, end3;
+      for (
+        l = 0, end3 = layers, asc3 = 0 <= end3;
+        asc3 ? l < end3 : l > end3;
+        asc3 ? l++ : l--
+      ) {
+        let asc4, end4;
+        for (
+          z = 0, end4 = ribbons, asc4 = 0 <= end4;
+          asc4 ? z < end4 : z > end4;
+          asc4 ? z++ : z--
+        ) {
+          let asc5, end5;
+          for (
+            y = 0, end5 = strips, asc5 = 0 <= end5;
+            asc5 ? y < end5 : y > end5;
+            asc5 ? y++ : y--
+          ) {
+            let asc6, end6, i1;
+            for (
+              i1 = 0, x = i1, end6 = samples, asc6 = 0 <= end6;
+              asc6 ? i1 < end6 : i1 > end6;
+              asc6 ? i1++ : i1--, x = i1
+            ) {
+              if (closed) {
+                x = x % wrap;
+              }
+              edge = edger(x);
+
+              if (edge !== 0) {
+                position(x, y, z, l);
+                position(x, y, z, l);
+
+                line(edge, 1);
+                line(edge, -1);
+
+                strip(0, segments);
+                strip(0, segments);
+
+                joint(0.5);
+                joint(0.5);
+              } else {
+                for (
+                  let m = 0, end7 = detail, asc7 = 0 <= end7;
+                  asc7 ? m < end7 : m > end7;
+                  asc7 ? m++ : m--
+                ) {
+                  position(x, y, z, l);
+                  position(x, y, z, l);
+
+                  line(edge, 1);
+                  line(edge, -1);
+
+                  strip(0, segments);
+                  strip(0, segments);
+
+                  joint(m / joints);
+                  joint(m / joints);
+                }
+              }
+            }
+          }
+        }
+      }
+    } else {
+      let asc8, end8;
+      for (
+        l = 0, end8 = layers, asc8 = 0 <= end8;
+        asc8 ? l < end8 : l > end8;
+        asc8 ? l++ : l--
+      ) {
+        let asc9, end9;
+        for (
+          z = 0, end9 = ribbons, asc9 = 0 <= end9;
+          asc9 ? z < end9 : z > end9;
+          asc9 ? z++ : z--
+        ) {
+          let asc10, end10;
+          for (
+            y = 0, end10 = strips, asc10 = 0 <= end10;
+            asc10 ? y < end10 : y > end10;
+            asc10 ? y++ : y--
+          ) {
+            let asc11, end11, j1;
+            for (
+              j1 = 0, x = j1, end11 = samples, asc11 = 0 <= end11;
+              asc11 ? j1 < end11 : j1 > end11;
+              asc11 ? j1++ : j1--, x = j1
+            ) {
+              if (closed) {
+                x = x % wrap;
+              }
+              edge = edger(x);
+
+              position(x, y, z, l);
+              position(x, y, z, l);
+
+              line(edge, 1);
+              line(edge, -1);
+
+              strip(0, segments);
+              strip(0, segments);
+            }
+          }
+        }
+      }
+    }
+
+    this._finalize();
+    this.clip();
+  }
+
+  clip(samples, strips, ribbons, layers) {
+    if (samples == null) {
+      samples = this.samples - this.closed;
+    }
+    if (strips == null) {
+      ({ strips } = this);
+    }
+    if (ribbons == null) {
+      ({ ribbons } = this);
+    }
+    if (layers == null) {
+      ({ layers } = this);
+    }
+    let segments = Math.max(0, samples - (this.closed ? 0 : 1));
+
+    const vertices = samples + (samples - 2) * this.joints;
+    segments = vertices - 1;
+
+    this._clipGeometry(vertices, strips, ribbons, layers);
+    return this._clipOffsets(
+      6,
+      segments,
+      strips,
+      ribbons,
+      layers,
+      this.segments,
+      this.strips,
+      this.ribbons,
+      this.layers
+    );
+  }
+}
+
+;// CONCATENATED MODULE: ./src/render/meshes/line.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS104: Avoid inline assignments
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+
+
+class line_Line extends Base {
+  constructor(renderer, shaders, options) {
+    let left;
+    super(renderer, shaders, options);
+
+    let { uniforms, stroke, join } = options;
+
+    const {
+      material,
+      position,
+      color,
+      mask,
+      map,
+      combine,
+      stpq,
+      linear,
+      clip,
+      proximity,
+    } = options;
+
+    if (uniforms == null) {
+      uniforms = {};
+    }
+    stroke = [null, "dotted", "dashed"][stroke];
+
+    const hasStyle = uniforms.styleColor != null;
+
+    // Line join
+    join = (left = ["miter", "round", "bevel"][join]) != null ? left : "miter";
+    const detail = { miter: 1, round: 4, bevel: 2 }[join];
+
+    this.geometry = new LineGeometry({
+      samples: options.samples,
+      strips: options.strips,
+      ribbons: options.ribbons,
+      layers: options.layers,
+      anchor: options.anchor,
+      closed: options.closed,
+      detail,
+    });
+
+    this._adopt(uniforms);
+    this._adopt(this.geometry.uniforms);
+
+    const factory = shaders.material();
+
+    const defs = {};
+    if (stroke) {
+      defs.LINE_STROKE = "";
+    }
+    if (clip) {
+      defs.LINE_CLIP = "";
+    }
+    if (proximity != null) {
+      defs.LINE_PROXIMITY = "";
+    }
+
+    defs["LINE_JOIN_" + join.toUpperCase()] = "";
+    if (detail > 1) {
+      defs["LINE_JOIN_DETAIL"] = detail;
+    }
+
+    const v = factory.vertex;
+
+    v.pipe(this._vertexColor(color, mask));
+
+    v.require(this._vertexPosition(position, material, map, 2, stpq));
+    v.pipe("line.position", this.uniforms, defs);
+    v.pipe("project.position", this.uniforms);
+
+    const f = factory.fragment;
+    if (stroke) {
+      f.pipe(`fragment.clip.${stroke}`, this.uniforms);
+    }
+    if (clip) {
+      f.pipe("fragment.clip.ends", this.uniforms);
+    }
+    if (proximity != null) {
+      f.pipe("fragment.clip.proximity", this.uniforms);
+    }
+
+    f.pipe(
+      this._fragmentColor(
+        hasStyle,
+        material,
+        color,
+        mask,
+        map,
+        2,
+        stpq,
+        combine,
+        linear
+      )
+    );
+
+    f.pipe("fragment.color", this.uniforms);
+
+    const opts = factory.link({
+      side: external_THREE_.DoubleSide,
+    });
+    this.material = this._material(opts);
+
+    const object = new external_THREE_.Mesh(this.geometry, this.material);
+    object.userData = opts;
+
+    this._raw(object);
+    this.renders = [object];
+  }
+
+  dispose() {
+    this.geometry.dispose();
+    this.material.dispose();
+    this.renders = this.geometry = this.material = null;
+    return super.dispose();
+  }
+}
+
+;// CONCATENATED MODULE: ./src/render/buffer/matrixbuffer.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS104: Avoid inline assignments
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+/*
+ * 2D + history array
+ */
+class MatrixBuffer extends DataBuffer {
+  constructor(renderer, shaders, options) {
+    const width = options.width || 1;
+    const height = options.height || 1;
+    const history = options.history || 1;
+
+    options.depth = history;
+
+    super(renderer, shaders, options, false);
+
+    this.width = width;
+    this.height = height;
+    this.history = history;
+    this.samples = width * height;
+    this.wrap = history > 1;
+
+    this.build(options);
+  }
+
+  build(_options) {
+    super.build();
+
+    this.index = 0;
+    this.pad = { x: 0, y: 0 };
+    return (this.streamer = this.generate(this.data));
+  }
+
+  getFilled() {
+    return this.filled;
+  }
+
+  setActive(i, j) {
+    let ref;
+    return (
+      ([this.pad.x, this.pad.y] = Array.from(
+        (ref = [Math.max(0, this.width - i), Math.max(0, this.height - j)])
+      )),
+      ref
+    );
+  }
+
+  fill() {
+    let j, k, repeat;
+    const { callback } = this;
+    if (typeof callback.reset === "function") {
+      callback.reset();
+    }
+
+    const { emit, skip, count, done, reset } = this.streamer;
+    reset();
+
+    const n = this.width;
+    const pad = this.pad.x;
+    const limit = this.samples - this.pad.y * n;
+
+    let i = (j = k = 0);
+    if (pad) {
+      while (!done() && k < limit) {
+        k++;
+        repeat = callback(emit, i, j);
+        if (++i === n - pad) {
+          skip(pad);
+          i = 0;
+          j++;
+        }
+        if (repeat === false) {
+          break;
+        }
+      }
+    } else {
+      while (!done() && k < limit) {
+        k++;
+        repeat = callback(emit, i, j);
+        if (++i === n) {
+          i = 0;
+          j++;
+        }
+        if (repeat === false) {
+          break;
+        }
+      }
+    }
+
+    return Math.floor(count() / this.items);
+  }
+
+  write(n) {
+    if (n == null) {
+      n = this.samples;
+    }
+    n *= this.items;
+    const width = this.width * this.items;
+    const height = Math.ceil(n / width);
+
+    this.texture.write(this.data, 0, this.index * this.height, width, height);
+    this.dataPointer.set(0.5, this.index * this.height + 0.5);
+    this.index = (this.index + this.history - 1) % this.history;
+    return (this.filled = Math.min(this.history, this.filled + 1));
+  }
+
+  through(callback, target) {
+    let dst, j, src;
+    const { consume, skip, done } = (src = this.streamer);
+    const { emit } = (dst = target.streamer);
+
+    let i = (j = 0);
+
+    let pipe = () => consume((x, y, z, w) => callback(emit, x, y, z, w, i, j));
+    pipe = repeatCall(pipe, this.items);
+
+    return () => {
+      let k;
+      src.reset();
+      dst.reset();
+
+      const n = this.width;
+      const pad = this.pad.x;
+      const limit = this.samples - this.pad.y * n;
+
+      i = j = k = 0;
+      if (pad) {
+        while (!done() && k < limit) {
+          k++;
+          pipe();
+          if (++i === n - pad) {
+            skip(pad);
+            i = 0;
+            j++;
+          }
+        }
+      } else {
+        while (!done() && k < limit) {
+          k++;
+          pipe();
+          if (++i === n) {
+            i = 0;
+            j++;
+          }
+        }
+      }
+
+      return src.count();
+    };
+  }
+}
+
+;// CONCATENATED MODULE: ./src/render/buffer/texture/rendertarget.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS202: Simplify dynamic range loops
+ * DS205: Consider reworking code to avoid use of IIFEs
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+/*
+Virtual RenderTarget that cycles through multiple frames
+Provides easy access to past rendered frames
+@reads[] and @write contain WebGLRenderTargets whose internal pointers are rotated automatically
+*/
+
+
+
+
+
+class RenderTarget {
+  constructor(gl, width, height, frames, options) {
+    this.gl = gl;
+    if (options == null) {
+      options = {};
+    }
+    if (options.minFilter == null) {
+      options.minFilter = external_THREE_.NearestFilter;
+    }
+    if (options.magFilter == null) {
+      options.magFilter = external_THREE_.NearestFilter;
+    }
+    if (options.format == null) {
+      options.format = external_THREE_.RGBAFormat;
+    }
+    if (options.type == null) {
+      options.type = external_THREE_.UnsignedByteType;
+    }
+
+    this.options = options;
+
+    this.width = width || 1;
+    this.height = height || 1;
+    this.frames = frames || 1;
+    this.buffers = this.frames + 1;
+
+    this.build();
+  }
+
+  build() {
+    let i;
+    const make = () =>
+      new external_THREE_.WebGLRenderTarget(this.width, this.height, this.options);
+
+    this.targets = (() => {
+      let asc, end;
+      const result = [];
+      for (
+        i = 0, end = this.buffers, asc = 0 <= end;
+        asc ? i < end : i > end;
+        asc ? i++ : i--
+      ) {
+        result.push(make());
+      }
+      return result;
+    })();
+
+    const acc = [];
+    this.targets.forEach((target) => acc.push(target.texture));
+    this.reads = acc;
+
+    this.write = this.targets[this.buffers - 1];
+
+    // Texture access uniforms
+    this.uniforms = {
+      dataResolution: {
+        type: "v2",
+        value: new external_THREE_.Vector2(1 / this.width, 1 / this.height),
+      },
+      dataTexture: {
+        type: "t",
+        value: this.reads[0],
+      },
+      dataTextures: {
+        type: "tv",
+        value: this.reads,
+      },
+    };
+  }
+
+  cycle() {
+    this.targets.unshift(this.targets.pop());
+    this.write = this.targets[this.buffers - 1];
+    this.reads.unshift(this.reads.pop());
+    this.uniforms.dataTexture.value = this.reads[0];
+  }
+
+  warmup(callback) {
+    return (() => {
+      const result = [];
+      for (
+        let i = 0, end = this.buffers, asc = 0 <= end;
+        asc ? i < end : i > end;
+        asc ? i++ : i--
+      ) {
+        callback(this.write);
+        result.push(this.cycle());
+      }
+      return result;
+    })();
+  }
+
+  dispose() {
+    for (const target of Array.from(this.targets)) {
+      target.dispose();
+    }
+    return (this.targets = this.reads = this.write = null);
+  }
+}
+
+;// CONCATENATED MODULE: ./src/render/buffer/rendertotexture.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+
+
+
+
+
+
+/*
+ * Render-To-Texture with history
+ */
+class RenderToTexture extends Renderable {
+  constructor(renderer, shaders, options) {
+    super(renderer, shaders);
+
+    this.scene = options.scene != null ? options.scene : new external_THREE_.Scene();
+    this.camera = options.camera;
+
+    this.build(options);
+  }
+
+  shaderRelative(shader) {
+    if (shader == null) {
+      shader = this.shaders.shader();
+    }
+    return shader.pipe("sample.2d", this.uniforms);
+  }
+
+  shaderAbsolute(shader, frames, indices) {
+    if (frames == null) {
+      frames = 1;
+    }
+    if (indices == null) {
+      indices = 4;
+    }
+    if (shader == null) {
+      shader = this.shaders.shader();
+    }
+    if (frames <= 1) {
+      if (indices > 2) {
+        shader.pipe(truncateVec(indices, 2));
+      }
+      shader.pipe("map.2d.data", this.uniforms);
+      return shader.pipe("sample.2d", this.uniforms);
+    } else {
+      const sample2DArray = glsl_sample2DArray(
+        Math.min(frames, this.target.frames)
+      );
+      if (indices < 4) {
+        shader.pipe(extendVec(indices, 4));
+      }
+      shader.pipe("map.xyzw.2dv");
+      shader.split();
+      shader.pipe("map.2d.data", this.uniforms);
+      shader.pass();
+      return shader.pipe(sample2DArray, this.uniforms);
+    }
+  }
+
+  build(options) {
+    if (!this.camera) {
+      this.camera = new external_THREE_.PerspectiveCamera();
+      this.camera.position.set(0, 0, 3);
+      this.camera.lookAt(new external_THREE_.Vector3());
+    }
+    if (typeof this.scene.inject === "function") {
+      this.scene.inject();
+    }
+
+    this.target = new RenderTarget(
+      this.gl,
+      options.width,
+      options.height,
+      options.frames,
+      options
+    );
+    this.target.warmup((target) => this.renderer.setRenderTarget(target));
+    this.renderer.setRenderTarget(null);
+
+    this._adopt(this.target.uniforms);
+    this._adopt({
+      dataPointer: {
+        type: "v2",
+        value: new external_THREE_.Vector2(0.5, 0.5),
+      },
+    });
+
+    return (this.filled = 0);
+  }
+
+  adopt(renderable) {
+    return Array.from(renderable.renders).map((object) =>
+      this.scene.add(object)
+    );
+  }
+  unadopt(renderable) {
+    return Array.from(renderable.renders).map((object) =>
+      this.scene.remove(object)
+    );
+  }
+
+  render(camera) {
+    if (camera == null) {
+      ({ camera } = this);
+    }
+    const currentTarget = this.renderer.getRenderTarget();
+    this.renderer.setRenderTarget(this.target.write);
+    this.renderer.render(
+      this.scene.scene != null ? this.scene.scene : this.scene,
+      camera
+    );
+    this.renderer.setRenderTarget(currentTarget);
+
+    this.target.cycle();
+    if (this.filled < this.target.frames) {
+      return this.filled++;
+    }
+  }
+
+  read(frame) {
+    if (frame == null) {
+      frame = 0;
+    }
+    return this.target.reads[Math.abs(frame)];
+  }
+
+  getFrames() {
+    return this.target.frames;
+  }
+
+  getFilled() {
+    return this.filled;
+  }
+
+  dispose() {
+    if (typeof this.scene.unject === "function") {
+      this.scene.unject();
+    }
+    this.scene = this.camera = null;
+
+    this.target.dispose();
+
+    return super.dispose();
+  }
+}
+
+;// CONCATENATED MODULE: ./src/render/buffer/memo.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+/*
+ * Wrapped RTT for memoizing 4D arrays back to a 2D texture
+ */
+class memo_Memo extends RenderToTexture {
+  constructor(renderer, shaders, options) {
+    let _height, _width;
+    const items = options.items || 1;
+    const channels = options.channels || 4;
+    const width = options.width || 1;
+    const height = options.height || 1;
+    const depth = options.depth || 1;
+
+    //options.format = [null, THREE.LuminanceFormat, THREE.LuminanceAlphaFormat, THREE.RGBFormat, THREE.RGBAFormat][@channels]
+    options.format = external_THREE_.RGBAFormat;
+    options.width = _width = items * width;
+    options.height = _height = height * depth;
+    options.frames = 1;
+
+    delete options.items;
+    delete options.depth;
+    delete options.channels;
+
+    super(renderer, shaders, options);
+
+    if (this.items == null) {
+      this.items = items;
+    }
+    if (this.channels == null) {
+      this.channels = channels;
+    }
+    if (this.width == null) {
+      this.width = width;
+    }
+    this._width = _width;
+    if (this.height == null) {
+      this.height = height;
+    }
+    this._height = _height;
+    if (this.depth == null) {
+      this.depth = depth;
+    }
+
+    this._adopt({
+      textureItems: { type: "f", value: this.items },
+      textureHeight: { type: "f", value: this.height },
+    });
+  }
+
+  shaderAbsolute(shader) {
+    if (shader == null) {
+      shader = this.shaders.shader();
+    }
+    shader.pipe("map.xyzw.texture", this.uniforms);
+    return super.shaderAbsolute(shader, 1, 2);
+  }
+}
+//shader.pipe Util.GLSL.swizzleVec4 ['0000', 'x000', 'xw00', 'xyz0'][@channels] if @channels < 4
+
+;// CONCATENATED MODULE: ./src/render/geometry/surfacegeometry.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS202: Simplify dynamic range loops
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+/*
+Grid Surface
+
++----+----+----+----+
+|    |    |    |    |
++----+----+----+----+
+|    |    |    |    |
++----+----+----+----+
+
++----+----+----+----+
+|    |    |    |    |
++----+----+----+----+
+|    |    |    |    |
++----+----+----+----+
+*/
+
+class SurfaceGeometry extends ClipGeometry {
+  constructor(options, build) {
+    if (build == null) {
+      build = true;
+    }
+    super();
+    // TODO not great... but use this pattern, maybe, to defer construction if
+    // options are missing, NOT the boolean.
+    if (build) {
+      this.construct(options);
+    }
+  }
+
+  construct(options) {
+    let closedX, closedY, height, layers, segmentsX, segmentsY, surfaces, width;
+    this._clipUniforms();
+
+    this.closedX = closedX = options.closedX || false;
+    this.closedY = closedY = options.closedY || false;
+    this.width = width = (+options.width || 2) + (closedX ? 1 : 0);
+    this.height = height = (+options.height || 2) + (closedY ? 1 : 0);
+    this.surfaces = surfaces = +options.surfaces || 1;
+    this.layers = layers = +options.layers || 1;
+
+    const wrapX = width - (closedX ? 1 : 0);
+    const wrapY = height - (closedY ? 1 : 0);
+
+    this.segmentsX = segmentsX = Math.max(0, width - 1);
+    this.segmentsY = segmentsY = Math.max(0, height - 1);
+
+    const points = width * height * surfaces * layers;
+    const quads = segmentsX * segmentsY * surfaces * layers;
+    const triangles = quads * 2;
+
+    this.setIndex(new external_THREE_.BufferAttribute(new Uint32Array(triangles * 3), 1));
+
+    this.setAttribute(
+      "position4",
+      new external_THREE_.BufferAttribute(new Float32Array(points * 4), 4)
+    );
+    this.setAttribute(
+      "surface",
+      new external_THREE_.BufferAttribute(new Float32Array(points * 2), 2)
+    );
+
+    const index = this._emitter("index");
+    const position = this._emitter("position4");
+    const surface = this._emitter("surface");
+
+    let base = 0;
+    for (
+      let i = 0, end = surfaces * layers, asc = 0 <= end;
+      asc ? i < end : i > end;
+      asc ? i++ : i--
+    ) {
+      for (
+        let j = 0, end1 = segmentsY, asc1 = 0 <= end1;
+        asc1 ? j < end1 : j > end1;
+        asc1 ? j++ : j--
+      ) {
+        for (
+          let k = 0, end2 = segmentsX, asc2 = 0 <= end2;
+          asc2 ? k < end2 : k > end2;
+          asc2 ? k++ : k--
+        ) {
+          index(base);
+          index(base + 1);
+          index(base + width);
+
+          index(base + width);
+          index(base + 1);
+          index(base + width + 1);
+
+          base++;
+        }
+        base++;
+      }
+      base += width;
+    }
+
+    const edgerX = closedX
+      ? () => 0
+      : function (x) {
+          if (x === 0) {
+            return -1;
+          } else if (x === segmentsX) {
+            return 1;
+          } else {
+            return 0;
+          }
+        };
+
+    const edgerY = closedY
+      ? () => 0
+      : function (y) {
+          if (y === 0) {
+            return -1;
+          } else if (y === segmentsY) {
+            return 1;
+          } else {
+            return 0;
+          }
+        };
+
+    for (
+      let l = 0, end3 = layers, asc3 = 0 <= end3;
+      asc3 ? l < end3 : l > end3;
+      asc3 ? l++ : l--
+    ) {
+      for (
+        let z = 0, end4 = surfaces, asc4 = 0 <= end4;
+        asc4 ? z < end4 : z > end4;
+        asc4 ? z++ : z--
+      ) {
+        for (
+          let i1 = 0, y = i1, end5 = height, asc5 = 0 <= end5;
+          asc5 ? i1 < end5 : i1 > end5;
+          asc5 ? i1++ : i1--, y = i1
+        ) {
+          if (closedY) {
+            y = y % wrapY;
+          }
+          const edgeY = edgerY(y);
+
+          for (
+            let j1 = 0, x = j1, end6 = width, asc6 = 0 <= end6;
+            asc6 ? j1 < end6 : j1 > end6;
+            asc6 ? j1++ : j1--, x = j1
+          ) {
+            if (closedX) {
+              x = x % wrapX;
+            }
+            const edgeX = edgerX(x);
+
+            position(x, y, z, l);
+
+            surface(edgeX, edgeY);
+          }
+        }
+      }
+    }
+
+    this._finalize();
+    this.clip();
+  }
+
+  clip(width, height, surfaces, layers) {
+    if (width == null) {
+      ({ width } = this);
+    }
+    if (height == null) {
+      ({ height } = this);
+    }
+    if (surfaces == null) {
+      ({ surfaces } = this);
+    }
+    if (layers == null) {
+      ({ layers } = this);
+    }
+    const segmentsX = Math.max(0, width - 1);
+    const segmentsY = Math.max(0, height - 1);
+
+    this._clipGeometry(width, height, surfaces, layers);
+    return this._clipOffsets(
+      6,
+      segmentsX,
+      segmentsY,
+      surfaces,
+      layers,
+      this.segmentsX,
+      this.segmentsY,
+      this.surfaces,
+      this.layers
+    );
+  }
+
+  map(width, height, surfaces, layers) {
+    if (width == null) {
+      ({ width } = this);
+    }
+    if (height == null) {
+      ({ height } = this);
+    }
+    if (surfaces == null) {
+      ({ surfaces } = this);
+    }
+    if (layers == null) {
+      ({ layers } = this);
+    }
+    return this._clipMap(width, height, surfaces, layers);
+  }
+}
+
+;// CONCATENATED MODULE: ./src/render/geometry/screengeometry.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+/*
+Grid Surface in normalized screen space
+
++----+----+----+----+
+|    |    |    |    |
++----+----+----+----+
+|    |    |    |    |
++----+----+----+----+
+
++----+----+----+----+
+|    |    |    |    |
++----+----+----+----+
+|    |    |    |    |
++----+----+----+----+
+*/
+
+class ScreenGeometry extends SurfaceGeometry {
+  constructor(options) {
+    options.width = Math.max(2, +options.width != null ? +options.width : 2);
+    options.height = Math.max(2, +options.height != null ? +options.height : 2);
+
+    super(options, false);
+
+    if (this.uniforms == null) {
+      this.uniforms = {};
+    }
+    this.uniforms.geometryScale = {
+      type: "v4",
+      value: new external_THREE_.Vector4(),
+    };
+
+    this.cover();
+    this.construct(options);
+  }
+
+  cover(scaleX, scaleY, scaleZ, scaleW) {
+    if (scaleX == null) {
+      scaleX = 1;
+    }
+    this.scaleX = scaleX;
+    if (scaleY == null) {
+      scaleY = 1;
+    }
+    this.scaleY = scaleY;
+    if (scaleZ == null) {
+      scaleZ = 1;
+    }
+    this.scaleZ = scaleZ;
+    if (scaleW == null) {
+      scaleW = 1;
+    }
+    this.scaleW = scaleW;
+  }
+
+  clip(width, height, surfaces, layers) {
+    if (width == null) {
+      ({ width } = this);
+    }
+    if (height == null) {
+      ({ height } = this);
+    }
+    if (surfaces == null) {
+      ({ surfaces } = this);
+    }
+    if (layers == null) {
+      ({ layers } = this);
+    }
+    super.clip(width, height, surfaces, layers);
+
+    const invert = (x) => 1 / Math.max(1, x - 1);
+    return this.uniforms.geometryScale.value.set(
+      invert(width) * this.scaleX,
+      invert(height) * this.scaleY,
+      invert(surfaces) * this.scaleZ,
+      invert(layers) * this.scaleW
+    );
+  }
+}
+
+;// CONCATENATED MODULE: ./src/render/meshes/screen.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+
+
+class Screen extends Base {
+  constructor(renderer, shaders, options) {
+    let f;
+    super(renderer, shaders, options);
+
+    let { uniforms } = options;
+    const { map, combine, stpq, linear } = options;
+
+    if (uniforms == null) {
+      uniforms = {};
+    }
+
+    const hasStyle = uniforms.styleColor != null;
+
+    this.geometry = new ScreenGeometry({
+      width: options.width,
+      height: options.height,
+    });
+
+    this._adopt(uniforms);
+    this._adopt(this.geometry.uniforms);
+
+    const factory = shaders.material();
+
+    const v = factory.vertex;
+    v.pipe("raw.position.scale", this.uniforms);
+    v.fan();
+    v.pipe("stpq.xyzw.2d", this.uniforms);
+    v.next();
+    v.pipe("screen.position", this.uniforms);
+    v.join();
+
+    factory.fragment = f = this._fragmentColor(
+      hasStyle,
+      false,
+      null,
+      null,
+      map,
+      2,
+      stpq,
+      combine,
+      linear
+    );
+
+    f.pipe("fragment.color", this.uniforms);
+
+    const opts = factory.link({
+      side: external_THREE_.DoubleSide,
+    });
+    this.material = this._material(opts);
+
+    const object = new external_THREE_.Mesh(this.geometry, this.material);
+    object.frustumCulled = false;
+    object.userData = opts;
+
+    this._raw(object);
+    this.renders = [object];
+  }
+
+  dispose() {
+    this.geometry.dispose();
+    this.material.dispose();
+    this.renders = this.geometry = this.material = null;
+    return super.dispose();
+  }
+}
+
+;// CONCATENATED MODULE: ./src/render/meshes/memoscreen.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+
+class MemoScreen extends Screen {
+  constructor(renderer, shaders, options) {
+    const { items, width, height, depth, stpq } = options;
+
+    const inv = (x) => 1 / Math.max(1, x);
+    const inv1 = (x) => 1 / Math.max(1, x - 1);
+
+    const uniforms = {
+      remapUVScale: {
+        type: "v2",
+        value: new external_THREE_.Vector2(items * width, height * depth),
+      },
+      remapModulus: {
+        type: "v2",
+        value: new external_THREE_.Vector2(items, height),
+      },
+      remapModulusInv: {
+        type: "v2",
+        value: new external_THREE_.Vector2(inv(items), inv(height)),
+      },
+      remapSTPQScale: {
+        type: "v4",
+        value: new external_THREE_.Vector4(inv1(width), inv1(height), inv1(depth), inv1(items)),
+      },
+    };
+
+    const map = shaders.shader();
+    map.pipe("screen.map.xyzw", uniforms);
+    if (options.map != null) {
+      // Need artifical STPQs because the screen is not the real geometry
+      if (stpq) {
+        map.pipe("screen.map.stpq", uniforms);
+      }
+      map.pipe(options.map);
+    }
+
+    super(renderer, shaders, { map, linear: true });
+    this.memo = options;
+    this.uniforms = uniforms;
+
+    for (const object of Array.from(this.renders)) {
+      object.transparent = false;
+    }
+  }
+
+  cover(width, height, depth, items) {
+    if (width == null) {
+      ({ width } = this.memo);
+    }
+    if (height == null) {
+      ({ height } = this.memo);
+    }
+    if (depth == null) {
+      ({ depth } = this.memo);
+    }
+    if (items == null) {
+      ({ items } = this.memo);
+    }
+    const inv1 = (x) => 1 / Math.max(1, x - 1);
+    this.uniforms.remapSTPQScale.value.set(
+      inv1(width),
+      inv1(height),
+      inv1(depth),
+      inv1(items)
+    );
+
+    const x = width / this.memo.width;
+    let y = depth / this.memo.depth;
+    if (this.memo.depth === 1) {
+      y = height / this.memo.height;
+    }
+
+    return this.geometry.cover(x, y);
+  }
+}
+
+;// CONCATENATED MODULE: ./src/render/geometry/spritegeometry.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS202: Simplify dynamic range loops
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+/*
+Render points as quads
+
++----+  +----+  +----+  +----+
+|    |  |    |  |    |  |    |
++----+  +----+  +----+  +----+
+
++----+  +----+  +----+  +----+
+|    |  |    |  |    |  |    |
++----+  +----+  +----+  +----+
+
++----+  +----+  +----+  +----+
+|    |  |    |  |    |  |    |
++----+  +----+  +----+  +----+
+
+*/
+
+class SpriteGeometry extends ClipGeometry {
+  constructor(options) {
+    let depth, height, items, width;
+    super(options);
+
+    this._clipUniforms();
+
+    this.items = items = +options.items || 2;
+    this.width = width = +options.width || 1;
+    this.height = height = +options.height || 1;
+    this.depth = depth = +options.depth || 1;
+
+    const samples = items * width * height * depth;
+    const points = samples * 4;
+    const triangles = samples * 2;
+
+    this.setIndex(new external_THREE_.BufferAttribute(new Uint32Array(triangles * 3), 1));
+
+    this.setAttribute(
+      "position4",
+      new external_THREE_.BufferAttribute(new Float32Array(points * 4), 4)
+    );
+    this.setAttribute(
+      "sprite",
+      new external_THREE_.BufferAttribute(new Float32Array(points * 2), 2)
+    );
+
+    const index = this._emitter("index");
+    const position = this._emitter("position4");
+    const sprite = this._emitter("sprite");
+
+    const quad = [
+      [-1, -1],
+      [-1, 1],
+      [1, -1],
+      [1, 1],
+    ];
+
+    let base = 0;
+    for (
+      let i = 0, end = samples, asc = 0 <= end;
+      asc ? i < end : i > end;
+      asc ? i++ : i--
+    ) {
+      index(base);
+      index(base + 1);
+      index(base + 2);
+
+      index(base + 1);
+      index(base + 2);
+      index(base + 3);
+
+      base += 4;
+    }
+
+    for (
+      let z = 0, end1 = depth, asc1 = 0 <= end1;
+      asc1 ? z < end1 : z > end1;
+      asc1 ? z++ : z--
+    ) {
+      for (
+        let y = 0, end2 = height, asc2 = 0 <= end2;
+        asc2 ? y < end2 : y > end2;
+        asc2 ? y++ : y--
+      ) {
+        for (
+          let x = 0, end3 = width, asc3 = 0 <= end3;
+          asc3 ? x < end3 : x > end3;
+          asc3 ? x++ : x--
+        ) {
+          for (
+            let l = 0, end4 = items, asc4 = 0 <= end4;
+            asc4 ? l < end4 : l > end4;
+            asc4 ? l++ : l--
+          ) {
+            for (const v of Array.from(quad)) {
+              position(x, y, z, l);
+              sprite(v[0], v[1]);
+            }
+          }
+        }
+      }
+    }
+
+    this._finalize();
+    this.clip();
+  }
+
+  clip(width, height, depth, items) {
+    if (width == null) {
+      ({ width } = this);
+    }
+    if (height == null) {
+      ({ height } = this);
+    }
+    if (depth == null) {
+      ({ depth } = this);
+    }
+    if (items == null) {
+      ({ items } = this);
+    }
+    this._clipGeometry(width, height, depth, items);
+    return this._clipOffsets(
+      6,
+      width,
+      height,
+      depth,
+      items,
+      this.width,
+      this.height,
+      this.depth,
+      this.items
+    );
+  }
+}
+
+;// CONCATENATED MODULE: ./src/render/meshes/point.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS104: Avoid inline assignments
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+
+
+class point_Point extends Base {
+  constructor(renderer, shaders, options) {
+    let f, left;
+    super(renderer, shaders, options);
+
+    let { uniforms, shape, fill } = options;
+
+    const {
+      material,
+      position,
+      color,
+      size,
+      mask,
+      map,
+      combine,
+      linear,
+      optical,
+      stpq,
+    } = options;
+
+    if (uniforms == null) {
+      uniforms = {};
+    }
+    shape = +shape != null ? +shape : 0;
+    if (fill == null) {
+      fill = true;
+    }
+
+    const hasStyle = uniforms.styleColor != null;
+
+    const shapes = [
+      "circle",
+      "square",
+      "diamond",
+      "up",
+      "down",
+      "left",
+      "right",
+    ];
+    const passes = [
+      "circle",
+      "generic",
+      "generic",
+      "generic",
+      "generic",
+      "generic",
+      "generic",
+    ];
+    const scales = [1.2, 1, 1.414, 1.16, 1.16, 1.16, 1.16];
+    const pass = passes[shape] != null ? passes[shape] : passes[0];
+    const _shape = shapes[shape] != null ? shapes[shape] : shapes[0];
+    const _scale = (left = optical && scales[shape]) != null ? left : 1;
+    const alpha = fill ? pass : `${pass}.hollow`;
+
+    this.geometry = new SpriteGeometry({
+      items: options.items,
+      width: options.width,
+      height: options.height,
+      depth: options.depth,
+    });
+
+    this._adopt(uniforms);
+    this._adopt(this.geometry.uniforms);
+
+    const defines = { POINT_SHAPE_SCALE: +(_scale + 0.00001) };
+
+    // Shared vertex shader
+    const factory = shaders.material();
+    const v = factory.vertex;
+
+    v.pipe(this._vertexColor(color, mask));
+
+    // Point sizing
+    if (size) {
+      v.isolate();
+      v.require(size);
+      v.require("point.size.varying", this.uniforms);
+      v.end();
+    } else {
+      v.require("point.size.uniform", this.uniforms);
+    }
+
+    v.require(this._vertexPosition(position, material, map, 2, stpq));
+
+    v.pipe("point.position", this.uniforms, defines);
+    v.pipe("project.position", this.uniforms);
+
+    // Shared fragment shader
+    factory.fragment = f = this._fragmentColor(
+      hasStyle,
+      material,
+      color,
+      mask,
+      map,
+      2,
+      stpq,
+      combine,
+      linear
+    );
+
+    // Split fragment into edge and fill pass for better z layering
+    const edgeFactory = shaders.material();
+    edgeFactory.vertex.pipe(v);
+    f = edgeFactory.fragment.pipe(factory.fragment);
+    f.require(`point.mask.${_shape}`, this.uniforms);
+    f.require(`point.alpha.${alpha}`, this.uniforms);
+    f.pipe("point.edge", this.uniforms);
+
+    const fillFactory = shaders.material();
+    fillFactory.vertex.pipe(v);
+    f = fillFactory.fragment.pipe(factory.fragment);
+    f.require(`point.mask.${_shape}`, this.uniforms);
+    f.require(`point.alpha.${alpha}`, this.uniforms);
+    f.pipe("point.fill", this.uniforms);
+
+    const fillOpts = fillFactory.link({
+      side: external_THREE_.DoubleSide,
+    });
+    this.fillMaterial = this._material(fillOpts);
+
+    const edgeOpts = edgeFactory.link({
+      side: external_THREE_.DoubleSide,
+    });
+    this.edgeMaterial = this._material(edgeOpts);
+
+    this.fillObject = new external_THREE_.Mesh(this.geometry, this.fillMaterial);
+    this.edgeObject = new external_THREE_.Mesh(this.geometry, this.edgeMaterial);
+
+    this._raw(this.fillObject);
+    this.fillObject.userData = fillOpts;
+
+    this._raw(this.edgeObject);
+    this.edgeObject.userData = edgeOpts;
+
+    this.renders = [this.fillObject, this.edgeObject];
+  }
+
+  show(transparent, blending, order, depth) {
+    this._show(this.edgeObject, true, blending, order, depth);
+    return this._show(this.fillObject, transparent, blending, order, depth);
+  }
+
+  dispose() {
+    this.geometry.dispose();
+    this.edgeMaterial.dispose();
+    this.fillMaterial.dispose();
+    this.renders =
+      this.edgeObject =
+      this.fillObject =
+      this.geometry =
+      this.edgeMaterial =
+      this.fillMaterial =
+        null;
+    return super.dispose();
+  }
+}
+
+;// CONCATENATED MODULE: ./src/render/buffer/pushbuffer.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS104: Avoid inline assignments
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+/*
+ * Buffer for CPU-side use
+ */
+class PushBuffer extends buffer_Buffer {
+  constructor(renderer, shaders, options) {
+    const width = options.width || 1;
+    const height = options.height || 1;
+    const depth = options.depth || 1;
+    const samples = width * height * depth;
+
+    if (!options.samples) {
+      options.samples = samples;
+    }
+
+    super(renderer, shaders, options);
+
+    this.width = width;
+    this.height = height;
+    this.depth = depth;
+    if (this.samples == null) {
+      this.samples = samples;
+    }
+
+    this.build(options);
+  }
+
+  build(_options) {
+    this.data = [];
+    this.data.length = this.samples;
+
+    this.filled = 0;
+    this.pad = { x: 0, y: 0, z: 0 };
+    return (this.streamer = this.generate(this.data));
+  }
+
+  dispose() {
+    this.data = null;
+    return super.dispose();
+  }
+
+  getFilled() {
+    return this.filled;
+  }
+
+  setActive(i, j, k) {
+    let ref;
+    return (
+      ([this.pad.x, this.pad.y, this.pad.z] = Array.from(
+        (ref = [this.width - i, this.height - j, this.depth - k])
+      )),
+      ref
+    );
+  }
+
+  read() {
+    return this.data;
+  }
+
+  copy(data) {
+    const n = Math.min(data.length, this.samples);
+    const d = this.data;
+    return pushbuffer_range_(0, n, false).map((i) => (d[i] = data[i]));
+  }
+
+  fill() {
+    let j, k, l, repeat;
+    const { callback } = this;
+    if (typeof callback.reset === "function") {
+      callback.reset();
+    }
+
+    const { emit, skip, count, done, reset } = this.streamer;
+    reset();
+
+    const n = this.width;
+    const m = this.height;
+    const padX = this.pad.x;
+    const padY = this.pad.y;
+    const limit = this.samples - this.pad.z * n * m;
+
+    let i = (j = k = l = 0);
+    if (padX > 0 || padY > 0) {
+      while (!done() && l < limit) {
+        l++;
+        repeat = callback(emit, i, j, k);
+        if (++i === n - padX) {
+          skip(padX);
+          i = 0;
+          if (++j === m - padY) {
+            skip(n * padY);
+            j = 0;
+            k++;
+          }
+        }
+        if (repeat === false) {
+          break;
+        }
+      }
+    } else {
+      while (!done() && l < limit) {
+        l++;
+        repeat = callback(emit, i, j, k);
+        if (++i === n) {
+          i = 0;
+          if (++j === m) {
+            j = 0;
+            k++;
+          }
+        }
+        if (repeat === false) {
+          break;
+        }
+      }
+    }
+
+    this.filled = 1;
+    return count();
+  }
+}
+
+function pushbuffer_range_(left, right, inclusive) {
+  const range = [];
+  const ascending = left < right;
+  const end = !inclusive ? right : ascending ? right + 1 : right - 1;
+  for (let i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {
+    range.push(i);
+  }
+  return range;
+}
+
+;// CONCATENATED MODULE: ./src/render/buffer/readback.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS104: Avoid inline assignments
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+
+
+
+
+
+
+/*
+ * Readback up to 4D array of up to 4D data from GL
+ */
+class readback_Readback extends Renderable {
+  constructor(renderer, shaders, options) {
+    super(renderer, shaders);
+
+    if (this.items == null) {
+      this.items = options.items || 1;
+    }
+    if (this.channels == null) {
+      this.channels = options.channels || 4;
+    }
+    if (this.width == null) {
+      this.width = options.width || 1;
+    }
+    if (this.height == null) {
+      this.height = options.height || 1;
+    }
+    if (this.depth == null) {
+      this.depth = options.depth || 1;
+    }
+    if (this.type == null) {
+      this.type = options.type || external_THREE_.FloatType;
+    }
+    if (this.stpq == null) {
+      this.stpq = options.stpq || false;
+    }
+    this.isFloat = this.type === external_THREE_.FloatType;
+
+    this.active = this.sampled = this.rect = this.pad = null;
+
+    this.build(options);
+
+    /*
+    * log precision
+    gl = @gl
+    for name, pass of {Vertex: gl.VERTEX_SHADER, Fragment: gl.FRAGMENT_SHADER}
+      bits = for prec in [gl.LOW_FLOAT, gl.MEDIUM_FLOAT, gl.HIGH_FLOAT]
+        gl.getShaderPrecisionFormat(pass, prec).precision
+      console.log name, 'shader precision',  bits
+    */
+  }
+
+  build(options) {
+    let channels, encoder, stretch;
+    const { map } = options;
+    const { indexer } = options;
+    const isIndexed = indexer != null && !indexer.empty();
+
+    let { stpq } = this;
+    const { items, width, height, depth } = this;
+
+    let sampler = map;
+    if (isIndexed) {
+      // Preserve original xyzw offset of datapoint to tie it back to the source
+
+      // Modulus to pack xyzw into a single integer index
+      this._adopt({
+        indexModulus: {
+          type: "v4",
+          value: new external_THREE_.Vector4(items, items * width, items * width * height, 1),
+        },
+      });
+
+      // Build shader to pack XYZ + index into a single RGBA
+      sampler = this.shaders.shader();
+      sampler.require(map);
+      sampler.require(indexer);
+      //sampler.require UGLSL.identity 'vec4'
+      sampler.pipe("float.index.pack", this.uniforms);
+    }
+
+    if (this.isFloat && this.channels > 1) {
+      // Memoize multi-channel float data into float buffer first
+      this.floatMemo = new memo_Memo(this.renderer, this.shaders, {
+        items,
+        channels: 4, // non-RGBA render target not supported
+        width,
+        height,
+        depth,
+        history: 0,
+        type: external_THREE_.FloatType,
+      });
+
+      this.floatCompose = new MemoScreen(this.renderer, this.shaders, {
+        map: sampler,
+        items,
+        width,
+        height,
+        depth,
+        stpq,
+      });
+
+      this.floatMemo.adopt(this.floatCompose);
+
+      // Second pass won't need texture coordinates
+      stpq = false;
+
+      // Replace sampler with memoized sampler
+      sampler = this.shaders.shader();
+      this.floatMemo.shaderAbsolute(sampler);
+    }
+
+    if (this.isFloat) {
+      // Encode float data into byte buffer
+      stretch = this.channels;
+      channels = 4; // one 32-bit float per pixel
+    } else {
+      // Render byte data directly
+      stretch = 1;
+      channels = this.channels;
+    }
+
+    if (stretch > 1) {
+      // Stretch horizontally, sampling once per channel
+      encoder = this.shaders.shader();
+      encoder.pipe(mapByte2FloatOffset(stretch));
+      encoder.require(sampler);
+      encoder.pipe("float.stretch");
+      encoder.pipe("float.encode");
+      sampler = encoder;
+    } else if (this.isFloat) {
+      // Direct sampling
+      encoder = this.shaders.shader();
+      encoder.pipe(sampler);
+      encoder.pipe(truncateVec(4, 1));
+      encoder.pipe("float.encode");
+      sampler = encoder;
+    }
+
+    // Memoize byte data
+    this.byteMemo = new memo_Memo(this.renderer, this.shaders, {
+      items: items * stretch,
+      channels: channels, // non-RGBA render target not supported
+      width,
+      height,
+      depth,
+      history: 0,
+      type: external_THREE_.UnsignedByteType,
+    });
+
+    this.byteCompose = new MemoScreen(this.renderer, this.shaders, {
+      map: sampler,
+      items: items * stretch,
+      width,
+      height,
+      depth,
+      stpq,
+    });
+
+    this.byteMemo.adopt(this.byteCompose);
+
+    // CPU-side buffers
+    const w = items * width * stretch;
+    const h = height * depth;
+
+    this.samples = this.width * this.height * this.depth;
+
+    this.bytes = new Uint8Array(w * h * 4); // non-RGBA render target not supported
+    if (this.isFloat) {
+      this.floats = new Float32Array(this.bytes.buffer);
+    }
+    this.data = this.isFloat ? this.floats : this.bytes;
+    this.streamer = this.generate(this.data);
+
+    this.active = { items: 0, width: 0, height: 0, depth: 0 };
+    this.sampled = { items: 0, width: 0, height: 0, depth: 0 };
+    this.rect = { w: 0, h: 0 };
+    this.pad = { x: 0, y: 0, z: 0, w: 0 };
+
+    this.stretch = stretch;
+    this.isIndexed = isIndexed;
+
+    return this.setActive(items, width, height, depth);
+  }
+
+  generate(data) {
+    return getStreamer(data, this.samples, 4, this.items);
+  } // non-RGBA render target not supported
+
+  setActive(items, width, height, depth) {
+    let ref;
+    if (
+      items === this.active.items &&
+      width === this.active.width &&
+      height === this.active.height &&
+      depth === this.active.depth
+    ) {
+      return;
+    }
+
+    // Actively sampled area
+    [
+      this.active.items,
+      this.active.width,
+      this.active.height,
+      this.active.depth,
+    ] = Array.from([items, width, height, depth]);
+
+    // Render only necessary samples in RTTs
+    if (this.floatCompose != null) {
+      this.floatCompose.cover(width, height, depth);
+    }
+    if (this.byteCompose != null) {
+      this.byteCompose.cover(width * this.stretch, height, depth);
+    }
+
+    // Calculate readback buffer geometry
+    ({ items } = this);
+    ({ width } = this.active);
+    height = this.depth === 1 ? this.active.height : this.height;
+    ({ depth } = this.active);
+    const w = items * width * this.stretch;
+    const h = height * depth;
+
+    // Calculate array paddings on readback
+    [
+      this.sampled.items,
+      this.sampled.width,
+      this.sampled.height,
+      this.sampled.depth,
+    ] = Array.from([items, width, height, depth]);
+    [this.rect.w, this.rect.h] = Array.from([w, h]);
+    return (
+      ([this.pad.x, this.pad.y, this.pad.z, this.pad.w] = Array.from(
+        (ref = [
+          this.sampled.width - this.active.width,
+          this.sampled.height - this.active.height,
+          this.sampled.depth - this.active.depth,
+          this.sampled.items - this.active.items,
+        ])
+      )),
+      ref
+    );
+  }
+
+  update(camera) {
+    if (this.floatMemo != null) {
+      this.floatMemo.render(camera);
+    }
+    return this.byteMemo != null ? this.byteMemo.render(camera) : undefined;
+  }
+
+  post() {
+    const currentTarget = this.renderer.getRenderTarget();
+    this.renderer.setRenderTarget(this.byteMemo.target.targets[0]);
+    this.gl.readPixels(
+      0,
+      0,
+      this.rect.w,
+      this.rect.h,
+      this.gl.RGBA,
+      this.gl.UNSIGNED_BYTE,
+      this.bytes
+    );
+    this.renderer.setRenderTarget(currentTarget);
+  }
+
+  readFloat(n) {
+    return this.floatMemo != null ? this.floatMemo.read(n) : undefined;
+  }
+  readByte(n) {
+    return this.byteMemo != null ? this.byteMemo.read(n) : undefined;
+  }
+
+  setCallback(callback) {
+    this.emitter = this.callback(callback);
+  }
+
+  callback(callback) {
+    if (!this.isIndexed) {
+      return callback;
+    }
+
+    const n = this.width;
+    const m = this.height;
+    const p = this.items;
+
+    // Decode packed index
+    const f = function (x, y, z, w) {
+      let idx = w;
+      const ll = idx % p;
+      idx = (idx - ll) / p;
+      const ii = idx % n;
+      idx = (idx - ii) / n;
+      const jj = idx % m;
+      idx = (idx - jj) / m;
+      const kk = idx;
+
+      return callback(x, y, z, w, ii, jj, kk, ll);
+    };
+
+    f.reset = () =>
+      typeof callback.reset === "function" ? callback.reset() : undefined;
+    return f;
+  }
+
+  iterate() {
+    let j, k, l;
+    let emit = this.emitter;
+    if (typeof emit.reset === "function") {
+      emit.reset();
+    }
+
+    const { consume, skip, count, done, reset } = this.streamer;
+    reset();
+
+    const n = this.sampled.width | 0;
+    let m = this.sampled.height | 0;
+    const o = this.sampled.depth | 0;
+    const p = this.sampled.items | 0;
+    const padX = this.pad.x | 0;
+    const padY = this.pad.y | 0;
+    const padZ = this.pad.z | 0;
+    const padW = this.pad.w | 0;
+    const limit = n * m * p * (o - padZ);
+
+    if (!this.isIndexed) {
+      const callback = emit;
+      emit = (x, y, z, w) => callback(x, y, z, w, i, j, k, l);
+    }
+
+    let i = (j = k = l = m = 0);
+    while (!done() && m < limit) {
+      m++;
+      const repeat = consume(emit);
+      if (++l === p - padW) {
+        skip(padX);
+        l = 0;
+        if (++i === n - padX) {
+          skip(p * padX);
+          i = 0;
+          if (++j === m - padY) {
+            skip(p * n * padY);
+            j = 0;
+            k++;
+          }
+        }
+      }
+      if (repeat === false) {
+        break;
+      }
+    }
+
+    return Math.floor(count() / p);
+  }
+
+  dispose() {
+    if (this.floatMemo != null) {
+      this.floatMemo.unadopt(this.floatCompose);
+    }
+    if (this.floatMemo != null) {
+      this.floatMemo.dispose();
+    }
+    if (this.floatCompose != null) {
+      this.floatCompose.dispose();
+    }
+
+    if (this.byteMemo != null) {
+      this.byteMemo.unadopt(this.byteCompose);
+    }
+    if (this.byteMemo != null) {
+      this.byteMemo.dispose();
+    }
+    if (this.byteCompose != null) {
+      this.byteCompose.dispose();
+    }
+
+    return (this.floatMemo =
+      this.byteMemo =
+      this.floatCompose =
+      this.byteCompose =
+        null);
+  }
+}
+
+;// CONCATENATED MODULE: ./src/render/meshes/sprite.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+
+
+class Sprite extends Base {
+  constructor(renderer, shaders, options) {
+    let f;
+    super(renderer, shaders, options);
+
+    let { uniforms } = options;
+    const {
+      material,
+      position,
+      sprite,
+      map,
+      combine,
+      linear,
+      color,
+      mask,
+      stpq,
+    } = options;
+
+    if (uniforms == null) {
+      uniforms = {};
+    }
+
+    const hasStyle = uniforms.styleColor != null;
+
+    this.geometry = new SpriteGeometry({
+      items: options.items,
+      width: options.width,
+      height: options.height,
+      depth: options.depth,
+    });
+
+    this._adopt(uniforms);
+    this._adopt(this.geometry.uniforms);
+
+    // Shared vertex shader
+    const factory = shaders.material();
+    const v = factory.vertex;
+
+    v.pipe(this._vertexColor(color, mask));
+
+    v.require(this._vertexPosition(position, material, map, 2, stpq));
+    v.require(sprite);
+    v.pipe("sprite.position", this.uniforms);
+    v.pipe("project.position", this.uniforms);
+
+    // Shared fragment shader
+    factory.fragment = f = this._fragmentColor(
+      hasStyle,
+      material,
+      color,
+      mask,
+      map,
+      2,
+      stpq,
+      combine,
+      linear
+    );
+
+    // Split fragment into edge and fill pass for better z layering
+    const edgeFactory = shaders.material();
+    edgeFactory.vertex.pipe(v);
+    edgeFactory.fragment.pipe(f);
+    edgeFactory.fragment.pipe("fragment.transparent", this.uniforms);
+
+    const fillFactory = shaders.material();
+    fillFactory.vertex.pipe(v);
+    fillFactory.fragment.pipe(f);
+    fillFactory.fragment.pipe("fragment.solid", this.uniforms);
+
+    const fillOpts = fillFactory.link({
+      side: external_THREE_.DoubleSide,
+    });
+    this.fillMaterial = this._material(fillOpts);
+
+    const edgeOpts = edgeFactory.link({
+      side: external_THREE_.DoubleSide,
+    });
+    this.edgeMaterial = this._material(edgeOpts);
+
+    this.fillObject = new external_THREE_.Mesh(this.geometry, this.fillMaterial);
+    this.edgeObject = new external_THREE_.Mesh(this.geometry, this.edgeMaterial);
+
+    this._raw(this.fillObject);
+    this.fillObject.userData = fillOpts;
+
+    this._raw(this.edgeObject);
+    this.edgeObject.userData = edgeOpts;
+
+    this.renders = [this.fillObject, this.edgeObject];
+  }
+
+  show(transparent, blending, order, depth) {
+    this._show(this.edgeObject, true, blending, order, depth);
+    return this._show(this.fillObject, transparent, blending, order, depth);
+  }
+
+  dispose() {
+    this.geometry.dispose();
+    this.edgeMaterial.dispose();
+    this.fillMaterial.dispose();
+    this.nreders =
+      this.geometry =
+      this.edgeMaterial =
+      this.fillMaterial =
+      this.edgeObject =
+      this.fillObject =
+        null;
+    return super.dispose();
+  }
+}
+
+;// CONCATENATED MODULE: ./src/render/geometry/stripgeometry.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS202: Simplify dynamic range loops
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+/*
+Triangle strips arranged in items, columns and rows
+
++--+--+--+  +--+--+--+  +--+--+--+  +--+--+--+
+| /| /| /   | /| /| /   | /| /| /   | /| /| /
++--+--+/    +--+--+/    +--+--+/    +--+--+/
+
++--+--+--+  +--+--+--+  +--+--+--+  +--+--+--+
+| /| /| /   | /| /| /   | /| /| /   | /| /| /
++--+--+/    +--+--+/    +--+--+/    +--+--+/
+
++--+--+--+  +--+--+--+  +--+--+--+  +--+--+--+
+| /| /| /   | /| /| /   | /| /| /   | /| /| /
++--+--+/    +--+--+/    +--+--+/    +--+--+/
+
+*/
+
+class StripGeometry extends ClipGeometry {
+  constructor(options) {
+    let depth, height, items, sides, width;
+    super(options);
+
+    this._clipUniforms();
+
+    this.items = items = +options.items || 2;
+    this.width = width = +options.width || 1;
+    this.height = height = +options.height || 1;
+    this.depth = depth = +options.depth || 1;
+    this.sides = sides = Math.max(0, items - 2);
+
+    const samples = width * height * depth;
+    const points = items * samples;
+    const triangles = sides * samples;
+
+    this.setIndex(new external_THREE_.BufferAttribute(new Uint32Array(triangles * 3), 1));
+
+    this.setAttribute(
+      "position4",
+      new external_THREE_.BufferAttribute(new Float32Array(points * 4), 4)
+    );
+    this.setAttribute(
+      "strip",
+      new external_THREE_.BufferAttribute(new Float32Array(points * 3), 3)
+    );
+
+    const index = this._emitter("index");
+    const position = this._emitter("position4");
+    const strip = this._emitter("strip");
+
+    let base = 0;
+    for (
+      let i = 0, end = samples, asc = 0 <= end;
+      asc ? i < end : i > end;
+      asc ? i++ : i--
+    ) {
+      let o = base;
+      for (
+        let j = 0, end1 = sides, asc1 = 0 <= end1;
+        asc1 ? j < end1 : j > end1;
+        asc1 ? j++ : j--
+      ) {
+        if (j & 1) {
+          index(o + 1);
+          index(o);
+          index(o + 2);
+        } else {
+          index(o);
+          index(o + 1);
+          index(o + 2);
+        }
+        o++;
+      }
+      base += items;
+    }
+
+    const last = items - 1;
+    for (
+      let z = 0, end2 = depth, asc2 = 0 <= end2;
+      asc2 ? z < end2 : z > end2;
+      asc2 ? z++ : z--
+    ) {
+      for (
+        let y = 0, end3 = height, asc3 = 0 <= end3;
+        asc3 ? y < end3 : y > end3;
+        asc3 ? y++ : y--
+      ) {
+        for (
+          let x = 0, end4 = width, asc4 = 0 <= end4;
+          asc4 ? x < end4 : x > end4;
+          asc4 ? x++ : x--
+        ) {
+          let f = 1;
+
+          position(x, y, z, 0);
+          strip(1, 2, f);
+
+          for (
+            let l = 1, end5 = last, asc5 = 1 <= end5;
+            asc5 ? l < end5 : l > end5;
+            asc5 ? l++ : l--
+          ) {
+            position(x, y, z, l);
+            strip(l - 1, l + 1, (f = -f));
+          }
+
+          position(x, y, z, last);
+          strip(last - 2, last - 1, -f);
+        }
+      }
+    }
+
+    this._finalize();
+    this.clip();
+  }
+
+  clip(width, height, depth, items) {
+    if (width == null) {
+      ({ width } = this);
+    }
+    if (height == null) {
+      ({ height } = this);
+    }
+    if (depth == null) {
+      ({ depth } = this);
+    }
+    if (items == null) {
+      ({ items } = this);
+    }
+    const sides = Math.max(0, items - 2);
+
+    this._clipGeometry(width, height, depth, items);
+    return this._clipOffsets(
+      3,
+      width,
+      height,
+      depth,
+      sides,
+      this.width,
+      this.height,
+      this.depth,
+      this.sides
+    );
+  }
+}
+
+;// CONCATENATED MODULE: ./src/render/meshes/strip.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+
+
+class strip_Strip extends Base {
+  constructor(renderer, shaders, options) {
+    let f;
+    super(renderer, shaders, options);
+
+    let { uniforms, material } = options;
+    const { position, color, mask, map, combine, linear, stpq } = options;
+
+    if (uniforms == null) {
+      uniforms = {};
+    }
+    if (material == null) {
+      material = true;
+    }
+
+    const hasStyle = uniforms.styleColor != null;
+
+    this.geometry = new StripGeometry({
+      items: options.items,
+      width: options.width,
+      height: options.height,
+      depth: options.depth,
+    });
+
+    this._adopt(uniforms);
+    this._adopt(this.geometry.uniforms);
+
+    const factory = shaders.material();
+
+    const v = factory.vertex;
+
+    v.pipe(this._vertexColor(color, mask));
+
+    v.require(this._vertexPosition(position, material, map, 2, stpq));
+    if (!material) {
+      v.pipe("mesh.position", this.uniforms);
+    }
+    if (material) {
+      v.pipe("strip.position.normal", this.uniforms);
+    }
+    v.pipe("project.position", this.uniforms);
+
+    factory.fragment = f = this._fragmentColor(
+      hasStyle,
+      material,
+      color,
+      mask,
+      map,
+      2,
+      stpq,
+      combine,
+      linear
+    );
+
+    f.pipe("fragment.color", this.uniforms);
+
+    const opts = factory.link({
+      side: external_THREE_.DoubleSide,
+    });
+    this.material = this._material(opts);
+
+    const object = new external_THREE_.Mesh(this.geometry, this.material);
+    object.userData = opts;
+
+    this._raw(object);
+    this.renders = [object];
+  }
+
+  dispose() {
+    this.geometry.dispose();
+    this.material.dispose();
+    this.renders = this.geometry = this.material = null;
+    return super.dispose();
+  }
+}
+
+;// CONCATENATED MODULE: ./src/render/meshes/surface.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+
+
+class surface_Surface extends Base {
+  constructor(renderer, shaders, options) {
+    let defs, f;
+    super(renderer, shaders, options);
+
+    let { uniforms, material } = options;
+
+    const { position, color, mask, map, combine, linear, stpq, intUV } =
+      options;
+
+    if (uniforms == null) {
+      uniforms = {};
+    }
+    if (material == null) {
+      material = true;
+    }
+
+    const hasStyle = uniforms.styleColor != null;
+
+    this.geometry = new SurfaceGeometry({
+      width: options.width,
+      height: options.height,
+      surfaces: options.surfaces,
+      layers: options.layers,
+      closedX: options.closedX,
+      closedY: options.closedY,
+    });
+
+    this._adopt(uniforms);
+    this._adopt(this.geometry.uniforms);
+
+    const factory = shaders.material();
+
+    const v = factory.vertex;
+
+    if (intUV) {
+      defs = { POSITION_UV_INT: "" };
+    }
+
+    v.pipe(this._vertexColor(color, mask));
+
+    v.require(this._vertexPosition(position, material, map, 2, stpq));
+    if (!material) {
+      v.pipe("surface.position", this.uniforms, defs);
+    }
+    if (material) {
+      v.pipe("surface.position.normal", this.uniforms, defs);
+    }
+    v.pipe("project.position", this.uniforms);
+
+    factory.fragment = f = this._fragmentColor(
+      hasStyle,
+      material,
+      color,
+      mask,
+      map,
+      2,
+      stpq,
+      combine,
+      linear
+    );
+
+    f.pipe("fragment.color", this.uniforms);
+
+    const opts = factory.link({
+      side: external_THREE_.DoubleSide,
+    });
+    this.material = this._material(opts);
+
+    const object = new external_THREE_.Mesh(this.geometry, this.material);
+    object.userData = opts;
+
+    this._raw(object);
+    this.renders = [object];
+  }
+
+  dispose() {
+    this.geometry.dispose();
+    this.material.dispose();
+    this.renders = this.geometry = this.material = null;
+    return super.dispose();
+  }
+}
+
+;// CONCATENATED MODULE: ./src/render/buffer/textatlas.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS104: Avoid inline assignments
+ * DS202: Simplify dynamic range loops
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+const SCRATCH_SIZE = 512 / 16;
+
+/*
+ * Dynamic text atlas
+ * - Stores entire strings as sprites
+ * - Renders alpha mask (fast) or signed distance field (slow)
+ * - Emits (x,y,width,height) pointers into the atlas
+ */
+class TextAtlas extends Atlas {
+  constructor(renderer, shaders, options) {
+    let left;
+    if (!options.width) {
+      options.width = 256;
+    }
+    if (!options.height) {
+      options.height = 256;
+    }
+    options.type = external_THREE_.UnsignedByteType;
+    options.channels = 1;
+    options.backed = true;
+
+    super(renderer, shaders, options, false);
+
+    this.font = options.font != null ? options.font : ["sans-serif"];
+    this.size = options.size || 24;
+    this.style = options.style != null ? options.style : "normal";
+    this.variant = options.variant != null ? options.variant : "normal";
+    this.weight = options.weight != null ? options.weight : "normal";
+    this.outline =
+      (left = +(options.outline != null ? options.outline : 5)) != null
+        ? left
+        : 0;
+    this.gamma = 1;
+
+    if (typeof navigator !== "undefined") {
+      const ua = navigator.userAgent;
+      if (ua.match(/Chrome/) && ua.match(/OS X/)) {
+        this.gamma = 0.5;
+      }
+    }
+
+    this.scratchW = this.scratchH = 0;
+
+    this.build(options);
+  }
+
+  build(options) {
+    super.build(options);
+
+    // Prepare line-height with room for outline
+    let lineHeight = 16;
+    lineHeight = this.size;
+    lineHeight += 4 + 2 * Math.min(1, this.outline);
+    const maxWidth = SCRATCH_SIZE * lineHeight;
+
+    // Prepare scratch canvas
+    const canvas = document.createElement("canvas");
+    canvas.width = maxWidth;
+    canvas.height = lineHeight;
+
+    const quote = (str) => `${str.replace(/(['"\\])/g, "\\$1")}`;
+    const font = this.font.map(quote).join(", ");
+
+    const context = canvas.getContext("2d");
+    context.font = `${this.style} ${this.variant} ${this.weight} ${this.size}px ${font}`;
+    context.fillStyle = "#FF0000";
+    context.textAlign = "left";
+    context.textBaseline = "bottom";
+    context.lineJoin = "round";
+
+    // debug: show scratch canvas
+    /*
+    document.body.appendChild canvas
+    canvas.setAttribute('style', "position: absolute; top: 0; left: 0; z-index: 100; border: 1px solid red; background: rgba(255,0,255,.25);")
+    */
+
+    // Cache hex colors for distance field rendering
+    const colors = [];
+    const dilate = this.outline * 3;
+    for (
+      let i = 0, end = dilate, asc = 0 <= end;
+      asc ? i < end : i > end;
+      asc ? i++ : i--
+    ) {
+      // 8 rgb levels = 1 step = .5 pixel increase
+      const hex = (
+        "00" + Math.max(0, -i * 8 + 128 - !i * 8).toString(16)
+      ).slice(-2);
+      colors.push("#" + hex + hex + hex);
+    }
+
+    const scratch = new Uint8Array(maxWidth * lineHeight * 2);
+
+    this.canvas = canvas;
+    this.context = context;
+    this.lineHeight = lineHeight;
+    this.maxWidth = maxWidth;
+    this.colors = colors;
+    this.scratch = scratch;
+
+    this._allocate = this.allocate.bind(this);
+    return (this._write = this.write.bind(this));
+  }
+
+  reset() {
+    super.reset();
+    return (this.mapped = {});
+  }
+
+  begin() {
+    return Array.from(this.rows).map((row) => (row.alive = 0));
+  }
+
+  end() {
+    const { mapped } = this;
+    for (const row of Array.from(this.rows.slice())) {
+      if (row.alive === 0) {
+        for (const key of Array.from(row.keys)) {
+          delete mapped[key];
+        }
+        this.collapse(row);
+      }
+    }
+  }
+
+  map(text, emit) {
+    // See if already mapped into atlas
+    const { mapped } = this;
+    const c = mapped[text];
+    if (c != null) {
+      c.row.alive++;
+      return emit(c.x, c.y, c.w, c.h);
+    }
+
+    // Draw text (don't recurse stack in @draw so it can be optimized cleanly)
+    this.draw(text);
+    const data = this.scratch;
+    const w = this.scratchW;
+    const h = this.scratchH;
+
+    // Allocate and write into atlas
+    const allocate = this._allocate;
+    const write = this._write;
+    return allocate(text, w, h, function (row, x, y) {
+      mapped[text] = { x, y, w, h, row };
+      write(data, x, y, w, h);
+      return emit(x, y, w, h);
+    });
+  }
+
+  draw(text) {
+    let data, i, j;
+    let w = this.width;
+    const h = this.lineHeight;
+    const o = this.outline;
+    const ctx = this.context;
+    const dst = this.scratch;
+    const max = this.maxWidth;
+    const { colors } = this;
+
+    // Bottom aligned
+    const x = o + 1;
+    const y = Math.round(h * 1.05 - 1);
+
+    // Measure text
+    const m = ctx.measureText(text);
+    w = Math.min(max, Math.ceil(m.width + 2 * x + 1));
+
+    // Clear scratch area
+    ctx.clearRect(0, 0, w, h);
+
+    if (this.outline === 0) {
+      // Alpha sprite (fast)
+      let asc, end;
+      ctx.fillText(text, x, y);
+      ({ data } = ctx.getImageData(0, 0, w, h));
+      j = 3; // Skip to alpha channel
+      for (
+        i = 0, end = data.length / 4, asc = 0 <= end;
+        asc ? i < end : i > end;
+        asc ? i++ : i--
+      ) {
+        //dst[i] = 255 * (i%2); # test pattern to check pixel perfect alignment
+        dst[i] = data[j];
+        j += 4;
+      }
+
+      this.scratchW = w;
+      return (this.scratchH = h);
+    } else {
+      // Signed distance field sprite (approximation) (slow)
+
+      // Draw strokes of decreasing width to create nested outlines (absolute distance)
+      let asc1, start;
+      let asc2, end1;
+      ctx.globalCompositeOperation = "source-over";
+      for (
+        start = o + 1, i = start, asc1 = start <= 1;
+        asc1 ? i <= 1 : i >= 1;
+        asc1 ? i++ : i--
+      ) {
+        j = i > 1 ? i * 2 - 2 : i; // Eliminate odd strokes once past > 1px, don't need the detail
+        ctx.strokeStyle = colors[j - 1];
+        ctx.lineWidth = j;
+        ctx.strokeText(text, x, y);
+      }
+      //console.log 'stroke', j, j+.5, colors[j]
+
+      // Fill center with multiply blend #FF0000 to mark inside/outside
+      ctx.globalCompositeOperation = "multiply";
+      ctx.fillText(text, x, y);
+
+      // Pull image data
+      ({ data } = ctx.getImageData(0, 0, w, h));
+      j = 0;
+      const { gamma } = this;
+
+      for (
+        i = 0, end1 = data.length / 4, asc2 = 0 <= end1;
+        asc2 ? i < end1 : i > end1;
+        asc2 ? i++ : i--
+      ) {
+        // Get value + mask
+        const a = data[j];
+        let mask = a ? data[j + 1] / a : 1;
+        if (gamma === 0.5) {
+          mask = Math.sqrt(mask);
+        }
+        mask = Math.min(1, Math.max(0, mask));
+
+        // Blend between positive/outside and negative/inside
+        const b = 256 - a;
+        const c = b + (a - b) * mask;
+
+        // Clamp
+        // (slight expansion to hide errors around the transition)
+        dst[i] = Math.max(0, Math.min(255, c + 2));
+        j += 4;
+      }
+
+      // Debug: copy back into canvas
+      //
+      // TODO hide behind debug flag or delete.
+      /*
+      j = 0
+      for i in [0...data.length / 4]
+        v = dst[i]
+        *data[j] = v
+        *data[j+1] = v
+        data[j+2] = v
+        data[j+3] = 255
+        j += 4
+      ctx.putImageData(imageData, 0, 0);
+      */
+
+      this.scratchW = w;
+      return (this.scratchH = h);
+    }
+  }
+}
+
+;// CONCATENATED MODULE: ./src/render/buffer/voxelbuffer.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS104: Avoid inline assignments
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+//
+// 3D array
+//
+class VoxelBuffer extends DataBuffer {
+  build(_options) {
+    super.build();
+    this.pad = { x: 0, y: 0, z: 0 };
+    return (this.streamer = this.generate(this.data));
+  }
+
+  setActive(i, j, k) {
+    let ref;
+    return (
+      ([this.pad.x, this.pad.y, this.pad.z] = Array.from(
+        (ref = [
+          Math.max(0, this.width - i),
+          Math.max(0, this.height - j),
+          Math.max(0, this.depth - k),
+        ])
+      )),
+      ref
+    );
+  }
+
+  fill() {
+    let j, k, l, repeat;
+    const { callback } = this;
+    if (typeof callback.reset === "function") {
+      callback.reset();
+    }
+
+    const { emit, skip, count, done, reset } = this.streamer;
+    reset();
+
+    const n = this.width;
+    const m = this.height;
+    const padX = this.pad.x;
+    const padY = this.pad.y;
+    const limit = this.samples - this.pad.z * n * m;
+
+    let i = (j = k = l = 0);
+    if (padX > 0 || padY > 0) {
+      while (!done() && l < limit) {
+        l++;
+        repeat = callback(emit, i, j, k);
+        if (++i === n - padX) {
+          skip(padX);
+          i = 0;
+          if (++j === m - padY) {
+            skip(n * padY);
+            j = 0;
+            k++;
+          }
+        }
+        if (repeat === false) {
+          break;
+        }
+      }
+    } else {
+      while (!done() && l < limit) {
+        l++;
+        repeat = callback(emit, i, j, k);
+        if (++i === n) {
+          i = 0;
+          if (++j === m) {
+            j = 0;
+            k++;
+          }
+        }
+        if (repeat === false) {
+          break;
+        }
+      }
+    }
+
+    return Math.floor(count() / this.items);
+  }
+
+  through(callback, target) {
+    // must be identical sized buffers w/ identical active areas
+
+    let dst, j, k, src;
+    const { consume, done, skip } = (src = this.streamer);
+    const { emit } = (dst = target.streamer);
+
+    let i = (j = k = 0);
+
+    let pipe = () =>
+      consume((x, y, z, w) => callback(emit, x, y, z, w, i, j, k));
+    pipe = repeatCall(pipe, this.items);
+
+    return () => {
+      let l;
+      src.reset();
+      dst.reset();
+      const n = this.width;
+      const m = this.height;
+      const padX = this.pad.x;
+      const padY = this.pad.y;
+      const limit = this.samples - this.pad.z * n * m;
+
+      i = j = k = l = 0;
+      if (padX > 0 || padY > 0) {
+        while (!done() && l < limit) {
+          l++;
+          pipe();
+          if (++i === n - padX) {
+            skip(padX);
+            i = 0;
+            if (++j === m - padY) {
+              skip(n * padY);
+              j = 0;
+              k++;
+            }
+          }
+        }
+      } else {
+        while (!done() && l < limit) {
+          l++;
+          pipe();
+          if (++i === n) {
+            i = 0;
+            if (++j === m) {
+              j = 0;
+              k++;
+            }
+          }
+        }
+      }
+
+      return src.count();
+    };
+  }
+}
+
+;// CONCATENATED MODULE: ./src/render/classes.js
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+const render_classes_Classes = {
+  sprite: Sprite,
+  point: point_Point,
+  line: line_Line,
+  surface: surface_Surface,
+  face: face_Face,
+  strip: strip_Strip,
+  arrow: Arrow,
+  screen: Screen,
+  memoScreen: MemoScreen,
+  debug: Debug,
+  dataBuffer: DataBuffer,
+  arrayBuffer: ArrayBuffer_,
+  matrixBuffer: MatrixBuffer,
+  voxelBuffer: VoxelBuffer,
+  pushBuffer: PushBuffer,
+  renderToTexture: RenderToTexture,
+  memo: memo_Memo,
+  readback: readback_Readback,
+  atlas: Atlas,
+  textAtlas: TextAtlas,
+  scene: Scene,
+};
+
+;// CONCATENATED MODULE: ./src/render/index.js
+
+
+
+
+
+;// CONCATENATED MODULE: ./src/shaders/glsl/arrow.position.js
+/* harmony default export */ const arrow_position = (/* glsl */`uniform float worldUnit;
+uniform float lineDepth;
+uniform float lineWidth;
+uniform float focusDepth;
+
+uniform vec4 geometryClip;
+uniform float arrowSize;
+uniform float arrowSpace;
+
+attribute vec4 position4;
+attribute vec3 arrow;
+attribute vec2 attach;
+
+// External
+vec3 getPosition(vec4 xyzw, float canonical);
+
+void getArrowGeometry(vec4 xyzw, float near, float far, out vec3 left, out vec3 right, out vec3 start) {
+  right = getPosition(xyzw, 1.0);
+  left  = getPosition(vec4(near, xyzw.yzw), 0.0);
+  start = getPosition(vec4(far, xyzw.yzw), 0.0);
+}
+
+mat4 getArrowMatrix(vec3 left, vec3 right, vec3 start) {
+
+  float depth = focusDepth;
+  if (lineDepth < 1.0) {
+    // Depth blending
+    float z = max(0.00001, -right.z);
+    depth = mix(z, focusDepth, lineDepth);
+  }
+    
+  vec3 diff = left - right;
+  float l = length(diff);
+  if (l == 0.0) {
+    return mat4(1.0, 0.0, 0.0, 0.0,
+                0.0, 1.0, 0.0, 0.0,
+                0.0, 0.0, 1.0, 0.0,
+                0.0, 0.0, 0.0, 1.0);
+  }
+
+  // Construct TBN matrix around shaft
+  vec3 t = normalize(diff);
+  vec3 n = normalize(cross(t, t.yzx + vec3(.1, .2, .3)));
+  vec3 b = cross(n, t);
+  
+  // Shrink arrows when vector gets too small
+  // Approach linear scaling with cubic ease the smaller we get
+  float size = arrowSize * lineWidth * worldUnit * depth * 1.25;
+  diff = right - start;
+  l = length(diff) * arrowSpace;
+  float mini = clamp(1.0 - l / size * .333, 0.0, 1.0);
+  float scale = 1.0 - mini * mini * mini;
+  float range = size * scale;
+  
+  // Size to 2.5:1 ratio
+  float rangeNB = range / 2.5;
+
+  // Anchor at end position
+  return mat4(vec4(n * rangeNB,  0),
+              vec4(b * rangeNB,  0),
+              vec4(t * range, 0),
+              vec4(right,  1.0));
+}
+
+vec3 getArrowPosition() {
+  vec3 left, right, start;
+  
+  vec4 p = min(geometryClip, position4);
+  
+  getArrowGeometry(p, attach.x, attach.y, left, right, start);
+  mat4 matrix = getArrowMatrix(left, right, start);
+  return (matrix * vec4(arrow.xyz, 1.0)).xyz;
+
+}
+`);
+
+;// CONCATENATED MODULE: ./src/shaders/glsl/axis.position.js
+/* harmony default export */ const axis_position = (/* glsl */`uniform vec4 axisStep;
+uniform vec4 axisPosition;
+
+vec4 getAxisPosition(vec4 xyzw, inout vec4 stpq) {
+  return axisStep * xyzw.x + axisPosition;
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/cartesian4.position.js
+/* harmony default export */ const cartesian4_position = (/* glsl */`uniform vec4 basisScale;
+uniform vec4 basisOffset;
+uniform vec4 viewScale;
+uniform vec4 viewOffset;
+
+vec4 getCartesian4Position(vec4 position, inout vec4 stpq) {
+  return position * basisScale + basisOffset;
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/cartesian.position.js
+/* harmony default export */ const cartesian_position = (/* glsl */`uniform mat4 viewMatrix;
+
+vec4 getCartesianPosition(vec4 position, inout vec4 stpq) {
+  return viewMatrix * vec4(position.xyz, 1.0);
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/clamp.position.js
+/* harmony default export */ const clamp_position = (/* glsl */`uniform vec4 clampLimit;
+
+vec4 getClampXYZW(vec4 xyzw) {
+  return clamp(xyzw, vec4(0.0), clampLimit);
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/color.opaque.js
+/* harmony default export */ const color_opaque = (/* glsl */`vec4 opaqueColor(vec4 color) {
+  return vec4(color.rgb, 1.0);
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/face.position.js
+/* harmony default export */ const face_position = (/* glsl */`uniform vec4 geometryClip;
+attribute vec4 position4;
+
+// External
+vec3 getPosition(vec4 xyzw, float canonical);
+
+vec3 getFacePosition() {
+  vec4 p = min(geometryClip, position4);
+  return getPosition(p, 1.0);
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/face.position.normal.js
+/* harmony default export */ const face_position_normal = (/* glsl */`attribute vec4 position4;
+
+// External
+vec3 getPosition(vec4 xyzw, float canonical);
+
+varying vec3 vNormal;
+varying vec3 vLight;
+varying vec3 vPosition;
+
+void getFaceGeometry(vec4 xyzw, out vec3 pos, out vec3 normal) {
+  vec3 a, b, c;
+
+  a   = getPosition(vec4(xyzw.xyz, 0.0), 0.0);
+  b   = getPosition(vec4(xyzw.xyz, 1.0), 0.0);
+  c   = getPosition(vec4(xyzw.xyz, 2.0), 0.0);
+
+  pos = getPosition(xyzw, 1.0);
+  normal = normalize(cross(c - a, b - a));
+}
+
+vec3 getFacePositionNormal() {
+  vec3 center, normal;
+
+  getFaceGeometry(position4, center, normal);
+  vNormal   = normal;
+  vLight    = normalize((viewMatrix * vec4(1.0, 2.0, 2.0, 0.0)).xyz);
+  vPosition = -center;
+
+  return center;
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/float.encode.js
+/* harmony default export */ const float_encode = (/* glsl */`/*
+Float encoding technique by
+Carlos Scheidegger
+https://github.com/cscheid/lux/blob/master/src/shade/bits/encode_float.js
+
+Conversion to GLSL by:
+http://concord-consortium.github.io/lab/experiments/webgl-gpgpu/script.js
+*/
+
+float shift_right(float v, float amt) { 
+  v = floor(v) + 0.5; 
+  return floor(v / exp2(amt)); 
+}
+
+float shift_left(float v, float amt) { 
+  return floor(v * exp2(amt) + 0.5); 
+}
+
+float mask_last(float v, float bits) { 
+  return mod(v, shift_left(1.0, bits)); 
+}
+
+float extract_bits(float num, float from, float to) { 
+  from = floor(from + 0.5); to = floor(to + 0.5); 
+  return mask_last(shift_right(num, from), to - from); 
+}
+
+vec4 encode_float(float val) { 
+  if (val == 0.0) return vec4(0, 0, 0, 0); 
+  float valuesign = val > 0.0 ? 0.0 : 1.0; 
+  val = abs(val); 
+  float exponent = floor(log2(val)); 
+  float biased_exponent = exponent + 127.0; 
+  float fraction = ((val / exp2(exponent)) - 1.0) * 8388608.0; 
+  float t = biased_exponent / 2.0; 
+  float last_bit_of_biased_exponent = fract(t) * 2.0; 
+  float remaining_bits_of_biased_exponent = floor(t); 
+  float byte4 = extract_bits(fraction, 0.0, 8.0) / 255.0; 
+  float byte3 = extract_bits(fraction, 8.0, 16.0) / 255.0; 
+  float byte2 = (last_bit_of_biased_exponent * 128.0 + extract_bits(fraction, 16.0, 23.0)) / 255.0; 
+  float byte1 = (valuesign * 128.0 + remaining_bits_of_biased_exponent) / 255.0; 
+  return vec4(byte4, byte3, byte2, byte1); 
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/float.index.pack.js
+/* harmony default export */ const float_index_pack = (/* glsl */`uniform vec4 indexModulus;
+
+vec4 getSample(vec4 xyzw);
+vec4 getIndex(vec4 xyzw);
+
+vec4 floatPackIndex(vec4 xyzw) {
+  vec4 value = getSample(xyzw);
+  vec4 index = getIndex(xyzw);
+
+  vec4 offset = floor(index + .5) * indexModulus;
+  vec2 sum2 = offset.xy + offset.zw;
+  float sum = sum2.x + sum2.y;
+  return vec4(value.xyz, sum);
+}`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/float.stretch.js
+/* harmony default export */ const float_stretch = (/* glsl */`vec4 getSample(vec4 xyzw);
+
+float floatStretch(vec4 xyzw, float channelIndex) {
+  vec4 sample = getSample(xyzw);
+  vec2 xy = channelIndex > 1.5 ? sample.zw : sample.xy;
+  return mod(channelIndex, 2.0) > .5 ? xy.y : xy.x;
+}`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/fragment.clip.dashed.js
+/* harmony default export */ const fragment_clip_dashed = (/* glsl */`varying float vClipStrokeWidth;
+varying float vClipStrokeIndex;
+varying vec3  vClipStrokeEven;
+varying vec3  vClipStrokeOdd;
+varying vec3  vClipStrokePosition;
+
+void clipStrokeFragment() {
+  bool odd = mod(vClipStrokeIndex, 2.0) >= 1.0;
+
+  vec3 tangent;
+  if (odd) {
+    tangent = vClipStrokeOdd;
+  }
+  else {
+    tangent = vClipStrokeEven;
+  }
+
+  float travel = dot(vClipStrokePosition, normalize(tangent)) / vClipStrokeWidth;
+  if (mod(travel, 16.0) > 8.0) {
+    discard;
+  }
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/fragment.clip.dotted.js
+/* harmony default export */ const fragment_clip_dotted = (/* glsl */`varying float vClipStrokeWidth;
+varying float vClipStrokeIndex;
+varying vec3  vClipStrokeEven;
+varying vec3  vClipStrokeOdd;
+varying vec3  vClipStrokePosition;
+
+void clipStrokeFragment() {
+  bool odd = mod(vClipStrokeIndex, 2.0) >= 1.0;
+
+  vec3 tangent;
+  if (odd) {
+    tangent = vClipStrokeOdd;
+  }
+  else {
+    tangent = vClipStrokeEven;
+  }
+
+  float travel = dot(vClipStrokePosition, normalize(tangent)) / vClipStrokeWidth;
+  if (mod(travel, 4.0) > 2.0) {
+    discard;
+  }
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/fragment.clip.ends.js
+/* harmony default export */ const fragment_clip_ends = (/* glsl */`varying vec2 vClipEnds;
+
+void clipEndsFragment() {
+  if (vClipEnds.x < 0.0 || vClipEnds.y < 0.0) discard;
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/fragment.clip.proximity.js
+/* harmony default export */ const fragment_clip_proximity = (/* glsl */`varying float vClipProximity;
+
+void clipProximityFragment() {
+  if (vClipProximity >= 0.5) discard;
+}`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/fragment.color.js
+/* harmony default export */ const fragment_color = (/* glsl */`void setFragmentColor(vec4 color) {
+  gl_FragColor = color;
+}`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/fragment.map.rgba.js
+/* harmony default export */ const fragment_map_rgba = (/* glsl */`vec4 fragmentRGBA(vec4 rgba, vec4 stpq) {
+  return rgba;
+}`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/fragment.solid.js
+/* harmony default export */ const fragment_solid = (/* glsl */`void setFragmentColor(vec4 color) {
+  if (color.a < 1.0) discard;
+  gl_FragColor = color;
+}`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/fragment.transparent.js
+/* harmony default export */ const fragment_transparent = (/* glsl */`void setFragmentColor(vec4 color) {
+  if (color.a >= 1.0) discard;
+  gl_FragColor = color;
+}`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/grid.position.js
+/* harmony default export */ const grid_position = (/* glsl */`uniform vec4 gridPosition;
+uniform vec4 gridStep;
+uniform vec4 gridAxis;
+
+vec4 sampleData(vec2 xy);
+
+vec4 getGridPosition(vec4 xyzw) {
+  vec4 onAxis  = gridAxis * sampleData(vec2(xyzw.y, 0.0)).x;
+  vec4 offAxis = gridStep * xyzw.x + gridPosition;
+  return onAxis + offAxis;
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/grow.position.js
+/* harmony default export */ const grow_position = (/* glsl */`uniform float growScale;
+uniform vec4  growMask;
+uniform vec4  growAnchor;
+
+vec4 getSample(vec4 xyzw);
+
+vec4 getGrowSample(vec4 xyzw) {
+  vec4 anchor = xyzw * growMask + growAnchor;
+
+  vec4 position = getSample(xyzw);
+  vec4 center = getSample(anchor);
+
+  return mix(center, position, growScale);
+}`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/join.position.js
+/* harmony default export */ const join_position = (/* glsl */`uniform float joinStride;
+uniform float joinStrideInv;
+
+float getIndex(vec4 xyzw);
+vec4 getRest(vec4 xyzw);
+vec4 injectIndices(float a, float b);
+
+vec4 getJoinXYZW(vec4 xyzw) {
+
+  float a = getIndex(xyzw);
+  float b = a * joinStrideInv;
+
+  float integer  = floor(b);
+  float fraction = b - integer;
+  
+  return injectIndices(fraction * joinStride, integer) + getRest(xyzw);
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/label.alpha.js
+/* harmony default export */ const label_alpha = (/* glsl */`varying float vPixelSize;
+
+vec4 getLabelAlphaColor(vec4 color, vec4 sample) {
+  float mask = clamp(sample.r * 1000.0, 0.0, 1.0);
+  float alpha = (sample.r - .5) * vPixelSize + .5;
+  float a = mask * alpha * color.a;
+  if (a <= 0.0) discard;
+  return vec4(color.xyz, a);
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/label.map.js
+/* harmony default export */ const label_map = (/* glsl */`vec2 mapUV(vec4 uvwo, vec4 stpq) {
+  return uvwo.xy;
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/label.outline.js
+/* harmony default export */ const label_outline = (/* glsl */`uniform float outlineExpand;
+uniform float outlineStep;
+uniform vec3  outlineColor;
+
+varying float vPixelSize;
+
+const float PIXEL_STEP = 255.0 / 16.0;
+
+vec4 getLabelOutlineColor(vec4 color, vec4 sample) {
+  float ps = vPixelSize * PIXEL_STEP;
+  float os = outlineStep;
+
+  float sdf = sample.r - .5 + outlineExpand;
+  vec2  sdfs = vec2(sdf, sdf + os);
+  vec2  alpha = clamp(sdfs * ps + .5, 0.0, 1.0);
+
+  if (alpha.y <= 0.0) {
+    discard;
+  }
+
+  vec3 blend = color.xyz;
+  if (alpha.y > alpha.x) {
+    blend = sqrt(mix(outlineColor * outlineColor, blend * blend, alpha.x));
+  }
+  
+  return vec4(blend, alpha.y * color.a);
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/layer.position.js
+/* harmony default export */ const layer_position = (/* glsl */`uniform vec4 layerScale;
+uniform vec4 layerBias;
+
+vec4 layerPosition(vec4 position, inout vec4 stpq) {
+  return layerScale * position + layerBias;
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/lerp.depth.js
+/* harmony default export */ const lerp_depth = (/* glsl */`// External
+vec4 sampleData(vec4 xyzw);
+
+vec4 lerpDepth(vec4 xyzw) {
+  float x = xyzw.z;
+  float i = floor(x);
+  float f = x - i;
+    
+  vec4 xyzw1 = vec4(xyzw.xy, i, xyzw.w);
+  vec4 xyzw2 = vec4(xyzw.xy, i + 1.0, xyzw.w);
+  
+  vec4 a = sampleData(xyzw1);
+  vec4 b = sampleData(xyzw2);
+
+  return mix(a, b, f);
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/lerp.height.js
+/* harmony default export */ const lerp_height = (/* glsl */`// External
+vec4 sampleData(vec4 xyzw);
+
+vec4 lerpHeight(vec4 xyzw) {
+  float x = xyzw.y;
+  float i = floor(x);
+  float f = x - i;
+    
+  vec4 xyzw1 = vec4(xyzw.x, i, xyzw.zw);
+  vec4 xyzw2 = vec4(xyzw.x, i + 1.0, xyzw.zw);
+  
+  vec4 a = sampleData(xyzw1);
+  vec4 b = sampleData(xyzw2);
+
+  return mix(a, b, f);
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/lerp.items.js
+/* harmony default export */ const lerp_items = (/* glsl */`// External
+vec4 sampleData(vec4 xyzw);
+
+vec4 lerpItems(vec4 xyzw) {
+  float x = xyzw.w;
+  float i = floor(x);
+  float f = x - i;
+    
+  vec4 xyzw1 = vec4(xyzw.xyz, i);
+  vec4 xyzw2 = vec4(xyzw.xyz, i + 1.0);
+  
+  vec4 a = sampleData(xyzw1);
+  vec4 b = sampleData(xyzw2);
+
+  return mix(a, b, f);
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/lerp.width.js
+/* harmony default export */ const lerp_width = (/* glsl */`// External
+vec4 sampleData(vec4 xyzw);
+
+vec4 lerpWidth(vec4 xyzw) {
+  float x = xyzw.x;
+  float i = floor(x);
+  float f = x - i;
+    
+  vec4 xyzw1 = vec4(i, xyzw.yzw);
+  vec4 xyzw2 = vec4(i + 1.0, xyzw.yzw);
+  
+  vec4 a = sampleData(xyzw1);
+  vec4 b = sampleData(xyzw2);
+
+  return mix(a, b, f);
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/line.position.js
+/* harmony default export */ const line_position = (/* glsl */`// Units and calibration
+uniform float worldUnit;
+uniform float lineWidth;
+uniform float lineDepth;
+uniform float focusDepth;
+
+// General data index
+uniform vec4 geometryClip;
+attribute vec4 position4;
+
+// (Start/mid/end -1/0/1, top/bottom -1,1)
+attribute vec2 line;
+
+// 0...1 for round or bevel joins
+#ifdef LINE_JOIN_DETAIL
+attribute float joint;
+#else
+const float joint = 0.0;
+#endif
+
+// Knock out excessively long line segments (e.g. for asymtpotes)
+#ifdef LINE_PROXIMITY
+uniform float lineProximity;
+varying float vClipProximity;
+#endif
+
+// Ghetto line stroking (local only, not global)
+#ifdef LINE_STROKE
+varying float vClipStrokeWidth;
+varying float vClipStrokeIndex;
+varying vec3  vClipStrokeEven;
+varying vec3  vClipStrokeOdd;
+varying vec3  vClipStrokePosition;
+#endif
+
+// External
+vec3 getPosition(vec4 xyzw, float canonical);
+
+// Clip line ends for arrows / decoration
+#ifdef LINE_CLIP
+uniform float clipRange;
+uniform vec2  clipStyle;
+uniform float clipSpace;
+
+attribute vec2 strip;
+
+varying vec2 vClipEnds;
+
+void clipEnds(vec4 xyzw, vec3 center, vec3 pos) {
+
+  // Sample end of line strip
+  vec4 xyzwE = vec4(strip.y, xyzw.yzw);
+  vec3 end   = getPosition(xyzwE, 0.0);
+
+  // Sample start of line strip
+  vec4 xyzwS = vec4(strip.x, xyzw.yzw);
+  vec3 start = getPosition(xyzwS, 0.0);
+
+  // Measure length
+  vec3 diff = end - start;
+  float l = length(diff) * clipSpace;
+
+  // Arrow length (=2.5x radius)
+  float arrowSize = 1.25 * clipRange * lineWidth * worldUnit;
+
+  vClipEnds = vec2(1.0);
+
+  if (clipStyle.y > 0.0) {
+    // Depth blend end
+    float depth = focusDepth;
+    if (lineDepth < 1.0) {
+      float z = max(0.00001, -end.z);
+      depth = mix(z, focusDepth, lineDepth);
+    }
+
+    // Absolute arrow length
+    float size = arrowSize * depth;
+
+    // Adjust clip range
+    // Approach linear scaling with cubic ease the smaller we get
+    float mini = clamp(1.0 - l / size * .333, 0.0, 1.0);
+    float scale = 1.0 - mini * mini * mini;
+    float invrange = 1.0 / (size * scale);
+
+    // Clip end
+    diff = end - center;
+    if(diff == vec3(0.0))
+      vClipEnds.x = -1.0;
+    else {
+      diff = normalize(end - center);
+      float d = dot(end - pos, diff);
+      vClipEnds.x = d * invrange - 1.0;
+    }
+  }
+
+  if (clipStyle.x > 0.0) {
+    // Depth blend start
+    float depth = focusDepth;
+    if (lineDepth < 1.0) {
+      float z = max(0.00001, -start.z);
+      depth = mix(z, focusDepth, lineDepth);
+    }
+
+    // Absolute arrow length
+    float size = arrowSize * depth;
+
+    // Adjust clip range
+    // Approach linear scaling with cubic ease the smaller we get
+    float mini = clamp(1.0 - l / size * .333, 0.0, 1.0);
+    float scale = 1.0 - mini * mini * mini;
+    float invrange = 1.0 / (size * scale);
+
+    // Clip start
+    diff = center - start;
+    if(diff == vec3(0.0))
+      vClipEnds.y = -1.0;
+    else {
+      diff = normalize(center - start);
+      float d = dot(pos - start, diff);
+      vClipEnds.y = d * invrange - 1.0;
+    }
+  }
+
+
+}
+#endif
+
+// Adjust left/center/right to be inside near/far z range
+const float epsilon = 1e-5;
+void fixCenter(inout vec3 left, inout vec3 center, inout vec3 right) {
+  if (center.z >= 0.0) {
+    if (left.z < 0.0) {
+      float d = (center.z + epsilon) / (center.z - left.z);
+      center = mix(center, left, d);
+    }
+    else if (right.z < 0.0) {
+      float d = (center.z + epsilon) / (center.z - right.z);
+      center = mix(center, right, d);
+    }
+  }
+
+  if (left.z >= 0.0) {
+    if (center.z < 0.0) {
+      float d = (left.z + epsilon) / (left.z - center.z);
+      left = mix(left, center, d);
+    }
+  }
+
+  if (right.z >= 0.0) {
+    if (center.z < 0.0) {
+      float d = (right.z + epsilon) / (right.z - center.z);
+      right = mix(right, center, d);
+    }
+  }
+}
+
+// Sample the source data in an edge-aware manner
+void getLineGeometry(vec4 xyzw, float edge, out vec3 left, out vec3 center, out vec3 right) {
+  vec4 delta = vec4(1.0, 0.0, 0.0, 0.0);
+
+  center =                 getPosition(xyzw, 1.0);
+  left   = (edge > -0.5) ? getPosition(xyzw - delta, 0.0) : center;
+  right  = (edge < 0.5)  ? getPosition(xyzw + delta, 0.0) : center;
+}
+
+// Calculate the position for a vertex along the line, including joins
+vec3 getLineJoin(float edge, bool odd, vec3 left, vec3 center, vec3 right, float width, float offset, float joint) {
+  vec2 join = vec2(1.0, 0.0);
+
+  fixCenter(left, center, right);
+
+  vec4 a = vec4(left.xy, right.xy);
+  vec4 b = a / vec4(left.zz, right.zz);
+
+  vec2 l = b.xy;
+  vec2 r = b.zw;
+  vec2 c = center.xy / center.z;
+
+  vec4 d = vec4(l, c) - vec4(c, r);
+  float l1 = dot(d.xy, d.xy);
+  float l2 = dot(d.zw, d.zw);
+
+  if (l1 + l2 > 0.0) {
+
+    if (edge > 0.5 || l2 == 0.0) {
+      vec2 nl = normalize(d.xy);
+      vec2 tl = vec2(nl.y, -nl.x);
+
+#ifdef LINE_PROXIMITY
+      vClipProximity = 1.0;
+#endif
+
+#ifdef LINE_STROKE
+      vClipStrokeEven = vClipStrokeOdd = normalize(left - center);
+#endif
+      join = tl;
+    }
+    else if (edge < -0.5 || l1 == 0.0) {
+      vec2 nr = normalize(d.zw);
+      vec2 tr = vec2(nr.y, -nr.x);
+
+#ifdef LINE_PROXIMITY
+      vClipProximity = 1.0;
+#endif
+
+#ifdef LINE_STROKE
+      vClipStrokeEven = vClipStrokeOdd = normalize(center - right);
+#endif
+      join = tr;
+    }
+    else {
+      // Limit join stretch for tiny segments
+      float lmin2 = min(l1, l2) / (width * width);
+
+      // Hide line segment if ratio of leg lengths exceeds promixity threshold
+#ifdef LINE_PROXIMITY
+      float lr     = l1 / l2;
+      float rl     = l2 / l1;
+      float ratio  = max(lr, rl);
+      float thresh = lineProximity + 1.0;
+      vClipProximity = (ratio > thresh * thresh) ? 1.0 : 0.0;
+#endif
+
+      // Calculate normals/tangents
+      vec2 nl = normalize(d.xy);
+      vec2 nr = normalize(d.zw);
+
+      // Calculate tangents
+      vec2 tl = vec2(nl.y, -nl.x);
+      vec2 tr = vec2(nr.y, -nr.x);
+
+#ifdef LINE_PROXIMITY
+      // Mix tangents according to leg lengths
+      vec2 tc = normalize(mix(tl, tr, l1/(l1+l2)));
+#else
+      // Average tangent
+      vec2 tc = normalize(tl + tr);
+#endif
+
+      // Miter join
+      float cosA   = dot(nl, tc);
+      float sinA   = max(0.1, abs(dot(tl, tc)));
+      float factor = cosA / sinA;
+      float scale  = sqrt(1.0 + min(lmin2, factor * factor));
+
+      // Stroke normals
+#ifdef LINE_STROKE
+      vec3 stroke1 = normalize(left - center);
+      vec3 stroke2 = normalize(center - right);
+
+      if (odd) {
+        vClipStrokeEven = stroke1;
+        vClipStrokeOdd  = stroke2;
+      }
+      else {
+        vClipStrokeEven = stroke2;
+        vClipStrokeOdd  = stroke1;
+      }
+#endif
+
+#ifdef LINE_JOIN_MITER
+      // Apply straight up miter
+      join = tc * scale;
+#endif
+
+#ifdef LINE_JOIN_ROUND
+      // Slerp bevel join into circular arc
+      float dotProduct = dot(nl, nr);
+      float angle = acos(dotProduct);
+      float sinT  = sin(angle);
+      join = (sin((1.0 - joint) * angle) * tl + sin(joint * angle) * tr) / sinT;
+#endif
+
+#ifdef LINE_JOIN_BEVEL
+      // Direct bevel join between two flat ends
+      float dotProduct = dot(nl, nr);
+      join = mix(tl, tr, joint);
+#endif
+
+#ifdef LINE_JOIN_DETAIL
+      // Check if on inside or outside of joint
+      float crossProduct = nl.x * nr.y - nl.y * nr.x;
+      if (offset * crossProduct < 0.0) {
+        // For near-180-degree bends, correct back to a miter to avoid discontinuities
+        float ratio = clamp(-dotProduct * 2.0 - 1.0, 0.0, 1.0);
+        // Otherwise collapse the inside vertices into one.
+        join = mix(tc * scale, join, ratio * ratio * ratio);
+      }
+#endif
+
+    }
+    return vec3(join, 0.0);
+  }
+  else {
+    return vec3(0.0);
+  }
+
+}
+
+// Calculate final line position
+vec3 getLinePosition() {
+  vec3 left, center, right, join;
+
+  // left/center/right
+  float edge = line.x;
+  // up/down
+  float offset = line.y;
+
+  // Clip data
+  vec4 p = min(geometryClip, position4);
+  edge += max(0.0, position4.x - geometryClip.x);
+
+  // Get position + adjacent neighbours
+  getLineGeometry(p, edge, left, center, right);
+
+#ifdef LINE_STROKE
+  // Set parameters for line stroke fragment shader
+  vClipStrokePosition = center;
+  vClipStrokeIndex = p.x;
+  bool odd = mod(p.x, 2.0) >= 1.0;
+#else
+  bool odd = true;
+#endif
+
+  // Divide line width up/down
+  float width = lineWidth * 0.5;
+
+  float depth = focusDepth;
+  if (lineDepth < 1.0) {
+    // Depth blending
+    float z = max(0.00001, -center.z);
+    depth = mix(z, focusDepth, lineDepth);
+  }
+  width *= depth;
+
+  // Convert to world units
+  width *= worldUnit;
+
+  // Calculate line join
+  join = getLineJoin(edge, odd, left, center, right, width, offset, joint);
+  vec3 pos = center + join * offset * width;
+
+#ifdef LINE_STROKE
+  vClipStrokeWidth = width;
+#endif
+
+#ifdef LINE_CLIP
+  clipEnds(p, center, pos);
+#endif
+
+  return pos;
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/map.2d.data.js
+/* harmony default export */ const map_2d_data = (/* glsl */`uniform vec2 dataResolution;
+uniform vec2 dataPointer;
+
+vec2 map2DData(vec2 xy) {
+  return (xy + dataPointer) * dataResolution;
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/map.2d.data.wrap.js
+/* harmony default export */ const map_2d_data_wrap = (/* glsl */`uniform vec2 dataResolution;
+uniform vec2 dataPointer;
+
+vec2 map2DData(vec2 xy) {
+  return fract((xy + dataPointer) * dataResolution);
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/map.xyzw.2dv.js
+/* harmony default export */ const map_xyzw_2dv = (/* glsl */`void mapXyzw2DV(vec4 xyzw, out vec2 xy, out float z) {
+  xy = xyzw.xy;
+  z  = xyzw.z;
+}
+
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/map.xyzw.align.js
+/* harmony default export */ const map_xyzw_align = (/* glsl */`vec4 alignXYZW(vec4 xyzw) {
+  return floor(xyzw + .5);
+}
+
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/map.xyzw.texture.js
+/* harmony default export */ const map_xyzw_texture = (/* glsl */`uniform float textureItems;
+uniform float textureHeight;
+
+vec2 mapXyzwTexture(vec4 xyzw) {
+  
+  float x = xyzw.x;
+  float y = xyzw.y;
+  float z = xyzw.z;
+  float i = xyzw.w;
+  
+  return vec2(i, y) + vec2(x, z) * vec2(textureItems, textureHeight);
+}
+
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/mesh.fragment.color.js
+/* harmony default export */ const mesh_fragment_color = (/* glsl */`varying vec4 vColor;
+
+vec4 getColor() {
+  return vColor;
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/mesh.fragment.map.js
+/* harmony default export */ const mesh_fragment_map = (/* glsl */`#ifdef POSITION_STPQ
+varying vec4 vSTPQ;
+#endif
+#ifdef POSITION_U
+varying float vU;
+#endif
+#ifdef POSITION_UV
+varying vec2 vUV;
+#endif
+#ifdef POSITION_UVW
+varying vec3 vUVW;
+#endif
+#ifdef POSITION_UVWO
+varying vec4 vUVWO;
+#endif
+
+vec4 getSample(vec4 uvwo, vec4 stpq);
+
+vec4 getMapColor() {
+  #ifdef POSITION_STPQ
+  vec4 stpq = vSTPQ;
+  #else
+  vec4 stpq = vec4(0.0);
+  #endif
+
+  #ifdef POSITION_U
+  vec4 uvwo = vec4(vU, 0.0, 0.0, 0.0);
+  #endif
+  #ifdef POSITION_UV
+  vec4 uvwo = vec4(vUV, 0.0, 0.0);
+  #endif
+  #ifdef POSITION_UVW
+  vec4 uvwo = vec4(vUVW, 0.0);
+  #endif
+  #ifdef POSITION_UVWO
+  vec4 uvwo = vec4(vUVWO);
+  #endif
+
+  return getSample(uvwo, stpq);
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/mesh.fragment.mask.js
+/* harmony default export */ const mesh_fragment_mask = (/* glsl */`varying float vMask;
+
+float ease(float t) {
+  t = clamp(t, 0.0, 1.0);
+  return t * t * (3.0 - 2.0 * t);
+}
+
+vec4 maskColor() {
+  if (vMask <= 0.0) discard;
+  return vec4(vec3(1.0), ease(vMask));
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/mesh.fragment.material.js
+/* harmony default export */ const mesh_fragment_material = (/* glsl */`#ifdef POSITION_STPQ
+varying vec4 vSTPQ;
+#endif
+#ifdef POSITION_U
+varying float vU;
+#endif
+#ifdef POSITION_UV
+varying vec2 vUV;
+#endif
+#ifdef POSITION_UVW
+varying vec3 vUVW;
+#endif
+#ifdef POSITION_UVWO
+varying vec4 vUVWO;
+#endif
+
+vec4 getSample(vec4 rgba, vec4 stpq);
+
+vec4 getMaterialColor(vec4 rgba) {
+  vec4 stpq = vec4(0.0);
+
+  #ifdef POSITION_U
+  stpq.x = vU;
+  #endif
+  #ifdef POSITION_UV
+  stpq.xy = vUV;
+  #endif
+  #ifdef POSITION_UVW
+  stpq.xyz = vUVW;
+  #endif
+  #ifdef POSITION_UVWO
+  stpq = vUVWO;
+  #endif
+
+  #ifdef POSITION_STPQ
+  stpq = vSTPQ;
+  #endif
+
+  return getSample(rgba, stpq);
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/mesh.fragment.shaded.js
+/* harmony default export */ const mesh_fragment_shaded = (/* glsl */`varying vec3 vNormal;
+varying vec3 vLight;
+varying vec3 vPosition;
+
+vec3 offSpecular(vec3 color) {
+  vec3 c = 1.0 - color;
+  return 1.0 - c * c;
+}
+
+vec4 getShadedColor(vec4 rgba) {
+  
+  vec3 color = rgba.xyz;
+  vec3 color2 = offSpecular(rgba.xyz);
+
+  vec3 normal = normalize(vNormal);
+  vec3 light = normalize(vLight);
+  vec3 position = normalize(vPosition);
+  
+  float side    = gl_FrontFacing ? -1.0 : 1.0;
+  float cosine  = side * dot(normal, light);
+  float diffuse = mix(max(0.0, cosine), .5 + .5 * cosine, .1);
+  
+  vec3  halfLight = normalize(light + position);
+	float cosineHalf = max(0.0, side * dot(normal, halfLight));
+	float specular = pow(cosineHalf, 16.0);
+	
+	return vec4(color * (diffuse * .9 + .05) + .25 * color2 * specular, rgba.a);
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/mesh.fragment.texture.js
+/* harmony default export */ const mesh_fragment_texture = (/* glsl */``);
+;// CONCATENATED MODULE: ./src/shaders/glsl/mesh.gamma.in.js
+/* harmony default export */ const mesh_gamma_in = (/* glsl */`vec4 getGammaInColor(vec4 rgba) {
+  return vec4(rgba.rgb * rgba.rgb, rgba.a);
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/mesh.gamma.out.js
+/* harmony default export */ const mesh_gamma_out = (/* glsl */`vec4 getGammaOutColor(vec4 rgba) {
+  return vec4(sqrt(rgba.rgb), rgba.a);
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/mesh.map.uvwo.js
+/* harmony default export */ const mesh_map_uvwo = (/* glsl */`vec4 mapUVWO(vec4 uvwo, vec4 stpq) {
+  return uvwo;
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/mesh.position.js
+/* harmony default export */ const mesh_position = (/* glsl */`uniform vec4 geometryClip;
+attribute vec4 position4;
+
+// External
+vec3 getPosition(vec4 xyzw, float canonical);
+
+vec3 getMeshPosition() {
+  vec4 p = min(geometryClip, position4);
+  return getPosition(p, 1.0);
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/mesh.vertex.color.js
+/* harmony default export */ const mesh_vertex_color = (/* glsl */`attribute vec4 position4;
+uniform vec4 geometryClip;
+varying vec4 vColor;
+
+// External
+vec4 getSample(vec4 xyzw);
+
+void vertexColor() {
+  vec4 p = min(geometryClip, position4);
+  vColor = getSample(p);
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/mesh.vertex.mask.js
+/* harmony default export */ const mesh_vertex_mask = (/* glsl */`attribute vec4 position4;
+uniform vec4 geometryResolution;
+uniform vec4 geometryClip;
+varying float vMask;
+
+// External
+float getSample(vec4 xyzw);
+
+void maskLevel() {
+  vec4 p = min(geometryClip, position4);
+  vMask = getSample(p * geometryResolution);
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/mesh.vertex.position.js
+/* harmony default export */ const mesh_vertex_position = (/* glsl */`uniform vec4 geometryResolution;
+
+#ifdef POSITION_STPQ
+varying vec4 vSTPQ;
+#endif
+#ifdef POSITION_U
+varying float vU;
+#endif
+#ifdef POSITION_UV
+varying vec2 vUV;
+#endif
+#ifdef POSITION_UVW
+varying vec3 vUVW;
+#endif
+#ifdef POSITION_UVWO
+varying vec4 vUVWO;
+#endif
+
+// External
+vec3 getPosition(vec4 xyzw, in vec4 stpqIn, out vec4 stpqOut);
+
+vec3 getMeshPosition(vec4 xyzw, float canonical) {
+  vec4 stpqOut, stpqIn = xyzw * geometryResolution;
+  vec3 xyz = getPosition(xyzw, stpqIn, stpqOut);
+
+  #ifdef POSITION_MAP
+  if (canonical > 0.5) {
+    #ifdef POSITION_STPQ
+    vSTPQ = stpqOut;
+    #endif
+    #ifdef POSITION_U
+    vU = stpqOut.x;
+    #endif
+    #ifdef POSITION_UV
+    vUV = stpqOut.xy;
+    #endif
+    #ifdef POSITION_UVW
+    vUVW = stpqOut.xyz;
+    #endif
+    #ifdef POSITION_UVWO
+    vUVWO = stpqOut;
+    #endif
+  }
+  #endif
+  return xyz;
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/move.position.js
+/* harmony default export */ const move_position = (/* glsl */`uniform float transitionEnter;
+uniform float transitionExit;
+uniform vec4  transitionScale;
+uniform vec4  transitionBias;
+uniform float transitionSkew;
+uniform float transitionActive;
+
+uniform vec4  moveFrom;
+uniform vec4  moveTo;
+
+float ease(float t) {
+  t = clamp(t, 0.0, 1.0);
+  return 1.0 - (2.0 - t) * t;
+}
+
+vec4 getTransitionPosition(vec4 xyzw, inout vec4 stpq) {
+  if (transitionActive < 0.5) return xyzw;
+
+  float enter   = transitionEnter;
+  float exit    = transitionExit;
+  float skew    = transitionSkew;
+  vec4  scale   = transitionScale;
+  vec4  bias    = transitionBias;
+
+  float factor  = 1.0 + skew;
+  float offset  = dot(vec4(1.0), stpq * scale + bias);
+
+  float a1 = ease(enter * factor - offset);
+  float a2 = ease(exit  * factor + offset - skew);
+
+  return xyzw + a1 * moveFrom + a2 * moveTo;
+}`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/object.mask.default.js
+/* harmony default export */ const object_mask_default = (/* glsl */`vec4 getMask(vec4 xyzw) {
+  return vec4(1.0);
+}`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/point.alpha.circle.js
+/* harmony default export */ const point_alpha_circle = (/* glsl */`varying float vPixelSize;
+
+float getDiscAlpha(float mask) {
+  // Approximation: 1 - x*x is approximately linear around x = 1 with slope 2
+  return vPixelSize * (1.0 - mask);
+  //  return vPixelSize * 2.0 * (1.0 - sqrt(mask));
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/point.alpha.circle.hollow.js
+/* harmony default export */ const point_alpha_circle_hollow = (/* glsl */`varying float vPixelSize;
+
+float getDiscHollowAlpha(float mask) {
+  return vPixelSize * (0.5 - 2.0 * abs(sqrt(mask) - .75));
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/point.alpha.generic.js
+/* harmony default export */ const point_alpha_generic = (/* glsl */`varying float vPixelSize;
+
+float getGenericAlpha(float mask) {
+  return vPixelSize * 2.0 * (1.0 - mask);
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/point.alpha.generic.hollow.js
+/* harmony default export */ const point_alpha_generic_hollow = (/* glsl */`varying float vPixelSize;
+
+float getGenericHollowAlpha(float mask) {
+  return vPixelSize * (0.5 - 2.0 * abs(mask - .75));
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/point.edge.js
+/* harmony default export */ const point_edge = (/* glsl */`varying vec2 vSprite;
+
+float getSpriteMask(vec2 xy);
+float getSpriteAlpha(float mask);
+
+void setFragmentColorFill(vec4 color) {
+  float mask = getSpriteMask(vSprite);
+  if (mask > 1.0) {
+    discard;
+  }
+  float alpha = getSpriteAlpha(mask);
+  if (alpha >= 1.0) {
+    discard;
+  }
+  gl_FragColor = vec4(color.rgb, alpha * color.a);
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/point.fill.js
+/* harmony default export */ const point_fill = (/* glsl */`varying vec2 vSprite;
+
+float getSpriteMask(vec2 xy);
+float getSpriteAlpha(float mask);
+
+void setFragmentColorFill(vec4 color) {
+  float mask = getSpriteMask(vSprite);
+  if (mask > 1.0) {
+    discard;
+  }
+  float alpha = getSpriteAlpha(mask);
+  if (alpha < 1.0) {
+    discard;
+  }
+  gl_FragColor = color;
+}
+
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/point.mask.circle.js
+/* harmony default export */ const point_mask_circle = (/* glsl */`varying float vPixelSize;
+
+float getCircleMask(vec2 uv) {
+  return dot(uv, uv);
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/point.mask.diamond.js
+/* harmony default export */ const point_mask_diamond = (/* glsl */`varying float vPixelSize;
+
+float getDiamondMask(vec2 uv) {
+  vec2 a = abs(uv);
+  return a.x + a.y;
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/point.mask.down.js
+/* harmony default export */ const point_mask_down = (/* glsl */`varying float vPixelSize;
+
+float getTriangleDownMask(vec2 uv) {
+  uv.y += .25;
+  return max(uv.y, abs(uv.x) * .866 - uv.y * .5 + .6);
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/point.mask.left.js
+/* harmony default export */ const point_mask_left = (/* glsl */`varying float vPixelSize;
+
+float getTriangleLeftMask(vec2 uv) {
+  uv.x += .25;
+  return max(uv.x, abs(uv.y) * .866 - uv.x * .5 + .6);
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/point.mask.right.js
+/* harmony default export */ const point_mask_right = (/* glsl */`varying float vPixelSize;
+
+float getTriangleRightMask(vec2 uv) {
+  uv.x -= .25;
+  return max(-uv.x, abs(uv.y) * .866 + uv.x * .5 + .6);
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/point.mask.square.js
+/* harmony default export */ const point_mask_square = (/* glsl */`varying float vPixelSize;
+
+float getSquareMask(vec2 uv) {
+  vec2 a = abs(uv);
+  return max(a.x, a.y);
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/point.mask.up.js
+/* harmony default export */ const point_mask_up = (/* glsl */`varying float vPixelSize;
+
+float getTriangleUpMask(vec2 uv) {
+  uv.y -= .25;
+  return max(-uv.y, abs(uv.x) * .866 + uv.y * .5 + .6);
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/point.position.js
+/* harmony default export */ const point_position = (/* glsl */`uniform float pointDepth;
+
+uniform float pixelUnit;
+uniform float renderScale;
+uniform float renderScaleInv;
+uniform float focusDepth;
+
+uniform vec4 geometryClip;
+attribute vec4 position4;
+attribute vec2 sprite;
+
+varying vec2 vSprite;
+varying float vPixelSize;
+
+const float pointScale = POINT_SHAPE_SCALE;
+
+// External
+float getPointSize(vec4 xyzw);
+vec3 getPosition(vec4 xyzw, float canonical);
+
+vec3 getPointPosition() {
+  vec4 p = min(geometryClip, position4);
+  vec3 center = getPosition(p, 1.0);
+
+  // Depth blending
+  // TODO: orthographic camera
+  // Workaround: set depth = 0
+  float z = -center.z;
+  float depth = mix(z, focusDepth, pointDepth);
+  
+  // Match device/unit mapping 
+  // Sprite goes from -1..1, width = 2.
+  float pointSize = getPointSize(p);
+  float size = pointScale * pointSize * pixelUnit * .5;
+  float depthSize = depth * size;
+  
+  // Pad sprite by half a pixel to make the anti-aliasing straddle the pixel edge
+  // Note: pixelsize measures radius
+  float pixelSize = .5 * (pointDepth > 0.0 ? depthSize / z : size);
+  float paddedSize = pixelSize + 0.5;
+  float padFactor = paddedSize / pixelSize;
+
+  vPixelSize = paddedSize;
+  vSprite    = sprite;
+
+  return center + vec3(sprite * depthSize * renderScaleInv * padFactor, 0.0);
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/point.size.uniform.js
+/* harmony default export */ const point_size_uniform = (/* glsl */`uniform float pointSize;
+
+float getPointSize(vec4 xyzw) {
+  return pointSize;
+}`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/point.size.varying.js
+/* harmony default export */ const point_size_varying = (/* glsl */`uniform float pointSize;
+
+vec4 getSample(vec4 xyzw);
+
+float getPointSize(vec4 xyzw) {
+  return pointSize * getSample(xyzw).x;
+}`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/polar.position.js
+/* harmony default export */ const polar_position = (/* glsl */`uniform float polarBend;
+uniform float polarFocus;
+uniform float polarAspect;
+uniform float polarHelix;
+
+uniform mat4 viewMatrix;
+
+vec4 getPolarPosition(vec4 position, inout vec4 stpq) {
+  if (polarBend > 0.0) {
+
+    if (polarBend < 0.001) {
+      // Factor out large addition/subtraction of polarFocus
+      // to avoid numerical error
+      // sin(x) ~ x
+      // cos(x) ~ 1 - x * x / 2
+      vec2 pb = position.xy * polarBend;
+      float ppbbx = pb.x * pb.x;
+      return viewMatrix * vec4(
+        position.x * (1.0 - polarBend + (pb.y * polarAspect)),
+        position.y * (1.0 - .5 * ppbbx) - (.5 * ppbbx) * polarFocus / polarAspect,
+        position.z + position.x * polarHelix * polarBend,
+        1.0
+      );
+    }
+    else {
+      vec2 xy = position.xy * vec2(polarBend, polarAspect);
+      float radius = polarFocus + xy.y;
+      return viewMatrix * vec4(
+        sin(xy.x) * radius,
+        (cos(xy.x) * radius - polarFocus) / polarAspect,
+        position.z + position.x * polarHelix * polarBend,
+        1.0
+      );
+    }
+  }
+  else {
+    return viewMatrix * vec4(position.xyz, 1.0);
+  }
+}`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/project.position.js
+/* harmony default export */ const project_position = (/* glsl */`uniform float styleZBias;
+uniform float styleZIndex;
+
+void setPosition(vec3 position) {
+  vec4 pos = projectionMatrix * vec4(position, 1.0);
+
+  // Apply relative Z bias
+  float bias  = (1.0 - styleZBias / 32768.0);
+  pos.z *= bias;
+  
+  // Apply large scale Z index changes
+  if (styleZIndex > 0.0) {
+    float z = pos.z / pos.w;
+    pos.z = ((z + 1.0) / (styleZIndex + 1.0) - 1.0) * pos.w;
+  }
+  
+  gl_Position = pos;
+}`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/project.readback.js
+/* harmony default export */ const project_readback = (/* glsl */`// This is three.js' global uniform, missing from fragment shaders.
+uniform mat4 projectionMatrix;
+
+vec4 readbackPosition(vec3 position, vec4 stpq) {
+  vec4 pos = projectionMatrix * vec4(position, 1.0);
+  vec3 final = pos.xyz / pos.w;
+  if (final.z < -1.0) {
+    return vec4(0.0, 0.0, 0.0, -1.0);
+  }
+  else {
+    return vec4(final, -position.z);
+  }
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/raw.position.scale.js
+/* harmony default export */ const raw_position_scale = (/* glsl */`uniform vec4 geometryScale;
+attribute vec4 position4;
+
+vec4 getRawPositionScale() {
+  return geometryScale * position4;
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/repeat.position.js
+/* harmony default export */ const repeat_position = (/* glsl */`uniform vec4 repeatModulus;
+
+vec4 getRepeatXYZW(vec4 xyzw) {
+  return mod(xyzw + .5, repeatModulus) - .5;
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/resample.padding.js
+/* harmony default export */ const resample_padding = (/* glsl */`uniform vec4 resampleBias;
+
+vec4 resamplePadding(vec4 xyzw) {
+  return xyzw + resampleBias;
+}`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/resample.relative.js
+/* harmony default export */ const resample_relative = (/* glsl */`uniform vec4 resampleFactor;
+
+vec4 resampleRelative(vec4 xyzw) {
+  return xyzw * resampleFactor;
+}`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/reveal.mask.js
+/* harmony default export */ const reveal_mask = (/* glsl */`uniform float transitionEnter;
+uniform float transitionExit;
+uniform vec4  transitionScale;
+uniform vec4  transitionBias;
+uniform float transitionSkew;
+uniform float transitionActive;
+
+float getTransitionSDFMask(vec4 stpq) {
+  if (transitionActive < 0.5) return 1.0;
+
+  float enter   = transitionEnter;
+  float exit    = transitionExit;
+  float skew    = transitionSkew;
+  vec4  scale   = transitionScale;
+  vec4  bias    = transitionBias;
+
+  float factor  = 1.0 + skew;
+  float offset  = dot(vec4(1.0), stpq * scale + bias);
+
+  vec2 d = vec2(enter, exit) * factor + vec2(-offset, offset - skew);
+  if (exit  == 1.0) return d.x;
+  if (enter == 1.0) return d.y;
+  return min(d.x, d.y);
+}`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/root.position.js
+/* harmony default export */ const root_position = (/* glsl */`vec3 getRootPosition(vec4 position, in vec4 stpqIn, out vec4 stpqOut) {
+  stpqOut = stpqIn; // avoid inout confusion
+  return position.xyz;
+}`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/sample.2d.js
+/* harmony default export */ const sample_2d = (/* glsl */`uniform sampler2D dataTexture;
+
+vec4 sample2D(vec2 uv) {
+  return texture2D(dataTexture, uv);
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/scale.position.js
+/* harmony default export */ const scale_position = (/* glsl */`uniform vec4 scaleAxis;
+uniform vec4 scaleOffset;
+
+vec4 sampleData(float x);
+
+vec4 getScalePosition(vec4 xyzw) {
+  return scaleAxis * sampleData(xyzw.x).x + scaleOffset;
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/screen.map.stpq.js
+/* harmony default export */ const screen_map_stpq = (/* glsl */`uniform vec4 remapSTPQScale;
+
+vec4 screenMapSTPQ(vec4 xyzw, out vec4 stpq) {
+  stpq = xyzw * remapSTPQScale;
+  return xyzw;
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/screen.map.xy.js
+/* harmony default export */ const screen_map_xy = (/* glsl */`uniform vec2 remapUVScale;
+
+vec4 screenMapXY(vec4 uvwo, vec4 stpq) {
+  return vec4(floor(remapUVScale * uvwo.xy), 0.0, 0.0);
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/screen.map.xyzw.js
+/* harmony default export */ const screen_map_xyzw = (/* glsl */`uniform vec2 remapUVScale;
+uniform vec2 remapModulus;
+uniform vec2 remapModulusInv;
+
+vec4 screenMapXYZW(vec4 uvwo, vec4 stpq) {
+  vec2 st = floor(remapUVScale * uvwo.xy);
+  vec2 xy = st * remapModulusInv;
+  vec2 ixy = floor(xy);
+  vec2 fxy = xy - ixy;
+  vec2 zw = fxy * remapModulus;
+  return vec4(ixy.x, zw.y, ixy.y, zw.x);
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/screen.pass.uv.js
+/* harmony default export */ const screen_pass_uv = (/* glsl */`vec2 screenPassUV(vec4 uvwo, vec4 stpq) {
+  return uvwo.xy;
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/screen.position.js
+/* harmony default export */ const screen_position = (/* glsl */`void setScreenPosition(vec4 position) {
+  gl_Position = vec4(position.xy * 2.0 - 1.0, 0.5, 1.0);
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/slice.position.js
+/* harmony default export */ const slice_position = (/* glsl */`uniform vec4 sliceOffset;
+
+vec4 getSliceOffset(vec4 xyzw) {
+  return xyzw + sliceOffset;
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/spherical.position.js
+/* harmony default export */ const spherical_position = (/* glsl */`uniform float sphericalBend;
+uniform float sphericalFocus;
+uniform float sphericalAspectX;
+uniform float sphericalAspectY;
+uniform float sphericalScaleY;
+
+uniform mat4 viewMatrix;
+
+vec4 getSphericalPosition(vec4 position, inout vec4 stpq) {
+  if (sphericalBend > 0.0001) {
+
+    vec3 xyz = position.xyz * vec3(sphericalBend, sphericalBend / sphericalAspectY * sphericalScaleY, sphericalAspectX);
+    float radius = sphericalFocus + xyz.z;
+    float cosine = cos(xyz.y) * radius;
+
+    return viewMatrix * vec4(
+      sin(xyz.x) * cosine,
+      sin(xyz.y) * radius * sphericalAspectY,
+      (cos(xyz.x) * cosine - sphericalFocus) / sphericalAspectX,
+      1.0
+    );
+  }
+  else {
+    return viewMatrix * vec4(position.xyz, 1.0);
+  }
+}`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/split.position.js
+/* harmony default export */ const split_position = (/* glsl */`uniform float splitStride;
+
+vec2 getIndices(vec4 xyzw);
+vec4 getRest(vec4 xyzw);
+vec4 injectIndex(float v);
+
+vec4 getSplitXYZW(vec4 xyzw) {
+  vec2 uv = getIndices(xyzw);
+  float offset = uv.x + uv.y * splitStride;
+  return injectIndex(offset) + getRest(xyzw);
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/spread.position.js
+/* harmony default export */ const spread_position = (/* glsl */`uniform vec4 spreadOffset;
+uniform mat4 spreadMatrix;
+
+// External
+vec4 getSample(vec4 xyzw);
+
+vec4 getSpreadSample(vec4 xyzw) {
+  vec4 sample = getSample(xyzw);
+  return sample + spreadMatrix * (spreadOffset + xyzw);
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/sprite.fragment.js
+/* harmony default export */ const sprite_fragment = (/* glsl */`varying vec2 vSprite;
+
+vec4 getSample(vec2 xy);
+
+vec4 getSpriteColor() {
+  return getSample(vSprite);
+}`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/sprite.position.js
+/* harmony default export */ const sprite_position = (/* glsl */`uniform vec2 spriteOffset;
+uniform float spriteScale;
+uniform float spriteDepth;
+uniform float spriteSnap;
+
+uniform vec2 renderOdd;
+uniform float renderScale;
+uniform float renderScaleInv;
+uniform float pixelUnit;
+uniform float focusDepth;
+
+uniform vec4 geometryClip;
+attribute vec4 position4;
+attribute vec2 sprite;
+
+varying float vPixelSize;
+
+// External
+vec3 getPosition(vec4 xyzw, float canonical);
+vec4 getSprite(vec4 xyzw);
+
+vec3 getSpritePosition() {
+  // Clip points
+  vec4 p = min(geometryClip, position4);
+  float diff = length(position4 - p);
+  if (diff > 0.0) {
+    return vec3(0.0, 0.0, 1000.0);
+  }
+
+  // Make sprites
+  vec3 center = getPosition(p, 1.0);
+  vec4 atlas = getSprite(p);
+
+  // Sprite goes from -1..1, width = 2.
+  // -1..1 -> -0.5..0.5
+  vec2 halfSprite = sprite * .5;
+  vec2 halfFlipSprite = vec2(halfSprite.x, -halfSprite.y);
+
+#ifdef POSITION_UV
+  // Assign UVs
+  vUV = atlas.xy + atlas.zw * (halfFlipSprite + .5);
+#endif
+
+  // Depth blending
+  // TODO: orthographic camera
+  // Workaround: set depth = 0
+  float depth = focusDepth, z;
+  z = -center.z;
+  if (spriteDepth < 1.0) {
+    depth = mix(z, focusDepth, spriteDepth);
+  }
+  
+  // Match device/unit mapping 
+  float size = pixelUnit * spriteScale;
+  float depthSize = depth * size;
+
+  // Calculate pixelSize for anti-aliasing
+  float pixelSize = (spriteDepth > 0.0 ? depthSize / z : size);
+  vPixelSize = pixelSize;
+
+  // Position sprite
+  vec2 atlasOdd = fract(atlas.zw / 2.0);
+  vec2 offset = (spriteOffset + halfSprite * atlas.zw) * depthSize;
+  if (spriteSnap > 0.5) {
+    // Snap to pixel (w/ epsilon shift to avoid jitter)
+    return vec3(((floor(center.xy / center.z * renderScale + 0.001) + renderOdd + atlasOdd) * center.z + offset) * renderScaleInv, center.z);
+  }
+  else {
+    // Place directly
+    return center + vec3(offset * renderScaleInv, 0.0);
+  }
+
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/stereographic4.position.js
+/* harmony default export */ const stereographic4_position = (/* glsl */`uniform float stereoBend;
+uniform vec4 basisScale;
+uniform vec4 basisOffset;
+uniform mat4 viewMatrix;
+uniform vec2 view4D;
+
+vec4 getStereographic4Position(vec4 position, inout vec4 stpq) {
+  
+  vec4 transformed;
+  if (stereoBend > 0.0001) {
+
+    float r = length(position);
+    float w = r + position.w;
+    vec4 project = vec4(position.xyz / w, r);
+    
+    transformed = mix(position, project, stereoBend);
+  }
+  else {
+    transformed = position;
+  }
+
+  vec4 pos4 = transformed * basisScale - basisOffset;
+  vec3 xyz = (viewMatrix * vec4(pos4.xyz, 1.0)).xyz;
+  return vec4(xyz, pos4.w * view4D.y + view4D.x);
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/stereographic.position.js
+/* harmony default export */ const stereographic_position = (/* glsl */`uniform float stereoBend;
+
+uniform mat4 viewMatrix;
+
+vec4 getStereoPosition(vec4 position, inout vec4 stpq) {
+  if (stereoBend > 0.0001) {
+
+    vec3 pos = position.xyz;
+    float r = length(pos);
+    float z = r + pos.z;
+    vec3 project = vec3(pos.xy / z, r);
+    
+    vec3 lerped = mix(pos, project, stereoBend);
+
+    return viewMatrix * vec4(lerped, 1.0);
+  }
+  else {
+    return viewMatrix * vec4(position.xyz, 1.0);
+  }
+}`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/stpq.sample.2d.js
+/* harmony default export */ const stpq_sample_2d = (/* glsl */`varying vec2 vST;
+
+vec4 getSample(vec2 st);
+
+vec4 getSTSample() {
+  return getSample(vST);
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/stpq.xyzw.2d.js
+/* harmony default export */ const stpq_xyzw_2d = (/* glsl */`varying vec2 vUV;
+
+void setRawUV(vec4 xyzw) {
+  vUV = xyzw.xy;
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/strip.position.normal.js
+/* harmony default export */ const strip_position_normal = (/* glsl */`uniform vec4 geometryClip;
+attribute vec4 position4;
+attribute vec3 strip;
+
+// External
+vec3 getPosition(vec4 xyzw, float canonical);
+
+varying vec3 vNormal;
+varying vec3 vLight;
+varying vec3 vPosition;
+
+void getStripGeometry(vec4 xyzw, vec3 strip, out vec3 pos, out vec3 normal) {
+  vec3 a, b, c;
+
+  a   = getPosition(xyzw, 1.0);
+  b   = getPosition(vec4(xyzw.xyz, strip.x), 0.0);
+  c   = getPosition(vec4(xyzw.xyz, strip.y), 0.0);
+
+  normal = normalize(cross(c - a, b - a)) * strip.z;
+  
+  pos = a;
+}
+
+vec3 getStripPositionNormal() {
+  vec3 center, normal;
+
+  vec4 p = min(geometryClip, position4);
+
+  getStripGeometry(p, strip, center, normal);
+  vNormal   = normal;
+  vLight    = normalize((viewMatrix * vec4(1.0, 2.0, 2.0, 0.0)).xyz);
+  vPosition = -center;
+
+  return center;
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/style.color.js
+/* harmony default export */ const style_color = (/* glsl */`uniform vec3 styleColor;
+uniform float styleOpacity;
+
+vec4 getStyleColor() {
+  return vec4(styleColor, styleOpacity);
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/subdivide.depth.js
+/* harmony default export */ const subdivide_depth = (/* glsl */`uniform float subdivideBevel;
+
+// External
+vec4 sampleData(vec4 xyzw);
+
+vec4 subdivideDepth(vec4 xyzw) {
+  float x = xyzw.z;
+  float i = floor(x);
+  float f = x - i;
+
+  float minf = subdivideBevel * min(f, 1.0 - f);
+  float g = (f > 0.5) ? 1.0 - minf : (f < 0.5) ? minf : 0.5;
+
+  return sampleData(vec4(xyzw.xy, i + g, xyzw.w));
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/subdivide.depth.lerp.js
+/* harmony default export */ const subdivide_depth_lerp = (/* glsl */`uniform float subdivideBevel;
+
+// External
+vec4 sampleData(vec4 xyzw);
+
+vec4 subdivideDepthLerp(vec4 xyzw) {
+  float x = xyzw.z;
+  float i = floor(x);
+  float f = x - i;
+
+  float minf = subdivideBevel * min(f, 1.0 - f);
+  float g = (f > 0.5) ? 1.0 - minf : (f < 0.5) ? minf : 0.5;
+
+  vec4 xyzw1 = vec4(xyzw.xy, i, xyzw.w);
+  vec4 xyzw2 = vec4(xyzw.xy, i + 1.0, xyzw.w);
+  
+  vec4 a = sampleData(xyzw1);
+  vec4 b = sampleData(xyzw2);
+
+  return mix(a, b, g);
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/subdivide.height.js
+/* harmony default export */ const subdivide_height = (/* glsl */`uniform float subdivideBevel;
+
+// External
+vec4 sampleData(vec4 xyzw);
+
+vec4 subdivideHeight(vec4 xyzw) {
+  float x = xyzw.y;
+  float i = floor(x);
+  float f = x - i;
+
+  float minf = subdivideBevel * min(f, 1.0 - f);
+  float g = (f > 0.5) ? 1.0 - minf : (f < 0.5) ? minf : 0.5;
+
+  return sampleData(vec4(xyzw.x, i + g, xyzw.zw));
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/subdivide.height.lerp.js
+/* harmony default export */ const subdivide_height_lerp = (/* glsl */`uniform float subdivideBevel;
+
+// External
+vec4 sampleData(vec4 xyzw);
+
+vec4 subdivideHeightLerp(vec4 xyzw) {
+  float x = xyzw.y;
+  float i = floor(x);
+  float f = x - i;
+
+  float minf = subdivideBevel * min(f, 1.0 - f);
+  float g = (f > 0.5) ? 1.0 - minf : (f < 0.5) ? minf : 0.5;
+
+  vec4 xyzw1 = vec4(xyzw.x, i, xyzw.zw);
+  vec4 xyzw2 = vec4(xyzw.x, i + 1.0, xyzw.zw);
+  
+  vec4 a = sampleData(xyzw1);
+  vec4 b = sampleData(xyzw2);
+
+  return mix(a, b, g);
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/subdivide.items.js
+/* harmony default export */ const subdivide_items = (/* glsl */`uniform float subdivideBevel;
+
+// External
+vec4 sampleData(vec4 xyzw);
+
+vec4 subdivideItems(vec4 xyzw) {
+  float x = xyzw.w;
+  float i = floor(x);
+  float f = x - i;
+
+  float minf = subdivideBevel * min(f, 1.0 - f);
+  float g = (f > 0.5) ? 1.0 - minf : (f < 0.5) ? minf : 0.5;
+
+  return sampleData(vec4(xyzw.xyz, i + g));
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/subdivide.items.lerp.js
+/* harmony default export */ const subdivide_items_lerp = (/* glsl */`uniform float subdivideBevel;
+
+// External
+vec4 sampleData(vec4 xyzw);
+
+vec4 subdivideItemsLerp(vec4 xyzw) {
+  float x = xyzw.w;
+  float i = floor(x);
+  float f = x - i;
+
+  float minf = subdivideBevel * min(f, 1.0 - f);
+  float g = (f > 0.5) ? 1.0 - minf : (f < 0.5) ? minf : 0.5;
+
+  vec4 xyzw1 = vec4(xyzw.xyz, i);
+  vec4 xyzw2 = vec4(xyzw.xyz, i + 1.0);
+  
+  vec4 a = sampleData(xyzw1);
+  vec4 b = sampleData(xyzw2);
+
+  return mix(a, b, g);
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/subdivide.width.js
+/* harmony default export */ const subdivide_width = (/* glsl */`uniform float subdivideBevel;
+
+// External
+vec4 sampleData(vec4 xyzw);
+
+vec4 subdivideWidth(vec4 xyzw) {
+  float x = xyzw.x;
+  float i = floor(x);
+  float f = x - i;
+
+  float minf = subdivideBevel * min(f, 1.0 - f);
+  float g = (f > 0.5) ? 1.0 - minf : (f < 0.5) ? minf : 0.5;
+
+  return sampleData(vec4(i + g, xyzw.yzw));
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/subdivide.width.lerp.js
+/* harmony default export */ const subdivide_width_lerp = (/* glsl */`uniform float subdivideBevel;
+
+// External
+vec4 sampleData(vec4 xyzw);
+
+vec4 subdivideWidthLerp(vec4 xyzw) {
+  float x = xyzw.x;
+  float i = floor(x);
+  float f = x - i;
+
+  float minf = subdivideBevel * min(f, 1.0 - f);
+  float g = (f > 0.5) ? 1.0 - minf : (f < 0.5) ? minf : 0.5;
+
+  vec4 xyzw1 = vec4(i, xyzw.yzw);
+  vec4 xyzw2 = vec4(i + 1.0, xyzw.yzw);
+  
+  vec4 a = sampleData(xyzw1);
+  vec4 b = sampleData(xyzw2);
+
+  return mix(a, b, g);
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/surface.mask.hollow.js
+/* harmony default export */ const surface_mask_hollow = (/* glsl */`attribute vec4 position4;
+
+float getSurfaceHollowMask(vec4 xyzw) {
+  vec4 df = abs(fract(position4) - .5);
+  vec2 df2 = min(df.xy, df.zw);
+  float df3 = min(df2.x, df2.y);
+  return df3;
+}`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/surface.position.js
+/* harmony default export */ const surface_position = (/* glsl */`uniform vec4 geometryClip;
+uniform vec4 geometryResolution;
+uniform vec4 mapSize;
+
+attribute vec4 position4;
+
+// External
+vec3 getPosition(vec4 xyzw, float canonical);
+
+vec3 getSurfacePosition() {
+  vec4 p = min(geometryClip, position4);
+  vec3 xyz = getPosition(p, 1.0);
+
+  // Overwrite UVs
+#ifdef POSITION_UV
+#ifdef POSITION_UV_INT
+  vUV = -.5 + (position4.xy * geometryResolution.xy) * mapSize.xy;
+#else
+  vUV = position4.xy * geometryResolution.xy;
+#endif
+#endif
+
+  return xyz;
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/surface.position.normal.js
+/* harmony default export */ const surface_position_normal = (/* glsl */`uniform vec4 mapSize;
+uniform vec4 geometryResolution;
+uniform vec4 geometryClip;
+attribute vec4 position4;
+attribute vec2 surface;
+
+// External
+vec3 getPosition(vec4 xyzw, float canonical);
+
+void getSurfaceGeometry(vec4 xyzw, float edgeX, float edgeY, out vec3 left, out vec3 center, out vec3 right, out vec3 up, out vec3 down) {
+  vec4 deltaX = vec4(1.0, 0.0, 0.0, 0.0);
+  vec4 deltaY = vec4(0.0, 1.0, 0.0, 0.0);
+
+  /*
+  // high quality, 5 tap
+  center =                  getPosition(xyzw, 1.0);
+  left   = (edgeX > -0.5) ? getPosition(xyzw - deltaX, 0.0) : center;
+  right  = (edgeX < 0.5)  ? getPosition(xyzw + deltaX, 0.0) : center;
+  down   = (edgeY > -0.5) ? getPosition(xyzw - deltaY, 0.0) : center;
+  up     = (edgeY < 0.5)  ? getPosition(xyzw + deltaY, 0.0) : center;
+  */
+  
+  // low quality, 3 tap
+  center =                  getPosition(xyzw, 1.0);
+  left   =                  center;
+  down   =                  center;
+  right  = (edgeX < 0.5)  ? getPosition(xyzw + deltaX, 0.0) : (2.0 * center - getPosition(xyzw - deltaX, 0.0));
+  up     = (edgeY < 0.5)  ? getPosition(xyzw + deltaY, 0.0) : (2.0 * center - getPosition(xyzw - deltaY, 0.0));
+}
+
+vec3 getSurfaceNormal(vec3 left, vec3 center, vec3 right, vec3 up, vec3 down) {
+  vec3 dx = right - left;
+  vec3 dy = up    - down;
+  vec3 n = cross(dy, dx);
+  if (length(n) > 0.0) {
+    return normalize(n);
+  }
+  return vec3(0.0, 1.0, 0.0);
+}
+
+varying vec3 vNormal;
+varying vec3 vLight;
+varying vec3 vPosition;
+
+vec3 getSurfacePositionNormal() {
+  vec3 left, center, right, up, down;
+
+  vec4 p = min(geometryClip, position4);
+
+  getSurfaceGeometry(p, surface.x, surface.y, left, center, right, up, down);
+  vNormal   = getSurfaceNormal(left, center, right, up, down);
+  vLight    = normalize((viewMatrix * vec4(1.0, 2.0, 2.0, 0.0)).xyz); // hardcoded directional light
+  vPosition = -center;
+
+#ifdef POSITION_UV
+#ifdef POSITION_UV_INT
+  vUV = -.5 + (position4.xy * geometryResolution.xy) * mapSize.xy;
+#else
+  vUV = position4.xy * geometryResolution.xy;
+#endif
+#endif
+  
+  return center;
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/ticks.position.js
+/* harmony default export */ const ticks_position = (/* glsl */`uniform float worldUnit;
+uniform float focusDepth;
+uniform float tickSize;
+uniform float tickEpsilon;
+uniform vec3  tickNormal;
+uniform vec2  tickStrip;
+
+vec4 getSample(vec4 xyzw);
+
+vec3 transformPosition(vec4 position, in vec4 stpqIn, out vec4 stpqOut);
+
+vec3 getTickPosition(vec4 xyzw, in vec4 stpqIn, out vec4 stpqOut) {
+  float epsilon = tickEpsilon;
+
+  // determine tick direction
+  float leftX  = max(tickStrip.x, xyzw.y - 1.0);
+  float rightX = min(tickStrip.y, xyzw.y + 1.0);
+  
+  vec4 left    = getSample(vec4(leftX,  xyzw.zw, 0.0));
+  vec4 right   = getSample(vec4(rightX, xyzw.zw, 0.0));
+  vec4 diff    = right - left;
+
+  vec3 normal  = cross(normalize(diff.xyz + vec3(diff.w)), tickNormal);
+  float bias   = max(0.0, 1.0 - length(normal) * 2.0);
+       normal  = mix(normal, tickNormal.yzx, bias * bias);
+  
+  // transform (point) and (point + delta)
+  vec4 center  = getSample(vec4(xyzw.yzw, 0.0));
+  vec4 delta   = vec4(normal, 0.0) * epsilon;
+
+  vec4 a = center;
+  vec4 b = center + delta;
+
+  vec4 _;
+  vec3 c = transformPosition(a, stpqIn, stpqOut);
+  vec3 d = transformPosition(b, stpqIn, _);
+  
+  // sample on either side to create line
+  float line = xyzw.x - .5;
+  vec3  mid  = c;
+  vec3  side = normalize(d - c);
+
+  return mid + side * line * tickSize * worldUnit * focusDepth;
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/transform3.position.js
+/* harmony default export */ const transform3_position = (/* glsl */`uniform mat4 transformMatrix;
+
+vec4 transformPosition(vec4 position, inout vec4 stpq) {
+  return transformMatrix * vec4(position.xyz, 1.0);
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/transform4.position.js
+/* harmony default export */ const transform4_position = (/* glsl */`uniform mat4 transformMatrix;
+uniform vec4 transformOffset;
+
+vec4 transformPosition(vec4 position, inout vec4 stpq) {
+  return transformMatrix * position + transformOffset;
+}
+`);
+;// CONCATENATED MODULE: ./src/shaders/glsl/view.position.js
+/* harmony default export */ const view_position = (/* glsl */`// Implicit three.js uniform
+// uniform mat4 viewMatrix;
+
+vec4 getViewPosition(vec4 position, inout vec4 stpq) {
+  return (viewMatrix * vec4(position.xyz, 1.0));
+}
+`);
+;// CONCATENATED MODULE: ./node_modules/shadergraph/src/graph/graph.js
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+/*
+  Graph of nodes with outlets
+*/
+class Graph {
+  static initClass() {
+    this.index = 0;
+
+    this.IN = 0;
+    this.OUT = 1;
+  }
+  // eslint-disable-next-line no-unused-vars
+  static id(name) {
+    return ++Graph.index;
+  }
+
+  constructor(nodes, parent = null) {
+    this.parent = parent;
+    this.id = Graph.id();
+    this.nodes = [];
+    nodes && this.add(nodes);
+  }
+
+  inputs() {
+    const inputs = [];
+    for (const node of Array.from(this.nodes)) {
+      for (const outlet of Array.from(node.inputs)) {
+        if (outlet.input === null) {
+          inputs.push(outlet);
+        }
+      }
+    }
+    return inputs;
+  }
+
+  outputs() {
+    const outputs = [];
+    for (const node of Array.from(this.nodes)) {
+      for (const outlet of Array.from(node.outputs)) {
+        if (outlet.output.length === 0) {
+          outputs.push(outlet);
+        }
+      }
+    }
+    return outputs;
+  }
+
+  getIn(name) {
+    return Array.from(this.inputs()).filter(
+      (outlet) => outlet.name === name
+    )[0];
+  }
+  getOut(name) {
+    return Array.from(this.outputs()).filter(
+      (outlet) => outlet.name === name
+    )[0];
+  }
+
+  add(node, ignore) {
+    if (node.length) {
+      for (const _node of Array.from(node)) {
+        this.add(_node);
+      }
+      return;
+    }
+
+    if (node.graph && !ignore) {
+      throw new Error("Adding node to two graphs at once");
+    }
+
+    node.graph = this;
+    this.nodes.push(node);
+  }
+
+  remove(node, ignore) {
+    if (node.length) {
+      for (const _node of Array.from(node)) {
+        this.remove(_node);
+      }
+      return;
+    }
+
+    if (node.graph !== this) {
+      throw new Error("Removing node from wrong graph.");
+    }
+
+    ignore || node.disconnect();
+
+    this.nodes.splice(this.nodes.indexOf(node), 1);
+    node.graph = null;
+  }
+
+  adopt(node) {
+    if (node.length) {
+      for (const _node of Array.from(node)) {
+        this.adopt(_node);
+      }
+      return;
+    }
+
+    node.graph.remove(node, true);
+    this.add(node, true);
+  }
+}
+Graph.initClass();
+
+;// CONCATENATED MODULE: ./node_modules/shadergraph/src/graph/outlet.js
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+/*
+  In/out outlet on node
+*/
+class Outlet {
+  static initClass() {
+    this.index = 0;
+  }
+  static make(outlet, extra) {
+    if (extra == null) {
+      extra = {};
+    }
+    const meta = extra;
+    if (outlet.meta != null) {
+      for (const key in outlet.meta) {
+        const value = outlet.meta[key];
+        meta[key] = value;
+      }
+    }
+    return new Outlet(
+      outlet.inout,
+      outlet.name,
+      outlet.hint,
+      outlet.type,
+      meta
+    );
+  }
+  static id(name) {
+    return `_io_${++Outlet.index}_${name}`;
+  }
+
+  static hint(name) {
+    name = name.replace(/^_io_[0-9]+_/, "");
+    name = name.replace(/_i_o$/, "");
+    return (name = name.replace(/(In|Out|Inout|InOut)$/, ""));
+  }
+
+  constructor(inout, name, hint, type, meta, id) {
+    this.inout = inout;
+    this.name = name;
+    this.hint = hint;
+    this.type = type;
+    if (meta == null) {
+      meta = {};
+    }
+    this.meta = meta;
+    this.id = id;
+    if (this.hint == null) {
+      this.hint = Outlet.hint(this.name);
+    }
+
+    this.node = null;
+    this.input = null;
+    this.output = [];
+    if (this.id == null) {
+      this.id = Outlet.id(this.hint);
+    }
+  }
+
+  // Change into given outlet without touching connections
+  morph(outlet) {
+    this.inout = outlet.inout;
+    this.name = outlet.name;
+    this.hint = outlet.hint;
+    this.type = outlet.type;
+    return (this.meta = outlet.meta);
+  }
+
+  // Copy with unique name and cloned metadata
+  dupe(name) {
+    if (name == null) {
+      name = this.id;
+    }
+    const outlet = Outlet.make(this);
+    outlet.name = name;
+    return outlet;
+  }
+
+  // Connect to given outlet
+  connect(outlet) {
+    // Auto-reverse in/out to out/in
+    if (this.inout === Graph.IN && outlet.inout === Graph.OUT) {
+      return outlet.connect(this);
+    }
+
+    // Disallow bad combinations
+    if (this.inout !== Graph.OUT || outlet.inout !== Graph.IN) {
+      throw new Error("Can only connect out to in.");
+    }
+
+    // Check for existing connection
+    if (outlet.input === this) {
+      return;
+    }
+
+    // Disconnect existing connections
+    outlet.disconnect();
+
+    // Add new connection.
+    outlet.input = this;
+    return this.output.push(outlet);
+  }
+
+  // Disconnect given outlet (or all)
+  disconnect(outlet) {
+    // Disconnect input from the other side.
+    if (this.input) {
+      this.input.disconnect(this);
+    }
+
+    if (this.output.length) {
+      if (outlet) {
+        // Remove one outgoing connection.
+        const index = this.output.indexOf(outlet);
+        if (index >= 0) {
+          this.output.splice(index, 1);
+          return (outlet.input = null);
+        }
+      } else {
+        // Remove all outgoing connections.
+        for (outlet of Array.from(this.output)) {
+          outlet.input = null;
+        }
+        return (this.output = []);
+      }
+    }
+  }
+}
+Outlet.initClass();
+
+;// CONCATENATED MODULE: ./node_modules/shadergraph/src/graph/node.js
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+/*
+ Node in graph.
+*/
+class graph_node_Node {
+  static initClass() {
+    this.index = 0;
+  }
+  static id(_name) {
+    return ++graph_node_Node.index;
+  }
+
+  constructor(owner, outlets) {
+    this.owner = owner;
+    this.graph = null;
+    this.inputs = [];
+    this.outputs = [];
+    this.all = [];
+    this.outlets = null;
+    this.id = graph_node_Node.id();
+
+    this.setOutlets(outlets);
+  }
+
+  // Retrieve input
+  getIn(name) {
+    return Array.from(this.inputs).filter((outlet) => outlet.name === name)[0];
+  }
+
+  // Retrieve output
+  getOut(name) {
+    return Array.from(this.outputs).filter((outlet) => outlet.name === name)[0];
+  }
+
+  // Retrieve by name
+  get(name) {
+    return this.getIn(name) || this.getOut(name);
+  }
+
+  // Set new outlet definition
+  setOutlets(outlets) {
+    if (outlets != null) {
+      // First init
+      let outlet;
+      if (this.outlets == null) {
+        this.outlets = {};
+        for (outlet of Array.from(outlets)) {
+          if (!(outlet instanceof Outlet)) {
+            outlet = Outlet.make(outlet);
+          }
+          this._add(outlet);
+        }
+        return;
+      }
+
+      // Return new/old outlet matching hash key
+      const hash = (
+        outlet // Match by name, direction and type.
+      ) => [outlet.name, outlet.inout, outlet.type].join("-");
+
+      // Build hash of new outlets
+      const match = {};
+      for (outlet of Array.from(outlets)) {
+        match[hash(outlet)] = true;
+      }
+
+      // Remove missing outlets, record matches
+      for (let key in this.outlets) {
+        outlet = this.outlets[key];
+        key = hash(outlet);
+        if (match[key]) {
+          match[key] = outlet;
+        } else {
+          this._remove(outlet);
+        }
+      }
+
+      // Insert new outlets
+      for (outlet of Array.from(outlets)) {
+        // Find match by hash
+        const existing = match[hash(outlet)];
+        if (existing instanceof Outlet) {
+          // Update existing outlets in place to retain connections.
+          this._morph(existing, outlet);
+        } else {
+          // Spawn new outlet
+          if (!(outlet instanceof Outlet)) {
+            outlet = Outlet.make(outlet);
+          }
+          this._add(outlet);
+        }
+      }
+
+      this;
+    }
+    return this.outlets;
+  }
+
+  // Connect to the target node by matching up inputs and outputs.
+  connect(node, empty, force) {
+    let dest, dests, hint, source, type;
+    const outlets = {};
+    const hints = {};
+
+    const typeHint = (outlet) => type + "/" + outlet.hint;
+
+    // Hash the types/hints of available target outlets.
+    for (dest of Array.from(node.inputs)) {
+      // Only autoconnect if not already connected
+      let list;
+      if (!force && dest.input) {
+        continue;
+      }
+
+      // Match outlets by type/name hint, then type/position key
+      ({ type } = dest);
+      hint = typeHint(dest);
+
+      if (!hints[hint]) {
+        hints[hint] = dest;
+      }
+      outlets[type] = list = outlets[type] || [];
+      list.push(dest);
+    }
+
+    // Available source outlets
+    let sources = this.outputs;
+
+    // Ignore connected source if only matching empties.
+    sources = sources.filter((outlet) => !(empty && outlet.output.length));
+
+    // Match hints first
+    for (source of Array.from(sources.slice())) {
+      // Match outlets by type and name
+      ({ type } = source);
+      hint = typeHint(source);
+      dests = outlets[type];
+
+      // Connect if found
+      if ((dest = hints[hint])) {
+        source.connect(dest);
+
+        // Remove from potential set
+        delete hints[hint];
+        dests.splice(dests.indexOf(dest), 1);
+        sources.splice(sources.indexOf(source), 1);
+      }
+    }
+
+    // Match what's left
+    if (!sources.length) {
+      return this;
+    }
+    for (source of Array.from(sources.slice())) {
+      ({ type } = source);
+      dests = outlets[type];
+
+      // Match outlets by type and order
+      if (dests && dests.length) {
+        // Link up and remove from potential set
+        source.connect(dests.shift());
+      }
+    }
+
+    return this;
+  }
+
+  // Disconnect entire node
+  disconnect(_node) {
+    let outlet;
+    for (outlet of Array.from(this.inputs)) {
+      outlet.disconnect();
+    }
+    for (outlet of Array.from(this.outputs)) {
+      outlet.disconnect();
+    }
+
+    return this;
+  }
+
+  // Return hash key for outlet
+  _key(outlet) {
+    return [outlet.name, outlet.inout].join("-");
+  }
+
+  // Add outlet object to node
+  _add(outlet) {
+    const key = this._key(outlet);
+
+    // Sanity checks
+    if (outlet.node) {
+      throw new Error("Adding outlet to two nodes at once.");
+    }
+    if (this.outlets[key]) {
+      throw new Error(`Adding two identical outlets to same node. (${key})`);
+    }
+
+    // Link back outlet
+    outlet.node = this;
+
+    // Add to name hash and inout list
+    if (outlet.inout === Graph.IN) {
+      this.inputs.push(outlet);
+    }
+    if (outlet.inout === Graph.OUT) {
+      this.outputs.push(outlet);
+    }
+    this.all.push(outlet);
+    return (this.outlets[key] = outlet);
+  }
+
+  // Morph outlet to other
+  _morph(existing, outlet) {
+    let key = this._key(outlet);
+    delete this.outlets[key];
+
+    existing.morph(outlet);
+
+    key = this._key(outlet);
+    return (this.outlets[key] = outlet);
+  }
+
+  // Remove outlet object from node.
+  _remove(outlet) {
+    const key = this._key(outlet);
+
+    // Sanity checks
+    if (outlet.node !== this) {
+      throw new Error("Removing outlet from wrong node.");
+    }
+
+    // Disconnect outlet.
+    outlet.disconnect();
+
+    // Unlink outlet.
+    outlet.node = null;
+
+    // Remove from name list and inout list.
+    delete this.outlets[key];
+    if (outlet.inout === Graph.IN) {
+      this.inputs.splice(this.inputs.indexOf(outlet), 1);
+    }
+    if (outlet.inout === Graph.OUT) {
+      this.outputs.splice(this.outputs.indexOf(outlet), 1);
+    }
+    this.all.splice(this.all.indexOf(outlet), 1);
+    return this;
+  }
+}
+graph_node_Node.initClass();
+
+;// CONCATENATED MODULE: ./node_modules/shadergraph/src/graph/index.js
+
+const { IN, OUT } = Graph;
+
+
+
+
+
+;// CONCATENATED MODULE: ./node_modules/shadergraph/src/linker/snippet.js
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS104: Avoid inline assignments
+ * DS205: Consider reworking code to avoid use of IIFEs
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+class Snippet {
+  static initClass() {
+    this.index = 0;
+  }
+  static namespace() {
+    return `_sn_${++Snippet.index}_`;
+  }
+
+  static load(language, name, code) {
+    const program = language.parse(name, code);
+    const [sigs, compiler] = Array.from(language.compile(program));
+    return new Snippet(language, sigs, compiler, name, code);
+  }
+
+  constructor(language, _signatures, _compiler, _name, _original) {
+    this.language = language;
+    this._signatures = _signatures;
+    this._compiler = _compiler;
+    this._name = _name;
+    this._original = _original;
+    this.namespace = null;
+    this.code = null;
+
+    this.main = null;
+    this.entry = null;
+
+    this.uniforms = null;
+    this.externals = null;
+    this.symbols = null;
+    this.attributes = null;
+    this.varyings = null;
+
+    // Tidy up object for export
+    if (!this.language) {
+      delete this.language;
+    }
+    if (!this._signatures) {
+      delete this._signatures;
+    }
+    if (!this._compiler) {
+      delete this._compiler;
+    }
+    if (!this._original) {
+      delete this._original;
+    }
+
+    // Insert snippet name if not provided
+    if (!this._name) {
+      this._name =
+        this._signatures != null ? this._signatures.main.name : undefined;
+    }
+  }
+
+  clone() {
+    return new Snippet(
+      this.language,
+      this._signatures,
+      this._compiler,
+      this._name,
+      this._original
+    );
+  }
+
+  bind(config, uniforms, namespace, defines) {
+    // Alt syntax (namespace, uniforms, defines)
+    let def, left;
+    let v;
+    if (uniforms === "" + uniforms) {
+      [namespace, uniforms, defines] = Array.from([
+        uniforms,
+        namespace != null ? namespace : {},
+        defines != null ? defines : {},
+      ]);
+      // Alt syntax (uniforms, defines)
+    } else if (namespace !== "" + namespace) {
+      [defines, namespace] = Array.from([
+        namespace != null ? namespace : {},
+        undefined,
+      ]);
+    }
+
+    // Prepare data structure
+    this.main = this._signatures.main;
+    this.namespace =
+      (left = namespace != null ? namespace : this.namespace) != null
+        ? left
+        : Snippet.namespace();
+    this.entry = this.namespace + this.main.name;
+
+    this.uniforms = {};
+    this.varyings = {};
+    this.attributes = {};
+    this.externals = {};
+    this.symbols = [];
+    const exist = {};
+    const exceptions = {};
+
+    // Handle globals and locals for prefixing
+    const global = function (name) {
+      exceptions[name] = true;
+      return name;
+    };
+    const local = (name) => {
+      return this.namespace + name;
+    };
+
+    // Apply config
+    if (config.globals) {
+      for (const key of Array.from(config.globals)) {
+        global(key);
+      }
+    }
+    const _u = config.globalUniforms ? global : local;
+    const _v = config.globalVaryings ? global : local;
+    const _a = config.globalAttributes ? global : local;
+    const _e = local;
+
+    // Build finalized properties
+    const x = (def) => {
+      return (exist[def.name] = true);
+    };
+    const u = (def, name) => {
+      return (this.uniforms[_u(name != null ? name : def.name)] = def);
+    };
+    v = (def) => {
+      return (this.varyings[_v(def.name)] = def);
+    };
+    const a = (def) => {
+      return (this.attributes[_a(def.name)] = def);
+    };
+    const e = (def) => {
+      const name = _e(def.name);
+      this.externals[name] = def;
+      return this.symbols.push(name);
+    };
+
+    const redef = (def) => ({
+      type: def.type,
+      name: def.name,
+      value: def.value,
+    });
+
+    for (def of Array.from(this._signatures.uniform)) {
+      x(def);
+    }
+    for (def of Array.from(this._signatures.uniform)) {
+      u(redef(def));
+    }
+    for (def of Array.from(this._signatures.varying)) {
+      v(redef(def));
+    }
+    for (def of Array.from(this._signatures.external)) {
+      e(def);
+    }
+    for (def of Array.from(this._signatures.attribute)) {
+      a(redef(def));
+    }
+    for (const name in uniforms) {
+      def = uniforms[name];
+      if (exist[name]) {
+        u(def, name);
+      }
+    }
+
+    this.body = this.code = this._compiler(this.namespace, exceptions, defines);
+
+    // Adds defs to original snippet for inspection
+    if (defines) {
+      const defs = (() => {
+        const result = [];
+        for (const k in defines) {
+          v = defines[k];
+          result.push(`#define ${k} ${v}`);
+        }
+        return result;
+      })().join("\n");
+      if (defs.length) {
+        this._original = [
+          defs,
+          "//----------------------------------------",
+          this._original,
+        ].join("\n");
+      }
+    }
+
+    return null;
+  }
+}
+Snippet.initClass();
+
+// EXTERNAL MODULE: ./node_modules/shadergraph/src/linker/priority.js
+var linker_priority = __webpack_require__(3981);
+;// CONCATENATED MODULE: ./node_modules/shadergraph/src/linker/assemble.js
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS205: Consider reworking code to avoid use of IIFEs
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+/*
+  Program assembler
+
+  Builds composite program that can act as new module/snippet
+  Unconnected input/outputs and undefined callbacks are exposed in the new global/main scope
+  If there is only one call with an identical call signature, a #define is output instead.
+*/
+const assemble = function (language, namespace, calls, requires) {
+  const generate = language;
+
+  const externals = {};
+  const symbols = [];
+  const uniforms = {};
+  const varyings = {};
+  const attributes = {};
+  const library = {};
+
+  const process = function () {
+    let body;
+    let ns;
+    for (ns in requires) {
+      const r = requires[ns];
+      required(r.node, r.module);
+    }
+
+    [body, calls] = Array.from(handle(calls));
+    if (namespace != null) {
+      body.entry = namespace;
+    }
+    const main = generate.build(body, calls);
+
+    const sorted = (() => {
+      const result = [];
+      for (ns in library) {
+        const lib = library[ns];
+        result.push(lib);
+      }
+      return result;
+    })().sort((a, b) => linker_priority.compare(a.priority, b.priority));
+    const includes = sorted.map((x) => x.code);
+    includes.push(main.code);
+    const code = generate.lines(includes);
+
+    // Build new virtual snippet
+    return {
+      namespace: main.name,
+      library, // Included library functions
+      body: main.code, // Snippet body
+      code, // Complete snippet (tests/debug)
+      main, // Function signature
+      entry: main.name, // Entry point name
+      symbols,
+      externals,
+      uniforms,
+      varyings,
+      attributes,
+    };
+  };
+
+  // Sort and process calls
+  const handle = (calls) => {
+    let c;
+    calls = (() => {
+      const result = [];
+      for (const ns in calls) {
+        c = calls[ns];
+        result.push(c);
+      }
+      return result;
+    })();
+    calls.sort((a, b) => b.priority - a.priority);
+
+    // Call module in DAG chain
+    const call = (node, module, priority) => {
+      include(node, module, priority);
+      const { main } = module;
+      const { entry } = module;
+
+      const _lookup = (name) => lookup(node, name);
+      const _dangling = (name) => isDangling(node, name);
+      return generate.call(_lookup, _dangling, entry, main.signature, body);
+    };
+
+    const body = generate.body();
+    for (c of Array.from(calls)) {
+      call(c.node, c.module, c.priority);
+    }
+
+    return [body, calls];
+  };
+
+  // Adopt given code as a library at given priority
+  const adopt = function (namespace, code, priority) {
+    const record = library[namespace];
+    if (record != null) {
+      return (record.priority = linker_priority.max(record.priority, priority));
+    } else {
+      return (library[namespace] = { code, priority });
+    }
+  };
+
+  // Include snippet for a call
+  const include = function (node, module, priority) {
+    let def, key;
+    priority = linker_priority.make(priority);
+
+    // Adopt snippet's libraries
+    for (const ns in module.library) {
+      const lib = module.library[ns];
+      adopt(ns, lib.code, linker_priority.nest(priority, lib.priority));
+    }
+
+    // Adopt snippet body as library
+    adopt(module.namespace, module.body, priority);
+
+    // Adopt GL vars
+    for (key in module.uniforms) {
+      def = module.uniforms[key];
+      uniforms[key] = def;
+    }
+    for (key in module.varyings) {
+      def = module.varyings[key];
+      varyings[key] = def;
+    }
+    for (key in module.attributes) {
+      def = module.attributes[key];
+      attributes[key] = def;
+    }
+
+    return required(node, module);
+  };
+
+  const required = (
+    node,
+    module // Adopt external symbols
+  ) =>
+    (() => {
+      const result = [];
+      for (const key of Array.from(module.symbols)) {
+        const ext = module.externals[key];
+        if (isDangling(node, ext.name)) {
+          const copy = {};
+          for (const k in ext) {
+            const v = ext[k];
+            copy[k] = v;
+          }
+          copy.name = lookup(node, ext.name);
+          externals[key] = copy;
+          result.push(symbols.push(key));
+        } else {
+          result.push(undefined);
+        }
+      }
+      return result;
+    })();
+
+  // Check for dangling input/output
+  const isDangling = function (node, name) {
+    const outlet = node.get(name);
+
+    if (outlet.inout === IN) {
+      return outlet.input === null;
+    } else if (outlet.inout === OUT) {
+      return outlet.output.length === 0;
+    }
+  };
+
+  // Look up unique name for outlet
+  const lookup = function (node, name) {
+    // Traverse graph edge
+    let outlet = node.get(name);
+    if (!outlet) {
+      return null;
+    }
+
+    if (outlet.input) {
+      outlet = outlet.input;
+    }
+    ({ name } = outlet);
+
+    return outlet.id;
+  };
+
+  return process();
+};
+
+;// CONCATENATED MODULE: ./node_modules/shadergraph/src/linker/program.js
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+/*
+  Program assembly model
+
+  Snippets are added to its queue, registering calls and code includes.
+  Calls are de-duped and scheduled at the earliest point required for correct data flow.
+
+  When assemble() is called, it builds a main() function to
+  execute all calls in final order.
+
+  The result is a new instance of Snippet that acts as if it
+  was parsed from the combined source of the component
+  nodes.
+*/
+class Program {
+  static initClass() {
+    this.index = 0;
+  }
+  static entry() {
+    return `_pg_${++Program.index}_`;
+  }
+
+  // Program starts out empty, ready to compile starting from a particular block
+  constructor(language, namespace, graph) {
+    this.language = language;
+    this.namespace = namespace;
+    this.graph = graph;
+    this.calls = {};
+    this.requires = {};
+  }
+
+  // Call a given module at certain priority
+  call(node, module, priority) {
+    let exists;
+    const ns = module.namespace;
+
+    // Merge all calls down into one with the right priority
+    if ((exists = this.calls[ns])) {
+      exists.priority = Math.max(exists.priority, priority);
+    } else {
+      this.calls[ns] = { node, module, priority };
+    }
+
+    return this;
+  }
+
+  // Require a given (callback) module's externals
+  require(node, module) {
+    const ns = module.namespace;
+    return (this.requires[ns] = { node, module });
+  }
+
+  // Compile queued ops into result
+  assemble() {
+    const data = assemble(
+      this.language,
+      this.namespace != null ? this.namespace : Program.entry,
+      this.calls,
+      this.requires
+    );
+    const snippet = new Snippet();
+    for (const key in data) {
+      snippet[key] = data[key];
+    }
+    snippet.graph = this.graph;
+    return snippet;
+  }
+}
+Program.initClass();
+
+;// CONCATENATED MODULE: ./node_modules/shadergraph/src/linker/link.js
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS205: Consider reworking code to avoid use of IIFEs
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+/*
+ Callback linker
+
+ Imports given modules and generates linkages for registered callbacks.
+
+ Builds composite program with single module as exported entry point
+*/
+
+const link_link = function (language, links, modules, exported) {
+  const generate = language;
+  let includes = [];
+
+  const symbols = [];
+  const externals = {};
+  const uniforms = {};
+  const attributes = {};
+  const varyings = {};
+  const library = {};
+
+  const process = function () {
+    const exports = generate.links(links);
+
+    const header = [];
+    if (exports.defs != null) {
+      header.push(exports.defs);
+    }
+    if (exports.bodies != null) {
+      header.push(exports.bodies);
+    }
+
+    for (const m of Array.from(modules)) {
+      include(m.node, m.module, m.priority);
+    }
+    const sorted = (() => {
+      const result = [];
+      for (const ns in library) {
+        const lib = library[ns];
+        result.push(lib);
+      }
+      return result;
+    })().sort((a, b) => linker_priority.compare(a.priority, b.priority));
+    includes = sorted.map((x) => x.code);
+
+    let code = generate.lines(includes);
+    code = generate.defuse(code);
+    if (header.length) {
+      code = [generate.lines(header), code].join("\n");
+    }
+    code = generate.hoist(code);
+    code = generate.dedupe(code);
+
+    // Export module's externals
+    const e = exported;
+    return {
+      namespace: e.main.name,
+      code, // Complete snippet (tests/debug)
+      main: e.main, // Function signature
+      entry: e.main.name, // Entry point name
+      externals,
+      uniforms,
+      attributes,
+      varyings,
+    };
+  };
+
+  // Adopt given code as a library at given priority
+  const adopt = function (namespace, code, priority) {
+    const record = library[namespace];
+    if (record != null) {
+      return (record.priority = linker_priority.max(record.priority, priority));
+    } else {
+      return (library[namespace] = { code, priority });
+    }
+  };
+
+  // Include piece of code
+  const include = function (node, module, priority) {
+    let def, key;
+    priority = linker_priority.make(priority);
+
+    // Adopt snippet's libraries
+    for (const ns in module.library) {
+      const lib = module.library[ns];
+      adopt(ns, lib.code, linker_priority.nest(priority, lib.priority));
+    }
+
+    // Adopt snippet body as library
+    adopt(module.namespace, module.body, priority);
+
+    // Adopt externals
+    for (key in module.uniforms) {
+      def = module.uniforms[key];
+      uniforms[key] = def;
+    }
+    for (key in module.varyings) {
+      def = module.varyings[key];
+      varyings[key] = def;
+    }
+    for (key in module.attributes) {
+      def = module.attributes[key];
+      attributes[key] = def;
+    }
+
+    return (() => {
+      const result = [];
+      for (key of Array.from(module.symbols)) {
+        const ext = module.externals[key];
+        if (isDangling(node, ext.name)) {
+          externals[key] = ext;
+          result.push(symbols.push(key));
+        } else {
+          result.push(undefined);
+        }
+      }
+      return result;
+    })();
+  };
+
+  // Check for dangling input/output
+  const isDangling = function (node, name) {
+    const outlet = node.get(name);
+
+    if (!outlet) {
+      const module =
+        (node.owner.snippet != null ? node.owner.snippet._name : undefined) !=
+        null
+          ? node.owner.snippet != null
+            ? node.owner.snippet._name
+            : undefined
+          : node.owner.namespace;
+      throw new Error(
+        `Unable to link program. Unlinked callback \`${name}\` on \`${module}\``
+      );
+    }
+
+    if (outlet.inout === IN) {
+      return outlet.input === null;
+    } else if (outlet.inout === OUT) {
+      return outlet.output.length === 0;
+    }
+  };
+
+  return process();
+};
+
+;// CONCATENATED MODULE: ./node_modules/shadergraph/src/linker/layout.js
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+const debug = false;
+
+/*
+  Program linkage layout
+
+  Entry points are added to its dependency graph
+  Callbacks are linked either with a go-between function
+  or a #define if the signatures are identical.
+*/
+class Layout {
+  constructor(language, graph) {
+    this.language = language;
+    this.graph = graph;
+    this.links = [];
+    this.includes = [];
+    this.modules = {};
+    this.visits = {};
+  }
+
+  // Link up a given named external to this module's entry point
+  callback(node, module, priority, name, external) {
+    return this.links.push({ node, module, priority, name, external });
+  }
+
+  // Include this module of code
+  include(node, module, priority) {
+    let m;
+    if ((m = this.modules[module.namespace]) != null) {
+      return (m.priority = Math.max(priority, m.priority));
+    } else {
+      this.modules[module.namespace] = true;
+      return this.includes.push({ node, module, priority });
+    }
+  }
+
+  // Visit each namespace at most once to avoid infinite recursion
+  visit(namespace) {
+    debug && console.log("Visit", namespace, !this.visits[namespace]);
+    if (this.visits[namespace]) {
+      return false;
+    }
+    return (this.visits[namespace] = true);
+  }
+
+  // Compile queued ops into result
+  link(module) {
+    const data = link_link(this.language, this.links, this.includes, module);
+    const snippet = new Snippet();
+    for (const key in data) {
+      snippet[key] = data[key];
+    }
+    snippet.graph = this.graph;
+    return snippet;
+  }
+}
+
+;// CONCATENATED MODULE: ./node_modules/shadergraph/src/linker/index.js
+
+
+const { load } = Snippet;
+
+
+
+
+
+
+
+
+;// CONCATENATED MODULE: ./node_modules/shadergraph/src/block/block.js
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining
+ * DS104: Avoid inline assignments
+ * DS205: Consider reworking code to avoid use of IIFEs
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+const block_debug = false;
+
+class Block {
+  static previous(outlet) {
+    return outlet.input != null ? outlet.input.node.owner : undefined;
+  }
+
+  constructor(delay) {
+    // Subclasses can pass `delay` to allow them to initialize before they call
+    // `@construct`.
+    if (delay == null) {
+      delay = false;
+    }
+    if (!delay) {
+      this.construct();
+    }
+  }
+
+  construct() {
+    let left;
+    if (this.namespace == null) {
+      this.namespace = Program.entry();
+    }
+    return (this.node = new graph_node_Node(
+      this,
+      (left =
+        typeof this.makeOutlets === "function"
+          ? this.makeOutlets()
+          : undefined) != null
+        ? left
+        : {}
+    ));
+  }
+
+  refresh() {
+    let left;
+    return this.node.setOutlets(
+      (left =
+        typeof this.makeOutlets === "function"
+          ? this.makeOutlets()
+          : undefined) != null
+        ? left
+        : {}
+    );
+  }
+
+  clone() {
+    return new Block();
+  }
+
+  // Compile a new program starting from this block
+  compile(language, namespace) {
+    const program = new Program(
+      language,
+      namespace != null ? namespace : Program.entry(),
+      this.node.graph
+    );
+    this.call(program, 0);
+    return program.assemble();
+  }
+
+  // Link up programs into a layout, starting from this block
+  link(language, namespace) {
+    const module = this.compile(language, namespace);
+
+    const layout = new Layout(language, this.node.graph);
+    this._include(module, layout, 0);
+    this.export(layout, 0);
+    return layout.link(module);
+  }
+
+  // Subclassed methods
+  call(_program, _depth) {}
+  callback(_layout, _depth, _name, _external, _outlet) {}
+  export(_layout, _depth) {}
+
+  // Info string for debugging
+  _info(suffix) {
+    let string =
+      (this.node.owner.snippet != null
+        ? this.node.owner.snippet._name
+        : undefined) != null
+        ? this.node.owner.snippet != null
+          ? this.node.owner.snippet._name
+          : undefined
+        : this.node.owner.namespace;
+    if (suffix != null) {
+      return (string += "." + suffix);
+    }
+  }
+
+  // Create an outlet for a signature definition
+  _outlet(def, props) {
+    const outlet = Outlet.make(def, props);
+    outlet.meta.def = def;
+    return outlet;
+  }
+
+  // Make a call to this module in the given program
+  _call(module, program, depth) {
+    return program.call(this.node, module, depth);
+  }
+
+  // Require this module's dependencies in the given program
+  _require(module, program) {
+    return program.require(this.node, module);
+  }
+
+  // Make a call to all connected inputs
+  _inputs(module, program, depth) {
+    return (() => {
+      const result = [];
+      for (const arg of Array.from(module.main.signature)) {
+        const outlet = this.node.get(arg.name);
+        result.push(
+          block_guard_(Block.previous(outlet), (x) => x.call(program, depth + 1))
+        );
+      }
+      return result;
+    })();
+  }
+
+  // Insert callback to this module in the given layout
+  _callback(module, layout, depth, name, external, outlet) {
+    return layout.callback(this.node, module, depth, name, external, outlet);
+  }
+
+  // Include this module in the given layout
+  _include(module, layout, depth) {
+    return layout.include(this.node, module, depth);
+  }
+
+  // Link this module's connected callbacks
+  _link(module, layout, depth) {
+    block_debug && console.log("block::_link", this.toString(), module.namespace);
+    return (() => {
+      const result = [];
+      for (const key of Array.from(module.symbols)) {
+        const ext = module.externals[key];
+        let outlet = this.node.get(ext.name);
+        if (!outlet) {
+          throw new OutletError(
+            `External not found on ${this._info(ext.name)}`
+          );
+        }
+
+        if (outlet.meta.child != null) {
+          continue;
+        }
+
+        let parent = outlet;
+
+        // eslint-disable-next-line prefer-const
+        let block;
+        while (!block && parent) {
+          [parent, outlet] = Array.from([outlet.meta.parent, parent]);
+        }
+
+        block = Block.previous(outlet);
+        if (!block) {
+          throw new OutletError(
+            `Missing connection on ${this._info(ext.name)}`
+          );
+        }
+
+        block_debug && console.log("callback -> ", this.toString(), ext.name, outlet);
+        block.callback(layout, depth + 1, key, ext, outlet.input);
+        result.push(
+          block != null ? block.export(layout, depth + 1) : undefined
+        );
+      }
+      return result;
+    })();
+  }
+
+  // Trace backwards to discover callbacks further up
+  _trace(module, layout, depth) {
+    block_debug && console.log("block::_trace", this.toString(), module.namespace);
+    return (() => {
+      const result = [];
+      for (const arg of Array.from(module.main.signature)) {
+        const outlet = this.node.get(arg.name);
+        result.push(
+          block_guard_(Block.previous(outlet), (x) => x.export(layout, depth + 1))
+        );
+      }
+      return result;
+    })();
+  }
+}
+
+const OutletError = function (message) {
+  const e = new Error(message);
+  e.name = "OutletError";
+  return e;
+};
+
+OutletError.prototype = new Error();
+
+function block_guard_(value, transform) {
+  return typeof value !== "undefined" && value !== null
+    ? transform(value)
+    : undefined;
+}
+
+;// CONCATENATED MODULE: ./node_modules/shadergraph/src/block/call.js
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+class Call extends Block {
+  constructor(snippet) {
+    super(true);
+
+    this.snippet = snippet;
+    this.namespace = snippet.namespace;
+    this.construct();
+  }
+
+  clone() {
+    return new Call(this.snippet);
+  }
+
+  makeOutlets() {
+    const main = this.snippet.main.signature;
+    const { externals } = this.snippet;
+    const { symbols } = this.snippet;
+
+    const params = Array.from(main).map((outlet) =>
+      this._outlet(outlet, { callback: false })
+    );
+    const callbacks = Array.from(symbols).map((key) =>
+      this._outlet(externals[key], { callback: true })
+    );
+
+    return params.concat(callbacks);
+  }
+
+  call(program, depth) {
+    this._call(this.snippet, program, depth);
+    return this._inputs(this.snippet, program, depth);
+  }
+
+  export(layout, depth) {
+    if (!layout.visit(this.namespace, depth)) {
+      return;
+    }
+
+    this._link(this.snippet, layout, depth);
+    return this._trace(this.snippet, layout, depth);
+  }
+}
+
+;// CONCATENATED MODULE: ./node_modules/shadergraph/src/block/callback.js
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+/*
+  Re-use a subgraph as a callback
+*/
+class Callback extends Block {
+  constructor(graph) {
+    super(true);
+    this.graph = graph;
+    this.construct();
+  }
+
+  refresh() {
+    super.refresh();
+    return delete this.subroutine;
+  }
+
+  clone() {
+    return new Callback(this.graph);
+  }
+
+  makeOutlets() {
+    let outlet;
+    this.make();
+
+    const outlets = [];
+    let ins = [];
+    let outs = [];
+
+    // Pass-through existing callbacks
+    // Collect open inputs/outputs
+    const handle = (outlet, list) => {
+      if (outlet.meta.callback) {
+        if (outlet.inout === Graph.IN) {
+          // Dupe outlet and create two-way link between cloned outlets
+          const dupe = outlet.dupe();
+          if (dupe.meta.child == null) {
+            dupe.meta.child = outlet;
+          }
+          outlet.meta.parent = dupe;
+
+          return outlets.push(dupe);
+        }
+      } else {
+        return list.push(outlet.type);
+      }
+    };
+
+    for (outlet of Array.from(this.graph.inputs())) {
+      handle(outlet, ins);
+    }
+    for (outlet of Array.from(this.graph.outputs())) {
+      handle(outlet, outs);
+    }
+
+    // Merge inputs/outputs into new callback signature
+    ins = ins.join(",");
+    outs = outs.join(",");
+    const type = `(${ins})(${outs})`;
+
+    outlets.push({
+      name: "callback",
+      type,
+      inout: Graph.OUT,
+      meta: {
+        callback: true,
+        def: this.subroutine.main,
+      },
+    });
+
+    return outlets;
+  }
+
+  make() {
+    return (this.subroutine = this.graph.compile(this.namespace));
+  }
+
+  export(layout, depth) {
+    if (!layout.visit(this.namespace, depth)) {
+      return;
+    }
+
+    this._link(this.subroutine, layout, depth);
+    return this.graph.export(layout, depth);
+  }
+
+  call(program, depth) {
+    return this._require(this.subroutine, program, depth);
+  }
+
+  callback(layout, depth, name, external, outlet) {
+    this._include(this.subroutine, layout, depth);
+    return this._callback(
+      this.subroutine,
+      layout,
+      depth,
+      name,
+      external,
+      outlet
+    );
+  }
+}
+
+;// CONCATENATED MODULE: ./node_modules/shadergraph/src/block/isolate.js
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+/*
+  Isolate a subgraph as a single node
+*/
+class Isolate extends Block {
+  constructor(graph) {
+    super(true);
+    this.graph = graph;
+    this.construct();
+  }
+
+  refresh() {
+    super.refresh();
+    return delete this.subroutine;
+  }
+
+  clone() {
+    return new Isolate(this.graph);
+  }
+
+  makeOutlets() {
+    this.make();
+
+    const outlets = [];
+
+    const seen = {};
+    const done = {};
+    for (const set of ["inputs", "outputs"]) {
+      for (const outlet of Array.from(this.graph[set]())) {
+        // Preserve name of 'return' and 'callback' outlets
+        let name = undefined;
+        if (
+          ["return", "callback"].includes(outlet.hint) &&
+          outlet.inout === Graph.OUT
+        ) {
+          name = outlet.hint;
+        }
+
+        // Unless it already exists
+        if (seen[name] != null) {
+          name = undefined;
+        }
+
+        // Dupe outlet and remember link to original
+        const dupe = outlet.dupe(name);
+        if (dupe.meta.child == null) {
+          dupe.meta.child = outlet;
+        }
+        outlet.meta.parent = dupe;
+        if (name != null) {
+          seen[name] = true;
+        }
+        done[outlet.name] = dupe;
+
+        outlets.push(dupe);
+      }
+    }
+
+    return outlets;
+  }
+
+  make() {
+    return (this.subroutine = this.graph.compile(this.namespace));
+  }
+
+  call(program, depth) {
+    this._call(this.subroutine, program, depth);
+    return this._inputs(this.subroutine, program, depth);
+  }
+
+  export(layout, depth) {
+    if (!layout.visit(this.namespace, depth)) {
+      return;
+    }
+
+    // Link up with normal inputs
+    this._link(this.subroutine, layout, depth);
+    this._trace(this.subroutine, layout, depth);
+
+    // Export callbacks needed to call the subroutine
+    return this.graph.export(layout, depth);
+  }
+
+  callback(layout, depth, name, external, outlet) {
+    outlet = outlet.meta.child;
+    return outlet.node.owner.callback(layout, depth, name, external, outlet);
+  }
+}
+
+;// CONCATENATED MODULE: ./node_modules/shadergraph/src/block/join.js
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS205: Consider reworking code to avoid use of IIFEs
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+/*
+  Join multiple disconnected nodes
+*/
+class join_Join extends Block {
+  constructor(nodes) {
+    super(true);
+    this.nodes = nodes;
+    this.construct();
+  }
+
+  clone() {
+    return new join_Join(this.nodes);
+  }
+
+  makeOutlets() {
+    return [];
+  }
+
+  call(program, depth) {
+    return (() => {
+      const result = [];
+      for (const node of Array.from(this.nodes)) {
+        const block = node.owner;
+        result.push(block.call(program, depth));
+      }
+      return result;
+    })();
+  }
+
+  export(layout, depth) {
+    return (() => {
+      const result = [];
+      for (const node of Array.from(this.nodes)) {
+        const block = node.owner;
+        result.push(block.export(layout, depth));
+      }
+      return result;
+    })();
+  }
+}
+
+;// CONCATENATED MODULE: ./node_modules/shadergraph/src/block/index.js
+
+
+
+
+
+
+;// CONCATENATED MODULE: ./node_modules/shadergraph/src/visualize/serialize.js
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+// Dump graph for debug/visualization purposes
+
+
+const serialize = function (graph) {
+  const nodes = [];
+  const links = [];
+
+  for (const node of Array.from(graph.nodes)) {
+    let outlet;
+    const record = {
+      // Data
+      id: node.id,
+      name: null,
+      type: null,
+      depth: null,
+      graph: null,
+      inputs: [],
+      outputs: [],
+    };
+
+    nodes.push(record);
+
+    const { inputs } = record;
+    const { outputs } = record;
+
+    const block = node.owner;
+
+    if (block instanceof Call) {
+      record.name = block.snippet._name;
+      record.type = "call";
+      record.code = block.snippet._original;
+    } else if (block instanceof Callback) {
+      record.name = "Callback";
+      record.type = "callback";
+      record.graph = serialize(block.graph);
+    } else if (block instanceof Isolate) {
+      record.name = "Isolate";
+      record.type = "isolate";
+      record.graph = serialize(block.graph);
+    } else if (block instanceof join_Join) {
+      record.name = "Join";
+      record.type = "join";
+    } else if (block != null) {
+      if (record.name == null) {
+        record.name = block.name != null ? block.name : block.type;
+      }
+      if (record.type == null) {
+        record.type = block.type;
+      }
+      if (record.code == null) {
+        record.code = block.code;
+      }
+      if (block.graph != null) {
+        record.graph = serialize(block.graph);
+      }
+    }
+
+    const format = function (type) {
+      type = type.replace(")(", ")→(");
+      return (type = type.replace("()", ""));
+    };
+
+    for (outlet of Array.from(node.inputs)) {
+      inputs.push({
+        id: outlet.id,
+        name: outlet.name,
+        type: format(outlet.type),
+        open: outlet.input == null,
+      });
+    }
+
+    for (outlet of Array.from(node.outputs)) {
+      outputs.push({
+        id: outlet.id,
+        name: outlet.name,
+        type: format(outlet.type),
+        open: !outlet.output.length,
+      });
+
+      for (const other of Array.from(outlet.output)) {
+        links.push({
+          from: node.id,
+          out: outlet.id,
+          to: other.node.id,
+          in: other.id,
+          type: format(outlet.type),
+        });
+      }
+    }
+  }
+
+  return { nodes, links };
+};
+
+;// CONCATENATED MODULE: ./node_modules/shadergraph/src/factory/hash.js
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+// Hash string into a 32-bit key (murmurhash3)
+const c1 = 0xcc9e2d51;
+const c2 = 0x1b873593;
+const c3 = 0xe6546b64;
+const c4 = 0x85ebca6b;
+const c5 = 0xc2b2ae35;
+
+// Fix imul in old/broken browsers
+let imul = function (a, b) {
+  const ah = (a >>> 16) & 0xffff;
+  const al = a & 0xffff;
+  const bh = (b >>> 16) & 0xffff;
+  const bl = b & 0xffff;
+  return (al * bl + (((ah * bl + al * bh) << 16) >>> 0)) | 0;
+};
+
+if (Math.imul != null) {
+  const test = Math.imul(0xffffffff, 5);
+  if (test === -5) {
+    ({ imul } = Math);
+  }
+}
+
+const hash = function (string) {
+  let h;
+  const n = string.length;
+  let m = Math.floor(n / 2);
+  let j = (h = 0);
+
+  const next = () => string.charCodeAt(j++);
+  const iterate = function (a, b) {
+    let k = a | (b << 16); // two utf-16 words
+    k ^= k << 9; // whitening for ascii-only strings
+
+    k = imul(k, c1);
+    k = (k << 15) | (k >>> 17);
+    k = imul(k, c2);
+
+    h ^= k;
+
+    h = (h << 13) | (h >>> 19);
+    h = imul(h, 5);
+    return (h = (h + c3) | 0);
+  };
+
+  while (m--) {
+    iterate(next(), next());
+  }
+  if (n & 1) {
+    iterate(next(), 0);
+  }
+
+  h ^= n;
+  h ^= h >>> 16;
+  h = imul(h, c4);
+  h ^= h >>> 13;
+  h = imul(h, c5);
+
+  return (h ^= h >>> 16);
+};
+
+;// CONCATENATED MODULE: ./node_modules/shadergraph/src/visualize/markup.js
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS205: Consider reworking code to avoid use of IIFEs
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+const trim = (string) => ("" + string).replace(/^\s+|\s+$/g, "");
+
+const cssColor = (r, g, b, alpha) =>
+  "rgba(" + [r, g, b, alpha].join(", ") + ")";
+
+const hashColor = function (string, alpha) {
+  if (alpha == null) {
+    alpha = 1;
+  }
+  const color = hash(string) ^ 0x123456;
+
+  let r = color & 0xff;
+  let g = (color >>> 8) & 0xff;
+  let b = (color >>> 16) & 0xff;
+
+  const max = Math.max(r, g, b);
+  const norm = 140 / max;
+  const min = Math.round(max / 3);
+
+  r = Math.min(255, Math.round(norm * Math.max(r, min)));
+  g = Math.min(255, Math.round(norm * Math.max(g, min)));
+  b = Math.min(255, Math.round(norm * Math.max(b, min)));
+
+  return cssColor(r, g, b, alpha);
+};
+
+const escapeText = function (string) {
+  string = string != null ? string : "";
+  return string
+    .replace(/&/g, "&amp;")
+    .replace(/</g, "&lt;")
+    .replace(/>/g, "&gt;")
+    .replace(/'/g, "&#39;")
+    .replace(/"/g, "&quot;");
+};
+
+const process = function (data) {
+  const links = [];
+  const el = _markup(data, links);
+  el.update = () => connect(el, links);
+  _activate(el);
+  return el;
+};
+
+const _activate = function (el) {
+  const codes = el.querySelectorAll(".shadergraph-code");
+  return Array.from(codes).map((code) =>
+    (function () {
+      const popup = code;
+      popup.parentNode.classList.add("shadergraph-has-code");
+      return popup.parentNode.addEventListener(
+        "click",
+        (_event) =>
+          (popup.style.display = {
+            block: "none",
+            none: "block",
+          }[popup.style.display || "none"])
+      );
+    })()
+  );
+};
+
+const _order = function (data) {
+  let link, node;
+  const nodeMap = {};
+  const linkMap = {};
+  for (node of Array.from(data.nodes)) {
+    nodeMap[node.id] = node;
+  }
+
+  for (link of Array.from(data.links)) {
+    if (linkMap[link.from] == null) {
+      linkMap[link.from] = [];
+    }
+    linkMap[link.from].push(link);
+  }
+
+  const recurse = function (node, depth) {
+    let next;
+    if (depth == null) {
+      depth = 0;
+    }
+    node.depth = Math.max(node.depth != null ? node.depth : 0, depth);
+    if ((next = linkMap[node.id])) {
+      for (link of Array.from(next)) {
+        recurse(nodeMap[link.to], depth + 1);
+      }
+    }
+    return null;
+  };
+
+  for (node of Array.from(data.nodes)) {
+    if (node.depth == null) {
+      recurse(node);
+    }
+  }
+
+  return null;
+};
+
+const _markup = function (data, links) {
+  let column;
+  _order(data);
+
+  const wrapper = document.createElement("div");
+  wrapper.classList.add("shadergraph-graph");
+
+  const columns = [];
+  const outlets = {};
+
+  for (const node of Array.from(data.nodes)) {
+    let outlet;
+    const block = document.createElement("div");
+    block.classList.add("shadergraph-node");
+    block.classList.add(`shadergraph-node-${node.type}`);
+
+    block.innerHTML = `\
+<div class="shadergraph-header">${escapeText(node.name)}</div>\
+`;
+
+    const addOutlet = function (outlet, inout) {
+      const color = hashColor(outlet.type);
+
+      const div = document.createElement("div");
+      div.classList.add("shadergraph-outlet");
+      div.classList.add(`shadergraph-outlet-${inout}`);
+      div.innerHTML = `\
+<div class="shadergraph-point" style="background: ${color}"></div>
+<div class="shadergraph-type" style="color: ${color}">${escapeText(
+        outlet.type
+      )}</div>
+<div class="shadergraph-name">${escapeText(outlet.name)}</div>\
+`;
+      block.appendChild(div);
+
+      return (outlets[outlet.id] = div.querySelector(".shadergraph-point"));
+    };
+
+    for (outlet of Array.from(node.inputs)) {
+      addOutlet(outlet, "in");
+    }
+    for (outlet of Array.from(node.outputs)) {
+      addOutlet(outlet, "out");
+    }
+
+    if (node.graph != null) {
+      block.appendChild(_markup(node.graph, links));
+    } else {
+      const clear = document.createElement("div");
+      clear.classList.add("shadergraph-clear");
+      block.appendChild(clear);
+    }
+
+    if (node.code != null) {
+      const div = document.createElement("div");
+      div.classList.add("shadergraph-code");
+      div.innerHTML = escapeText(trim(node.code));
+      block.appendChild(div);
+    }
+
+    column = columns[node.depth];
+    if (column == null) {
+      column = document.createElement("div");
+      column.classList.add("shadergraph-column");
+      columns[node.depth] = column;
+    }
+    column.appendChild(block);
+  }
+
+  for (column of Array.from(columns)) {
+    if (column != null) {
+      wrapper.appendChild(column);
+    }
+  }
+
+  for (const link of Array.from(data.links)) {
+    const color = hashColor(link.type);
+
+    links.push({
+      color,
+      out: outlets[link.out],
+      in: outlets[link.in],
+    });
+  }
+
+  return wrapper;
+};
+
+const sqr = (x) => x * x;
+
+const path = function (x1, y1, x2, y2) {
+  let h;
+  const dx = x2 - x1;
+  const dy = y2 - y1;
+  const d = Math.sqrt(sqr(dx) + sqr(dy));
+
+  const vert = Math.abs(dy) > Math.abs(dx);
+  if (vert) {
+    const mx = (x1 + x2) / 2;
+    const my = (y1 + y2) / 2;
+
+    const f = dy > 0 ? 0.3 : -0.3;
+    h = Math.min(Math.abs(dx) / 2, 20 + d / 8);
+
+    return [
+      "M",
+      x1,
+      y1,
+      "C",
+      x1 + h,
+      y1 + ",",
+      mx,
+      my - d * f,
+      mx,
+      my,
+      "C",
+      mx,
+      my + d * f,
+      x2 - h,
+      y2 + ",",
+      x2,
+      y2,
+    ].join(" ");
+  } else {
+    h = Math.min(Math.abs(dx) / 2.5, 20 + d / 4);
+
+    return ["M", x1, y1, "C", x1 + h, y1 + ",", x2 - h, y2 + ",", x2, y2].join(
+      " "
+    );
+  }
+};
+
+const makeSVG = function (tag) {
+  if (tag == null) {
+    tag = "svg";
+  }
+  return document.createElementNS("http://www.w3.org/2000/svg", tag);
+};
+
+const connect = function (element, links) {
+  let link;
+  if (element.parentNode == null) {
+    return;
+  }
+
+  const ref = element.getBoundingClientRect();
+
+  for (link of Array.from(links)) {
+    const a = link.out.getBoundingClientRect();
+    const b = link.in.getBoundingClientRect();
+
+    link.coords = {
+      x1: (a.left + a.right) / 2 - ref.left,
+      y1: (a.top + a.bottom) / 2 - ref.top,
+      x2: (b.left + b.right) / 2 - ref.left,
+      y2: (b.top + b.bottom) / 2 - ref.top,
+    };
+  }
+
+  let svg = element.querySelector("svg");
+  if (svg != null) {
+    element.removeChild(svg);
+  }
+
+  let box = element;
+  while (box.parentNode && box.offsetHeight === 0) {
+    box = box.parentNode;
+  }
+
+  svg = makeSVG();
+  svg.setAttribute("width", box.offsetWidth);
+  svg.setAttribute("height", box.offsetHeight);
+
+  for (link of Array.from(links)) {
+    const c = link.coords;
+
+    const line = makeSVG("path");
+    line.setAttribute("d", path(c.x1, c.y1, c.x2, c.y2));
+    line.setAttribute("stroke", link.color);
+    line.setAttribute("stroke-width", 3);
+    line.setAttribute("fill", "transparent");
+    svg.appendChild(line);
+  }
+
+  return element.appendChild(svg);
+};
+
+const overlay = function (contents) {
+  const div = document.createElement("div");
+  div.setAttribute("class", "shadergraph-overlay");
+
+  const close = document.createElement("div");
+  close.setAttribute("class", "shadergraph-close");
+  close.innerHTML = "&times;";
+
+  const view = document.createElement("div");
+  view.setAttribute("class", "shadergraph-view");
+
+  const inside = document.createElement("div");
+  inside.setAttribute("class", "shadergraph-inside");
+
+  inside.appendChild(contents);
+  view.appendChild(inside);
+  div.appendChild(view);
+  div.appendChild(close);
+
+  close.addEventListener("click", () => div.parentNode.removeChild(div));
+
+  return div;
+};
+
+const wrap = function (markup) {
+  if (markup instanceof Node) {
+    return markup;
+  }
+  const p = document.createElement("span");
+  p.innerText = markup != null ? markup : "";
+  return p;
+};
+
+const markup_merge = function (markup) {
+  if (markup.length !== 1) {
+    let el;
+    const div = document.createElement("div");
+    for (el of Array.from(markup)) {
+      div.appendChild(wrap(el));
+    }
+    div.update = () =>
+      (() => {
+        const result = [];
+        for (el of Array.from(markup)) {
+          result.push(
+            typeof el.update === "function" ? el.update() : undefined
+          );
+        }
+        return result;
+      })();
+    return div;
+  } else {
+    return wrap(markup[0]);
+  }
+};
+
+;// CONCATENATED MODULE: ./node_modules/shadergraph/src/visualize/index.js
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+const visualize_serialize = serialize;
+const markup = markup_namespaceObject;
+
+const _visualize = function (graph) {
+  if (!graph) {
+    return;
+  }
+  if (!graph.nodes) {
+    return graph;
+  }
+
+  const data = visualize_serialize(graph);
+  return markup.process(data);
+};
+
+const resolve = function (arg) {
+  if (arg == null) {
+    return arg;
+  }
+  if (arg instanceof Array) {
+    return arg.map(resolve);
+  }
+  if (arg.vertex != null && arg.fragment != null) {
+    return [resolve(arg.vertex, resolve(arg.fragment))];
+  }
+  if (arg._graph != null) {
+    return arg._graph;
+  }
+  if (arg.graph != null) {
+    return arg.graph;
+  }
+  return arg;
+};
+
+const visualize_merge = function (args) {
+  let out = [];
+  for (const arg of Array.from(args)) {
+    if (arg instanceof Array) {
+      out = out.concat(visualize_merge(arg));
+    } else if (arg != null) {
+      out.push(arg);
+    }
+  }
+  return out;
+};
+
+const visualize = function () {
+  const list = visualize_merge(resolve([].slice.call(arguments)));
+  return markup.merge(
+    Array.from(list)
+      .filter((graph) => graph)
+      .map((graph) => _visualize(graph))
+  );
+};
+
+const inspect = function () {
+  const contents = visualize.apply(null, arguments);
+  const element = markup.overlay(contents);
+
+  for (const el of Array.from(
+    document.querySelectorAll(".shadergraph-overlay")
+  )) {
+    el.remove();
+  }
+  document.body.appendChild(element);
+  contents.update();
+
+  return element;
+};
+
+;// CONCATENATED MODULE: ./node_modules/shadergraph/src/factory/factory.js
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS104: Avoid inline assignments
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+/*
+  Chainable factory
+
+  Exposes methods to build a graph incrementally
+*/
+class Factory {
+  constructor(language, fetch, config) {
+    this.language = language;
+    this.fetch = fetch;
+    this.config = config;
+    this.graph();
+  }
+
+  // Combined call/concat shortcut
+  pipe(name, uniforms, namespace, defines) {
+    if (name instanceof Factory) {
+      this._concat(name);
+    } else if (name != null) {
+      this._call(name, uniforms, namespace, defines);
+    }
+    return this;
+  }
+
+  // Old name
+  call(name, uniforms, namespace, defines) {
+    return this.pipe(name, uniforms, namespace, defines);
+  }
+
+  // Combined callback/import shortcut
+  require(name, uniforms, namespace, defines) {
+    if (name instanceof Factory) {
+      this._import(name);
+    } else if (name != null) {
+      this.callback();
+      this._call(name, uniforms, namespace, defines);
+      this.end();
+    }
+    return this;
+  }
+
+  // Old name
+  import(name, uniforms, namespace, defines) {
+    return this.require(name, uniforms, namespace, defines);
+  }
+
+  // Create parallel branches that connect as one block to the end
+  // (one outgoing connection per outlet)
+  split() {
+    this._group("_combine", true);
+    return this;
+  }
+
+  // Create parallel branches that fan out from the end
+  // (multiple outgoing connections per outlet)
+  fan() {
+    this._group("_combine", false);
+    return this;
+  }
+
+  // Create isolated subgraph
+  isolate() {
+    this._group("_isolate");
+    return this;
+  }
+
+  // Create callback subgraph
+  callback() {
+    this._group("_callback");
+    return this;
+  }
+
+  // Next branch in group
+  next() {
+    this._next();
+    return this;
+  }
+
+  // Connect branches to previous tail and add pass-through from end
+  pass() {
+    const pass = this._stack[2].end;
+    this.end();
+    this._state.end = this._state.end.concat(pass);
+    return this;
+  }
+
+  // Leave nested branches and join up with main graph,
+  // applying stored op along the way
+  end() {
+    const [sub, main] = Array.from(this._exit());
+    const { op } = sub;
+    if (this[op]) {
+      this[op](sub, main);
+    }
+    return this;
+  }
+
+  // Old name
+  join() {
+    return this.end();
+  }
+
+  // Return finalized graph / reset factory
+  graph() {
+    // Pop remaining stack
+    while ((this._stack != null ? this._stack.length : undefined) > 1) {
+      this.end();
+    }
+
+    // Remember terminating node(s) of graph
+    if (this._graph) {
+      this._tail(this._state, this._graph);
+    }
+
+    const graph = this._graph;
+
+    this._graph = new Graph();
+    this._state = new State();
+    this._stack = [this._state];
+
+    return graph;
+  }
+
+  // Compile shortcut (graph is thrown away)
+  compile(namespace) {
+    if (namespace == null) {
+      namespace = "main";
+    }
+    return this.graph().compile(namespace);
+  }
+
+  // Link shortcut (graph is thrown away)
+  link(namespace) {
+    if (namespace == null) {
+      namespace = "main";
+    }
+    return this.graph().link(namespace);
+  }
+
+  // Serialize for debug
+  serialize() {
+    return visualize_serialize(this._graph);
+  }
+
+  // Return true if empty
+  empty() {
+    return this._graph.nodes.length === 0;
+  }
+
+  // Concatenate existing factory onto tail
+  // Retains original factory
+  _concat(factory) {
+    // Ignore empty concat
+    let block;
+    if (factory._state.nodes.length === 0) {
+      return this;
+    }
+
+    this._tail(factory._state, factory._graph);
+
+    try {
+      block = new Isolate(factory._graph);
+    } catch (error) {
+      if (this.config.autoInspect) {
+        inspect(error, this._graph, factory);
+      }
+      throw error;
+    }
+
+    this._auto(block);
+    return this;
+  }
+
+  // Add existing factory as callback
+  // Retains original factory
+  _import(factory) {
+    // Check for empty require
+    let block;
+    if (factory._state.nodes.length === 0) {
+      throw "Can't import empty callback";
+    }
+
+    this._tail(factory._state, factory._graph);
+
+    try {
+      block = new Callback(factory._graph);
+    } catch (error) {
+      if (this.config.autoInspect) {
+        inspect(error, this._graph, factory);
+      }
+      throw error;
+    }
+
+    this._auto(block);
+    return this;
+  }
+
+  // Connect parallel branches to tail
+  _combine(sub, main) {
+    for (const to of Array.from(sub.start)) {
+      for (const from of Array.from(main.end)) {
+        from.connect(to, sub.multi);
+      }
+    }
+
+    main.end = sub.end;
+    return (main.nodes = main.nodes.concat(sub.nodes));
+  }
+
+  // Make subgraph and connect to tail
+  _isolate(sub, _main) {
+    if (sub.nodes.length) {
+      let block;
+      const subgraph = this._subgraph(sub);
+      this._tail(sub, subgraph);
+
+      try {
+        block = new Isolate(subgraph);
+      } catch (error) {
+        if (this.config.autoInspect) {
+          inspect(error, this._graph, subgraph);
+        }
+        throw error;
+      }
+
+      return this._auto(block);
+    }
+  }
+
+  // Convert to callback and connect to tail
+  _callback(sub, _main) {
+    if (sub.nodes.length) {
+      let block;
+      const subgraph = this._subgraph(sub);
+      this._tail(sub, subgraph);
+
+      try {
+        block = new Callback(subgraph);
+      } catch (error) {
+        if (this.config.autoInspect) {
+          inspect(error, this._graph, subgraph);
+        }
+        throw error;
+      }
+
+      return this._auto(block);
+    }
+  }
+
+  // Create next call block
+  _call(name, uniforms, namespace, defines) {
+    const snippet = this.fetch(name);
+    snippet.bind(this.config, uniforms, namespace, defines);
+    const block = new Call(snippet);
+    return this._auto(block);
+  }
+
+  // Move current state into subgraph
+  _subgraph(sub) {
+    const subgraph = new Graph(null, this._graph);
+    subgraph.adopt(sub.nodes);
+    return subgraph;
+  }
+
+  // Finalize graph tail
+  _tail(state, graph) {
+    // Merge (unique) terminating ends into single tail node if needed
+    let tail = state.end.concat(state.tail);
+    tail = tail.filter((node, i) => tail.indexOf(node) === i);
+
+    if (tail.length > 1) {
+      tail = new join_Join(tail);
+      tail = [tail.node];
+      this._graph.add(tail);
+    }
+
+    // Save single endpoint
+    graph.tail = tail[0];
+    state.end = tail;
+    state.tail = [];
+
+    if (!graph.tail) {
+      throw new Error("Cannot finalize empty graph");
+    }
+
+    // Add compile/link/export/inspect shortcut methods
+    graph.compile = (namespace) => {
+      if (namespace == null) {
+        namespace = "main";
+      }
+      try {
+        return graph.tail.owner.compile(this.language, namespace);
+      } catch (error) {
+        if (this.config.autoInspect) {
+          graph.inspect(error);
+        }
+        throw error;
+      }
+    };
+
+    graph.link = (namespace) => {
+      if (namespace == null) {
+        namespace = "main";
+      }
+      try {
+        return graph.tail.owner.link(this.language, namespace);
+      } catch (error) {
+        if (this.config.autoInspect) {
+          graph.inspect(error);
+        }
+        throw error;
+      }
+    };
+
+    graph.export = (layout, depth) => {
+      return graph.tail.owner.export(layout, depth);
+    };
+
+    return (graph.inspect = (message = null) =>
+      inspect(message, graph));
+  }
+
+  // Create group for branches or callbacks
+  _group(op, multi) {
+    this._push(op, multi); // Accumulator
+    this._push(); // Current
+    return this;
+  }
+
+  // Merge branch into accumulator and reset state
+  _next() {
+    const sub = this._pop();
+
+    this._state.start = this._state.start.concat(sub.start);
+    this._state.end = this._state.end.concat(sub.end);
+    this._state.nodes = this._state.nodes.concat(sub.nodes);
+    this._state.tail = this._state.tail.concat(sub.tail);
+
+    return this._push();
+  }
+
+  // Exit nested branches
+  _exit() {
+    this._next();
+    this._pop();
+    return [this._pop(), this._state];
+  }
+
+  // State stack
+  _push(op, multi) {
+    this._stack.unshift(new State(op, multi));
+    return (this._state = this._stack[0]);
+  }
+
+  _pop() {
+    let left;
+    this._state = this._stack[1];
+    if (this._state == null) {
+      this._state = new State();
+    }
+    return (left = this._stack.shift()) != null ? left : new State();
+  }
+
+  // Auto append or insert depending on whether we have inputs
+  _auto(block) {
+    if (block.node.inputs.length) {
+      return this._append(block);
+    } else {
+      return this._insert(block);
+    }
+  }
+
+  // Add block and connect to end
+  _append(block) {
+    let end;
+    const { node } = block;
+    this._graph.add(node);
+
+    for (end of Array.from(this._state.end)) {
+      end.connect(node);
+    }
+
+    if (!this._state.start.length) {
+      this._state.start = [node];
+    }
+    this._state.end = [node];
+
+    this._state.nodes.push(node);
+    if (!node.outputs.length) {
+      this._state.tail.push(node);
+    }
+  }
+
+  // Add block and connect to start
+  _prepend(block) {
+    let start;
+    const { node } = block;
+    this._graph.add(node);
+
+    for (start of Array.from(this._state.start)) {
+      node.connect(start);
+    }
+
+    if (!this._state.end.length) {
+      this._state.end = [node];
+    }
+    this._state.start = [node];
+
+    this._state.nodes.push(node);
+    if (!node.outputs.length) {
+      this._state.tail.push(node);
+    }
+  }
+
+  // Insert loose block
+  _insert(block) {
+    const { node } = block;
+    this._graph.add(node);
+
+    this._state.start.push(node);
+    this._state.end.push(node);
+
+    this._state.nodes.push(node);
+    if (!node.outputs.length) {
+      return this._state.tail.push(node);
+    }
+  }
+}
+
+class State {
+  constructor(op = null, multi, start, end, nodes, tail) {
+    this.op = op;
+    if (multi == null) {
+      multi = false;
+    }
+    this.multi = multi;
+    if (start == null) {
+      start = [];
+    }
+    this.start = start;
+    if (end == null) {
+      end = [];
+    }
+    this.end = end;
+    if (nodes == null) {
+      nodes = [];
+    }
+    this.nodes = nodes;
+    if (tail == null) {
+      tail = [];
+    }
+    this.tail = tail;
+  }
+}
+
+;// CONCATENATED MODULE: ./node_modules/shadergraph/src/factory/material.js
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+const material_debug = false;
+
+const tick = function () {
+  const now = +new Date();
+  return function (label) {
+    const delta = +new Date() - now;
+    console.log(label, delta + " ms");
+    return delta;
+  };
+};
+
+class material_Material {
+  constructor(vertex, fragment) {
+    this.vertex = vertex;
+    this.fragment = fragment;
+    if (material_debug) {
+      this.tock = tick();
+    }
+  }
+
+  build(options) {
+    return this.link(options);
+  }
+
+  link(options) {
+    if (options == null) {
+      options = {};
+    }
+    const uniforms = {};
+    const varyings = {};
+    const attributes = {};
+
+    const vertex = this.vertex.link("main");
+    const fragment = this.fragment.link("main");
+
+    for (const shader of [vertex, fragment]) {
+      for (const key in shader.uniforms) {
+        const value = shader.uniforms[key];
+        uniforms[key] = value;
+      }
+      for (const key in shader.varyings) {
+        const value = shader.varyings[key];
+        varyings[key] = value;
+      }
+      for (const key in shader.attributes) {
+        const value = shader.attributes[key];
+        attributes[key] = value;
+      }
+    }
+
+    options.vertexShader = vertex.code;
+    options.vertexGraph = vertex.graph;
+    options.fragmentShader = fragment.code;
+    options.fragmentGraph = fragment.graph;
+    options.attributes = attributes;
+    options.uniforms = uniforms;
+    options.varyings = varyings;
+    options.inspect = () =>
+      inspect(
+        "Vertex Shader",
+        vertex,
+        "Fragment Shader",
+        fragment.graph
+      );
+
+    if (material_debug) {
+      this.tock("Material build");
+    }
+
+    return options;
+  }
+
+  inspect() {
+    return inspect(
+      "Vertex Shader",
+      this.vertex,
+      "Fragment Shader",
+      this.fragment.graph
+    );
+  }
+}
+
+;// CONCATENATED MODULE: ./node_modules/shadergraph/src/factory/library.js
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+/*
+  Snippet library
+
+  Takes:
+    - Hash of snippets: named library
+    - (name) -> getter: dynamic lookup
+    - nothing:          no library, only pass in inline source code
+
+  If 'name' contains any of "{;(#" it is assumed to be direct GLSL code.
+*/
+const library = function (language, snippets, load) {
+  let callback = null;
+  let used = {};
+
+  if (snippets != null) {
+    if (typeof snippets === "function") {
+      callback = (name) => load(language, name, snippets(name));
+    } else if (typeof snippets === "object") {
+      callback = function (name) {
+        if (snippets[name] == null) {
+          throw new Error(`Unknown snippet \`${name}\``);
+        }
+        return load(language, name, snippets[name]);
+      };
+    }
+  }
+
+  const inline = (code) => load(language, "", code);
+
+  if (callback == null) {
+    return inline;
+  }
+
+  const fetch = function (name) {
+    if (name.match(/[{;]/)) {
+      return inline(name);
+    }
+    used[name] = true;
+    return callback(name);
+  };
+
+  fetch.used = function (_used) {
+    if (_used == null) {
+      _used = used;
+    }
+    return (used = _used);
+  };
+
+  return fetch;
+};
+
+;// CONCATENATED MODULE: ./node_modules/shadergraph/src/factory/queue.js
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+// Least-recently-used queue for key expiry via linked list
+const queue = function (limit) {
+  if (limit == null) {
+    limit = 100;
+  }
+  const map = {};
+
+  let head = null;
+  let tail = null;
+  let count = 0;
+
+  // Insert at front
+  const add = function (item) {
+    item.prev = null;
+    item.next = head;
+
+    if (head != null) {
+      head.prev = item;
+    }
+
+    head = item;
+    if (tail == null) {
+      return (tail = item);
+    }
+  };
+
+  // Remove from list
+  const remove = function (item) {
+    const { prev } = item;
+    const { next } = item;
+
+    if (prev != null) {
+      prev.next = next;
+    }
+    if (next != null) {
+      next.prev = prev;
+    }
+
+    if (head === item) {
+      head = next;
+    }
+    if (tail === item) {
+      return (tail = prev);
+    }
+  };
+
+  // Push key to top of list
+  return function (key) {
+    let dead, item;
+    if ((item = map[key]) && item !== head) {
+      // Already in queue
+      remove(item);
+      add(item);
+    } else {
+      // Check capacity
+      if (count === limit) {
+        // Pop tail
+        dead = tail.key;
+        remove(tail);
+
+        // Expire key
+        delete map[dead];
+      } else {
+        count++;
+      }
+
+      // Replace head
+      item = { next: head, prev: null, key };
+      add(item);
+
+      // Map record for lookup
+      map[key] = item;
+    }
+
+    // Return expired key
+    return dead;
+  };
+};
+
+;// CONCATENATED MODULE: ./node_modules/shadergraph/src/factory/cache.js
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+/*
+  Cache decorator
+  Fetches snippets once, clones for reuse
+  Inline code is hashed to avoid bloat
+*/
+
+
+
+const cache = function (fetch) {
+  const cached = {};
+  const push = queue(100);
+
+  // Snippet factory
+  return function (name) {
+    const key = name.length > 32 ? "##" + hash(name).toString(16) : name;
+
+    // Push new key onto queue, see if an old key expired
+    const expire = push(key);
+    if (expire != null) {
+      delete cached[expire];
+    }
+
+    // Clone cached snippet
+    if (cached[key] == null) {
+      cached[key] = fetch(name);
+    }
+    return cached[key].clone();
+  };
+};
+
+;// CONCATENATED MODULE: ./node_modules/shadergraph/src/factory/index.js
+
+
+
+
+
+
+
+
+;// CONCATENATED MODULE: ./node_modules/shadergraph/src/glsl/compile.js
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS205: Consider reworking code to avoid use of IIFEs
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+/*
+  Compile snippet back into GLSL, but with certain symbols replaced by prefixes / placeholders
+*/
+
+const compile_compile = function (program) {
+  const { code, signatures } = program;
+
+  // Prepare list of placeholders
+  const placeholders = replaced(signatures);
+
+  // Compile
+  const assembler = string_compiler(code, placeholders);
+
+  return [signatures, assembler];
+};
+
+const replaced = function (signatures) {
+  const out = {};
+  const s = (sig) => (out[sig.name] = true);
+
+  s(signatures.main);
+
+  // Prefix all global symbols
+  for (const key of [
+    "external",
+    "internal",
+    "varying",
+    "uniform",
+    "attribute",
+  ]) {
+    for (const sig of signatures[key]) {
+      s(sig);
+    }
+  }
+
+  return out;
+};
+
+/*
+String-replacement based compiler
+*/
+const string_compiler = function (code, placeholders) {
+  // Make regexp for finding placeholders
+  // Replace on word boundaries
+  let key;
+  const re = new RegExp(
+    "\\b(" +
+      (() => {
+        const result = [];
+        for (key in placeholders) {
+          result.push(key);
+        }
+        return result;
+      })().join("|") +
+      ")\\b",
+    "g"
+  );
+
+  // Strip comments
+  code = code.replace(/\/\/[^\n]*/g, "");
+  code = code.replace(/\/\*([^*]|\*[^/])*\*\//g, "");
+
+  // Strip all preprocessor commands (lazy)
+  //code = code.replace /^#[^\n]*/mg, ''
+
+  // Assembler function that takes namespace prefix and exceptions
+  // and returns GLSL source code
+  return function (prefix, exceptions, defines) {
+    let key;
+    if (prefix == null) {
+      prefix = "";
+    }
+    if (exceptions == null) {
+      exceptions = {};
+    }
+    if (defines == null) {
+      defines = {};
+    }
+    const replace = {};
+    for (key in placeholders) {
+      replace[key] = exceptions[key] != null ? key : prefix + key;
+    }
+
+    const compiled = code.replace(re, (key) => replace[key]);
+
+    const defs = (() => {
+      const result1 = [];
+      for (key in defines) {
+        const value = defines[key];
+        result1.push(`#define ${key} ${value}`);
+      }
+      return result1;
+    })();
+    if (defs.length) {
+      defs.push("");
+    }
+    return defs.join("\n") + compiled;
+  };
+};
+
+// EXTERNAL MODULE: ./node_modules/glsl-tokenizer/string.js
+var string = __webpack_require__(9932);
+var string_default = /*#__PURE__*/__webpack_require__.n(string);
+// EXTERNAL MODULE: ./node_modules/@sicmutils/glsl-parser/direct.js
+var direct = __webpack_require__(3036);
+var direct_default = /*#__PURE__*/__webpack_require__.n(direct);
+;// CONCATENATED MODULE: ./node_modules/shadergraph/src/glsl/decl.js
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+// AST node parsers
+
+
+
+
+
+
+
+const decl = {};
+
+decl.in = 0;
+decl.out = 1;
+decl.inout = 2;
+
+const get = (n) => n.token.data;
+
+decl.node = function (node) {
+  if (
+    (node.children[5] != null ? node.children[5].type : undefined) ===
+    "function"
+  ) {
+    return decl.function(node);
+  } else if ((node.token != null ? node.token.type : undefined) === "keyword") {
+    return decl.external(node);
+  }
+};
+
+decl.external = function (node) {
+  //    console.log 'external', node
+  let c = node.children;
+
+  let storage = get(c[1]);
+  const type = get(c[4]);
+  const list = c[5];
+
+  if (!["attribute", "uniform", "varying"].includes(storage)) {
+    storage = "global";
+  }
+
+  const out = [];
+
+  for (let i = 0; i < list.children.length; i++) {
+    c = list.children[i];
+    if (c.type === "ident") {
+      const ident = get(c);
+      const next = list.children[i + 1];
+      const quant = (next != null ? next.type : undefined) === "quantifier";
+
+      out.push({
+        decl: "external",
+        storage,
+        type,
+        ident,
+        quant: !!quant,
+        count: quant,
+      });
+    }
+  }
+
+  return out;
+};
+
+decl.function = function (node) {
+  const c = node.children;
+
+  //    console.log 'function', node
+
+  const storage = get(c[1]);
+  const type = get(c[4]);
+  const func = c[5];
+  const ident = get(func.children[0]);
+  const args = func.children[1];
+  const body = func.children[2];
+
+  const decls = Array.from(args.children).map((child) => decl.argument(child));
+
+  return [
+    {
+      decl: "function",
+      storage,
+      type,
+      ident,
+      body: !!body,
+      args: decls,
+    },
+  ];
+};
+
+decl.argument = function (node) {
+  const c = node.children;
+
+  //    console.log 'argument', node
+
+  const storage = get(c[1]);
+  const inout = get(c[2]);
+  const type = get(c[4]);
+  const list = c[5];
+  const ident = get(list.children[0]);
+  const quant = list.children[1];
+
+  const count = quant ? quant.children[0].token.data : undefined;
+
+  return {
+    decl: "argument",
+    storage,
+    inout,
+    type,
+    ident,
+    quant: !!quant,
+    count,
+  };
+};
+
+decl.param = function (dir, storage, spec, quant, count) {
+  let prefix = [];
+  if (storage != null) {
+    prefix.push(storage);
+  }
+  if (spec != null) {
+    prefix.push(spec);
+  }
+  prefix.push("");
+
+  prefix = prefix.join(" ");
+  const suffix = quant ? "[" + count + "]" : "";
+  if (dir !== "") {
+    dir += " ";
+  }
+
+  const f = (name, long) => (long ? dir : "") + `${prefix}${name}${suffix}`;
+  f.split = (dir) => decl.param(dir, storage, spec, quant, count);
+
+  return f;
+};
+
+// Three.js sugar
+const win = typeof window !== "undefined";
+const threejs = win && !!window.THREE;
+
+const defaults = {
+  int: 0,
+  float: 0,
+  vec2: threejs ? external_THREE_.Vector2 : null,
+  vec3: threejs ? external_THREE_.Vector3 : null,
+  vec4: threejs ? external_THREE_.Vector4 : null,
+  mat2: null,
+  mat3: threejs ? external_THREE_.Matrix3 : null,
+  mat4: threejs ? external_THREE_.Matrix4 : null,
+  sampler2D: 0,
+  samplerCube: 0,
+};
+
+const three = {
+  int: "i",
+  float: "f",
+  vec2: "v2",
+  vec3: "v3",
+  vec4: "v4",
+  mat2: "m2",
+  mat3: "m3",
+  mat4: "m4",
+  sampler2D: "t",
+  samplerCube: "t",
+};
+
+decl.type = function (name, spec, quant, count, dir, storage) {
+  const dirs = {
+    in: decl.in,
+    out: decl.out,
+    inout: decl.inout,
+  };
+
+  const storages = { const: "const" };
+
+  let type = three[spec];
+  if (quant) {
+    type += "v";
+  }
+
+  let value = defaults[spec];
+  if (value != null ? value.call : undefined) {
+    value = new value();
+  }
+  if (quant) {
+    value = [value];
+  }
+
+  const inout = dirs[dir] != null ? dirs[dir] : dirs.in;
+  storage = storages[storage];
+
+  const param = decl.param(dir, storage, spec, quant, count);
+  return new Definition(name, type, spec, param, value, inout);
+};
+
+class Definition {
+  constructor(name, type, spec, param, value, inout, meta) {
+    this.name = name;
+    this.type = type;
+    this.spec = spec;
+    this.param = param;
+    this.value = value;
+    this.inout = inout;
+    this.meta = meta;
+  }
+
+  split() {
+    // Split inouts
+    const isIn = this.meta.shadowed != null;
+    const dir = isIn ? "in" : "out";
+    const inout = isIn ? decl.in : decl.out;
+    const param = this.param.split(dir);
+    return new Definition(
+      this.name,
+      this.type,
+      this.spec,
+      param,
+      this.value,
+      inout
+    );
+  }
+
+  copy(name, meta) {
+    return new Definition(
+      name != null ? name : this.name,
+      this.type,
+      this.spec,
+      this.param,
+      this.value,
+      this.inout,
+      meta
+    );
+  }
+}
+
+;// CONCATENATED MODULE: ./node_modules/shadergraph/src/glsl/constants.js
+const SHADOW_ARG = "_i_o";
+const RETURN_ARG = "return";
+
+;// CONCATENATED MODULE: ./node_modules/shadergraph/src/glsl/parse.js
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS201: Simplify complex destructure assignments
+ * DS205: Consider reworking code to avoid use of IIFEs
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+
+let parse_debug = false;
+
+/*
+parse GLSL into AST
+extract all global symbols and make type signatures
+*/
+// Parse a GLSL snippet
+const parse = function (name, code) {
+  const ast = parseGLSL(name, code);
+  return processAST(ast, code);
+};
+
+// Parse GLSL language into AST
+const parseGLSL = function (name, code) {
+  let ast, tock;
+  let errors = [];
+  if (parse_debug) {
+    tock = parse_tick();
+  }
+
+  try {
+    const tokens = string_default()(code);
+    ast = direct_default()(tokens);
+  } catch (e) {
+    errors = [{ message: e }];
+  }
+
+  if (parse_debug) {
+    tock("GLSL Tokenize & Parse");
+  }
+
+  const fmt = function (code) {
+    code = code.split("\n");
+    const max = ("" + code.length).length;
+    const pad = function (v) {
+      if ((v = "" + v).length < max) {
+        return ("       " + v).slice(-max);
+      } else {
+        return v;
+      }
+    };
+    return code.map((line, i) => `${pad(i + 1)}: ${line}`).join("\n");
+  };
+
+  if (!ast || errors.length) {
+    if (!name) {
+      name = "(inline code)";
+    }
+    console.warn(fmt(code));
+    for (const error of errors) {
+      console.error(`${name} -`, error.message);
+    }
+    throw new Error("GLSL parse error");
+  }
+
+  return ast;
+};
+
+// Process AST for compilation
+const processAST = function (ast, code) {
+  let tock;
+  if (parse_debug) {
+    tock = parse_tick();
+  }
+
+  // Walk AST tree and collect global declarations
+  const symbols = [];
+  walk(mapSymbols, collect(symbols), ast, "");
+
+  // Sort symbols into bins
+  const [main, internals, externals] = Array.from(sortSymbols(symbols));
+
+  // Extract storage/type signatures of symbols
+  const signatures = extractSignatures(main, internals, externals);
+
+  if (parse_debug) {
+    tock("GLSL AST");
+  }
+
+  return { ast, code, signatures };
+};
+
+// Extract functions and external symbols from AST
+const mapSymbols = function (node, collect) {
+  switch (node.type) {
+    case "decl":
+      collect(decl.node(node));
+      return false;
+  }
+  return true;
+};
+
+const collect = (out) =>
+  function (value) {
+    if (value != null) {
+      Array.from(value).map((obj) => out.push(obj));
+    }
+  };
+
+// Identify internals, externals and main function
+const sortSymbols = function (symbols) {
+  let main = null;
+  const internals = [];
+  let externals = [];
+  const maybe = {};
+  let found = false;
+
+  for (const s of Array.from(symbols)) {
+    if (!s.body) {
+      // Unmarked globals are definitely internal
+      if (s.storage === "global") {
+        internals.push(s);
+
+        // Possible external
+      } else {
+        externals.push(s);
+        maybe[s.ident] = true;
+      }
+    } else {
+      // Remove earlier forward declaration
+      if (maybe[s.ident]) {
+        externals = Array.from(externals).filter((e) => e.ident !== s.ident);
+        delete maybe[s.ident];
+      }
+
+      // Internal function
+      internals.push(s);
+
+      // Last function is main
+      // unless there is a function called 'main'
+      if (s.ident === "main") {
+        main = s;
+        found = true;
+      } else if (!found) {
+        main = s;
+      }
+    }
+  }
+
+  return [main, internals, externals];
+};
+
+// Generate type signatures and appropriate ins/outs
+const extractSignatures = function (main, internals, externals) {
+  let symbol;
+  const sigs = {
+    uniform: [],
+    attribute: [],
+    varying: [],
+    external: [],
+    internal: [],
+    global: [],
+    main: null,
+  };
+
+  const defn = (symbol) =>
+    decl.type(
+      symbol.ident,
+      symbol.type,
+      symbol.quant,
+      symbol.count,
+      symbol.inout,
+      symbol.storage
+    );
+
+  const func = function (symbol, inout) {
+    let d;
+    const signature = Array.from(symbol.args).map((arg) => defn(arg));
+
+    // Split inouts into in and out
+    for (d of Array.from(signature)) {
+      if (d.inout === decl.inout) {
+        const a = d;
+        const b = d.copy();
+
+        a.inout = decl["in"];
+        b.inout = decl.out;
+        b.meta = { shadow: a.name };
+        b.name += SHADOW_ARG;
+        a.meta = { shadowed: b.name };
+
+        signature.push(b);
+      }
+    }
+
+    // Add output for return type
+    if (symbol.type !== "void") {
+      signature.unshift(decl.type(RETURN_ARG, symbol.type, false, "", "out"));
+    }
+
+    // Make type string
+    const inTypes = (() => {
+      const result = [];
+      for (d of Array.from(signature)) {
+        if (d.inout === decl["in"]) {
+          result.push(d.type);
+        }
+      }
+      return result;
+    })().join(",");
+    const outTypes = (() => {
+      const result1 = [];
+      for (d of Array.from(signature)) {
+        if (d.inout === decl.out) {
+          result1.push(d.type);
+        }
+      }
+      return result1;
+    })().join(",");
+    const type = `(${inTypes})(${outTypes})`;
+
+    return {
+      name: symbol.ident,
+      type,
+      signature,
+      inout,
+      spec: symbol.type,
+    };
+  };
+
+  // Main
+  sigs.main = func(main, decl.out);
+
+  // Internals (for name replacement only)
+  for (symbol of Array.from(internals)) {
+    sigs.internal.push({
+      name: symbol.ident,
+    });
+  }
+
+  // Externals
+  for (symbol of Array.from(externals)) {
+    let def;
+    switch (symbol.decl) {
+      // Uniforms/attributes/varyings
+      case "external":
+        def = defn(symbol);
+        sigs[symbol.storage].push(def);
+        break;
+
+      // Callbacks
+      case "function":
+        def = func(symbol, decl["in"]);
+        sigs.external.push(def);
+        break;
+    }
+  }
+
+  return sigs;
+};
+
+// Walk AST, apply map and collect values
+parse_debug = false;
+
+const walk = function (map, collect, node, indent) {
+  parse_debug &&
+    console.log(
+      indent,
+      node.type,
+      node.token != null ? node.token.data : undefined,
+      node.token != null ? node.token.type : undefined
+    );
+
+  const recurse = map(node, collect);
+
+  if (recurse) {
+    for (let i = 0; i < node.children.length; i++) {
+      const child = node.children[i];
+      walk(map, collect, child, indent + "  ", parse_debug);
+    }
+  }
+
+  return null;
+};
+
+// #####
+
+const parse_tick = function () {
+  const now = +new Date();
+  return function (label) {
+    const delta = +new Date() - now;
+    console.log(label, delta + " ms");
+    return delta;
+  };
+};
+
+;// CONCATENATED MODULE: ./node_modules/shadergraph/src/glsl/generate.js
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS205: Consider reworking code to avoid use of IIFEs
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+/*
+  GLSL code generator for compiler and linker stubs
+*/
+
+// Check if shadow outlet
+function unshadow(name) {
+  const real = name.replace(SHADOW_ARG, "");
+  if (real !== name) {
+    return real;
+  } else {
+    return null;
+  }
+}
+
+// Line joiners
+function lines(lines) {
+  return lines.join("\n");
+}
+function list(lines) {
+  return lines.join(", ");
+}
+function statements(lines) {
+  return lines.join(";\n");
+}
+
+// Function body
+function body(entry) {
+  return {
+    entry,
+    type: "void",
+    params: [],
+    signature: [],
+    return: "",
+    vars: {},
+    calls: [],
+    post: [],
+    chain: {},
+  };
+}
+
+// Symbol define
+function generate_define(a, b) {
+  return `#define ${a} ${b}`;
+}
+
+// Function define
+function fn(type, entry, params, vars, calls) {
+  return `${type} ${entry}(${params}) {\n${vars}${calls}}`;
+}
+
+// Function invocation
+function invoke(ret, entry, args) {
+  ret = ret ? `${ret} = ` : "";
+  args = list(args);
+  return `  ${ret}${entry}(${args})`;
+}
+
+// Compare two signatures
+function same(a, b) {
+  for (let i = 0; i < a.length; i++) {
+    const A = a[i];
+    const B = b[i];
+    if (!B) {
+      return false;
+    }
+    if (A.type !== B.type) {
+      return false;
+    }
+    if ((A.name === RETURN_ARG) !== (B.name === RETURN_ARG)) {
+      return false;
+    }
+  }
+  return true;
+}
+
+// Generate call signature for module invocation
+function call(lookup, dangling, entry, signature, body) {
+  const args = [];
+  let ret = "";
+
+  for (let arg of Array.from(signature)) {
+    let id, shadow;
+    const { name } = arg;
+
+    let copy = (id = lookup(name));
+    let other = null;
+    let meta = null;
+    let omit = false;
+
+    const isReturn = name === RETURN_ARG;
+
+    // Shadowed inout: input side
+    if ((shadow = arg.meta != null ? arg.meta.shadowed : undefined)) {
+      other = lookup(shadow);
+      if (other) {
+        body.vars[other] = "  " + arg.param(other);
+        body.calls.push(`  ${other} = ${id}`);
+
+        if (!dangling(shadow)) {
+          arg = arg.split();
+        } else {
+          meta = { shadowed: other };
+        }
+      }
+    }
+
+    // Shadowed inout: output side
+    if ((shadow = arg.meta != null ? arg.meta.shadow : undefined)) {
+      other = lookup(shadow);
+      if (other) {
+        if (!dangling(shadow)) {
+          arg = arg.split();
+          omit = true;
+        } else {
+          meta = { shadow: other };
+          continue;
+        }
+      }
+    }
+
+    if (isReturn) {
+      // Capture return value
+      ret = id;
+    } else if (!omit) {
+      // Pass all non return, non shadow args in
+      args.push(other != null ? other : id);
+    }
+
+    // Export argument if unconnected
+    if (dangling(name)) {
+      let op = "push";
+      if (isReturn) {
+        if (body.return === "") {
+          op = "unshift";
+          // Preserve 'return' arg name
+          copy = name;
+          body.type = arg.spec;
+          body.return = `  return ${id}`;
+          body.vars[id] = "  " + arg.param(id);
+        } else {
+          body.vars[id] = "  " + arg.param(id);
+          body.params.push(arg.param(id, true));
+        }
+      } else {
+        body.params.push(arg.param(id, true));
+      }
+
+      // Copy argument into new signature
+      arg = arg.copy(copy, meta);
+      body.signature[op](arg);
+    } else {
+      body.vars[id] = "  " + arg.param(id);
+    }
+  }
+
+  return body.calls.push(invoke(ret, entry, args));
+}
+
+// Assemble main() function from body and call reference
+function build(body, calls) {
+  const { entry } = body;
+  let code = null;
+
+  // Check if we're only calling one snippet with identical signature
+  // and not building void main();
+  if (calls && calls.length === 1 && entry !== "main") {
+    const b = calls[0].module;
+
+    if (same(body.signature, b.main.signature)) {
+      code = generate_define(entry, b.entry);
+    }
+  }
+
+  // Otherwise build function body
+  if (code == null) {
+    let vars = (() => {
+      const result = [];
+      for (const v in body.vars) {
+        const decl = body.vars[v];
+        result.push(decl);
+      }
+      return result;
+    })();
+    ({ calls } = body);
+    const { post } = body;
+    let { params } = body;
+    const { type } = body;
+    const ret = body.return;
+
+    calls = calls.concat(post);
+    if (ret !== "") {
+      calls.push(ret);
+    }
+    calls.push("");
+
+    if (vars.length) {
+      vars.push("");
+      vars = statements(vars) + "\n";
+    } else {
+      vars = "";
+    }
+
+    calls = statements(calls);
+    params = list(params);
+
+    code = fn(type, entry, params, vars, calls);
+  }
+
+  return {
+    signature: body.signature,
+    code,
+    name: entry,
+  };
+}
+
+// Build links to other callbacks
+function links(links) {
+  const out = {
+    defs: [],
+    bodies: [],
+  };
+
+  for (const l of Array.from(links)) {
+    generate_link(l, out);
+  }
+
+  out.defs = lines(out.defs);
+  out.bodies = statements(out.bodies);
+
+  if (out.defs === "") {
+    delete out.defs;
+  }
+  if (out.bodies === "") {
+    delete out.bodies;
+  }
+
+  return out;
+}
+
+// Link a module's entry point as a callback
+const generate_link = (link, out) => {
+  let arg, list;
+  const { module, name, external } = link;
+  const { main } = module;
+  const { entry } = module;
+
+  // If signatures match, #define alias for the symbol
+  if (same(main.signature, external.signature)) {
+    return out.defs.push(generate_define(name, entry));
+  }
+
+  // Signatures differ, build one-line callback to match defined prototype
+
+  // Map names to names
+  const ins = [];
+  const outs = [];
+  let map = {};
+  const returnVar = [module.namespace, RETURN_ARG].join("");
+
+  for (arg of Array.from(external.signature)) {
+    list = arg.inout === IN ? ins : outs;
+    list.push(arg);
+  }
+
+  for (arg of Array.from(main.signature)) {
+    list = arg.inout === IN ? ins : outs;
+    const other = list.shift();
+    let _name = other.name;
+
+    // Avoid 'return' keyword
+    if (_name === RETURN_ARG) {
+      _name = returnVar;
+    }
+
+    map[arg.name] = _name;
+  }
+
+  // Build function prototype to invoke the other side
+  let _lookup = (name) => map[name];
+  const _dangling = () => true;
+
+  const inner = body();
+  call(_lookup, _dangling, entry, main.signature, inner);
+  inner.entry = entry;
+
+  // Avoid 'return' keyword
+  map = { return: returnVar };
+  _lookup = (name) => (map[name] != null ? map[name] : name);
+
+  // Build wrapper function for the calling side
+  const outer = body();
+  call(_lookup, _dangling, entry, external.signature, outer);
+
+  outer.calls = inner.calls;
+  outer.entry = name;
+
+  out.bodies.push(build(inner).code.split(" {")[0]);
+  return out.bodies.push(build(outer).code);
+};
+
+// Remove all function prototypes to avoid redefinition errors
+function defuse(code) {
+  // Don't try this at home kids
+  const re =
+    /([A-Za-z0-9_]+\s+)?[A-Za-z0-9_]+\s+[A-Za-z0-9_]+\s*\([^)]*\)\s*;\s*/gm;
+  const strip = (code) => code.replace(re, (_m) => "");
+
+  // Split into scopes by braces
+  const blocks = code.split(/(?=[{}])/g);
+  let level = 0;
+  for (let i = 0; i < blocks.length; i++) {
+    const b = blocks[i];
+    switch (b[0]) {
+      case "{":
+        level++;
+        break;
+      case "}":
+        level--;
+        break;
+    }
+
+    // Only mess with top level scope
+    if (level === 0) {
+      // Preprocessor lines will fuck us up. Split on them.
+      const hash = b.split(/^[ \t]*#/m);
+      for (let j = 0; j < hash.length; j++) {
+        let line = hash[j];
+        if (j > 0) {
+          // Trim off preprocessor directive
+          line = line.split(/\n/);
+          const head = line.shift();
+          const rest = line.join("\n");
+
+          // Process rest
+          hash[j] = [head, strip(rest)].join("\n");
+        } else {
+          // Process entire line
+          hash[j] = strip(line);
+        }
+      }
+
+      // Reassemble
+      blocks[i] = hash.join("#");
+    }
+  }
+
+  return (code = blocks.join(""));
+}
+
+// Remove duplicate uniforms / varyings / attributes
+function dedupe(code) {
+  const map = {};
+  const re =
+    /((attribute|uniform|varying)\s+)[A-Za-z0-9_]+\s+([A-Za-z0-9_]+)\s*(\[[^\]]*\]\s*)?;\s*/gm;
+  return code.replace(re, function (m, qual, type, name, _struct) {
+    if (map[name]) {
+      return "";
+    }
+    map[name] = true;
+    return m;
+  });
+}
+
+// Move definitions to top so they compile properly
+function hoist(code) {
+  const filter = function (lines, re) {
+    const defs = [];
+    const out = [];
+    for (const line of Array.from(lines)) {
+      const list = line.match(re) ? defs : out;
+      list.push(line);
+    }
+
+    return defs.concat(out);
+  };
+
+  let lines = code.split("\n");
+
+  // Hoist symbol defines to the top so (re)definitions use the right alias
+  lines = filter(lines, /^#define ([^ ]+ _pg_[0-9]+_|_pg_[0-9]+_ [^ ]+)$/);
+
+  // Hoist extensions
+  lines = filter(lines, /^#extension/);
+
+  return lines.join("\n");
+}
+
+;// CONCATENATED MODULE: ./node_modules/shadergraph/src/glsl/index.js
+
+
+
+
+
+;// CONCATENATED MODULE: ./node_modules/shadergraph/src/index.js
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+
+
+
+const { library: src_library, cache: src_cache } = src_factory_namespaceObject;
+const { visualize: src_visualize, inspect: src_inspect } = visualize_namespaceObject;
+const { Snippet: src_Snippet } = linker_namespaceObject;
+
+const src_merge = function (a, b = {}) {
+  const out = {};
+  for (let key in a) {
+    out[key] = b[key] || a[key];
+  }
+  return out;
+};
+
+class ShaderGraph {
+  constructor(snippets, config) {
+    const defaults = {
+      globalUniforms: false,
+      globalVaryings: true,
+      globalAttributes: true,
+      globals: [],
+      autoInspect: false,
+    };
+
+    this.config = src_merge(defaults, config);
+    this.fetch = src_cache(src_library(src_glsl_namespaceObject, snippets, src_Snippet.load));
+  }
+
+  shader(config) {
+    if (config == null) {
+      config = {};
+    }
+    const _config = src_merge(this.config, config);
+    return new Factory(src_glsl_namespaceObject, this.fetch, _config);
+  }
+
+  material(config) {
+    return new material_Material(this.shader(config), this.shader(config));
+  }
+
+  inspect(shader) {
+    return ShaderGraph.inspect(shader);
+  }
+  visualize(shader) {
+    return ShaderGraph.visualize(shader);
+  }
+
+  // Static visualization method
+  static inspect(shader) {
+    return src_inspect(shader);
+  }
+  static visualize(shader) {
+    return src_visualize(shader);
+  }
+}
+
+// Expose class hierarchy
+ShaderGraph.Block = Block;
+ShaderGraph.Factory = src_factory_namespaceObject;
+ShaderGraph.GLSL = src_glsl_namespaceObject;
+ShaderGraph.Graph = src_graph_namespaceObject;
+ShaderGraph.Linker = linker_namespaceObject;
+ShaderGraph.Visualize = visualize_namespaceObject;
+
+function src_load(snippets, config = {}) {
+  return new ShaderGraph(snippets, config);
+}
+
+;// CONCATENATED MODULE: ./src/shaders/factory.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+const factory_Factory = function (snippets) {
+  function fetch(name) {
+    // Built-in library
+    const s = snippets[name];
+    if (s != null) {
+      return s;
+    }
+
+    // Load from <script> tags by ID
+    const ref = ["#", ".", ":", "["].includes(name[0]);
+    const sel = ref ? name : `#${name}`;
+    const element = document.querySelector(sel);
+    if (element != null && element.tagName === "SCRIPT") {
+      return element.textContent || element.innerText;
+    }
+
+    throw new Error(`Unknown shader \`${name}\``);
+  }
+
+  return src_load(fetch, { autoInspect: true });
+};
+
+;// CONCATENATED MODULE: ./src/shaders/index.js
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+const Snippets = {
+  "arrow.position": arrow_position,
+  "axis.position": axis_position,
+  "cartesian.position": cartesian_position,
+  "cartesian4.position": cartesian4_position,
+  "clamp.position": clamp_position,
+  "color.opaque": color_opaque,
+  "face.position": face_position,
+  "face.position.normal": face_position_normal,
+  "float.encode": float_encode,
+  "float.index.pack": float_index_pack,
+  "float.stretch": float_stretch,
+  "fragment.clip.dashed": fragment_clip_dashed,
+  "fragment.clip.dotted": fragment_clip_dotted,
+  "fragment.clip.ends": fragment_clip_ends,
+  "fragment.clip.proximity": fragment_clip_proximity,
+  "fragment.color": fragment_color,
+  "fragment.map.rgba": fragment_map_rgba,
+  "fragment.solid": fragment_solid,
+  "fragment.transparent": fragment_transparent,
+  "grid.position": grid_position,
+  "grow.position": grow_position,
+  "join.position": join_position,
+  "label.alpha": label_alpha,
+  "label.map": label_map,
+  "label.outline": label_outline,
+  "layer.position": layer_position,
+  "lerp.depth": lerp_depth,
+  "lerp.height": lerp_height,
+  "lerp.items": lerp_items,
+  "lerp.width": lerp_width,
+  "line.position": line_position,
+  "map.2d.data": map_2d_data,
+  "map.2d.data.wrap": map_2d_data_wrap,
+  "map.xyzw.2dv": map_xyzw_2dv,
+  "map.xyzw.align": map_xyzw_align,
+  "map.xyzw.texture": map_xyzw_texture,
+  "mesh.fragment.color": mesh_fragment_color,
+  "mesh.fragment.map": mesh_fragment_map,
+  "mesh.fragment.mask": mesh_fragment_mask,
+  "mesh.fragment.material": mesh_fragment_material,
+  "mesh.fragment.shaded": mesh_fragment_shaded,
+  "mesh.fragment.texture": mesh_fragment_texture,
+  "mesh.gamma.in": mesh_gamma_in,
+  "mesh.gamma.out": mesh_gamma_out,
+  "mesh.map.uvwo": mesh_map_uvwo,
+  "mesh.position": mesh_position,
+  "mesh.vertex.color": mesh_vertex_color,
+  "mesh.vertex.mask": mesh_vertex_mask,
+  "mesh.vertex.position": mesh_vertex_position,
+  "move.position": move_position,
+  "object.mask.default": object_mask_default,
+  "point.alpha.circle": point_alpha_circle,
+  "point.alpha.circle.hollow": point_alpha_circle_hollow,
+  "point.alpha.generic": point_alpha_generic,
+  "point.alpha.generic.hollow": point_alpha_generic_hollow,
+  "point.edge": point_edge,
+  "point.fill": point_fill,
+  "point.mask.circle": point_mask_circle,
+  "point.mask.diamond": point_mask_diamond,
+  "point.mask.down": point_mask_down,
+  "point.mask.left": point_mask_left,
+  "point.mask.right": point_mask_right,
+  "point.mask.square": point_mask_square,
+  "point.mask.up": point_mask_up,
+  "point.position": point_position,
+  "point.size.uniform": point_size_uniform,
+  "point.size.varying": point_size_varying,
+  "polar.position": polar_position,
+  "project.position": project_position,
+  "project.readback": project_readback,
+  "raw.position.scale": raw_position_scale,
+  "repeat.position": repeat_position,
+  "resample.padding": resample_padding,
+  "resample.relative": resample_relative,
+  "reveal.mask": reveal_mask,
+  "root.position": root_position,
+  "sample.2d": sample_2d,
+  "scale.position": scale_position,
+  "screen.map.stpq": screen_map_stpq,
+  "screen.map.xy": screen_map_xy,
+  "screen.map.xyzw": screen_map_xyzw,
+  "screen.pass.uv": screen_pass_uv,
+  "screen.position": screen_position,
+  "slice.position": slice_position,
+  "spherical.position": spherical_position,
+  "split.position": split_position,
+  "spread.position": spread_position,
+  "sprite.fragment": sprite_fragment,
+  "sprite.position": sprite_position,
+  "stereographic.position": stereographic_position,
+  "stereographic4.position": stereographic4_position,
+  "stpq.sample.2d": stpq_sample_2d,
+  "stpq.xyzw.2d": stpq_xyzw_2d,
+  "strip.position.normal": strip_position_normal,
+  "style.color": style_color,
+  "subdivide.depth": subdivide_depth,
+  "subdivide.depth.lerp": subdivide_depth_lerp,
+  "subdivide.height": subdivide_height,
+  "subdivide.height.lerp": subdivide_height_lerp,
+  "subdivide.items": subdivide_items,
+  "subdivide.items.lerp": subdivide_items_lerp,
+  "subdivide.width": subdivide_width,
+  "subdivide.width.lerp": subdivide_width_lerp,
+  "surface.mask.hollow": surface_mask_hollow,
+  "surface.position": surface_position,
+  "surface.position.normal": surface_position_normal,
+  "ticks.position": ticks_position,
+  "transform3.position": transform3_position,
+  "transform4.position": transform4_position,
+  "view.position": view_position,
+};
+
+
+
+;// CONCATENATED MODULE: ./src/stage/animator.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS205: Consider reworking code to avoid use of IIFEs
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+class Animator {
+  constructor(context) {
+    this.context = context;
+    this.anims = [];
+  }
+
+  make(type, options) {
+    const anim = new Animation(this, this.context.time, type, options);
+    this.anims.push(anim);
+    return anim;
+  }
+
+  unmake(anim) {
+    return (this.anims = Array.from(this.anims).filter((a) => a !== anim));
+  }
+
+  update() {
+    const { time } = this.context;
+    return (this.anims = (() => {
+      const result = [];
+      for (const anim of Array.from(this.anims)) {
+        if (anim.update(time) !== false) {
+          result.push(anim);
+        }
+      }
+      return result;
+    })());
+  }
+
+  lerp(type, from, to, f, value) {
+    if (value == null) {
+      value = type.make();
+    }
+
+    // Use the most appropriate interpolation method for the type
+
+    // Direct lerp operator
+    if (type.lerp) {
+      value = type.lerp(from, to, value, f);
+
+      // Substitute emitter
+    } else if (type.emitter) {
+      const fromE = from.emitterFrom;
+      const toE = to.emitterTo;
+
+      if (fromE != null && toE != null && fromE === toE) {
+        fromE.lerp(f);
+        return fromE;
+      } else {
+        const emitter = type.emitter(from, to);
+        from.emitterFrom = emitter;
+        to.emitterTo = emitter;
+        emitter.lerp(f);
+        return emitter;
+      }
+
+      // Generic binary operator
+    } else if (type.op) {
+      const lerp = function (a, b) {
+        if (a === +a && b === +b) {
+          // Lerp numbers
+          return a + (b - a) * f;
+        } else {
+          // No lerp
+          if (f > 0.5) {
+            return b;
+          } else {
+            return a;
+          }
+        }
+      };
+
+      value = type.op(from, to, value, lerp);
+
+      // No lerp
+    } else {
+      value = f > 0.5 ? to : from;
+    }
+
+    return value;
+  }
+}
+
+class Animation {
+  constructor(animator, time, type, options) {
+    this.animator = animator;
+    this.time = time;
+    this.type = type;
+    this.options = options;
+    this.value = this.type.make();
+    this.target = this.type.make();
+
+    this.queue = [];
+  }
+
+  dispose() {
+    return this.animator.unmake(this);
+  }
+
+  set() {
+    let { target } = this;
+    let value = arguments.length > 1 ? [].slice.call(arguments) : arguments[0];
+
+    let invalid = false;
+    value = this.type.validate(value, target, () => (invalid = true));
+    if (!invalid) {
+      target = value;
+    }
+
+    this.cancel();
+    this.target = this.value;
+    this.value = target;
+    return this.notify();
+  }
+
+  getTime() {
+    const { clock } = this.options;
+    const time = clock ? clock.getTime() : this.time;
+    if (this.options.realtime) {
+      return time.time;
+    } else {
+      return time.clock;
+    }
+  }
+
+  cancel(from) {
+    let stage;
+    if (from == null) {
+      from = this.getTime();
+    }
+    const { queue } = this;
+
+    const cancelled = (() => {
+      const result = [];
+      for (stage of Array.from(queue)) {
+        if (stage.end >= from) {
+          result.push(stage);
+        }
+      }
+      return result;
+    })();
+    this.queue = (() => {
+      const result1 = [];
+      for (stage of Array.from(queue)) {
+        if (stage.end < from) {
+          result1.push(stage);
+        }
+      }
+      return result1;
+    })();
+
+    for (stage of Array.from(cancelled)) {
+      if (typeof stage.complete === "function") {
+        stage.complete(false);
+      }
+    }
+    if (typeof this.options.complete === "function") {
+      this.options.complete(false);
+    }
+  }
+
+  notify() {
+    return typeof this.options.step === "function"
+      ? this.options.step(this.value)
+      : undefined;
+  }
+
+  immediate(value, options) {
+    const { duration, delay, ease, step, complete } = options;
+
+    const time = this.getTime();
+
+    const start = time + delay;
+    const end = start + duration;
+
+    let invalid = false;
+    let target = this.type.make();
+    value = this.type.validate(value, target, function () {
+      invalid = true;
+      return null;
+    });
+    if (value !== undefined && !invalid) {
+      target = value;
+    }
+
+    this.cancel(start);
+    return this.queue.push({
+      from: null,
+      to: target,
+      start,
+      end,
+      ease,
+      step,
+      complete,
+    });
+  }
+
+  update(time) {
+    this.time = time;
+    if (this.queue.length === 0) {
+      return true;
+    }
+
+    const clock = this.getTime();
+    let { value } = this;
+    const { queue } = this;
+
+    let active = false;
+    while (!active) {
+      const stage = queue[0];
+
+      let { from } = stage;
+      const { to, start, end, step, complete, ease } = stage;
+
+      if (from == null) {
+        from = stage.from = this.type.clone(this.value);
+      }
+
+      let f = ease_clamp(
+        (clock - start) / Math.max(0.00001, end - start) || 0,
+        0,
+        1
+      );
+      if (f === 0) {
+        return;
+      } // delayed animation not yet active
+
+      const method = (() => {
+        switch (ease) {
+          case "linear":
+          case 0:
+            return null;
+          case "cosine":
+          case 1:
+            return cosine;
+          case "binary":
+          case 2:
+            return binary;
+          case "hold":
+          case 3:
+            return hold;
+          default:
+            return cosine;
+        }
+      })();
+      if (method != null) {
+        f = method(f);
+      }
+
+      active = f < 1;
+      value = active ? this.animator.lerp(this.type, from, to, f, value) : to;
+
+      //console.log 'animation step', f, from, to, value
+      if (typeof step === "function") {
+        step(value);
+      }
+
+      if (!active) {
+        if (typeof complete === "function") {
+          complete(true);
+        }
+        if (typeof this.options.complete === "function") {
+          this.options.complete(true);
+        }
+        queue.shift();
+        if (queue.length === 0) {
+          break;
+        } // end of queue
+      }
+    }
+
+    this.value = value;
+    return this.notify();
+  }
+}
+
+;// CONCATENATED MODULE: ./src/stage/api.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS101: Remove unnecessary use of Array.from
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS104: Avoid inline assignments
+ * DS202: Simplify dynamic range loops
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+class API {
+  v2() {
+    return this;
+  }
+
+  constructor(_context, _up, _targets) {
+    this._context = _context;
+    this._up = _up;
+    this._targets = _targets;
+    const root = this._context.controller.getRoot();
+
+    if (this._targets == null) {
+      this._targets = [root];
+    }
+    this.isRoot = this._targets.length === 1 && this._targets[0] === root;
+    this.isLeaf =
+      this._targets.length === 1 && this._targets[0].children == null;
+
+    // Look like an array
+    for (let i = 0; i < this._targets.length; i++) {
+      const t = this._targets[i];
+      this[i] = t;
+    }
+    this.length = this._targets.length;
+
+    // Primitive factory. This is where all API methods are assigned.
+    for (const type of Array.from(this._context.controller.getTypes())) {
+      if (!["root"].includes(type)) {
+        this[type] = (options, binds) => this.add(type, options, binds);
+      }
+    }
+  }
+
+  select(selector) {
+    const targets = this._context.model.select(
+      selector,
+      !this.isRoot ? this._targets : null
+    );
+    return this._push(targets);
+  }
+
+  eq(index) {
+    if (this._targets.length > index) {
+      return this._push([this._targets[index]]);
+    }
+    return this._push([]);
+  }
+
+  filter(callback) {
+    if (typeof callback === "string") {
+      const matcher = this._context.model._matcher(callback);
+      callback = (x) => matcher(x);
+    }
+
+    return this._push(this._targets.filter(callback));
+  }
+
+  map(callback) {
+    return api_range_(0, this.length, false).map((i) =>
+      callback(this[i], i, this)
+    );
+  }
+
+  each(callback) {
+    for (
+      let i = 0, end = this.length, asc = 0 <= end;
+      asc ? i < end : i > end;
+      asc ? i++ : i--
+    ) {
+      callback(this[i], i, this);
+    }
+    return this;
+  }
+
+  add(type, options, binds) {
+    // Make node/primitive
+    const { controller } = this._context;
+
+    // Auto-pop if targeting leaf
+    if (this.isLeaf) {
+      return this._pop().add(type, options, binds);
+    }
+
+    // Add to target
+    const nodes = [];
+    for (const target of this._targets) {
+      const node = controller.make(type, options, binds);
+      controller.add(node, target);
+      nodes.push(node);
+    }
+
+    // Return changed selection
+    return this._push(nodes);
+  }
+
+  remove(selector) {
+    if (selector) {
+      return this.select(selector).remove();
+    }
+    for (const target of Array.from(this._targets.slice().reverse())) {
+      this._context.controller.remove(target);
+    }
+    return this._pop();
+  }
+
+  set(key, value) {
+    for (const target of Array.from(this._targets)) {
+      this._context.controller.set(target, key, value);
+    }
+    return this;
+  }
+
+  getAll(key) {
+    return Array.from(this._targets).map((target) =>
+      this._context.controller.get(target, key)
+    );
+  }
+
+  get(key) {
+    return this._targets[0] != null ? this._targets[0].get(key) : undefined;
+  }
+
+  evaluate(key, time) {
+    return this._targets[0] != null
+      ? this._targets[0].evaluate(key, time)
+      : undefined;
+  }
+
+  bind(key, value) {
+    for (const target of Array.from(this._targets)) {
+      this._context.controller.bind(target, key, value);
+    }
+    return this;
+  }
+
+  unbind(key) {
+    for (const target of Array.from(this._targets)) {
+      this._context.controller.unbind(target, key);
+    }
+    return this;
+  }
+
+  end() {
+    return (this.isLeaf ? this._pop() : this)._pop();
+  }
+
+  _push(targets) {
+    return new API(this._context, this, targets);
+  }
+  _pop() {
+    return this._up != null ? this._up : this;
+  }
+  _reset() {
+    let left;
+    return (left = this._up != null ? this._up.reset() : undefined) != null
+      ? left
+      : this;
+  }
+
+  // TODO is this okay??
+  // eslint-disable-next-line no-dupe-class-members
+  map(callback) {
+    return this._targets.map(callback);
+  }
+
+  on() {
+    const args = arguments;
+    this._targets.map((x) => x.on.apply(x, args));
+    return this;
+  }
+
+  off() {
+    const args = arguments;
+    this._targets.map((x) => x.off.apply(x, args));
+    return this;
+  }
+
+  toString() {
+    const tags = this._targets.map((x) => x.toString());
+    if (this._targets.length > 1) {
+      return `[${tags.join(", ")}]`;
+    } else {
+      return tags[0];
+    }
+  }
+
+  toMarkup() {
+    const tags = this._targets.map((x) => x.toMarkup());
+    return tags.join("\n\n");
+  }
+
+  print() {
+    prettyPrint(this._targets.map((x) => x.toMarkup()).join("\n\n"));
+    return this;
+  }
+
+  debug() {
+    const info = this.inspect();
+    console.log("Renderables: ", info.renderables);
+    console.log("Renders: ", info.renders);
+    console.log("Shaders: ", info.shaders);
+
+    const getName = (owner) =>
+      owner.constructor.toString().match("function +([^(]*)")[1];
+
+    const shaders = [];
+    for (const shader of Array.from(info.shaders)) {
+      const name = getName(shader.owner);
+      shaders.push(`${name} - Vertex`);
+      shaders.push(shader.vertex);
+      shaders.push(`${name} - Fragment`);
+      shaders.push(shader.fragment);
+    }
+    return src_inspect(shaders);
+  }
+
+  inspect(selector, trait, print) {
+    let self;
+    if (typeof trait === "boolean") {
+      print = trait;
+      trait = null;
+    }
+    if (print == null) {
+      print = true;
+    }
+
+    // Recurse tree and extract all inserted renderables
+    const map = (node) =>
+      (node.controller != null ? node.controller.objects : undefined) != null
+        ? node.controller != null
+          ? node.controller.objects
+          : undefined
+        : [];
+    const recurse = (self = function (node, list) {
+      if (list == null) {
+        list = [];
+      }
+      if (!trait || node.traits.hash[trait]) {
+        list.push(map(node));
+      }
+      if (node.children != null) {
+        for (const child of Array.from(node.children)) {
+          self(child, list);
+        }
+      }
+      return list;
+    });
+
+    // Flatten arrays
+    const flatten = function (list) {
+      list = list.reduce((a, b) => a.concat(b), []);
+      return (list = list.filter((x, i) => x != null && list.indexOf(x) === i));
+    };
+
+    // Render descriptor
+    const make = function (renderable, render) {
+      const d = {};
+      d.owner = renderable;
+      d.geometry = render.geometry;
+      d.material = render.material;
+      d.vertex = render.userData.vertexGraph;
+      d.fragment = render.userData.fragmentGraph;
+      return d;
+    };
+
+    const info = {
+      nodes: this._targets.slice(),
+      renderables: [],
+      renders: [],
+      shaders: [],
+    };
+
+    // Inspect all targets
+    for (const target of Array.from(this._targets)) {
+      let renderables;
+      if (print) {
+        target.print(selector, "info");
+      }
+
+      const _info = {
+        renderables: (renderables = flatten(recurse(target))),
+        renders: flatten(renderables.map((x) => x.renders)),
+        shaders: flatten(
+          renderables.map((x) =>
+            x.renders != null ? x.renders.map((r) => make(x, r)) : undefined
+          )
+        ),
+      };
+
+      for (const k in _info) {
+        info[k] = info[k].concat(_info[k]);
+      }
+    }
+
+    return info;
+  }
+}
+
+function api_range_(left, right, inclusive) {
+  const range = [];
+  const ascending = left < right;
+  const end = !inclusive ? right : ascending ? right + 1 : right - 1;
+  for (let i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {
+    range.push(i);
+  }
+  return range;
+}
+
+;// CONCATENATED MODULE: ./src/stage/controller.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+class Controller {
+  constructor(model, primitives) {
+    this.model = model;
+    this.primitives = primitives;
+  }
+
+  getRoot() {
+    return this.model.getRoot();
+  }
+
+  getTypes() {
+    return this.primitives.getTypes();
+  }
+
+  make(type, options, binds) {
+    return this.primitives.make(type, options, binds);
+  }
+
+  get(node, key) {
+    return node.get(key);
+  }
+
+  set(node, key, value) {
+    try {
+      return node.set(key, value);
+    } catch (e) {
+      node.print(null, "warn");
+      return console.error(e);
+    }
+  }
+
+  bind(node, key, expr) {
+    try {
+      return node.bind(key, expr);
+    } catch (e) {
+      node.print(null, "warn");
+      return console.error(e);
+    }
+  }
+
+  unbind(node, key) {
+    try {
+      return node.unbind(key);
+    } catch (e) {
+      node.print(null, "warn");
+      return console.error(e);
+    }
+  }
+
+  add(node, target) {
+    if (target == null) {
+      target = this.model.getRoot();
+    }
+    return target.add(node);
+  }
+
+  remove(node) {
+    const target = node.parent;
+    if (target) {
+      return target.remove(node);
+    }
+  }
+}
+
+;// CONCATENATED MODULE: ./src/stage/index.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+
+
+
+
+;// CONCATENATED MODULE: ./src/util/index.js
+
+
+
+
+
+
+
+
+
+
+const util_Axis = axis_namespaceObject;
+const util_Data = data_namespaceObject;
+const Ease = ease_namespaceObject;
+const GLSL = glsl_namespaceObject;
+const JS = js_namespaceObject;
+const Pretty = pretty_namespaceObject;
+const Three = three_namespaceObject;
+const util_Ticks = util_ticks_namespaceObject;
+const VDOM = vdom_namespaceObject;
+
+;// CONCATENATED MODULE: ./src/context.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS206: Consider reworking classes to avoid initClass
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+
+
+
+
+
+
+
+
+class Context {
+  static initClass() {
+    // Export for extending. TODO what is the story here, what is this syntax?
+    this.Namespace = {
+      Model: src_model_namespaceObject,
+      Overlay: src_overlay_namespaceObject,
+      Primitives: primitives_namespaceObject,
+      Render: src_render_namespaceObject,
+      Shaders: shaders_namespaceObject,
+      Stage: stage_namespaceObject,
+      Util: util_namespaceObject,
+      DOM: VDOM,
+    };
+  }
+
+  //-------------------------------------------------------------------
+
+  // Set up entire environment
+  constructor(renderer, scene = null, camera = null) {
+    // DOM container
+    let canvas;
+    this.canvas = canvas = renderer.domElement;
+    this.element = null;
+
+    // Rendering factory
+    this.shaders = factory_Factory(Snippets);
+
+    this.renderables = new RenderFactory(
+      render_classes_Classes,
+      renderer,
+      this.shaders
+    );
+    this.overlays = new OverlayFactory(Classes, canvas);
+
+    this.scene = this.renderables.make("scene", { scene });
+    this.camera = this.defaultCamera =
+      camera != null ? camera : new external_THREE_.PerspectiveCamera();
+
+    // Primitives factory
+    this.attributes = new Attributes(primitives_Types, this);
+    this.primitives = new PrimitiveFactory(primitives_Types, this);
+
+    this.root = this.primitives.make("root");
+
+    // Document model
+    this.model = new Model(this.root);
+    this.guard = new Guard();
+
+    // Scene controllers
+    this.controller = new Controller(this.model, this.primitives);
+    this.animator = new Animator(this);
+
+    // Public API
+    this.api = new API(this);
+
+    // Global clocks, one real-time and one adjustable
+    this.speed = 1;
+    this.time = {
+      now: +new Date() / 1000,
+      time: 0,
+      delta: 0,
+      clock: 0,
+      step: 0,
+    };
+  }
+
+  //-------------------------------------------------------------------
+  // Lifecycle
+
+  init() {
+    this.scene.inject();
+    this.overlays.inject();
+    return this;
+  }
+
+  destroy() {
+    this.scene.unject();
+    this.overlays.unject();
+    return this;
+  }
+
+  resize(size) {
+    /*
+    {
+      viewWidth, viewHeight, renderWidth, renderHeight, aspect, pixelRatio
+    }
+    */
+    if (size == null) {
+      size = {};
+    }
+    if (size.renderWidth == null) {
+      size.renderWidth =
+        size.viewWidth != null ? size.viewWidth : (size.viewWidth = 1280);
+    }
+    if (size.renderHeight == null) {
+      size.renderHeight =
+        size.viewHeight != null ? size.viewHeight : (size.viewHeight = 720);
+    }
+    if (size.pixelRatio == null) {
+      size.pixelRatio = size.renderWidth / Math.max(0.000001, size.viewWidth);
+    }
+    if (size.aspect == null) {
+      size.aspect = size.viewWidth / Math.max(0.000001, size.viewHeight);
+    }
+
+    this.root.controller.resize(size);
+    return this;
+  }
+
+  frame(time) {
+    /*
+    {
+      now, clock, step
+    }
+    */
+    this.pre(time);
+    this.update();
+    this.render();
+    this.post();
+    return this;
+  }
+
+  //-------------------------------------------------------------------
+  // Broken down update/render cycle, for manual scheduling/invocation
+
+  pre(time) {
+    if (!time) {
+      time = {
+        now: +new Date() / 1000,
+        time: 0,
+        delta: 0,
+        clock: 0,
+        step: 0,
+      };
+
+      time.delta = this.time.now != null ? time.now - this.time.now : 0;
+
+      // Check for stopped render loop, assume 1 60fps frame
+      if (time.delta > 1) {
+        time.delta = 1 / 60;
+      }
+
+      time.step = time.delta * this.speed;
+      time.time = this.time.time + time.delta;
+      time.clock = this.time.clock + time.step;
+    }
+
+    this.time = time;
+    if (typeof this.root.controller.pre === "function") {
+      this.root.controller.pre();
+    }
+    return this;
+  }
+
+  update() {
+    this.animator.update();
+    this.attributes.compute();
+
+    this.guard.iterate({
+      step: () => {
+        let change = this.attributes.digest();
+        return change || (change = this.model.digest());
+      },
+      last() {
+        return {
+          attribute: this.attributes.getLastTrigger(),
+          model: this.model.getLastTrigger(),
+        };
+      },
+    });
+
+    if (typeof this.root.controller.update === "function") {
+      this.root.controller.update();
+    }
+
+    this.camera = this.root.controller.getCamera();
+    this.speed = this.root.controller.getSpeed();
+
+    return this;
+  }
+
+  render() {
+    if (typeof this.root.controller.render === "function") {
+      this.root.controller.render();
+    }
+    this.scene.render();
+
+    return this;
+  }
+
+  post() {
+    if (typeof this.root.controller.post === "function") {
+      this.root.controller.post();
+    }
+    return this;
+  }
+
+  //-------------------------------------------------------------------
+  // Warmup mode, inserts only n objects into the scene per frame
+  // Will render objects to offscreen 1x1 buffer to ensure shader is compiled even if invisible
+  setWarmup(n) {
+    this.scene.warmup(n);
+    return this;
+  }
+
+  getPending() {
+    return this.scene.pending.length;
+  }
+}
+Context.initClass();
+
+;// CONCATENATED MODULE: ./src/index.js
+// TODO: This file was created by bulk-decaffeinate.
+// Sanity-check the conversion and remove this comment.
+/*
+ * decaffeinate suggestions:
+ * DS102: Remove unnecessary code created because of implicit returns
+ * DS207: Consider shorter variations of null checks
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
+ */
+
+
+
+// NOTE this import triggers the installation of all plugins as a side effect.
+
+
+
+
+
+
+
+
+
+
+
+
+
+const version = "2.1.1";
+
+// Just because
+const π = Math.PI;
+const τ = π * 2;
+const e = Math.E;
+const src_Context = Context;
+const src_Model = src_model_namespaceObject;
+const src_Overlay = src_overlay_namespaceObject;
+const Primitives = primitives_namespaceObject;
+const Render = src_render_namespaceObject;
+const Shaders = shaders_namespaceObject;
+const Stage = stage_namespaceObject;
+const Util = util_namespaceObject;
+const src_DOM = VDOM;
+
+const mathBox = function (options) {
+  const three = new Bootstrap(options);
+
+  if (!three.fallback) {
+    if (!three.Time) {
+      three.install("time");
+    }
+    if (!three.MathBox) {
+      three.install(["mathbox", "splash"]);
+    }
+  }
+
+  return three.mathbox != null ? three.mathbox : three;
+};
+
+// Load context and export namespace
+// TODO suspicious... how can I export??
+// for (let k in Context.Namespace) {
+//   const v = Context.Namespace[k];
+//   exports[k] = v;
+// }
+
+// Threestrap plugin
+Bootstrap.registerPlugin("mathbox", {
+  defaults: {
+    init: true,
+    warmup: 2,
+    inspect: true,
+    splash: true,
+  },
+
+  listen: ["ready", "pre", "update", "post", "resize"],
+
+  // Install meta-API
+  install(three) {
+    let inited = false;
+    this.first = true;
+
+    return (three.MathBox = {
+      // Init the mathbox context
+      init: (options) => {
+        if (inited) {
+          return;
+        }
+        inited = true;
+
+        const scene =
+          (options != null ? options.scene : undefined) ||
+          this.options.scene ||
+          three.scene;
+        const camera =
+          (options != null ? options.camera : undefined) ||
+          this.options.camera ||
+          three.camera;
+
+        this.context = new src_Context(three.renderer, scene, camera);
+
+        // Enable handy destructuring
+        this.context.api.three = three.three = three;
+        this.context.api.mathbox = three.mathbox = this.context.api;
+
+        // v1 compatibility
+        this.context.api.start = () => three.Loop.start();
+        this.context.api.stop = () => three.Loop.stop();
+
+        // Initialize and set initial size
+        this.context.init();
+        this.context.resize(three.Size);
+
+        // Set warmup mode and track pending objects
+        this.context.setWarmup(this.options.warmup);
+        this.pending = 0;
+        this.warm = !this.options.warmup;
+
+        console.log("MathBox²", version);
+        three.trigger({
+          type: "mathbox/init",
+          version: version,
+          context: this.context,
+        });
+      },
+
+      // Destroy the mathbox context
+      destroy: () => {
+        if (!inited) {
+          return;
+        }
+        inited = false;
+
+        three.trigger({ type: "mathbox/destroy", context: this.context });
+
+        this.context.destroy();
+
+        delete three.mathbox;
+        delete this.context.api.three;
+        delete this.context;
+      },
+
+      object: () =>
+        this.context != null ? this.context.scene.root : undefined,
+    });
+  },
+
+  uninstall(three) {
+    three.MathBox.destroy();
+    delete three.MathBox;
+  },
+
+  // Ready event: right before mathbox() / THREE.bootstrap() returns
+  ready(event, three) {
+    if (this.options.init) {
+      three.MathBox.init();
+
+      return setTimeout(() => {
+        if (this.options.inspect) {
+          return this.inspect(three);
+        }
+      });
+    }
+  },
+
+  // Log scene for inspection
+  inspect(three) {
+    this.context.api.inspect();
+    if (!this.options.warmup) {
+      return this.info(three);
+    }
+  },
+
+  info(three) {
+    const fmt = function (x) {
+      const out = [];
+      while (x >= 1000) {
+        out.unshift(("000" + (x % 1000)).slice(-3));
+        x = Math.floor(x / 1000);
+      }
+      out.unshift(x);
+      return out.join(",");
+    };
+
+    const info = three.renderer.info.render;
+    console.log(
+      "Geometry  ",
+      fmt(info.triangles) + " triangles  ",
+      fmt(info.points) + " points  ",
+      fmt(info.lines) + " lines  ",
+      fmt(info.calls) + " draw calls  "
+    );
+  },
+
+  // Hook up context events
+  resize(event, three) {
+    return this.context != null ? this.context.resize(three.Size) : undefined;
+  },
+
+  pre(event, three) {
+    return this.context != null ? this.context.pre(three.Time) : undefined;
+  },
+
+  update(event, three) {
+    let camera;
+    if (this.context != null) {
+      this.context.update();
+    }
+
+    if (
+      (camera = this.context != null ? this.context.camera : undefined) &&
+      camera !== three.camera
+    ) {
+      three.camera = camera;
+    }
+
+    three.Time.set({ speed: this.context.speed });
+
+    this.progress(this.context.getPending(), three);
+
+    // Call render here instead of on:render because it renders off screen material
+    // that needs to be available for rendering the actual frame.
+    return this.context != null ? this.context.render() : undefined;
+  },
+
+  post(_event, _three) {
+    return this.context != null ? this.context.post() : undefined;
+  },
+
+  // Warmup progress changed
+  progress(remain, three) {
+    if (!remain && !this.pending) {
+      return;
+    }
+
+    // Latch max value until queue is emptied to get a total
+    let pending = Math.max(remain + this.options.warmup, this.pending);
+
+    // Send events for external progress reporting
+    const current = pending - remain;
+    const total = pending;
+    three.trigger({
+      type: "mathbox/progress",
+      current: pending - remain,
+      total: pending,
+    });
+
+    if (remain === 0) {
+      pending = 0;
+    }
+    this.pending = pending;
+
+    // Report once when loaded
+    if (current === total && !this.warm) {
+      this.warm = true;
+      if (this.options.inspect) {
+        this.info(three);
+      }
+    }
+  },
+});
+
+})();
+
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=mathbox-bundle.js.map
\ No newline at end of file
diff --git a/build/mathbox-bundle.js.map b/build/mathbox-bundle.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..2cfd097dfea49369f6902e6008bbde4909a44da5
--- /dev/null
+++ b/build/mathbox-bundle.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"mathbox-bundle.js","mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD,O;;;;;;ACVA,YAAY,mBAAO,CAAC,IAAa;;AAEjC;;AAEA;AACA;;AAEA,kBAAkB,mBAAmB;AACrC;AACA;;AAEA;AACA;;;;;;;;ACZA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,gDAAgD,SAAS;AACzD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;ACjRA;;AAEA,wBAAwB,mBAAO,CAAC,IAAQ;AACxC,UAAU,mBAAO,CAAC,IAAS;;AAE3B;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,mBAAmB,4FAA4C;;AAE/D;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,6CAA6C,SAAS;AACtD;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,yCAAyC,SAAS;AAClD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,MAAM;AACN;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,2BAA2B;AAC3B,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA,6BAA6B;AAC7B;AACA;AACA,0BAA0B;AAC1B;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA,oCAAoC;AACpC;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,QAAQ;AACR,yCAAyC,oCAAoC;AAC7E;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,QAAQ;AACR,yCAAyC,oCAAoC;AAC7E;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,QAAQ;AACR,yCAAyC,oCAAoC;AAC7E;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR,yCAAyC,oCAAoC;AAC7E;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,2BAA2B;AAC3B;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,QAAQ;AACR;AACA;;AAEA;;AAEA,kCAAkC;AAClC;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,iEAAiE;;AAEjE;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,6BAA6B;AAC7B;AACA,4BAA4B,mDAAmD;AAC/E;AACA;AACA;;AAEA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,8BAA8B;AAC9B,OAAO;AACP,gBAAgB;AAChB,qBAAqB;AACrB,gBAAgB;AAChB;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA,6BAA6B;AAC7B,oCAAoC;AACpC,OAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,4CAA4C,SAAS;AACrD;AACA;AACA;AACA;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA,OAAO;AACP,gBAAgB;AAChB;AACA,gBAAgB;AAChB;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;ACvlCA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,gEAAgE;AAChE;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,uCAAuC,QAAQ;AAC/C;AACA;AACA;AACA;;AAEA;AACA;;;;;;;;AClCA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;;;;;;;;ACPa;AACb,8CAA6C,EAAE,aAAa,EAAC;AAC7D,sBAAsB;AACtB,iBAAiB,mBAAO,CAAC,IAAU;AACnC;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,iCAAiC;AACjC,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;;;;;;;;AC1Ka;AACb;AACA,6CAA6C;AAC7C;AACA,8CAA6C,EAAE,aAAa,EAAC;AAC7D,oBAAoB,GAAG,qBAAqB,GAAG,eAAe;AAC9D,iBAAiB,mBAAO,CAAC,IAAU;AACnC,iBAAiB,mBAAO,CAAC,IAAU;AACnC,6BAA6B,mBAAO,CAAC,IAAQ;AAC7C,kBAAkB,mBAAO,CAAC,IAAa;AACvC,gBAAgB,mBAAO,CAAC,IAAW;AACnC,mBAAmB,mBAAO,CAAC,IAA+B;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,8CAA8C,wCAAwC;AACtF;AACA,yBAAyB;AACzB;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,sCAAsC,qBAAqB;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,sBAAsB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClHa;AACb,8CAA6C,EAAE,aAAa,EAAC;AAC7D,8BAA8B;AAC9B,mBAAmB,mBAAO,CAAC,GAAc;AACzC,yBAAyB,mBAAO,CAAC,IAAoB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,2CAA2C;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,qBAAqB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,qBAAqB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;;;;;;;;;ACvGjB;AACb;AACA;AACA,mCAAmC,oCAAoC,gBAAgB;AACvF,CAAC;AACD;AACA;AACA,CAAC;AACD;AACA,0CAA0C,4BAA4B;AACtE,CAAC;AACD;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA6C,EAAE,aAAa,EAAC;AAC7D,eAAe,GAAG,eAAe,GAAG,eAAe,GAAG,UAAU,GAAG,iBAAiB,GAAG,iBAAiB,GAAG,sBAAsB,GAAG,qBAAqB,GAAG,sBAAsB,GAAG,eAAe;AACpM,4BAA4B,mBAAO,CAAC,IAAU;AAC9C,iBAAiB,mBAAO,CAAC,IAAU;AACnC,gBAAgB,mBAAO,CAAC,IAAW;AACnC,mBAAmB,mBAAO,CAAC,IAA+B;AAC1D,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf,sBAAsB;AACtB,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA,oBAAoB,iBAAiB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,kBAAe;AACf;AACA,yBAAyB,mBAAO,CAAC,IAAoB;AACrD,2CAA0C,EAAE,qCAAqC,sCAAsC,EAAC;AACxH,2CAA0C,EAAE,qCAAqC,sCAAsC,EAAC;AACxH,2CAA0C,EAAE,qCAAqC,sCAAsC,EAAC;;;;;;;;;AChJ3G;AACb,8CAA6C,EAAE,aAAa,EAAC;AAC7D,mBAAmB,GAAG,iBAAiB;AACvC,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;;;;;;;;;ACnBN;AACb,8CAA6C,EAAE,aAAa,EAAC;AAC7D,eAAe;AACf;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChCa;AACb;AACA,6CAA6C;AAC7C;AACA,8CAA6C,EAAE,aAAa,EAAC;AAC7D,eAAe;AACf,kCAAkC,mBAAO,CAAC,IAAW;AACrD,iBAAiB,mBAAO,CAAC,IAAU;AACnC;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,qBAAqB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,QAAQ;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,qBAAqB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,QAAQ;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA,iCAAiC;AACjC,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3Ja;AACb,8CAA6C,EAAE,aAAa,EAAC;AAC7D,6BAA6B,GAAG,eAAe,GAAG,eAAe,GAAG,eAAe;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,mBAAO,CAAC,IAAU;AACnC,iBAAiB,mBAAO,CAAC,IAAU;AACnC,gBAAgB,mBAAO,CAAC,IAAW;AACnC,2CAA0C,EAAE,qCAAqC,6BAA6B,EAAC;AAC/G,gBAAgB,mBAAO,CAAC,IAAW;AACnC,2CAA0C,EAAE,qCAAqC,6BAA6B,EAAC;AAC/G,gBAAgB,mBAAO,CAAC,IAAW;AACnC,2CAA0C,EAAE,qCAAqC,6BAA6B,EAAC;AAC/G,mBAAmB,mBAAO,CAAC,IAAc;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC,oCAAoC;AACpC;AACA;AACA;AACA,6BAA6B;;;;;;;;;ACrDhB;AACb,8CAA6C,EAAE,aAAa,EAAC;AAC7D,wBAAwB,GAAG,eAAe;AAC1C;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA,oCAAoC,6BAA6B;AACjE;AACA,KAAK;AACL;AACA;AACA;AACA,0CAA0C,QAAQ;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,0CAA0C,QAAQ;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA,wCAAwC,0DAA0D;AAClG,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;;;;;;;;;ACxFX;AACb;AACA,6EAA6E,OAAO;AACpF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA6C,EAAE,aAAa,EAAC;AAC7D,kBAAkB,GAAG,uBAAuB,GAAG,mBAAmB,GAAG,2BAA2B;AAChG,iBAAiB,mBAAO,CAAC,IAAU;AACnC,kBAAkB,mBAAO,CAAC,IAAc;AACxC;AACA,2BAA2B;AAC3B;AACA;AACA;AACA,6BAA6B;AAC7B;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;;;;;;;;AC7Ga;AACb,8CAA6C,EAAE,aAAa,EAAC;AAC7D,kBAAkB,mBAAO,CAAC,IAAa;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,gBAAgB;AACpC;AACA;AACA;AACA,4BAA4B,8BAA8B;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA,4BAA4B,uBAAuB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnFa;AACb;AACA;AACA,mCAAmC,oCAAoC,gBAAgB;AACvF,CAAC;AACD;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA,8CAA6C,EAAE,aAAa,EAAC;AAC7D,iBAAiB,GAAG,aAAa;AACjC,aAAa,mBAAO,CAAC,GAAS;AAC9B,cAAc,mBAAO,CAAC,GAAS;AAC/B,yCAAwC,EAAE,qCAAqC,4CAA4C,EAAC;AAC5H,kBAAkB,mBAAO,CAAC,IAAa;AACvC,6CAA4C,EAAE,qCAAqC,gDAAgD,EAAC;;;;;;;;;ACpBvH;AACb;AACA,6EAA6E,OAAO;AACpF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA6C,EAAE,aAAa,EAAC;AAC7D,mBAAmB;AACnB,sCAAsC,IAAI;AAC1C,2BAA2B,IAAI;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,uBAAuB;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAe;AACf;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,6BAA6B;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,oBAAoB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,gDAAgD;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,0CAA0C;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,yCAAyC;AAC3E;AACA;AACA;AACA;AACA;AACA,kCAAkC,iDAAiD;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC/aa;AACb;AACA,6EAA6E,OAAO;AACpF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA6C,EAAE,aAAa,EAAC;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,8BAA8B;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,+CAA+C;AAC3E;AACA;;;;;;;;;ACxGa;AACb,8CAA6C,EAAE,aAAa,EAAC;AAC7D,sBAAsB,GAAG,oBAAoB;AAC7C,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtGa;AACb;AACA;AACA,iDAAiD,OAAO;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,oCAAoC,gBAAgB;AACvF,CAAC;AACD;AACA;AACA,CAAC;AACD;AACA,0CAA0C,4BAA4B;AACtE,CAAC;AACD;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA6C,EAAE,aAAa,EAAC;AAC7D;AACA;AACA;AACA,+BAA+B,mBAAO,CAAC,IAAgB;AACvD,iBAAiB,mBAAO,CAAC,IAAU;AACnC;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,mBAAO,CAAC,IAAgB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA,kBAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,WAAW,gBAAgB;AAClE;AACA;AACA;AACA,mCAAmC,WAAW,oBAAoB;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClNa;AACb,8CAA6C,EAAE,aAAa,EAAC;AAC7D,eAAe,GAAG,aAAa,GAAG,WAAW,GAAG,aAAa,GAAG,cAAc,GAAG,eAAe,GAAG,iBAAiB,GAAG,YAAY,GAAG,YAAY,GAAG,aAAa,GAAG,mBAAmB;AACxL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,wCAAwC,mBAAmB,KAAK;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,YAAY;AACZ;AACA,YAAY;AACZ;AACA,iBAAiB;AACjB;AACA,eAAe;AACf;AACA,cAAc;AACd;AACA,aAAa;AACb;AACA,WAAW;AACX;AACA,aAAa;AACb;AACA,eAAe;;;;;;;;;ACtDF;AACb;AACA;AACA,mCAAmC,oCAAoC,gBAAgB;AACvF,CAAC;AACD;AACA;AACA,CAAC;AACD;AACA;AACA;AACA,8CAA6C,EAAE,aAAa,EAAC;AAC7D,kBAAkB;AAClB,uBAAuB,mBAAO,CAAC,IAAgB;AAC/C,aAAa,mBAAO,CAAC,IAAQ;AAC7B,aAAa,mBAAO,CAAC,IAAQ;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD,kBAAkB;AAClB,kBAAe;;;;;;;;;AC3KF;AACb;AACA;AACA;AACA,eAAe,gBAAgB,sCAAsC,kBAAkB;AACvF,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA,CAAC;AACD;AACA;AACA,iDAAiD,OAAO;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA6C,EAAE,aAAa,EAAC;AAC7D,iBAAiB,GAAG,mBAAmB,GAAG,kBAAkB,GAAG,mBAAmB,GAAG,iBAAiB,GAAG,cAAc,GAAG,eAAe,GAAG,aAAa,GAAG,eAAe,GAAG,gBAAgB,GAAG,wBAAwB,GAAG,6BAA6B,GAAG,eAAe,GAAG,YAAY,GAAG,gBAAgB,GAAG,YAAY;AAC5T,uBAAuB,mBAAO,CAAC,IAAgB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,WAAW;AAC5B;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,oBAAoB,aAAa;AACjC;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB,WAAW;AAC/B;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB,WAAW;AAC/B;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA,CAAC;AACD,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,WAAW;AAC/B;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,CAAC;AACD,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB,eAAe;AACnC;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,CAAC;AACD,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,WAAW;AAC/B;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,CAAC;AACD,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD;AACxD,4CAA4C,kCAAkC;AAC9E;AACA;AACA;AACA;AACA,uDAAuD;AACvD;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,kCAAkC;AAC9E;AACA;AACA;AACA;AACA;AACA,4CAA4C,kCAAkC;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,iDAAiD,gCAAgC;AACjF,oBAAoB,qBAAqB;AACzC;AACA;AACA;AACA;AACA;;;;;;;;;AC3ba;AACb,8CAA6C,EAAE,aAAa,EAAC;AAC7D,eAAe;AACf,kBAAkB,mBAAO,CAAC,IAAa;AACvC,eAAe,mBAAO,CAAC,IAAU;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE,iCAAiC;AACnG;AACA;AACA;AACA;AACA;AACA,4DAA4D,8BAA8B;AAC1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC7La;AACb,8CAA6C,EAAE,aAAa,EAAC;AAC7D,kBAAkB,GAAG,+BAA+B,GAAG,qBAAqB;AAC5E,mBAAmB,mBAAO,CAAC,IAAY;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,UAAU;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,oCAAoC;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,kBAAkB;;;;;;;;;AC5HL;AACb;AACA;AACA,mCAAmC,oCAAoC,gBAAgB;AACvF,CAAC;AACD;AACA;AACA,CAAC;AACD;AACA;AACA;AACA,8CAA6C,EAAE,aAAa,EAAC;AAC7D,mBAAmB,GAAG,kBAAkB,GAAG,iBAAiB,GAAG,cAAc,GAAG,eAAe,GAAG,aAAa;AAC/G,aAAa,mBAAO,CAAC,IAAa;AAClC,aAAa,mBAAO,CAAC,IAAa;AAClC,aAAa,mBAAO,CAAC,IAAgB;AACrC,aAAa,mBAAO,CAAC,IAAY;AACjC,aAAa,mBAAO,CAAC,IAAU;AAC/B,aAAa,mBAAO,CAAC,IAAW;AAChC,aAAa,mBAAO,CAAC,IAAS;AAC9B;AACA,mBAAmB,mBAAO,CAAC,IAAY;AACvC,yCAAwC,EAAE,qCAAqC,8BAA8B,EAAC;AAC9G,2CAA0C,EAAE,qCAAqC,gCAAgC,EAAC;AAClH,0CAAyC,EAAE,qCAAqC,+BAA+B,EAAC;AAChH,6CAA4C,EAAE,qCAAqC,kCAAkC,EAAC;AACtH,8CAA6C,EAAE,qCAAqC,mCAAmC,EAAC;AACxH,+CAA8C,EAAE,qCAAqC,oCAAoC,EAAC;;;;;;;;;AC3B7G;AACb,8CAA6C,EAAE,aAAa,EAAC;AAC7D,4BAA4B,GAAG,4BAA4B,GAAG,sBAAsB,GAAG,mBAAmB,GAAG,mBAAmB;AAChI,mBAAmB,mBAAO,CAAC,IAAY;AACvC,iBAAiB,mBAAO,CAAC,IAAY;AACrC;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA,iCAAiC;AACjC,KAAK;AACL;AACA;AACA,qCAAqC;AACrC;AACA,iCAAiC;AACjC,KAAK;AACL;AACA;AACA,qCAAqC;AACrC;AACA,iCAAiC;AACjC,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B,4BAA4B;AAC5B;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B,4BAA4B;AAC5B;AACA;AACA,4BAA4B;;;;;;;;;AC3Hf;AACb,8CAA6C,EAAE,aAAa,EAAC;AAC7D,eAAe,GAAG,oBAAoB,GAAG,cAAc,GAAG,mBAAmB,GAAG,sBAAsB,GAAG,qBAAqB;AAC9H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;;;;;;;;;AChIF;AACb,8CAA6C,EAAE,aAAa,EAAC;AAC7D,eAAe,GAAG,iBAAiB,GAAG,eAAe,GAAG,oBAAoB,GAAG,YAAY,GAAG,cAAc;AAC5G,mBAAmB,mBAAO,CAAC,IAAY;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B,4BAA4B;AAC5B;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,qBAAqB;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA,oBAAoB,2BAA2B;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;;;;;;;;;AC7HF;AACb;AACA,6CAA6C;AAC7C;AACA,8CAA6C,EAAE,aAAa,EAAC;AAC7D,iBAAiB,GAAG,mBAAmB,GAAG,eAAe,GAAG,oBAAoB,GAAG,oBAAoB;AACvG,mBAAmB,mBAAO,CAAC,IAAY;AACvC,uCAAuC,mBAAO,CAAC,IAAgB;AAC/D,uBAAuB,mBAAO,CAAC,IAAgB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,qCAAqC;AACnF;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;;;;;;;;;ACrFJ;AACb,8CAA6C,EAAE,aAAa,EAAC;AAC7D,0BAA0B,GAAG,0BAA0B,GAAG,eAAe,GAAG,iBAAiB,GAAG,yBAAyB,GAAG,mBAAmB,GAAG,iBAAiB,GAAG,mBAAmB;AACzL,mBAAmB,mBAAO,CAAC,IAAY;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;;;;;;;;;ACpHb;AACb;AACA,6CAA6C;AAC7C;AACA,8CAA6C,EAAE,aAAa,EAAC;AAC7D,kBAAkB,GAAG,wBAAwB,GAAG,iBAAiB;AACjE,sCAAsC,mBAAO,CAAC,IAAsB;AACpE,oCAAoC,mBAAO,CAAC,IAAoB;AAChE,iCAAiC,mBAAO,CAAC,IAAiB;AAC1D,yCAAyC,mBAAO,CAAC,EAAoB;AACrE,8DAA8D;AAC9D,iBAAiB;AACjB,wBAAwB;AACxB;AACA;AACA,4BAA4B;AAC5B;AACA,+BAA+B;AAC/B,kBAAkB;AAClB;AACA;AACA,2BAA2B,iBAAiB;AAC5C;AACA,yBAAyB;AACzB;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA,sEAAsE,QAAQ;AAC9E;AACA;AACA,iCAAiC;AACjC,qBAAqB;AACrB;AACA;AACA;AACA,4BAA4B;AAC5B,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpDa;AACb;AACA,6CAA6C;AAC7C;AACA,8CAA6C,EAAE,aAAa,EAAC;AAC7D,oCAAoC,mBAAO,CAAC,IAAoB;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAe;;;;;;;;;AC7BF;AACb;AACA,6CAA6C;AAC7C;AACA,8CAA6C,EAAE,aAAa,EAAC;AAC7D,kBAAkB,GAAG,cAAc,GAAG,0BAA0B,GAAG,kBAAkB,GAAG,iBAAiB;AACzG,iCAAiC,mBAAO,CAAC,IAAiB;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA,iBAAiB;AACjB,sCAAsC,mBAAO,CAAC,IAAsB;AACpE;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA,6CAA6C;AAC7C;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA,KAAK,IAAI;AACT;AACA;AACA;AACA;AACA,gDAAgD,gBAAgB;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2BAA2B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA,2CAA2C,uBAAuB;AAClE;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA,0DAA0D,yCAAyC;AACnG;AACA;;;;;;;;;ACvIa;AACb,8CAA6C,EAAE,aAAa,EAAC;AAC7D,uBAAuB,GAAG,yBAAyB,GAAG,yBAAyB,GAAG,mBAAmB,GAAG,mBAAmB,GAAG,wBAAwB,GAAG,kBAAkB,GAAG,iBAAiB,GAAG,mBAAmB,GAAG,mBAAmB,GAAG,kBAAkB,GAAG,cAAc,GAAG,0BAA0B,GAAG,kBAAkB,GAAG,iBAAiB,GAAG,cAAc,GAAG,oBAAoB,GAAG,cAAc;AAChZ,eAAe,mBAAO,CAAC,IAAU;AACjC,eAAe,mBAAO,CAAC,IAAU;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd,eAAe,mBAAO,CAAC,IAAU;AACjC,6CAA4C,EAAE,qCAAqC,8BAA8B,EAAC;AAClH,8CAA6C,EAAE,qCAAqC,+BAA+B,EAAC;AACpH,sDAAqD,EAAE,qCAAqC,uCAAuC,EAAC;AACpI,0CAAyC,EAAE,qCAAqC,2BAA2B,EAAC;AAC5G,8CAA6C,EAAE,qCAAqC,+BAA+B,EAAC;AACpH;AACA,+CAA8C,EAAE,qCAAqC,+BAA+B,EAAC;AACrH,+CAA8C,EAAE,qCAAqC,+BAA+B,EAAC;AACrH,eAAe,mBAAO,CAAC,IAAU;AACjC,6CAA4C,EAAE,qCAAqC,8BAA8B,EAAC;AAClH,8CAA6C,EAAE,qCAAqC,+BAA+B,EAAC;AACpH,oDAAmD,EAAE,qCAAqC,qCAAqC,EAAC;AAChI;AACA,+CAA8C,EAAE,qCAAqC,+BAA+B,EAAC;AACrH,+CAA8C,EAAE,qCAAqC,+BAA+B,EAAC;AACrH,qDAAoD,EAAE,qCAAqC,qCAAqC,EAAC;AACjI,qDAAoD,EAAE,qCAAqC,qCAAqC,EAAC;AACjI,mDAAkD,EAAE,qCAAqC,8BAA8B,EAAC;;;;;;;;ACxDxH;AACA;AACA,kBAAkB,mBAAO,CAAC,IAAgB;AAC1C,gBAAgB,mBAAO,CAAC,IAAiB;AACzC,kBAAkB,mBAAO,CAAC,IAAgB;AAC1C,oBAAoB,mBAAO,CAAC,IAAsB;AAClD,oBAAoB,mBAAO,CAAC,IAAsB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB,kBAAkB,wBAAwB;AAC1C;AACA;AACA,kBAAkB,wBAAwB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD;AACjD,+CAA+C;AAC/C,+CAA+C;AAC/C,uCAAuC;AACvC,qCAAqC;AACrC,6BAA6B;AAC7B,mCAAmC;AACnC,qCAAqC;AACrC,2CAA2C;AAC3C,mCAAmC;AACnC;AACA;AACA;AACA;AACA,8BAA8B,QAAQ;AACtC,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACtXA;AACA,WAAW,mBAAO,CAAC,IAAY;AAC/B;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACpEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACrJA,WAAW,mBAAO,CAAC,IAAY;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACtFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC7FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,MAAM;AACN,MAAM;AACN;;;;;;;;AC9CA,eAAe,mBAAO,CAAC,IAAS;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACZa;AACb,8CAA6C,EAAE,aAAa,EAAC;AAC7D,eAAe;AACf,iBAAiB,mBAAO,CAAC,IAAU;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,aAAa;AACb,aAAa;AACb,aAAa;AACb,aAAa;AACb,aAAa;AACb,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA,kCAAkC;AAClC;AACA;AACA,gEAAgE;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B,6BAA6B;AAC7B;AACA,eAAe;;;;;;;;;ACtDF;AACb,8CAA6C,EAAE,aAAa,EAAC;AAC7D,eAAe,GAAG,aAAa;AAC/B,cAAc,mBAAO,CAAC,IAAS;AAC/B,yCAAwC,EAAE,qCAAqC,yBAAyB,EAAC;AACzG,gBAAgB,mBAAO,CAAC,IAAW;AACnC,2CAA0C,EAAE,qCAAqC,6BAA6B,EAAC;AAC/G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,aAAa;AACb,aAAa;AACb,aAAa;AACb,aAAa;AACb,aAAa;AACb,aAAa;AACb;AACA;AACA;AACA;AACA,kBAAe;;;;;;;;;ACjCF;AACb;AACA,8CAA6C,EAAE,aAAa,EAAC;AAC7D,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,GAAG;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;;;;;;;AC3Eb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAY;;AAEZ,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;;AAEA,WAAW;AACX;AACA;AACA,IAAI;AACJ;AACA;AACA;;;;;;;;ACpDA;AACA,eAAe,KAAsD,oBAAoB,CAA4D,CAAC,kBAAkB,iBAAiB,cAAc,qBAAqB,SAAS,cAAc,YAAY,oBAAoB,qDAAqD,IAAI,wCAAwC,gCAAgC,MAAM,OAAO,eAAe,YAAY,eAAe,uCAAuC;AAClf,yBAAyB,KAAK,mHAAmH,sFAAsF,KAAK,OAAO,0DAA0D,4BAA4B,gBAAgB,IAAI,gCAAgC,kBAAkB,mDAAmD,yBAAyB;AAC3d,mCAAmC,SAAS,mBAAmB,aAAa,0BAA0B,wBAAwB,wJAAwJ,UAAU,WAAW,4BAA4B,aAAa,yBAAyB,mDAAmD,qBAAqB,cAAc,oBAAoB,cAAc;AACre,oBAAoB,cAAc,iBAAiB,oBAAoB,OAAO,2BAA2B,gBAAgB,gBAAgB,cAAc,gBAAgB,oBAAoB,cAAc,kDAAkD,qCAAqC,wBAAwB,cAAc,iBAAiB,sCAAsC,SAAS;;;;;;;;;ACJtY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UCAA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;;;;WCtBA;WACA;WACA;WACA;WACA;WACA,iCAAiC,WAAW;WAC5C;WACA;;;;;WCPA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA;;;;;WCPA;;;;;WCAA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACNO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,QAAQ;;AAER;;AAEA;AACA,qBAAqB,oDAAoD;AACzE;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;;AAEA;AACA;AACA;AACA;;;AC5CA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,sCAAsC,OAAO;;AAE7C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAG2B;;;ACtFyC;;AAE7D;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;;AAET;AACA,qBAAqB;AACrB;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,8BAA8B,0CAA0C;AACxE,8BAA8B,0CAA0C;AACxE,iCAAiC,6CAA6C;;AAE9E;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,sBAAsB,YAAY;AAClC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;;ACjI4B;AACM;;AAElC;AACA;AACA;;AAEO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;;AAEA;AACA;AACA,kCAAkC;AAClC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,uCAAuC;AACvC,sCAAsC;AACtC;;AAEA,qCAAqC,4BAA4B;;AAEjE;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,mBAAmB,iBAAiB;;AAEpC;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,kCAAkC;;AAElC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,sDAAsD;AACtD;;AAEA;AACA;AACA;;AAEA;AACA,mBAAmB,iCAAiC;;AAEpD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,mBAAmB,mCAAmC;AACtD;;AAEA;AACA;AACA,uBAAuB,eAAe;AACtC;AACA;AACA;;AAEA;;AAEA;AACA,iCAAiC,8BAA8B;AAC/D;;AAEA;AACA;AACA,cAAc;AACd,+BAA+B;AAC/B,iCAAiC;AACjC;;AAEA,YAAY;AACZ,YAAY;AACZ,SAAS;;;AClQT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEwD;;AAExD,wBAAwB;AACxB;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA,YAAY,QAAQ;AACpB;AACA,4CAA4C,MAAM;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA,YAAY,iBAAiB;;AAE7B;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,CAAC;;;ACzIuC;;AAExC,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;;AAEA,uBAAuB;;;ACpBkB;AACN;;AAEnC,wBAAwB;AACxB;AACA;AACA;AACA;AACA;;AAEA,iBAAiB,WAAW;AAC5B,mBAAmB,aAAa;;AAEhC;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP,GAAG;;AAEH;AACA;AACA,GAAG;AACH,CAAC;;;ACrCD;;AAEA,iBAAiB,SAAS;;AAE1B;;AAEA;;AAEA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,GAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,SAAS,sBAAY;;AAErB;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;;;;AA4BE;;;ACjQ0C;;AAE5C;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,IAAI;;AAEJ;;AAEA;AACA;AACA;AACA;;AAEA,IAAI;;AAEJ;;AAEA;AACA;AACA;AACA;;AAEA,IAAI;;AAEJ;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;;AAEA,IAAI;;AAEJ,kCAAkC;;AAElC;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,kCAAkC,KAAe;;AAEjD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,IAAI;;AAEJ;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAI;;AAEJ;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEsB;;;AChrBsB;AACC;;AAE7C;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,qCAAqC;;AAErC;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,2BAA2B;AAC3B,2BAA2B;AAC3B,2BAA2B;AAC3B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,oBAAoB,KAAe;;AAEnC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AAC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AAiB;AACxC,wBAAwB,kBAAkB;AAC1C,SAAS;AACT,QAAQ,MAAM;;AAEd;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP,GAAG;;AAEH;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;AACH,CAAC;;;ACjFwC;;AAEzC,wBAAwB;AACxB;AACA;AACA;AACA;AACA,+DAA+D,aAAa,aAAa;AACzF,+BAA+B,sCAAsC;AACrE,wCAAwC,eAAe,wBAAwB,mBAAmB;AAClG;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,oBAAoB;AACpB;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA,GAAG;AACH,CAAC;;;AC7DwC;;AAEzC,wBAAwB;AACxB;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;AACH,CAAC;;;ACvEwC;;AAEzC,wBAAwB;AACxB;AACA;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA,eAAe;AACf,KAAK;AACL,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;;AAEA,oBAAoB,eAAe;AACnC,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;;AAEA,oBAAoB,cAAc;AAClC,GAAG;AACH,CAAC;;;AC/DwC;;AAEzC,wBAAwB;AACxB;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH,CAAC;;;ACVM,MAAM,kBAAQ;AACd,gBAAgB;AAChB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,2BAA2B;;;AClLK;;AAEvC;;AAEA,wBAAwB,OAAO,kDAAkD,OAAO;;AAExF;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;A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;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEmB;;;ACneyB;;AAE5C,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB;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ACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA,IAAI;;AAEJ;AACA;;AAEA,IAAI;;AAEJ;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,wGAAwG;AACxG;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,CAAC,EAAC;;;ACrTF,2EAAyB;AACzB;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA,CAAC,EAAC;;;AC9DF,sEAAyB;AACzB;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA,kBAAkB,2BAA2B;;AAE7C;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA,kBAAkB,4BAA4B;;AAE9C;AACA;;AA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AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA,mCAAmC;;AAEnC;AACA;AACA;AACA;AACA;;AAEA;AACA;;;ACpEO,MAAM,qBAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEO,MAAM,uBAAQ;AACrB;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;AClHO,MAAM,uBAAM;AACnB;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEO,MAAM,yBAAQ;AACrB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACrJO,MAAM,sBAAM;AACnB;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEO,MAAM,wBAAQ;AACrB;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,qEAAqE;;AAErE;;AAEA;;AAEA;;AAEA,iEAAiE;;AAEjE;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;ACzGO,MAAM,sBAAM;AACnB;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEO,MAAM,wBAAQ;AACrB;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;;ACjFO,MAAM,qBAAM;AACnB;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEO,MAAM,uBAAQ;AACrB;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;AC5HO,MAAM,wBAAM;AACnB;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEO,MAAM,0BAAQ;AACrB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;AC7MO,MAAM,oBAAM;AACnB;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEO,MAAM,sBAAQ;AACrB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;ACnHO,MAAM,kBAAM;AACnB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEO,MAAM,oBAAQ;AACrB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;ACrEO,MAAM,kBAAM;AACnB;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEO,MAAM,oBAAQ;AACrB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;;AChDO,MAAM,kBAAM;AACnB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEO,MAAM,oBAAQ;AACrB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;;AC9EwE;AACU;AACR;AACU;AAClB;AACU;AACd;AACY;AAC1B;AACgC;AACM;AACU;AACJ;AACV;AAChB;AACU;AACJ;AACV;AACZ;AAC0C;AACd;AACc;AACV;AACJ;AACU;AACd;AACU;AAChB;AACwB;AACd;AACJ;AACV;AACN;AACU;AACN;AACU;AACgB;AAChB;AACU;AACF;AACR;AACwB;AAClB;AACU;AACR;AACU;AACJ;AACU;AAChB;AACF;AACF;AACE;AACU;AACJ;AACV;AACZ;AACU;AACQ;AACU;AACV;AACU;AAChB;AACU;AACV;AACM;AACF;AACA;AACJ;AACV;AACoB;AACgB;AACF;AACd;AAChB;AAChB;AAC0C;AAC5B;AACQ;AACU;AACJ;AACU;AACN;AACJ;AACV;AACgB;AAClB;AACU;AACV;AACI;AACM;AACU;AACV;AACU;AACR;AACU;AACpB;AACJ;AACV;AACgB;AACJ;AACV;AACU;;AAEP;AACZ;AACE;AACc;AACR;AACI;AACF;AACI;AACF;AACA;AACF;AACM;AACR;AACJ;AACA;AACA;;AAE9C;AACP,oBAAoB,sBAAiB;AACrC,yBAAyB,2BAAsB;AAC/C,qBAAqB,uBAAkB;AACvC,0BAA0B,4BAAuB;AACjD,iBAAiB,mBAAc;AAC/B,sBAAsB,wBAAmB;AACzC,eAAe,iBAAY;AAC3B,qBAAqB,uBAAkB;AACvC,QAAQ,UAAK;AACb,wBAAwB,0BAAqB;AAC7C,2BAA2B,6BAAwB;AACnD,gCAAgC,kCAA6B;AAC7D,8BAA8B,gCAA2B;AACzD,yBAAyB,2BAAsB;AAC/C,iBAAiB,mBAAc;AAC/B,sBAAsB,wBAAmB;AACzC,oBAAoB,sBAAiB;AACrC,eAAe,iBAAY;AAC3B,SAAS,WAAM;AACf,8BAA8B,gCAA2B;AACzD,uBAAuB,yBAAoB;AAC3C,8BAA8B,gCAA2B;AACzD,yBAAyB,2BAAsB;AAC/C,uBAAuB,yBAAoB;AAC3C,4BAA4B,8BAAyB;AACrD,qBAAqB,uBAAkB;AACvC,0BAA0B,4BAAuB;AACjD,kBAAkB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AAoD,oBAAoB;AACxE,qDAAqD,qBAAqB;;AAE1E,kHAAkH,YAAY;;AAE9H;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA,6DAA6D,aAAa;AAC1E;;AAEA;;AAEA,kCAAkC,UAAU;AAC5C,gCAAgC,QAAQ;;AAExC;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC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A;;AAEA;AACA;;AAEA;;AAEA,IAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,oBAAoB;AACpB;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AAC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A;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAI;;AAEJ;;AAEA,IAAI;;AAEJ;;AAEA,IAAI;;AAEJ;;AAEA,IAAI;;AAEJ;;AAEA,IAAI;;AAEJ;;AAEA,IAAI;;AAEJ;;AAEA,IAAI;;AAEJ;;AAEA,IAAI;;AAEJ;;AAEA,IAAI;;AAEJ;;AAEA,IAAI;;AAEJ;;AAEA,IAAI;;AAEJ;;AAEA,IAAI;;AAEJ;;AAEA,IAAI;;AAEJ;;AAEA,IAAI;;AAEJ;;AAEA,IAAI;;AAEJ;;AAEA,IAAI;;AAEJ;;AAEA,IAAI;;AAEJ;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAI;;AAEJ;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,mEAAmE;;AAEnE;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA,0BAA0B,QAAQ;;AAElC;;AAEA;;AAEA;AACA;AACA,0BAA0B,QAAQ;;AAElC;;AAEA;;AAEA;AACA;AACA;;AAEA;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AC9B;;AAEzC,wBAAwB;AACxB;AACA,WAAW,cAAc;AACzB;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,CAAC;;;ACnDiD;AACT;;AAEzC,wBAAwB;AACxB;AACA,sBAAsB,qBAAK;AAC3B,GAAG;;AAEH;AACA;AACA,GAAG;AACH,CAAC;;;ACXwC;;AAEzC,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;AACH,CAAC;;;AC1IwC;;AAEzC,wBAAwB;AACxB;AACA;AACA;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;AACH,CAAC;;;ACzFwC;;AAEzC,wBAAwB;AACxB;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,CAAC;;;ACtBe;AACE;AACE;AACJ;AACA;AACE;AACE;AACH;AACD;AACA;AACE;;;ACVyD;AAClC;;AAEzC,wBAAwB;AACxB;;AAEA;AACA;AACA,kBAAkB;AAClB,GAAG;;AAEH;AACA;;AAEA;;AAEA,uCAAuC,iCAAiB;AACxD;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,MAAM;AACN;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;AACH,CAAC;;;ACtDwC;;AAEzC,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,CAAC;;;AC/DwC;;AAEzC,wBAAwB;AACxB;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,sCAAsC,0BAA0B;;AAEhE;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR,8CAA8C;AAC9C;AACA,MAAM;AACN;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR,wCAAwC;AACxC;AACA;AACA,GAAG;AACH,CAAC;;;;;;AChF2C;AACH;;AAEzC,wBAAwB;AACxB;;AAEA;AACA,oCAAoC,qBAAK;AACzC;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;AACH,CAAC;;;AC9BwC;;AAEzC,wBAAwB;AACxB;AACA;AACA;AACA,wBAAwB,oBAAoB,aAAa,YAAY,cAAc;AACnF,+BAA+B,WAAW,iBAAiB;AAC3D,iCAAiC,qBAAqB;AACtD,mCAAmC,UAAU,qBAAqB;AAClE,mCAAmC,wBAAwB,mBAAmB;AAC9E,kCAAkC,aAAa;AAC/C,oCAAoC;AACpC,kCAAkC,aAAa;AAC/C;AACA,yCAAyC;AACzC,GAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,qBAAqB,YAAY;AACjC;AACA;AACA,GAAG;;AAEH;AACA;AACA,kDAAkD,YAAY;AAC9D,GAAG;;AAEH;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,qBAAqB,cAAc;AACnC;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;AACH,CAAC;;;AC3FD;AACA;AACA;AACA;AACA;AACA;AAC2E;AACvB;;AAE7C;AACP;AACA;;AAEA,qBAAqB,uBAAO;AAC5B,0BAA0B,iCAAiB;AAC3C,2BAA2B,iCAAiB;;AAE5C;AACA,uBAAuB,uBAAO;AAC9B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;ACzH4C;AACY;;AAExD;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;;AAEA;AACA;AACA,eAAe,QAAQ,qBAAqB,WAAW,sBAAsB;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,oBAAoB,mBAAmB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,sBAAsB,mBAAmB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA,SAAS,UAAU;AACnB,kBAAkB,UAAU;;AAE5B;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,GAAG;AACH,CAAC;;;AC5NmB;AACF;AACI;AACL;AACH;AACA;;;ACLd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEoD;;AAE7C;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;ACrHyB;;;ACAzB;AACA;AACA;AACA;AACiC;;AAE1B;AACP;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,oBAAoB,4BAA4B;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,oBAAoB,2BAA2B;AAC/C;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,oBAAoB,2BAA2B;AAC/C;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,2BAA2B;AAC/C;AACA;AACA;AACA;;;ACjEyB;AACH;;;ACDH;AACD;AACG;AACL;AACC;;AAEjB;AACoB;AACC;;AAEU;AACM;AACM;;AAEW;AACO;AACN;;;AChBvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,cAAc,4BAA4B,IAAI,aAAa;AAC3D;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU,QAAQ;AAClB,YAAY,2BAA2B;AACvC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,mBAAmB,yBAAyB,MAAM;AAC/D;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,mBAAmB,+BAA+B,IAAI,EAAE,EAAE,OAAO;AAChF;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,mBAAmB,+BAA+B,IAAI,EAAE,EAAE,OAAO;AAChF;AACA;;AAEA;AACA;AACA;AACA,eAAe,mBAAmB,kCAAkC,IAAI,EAAE,EAAE,OAAO;AACnF;AACA;;AAEA;AACA;AACA;AACA,eAAe,mBAAmB,+BAA+B,IAAI,EAAE,EAAE,OAAO;AAChF;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;;AAEA;AACA,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,mBAAmB,iBAAiB,IAAI,GAAG,EAAE,MAAM;AAChE;AACA;AACA;AACA;AACA,aAAa,mBAAmB,eAAe,IAAI,GAAG,EAAE,MAAM;AAC9D;AACA;AACA;AACA;AACA,aAAa,mBAAmB,eAAe,IAAI;AACnD;AACA;AACA;AACA,2BAA2B,mBAAmB,eAAe,IAAI;AACjE;;AAEA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,mBAAmB,oBAAoB,IAAI,EAAE,EAAE,OAAO;AACnE;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,UAAU;AACnB,SAAS,UAAU;;AAEnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,iCAAiC,MAAM;AACvC;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;AC5mBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,EAAE;AAChB;AACA;AACA,eAAe,EAAE;AACjB;AACA;AACA,cAAc,EAAE;AAChB;AACA;AACA,cAAc,EAAE,EAAE,EAAE;AACpB,IAAI;AACJ,cAAc,EAAE,GAAG,EAAE;AACrB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,sBAAsB,EAAE,QAAQ,EAAE;AAClC;;AAEA,YAAY,EAAE,GAAG,EAAE;AACnB;;AAEA;AACA,IAAI,MAAM;AACV,IAAI,sBAAsB;AAC1B,IAAI,kBAAkB;AACtB,IAAI,kCAAkC;AACtC,IAAI,iBAAiB;AACrB,IAAI,iCAAiC;AACrC,IAAI,6BAA6B;AACjC,IAAI,6CAA6C;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO,6BAA6B;AACpC;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,iCAAiC;;AAEjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,EAAE;AACtC;AACA;;AAEA,iBAAiB,EAAE;AACnB;AACA;AACA;AACA;AACA,iBAAiB,EAAE;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,qCAAqC;AACtD,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,qBAAqB,yCAAyC;AAC9D;AACA;AACA;AACA;AACA;;AAEA,WAAW,EAAE;AACb,eAAe,gCAAgC;AAC/C;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,aAAa,gBAAgB;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,KAAK;AACvC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,KAAK;AAC7B;AACA;AACA;AACA;AACA;AACA,wBAAwB,KAAK;AAC7B,cAAc;AACd;AACA,0BAA0B,KAAK;AAC/B;AACA,iBAAiB;AACjB;AACA;AACA,0BAA0B,KAAK;AAC/B,cAAc;AACd;AACA;AACA,iBAAiB;AACjB;AACA;AACA,wBAAwB,KAAK;AAC7B,cAAc;AACd;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,sCAAsC,gBAAgB;;AAEtD;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,iBAAiB,EAAE,GAAG;AACtB;AACA;AACA;AACA;AACA,mBAAmB,wBAAwB;AAC3C;;AAEA;AACA;AACA;AACA,yBAAyB,EAAE;AAC3B,YAAY;AACZ,uBAAuB,EAAE;AACzB;AACA;AACA,iBAAiB,EAAE;AACnB;AACA,iBAAiB,EAAE;AACnB,YAAY;AACZ,eAAe,EAAE;AACjB;AACA;AACA;AACA,gCAAgC,gBAAgB,OAAO,IAAI;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA,qCAAqC,QAAQ,IAAI,UAAU;AAC3D;AACA;AACA;AACA,iBAAiB;AACjB,kBAAkB;AAClB;AACA;AACA,YAAY;AACZ,sBAAsB,kBAAkB;AACxC;AACA;AACA;;AAEA;AACA;AACA,CAAC;;AAED;AACA,gCAAgC;AAChC,+BAA+B;AAC/B,yCAAyC;AACzC;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,cAAc;AACtD;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;;AAEO,cAAc;;AAOnB;;AAEF;AACA;AACA,6BAA6B;AAC7B;;;AC3VA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE4C;AACM;;AAElD;;AAEO,MAAM,SAAI;AACjB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,UAAU,kCAAkC;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,qBAAqB;AACrB;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS,SAAS;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,iBAAiB;AAC7C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,cAAc,IAAI;AAClB;AACA,gBAAgB,uBAAuB;AACvC;;AAEA;AACA;AACA;AACA,mBAAmB,GAAG,KAAK,MAAM,MAAM,IAAI;AAC3C,QAAQ;AACR,mBAAmB,GAAG,KAAK,IAAI;AAC/B;AACA,MAAM;AACN,iBAAiB,IAAI;AACrB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU,OAAO;;AAEjB;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,sBAAsB,QAAe;AACrC;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,qBAAqB,QAAe;AACpC;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,uBAAuB,IAAI,EAAE,KAAK;AAClC,yBAAyB,IAAI;;AAE7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,MAAM;AACN,gBAAgB,OAAO,GAAG,IAAI,EAAE,MAAM;AACtC;AACA;;AAEA;AACA,WAAW,WAAY;AACvB;AACA;;AAEA,YAAY,CAAC,SAAI;;;AC/QjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACiC;;AAE1B,MAAM,WAAK,SAAS,SAAI;AAC/B;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,oBAAoB,0BAA0B;AAC9C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC3DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,aAAa;;AAEzB,UAAU,QAAQ;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;;AAEA,yDAAe,OAAO,EAAC;;;AC3HiB;AACM;;AAE9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,4BAAiB;AAClC;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS,4BAAiB;AAC1B,eAAe,4BAAiB;AAChC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,GAAG;AACd;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,IAAI,WAAiB;AACrB,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,kBAAkB,aAAmB,gBAAgB,OAAO,sBAAE;AAC9D;AACA;AACA;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA,WAAW,WAAiB,UAAU,OAAO,sBAAE;AAC/C,IAAI;AACJ;AACA;AACA;;;AC7EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE0D;AAC1D;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,mBAAmB;;AAEnB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;;AAEA;;AAEA;AACA;AACA;AACA,+CAA+C,GAAG;AAClD;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,wBAAwB,eAAe;AACvC;;AAEA;AACA,WAAW,SAAS;AACpB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,UAAU;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;AC1TgC;AACL;AACA;AACA;AACD;;;ACJ1B;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,0BAA0B,kBAAkB;AAC5C,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAEM;AACP;AACA;AACA;AACA;;AAEO,MAAM,YAAO;AACpB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEO;AACP;AACA;AACA;;AAEA,UAAU,WAAW;AACrB;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEO;AACP;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,gCAAgC,YAAO;AACvC;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,wBAAwB,aAAa;AACrC;AACA,8BAA8B,yBAAyB;AACvD;AACA;AACA;AACA,kBAAkB;AAClB,8BAA8B,yBAAyB;AACvD;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,2BAA2B,YAAO;AAClC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,wBAAwB,YAAO;AAC/B;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAY,WAAW;AACvB;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,UAAU;AACV;AACA,0BAA0B,qBAAqB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,iEAAiE;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,qBAAqB,+BAA+B;AACpD;AACA;AACA;AACA;;;ACljBO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEwC;AACD;;AAEhC,kBAAkB,OAAO;AAChC;AACA,wBAAwB,YAAY;AACpC,0BAA0B,IAAS;AACnC,2BAA2B,KAAU;AACrC,6BAA6B,OAAY;AACzC;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,UAAU,OAAO;;AAEjB;AACA,YAAY,UAAU;AACtB;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACzF+B;;AAExB,kBAAkB,KAAK,GAAG;;;ACFwB;AAC5B;AACA;;;ACF7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEkC;AACgB;;AAE3C;AACP;AACA,gBAAgB,SAAU;AAC1B,iBAAiB,WAAW;;AAE5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;;AAEA;AACA,uBAAuB,WAAW;;AAElC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,yBAAyB,IAAI;AAC7B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,uCAAuC;AACvC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,4BAA4B,SAAU;AACtC;AACA;;AAEA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,kBAAkB,SAAS;AAC3B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,sBAAsB,mBAAmB,OAAO,IAAI,SAAS;AAC1E;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,MAAM;AACN;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAY;;;AC1ZZ;AACA;AACA;AACA;AACA;AACA;AACA;AAC+C;;AAExC,qBAAqB,SAAS;AACrC;AACA,iBAAiB,eAAe;AAChC;AACA;AACA;AACA;;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACqC;;AAE9B,MAAM,gBAAK,SAAS,MAAM;AACjC;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAK;;;ACzBL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACqC;;AAE9B,sBAAsB,MAAM;AACnC;AACA;AACA;;AAEA;AACA;AACA,sCAAsC,qCAAqC;AAC3E;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACqC;;AAE9B,mBAAmB,MAAM;AAChC;AACA;AACA;;AAEA;AACA;;AAEA,yBAAyB;AACzB,sBAAsB;AACtB,yBAAyB;AACzB,yBAAyB;AACzB,uBAAuB;;AAEvB,wBAAwB;;AAExB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,mBAAmB,WAAS;AAC5B;AACA;AACA;AACA;AACA;AACA,4BAA4B,qBAAqB;AACjD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAAS,WAAS;AAClB;AACA;AACA;AACA;;;AC5JA;AACA;AACA;AACA;AACA;AACA;AACA;AACqC;;AAE9B,mBAAmB,MAAM;AAChC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC5B2B;AACE;AACH;AACA;;;ACH1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACgD;;AAEA;AACI;AACM;AACN;;AAE7C;AACP,YAAY,8BAAoB;AAChC;AACA;AACA,YAAY,mCAAyB;AACrC;AACA;AACA,YAAY,sCAA4B;AACxC;AACA;;AAEA,YAAY,6BAAmB;AAC/B;AACA;AACA,YAAY,0CAAgC;AAC5C;AACA;AACA,YAAY,yCAA+B;AAC3C;AACA;;AAEA,YAAY,4BAAkB;AAC9B;AACA;AACA,YAAY,yCAA+B;AAC3C;AACA;AACA,YAAY,wCAA8B;AAC1C;AACA;;AAEA,YAAY,gCAAsB;AAClC;AACA;AACA,YAAY,qCAA2B;AACvC;AACA;AACA,YAAY,qCAA2B;AACvC;AACA;AACA,YAAY,wBAAc;AAC1B;AACA;AACA,YAAY,yBAAe;AAC3B;AACA;AACA,YAAY,iCAAuB;AACnC;AACA;AACA,YAAY,uBAAa;AACzB;AACA;AACA,YAAY,+BAAqB;AACjC;AACA;AACA,YAAY,yBAAe;AAC3B;AACA;;AAEA,YAAY,2BAAiB;AAC7B;AACA;AACA,YAAY,0BAAgB;AAC5B;AACA;AACA,YAAY,+BAAqB;AACjC;AACA;AACA,YAAY,oCAA0B;AACtC;AACA;;AAEA,YAAY,2BAAiB;AAC7B;AACA;AACA,YAAY,gCAAsB;AAClC;AACA;AACA,YAAY,uCAA6B;AACzC;AACA;;AAEA,YAAY,0BAAgB;AAC5B;AACA;AACA,YAAY,yBAAe;AAC3B;AACA;AACA,YAAY,8BAAoB;AAChC;AACA;AACA,YAAY,sCAA4B;AACxC;AACA;AACA,YAAY,8BAAoB;AAChC;AACA;AACA,YAAY,sCAA4B;AACxC;AACA;AACA,YAAY,8BAAoB;AAChC;AACA;AACA,YAAY,sCAA4B;AACxC;AACA;;AAEA,YAAY,8BAAoB;AAChC;AACA;AACA,YAAY,sCAA4B;AACxC;AACA;AACA,YAAY,sCAA4B;AACxC;AACA;;AAEA;AACA;;AAEO;AACP;AACA,SAAS,gCAAsB;AAC/B;AACA,SAAS,wBAAc;AACvB;AACA,SAAS,yBAAe;AACxB;AACA,SAAS,iCAAuB;AAChC;AACA,SAAS,uBAAa;AACtB;AACA,SAAS,+BAAqB;AAC9B;AACA,SAAS,yBAAe;AACxB;AACA;AACA;;AAEO;AACP;;AAEO;AACP,oBAAoB,qBAAK;AACzB,mBAAmB,0BAAU;AAC7B,kBAAkB,uBAAO;AACzB,kBAAkB,uBAAO;AACzB,wBAAwB,uBAAO;;AAE/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;ACzMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEiD;AACD;AACD;AACW;;AAEnD,MAAM,aAAM,SAAS,SAAS;AACrC;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,qBAAqB,qBAAK;AAC1B,4BAA4B,0BAAU;AACtC;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,kDAAkD;;AAEhE;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA,YAAY,mBAA0B;AACtC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAM;;;ACtFsB;;;ACA5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEO;AACP;AACA;AACA;AACA;AACA,UAAU,wCAAwC;;AAElD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEO;AACP;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA,WAAW;AACX;;AAEO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,WAAS;AACtB;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,WAAS;AACtB;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;;AAEA,SAAS,WAAS;AAClB;AACA;AACA;AACA,qBAAqB,+BAA+B;AACpD;AACA;AACA;AACA;;;AC5rBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA,oCAAoC;AACpC;AACA,CAAC;AACD;AACA;;AAEA;AACO,MAAM,kBAAa;AAC1B;AACA;AACA;AACA;AACA,gCAAgC,EAAE,OAAO;AACzC;AACA,MAAM;AACN;AACA;AACA,UAAU,UAAU;AACpB,IAAI;AACJ;AACA;AACA,IAAI;AACJ,CAAC;AACD;AACA;AACA;AACA;;AAEA;;AAEA;AACA,iCAAiC,SAAS;;AAE1C;AACA,IAAI;AACJ,CAAC;AACD;AACA;;AAEA;AACO;AACP;AACA;AACA;AACA,EAAE,MAAM,iBAAiB,MAAM;AAC/B,aAAa,IAAI,EAAE;AACnB,CAAC;AACD;AACA,IAAI;AACJ;AACA,EAAE,MAAM,iBAAiB,MAAM,KAAK,MAAM;AAC1C,aAAa,IAAI;AACjB,CAAC;AACD;AACA;AACA;;AAEA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,gBAAgB,WAAS;AACzB;AACA;AACA,MAAM;AACN;AACA;AACA,GAAG;AACH;;AAEA;AACA,EAAE,IAAI,YAAY,MAAM,KAAK,SAAS,GAAG,GAAG,KAAK,IAAI;AACrD;AACA;;AAEA;AACO;AACP;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA,EAAE,IAAI,cAAc,MAAM,KAAK,UAAU,WAAW;AACpD;AACA;;AAEA;AACO;AACP;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,GAAG;;AAEH,kBAAkB,kBAAkB;AACpC;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,cAAc,KAAK;AACnB,gBAAgB,KAAK;AACrB,CAAC;AACD;AACA;;AAEA;AACO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA,KAAK,MAAM;AACX,cAAc,KAAK,GAAG,KAAK;AAC3B,CAAC;AACD;AACA;;AAEA;AACO;AACP;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,GAAG;;AAEH,kBAAkB,kBAAkB;AACpC;AACA;AACA;;AAEA,0BAA0B,IAAI;AAC9B;;AAEA;;AAEA;AACA;AACA,gBAAgB,KAAK;AACrB,CAAC;AACD;AACA;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,KAAK,KAAK;AAC1B;AACA,IAAI;AACJ;AACA,EAAE,MAAM,WAAW,MAAM;AACzB;AACA,CAAC;AACD;AACA;AACA;;AAEO;AACP,EAAE,MAAM;AACR,SAAS;AACT,CAAC;AACD;;AAEA,SAAS,WAAS;AAClB;AACA;AACA;AACA,qBAAqB,+BAA+B;AACpD;AACA;AACA;AACA;;;AC7RA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE8C;AACC;;AAExC,qBAAqB,SAAS;AACrC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA,uBAAuB,QAAa;AACpC;AACA;AACA,uBAAuB,QAAa;AACpC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE+C;AACJ;;AAEpC,MAAM,SAAI,SAAS,MAAM;AAChC;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,mBAAmB;;AAE/B;AACA;AACA;AACA,oBAAoB,QAAc;;AAElC;AACA;AACA,sBAAsB,QAAc;AACpC;AACA,UAAU,WAAiB;AAC3B;AACA;AACA;;AAEA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAI;;;ACnFJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACiC;;AAE1B,qBAAqB,SAAI;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,YAAY,kBAAkB;;AAE9B;AACA;;AAEA;AACA;AACA,cAAc,MAAM;AACpB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAY,6CAA6C;;AAEzD;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP,MAAM;AACN;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;;AAEA;AACA,YAAY,gCAAgC;AAC5C;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,sBAAsB;AACjC;AACA;;AAEA;AACA;AACA;AACA;;;ACnJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE+C;AACV;;AAE9B,qBAAqB,MAAM;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,kBAAkB;;AAElB;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB;AACA,YAAY,WAAW;AACvB,YAAY,QAAQ;;AAEpB,8BAA8B,wBAAwB;;AAEtD;AACA;;AAEA;AACA,YAAY,OAAO;AACnB,WAAW,aAAmB;;AAE9B,YAAY,QAAQ;AACpB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,YAAY,OAAO;AACnB,YAAY,cAAc;AAC1B;;AAEA;;AAEA;AACA;AACA,qBAAqB,aAAmB;;AAExC;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;;AAEA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;;;AChOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACoC;;AAE7B,uBAAuB,MAAM;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU,QAAQ;AAClB,YAAY,WAAW;AACvB;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP,MAAM;AACN;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;ACtFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE+C;AACV;;AAE9B,qBAAqB,MAAM;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY,QAAQ;AACpB,YAAY,SAAS;AACrB,YAAY,UAAU;AACtB;AACA;AACA,YAAY,WAAW;AACvB,YAAY,QAAQ;;AAEpB,8BAA8B,gCAAgC;;AAE9D;AACA;;AAEA;AACA,YAAY,OAAO;AACnB,WAAW,aAAmB;;AAE9B,YAAY,QAAQ;AACpB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,YAAY,OAAO;AACnB,YAAY,cAAc;AAC1B;AACA;;AAEA;;AAEA;AACA;AACA,qBAAqB,aAAmB;;AAExC;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;;;AC7PA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEqC;;AAE9B,mBAAmB,MAAM;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU,QAAQ;AAClB,UAAU,SAAS;;AAEnB,YAAY,YAAY;AACxB,YAAY,YAAY;;AAExB;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,MAAM;AACN;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;AC9GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE+C;AACV;;AAE9B,oBAAoB,MAAM;AACjC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY,QAAQ;AACpB,YAAY,SAAS;AACrB,YAAY,QAAQ;AACpB;AACA;AACA;AACA,YAAY,WAAW;AACvB,YAAY,QAAQ;;AAEpB,8BAA8B,uCAAuC;;AAErE;AACA;;AAEA;AACA,YAAY,OAAO;AACnB,WAAW,aAAmB;;AAE9B,YAAY,QAAQ;AACpB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;;AAEA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,YAAY,OAAO;AACnB,YAAY,cAAc;AAC1B;AACA;AACA;;AAEA;;AAEA;AACA;AACA,qBAAqB,aAAmB;;AAExC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;;;AC1QA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACmC;;AAE5B,qBAAqB,KAAK;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU,QAAQ;AAClB,UAAU,SAAS;AACnB,UAAU,QAAQ;;AAElB,YAAY,YAAY;AACxB,YAAY,YAAY;AACxB,YAAY,YAAY;;AAExB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;AC3IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACoD;;AAE7C;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEO;AACP,gBAAgB,uBAAO;AACvB;AACA;AACA;AACA;AACA,CAAC;;AAEM;AACP;AACA;AACA;AACA;AACA;AACA;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,CAAC;;;ACvED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE+C;AACJ;;AAEpC,oBAAoB,MAAM;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY,OAAO;;AAEnB;AACA,YAAY,eAAe;AAC3B;;AAEA;AACA;AACA;AACA;;AAEA,IAAI,YAAkB;AACtB,IAAI,SAAe;;AAEnB;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;;;AC7I2B;AACG;AACF;AACF;AACC;AACC;AACD;;;ACN3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEO;;AAEA;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,UAAU;AACV;AACA;AACA,sCAAsC,IAAI;AAC1C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC5EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE+C;AACJ;AACI;;AAExC,mBAAmB,SAAS;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY,SAAS;AACrB;AACA;;AAEA;AACA,YAAY,aAAa;;AAEzB;AACA,YAAY,eAAe;;AAE3B;AACA;;AAEA;AACA;;AAEA;AACA,YAAY,gBAAgB;AAC5B;AACA;AACA;AACA;;AAEA;AACA,qBAAqB,KAAS;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,YAAY,eAAe;;AAE3B;;AAEA;AACA;;AAEA,IAAI,YAAkB;AACtB,IAAI,YAAkB;AACtB;AACA;;AAEA,WAAW,SAAe;AAC1B;AACA;AACA;;;ACxLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE+C;AACJ;AACI;;AAExC,mBAAmB,SAAS;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,YAAY,8BAA8B;;AAE1C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ,wCAAwC;AAChD,QAAQ,wCAAwC;AAChD,QAAQ,iCAAiC;AACzC;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,8BAA8B;;AAE1C;AACA,YAAY,mCAAmC;;AAE/C;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB,WAAiB;AACpC;;AAEA,iBAAiB,KAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA,iBAAiB,KAAS,gCAAgC;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,cAAc,wBAAwB;AACtC;AACA;AACA;AACA;AACA;;;ACrMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE+C;AACJ;AACI;;AAExC,mBAAmB,SAAS;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,uBAAuB,KAAS;;AAEhC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA,eAAe;AACf;;AAEA;AACA,YAAY,8BAA8B;AAC1C;;AAEA;AACA,YAAY,eAAe;;AAE3B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc,oDAAoD;;AAElE;AACA;AACA;AACA,MAAM,YAAkB;AACxB,MAAM,YAAkB;AACxB;AACA;;AAEA;AACA,MAAM,SAAe;;AAErB;AACA;AACA;AACA;AACA,MAAM,YAAkB;;AAExB;AACA;AACA;AACA;;AAEA;AACA,YAAY,eAAe;AAC3B;AACA;;AAEA;AACA,YAAY,eAAe;;AAE3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACzOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE2C;AACI;;AAExC,mBAAmB,SAAS;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ,wCAAwC;AAChD,QAAQ,wCAAwC;AAChD;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY,aAAa;;AAEzB;AACA,YAAY,0BAA0B;AACtC;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,qBAAqB,KAAS;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACtMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE2C;AACI;;AAExC,oBAAoB,SAAS;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,YAAY,8BAA8B;;AAE1C;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ,wCAAwC;AAChD,QAAQ,wCAAwC;AAChD,QAAQ,oCAAoC;AAC5C;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,YAAY,8BAA8B;;AAE1C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,YAAY,QAAQ;AACpB,YAAY,OAAO;AACnB,YAAY,UAAU;;AAEtB;AACA,qBAAqB,KAAS;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC7IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE+C;AACJ;AACI;;AAExC,oBAAoB,SAAS;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,YAAY,8BAA8B;;AAE1C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ,wCAAwC;AAChD,QAAQ,wCAAwC;AAChD,QAAQ,iCAAiC;AACzC;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,YAAY,mCAAmC;;AAE/C;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,8BAA8B;;AAE1C;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB,WAAiB;AACpC;;AAEA,iBAAiB,KAAS;AAC1B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA,iBAAiB,KAAS,kBAAkB;;AAE5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,cAAc,wBAAwB;AACtC;AACA;AACA;AACA;AACA;;;AC1MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE2C;AACK;AACD;;AAExC,sBAAsB,SAAS;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,YAAY,8BAA8B;;AAE1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ,wCAAwC;AAChD,QAAQ,wCAAwC;AAChD,QAAQ,iCAAiC;AACzC;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,qBAAK;;AAEhC;AACA;AACA,YAAY,8BAA8B;;AAE1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,YAAY,oBAAoB;AAChC,mBAAmB,KAAS;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA,iBAAiB,KAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,+BAA+B;;AAE7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACxSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE2C;AACI;;AAExC,oBAAoB,SAAS;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ,wCAAwC;AAChD,QAAQ,wCAAwC;AAChD;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,qBAAqB,KAAS;;AAE9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,YAAY,eAAe;;AAE3B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,YAAY,UAAU;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACxJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE2C;AACI;;AAExC,qBAAqB,SAAS;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ,wCAAwC;AAChD,QAAQ,wCAAwC;AAChD;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY,aAAa;;AAEzB;AACA,YAAY,0BAA0B;AACtC;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,YAAY,oBAAoB;AAChC;AACA;AACA;AACA;;AAEA;AACA,qBAAqB,KAAS;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC7M0B;AACA;AACA;AACA;AACC;AACA;AACE;AACF;AACC;;;ACR5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACyC;;AAElC,mBAAmB,KAAK;AAC/B;AACA;AACA,oBAAoB;AACpB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,YAAY,8BAA8B;;AAE1C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,YAAY,KAAK;;AAEjB;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC7EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC+C;;AAExC,MAAM,OAAG,SAAS,SAAS;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,QAAQ,+BAA+B;AACvC,QAAQ,mCAAmC;AAC3C;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,8CAA8C,+BAA+B;AAC7E;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,KAAK;;AAEjB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,oCAAoC,GAAG,MAAM,IAAI;AACjD;AACA,WAAW,kCAAkC,MAAM,GAAG,MAAM;AAC5D;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,+BAA+B,yBAAyB;;AAExD,qCAAqC,0BAA0B;AAC/D;AACA;AACA;AACA;AACA,2BAA2B,WAAW;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAG;;;AC1SuB;AACD;;;ACDzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE+C;;AAEmB;AACvB;AACF;;AAElC,mBAAmB,KAAK;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU,6BAA6B;;AAEvC;AACA,YAAY,4CAA4C;;AAExD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA,qBAAqB,6BAAa;AAClC,qBAAqB,6BAAa;AAClC,gBAAgB,yBAAS;;AAEzB;AACA,IAAI,0BAA0B;;AAE9B;AACA;AACA;AACA;;AAEA;AACA,YAAY,QAAQ;AACpB,YAAY,SAAS;AACrB,YAAY,QAAQ;AACpB;AACA;AACA;AACA,YAAY,WAAW;AACvB,YAAY,QAAQ;;AAEpB,8BAA8B,uCAAuC;;AAErE;AACA;;AAEA;AACA,YAAY,OAAO;AACnB,WAAW,aAAmB;;AAE9B,YAAY,QAAQ;AACpB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA,YAAY,QAAQ;AACpB,YAAY,OAAO;AACnB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACnJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACwC;;AAEjC,uBAAuB,MAAM;AACpC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,iCAAiC,wCAAwC;AACzE;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;;AC9EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEkE;AACf;;AAE5C,qBAAqB,QAAQ;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,+BAA+B,qCAAqC;;AAEpE;AACA,UAAU,6BAA6B;;AAEvC;AACA,YAAY,4CAA4C;;AAExD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA,gBAAgB,6BAAa;AAC7B,gBAAgB,6BAAa;AAC7B,WAAW,yBAAS;;AAEpB;AACA;AACA,YAAY,8BAA8B;;AAE1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA,YAAY,QAAQ;AACpB,YAAY,OAAO;AACnB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,YAAY,OAAO;;AAEnB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,OAAO;AACnB,cAAc,eAAe;;AAE7B;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA,cAAc,SAAS;;AAEvB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACtMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE2C;;AAEI;;AAExC,oBAAoB,SAAS;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,QAAQ,iCAAiC;AACzC,QAAQ,wCAAwC;AAChD,QAAQ,wCAAwC;AAChD;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,qBAAqB,KAAS;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAY,OAAO;AACnB,YAAY,UAAU;AACtB,YAAY,SAAS;AACrB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;ACjKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE+C;AACN;;AAElC,uBAAuB,QAAQ;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ,uDAAuD;AAC/D;;AAEA;AACA,YAAY,oBAAoB;AAChC,YAAY,SAAS;;AAErB;AACA,YAAY,4CAA4C;;AAExD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,oBAAoB,qBAAqB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,IAAI;AACxB;AACA,oBAAoB,cAAoB;AACxC;AACA,qBAAqB,cAAoB;AACzC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,qBAAqB,QAAc;AACnC;AACA;;AAEA;AACA;AACA,sBAAsB,WAAiB;AACvC;;AAEA;AACA;AACA,sBAAsB,SAAe;AACrC;AACA;AACA,sBAAsB,cAAoB;AAC1C;AACA;AACA;AACA,sBAAsB,WAAiB;AACvC;AACA;;AAEA;AACA;AACA;;AAEA;AACA,sBAAsB,SAAe;AACrC;AACA,MAAM;AACN;AACA,sBAAsB,cAAoB;AAC1C;AACA;AACA;;AAEA;AACA,mBAAmB,cAAoB;AACvC;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC5WA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACmD;;AAE5C,qBAAqB,QAAQ;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,iCAAiC,sCAAsC;AACvE;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC5C0B;AACE;AACD;AACC;;;ACH5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC2C;;AAEpC,oBAAoB,MAAM;AACjC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,YAAY,+CAA+C;;AAE3D;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;ACrEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC2C;;AAEpC,kBAAkB,MAAM;AAC/B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY,oBAAoB;;AAEhC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;ACpE2B;AACF;;;ACDzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC2C;;AAEpC,wBAAwB,MAAM;AACrC;AACA;AACA;;AAEA;AACA;AACA,mBAAmB,gBAAS;AAC5B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,mBAAmB,gBAAS;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAAS,gBAAS;AAClB;AACA;AACA;AACA;;;AC1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEiD;AACN;;AAEpC,yBAAyB,SAAS;AACzC;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,4BAA4B,iBAAwB;AACpD;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC7DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC2C;;AAEpC,yBAAyB,SAAS;AACzC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC2C;;AAEpC,qBAAqB,SAAS;AACrC;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ,uDAAuD;AAC/D;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC2C;;AAEpC,uBAAuB,SAAS;AACvC;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ,uDAAuD;AAC/D;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC2C;;AAEpC,oBAAoB,SAAS;AACpC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,UAAU,MAAM;AAChB,YAAY,QAAQ;;AAEpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC9EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE+C;AACJ;;AAEpC,mBAAmB,MAAM;AAChC;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ,uDAAuD;AAC/D;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAc;AAC7B;AACA;AACA;AACA;AACA;AACA,kDAAkD,mBAAmB;AACrE,QAAQ;AACR;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA,mBAAmB,WAAS;AAC5B;AACA;AACA;AACA;AACA;;AAEA,SAAS,WAAS;AAClB;AACA;AACA;AACA;;;ACpE+B;AACC;AACA;AACJ;AACE;AACH;AACD;;;ACN1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACyC;;AAElC,oBAAoB,QAAQ;AACnC;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,uBAAuB;AACvB;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;AClEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACyC;;AAElC,mBAAmB,QAAQ;AAClC;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,sBAAsB,kBAAkB;AACxC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;AC1FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE+C;AACN;;AAEzC;AACA;AACA;AACA;AACA;AACA;;AAEO,mBAAmB,QAAQ;AAClC;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY,sBAAsB;;AAElC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;;AAEA;AACA,oBAAoB,mBAAmB;AACvC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,YAAY,QAAQ;AACpB,UAAU,OAAO;AACjB,UAAU,UAAU;;AAEpB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,sBAAsB,WAAiB;AACvC,sBAAsB,WAAiB;AACvC,sBAAsB,UAAgB;AACtC;AACA,mBAAmB,iBAAuB;;AAE1C;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACxKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE+C;AACN;;AAElC,mBAAmB,QAAQ;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY,oCAAoC;;AAEhD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB,qBAAqB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,qBAAqB,IAAI;AACzB,oBAAoB,cAAoB;AACxC,mBAAmB,cAAoB;AACvC;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN,oBAAoB,QAAc;AAClC,mBAAmB,QAAc;AACjC;;AAEA;AACA;AACA,oBAAoB,cAAoB;AACxC,mBAAmB,cAAoB;AACvC;;AAEA;AACA;;AAEA;AACA;AACA,gBAAgB,sBAAsB;AACtC;AACA,yBAAyB,IAAI;;AAE7B;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC/RA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACsC;;AAE/B,mBAAmB,QAAQ;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA,YAAY,6BAA6B;;AAEzC;AACA;AACA,YAAY,8BAA8B;;AAE1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,uBAAuB;;AAEnC;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACrHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC+C;;AAExC,uBAAuB,SAAS;AACvC;AACA;AACA,oBAAoB;AACpB;;AAEA;AACA;AACA,4BAA4B;AAC5B;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,+BAA+B,wCAAwC;;AAEvE;AACA;AACA;;AAEA;AACA,YAAY,uBAAuB;;AAEnC;AACA;AACA;;AAEA;AACA,YAAY,8BAA8B;;AAE1C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY,8BAA8B;AAC1C;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;AC1IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACyC;;AAElC,qBAAqB,QAAQ;AACpC;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACpGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE+C;AACN;;AAElC,sBAAsB,QAAQ;AACrC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY,QAAQ;AACpB;AACA,8BAA8B,WAAiB;AAC/C;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACyC;;AAElC,qBAAqB,QAAQ;AACpC;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,YAAY,OAAO;AACnB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,kBAAkB,kBAAkB;AACpC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA,wBAAwB,QAAQ;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;AC5HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE+C;AACN;;AAEzC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEO,oBAAoB,QAAQ;AACnC;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,QAAQ;AACpB,YAAY,OAAO;AACnB,YAAY,UAAU;AACtB,YAAY,SAAS;AACrB,YAAY,SAAS;;AAErB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;;AAEA;AACA,oBAAoB,mBAAmB;AACvC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAY,QAAQ;AACpB,UAAU,OAAO;AACjB,UAAU,UAAU;AACpB,YAAY,SAAS;;AAErB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,sBAAsB,WAAiB;AACvC,sBAAsB,WAAiB;AACvC,sBAAsB,UAAgB;AACtC;AACA,mBAAmB,iBAAuB;;AAE1C;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACrLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACyC;;AAElC,oBAAoB,QAAQ;AACnC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;AC1GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE+C;AACN;;AAElC,wBAAwB,QAAQ;AACvC;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU,OAAO;AACjB,YAAY,8BAA8B;;AAE1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN,oBAAoB,QAAc;AAClC,mBAAmB,QAAc;AACjC;;AAEA;AACA;AACA;;AAEA;AACA;AACA,oBAAoB,qBAAqB;AACzC;AACA,8BAA8B,IAAI,EAAE,KAAK;;AAEzC;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC9KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE+C;AACN;;AAEzC;AACA;AACA;AACA;AACA;AACA;;AAEO,wBAAwB,QAAQ;AACvC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,oBAAoB,QAAQ;AAC5B;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY,QAAQ;AACpB;AACA,sBAAsB,iBAAuB;AAC7C;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC/F2B;AACD;AACA;AACA;AACA;AACI;AACA;AACF;AACC;AACD;AACD;AACA;AACI;AACA;;;ACb/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC2C;;AAEpC,yBAAyB,MAAM;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,YAAY,UAAU;AACtB,YAAY,QAAQ;AACpB;;AAEA,sFAAsF;;AAEtF,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY,wCAAwC;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY,+BAA+B;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,6DAA6D,kBAAkB,GAAG;AAClF;AACA,UAAU,mBAAmB;AAC7B,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;;AAEN,UAAU,cAAc;;AAExB;AACA;AACA,SAAS,QAAQ;AACjB;AACA;AACA,SAAS,OAAO;AAChB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,qBAAqB,wBAAwB;AAC7C;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,4BAA4B,uBAAuB;AACnD;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,cAAc,UAAU;;AAExB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACxQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC6C;;AAEtC,mBAAmB,UAAU;AACpC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mBAAmB,WAAS;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAAS,WAAS;AAClB;AACA;AACA;AACA;;;ACjDO,SAAS,UAAK;AACrB;AACA;;AAEO;AACP,8BAA8B,UAAK;AACnC;;AAEO;AACP;AACA;;AAEO;AACP;AACA;;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE8C;AACC;;AAE/C;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;;AAEO,oBAAoB,SAAS;AACpC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ,mDAAmD;AAC3D;;AAEA,YAAY,SAAS;AACrB,YAAY,OAAO;;AAEnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA,kBAAkB,OAAO;AACzB;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,mBAAmB;AACzC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,yDAAyD;AACzD,wDAAwD;AACxD;AACA,QAAQ;AACR;AACA;AACA,mBAAmB;AACnB,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,oBAAoB;AACpB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,mBAAmB,sBAAsB,WAAW,QAAQ,WAAW,EAAE;AACzE;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,uBAAuB,sBAAsB;AAC7C;AACA,WAAW,mBAAmB,EAAE;AAChC;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,UAAU,WAAW;AACrB,YAAY,SAAS;AACrB,YAAY,aAAa;AACzB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAY,UAAU;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mBAAmB,UAAU;AAC7B;AACA;AACA,mBAAmB,MAAW;AAC9B;AACA;AACA,mBAAmB,MAAW;AAC9B;AACA;AACA,mBAAmB,IAAS;AAC5B;AACA,mBAAmB,MAAW;AAC9B;AACA,OAAO;;AAEP;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,sBAAsB,yCAAyC,IAAI;AAClF;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;ACtcA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACmC;;AAE5B,mBAAmB,KAAK;AAC/B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,cAAc,UAAU;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,cAAc,yCAAyC;;AAEvD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,QAAQ;AACR;AACA;;AAEA;AACA,KAAK;AACL;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC1FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC2C;;AAEpC,sBAAsB,MAAM;AACnC;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,YAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB,QAAQ;AACxB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,0BAA0B,iBAAiB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,QAAQ;AACR;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA,iCAAiC;;AAEjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACpVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE+C;AACF;;AAEtC,qBAAqB,UAAU;AACtC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,QAAc;AAC3B;AACA;AACA;AACA;AACA;AACA,gDAAgD,mBAAmB;AACnE,MAAM;AACN;AACA;AACA;;AAEA,mBAAmB,aAAS;AAC5B;AACA;AACA;AACA;AACA;;AAEA,SAAS,aAAS;AAClB;AACA;AACA;AACA;;;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC2C;;AAEpC,oBAAoB,MAAM;AACjC;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,sBAAsB;AACjC;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACzFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACmC;;AAE5B,mBAAmB,KAAK;AAC/B;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;;AAEL;AACA;AACA;AACA,UAAU,WAAS;;AAEnB;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,YAAY,WAAW;AACvB,cAAc,sDAAsD;AACpE;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,yCAAyC,iCAAiC;AAC1E;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,KAAK;AACL;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAAS,WAAS;AAClB;AACA;AACA;AACA,qBAAqB,+BAA+B;AACpD;AACA;AACA;AACA;;;ACrJ0B;AACA;AACG;AACD;AACD;AACD;;;ACL1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC2C;;AAEpC,kBAAkB,MAAM;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA,YAAY,6BAA6B;;AAEzC,YAAY,+BAA+B;;AAE3C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,OAAO,sBAAsB;AAC7B;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,mBAAmB,UAAS;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,qBAAqB;AACjD,MAAM;AACN,4BAA4B,qBAAqB;AACjD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAAS,UAAS;AAClB;AACA;AACA;AACA;;;ACnRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC+C;;AAExC,sBAAsB,SAAS;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,YAAY,QAAQ;AACpB,YAAY,SAAS;;AAErB;AACA;;AAEA;AACA;AACA,+BAA+B,wCAAwC;;AAEvE;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,QAAQ;;AAEpB;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC9GyB;AACI;;;ACD7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEsD;;AAE/C,mBAAmB,SAAS;AACnC;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEiD;AAChB;;AAE1B,wBAAwB,IAAI;AACnC;AACA;AACA;;AAEA;AACA;;AAEA,sBAAsB;;AAEtB;AACA,oBAAoB,iBAAwB;AAC5C;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAY,IAAI;AAChB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC1FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACiC;;AAE1B,yBAAyB,IAAI;AACpC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,YAAY,IAAI;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACzFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE+C;AACE;;AAEG;AACnB;;AAE1B,oBAAoB,IAAI;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,iBAAwB;;AAE5C;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAY,IAAI;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,yBAAyB,YAAkB;;AAE3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,eAAe,uBAAO;AACtB;AACA;AACA;;;ACxJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE+C;AACE;;AAEG;AACnB;;AAE1B,wBAAwB,IAAI;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,iBAAwB;;AAE5C;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAY,IAAI;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,yBAAyB,YAAkB;AAC3C,yBAAyB,YAAkB;;AAE3C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,iDAAiD;AACjD;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,eAAe,uBAAO;AACtB;AACA;AACA;;;AC3KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE+C;AACE;;AAEhB;;AAE1B,4BAA4B,IAAI;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,4BAA4B,iBAAwB;AACpD;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAY,IAAI;AAChB;AACA;AACA;AACA;AACA;;AAEA;AACA,yBAAyB,YAAkB;;AAE3C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACrHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE+C;;AAEd;;AAE1B,6BAA6B,IAAI;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,YAAY,IAAI;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,yBAAyB,YAAkB;;AAE3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AClH0B;AACK;AACC;AACL;AACI;AACI;AACC;;;ACNpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC+C;;AAExC,qBAAqB,SAAS;AACrC;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,YAAY,iBAAiB;AAC7B;AACA;AACA;;AAEA;AACA;AACA,QAAQ,uDAAuD;AAC/D;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,8BAA8B,SAAS,qBAAqB;AAC5D;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAY,OAAO;;AAEnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;AC5I4B;;;ACA5B;AACoD;AAClB;AAC4C;AAW9D;AACsB;AACe;AACjB;AAQf;AAgBD;AACiD;AAChC;AASrB;;AAEkB;;AAE3B,MAAM,eAAO;AACpB,QAAQ,IAAI;AACZ,QAAQ,IAAI;AACZ,QAAQ,IAAI;AACZ,QAAQ,IAAI;AACZ,SAAS,KAAK;AACd,SAAS,KAAK;AACd,WAAW,OAAO;AAClB,SAAS,KAAK;AACd,UAAU,MAAM;;AAEhB,QAAQ,IAAI;AACZ,aAAa,SAAS;AACtB,cAAc,UAAU;AACxB,SAAS,KAAK;AACd,aAAa,SAAS;AACtB,iBAAiB,aAAa;AAC9B,kBAAkB,cAAc;;AAEhC,aAAa,UAAU;AACvB,cAAc,UAAU;AACxB,UAAU,MAAM;AAChB,YAAY,QAAQ;AACpB,SAAS,KAAK;AACd,QAAQ,IAAI;;AAEZ,SAAS,MAAM;AACf,YAAY,QAAQ;AACpB,UAAU,MAAM;AAChB,QAAQ,IAAI;AACZ,SAAS,KAAK;AACd,UAAU,MAAM;AAChB,SAAS,KAAK;;AAEd,QAAQ,IAAI;AACZ,OAAO,OAAG;;AAEV,QAAQ,IAAI;AACZ,UAAU,MAAM;AAChB,SAAS,KAAK;AACd,UAAU,MAAM;;AAEhB,SAAS,KAAK;AACd,QAAQ,IAAI;AACZ,QAAQ,IAAI;AACZ,QAAQ,IAAI;AACZ,QAAQ,IAAI;AACZ,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,UAAU,MAAM;AAChB,WAAW,OAAO;AAClB,UAAU,MAAM;AAChB,SAAS,KAAK;AACd,SAAS,KAAK;AACd,aAAa,SAAS;AACtB,aAAa,SAAS;;AAEtB,SAAS,gBAAK;AACd,WAAW,OAAO;AAClB,QAAQ,IAAI;AACZ,QAAQ,IAAI;;AAEZ,UAAU,MAAM;;AAEhB,UAAU,aAAM;;AAEhB,OAAO,GAAG;AACV,WAAW,OAAO;;AAElB,SAAS,KAAK;AACd,OAAO,GAAG;;AAEV,QAAQ,IAAI;AACZ,QAAQ,IAAI;AACZ,WAAW,OAAO;AAClB,UAAU,MAAM;AAChB,SAAS,KAAK;AACd,QAAQ,IAAI;AACZ;;;ACtIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE4C;AACJ;;AAgBR;AACgB;AACI;AACA;AACM;AACN;AACA;AACA;;AAEpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB,OAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,sBAAsB,kBAAkB;AACxC;AACA;AACA;AACA;;AAEA,kBAAkB,WAAK;;AAEvB;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,kBAAkB,WAAK;;AAEvB;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,eAAe,cAAoB;AACnC,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,mBAAmB,uBAAO;AAC1B,OAAO;AACP;AACA;AACA;AACA;;AAEA,6BAA6B,uBAAO;AACpC;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,WAAK;AACtB,YAAY,WAAW;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,mBAAmB,uBAAO;AAC1B,OAAO;AACP;AACA;AACA;AACA;;AAEA,6BAA6B,uBAAO;AACpC;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,WAAK;AACtB,YAAY,WAAW;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,mBAAmB,uBAAO;AAC1B,OAAO;AACP;AACA;AACA;AACA;;AAEA,6BAA6B,uBAAO;AACpC;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,WAAK;AACtB,YAAY,WAAW;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA,sBAAsB,uBAAO;AAC7B;AACA;AACA,OAAO;AACP;AACA,6BAA6B,uBAAO;AACpC;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA,sBAAsB,uBAAO;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,6BAA6B,uBAAO;AACpC;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,WAAK;;AAEtB;AACA;AACA;AACA,OAAO;AACP;AACA,mBAAmB,0BAAU;AAC7B,OAAO;AACP;AACA,6BAA6B,0BAAU;AACvC;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,UAAU,gCAAgB;AAC1B;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA,mBAAmB,qBAAK;AACxB,OAAO;AACP;AACA;AACA,sBAAsB,qBAAK;AAC3B,UAAU;AACV,sBAAsB,qBAAK;AAC3B;;AAEA,6BAA6B,qBAAK;AAClC;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,uBAAuB,WAAK,SAAS,WAAK;AAC1C,sBAAsB,WAAK,SAAS,WAAK;;AAEzC;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,WAAK,SAAS,WAAK;AAC1C,sBAAsB,WAAK,SAAS,WAAK;;AAEzC;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;AACP;AACA;AACA;AACA,GAAG;;AAEH;AACA,wBAAwB,WAAK,OAAO,WAAK;;AAEzC;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,WAAW,WAAK;AAChB,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,eAAe,6BAAa;AAC5B,4BAA4B,0CAA0B;AACtD,2BAA2B,yCAAyB;AACpD,cAAc,4BAAY;AAC1B,2BAA2B,yCAAyB;AACpD,0BAA0B,wCAAwB;AAClD;;AAEA,WAAW,WAAK;AAChB,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,oBAAoB,gCAAgB;AACpC,YAAY,wBAAQ;AACpB,aAAa,yBAAS;AACtB,qBAAqB,iCAAiB;AACtC,WAAW,uBAAO;AAClB,mBAAmB,+BAAe;AAClC,aAAa,yBAAS;AACtB;;AAEA,WAAW,WAAK;AAChB,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,WAAW,WAAK;AAChB,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,WAAW,WAAK;AAChB,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,WAAW,WAAK;AAChB,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,WAAW,WAAK;AAChB,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,WAAW,WAAK;AAChB,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,WAAW,WAAK;AAChB,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,WAAW,WAAK;AAChB,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,WAAW,WAAK;AAChB,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,WAAW,WAAK;AAChB,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,WAAW,WAAK;AAChB,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,WAAW,WAAK;AAChB,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,WAAW,WAAK;AAChB,GAAG;;AAEH;AACA;AACA;AACA;AACA,kBAAkB,WAAe;AACjC;AACA;AACA;AACA,wBAAwB,WAAK,OAAO,WAAK;;AAEzC;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA,OAAO;;AAEP;AACA,eAAe,YAAkB;AACjC,OAAO;AACP;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,kBAAe;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEO,MAAM,WAAK;;AAElB,SAAS,YAAS;AAClB;AACA;AACA;AACA,qBAAqB,+BAA+B;AACpD;AACA;AACA;AACA;AACA,SAAS,kBAAe;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;;ACj7CA;AACA;AACmC;;AAE5B;AACP;AACA,QAAQ,oBAAc,CAAC,kBAAY;AACnC,aAAa,mBAAa;AAC1B,GAAG;;AAEH;AACA,YAAY,gBAAU;AACtB,GAAG;;AAEH;AACA,aAAa,gBAAU;AACvB,GAAG;;AAEH;AACA,WAAW,oBAAc,CAAC,kBAAY;AACtC,SAAS,oBAAc,CAAC,kBAAY;AACpC,WAAW,oBAAc,CAAC,kBAAY;AACtC,GAAG;;AAEH;AACA,WAAW,oBAAc,CAAC,gBAAU;AACpC,GAAG;AACH;AACA,WAAW,iBAAW,CAAC,gBAAU;AACjC,GAAG;AACH;AACA,cAAc,gBAAU;AACxB,gBAAgB,gBAAU;AAC1B,cAAc,gBAAU;AACxB,WAAW,gBAAU;AACrB,gBAAgB,mBAAa;AAC7B,GAAG;AACH;AACA,cAAc,gBAAU;AACxB,WAAW,gBAAU;AACrB,GAAG;;AAEH;AACA,WAAW,kBAAY;AACvB,SAAS,eAAS;AAClB,GAAG;;AAEH;AACA,UAAU,sBAAgB;AAC1B,GAAG;AACH;AA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eAAS;AACrC,GAAG;AACH;AACA,cAAc,gBAAU;AACxB,WAAW,oBAAc,CAAC,iBAAW,CAAC,kBAAY;AAClD,WAAW,kBAAY;AACvB,cAAc,kBAAY;AAC1B,UAAU,kBAAY;AACtB,WAAW,kBAAY;AACvB,YAAY,kBAAY;AACxB,UAAU,gBAAU;AACpB,cAAc,gBAAU;AACxB,GAAG;AACH;AACA,WAAW,kBAAY;AACvB,UAAU,kBAAY;AACtB,WAAW,kBAAY;AACvB,UAAU,kBAAY;AACtB,QAAQ,kBAAY;AACpB,cAAc,gBAAU;AACxB,UAAU,gBAAU;AACpB,GAAG;AACH;AACA,SAAS,oBAAc,CAAC,qBAAe;AACvC,UAAU,oBAAc,CAAC,kBAAY;AACrC,UAAU,kBAAY;AACtB,WAAW,kBAAY;AACvB,GAAG;AACH;;;AC5cA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AChMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE4C;AACE;;AAEU;AACJ;AACA;AACpD;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,WAAW;AACzB,gBAAgB,wCAAwC;;AAExD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;;AAEA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,oBAAoB;AAC3C;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA,sBAAsB,uBAAO;;AAE7B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,oBAAoB,IAAW;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc,MAAM;;AAEpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,WAAW;AACpC,iBAAiB,cAAS;AAC1B;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,WAAW;AACpC,iBAAiB,cAAS;AAC1B;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,gBAAgB,WAAiB;AACjC;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,gBAAgB,WAAiB;AACjC;AACA,gBAAgB,WAAiB;AACjC;AACA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA,kBAAkB;;AAElB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA,kBAAkB;;AAElB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,iBAAiB,8BAAc;AAC/B;AACA;;AAEA;AACA,WAAW,UAAU;AACrB,WAAW,WAAW;AACtB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,WAAW,QAAQ;AACnB;;AAEA;AACA,gBAAgB,UAAU;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,sBAAsB,uBAAO;AAC7B,yBAAyB,uBAAO;;AAEhC;AACA;AACA;AACA;AACA;;AAEA;;AAEA,gBAAgB,QAAQ;AACxB,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;AACL,GAAG;AACH;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAAS,cAAS;AAClB;AACA;AACA;AACA;;;ACprB6B;AACF;AACC;AACC;;;ACH7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,mDAAmD,KAAK;AACxD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;AC5CiC;;AAE0B;AAC5B;AACxB,MAAM,gBAAK,GAAG,gCAAK;;;ACJ1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEsD;AACqB;AAC9B;AACmB;AACa;;AAE7E;AACA;AACA;AACA,sBAAsB,wBAAQ;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACO,oBAAoB,UAAU;AACrC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,uBAAuB,qBAAU;AACjC;;AAEA;AACA;;AAEA,uBAAuB,iCAAiB;AACxC,sBAAsB,iCAAiB;AACvC;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY,WAAW;;AAEvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;AChJA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE4C;AACE;;AAE9C;AACA;AACA;AACO,MAAM,aAAM,SAAS,UAAU;AACtC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,WAAiB;AAC5B;AACA;;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEgD;AACC;;AAEO;AACJ;;AAEpD;AACA;;AAEA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,6BAAmB;AAC7B;AACA;AACA;AACA;AACA;AACA,UAAU,6BAAmB;AAC7B;AACA;AACA;AACA;AACA;AACA,UAAU,yBAAe;;AAEzB,qBAAqB,SAAgB;AACrC,qBAAqB,SAAgB;AACrC,gBAAgB,SAAgB;AAChC,gBAAgB,mBAA0B;;AAE1C;AACA;;AAEA;AACA,YAAY,KAAK;AACjB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,+BAAqB;AAC3B,MAAM,oCAA0B;AAChC,MAAM,yBAAe;AACrB,MAAM,0BAAgB;AACtB;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,6BAA6B,uBAAO;AACpC;AACA,MAAM,yBAAe;AACrB,MAAM,mCAAyB;AAC/B,MAAM,mCAAyB;AAC/B;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,8BAA8B,yBAAe;AAC7C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB,uBAAO;AAC1B,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA,YAAY,KAAK;AACjB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;AChKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE4C;AACA;;AAEP;AACkB;AACH;;AAEpD;AACA;AACA;AACA;AACA;AACA;AACA;AACO,yBAAyB,aAAM;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,SAAe;AACnC;AACA;AACA,MAAM;AACN;AACA,oBAAoB,WAAiB;AACrC;AACA;;AAEA;AACA,8BAA8B,KAAK;AACnC;AACA;AACA;AACA,QAAQ,WAAiB;AACzB;AACA;AACA;AACA;;AAEA;AACA;AACA,uBAAuB,WAAW;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,qBAAqB,uBAAuB,uBAAO,IAAI;AACvD,sBAAsB,8BAA8B;AACpD,uBAAuB,+BAA+B;AACtD,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,YAAY,gBAAgB;AAC5B,YAAY,OAAO;;AAEnB;;AAEA;AACA,WAAW,UAAgB;;AAE3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;ACvKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE4C;AACC;;AAE7C;AACA;AACA;AACO,2BAA2B,UAAU;AAC5C;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,YAAY,WAAW;AACvB;AACA;AACA;;AAEA,YAAY,2BAA2B;AACvC;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,gBAAgB;AAC5B,YAAY,OAAO;;AAEnB;;AAEA;AACA,WAAW,UAAgB;;AAE3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;ACnGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEkE;;AAE3D,uBAAuB,8BAAc;AAC5C;AACA;AACA,QAAQ,8BAAc;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,oBAAoB,iBAAiB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY,QAAQ;;AAEpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;AC7EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEyC;AACW;;AAEpD;AACO,2BAA2B,QAAQ;AAC1C;AACA,4BAA4B,uBAAO;AACnC,kCAAkC,uBAAO;AACzC,uBAAuB,uBAAO;;AAE9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;;ACvEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEoE;AACnB;;AAEjD;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEO,4BAA4B,YAAY;AAC/C;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,sBAAsB,+BAAe;;AAErC;AACA;AACA,UAAU,+BAAe;AACzB;AACA;AACA;AACA,UAAU,+BAAe;AACzB;AACA;AACA;AACA,UAAU,+BAAe;AACzB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS,UAAU;AACnB;AACA;AACA,SAAS,SAAS;AAClB;AACA;AACA,SAAS,UAAU;AACnB;AACA;AACA,SAAS,SAAS;AAClB;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;;ACzLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE4C;;AAEiC;AAC/B;;AAEvC,mBAAmB,UAAU;AACpC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,gBAAgB,WAAW;AAC3B,gBAAgB,WAAW;AAC3B;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;;AAEA;AACA,gBAAgB,WAAW;AAC3B,gBAAgB,WAAW;AAC3B;AACA,4BAA4B;AAC5B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB,iCAAiB;;AAE1C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,cAAoB;AACnC;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,eAAe,QAAc;AAC7B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA,iBAAiB,cAAoB;AACrC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,eAAe,QAAc;AAC7B;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,cAAoB;AACnC;AACA;;AAEA;AACA;AACA;;;AC1SA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE6D;AAC5B;AACmB;AACH;;AAE1C,oBAAoB,IAAI;AAC/B;AACA;AACA;;AAEA,UAAU,WAAW;;AAErB,YAAY,8DAA8D;AAC1E;AACA;AACA;AACA;;AAEA;;AAEA,wBAAwB,aAAa;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,YAAY,0BAAU;AACtB,KAAK;AACL;;AAEA,uBAAuB,oBAAI;AAC3B;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACtFA;AACA;AACA;AACA;AACA;AACA;AACA;AAC+C;;AAE/C;AACA;;AAEA;AACA;AACA;AACA;AACO,4BAA4B,WAAW;AAC9C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,YAAY,KAAK;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,YAAY,QAAQ;AACpB;AACA,YAAY,WAAW;;AAEvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;ACzFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE4C;;AAEe;AACJ;AACT;AACM;;AAEpD;AACA;AACA;AACA;AACA;AACA;AACO,oBAAoB,UAAU;AACrC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ,WAAiB;AACzB;AACA;AACA;AACA;;AAEA;AACA;AACA,uCAAuC,aAAa,GAAG,WAAW;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,mBAAmB,uBAAO;AAC1B,OAAO;AACP;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,uCAAuC,MAAM,GAAG,OAAO;AACvD,MAAM;AACN,0CAA0C,MAAM,GAAG,OAAO;AAC1D;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,OAAO;AACnB;AACA;AACA,cAAc,YAAS;AACvB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,oBAAoB,sBAAsB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,SAAS;;AAElB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAAS,YAAS;AAClB;AACA;AACA;AACA;;;ACtOA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEiC;AACmB;AACH;AAC4B;AACP;;AAE/D,oBAAoB,IAAI;AAC/B;AACA;;AAEA,wBAAwB,6BAAa;AACrC,wBAAwB,iCAAiB,GAAG,kBAAkB;AAC9D,yBAAyB,0BAAU;;AAEnC,uBAAuB,oBAAI;AAC3B;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEoE;AACnB;;AAEjD;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEO,2BAA2B,YAAY;AAC9C;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,sBAAsB,+BAAe;;AAErC;AACA;AACA,UAAU,+BAAe;AACzB;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,SAAS,QAAQ;AACjB;AACA;AACA,SAAS,SAAS;AAClB;AACA;AACA,SAAS,QAAQ;AACjB;AACA;AACA,SAAS,QAAQ;AACjB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACrIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEiC;AACmB;AACO;AACV;;AAE1C,MAAM,SAAI,SAAS,IAAI;AAC9B;AACA;AACA;;AAEA,UAAU,qBAAqB;AAC/B,YAAY,oDAAoD;;AAEhE;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,wBAAwB,YAAY;AACpC;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,YAAY,0BAAU;AACtB,KAAK;AACL;;AAEA,uBAAuB,oBAAI;AAC3B;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACxFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEoE;AACnB;;AAEjD;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEO,2BAA2B,YAAY;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,sBAAsB,+BAAe;;AAErC;AACA;AACA,UAAU,+BAAe;AACzB;AACA;AACA;AACA,UAAU,+BAAe;AACzB;AACA;AACA;AACA,UAAU,+BAAe;AACzB;AACA;AACA;AACA;AACA,YAAY,+BAAe;AAC3B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA,YAAY;AACZ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS,SAAS;AAClB;AACA;AACA,SAAS,UAAU;AACnB;AACA;AACA,SAAS,SAAS;AAClB;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACtRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEiC;AACmB;AACO;AACV;;AAE1C,MAAM,SAAI,SAAS,IAAI;AAC9B;AACA;AACA;;AAEA,UAAU,yBAAyB;;AAEnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;;AAEN;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,qBAAqB,8BAA8B;;AAEnD,wBAAwB,YAAY;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,8BAA8B,OAAO;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,YAAY,0BAAU;AACtB,KAAK;AACL;;AAEA,uBAAuB,oBAAI;AAC3B;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;AClIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE4C;AACC;;AAE7C;AACA;AACA;AACO,2BAA2B,UAAU;AAC5C;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,iBAAiB;AACjB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,WAAW;AACvB;AACA;AACA;;AAEA,YAAY,iCAAiC;AAC7C;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,sBAAsB;AAClC,YAAY,OAAO;;AAEnB;;AAEA;AACA,WAAW,UAAgB;;AAE3B;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;ACjKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAMgC;AACoB;AACyB;;AAEtE;AACP;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,6BAAa;AACvC;AACA;AACA,0BAA0B,6BAAa;AACvC;AACA;AACA,uBAAuB,0BAAU;AACjC;AACA;AACA,qBAAqB,gCAAgB;AACrC;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,UAAU,iCAAiB;;AAE3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB,uBAAO;AAC1B,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC3HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE4C;;AAE+B;AAClB;AACX;AACI;AACE;AACA;;AAEpD;AACA;AACA;AACO,8BAA8B,UAAU;AAC/C;AACA;;AAEA,6DAA6D,qBAAK;AAClE;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,WAAiB;AACrC;AACA;AACA;AACA,MAAM;AACN,4BAA4B,kBAAmB;AAC/C;AACA;AACA;AACA,oBAAoB,SAAe;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,wBAAwB,iCAAiB;AACzC;AACA,6BAA6B,uBAAO;AACpC;AACA;AACA;AACA;;AAEA,sBAAsB,YAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB,uBAAO;AAC1B,OAAO;AACP,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS,SAAS;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;;AC3JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEoD;AACG;;AAEvD;AACA;AACA;AACO,MAAM,SAAI,SAAS,eAAe;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,qBAAqB,0BAAU;AAC/B;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,sBAAsB,8BAA8B;AACpD,uBAAuB,+BAA+B;AACtD,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACpEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEoE;AACnB;;AAEjD;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEO,8BAA8B,YAAY;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,sBAAsB,+BAAe;;AAErC;AACA;AACA,UAAU,+BAAe;AACzB;AACA;AACA;AACA,UAAU,+BAAe;AACzB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA,YAAY;AACZ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA,YAAY;AACZ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,SAAS,QAAQ;AACjB;AACA;AACA,SAAS,SAAS;AAClB;AACA;AACA,SAAS,WAAW;AACpB;AACA;AACA,SAAS,SAAS;AAClB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS,QAAQ;AACjB;AACA;AACA,SAAS,SAAS;AAClB;AACA;AACA,SAAS,WAAW;AACpB;AACA;AACA,SAAS,SAAS;AAClB;AACA;AACA;AACA;;;AC5NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEuD;AACH;;AAEpD;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEO,6BAA6B,eAAe;AACnD;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB,uBAAO;AACxB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS,QAAQ;AACjB;AACA;AACA,SAAS,SAAS;AAClB;AACA;AACA,SAAS,WAAW;AACpB;AACA;AACA,SAAS,SAAS;AAClB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACzFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEiC;AACmB;AACH;AACc;;AAExD,qBAAqB,IAAI;AAChC;AACA;AACA;;AAEA,UAAU,WAAW;AACrB,YAAY,6BAA6B;;AAEzC;AACA;AACA;;AAEA;;AAEA,wBAAwB,cAAc;AACtC;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,YAAY,0BAAU;AACtB,KAAK;AACL;;AAEA,uBAAuB,oBAAI;AAC3B;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC/EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEqC;AACe;AACA;;AAE7C,yBAAyB,MAAM;AACtC;AACA,YAAY,oCAAoC;;AAEhD;AACA;;AAEA;AACA;AACA;AACA,mBAAmB,uBAAO;AAC1B,OAAO;AACP;AACA;AACA,mBAAmB,uBAAO;AAC1B,OAAO;AACP;AACA;AACA,mBAAmB,uBAAO;AAC1B,OAAO;AACP;AACA;AACA,mBAAmB,uBAAO;AAC1B,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,+BAA+B,mBAAmB;AAClD;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS,QAAQ;AACjB;AACA;AACA,SAAS,SAAS;AAClB;AACA;AACA,SAAS,QAAQ;AACjB;AACA;AACA,SAAS,QAAQ;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;ACxFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEoE;AACnB;;AAEjD;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEO,6BAA6B,YAAY;AAChD;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,sBAAsB,+BAAe;;AAErC;AACA;AACA,UAAU,+BAAe;AACzB;AACA;AACA;AACA,UAAU,+BAAe;AACzB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,SAAS,QAAQ;AACjB;AACA;AACA,SAAS,SAAS;AAClB;AACA;AACA,SAAS,QAAQ;AACjB;AACA;AACA,SAAS,QAAQ;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACjJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEiC;AACmB;AACH;AACc;;AAExD,MAAM,WAAK,SAAS,IAAI;AAC/B;AACA;AACA;;AAEA,UAAU,wBAAwB;;AAElC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;;AAEN;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,KAAK;;AAExC,wBAAwB,cAAc;AACtC;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA,sBAAsB;;AAEtB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,4BAA4B,OAAO;AACnC,6BAA6B,MAAM;AACnC;;AAEA;AACA;AACA;AACA,4BAA4B,OAAO;AACnC,6BAA6B,MAAM;AACnC;;AAEA;AACA,YAAY,0BAAU;AACtB,KAAK;AACL;;AAEA;AACA,YAAY,0BAAU;AACtB,KAAK;AACL;;AAEA,0BAA0B,oBAAI;AAC9B,0BAA0B,oBAAI;;AAE9B;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC1KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACqC;;AAErC;AACA;AACA;AACO,yBAAyB,aAAM;AACtC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,iBAAiB;AACjB;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,iBAAS;AACpB;;AAEA;AACA;AACA,YAAY,WAAW;AACvB;AACA;AACA;;AAEA,YAAY,iCAAiC;AAC7C;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,SAAS,iBAAS;AAClB;AACA;AACA;AACA,qBAAqB,+BAA+B;AACpD;AACA;AACA;AACA;;;AC5IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE4C;AACA;;AAEyB;AACpC;AACoB;AACP;AACM;;AAEpD;AACA;AACA;AACO,MAAM,iBAAQ,SAAS,UAAU;AACxC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,yBAAS;AAC3C;AACA;AACA;AACA;AACA,iCAAiC,yBAAS;;AAE1C;;AAEA;;AAEA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,MAAM;AAClB,YAAY,UAAU;AACtB;;AAEA,UAAU,OAAO;AACjB,YAAY,8BAA8B;;AAE1C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,qBAAqB,uBAAO;AAC5B,SAAS;AACT,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,2BAA2B,SAAI;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,yBAAS;AACvB,OAAO;;AAEP,8BAA8B,UAAU;AACxC;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,oBAAoB;AACpB,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,mBAAmB,mBAAyB;AAC5C;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,mBAAmB,WAAiB;AACpC;AACA;AACA;;AAEA;AACA,wBAAwB,SAAI;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,gCAAgB;AAC5B,KAAK;;AAEL,2BAA2B,UAAU;AACrC;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;;AAEA;AACA;AACA;;AAEA;;AAEA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;;AAEA,oBAAoB;AACpB,qBAAqB;AACrB,kBAAkB;AAClB,iBAAiB;;AAEjB;AACA;;AAEA;AACA;;AAEA;AACA,WAAW,WAAiB;AAC5B,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,OAAO,QAAQ;AACf,OAAO,QAAQ;AACf;AACA,OAAO,QAAQ;AACf;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAY,oCAAoC;AAChD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC3YA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEiC;AACmB;AACH;AACc;;AAExD,qBAAqB,IAAI;AAChC;AACA;AACA;;AAEA,UAAU,WAAW;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;;AAEN;AACA;AACA;;AAEA;;AAEA,wBAAwB,cAAc;AACtC;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,YAAY,0BAAU;AACtB,KAAK;AACL;;AAEA;AACA,YAAY,0BAAU;AACtB,KAAK;AACL;;AAEA,0BAA0B,oBAAI;AAC9B,0BAA0B,oBAAI;;AAE9B;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC3HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEoE;AACnB;;AAEjD;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEO,4BAA4B,YAAY;AAC/C;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,sBAAsB,+BAAe;;AAErC;AACA;AACA,UAAU,+BAAe;AACzB;AACA;AACA;AACA,UAAU,+BAAe;AACzB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,SAAS,QAAQ;AACjB;AACA;AACA,SAAS,SAAS;AAClB;AACA;AACA,SAAS,QAAQ;AACjB;AACA;AACA,SAAS,QAAQ;AACjB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC5JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEiC;AACmB;AACH;AACY;;AAEtD,MAAM,WAAK,SAAS,IAAI;AAC/B;AACA;AACA;;AAEA,UAAU,qBAAqB;AAC/B,YAAY,oDAAoD;;AAEhE;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,wBAAwB,aAAa;AACrC;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,YAAY,0BAAU;AACtB,KAAK;AACL;;AAEA,uBAAuB,oBAAI;AAC3B;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACxFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEiC;AACmB;AACH;AACgB;;AAE1D,MAAM,eAAO,SAAS,IAAI;AACjC;AACA;AACA;;AAEA,UAAU,qBAAqB;;AAE/B,YAAY,2DAA2D;AACvE;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,wBAAwB,eAAe;AACvC;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA,eAAe;AACf;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,YAAY,0BAAU;AACtB,KAAK;AACL;;AAEA,uBAAuB,oBAAI;AAC3B;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;AChGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEmC;AACuB;;AAE1D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACO,wBAAwB,KAAK;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,gCAAgB;AACnC;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,8BAA8B,iCAAiC;AAC/D;;AAEA;AACA,sBAAsB,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,UAAU,KAAK,KAAK;AACvF;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,sDAAsD,QAAQ,SAAS,cAAc,uBAAuB,gCAAgC;AAC5I;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,4BAA4B;AAC5B;;AAEA;AACA;AACA;;AAEA;AACA,YAAY,SAAS;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,SAAS;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,SAAS;;AAErB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS,OAAO;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,SAAS,OAAO;AAChB;AACA,cAAc,QAAQ;;AAEtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;AClRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE4C;AACC;;AAE7C;AACA;AACA;AACO,0BAA0B,UAAU;AAC3C;AACA;AACA,iBAAiB;AACjB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,WAAW;AACvB;AACA;AACA;;AAEA,YAAY,iCAAiC;AAC7C;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,YAAY,sBAAsB;AAClC,YAAY,OAAO;;AAEnB;;AAEA;AACA;AACA,WAAW,UAAgB;;AAE3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;AClJuD;AACb;AACA;AACU;AACV;AACF;AACA;AACgB;AAChB;AACY;AACV;AACU;AACJ;AACc;AAC3B;AACS;AACA;AACF;AACI;AACI;AACI;;AAE/C,MAAM,sBAAO;AACpB,UAAU,MAAM;AAChB,SAAS,WAAK;AACd,QAAQ,SAAI;AACZ,WAAW,eAAO;AAClB,QAAQ,SAAI;AACZ,SAAS,WAAK;AACd,SAAS,KAAK;AACd,UAAU,MAAM;AAChB,cAAc,UAAU;AACxB,SAAS,KAAK;AACd,cAAc,UAAU;AACxB,eAAe,YAAY;AAC3B,gBAAgB,YAAY;AAC5B,eAAe,WAAW;AAC1B,cAAc,UAAU;AACxB,mBAAmB,eAAe;AAClC,QAAQ,SAAI;AACZ,YAAY,iBAAQ;AACpB,SAAS,KAAK;AACd,aAAa,SAAS;AACtB,SAAS,KAAK;AACd;;;AC5C2B;AAC6B;AAC7B;AACE;;;ACH7B,+DAA0B;AAC1B;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,CAAC,EAAC;;;AC1EF,8DAA0B;AAC1B;;AAEA;AACA;AACA;AACA,CAAC;;ACND,oEAA0B;AAC1B;AACA;AACA;;AAEA;AACA;AACA;AACA,CAAC;;ACRD,mEAA0B;;AAE1B;AACA;AACA;AACA,CAAC;;ACLD,+DAA0B;;AAE1B;AACA;AACA;AACA,CAAC;;ACLD,6DAA0B;AAC1B;AACA;AACA,CAAC;;ACHD,8DAA0B;AAC1B;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,CAAC;;ACVD,qEAA0B;;AAE1B;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,CAAC;;AC9BD,6DAA0B;AAC1B;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,4BAA4B;AAC5B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AC3CD,iEAA0B;;AAE1B;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,CAAC,CAAC;;ACbF,8DAA0B;;AAE1B;AACA;AACA;AACA;AACA,CAAC,CAAC;;ACNF,qEAA0B;AAC1B;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC;;ACtBD,qEAA0B;AAC1B;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC;;ACtBD,mEAA0B;;AAE1B;AACA;AACA;AACA,CAAC;;ACLD,wEAA0B;;AAE1B;AACA;AACA,CAAC,CAAC;;ACJF,+DAA0B;AAC1B;AACA,CAAC,CAAC;;ACFF,kEAA0B;AAC1B;AACA,CAAC,CAAC;;ACFF,+DAA0B;AAC1B;AACA;AACA,CAAC,CAAC;;ACHF,qEAA0B;AAC1B;AACA;AACA,CAAC,CAAC;;ACHF,8DAA0B;AAC1B;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC;;ACXD,8DAA0B;AAC1B;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,CAAC,CAAC;;ACbF,8DAA0B;AAC1B;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC;;ACjBD,4DAA0B;;AAE1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;ACTD,0DAA0B;AAC1B;AACA;AACA,CAAC;;ACHD,8DAA0B;AAC1B;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AC3BD,+DAA0B;AAC1B;;AAEA;AACA;AACA;AACA,CAAC;;ACND,2DAA0B;AAC1B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,CAAC;;AChBD,4DAA0B;AAC1B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,CAAC;;AChBD,2DAA0B;AAC1B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,CAAC;;AChBD,2DAA0B;AAC1B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,CAAC;;AChBD,8DAA0B;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,CAAC;;AChWD,4DAA0B;AAC1B;;AAEA;AACA;AACA;AACA,CAAC;;ACND,iEAA0B;AAC1B;;AAEA;AACA;AACA;AACA,CAAC;;ACND,6DAA0B;AAC1B;AACA;AACA;;AAEA,CAAC;;ACLD,+DAA0B;AAC1B;AACA;;AAEA,CAAC;;ACJD,iEAA0B;AAC1B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC;;ACbD,oEAA0B;;AAE1B;AACA;AACA;AACA,CAAC;;ACLD,kEAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,CAAC;;ACxCD,mEAA0B;;AAE1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,CAAC;;ACXD,uEAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,CAAC;;ACxCD,qEAA0B;AAC1B;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AC5BD,sEAA0B,EAAE;;ACA5B,8DAA0B;AAC1B;AACA;AACA,CAAC;;ACHD,+DAA0B;AAC1B;AACA;AACA,CAAC;;ACHD,8DAA0B;AAC1B;AACA;AACA,CAAC;;ACHD,8DAA0B;AAC1B;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,CAAC;;ACVD,kEAA0B;AAC1B;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,CAAC;;ACXD,iEAA0B;AAC1B;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,CAAC;;ACZD,qEAA0B;;AAE1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AC9CD,8DAA0B;AAC1B;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,CAAC,CAAC;;AC/BF,oEAA0B;AAC1B;AACA,CAAC,CAAC;;ACFF,mEAA0B;;AAE1B;AACA;AACA;AACA;AACA;AACA,CAAC;;ACPD,0EAA0B;;AAE1B;AACA;AACA;AACA,CAAC;;ACLD,oEAA0B;;AAE1B;AACA;AACA;AACA,CAAC;;ACLD,2EAA0B;;AAE1B;AACA;AACA;AACA,CAAC;;ACLD,2DAA0B;;AAE1B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AChBD,2DAA0B;;AAE1B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC;;ACjBD,kEAA0B;;AAE1B;AACA;AACA;AACA,CAAC;;ACLD,mEAA0B;;AAE1B;AACA;AACA;AACA;AACA,CAAC;;ACND,gEAA0B;;AAE1B;AACA;AACA;AACA;AACA,CAAC;;ACND,gEAA0B;;AAE1B;AACA;AACA;AACA;AACA,CAAC;;ACND,iEAA0B;;AAE1B;AACA;AACA;AACA;AACA,CAAC;;ACND,kEAA0B;;AAE1B;AACA;AACA;AACA;AACA,CAAC;;ACND,8DAA0B;;AAE1B;AACA;AACA;AACA;AACA,CAAC;;ACND,+DAA0B;;AAE1B;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,CAAC;;AC/CD,mEAA0B;;AAE1B;AACA;AACA,CAAC,CAAC;;ACJF,mEAA0B;;AAE1B;;AAEA;AACA;AACA,CAAC,CAAC;;ACNF,+DAA0B;AAC1B;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,CAAC;;ACtCF,iEAA0B;AAC1B;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,CAAC;;ACjBF,iEAA0B;AAC1B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;ACbD,mEAA0B;AAC1B;;AAEA;AACA;AACA;AACA,CAAC;;ACND,gEAA0B;;AAE1B;AACA;AACA;AACA,CAAC;;ACLD,iEAA0B;;AAE1B;AACA;AACA,CAAC,CAAC;;ACJF,kEAA0B;;AAE1B;AACA;AACA,CAAC,CAAC;;ACJF,4DAA0B;AAC1B;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,CAAC,CAAC;;ACvBF,8DAA0B;AAC1B,oBAAoB;AACpB;AACA,CAAC,CAAC;;ACHF,0DAA0B;;AAE1B;AACA;AACA;AACA,CAAC;;ACLD,+DAA0B;AAC1B;;AAEA;;AAEA;AACA;AACA;AACA,CAAC;;ACRD,gEAA0B;;AAE1B;AACA;AACA;AACA;AACA,CAAC;;ACND,8DAA0B;;AAE1B;AACA;AACA;AACA,CAAC;;ACLD,gEAA0B;AAC1B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;ACZD,+DAA0B;AAC1B;AACA;AACA,CAAC;;ACHD,gEAA0B;AAC1B;AACA;AACA,CAAC;;ACHD,+DAA0B;;AAE1B;AACA;AACA;AACA,CAAC;;ACLD,mEAA0B;AAC1B;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,CAAC;;ACzBF,+DAA0B;;AAE1B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC;;ACXD,gEAA0B;AAC1B;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,CAAC;;ACVD,gEAA0B;;AAE1B;;AAEA;AACA;AACA,CAAC,CAAC;;ACNF,gEAA0B;AAC1B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,CAAC;;ACzED,wEAA0B;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,CAAC;;ACzBD,uEAA0B;;AAE1B;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC,CAAC;;ACnBF,+DAA0B;;AAE1B;;AAEA;AACA;AACA;AACA,CAAC;;ACPD,6DAA0B;;AAE1B;AACA;AACA;AACA,CAAC;;ACLD,sEAA0B;AAC1B;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,CAAC;;ACnCD,4DAA0B;AAC1B;;AAEA;AACA;AACA;AACA,CAAC;;ACND,gEAA0B;;AAE1B;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,CAAC;;ACfD,qEAA0B;;AAE1B;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,CAAC;;ACrBD,iEAA0B;;AAE1B;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,CAAC;;ACfD,sEAA0B;;AAE1B;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,CAAC;;ACrBD,gEAA0B;;AAE1B;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,CAAC;;ACfD,qEAA0B;;AAE1B;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,CAAC;;ACrBD,gEAA0B;;AAE1B;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,CAAC;;ACfD,qEAA0B;;AAE1B;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,CAAC;;ACrBD,oEAA0B;;AAE1B;AACA;AACA;AACA;AACA;AACA,CAAC,CAAC;;ACPF,iEAA0B;AAC1B;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,CAAC;;ACxBD,wEAA0B;AAC1B;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,sEAAsE;AACtE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AChED,+DAA0B;AAC1B;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,CAAC;;AC5CD,oEAA0B;;AAE1B;AACA;AACA;AACA,CAAC;;ACLD,oEAA0B;AAC1B;;AAEA;AACA;AACA;AACA,CAAC;;ACND,8DAA0B;AAC1B;;AAEA;AACA;AACA;AACA,CAAC;;ACND;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;AC9GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACgC;;AAEhC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,eAAe,GAAG,KAAK;AACzC;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,uBAAuB,QAAQ,qBAAqB,SAAS;AAC7D;AACA;;AAEA;AACA,uBAAuB,SAAS,qBAAqB,QAAQ;AAC7D;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACzIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACgC;AACE;;AAElC;AACA;AACA;AACO,MAAM,eAAI;AACjB;AACA;AACA;AACA;AACA,aAAa,eAAI;AACjB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,eAAI;;AAElB;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,MAAM;AACxC,qBAAqB,WAAW;AAChC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gCAAgC,MAAM;AACtC;AACA;AACA,UAAU;AACV;AACA,kCAAkC,MAAM;AACxC,qBAAqB,WAAW;AAChC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,SAAS,OAAO;AAChB;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,SAAS,OAAO;AAChB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO;AAChB;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,qEAAqE,IAAI;AACzE;;AAEA;AACA;;AAEA;AACA,yBAAyB,QAAQ;AACjC;AACA;AACA,yBAAyB,SAAS;AAClC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,yBAAyB,QAAQ;AACjC;AACA;AACA,yBAAyB,SAAS;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,eAAI;;;ACnQ4B;AACzB,QAAQ,UAAU,EAAE,KAAK;;AAER;AACD;AACE;;;ACLzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,kBAAkB,gBAAgB;AAClC;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C,sCAAsC;AACtC;AACA;AACA,MAAM;AACN;AACA,0CAA0C;AAC1C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,GAAG,EAAE,EAAE;AACxC;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;ACtMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACkC;AACK;;AAEvC;AACA;;AAEA;AACA;AACA;AACA;AACO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,mBAAmB,uBAAgB;AACxC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,cAAc,OAAO;AACrB,cAAc,QAAQ;;AAEtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,gCAAgC,mBAAY;AAC5C,MAAM;AACN,qCAAqC,gBAAgB;AACrD;AACA;;AAEA;AACA;AACA;AACA,eAAe,oBAAa;;AAE5B;AACA;AACA;AACA,0BAA0B,oBAAa;AACvC;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA,yBAAyB,EAAQ;AACjC;AACA,MAAM,0BAA0B,GAAS;AACzC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO,OAAO;;AAEd;AACA;;AAEA;AACA;;;ACnMA;AACA;AACA;AACA;AACA;AACA;AACA;AACoC;AACE;;AAEtC;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,kBAAkB,gBAAgB;AAClC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN,yBAAyB;AACzB;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kCAAkC,cAAc;AAChD;;AAEA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA,wBAAwB,OAAO;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC7EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACkC;AACK;;AAEvC;AACA;;AAEA;;AAEA;AACA;;AAEO,MAAM,SAAI;AACjB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,mBAAmB,uBAAgB;AACxC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gCAAgC,mBAAY;AAC5C,MAAM;AACN,qCAAqC,gBAAgB;AACrD;AACA;;AAEA;AACA;AACA;AACA,eAAe,oBAAa;;AAE5B;AACA;AACA;AACA,0BAA0B,oBAAa;AACvC;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,KAAK,UAAU,OAAO;AAC7E;AACA;;AAEA,yBAAyB,EAAQ;AACjC;AACA,MAAM,0BAA0B,GAAS;AACzC;AACA;AACA;;AAEA;AACA;;;AC1JA;AACA;AACA;AACA;AACA;AACA;AACoC;AACN;;AAE9B;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,6BAA6B,wCAAwC;AACrE;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,kCAAkC,wBAAwB;AAC1D;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,iBAAiB,SAAI;AACrB,wBAAwB,OAAO;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;;;AC/DoC;;AAE7B,QAAQ,OAAO,EAAE,OAAO;;AAEL;AACA;AACD;AACE;AACJ;AACI;;;ACT3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEkC;AACU;;AAE5C,MAAM,WAAK;;AAEJ;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,uBAAuB,aAAa;AACpC;AACA,4BAA4B,eAAU;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,wBAAwB,OAAO;AAC/B;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,uBAAuB,MAAM;AAC7B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,mBAAmB,WAAiB;AACpC;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,YAAS;AACnB;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI,WAAK;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,qBAAqB;AAC1D;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,qCAAqC,qBAAqB;AAC1D;AACA;;AAEA,QAAQ,WAAK;AACb;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,IAAI,WAAK;AACT;AACA;AACA;AACA;AACA;AACA,UAAU,YAAS;AACnB;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,SAAS,YAAS;AAClB;AACA;AACA;AACA;;;ACzNA;AACA;AACA;AACA;AACA;AACA;AACgC;;AAEzB,mBAAmB,KAAK;AAC/B;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,YAAY,YAAY;AACxB,YAAY,UAAU;;AAEtB;AACA,6BAA6B,iBAAiB;AAC9C;AACA;AACA,qCAAqC,gBAAgB;AACrD;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACiC;AACD;;AAEhC;AACA;AACA;AACO,uBAAuB,KAAK;AACnC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,6BAA6B,QAAQ;AACrC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,qBAAqB,IAAI,IAAI,KAAK;;AAElC;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA,OAAO;AACP,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC7GA;AACA;AACA;AACA;AACA;AACA;AACA;AACiC;AACD;;AAEhC;AACA;AACA;AACO,sBAAsB,KAAK;AAClC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,SAAS;AACpC;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;AChGA;AACA;AACA;AACA;AACA;AACA;AACA;AACgC;;AAEhC;AACA;AACA;AACO,MAAM,SAAI,SAAS,KAAK;AAC/B;AACA;AACA;AACA;AACA;;AAEA;AACA,eAAe,SAAI;AACnB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;;AChDwB;AACD;AACI;AACD;AACH;;;ACJvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACkC;;AAE3B;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,YAAY,SAAS;AACrB,YAAY,UAAU;;AAEtB;;AAEA,yBAAyB,IAAU;AACnC;AACA;AACA;AACA,MAAM,0BAA0B,QAAc;AAC9C;AACA;AACA;AACA,MAAM,0BAA0B,OAAa;AAC7C;AACA;AACA;AACA,MAAM,0BAA0B,SAAU;AAC1C;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA,WAAW;AACX;;;ACnGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO,OAAO;AACd;AACA;;AAEO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA,2BAA2B;AAC3B,iBAAiB;;AAEjB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;ACjEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACuC;;AAEvC;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB,IAAI;;AAEpB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,yBAAyB;AACzB,wBAAwB;AACxB,wBAAwB;AACxB,yBAAyB;AACzB,0BAA0B;AAC1B;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,4CAA4C,UAAU;;AAEtD;AACA,kCAAkC,sBAAsB;AACxD;;AAEA;AACA;;AAEA;AACA;AACA,8CAA8C,MAAM;AACpD;AACA,oDAAoD,MAAM;AAC1D,8CAA8C,MAAM,IAAI;AACxD;AACA,QAAQ;AACR,gCAAgC,wBAAwB;AACxD;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEO;AACP;AACA;;AAEA;AACA;AACA,4BAA4B;;AAE5B;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEO,MAAM,YAAK;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,IAAI;AACJ;AACA;AACA;;;AC/VA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEsD;AAClB;;AAE7B,MAAM,mBAAS,GAAG,SAAU;AAC5B,eAAe,sBAAO;;AAE7B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,eAAe,mBAAS;AACxB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAM,eAAK;AACX;AACA;AACA;AACA,uBAAuB,eAAK;AAC5B,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEO;AACP,eAAe,eAAK;AACpB;AACA;AACA;AACA;AACA;AACA;;AAEO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;AC/EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACiC;AACC;AACQ;;AAE1C;AACA;;AAEA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY,KAAK;AACjB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,sBAAsB,KAAK;AAC3B;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,mBAAmB;AAC9B;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,kBAAkB,OAAa;AAC/B,MAAM;AACN;AACA,QAAQ,OAAiB;AACzB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,kBAAkB,QAAc;AAChC,MAAM;AACN;AACA,QAAQ,OAAiB;AACzB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,OAAa;AACjC,QAAQ;AACR;AACA,UAAU,OAAiB;AAC3B;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,QAAc;AAClC,QAAQ;AACR;AACA,UAAU,OAAiB;AAC3B;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,sBAAsB,IAAU;AAChC;AACA;;AAEA;AACA;AACA,yBAAyB,KAAK;AAC9B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,iBAAiB,SAAU;AAC3B;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,MAAM,OAAiB;AACvB;;AAEA;AACA;AACA,2BAA2B;AAC3B,kBAAkB;AAClB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY,OAAO;AACnB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY,OAAO;AACnB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,OAAO;AACnB;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AChdA;AACA;AACA;AACA;AACA;AACA;;AAE0C;;AAE1C,MAAM,cAAK;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEO,MAAM,iBAAQ;AACrB;AACA;AACA;AACA,QAAQ,cAAK;AACb;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,OAAiB;AACvB;AACA;AACA;AACA;AACA;;AAEA,QAAQ,cAAK;AACb;AACA;;AAEA;AACA;;AAEA;AACA,WAAW,OAAiB;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;;;ACzFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,+BAA+B;AAC/B;AACO;AACP;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,+CAA+C,KAAK;AACpD;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;ACvDA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,OAAO;AACnB,YAAY,OAAO;;AAEnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA,eAAe;AACf;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;ACnFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACgC;AACF;;AAEvB;AACP;AACA,eAAe,KAAK;;AAEpB;AACA;AACA,0CAA0C,IAAI;;AAE9C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;AClC0B;AACC;;AAED;AACF;AACA;AACD;;;ACNvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEO,MAAM,eAAO;AACpB,UAAU,mBAAmB;;AAE7B;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,gCAAgC,KAAK,EAAE,MAAM;AAC7C;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACzGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEoD;AACA;AACA;AACA;AACA;;AAE7C;;AAEP;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,kBAAkB,0BAA0B;AAC5C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,mDAAmD,OAAO,EAAE,KAAK,EAAE,OAAO;AAC1E;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,kBAAkB,uBAAO;AACzB,kBAAkB,uBAAO;AACzB,kBAAkB,uBAAO;AACzB;AACA,kBAAkB,uBAAO;AACzB,kBAAkB,uBAAO;AACzB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,qBAAqB;;AAErB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC/OO;AACA;;;ACDP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC6C;AACM;AACrB;AACuB;;AAErD,IAAI,WAAK;;AAET;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM,WAAK;AACX,WAAW,UAAI;AACf;;AAEA;AACA,mBAAmB,gBAAQ;AAC3B,UAAU,gBAAM;AAChB,IAAI;AACJ,gBAAgB,YAAY;AAC5B;;AAEA,MAAM,WAAK;AACX;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,oCAAoC,WAAW,IAAI,KAAK;AACxD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,MAAM;AAC7B;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,MAAM,WAAK;AACX,WAAW,UAAI;AACf;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,MAAM,WAAK;AACX;AACA;;AAEA,WAAW;AACX;;AAEA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,QAAQ;AACR;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,IAAI,SAAS;AACb;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,sBAAsB,UAAU;AAChC;AACA;;AAEA,kBAAkB,UAAO;AACzB,kBAAkB,QAAQ;AAC1B,mBAAmB;AACnB,kBAAkB,UAAU;AAC5B,mBAAmB;;AAEnB;AACA;AACA;;AAEA;AACA;AACA,wBAAwB,SAAS,CAAC,UAAU;AAC5C;;AAEA;AACA;AACA;AACA;AACA,wBAAwB,UAAO;AAC/B;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,wBAAwB,QAAQ;AAChC;AACA;AACA;AACA;AACA,KAAK;AACL,qBAAqB,QAAQ,IAAI,SAAS;;AAE1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,yBAAyB,QAAQ;;AAEjC;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,2BAA2B,UAAO;AAClC;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,WAAK;;AAEE;AACP,EAAE,WAAK;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,oBAAoB,0BAA0B;AAC9C;AACA,+CAA+C,WAAK;AACpD;AACA;;AAEA;AACA;;AAEA;;AAEA,MAAM,UAAI;AACV;AACA;AACA;AACA;AACA;AACA;AACA;;;AC1SA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEkC;AACD;;AAEjC;AACA;AACA;;AAEA;AACO;AACP,4BAA4B,UAAY;AACxC;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACO;AACP;AACA;AACO;AACP;AACA;AACO;AACP,sBAAsB;AACtB;;AAEA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACO,SAAS,eAAM;AACtB,oBAAoB,GAAG,EAAE,EAAE;AAC3B;;AAEA;AACO;AACP,YAAY,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,KAAK,EAAE,OAAO;AACzD;;AAEA;AACO;AACP,iBAAiB,KAAK;AACtB;AACA,cAAc,IAAI,EAAE,MAAM,GAAG,KAAK;AAClC;;AAEA;AACO;AACP,kBAAkB,cAAc;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,UAAY,kBAAkB,UAAY;AAC9D;AACA;AACA;AACA;AACA;;AAEA;AACO;AACP;AACA;;AAEA;AACA;AACA,YAAY,OAAO;;AAEnB;AACA;AACA;AACA;;AAEA,8BAA8B,UAAY;;AAE1C;AACA;AACA;AACA;AACA;AACA,6BAA6B,OAAO,IAAI,GAAG;;AAE3C;AACA;AACA,UAAU;AACV,mBAAmB;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,mBAAmB;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,GAAG;AACvC;AACA,UAAU;AACV;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;;AAEA;AACO;AACP,UAAU,QAAQ;AAClB;;AAEA;AACA;AACA;AACA;;AAEA;AACA,aAAa,eAAM;AACnB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,OAAO,QAAQ;AACf,YAAY,OAAO;AACnB,UAAU,SAAS;AACnB,YAAY,OAAO;AACnB;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACO;AACP;AACA;AACA;AACA;;AAEA;AACA,IAAI,aAAI;AACR;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACO,MAAM,aAAI;AACjB;AACA,UAAU,yBAAyB;AACnC,UAAU,OAAO;AACjB,UAAU,QAAQ;;AAElB;AACA;AACA,yBAAyB,eAAM;AAC/B;;AAEA;;AAEA;AACA;AACA;AACA;AACA,uCAAuC,UAAY;;AAEnD;AACA,yBAAyB,EAAQ;AACjC;AACA;;AAEA;AACA,yBAAyB,EAAQ;AACjC;AACA;;AAEA;AACA,kBAAkB,UAAY;AAC9B;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,6CAA6C;AAC7C;AACA;;AAEA;AACO;AACP;AACA;AACA,qEAAqE;AACrE;;AAEA;AACA,mCAAmC;AACnC;AACA,kBAAkB,mBAAmB;AACrC;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,sBAAsB,iBAAiB;AACvC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACO;AACP;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;AC7Y0B;AACF;AACG;AACC;;;ACH5B;AACA;AACA;AACA;AACA;AACA;AACgC;AACK;AACN;AACE;AACE;AACM;;AAEzC,QAAQ,OAAO,oBAAO,cAAG,EAAE,2BAAO;AAC3B,QAAQ,SAAS,wBAAS,gBAAG,EAAE,yBAAS;AAC/C,QAAQ,OAAO,gBAAG,EAAE,sBAAM;;AAE1B,MAAM,SAAK,sBAAsB;AACjC;AACA;AACA;AACA;AACA;AACA;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,kBAAkB,SAAK;AACvB,iBAAiB,SAAK,CAAC,WAAO,CAAC,wBAAI,YAAY,WAAO;AACtD;;AAEA;AACA;AACA;AACA;AACA,oBAAoB,SAAK;AACzB,eAAe,OAAe,CAAC,wBAAI;AACnC;;AAEA;AACA,eAAe,iBAAgB;AAC/B;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,WAAO;AAClB;AACA;AACA,WAAW,aAAS;AACpB;AACA;;AAEA;AACA,oBAAoB,KAAK;AACzB,sBAAsB,2BAAO;AAC7B,mBAAmB,wBAAI;AACvB,oBAAoB,yBAAK;AACzB,qBAAqB,sBAAM;AAC3B,wBAAwB,yBAAS;;AAE1B,SAAS,QAAI,sBAAsB;AAC1C;AACA;;;AC7EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE2C;;AAEpC,MAAM,eAAO;AACpB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,iCAAiC,KAAK;AACtC;AACA;AACA;AACA;;AAEA,wCAAwC,KAAK;AAC7C;;AAEA,SAAS,QAAgB,UAAU,mBAAmB;AACtD;;;AC/BkD;AACF;AACY;AACF;AACR;AACJ;AACE;AACa;AACf;AACO;AACL;AACa;AACA;AACJ;AACU;AACjB;AACK;AACL;AACY;AACd;AACA;AACA;AACJ;AACJ;AACQ;AACE;AACR;AACE;AACF;AACA;AACM;AACL;AACS;AACP;AACI;AACI;AACM;AACJ;AACE;AACQ;AACJ;AACE;AAChB;AACE;AACF;AACC;AACO;AACF;AACQ;AACb;AACW;AACF;AACa;AACX;AACa;AAC9B;AACA;AACa;AACE;AACN;AACA;AACE;AACE;AACR;AACG;AACO;AACA;AACP;AACI;AACA;AACG;AACL;AACE;AACE;AACZ;AACI;AACR;AACU;AACC;AACJ;AACI;AACF;AACG;AACF;AACQ;AACR;AACE;AACA;AACA;AACgB;AACF;AACjB;AACJ;AACkB;AACnB;AACQ;AACS;AACP;AACS;AACX;AACS;AACT;AACS;AACF;AACL;AACa;AACjB;AACU;AACA;AACZ;;AAEzC;AACP,oBAAoB,cAAa;AACjC,mBAAmB,aAAY;AAC/B,wBAAwB,kBAAiB;AACzC,yBAAyB,mBAAkB;AAC3C,oBAAoB,cAAa;AACjC,kBAAkB,YAAW;AAC7B,mBAAmB,aAAY;AAC/B,0BAA0B,oBAAkB;AAC5C,kBAAkB,YAAW;AAC7B,sBAAsB,gBAAc;AACpC,mBAAmB,aAAY;AAC/B,0BAA0B,oBAAkB;AAC5C,0BAA0B,oBAAkB;AAC5C,wBAAwB,kBAAgB;AACxC,6BAA6B,uBAAqB;AAClD,oBAAoB,cAAa;AACjC,uBAAuB,iBAAe;AACtC,oBAAoB,cAAa;AACjC,0BAA0B,oBAAmB;AAC7C,mBAAmB,aAAY;AAC/B,mBAAmB,aAAY;AAC/B,mBAAmB,aAAY;AAC/B,iBAAiB,WAAU;AAC3B,eAAe,SAAQ;AACvB,mBAAmB,aAAY;AAC/B,oBAAoB,cAAa;AACjC,gBAAgB,UAAS;AACzB,iBAAiB,WAAU;AAC3B,gBAAgB,UAAS;AACzB,gBAAgB,UAAS;AACzB,mBAAmB,aAAY;AAC/B,iBAAiB,WAAS;AAC1B,sBAAsB,gBAAa;AACnC,kBAAkB,YAAU;AAC5B,oBAAoB,cAAY;AAChC,sBAAsB,gBAAc;AACpC,yBAAyB,mBAAiB;AAC1C,uBAAuB,iBAAe;AACtC,wBAAwB,kBAAgB;AACxC,4BAA4B,sBAAoB;AAChD,0BAA0B,oBAAkB;AAC5C,2BAA2B,qBAAmB;AAC9C,mBAAmB,aAAW;AAC9B,oBAAoB,cAAY;AAChC,mBAAmB,aAAW;AAC9B,mBAAmB,aAAY;AAC/B,uBAAuB,iBAAe;AACtC,sBAAsB,gBAAc;AACpC,0BAA0B,oBAAkB;AAC5C,mBAAmB,aAAY;AAC/B,yBAAyB,mBAAiB;AAC1C,wBAAwB,kBAAgB;AACxC,+BAA+B,yBAAsB;AACrD,yBAAyB,mBAAiB;AAC1C,gCAAgC,0BAAuB;AACvD,gBAAgB,UAAS;AACzB,gBAAgB,UAAS;AACzB,uBAAuB,iBAAe;AACtC,wBAAwB,kBAAgB;AACxC,qBAAqB,eAAa;AAClC,qBAAqB,eAAa;AAClC,sBAAsB,gBAAc;AACpC,uBAAuB,iBAAe;AACtC,mBAAmB,aAAW;AAC9B,oBAAoB,cAAa;AACjC,wBAAwB,kBAAgB;AACxC,wBAAwB,kBAAgB;AACxC,oBAAoB,cAAa;AACjC,sBAAsB,gBAAe;AACrC,sBAAsB,gBAAe;AACrC,wBAAwB,kBAAgB;AACxC,qBAAqB,eAAc;AACnC,sBAAsB,gBAAe;AACrC,uBAAuB,iBAAgB;AACvC,iBAAiB,WAAU;AAC3B,mBAAmB,aAAY;AAC/B,eAAe,SAAQ;AACvB,oBAAoB,cAAa;AACjC,qBAAqB,eAAa;AAClC,mBAAmB,aAAW;AAC9B,qBAAqB,eAAa;AAClC,oBAAoB,cAAY;AAChC,qBAAqB,eAAc;AACnC,oBAAoB,cAAa;AACjC,wBAAwB,kBAAiB;AACzC,oBAAoB,cAAa;AACjC,qBAAqB,eAAc;AACnC,qBAAqB,eAAc;AACnC,qBAAqB,eAAc;AACnC,4BAA4B,sBAAqB;AACjD,6BAA6B,uBAAsB;AACnD,oBAAoB,cAAY;AAChC,kBAAkB,YAAU;AAC5B,2BAA2B,qBAAmB;AAC9C,iBAAiB,WAAU;AAC3B,qBAAqB,eAAc;AACnC,0BAA0B,oBAAkB;AAC5C,sBAAsB,gBAAe;AACrC,2BAA2B,qBAAmB;AAC9C,qBAAqB,eAAc;AACnC,0BAA0B,oBAAkB;AAC5C,qBAAqB,eAAc;AACnC,0BAA0B,oBAAkB;AAC5C,yBAAyB,mBAAiB;AAC1C,sBAAsB,gBAAe;AACrC,6BAA6B,uBAAqB;AAClD,oBAAoB,cAAa;AACjC,yBAAyB,mBAAkB;AAC3C,yBAAyB,mBAAkB;AAC3C,mBAAmB,aAAY;AAC/B;;AAE6B;;;AChO7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACwC;;AAEjC;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,YAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;;AAEA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,UAAU,SAAS;AACnB;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY,QAAQ;AACpB;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAY,QAAQ;;AAEpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY,wCAAwC;;AAEpD;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU,QAAQ;AAClB,YAAY,QAAQ;;AAEpB;AACA;AACA;;AAEA,YAAY,OAAO;AACnB,cAAc,uCAAuC;;AAErD;AACA;AACA;;AAEA,cAAc,UAAU;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;;AAER;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,MAAW;AAC9B;AACA;AACA,mBAAmB,MAAW;AAC9B;AACA;AACA,mBAAmB,IAAS;AAC5B;AACA,mBAAmB,MAAW;AAC9B;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;;;AC9RA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC4C;AACD;;AAEpC;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,0BAA0B;AAC9C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,WAAW,UAAS;AACpB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,aAAa;;AAEzB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,gBAAgB;AACjC,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,IAAI,WAAY;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,sBAAsB,MAAM;AAC5B;AACA,sBAAsB,MAAM;AAC5B;AACA;AACA,WAAW,WAAmB;AAC9B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,SAAS,UAAS;AAClB;AACA;AACA;AACA,qBAAqB,+BAA+B;AACpD;AACA;AACA;AACA;;;AChUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACvEA;AACA;AAC8B;AACL;AACO;;;ACJE;AACA;AACA;AACA;AACJ;AACQ;AACF;AACA;AACF;;AAE3B,MAAM,SAAI,GAAG,oBAAI;AACjB,MAAM,SAAI,GAAG,oBAAI;AACjB,aAAa,oBAAI;AACjB,aAAa,oBAAI;AACjB,WAAW,kBAAE;AACb,eAAe,sBAAM;AACrB,cAAc,qBAAK;AACnB,MAAM,UAAK,GAAG,0BAAK;AACnB,aAAa,oBAAI;;;AClBxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEiC;AACI;AACM;AACR;AACE;AACJ;AACF;;AAE4C;;AAEpE;AACP;AACA;AACA;AACA,WAAW;AACX,aAAa;AACb,gBAAgB;AAChB,YAAY;AACZ,aAAa;AACb,WAAW;AACX,UAAU;AACV,WAAW,IAAS;AACpB;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,mBAAmB,eAAe,CAAC,QAAgB;;AAEnD,2BAA2B,aAAc;AACzC,MAAM,sBAAc;AACpB;AACA;AACA;AACA,wBAAwB,cAAe,CAAC,OAAe;;AAEvD,kDAAkD,OAAO;AACzD;AACA,oCAAoC,iCAAiB;;AAErD;AACA,0BAA0B,UAAgB,CAAC,gBAAgB;AAC3D,0BAA0B,gBAAkB,CAAC,gBAAgB;;AAE7D;;AAEA;AACA,qBAAqB,KAAW;AAChC,qBAAqB,KAAW;;AAEhC;AACA,0BAA0B,UAAgB;AAC1C,wBAAwB,QAAc;;AAEtC;AACA,mBAAmB,GAAS;;AAE5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;ACrOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEqB;;AAErB;AACoB;;AAEa;AACI;AACM;AACR;AACE;AACJ;AACF;;AAEyB;AACV;;AAEvC;;AAEP;AACO;AACA;AACA;AACA,MAAM,WAAO,GAAG,OAAG;AACnB,MAAM,SAAK,GAAG,yBAAK;AACnB,MAAM,WAAO,GAAG,2BAAO;AACvB,mBAAmB,0BAAU;AAC7B,eAAe,0BAAM;AACrB,gBAAgB,uBAAO;AACvB,cAAc,qBAAK;AACnB,aAAa,oBAAI;AACjB,MAAM,OAAG,GAAG,IAAS;;AAErB;AACP,oBAAoB,SAAS;;AAE7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,2BAA2B,WAAO;;AAElC;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;;AAEA,wBAAwB,gDAAgD;;AAExE;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,qBAAqB,2BAA2B;;AAEhD;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,CAAC","sources":["webpack://MathBox/webpack/universalModuleDefinition","webpack://MathBox/./node_modules/@sicmutils/glsl-parser/direct.js","webpack://MathBox/./node_modules/@sicmutils/glsl-parser/lib/expr.js","webpack://MathBox/./node_modules/@sicmutils/glsl-parser/lib/index.js","webpack://MathBox/./node_modules/@sicmutils/glsl-parser/lib/scope.js","webpack://MathBox/./node_modules/boolbase/index.js","webpack://MathBox/./node_modules/css-select/lib/attributes.js","webpack://MathBox/./node_modules/css-select/lib/compile.js","webpack://MathBox/./node_modules/css-select/lib/general.js","webpack://MathBox/./node_modules/css-select/lib/index.js","webpack://MathBox/./node_modules/css-select/lib/procedure.js","webpack://MathBox/./node_modules/css-select/lib/pseudo-selectors/aliases.js","webpack://MathBox/./node_modules/css-select/lib/pseudo-selectors/filters.js","webpack://MathBox/./node_modules/css-select/lib/pseudo-selectors/index.js","webpack://MathBox/./node_modules/css-select/lib/pseudo-selectors/pseudos.js","webpack://MathBox/./node_modules/css-select/lib/pseudo-selectors/subselects.js","webpack://MathBox/./node_modules/css-select/lib/sort.js","webpack://MathBox/./node_modules/css-what/lib/index.js","webpack://MathBox/./node_modules/css-what/lib/parse.js","webpack://MathBox/./node_modules/css-what/lib/stringify.js","webpack://MathBox/./node_modules/dom-serializer/lib/foreignNames.js","webpack://MathBox/./node_modules/dom-serializer/lib/index.js","webpack://MathBox/./node_modules/domelementtype/lib/index.js","webpack://MathBox/./node_modules/domhandler/lib/index.js","webpack://MathBox/./node_modules/domhandler/lib/node.js","webpack://MathBox/./node_modules/domutils/lib/feeds.js","webpack://MathBox/./node_modules/domutils/lib/helpers.js","webpack://MathBox/./node_modules/domutils/lib/index.js","webpack://MathBox/./node_modules/domutils/lib/legacy.js","webpack://MathBox/./node_modules/domutils/lib/manipulation.js","webpack://MathBox/./node_modules/domutils/lib/querying.js","webpack://MathBox/./node_modules/domutils/lib/stringify.js","webpack://MathBox/./node_modules/domutils/lib/traversal.js","webpack://MathBox/./node_modules/entities/lib/decode.js","webpack://MathBox/./node_modules/entities/lib/decode_codepoint.js","webpack://MathBox/./node_modules/entities/lib/encode.js","webpack://MathBox/./node_modules/entities/lib/index.js","webpack://MathBox/./node_modules/glsl-tokenizer/index.js","webpack://MathBox/./node_modules/glsl-tokenizer/lib/builtins-300es.js","webpack://MathBox/./node_modules/glsl-tokenizer/lib/builtins.js","webpack://MathBox/./node_modules/glsl-tokenizer/lib/literals-300es.js","webpack://MathBox/./node_modules/glsl-tokenizer/lib/literals.js","webpack://MathBox/./node_modules/glsl-tokenizer/lib/operators.js","webpack://MathBox/./node_modules/glsl-tokenizer/string.js","webpack://MathBox/./node_modules/nth-check/lib/compile.js","webpack://MathBox/./node_modules/nth-check/lib/index.js","webpack://MathBox/./node_modules/nth-check/lib/parse.js","webpack://MathBox/./node_modules/shadergraph/src/linker/priority.js","webpack://MathBox/./node_modules/stats.js/build/stats.min.js","webpack://MathBox/external umd \"THREE\"","webpack://MathBox/webpack/bootstrap","webpack://MathBox/webpack/runtime/compat get default export","webpack://MathBox/webpack/runtime/define property getters","webpack://MathBox/webpack/runtime/hasOwnProperty shorthand","webpack://MathBox/webpack/runtime/make namespace object","webpack://MathBox/./node_modules/threestrap/src/api.js","webpack://MathBox/./node_modules/three/src/core/EventDispatcher.js","webpack://MathBox/./node_modules/threestrap/src/binder.js","webpack://MathBox/./node_modules/threestrap/src/bootstrap.js","webpack://MathBox/./src/splash.js","webpack://MathBox/./node_modules/threestrap/src/aliases.js","webpack://MathBox/./node_modules/threestrap/src/core/bind.js","webpack://MathBox/./node_modules/three/src/math/MathUtils.js","webpack://MathBox/./node_modules/three/src/math/Quaternion.js","webpack://MathBox/./node_modules/three/src/math/Vector3.js","webpack://MathBox/./node_modules/three/src/math/Matrix4.js","webpack://MathBox/./node_modules/three/src/math/Euler.js","webpack://MathBox/./node_modules/three/src/core/Layers.js","webpack://MathBox/./node_modules/three/src/math/Matrix3.js","webpack://MathBox/./node_modules/three/src/core/Object3D.js","webpack://MathBox/./node_modules/three/src/cameras/Camera.js","webpack://MathBox/./node_modules/three/src/cameras/OrthographicCamera.js","webpack://MathBox/./node_modules/threestrap/src/core/camera.js","webpack://MathBox/./node_modules/threestrap/src/core/fallback.js","webpack://MathBox/./node_modules/threestrap/src/core/fill.js","webpack://MathBox/./node_modules/threestrap/src/core/loop.js","webpack://MathBox/./node_modules/threestrap/src/core/render.js","webpack://MathBox/./node_modules/three/src/constants.js","webpack://MathBox/./node_modules/three/src/math/Box3.js","webpack://MathBox/./node_modules/three/src/math/Sphere.js","webpack://MathBox/./node_modules/three/src/math/Plane.js","webpack://MathBox/./node_modules/three/src/math/Frustum.js","webpack://MathBox/./node_modules/three/src/math/Vector4.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLAnimation.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLAttributes.js","webpack://MathBox/./node_modules/three/src/math/Vector2.js","webpack://MathBox/./node_modules/three/src/math/Color.js","webpack://MathBox/./node_modules/three/src/core/BufferAttribute.js","webpack://MathBox/./node_modules/three/src/utils.js","webpack://MathBox/./node_modules/three/src/core/BufferGeometry.js","webpack://MathBox/./node_modules/three/src/geometries/BoxGeometry.js","webpack://MathBox/./node_modules/three/src/geometries/PlaneGeometry.js","webpack://MathBox/./node_modules/three/src/materials/Material.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/UniformsUtils.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/default_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/default_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/materials/ShaderMaterial.js","webpack://MathBox/./node_modules/three/src/math/Ray.js","webpack://MathBox/./node_modules/three/src/math/Triangle.js","webpack://MathBox/./node_modules/three/src/materials/MeshBasicMaterial.js","webpack://MathBox/./node_modules/three/src/objects/Mesh.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/alphamap_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/alphamap_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/alphatest_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/alphatest_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/aomap_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/aomap_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/begin_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/beginnormal_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/bsdfs.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/bumpmap_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/clipping_planes_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/clipping_planes_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/clipping_planes_pars_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/clipping_planes_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/common.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/displacementmap_pars_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/displacementmap_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/emissivemap_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/emissivemap_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/encodings_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/encodings_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/envmap_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/envmap_pars_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/envmap_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/fog_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/fog_pars_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/fog_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/fog_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/gradientmap_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/lightmap_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/lightmap_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/lights_lambert_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/lights_toon_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/lights_toon_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/lights_phong_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/lights_phong_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/map_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/map_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/map_particle_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/map_particle_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/metalnessmap_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/metalnessmap_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/morphnormal_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/morphtarget_pars_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/morphtarget_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/normal_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/normal_pars_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/normal_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/normalmap_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/clearcoat_normal_fragment_begin.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/clearcoat_normal_fragment_maps.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/clearcoat_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/output_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/packing.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/project_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/dithering_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/dithering_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/roughnessmap_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/roughnessmap_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/skinbase_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/skinning_pars_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/skinning_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/skinnormal_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/specularmap_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/specularmap_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/tonemapping_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/uv_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/uv2_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/uv2_pars_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/uv2_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/worldpos_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib/background.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib/cube.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib/depth.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib/distanceRGBA.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib/equirect.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib/linedashed.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib/meshbasic.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib/meshlambert.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib/meshmatcap.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib/meshnormal.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib/meshphong.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib/meshphysical.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib/meshtoon.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib/points.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib/shadow.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib/sprite.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/UniformsLib.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLBackground.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLBindingStates.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLBufferRenderer.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLCapabilities.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLClipping.js","webpack://MathBox/./node_modules/three/src/extras/ImageUtils.js","webpack://MathBox/./node_modules/three/src/textures/Texture.js","webpack://MathBox/./node_modules/three/src/renderers/WebGLRenderTarget.js","webpack://MathBox/./node_modules/three/src/cameras/PerspectiveCamera.js","webpack://MathBox/./node_modules/three/src/cameras/CubeCamera.js","webpack://MathBox/./node_modules/three/src/textures/CubeTexture.js","webpack://MathBox/./node_modules/three/src/renderers/WebGLCubeRenderTarget.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLCubeMaps.js","webpack://MathBox/./node_modules/three/src/materials/RawShaderMaterial.js","webpack://MathBox/./node_modules/three/src/extras/PMREMGenerator.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLCubeUVMaps.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLExtensions.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLGeometries.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLIndexedBufferRenderer.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLInfo.js","webpack://MathBox/./node_modules/three/src/textures/DataTexture2DArray.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLMorphtargets.js","webpack://MathBox/./node_modules/three/src/renderers/WebGLMultisampleRenderTarget.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLObjects.js","webpack://MathBox/./node_modules/three/src/textures/DataTexture3D.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLUniforms.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLShader.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLProgram.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLShaderCache.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLPrograms.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLProperties.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLRenderLists.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLLights.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLRenderStates.js","webpack://MathBox/./node_modules/three/src/materials/MeshDepthMaterial.js","webpack://MathBox/./node_modules/three/src/materials/MeshDistanceMaterial.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib/vsm.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLShadowMap.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLState.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLTextures.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLUtils.js","webpack://MathBox/./node_modules/three/src/cameras/ArrayCamera.js","webpack://MathBox/./node_modules/three/src/objects/Group.js","webpack://MathBox/./node_modules/three/src/renderers/webxr/WebXRController.js","webpack://MathBox/./node_modules/three/src/textures/DepthTexture.js","webpack://MathBox/./node_modules/three/src/renderers/webxr/WebXRManager.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLMaterials.js","webpack://MathBox/./node_modules/three/src/renderers/WebGLRenderer.js","webpack://MathBox/./node_modules/three/src/renderers/WebGL1Renderer.js","webpack://MathBox/./node_modules/threestrap/src/core/renderer.js","webpack://MathBox/./node_modules/threestrap/src/core/scene.js","webpack://MathBox/./node_modules/threestrap/src/core/size.js","webpack://MathBox/./node_modules/threestrap/src/core/time.js","webpack://MathBox/./node_modules/threestrap/src/core/warmup.js","webpack://MathBox/./node_modules/threestrap/src/core/index.js","webpack://MathBox/./node_modules/threestrap/src/extra/controls.js","webpack://MathBox/./node_modules/threestrap/src/extra/cursor.js","webpack://MathBox/./node_modules/threestrap/src/extra/fullscreen.js","webpack://MathBox/./node_modules/threestrap/src/extra/stats.js","webpack://MathBox/./node_modules/threestrap/src/extra/ui.js","webpack://MathBox/./node_modules/threestrap/src/renderers/VRRenderer.js","webpack://MathBox/./node_modules/threestrap/src/extra/vr.js","webpack://MathBox/./node_modules/threestrap/src/extra/index.js","webpack://MathBox/./node_modules/threestrap/src/controls/VRControls.js","webpack://MathBox/./node_modules/threestrap/src/controls/index.js","webpack://MathBox/./node_modules/threestrap/src/renderers/MultiRenderer.js","webpack://MathBox/./node_modules/threestrap/src/renderers/index.js","webpack://MathBox/./node_modules/threestrap/src/index.js","webpack://MathBox/./src/model/attributes.js","webpack://MathBox/./src/util/pretty.js","webpack://MathBox/./src/model/node.js","webpack://MathBox/./src/model/group.js","webpack://MathBox/./src/model/guard.js","webpack://MathBox/./src/model/css-select-adapter.js","webpack://MathBox/./src/model/css-select-adapted.js","webpack://MathBox/./src/model/model.js","webpack://MathBox/./src/model/index.js","webpack://MathBox/./src/overlay/factory.js","webpack://MathBox/./src/util/vdom.js","webpack://MathBox/./src/overlay/overlay.js","webpack://MathBox/./src/overlay/dom.js","webpack://MathBox/./src/overlay/classes.js","webpack://MathBox/./src/overlay/index.js","webpack://MathBox/./src/primitives/primitive.js","webpack://MathBox/./src/primitives/types/base/parent.js","webpack://MathBox/./src/primitives/types/base/group.js","webpack://MathBox/./src/primitives/types/base/inherit.js","webpack://MathBox/./src/primitives/types/base/root.js","webpack://MathBox/./src/primitives/types/base/unit.js","webpack://MathBox/./src/primitives/types/base/index.js","webpack://MathBox/./src/util/three.js","webpack://MathBox/./src/primitives/types/camera/camera.js","webpack://MathBox/./src/primitives/types/camera/index.js","webpack://MathBox/./src/util/data.js","webpack://MathBox/./src/util/glsl.js","webpack://MathBox/./src/primitives/types/base/source.js","webpack://MathBox/./src/primitives/types/data/data.js","webpack://MathBox/./src/primitives/types/data/buffer.js","webpack://MathBox/./src/primitives/types/data/array.js","webpack://MathBox/./src/primitives/types/data/interval.js","webpack://MathBox/./src/primitives/types/data/matrix.js","webpack://MathBox/./src/primitives/types/data/area.js","webpack://MathBox/./src/primitives/types/data/voxel.js","webpack://MathBox/./src/primitives/types/data/volume.js","webpack://MathBox/./src/util/axis.js","webpack://MathBox/./src/primitives/types/data/scale.js","webpack://MathBox/./src/primitives/types/data/index.js","webpack://MathBox/./src/util/js.js","webpack://MathBox/./src/primitives/types/draw/axis.js","webpack://MathBox/./src/primitives/types/draw/face.js","webpack://MathBox/./src/primitives/types/draw/grid.js","webpack://MathBox/./src/primitives/types/draw/line.js","webpack://MathBox/./src/primitives/types/draw/point.js","webpack://MathBox/./src/primitives/types/draw/strip.js","webpack://MathBox/./src/primitives/types/draw/surface.js","webpack://MathBox/./src/primitives/types/draw/ticks.js","webpack://MathBox/./src/primitives/types/draw/vector.js","webpack://MathBox/./src/primitives/types/draw/index.js","webpack://MathBox/./src/primitives/types/overlay/html.js","webpack://MathBox/./src/primitives/types/overlay/dom.js","webpack://MathBox/./src/primitives/types/overlay/index.js","webpack://MathBox/./src/primitives/types/text/text.js","webpack://MathBox/./src/primitives/types/operator/operator.js","webpack://MathBox/./src/primitives/types/text/format.js","webpack://MathBox/./src/primitives/types/text/label.js","webpack://MathBox/./src/primitives/types/operator/resample.js","webpack://MathBox/./src/primitives/types/text/retext.js","webpack://MathBox/./src/primitives/types/text/index.js","webpack://MathBox/./src/primitives/types/time/clock.js","webpack://MathBox/./src/primitives/types/time/now.js","webpack://MathBox/./src/primitives/types/time/index.js","webpack://MathBox/./src/primitives/types/transform/transform.js","webpack://MathBox/./src/primitives/types/transform/transform3.js","webpack://MathBox/./src/primitives/types/transform/transform4.js","webpack://MathBox/./src/primitives/types/transform/vertex.js","webpack://MathBox/./src/primitives/types/transform/fragment.js","webpack://MathBox/./src/primitives/types/transform/layer.js","webpack://MathBox/./src/primitives/types/transform/mask.js","webpack://MathBox/./src/primitives/types/transform/index.js","webpack://MathBox/./src/primitives/types/operator/clamp.js","webpack://MathBox/./src/primitives/types/operator/grow.js","webpack://MathBox/./src/primitives/types/operator/join.js","webpack://MathBox/./src/primitives/types/operator/lerp.js","webpack://MathBox/./src/primitives/types/operator/memo.js","webpack://MathBox/./src/primitives/types/operator/readback.js","webpack://MathBox/./src/primitives/types/operator/repeat.js","webpack://MathBox/./src/primitives/types/operator/swizzle.js","webpack://MathBox/./src/primitives/types/operator/spread.js","webpack://MathBox/./src/primitives/types/operator/split.js","webpack://MathBox/./src/primitives/types/operator/slice.js","webpack://MathBox/./src/primitives/types/operator/subdivide.js","webpack://MathBox/./src/primitives/types/operator/transpose.js","webpack://MathBox/./src/primitives/types/operator/index.js","webpack://MathBox/./src/primitives/types/present/transition.js","webpack://MathBox/./src/primitives/types/present/move.js","webpack://MathBox/./src/util/ease.js","webpack://MathBox/./src/primitives/types/present/track.js","webpack://MathBox/./src/primitives/types/present/play.js","webpack://MathBox/./src/primitives/types/present/present.js","webpack://MathBox/./src/primitives/types/present/reveal.js","webpack://MathBox/./src/primitives/types/present/slide.js","webpack://MathBox/./src/primitives/types/present/step.js","webpack://MathBox/./src/primitives/types/present/index.js","webpack://MathBox/./src/primitives/types/rtt/rtt.js","webpack://MathBox/./src/primitives/types/rtt/compose.js","webpack://MathBox/./src/primitives/types/rtt/index.js","webpack://MathBox/./src/primitives/types/view/view.js","webpack://MathBox/./src/primitives/types/view/cartesian.js","webpack://MathBox/./src/primitives/types/view/cartesian4.js","webpack://MathBox/./src/primitives/types/view/polar.js","webpack://MathBox/./src/primitives/types/view/spherical.js","webpack://MathBox/./src/primitives/types/view/stereographic.js","webpack://MathBox/./src/primitives/types/view/stereographic4.js","webpack://MathBox/./src/primitives/types/view/index.js","webpack://MathBox/./src/primitives/types/shader/shader.js","webpack://MathBox/./src/primitives/types/shader/index.js","webpack://MathBox/./src/primitives/types/classes.js","webpack://MathBox/./src/primitives/types/types.js","webpack://MathBox/./src/primitives/types/traits.js","webpack://MathBox/./src/util/ticks.js","webpack://MathBox/./src/primitives/types/helpers.js","webpack://MathBox/./src/primitives/types/index.js","webpack://MathBox/./src/primitives/factory.js","webpack://MathBox/./src/primitives/index.js","webpack://MathBox/./src/render/renderable.js","webpack://MathBox/./src/render/scene.js","webpack://MathBox/./src/render/factory.js","webpack://MathBox/./src/render/buffer/buffer.js","webpack://MathBox/./src/render/buffer/texture/datatexture.js","webpack://MathBox/./src/render/buffer/databuffer.js","webpack://MathBox/./src/render/buffer/arraybuffer.js","webpack://MathBox/./src/render/geometry/geometry.js","webpack://MathBox/./src/render/geometry/clipgeometry.js","webpack://MathBox/./src/render/geometry/arrowgeometry.js","webpack://MathBox/./src/render/meshes/base.js","webpack://MathBox/./src/render/meshes/arrow.js","webpack://MathBox/./src/render/buffer/texture/backedtexture.js","webpack://MathBox/./src/render/buffer/atlas.js","webpack://MathBox/./src/render/meshes/debug.js","webpack://MathBox/./src/render/geometry/facegeometry.js","webpack://MathBox/./src/render/meshes/face.js","webpack://MathBox/./src/render/geometry/linegeometry.js","webpack://MathBox/./src/render/meshes/line.js","webpack://MathBox/./src/render/buffer/matrixbuffer.js","webpack://MathBox/./src/render/buffer/texture/rendertarget.js","webpack://MathBox/./src/render/buffer/rendertotexture.js","webpack://MathBox/./src/render/buffer/memo.js","webpack://MathBox/./src/render/geometry/surfacegeometry.js","webpack://MathBox/./src/render/geometry/screengeometry.js","webpack://MathBox/./src/render/meshes/screen.js","webpack://MathBox/./src/render/meshes/memoscreen.js","webpack://MathBox/./src/render/geometry/spritegeometry.js","webpack://MathBox/./src/render/meshes/point.js","webpack://MathBox/./src/render/buffer/pushbuffer.js","webpack://MathBox/./src/render/buffer/readback.js","webpack://MathBox/./src/render/meshes/sprite.js","webpack://MathBox/./src/render/geometry/stripgeometry.js","webpack://MathBox/./src/render/meshes/strip.js","webpack://MathBox/./src/render/meshes/surface.js","webpack://MathBox/./src/render/buffer/textatlas.js","webpack://MathBox/./src/render/buffer/voxelbuffer.js","webpack://MathBox/./src/render/classes.js","webpack://MathBox/./src/render/index.js","webpack://MathBox/./src/shaders/glsl/arrow.position.js","webpack://MathBox/./src/shaders/glsl/axis.position.js","webpack://MathBox/./src/shaders/glsl/cartesian4.position.js","webpack://MathBox/./src/shaders/glsl/cartesian.position.js","webpack://MathBox/./src/shaders/glsl/clamp.position.js","webpack://MathBox/./src/shaders/glsl/color.opaque.js","webpack://MathBox/./src/shaders/glsl/face.position.js","webpack://MathBox/./src/shaders/glsl/face.position.normal.js","webpack://MathBox/./src/shaders/glsl/float.encode.js","webpack://MathBox/./src/shaders/glsl/float.index.pack.js","webpack://MathBox/./src/shaders/glsl/float.stretch.js","webpack://MathBox/./src/shaders/glsl/fragment.clip.dashed.js","webpack://MathBox/./src/shaders/glsl/fragment.clip.dotted.js","webpack://MathBox/./src/shaders/glsl/fragment.clip.ends.js","webpack://MathBox/./src/shaders/glsl/fragment.clip.proximity.js","webpack://MathBox/./src/shaders/glsl/fragment.color.js","webpack://MathBox/./src/shaders/glsl/fragment.map.rgba.js","webpack://MathBox/./src/shaders/glsl/fragment.solid.js","webpack://MathBox/./src/shaders/glsl/fragment.transparent.js","webpack://MathBox/./src/shaders/glsl/grid.position.js","webpack://MathBox/./src/shaders/glsl/grow.position.js","webpack://MathBox/./src/shaders/glsl/join.position.js","webpack://MathBox/./src/shaders/glsl/label.alpha.js","webpack://MathBox/./src/shaders/glsl/label.map.js","webpack://MathBox/./src/shaders/glsl/label.outline.js","webpack://MathBox/./src/shaders/glsl/layer.position.js","webpack://MathBox/./src/shaders/glsl/lerp.depth.js","webpack://MathBox/./src/shaders/glsl/lerp.height.js","webpack://MathBox/./src/shaders/glsl/lerp.items.js","webpack://MathBox/./src/shaders/glsl/lerp.width.js","webpack://MathBox/./src/shaders/glsl/line.position.js","webpack://MathBox/./src/shaders/glsl/map.2d.data.js","webpack://MathBox/./src/shaders/glsl/map.2d.data.wrap.js","webpack://MathBox/./src/shaders/glsl/map.xyzw.2dv.js","webpack://MathBox/./src/shaders/glsl/map.xyzw.align.js","webpack://MathBox/./src/shaders/glsl/map.xyzw.texture.js","webpack://MathBox/./src/shaders/glsl/mesh.fragment.color.js","webpack://MathBox/./src/shaders/glsl/mesh.fragment.map.js","webpack://MathBox/./src/shaders/glsl/mesh.fragment.mask.js","webpack://MathBox/./src/shaders/glsl/mesh.fragment.material.js","webpack://MathBox/./src/shaders/glsl/mesh.fragment.shaded.js","webpack://MathBox/./src/shaders/glsl/mesh.fragment.texture.js","webpack://MathBox/./src/shaders/glsl/mesh.gamma.in.js","webpack://MathBox/./src/shaders/glsl/mesh.gamma.out.js","webpack://MathBox/./src/shaders/glsl/mesh.map.uvwo.js","webpack://MathBox/./src/shaders/glsl/mesh.position.js","webpack://MathBox/./src/shaders/glsl/mesh.vertex.color.js","webpack://MathBox/./src/shaders/glsl/mesh.vertex.mask.js","webpack://MathBox/./src/shaders/glsl/mesh.vertex.position.js","webpack://MathBox/./src/shaders/glsl/move.position.js","webpack://MathBox/./src/shaders/glsl/object.mask.default.js","webpack://MathBox/./src/shaders/glsl/point.alpha.circle.js","webpack://MathBox/./src/shaders/glsl/point.alpha.circle.hollow.js","webpack://MathBox/./src/shaders/glsl/point.alpha.generic.js","webpack://MathBox/./src/shaders/glsl/point.alpha.generic.hollow.js","webpack://MathBox/./src/shaders/glsl/point.edge.js","webpack://MathBox/./src/shaders/glsl/point.fill.js","webpack://MathBox/./src/shaders/glsl/point.mask.circle.js","webpack://MathBox/./src/shaders/glsl/point.mask.diamond.js","webpack://MathBox/./src/shaders/glsl/point.mask.down.js","webpack://MathBox/./src/shaders/glsl/point.mask.left.js","webpack://MathBox/./src/shaders/glsl/point.mask.right.js","webpack://MathBox/./src/shaders/glsl/point.mask.square.js","webpack://MathBox/./src/shaders/glsl/point.mask.up.js","webpack://MathBox/./src/shaders/glsl/point.position.js","webpack://MathBox/./src/shaders/glsl/point.size.uniform.js","webpack://MathBox/./src/shaders/glsl/point.size.varying.js","webpack://MathBox/./src/shaders/glsl/polar.position.js","webpack://MathBox/./src/shaders/glsl/project.position.js","webpack://MathBox/./src/shaders/glsl/project.readback.js","webpack://MathBox/./src/shaders/glsl/raw.position.scale.js","webpack://MathBox/./src/shaders/glsl/repeat.position.js","webpack://MathBox/./src/shaders/glsl/resample.padding.js","webpack://MathBox/./src/shaders/glsl/resample.relative.js","webpack://MathBox/./src/shaders/glsl/reveal.mask.js","webpack://MathBox/./src/shaders/glsl/root.position.js","webpack://MathBox/./src/shaders/glsl/sample.2d.js","webpack://MathBox/./src/shaders/glsl/scale.position.js","webpack://MathBox/./src/shaders/glsl/screen.map.stpq.js","webpack://MathBox/./src/shaders/glsl/screen.map.xy.js","webpack://MathBox/./src/shaders/glsl/screen.map.xyzw.js","webpack://MathBox/./src/shaders/glsl/screen.pass.uv.js","webpack://MathBox/./src/shaders/glsl/screen.position.js","webpack://MathBox/./src/shaders/glsl/slice.position.js","webpack://MathBox/./src/shaders/glsl/spherical.position.js","webpack://MathBox/./src/shaders/glsl/split.position.js","webpack://MathBox/./src/shaders/glsl/spread.position.js","webpack://MathBox/./src/shaders/glsl/sprite.fragment.js","webpack://MathBox/./src/shaders/glsl/sprite.position.js","webpack://MathBox/./src/shaders/glsl/stereographic4.position.js","webpack://MathBox/./src/shaders/glsl/stereographic.position.js","webpack://MathBox/./src/shaders/glsl/stpq.sample.2d.js","webpack://MathBox/./src/shaders/glsl/stpq.xyzw.2d.js","webpack://MathBox/./src/shaders/glsl/strip.position.normal.js","webpack://MathBox/./src/shaders/glsl/style.color.js","webpack://MathBox/./src/shaders/glsl/subdivide.depth.js","webpack://MathBox/./src/shaders/glsl/subdivide.depth.lerp.js","webpack://MathBox/./src/shaders/glsl/subdivide.height.js","webpack://MathBox/./src/shaders/glsl/subdivide.height.lerp.js","webpack://MathBox/./src/shaders/glsl/subdivide.items.js","webpack://MathBox/./src/shaders/glsl/subdivide.items.lerp.js","webpack://MathBox/./src/shaders/glsl/subdivide.width.js","webpack://MathBox/./src/shaders/glsl/subdivide.width.lerp.js","webpack://MathBox/./src/shaders/glsl/surface.mask.hollow.js","webpack://MathBox/./src/shaders/glsl/surface.position.js","webpack://MathBox/./src/shaders/glsl/surface.position.normal.js","webpack://MathBox/./src/shaders/glsl/ticks.position.js","webpack://MathBox/./src/shaders/glsl/transform3.position.js","webpack://MathBox/./src/shaders/glsl/transform4.position.js","webpack://MathBox/./src/shaders/glsl/view.position.js","webpack://MathBox/./node_modules/shadergraph/src/graph/graph.js","webpack://MathBox/./node_modules/shadergraph/src/graph/outlet.js","webpack://MathBox/./node_modules/shadergraph/src/graph/node.js","webpack://MathBox/./node_modules/shadergraph/src/graph/index.js","webpack://MathBox/./node_modules/shadergraph/src/linker/snippet.js","webpack://MathBox/./node_modules/shadergraph/src/linker/assemble.js","webpack://MathBox/./node_modules/shadergraph/src/linker/program.js","webpack://MathBox/./node_modules/shadergraph/src/linker/link.js","webpack://MathBox/./node_modules/shadergraph/src/linker/layout.js","webpack://MathBox/./node_modules/shadergraph/src/linker/index.js","webpack://MathBox/./node_modules/shadergraph/src/block/block.js","webpack://MathBox/./node_modules/shadergraph/src/block/call.js","webpack://MathBox/./node_modules/shadergraph/src/block/callback.js","webpack://MathBox/./node_modules/shadergraph/src/block/isolate.js","webpack://MathBox/./node_modules/shadergraph/src/block/join.js","webpack://MathBox/./node_modules/shadergraph/src/block/index.js","webpack://MathBox/./node_modules/shadergraph/src/visualize/serialize.js","webpack://MathBox/./node_modules/shadergraph/src/factory/hash.js","webpack://MathBox/./node_modules/shadergraph/src/visualize/markup.js","webpack://MathBox/./node_modules/shadergraph/src/visualize/index.js","webpack://MathBox/./node_modules/shadergraph/src/factory/factory.js","webpack://MathBox/./node_modules/shadergraph/src/factory/material.js","webpack://MathBox/./node_modules/shadergraph/src/factory/library.js","webpack://MathBox/./node_modules/shadergraph/src/factory/queue.js","webpack://MathBox/./node_modules/shadergraph/src/factory/cache.js","webpack://MathBox/./node_modules/shadergraph/src/factory/index.js","webpack://MathBox/./node_modules/shadergraph/src/glsl/compile.js","webpack://MathBox/./node_modules/shadergraph/src/glsl/decl.js","webpack://MathBox/./node_modules/shadergraph/src/glsl/constants.js","webpack://MathBox/./node_modules/shadergraph/src/glsl/parse.js","webpack://MathBox/./node_modules/shadergraph/src/glsl/generate.js","webpack://MathBox/./node_modules/shadergraph/src/glsl/index.js","webpack://MathBox/./node_modules/shadergraph/src/index.js","webpack://MathBox/./src/shaders/factory.js","webpack://MathBox/./src/shaders/index.js","webpack://MathBox/./src/stage/animator.js","webpack://MathBox/./src/stage/api.js","webpack://MathBox/./src/stage/controller.js","webpack://MathBox/./src/stage/index.js","webpack://MathBox/./src/util/index.js","webpack://MathBox/./src/context.js","webpack://MathBox/./src/index.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"THREE\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"MathBox\", [\"THREE\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"MathBox\"] = factory(require(\"THREE\"));\n\telse\n\t\troot[\"MathBox\"] = factory(root[\"THREE\"]);\n})(self, function(__WEBPACK_EXTERNAL_MODULE__824__) {\nreturn ","var parse = require(\"./lib/index\");\n\nmodule.exports = parseArray;\n\nfunction parseArray(tokens) {\n  var parser = parse();\n\n  for (var i = 0; i < tokens.length; i++) {\n    parser(tokens[i]);\n  }\n\n  return parser(null);\n}\n","let state, token, tokens, idx;\n\nconst original_symbol = {\n  nud: function () {\n    return this.children && this.children.length ? this : fail(\"unexpected\")();\n  },\n  led: fail(\"missing operator\"),\n};\n\nconst symbol_table = {};\n\nfunction itself() {\n  return this;\n}\n\nsymbol(\"(ident)\").nud = itself;\nsymbol(\"(keyword)\").nud = itself;\nsymbol(\"(builtin)\").nud = itself;\nsymbol(\"(literal)\").nud = itself;\nsymbol(\"(end)\");\n\nsymbol(\":\");\nsymbol(\";\");\nsymbol(\",\");\nsymbol(\")\");\nsymbol(\"]\");\nsymbol(\"}\");\n\ninfixr(\"&&\", 30);\ninfixr(\"||\", 30);\ninfix(\"|\", 43);\ninfix(\"^\", 44);\ninfix(\"&\", 45);\ninfix(\"==\", 46);\ninfix(\"!=\", 46);\ninfix(\"<\", 47);\ninfix(\"<=\", 47);\ninfix(\">\", 47);\ninfix(\">=\", 47);\ninfix(\">>\", 48);\ninfix(\"<<\", 48);\ninfix(\"+\", 50);\ninfix(\"-\", 50);\ninfix(\"*\", 60);\ninfix(\"/\", 60);\ninfix(\"%\", 60);\ninfix(\"?\", 20, function (left) {\n  this.children = [left, expression(0), (advance(\":\"), expression(0))];\n  this.type = \"ternary\";\n  return this;\n});\ninfix(\".\", 80, function (left) {\n  token.type = \"literal\";\n  state.fake(token);\n  this.children = [left, token];\n  advance();\n  return this;\n});\ninfix(\"[\", 80, function (left) {\n  this.children = [left, expression(0)];\n  this.type = \"binary\";\n  advance(\"]\");\n  return this;\n});\ninfix(\"(\", 80, function (left) {\n  this.children = [left];\n  this.type = \"call\";\n\n  if (token.data !== \")\")\n    while (1) {\n      this.children.push(expression(0));\n      if (token.data !== \",\") break;\n      advance(\",\");\n    }\n  advance(\")\");\n  return this;\n});\n\nprefix(\"-\");\nprefix(\"+\");\nprefix(\"!\");\nprefix(\"~\");\nprefix(\"defined\");\nprefix(\"(\", function () {\n  this.type = \"group\";\n  this.children = [expression(0)];\n  advance(\")\");\n  return this;\n});\nprefix(\"++\");\nprefix(\"--\");\nsuffix(\"++\");\nsuffix(\"--\");\n\nassignment(\"=\");\nassignment(\"+=\");\nassignment(\"-=\");\nassignment(\"*=\");\nassignment(\"/=\");\nassignment(\"%=\");\nassignment(\"&=\");\nassignment(\"|=\");\nassignment(\"^=\");\nassignment(\">>=\");\nassignment(\"<<=\");\n\nmodule.exports = function (incoming_state, incoming_tokens) {\n  state = incoming_state;\n  tokens = incoming_tokens;\n  idx = 0;\n  let result;\n\n  if (!tokens.length) return;\n\n  advance();\n  result = expression(0);\n  result.parent = state[0];\n  emit(result);\n\n  if (idx < tokens.length) {\n    throw new Error(\"did not use all tokens\");\n  }\n\n  result.parent.children = [result];\n\n  function emit(node) {\n    state.unshift(node, false);\n    for (let i = 0, len = node.children.length; i < len; ++i) {\n      emit(node.children[i]);\n    }\n    state.shift();\n  }\n};\n\nfunction symbol(id, binding_power) {\n  let sym = symbol_table[id];\n  binding_power = binding_power || 0;\n  if (sym) {\n    if (binding_power > sym.lbp) {\n      sym.lbp = binding_power;\n    }\n  } else {\n    sym = Object.create(original_symbol);\n    sym.id = id;\n    sym.lbp = binding_power;\n    symbol_table[id] = sym;\n  }\n  return sym;\n}\n\nfunction expression(rbp) {\n  let left,\n    t = token;\n  advance();\n\n  left = t.nud();\n  while (rbp < token.lbp) {\n    t = token;\n    advance();\n    left = t.led(left);\n  }\n  return left;\n}\n\nfunction infix(id, bp, led) {\n  const sym = symbol(id, bp);\n  sym.led =\n    led ||\n    function (left) {\n      this.children = [left, expression(bp)];\n      this.type = \"binary\";\n      return this;\n    };\n}\n\nfunction infixr(id, bp, led) {\n  const sym = symbol(id, bp);\n  sym.led =\n    led ||\n    function (left) {\n      this.children = [left, expression(bp - 1)];\n      this.type = \"binary\";\n      return this;\n    };\n  return sym;\n}\n\nfunction prefix(id, nud) {\n  const sym = symbol(id);\n  sym.nud =\n    nud ||\n    function () {\n      this.children = [expression(70)];\n      this.type = \"unary\";\n      return this;\n    };\n  return sym;\n}\n\nfunction suffix(id) {\n  const sym = symbol(id, 150);\n  sym.led = function (left) {\n    this.children = [left];\n    this.type = \"suffix\";\n    return this;\n  };\n}\n\nfunction assignment(id) {\n  return infixr(id, 10, function (left) {\n    this.children = [left, expression(9)];\n    this.assignment = true;\n    this.type = \"assign\";\n    return this;\n  });\n}\n\nfunction advance(id) {\n  let next, value, type, output;\n\n  if (id && token.data !== id) {\n    return state.unexpected(\"expected `\" + id + \"`, got `\" + token.data + \"`\");\n  }\n\n  if (idx >= tokens.length) {\n    token = symbol_table[\"(end)\"];\n    return;\n  }\n\n  next = tokens[idx++];\n  value = next.data;\n  type = next.type;\n\n  if (type === \"ident\") {\n    output = state.scope.find(value) || state.create_node();\n    type = output.type;\n  } else if (type === \"builtin\") {\n    output = symbol_table[\"(builtin)\"];\n  } else if (type === \"keyword\") {\n    output = symbol_table[\"(keyword)\"];\n  } else if (type === \"operator\") {\n    output = symbol_table[value];\n    if (!output) {\n      return state.unexpected(\"unknown operator `\" + value + \"`\");\n    }\n  } else if (type === \"float\" || type === \"integer\") {\n    type = \"literal\";\n    output = symbol_table[\"(literal)\"];\n  } else {\n    return state.unexpected(\"unexpected token.\");\n  }\n\n  if (output) {\n    if (!output.nud) {\n      output.nud = itself;\n    }\n    if (!output.children) {\n      output.children = [];\n    }\n  }\n\n  output = Object.create(output);\n  output.token = next;\n  output.type = type;\n  if (!output.data) output.data = value;\n\n  return (token = output);\n}\n\nfunction fail(message) {\n  return function () {\n    return state.unexpected(message);\n  };\n}\n","module.exports = parser;\n\nconst full_parse_expr = require(\"./expr\"),\n  Scope = require(\"./scope\");\n\n// singleton!\nconst Advance = new Object();\n\nconst DEBUG = false;\n\nlet _ = 0,\n  IDENT = _++,\n  STMT = _++,\n  STMTLIST = _++,\n  STRUCT = _++,\n  FUNCTION = _++,\n  FUNCTIONARGS = _++,\n  DECL = _++,\n  DECLLIST = _++,\n  FORLOOP = _++,\n  WHILELOOP = _++,\n  IF = _++,\n  EXPR = _++,\n  PRECISION = _++,\n  COMMENT = _++,\n  PREPROCESSOR = _++,\n  KEYWORD = _++,\n  KEYWORD_OR_IDENT = _++,\n  RETURN = _++,\n  BREAK = _++,\n  CONTINUE = _++,\n  DISCARD = _++,\n  DOWHILELOOP = _++,\n  PLACEHOLDER = _++,\n  QUANTIFIER = _++;\n\nconst DECL_ALLOW_ASSIGN = 0x1,\n  DECL_ALLOW_COMMA = 0x2,\n  DECL_REQUIRE_NAME = 0x4,\n  DECL_ALLOW_INVARIANT = 0x8,\n  DECL_ALLOW_STORAGE = 0x10,\n  DECL_NO_INOUT = 0x20,\n  DECL_ALLOW_STRUCT = 0x40,\n  DECL_STATEMENT = 0xff,\n  DECL_FUNCTION =\n    DECL_STATEMENT &\n    ~(\n      DECL_ALLOW_ASSIGN |\n      DECL_ALLOW_COMMA |\n      DECL_NO_INOUT |\n      DECL_ALLOW_INVARIANT |\n      DECL_REQUIRE_NAME\n    ),\n  DECL_STRUCT =\n    DECL_STATEMENT &\n    ~(\n      DECL_ALLOW_ASSIGN |\n      DECL_ALLOW_INVARIANT |\n      DECL_ALLOW_STORAGE |\n      DECL_ALLOW_STRUCT\n    );\n\nconst QUALIFIERS = [\"const\", \"attribute\", \"uniform\", \"varying\"];\n\nconst NO_ASSIGN_ALLOWED = false,\n  NO_COMMA_ALLOWED = false;\n\n// map of tokens to stmt types\nconst token_map = {\n  \"block-comment\": COMMENT,\n  \"line-comment\": COMMENT,\n  preprocessor: PREPROCESSOR,\n};\n\n// map of stmt types to human\nconst stmt_type = (_ = [\n  \"ident\",\n  \"stmt\",\n  \"stmtlist\",\n  \"struct\",\n  \"function\",\n  \"functionargs\",\n  \"decl\",\n  \"decllist\",\n  \"forloop\",\n  \"whileloop\",\n  \"if\",\n  \"expr\",\n  \"precision\",\n  \"comment\",\n  \"preprocessor\",\n  \"keyword\",\n  \"keyword_or_ident\",\n  \"return\",\n  \"break\",\n  \"continue\",\n  \"discard\",\n  \"do-while\",\n  \"placeholder\",\n  \"quantifier\",\n]);\n\nfunction parser() {\n  const stmtlist = n(STMTLIST),\n    stmt = n(STMT),\n    decllist = n(DECLLIST),\n    precision = n(PRECISION),\n    ident = n(IDENT),\n    keyword_or_ident = n(KEYWORD_OR_IDENT),\n    fn = n(FUNCTION),\n    fnargs = n(FUNCTIONARGS),\n    forstmt = n(FORLOOP),\n    ifstmt = n(IF),\n    whilestmt = n(WHILELOOP),\n    returnstmt = n(RETURN),\n    dowhilestmt = n(DOWHILELOOP),\n    quantifier = n(QUANTIFIER);\n\n  let parse_struct,\n    parse_precision,\n    parse_quantifier,\n    parse_forloop,\n    parse_if,\n    parse_return,\n    parse_whileloop,\n    parse_dowhileloop,\n    parse_function,\n    parse_function_args;\n\n  let check = arguments.length ? [].slice.call(arguments) : [],\n    complete = false,\n    ended = false,\n    depth = 0,\n    state = [],\n    nodes = [],\n    tokens = [],\n    whitespace = [],\n    errored = false,\n    program,\n    token,\n    node;\n\n  // setup state\n  state.shift = special_shift;\n  state.unshift = special_unshift;\n  state.fake = special_fake;\n  state.unexpected = unexpected;\n  state.scope = new Scope(state);\n  state.create_node = function () {\n    const n = mknode(IDENT, token);\n    n.parent = reader.program;\n    return n;\n  };\n\n  setup_stative_parsers();\n\n  // setup root node\n  node = stmtlist();\n  node.expecting = \"(eof)\";\n  node.mode = STMTLIST;\n  node.token = { type: \"(program)\", data: \"(program)\" };\n  program = node;\n\n  reader.program = program;\n  reader.scope = function (scope) {\n    if (arguments.length === 1) {\n      state.scope = scope;\n    }\n    return state.scope;\n  };\n\n  state.unshift(node);\n  return reader;\n\n  function reader(data) {\n    if (data === null) {\n      return end(), program;\n    }\n\n    nodes = [];\n    write(data);\n    return nodes;\n  }\n\n  // stream functions ---------------------------------------------\n\n  function write(input) {\n    if (\n      input.type === \"whitespace\" ||\n      input.type === \"line-comment\" ||\n      input.type === \"block-comment\"\n    ) {\n      whitespace.push(input);\n      return;\n    }\n    tokens.push(input);\n    token = token || tokens[0];\n\n    if (token && whitespace.length) {\n      token.preceding = token.preceding || [];\n      token.preceding = token.preceding.concat(whitespace);\n      whitespace = [];\n    }\n\n    while (take())\n      switch (state[0].mode) {\n        case STMT:\n          parse_stmt();\n          break;\n        case STMTLIST:\n          parse_stmtlist();\n          break;\n        case DECL:\n          parse_decl();\n          break;\n        case DECLLIST:\n          parse_decllist();\n          break;\n        case EXPR:\n          parse_expr();\n          break;\n        case STRUCT:\n          parse_struct(true, true);\n          break;\n        case PRECISION:\n          parse_precision();\n          break;\n        case IDENT:\n          parse_ident();\n          break;\n        case KEYWORD:\n          parse_keyword();\n          break;\n        case KEYWORD_OR_IDENT:\n          parse_keyword_or_ident();\n          break;\n        case FUNCTION:\n          parse_function();\n          break;\n        case FUNCTIONARGS:\n          parse_function_args();\n          break;\n        case FORLOOP:\n          parse_forloop();\n          break;\n        case WHILELOOP:\n          parse_whileloop();\n          break;\n        case DOWHILELOOP:\n          parse_dowhileloop();\n          break;\n        case RETURN:\n          parse_return();\n          break;\n        case IF:\n          parse_if();\n          break;\n        case QUANTIFIER:\n          parse_quantifier();\n          break;\n      }\n  }\n\n  function end(tokens) {\n    if (arguments.length) {\n      write(tokens);\n    }\n\n    if (state.length > 1) {\n      unexpected(\"unexpected EOF\");\n      return;\n    }\n\n    complete = true;\n  }\n\n  function take() {\n    if (errored || !state.length) return false;\n\n    return (token = tokens[0]);\n  }\n\n  // ----- state manipulation --------\n\n  function special_fake(x) {\n    state.unshift(x);\n    state.shift();\n  }\n\n  function special_unshift(_node, add_child) {\n    _node.parent = state[0];\n\n    const ret = [].unshift.call(this, _node);\n\n    add_child = add_child === undefined ? true : add_child;\n\n    if (DEBUG) {\n      let pad = \"\";\n      for (let i = 0, len = this.length - 1; i < len; ++i) {\n        pad += \" |\";\n      }\n      console.log(pad, \"\\\\\" + _node.type, _node.token.data);\n    }\n\n    if (add_child && node !== _node) node.children.push(_node);\n    node = _node;\n\n    return ret;\n  }\n\n  function special_shift() {\n    let _node = [].shift.call(this),\n      okay = check[this.length],\n      emit = false;\n\n    if (DEBUG) {\n      let pad = \"\";\n      for (let i = 0, len = this.length; i < len; ++i) {\n        pad += \" |\";\n      }\n      console.log(pad, \"/\" + _node.type);\n    }\n\n    if (check.length) {\n      if (typeof check[0] === \"function\") {\n        emit = check[0](_node);\n      } else if (okay !== undefined) {\n        emit = okay.test ? okay.test(_node.type) : okay === _node.type;\n      }\n    } else {\n      emit = true;\n    }\n\n    if (emit && !errored) nodes.push(_node);\n\n    node = _node.parent;\n    return _node;\n  }\n\n  // parse states ---------------\n\n  function parse_stmtlist() {\n    // determine the type of the statement\n    // and then start parsing\n    return stative(function () {\n      state.scope.enter();\n      return Advance;\n    }, normal_mode)();\n\n    function normal_mode() {\n      if (token.data === state[0].expecting) {\n        return state.scope.exit(), state.shift();\n      }\n      switch (token.type) {\n        case \"preprocessor\":\n          state.fake(adhoc());\n          tokens.shift();\n          return;\n        default:\n          state.unshift(stmt());\n          return;\n      }\n    }\n  }\n\n  function parse_stmt() {\n    if (state[0].brace) {\n      if (token.data !== \"}\") {\n        return unexpected(\"expected `}`, got \" + token.data);\n      }\n      state[0].brace = false;\n      return tokens.shift(), state.shift();\n    }\n    switch (token.type) {\n      case \"eof\":\n        return got_eof();\n      case \"keyword\":\n        switch (token.data) {\n          case \"for\":\n            return state.unshift(forstmt());\n          case \"if\":\n            return state.unshift(ifstmt());\n          case \"while\":\n            return state.unshift(whilestmt());\n          case \"do\":\n            return state.unshift(dowhilestmt());\n          case \"break\":\n            return state.fake(mknode(BREAK, token)), tokens.shift();\n          case \"continue\":\n            return state.fake(mknode(CONTINUE, token)), tokens.shift();\n          case \"discard\":\n            return state.fake(mknode(DISCARD, token)), tokens.shift();\n          case \"return\":\n            return state.unshift(returnstmt());\n          case \"precision\":\n            return state.unshift(precision());\n        }\n        return state.unshift(decl(DECL_STATEMENT));\n      case \"ident\":\n        var lookup;\n        if ((lookup = state.scope.find(token.data))) {\n          if (lookup.parent.type === \"struct\") {\n            // this is strictly untrue, you could have an\n            // expr that starts with a struct constructor.\n            //      ... sigh\n            return state.unshift(decl(DECL_STATEMENT));\n          }\n          return state.unshift(expr(\";\"));\n        }\n      case \"operator\":\n        if (token.data === \"{\") {\n          state[0].brace = true;\n          const n = stmtlist();\n          n.expecting = \"}\";\n          return tokens.shift(), state.unshift(n);\n        }\n        if (token.data === \";\") {\n          return tokens.shift(), state.shift();\n        }\n      default:\n        return state.unshift(expr(\";\"));\n    }\n  }\n\n  function got_eof() {\n    if (ended) errored = true;\n    ended = true;\n    return state.shift();\n  }\n\n  function parse_decl() {\n    const stmt = state[0];\n\n    return stative(\n      invariant_or_not,\n      storage_or_not,\n      parameter_or_not,\n      precision_or_not,\n      struct_or_type,\n      maybe_name,\n      maybe_lparen, // lparen means we're a function\n      is_decllist,\n      done\n    )();\n\n    function invariant_or_not() {\n      if (token.data === \"invariant\") {\n        if (stmt.flags & DECL_ALLOW_INVARIANT) {\n          state.unshift(keyword());\n          return Advance;\n        } else {\n          return unexpected(\"`invariant` is not allowed here\");\n        }\n      } else {\n        state.fake(mknode(PLACEHOLDER, { data: \"\", position: token.position }));\n        return Advance;\n      }\n    }\n\n    function storage_or_not() {\n      if (is_storage(token)) {\n        if (stmt.flags & DECL_ALLOW_STORAGE) {\n          state.unshift(keyword());\n          return Advance;\n        } else {\n          return unexpected(\"storage is not allowed here\");\n        }\n      } else {\n        state.fake(mknode(PLACEHOLDER, { data: \"\", position: token.position }));\n        return Advance;\n      }\n    }\n\n    function parameter_or_not() {\n      if (is_parameter(token)) {\n        if (!(stmt.flags & DECL_NO_INOUT)) {\n          state.unshift(keyword());\n          return Advance;\n        } else {\n          return unexpected(\"parameter is not allowed here\");\n        }\n      } else {\n        state.fake(mknode(PLACEHOLDER, { data: \"\", position: token.position }));\n        return Advance;\n      }\n    }\n\n    function precision_or_not() {\n      if (is_precision(token)) {\n        state.unshift(keyword());\n        return Advance;\n      } else {\n        state.fake(mknode(PLACEHOLDER, { data: \"\", position: token.position }));\n        return Advance;\n      }\n    }\n\n    function struct_or_type() {\n      if (token.data === \"struct\") {\n        if (!(stmt.flags & DECL_ALLOW_STRUCT)) {\n          return unexpected(\"cannot nest structs\");\n        }\n        state.unshift(struct());\n        return Advance;\n      }\n\n      if (token.type === \"keyword\") {\n        state.unshift(keyword());\n        return Advance;\n      }\n\n      const lookup = state.scope.find(token.data);\n\n      if (lookup) {\n        state.fake(Object.create(lookup));\n        tokens.shift();\n        return Advance;\n      }\n      return unexpected(\n        \"expected user defined type, struct or keyword, got \" + token.data\n      );\n    }\n\n    function maybe_name() {\n      if (token.data === \",\" && !(stmt.flags & DECL_ALLOW_COMMA)) {\n        return state.shift();\n      }\n\n      if (token.data === \"[\") {\n        // oh lord.\n        state.unshift(quantifier());\n        return;\n      }\n\n      if (token.data === \")\") return state.shift();\n\n      if (token.data === \";\") {\n        return stmt.stage + 3;\n      }\n\n      if (token.type !== \"ident\" && token.type !== \"builtin\") {\n        return unexpected(\"expected identifier, got \" + token.data);\n      }\n\n      stmt.collected_name = tokens.shift();\n      return Advance;\n    }\n\n    function maybe_lparen() {\n      if (token.data === \"(\") {\n        tokens.unshift(stmt.collected_name);\n        delete stmt.collected_name;\n        state.unshift(fn());\n        return stmt.stage + 2;\n      }\n      return Advance;\n    }\n\n    function is_decllist() {\n      tokens.unshift(stmt.collected_name);\n      delete stmt.collected_name;\n      state.unshift(decllist());\n      return Advance;\n    }\n\n    function done() {\n      return state.shift();\n    }\n  }\n\n  function parse_decllist() {\n    // grab ident\n\n    if (token.type === \"ident\" || token.type === \"builtin\") {\n      const name = token.data;\n      state.unshift(ident());\n      state.scope.define(name);\n      return;\n    }\n\n    if (token.type === \"operator\") {\n      if (token.data === \",\") {\n        // multi-decl!\n        if (!(state[1].flags & DECL_ALLOW_COMMA)) {\n          return state.shift();\n        }\n\n        return tokens.shift();\n      } else if (token.data === \"=\") {\n        if (!(state[1].flags & DECL_ALLOW_ASSIGN))\n          return unexpected(\"`=` is not allowed here.\");\n\n        tokens.shift();\n\n        state.unshift(expr(\",\", \";\"));\n        return;\n      } else if (token.data === \"[\") {\n        state.unshift(quantifier());\n        return;\n      }\n    }\n    return state.shift();\n  }\n\n  function parse_keyword_or_ident() {\n    if (token.type === \"keyword\") {\n      state[0].type = \"keyword\";\n      state[0].mode = KEYWORD;\n      return;\n    }\n\n    if (token.type === \"ident\") {\n      state[0].type = \"ident\";\n      state[0].mode = IDENT;\n      return;\n    }\n\n    return unexpected(\n      \"expected keyword or user-defined name, got \" + token.data\n    );\n  }\n\n  function parse_keyword() {\n    if (token.type !== \"keyword\") {\n      return unexpected(\"expected keyword, got \" + token.data);\n    }\n\n    return state.shift(), tokens.shift();\n  }\n\n  function parse_ident() {\n    if (token.type !== \"ident\" && token.type !== \"builtin\") {\n      return unexpected(\"expected user-defined name, got \" + token.data);\n    }\n\n    state[0].data = token.data;\n    return state.shift(), tokens.shift();\n  }\n\n  function parse_expr() {\n    const expecting = state[0].expecting;\n\n    state[0].tokens = state[0].tokens || [];\n\n    if (state[0].parenlevel === undefined) {\n      state[0].parenlevel = 0;\n      state[0].bracelevel = 0;\n    }\n    if (state[0].parenlevel < 1 && expecting.indexOf(token.data) > -1) {\n      return parseexpr(state[0].tokens);\n    }\n    if (token.data === \"(\") {\n      ++state[0].parenlevel;\n    } else if (token.data === \")\") {\n      --state[0].parenlevel;\n    }\n\n    switch (token.data) {\n      case \"{\":\n        ++state[0].bracelevel;\n        break;\n      case \"}\":\n        --state[0].bracelevel;\n        break;\n      case \"(\":\n        ++state[0].parenlevel;\n        break;\n      case \")\":\n        --state[0].parenlevel;\n        break;\n    }\n\n    if (state[0].parenlevel < 0) return unexpected(\"unexpected `)`\");\n    if (state[0].bracelevel < 0) return unexpected(\"unexpected `}`\");\n\n    state[0].tokens.push(tokens.shift());\n    return;\n\n    function parseexpr(tokens) {\n      try {\n        full_parse_expr(state, tokens);\n      } catch (err) {\n        errored = true;\n        throw err;\n      }\n\n      return state.shift();\n    }\n  }\n\n  // node types ---------------\n\n  function n(type) {\n    // this is a function factory that suffices for most kinds of expressions and statements\n    return function () {\n      return mknode(type, token);\n    };\n  }\n\n  function adhoc() {\n    return mknode(token_map[token.type], token, node);\n  }\n\n  function decl(flags) {\n    const _ = mknode(DECL, token, node);\n    _.flags = flags;\n\n    return _;\n  }\n\n  function struct(allow_assign, allow_comma) {\n    const _ = mknode(STRUCT, token, node);\n    _.allow_assign = allow_assign === undefined ? true : allow_assign;\n    _.allow_comma = allow_comma === undefined ? true : allow_comma;\n    return _;\n  }\n\n  function expr() {\n    const n = mknode(EXPR, token, node);\n\n    n.expecting = [].slice.call(arguments);\n    return n;\n  }\n\n  function keyword(default_value) {\n    let t = token;\n    if (default_value) {\n      t = { type: \"(implied)\", data: \"(default)\", position: t.position };\n    }\n    return mknode(KEYWORD, t, node);\n  }\n\n  // utils ----------------------------\n\n  function unexpected(str) {\n    errored = true;\n    throw new Error(\n      (str || \"unexpected \" + state) + \" at line \" + state[0].token.line\n    );\n  }\n\n  function assert(type, data) {\n    return (\n      1,\n      assert_null_string_or_array(type, token.type) &&\n        assert_null_string_or_array(data, token.data)\n    );\n  }\n\n  function assert_null_string_or_array(x, y) {\n    switch (typeof x) {\n      case \"string\":\n        if (y !== x) {\n          unexpected(\"expected `\" + x + \"`, got \" + y + \"\\n\" + token.data);\n        }\n        return !errored;\n\n      case \"object\":\n        if (x && x.indexOf(y) === -1) {\n          unexpected(\"expected one of `\" + x.join(\"`, `\") + \"`, got \" + y);\n        }\n        return !errored;\n    }\n    return true;\n  }\n\n  // stative ----------------------------\n\n  function stative() {\n    let steps = [].slice.call(arguments),\n      step,\n      result;\n\n    return function () {\n      const current = state[0];\n\n      current.stage || (current.stage = 0);\n\n      step = steps[current.stage];\n      if (!step) return unexpected(\"parser in undefined state!\");\n\n      result = step();\n\n      if (result === Advance) return ++current.stage;\n      if (result === undefined) return;\n      current.stage = result;\n    };\n  }\n\n  function advance(op, t) {\n    t = t || \"operator\";\n    return function () {\n      if (!assert(t, op)) return;\n\n      const last = tokens.shift(),\n        children = state[0].children,\n        last_node = children[children.length - 1];\n\n      if (last_node && last_node.token && last.preceding) {\n        last_node.token.succeeding = last_node.token.succeeding || [];\n        last_node.token.succeeding = last_node.token.succeeding.concat(\n          last.preceding\n        );\n      }\n      return Advance;\n    };\n  }\n\n  function advance_expr(until) {\n    return function () {\n      state.unshift(expr(until));\n      return Advance;\n    };\n  }\n\n  function advance_ident(declare) {\n    return declare\n      ? function () {\n          const name = token.data;\n          return (\n            assert(\"ident\") &&\n            (state.unshift(ident()), state.scope.define(name), Advance)\n          );\n        }\n      : function () {\n          if (!assert(\"ident\")) return;\n\n          const s = Object.create(state.scope.find(token.data));\n          s.token = token;\n\n          return tokens.shift(), Advance;\n        };\n  }\n\n  function advance_stmtlist() {\n    return function () {\n      const n = stmtlist();\n      n.expecting = \"}\";\n      return state.unshift(n), Advance;\n    };\n  }\n\n  function maybe_stmtlist(skip) {\n    return function () {\n      const current = state[0].stage;\n      if (token.data !== \"{\") {\n        return state.unshift(stmt()), current + skip;\n      }\n      return tokens.shift(), Advance;\n    };\n  }\n\n  function popstmt() {\n    return function () {\n      return state.shift(), state.shift();\n    };\n  }\n\n  function setup_stative_parsers() {\n    // could also be\n    // struct { } decllist\n    parse_struct = stative(\n      advance(\"struct\", \"keyword\"),\n      function () {\n        if (token.data === \"{\") {\n          state.fake(\n            mknode(IDENT, { data: \"\", position: token.position, type: \"ident\" })\n          );\n          return Advance;\n        }\n\n        return advance_ident(true)();\n      },\n      function () {\n        state.scope.enter();\n        return Advance;\n      },\n      advance(\"{\"),\n      function () {\n        if (token.type === \"preprocessor\") {\n          state.fake(adhoc());\n          tokens.shift();\n          return;\n        }\n        if (token.data === \"}\") {\n          state.scope.exit();\n          tokens.shift();\n          return state.shift();\n        }\n        if (token.data === \";\") {\n          tokens.shift();\n          return;\n        }\n        state.unshift(decl(DECL_STRUCT));\n      }\n    );\n\n    parse_precision = stative(\n      function () {\n        return tokens.shift(), Advance;\n      },\n      function () {\n        return (\n          assert(\"keyword\", [\"lowp\", \"mediump\", \"highp\"]) &&\n          (state.unshift(keyword()), Advance)\n        );\n      },\n      function () {\n        return state.unshift(keyword()), Advance;\n      },\n      function () {\n        return state.shift();\n      }\n    );\n\n    parse_quantifier = stative(\n      advance(\"[\"),\n      advance_expr(\"]\"),\n      advance(\"]\"),\n      function () {\n        return state.shift();\n      }\n    );\n\n    parse_forloop = stative(\n      advance(\"for\", \"keyword\"),\n      advance(\"(\"),\n      function () {\n        let lookup;\n        if (token.type === \"ident\") {\n          if (!(lookup = state.scope.find(token.data))) {\n            lookup = state.create_node();\n          }\n\n          if (lookup.parent.type === \"struct\") {\n            return state.unshift(decl(DECL_STATEMENT)), Advance;\n          }\n        } else if (token.type === \"builtin\" || token.type === \"keyword\") {\n          return state.unshift(decl(DECL_STATEMENT)), Advance;\n        }\n        return advance_expr(\";\")();\n      },\n      advance(\";\"),\n      advance_expr(\";\"),\n      advance(\";\"),\n      advance_expr(\")\"),\n      advance(\")\"),\n      maybe_stmtlist(3),\n      advance_stmtlist(),\n      advance(\"}\"),\n      popstmt()\n    );\n\n    parse_if = stative(\n      advance(\"if\", \"keyword\"),\n      advance(\"(\"),\n      advance_expr(\")\"),\n      advance(\")\"),\n      maybe_stmtlist(3),\n      advance_stmtlist(),\n      advance(\"}\"),\n      function () {\n        if (token.data === \"else\") {\n          return tokens.shift(), state.unshift(stmt()), Advance;\n        }\n        return popstmt()();\n      },\n      popstmt()\n    );\n\n    parse_return = stative(\n      advance(\"return\", \"keyword\"),\n      function () {\n        if (token.data === \";\") return Advance;\n        return state.unshift(expr(\";\")), Advance;\n      },\n      function () {\n        tokens.shift(), popstmt()();\n      }\n    );\n\n    parse_whileloop = stative(\n      advance(\"while\", \"keyword\"),\n      advance(\"(\"),\n      advance_expr(\")\"),\n      advance(\")\"),\n      maybe_stmtlist(3),\n      advance_stmtlist(),\n      advance(\"}\"),\n      popstmt()\n    );\n\n    parse_dowhileloop = stative(\n      advance(\"do\", \"keyword\"),\n      maybe_stmtlist(3),\n      advance_stmtlist(),\n      advance(\"}\"),\n      advance(\"while\", \"keyword\"),\n      advance(\"(\"),\n      advance_expr(\")\"),\n      advance(\")\"),\n      popstmt()\n    );\n\n    parse_function = stative(\n      function () {\n        for (let i = 1, len = state.length; i < len; ++i)\n          if (state[i].mode === FUNCTION) {\n            return unexpected(\n              \"function definition is not allowed within another function\"\n            );\n          }\n\n        return Advance;\n      },\n      function () {\n        if (!assert(\"ident\")) return;\n\n        const name = token.data,\n          lookup = state.scope.find(name);\n\n        state.unshift(ident());\n        state.scope.define(name);\n\n        state.scope.enter(lookup ? lookup.scope : null);\n        return Advance;\n      },\n      advance(\"(\"),\n      function () {\n        return state.unshift(fnargs()), Advance;\n      },\n      advance(\")\"),\n      function () {\n        // forward decl\n        if (token.data === \";\") {\n          return state.scope.exit(), state.shift(), state.shift();\n        }\n        return Advance;\n      },\n      advance(\"{\"),\n      advance_stmtlist(),\n      advance(\"}\"),\n      function () {\n        state.scope.exit();\n        return Advance;\n      },\n      function () {\n        return state.shift(), state.shift(), state.shift();\n      }\n    );\n\n    parse_function_args = stative(\n      function () {\n        if (token.data === \"void\") {\n          state.fake(keyword());\n          tokens.shift();\n          return Advance;\n        }\n        if (token.data === \")\") {\n          state.shift();\n          return;\n        }\n        if (token.data === \"struct\") {\n          state.unshift(struct(NO_ASSIGN_ALLOWED, NO_COMMA_ALLOWED));\n          return Advance;\n        }\n        state.unshift(decl(DECL_FUNCTION));\n        return Advance;\n      },\n      function () {\n        if (token.data === \",\") {\n          tokens.shift();\n          return 0;\n        }\n        if (token.data === \")\") {\n          state.shift();\n          return;\n        }\n        unexpected(\"expected one of `,` or `)`, got \" + token.data);\n      }\n    );\n  }\n}\n\nfunction mknode(mode, sourcetoken) {\n  return {\n    mode: mode,\n    token: sourcetoken,\n    children: [],\n    type: stmt_type[mode],\n    id: (Math.random() * 0xffffffff).toString(16),\n  };\n}\n\nfunction is_storage(token) {\n  return (\n    token.data === \"const\" ||\n    token.data === \"attribute\" ||\n    token.data === \"uniform\" ||\n    token.data === \"varying\"\n  );\n}\n\nfunction is_parameter(token) {\n  return token.data === \"in\" || token.data === \"inout\" || token.data === \"out\";\n}\n\nfunction is_precision(token) {\n  return (\n    token.data === \"highp\" || token.data === \"mediump\" || token.data === \"lowp\"\n  );\n}\n","module.exports = scope;\n\nfunction scope(state) {\n  if (this.constructor !== scope) return new scope(state);\n\n  this.state = state;\n  this.scopes = [];\n  this.current = null;\n}\n\nconst cons = scope,\n  proto = cons.prototype;\n\nproto.enter = function (s) {\n  this.scopes.push((this.current = this.state[0].scope = s || {}));\n};\n\nproto.exit = function () {\n  this.scopes.pop();\n  this.current = this.scopes[this.scopes.length - 1];\n};\n\nproto.define = function (str) {\n  this.current[str] = this.state[0];\n};\n\nproto.find = function (name, fail) {\n  for (let i = this.scopes.length - 1; i > -1; --i) {\n    if (this.scopes[i].hasOwnProperty(name)) {\n      return this.scopes[i][name];\n    }\n  }\n\n  return null;\n};\n","module.exports = {\n\ttrueFunc: function trueFunc(){\n\t\treturn true;\n\t},\n\tfalseFunc: function falseFunc(){\n\t\treturn false;\n\t}\n};","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.attributeRules = void 0;\nvar boolbase_1 = require(\"boolbase\");\n/**\n * All reserved characters in a regex, used for escaping.\n *\n * Taken from XRegExp, (c) 2007-2020 Steven Levithan under the MIT license\n * https://github.com/slevithan/xregexp/blob/95eeebeb8fac8754d54eafe2b4743661ac1cf028/src/xregexp.js#L794\n */\nvar reChars = /[-[\\]{}()*+?.,\\\\^$|#\\s]/g;\nfunction escapeRegex(value) {\n    return value.replace(reChars, \"\\\\$&\");\n}\n/**\n * Attribute selectors\n */\nexports.attributeRules = {\n    equals: function (next, data, _a) {\n        var adapter = _a.adapter;\n        var name = data.name;\n        var value = data.value;\n        if (data.ignoreCase) {\n            value = value.toLowerCase();\n            return function (elem) {\n                var attr = adapter.getAttributeValue(elem, name);\n                return (attr != null &&\n                    attr.length === value.length &&\n                    attr.toLowerCase() === value &&\n                    next(elem));\n            };\n        }\n        return function (elem) {\n            return adapter.getAttributeValue(elem, name) === value && next(elem);\n        };\n    },\n    hyphen: function (next, data, _a) {\n        var adapter = _a.adapter;\n        var name = data.name;\n        var value = data.value;\n        var len = value.length;\n        if (data.ignoreCase) {\n            value = value.toLowerCase();\n            return function hyphenIC(elem) {\n                var attr = adapter.getAttributeValue(elem, name);\n                return (attr != null &&\n                    (attr.length === len || attr.charAt(len) === \"-\") &&\n                    attr.substr(0, len).toLowerCase() === value &&\n                    next(elem));\n            };\n        }\n        return function hyphen(elem) {\n            var attr = adapter.getAttributeValue(elem, name);\n            return (attr != null &&\n                (attr.length === len || attr.charAt(len) === \"-\") &&\n                attr.substr(0, len) === value &&\n                next(elem));\n        };\n    },\n    element: function (next, _a, _b) {\n        var name = _a.name, value = _a.value, ignoreCase = _a.ignoreCase;\n        var adapter = _b.adapter;\n        if (/\\s/.test(value)) {\n            return boolbase_1.falseFunc;\n        }\n        var regex = new RegExp(\"(?:^|\\\\s)\".concat(escapeRegex(value), \"(?:$|\\\\s)\"), ignoreCase ? \"i\" : \"\");\n        return function element(elem) {\n            var attr = adapter.getAttributeValue(elem, name);\n            return (attr != null &&\n                attr.length >= value.length &&\n                regex.test(attr) &&\n                next(elem));\n        };\n    },\n    exists: function (next, _a, _b) {\n        var name = _a.name;\n        var adapter = _b.adapter;\n        return function (elem) { return adapter.hasAttrib(elem, name) && next(elem); };\n    },\n    start: function (next, data, _a) {\n        var adapter = _a.adapter;\n        var name = data.name;\n        var value = data.value;\n        var len = value.length;\n        if (len === 0) {\n            return boolbase_1.falseFunc;\n        }\n        if (data.ignoreCase) {\n            value = value.toLowerCase();\n            return function (elem) {\n                var attr = adapter.getAttributeValue(elem, name);\n                return (attr != null &&\n                    attr.length >= len &&\n                    attr.substr(0, len).toLowerCase() === value &&\n                    next(elem));\n            };\n        }\n        return function (elem) {\n            var _a;\n            return !!((_a = adapter.getAttributeValue(elem, name)) === null || _a === void 0 ? void 0 : _a.startsWith(value)) &&\n                next(elem);\n        };\n    },\n    end: function (next, data, _a) {\n        var adapter = _a.adapter;\n        var name = data.name;\n        var value = data.value;\n        var len = -value.length;\n        if (len === 0) {\n            return boolbase_1.falseFunc;\n        }\n        if (data.ignoreCase) {\n            value = value.toLowerCase();\n            return function (elem) {\n                var _a;\n                return ((_a = adapter\n                    .getAttributeValue(elem, name)) === null || _a === void 0 ? void 0 : _a.substr(len).toLowerCase()) === value && next(elem);\n            };\n        }\n        return function (elem) {\n            var _a;\n            return !!((_a = adapter.getAttributeValue(elem, name)) === null || _a === void 0 ? void 0 : _a.endsWith(value)) &&\n                next(elem);\n        };\n    },\n    any: function (next, data, _a) {\n        var adapter = _a.adapter;\n        var name = data.name, value = data.value;\n        if (value === \"\") {\n            return boolbase_1.falseFunc;\n        }\n        if (data.ignoreCase) {\n            var regex_1 = new RegExp(escapeRegex(value), \"i\");\n            return function anyIC(elem) {\n                var attr = adapter.getAttributeValue(elem, name);\n                return (attr != null &&\n                    attr.length >= value.length &&\n                    regex_1.test(attr) &&\n                    next(elem));\n            };\n        }\n        return function (elem) {\n            var _a;\n            return !!((_a = adapter.getAttributeValue(elem, name)) === null || _a === void 0 ? void 0 : _a.includes(value)) &&\n                next(elem);\n        };\n    },\n    not: function (next, data, _a) {\n        var adapter = _a.adapter;\n        var name = data.name;\n        var value = data.value;\n        if (value === \"\") {\n            return function (elem) {\n                return !!adapter.getAttributeValue(elem, name) && next(elem);\n            };\n        }\n        else if (data.ignoreCase) {\n            value = value.toLowerCase();\n            return function (elem) {\n                var attr = adapter.getAttributeValue(elem, name);\n                return ((attr == null ||\n                    attr.length !== value.length ||\n                    attr.toLowerCase() !== value) &&\n                    next(elem));\n            };\n        }\n        return function (elem) {\n            return adapter.getAttributeValue(elem, name) !== value && next(elem);\n        };\n    },\n};\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.compileToken = exports.compileUnsafe = exports.compile = void 0;\nvar css_what_1 = require(\"css-what\");\nvar boolbase_1 = require(\"boolbase\");\nvar sort_1 = __importDefault(require(\"./sort\"));\nvar procedure_1 = require(\"./procedure\");\nvar general_1 = require(\"./general\");\nvar subselects_1 = require(\"./pseudo-selectors/subselects\");\n/**\n * Compiles a selector to an executable function.\n *\n * @param selector Selector to compile.\n * @param options Compilation options.\n * @param context Optional context for the selector.\n */\nfunction compile(selector, options, context) {\n    var next = compileUnsafe(selector, options, context);\n    return (0, subselects_1.ensureIsTag)(next, options.adapter);\n}\nexports.compile = compile;\nfunction compileUnsafe(selector, options, context) {\n    var token = typeof selector === \"string\" ? (0, css_what_1.parse)(selector, options) : selector;\n    return compileToken(token, options, context);\n}\nexports.compileUnsafe = compileUnsafe;\nfunction includesScopePseudo(t) {\n    return (t.type === \"pseudo\" &&\n        (t.name === \"scope\" ||\n            (Array.isArray(t.data) &&\n                t.data.some(function (data) { return data.some(includesScopePseudo); }))));\n}\nvar DESCENDANT_TOKEN = { type: \"descendant\" };\nvar FLEXIBLE_DESCENDANT_TOKEN = {\n    type: \"_flexibleDescendant\",\n};\nvar SCOPE_TOKEN = { type: \"pseudo\", name: \"scope\", data: null };\n/*\n * CSS 4 Spec (Draft): 3.3.1. Absolutizing a Scope-relative Selector\n * http://www.w3.org/TR/selectors4/#absolutizing\n */\nfunction absolutize(token, _a, context) {\n    var adapter = _a.adapter;\n    // TODO Use better check if the context is a document\n    var hasContext = !!(context === null || context === void 0 ? void 0 : context.every(function (e) {\n        var parent = adapter.isTag(e) && adapter.getParent(e);\n        return e === subselects_1.PLACEHOLDER_ELEMENT || (parent && adapter.isTag(parent));\n    }));\n    for (var _i = 0, token_1 = token; _i < token_1.length; _i++) {\n        var t = token_1[_i];\n        if (t.length > 0 && (0, procedure_1.isTraversal)(t[0]) && t[0].type !== \"descendant\") {\n            // Don't continue in else branch\n        }\n        else if (hasContext && !t.some(includesScopePseudo)) {\n            t.unshift(DESCENDANT_TOKEN);\n        }\n        else {\n            continue;\n        }\n        t.unshift(SCOPE_TOKEN);\n    }\n}\nfunction compileToken(token, options, context) {\n    var _a;\n    token = token.filter(function (t) { return t.length > 0; });\n    token.forEach(sort_1.default);\n    context = (_a = options.context) !== null && _a !== void 0 ? _a : context;\n    var isArrayContext = Array.isArray(context);\n    var finalContext = context && (Array.isArray(context) ? context : [context]);\n    absolutize(token, options, finalContext);\n    var shouldTestNextSiblings = false;\n    var query = token\n        .map(function (rules) {\n        if (rules.length >= 2) {\n            var first = rules[0], second = rules[1];\n            if (first.type !== \"pseudo\" || first.name !== \"scope\") {\n                // Ignore\n            }\n            else if (isArrayContext && second.type === \"descendant\") {\n                rules[1] = FLEXIBLE_DESCENDANT_TOKEN;\n            }\n            else if (second.type === \"adjacent\" ||\n                second.type === \"sibling\") {\n                shouldTestNextSiblings = true;\n            }\n        }\n        return compileRules(rules, options, finalContext);\n    })\n        .reduce(reduceRules, boolbase_1.falseFunc);\n    query.shouldTestNextSiblings = shouldTestNextSiblings;\n    return query;\n}\nexports.compileToken = compileToken;\nfunction compileRules(rules, options, context) {\n    var _a;\n    return rules.reduce(function (previous, rule) {\n        return previous === boolbase_1.falseFunc\n            ? boolbase_1.falseFunc\n            : (0, general_1.compileGeneralSelector)(previous, rule, options, context, compileToken);\n    }, (_a = options.rootFunc) !== null && _a !== void 0 ? _a : boolbase_1.trueFunc);\n}\nfunction reduceRules(a, b) {\n    if (b === boolbase_1.falseFunc || a === boolbase_1.trueFunc) {\n        return a;\n    }\n    if (a === boolbase_1.falseFunc || b === boolbase_1.trueFunc) {\n        return b;\n    }\n    return function combine(elem) {\n        return a(elem) || b(elem);\n    };\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.compileGeneralSelector = void 0;\nvar attributes_1 = require(\"./attributes\");\nvar pseudo_selectors_1 = require(\"./pseudo-selectors\");\n/*\n * All available rules\n */\nfunction compileGeneralSelector(next, selector, options, context, compileToken) {\n    var adapter = options.adapter, equals = options.equals;\n    switch (selector.type) {\n        case \"pseudo-element\":\n            throw new Error(\"Pseudo-elements are not supported by css-select\");\n        case \"attribute\":\n            return attributes_1.attributeRules[selector.action](next, selector, options);\n        case \"pseudo\":\n            return (0, pseudo_selectors_1.compilePseudoSelector)(next, selector, options, context, compileToken);\n        // Tags\n        case \"tag\":\n            return function tag(elem) {\n                return adapter.getName(elem) === selector.name && next(elem);\n            };\n        // Traversal\n        case \"descendant\":\n            if (options.cacheResults === false ||\n                typeof WeakSet === \"undefined\") {\n                return function descendant(elem) {\n                    var current = elem;\n                    while ((current = adapter.getParent(current))) {\n                        if (adapter.isTag(current) && next(current)) {\n                            return true;\n                        }\n                    }\n                    return false;\n                };\n            }\n            // @ts-expect-error `ElementNode` is not extending object\n            // eslint-disable-next-line no-case-declarations\n            var isFalseCache_1 = new WeakSet();\n            return function cachedDescendant(elem) {\n                var current = elem;\n                while ((current = adapter.getParent(current))) {\n                    if (!isFalseCache_1.has(current)) {\n                        if (adapter.isTag(current) && next(current)) {\n                            return true;\n                        }\n                        isFalseCache_1.add(current);\n                    }\n                }\n                return false;\n            };\n        case \"_flexibleDescendant\":\n            // Include element itself, only used while querying an array\n            return function flexibleDescendant(elem) {\n                var current = elem;\n                do {\n                    if (adapter.isTag(current) && next(current))\n                        return true;\n                } while ((current = adapter.getParent(current)));\n                return false;\n            };\n        case \"parent\":\n            return function parent(elem) {\n                return adapter\n                    .getChildren(elem)\n                    .some(function (elem) { return adapter.isTag(elem) && next(elem); });\n            };\n        case \"child\":\n            return function child(elem) {\n                var parent = adapter.getParent(elem);\n                return parent != null && adapter.isTag(parent) && next(parent);\n            };\n        case \"sibling\":\n            return function sibling(elem) {\n                var siblings = adapter.getSiblings(elem);\n                for (var i = 0; i < siblings.length; i++) {\n                    var currentSibling = siblings[i];\n                    if (equals(elem, currentSibling))\n                        break;\n                    if (adapter.isTag(currentSibling) && next(currentSibling)) {\n                        return true;\n                    }\n                }\n                return false;\n            };\n        case \"adjacent\":\n            return function adjacent(elem) {\n                var siblings = adapter.getSiblings(elem);\n                var lastElement;\n                for (var i = 0; i < siblings.length; i++) {\n                    var currentSibling = siblings[i];\n                    if (equals(elem, currentSibling))\n                        break;\n                    if (adapter.isTag(currentSibling)) {\n                        lastElement = currentSibling;\n                    }\n                }\n                return !!lastElement && next(lastElement);\n            };\n        case \"universal\":\n            return next;\n    }\n}\nexports.compileGeneralSelector = compileGeneralSelector;\n","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n    if (k2 === undefined) k2 = k;\n    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n    if (k2 === undefined) k2 = k;\n    o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n    Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n    o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n    if (mod && mod.__esModule) return mod;\n    var result = {};\n    if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n    __setModuleDefault(result, mod);\n    return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.aliases = exports.pseudos = exports.filters = exports.is = exports.selectOne = exports.selectAll = exports.prepareContext = exports._compileToken = exports._compileUnsafe = exports.compile = void 0;\nvar DomUtils = __importStar(require(\"domutils\"));\nvar boolbase_1 = require(\"boolbase\");\nvar compile_1 = require(\"./compile\");\nvar subselects_1 = require(\"./pseudo-selectors/subselects\");\nvar defaultEquals = function (a, b) { return a === b; };\nvar defaultOptions = {\n    adapter: DomUtils,\n    equals: defaultEquals,\n};\nfunction convertOptionFormats(options) {\n    var _a, _b, _c, _d;\n    /*\n     * We force one format of options to the other one.\n     */\n    // @ts-expect-error Default options may have incompatible `Node` / `ElementNode`.\n    var opts = options !== null && options !== void 0 ? options : defaultOptions;\n    // @ts-expect-error Same as above.\n    (_a = opts.adapter) !== null && _a !== void 0 ? _a : (opts.adapter = DomUtils);\n    // @ts-expect-error `equals` does not exist on `Options`\n    (_b = opts.equals) !== null && _b !== void 0 ? _b : (opts.equals = (_d = (_c = opts.adapter) === null || _c === void 0 ? void 0 : _c.equals) !== null && _d !== void 0 ? _d : defaultEquals);\n    return opts;\n}\nfunction wrapCompile(func) {\n    return function addAdapter(selector, options, context) {\n        var opts = convertOptionFormats(options);\n        return func(selector, opts, context);\n    };\n}\n/**\n * Compiles the query, returns a function.\n */\nexports.compile = wrapCompile(compile_1.compile);\nexports._compileUnsafe = wrapCompile(compile_1.compileUnsafe);\nexports._compileToken = wrapCompile(compile_1.compileToken);\nfunction getSelectorFunc(searchFunc) {\n    return function select(query, elements, options) {\n        var opts = convertOptionFormats(options);\n        if (typeof query !== \"function\") {\n            query = (0, compile_1.compileUnsafe)(query, opts, elements);\n        }\n        var filteredElements = prepareContext(elements, opts.adapter, query.shouldTestNextSiblings);\n        return searchFunc(query, filteredElements, opts);\n    };\n}\nfunction prepareContext(elems, adapter, shouldTestNextSiblings) {\n    if (shouldTestNextSiblings === void 0) { shouldTestNextSiblings = false; }\n    /*\n     * Add siblings if the query requires them.\n     * See https://github.com/fb55/css-select/pull/43#issuecomment-225414692\n     */\n    if (shouldTestNextSiblings) {\n        elems = appendNextSiblings(elems, adapter);\n    }\n    return Array.isArray(elems)\n        ? adapter.removeSubsets(elems)\n        : adapter.getChildren(elems);\n}\nexports.prepareContext = prepareContext;\nfunction appendNextSiblings(elem, adapter) {\n    // Order matters because jQuery seems to check the children before the siblings\n    var elems = Array.isArray(elem) ? elem.slice(0) : [elem];\n    var elemsLength = elems.length;\n    for (var i = 0; i < elemsLength; i++) {\n        var nextSiblings = (0, subselects_1.getNextSiblings)(elems[i], adapter);\n        elems.push.apply(elems, nextSiblings);\n    }\n    return elems;\n}\n/**\n * @template Node The generic Node type for the DOM adapter being used.\n * @template ElementNode The Node type for elements for the DOM adapter being used.\n * @param elems Elements to query. If it is an element, its children will be queried..\n * @param query can be either a CSS selector string or a compiled query function.\n * @param [options] options for querying the document.\n * @see compile for supported selector queries.\n * @returns All matching elements.\n *\n */\nexports.selectAll = getSelectorFunc(function (query, elems, options) {\n    return query === boolbase_1.falseFunc || !elems || elems.length === 0\n        ? []\n        : options.adapter.findAll(query, elems);\n});\n/**\n * @template Node The generic Node type for the DOM adapter being used.\n * @template ElementNode The Node type for elements for the DOM adapter being used.\n * @param elems Elements to query. If it is an element, its children will be queried..\n * @param query can be either a CSS selector string or a compiled query function.\n * @param [options] options for querying the document.\n * @see compile for supported selector queries.\n * @returns the first match, or null if there was no match.\n */\nexports.selectOne = getSelectorFunc(function (query, elems, options) {\n    return query === boolbase_1.falseFunc || !elems || elems.length === 0\n        ? null\n        : options.adapter.findOne(query, elems);\n});\n/**\n * Tests whether or not an element is matched by query.\n *\n * @template Node The generic Node type for the DOM adapter being used.\n * @template ElementNode The Node type for elements for the DOM adapter being used.\n * @param elem The element to test if it matches the query.\n * @param query can be either a CSS selector string or a compiled query function.\n * @param [options] options for querying the document.\n * @see compile for supported selector queries.\n * @returns\n */\nfunction is(elem, query, options) {\n    var opts = convertOptionFormats(options);\n    return (typeof query === \"function\" ? query : (0, compile_1.compile)(query, opts))(elem);\n}\nexports.is = is;\n/**\n * Alias for selectAll(query, elems, options).\n * @see [compile] for supported selector queries.\n */\nexports.default = exports.selectAll;\n// Export filters, pseudos and aliases to allow users to supply their own.\nvar pseudo_selectors_1 = require(\"./pseudo-selectors\");\nObject.defineProperty(exports, \"filters\", { enumerable: true, get: function () { return pseudo_selectors_1.filters; } });\nObject.defineProperty(exports, \"pseudos\", { enumerable: true, get: function () { return pseudo_selectors_1.pseudos; } });\nObject.defineProperty(exports, \"aliases\", { enumerable: true, get: function () { return pseudo_selectors_1.aliases; } });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isTraversal = exports.procedure = void 0;\nexports.procedure = {\n    universal: 50,\n    tag: 30,\n    attribute: 1,\n    pseudo: 0,\n    \"pseudo-element\": 0,\n    descendant: -1,\n    child: -1,\n    parent: -1,\n    sibling: -1,\n    adjacent: -1,\n    _flexibleDescendant: -1,\n};\nfunction isTraversal(t) {\n    return exports.procedure[t.type] < 0;\n}\nexports.isTraversal = isTraversal;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.aliases = void 0;\n/**\n * Aliases are pseudos that are expressed as selectors.\n */\nexports.aliases = {\n    // Links\n    \"any-link\": \":is(a, area, link)[href]\",\n    link: \":any-link:not(:visited)\",\n    // Forms\n    // https://html.spec.whatwg.org/multipage/scripting.html#disabled-elements\n    disabled: \":is(\\n        :is(button, input, select, textarea, optgroup, option)[disabled],\\n        optgroup[disabled] > option,\\n        fieldset[disabled]:not(fieldset[disabled] legend:first-of-type *)\\n    )\",\n    enabled: \":not(:disabled)\",\n    checked: \":is(:is(input[type=radio], input[type=checkbox])[checked], option:selected)\",\n    required: \":is(input, select, textarea)[required]\",\n    optional: \":is(input, select, textarea):not([required])\",\n    // JQuery extensions\n    // https://html.spec.whatwg.org/multipage/form-elements.html#concept-option-selectedness\n    selected: \"option:is([selected], select:not([multiple]):not(:has(> option[selected])) > :first-of-type)\",\n    checkbox: \"[type=checkbox]\",\n    file: \"[type=file]\",\n    password: \"[type=password]\",\n    radio: \"[type=radio]\",\n    reset: \"[type=reset]\",\n    image: \"[type=image]\",\n    submit: \"[type=submit]\",\n    parent: \":not(:empty)\",\n    header: \":is(h1, h2, h3, h4, h5, h6)\",\n    button: \":is(button, input[type=button])\",\n    input: \":is(input, textarea, select, button)\",\n    text: \"input:is(:not([type!='']), [type=text])\",\n};\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.filters = void 0;\nvar nth_check_1 = __importDefault(require(\"nth-check\"));\nvar boolbase_1 = require(\"boolbase\");\nfunction getChildFunc(next, adapter) {\n    return function (elem) {\n        var parent = adapter.getParent(elem);\n        return parent != null && adapter.isTag(parent) && next(elem);\n    };\n}\nexports.filters = {\n    contains: function (next, text, _a) {\n        var adapter = _a.adapter;\n        return function contains(elem) {\n            return next(elem) && adapter.getText(elem).includes(text);\n        };\n    },\n    icontains: function (next, text, _a) {\n        var adapter = _a.adapter;\n        var itext = text.toLowerCase();\n        return function icontains(elem) {\n            return (next(elem) &&\n                adapter.getText(elem).toLowerCase().includes(itext));\n        };\n    },\n    // Location specific methods\n    \"nth-child\": function (next, rule, _a) {\n        var adapter = _a.adapter, equals = _a.equals;\n        var func = (0, nth_check_1.default)(rule);\n        if (func === boolbase_1.falseFunc)\n            return boolbase_1.falseFunc;\n        if (func === boolbase_1.trueFunc)\n            return getChildFunc(next, adapter);\n        return function nthChild(elem) {\n            var siblings = adapter.getSiblings(elem);\n            var pos = 0;\n            for (var i = 0; i < siblings.length; i++) {\n                if (equals(elem, siblings[i]))\n                    break;\n                if (adapter.isTag(siblings[i])) {\n                    pos++;\n                }\n            }\n            return func(pos) && next(elem);\n        };\n    },\n    \"nth-last-child\": function (next, rule, _a) {\n        var adapter = _a.adapter, equals = _a.equals;\n        var func = (0, nth_check_1.default)(rule);\n        if (func === boolbase_1.falseFunc)\n            return boolbase_1.falseFunc;\n        if (func === boolbase_1.trueFunc)\n            return getChildFunc(next, adapter);\n        return function nthLastChild(elem) {\n            var siblings = adapter.getSiblings(elem);\n            var pos = 0;\n            for (var i = siblings.length - 1; i >= 0; i--) {\n                if (equals(elem, siblings[i]))\n                    break;\n                if (adapter.isTag(siblings[i])) {\n                    pos++;\n                }\n            }\n            return func(pos) && next(elem);\n        };\n    },\n    \"nth-of-type\": function (next, rule, _a) {\n        var adapter = _a.adapter, equals = _a.equals;\n        var func = (0, nth_check_1.default)(rule);\n        if (func === boolbase_1.falseFunc)\n            return boolbase_1.falseFunc;\n        if (func === boolbase_1.trueFunc)\n            return getChildFunc(next, adapter);\n        return function nthOfType(elem) {\n            var siblings = adapter.getSiblings(elem);\n            var pos = 0;\n            for (var i = 0; i < siblings.length; i++) {\n                var currentSibling = siblings[i];\n                if (equals(elem, currentSibling))\n                    break;\n                if (adapter.isTag(currentSibling) &&\n                    adapter.getName(currentSibling) === adapter.getName(elem)) {\n                    pos++;\n                }\n            }\n            return func(pos) && next(elem);\n        };\n    },\n    \"nth-last-of-type\": function (next, rule, _a) {\n        var adapter = _a.adapter, equals = _a.equals;\n        var func = (0, nth_check_1.default)(rule);\n        if (func === boolbase_1.falseFunc)\n            return boolbase_1.falseFunc;\n        if (func === boolbase_1.trueFunc)\n            return getChildFunc(next, adapter);\n        return function nthLastOfType(elem) {\n            var siblings = adapter.getSiblings(elem);\n            var pos = 0;\n            for (var i = siblings.length - 1; i >= 0; i--) {\n                var currentSibling = siblings[i];\n                if (equals(elem, currentSibling))\n                    break;\n                if (adapter.isTag(currentSibling) &&\n                    adapter.getName(currentSibling) === adapter.getName(elem)) {\n                    pos++;\n                }\n            }\n            return func(pos) && next(elem);\n        };\n    },\n    // TODO determine the actual root element\n    root: function (next, _rule, _a) {\n        var adapter = _a.adapter;\n        return function (elem) {\n            var parent = adapter.getParent(elem);\n            return (parent == null || !adapter.isTag(parent)) && next(elem);\n        };\n    },\n    scope: function (next, rule, options, context) {\n        var equals = options.equals;\n        if (!context || context.length === 0) {\n            // Equivalent to :root\n            return exports.filters.root(next, rule, options);\n        }\n        if (context.length === 1) {\n            // NOTE: can't be unpacked, as :has uses this for side-effects\n            return function (elem) { return equals(context[0], elem) && next(elem); };\n        }\n        return function (elem) { return context.includes(elem) && next(elem); };\n    },\n    hover: dynamicStatePseudo(\"isHovered\"),\n    visited: dynamicStatePseudo(\"isVisited\"),\n    active: dynamicStatePseudo(\"isActive\"),\n};\n/**\n * Dynamic state pseudos. These depend on optional Adapter methods.\n *\n * @param name The name of the adapter method to call.\n * @returns Pseudo for the `filters` object.\n */\nfunction dynamicStatePseudo(name) {\n    return function dynamicPseudo(next, _rule, _a) {\n        var adapter = _a.adapter;\n        var func = adapter[name];\n        if (typeof func !== \"function\") {\n            return boolbase_1.falseFunc;\n        }\n        return function active(elem) {\n            return func(elem) && next(elem);\n        };\n    };\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.compilePseudoSelector = exports.aliases = exports.pseudos = exports.filters = void 0;\n/*\n * Pseudo selectors\n *\n * Pseudo selectors are available in three forms:\n *\n * 1. Filters are called when the selector is compiled and return a function\n *  that has to return either false, or the results of `next()`.\n * 2. Pseudos are called on execution. They have to return a boolean.\n * 3. Subselects work like filters, but have an embedded selector that will be run separately.\n *\n * Filters are great if you want to do some pre-processing, or change the call order\n * of `next()` and your code.\n * Pseudos should be used to implement simple checks.\n */\nvar boolbase_1 = require(\"boolbase\");\nvar css_what_1 = require(\"css-what\");\nvar filters_1 = require(\"./filters\");\nObject.defineProperty(exports, \"filters\", { enumerable: true, get: function () { return filters_1.filters; } });\nvar pseudos_1 = require(\"./pseudos\");\nObject.defineProperty(exports, \"pseudos\", { enumerable: true, get: function () { return pseudos_1.pseudos; } });\nvar aliases_1 = require(\"./aliases\");\nObject.defineProperty(exports, \"aliases\", { enumerable: true, get: function () { return aliases_1.aliases; } });\nvar subselects_1 = require(\"./subselects\");\nfunction compilePseudoSelector(next, selector, options, context, compileToken) {\n    var name = selector.name, data = selector.data;\n    if (Array.isArray(data)) {\n        return subselects_1.subselects[name](next, data, options, context, compileToken);\n    }\n    if (name in aliases_1.aliases) {\n        if (data != null) {\n            throw new Error(\"Pseudo \".concat(name, \" doesn't have any arguments\"));\n        }\n        // The alias has to be parsed here, to make sure options are respected.\n        var alias = (0, css_what_1.parse)(aliases_1.aliases[name], options);\n        return subselects_1.subselects.is(next, alias, options, context, compileToken);\n    }\n    if (name in filters_1.filters) {\n        return filters_1.filters[name](next, data, options, context);\n    }\n    if (name in pseudos_1.pseudos) {\n        var pseudo_1 = pseudos_1.pseudos[name];\n        (0, pseudos_1.verifyPseudoArgs)(pseudo_1, name, data);\n        return pseudo_1 === boolbase_1.falseFunc\n            ? boolbase_1.falseFunc\n            : next === boolbase_1.trueFunc\n                ? function (elem) { return pseudo_1(elem, options, data); }\n                : function (elem) { return pseudo_1(elem, options, data) && next(elem); };\n    }\n    throw new Error(\"unmatched pseudo-class :\".concat(name));\n}\nexports.compilePseudoSelector = compilePseudoSelector;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.verifyPseudoArgs = exports.pseudos = void 0;\n// While filters are precompiled, pseudos get called when they are needed\nexports.pseudos = {\n    empty: function (elem, _a) {\n        var adapter = _a.adapter;\n        return !adapter.getChildren(elem).some(function (elem) {\n            // FIXME: `getText` call is potentially expensive.\n            return adapter.isTag(elem) || adapter.getText(elem) !== \"\";\n        });\n    },\n    \"first-child\": function (elem, _a) {\n        var adapter = _a.adapter, equals = _a.equals;\n        var firstChild = adapter\n            .getSiblings(elem)\n            .find(function (elem) { return adapter.isTag(elem); });\n        return firstChild != null && equals(elem, firstChild);\n    },\n    \"last-child\": function (elem, _a) {\n        var adapter = _a.adapter, equals = _a.equals;\n        var siblings = adapter.getSiblings(elem);\n        for (var i = siblings.length - 1; i >= 0; i--) {\n            if (equals(elem, siblings[i]))\n                return true;\n            if (adapter.isTag(siblings[i]))\n                break;\n        }\n        return false;\n    },\n    \"first-of-type\": function (elem, _a) {\n        var adapter = _a.adapter, equals = _a.equals;\n        var siblings = adapter.getSiblings(elem);\n        var elemName = adapter.getName(elem);\n        for (var i = 0; i < siblings.length; i++) {\n            var currentSibling = siblings[i];\n            if (equals(elem, currentSibling))\n                return true;\n            if (adapter.isTag(currentSibling) &&\n                adapter.getName(currentSibling) === elemName) {\n                break;\n            }\n        }\n        return false;\n    },\n    \"last-of-type\": function (elem, _a) {\n        var adapter = _a.adapter, equals = _a.equals;\n        var siblings = adapter.getSiblings(elem);\n        var elemName = adapter.getName(elem);\n        for (var i = siblings.length - 1; i >= 0; i--) {\n            var currentSibling = siblings[i];\n            if (equals(elem, currentSibling))\n                return true;\n            if (adapter.isTag(currentSibling) &&\n                adapter.getName(currentSibling) === elemName) {\n                break;\n            }\n        }\n        return false;\n    },\n    \"only-of-type\": function (elem, _a) {\n        var adapter = _a.adapter, equals = _a.equals;\n        var elemName = adapter.getName(elem);\n        return adapter\n            .getSiblings(elem)\n            .every(function (sibling) {\n            return equals(elem, sibling) ||\n                !adapter.isTag(sibling) ||\n                adapter.getName(sibling) !== elemName;\n        });\n    },\n    \"only-child\": function (elem, _a) {\n        var adapter = _a.adapter, equals = _a.equals;\n        return adapter\n            .getSiblings(elem)\n            .every(function (sibling) { return equals(elem, sibling) || !adapter.isTag(sibling); });\n    },\n};\nfunction verifyPseudoArgs(func, name, subselect) {\n    if (subselect === null) {\n        if (func.length > 2) {\n            throw new Error(\"pseudo-selector :\".concat(name, \" requires an argument\"));\n        }\n    }\n    else if (func.length === 2) {\n        throw new Error(\"pseudo-selector :\".concat(name, \" doesn't have any arguments\"));\n    }\n}\nexports.verifyPseudoArgs = verifyPseudoArgs;\n","\"use strict\";\nvar __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {\n    if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n        if (ar || !(i in from)) {\n            if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n            ar[i] = from[i];\n        }\n    }\n    return to.concat(ar || Array.prototype.slice.call(from));\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.subselects = exports.getNextSiblings = exports.ensureIsTag = exports.PLACEHOLDER_ELEMENT = void 0;\nvar boolbase_1 = require(\"boolbase\");\nvar procedure_1 = require(\"../procedure\");\n/** Used as a placeholder for :has. Will be replaced with the actual element. */\nexports.PLACEHOLDER_ELEMENT = {};\nfunction ensureIsTag(next, adapter) {\n    if (next === boolbase_1.falseFunc)\n        return boolbase_1.falseFunc;\n    return function (elem) { return adapter.isTag(elem) && next(elem); };\n}\nexports.ensureIsTag = ensureIsTag;\nfunction getNextSiblings(elem, adapter) {\n    var siblings = adapter.getSiblings(elem);\n    if (siblings.length <= 1)\n        return [];\n    var elemIndex = siblings.indexOf(elem);\n    if (elemIndex < 0 || elemIndex === siblings.length - 1)\n        return [];\n    return siblings.slice(elemIndex + 1).filter(adapter.isTag);\n}\nexports.getNextSiblings = getNextSiblings;\nvar is = function (next, token, options, context, compileToken) {\n    var opts = {\n        xmlMode: !!options.xmlMode,\n        adapter: options.adapter,\n        equals: options.equals,\n    };\n    var func = compileToken(token, opts, context);\n    return function (elem) { return func(elem) && next(elem); };\n};\n/*\n * :not, :has, :is, :matches and :where have to compile selectors\n * doing this in src/pseudos.ts would lead to circular dependencies,\n * so we add them here\n */\nexports.subselects = {\n    is: is,\n    /**\n     * `:matches` and `:where` are aliases for `:is`.\n     */\n    matches: is,\n    where: is,\n    not: function (next, token, options, context, compileToken) {\n        var opts = {\n            xmlMode: !!options.xmlMode,\n            adapter: options.adapter,\n            equals: options.equals,\n        };\n        var func = compileToken(token, opts, context);\n        if (func === boolbase_1.falseFunc)\n            return next;\n        if (func === boolbase_1.trueFunc)\n            return boolbase_1.falseFunc;\n        return function not(elem) {\n            return !func(elem) && next(elem);\n        };\n    },\n    has: function (next, subselect, options, _context, compileToken) {\n        var adapter = options.adapter;\n        var opts = {\n            xmlMode: !!options.xmlMode,\n            adapter: adapter,\n            equals: options.equals,\n        };\n        // @ts-expect-error Uses an array as a pointer to the current element (side effects)\n        var context = subselect.some(function (s) {\n            return s.some(procedure_1.isTraversal);\n        })\n            ? [exports.PLACEHOLDER_ELEMENT]\n            : undefined;\n        var compiled = compileToken(subselect, opts, context);\n        if (compiled === boolbase_1.falseFunc)\n            return boolbase_1.falseFunc;\n        if (compiled === boolbase_1.trueFunc) {\n            return function (elem) {\n                return adapter.getChildren(elem).some(adapter.isTag) && next(elem);\n            };\n        }\n        var hasElement = ensureIsTag(compiled, adapter);\n        var _a = compiled.shouldTestNextSiblings, shouldTestNextSiblings = _a === void 0 ? false : _a;\n        /*\n         * `shouldTestNextSiblings` will only be true if the query starts with\n         * a traversal (sibling or adjacent). That means we will always have a context.\n         */\n        if (context) {\n            return function (elem) {\n                context[0] = elem;\n                var childs = adapter.getChildren(elem);\n                var nextElements = shouldTestNextSiblings\n                    ? __spreadArray(__spreadArray([], childs, true), getNextSiblings(elem, adapter), true) : childs;\n                return (next(elem) && adapter.existsOne(hasElement, nextElements));\n            };\n        }\n        return function (elem) {\n            return next(elem) &&\n                adapter.existsOne(hasElement, adapter.getChildren(elem));\n        };\n    },\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar procedure_1 = require(\"./procedure\");\nvar attributes = {\n    exists: 10,\n    equals: 8,\n    not: 7,\n    start: 6,\n    end: 6,\n    any: 5,\n    hyphen: 4,\n    element: 4,\n};\n/**\n * Sort the parts of the passed selector,\n * as there is potential for optimization\n * (some types of selectors are faster than others)\n *\n * @param arr Selector to sort\n */\nfunction sortByProcedure(arr) {\n    var procs = arr.map(getProcedure);\n    for (var i = 1; i < arr.length; i++) {\n        var procNew = procs[i];\n        if (procNew < 0)\n            continue;\n        for (var j = i - 1; j >= 0 && procNew < procs[j]; j--) {\n            var token = arr[j + 1];\n            arr[j + 1] = arr[j];\n            arr[j] = token;\n            procs[j + 1] = procs[j];\n            procs[j] = procNew;\n        }\n    }\n}\nexports.default = sortByProcedure;\nfunction getProcedure(token) {\n    var proc = procedure_1.procedure[token.type];\n    if (token.type === \"attribute\") {\n        proc = attributes[token.action];\n        if (proc === attributes.equals && token.name === \"id\") {\n            // Prefer ID selectors (eg. #ID)\n            proc = 9;\n        }\n        if (token.ignoreCase) {\n            /*\n             * IgnoreCase adds some overhead, prefer \"normal\" token\n             * this is a binary operation, to ensure it's still an int\n             */\n            proc >>= 1;\n        }\n    }\n    else if (token.type === \"pseudo\") {\n        if (!token.data) {\n            proc = 3;\n        }\n        else if (token.name === \"has\" || token.name === \"contains\") {\n            proc = 0; // Expensive in any case\n        }\n        else if (Array.isArray(token.data)) {\n            // \"matches\" and \"not\"\n            proc = 0;\n            for (var i = 0; i < token.data.length; i++) {\n                // TODO better handling of complex selectors\n                if (token.data[i].length !== 1)\n                    continue;\n                var cur = getProcedure(token.data[i][0]);\n                // Avoid executing :has or :contains\n                if (cur === 0) {\n                    proc = 0;\n                    break;\n                }\n                if (cur > proc)\n                    proc = cur;\n            }\n            if (token.data.length > 1 && proc > 0)\n                proc -= 1;\n        }\n        else {\n            proc = 1;\n        }\n    }\n    return proc;\n}\n","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n    if (k2 === undefined) k2 = k;\n    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n    if (k2 === undefined) k2 = k;\n    o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n    for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.stringify = exports.parse = void 0;\n__exportStar(require(\"./parse\"), exports);\nvar parse_1 = require(\"./parse\");\nObject.defineProperty(exports, \"parse\", { enumerable: true, get: function () { return __importDefault(parse_1).default; } });\nvar stringify_1 = require(\"./stringify\");\nObject.defineProperty(exports, \"stringify\", { enumerable: true, get: function () { return __importDefault(stringify_1).default; } });\n","\"use strict\";\nvar __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {\n    if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n        if (ar || !(i in from)) {\n            if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n            ar[i] = from[i];\n        }\n    }\n    return to.concat(ar || Array.prototype.slice.call(from));\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isTraversal = void 0;\nvar reName = /^[^\\\\#]?(?:\\\\(?:[\\da-f]{1,6}\\s?|.)|[\\w\\-\\u00b0-\\uFFFF])+/;\nvar reEscape = /\\\\([\\da-f]{1,6}\\s?|(\\s)|.)/gi;\nvar actionTypes = new Map([\n    [\"~\", \"element\"],\n    [\"^\", \"start\"],\n    [\"$\", \"end\"],\n    [\"*\", \"any\"],\n    [\"!\", \"not\"],\n    [\"|\", \"hyphen\"],\n]);\nvar Traversals = {\n    \">\": \"child\",\n    \"<\": \"parent\",\n    \"~\": \"sibling\",\n    \"+\": \"adjacent\",\n};\nvar attribSelectors = {\n    \"#\": [\"id\", \"equals\"],\n    \".\": [\"class\", \"element\"],\n};\n// Pseudos, whose data property is parsed as well.\nvar unpackPseudos = new Set([\n    \"has\",\n    \"not\",\n    \"matches\",\n    \"is\",\n    \"where\",\n    \"host\",\n    \"host-context\",\n]);\nvar traversalNames = new Set(__spreadArray([\n    \"descendant\"\n], Object.keys(Traversals).map(function (k) { return Traversals[k]; }), true));\n/**\n * Attributes that are case-insensitive in HTML.\n *\n * @private\n * @see https://html.spec.whatwg.org/multipage/semantics-other.html#case-sensitivity-of-selectors\n */\nvar caseInsensitiveAttributes = new Set([\n    \"accept\",\n    \"accept-charset\",\n    \"align\",\n    \"alink\",\n    \"axis\",\n    \"bgcolor\",\n    \"charset\",\n    \"checked\",\n    \"clear\",\n    \"codetype\",\n    \"color\",\n    \"compact\",\n    \"declare\",\n    \"defer\",\n    \"dir\",\n    \"direction\",\n    \"disabled\",\n    \"enctype\",\n    \"face\",\n    \"frame\",\n    \"hreflang\",\n    \"http-equiv\",\n    \"lang\",\n    \"language\",\n    \"link\",\n    \"media\",\n    \"method\",\n    \"multiple\",\n    \"nohref\",\n    \"noresize\",\n    \"noshade\",\n    \"nowrap\",\n    \"readonly\",\n    \"rel\",\n    \"rev\",\n    \"rules\",\n    \"scope\",\n    \"scrolling\",\n    \"selected\",\n    \"shape\",\n    \"target\",\n    \"text\",\n    \"type\",\n    \"valign\",\n    \"valuetype\",\n    \"vlink\",\n]);\n/**\n * Checks whether a specific selector is a traversal.\n * This is useful eg. in swapping the order of elements that\n * are not traversals.\n *\n * @param selector Selector to check.\n */\nfunction isTraversal(selector) {\n    return traversalNames.has(selector.type);\n}\nexports.isTraversal = isTraversal;\nvar stripQuotesFromPseudos = new Set([\"contains\", \"icontains\"]);\nvar quotes = new Set(['\"', \"'\"]);\n// Unescape function taken from https://github.com/jquery/sizzle/blob/master/src/sizzle.js#L152\nfunction funescape(_, escaped, escapedWhitespace) {\n    var high = parseInt(escaped, 16) - 0x10000;\n    // NaN means non-codepoint\n    return high !== high || escapedWhitespace\n        ? escaped\n        : high < 0\n            ? // BMP codepoint\n                String.fromCharCode(high + 0x10000)\n            : // Supplemental Plane codepoint (surrogate pair)\n                String.fromCharCode((high >> 10) | 0xd800, (high & 0x3ff) | 0xdc00);\n}\nfunction unescapeCSS(str) {\n    return str.replace(reEscape, funescape);\n}\nfunction isWhitespace(c) {\n    return c === \" \" || c === \"\\n\" || c === \"\\t\" || c === \"\\f\" || c === \"\\r\";\n}\n/**\n * Parses `selector`, optionally with the passed `options`.\n *\n * @param selector Selector to parse.\n * @param options Options for parsing.\n * @returns Returns a two-dimensional array.\n * The first dimension represents selectors separated by commas (eg. `sub1, sub2`),\n * the second contains the relevant tokens for that selector.\n */\nfunction parse(selector, options) {\n    var subselects = [];\n    var endIndex = parseSelector(subselects, \"\" + selector, options, 0);\n    if (endIndex < selector.length) {\n        throw new Error(\"Unmatched selector: \" + selector.slice(endIndex));\n    }\n    return subselects;\n}\nexports.default = parse;\nfunction parseSelector(subselects, selector, options, selectorIndex) {\n    var _a, _b;\n    if (options === void 0) { options = {}; }\n    var tokens = [];\n    var sawWS = false;\n    function getName(offset) {\n        var match = selector.slice(selectorIndex + offset).match(reName);\n        if (!match) {\n            throw new Error(\"Expected name, found \" + selector.slice(selectorIndex));\n        }\n        var name = match[0];\n        selectorIndex += offset + name.length;\n        return unescapeCSS(name);\n    }\n    function stripWhitespace(offset) {\n        while (isWhitespace(selector.charAt(selectorIndex + offset)))\n            offset++;\n        selectorIndex += offset;\n    }\n    function isEscaped(pos) {\n        var slashCount = 0;\n        while (selector.charAt(--pos) === \"\\\\\")\n            slashCount++;\n        return (slashCount & 1) === 1;\n    }\n    function ensureNotTraversal() {\n        if (tokens.length > 0 && isTraversal(tokens[tokens.length - 1])) {\n            throw new Error(\"Did not expect successive traversals.\");\n        }\n    }\n    stripWhitespace(0);\n    while (selector !== \"\") {\n        var firstChar = selector.charAt(selectorIndex);\n        if (isWhitespace(firstChar)) {\n            sawWS = true;\n            stripWhitespace(1);\n        }\n        else if (firstChar in Traversals) {\n            ensureNotTraversal();\n            tokens.push({ type: Traversals[firstChar] });\n            sawWS = false;\n            stripWhitespace(1);\n        }\n        else if (firstChar === \",\") {\n            if (tokens.length === 0) {\n                throw new Error(\"Empty sub-selector\");\n            }\n            subselects.push(tokens);\n            tokens = [];\n            sawWS = false;\n            stripWhitespace(1);\n        }\n        else if (selector.startsWith(\"/*\", selectorIndex)) {\n            var endIndex = selector.indexOf(\"*/\", selectorIndex + 2);\n            if (endIndex < 0) {\n                throw new Error(\"Comment was not terminated\");\n            }\n            selectorIndex = endIndex + 2;\n        }\n        else {\n            if (sawWS) {\n                ensureNotTraversal();\n                tokens.push({ type: \"descendant\" });\n                sawWS = false;\n            }\n            if (firstChar in attribSelectors) {\n                var _c = attribSelectors[firstChar], name_1 = _c[0], action = _c[1];\n                tokens.push({\n                    type: \"attribute\",\n                    name: name_1,\n                    action: action,\n                    value: getName(1),\n                    namespace: null,\n                    // TODO: Add quirksMode option, which makes `ignoreCase` `true` for HTML.\n                    ignoreCase: options.xmlMode ? null : false,\n                });\n            }\n            else if (firstChar === \"[\") {\n                stripWhitespace(1);\n                // Determine attribute name and namespace\n                var namespace = null;\n                if (selector.charAt(selectorIndex) === \"|\") {\n                    namespace = \"\";\n                    selectorIndex += 1;\n                }\n                if (selector.startsWith(\"*|\", selectorIndex)) {\n                    namespace = \"*\";\n                    selectorIndex += 2;\n                }\n                var name_2 = getName(0);\n                if (namespace === null &&\n                    selector.charAt(selectorIndex) === \"|\" &&\n                    selector.charAt(selectorIndex + 1) !== \"=\") {\n                    namespace = name_2;\n                    name_2 = getName(1);\n                }\n                if ((_a = options.lowerCaseAttributeNames) !== null && _a !== void 0 ? _a : !options.xmlMode) {\n                    name_2 = name_2.toLowerCase();\n                }\n                stripWhitespace(0);\n                // Determine comparison operation\n                var action = \"exists\";\n                var possibleAction = actionTypes.get(selector.charAt(selectorIndex));\n                if (possibleAction) {\n                    action = possibleAction;\n                    if (selector.charAt(selectorIndex + 1) !== \"=\") {\n                        throw new Error(\"Expected `=`\");\n                    }\n                    stripWhitespace(2);\n                }\n                else if (selector.charAt(selectorIndex) === \"=\") {\n                    action = \"equals\";\n                    stripWhitespace(1);\n                }\n                // Determine value\n                var value = \"\";\n                var ignoreCase = null;\n                if (action !== \"exists\") {\n                    if (quotes.has(selector.charAt(selectorIndex))) {\n                        var quote = selector.charAt(selectorIndex);\n                        var sectionEnd = selectorIndex + 1;\n                        while (sectionEnd < selector.length &&\n                            (selector.charAt(sectionEnd) !== quote ||\n                                isEscaped(sectionEnd))) {\n                            sectionEnd += 1;\n                        }\n                        if (selector.charAt(sectionEnd) !== quote) {\n                            throw new Error(\"Attribute value didn't end\");\n                        }\n                        value = unescapeCSS(selector.slice(selectorIndex + 1, sectionEnd));\n                        selectorIndex = sectionEnd + 1;\n                    }\n                    else {\n                        var valueStart = selectorIndex;\n                        while (selectorIndex < selector.length &&\n                            ((!isWhitespace(selector.charAt(selectorIndex)) &&\n                                selector.charAt(selectorIndex) !== \"]\") ||\n                                isEscaped(selectorIndex))) {\n                            selectorIndex += 1;\n                        }\n                        value = unescapeCSS(selector.slice(valueStart, selectorIndex));\n                    }\n                    stripWhitespace(0);\n                    // See if we have a force ignore flag\n                    var forceIgnore = selector.charAt(selectorIndex);\n                    // If the forceIgnore flag is set (either `i` or `s`), use that value\n                    if (forceIgnore === \"s\" || forceIgnore === \"S\") {\n                        ignoreCase = false;\n                        stripWhitespace(1);\n                    }\n                    else if (forceIgnore === \"i\" || forceIgnore === \"I\") {\n                        ignoreCase = true;\n                        stripWhitespace(1);\n                    }\n                }\n                // If `xmlMode` is set, there are no rules; otherwise, use the `caseInsensitiveAttributes` list.\n                if (!options.xmlMode) {\n                    // TODO: Skip this for `exists`, as there is no value to compare to.\n                    ignoreCase !== null && ignoreCase !== void 0 ? ignoreCase : (ignoreCase = caseInsensitiveAttributes.has(name_2));\n                }\n                if (selector.charAt(selectorIndex) !== \"]\") {\n                    throw new Error(\"Attribute selector didn't terminate\");\n                }\n                selectorIndex += 1;\n                var attributeSelector = {\n                    type: \"attribute\",\n                    name: name_2,\n                    action: action,\n                    value: value,\n                    namespace: namespace,\n                    ignoreCase: ignoreCase,\n                };\n                tokens.push(attributeSelector);\n            }\n            else if (firstChar === \":\") {\n                if (selector.charAt(selectorIndex + 1) === \":\") {\n                    tokens.push({\n                        type: \"pseudo-element\",\n                        name: getName(2).toLowerCase(),\n                    });\n                    continue;\n                }\n                var name_3 = getName(1).toLowerCase();\n                var data = null;\n                if (selector.charAt(selectorIndex) === \"(\") {\n                    if (unpackPseudos.has(name_3)) {\n                        if (quotes.has(selector.charAt(selectorIndex + 1))) {\n                            throw new Error(\"Pseudo-selector \" + name_3 + \" cannot be quoted\");\n                        }\n                        data = [];\n                        selectorIndex = parseSelector(data, selector, options, selectorIndex + 1);\n                        if (selector.charAt(selectorIndex) !== \")\") {\n                            throw new Error(\"Missing closing parenthesis in :\" + name_3 + \" (\" + selector + \")\");\n                        }\n                        selectorIndex += 1;\n                    }\n                    else {\n                        selectorIndex += 1;\n                        var start = selectorIndex;\n                        var counter = 1;\n                        for (; counter > 0 && selectorIndex < selector.length; selectorIndex++) {\n                            if (selector.charAt(selectorIndex) === \"(\" &&\n                                !isEscaped(selectorIndex)) {\n                                counter++;\n                            }\n                            else if (selector.charAt(selectorIndex) === \")\" &&\n                                !isEscaped(selectorIndex)) {\n                                counter--;\n                            }\n                        }\n                        if (counter) {\n                            throw new Error(\"Parenthesis not matched\");\n                        }\n                        data = selector.slice(start, selectorIndex - 1);\n                        if (stripQuotesFromPseudos.has(name_3)) {\n                            var quot = data.charAt(0);\n                            if (quot === data.slice(-1) && quotes.has(quot)) {\n                                data = data.slice(1, -1);\n                            }\n                            data = unescapeCSS(data);\n                        }\n                    }\n                }\n                tokens.push({ type: \"pseudo\", name: name_3, data: data });\n            }\n            else {\n                var namespace = null;\n                var name_4 = void 0;\n                if (firstChar === \"*\") {\n                    selectorIndex += 1;\n                    name_4 = \"*\";\n                }\n                else if (reName.test(selector.slice(selectorIndex))) {\n                    if (selector.charAt(selectorIndex) === \"|\") {\n                        namespace = \"\";\n                        selectorIndex += 1;\n                    }\n                    name_4 = getName(0);\n                }\n                else {\n                    /*\n                     * We have finished parsing the selector.\n                     * Remove descendant tokens at the end if they exist,\n                     * and return the last index, so that parsing can be\n                     * picked up from here.\n                     */\n                    if (tokens.length &&\n                        tokens[tokens.length - 1].type === \"descendant\") {\n                        tokens.pop();\n                    }\n                    addToken(subselects, tokens);\n                    return selectorIndex;\n                }\n                if (selector.charAt(selectorIndex) === \"|\") {\n                    namespace = name_4;\n                    if (selector.charAt(selectorIndex + 1) === \"*\") {\n                        name_4 = \"*\";\n                        selectorIndex += 2;\n                    }\n                    else {\n                        name_4 = getName(1);\n                    }\n                }\n                if (name_4 === \"*\") {\n                    tokens.push({ type: \"universal\", namespace: namespace });\n                }\n                else {\n                    if ((_b = options.lowerCaseTags) !== null && _b !== void 0 ? _b : !options.xmlMode) {\n                        name_4 = name_4.toLowerCase();\n                    }\n                    tokens.push({ type: \"tag\", name: name_4, namespace: namespace });\n                }\n            }\n        }\n    }\n    addToken(subselects, tokens);\n    return selectorIndex;\n}\nfunction addToken(subselects, tokens) {\n    if (subselects.length > 0 && tokens.length === 0) {\n        throw new Error(\"Empty sub-selector\");\n    }\n    subselects.push(tokens);\n}\n","\"use strict\";\nvar __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {\n    if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n        if (ar || !(i in from)) {\n            if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n            ar[i] = from[i];\n        }\n    }\n    return to.concat(ar || Array.prototype.slice.call(from));\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar actionTypes = {\n    equals: \"\",\n    element: \"~\",\n    start: \"^\",\n    end: \"$\",\n    any: \"*\",\n    not: \"!\",\n    hyphen: \"|\",\n};\nvar charsToEscape = new Set(__spreadArray(__spreadArray([], Object.keys(actionTypes)\n    .map(function (typeKey) { return actionTypes[typeKey]; })\n    .filter(Boolean), true), [\n    \":\",\n    \"[\",\n    \"]\",\n    \" \",\n    \"\\\\\",\n    \"(\",\n    \")\",\n    \"'\",\n], false));\n/**\n * Turns `selector` back into a string.\n *\n * @param selector Selector to stringify.\n */\nfunction stringify(selector) {\n    return selector.map(stringifySubselector).join(\", \");\n}\nexports.default = stringify;\nfunction stringifySubselector(token) {\n    return token.map(stringifyToken).join(\"\");\n}\nfunction stringifyToken(token) {\n    switch (token.type) {\n        // Simple types\n        case \"child\":\n            return \" > \";\n        case \"parent\":\n            return \" < \";\n        case \"sibling\":\n            return \" ~ \";\n        case \"adjacent\":\n            return \" + \";\n        case \"descendant\":\n            return \" \";\n        case \"universal\":\n            return getNamespace(token.namespace) + \"*\";\n        case \"tag\":\n            return getNamespacedName(token);\n        case \"pseudo-element\":\n            return \"::\" + escapeName(token.name);\n        case \"pseudo\":\n            if (token.data === null)\n                return \":\" + escapeName(token.name);\n            if (typeof token.data === \"string\") {\n                return \":\" + escapeName(token.name) + \"(\" + escapeName(token.data) + \")\";\n            }\n            return \":\" + escapeName(token.name) + \"(\" + stringify(token.data) + \")\";\n        case \"attribute\": {\n            if (token.name === \"id\" &&\n                token.action === \"equals\" &&\n                !token.ignoreCase &&\n                !token.namespace) {\n                return \"#\" + escapeName(token.value);\n            }\n            if (token.name === \"class\" &&\n                token.action === \"element\" &&\n                !token.ignoreCase &&\n                !token.namespace) {\n                return \".\" + escapeName(token.value);\n            }\n            var name_1 = getNamespacedName(token);\n            if (token.action === \"exists\") {\n                return \"[\" + name_1 + \"]\";\n            }\n            return \"[\" + name_1 + actionTypes[token.action] + \"='\" + escapeName(token.value) + \"'\" + (token.ignoreCase ? \"i\" : token.ignoreCase === false ? \"s\" : \"\") + \"]\";\n        }\n    }\n}\nfunction getNamespacedName(token) {\n    return \"\" + getNamespace(token.namespace) + escapeName(token.name);\n}\nfunction getNamespace(namespace) {\n    return namespace !== null\n        ? (namespace === \"*\" ? \"*\" : escapeName(namespace)) + \"|\"\n        : \"\";\n}\nfunction escapeName(str) {\n    return str\n        .split(\"\")\n        .map(function (c) { return (charsToEscape.has(c) ? \"\\\\\" + c : c); })\n        .join(\"\");\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.attributeNames = exports.elementNames = void 0;\nexports.elementNames = new Map([\n    [\"altglyph\", \"altGlyph\"],\n    [\"altglyphdef\", \"altGlyphDef\"],\n    [\"altglyphitem\", \"altGlyphItem\"],\n    [\"animatecolor\", \"animateColor\"],\n    [\"animatemotion\", \"animateMotion\"],\n    [\"animatetransform\", \"animateTransform\"],\n    [\"clippath\", \"clipPath\"],\n    [\"feblend\", \"feBlend\"],\n    [\"fecolormatrix\", \"feColorMatrix\"],\n    [\"fecomponenttransfer\", \"feComponentTransfer\"],\n    [\"fecomposite\", \"feComposite\"],\n    [\"feconvolvematrix\", \"feConvolveMatrix\"],\n    [\"fediffuselighting\", \"feDiffuseLighting\"],\n    [\"fedisplacementmap\", \"feDisplacementMap\"],\n    [\"fedistantlight\", \"feDistantLight\"],\n    [\"fedropshadow\", \"feDropShadow\"],\n    [\"feflood\", \"feFlood\"],\n    [\"fefunca\", \"feFuncA\"],\n    [\"fefuncb\", \"feFuncB\"],\n    [\"fefuncg\", \"feFuncG\"],\n    [\"fefuncr\", \"feFuncR\"],\n    [\"fegaussianblur\", \"feGaussianBlur\"],\n    [\"feimage\", \"feImage\"],\n    [\"femerge\", \"feMerge\"],\n    [\"femergenode\", \"feMergeNode\"],\n    [\"femorphology\", \"feMorphology\"],\n    [\"feoffset\", \"feOffset\"],\n    [\"fepointlight\", \"fePointLight\"],\n    [\"fespecularlighting\", \"feSpecularLighting\"],\n    [\"fespotlight\", \"feSpotLight\"],\n    [\"fetile\", \"feTile\"],\n    [\"feturbulence\", \"feTurbulence\"],\n    [\"foreignobject\", \"foreignObject\"],\n    [\"glyphref\", \"glyphRef\"],\n    [\"lineargradient\", \"linearGradient\"],\n    [\"radialgradient\", \"radialGradient\"],\n    [\"textpath\", \"textPath\"],\n]);\nexports.attributeNames = new Map([\n    [\"definitionurl\", \"definitionURL\"],\n    [\"attributename\", \"attributeName\"],\n    [\"attributetype\", \"attributeType\"],\n    [\"basefrequency\", \"baseFrequency\"],\n    [\"baseprofile\", \"baseProfile\"],\n    [\"calcmode\", \"calcMode\"],\n    [\"clippathunits\", \"clipPathUnits\"],\n    [\"diffuseconstant\", \"diffuseConstant\"],\n    [\"edgemode\", \"edgeMode\"],\n    [\"filterunits\", \"filterUnits\"],\n    [\"glyphref\", \"glyphRef\"],\n    [\"gradienttransform\", \"gradientTransform\"],\n    [\"gradientunits\", \"gradientUnits\"],\n    [\"kernelmatrix\", \"kernelMatrix\"],\n    [\"kernelunitlength\", \"kernelUnitLength\"],\n    [\"keypoints\", \"keyPoints\"],\n    [\"keysplines\", \"keySplines\"],\n    [\"keytimes\", \"keyTimes\"],\n    [\"lengthadjust\", \"lengthAdjust\"],\n    [\"limitingconeangle\", \"limitingConeAngle\"],\n    [\"markerheight\", \"markerHeight\"],\n    [\"markerunits\", \"markerUnits\"],\n    [\"markerwidth\", \"markerWidth\"],\n    [\"maskcontentunits\", \"maskContentUnits\"],\n    [\"maskunits\", \"maskUnits\"],\n    [\"numoctaves\", \"numOctaves\"],\n    [\"pathlength\", \"pathLength\"],\n    [\"patterncontentunits\", \"patternContentUnits\"],\n    [\"patterntransform\", \"patternTransform\"],\n    [\"patternunits\", \"patternUnits\"],\n    [\"pointsatx\", \"pointsAtX\"],\n    [\"pointsaty\", \"pointsAtY\"],\n    [\"pointsatz\", \"pointsAtZ\"],\n    [\"preservealpha\", \"preserveAlpha\"],\n    [\"preserveaspectratio\", \"preserveAspectRatio\"],\n    [\"primitiveunits\", \"primitiveUnits\"],\n    [\"refx\", \"refX\"],\n    [\"refy\", \"refY\"],\n    [\"repeatcount\", \"repeatCount\"],\n    [\"repeatdur\", \"repeatDur\"],\n    [\"requiredextensions\", \"requiredExtensions\"],\n    [\"requiredfeatures\", \"requiredFeatures\"],\n    [\"specularconstant\", \"specularConstant\"],\n    [\"specularexponent\", \"specularExponent\"],\n    [\"spreadmethod\", \"spreadMethod\"],\n    [\"startoffset\", \"startOffset\"],\n    [\"stddeviation\", \"stdDeviation\"],\n    [\"stitchtiles\", \"stitchTiles\"],\n    [\"surfacescale\", \"surfaceScale\"],\n    [\"systemlanguage\", \"systemLanguage\"],\n    [\"tablevalues\", \"tableValues\"],\n    [\"targetx\", \"targetX\"],\n    [\"targety\", \"targetY\"],\n    [\"textlength\", \"textLength\"],\n    [\"viewbox\", \"viewBox\"],\n    [\"viewtarget\", \"viewTarget\"],\n    [\"xchannelselector\", \"xChannelSelector\"],\n    [\"ychannelselector\", \"yChannelSelector\"],\n    [\"zoomandpan\", \"zoomAndPan\"],\n]);\n","\"use strict\";\nvar __assign = (this && this.__assign) || function () {\n    __assign = Object.assign || function(t) {\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n                t[p] = s[p];\n        }\n        return t;\n    };\n    return __assign.apply(this, arguments);\n};\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n    if (k2 === undefined) k2 = k;\n    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n    if (k2 === undefined) k2 = k;\n    o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n    Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n    o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n    if (mod && mod.__esModule) return mod;\n    var result = {};\n    if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n    __setModuleDefault(result, mod);\n    return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/*\n * Module dependencies\n */\nvar ElementType = __importStar(require(\"domelementtype\"));\nvar entities_1 = require(\"entities\");\n/**\n * Mixed-case SVG and MathML tags & attributes\n * recognized by the HTML parser.\n *\n * @see https://html.spec.whatwg.org/multipage/parsing.html#parsing-main-inforeign\n */\nvar foreignNames_1 = require(\"./foreignNames\");\nvar unencodedElements = new Set([\n    \"style\",\n    \"script\",\n    \"xmp\",\n    \"iframe\",\n    \"noembed\",\n    \"noframes\",\n    \"plaintext\",\n    \"noscript\",\n]);\n/**\n * Format attributes\n */\nfunction formatAttributes(attributes, opts) {\n    if (!attributes)\n        return;\n    return Object.keys(attributes)\n        .map(function (key) {\n        var _a, _b;\n        var value = (_a = attributes[key]) !== null && _a !== void 0 ? _a : \"\";\n        if (opts.xmlMode === \"foreign\") {\n            /* Fix up mixed-case attribute names */\n            key = (_b = foreignNames_1.attributeNames.get(key)) !== null && _b !== void 0 ? _b : key;\n        }\n        if (!opts.emptyAttrs && !opts.xmlMode && value === \"\") {\n            return key;\n        }\n        return key + \"=\\\"\" + (opts.decodeEntities !== false\n            ? entities_1.encodeXML(value)\n            : value.replace(/\"/g, \"&quot;\")) + \"\\\"\";\n    })\n        .join(\" \");\n}\n/**\n * Self-enclosing tags\n */\nvar singleTag = new Set([\n    \"area\",\n    \"base\",\n    \"basefont\",\n    \"br\",\n    \"col\",\n    \"command\",\n    \"embed\",\n    \"frame\",\n    \"hr\",\n    \"img\",\n    \"input\",\n    \"isindex\",\n    \"keygen\",\n    \"link\",\n    \"meta\",\n    \"param\",\n    \"source\",\n    \"track\",\n    \"wbr\",\n]);\n/**\n * Renders a DOM node or an array of DOM nodes to a string.\n *\n * Can be thought of as the equivalent of the `outerHTML` of the passed node(s).\n *\n * @param node Node to be rendered.\n * @param options Changes serialization behavior\n */\nfunction render(node, options) {\n    if (options === void 0) { options = {}; }\n    var nodes = \"length\" in node ? node : [node];\n    var output = \"\";\n    for (var i = 0; i < nodes.length; i++) {\n        output += renderNode(nodes[i], options);\n    }\n    return output;\n}\nexports.default = render;\nfunction renderNode(node, options) {\n    switch (node.type) {\n        case ElementType.Root:\n            return render(node.children, options);\n        case ElementType.Directive:\n        case ElementType.Doctype:\n            return renderDirective(node);\n        case ElementType.Comment:\n            return renderComment(node);\n        case ElementType.CDATA:\n            return renderCdata(node);\n        case ElementType.Script:\n        case ElementType.Style:\n        case ElementType.Tag:\n            return renderTag(node, options);\n        case ElementType.Text:\n            return renderText(node, options);\n    }\n}\nvar foreignModeIntegrationPoints = new Set([\n    \"mi\",\n    \"mo\",\n    \"mn\",\n    \"ms\",\n    \"mtext\",\n    \"annotation-xml\",\n    \"foreignObject\",\n    \"desc\",\n    \"title\",\n]);\nvar foreignElements = new Set([\"svg\", \"math\"]);\nfunction renderTag(elem, opts) {\n    var _a;\n    // Handle SVG / MathML in HTML\n    if (opts.xmlMode === \"foreign\") {\n        /* Fix up mixed-case element names */\n        elem.name = (_a = foreignNames_1.elementNames.get(elem.name)) !== null && _a !== void 0 ? _a : elem.name;\n        /* Exit foreign mode at integration points */\n        if (elem.parent &&\n            foreignModeIntegrationPoints.has(elem.parent.name)) {\n            opts = __assign(__assign({}, opts), { xmlMode: false });\n        }\n    }\n    if (!opts.xmlMode && foreignElements.has(elem.name)) {\n        opts = __assign(__assign({}, opts), { xmlMode: \"foreign\" });\n    }\n    var tag = \"<\" + elem.name;\n    var attribs = formatAttributes(elem.attribs, opts);\n    if (attribs) {\n        tag += \" \" + attribs;\n    }\n    if (elem.children.length === 0 &&\n        (opts.xmlMode\n            ? // In XML mode or foreign mode, and user hasn't explicitly turned off self-closing tags\n                opts.selfClosingTags !== false\n            : // User explicitly asked for self-closing tags, even in HTML mode\n                opts.selfClosingTags && singleTag.has(elem.name))) {\n        if (!opts.xmlMode)\n            tag += \" \";\n        tag += \"/>\";\n    }\n    else {\n        tag += \">\";\n        if (elem.children.length > 0) {\n            tag += render(elem.children, opts);\n        }\n        if (opts.xmlMode || !singleTag.has(elem.name)) {\n            tag += \"</\" + elem.name + \">\";\n        }\n    }\n    return tag;\n}\nfunction renderDirective(elem) {\n    return \"<\" + elem.data + \">\";\n}\nfunction renderText(elem, opts) {\n    var data = elem.data || \"\";\n    // If entities weren't decoded, no need to encode them back\n    if (opts.decodeEntities !== false &&\n        !(!opts.xmlMode &&\n            elem.parent &&\n            unencodedElements.has(elem.parent.name))) {\n        data = entities_1.encodeXML(data);\n    }\n    return data;\n}\nfunction renderCdata(elem) {\n    return \"<![CDATA[\" + elem.children[0].data + \"]]>\";\n}\nfunction renderComment(elem) {\n    return \"<!--\" + elem.data + \"-->\";\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Doctype = exports.CDATA = exports.Tag = exports.Style = exports.Script = exports.Comment = exports.Directive = exports.Text = exports.Root = exports.isTag = exports.ElementType = void 0;\n/** Types of elements found in htmlparser2's DOM */\nvar ElementType;\n(function (ElementType) {\n    /** Type for the root element of a document */\n    ElementType[\"Root\"] = \"root\";\n    /** Type for Text */\n    ElementType[\"Text\"] = \"text\";\n    /** Type for <? ... ?> */\n    ElementType[\"Directive\"] = \"directive\";\n    /** Type for <!-- ... --> */\n    ElementType[\"Comment\"] = \"comment\";\n    /** Type for <script> tags */\n    ElementType[\"Script\"] = \"script\";\n    /** Type for <style> tags */\n    ElementType[\"Style\"] = \"style\";\n    /** Type for Any tag */\n    ElementType[\"Tag\"] = \"tag\";\n    /** Type for <![CDATA[ ... ]]> */\n    ElementType[\"CDATA\"] = \"cdata\";\n    /** Type for <!doctype ...> */\n    ElementType[\"Doctype\"] = \"doctype\";\n})(ElementType = exports.ElementType || (exports.ElementType = {}));\n/**\n * Tests whether an element is a tag or not.\n *\n * @param elem Element to test\n */\nfunction isTag(elem) {\n    return (elem.type === ElementType.Tag ||\n        elem.type === ElementType.Script ||\n        elem.type === ElementType.Style);\n}\nexports.isTag = isTag;\n// Exports for backwards compatibility\n/** Type for the root element of a document */\nexports.Root = ElementType.Root;\n/** Type for Text */\nexports.Text = ElementType.Text;\n/** Type for <? ... ?> */\nexports.Directive = ElementType.Directive;\n/** Type for <!-- ... --> */\nexports.Comment = ElementType.Comment;\n/** Type for <script> tags */\nexports.Script = ElementType.Script;\n/** Type for <style> tags */\nexports.Style = ElementType.Style;\n/** Type for Any tag */\nexports.Tag = ElementType.Tag;\n/** Type for <![CDATA[ ... ]]> */\nexports.CDATA = ElementType.CDATA;\n/** Type for <!doctype ...> */\nexports.Doctype = ElementType.Doctype;\n","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n    if (k2 === undefined) k2 = k;\n    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n    if (k2 === undefined) k2 = k;\n    o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n    for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DomHandler = void 0;\nvar domelementtype_1 = require(\"domelementtype\");\nvar node_1 = require(\"./node\");\n__exportStar(require(\"./node\"), exports);\nvar reWhitespace = /\\s+/g;\n// Default options\nvar defaultOpts = {\n    normalizeWhitespace: false,\n    withStartIndices: false,\n    withEndIndices: false,\n    xmlMode: false,\n};\nvar DomHandler = /** @class */ (function () {\n    /**\n     * @param callback Called once parsing has completed.\n     * @param options Settings for the handler.\n     * @param elementCB Callback whenever a tag is closed.\n     */\n    function DomHandler(callback, options, elementCB) {\n        /** The elements of the DOM */\n        this.dom = [];\n        /** The root element for the DOM */\n        this.root = new node_1.Document(this.dom);\n        /** Indicated whether parsing has been completed. */\n        this.done = false;\n        /** Stack of open tags. */\n        this.tagStack = [this.root];\n        /** A data node that is still being written to. */\n        this.lastNode = null;\n        /** Reference to the parser instance. Used for location information. */\n        this.parser = null;\n        // Make it possible to skip arguments, for backwards-compatibility\n        if (typeof options === \"function\") {\n            elementCB = options;\n            options = defaultOpts;\n        }\n        if (typeof callback === \"object\") {\n            options = callback;\n            callback = undefined;\n        }\n        this.callback = callback !== null && callback !== void 0 ? callback : null;\n        this.options = options !== null && options !== void 0 ? options : defaultOpts;\n        this.elementCB = elementCB !== null && elementCB !== void 0 ? elementCB : null;\n    }\n    DomHandler.prototype.onparserinit = function (parser) {\n        this.parser = parser;\n    };\n    // Resets the handler back to starting state\n    DomHandler.prototype.onreset = function () {\n        this.dom = [];\n        this.root = new node_1.Document(this.dom);\n        this.done = false;\n        this.tagStack = [this.root];\n        this.lastNode = null;\n        this.parser = null;\n    };\n    // Signals the handler that parsing is done\n    DomHandler.prototype.onend = function () {\n        if (this.done)\n            return;\n        this.done = true;\n        this.parser = null;\n        this.handleCallback(null);\n    };\n    DomHandler.prototype.onerror = function (error) {\n        this.handleCallback(error);\n    };\n    DomHandler.prototype.onclosetag = function () {\n        this.lastNode = null;\n        var elem = this.tagStack.pop();\n        if (this.options.withEndIndices) {\n            elem.endIndex = this.parser.endIndex;\n        }\n        if (this.elementCB)\n            this.elementCB(elem);\n    };\n    DomHandler.prototype.onopentag = function (name, attribs) {\n        var type = this.options.xmlMode ? domelementtype_1.ElementType.Tag : undefined;\n        var element = new node_1.Element(name, attribs, undefined, type);\n        this.addNode(element);\n        this.tagStack.push(element);\n    };\n    DomHandler.prototype.ontext = function (data) {\n        var normalizeWhitespace = this.options.normalizeWhitespace;\n        var lastNode = this.lastNode;\n        if (lastNode && lastNode.type === domelementtype_1.ElementType.Text) {\n            if (normalizeWhitespace) {\n                lastNode.data = (lastNode.data + data).replace(reWhitespace, \" \");\n            }\n            else {\n                lastNode.data += data;\n            }\n            if (this.options.withEndIndices) {\n                lastNode.endIndex = this.parser.endIndex;\n            }\n        }\n        else {\n            if (normalizeWhitespace) {\n                data = data.replace(reWhitespace, \" \");\n            }\n            var node = new node_1.Text(data);\n            this.addNode(node);\n            this.lastNode = node;\n        }\n    };\n    DomHandler.prototype.oncomment = function (data) {\n        if (this.lastNode && this.lastNode.type === domelementtype_1.ElementType.Comment) {\n            this.lastNode.data += data;\n            return;\n        }\n        var node = new node_1.Comment(data);\n        this.addNode(node);\n        this.lastNode = node;\n    };\n    DomHandler.prototype.oncommentend = function () {\n        this.lastNode = null;\n    };\n    DomHandler.prototype.oncdatastart = function () {\n        var text = new node_1.Text(\"\");\n        var node = new node_1.NodeWithChildren(domelementtype_1.ElementType.CDATA, [text]);\n        this.addNode(node);\n        text.parent = node;\n        this.lastNode = text;\n    };\n    DomHandler.prototype.oncdataend = function () {\n        this.lastNode = null;\n    };\n    DomHandler.prototype.onprocessinginstruction = function (name, data) {\n        var node = new node_1.ProcessingInstruction(name, data);\n        this.addNode(node);\n    };\n    DomHandler.prototype.handleCallback = function (error) {\n        if (typeof this.callback === \"function\") {\n            this.callback(error, this.dom);\n        }\n        else if (error) {\n            throw error;\n        }\n    };\n    DomHandler.prototype.addNode = function (node) {\n        var parent = this.tagStack[this.tagStack.length - 1];\n        var previousSibling = parent.children[parent.children.length - 1];\n        if (this.options.withStartIndices) {\n            node.startIndex = this.parser.startIndex;\n        }\n        if (this.options.withEndIndices) {\n            node.endIndex = this.parser.endIndex;\n        }\n        parent.children.push(node);\n        if (previousSibling) {\n            node.prev = previousSibling;\n            previousSibling.next = node;\n        }\n        node.parent = parent;\n        this.lastNode = null;\n    };\n    return DomHandler;\n}());\nexports.DomHandler = DomHandler;\nexports.default = DomHandler;\n","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    return function (d, b) {\n        if (typeof b !== \"function\" && b !== null)\n            throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nvar __assign = (this && this.__assign) || function () {\n    __assign = Object.assign || function(t) {\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n                t[p] = s[p];\n        }\n        return t;\n    };\n    return __assign.apply(this, arguments);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.cloneNode = exports.hasChildren = exports.isDocument = exports.isDirective = exports.isComment = exports.isText = exports.isCDATA = exports.isTag = exports.Element = exports.Document = exports.NodeWithChildren = exports.ProcessingInstruction = exports.Comment = exports.Text = exports.DataNode = exports.Node = void 0;\nvar domelementtype_1 = require(\"domelementtype\");\nvar nodeTypes = new Map([\n    [domelementtype_1.ElementType.Tag, 1],\n    [domelementtype_1.ElementType.Script, 1],\n    [domelementtype_1.ElementType.Style, 1],\n    [domelementtype_1.ElementType.Directive, 1],\n    [domelementtype_1.ElementType.Text, 3],\n    [domelementtype_1.ElementType.CDATA, 4],\n    [domelementtype_1.ElementType.Comment, 8],\n    [domelementtype_1.ElementType.Root, 9],\n]);\n/**\n * This object will be used as the prototype for Nodes when creating a\n * DOM-Level-1-compliant structure.\n */\nvar Node = /** @class */ (function () {\n    /**\n     *\n     * @param type The type of the node.\n     */\n    function Node(type) {\n        this.type = type;\n        /** Parent of the node */\n        this.parent = null;\n        /** Previous sibling */\n        this.prev = null;\n        /** Next sibling */\n        this.next = null;\n        /** The start index of the node. Requires `withStartIndices` on the handler to be `true. */\n        this.startIndex = null;\n        /** The end index of the node. Requires `withEndIndices` on the handler to be `true. */\n        this.endIndex = null;\n    }\n    Object.defineProperty(Node.prototype, \"nodeType\", {\n        // Read-only aliases\n        /**\n         * [DOM spec](https://dom.spec.whatwg.org/#dom-node-nodetype)-compatible\n         * node {@link type}.\n         */\n        get: function () {\n            var _a;\n            return (_a = nodeTypes.get(this.type)) !== null && _a !== void 0 ? _a : 1;\n        },\n        enumerable: false,\n        configurable: true\n    });\n    Object.defineProperty(Node.prototype, \"parentNode\", {\n        // Read-write aliases for properties\n        /**\n         * Same as {@link parent}.\n         * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n         */\n        get: function () {\n            return this.parent;\n        },\n        set: function (parent) {\n            this.parent = parent;\n        },\n        enumerable: false,\n        configurable: true\n    });\n    Object.defineProperty(Node.prototype, \"previousSibling\", {\n        /**\n         * Same as {@link prev}.\n         * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n         */\n        get: function () {\n            return this.prev;\n        },\n        set: function (prev) {\n            this.prev = prev;\n        },\n        enumerable: false,\n        configurable: true\n    });\n    Object.defineProperty(Node.prototype, \"nextSibling\", {\n        /**\n         * Same as {@link next}.\n         * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n         */\n        get: function () {\n            return this.next;\n        },\n        set: function (next) {\n            this.next = next;\n        },\n        enumerable: false,\n        configurable: true\n    });\n    /**\n     * Clone this node, and optionally its children.\n     *\n     * @param recursive Clone child nodes as well.\n     * @returns A clone of the node.\n     */\n    Node.prototype.cloneNode = function (recursive) {\n        if (recursive === void 0) { recursive = false; }\n        return cloneNode(this, recursive);\n    };\n    return Node;\n}());\nexports.Node = Node;\n/**\n * A node that contains some data.\n */\nvar DataNode = /** @class */ (function (_super) {\n    __extends(DataNode, _super);\n    /**\n     * @param type The type of the node\n     * @param data The content of the data node\n     */\n    function DataNode(type, data) {\n        var _this = _super.call(this, type) || this;\n        _this.data = data;\n        return _this;\n    }\n    Object.defineProperty(DataNode.prototype, \"nodeValue\", {\n        /**\n         * Same as {@link data}.\n         * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n         */\n        get: function () {\n            return this.data;\n        },\n        set: function (data) {\n            this.data = data;\n        },\n        enumerable: false,\n        configurable: true\n    });\n    return DataNode;\n}(Node));\nexports.DataNode = DataNode;\n/**\n * Text within the document.\n */\nvar Text = /** @class */ (function (_super) {\n    __extends(Text, _super);\n    function Text(data) {\n        return _super.call(this, domelementtype_1.ElementType.Text, data) || this;\n    }\n    return Text;\n}(DataNode));\nexports.Text = Text;\n/**\n * Comments within the document.\n */\nvar Comment = /** @class */ (function (_super) {\n    __extends(Comment, _super);\n    function Comment(data) {\n        return _super.call(this, domelementtype_1.ElementType.Comment, data) || this;\n    }\n    return Comment;\n}(DataNode));\nexports.Comment = Comment;\n/**\n * Processing instructions, including doc types.\n */\nvar ProcessingInstruction = /** @class */ (function (_super) {\n    __extends(ProcessingInstruction, _super);\n    function ProcessingInstruction(name, data) {\n        var _this = _super.call(this, domelementtype_1.ElementType.Directive, data) || this;\n        _this.name = name;\n        return _this;\n    }\n    return ProcessingInstruction;\n}(DataNode));\nexports.ProcessingInstruction = ProcessingInstruction;\n/**\n * A `Node` that can have children.\n */\nvar NodeWithChildren = /** @class */ (function (_super) {\n    __extends(NodeWithChildren, _super);\n    /**\n     * @param type Type of the node.\n     * @param children Children of the node. Only certain node types can have children.\n     */\n    function NodeWithChildren(type, children) {\n        var _this = _super.call(this, type) || this;\n        _this.children = children;\n        return _this;\n    }\n    Object.defineProperty(NodeWithChildren.prototype, \"firstChild\", {\n        // Aliases\n        /** First child of the node. */\n        get: function () {\n            var _a;\n            return (_a = this.children[0]) !== null && _a !== void 0 ? _a : null;\n        },\n        enumerable: false,\n        configurable: true\n    });\n    Object.defineProperty(NodeWithChildren.prototype, \"lastChild\", {\n        /** Last child of the node. */\n        get: function () {\n            return this.children.length > 0\n                ? this.children[this.children.length - 1]\n                : null;\n        },\n        enumerable: false,\n        configurable: true\n    });\n    Object.defineProperty(NodeWithChildren.prototype, \"childNodes\", {\n        /**\n         * Same as {@link children}.\n         * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n         */\n        get: function () {\n            return this.children;\n        },\n        set: function (children) {\n            this.children = children;\n        },\n        enumerable: false,\n        configurable: true\n    });\n    return NodeWithChildren;\n}(Node));\nexports.NodeWithChildren = NodeWithChildren;\n/**\n * The root node of the document.\n */\nvar Document = /** @class */ (function (_super) {\n    __extends(Document, _super);\n    function Document(children) {\n        return _super.call(this, domelementtype_1.ElementType.Root, children) || this;\n    }\n    return Document;\n}(NodeWithChildren));\nexports.Document = Document;\n/**\n * An element within the DOM.\n */\nvar Element = /** @class */ (function (_super) {\n    __extends(Element, _super);\n    /**\n     * @param name Name of the tag, eg. `div`, `span`.\n     * @param attribs Object mapping attribute names to attribute values.\n     * @param children Children of the node.\n     */\n    function Element(name, attribs, children, type) {\n        if (children === void 0) { children = []; }\n        if (type === void 0) { type = name === \"script\"\n            ? domelementtype_1.ElementType.Script\n            : name === \"style\"\n                ? domelementtype_1.ElementType.Style\n                : domelementtype_1.ElementType.Tag; }\n        var _this = _super.call(this, type, children) || this;\n        _this.name = name;\n        _this.attribs = attribs;\n        return _this;\n    }\n    Object.defineProperty(Element.prototype, \"tagName\", {\n        // DOM Level 1 aliases\n        /**\n         * Same as {@link name}.\n         * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n         */\n        get: function () {\n            return this.name;\n        },\n        set: function (name) {\n            this.name = name;\n        },\n        enumerable: false,\n        configurable: true\n    });\n    Object.defineProperty(Element.prototype, \"attributes\", {\n        get: function () {\n            var _this = this;\n            return Object.keys(this.attribs).map(function (name) {\n                var _a, _b;\n                return ({\n                    name: name,\n                    value: _this.attribs[name],\n                    namespace: (_a = _this[\"x-attribsNamespace\"]) === null || _a === void 0 ? void 0 : _a[name],\n                    prefix: (_b = _this[\"x-attribsPrefix\"]) === null || _b === void 0 ? void 0 : _b[name],\n                });\n            });\n        },\n        enumerable: false,\n        configurable: true\n    });\n    return Element;\n}(NodeWithChildren));\nexports.Element = Element;\n/**\n * @param node Node to check.\n * @returns `true` if the node is a `Element`, `false` otherwise.\n */\nfunction isTag(node) {\n    return (0, domelementtype_1.isTag)(node);\n}\nexports.isTag = isTag;\n/**\n * @param node Node to check.\n * @returns `true` if the node has the type `CDATA`, `false` otherwise.\n */\nfunction isCDATA(node) {\n    return node.type === domelementtype_1.ElementType.CDATA;\n}\nexports.isCDATA = isCDATA;\n/**\n * @param node Node to check.\n * @returns `true` if the node has the type `Text`, `false` otherwise.\n */\nfunction isText(node) {\n    return node.type === domelementtype_1.ElementType.Text;\n}\nexports.isText = isText;\n/**\n * @param node Node to check.\n * @returns `true` if the node has the type `Comment`, `false` otherwise.\n */\nfunction isComment(node) {\n    return node.type === domelementtype_1.ElementType.Comment;\n}\nexports.isComment = isComment;\n/**\n * @param node Node to check.\n * @returns `true` if the node has the type `ProcessingInstruction`, `false` otherwise.\n */\nfunction isDirective(node) {\n    return node.type === domelementtype_1.ElementType.Directive;\n}\nexports.isDirective = isDirective;\n/**\n * @param node Node to check.\n * @returns `true` if the node has the type `ProcessingInstruction`, `false` otherwise.\n */\nfunction isDocument(node) {\n    return node.type === domelementtype_1.ElementType.Root;\n}\nexports.isDocument = isDocument;\n/**\n * @param node Node to check.\n * @returns `true` if the node is a `NodeWithChildren` (has children), `false` otherwise.\n */\nfunction hasChildren(node) {\n    return Object.prototype.hasOwnProperty.call(node, \"children\");\n}\nexports.hasChildren = hasChildren;\n/**\n * Clone a node, and optionally its children.\n *\n * @param recursive Clone child nodes as well.\n * @returns A clone of the node.\n */\nfunction cloneNode(node, recursive) {\n    if (recursive === void 0) { recursive = false; }\n    var result;\n    if (isText(node)) {\n        result = new Text(node.data);\n    }\n    else if (isComment(node)) {\n        result = new Comment(node.data);\n    }\n    else if (isTag(node)) {\n        var children = recursive ? cloneChildren(node.children) : [];\n        var clone_1 = new Element(node.name, __assign({}, node.attribs), children);\n        children.forEach(function (child) { return (child.parent = clone_1); });\n        if (node.namespace != null) {\n            clone_1.namespace = node.namespace;\n        }\n        if (node[\"x-attribsNamespace\"]) {\n            clone_1[\"x-attribsNamespace\"] = __assign({}, node[\"x-attribsNamespace\"]);\n        }\n        if (node[\"x-attribsPrefix\"]) {\n            clone_1[\"x-attribsPrefix\"] = __assign({}, node[\"x-attribsPrefix\"]);\n        }\n        result = clone_1;\n    }\n    else if (isCDATA(node)) {\n        var children = recursive ? cloneChildren(node.children) : [];\n        var clone_2 = new NodeWithChildren(domelementtype_1.ElementType.CDATA, children);\n        children.forEach(function (child) { return (child.parent = clone_2); });\n        result = clone_2;\n    }\n    else if (isDocument(node)) {\n        var children = recursive ? cloneChildren(node.children) : [];\n        var clone_3 = new Document(children);\n        children.forEach(function (child) { return (child.parent = clone_3); });\n        if (node[\"x-mode\"]) {\n            clone_3[\"x-mode\"] = node[\"x-mode\"];\n        }\n        result = clone_3;\n    }\n    else if (isDirective(node)) {\n        var instruction = new ProcessingInstruction(node.name, node.data);\n        if (node[\"x-name\"] != null) {\n            instruction[\"x-name\"] = node[\"x-name\"];\n            instruction[\"x-publicId\"] = node[\"x-publicId\"];\n            instruction[\"x-systemId\"] = node[\"x-systemId\"];\n        }\n        result = instruction;\n    }\n    else {\n        throw new Error(\"Not implemented yet: \".concat(node.type));\n    }\n    result.startIndex = node.startIndex;\n    result.endIndex = node.endIndex;\n    if (node.sourceCodeLocation != null) {\n        result.sourceCodeLocation = node.sourceCodeLocation;\n    }\n    return result;\n}\nexports.cloneNode = cloneNode;\nfunction cloneChildren(childs) {\n    var children = childs.map(function (child) { return cloneNode(child, true); });\n    for (var i = 1; i < children.length; i++) {\n        children[i].prev = children[i - 1];\n        children[i - 1].next = children[i];\n    }\n    return children;\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getFeed = void 0;\nvar stringify_1 = require(\"./stringify\");\nvar legacy_1 = require(\"./legacy\");\n/**\n * Get the feed object from the root of a DOM tree.\n *\n * @param doc - The DOM to to extract the feed from.\n * @returns The feed.\n */\nfunction getFeed(doc) {\n    var feedRoot = getOneElement(isValidFeed, doc);\n    return !feedRoot\n        ? null\n        : feedRoot.name === \"feed\"\n            ? getAtomFeed(feedRoot)\n            : getRssFeed(feedRoot);\n}\nexports.getFeed = getFeed;\n/**\n * Parse an Atom feed.\n *\n * @param feedRoot The root of the feed.\n * @returns The parsed feed.\n */\nfunction getAtomFeed(feedRoot) {\n    var _a;\n    var childs = feedRoot.children;\n    var feed = {\n        type: \"atom\",\n        items: (0, legacy_1.getElementsByTagName)(\"entry\", childs).map(function (item) {\n            var _a;\n            var children = item.children;\n            var entry = { media: getMediaElements(children) };\n            addConditionally(entry, \"id\", \"id\", children);\n            addConditionally(entry, \"title\", \"title\", children);\n            var href = (_a = getOneElement(\"link\", children)) === null || _a === void 0 ? void 0 : _a.attribs.href;\n            if (href) {\n                entry.link = href;\n            }\n            var description = fetch(\"summary\", children) || fetch(\"content\", children);\n            if (description) {\n                entry.description = description;\n            }\n            var pubDate = fetch(\"updated\", children);\n            if (pubDate) {\n                entry.pubDate = new Date(pubDate);\n            }\n            return entry;\n        }),\n    };\n    addConditionally(feed, \"id\", \"id\", childs);\n    addConditionally(feed, \"title\", \"title\", childs);\n    var href = (_a = getOneElement(\"link\", childs)) === null || _a === void 0 ? void 0 : _a.attribs.href;\n    if (href) {\n        feed.link = href;\n    }\n    addConditionally(feed, \"description\", \"subtitle\", childs);\n    var updated = fetch(\"updated\", childs);\n    if (updated) {\n        feed.updated = new Date(updated);\n    }\n    addConditionally(feed, \"author\", \"email\", childs, true);\n    return feed;\n}\n/**\n * Parse a RSS feed.\n *\n * @param feedRoot The root of the feed.\n * @returns The parsed feed.\n */\nfunction getRssFeed(feedRoot) {\n    var _a, _b;\n    var childs = (_b = (_a = getOneElement(\"channel\", feedRoot.children)) === null || _a === void 0 ? void 0 : _a.children) !== null && _b !== void 0 ? _b : [];\n    var feed = {\n        type: feedRoot.name.substr(0, 3),\n        id: \"\",\n        items: (0, legacy_1.getElementsByTagName)(\"item\", feedRoot.children).map(function (item) {\n            var children = item.children;\n            var entry = { media: getMediaElements(children) };\n            addConditionally(entry, \"id\", \"guid\", children);\n            addConditionally(entry, \"title\", \"title\", children);\n            addConditionally(entry, \"link\", \"link\", children);\n            addConditionally(entry, \"description\", \"description\", children);\n            var pubDate = fetch(\"pubDate\", children);\n            if (pubDate)\n                entry.pubDate = new Date(pubDate);\n            return entry;\n        }),\n    };\n    addConditionally(feed, \"title\", \"title\", childs);\n    addConditionally(feed, \"link\", \"link\", childs);\n    addConditionally(feed, \"description\", \"description\", childs);\n    var updated = fetch(\"lastBuildDate\", childs);\n    if (updated) {\n        feed.updated = new Date(updated);\n    }\n    addConditionally(feed, \"author\", \"managingEditor\", childs, true);\n    return feed;\n}\nvar MEDIA_KEYS_STRING = [\"url\", \"type\", \"lang\"];\nvar MEDIA_KEYS_INT = [\n    \"fileSize\",\n    \"bitrate\",\n    \"framerate\",\n    \"samplingrate\",\n    \"channels\",\n    \"duration\",\n    \"height\",\n    \"width\",\n];\n/**\n * Get all media elements of a feed item.\n *\n * @param where Nodes to search in.\n * @returns Media elements.\n */\nfunction getMediaElements(where) {\n    return (0, legacy_1.getElementsByTagName)(\"media:content\", where).map(function (elem) {\n        var attribs = elem.attribs;\n        var media = {\n            medium: attribs.medium,\n            isDefault: !!attribs.isDefault,\n        };\n        for (var _i = 0, MEDIA_KEYS_STRING_1 = MEDIA_KEYS_STRING; _i < MEDIA_KEYS_STRING_1.length; _i++) {\n            var attrib = MEDIA_KEYS_STRING_1[_i];\n            if (attribs[attrib]) {\n                media[attrib] = attribs[attrib];\n            }\n        }\n        for (var _a = 0, MEDIA_KEYS_INT_1 = MEDIA_KEYS_INT; _a < MEDIA_KEYS_INT_1.length; _a++) {\n            var attrib = MEDIA_KEYS_INT_1[_a];\n            if (attribs[attrib]) {\n                media[attrib] = parseInt(attribs[attrib], 10);\n            }\n        }\n        if (attribs.expression) {\n            media.expression =\n                attribs.expression;\n        }\n        return media;\n    });\n}\n/**\n * Get one element by tag name.\n *\n * @param tagName Tag name to look for\n * @param node Node to search in\n * @returns The element or null\n */\nfunction getOneElement(tagName, node) {\n    return (0, legacy_1.getElementsByTagName)(tagName, node, true, 1)[0];\n}\n/**\n * Get the text content of an element with a certain tag name.\n *\n * @param tagName Tag name to look for.\n * @param where  Node to search in.\n * @param recurse Whether to recurse into child nodes.\n * @returns The text content of the element.\n */\nfunction fetch(tagName, where, recurse) {\n    if (recurse === void 0) { recurse = false; }\n    return (0, stringify_1.textContent)((0, legacy_1.getElementsByTagName)(tagName, where, recurse, 1)).trim();\n}\n/**\n * Adds a property to an object if it has a value.\n *\n * @param obj Object to be extended\n * @param prop Property name\n * @param tagName Tag name that contains the conditionally added property\n * @param where Element to search for the property\n * @param recurse Whether to recurse into child nodes.\n */\nfunction addConditionally(obj, prop, tagName, where, recurse) {\n    if (recurse === void 0) { recurse = false; }\n    var val = fetch(tagName, where, recurse);\n    if (val)\n        obj[prop] = val;\n}\n/**\n * Checks if an element is a feed root node.\n *\n * @param value The name of the element to check.\n * @returns Whether an element is a feed root node.\n */\nfunction isValidFeed(value) {\n    return value === \"rss\" || value === \"feed\" || value === \"rdf:RDF\";\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.uniqueSort = exports.compareDocumentPosition = exports.removeSubsets = void 0;\nvar domhandler_1 = require(\"domhandler\");\n/**\n * Given an array of nodes, remove any member that is contained by another.\n *\n * @param nodes Nodes to filter.\n * @returns Remaining nodes that aren't subtrees of each other.\n */\nfunction removeSubsets(nodes) {\n    var idx = nodes.length;\n    /*\n     * Check if each node (or one of its ancestors) is already contained in the\n     * array.\n     */\n    while (--idx >= 0) {\n        var node = nodes[idx];\n        /*\n         * Remove the node if it is not unique.\n         * We are going through the array from the end, so we only\n         * have to check nodes that preceed the node under consideration in the array.\n         */\n        if (idx > 0 && nodes.lastIndexOf(node, idx - 1) >= 0) {\n            nodes.splice(idx, 1);\n            continue;\n        }\n        for (var ancestor = node.parent; ancestor; ancestor = ancestor.parent) {\n            if (nodes.includes(ancestor)) {\n                nodes.splice(idx, 1);\n                break;\n            }\n        }\n    }\n    return nodes;\n}\nexports.removeSubsets = removeSubsets;\n/**\n * Compare the position of one node against another node in any other document.\n * The return value is a bitmask with the following values:\n *\n * Document order:\n * > There is an ordering, document order, defined on all the nodes in the\n * > document corresponding to the order in which the first character of the\n * > XML representation of each node occurs in the XML representation of the\n * > document after expansion of general entities. Thus, the document element\n * > node will be the first node. Element nodes occur before their children.\n * > Thus, document order orders element nodes in order of the occurrence of\n * > their start-tag in the XML (after expansion of entities). The attribute\n * > nodes of an element occur after the element and before its children. The\n * > relative order of attribute nodes is implementation-dependent./\n *\n * Source:\n * http://www.w3.org/TR/DOM-Level-3-Core/glossary.html#dt-document-order\n *\n * @param nodeA The first node to use in the comparison\n * @param nodeB The second node to use in the comparison\n * @returns A bitmask describing the input nodes' relative position.\n *\n * See http://dom.spec.whatwg.org/#dom-node-comparedocumentposition for\n * a description of these values.\n */\nfunction compareDocumentPosition(nodeA, nodeB) {\n    var aParents = [];\n    var bParents = [];\n    if (nodeA === nodeB) {\n        return 0;\n    }\n    var current = (0, domhandler_1.hasChildren)(nodeA) ? nodeA : nodeA.parent;\n    while (current) {\n        aParents.unshift(current);\n        current = current.parent;\n    }\n    current = (0, domhandler_1.hasChildren)(nodeB) ? nodeB : nodeB.parent;\n    while (current) {\n        bParents.unshift(current);\n        current = current.parent;\n    }\n    var maxIdx = Math.min(aParents.length, bParents.length);\n    var idx = 0;\n    while (idx < maxIdx && aParents[idx] === bParents[idx]) {\n        idx++;\n    }\n    if (idx === 0) {\n        return 1 /* DISCONNECTED */;\n    }\n    var sharedParent = aParents[idx - 1];\n    var siblings = sharedParent.children;\n    var aSibling = aParents[idx];\n    var bSibling = bParents[idx];\n    if (siblings.indexOf(aSibling) > siblings.indexOf(bSibling)) {\n        if (sharedParent === nodeB) {\n            return 4 /* FOLLOWING */ | 16 /* CONTAINED_BY */;\n        }\n        return 4 /* FOLLOWING */;\n    }\n    if (sharedParent === nodeA) {\n        return 2 /* PRECEDING */ | 8 /* CONTAINS */;\n    }\n    return 2 /* PRECEDING */;\n}\nexports.compareDocumentPosition = compareDocumentPosition;\n/**\n * Sort an array of nodes based on their relative position in the document and\n * remove any duplicate nodes. If the array contains nodes that do not belong\n * to the same document, sort order is unspecified.\n *\n * @param nodes Array of DOM nodes.\n * @returns Collection of unique nodes, sorted in document order.\n */\nfunction uniqueSort(nodes) {\n    nodes = nodes.filter(function (node, i, arr) { return !arr.includes(node, i + 1); });\n    nodes.sort(function (a, b) {\n        var relative = compareDocumentPosition(a, b);\n        if (relative & 2 /* PRECEDING */) {\n            return -1;\n        }\n        else if (relative & 4 /* FOLLOWING */) {\n            return 1;\n        }\n        return 0;\n    });\n    return nodes;\n}\nexports.uniqueSort = uniqueSort;\n","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n    if (k2 === undefined) k2 = k;\n    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n    if (k2 === undefined) k2 = k;\n    o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n    for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.hasChildren = exports.isDocument = exports.isComment = exports.isText = exports.isCDATA = exports.isTag = void 0;\n__exportStar(require(\"./stringify\"), exports);\n__exportStar(require(\"./traversal\"), exports);\n__exportStar(require(\"./manipulation\"), exports);\n__exportStar(require(\"./querying\"), exports);\n__exportStar(require(\"./legacy\"), exports);\n__exportStar(require(\"./helpers\"), exports);\n__exportStar(require(\"./feeds\"), exports);\n/** @deprecated Use these methods from `domhandler` directly. */\nvar domhandler_1 = require(\"domhandler\");\nObject.defineProperty(exports, \"isTag\", { enumerable: true, get: function () { return domhandler_1.isTag; } });\nObject.defineProperty(exports, \"isCDATA\", { enumerable: true, get: function () { return domhandler_1.isCDATA; } });\nObject.defineProperty(exports, \"isText\", { enumerable: true, get: function () { return domhandler_1.isText; } });\nObject.defineProperty(exports, \"isComment\", { enumerable: true, get: function () { return domhandler_1.isComment; } });\nObject.defineProperty(exports, \"isDocument\", { enumerable: true, get: function () { return domhandler_1.isDocument; } });\nObject.defineProperty(exports, \"hasChildren\", { enumerable: true, get: function () { return domhandler_1.hasChildren; } });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getElementsByTagType = exports.getElementsByTagName = exports.getElementById = exports.getElements = exports.testElement = void 0;\nvar domhandler_1 = require(\"domhandler\");\nvar querying_1 = require(\"./querying\");\nvar Checks = {\n    tag_name: function (name) {\n        if (typeof name === \"function\") {\n            return function (elem) { return (0, domhandler_1.isTag)(elem) && name(elem.name); };\n        }\n        else if (name === \"*\") {\n            return domhandler_1.isTag;\n        }\n        return function (elem) { return (0, domhandler_1.isTag)(elem) && elem.name === name; };\n    },\n    tag_type: function (type) {\n        if (typeof type === \"function\") {\n            return function (elem) { return type(elem.type); };\n        }\n        return function (elem) { return elem.type === type; };\n    },\n    tag_contains: function (data) {\n        if (typeof data === \"function\") {\n            return function (elem) { return (0, domhandler_1.isText)(elem) && data(elem.data); };\n        }\n        return function (elem) { return (0, domhandler_1.isText)(elem) && elem.data === data; };\n    },\n};\n/**\n * @param attrib Attribute to check.\n * @param value Attribute value to look for.\n * @returns A function to check whether the a node has an attribute with a particular value.\n */\nfunction getAttribCheck(attrib, value) {\n    if (typeof value === \"function\") {\n        return function (elem) { return (0, domhandler_1.isTag)(elem) && value(elem.attribs[attrib]); };\n    }\n    return function (elem) { return (0, domhandler_1.isTag)(elem) && elem.attribs[attrib] === value; };\n}\n/**\n * @param a First function to combine.\n * @param b Second function to combine.\n * @returns A function taking a node and returning `true` if either\n * of the input functions returns `true` for the node.\n */\nfunction combineFuncs(a, b) {\n    return function (elem) { return a(elem) || b(elem); };\n}\n/**\n * @param options An object describing nodes to look for.\n * @returns A function executing all checks in `options` and returning `true`\n * if any of them match a node.\n */\nfunction compileTest(options) {\n    var funcs = Object.keys(options).map(function (key) {\n        var value = options[key];\n        return Object.prototype.hasOwnProperty.call(Checks, key)\n            ? Checks[key](value)\n            : getAttribCheck(key, value);\n    });\n    return funcs.length === 0 ? null : funcs.reduce(combineFuncs);\n}\n/**\n * @param options An object describing nodes to look for.\n * @param node The element to test.\n * @returns Whether the element matches the description in `options`.\n */\nfunction testElement(options, node) {\n    var test = compileTest(options);\n    return test ? test(node) : true;\n}\nexports.testElement = testElement;\n/**\n * @param options An object describing nodes to look for.\n * @param nodes Nodes to search through.\n * @param recurse Also consider child nodes.\n * @param limit Maximum number of nodes to return.\n * @returns All nodes that match `options`.\n */\nfunction getElements(options, nodes, recurse, limit) {\n    if (limit === void 0) { limit = Infinity; }\n    var test = compileTest(options);\n    return test ? (0, querying_1.filter)(test, nodes, recurse, limit) : [];\n}\nexports.getElements = getElements;\n/**\n * @param id The unique ID attribute value to look for.\n * @param nodes Nodes to search through.\n * @param recurse Also consider child nodes.\n * @returns The node with the supplied ID.\n */\nfunction getElementById(id, nodes, recurse) {\n    if (recurse === void 0) { recurse = true; }\n    if (!Array.isArray(nodes))\n        nodes = [nodes];\n    return (0, querying_1.findOne)(getAttribCheck(\"id\", id), nodes, recurse);\n}\nexports.getElementById = getElementById;\n/**\n * @param tagName Tag name to search for.\n * @param nodes Nodes to search through.\n * @param recurse Also consider child nodes.\n * @param limit Maximum number of nodes to return.\n * @returns All nodes with the supplied `tagName`.\n */\nfunction getElementsByTagName(tagName, nodes, recurse, limit) {\n    if (recurse === void 0) { recurse = true; }\n    if (limit === void 0) { limit = Infinity; }\n    return (0, querying_1.filter)(Checks.tag_name(tagName), nodes, recurse, limit);\n}\nexports.getElementsByTagName = getElementsByTagName;\n/**\n * @param type Element type to look for.\n * @param nodes Nodes to search through.\n * @param recurse Also consider child nodes.\n * @param limit Maximum number of nodes to return.\n * @returns All nodes with the supplied `type`.\n */\nfunction getElementsByTagType(type, nodes, recurse, limit) {\n    if (recurse === void 0) { recurse = true; }\n    if (limit === void 0) { limit = Infinity; }\n    return (0, querying_1.filter)(Checks.tag_type(type), nodes, recurse, limit);\n}\nexports.getElementsByTagType = getElementsByTagType;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.prepend = exports.prependChild = exports.append = exports.appendChild = exports.replaceElement = exports.removeElement = void 0;\n/**\n * Remove an element from the dom\n *\n * @param elem The element to be removed\n */\nfunction removeElement(elem) {\n    if (elem.prev)\n        elem.prev.next = elem.next;\n    if (elem.next)\n        elem.next.prev = elem.prev;\n    if (elem.parent) {\n        var childs = elem.parent.children;\n        childs.splice(childs.lastIndexOf(elem), 1);\n    }\n}\nexports.removeElement = removeElement;\n/**\n * Replace an element in the dom\n *\n * @param elem The element to be replaced\n * @param replacement The element to be added\n */\nfunction replaceElement(elem, replacement) {\n    var prev = (replacement.prev = elem.prev);\n    if (prev) {\n        prev.next = replacement;\n    }\n    var next = (replacement.next = elem.next);\n    if (next) {\n        next.prev = replacement;\n    }\n    var parent = (replacement.parent = elem.parent);\n    if (parent) {\n        var childs = parent.children;\n        childs[childs.lastIndexOf(elem)] = replacement;\n    }\n}\nexports.replaceElement = replaceElement;\n/**\n * Append a child to an element.\n *\n * @param elem The element to append to.\n * @param child The element to be added as a child.\n */\nfunction appendChild(elem, child) {\n    removeElement(child);\n    child.next = null;\n    child.parent = elem;\n    if (elem.children.push(child) > 1) {\n        var sibling = elem.children[elem.children.length - 2];\n        sibling.next = child;\n        child.prev = sibling;\n    }\n    else {\n        child.prev = null;\n    }\n}\nexports.appendChild = appendChild;\n/**\n * Append an element after another.\n *\n * @param elem The element to append after.\n * @param next The element be added.\n */\nfunction append(elem, next) {\n    removeElement(next);\n    var parent = elem.parent;\n    var currNext = elem.next;\n    next.next = currNext;\n    next.prev = elem;\n    elem.next = next;\n    next.parent = parent;\n    if (currNext) {\n        currNext.prev = next;\n        if (parent) {\n            var childs = parent.children;\n            childs.splice(childs.lastIndexOf(currNext), 0, next);\n        }\n    }\n    else if (parent) {\n        parent.children.push(next);\n    }\n}\nexports.append = append;\n/**\n * Prepend a child to an element.\n *\n * @param elem The element to prepend before.\n * @param child The element to be added as a child.\n */\nfunction prependChild(elem, child) {\n    removeElement(child);\n    child.parent = elem;\n    child.prev = null;\n    if (elem.children.unshift(child) !== 1) {\n        var sibling = elem.children[1];\n        sibling.prev = child;\n        child.next = sibling;\n    }\n    else {\n        child.next = null;\n    }\n}\nexports.prependChild = prependChild;\n/**\n * Prepend an element before another.\n *\n * @param elem The element to prepend before.\n * @param prev The element be added.\n */\nfunction prepend(elem, prev) {\n    removeElement(prev);\n    var parent = elem.parent;\n    if (parent) {\n        var childs = parent.children;\n        childs.splice(childs.indexOf(elem), 0, prev);\n    }\n    if (elem.prev) {\n        elem.prev.next = prev;\n    }\n    prev.parent = parent;\n    prev.prev = elem.prev;\n    prev.next = elem;\n    elem.prev = prev;\n}\nexports.prepend = prepend;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.findAll = exports.existsOne = exports.findOne = exports.findOneChild = exports.find = exports.filter = void 0;\nvar domhandler_1 = require(\"domhandler\");\n/**\n * Search a node and its children for nodes passing a test function.\n *\n * @param test Function to test nodes on.\n * @param node Node to search. Will be included in the result set if it matches.\n * @param recurse Also consider child nodes.\n * @param limit Maximum number of nodes to return.\n * @returns All nodes passing `test`.\n */\nfunction filter(test, node, recurse, limit) {\n    if (recurse === void 0) { recurse = true; }\n    if (limit === void 0) { limit = Infinity; }\n    if (!Array.isArray(node))\n        node = [node];\n    return find(test, node, recurse, limit);\n}\nexports.filter = filter;\n/**\n * Search an array of node and its children for nodes passing a test function.\n *\n * @param test Function to test nodes on.\n * @param nodes Array of nodes to search.\n * @param recurse Also consider child nodes.\n * @param limit Maximum number of nodes to return.\n * @returns All nodes passing `test`.\n */\nfunction find(test, nodes, recurse, limit) {\n    var result = [];\n    for (var _i = 0, nodes_1 = nodes; _i < nodes_1.length; _i++) {\n        var elem = nodes_1[_i];\n        if (test(elem)) {\n            result.push(elem);\n            if (--limit <= 0)\n                break;\n        }\n        if (recurse && (0, domhandler_1.hasChildren)(elem) && elem.children.length > 0) {\n            var children = find(test, elem.children, recurse, limit);\n            result.push.apply(result, children);\n            limit -= children.length;\n            if (limit <= 0)\n                break;\n        }\n    }\n    return result;\n}\nexports.find = find;\n/**\n * Finds the first element inside of an array that matches a test function.\n *\n * @param test Function to test nodes on.\n * @param nodes Array of nodes to search.\n * @returns The first node in the array that passes `test`.\n */\nfunction findOneChild(test, nodes) {\n    return nodes.find(test);\n}\nexports.findOneChild = findOneChild;\n/**\n * Finds one element in a tree that passes a test.\n *\n * @param test Function to test nodes on.\n * @param nodes Array of nodes to search.\n * @param recurse Also consider child nodes.\n * @returns The first child node that passes `test`.\n */\nfunction findOne(test, nodes, recurse) {\n    if (recurse === void 0) { recurse = true; }\n    var elem = null;\n    for (var i = 0; i < nodes.length && !elem; i++) {\n        var checked = nodes[i];\n        if (!(0, domhandler_1.isTag)(checked)) {\n            continue;\n        }\n        else if (test(checked)) {\n            elem = checked;\n        }\n        else if (recurse && checked.children.length > 0) {\n            elem = findOne(test, checked.children);\n        }\n    }\n    return elem;\n}\nexports.findOne = findOne;\n/**\n * @param test Function to test nodes on.\n * @param nodes Array of nodes to search.\n * @returns Whether a tree of nodes contains at least one node passing a test.\n */\nfunction existsOne(test, nodes) {\n    return nodes.some(function (checked) {\n        return (0, domhandler_1.isTag)(checked) &&\n            (test(checked) ||\n                (checked.children.length > 0 &&\n                    existsOne(test, checked.children)));\n    });\n}\nexports.existsOne = existsOne;\n/**\n * Search and array of nodes and its children for nodes passing a test function.\n *\n * Same as `find`, only with less options, leading to reduced complexity.\n *\n * @param test Function to test nodes on.\n * @param nodes Array of nodes to search.\n * @returns All nodes passing `test`.\n */\nfunction findAll(test, nodes) {\n    var _a;\n    var result = [];\n    var stack = nodes.filter(domhandler_1.isTag);\n    var elem;\n    while ((elem = stack.shift())) {\n        var children = (_a = elem.children) === null || _a === void 0 ? void 0 : _a.filter(domhandler_1.isTag);\n        if (children && children.length > 0) {\n            stack.unshift.apply(stack, children);\n        }\n        if (test(elem))\n            result.push(elem);\n    }\n    return result;\n}\nexports.findAll = findAll;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.innerText = exports.textContent = exports.getText = exports.getInnerHTML = exports.getOuterHTML = void 0;\nvar domhandler_1 = require(\"domhandler\");\nvar dom_serializer_1 = __importDefault(require(\"dom-serializer\"));\nvar domelementtype_1 = require(\"domelementtype\");\n/**\n * @param node Node to get the outer HTML of.\n * @param options Options for serialization.\n * @deprecated Use the `dom-serializer` module directly.\n * @returns `node`'s outer HTML.\n */\nfunction getOuterHTML(node, options) {\n    return (0, dom_serializer_1.default)(node, options);\n}\nexports.getOuterHTML = getOuterHTML;\n/**\n * @param node Node to get the inner HTML of.\n * @param options Options for serialization.\n * @deprecated Use the `dom-serializer` module directly.\n * @returns `node`'s inner HTML.\n */\nfunction getInnerHTML(node, options) {\n    return (0, domhandler_1.hasChildren)(node)\n        ? node.children.map(function (node) { return getOuterHTML(node, options); }).join(\"\")\n        : \"\";\n}\nexports.getInnerHTML = getInnerHTML;\n/**\n * Get a node's inner text. Same as `textContent`, but inserts newlines for `<br>` tags.\n *\n * @deprecated Use `textContent` instead.\n * @param node Node to get the inner text of.\n * @returns `node`'s inner text.\n */\nfunction getText(node) {\n    if (Array.isArray(node))\n        return node.map(getText).join(\"\");\n    if ((0, domhandler_1.isTag)(node))\n        return node.name === \"br\" ? \"\\n\" : getText(node.children);\n    if ((0, domhandler_1.isCDATA)(node))\n        return getText(node.children);\n    if ((0, domhandler_1.isText)(node))\n        return node.data;\n    return \"\";\n}\nexports.getText = getText;\n/**\n * Get a node's text content.\n *\n * @param node Node to get the text content of.\n * @returns `node`'s text content.\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent}\n */\nfunction textContent(node) {\n    if (Array.isArray(node))\n        return node.map(textContent).join(\"\");\n    if ((0, domhandler_1.hasChildren)(node) && !(0, domhandler_1.isComment)(node)) {\n        return textContent(node.children);\n    }\n    if ((0, domhandler_1.isText)(node))\n        return node.data;\n    return \"\";\n}\nexports.textContent = textContent;\n/**\n * Get a node's inner text.\n *\n * @param node Node to get the inner text of.\n * @returns `node`'s inner text.\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Node/innerText}\n */\nfunction innerText(node) {\n    if (Array.isArray(node))\n        return node.map(innerText).join(\"\");\n    if ((0, domhandler_1.hasChildren)(node) && (node.type === domelementtype_1.ElementType.Tag || (0, domhandler_1.isCDATA)(node))) {\n        return innerText(node.children);\n    }\n    if ((0, domhandler_1.isText)(node))\n        return node.data;\n    return \"\";\n}\nexports.innerText = innerText;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.prevElementSibling = exports.nextElementSibling = exports.getName = exports.hasAttrib = exports.getAttributeValue = exports.getSiblings = exports.getParent = exports.getChildren = void 0;\nvar domhandler_1 = require(\"domhandler\");\nvar emptyArray = [];\n/**\n * Get a node's children.\n *\n * @param elem Node to get the children of.\n * @returns `elem`'s children, or an empty array.\n */\nfunction getChildren(elem) {\n    var _a;\n    return (_a = elem.children) !== null && _a !== void 0 ? _a : emptyArray;\n}\nexports.getChildren = getChildren;\n/**\n * Get a node's parent.\n *\n * @param elem Node to get the parent of.\n * @returns `elem`'s parent node.\n */\nfunction getParent(elem) {\n    return elem.parent || null;\n}\nexports.getParent = getParent;\n/**\n * Gets an elements siblings, including the element itself.\n *\n * Attempts to get the children through the element's parent first.\n * If we don't have a parent (the element is a root node),\n * we walk the element's `prev` & `next` to get all remaining nodes.\n *\n * @param elem Element to get the siblings of.\n * @returns `elem`'s siblings.\n */\nfunction getSiblings(elem) {\n    var _a, _b;\n    var parent = getParent(elem);\n    if (parent != null)\n        return getChildren(parent);\n    var siblings = [elem];\n    var prev = elem.prev, next = elem.next;\n    while (prev != null) {\n        siblings.unshift(prev);\n        (_a = prev, prev = _a.prev);\n    }\n    while (next != null) {\n        siblings.push(next);\n        (_b = next, next = _b.next);\n    }\n    return siblings;\n}\nexports.getSiblings = getSiblings;\n/**\n * Gets an attribute from an element.\n *\n * @param elem Element to check.\n * @param name Attribute name to retrieve.\n * @returns The element's attribute value, or `undefined`.\n */\nfunction getAttributeValue(elem, name) {\n    var _a;\n    return (_a = elem.attribs) === null || _a === void 0 ? void 0 : _a[name];\n}\nexports.getAttributeValue = getAttributeValue;\n/**\n * Checks whether an element has an attribute.\n *\n * @param elem Element to check.\n * @param name Attribute name to look for.\n * @returns Returns whether `elem` has the attribute `name`.\n */\nfunction hasAttrib(elem, name) {\n    return (elem.attribs != null &&\n        Object.prototype.hasOwnProperty.call(elem.attribs, name) &&\n        elem.attribs[name] != null);\n}\nexports.hasAttrib = hasAttrib;\n/**\n * Get the tag name of an element.\n *\n * @param elem The element to get the name for.\n * @returns The tag name of `elem`.\n */\nfunction getName(elem) {\n    return elem.name;\n}\nexports.getName = getName;\n/**\n * Returns the next element sibling of a node.\n *\n * @param elem The element to get the next sibling of.\n * @returns `elem`'s next sibling that is a tag.\n */\nfunction nextElementSibling(elem) {\n    var _a;\n    var next = elem.next;\n    while (next !== null && !(0, domhandler_1.isTag)(next))\n        (_a = next, next = _a.next);\n    return next;\n}\nexports.nextElementSibling = nextElementSibling;\n/**\n * Returns the previous element sibling of a node.\n *\n * @param elem The element to get the previous sibling of.\n * @returns `elem`'s previous sibling that is a tag.\n */\nfunction prevElementSibling(elem) {\n    var _a;\n    var prev = elem.prev;\n    while (prev !== null && !(0, domhandler_1.isTag)(prev))\n        (_a = prev, prev = _a.prev);\n    return prev;\n}\nexports.prevElementSibling = prevElementSibling;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.decodeHTML = exports.decodeHTMLStrict = exports.decodeXML = void 0;\nvar entities_json_1 = __importDefault(require(\"./maps/entities.json\"));\nvar legacy_json_1 = __importDefault(require(\"./maps/legacy.json\"));\nvar xml_json_1 = __importDefault(require(\"./maps/xml.json\"));\nvar decode_codepoint_1 = __importDefault(require(\"./decode_codepoint\"));\nvar strictEntityRe = /&(?:[a-zA-Z0-9]+|#[xX][\\da-fA-F]+|#\\d+);/g;\nexports.decodeXML = getStrictDecoder(xml_json_1.default);\nexports.decodeHTMLStrict = getStrictDecoder(entities_json_1.default);\nfunction getStrictDecoder(map) {\n    var replace = getReplacer(map);\n    return function (str) { return String(str).replace(strictEntityRe, replace); };\n}\nvar sorter = function (a, b) { return (a < b ? 1 : -1); };\nexports.decodeHTML = (function () {\n    var legacy = Object.keys(legacy_json_1.default).sort(sorter);\n    var keys = Object.keys(entities_json_1.default).sort(sorter);\n    for (var i = 0, j = 0; i < keys.length; i++) {\n        if (legacy[j] === keys[i]) {\n            keys[i] += \";?\";\n            j++;\n        }\n        else {\n            keys[i] += \";\";\n        }\n    }\n    var re = new RegExp(\"&(?:\" + keys.join(\"|\") + \"|#[xX][\\\\da-fA-F]+;?|#\\\\d+;?)\", \"g\");\n    var replace = getReplacer(entities_json_1.default);\n    function replacer(str) {\n        if (str.substr(-1) !== \";\")\n            str += \";\";\n        return replace(str);\n    }\n    // TODO consider creating a merged map\n    return function (str) { return String(str).replace(re, replacer); };\n})();\nfunction getReplacer(map) {\n    return function replace(str) {\n        if (str.charAt(1) === \"#\") {\n            var secondChar = str.charAt(2);\n            if (secondChar === \"X\" || secondChar === \"x\") {\n                return decode_codepoint_1.default(parseInt(str.substr(3), 16));\n            }\n            return decode_codepoint_1.default(parseInt(str.substr(2), 10));\n        }\n        // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n        return map[str.slice(1, -1)] || str;\n    };\n}\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar decode_json_1 = __importDefault(require(\"./maps/decode.json\"));\n// Adapted from https://github.com/mathiasbynens/he/blob/master/src/he.js#L94-L119\nvar fromCodePoint = \n// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\nString.fromCodePoint ||\n    function (codePoint) {\n        var output = \"\";\n        if (codePoint > 0xffff) {\n            codePoint -= 0x10000;\n            output += String.fromCharCode(((codePoint >>> 10) & 0x3ff) | 0xd800);\n            codePoint = 0xdc00 | (codePoint & 0x3ff);\n        }\n        output += String.fromCharCode(codePoint);\n        return output;\n    };\nfunction decodeCodePoint(codePoint) {\n    if ((codePoint >= 0xd800 && codePoint <= 0xdfff) || codePoint > 0x10ffff) {\n        return \"\\uFFFD\";\n    }\n    if (codePoint in decode_json_1.default) {\n        codePoint = decode_json_1.default[codePoint];\n    }\n    return fromCodePoint(codePoint);\n}\nexports.default = decodeCodePoint;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.escapeUTF8 = exports.escape = exports.encodeNonAsciiHTML = exports.encodeHTML = exports.encodeXML = void 0;\nvar xml_json_1 = __importDefault(require(\"./maps/xml.json\"));\nvar inverseXML = getInverseObj(xml_json_1.default);\nvar xmlReplacer = getInverseReplacer(inverseXML);\n/**\n * Encodes all non-ASCII characters, as well as characters not valid in XML\n * documents using XML entities.\n *\n * If a character has no equivalent entity, a\n * numeric hexadecimal reference (eg. `&#xfc;`) will be used.\n */\nexports.encodeXML = getASCIIEncoder(inverseXML);\nvar entities_json_1 = __importDefault(require(\"./maps/entities.json\"));\nvar inverseHTML = getInverseObj(entities_json_1.default);\nvar htmlReplacer = getInverseReplacer(inverseHTML);\n/**\n * Encodes all entities and non-ASCII characters in the input.\n *\n * This includes characters that are valid ASCII characters in HTML documents.\n * For example `#` will be encoded as `&num;`. To get a more compact output,\n * consider using the `encodeNonAsciiHTML` function.\n *\n * If a character has no equivalent entity, a\n * numeric hexadecimal reference (eg. `&#xfc;`) will be used.\n */\nexports.encodeHTML = getInverse(inverseHTML, htmlReplacer);\n/**\n * Encodes all non-ASCII characters, as well as characters not valid in HTML\n * documents using HTML entities.\n *\n * If a character has no equivalent entity, a\n * numeric hexadecimal reference (eg. `&#xfc;`) will be used.\n */\nexports.encodeNonAsciiHTML = getASCIIEncoder(inverseHTML);\nfunction getInverseObj(obj) {\n    return Object.keys(obj)\n        .sort()\n        .reduce(function (inverse, name) {\n        inverse[obj[name]] = \"&\" + name + \";\";\n        return inverse;\n    }, {});\n}\nfunction getInverseReplacer(inverse) {\n    var single = [];\n    var multiple = [];\n    for (var _i = 0, _a = Object.keys(inverse); _i < _a.length; _i++) {\n        var k = _a[_i];\n        if (k.length === 1) {\n            // Add value to single array\n            single.push(\"\\\\\" + k);\n        }\n        else {\n            // Add value to multiple array\n            multiple.push(k);\n        }\n    }\n    // Add ranges to single characters.\n    single.sort();\n    for (var start = 0; start < single.length - 1; start++) {\n        // Find the end of a run of characters\n        var end = start;\n        while (end < single.length - 1 &&\n            single[end].charCodeAt(1) + 1 === single[end + 1].charCodeAt(1)) {\n            end += 1;\n        }\n        var count = 1 + end - start;\n        // We want to replace at least three characters\n        if (count < 3)\n            continue;\n        single.splice(start, count, single[start] + \"-\" + single[end]);\n    }\n    multiple.unshift(\"[\" + single.join(\"\") + \"]\");\n    return new RegExp(multiple.join(\"|\"), \"g\");\n}\n// /[^\\0-\\x7F]/gu\nvar reNonASCII = /(?:[\\x80-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF])/g;\nvar getCodePoint = \n// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\nString.prototype.codePointAt != null\n    ? // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n        function (str) { return str.codePointAt(0); }\n    : // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n        function (c) {\n            return (c.charCodeAt(0) - 0xd800) * 0x400 +\n                c.charCodeAt(1) -\n                0xdc00 +\n                0x10000;\n        };\nfunction singleCharReplacer(c) {\n    return \"&#x\" + (c.length > 1 ? getCodePoint(c) : c.charCodeAt(0))\n        .toString(16)\n        .toUpperCase() + \";\";\n}\nfunction getInverse(inverse, re) {\n    return function (data) {\n        return data\n            .replace(re, function (name) { return inverse[name]; })\n            .replace(reNonASCII, singleCharReplacer);\n    };\n}\nvar reEscapeChars = new RegExp(xmlReplacer.source + \"|\" + reNonASCII.source, \"g\");\n/**\n * Encodes all non-ASCII characters, as well as characters not valid in XML\n * documents using numeric hexadecimal reference (eg. `&#xfc;`).\n *\n * Have a look at `escapeUTF8` if you want a more concise output at the expense\n * of reduced transportability.\n *\n * @param data String to escape.\n */\nfunction escape(data) {\n    return data.replace(reEscapeChars, singleCharReplacer);\n}\nexports.escape = escape;\n/**\n * Encodes all characters not valid in XML documents using numeric hexadecimal\n * reference (eg. `&#xfc;`).\n *\n * Note that the output will be character-set dependent.\n *\n * @param data String to escape.\n */\nfunction escapeUTF8(data) {\n    return data.replace(xmlReplacer, singleCharReplacer);\n}\nexports.escapeUTF8 = escapeUTF8;\nfunction getASCIIEncoder(obj) {\n    return function (data) {\n        return data.replace(reEscapeChars, function (c) { return obj[c] || singleCharReplacer(c); });\n    };\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.decodeXMLStrict = exports.decodeHTML5Strict = exports.decodeHTML4Strict = exports.decodeHTML5 = exports.decodeHTML4 = exports.decodeHTMLStrict = exports.decodeHTML = exports.decodeXML = exports.encodeHTML5 = exports.encodeHTML4 = exports.escapeUTF8 = exports.escape = exports.encodeNonAsciiHTML = exports.encodeHTML = exports.encodeXML = exports.encode = exports.decodeStrict = exports.decode = void 0;\nvar decode_1 = require(\"./decode\");\nvar encode_1 = require(\"./encode\");\n/**\n * Decodes a string with entities.\n *\n * @param data String to decode.\n * @param level Optional level to decode at. 0 = XML, 1 = HTML. Default is 0.\n * @deprecated Use `decodeXML` or `decodeHTML` directly.\n */\nfunction decode(data, level) {\n    return (!level || level <= 0 ? decode_1.decodeXML : decode_1.decodeHTML)(data);\n}\nexports.decode = decode;\n/**\n * Decodes a string with entities. Does not allow missing trailing semicolons for entities.\n *\n * @param data String to decode.\n * @param level Optional level to decode at. 0 = XML, 1 = HTML. Default is 0.\n * @deprecated Use `decodeHTMLStrict` or `decodeXML` directly.\n */\nfunction decodeStrict(data, level) {\n    return (!level || level <= 0 ? decode_1.decodeXML : decode_1.decodeHTMLStrict)(data);\n}\nexports.decodeStrict = decodeStrict;\n/**\n * Encodes a string with entities.\n *\n * @param data String to encode.\n * @param level Optional level to encode at. 0 = XML, 1 = HTML. Default is 0.\n * @deprecated Use `encodeHTML`, `encodeXML` or `encodeNonAsciiHTML` directly.\n */\nfunction encode(data, level) {\n    return (!level || level <= 0 ? encode_1.encodeXML : encode_1.encodeHTML)(data);\n}\nexports.encode = encode;\nvar encode_2 = require(\"./encode\");\nObject.defineProperty(exports, \"encodeXML\", { enumerable: true, get: function () { return encode_2.encodeXML; } });\nObject.defineProperty(exports, \"encodeHTML\", { enumerable: true, get: function () { return encode_2.encodeHTML; } });\nObject.defineProperty(exports, \"encodeNonAsciiHTML\", { enumerable: true, get: function () { return encode_2.encodeNonAsciiHTML; } });\nObject.defineProperty(exports, \"escape\", { enumerable: true, get: function () { return encode_2.escape; } });\nObject.defineProperty(exports, \"escapeUTF8\", { enumerable: true, get: function () { return encode_2.escapeUTF8; } });\n// Legacy aliases (deprecated)\nObject.defineProperty(exports, \"encodeHTML4\", { enumerable: true, get: function () { return encode_2.encodeHTML; } });\nObject.defineProperty(exports, \"encodeHTML5\", { enumerable: true, get: function () { return encode_2.encodeHTML; } });\nvar decode_2 = require(\"./decode\");\nObject.defineProperty(exports, \"decodeXML\", { enumerable: true, get: function () { return decode_2.decodeXML; } });\nObject.defineProperty(exports, \"decodeHTML\", { enumerable: true, get: function () { return decode_2.decodeHTML; } });\nObject.defineProperty(exports, \"decodeHTMLStrict\", { enumerable: true, get: function () { return decode_2.decodeHTMLStrict; } });\n// Legacy aliases (deprecated)\nObject.defineProperty(exports, \"decodeHTML4\", { enumerable: true, get: function () { return decode_2.decodeHTML; } });\nObject.defineProperty(exports, \"decodeHTML5\", { enumerable: true, get: function () { return decode_2.decodeHTML; } });\nObject.defineProperty(exports, \"decodeHTML4Strict\", { enumerable: true, get: function () { return decode_2.decodeHTMLStrict; } });\nObject.defineProperty(exports, \"decodeHTML5Strict\", { enumerable: true, get: function () { return decode_2.decodeHTMLStrict; } });\nObject.defineProperty(exports, \"decodeXMLStrict\", { enumerable: true, get: function () { return decode_2.decodeXML; } });\n","module.exports = tokenize\r\n\r\nvar literals100 = require('./lib/literals')\r\n  , operators = require('./lib/operators')\r\n  , builtins100 = require('./lib/builtins')\r\n  , literals300es = require('./lib/literals-300es')\r\n  , builtins300es = require('./lib/builtins-300es')\r\n\r\nvar NORMAL = 999          // <-- never emitted\r\n  , TOKEN = 9999          // <-- never emitted\r\n  , BLOCK_COMMENT = 0\r\n  , LINE_COMMENT = 1\r\n  , PREPROCESSOR = 2\r\n  , OPERATOR = 3\r\n  , INTEGER = 4\r\n  , FLOAT = 5\r\n  , IDENT = 6\r\n  , BUILTIN = 7\r\n  , KEYWORD = 8\r\n  , WHITESPACE = 9\r\n  , EOF = 10\r\n  , HEX = 11\r\n\r\nvar map = [\r\n    'block-comment'\r\n  , 'line-comment'\r\n  , 'preprocessor'\r\n  , 'operator'\r\n  , 'integer'\r\n  , 'float'\r\n  , 'ident'\r\n  , 'builtin'\r\n  , 'keyword'\r\n  , 'whitespace'\r\n  , 'eof'\r\n  , 'integer'\r\n]\r\n\r\nfunction tokenize(opt) {\r\n  var i = 0\r\n    , total = 0\r\n    , mode = NORMAL\r\n    , c\r\n    , last\r\n    , content = []\r\n    , tokens = []\r\n    , token_idx = 0\r\n    , token_offs = 0\r\n    , line = 1\r\n    , col = 0\r\n    , start = 0\r\n    , isnum = false\r\n    , isoperator = false\r\n    , input = ''\r\n    , len\r\n\r\n  opt = opt || {}\r\n  var allBuiltins = builtins100\r\n  var allLiterals = literals100\r\n  if (opt.version === '300 es') {\r\n    allBuiltins = builtins300es\r\n    allLiterals = literals300es\r\n  }\r\n\r\n  // cache by name\r\n  var builtinsDict = {}, literalsDict = {}\r\n  for (var i = 0; i < allBuiltins.length; i++) {\r\n    builtinsDict[allBuiltins[i]] = true\r\n  }\r\n  for (var i = 0; i < allLiterals.length; i++) {\r\n    literalsDict[allLiterals[i]] = true\r\n  }\r\n\r\n  return function(data) {\r\n    tokens = []\r\n    if (data !== null) return write(data)\r\n    return end()\r\n  }\r\n\r\n  function token(data) {\r\n    if (data.length) {\r\n      tokens.push({\r\n        type: map[mode]\r\n      , data: data\r\n      , position: start\r\n      , line: line\r\n      , column: col\r\n      })\r\n    }\r\n  }\r\n\r\n  function write(chunk) {\r\n    i = 0\r\n\r\n    if (chunk.toString) chunk = chunk.toString()\r\n\r\n    input += chunk.replace(/\\r\\n/g, '\\n')\r\n    len = input.length\r\n\r\n\r\n    var last\r\n\r\n    while(c = input[i], i < len) {\r\n      last = i\r\n\r\n      switch(mode) {\r\n        case BLOCK_COMMENT: i = block_comment(); break\r\n        case LINE_COMMENT: i = line_comment(); break\r\n        case PREPROCESSOR: i = preprocessor(); break\r\n        case OPERATOR: i = operator(); break\r\n        case INTEGER: i = integer(); break\r\n        case HEX: i = hex(); break\r\n        case FLOAT: i = decimal(); break\r\n        case TOKEN: i = readtoken(); break\r\n        case WHITESPACE: i = whitespace(); break\r\n        case NORMAL: i = normal(); break\r\n      }\r\n\r\n      if(last !== i) {\r\n        switch(input[last]) {\r\n          case '\\n': col = 0; ++line; break\r\n          default: ++col; break\r\n        }\r\n      }\r\n    }\r\n\r\n    total += i\r\n    input = input.slice(i)\r\n    return tokens\r\n  }\r\n\r\n  function end(chunk) {\r\n    if(content.length) {\r\n      token(content.join(''))\r\n    }\r\n\r\n    mode = EOF\r\n    token('(eof)')\r\n    return tokens\r\n  }\r\n\r\n  function normal() {\r\n    content = content.length ? [] : content\r\n\r\n    if(last === '/' && c === '*') {\r\n      start = total + i - 1\r\n      mode = BLOCK_COMMENT\r\n      last = c\r\n      return i + 1\r\n    }\r\n\r\n    if(last === '/' && c === '/') {\r\n      start = total + i - 1\r\n      mode = LINE_COMMENT\r\n      last = c\r\n      return i + 1\r\n    }\r\n\r\n    if(c === '#') {\r\n      mode = PREPROCESSOR\r\n      start = total + i\r\n      return i\r\n    }\r\n\r\n    if(/\\s/.test(c)) {\r\n      mode = WHITESPACE\r\n      start = total + i\r\n      return i\r\n    }\r\n\r\n    isnum = /\\d/.test(c)\r\n    isoperator = /[^\\w_]/.test(c)\r\n\r\n    start = total + i\r\n    mode = isnum ? INTEGER : isoperator ? OPERATOR : TOKEN\r\n    return i\r\n  }\r\n\r\n  function whitespace() {\r\n    if(/[^\\s]/g.test(c)) {\r\n      token(content.join(''))\r\n      mode = NORMAL\r\n      return i\r\n    }\r\n    content.push(c)\r\n    last = c\r\n    return i + 1\r\n  }\r\n\r\n  function preprocessor() {\r\n    if((c === '\\r' || c === '\\n') && last !== '\\\\') {\r\n      token(content.join(''))\r\n      mode = NORMAL\r\n      return i\r\n    }\r\n    content.push(c)\r\n    last = c\r\n    return i + 1\r\n  }\r\n\r\n  function line_comment() {\r\n    return preprocessor()\r\n  }\r\n\r\n  function block_comment() {\r\n    if(c === '/' && last === '*') {\r\n      content.push(c)\r\n      token(content.join(''))\r\n      mode = NORMAL\r\n      return i + 1\r\n    }\r\n\r\n    content.push(c)\r\n    last = c\r\n    return i + 1\r\n  }\r\n\r\n  function operator() {\r\n    if(last === '.' && /\\d/.test(c)) {\r\n      mode = FLOAT\r\n      return i\r\n    }\r\n\r\n    if(last === '/' && c === '*') {\r\n      mode = BLOCK_COMMENT\r\n      return i\r\n    }\r\n\r\n    if(last === '/' && c === '/') {\r\n      mode = LINE_COMMENT\r\n      return i\r\n    }\r\n\r\n    if(c === '.' && content.length) {\r\n      while(determine_operator(content));\r\n\r\n      mode = FLOAT\r\n      return i\r\n    }\r\n\r\n    if(c === ';' || c === ')' || c === '(') {\r\n      if(content.length) while(determine_operator(content));\r\n      token(c)\r\n      mode = NORMAL\r\n      return i + 1\r\n    }\r\n\r\n    var is_composite_operator = content.length === 2 && c !== '='\r\n    if(/[\\w_\\d\\s]/.test(c) || is_composite_operator) {\r\n      while(determine_operator(content));\r\n      mode = NORMAL\r\n      return i\r\n    }\r\n\r\n    content.push(c)\r\n    last = c\r\n    return i + 1\r\n  }\r\n\r\n  function determine_operator(buf) {\r\n    var j = 0\r\n      , idx\r\n      , res\r\n\r\n    do {\r\n      idx = operators.indexOf(buf.slice(0, buf.length + j).join(''))\r\n      res = operators[idx]\r\n\r\n      if(idx === -1) {\r\n        if(j-- + buf.length > 0) continue\r\n        res = buf.slice(0, 1).join('')\r\n      }\r\n\r\n      token(res)\r\n\r\n      start += res.length\r\n      content = content.slice(res.length)\r\n      return content.length\r\n    } while(1)\r\n  }\r\n\r\n  function hex() {\r\n    if(/[^a-fA-F0-9]/.test(c)) {\r\n      token(content.join(''))\r\n      mode = NORMAL\r\n      return i\r\n    }\r\n\r\n    content.push(c)\r\n    last = c\r\n    return i + 1\r\n  }\r\n\r\n  function integer() {\r\n    if(c === '.') {\r\n      content.push(c)\r\n      mode = FLOAT\r\n      last = c\r\n      return i + 1\r\n    }\r\n\r\n    if(/[eE]/.test(c)) {\r\n      content.push(c)\r\n      mode = FLOAT\r\n      last = c\r\n      return i + 1\r\n    }\r\n\r\n    if(c === 'x' && content.length === 1 && content[0] === '0') {\r\n      mode = HEX\r\n      content.push(c)\r\n      last = c\r\n      return i + 1\r\n    }\r\n\r\n    if(/[^\\d]/.test(c)) {\r\n      token(content.join(''))\r\n      mode = NORMAL\r\n      return i\r\n    }\r\n\r\n    content.push(c)\r\n    last = c\r\n    return i + 1\r\n  }\r\n\r\n  function decimal() {\r\n    if(c === 'f') {\r\n      content.push(c)\r\n      last = c\r\n      i += 1\r\n    }\r\n\r\n    if(/[eE]/.test(c)) {\r\n      content.push(c)\r\n      last = c\r\n      return i + 1\r\n    }\r\n\r\n    if ((c === '-' || c === '+') && /[eE]/.test(last)) {\r\n      content.push(c)\r\n      last = c\r\n      return i + 1\r\n    }\r\n\r\n    if(/[^\\d]/.test(c)) {\r\n      token(content.join(''))\r\n      mode = NORMAL\r\n      return i\r\n    }\r\n\r\n    content.push(c)\r\n    last = c\r\n    return i + 1\r\n  }\r\n\r\n  function readtoken() {\r\n    if(/[^\\d\\w_]/.test(c)) {\r\n      var contentstr = content.join('')\r\n      if(literalsDict[contentstr]) {\r\n        mode = KEYWORD\r\n      } else if(builtinsDict[contentstr]) {\r\n        mode = BUILTIN\r\n      } else {\r\n        mode = IDENT\r\n      }\r\n      token(content.join(''))\r\n      mode = NORMAL\r\n      return i\r\n    }\r\n    content.push(c)\r\n    last = c\r\n    return i + 1\r\n  }\r\n}\r\n","// 300es builtins/reserved words that were previously valid in v100\r\nvar v100 = require('./builtins')\r\n\r\n// The texture2D|Cube functions have been removed\r\n// And the gl_ features are updated\r\nv100 = v100.slice().filter(function (b) {\r\n  return !/^(gl\\_|texture)/.test(b)\r\n})\r\n\r\nmodule.exports = v100.concat([\r\n  // the updated gl_ constants\r\n    'gl_VertexID'\r\n  , 'gl_InstanceID'\r\n  , 'gl_Position'\r\n  , 'gl_PointSize'\r\n  , 'gl_FragCoord'\r\n  , 'gl_FrontFacing'\r\n  , 'gl_FragDepth'\r\n  , 'gl_PointCoord'\r\n  , 'gl_MaxVertexAttribs'\r\n  , 'gl_MaxVertexUniformVectors'\r\n  , 'gl_MaxVertexOutputVectors'\r\n  , 'gl_MaxFragmentInputVectors'\r\n  , 'gl_MaxVertexTextureImageUnits'\r\n  , 'gl_MaxCombinedTextureImageUnits'\r\n  , 'gl_MaxTextureImageUnits'\r\n  , 'gl_MaxFragmentUniformVectors'\r\n  , 'gl_MaxDrawBuffers'\r\n  , 'gl_MinProgramTexelOffset'\r\n  , 'gl_MaxProgramTexelOffset'\r\n  , 'gl_DepthRangeParameters'\r\n  , 'gl_DepthRange'\r\n\r\n  // other builtins\r\n  , 'trunc'\r\n  , 'round'\r\n  , 'roundEven'\r\n  , 'isnan'\r\n  , 'isinf'\r\n  , 'floatBitsToInt'\r\n  , 'floatBitsToUint'\r\n  , 'intBitsToFloat'\r\n  , 'uintBitsToFloat'\r\n  , 'packSnorm2x16'\r\n  , 'unpackSnorm2x16'\r\n  , 'packUnorm2x16'\r\n  , 'unpackUnorm2x16'\r\n  , 'packHalf2x16'\r\n  , 'unpackHalf2x16'\r\n  , 'outerProduct'\r\n  , 'transpose'\r\n  , 'determinant'\r\n  , 'inverse'\r\n  , 'texture'\r\n  , 'textureSize'\r\n  , 'textureProj'\r\n  , 'textureLod'\r\n  , 'textureOffset'\r\n  , 'texelFetch'\r\n  , 'texelFetchOffset'\r\n  , 'textureProjOffset'\r\n  , 'textureLodOffset'\r\n  , 'textureProjLod'\r\n  , 'textureProjLodOffset'\r\n  , 'textureGrad'\r\n  , 'textureGradOffset'\r\n  , 'textureProjGrad'\r\n  , 'textureProjGradOffset'\r\n])\r\n","module.exports = [\r\n  // Keep this list sorted\r\n  'abs'\r\n  , 'acos'\r\n  , 'all'\r\n  , 'any'\r\n  , 'asin'\r\n  , 'atan'\r\n  , 'ceil'\r\n  , 'clamp'\r\n  , 'cos'\r\n  , 'cross'\r\n  , 'dFdx'\r\n  , 'dFdy'\r\n  , 'degrees'\r\n  , 'distance'\r\n  , 'dot'\r\n  , 'equal'\r\n  , 'exp'\r\n  , 'exp2'\r\n  , 'faceforward'\r\n  , 'floor'\r\n  , 'fract'\r\n  , 'gl_BackColor'\r\n  , 'gl_BackLightModelProduct'\r\n  , 'gl_BackLightProduct'\r\n  , 'gl_BackMaterial'\r\n  , 'gl_BackSecondaryColor'\r\n  , 'gl_ClipPlane'\r\n  , 'gl_ClipVertex'\r\n  , 'gl_Color'\r\n  , 'gl_DepthRange'\r\n  , 'gl_DepthRangeParameters'\r\n  , 'gl_EyePlaneQ'\r\n  , 'gl_EyePlaneR'\r\n  , 'gl_EyePlaneS'\r\n  , 'gl_EyePlaneT'\r\n  , 'gl_Fog'\r\n  , 'gl_FogCoord'\r\n  , 'gl_FogFragCoord'\r\n  , 'gl_FogParameters'\r\n  , 'gl_FragColor'\r\n  , 'gl_FragCoord'\r\n  , 'gl_FragData'\r\n  , 'gl_FragDepth'\r\n  , 'gl_FragDepthEXT'\r\n  , 'gl_FrontColor'\r\n  , 'gl_FrontFacing'\r\n  , 'gl_FrontLightModelProduct'\r\n  , 'gl_FrontLightProduct'\r\n  , 'gl_FrontMaterial'\r\n  , 'gl_FrontSecondaryColor'\r\n  , 'gl_LightModel'\r\n  , 'gl_LightModelParameters'\r\n  , 'gl_LightModelProducts'\r\n  , 'gl_LightProducts'\r\n  , 'gl_LightSource'\r\n  , 'gl_LightSourceParameters'\r\n  , 'gl_MaterialParameters'\r\n  , 'gl_MaxClipPlanes'\r\n  , 'gl_MaxCombinedTextureImageUnits'\r\n  , 'gl_MaxDrawBuffers'\r\n  , 'gl_MaxFragmentUniformComponents'\r\n  , 'gl_MaxLights'\r\n  , 'gl_MaxTextureCoords'\r\n  , 'gl_MaxTextureImageUnits'\r\n  , 'gl_MaxTextureUnits'\r\n  , 'gl_MaxVaryingFloats'\r\n  , 'gl_MaxVertexAttribs'\r\n  , 'gl_MaxVertexTextureImageUnits'\r\n  , 'gl_MaxVertexUniformComponents'\r\n  , 'gl_ModelViewMatrix'\r\n  , 'gl_ModelViewMatrixInverse'\r\n  , 'gl_ModelViewMatrixInverseTranspose'\r\n  , 'gl_ModelViewMatrixTranspose'\r\n  , 'gl_ModelViewProjectionMatrix'\r\n  , 'gl_ModelViewProjectionMatrixInverse'\r\n  , 'gl_ModelViewProjectionMatrixInverseTranspose'\r\n  , 'gl_ModelViewProjectionMatrixTranspose'\r\n  , 'gl_MultiTexCoord0'\r\n  , 'gl_MultiTexCoord1'\r\n  , 'gl_MultiTexCoord2'\r\n  , 'gl_MultiTexCoord3'\r\n  , 'gl_MultiTexCoord4'\r\n  , 'gl_MultiTexCoord5'\r\n  , 'gl_MultiTexCoord6'\r\n  , 'gl_MultiTexCoord7'\r\n  , 'gl_Normal'\r\n  , 'gl_NormalMatrix'\r\n  , 'gl_NormalScale'\r\n  , 'gl_ObjectPlaneQ'\r\n  , 'gl_ObjectPlaneR'\r\n  , 'gl_ObjectPlaneS'\r\n  , 'gl_ObjectPlaneT'\r\n  , 'gl_Point'\r\n  , 'gl_PointCoord'\r\n  , 'gl_PointParameters'\r\n  , 'gl_PointSize'\r\n  , 'gl_Position'\r\n  , 'gl_ProjectionMatrix'\r\n  , 'gl_ProjectionMatrixInverse'\r\n  , 'gl_ProjectionMatrixInverseTranspose'\r\n  , 'gl_ProjectionMatrixTranspose'\r\n  , 'gl_SecondaryColor'\r\n  , 'gl_TexCoord'\r\n  , 'gl_TextureEnvColor'\r\n  , 'gl_TextureMatrix'\r\n  , 'gl_TextureMatrixInverse'\r\n  , 'gl_TextureMatrixInverseTranspose'\r\n  , 'gl_TextureMatrixTranspose'\r\n  , 'gl_Vertex'\r\n  , 'greaterThan'\r\n  , 'greaterThanEqual'\r\n  , 'inversesqrt'\r\n  , 'length'\r\n  , 'lessThan'\r\n  , 'lessThanEqual'\r\n  , 'log'\r\n  , 'log2'\r\n  , 'matrixCompMult'\r\n  , 'max'\r\n  , 'min'\r\n  , 'mix'\r\n  , 'mod'\r\n  , 'normalize'\r\n  , 'not'\r\n  , 'notEqual'\r\n  , 'pow'\r\n  , 'radians'\r\n  , 'reflect'\r\n  , 'refract'\r\n  , 'sign'\r\n  , 'sin'\r\n  , 'smoothstep'\r\n  , 'sqrt'\r\n  , 'step'\r\n  , 'tan'\r\n  , 'texture2D'\r\n  , 'texture2DLod'\r\n  , 'texture2DProj'\r\n  , 'texture2DProjLod'\r\n  , 'textureCube'\r\n  , 'textureCubeLod'\r\n  , 'texture2DLodEXT'\r\n  , 'texture2DProjLodEXT'\r\n  , 'textureCubeLodEXT'\r\n  , 'texture2DGradEXT'\r\n  , 'texture2DProjGradEXT'\r\n  , 'textureCubeGradEXT'\r\n]\r\n","var v100 = require('./literals')\r\n\r\nmodule.exports = v100.slice().concat([\r\n   'layout'\r\n  , 'centroid'\r\n  , 'smooth'\r\n  , 'case'\r\n  , 'mat2x2'\r\n  , 'mat2x3'\r\n  , 'mat2x4'\r\n  , 'mat3x2'\r\n  , 'mat3x3'\r\n  , 'mat3x4'\r\n  , 'mat4x2'\r\n  , 'mat4x3'\r\n  , 'mat4x4'\r\n  , 'uvec2'\r\n  , 'uvec3'\r\n  , 'uvec4'\r\n  , 'samplerCubeShadow'\r\n  , 'sampler2DArray'\r\n  , 'sampler2DArrayShadow'\r\n  , 'isampler2D'\r\n  , 'isampler3D'\r\n  , 'isamplerCube'\r\n  , 'isampler2DArray'\r\n  , 'usampler2D'\r\n  , 'usampler3D'\r\n  , 'usamplerCube'\r\n  , 'usampler2DArray'\r\n  , 'coherent'\r\n  , 'restrict'\r\n  , 'readonly'\r\n  , 'writeonly'\r\n  , 'resource'\r\n  , 'atomic_uint'\r\n  , 'noperspective'\r\n  , 'patch'\r\n  , 'sample'\r\n  , 'subroutine'\r\n  , 'common'\r\n  , 'partition'\r\n  , 'active'\r\n  , 'filter'\r\n  , 'image1D'\r\n  , 'image2D'\r\n  , 'image3D'\r\n  , 'imageCube'\r\n  , 'iimage1D'\r\n  , 'iimage2D'\r\n  , 'iimage3D'\r\n  , 'iimageCube'\r\n  , 'uimage1D'\r\n  , 'uimage2D'\r\n  , 'uimage3D'\r\n  , 'uimageCube'\r\n  , 'image1DArray'\r\n  , 'image2DArray'\r\n  , 'iimage1DArray'\r\n  , 'iimage2DArray'\r\n  , 'uimage1DArray'\r\n  , 'uimage2DArray'\r\n  , 'image1DShadow'\r\n  , 'image2DShadow'\r\n  , 'image1DArrayShadow'\r\n  , 'image2DArrayShadow'\r\n  , 'imageBuffer'\r\n  , 'iimageBuffer'\r\n  , 'uimageBuffer'\r\n  , 'sampler1DArray'\r\n  , 'sampler1DArrayShadow'\r\n  , 'isampler1D'\r\n  , 'isampler1DArray'\r\n  , 'usampler1D'\r\n  , 'usampler1DArray'\r\n  , 'isampler2DRect'\r\n  , 'usampler2DRect'\r\n  , 'samplerBuffer'\r\n  , 'isamplerBuffer'\r\n  , 'usamplerBuffer'\r\n  , 'sampler2DMS'\r\n  , 'isampler2DMS'\r\n  , 'usampler2DMS'\r\n  , 'sampler2DMSArray'\r\n  , 'isampler2DMSArray'\r\n  , 'usampler2DMSArray'\r\n])\r\n","module.exports = [\r\n  // current\r\n    'precision'\r\n  , 'highp'\r\n  , 'mediump'\r\n  , 'lowp'\r\n  , 'attribute'\r\n  , 'const'\r\n  , 'uniform'\r\n  , 'varying'\r\n  , 'break'\r\n  , 'continue'\r\n  , 'do'\r\n  , 'for'\r\n  , 'while'\r\n  , 'if'\r\n  , 'else'\r\n  , 'in'\r\n  , 'out'\r\n  , 'inout'\r\n  , 'float'\r\n  , 'int'\r\n  , 'uint'\r\n  , 'void'\r\n  , 'bool'\r\n  , 'true'\r\n  , 'false'\r\n  , 'discard'\r\n  , 'return'\r\n  , 'mat2'\r\n  , 'mat3'\r\n  , 'mat4'\r\n  , 'vec2'\r\n  , 'vec3'\r\n  , 'vec4'\r\n  , 'ivec2'\r\n  , 'ivec3'\r\n  , 'ivec4'\r\n  , 'bvec2'\r\n  , 'bvec3'\r\n  , 'bvec4'\r\n  , 'sampler1D'\r\n  , 'sampler2D'\r\n  , 'sampler3D'\r\n  , 'samplerCube'\r\n  , 'sampler1DShadow'\r\n  , 'sampler2DShadow'\r\n  , 'struct'\r\n\r\n  // future\r\n  , 'asm'\r\n  , 'class'\r\n  , 'union'\r\n  , 'enum'\r\n  , 'typedef'\r\n  , 'template'\r\n  , 'this'\r\n  , 'packed'\r\n  , 'goto'\r\n  , 'switch'\r\n  , 'default'\r\n  , 'inline'\r\n  , 'noinline'\r\n  , 'volatile'\r\n  , 'public'\r\n  , 'static'\r\n  , 'extern'\r\n  , 'external'\r\n  , 'interface'\r\n  , 'long'\r\n  , 'short'\r\n  , 'double'\r\n  , 'half'\r\n  , 'fixed'\r\n  , 'unsigned'\r\n  , 'input'\r\n  , 'output'\r\n  , 'hvec2'\r\n  , 'hvec3'\r\n  , 'hvec4'\r\n  , 'dvec2'\r\n  , 'dvec3'\r\n  , 'dvec4'\r\n  , 'fvec2'\r\n  , 'fvec3'\r\n  , 'fvec4'\r\n  , 'sampler2DRect'\r\n  , 'sampler3DRect'\r\n  , 'sampler2DRectShadow'\r\n  , 'sizeof'\r\n  , 'cast'\r\n  , 'namespace'\r\n  , 'using'\r\n]\r\n","module.exports = [\r\n    '<<='\r\n  , '>>='\r\n  , '++'\r\n  , '--'\r\n  , '<<'\r\n  , '>>'\r\n  , '<='\r\n  , '>='\r\n  , '=='\r\n  , '!='\r\n  , '&&'\r\n  , '||'\r\n  , '+='\r\n  , '-='\r\n  , '*='\r\n  , '/='\r\n  , '%='\r\n  , '&='\r\n  , '^^'\r\n  , '^='\r\n  , '|='\r\n  , '('\r\n  , ')'\r\n  , '['\r\n  , ']'\r\n  , '.'\r\n  , '!'\r\n  , '~'\r\n  , '*'\r\n  , '/'\r\n  , '%'\r\n  , '+'\r\n  , '-'\r\n  , '<'\r\n  , '>'\r\n  , '&'\r\n  , '^'\r\n  , '|'\r\n  , '?'\r\n  , ':'\r\n  , '='\r\n  , ','\r\n  , ';'\r\n  , '{'\r\n  , '}'\r\n]\r\n","var tokenize = require('./index')\r\n\r\nmodule.exports = tokenizeString\r\n\r\nfunction tokenizeString(str, opt) {\r\n  var generator = tokenize(opt)\r\n  var tokens = []\r\n\r\n  tokens = tokens.concat(generator(str))\r\n  tokens = tokens.concat(generator(null))\r\n\r\n  return tokens\r\n}\r\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.compile = void 0;\nvar boolbase_1 = require(\"boolbase\");\n/**\n * Returns a function that checks if an elements index matches the given rule\n * highly optimized to return the fastest solution.\n *\n * @param parsed A tuple [a, b], as returned by `parse`.\n * @returns A highly optimized function that returns whether an index matches the nth-check.\n * @example\n * const check = nthCheck.compile([2, 3]);\n *\n * check(0); // `false`\n * check(1); // `false`\n * check(2); // `true`\n * check(3); // `false`\n * check(4); // `true`\n * check(5); // `false`\n * check(6); // `true`\n */\nfunction compile(parsed) {\n    var a = parsed[0];\n    // Subtract 1 from `b`, to convert from one- to zero-indexed.\n    var b = parsed[1] - 1;\n    /*\n     * When `b <= 0`, `a * n` won't be lead to any matches for `a < 0`.\n     * Besides, the specification states that no elements are\n     * matched when `a` and `b` are 0.\n     *\n     * `b < 0` here as we subtracted 1 from `b` above.\n     */\n    if (b < 0 && a <= 0)\n        return boolbase_1.falseFunc;\n    // When `a` is in the range -1..1, it matches any element (so only `b` is checked).\n    if (a === -1)\n        return function (index) { return index <= b; };\n    if (a === 0)\n        return function (index) { return index === b; };\n    // When `b <= 0` and `a === 1`, they match any element.\n    if (a === 1)\n        return b < 0 ? boolbase_1.trueFunc : function (index) { return index >= b; };\n    /*\n     * Otherwise, modulo can be used to check if there is a match.\n     *\n     * Modulo doesn't care about the sign, so let's use `a`s absolute value.\n     */\n    var absA = Math.abs(a);\n    // Get `b mod a`, + a if this is negative.\n    var bMod = ((b % absA) + absA) % absA;\n    return a > 1\n        ? function (index) { return index >= b && index % absA === bMod; }\n        : function (index) { return index <= b && index % absA === bMod; };\n}\nexports.compile = compile;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.compile = exports.parse = void 0;\nvar parse_1 = require(\"./parse\");\nObject.defineProperty(exports, \"parse\", { enumerable: true, get: function () { return parse_1.parse; } });\nvar compile_1 = require(\"./compile\");\nObject.defineProperty(exports, \"compile\", { enumerable: true, get: function () { return compile_1.compile; } });\n/**\n * Parses and compiles a formula to a highly optimized function.\n * Combination of `parse` and `compile`.\n *\n * If the formula doesn't match any elements,\n * it returns [`boolbase`](https://github.com/fb55/boolbase)'s `falseFunc`.\n * Otherwise, a function accepting an _index_ is returned, which returns\n * whether or not the passed _index_ matches the formula.\n *\n * Note: The nth-rule starts counting at `1`, the returned function at `0`.\n *\n * @param formula The formula to compile.\n * @example\n * const check = nthCheck(\"2n+3\");\n *\n * check(0); // `false`\n * check(1); // `false`\n * check(2); // `true`\n * check(3); // `false`\n * check(4); // `true`\n * check(5); // `false`\n * check(6); // `true`\n */\nfunction nthCheck(formula) {\n    return (0, compile_1.compile)((0, parse_1.parse)(formula));\n}\nexports.default = nthCheck;\n","\"use strict\";\n// Following http://www.w3.org/TR/css3-selectors/#nth-child-pseudo\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.parse = void 0;\n// Whitespace as per https://www.w3.org/TR/selectors-3/#lex is \" \\t\\r\\n\\f\"\nvar whitespace = new Set([9, 10, 12, 13, 32]);\nvar ZERO = \"0\".charCodeAt(0);\nvar NINE = \"9\".charCodeAt(0);\n/**\n * Parses an expression.\n *\n * @throws An `Error` if parsing fails.\n * @returns An array containing the integer step size and the integer offset of the nth rule.\n * @example nthCheck.parse(\"2n+3\"); // returns [2, 3]\n */\nfunction parse(formula) {\n    formula = formula.trim().toLowerCase();\n    if (formula === \"even\") {\n        return [2, 0];\n    }\n    else if (formula === \"odd\") {\n        return [2, 1];\n    }\n    // Parse [ ['-'|'+']? INTEGER? {N} [ S* ['-'|'+'] S* INTEGER ]?\n    var idx = 0;\n    var a = 0;\n    var sign = readSign();\n    var number = readNumber();\n    if (idx < formula.length && formula.charAt(idx) === \"n\") {\n        idx++;\n        a = sign * (number !== null && number !== void 0 ? number : 1);\n        skipWhitespace();\n        if (idx < formula.length) {\n            sign = readSign();\n            skipWhitespace();\n            number = readNumber();\n        }\n        else {\n            sign = number = 0;\n        }\n    }\n    // Throw if there is anything else\n    if (number === null || idx < formula.length) {\n        throw new Error(\"n-th rule couldn't be parsed ('\" + formula + \"')\");\n    }\n    return [a, sign * number];\n    function readSign() {\n        if (formula.charAt(idx) === \"-\") {\n            idx++;\n            return -1;\n        }\n        if (formula.charAt(idx) === \"+\") {\n            idx++;\n        }\n        return 1;\n    }\n    function readNumber() {\n        var start = idx;\n        var value = 0;\n        while (idx < formula.length &&\n            formula.charCodeAt(idx) >= ZERO &&\n            formula.charCodeAt(idx) <= NINE) {\n            value = value * 10 + (formula.charCodeAt(idx) - ZERO);\n            idx++;\n        }\n        // Return `null` if we didn't read anything.\n        return idx === start ? null : value;\n    }\n    function skipWhitespace() {\n        while (idx < formula.length &&\n            whitespace.has(formula.charCodeAt(idx))) {\n            idx++;\n        }\n    }\n}\nexports.parse = parse;\n","/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS202: Simplify dynamic range loops\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nexports.make = function (x) {\n  if (x == null) {\n    x = [];\n  }\n  if (!(x instanceof Array)) {\n    x = [+x != null ? +x : 0];\n  }\n  return x;\n};\n\nexports.nest = (a, b) => a.concat(b);\n\nexports.compare = function (a, b) {\n  const n = Math.min(a.length, b.length);\n  for (\n    let i = 0, end = n, asc = 0 <= end;\n    asc ? i < end : i > end;\n    asc ? i++ : i--\n  ) {\n    const p = a[i];\n    const q = b[i];\n    if (p > q) {\n      return -1;\n    }\n    if (p < q) {\n      return 1;\n    }\n  }\n  a = a.length;\n  b = b.length;\n  if (a > b) {\n    return -1;\n  } else if (a < b) {\n    return 1;\n  } else {\n    return 0;\n  }\n};\n\nexports.max = function (a, b) {\n  if (exports.compare(a, b) > 0) {\n    return b;\n  } else {\n    return a;\n  }\n};\n","// stats.js - http://github.com/mrdoob/stats.js\n(function(f,e){\"object\"===typeof exports&&\"undefined\"!==typeof module?module.exports=e():\"function\"===typeof define&&define.amd?define(e):f.Stats=e()})(this,function(){var f=function(){function e(a){c.appendChild(a.dom);return a}function u(a){for(var d=0;d<c.children.length;d++)c.children[d].style.display=d===a?\"block\":\"none\";l=a}var l=0,c=document.createElement(\"div\");c.style.cssText=\"position:fixed;top:0;left:0;cursor:pointer;opacity:0.9;z-index:10000\";c.addEventListener(\"click\",function(a){a.preventDefault();\nu(++l%c.children.length)},!1);var k=(performance||Date).now(),g=k,a=0,r=e(new f.Panel(\"FPS\",\"#0ff\",\"#002\")),h=e(new f.Panel(\"MS\",\"#0f0\",\"#020\"));if(self.performance&&self.performance.memory)var t=e(new f.Panel(\"MB\",\"#f08\",\"#201\"));u(0);return{REVISION:16,dom:c,addPanel:e,showPanel:u,begin:function(){k=(performance||Date).now()},end:function(){a++;var c=(performance||Date).now();h.update(c-k,200);if(c>g+1E3&&(r.update(1E3*a/(c-g),100),g=c,a=0,t)){var d=performance.memory;t.update(d.usedJSHeapSize/\n1048576,d.jsHeapSizeLimit/1048576)}return c},update:function(){k=this.end()},domElement:c,setMode:u}};f.Panel=function(e,f,l){var c=Infinity,k=0,g=Math.round,a=g(window.devicePixelRatio||1),r=80*a,h=48*a,t=3*a,v=2*a,d=3*a,m=15*a,n=74*a,p=30*a,q=document.createElement(\"canvas\");q.width=r;q.height=h;q.style.cssText=\"width:80px;height:48px\";var b=q.getContext(\"2d\");b.font=\"bold \"+9*a+\"px Helvetica,Arial,sans-serif\";b.textBaseline=\"top\";b.fillStyle=l;b.fillRect(0,0,r,h);b.fillStyle=f;b.fillText(e,t,v);\nb.fillRect(d,m,n,p);b.fillStyle=l;b.globalAlpha=.9;b.fillRect(d,m,n,p);return{dom:q,update:function(h,w){c=Math.min(c,h);k=Math.max(k,h);b.fillStyle=l;b.globalAlpha=1;b.fillRect(0,0,r,m);b.fillStyle=f;b.fillText(g(h)+\" \"+e+\" (\"+g(c)+\"-\"+g(k)+\")\",t,v);b.drawImage(q,d+a,m,n-a,p,d,m,n-a,p);b.fillRect(d+n-a,m,a,p);b.fillStyle=l;b.globalAlpha=.9;b.fillRect(d+n-a,m,a,g((1-h/w)*p))}}};return f});\n","module.exports = __WEBPACK_EXTERNAL_MODULE__824__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","export class Api {\n  static apply(object) {\n    object.set = function (options) {\n      var o = this.options || {};\n\n      // Diff out changes\n      var changes = Object.entries(options).reduce(function (\n        result,\n        [key, value]\n      ) {\n        if (o[key] !== value) result[key] = value;\n        return result;\n      },\n      {});\n\n      this.options = Object.assign(o, changes);\n\n      // Notify\n      this.trigger({ type: \"change\", options: options, changes: changes });\n    };\n\n    object.get = function () {\n      return this.options;\n    };\n\n    object.api = function (object, context) {\n      if (!object) {\n        object = {};\n      }\n\n      // Append context argument to API methods\n      context &&\n        Object.entries(object).forEach(function ([key, callback]) {\n          if (typeof callback === \"function\") {\n            object[key] = (...args) => callback(...args, context);\n          }\n        });\n\n      object.set = this.set.bind(this);\n      object.get = this.get.bind(this);\n\n      return object;\n    };\n  }\n}\n","/**\n * https://github.com/mrdoob/eventdispatcher.js/\n */\n\nclass EventDispatcher {\n\n\taddEventListener( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) this._listeners = {};\n\n\t\tconst listeners = this._listeners;\n\n\t\tif ( listeners[ type ] === undefined ) {\n\n\t\t\tlisteners[ type ] = [];\n\n\t\t}\n\n\t\tif ( listeners[ type ].indexOf( listener ) === - 1 ) {\n\n\t\t\tlisteners[ type ].push( listener );\n\n\t\t}\n\n\t}\n\n\thasEventListener( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) return false;\n\n\t\tconst listeners = this._listeners;\n\n\t\treturn listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1;\n\n\t}\n\n\tremoveEventListener( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) return;\n\n\t\tconst listeners = this._listeners;\n\t\tconst listenerArray = listeners[ type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tconst index = listenerArray.indexOf( listener );\n\n\t\t\tif ( index !== - 1 ) {\n\n\t\t\t\tlistenerArray.splice( index, 1 );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tdispatchEvent( event ) {\n\n\t\tif ( this._listeners === undefined ) return;\n\n\t\tconst listeners = this._listeners;\n\t\tconst listenerArray = listeners[ event.type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tevent.target = this;\n\n\t\t\t// Make a copy, in case listeners are removed while iterating.\n\t\t\tconst array = listenerArray.slice( 0 );\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\tarray[ i ].call( this, event );\n\n\t\t\t}\n\n\t\t\tevent.target = null;\n\n\t\t}\n\n\t}\n\n}\n\n\nexport { EventDispatcher };\n","import { EventDispatcher } from \"three/src/core/EventDispatcher.js\";\n\nexport class Binder {\n  static bind(context, globals) {\n    return function (key, object) {\n      // Prepare object\n      if (!object.__binds) {\n        object.__binds = [];\n      }\n\n      // Set base target\n      var fallback = context;\n\n      if (Array.isArray(key)) {\n        fallback = key[0];\n        key = key[1];\n      }\n\n      // Match key\n      var match = /^([^.:]*(?:\\.[^.:]+)*)?(?::(.*))?$/.exec(key);\n      var path = match[1].split(/\\./g);\n\n      var name = path.pop();\n      var dest = match[2] || name;\n\n      // Whitelisted objects\n      var selector = path.shift();\n\n      var target =\n        {\n          this: object,\n        }[selector] ||\n        globals[selector] ||\n        context[selector] ||\n        fallback;\n\n      // Look up keys\n      while (target && (key = path.shift())) {\n        target = target[key];\n      }\n\n      // Attach event handler at last level\n      if (target && (target.on || target.addEventListener)) {\n        var callback = function (event) {\n          object[dest] && object[dest](event, context);\n        };\n\n        // Polyfill for both styles of event listener adders\n        Binder._polyfill(target, [\"addEventListener\", \"on\"], function (method) {\n          target[method](name, callback);\n        });\n\n        // Store bind for removal later\n        var bind = { target: target, name: name, callback: callback };\n        object.__binds.push(bind);\n\n        // Return callback\n        return callback;\n      } else {\n        throw \"Cannot bind '\" + key + \"' in \" + this.__name;\n      }\n    };\n  }\n\n  static unbind() {\n    return function (object) {\n      // Remove all binds belonging to object\n      if (object.__binds) {\n        object.__binds.forEach(\n          function (bind) {\n            // Polyfill for both styles of event listener removers\n            Binder._polyfill(\n              bind.target,\n              [\"removeEventListener\", \"off\"],\n              function (method) {\n                bind.target[method](bind.name, bind.callback);\n              }\n            );\n          }.bind(this)\n        );\n\n        object.__binds = [];\n      }\n    };\n  }\n\n  static apply(object) {\n    object.trigger = Binder._trigger;\n    object.triggerOnce = Binder._triggerOnce;\n\n    object.hasEventListener = EventDispatcher.prototype.hasEventListener;\n    object.addEventListener = EventDispatcher.prototype.addEventListener;\n    object.removeEventListener = EventDispatcher.prototype.removeEventListener;\n\n    object.on = object.addEventListener;\n    object.off = object.removeEventListener;\n    object.dispatchEvent = object.trigger;\n  }\n\n  static _triggerOnce(event) {\n    this.trigger(event);\n    if (this._listeners) {\n      delete this._listeners[event.type];\n    }\n  }\n\n  static _trigger(event) {\n    if (this._listeners === undefined) return;\n\n    var type = event.type;\n    var listeners = this._listeners[type];\n    if (listeners !== undefined) {\n      listeners = listeners.slice();\n      var length = listeners.length;\n\n      event.target = this;\n      for (var i = 0; i < length; i++) {\n        // add original target as parameter for convenience\n        listeners[i].call(this, event, this);\n      }\n    }\n  }\n\n  static _polyfill(object, methods, callback) {\n    methods.map(function (_method) {\n      return object.method;\n    });\n    if (methods.length) callback(methods[0]);\n  }\n}\n","import { Api } from \"./api\";\nimport { Binder } from \"./binder\";\n\nfunction isString(str) {\n  return str && typeof str.valueOf() === \"string\";\n}\n\nexport class Bootstrap {\n  static initClass() {\n    this.Plugins = {};\n    this.Aliases = {};\n  }\n\n  static registerPlugin(name, spec) {\n    var ctor = function (options) {\n      Bootstrap.Plugin.call(this, options);\n      this.__name = name;\n    };\n    ctor.prototype = Object.assign(new Bootstrap.Plugin(), spec);\n\n    this.Plugins[name] = ctor;\n  }\n\n  static unregisterPlugin(name) {\n    delete this.Plugins[name];\n  }\n\n  static registerAlias(name, plugins) {\n    this.Aliases[name] = plugins;\n  }\n\n  static unregisterAlias(name) {\n    delete this.Aliases[name];\n  }\n\n  constructor(options) {\n    if (options) {\n      let args = [].slice.apply(arguments);\n      options = {};\n\n      // (element, ...)\n      if (args[0] instanceof Node) {\n        const node = args[0];\n        args = args.slice(1);\n        options.element = node;\n      }\n\n      // (..., plugin, plugin, plugin)\n      if (isString(args[0])) {\n        options.plugins = args;\n      } else if (Array.isArray(args[0])) {\n        // (..., [plugin, plugin, plugin])\n        options.plugins = args[0];\n      } else if (args[0]) {\n        // (..., options)\n\n        // else, merge any arguments on the right that have NOT been set into the\n        // options dict on the left.\n        options = Object.assign({}, args[0], options);\n      }\n    }\n\n    // Apply defaults\n    const defaultOpts = {\n      init: true,\n      element: document.body,\n      plugins: [\"core\"],\n      aliases: {},\n      plugindb: Bootstrap.Plugins || {},\n      aliasdb: Bootstrap.Aliases || {},\n    };\n\n    this.__options = Object.assign({}, defaultOpts, options || {});\n\n    // Hidden state\n    this.__inited = false;\n    this.__destroyed = false;\n    this.__installed = [];\n\n    // Query element\n    var element = this.__options.element;\n    if (element === \"\" + element) {\n      element = document.querySelector(element);\n    }\n\n    // Global context\n    this.plugins = {};\n    this.element = element;\n\n    // Update cycle\n    this.trigger = this.trigger.bind(this);\n    this.frame = this.frame.bind(this);\n    this.events = [\"pre\", \"update\", \"render\", \"post\"].map(function (type) {\n      return { type: type };\n    });\n\n    // Auto-init\n    if (this.__options.init) {\n      this.init();\n    }\n  }\n\n  init() {\n    if (this.__inited) return;\n    this.__inited = true;\n\n    // Install plugins\n    this.install(this.__options.plugins);\n  }\n\n  destroy() {\n    if (!this.__inited) return;\n    if (this.__destroyed) return;\n    this.__destroyed = true;\n\n    // Notify of imminent destruction\n    this.trigger({ type: \"destroy\" });\n\n    // Then uninstall plugins\n    this.uninstall();\n  }\n\n  frame() {\n    this.events.map(this.trigger);\n  }\n\n  resolve(plugins) {\n    plugins = Array.isArray(plugins) ? plugins : [plugins];\n\n    // Resolve alias database\n    var o = this.__options;\n    var aliases = Object.assign({}, o.aliasdb, o.aliases);\n\n    // Remove inline alias defs from plugins\n    var pred = function (name) {\n      var key = name.split(\":\");\n      if (!key[1]) return true;\n      aliases[key[0]] = [key[1]];\n      return false;\n    };\n    plugins = plugins.filter(pred);\n\n    // Unify arrays\n    Object.entries(aliases).forEach(function ([key, alias]) {\n      aliases[key] = Array.isArray(alias) ? alias : [alias];\n    });\n\n    // Look up aliases recursively\n    function recurse(list, out, level) {\n      if (level >= 256) throw \"Plug-in alias recursion detected.\";\n      list = list.filter(pred);\n      list.forEach(function (name) {\n        var alias = aliases[name];\n        if (!alias) {\n          out.push(name);\n        } else {\n          out = out.concat(recurse(alias, [], level + 1));\n        }\n      });\n      return out;\n    }\n\n    return recurse(plugins, [], 0);\n  }\n\n  install(plugins) {\n    plugins = Array.isArray(plugins) ? plugins : [plugins];\n\n    // Resolve aliases\n    plugins = this.resolve(plugins);\n\n    // Install in order\n    plugins.forEach((name) => this.__install(name));\n\n    // Fire off ready event\n    this.__ready();\n  }\n\n  uninstall(plugins) {\n    if (plugins) {\n      plugins = Array.isArray(plugins) ? plugins : [plugins];\n\n      // Resolve aliases\n      plugins = this.resolve(plugins);\n    }\n\n    // Uninstall in reverse order\n    (plugins || this.__installed)\n      .reverse()\n      .forEach((p) => this.__uninstall(p.__name));\n  }\n\n  __install(name) {\n    // Sanity check\n    var ctor = this.__options.plugindb[name];\n    if (!ctor)\n      throw \"[three.install] Cannot install. '\" + name + \"' is not registered.\";\n\n    if (this.plugins[name])\n      return console.warn(\"[three.install] \" + name + \" is already installed.\");\n\n    // Construct\n    var Plugin = ctor;\n    var plugin = new Plugin(this.__options[name] || {}, name);\n    this.plugins[name] = plugin;\n\n    // Install\n    const flag = plugin.install(this);\n    this.__installed.push(plugin);\n\n    // Then notify\n    this.trigger({ type: \"install\", plugin: plugin });\n\n    // Allow early abort\n    return flag;\n  }\n\n  __uninstall(name) {\n    // Sanity check\n    const plugin = isString(name) ? this.plugins[name] : name;\n    if (!plugin) {\n      console.warn(\"[three.uninstall] \" + name + \"' is not installed.\");\n      return;\n    }\n\n    name = plugin.__name;\n\n    // Uninstall\n    plugin.uninstall(this);\n    this.__installed = this.__installed.filter((p) => p !== plugin);\n    delete this.plugins[name];\n\n    // Then notify\n    this.trigger({ type: \"uninstall\", plugin: plugin });\n  }\n\n  __ready() {\n    // Notify and remove event handlers\n    this.triggerOnce({ type: \"ready\" });\n  }\n}\nBootstrap.initClass();\n\n// Plugin Creation\n\nBootstrap.Plugin = function (options) {\n  this.options = Object.assign({}, this.defaults, options || {});\n};\n\nBootstrap.Plugin.prototype = {\n  listen: [],\n  defaults: {},\n  install: function (_three) {},\n  uninstall: function (_three) {},\n};\n\nBinder.apply(Bootstrap.prototype);\nBinder.apply(Bootstrap.Plugin.prototype);\nApi.apply(Bootstrap.Plugin.prototype);\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\n// Threestrap plugin\n\nimport { Bootstrap } from \"threestrap/src/bootstrap.js\";\n\nBootstrap.registerPlugin(\"splash\", {\n  defaults: {\n    color: \"mono\",\n    fancy: true,\n  },\n\n  listen: [\n    \"ready\",\n    \"mathbox/init:init\",\n    \"mathbox/progress:progress\",\n    \"mathbox/destroy:destroy\",\n  ],\n\n  uninstall() {\n    return this.destroy();\n  },\n\n  ready(event, three) {\n    if (three.MathBox && !this.div) {\n      // TODO woah seems wrong!!!\n      return this.init(event, three);\n    }\n  },\n\n  init(event, three) {\n    let div;\n    this.destroy();\n\n    const { color } = this.options;\n    const html = `\\\n<div class=\"mathbox-loader mathbox-splash-${color}\">\n  <div class=\"mathbox-logo\">\n    <div> <div></div><div></div><div></div> </div>\n    <div> <div></div><div></div><div></div> </div>\n  </div>\n  <div class=\"mathbox-progress\"><div></div></div>\n</div>\\\n`;\n\n    this.div = div = document.createElement(\"div\");\n    div.innerHTML = html;\n    three.element.appendChild(div);\n\n    const x = Math.random() * 2 - 1;\n    const y = Math.random() * 2 - 1;\n    const z = Math.random() * 2 - 1;\n    const l = 1 / Math.sqrt(x * x + y * y + z * z);\n\n    this.loader = div.querySelector(\".mathbox-loader\");\n    this.bar = div.querySelector(\".mathbox-progress > div\");\n    this.gyro = div.querySelectorAll(\".mathbox-logo > div\");\n    this.transforms = [\n      \"rotateZ(22deg) rotateX(24deg) rotateY(30deg)\",\n      \"rotateZ(11deg) rotateX(12deg) rotateY(15deg) scale3d(.6, .6, .6)\",\n    ];\n    this.random = [x * l, y * l, z * l];\n    this.start = three.Time.now;\n    return (this.timer = null);\n  },\n\n  // Update splash screen state and animation\n  progress(event, three) {\n    if (!this.div) {\n      return;\n    }\n\n    const { current, total } = event;\n\n    // Display splash screen\n    const visible = current < total;\n    clearTimeout(this.timer);\n    if (visible) {\n      this.loader.classList.remove(\"mathbox-exit\");\n      this.loader.style.display = \"block\";\n    } else {\n      this.loader.classList.add(\"mathbox-exit\");\n      this.timer = setTimeout(() => {\n        return (this.loader.style.display = \"none\");\n      }, 150);\n    }\n\n    // Update splash progress\n    const width =\n      current < total\n        ? Math.round((1000 * current) / total) * 0.1 + \"%\"\n        : \"100%\";\n    this.bar.style.width = width;\n\n    if (this.options.fancy) {\n      // Spinny gyros\n      const weights = this.random;\n\n      // Lerp clock speed\n      const f = Math.max(0, Math.min(1, three.Time.now - this.start));\n      const increment = function (transform, j) {\n        if (j == null) {\n          j = 0;\n        }\n        return transform.replace(\n          /(-?[0-9.e]+)deg/g,\n          (_, n) => +n + weights[j++] * f * three.Time.step * 60 + \"deg\"\n        );\n      };\n\n      return (() => {\n        const result = [];\n        for (let i = 0; i < this.gyro.length; i++) {\n          let t;\n          const el = this.gyro[i];\n          this.transforms[i] = t = increment(this.transforms[i]);\n          result.push((el.style.transform = el.style.WebkitTransform = t));\n        }\n        return result;\n      })();\n    }\n  },\n\n  destroy() {\n    if (this.div != null) {\n      this.div.remove();\n    }\n    return (this.div = null);\n  },\n});\n","import { Bootstrap } from \"./bootstrap\";\n\nBootstrap.registerAlias(\"empty\", [\n  \"fallback\",\n  \"bind\",\n  \"renderer\",\n  \"size\",\n  \"fill\",\n  \"loop\",\n  \"time\",\n]);\n\nBootstrap.registerAlias(\"core\", [\n  \"empty\",\n  \"scene\",\n  \"camera\",\n  \"render\",\n  \"warmup\",\n]);\n\nBootstrap.registerAlias(\"VR\", [\"core\", \"cursor\", \"fullscreen\", \"render:vr\"]);\n","import { Bootstrap } from \"../bootstrap\";\nimport { Binder } from \"../binder\";\n\nBootstrap.registerPlugin(\"bind\", {\n  install: function (three) {\n    const globals = {\n      three: three,\n      window: window,\n    };\n\n    three.bind = Binder.bind(three, globals);\n    three.unbind = Binder.unbind(three);\n\n    three.bind(\"install:bind\", this);\n    three.bind(\"uninstall:unbind\", this);\n  },\n\n  uninstall: function (three) {\n    three.unbind(this);\n\n    delete three.bind;\n    delete three.unbind;\n  },\n\n  bind: function (event, three) {\n    const plugin = event.plugin;\n    const listen = plugin.listen;\n\n    listen &&\n      listen.forEach(function (key) {\n        three.bind(key, plugin);\n      });\n  },\n\n  unbind: function (event, three) {\n    three.unbind(event.plugin);\n  },\n});\n","const _lut = [];\n\nfor ( let i = 0; i < 256; i ++ ) {\n\n\t_lut[ i ] = ( i < 16 ? '0' : '' ) + ( i ).toString( 16 );\n\n}\n\nlet _seed = 1234567;\n\n\nconst DEG2RAD = Math.PI / 180;\nconst RAD2DEG = 180 / Math.PI;\n\n// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136\nfunction generateUUID() {\n\n\tconst d0 = Math.random() * 0xffffffff | 0;\n\tconst d1 = Math.random() * 0xffffffff | 0;\n\tconst d2 = Math.random() * 0xffffffff | 0;\n\tconst d3 = Math.random() * 0xffffffff | 0;\n\tconst uuid = _lut[ d0 & 0xff ] + _lut[ d0 >> 8 & 0xff ] + _lut[ d0 >> 16 & 0xff ] + _lut[ d0 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d1 & 0xff ] + _lut[ d1 >> 8 & 0xff ] + '-' + _lut[ d1 >> 16 & 0x0f | 0x40 ] + _lut[ d1 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d2 & 0x3f | 0x80 ] + _lut[ d2 >> 8 & 0xff ] + '-' + _lut[ d2 >> 16 & 0xff ] + _lut[ d2 >> 24 & 0xff ] +\n\t\t\t_lut[ d3 & 0xff ] + _lut[ d3 >> 8 & 0xff ] + _lut[ d3 >> 16 & 0xff ] + _lut[ d3 >> 24 & 0xff ];\n\n\t// .toUpperCase() here flattens concatenated strings to save heap memory space.\n\treturn uuid.toUpperCase();\n\n}\n\nfunction clamp( value, min, max ) {\n\n\treturn Math.max( min, Math.min( max, value ) );\n\n}\n\n// compute euclidian modulo of m % n\n// https://en.wikipedia.org/wiki/Modulo_operation\nfunction euclideanModulo( n, m ) {\n\n\treturn ( ( n % m ) + m ) % m;\n\n}\n\n// Linear mapping from range <a1, a2> to range <b1, b2>\nfunction mapLinear( x, a1, a2, b1, b2 ) {\n\n\treturn b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );\n\n}\n\n// https://www.gamedev.net/tutorials/programming/general-and-gameplay-programming/inverse-lerp-a-super-useful-yet-often-overlooked-function-r5230/\nfunction inverseLerp( x, y, value ) {\n\n\tif ( x !== y ) {\n\n\t\treturn ( value - x ) / ( y - x );\n\n\t} else {\n\n\t\treturn 0;\n\n\t}\n\n}\n\n// https://en.wikipedia.org/wiki/Linear_interpolation\nfunction lerp( x, y, t ) {\n\n\treturn ( 1 - t ) * x + t * y;\n\n}\n\n// http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/\nfunction damp( x, y, lambda, dt ) {\n\n\treturn lerp( x, y, 1 - Math.exp( - lambda * dt ) );\n\n}\n\n// https://www.desmos.com/calculator/vcsjnyz7x4\nfunction pingpong( x, length = 1 ) {\n\n\treturn length - Math.abs( euclideanModulo( x, length * 2 ) - length );\n\n}\n\n// http://en.wikipedia.org/wiki/Smoothstep\nfunction smoothstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * ( 3 - 2 * x );\n\n}\n\nfunction smootherstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * x * ( x * ( x * 6 - 15 ) + 10 );\n\n}\n\n// Random integer from <low, high> interval\nfunction randInt( low, high ) {\n\n\treturn low + Math.floor( Math.random() * ( high - low + 1 ) );\n\n}\n\n// Random float from <low, high> interval\nfunction randFloat( low, high ) {\n\n\treturn low + Math.random() * ( high - low );\n\n}\n\n// Random float from <-range/2, range/2> interval\nfunction randFloatSpread( range ) {\n\n\treturn range * ( 0.5 - Math.random() );\n\n}\n\n// Deterministic pseudo-random float in the interval [ 0, 1 ]\nfunction seededRandom( s ) {\n\n\tif ( s !== undefined ) _seed = s % 2147483647;\n\n\t// Park-Miller algorithm\n\n\t_seed = _seed * 16807 % 2147483647;\n\n\treturn ( _seed - 1 ) / 2147483646;\n\n}\n\nfunction degToRad( degrees ) {\n\n\treturn degrees * DEG2RAD;\n\n}\n\nfunction radToDeg( radians ) {\n\n\treturn radians * RAD2DEG;\n\n}\n\nfunction isPowerOfTwo( value ) {\n\n\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n}\n\nfunction ceilPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.ceil( Math.log( value ) / Math.LN2 ) );\n\n}\n\nfunction floorPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.floor( Math.log( value ) / Math.LN2 ) );\n\n}\n\nfunction setQuaternionFromProperEuler( q, a, b, c, order ) {\n\n\t// Intrinsic Proper Euler Angles - see https://en.wikipedia.org/wiki/Euler_angles\n\n\t// rotations are applied to the axes in the order specified by 'order'\n\t// rotation by angle 'a' is applied first, then by angle 'b', then by angle 'c'\n\t// angles are in radians\n\n\tconst cos = Math.cos;\n\tconst sin = Math.sin;\n\n\tconst c2 = cos( b / 2 );\n\tconst s2 = sin( b / 2 );\n\n\tconst c13 = cos( ( a + c ) / 2 );\n\tconst s13 = sin( ( a + c ) / 2 );\n\n\tconst c1_3 = cos( ( a - c ) / 2 );\n\tconst s1_3 = sin( ( a - c ) / 2 );\n\n\tconst c3_1 = cos( ( c - a ) / 2 );\n\tconst s3_1 = sin( ( c - a ) / 2 );\n\n\tswitch ( order ) {\n\n\t\tcase 'XYX':\n\t\t\tq.set( c2 * s13, s2 * c1_3, s2 * s1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YZY':\n\t\t\tq.set( s2 * s1_3, c2 * s13, s2 * c1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZXZ':\n\t\t\tq.set( s2 * c1_3, s2 * s1_3, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'XZX':\n\t\t\tq.set( c2 * s13, s2 * s3_1, s2 * c3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YXY':\n\t\t\tq.set( s2 * c3_1, c2 * s13, s2 * s3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZYZ':\n\t\t\tq.set( s2 * s3_1, s2 * c3_1, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tconsole.warn( 'THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: ' + order );\n\n\t}\n\n}\n\n\n\n\nexport {\n\tDEG2RAD,\n\tRAD2DEG,\n\tgenerateUUID,\n\tclamp,\n\teuclideanModulo,\n\tmapLinear,\n\tinverseLerp,\n\tlerp,\n\tdamp,\n\tpingpong,\n\tsmoothstep,\n\tsmootherstep,\n\trandInt,\n\trandFloat,\n\trandFloatSpread,\n\tseededRandom,\n\tdegToRad,\n\tradToDeg,\n\tisPowerOfTwo,\n\tceilPowerOfTwo,\n\tfloorPowerOfTwo,\n\tsetQuaternionFromProperEuler,\n};\n","import * as MathUtils from './MathUtils.js';\n\nclass Quaternion {\n\n\tconstructor( x = 0, y = 0, z = 0, w = 1 ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\n\t}\n\n\tstatic slerp( qa, qb, qm, t ) {\n\n\t\tconsole.warn( 'THREE.Quaternion: Static .slerp() has been deprecated. Use qm.slerpQuaternions( qa, qb, t ) instead.' );\n\t\treturn qm.slerpQuaternions( qa, qb, t );\n\n\t}\n\n\tstatic slerpFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) {\n\n\t\t// fuzz-free, array-based Quaternion SLERP operation\n\n\t\tlet x0 = src0[ srcOffset0 + 0 ],\n\t\t\ty0 = src0[ srcOffset0 + 1 ],\n\t\t\tz0 = src0[ srcOffset0 + 2 ],\n\t\t\tw0 = src0[ srcOffset0 + 3 ];\n\n\t\tconst x1 = src1[ srcOffset1 + 0 ],\n\t\t\ty1 = src1[ srcOffset1 + 1 ],\n\t\t\tz1 = src1[ srcOffset1 + 2 ],\n\t\t\tw1 = src1[ srcOffset1 + 3 ];\n\n\t\tif ( t === 0 ) {\n\n\t\t\tdst[ dstOffset + 0 ] = x0;\n\t\t\tdst[ dstOffset + 1 ] = y0;\n\t\t\tdst[ dstOffset + 2 ] = z0;\n\t\t\tdst[ dstOffset + 3 ] = w0;\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( t === 1 ) {\n\n\t\t\tdst[ dstOffset + 0 ] = x1;\n\t\t\tdst[ dstOffset + 1 ] = y1;\n\t\t\tdst[ dstOffset + 2 ] = z1;\n\t\t\tdst[ dstOffset + 3 ] = w1;\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) {\n\n\t\t\tlet s = 1 - t;\n\t\t\tconst cos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1,\n\t\t\t\tdir = ( cos >= 0 ? 1 : - 1 ),\n\t\t\t\tsqrSin = 1 - cos * cos;\n\n\t\t\t// Skip the Slerp for tiny steps to avoid numeric problems:\n\t\t\tif ( sqrSin > Number.EPSILON ) {\n\n\t\t\t\tconst sin = Math.sqrt( sqrSin ),\n\t\t\t\t\tlen = Math.atan2( sin, cos * dir );\n\n\t\t\t\ts = Math.sin( s * len ) / sin;\n\t\t\t\tt = Math.sin( t * len ) / sin;\n\n\t\t\t}\n\n\t\t\tconst tDir = t * dir;\n\n\t\t\tx0 = x0 * s + x1 * tDir;\n\t\t\ty0 = y0 * s + y1 * tDir;\n\t\t\tz0 = z0 * s + z1 * tDir;\n\t\t\tw0 = w0 * s + w1 * tDir;\n\n\t\t\t// Normalize in case we just did a lerp:\n\t\t\tif ( s === 1 - t ) {\n\n\t\t\t\tconst f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 );\n\n\t\t\t\tx0 *= f;\n\t\t\t\ty0 *= f;\n\t\t\t\tz0 *= f;\n\t\t\t\tw0 *= f;\n\n\t\t\t}\n\n\t\t}\n\n\t\tdst[ dstOffset ] = x0;\n\t\tdst[ dstOffset + 1 ] = y0;\n\t\tdst[ dstOffset + 2 ] = z0;\n\t\tdst[ dstOffset + 3 ] = w0;\n\n\t}\n\n\tstatic multiplyQuaternionsFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1 ) {\n\n\t\tconst x0 = src0[ srcOffset0 ];\n\t\tconst y0 = src0[ srcOffset0 + 1 ];\n\t\tconst z0 = src0[ srcOffset0 + 2 ];\n\t\tconst w0 = src0[ srcOffset0 + 3 ];\n\n\t\tconst x1 = src1[ srcOffset1 ];\n\t\tconst y1 = src1[ srcOffset1 + 1 ];\n\t\tconst z1 = src1[ srcOffset1 + 2 ];\n\t\tconst w1 = src1[ srcOffset1 + 3 ];\n\n\t\tdst[ dstOffset ] = x0 * w1 + w0 * x1 + y0 * z1 - z0 * y1;\n\t\tdst[ dstOffset + 1 ] = y0 * w1 + w0 * y1 + z0 * x1 - x0 * z1;\n\t\tdst[ dstOffset + 2 ] = z0 * w1 + w0 * z1 + x0 * y1 - y0 * x1;\n\t\tdst[ dstOffset + 3 ] = w0 * w1 - x0 * x1 - y0 * y1 - z0 * z1;\n\n\t\treturn dst;\n\n\t}\n\n\tget x() {\n\n\t\treturn this._x;\n\n\t}\n\n\tset x( value ) {\n\n\t\tthis._x = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget y() {\n\n\t\treturn this._y;\n\n\t}\n\n\tset y( value ) {\n\n\t\tthis._y = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget z() {\n\n\t\treturn this._z;\n\n\t}\n\n\tset z( value ) {\n\n\t\tthis._z = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget w() {\n\n\t\treturn this._w;\n\n\t}\n\n\tset w( value ) {\n\n\t\tthis._w = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tset( x, y, z, w ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._w );\n\n\t}\n\n\tcopy( quaternion ) {\n\n\t\tthis._x = quaternion.x;\n\t\tthis._y = quaternion.y;\n\t\tthis._z = quaternion.z;\n\t\tthis._w = quaternion.w;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromEuler( euler, update ) {\n\n\t\tif ( ! ( euler && euler.isEuler ) ) {\n\n\t\t\tthrow new Error( 'THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.' );\n\n\t\t}\n\n\t\tconst x = euler._x, y = euler._y, z = euler._z, order = euler._order;\n\n\t\t// http://www.mathworks.com/matlabcentral/fileexchange/\n\t\t// \t20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/\n\t\t//\tcontent/SpinCalc.m\n\n\t\tconst cos = Math.cos;\n\t\tconst sin = Math.sin;\n\n\t\tconst c1 = cos( x / 2 );\n\t\tconst c2 = cos( y / 2 );\n\t\tconst c3 = cos( z / 2 );\n\n\t\tconst s1 = sin( x / 2 );\n\t\tconst s2 = sin( y / 2 );\n\t\tconst s3 = sin( z / 2 );\n\n\t\tswitch ( order ) {\n\n\t\t\tcase 'XYZ':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'YXZ':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZXY':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZYX':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'YZX':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'XZY':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tconsole.warn( 'THREE.Quaternion: .setFromEuler() encountered an unknown order: ' + order );\n\n\t\t}\n\n\t\tif ( update !== false ) this._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromAxisAngle( axis, angle ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n\n\t\t// assumes axis is normalized\n\n\t\tconst halfAngle = angle / 2, s = Math.sin( halfAngle );\n\n\t\tthis._x = axis.x * s;\n\t\tthis._y = axis.y * s;\n\t\tthis._z = axis.z * s;\n\t\tthis._w = Math.cos( halfAngle );\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromRotationMatrix( m ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tconst te = m.elements,\n\n\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ],\n\n\t\t\ttrace = m11 + m22 + m33;\n\n\t\tif ( trace > 0 ) {\n\n\t\t\tconst s = 0.5 / Math.sqrt( trace + 1.0 );\n\n\t\t\tthis._w = 0.25 / s;\n\t\t\tthis._x = ( m32 - m23 ) * s;\n\t\t\tthis._y = ( m13 - m31 ) * s;\n\t\t\tthis._z = ( m21 - m12 ) * s;\n\n\t\t} else if ( m11 > m22 && m11 > m33 ) {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );\n\n\t\t\tthis._w = ( m32 - m23 ) / s;\n\t\t\tthis._x = 0.25 * s;\n\t\t\tthis._y = ( m12 + m21 ) / s;\n\t\t\tthis._z = ( m13 + m31 ) / s;\n\n\t\t} else if ( m22 > m33 ) {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );\n\n\t\t\tthis._w = ( m13 - m31 ) / s;\n\t\t\tthis._x = ( m12 + m21 ) / s;\n\t\t\tthis._y = 0.25 * s;\n\t\t\tthis._z = ( m23 + m32 ) / s;\n\n\t\t} else {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );\n\n\t\t\tthis._w = ( m21 - m12 ) / s;\n\t\t\tthis._x = ( m13 + m31 ) / s;\n\t\t\tthis._y = ( m23 + m32 ) / s;\n\t\t\tthis._z = 0.25 * s;\n\n\t\t}\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromUnitVectors( vFrom, vTo ) {\n\n\t\t// assumes direction vectors vFrom and vTo are normalized\n\n\t\tlet r = vFrom.dot( vTo ) + 1;\n\n\t\tif ( r < Number.EPSILON ) {\n\n\t\t\t// vFrom and vTo point in opposite directions\n\n\t\t\tr = 0;\n\n\t\t\tif ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {\n\n\t\t\t\tthis._x = - vFrom.y;\n\t\t\t\tthis._y = vFrom.x;\n\t\t\t\tthis._z = 0;\n\t\t\t\tthis._w = r;\n\n\t\t\t} else {\n\n\t\t\t\tthis._x = 0;\n\t\t\t\tthis._y = - vFrom.z;\n\t\t\t\tthis._z = vFrom.y;\n\t\t\t\tthis._w = r;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// crossVectors( vFrom, vTo ); // inlined to avoid cyclic dependency on Vector3\n\n\t\t\tthis._x = vFrom.y * vTo.z - vFrom.z * vTo.y;\n\t\t\tthis._y = vFrom.z * vTo.x - vFrom.x * vTo.z;\n\t\t\tthis._z = vFrom.x * vTo.y - vFrom.y * vTo.x;\n\t\t\tthis._w = r;\n\n\t\t}\n\n\t\treturn this.normalize();\n\n\t}\n\n\tangleTo( q ) {\n\n\t\treturn 2 * Math.acos( Math.abs( MathUtils.clamp( this.dot( q ), - 1, 1 ) ) );\n\n\t}\n\n\trotateTowards( q, step ) {\n\n\t\tconst angle = this.angleTo( q );\n\n\t\tif ( angle === 0 ) return this;\n\n\t\tconst t = Math.min( 1, step / angle );\n\n\t\tthis.slerp( q, t );\n\n\t\treturn this;\n\n\t}\n\n\tidentity() {\n\n\t\treturn this.set( 0, 0, 0, 1 );\n\n\t}\n\n\tinvert() {\n\n\t\t// quaternion is assumed to have unit length\n\n\t\treturn this.conjugate();\n\n\t}\n\n\tconjugate() {\n\n\t\tthis._x *= - 1;\n\t\tthis._y *= - 1;\n\t\tthis._z *= - 1;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tdot( v ) {\n\n\t\treturn this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;\n\n\t}\n\n\tlengthSq() {\n\n\t\treturn this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;\n\n\t}\n\n\tlength() {\n\n\t\treturn Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w );\n\n\t}\n\n\tnormalize() {\n\n\t\tlet l = this.length();\n\n\t\tif ( l === 0 ) {\n\n\t\t\tthis._x = 0;\n\t\t\tthis._y = 0;\n\t\t\tthis._z = 0;\n\t\t\tthis._w = 1;\n\n\t\t} else {\n\n\t\t\tl = 1 / l;\n\n\t\t\tthis._x = this._x * l;\n\t\t\tthis._y = this._y * l;\n\t\t\tthis._z = this._z * l;\n\t\t\tthis._w = this._w * l;\n\n\t\t}\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( q, p ) {\n\n\t\tif ( p !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' );\n\t\t\treturn this.multiplyQuaternions( q, p );\n\n\t\t}\n\n\t\treturn this.multiplyQuaternions( this, q );\n\n\t}\n\n\tpremultiply( q ) {\n\n\t\treturn this.multiplyQuaternions( q, this );\n\n\t}\n\n\tmultiplyQuaternions( a, b ) {\n\n\t\t// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n\t\tconst qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;\n\t\tconst qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;\n\n\t\tthis._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n\t\tthis._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n\t\tthis._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n\t\tthis._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tslerp( qb, t ) {\n\n\t\tif ( t === 0 ) return this;\n\t\tif ( t === 1 ) return this.copy( qb );\n\n\t\tconst x = this._x, y = this._y, z = this._z, w = this._w;\n\n\t\t// http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/\n\n\t\tlet cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z;\n\n\t\tif ( cosHalfTheta < 0 ) {\n\n\t\t\tthis._w = - qb._w;\n\t\t\tthis._x = - qb._x;\n\t\t\tthis._y = - qb._y;\n\t\t\tthis._z = - qb._z;\n\n\t\t\tcosHalfTheta = - cosHalfTheta;\n\n\t\t} else {\n\n\t\t\tthis.copy( qb );\n\n\t\t}\n\n\t\tif ( cosHalfTheta >= 1.0 ) {\n\n\t\t\tthis._w = w;\n\t\t\tthis._x = x;\n\t\t\tthis._y = y;\n\t\t\tthis._z = z;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst sqrSinHalfTheta = 1.0 - cosHalfTheta * cosHalfTheta;\n\n\t\tif ( sqrSinHalfTheta <= Number.EPSILON ) {\n\n\t\t\tconst s = 1 - t;\n\t\t\tthis._w = s * w + t * this._w;\n\t\t\tthis._x = s * x + t * this._x;\n\t\t\tthis._y = s * y + t * this._y;\n\t\t\tthis._z = s * z + t * this._z;\n\n\t\t\tthis.normalize();\n\t\t\tthis._onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst sinHalfTheta = Math.sqrt( sqrSinHalfTheta );\n\t\tconst halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta );\n\t\tconst ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,\n\t\t\tratioB = Math.sin( t * halfTheta ) / sinHalfTheta;\n\n\t\tthis._w = ( w * ratioA + this._w * ratioB );\n\t\tthis._x = ( x * ratioA + this._x * ratioB );\n\t\tthis._y = ( y * ratioA + this._y * ratioB );\n\t\tthis._z = ( z * ratioA + this._z * ratioB );\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tslerpQuaternions( qa, qb, t ) {\n\n\t\treturn this.copy( qa ).slerp( qb, t );\n\n\t}\n\n\trandom() {\n\n\t\t// Derived from http://planning.cs.uiuc.edu/node198.html\n\t\t// Note, this source uses w, x, y, z ordering,\n\t\t// so we swap the order below.\n\n\t\tconst u1 = Math.random();\n\t\tconst sqrt1u1 = Math.sqrt( 1 - u1 );\n\t\tconst sqrtu1 = Math.sqrt( u1 );\n\n\t\tconst u2 = 2 * Math.PI * Math.random();\n\n\t\tconst u3 = 2 * Math.PI * Math.random();\n\n\t\treturn this.set(\n\t\t\tsqrt1u1 * Math.cos( u2 ),\n\t\t\tsqrtu1 * Math.sin( u3 ),\n\t\t\tsqrtu1 * Math.cos( u3 ),\n\t\t\tsqrt1u1 * Math.sin( u2 ),\n\t\t);\n\n\t}\n\n\tequals( quaternion ) {\n\n\t\treturn ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis._x = array[ offset ];\n\t\tthis._y = array[ offset + 1 ];\n\t\tthis._z = array[ offset + 2 ];\n\t\tthis._w = array[ offset + 3 ];\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this._x;\n\t\tarray[ offset + 1 ] = this._y;\n\t\tarray[ offset + 2 ] = this._z;\n\t\tarray[ offset + 3 ] = this._w;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis._x = attribute.getX( index );\n\t\tthis._y = attribute.getY( index );\n\t\tthis._z = attribute.getZ( index );\n\t\tthis._w = attribute.getW( index );\n\n\t\treturn this;\n\n\t}\n\n\t_onChange( callback ) {\n\n\t\tthis._onChangeCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t_onChangeCallback() {}\n\n}\n\nQuaternion.prototype.isQuaternion = true;\n\nexport { Quaternion };\n","import * as MathUtils from './MathUtils.js';\nimport { Quaternion } from './Quaternion.js';\n\nclass Vector3 {\n\n\tconstructor( x = 0, y = 0, z = 0 ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\n\t}\n\n\tset( x, y, z ) {\n\n\t\tif ( z === undefined ) z = this.z; // sprite.scale.set(x,y)\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\n\t\treturn this;\n\n\t}\n\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetZ( z ) {\n\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tcase 2: this.z = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tcase 2: return this.z;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y, this.z );\n\n\t}\n\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\n\t\treturn this;\n\n\t}\n\n\tadd( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\treturn this.addVectors( v, w );\n\n\t\t}\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\n\t\treturn this;\n\n\t}\n\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\n\t\treturn this;\n\n\t}\n\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\n\t\treturn this;\n\n\t}\n\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\n\t\treturn this;\n\n\t}\n\n\tsub( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\treturn this.subVectors( v, w );\n\n\t\t}\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\n\t\treturn this;\n\n\t}\n\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\t\tthis.z -= s;\n\n\t\treturn this;\n\n\t}\n\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' );\n\t\t\treturn this.multiplyVectors( v, w );\n\n\t\t}\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\t\tthis.z *= v.z;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyVectors( a, b ) {\n\n\t\tthis.x = a.x * b.x;\n\t\tthis.y = a.y * b.y;\n\t\tthis.z = a.z * b.z;\n\n\t\treturn this;\n\n\t}\n\n\tapplyEuler( euler ) {\n\n\t\tif ( ! ( euler && euler.isEuler ) ) {\n\n\t\t\tconsole.error( 'THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.' );\n\n\t\t}\n\n\t\treturn this.applyQuaternion( _quaternion.setFromEuler( euler ) );\n\n\t}\n\n\tapplyAxisAngle( axis, angle ) {\n\n\t\treturn this.applyQuaternion( _quaternion.setFromAxisAngle( axis, angle ) );\n\n\t}\n\n\tapplyMatrix3( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z;\n\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z;\n\t\tthis.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z;\n\n\t\treturn this;\n\n\t}\n\n\tapplyNormalMatrix( m ) {\n\n\t\treturn this.applyMatrix3( m ).normalize();\n\n\t}\n\n\tapplyMatrix4( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tconst w = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] );\n\n\t\tthis.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * w;\n\t\tthis.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * w;\n\t\tthis.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * w;\n\n\t\treturn this;\n\n\t}\n\n\tapplyQuaternion( q ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst qx = q.x, qy = q.y, qz = q.z, qw = q.w;\n\n\t\t// calculate quat * vector\n\n\t\tconst ix = qw * x + qy * z - qz * y;\n\t\tconst iy = qw * y + qz * x - qx * z;\n\t\tconst iz = qw * z + qx * y - qy * x;\n\t\tconst iw = - qx * x - qy * y - qz * z;\n\n\t\t// calculate result * inverse quat\n\n\t\tthis.x = ix * qw + iw * - qx + iy * - qz - iz * - qy;\n\t\tthis.y = iy * qw + iw * - qy + iz * - qx - ix * - qz;\n\t\tthis.z = iz * qw + iw * - qz + ix * - qy - iy * - qx;\n\n\t\treturn this;\n\n\t}\n\n\tproject( camera ) {\n\n\t\treturn this.applyMatrix4( camera.matrixWorldInverse ).applyMatrix4( camera.projectionMatrix );\n\n\t}\n\n\tunproject( camera ) {\n\n\t\treturn this.applyMatrix4( camera.projectionMatrixInverse ).applyMatrix4( camera.matrixWorld );\n\n\t}\n\n\ttransformDirection( m ) {\n\n\t\t// input: THREE.Matrix4 affine matrix\n\t\t// vector interpreted as a direction\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z;\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z;\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z;\n\n\t\treturn this.normalize();\n\n\t}\n\n\tdivide( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\t\tthis.z /= v.z;\n\n\t\treturn this;\n\n\t}\n\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\t\tthis.z = Math.min( this.z, v.z );\n\n\t\treturn this;\n\n\t}\n\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\t\tthis.z = Math.max( this.z, v.z );\n\n\t\treturn this;\n\n\t}\n\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = Math.max( minVal, Math.min( maxVal, this.x ) );\n\t\tthis.y = Math.max( minVal, Math.min( maxVal, this.y ) );\n\t\tthis.z = Math.max( minVal, Math.min( maxVal, this.z ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );\n\n\t}\n\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\t\tthis.z = Math.floor( this.z );\n\n\t\treturn this;\n\n\t}\n\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\t\tthis.z = Math.ceil( this.z );\n\n\t\treturn this;\n\n\t}\n\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\t\tthis.z = Math.round( this.z );\n\n\t\treturn this;\n\n\t}\n\n\troundToZero() {\n\n\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\n\t\treturn this;\n\n\t}\n\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\t\tthis.z = - this.z;\n\n\t\treturn this;\n\n\t}\n\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z;\n\n\t}\n\n\t// TODO lengthSquared?\n\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z;\n\n\t}\n\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\n\n\t}\n\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z );\n\n\t}\n\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\tthis.z += ( v.z - this.z ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\t\tthis.z = v1.z + ( v2.z - v1.z ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tcross( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' );\n\t\t\treturn this.crossVectors( v, w );\n\n\t\t}\n\n\t\treturn this.crossVectors( this, v );\n\n\t}\n\n\tcrossVectors( a, b ) {\n\n\t\tconst ax = a.x, ay = a.y, az = a.z;\n\t\tconst bx = b.x, by = b.y, bz = b.z;\n\n\t\tthis.x = ay * bz - az * by;\n\t\tthis.y = az * bx - ax * bz;\n\t\tthis.z = ax * by - ay * bx;\n\n\t\treturn this;\n\n\t}\n\n\tprojectOnVector( v ) {\n\n\t\tconst denominator = v.lengthSq();\n\n\t\tif ( denominator === 0 ) return this.set( 0, 0, 0 );\n\n\t\tconst scalar = v.dot( this ) / denominator;\n\n\t\treturn this.copy( v ).multiplyScalar( scalar );\n\n\t}\n\n\tprojectOnPlane( planeNormal ) {\n\n\t\t_vector.copy( this ).projectOnVector( planeNormal );\n\n\t\treturn this.sub( _vector );\n\n\t}\n\n\treflect( normal ) {\n\n\t\t// reflect incident vector off plane orthogonal to normal\n\t\t// normal is assumed to have unit length\n\n\t\treturn this.sub( _vector.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) );\n\n\t}\n\n\tangleTo( v ) {\n\n\t\tconst denominator = Math.sqrt( this.lengthSq() * v.lengthSq() );\n\n\t\tif ( denominator === 0 ) return Math.PI / 2;\n\n\t\tconst theta = this.dot( v ) / denominator;\n\n\t\t// clamp, to handle numerical problems\n\n\t\treturn Math.acos( MathUtils.clamp( theta, - 1, 1 ) );\n\n\t}\n\n\tdistanceTo( v ) {\n\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t}\n\n\tdistanceToSquared( v ) {\n\n\t\tconst dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z;\n\n\t\treturn dx * dx + dy * dy + dz * dz;\n\n\t}\n\n\tmanhattanDistanceTo( v ) {\n\n\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z );\n\n\t}\n\n\tsetFromSpherical( s ) {\n\n\t\treturn this.setFromSphericalCoords( s.radius, s.phi, s.theta );\n\n\t}\n\n\tsetFromSphericalCoords( radius, phi, theta ) {\n\n\t\tconst sinPhiRadius = Math.sin( phi ) * radius;\n\n\t\tthis.x = sinPhiRadius * Math.sin( theta );\n\t\tthis.y = Math.cos( phi ) * radius;\n\t\tthis.z = sinPhiRadius * Math.cos( theta );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromCylindrical( c ) {\n\n\t\treturn this.setFromCylindricalCoords( c.radius, c.theta, c.y );\n\n\t}\n\n\tsetFromCylindricalCoords( radius, theta, y ) {\n\n\t\tthis.x = radius * Math.sin( theta );\n\t\tthis.y = y;\n\t\tthis.z = radius * Math.cos( theta );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrixPosition( m ) {\n\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 12 ];\n\t\tthis.y = e[ 13 ];\n\t\tthis.z = e[ 14 ];\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrixScale( m ) {\n\n\t\tconst sx = this.setFromMatrixColumn( m, 0 ).length();\n\t\tconst sy = this.setFromMatrixColumn( m, 1 ).length();\n\t\tconst sz = this.setFromMatrixColumn( m, 2 ).length();\n\n\t\tthis.x = sx;\n\t\tthis.y = sy;\n\t\tthis.z = sz;\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrixColumn( m, index ) {\n\n\t\treturn this.fromArray( m.elements, index * 4 );\n\n\t}\n\n\tsetFromMatrix3Column( m, index ) {\n\n\t\treturn this.fromArray( m.elements, index * 3 );\n\n\t}\n\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\t\tthis.z = array[ offset + 2 ];\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\t\tarray[ offset + 2 ] = this.z;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index, offset ) {\n\n\t\tif ( offset !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: offset has been removed from .fromBufferAttribute().' );\n\n\t\t}\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\t\tthis.z = attribute.getZ( index );\n\n\t\treturn this;\n\n\t}\n\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\t\tthis.z = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\trandomDirection() {\n\n\t\t// Derived from https://mathworld.wolfram.com/SpherePointPicking.html\n\n\t\tconst u = ( Math.random() - 0.5 ) * 2;\n\t\tconst t = Math.random() * Math.PI * 2;\n\t\tconst f = Math.sqrt( 1 - u ** 2 );\n\n\t\tthis.x = f * Math.cos( t );\n\t\tthis.y = f * Math.sin( t );\n\t\tthis.z = u;\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\t\tyield this.z;\n\n\t}\n\n}\n\nVector3.prototype.isVector3 = true;\n\nconst _vector = /*@__PURE__*/ new Vector3();\nconst _quaternion = /*@__PURE__*/ new Quaternion();\n\nexport { Vector3 };\n","import { Vector3 } from './Vector3.js';\n\nclass Matrix4 {\n\n\tconstructor() {\n\n\t\tthis.elements = [\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t];\n\n\t\tif ( arguments.length > 0 ) {\n\n\t\t\tconsole.error( 'THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.' );\n\n\t\t}\n\n\t}\n\n\tset( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14;\n\t\tte[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24;\n\t\tte[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34;\n\t\tte[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44;\n\n\t\treturn this;\n\n\t}\n\n\tidentity() {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new Matrix4().fromArray( this.elements );\n\n\t}\n\n\tcopy( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tte[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; te[ 3 ] = me[ 3 ];\n\t\tte[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ];\n\t\tte[ 8 ] = me[ 8 ]; te[ 9 ] = me[ 9 ]; te[ 10 ] = me[ 10 ]; te[ 11 ] = me[ 11 ];\n\t\tte[ 12 ] = me[ 12 ]; te[ 13 ] = me[ 13 ]; te[ 14 ] = me[ 14 ]; te[ 15 ] = me[ 15 ];\n\n\t\treturn this;\n\n\t}\n\n\tcopyPosition( m ) {\n\n\t\tconst te = this.elements, me = m.elements;\n\n\t\tte[ 12 ] = me[ 12 ];\n\t\tte[ 13 ] = me[ 13 ];\n\t\tte[ 14 ] = me[ 14 ];\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrix3( m ) {\n\n\t\tconst me = m.elements;\n\n\t\tthis.set(\n\n\t\t\tme[ 0 ], me[ 3 ], me[ 6 ], 0,\n\t\t\tme[ 1 ], me[ 4 ], me[ 7 ], 0,\n\t\t\tme[ 2 ], me[ 5 ], me[ 8 ], 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\textractBasis( xAxis, yAxis, zAxis ) {\n\n\t\txAxis.setFromMatrixColumn( this, 0 );\n\t\tyAxis.setFromMatrixColumn( this, 1 );\n\t\tzAxis.setFromMatrixColumn( this, 2 );\n\n\t\treturn this;\n\n\t}\n\n\tmakeBasis( xAxis, yAxis, zAxis ) {\n\n\t\tthis.set(\n\t\t\txAxis.x, yAxis.x, zAxis.x, 0,\n\t\t\txAxis.y, yAxis.y, zAxis.y, 0,\n\t\t\txAxis.z, yAxis.z, zAxis.z, 0,\n\t\t\t0, 0, 0, 1\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\textractRotation( m ) {\n\n\t\t// this method does not support reflection matrices\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tconst scaleX = 1 / _v1.setFromMatrixColumn( m, 0 ).length();\n\t\tconst scaleY = 1 / _v1.setFromMatrixColumn( m, 1 ).length();\n\t\tconst scaleZ = 1 / _v1.setFromMatrixColumn( m, 2 ).length();\n\n\t\tte[ 0 ] = me[ 0 ] * scaleX;\n\t\tte[ 1 ] = me[ 1 ] * scaleX;\n\t\tte[ 2 ] = me[ 2 ] * scaleX;\n\t\tte[ 3 ] = 0;\n\n\t\tte[ 4 ] = me[ 4 ] * scaleY;\n\t\tte[ 5 ] = me[ 5 ] * scaleY;\n\t\tte[ 6 ] = me[ 6 ] * scaleY;\n\t\tte[ 7 ] = 0;\n\n\t\tte[ 8 ] = me[ 8 ] * scaleZ;\n\t\tte[ 9 ] = me[ 9 ] * scaleZ;\n\t\tte[ 10 ] = me[ 10 ] * scaleZ;\n\t\tte[ 11 ] = 0;\n\n\t\tte[ 12 ] = 0;\n\t\tte[ 13 ] = 0;\n\t\tte[ 14 ] = 0;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationFromEuler( euler ) {\n\n\t\tif ( ! ( euler && euler.isEuler ) ) {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.' );\n\n\t\t}\n\n\t\tconst te = this.elements;\n\n\t\tconst x = euler.x, y = euler.y, z = euler.z;\n\t\tconst a = Math.cos( x ), b = Math.sin( x );\n\t\tconst c = Math.cos( y ), d = Math.sin( y );\n\t\tconst e = Math.cos( z ), f = Math.sin( z );\n\n\t\tif ( euler.order === 'XYZ' ) {\n\n\t\t\tconst ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = - c * f;\n\t\t\tte[ 8 ] = d;\n\n\t\t\tte[ 1 ] = af + be * d;\n\t\t\tte[ 5 ] = ae - bf * d;\n\t\t\tte[ 9 ] = - b * c;\n\n\t\t\tte[ 2 ] = bf - ae * d;\n\t\t\tte[ 6 ] = be + af * d;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'YXZ' ) {\n\n\t\t\tconst ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[ 0 ] = ce + df * b;\n\t\t\tte[ 4 ] = de * b - cf;\n\t\t\tte[ 8 ] = a * d;\n\n\t\t\tte[ 1 ] = a * f;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = - b;\n\n\t\t\tte[ 2 ] = cf * b - de;\n\t\t\tte[ 6 ] = df + ce * b;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'ZXY' ) {\n\n\t\t\tconst ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[ 0 ] = ce - df * b;\n\t\t\tte[ 4 ] = - a * f;\n\t\t\tte[ 8 ] = de + cf * b;\n\n\t\t\tte[ 1 ] = cf + de * b;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = df - ce * b;\n\n\t\t\tte[ 2 ] = - a * d;\n\t\t\tte[ 6 ] = b;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'ZYX' ) {\n\n\t\t\tconst ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = be * d - af;\n\t\t\tte[ 8 ] = ae * d + bf;\n\n\t\t\tte[ 1 ] = c * f;\n\t\t\tte[ 5 ] = bf * d + ae;\n\t\t\tte[ 9 ] = af * d - be;\n\n\t\t\tte[ 2 ] = - d;\n\t\t\tte[ 6 ] = b * c;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'YZX' ) {\n\n\t\t\tconst ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = bd - ac * f;\n\t\t\tte[ 8 ] = bc * f + ad;\n\n\t\t\tte[ 1 ] = f;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = - b * e;\n\n\t\t\tte[ 2 ] = - d * e;\n\t\t\tte[ 6 ] = ad * f + bc;\n\t\t\tte[ 10 ] = ac - bd * f;\n\n\t\t} else if ( euler.order === 'XZY' ) {\n\n\t\t\tconst ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = - f;\n\t\t\tte[ 8 ] = d * e;\n\n\t\t\tte[ 1 ] = ac * f + bd;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = ad * f - bc;\n\n\t\t\tte[ 2 ] = bc * f - ad;\n\t\t\tte[ 6 ] = b * e;\n\t\t\tte[ 10 ] = bd * f + ac;\n\n\t\t}\n\n\t\t// bottom row\n\t\tte[ 3 ] = 0;\n\t\tte[ 7 ] = 0;\n\t\tte[ 11 ] = 0;\n\n\t\t// last column\n\t\tte[ 12 ] = 0;\n\t\tte[ 13 ] = 0;\n\t\tte[ 14 ] = 0;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationFromQuaternion( q ) {\n\n\t\treturn this.compose( _zero, q, _one );\n\n\t}\n\n\tlookAt( eye, target, up ) {\n\n\t\tconst te = this.elements;\n\n\t\t_z.subVectors( eye, target );\n\n\t\tif ( _z.lengthSq() === 0 ) {\n\n\t\t\t// eye and target are in the same position\n\n\t\t\t_z.z = 1;\n\n\t\t}\n\n\t\t_z.normalize();\n\t\t_x.crossVectors( up, _z );\n\n\t\tif ( _x.lengthSq() === 0 ) {\n\n\t\t\t// up and z are parallel\n\n\t\t\tif ( Math.abs( up.z ) === 1 ) {\n\n\t\t\t\t_z.x += 0.0001;\n\n\t\t\t} else {\n\n\t\t\t\t_z.z += 0.0001;\n\n\t\t\t}\n\n\t\t\t_z.normalize();\n\t\t\t_x.crossVectors( up, _z );\n\n\t\t}\n\n\t\t_x.normalize();\n\t\t_y.crossVectors( _z, _x );\n\n\t\tte[ 0 ] = _x.x; te[ 4 ] = _y.x; te[ 8 ] = _z.x;\n\t\tte[ 1 ] = _x.y; te[ 5 ] = _y.y; te[ 9 ] = _z.y;\n\t\tte[ 2 ] = _x.z; te[ 6 ] = _y.z; te[ 10 ] = _z.z;\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( m, n ) {\n\n\t\tif ( n !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.' );\n\t\t\treturn this.multiplyMatrices( m, n );\n\n\t\t}\n\n\t\treturn this.multiplyMatrices( this, m );\n\n\t}\n\n\tpremultiply( m ) {\n\n\t\treturn this.multiplyMatrices( m, this );\n\n\t}\n\n\tmultiplyMatrices( a, b ) {\n\n\t\tconst ae = a.elements;\n\t\tconst be = b.elements;\n\t\tconst te = this.elements;\n\n\t\tconst a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ];\n\t\tconst a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ];\n\t\tconst a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ];\n\t\tconst a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ];\n\n\t\tconst b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ];\n\t\tconst b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ];\n\t\tconst b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ];\n\t\tconst b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ];\n\n\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n\t\tte[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n\t\tte[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n\t\tte[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n\n\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n\t\tte[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n\t\tte[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n\t\tte[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n\n\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n\t\tte[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n\t\tte[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n\t\tte[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n\n\t\tte[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n\t\tte[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n\t\tte[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n\t\tte[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( s ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s;\n\t\tte[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s;\n\t\tte[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s;\n\t\tte[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s;\n\n\t\treturn this;\n\n\t}\n\n\tdeterminant() {\n\n\t\tconst te = this.elements;\n\n\t\tconst n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ];\n\t\tconst n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ];\n\t\tconst n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ];\n\t\tconst n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ];\n\n\t\t//TODO: make this more efficient\n\t\t//( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )\n\n\t\treturn (\n\t\t\tn41 * (\n\t\t\t\t+ n14 * n23 * n32\n\t\t\t\t - n13 * n24 * n32\n\t\t\t\t - n14 * n22 * n33\n\t\t\t\t + n12 * n24 * n33\n\t\t\t\t + n13 * n22 * n34\n\t\t\t\t - n12 * n23 * n34\n\t\t\t) +\n\t\t\tn42 * (\n\t\t\t\t+ n11 * n23 * n34\n\t\t\t\t - n11 * n24 * n33\n\t\t\t\t + n14 * n21 * n33\n\t\t\t\t - n13 * n21 * n34\n\t\t\t\t + n13 * n24 * n31\n\t\t\t\t - n14 * n23 * n31\n\t\t\t) +\n\t\t\tn43 * (\n\t\t\t\t+ n11 * n24 * n32\n\t\t\t\t - n11 * n22 * n34\n\t\t\t\t - n14 * n21 * n32\n\t\t\t\t + n12 * n21 * n34\n\t\t\t\t + n14 * n22 * n31\n\t\t\t\t - n12 * n24 * n31\n\t\t\t) +\n\t\t\tn44 * (\n\t\t\t\t- n13 * n22 * n31\n\t\t\t\t - n11 * n23 * n32\n\t\t\t\t + n11 * n22 * n33\n\t\t\t\t + n13 * n21 * n32\n\t\t\t\t - n12 * n21 * n33\n\t\t\t\t + n12 * n23 * n31\n\t\t\t)\n\n\t\t);\n\n\t}\n\n\ttranspose() {\n\n\t\tconst te = this.elements;\n\t\tlet tmp;\n\n\t\ttmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp;\n\t\ttmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp;\n\t\ttmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp;\n\n\t\ttmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp;\n\t\ttmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp;\n\t\ttmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp;\n\n\t\treturn this;\n\n\t}\n\n\tsetPosition( x, y, z ) {\n\n\t\tconst te = this.elements;\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\tte[ 12 ] = x.x;\n\t\t\tte[ 13 ] = x.y;\n\t\t\tte[ 14 ] = x.z;\n\n\t\t} else {\n\n\t\t\tte[ 12 ] = x;\n\t\t\tte[ 13 ] = y;\n\t\t\tte[ 14 ] = z;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tinvert() {\n\n\t\t// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n\t\tconst te = this.elements,\n\n\t\t\tn11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ], n41 = te[ 3 ],\n\t\t\tn12 = te[ 4 ], n22 = te[ 5 ], n32 = te[ 6 ], n42 = te[ 7 ],\n\t\t\tn13 = te[ 8 ], n23 = te[ 9 ], n33 = te[ 10 ], n43 = te[ 11 ],\n\t\t\tn14 = te[ 12 ], n24 = te[ 13 ], n34 = te[ 14 ], n44 = te[ 15 ],\n\n\t\t\tt11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,\n\t\t\tt12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,\n\t\t\tt13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,\n\t\t\tt14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;\n\n\t\tconst det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;\n\n\t\tif ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );\n\n\t\tconst detInv = 1 / det;\n\n\t\tte[ 0 ] = t11 * detInv;\n\t\tte[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv;\n\t\tte[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv;\n\t\tte[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv;\n\n\t\tte[ 4 ] = t12 * detInv;\n\t\tte[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv;\n\t\tte[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv;\n\t\tte[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv;\n\n\t\tte[ 8 ] = t13 * detInv;\n\t\tte[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv;\n\t\tte[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv;\n\t\tte[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv;\n\n\t\tte[ 12 ] = t14 * detInv;\n\t\tte[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv;\n\t\tte[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv;\n\t\tte[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv;\n\n\t\treturn this;\n\n\t}\n\n\tscale( v ) {\n\n\t\tconst te = this.elements;\n\t\tconst x = v.x, y = v.y, z = v.z;\n\n\t\tte[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z;\n\t\tte[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z;\n\t\tte[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z;\n\t\tte[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z;\n\n\t\treturn this;\n\n\t}\n\n\tgetMaxScaleOnAxis() {\n\n\t\tconst te = this.elements;\n\n\t\tconst scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ];\n\t\tconst scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ];\n\t\tconst scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ];\n\n\t\treturn Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) );\n\n\t}\n\n\tmakeTranslation( x, y, z ) {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, x,\n\t\t\t0, 1, 0, y,\n\t\t\t0, 0, 1, z,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationX( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, c, - s, 0,\n\t\t\t0, s, c, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationY( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\t c, 0, s, 0,\n\t\t\t 0, 1, 0, 0,\n\t\t\t- s, 0, c, 0,\n\t\t\t 0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationZ( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\tc, - s, 0, 0,\n\t\t\ts, c, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationAxis( axis, angle ) {\n\n\t\t// Based on http://www.gamedev.net/reference/articles/article1199.asp\n\n\t\tconst c = Math.cos( angle );\n\t\tconst s = Math.sin( angle );\n\t\tconst t = 1 - c;\n\t\tconst x = axis.x, y = axis.y, z = axis.z;\n\t\tconst tx = t * x, ty = t * y;\n\n\t\tthis.set(\n\n\t\t\ttx * x + c, tx * y - s * z, tx * z + s * y, 0,\n\t\t\ttx * y + s * z, ty * y + c, ty * z - s * x, 0,\n\t\t\ttx * z - s * y, ty * z + s * x, t * z * z + c, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeScale( x, y, z ) {\n\n\t\tthis.set(\n\n\t\t\tx, 0, 0, 0,\n\t\t\t0, y, 0, 0,\n\t\t\t0, 0, z, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeShear( xy, xz, yx, yz, zx, zy ) {\n\n\t\tthis.set(\n\n\t\t\t1, yx, zx, 0,\n\t\t\txy, 1, zy, 0,\n\t\t\txz, yz, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tcompose( position, quaternion, scale ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = quaternion._x, y = quaternion._y, z = quaternion._z, w = quaternion._w;\n\t\tconst x2 = x + x,\ty2 = y + y, z2 = z + z;\n\t\tconst xx = x * x2, xy = x * y2, xz = x * z2;\n\t\tconst yy = y * y2, yz = y * z2, zz = z * z2;\n\t\tconst wx = w * x2, wy = w * y2, wz = w * z2;\n\n\t\tconst sx = scale.x, sy = scale.y, sz = scale.z;\n\n\t\tte[ 0 ] = ( 1 - ( yy + zz ) ) * sx;\n\t\tte[ 1 ] = ( xy + wz ) * sx;\n\t\tte[ 2 ] = ( xz - wy ) * sx;\n\t\tte[ 3 ] = 0;\n\n\t\tte[ 4 ] = ( xy - wz ) * sy;\n\t\tte[ 5 ] = ( 1 - ( xx + zz ) ) * sy;\n\t\tte[ 6 ] = ( yz + wx ) * sy;\n\t\tte[ 7 ] = 0;\n\n\t\tte[ 8 ] = ( xz + wy ) * sz;\n\t\tte[ 9 ] = ( yz - wx ) * sz;\n\t\tte[ 10 ] = ( 1 - ( xx + yy ) ) * sz;\n\t\tte[ 11 ] = 0;\n\n\t\tte[ 12 ] = position.x;\n\t\tte[ 13 ] = position.y;\n\t\tte[ 14 ] = position.z;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\tdecompose( position, quaternion, scale ) {\n\n\t\tconst te = this.elements;\n\n\t\tlet sx = _v1.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length();\n\t\tconst sy = _v1.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length();\n\t\tconst sz = _v1.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length();\n\n\t\t// if determine is negative, we need to invert one scale\n\t\tconst det = this.determinant();\n\t\tif ( det < 0 ) sx = - sx;\n\n\t\tposition.x = te[ 12 ];\n\t\tposition.y = te[ 13 ];\n\t\tposition.z = te[ 14 ];\n\n\t\t// scale the rotation part\n\t\t_m1.copy( this );\n\n\t\tconst invSX = 1 / sx;\n\t\tconst invSY = 1 / sy;\n\t\tconst invSZ = 1 / sz;\n\n\t\t_m1.elements[ 0 ] *= invSX;\n\t\t_m1.elements[ 1 ] *= invSX;\n\t\t_m1.elements[ 2 ] *= invSX;\n\n\t\t_m1.elements[ 4 ] *= invSY;\n\t\t_m1.elements[ 5 ] *= invSY;\n\t\t_m1.elements[ 6 ] *= invSY;\n\n\t\t_m1.elements[ 8 ] *= invSZ;\n\t\t_m1.elements[ 9 ] *= invSZ;\n\t\t_m1.elements[ 10 ] *= invSZ;\n\n\t\tquaternion.setFromRotationMatrix( _m1 );\n\n\t\tscale.x = sx;\n\t\tscale.y = sy;\n\t\tscale.z = sz;\n\n\t\treturn this;\n\n\t}\n\n\tmakePerspective( left, right, top, bottom, near, far ) {\n\n\t\tif ( far === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.' );\n\n\t\t}\n\n\t\tconst te = this.elements;\n\t\tconst x = 2 * near / ( right - left );\n\t\tconst y = 2 * near / ( top - bottom );\n\n\t\tconst a = ( right + left ) / ( right - left );\n\t\tconst b = ( top + bottom ) / ( top - bottom );\n\t\tconst c = - ( far + near ) / ( far - near );\n\t\tconst d = - 2 * far * near / ( far - near );\n\n\t\tte[ 0 ] = x;\tte[ 4 ] = 0;\tte[ 8 ] = a;\tte[ 12 ] = 0;\n\t\tte[ 1 ] = 0;\tte[ 5 ] = y;\tte[ 9 ] = b;\tte[ 13 ] = 0;\n\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = c;\tte[ 14 ] = d;\n\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = - 1;\tte[ 15 ] = 0;\n\n\t\treturn this;\n\n\t}\n\n\tmakeOrthographic( left, right, top, bottom, near, far ) {\n\n\t\tconst te = this.elements;\n\t\tconst w = 1.0 / ( right - left );\n\t\tconst h = 1.0 / ( top - bottom );\n\t\tconst p = 1.0 / ( far - near );\n\n\t\tconst x = ( right + left ) * w;\n\t\tconst y = ( top + bottom ) * h;\n\t\tconst z = ( far + near ) * p;\n\n\t\tte[ 0 ] = 2 * w;\tte[ 4 ] = 0;\tte[ 8 ] = 0;\tte[ 12 ] = - x;\n\t\tte[ 1 ] = 0;\tte[ 5 ] = 2 * h;\tte[ 9 ] = 0;\tte[ 13 ] = - y;\n\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = - 2 * p;\tte[ 14 ] = - z;\n\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = 0;\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\tequals( matrix ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = matrix.elements;\n\n\t\tfor ( let i = 0; i < 16; i ++ ) {\n\n\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 16; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst te = this.elements;\n\n\t\tarray[ offset ] = te[ 0 ];\n\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\tarray[ offset + 2 ] = te[ 2 ];\n\t\tarray[ offset + 3 ] = te[ 3 ];\n\n\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\tarray[ offset + 5 ] = te[ 5 ];\n\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\tarray[ offset + 7 ] = te[ 7 ];\n\n\t\tarray[ offset + 8 ] = te[ 8 ];\n\t\tarray[ offset + 9 ] = te[ 9 ];\n\t\tarray[ offset + 10 ] = te[ 10 ];\n\t\tarray[ offset + 11 ] = te[ 11 ];\n\n\t\tarray[ offset + 12 ] = te[ 12 ];\n\t\tarray[ offset + 13 ] = te[ 13 ];\n\t\tarray[ offset + 14 ] = te[ 14 ];\n\t\tarray[ offset + 15 ] = te[ 15 ];\n\n\t\treturn array;\n\n\t}\n\n}\n\nMatrix4.prototype.isMatrix4 = true;\n\nconst _v1 = /*@__PURE__*/ new Vector3();\nconst _m1 = /*@__PURE__*/ new Matrix4();\nconst _zero = /*@__PURE__*/ new Vector3( 0, 0, 0 );\nconst _one = /*@__PURE__*/ new Vector3( 1, 1, 1 );\nconst _x = /*@__PURE__*/ new Vector3();\nconst _y = /*@__PURE__*/ new Vector3();\nconst _z = /*@__PURE__*/ new Vector3();\n\nexport { Matrix4 };\n","import { Quaternion } from './Quaternion.js';\nimport { Vector3 } from './Vector3.js';\nimport { Matrix4 } from './Matrix4.js';\nimport { clamp } from './MathUtils.js';\n\nconst _matrix = /*@__PURE__*/ new Matrix4();\nconst _quaternion = /*@__PURE__*/ new Quaternion();\n\nclass Euler {\n\n\tconstructor( x = 0, y = 0, z = 0, order = Euler.DefaultOrder ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order;\n\n\t}\n\n\tget x() {\n\n\t\treturn this._x;\n\n\t}\n\n\tset x( value ) {\n\n\t\tthis._x = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget y() {\n\n\t\treturn this._y;\n\n\t}\n\n\tset y( value ) {\n\n\t\tthis._y = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget z() {\n\n\t\treturn this._z;\n\n\t}\n\n\tset z( value ) {\n\n\t\tthis._z = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget order() {\n\n\t\treturn this._order;\n\n\t}\n\n\tset order( value ) {\n\n\t\tthis._order = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tset( x, y, z, order = this._order ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._order );\n\n\t}\n\n\tcopy( euler ) {\n\n\t\tthis._x = euler._x;\n\t\tthis._y = euler._y;\n\t\tthis._z = euler._z;\n\t\tthis._order = euler._order;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromRotationMatrix( m, order = this._order, update = true ) {\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tconst te = m.elements;\n\t\tconst m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ];\n\t\tconst m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ];\n\t\tconst m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\tswitch ( order ) {\n\n\t\t\tcase 'XYZ':\n\n\t\t\t\tthis._y = Math.asin( clamp( m13, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m13 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'YXZ':\n\n\t\t\t\tthis._x = Math.asin( - clamp( m23, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m23 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZXY':\n\n\t\t\t\tthis._x = Math.asin( clamp( m32, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m32 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = 0;\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZYX':\n\n\t\t\t\tthis._y = Math.asin( - clamp( m31, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m31 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'YZX':\n\n\t\t\t\tthis._z = Math.asin( clamp( m21, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m21 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m22 );\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'XZY':\n\n\t\t\t\tthis._z = Math.asin( - clamp( m12, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m12 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._y = Math.atan2( m13, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._y = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tconsole.warn( 'THREE.Euler: .setFromRotationMatrix() encountered an unknown order: ' + order );\n\n\t\t}\n\n\t\tthis._order = order;\n\n\t\tif ( update === true ) this._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromQuaternion( q, order, update ) {\n\n\t\t_matrix.makeRotationFromQuaternion( q );\n\n\t\treturn this.setFromRotationMatrix( _matrix, order, update );\n\n\t}\n\n\tsetFromVector3( v, order = this._order ) {\n\n\t\treturn this.set( v.x, v.y, v.z, order );\n\n\t}\n\n\treorder( newOrder ) {\n\n\t\t// WARNING: this discards revolution information -bhouston\n\n\t\t_quaternion.setFromEuler( this );\n\n\t\treturn this.setFromQuaternion( _quaternion, newOrder );\n\n\t}\n\n\tequals( euler ) {\n\n\t\treturn ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order );\n\n\t}\n\n\tfromArray( array ) {\n\n\t\tthis._x = array[ 0 ];\n\t\tthis._y = array[ 1 ];\n\t\tthis._z = array[ 2 ];\n\t\tif ( array[ 3 ] !== undefined ) this._order = array[ 3 ];\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this._x;\n\t\tarray[ offset + 1 ] = this._y;\n\t\tarray[ offset + 2 ] = this._z;\n\t\tarray[ offset + 3 ] = this._order;\n\n\t\treturn array;\n\n\t}\n\n\ttoVector3( optionalResult ) {\n\n\t\tif ( optionalResult ) {\n\n\t\t\treturn optionalResult.set( this._x, this._y, this._z );\n\n\t\t} else {\n\n\t\t\treturn new Vector3( this._x, this._y, this._z );\n\n\t\t}\n\n\t}\n\n\t_onChange( callback ) {\n\n\t\tthis._onChangeCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t_onChangeCallback() {}\n\n}\n\nEuler.prototype.isEuler = true;\n\nEuler.DefaultOrder = 'XYZ';\nEuler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ];\n\nexport { Euler };\n","class Layers {\n\n\tconstructor() {\n\n\t\tthis.mask = 1 | 0;\n\n\t}\n\n\tset( channel ) {\n\n\t\tthis.mask = ( 1 << channel | 0 ) >>> 0;\n\n\t}\n\n\tenable( channel ) {\n\n\t\tthis.mask |= 1 << channel | 0;\n\n\t}\n\n\tenableAll() {\n\n\t\tthis.mask = 0xffffffff | 0;\n\n\t}\n\n\ttoggle( channel ) {\n\n\t\tthis.mask ^= 1 << channel | 0;\n\n\t}\n\n\tdisable( channel ) {\n\n\t\tthis.mask &= ~ ( 1 << channel | 0 );\n\n\t}\n\n\tdisableAll() {\n\n\t\tthis.mask = 0;\n\n\t}\n\n\ttest( layers ) {\n\n\t\treturn ( this.mask & layers.mask ) !== 0;\n\n\t}\n\n\tisEnabled( channel ) {\n\n\t\treturn ( this.mask & ( 1 << channel | 0 ) ) !== 0;\n\n\t}\n\n}\n\n\nexport { Layers };\n","class Matrix3 {\n\n\tconstructor() {\n\n\t\tthis.elements = [\n\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\n\t\t];\n\n\t\tif ( arguments.length > 0 ) {\n\n\t\t\tconsole.error( 'THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.' );\n\n\t\t}\n\n\t}\n\n\tset( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31;\n\t\tte[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32;\n\t\tte[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33;\n\n\t\treturn this;\n\n\t}\n\n\tidentity() {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tcopy( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tte[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ];\n\t\tte[ 3 ] = me[ 3 ]; te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ];\n\t\tte[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; te[ 8 ] = me[ 8 ];\n\n\t\treturn this;\n\n\t}\n\n\textractBasis( xAxis, yAxis, zAxis ) {\n\n\t\txAxis.setFromMatrix3Column( this, 0 );\n\t\tyAxis.setFromMatrix3Column( this, 1 );\n\t\tzAxis.setFromMatrix3Column( this, 2 );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrix4( m ) {\n\n\t\tconst me = m.elements;\n\n\t\tthis.set(\n\n\t\t\tme[ 0 ], me[ 4 ], me[ 8 ],\n\t\t\tme[ 1 ], me[ 5 ], me[ 9 ],\n\t\t\tme[ 2 ], me[ 6 ], me[ 10 ]\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( m ) {\n\n\t\treturn this.multiplyMatrices( this, m );\n\n\t}\n\n\tpremultiply( m ) {\n\n\t\treturn this.multiplyMatrices( m, this );\n\n\t}\n\n\tmultiplyMatrices( a, b ) {\n\n\t\tconst ae = a.elements;\n\t\tconst be = b.elements;\n\t\tconst te = this.elements;\n\n\t\tconst a11 = ae[ 0 ], a12 = ae[ 3 ], a13 = ae[ 6 ];\n\t\tconst a21 = ae[ 1 ], a22 = ae[ 4 ], a23 = ae[ 7 ];\n\t\tconst a31 = ae[ 2 ], a32 = ae[ 5 ], a33 = ae[ 8 ];\n\n\t\tconst b11 = be[ 0 ], b12 = be[ 3 ], b13 = be[ 6 ];\n\t\tconst b21 = be[ 1 ], b22 = be[ 4 ], b23 = be[ 7 ];\n\t\tconst b31 = be[ 2 ], b32 = be[ 5 ], b33 = be[ 8 ];\n\n\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31;\n\t\tte[ 3 ] = a11 * b12 + a12 * b22 + a13 * b32;\n\t\tte[ 6 ] = a11 * b13 + a12 * b23 + a13 * b33;\n\n\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31;\n\t\tte[ 4 ] = a21 * b12 + a22 * b22 + a23 * b32;\n\t\tte[ 7 ] = a21 * b13 + a22 * b23 + a23 * b33;\n\n\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31;\n\t\tte[ 5 ] = a31 * b12 + a32 * b22 + a33 * b32;\n\t\tte[ 8 ] = a31 * b13 + a32 * b23 + a33 * b33;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( s ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s;\n\t\tte[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s;\n\t\tte[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s;\n\n\t\treturn this;\n\n\t}\n\n\tdeterminant() {\n\n\t\tconst te = this.elements;\n\n\t\tconst a = te[ 0 ], b = te[ 1 ], c = te[ 2 ],\n\t\t\td = te[ 3 ], e = te[ 4 ], f = te[ 5 ],\n\t\t\tg = te[ 6 ], h = te[ 7 ], i = te[ 8 ];\n\n\t\treturn a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;\n\n\t}\n\n\tinvert() {\n\n\t\tconst te = this.elements,\n\n\t\t\tn11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ],\n\t\t\tn12 = te[ 3 ], n22 = te[ 4 ], n32 = te[ 5 ],\n\t\t\tn13 = te[ 6 ], n23 = te[ 7 ], n33 = te[ 8 ],\n\n\t\t\tt11 = n33 * n22 - n32 * n23,\n\t\t\tt12 = n32 * n13 - n33 * n12,\n\t\t\tt13 = n23 * n12 - n22 * n13,\n\n\t\t\tdet = n11 * t11 + n21 * t12 + n31 * t13;\n\n\t\tif ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0 );\n\n\t\tconst detInv = 1 / det;\n\n\t\tte[ 0 ] = t11 * detInv;\n\t\tte[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv;\n\t\tte[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv;\n\n\t\tte[ 3 ] = t12 * detInv;\n\t\tte[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv;\n\t\tte[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv;\n\n\t\tte[ 6 ] = t13 * detInv;\n\t\tte[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv;\n\t\tte[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv;\n\n\t\treturn this;\n\n\t}\n\n\ttranspose() {\n\n\t\tlet tmp;\n\t\tconst m = this.elements;\n\n\t\ttmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp;\n\t\ttmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp;\n\t\ttmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp;\n\n\t\treturn this;\n\n\t}\n\n\tgetNormalMatrix( matrix4 ) {\n\n\t\treturn this.setFromMatrix4( matrix4 ).invert().transpose();\n\n\t}\n\n\ttransposeIntoArray( r ) {\n\n\t\tconst m = this.elements;\n\n\t\tr[ 0 ] = m[ 0 ];\n\t\tr[ 1 ] = m[ 3 ];\n\t\tr[ 2 ] = m[ 6 ];\n\t\tr[ 3 ] = m[ 1 ];\n\t\tr[ 4 ] = m[ 4 ];\n\t\tr[ 5 ] = m[ 7 ];\n\t\tr[ 6 ] = m[ 2 ];\n\t\tr[ 7 ] = m[ 5 ];\n\t\tr[ 8 ] = m[ 8 ];\n\n\t\treturn this;\n\n\t}\n\n\tsetUvTransform( tx, ty, sx, sy, rotation, cx, cy ) {\n\n\t\tconst c = Math.cos( rotation );\n\t\tconst s = Math.sin( rotation );\n\n\t\tthis.set(\n\t\t\tsx * c, sx * s, - sx * ( c * cx + s * cy ) + cx + tx,\n\t\t\t- sy * s, sy * c, - sy * ( - s * cx + c * cy ) + cy + ty,\n\t\t\t0, 0, 1\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tscale( sx, sy ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] *= sx; te[ 3 ] *= sx; te[ 6 ] *= sx;\n\t\tte[ 1 ] *= sy; te[ 4 ] *= sy; te[ 7 ] *= sy;\n\n\t\treturn this;\n\n\t}\n\n\trotate( theta ) {\n\n\t\tconst c = Math.cos( theta );\n\t\tconst s = Math.sin( theta );\n\n\t\tconst te = this.elements;\n\n\t\tconst a11 = te[ 0 ], a12 = te[ 3 ], a13 = te[ 6 ];\n\t\tconst a21 = te[ 1 ], a22 = te[ 4 ], a23 = te[ 7 ];\n\n\t\tte[ 0 ] = c * a11 + s * a21;\n\t\tte[ 3 ] = c * a12 + s * a22;\n\t\tte[ 6 ] = c * a13 + s * a23;\n\n\t\tte[ 1 ] = - s * a11 + c * a21;\n\t\tte[ 4 ] = - s * a12 + c * a22;\n\t\tte[ 7 ] = - s * a13 + c * a23;\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( tx, ty ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] += tx * te[ 2 ]; te[ 3 ] += tx * te[ 5 ]; te[ 6 ] += tx * te[ 8 ];\n\t\tte[ 1 ] += ty * te[ 2 ]; te[ 4 ] += ty * te[ 5 ]; te[ 7 ] += ty * te[ 8 ];\n\n\t\treturn this;\n\n\t}\n\n\tequals( matrix ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = matrix.elements;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst te = this.elements;\n\n\t\tarray[ offset ] = te[ 0 ];\n\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\tarray[ offset + 2 ] = te[ 2 ];\n\n\t\tarray[ offset + 3 ] = te[ 3 ];\n\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\tarray[ offset + 5 ] = te[ 5 ];\n\n\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\tarray[ offset + 7 ] = te[ 7 ];\n\t\tarray[ offset + 8 ] = te[ 8 ];\n\n\t\treturn array;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().fromArray( this.elements );\n\n\t}\n\n}\n\nMatrix3.prototype.isMatrix3 = true;\n\nexport { Matrix3 };\n","import { Quaternion } from '../math/Quaternion.js';\nimport { Vector3 } from '../math/Vector3.js';\nimport { Matrix4 } from '../math/Matrix4.js';\nimport { EventDispatcher } from './EventDispatcher.js';\nimport { Euler } from '../math/Euler.js';\nimport { Layers } from './Layers.js';\nimport { Matrix3 } from '../math/Matrix3.js';\nimport * as MathUtils from '../math/MathUtils.js';\n\nlet _object3DId = 0;\n\nconst _v1 = /*@__PURE__*/ new Vector3();\nconst _q1 = /*@__PURE__*/ new Quaternion();\nconst _m1 = /*@__PURE__*/ new Matrix4();\nconst _target = /*@__PURE__*/ new Vector3();\n\nconst _position = /*@__PURE__*/ new Vector3();\nconst _scale = /*@__PURE__*/ new Vector3();\nconst _quaternion = /*@__PURE__*/ new Quaternion();\n\nconst _xAxis = /*@__PURE__*/ new Vector3( 1, 0, 0 );\nconst _yAxis = /*@__PURE__*/ new Vector3( 0, 1, 0 );\nconst _zAxis = /*@__PURE__*/ new Vector3( 0, 0, 1 );\n\nconst _addedEvent = { type: 'added' };\nconst _removedEvent = { type: 'removed' };\n\nclass Object3D extends EventDispatcher {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tObject.defineProperty( this, 'id', { value: _object3DId ++ } );\n\n\t\tthis.uuid = MathUtils.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Object3D';\n\n\t\tthis.parent = null;\n\t\tthis.children = [];\n\n\t\tthis.up = Object3D.DefaultUp.clone();\n\n\t\tconst position = new Vector3();\n\t\tconst rotation = new Euler();\n\t\tconst quaternion = new Quaternion();\n\t\tconst scale = new Vector3( 1, 1, 1 );\n\n\t\tfunction onRotationChange() {\n\n\t\t\tquaternion.setFromEuler( rotation, false );\n\n\t\t}\n\n\t\tfunction onQuaternionChange() {\n\n\t\t\trotation.setFromQuaternion( quaternion, undefined, false );\n\n\t\t}\n\n\t\trotation._onChange( onRotationChange );\n\t\tquaternion._onChange( onQuaternionChange );\n\n\t\tObject.defineProperties( this, {\n\t\t\tposition: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: position\n\t\t\t},\n\t\t\trotation: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: rotation\n\t\t\t},\n\t\t\tquaternion: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: quaternion\n\t\t\t},\n\t\t\tscale: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: scale\n\t\t\t},\n\t\t\tmodelViewMatrix: {\n\t\t\t\tvalue: new Matrix4()\n\t\t\t},\n\t\t\tnormalMatrix: {\n\t\t\t\tvalue: new Matrix3()\n\t\t\t}\n\t\t} );\n\n\t\tthis.matrix = new Matrix4();\n\t\tthis.matrixWorld = new Matrix4();\n\n\t\tthis.matrixAutoUpdate = Object3D.DefaultMatrixAutoUpdate;\n\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\tthis.layers = new Layers();\n\t\tthis.visible = true;\n\n\t\tthis.castShadow = false;\n\t\tthis.receiveShadow = false;\n\n\t\tthis.frustumCulled = true;\n\t\tthis.renderOrder = 0;\n\n\t\tthis.animations = [];\n\n\t\tthis.userData = {};\n\n\t}\n\n\tonBeforeRender( /* renderer, scene, camera, geometry, material, group */ ) {}\n\n\tonAfterRender( /* renderer, scene, camera, geometry, material, group */ ) {}\n\n\tapplyMatrix4( matrix ) {\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tthis.matrix.premultiply( matrix );\n\n\t\tthis.matrix.decompose( this.position, this.quaternion, this.scale );\n\n\t}\n\n\tapplyQuaternion( q ) {\n\n\t\tthis.quaternion.premultiply( q );\n\n\t\treturn this;\n\n\t}\n\n\tsetRotationFromAxisAngle( axis, angle ) {\n\n\t\t// assumes axis is normalized\n\n\t\tthis.quaternion.setFromAxisAngle( axis, angle );\n\n\t}\n\n\tsetRotationFromEuler( euler ) {\n\n\t\tthis.quaternion.setFromEuler( euler, true );\n\n\t}\n\n\tsetRotationFromMatrix( m ) {\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tthis.quaternion.setFromRotationMatrix( m );\n\n\t}\n\n\tsetRotationFromQuaternion( q ) {\n\n\t\t// assumes q is normalized\n\n\t\tthis.quaternion.copy( q );\n\n\t}\n\n\trotateOnAxis( axis, angle ) {\n\n\t\t// rotate object on axis in object space\n\t\t// axis is assumed to be normalized\n\n\t\t_q1.setFromAxisAngle( axis, angle );\n\n\t\tthis.quaternion.multiply( _q1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateOnWorldAxis( axis, angle ) {\n\n\t\t// rotate object on axis in world space\n\t\t// axis is assumed to be normalized\n\t\t// method assumes no rotated parent\n\n\t\t_q1.setFromAxisAngle( axis, angle );\n\n\t\tthis.quaternion.premultiply( _q1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateX( angle ) {\n\n\t\treturn this.rotateOnAxis( _xAxis, angle );\n\n\t}\n\n\trotateY( angle ) {\n\n\t\treturn this.rotateOnAxis( _yAxis, angle );\n\n\t}\n\n\trotateZ( angle ) {\n\n\t\treturn this.rotateOnAxis( _zAxis, angle );\n\n\t}\n\n\ttranslateOnAxis( axis, distance ) {\n\n\t\t// translate object by distance along axis in object space\n\t\t// axis is assumed to be normalized\n\n\t\t_v1.copy( axis ).applyQuaternion( this.quaternion );\n\n\t\tthis.position.add( _v1.multiplyScalar( distance ) );\n\n\t\treturn this;\n\n\t}\n\n\ttranslateX( distance ) {\n\n\t\treturn this.translateOnAxis( _xAxis, distance );\n\n\t}\n\n\ttranslateY( distance ) {\n\n\t\treturn this.translateOnAxis( _yAxis, distance );\n\n\t}\n\n\ttranslateZ( distance ) {\n\n\t\treturn this.translateOnAxis( _zAxis, distance );\n\n\t}\n\n\tlocalToWorld( vector ) {\n\n\t\treturn vector.applyMatrix4( this.matrixWorld );\n\n\t}\n\n\tworldToLocal( vector ) {\n\n\t\treturn vector.applyMatrix4( _m1.copy( this.matrixWorld ).invert() );\n\n\t}\n\n\tlookAt( x, y, z ) {\n\n\t\t// This method does not support objects having non-uniformly-scaled parent(s)\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\t_target.copy( x );\n\n\t\t} else {\n\n\t\t\t_target.set( x, y, z );\n\n\t\t}\n\n\t\tconst parent = this.parent;\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\t_position.setFromMatrixPosition( this.matrixWorld );\n\n\t\tif ( this.isCamera || this.isLight ) {\n\n\t\t\t_m1.lookAt( _position, _target, this.up );\n\n\t\t} else {\n\n\t\t\t_m1.lookAt( _target, _position, this.up );\n\n\t\t}\n\n\t\tthis.quaternion.setFromRotationMatrix( _m1 );\n\n\t\tif ( parent ) {\n\n\t\t\t_m1.extractRotation( parent.matrixWorld );\n\t\t\t_q1.setFromRotationMatrix( _m1 );\n\t\t\tthis.quaternion.premultiply( _q1.invert() );\n\n\t\t}\n\n\t}\n\n\tadd( object ) {\n\n\t\tif ( arguments.length > 1 ) {\n\n\t\t\tfor ( let i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\tthis.add( arguments[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( object === this ) {\n\n\t\t\tconsole.error( 'THREE.Object3D.add: object can\\'t be added as a child of itself.', object );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( object && object.isObject3D ) {\n\n\t\t\tif ( object.parent !== null ) {\n\n\t\t\t\tobject.parent.remove( object );\n\n\t\t\t}\n\n\t\t\tobject.parent = this;\n\t\t\tthis.children.push( object );\n\n\t\t\tobject.dispatchEvent( _addedEvent );\n\n\t\t} else {\n\n\t\t\tconsole.error( 'THREE.Object3D.add: object not an instance of THREE.Object3D.', object );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tremove( object ) {\n\n\t\tif ( arguments.length > 1 ) {\n\n\t\t\tfor ( let i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\tthis.remove( arguments[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst index = this.children.indexOf( object );\n\n\t\tif ( index !== - 1 ) {\n\n\t\t\tobject.parent = null;\n\t\t\tthis.children.splice( index, 1 );\n\n\t\t\tobject.dispatchEvent( _removedEvent );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tremoveFromParent() {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( parent !== null ) {\n\n\t\t\tparent.remove( this );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tclear() {\n\n\t\tfor ( let i = 0; i < this.children.length; i ++ ) {\n\n\t\t\tconst object = this.children[ i ];\n\n\t\t\tobject.parent = null;\n\n\t\t\tobject.dispatchEvent( _removedEvent );\n\n\t\t}\n\n\t\tthis.children.length = 0;\n\n\t\treturn this;\n\n\n\t}\n\n\tattach( object ) {\n\n\t\t// adds object as a child of this, while maintaining the object's world transform\n\n\t\t// Note: This method does not support scene graphs having non-uniformly-scaled nodes(s)\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\t_m1.copy( this.matrixWorld ).invert();\n\n\t\tif ( object.parent !== null ) {\n\n\t\t\tobject.parent.updateWorldMatrix( true, false );\n\n\t\t\t_m1.multiply( object.parent.matrixWorld );\n\n\t\t}\n\n\t\tobject.applyMatrix4( _m1 );\n\n\t\tthis.add( object );\n\n\t\tobject.updateWorldMatrix( false, true );\n\n\t\treturn this;\n\n\t}\n\n\tgetObjectById( id ) {\n\n\t\treturn this.getObjectByProperty( 'id', id );\n\n\t}\n\n\tgetObjectByName( name ) {\n\n\t\treturn this.getObjectByProperty( 'name', name );\n\n\t}\n\n\tgetObjectByProperty( name, value ) {\n\n\t\tif ( this[ name ] === value ) return this;\n\n\t\tfor ( let i = 0, l = this.children.length; i < l; i ++ ) {\n\n\t\t\tconst child = this.children[ i ];\n\t\t\tconst object = child.getObjectByProperty( name, value );\n\n\t\t\tif ( object !== undefined ) {\n\n\t\t\t\treturn object;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn undefined;\n\n\t}\n\n\tgetWorldPosition( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\treturn target.setFromMatrixPosition( this.matrixWorld );\n\n\t}\n\n\tgetWorldQuaternion( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tthis.matrixWorld.decompose( _position, target, _scale );\n\n\t\treturn target;\n\n\t}\n\n\tgetWorldScale( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tthis.matrixWorld.decompose( _position, _quaternion, target );\n\n\t\treturn target;\n\n\t}\n\n\tgetWorldDirection( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tconst e = this.matrixWorld.elements;\n\n\t\treturn target.set( e[ 8 ], e[ 9 ], e[ 10 ] ).normalize();\n\n\t}\n\n\traycast( /* raycaster, intersects */ ) {}\n\n\ttraverse( callback ) {\n\n\t\tcallback( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].traverse( callback );\n\n\t\t}\n\n\t}\n\n\ttraverseVisible( callback ) {\n\n\t\tif ( this.visible === false ) return;\n\n\t\tcallback( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].traverseVisible( callback );\n\n\t\t}\n\n\t}\n\n\ttraverseAncestors( callback ) {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( parent !== null ) {\n\n\t\t\tcallback( parent );\n\n\t\t\tparent.traverseAncestors( callback );\n\n\t\t}\n\n\t}\n\n\tupdateMatrix() {\n\n\t\tthis.matrix.compose( this.position, this.quaternion, this.scale );\n\n\t\tthis.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tif ( this.matrixWorldNeedsUpdate || force ) {\n\n\t\t\tif ( this.parent === null ) {\n\n\t\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t\t} else {\n\n\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t\t}\n\n\t\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t\tforce = true;\n\n\t\t}\n\n\t\t// update children\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].updateMatrixWorld( force );\n\n\t\t}\n\n\t}\n\n\tupdateWorldMatrix( updateParents, updateChildren ) {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( updateParents === true && parent !== null ) {\n\n\t\t\tparent.updateWorldMatrix( true, false );\n\n\t\t}\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tif ( this.parent === null ) {\n\n\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t} else {\n\n\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t}\n\n\t\t// update children\n\n\t\tif ( updateChildren === true ) {\n\n\t\t\tconst children = this.children;\n\n\t\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].updateWorldMatrix( false, true );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\t// meta is a string when called from JSON.stringify\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tconst output = {};\n\n\t\t// meta is a hash used to collect geometries, materials.\n\t\t// not providing it implies that this is the root object\n\t\t// being serialized.\n\t\tif ( isRootObject ) {\n\n\t\t\t// initialize meta obj\n\t\t\tmeta = {\n\t\t\t\tgeometries: {},\n\t\t\t\tmaterials: {},\n\t\t\t\ttextures: {},\n\t\t\t\timages: {},\n\t\t\t\tshapes: {},\n\t\t\t\tskeletons: {},\n\t\t\t\tanimations: {}\n\t\t\t};\n\n\t\t\toutput.metadata = {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Object',\n\t\t\t\tgenerator: 'Object3D.toJSON'\n\t\t\t};\n\n\t\t}\n\n\t\t// standard Object3D serialization\n\n\t\tconst object = {};\n\n\t\tobject.uuid = this.uuid;\n\t\tobject.type = this.type;\n\n\t\tif ( this.name !== '' ) object.name = this.name;\n\t\tif ( this.castShadow === true ) object.castShadow = true;\n\t\tif ( this.receiveShadow === true ) object.receiveShadow = true;\n\t\tif ( this.visible === false ) object.visible = false;\n\t\tif ( this.frustumCulled === false ) object.frustumCulled = false;\n\t\tif ( this.renderOrder !== 0 ) object.renderOrder = this.renderOrder;\n\t\tif ( JSON.stringify( this.userData ) !== '{}' ) object.userData = this.userData;\n\n\t\tobject.layers = this.layers.mask;\n\t\tobject.matrix = this.matrix.toArray();\n\n\t\tif ( this.matrixAutoUpdate === false ) object.matrixAutoUpdate = false;\n\n\t\t// object specific properties\n\n\t\tif ( this.isInstancedMesh ) {\n\n\t\t\tobject.type = 'InstancedMesh';\n\t\t\tobject.count = this.count;\n\t\t\tobject.instanceMatrix = this.instanceMatrix.toJSON();\n\t\t\tif ( this.instanceColor !== null ) object.instanceColor = this.instanceColor.toJSON();\n\n\t\t}\n\n\t\t//\n\n\t\tfunction serialize( library, element ) {\n\n\t\t\tif ( library[ element.uuid ] === undefined ) {\n\n\t\t\t\tlibrary[ element.uuid ] = element.toJSON( meta );\n\n\t\t\t}\n\n\t\t\treturn element.uuid;\n\n\t\t}\n\n\t\tif ( this.isScene ) {\n\n\t\t\tif ( this.background ) {\n\n\t\t\t\tif ( this.background.isColor ) {\n\n\t\t\t\t\tobject.background = this.background.toJSON();\n\n\t\t\t\t} else if ( this.background.isTexture ) {\n\n\t\t\t\t\tobject.background = this.background.toJSON( meta ).uuid;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.environment && this.environment.isTexture ) {\n\n\t\t\t\tobject.environment = this.environment.toJSON( meta ).uuid;\n\n\t\t\t}\n\n\t\t} else if ( this.isMesh || this.isLine || this.isPoints ) {\n\n\t\t\tobject.geometry = serialize( meta.geometries, this.geometry );\n\n\t\t\tconst parameters = this.geometry.parameters;\n\n\t\t\tif ( parameters !== undefined && parameters.shapes !== undefined ) {\n\n\t\t\t\tconst shapes = parameters.shapes;\n\n\t\t\t\tif ( Array.isArray( shapes ) ) {\n\n\t\t\t\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tconst shape = shapes[ i ];\n\n\t\t\t\t\t\tserialize( meta.shapes, shape );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tserialize( meta.shapes, shapes );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.isSkinnedMesh ) {\n\n\t\t\tobject.bindMode = this.bindMode;\n\t\t\tobject.bindMatrix = this.bindMatrix.toArray();\n\n\t\t\tif ( this.skeleton !== undefined ) {\n\n\t\t\t\tserialize( meta.skeletons, this.skeleton );\n\n\t\t\t\tobject.skeleton = this.skeleton.uuid;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.material !== undefined ) {\n\n\t\t\tif ( Array.isArray( this.material ) ) {\n\n\t\t\t\tconst uuids = [];\n\n\t\t\t\tfor ( let i = 0, l = this.material.length; i < l; i ++ ) {\n\n\t\t\t\t\tuuids.push( serialize( meta.materials, this.material[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tobject.material = uuids;\n\n\t\t\t} else {\n\n\t\t\t\tobject.material = serialize( meta.materials, this.material );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.children.length > 0 ) {\n\n\t\t\tobject.children = [];\n\n\t\t\tfor ( let i = 0; i < this.children.length; i ++ ) {\n\n\t\t\t\tobject.children.push( this.children[ i ].toJSON( meta ).object );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.animations.length > 0 ) {\n\n\t\t\tobject.animations = [];\n\n\t\t\tfor ( let i = 0; i < this.animations.length; i ++ ) {\n\n\t\t\t\tconst animation = this.animations[ i ];\n\n\t\t\t\tobject.animations.push( serialize( meta.animations, animation ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( isRootObject ) {\n\n\t\t\tconst geometries = extractFromCache( meta.geometries );\n\t\t\tconst materials = extractFromCache( meta.materials );\n\t\t\tconst textures = extractFromCache( meta.textures );\n\t\t\tconst images = extractFromCache( meta.images );\n\t\t\tconst shapes = extractFromCache( meta.shapes );\n\t\t\tconst skeletons = extractFromCache( meta.skeletons );\n\t\t\tconst animations = extractFromCache( meta.animations );\n\n\t\t\tif ( geometries.length > 0 ) output.geometries = geometries;\n\t\t\tif ( materials.length > 0 ) output.materials = materials;\n\t\t\tif ( textures.length > 0 ) output.textures = textures;\n\t\t\tif ( images.length > 0 ) output.images = images;\n\t\t\tif ( shapes.length > 0 ) output.shapes = shapes;\n\t\t\tif ( skeletons.length > 0 ) output.skeletons = skeletons;\n\t\t\tif ( animations.length > 0 ) output.animations = animations;\n\n\t\t}\n\n\t\toutput.object = object;\n\n\t\treturn output;\n\n\t\t// extract data from the cache hash\n\t\t// remove metadata on each item\n\t\t// and return as array\n\t\tfunction extractFromCache( cache ) {\n\n\t\t\tconst values = [];\n\t\t\tfor ( const key in cache ) {\n\n\t\t\t\tconst data = cache[ key ];\n\t\t\t\tdelete data.metadata;\n\t\t\t\tvalues.push( data );\n\n\t\t\t}\n\n\t\t\treturn values;\n\n\t\t}\n\n\t}\n\n\tclone( recursive ) {\n\n\t\treturn new this.constructor().copy( this, recursive );\n\n\t}\n\n\tcopy( source, recursive = true ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.up.copy( source.up );\n\n\t\tthis.position.copy( source.position );\n\t\tthis.rotation.order = source.rotation.order;\n\t\tthis.quaternion.copy( source.quaternion );\n\t\tthis.scale.copy( source.scale );\n\n\t\tthis.matrix.copy( source.matrix );\n\t\tthis.matrixWorld.copy( source.matrixWorld );\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\t\tthis.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate;\n\n\t\tthis.layers.mask = source.layers.mask;\n\t\tthis.visible = source.visible;\n\n\t\tthis.castShadow = source.castShadow;\n\t\tthis.receiveShadow = source.receiveShadow;\n\n\t\tthis.frustumCulled = source.frustumCulled;\n\t\tthis.renderOrder = source.renderOrder;\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\tif ( recursive === true ) {\n\n\t\t\tfor ( let i = 0; i < source.children.length; i ++ ) {\n\n\t\t\t\tconst child = source.children[ i ];\n\t\t\t\tthis.add( child.clone() );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nObject3D.DefaultUp = new Vector3( 0, 1, 0 );\nObject3D.DefaultMatrixAutoUpdate = true;\n\nObject3D.prototype.isObject3D = true;\n\nexport { Object3D };\n","import { Matrix4 } from '../math/Matrix4.js';\nimport { Object3D } from '../core/Object3D.js';\n\nclass Camera extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'Camera';\n\n\t\tthis.matrixWorldInverse = new Matrix4();\n\n\t\tthis.projectionMatrix = new Matrix4();\n\t\tthis.projectionMatrixInverse = new Matrix4();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.matrixWorldInverse.copy( source.matrixWorldInverse );\n\n\t\tthis.projectionMatrix.copy( source.projectionMatrix );\n\t\tthis.projectionMatrixInverse.copy( source.projectionMatrixInverse );\n\n\t\treturn this;\n\n\t}\n\n\tgetWorldDirection( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tconst e = this.matrixWorld.elements;\n\n\t\treturn target.set( - e[ 8 ], - e[ 9 ], - e[ 10 ] ).normalize();\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tthis.matrixWorldInverse.copy( this.matrixWorld ).invert();\n\n\t}\n\n\tupdateWorldMatrix( updateParents, updateChildren ) {\n\n\t\tsuper.updateWorldMatrix( updateParents, updateChildren );\n\n\t\tthis.matrixWorldInverse.copy( this.matrixWorld ).invert();\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nCamera.prototype.isCamera = true;\n\nexport { Camera };\n","import { Camera } from './Camera.js';\n\nclass OrthographicCamera extends Camera {\n\n\tconstructor( left = - 1, right = 1, top = 1, bottom = - 1, near = 0.1, far = 2000 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'OrthographicCamera';\n\n\t\tthis.zoom = 1;\n\t\tthis.view = null;\n\n\t\tthis.left = left;\n\t\tthis.right = right;\n\t\tthis.top = top;\n\t\tthis.bottom = bottom;\n\n\t\tthis.near = near;\n\t\tthis.far = far;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.left = source.left;\n\t\tthis.right = source.right;\n\t\tthis.top = source.top;\n\t\tthis.bottom = source.bottom;\n\t\tthis.near = source.near;\n\t\tthis.far = source.far;\n\n\t\tthis.zoom = source.zoom;\n\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\treturn this;\n\n\t}\n\n\tsetViewOffset( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\tif ( this.view === null ) {\n\n\t\t\tthis.view = {\n\t\t\t\tenabled: true,\n\t\t\t\tfullWidth: 1,\n\t\t\t\tfullHeight: 1,\n\t\t\t\toffsetX: 0,\n\t\t\t\toffsetY: 0,\n\t\t\t\twidth: 1,\n\t\t\t\theight: 1\n\t\t\t};\n\n\t\t}\n\n\t\tthis.view.enabled = true;\n\t\tthis.view.fullWidth = fullWidth;\n\t\tthis.view.fullHeight = fullHeight;\n\t\tthis.view.offsetX = x;\n\t\tthis.view.offsetY = y;\n\t\tthis.view.width = width;\n\t\tthis.view.height = height;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tclearViewOffset() {\n\n\t\tif ( this.view !== null ) {\n\n\t\t\tthis.view.enabled = false;\n\n\t\t}\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tupdateProjectionMatrix() {\n\n\t\tconst dx = ( this.right - this.left ) / ( 2 * this.zoom );\n\t\tconst dy = ( this.top - this.bottom ) / ( 2 * this.zoom );\n\t\tconst cx = ( this.right + this.left ) / 2;\n\t\tconst cy = ( this.top + this.bottom ) / 2;\n\n\t\tlet left = cx - dx;\n\t\tlet right = cx + dx;\n\t\tlet top = cy + dy;\n\t\tlet bottom = cy - dy;\n\n\t\tif ( this.view !== null && this.view.enabled ) {\n\n\t\t\tconst scaleW = ( this.right - this.left ) / this.view.fullWidth / this.zoom;\n\t\t\tconst scaleH = ( this.top - this.bottom ) / this.view.fullHeight / this.zoom;\n\n\t\t\tleft += scaleW * this.view.offsetX;\n\t\t\tright = left + scaleW * this.view.width;\n\t\t\ttop -= scaleH * this.view.offsetY;\n\t\t\tbottom = top - scaleH * this.view.height;\n\n\t\t}\n\n\t\tthis.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far );\n\n\t\tthis.projectionMatrixInverse.copy( this.projectionMatrix ).invert();\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.zoom = this.zoom;\n\t\tdata.object.left = this.left;\n\t\tdata.object.right = this.right;\n\t\tdata.object.top = this.top;\n\t\tdata.object.bottom = this.bottom;\n\t\tdata.object.near = this.near;\n\t\tdata.object.far = this.far;\n\n\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\treturn data;\n\n\t}\n\n}\n\nOrthographicCamera.prototype.isOrthographicCamera = true;\n\nexport { OrthographicCamera };\n","import { Camera } from \"three/src/cameras/Camera.js\";\nimport { OrthographicCamera } from \"three/src/cameras/OrthographicCamera.js\";\nimport { PerspectiveCamera } from \"three/src/cameras/PerspectiveCamera.js\";\nimport { Bootstrap } from \"../bootstrap\";\n\nBootstrap.registerPlugin(\"camera\", {\n  defaults: {\n    near: 0.01,\n    far: 10000,\n\n    type: \"perspective\",\n    fov: 60,\n    aspect: null,\n\n    // type: 'orthographic',\n    left: -1,\n    right: 1,\n    bottom: -1,\n    top: 1,\n\n    klass: null,\n    parameters: null,\n  },\n\n  listen: [\"resize\", \"this.change\"],\n\n  install: function (three) {\n    three.Camera = this.api();\n    three.camera = null;\n\n    this.aspect = 1;\n    this.change({}, three);\n  },\n\n  uninstall: function (three) {\n    delete three.Camera;\n    delete three.camera;\n  },\n\n  change: function (event, three) {\n    const o = this.options;\n    const old = three.camera;\n\n    if (!three.camera || event.changes.type || event.changes.klass) {\n      const klass =\n        o.klass ||\n        {\n          perspective: PerspectiveCamera,\n          orthographic: OrthographicCamera,\n        }[o.type] ||\n        Camera;\n\n      three.camera = o.parameters ? new klass(o.parameters) : new klass();\n    }\n\n    Object.entries(o).forEach(\n      function ([key]) {\n        if (Object.prototype.hasOwnProperty.call(three.camera, key))\n          three.camera[key] = o[key];\n      }.bind(this)\n    );\n\n    this.update(three);\n\n    old === three.camera ||\n      three.trigger({\n        type: \"camera\",\n        camera: three.camera,\n      });\n  },\n\n  resize: function (event, three) {\n    this.aspect = event.viewWidth / Math.max(1, event.viewHeight);\n\n    this.update(three);\n  },\n\n  update: function (three) {\n    three.camera.aspect = this.options.aspect || this.aspect;\n    three.camera.updateProjectionMatrix();\n  },\n});\n","import { Bootstrap } from \"../bootstrap\";\n\nBootstrap.registerPlugin(\"fallback\", {\n  defaults: {\n    force: false,\n    fill: true,\n    begin:\n      '<div class=\"threestrap-fallback\" style=\"display: table; width: 100%; height: 100%;' +\n      'box-sizing: border-box; border: 1px dashed rgba(0, 0, 0, .25);\">' +\n      '<div style=\"display: table-cell; padding: 10px; vertical-align: middle; text-align: center;\">',\n    end: \"</div></div>\",\n    message:\n      \"<big><strong>This example requires WebGL</strong></big><br>\" +\n      'Visit <a target=\"_blank\" href=\"http://get.webgl.org/\">get.webgl.org</a> for more info</a>',\n  },\n\n  install: function (three) {\n    let cnv, gl;\n    try {\n      cnv = document.createElement(\"canvas\");\n      gl = cnv.getContext(\"webgl\") || cnv.getContext(\"experimental-webgl\");\n      if (!gl || this.options.force) {\n        throw \"WebGL unavailable.\";\n      }\n      three.fallback = false;\n    } catch (e) {\n      const message = this.options.message;\n      const begin = this.options.begin;\n      const end = this.options.end;\n      const fill = this.options.fill;\n\n      const div = document.createElement(\"div\");\n      div.innerHTML = begin + message + end;\n\n      this.children = [];\n\n      while (div.childNodes.length > 0) {\n        this.children.push(div.firstChild);\n        three.element.appendChild(div.firstChild);\n      }\n\n      if (fill) {\n        three.install(\"fill\");\n      }\n\n      this.div = div;\n      three.fallback = true;\n      return false; // Abort install\n    }\n  },\n\n  uninstall: function (three) {\n    if (this.children) {\n      this.children.forEach(function (child) {\n        child.parentNode.removeChild(child);\n      });\n      this.children = null;\n    }\n\n    delete three.fallback;\n  },\n});\n","import { Bootstrap } from \"../bootstrap\";\n\nBootstrap.registerPlugin(\"fill\", {\n  defaults: {\n    block: true,\n    body: true,\n    layout: true,\n  },\n\n  install: function (three) {\n    function is(element) {\n      const h = element.style.height;\n      return h == \"auto\" || h == \"\";\n    }\n\n    function set(element) {\n      element.style.height = \"100%\";\n      element.style.margin = 0;\n      element.style.padding = 0;\n      return element;\n    }\n\n    if (this.options.body && three.element == document.body) {\n      // Fix body height if we're naked\n      this.applied = [three.element, document.documentElement]\n        .filter(is)\n        .map(set);\n    }\n\n    if (this.options.block && three.canvas) {\n      three.canvas.style.display = \"block\";\n      this.block = true;\n    }\n\n    if (this.options.layout && three.element) {\n      const style = window.getComputedStyle(three.element);\n      if (style.position == \"static\") {\n        three.element.style.position = \"relative\";\n        this.layout = true;\n      }\n    }\n  },\n\n  uninstall: function (three) {\n    if (this.applied) {\n      const set = function (element) {\n        element.style.height = \"\";\n        element.style.margin = \"\";\n        element.style.padding = \"\";\n        return element;\n      };\n\n      this.applied.map(set);\n      delete this.applied;\n    }\n\n    if (this.block && three.canvas) {\n      three.canvas.style.display = \"\";\n      delete this.block;\n    }\n\n    if (this.layout && three.element) {\n      three.element.style.position = \"\";\n      delete this.layout;\n    }\n  },\n\n  change: function (three) {\n    this.uninstall(three);\n    this.install(three);\n  },\n});\n","import { Bootstrap } from \"../bootstrap\";\n\nBootstrap.registerPlugin(\"loop\", {\n  defaults: {\n    start: true,\n    each: 1,\n  },\n\n  listen: [\"ready\"],\n\n  install: function (three) {\n    this.running = false;\n    this.lastRequestId = null;\n\n    three.Loop = this.api(\n      {\n        start: this.start.bind(this),\n        stop: this.stop.bind(this),\n        running: false,\n        window: window,\n      },\n      three\n    );\n\n    this.events = [\"pre\", \"update\", \"render\", \"post\"].map(function (type) {\n      return { type: type };\n    });\n  },\n\n  uninstall: function (three) {\n    this.stop(three);\n  },\n\n  ready: function (event, three) {\n    if (this.options.start) this.start(three);\n  },\n\n  start: function (three) {\n    if (this.running) return;\n\n    three.Loop.running = this.running = true;\n\n    const trigger = three.trigger.bind(three);\n    const loop = function () {\n      if (!this.running) return;\n      this.lastRequestId = three.Loop.window.requestAnimationFrame(loop);\n      this.events.map(trigger);\n    }.bind(this);\n\n    this.lastRequestId = three.Loop.window.requestAnimationFrame(loop);\n\n    three.trigger({ type: \"start\" });\n  },\n\n  stop: function (three) {\n    if (!this.running) return;\n    three.Loop.running = this.running = false;\n\n    three.Loop.window.cancelAnimationFrame(this.lastRequestId);\n    this.lastRequestId = null;\n\n    three.trigger({ type: \"stop\" });\n  },\n});\n","import { Bootstrap } from \"../bootstrap\";\n\nBootstrap.registerPlugin(\"render\", {\n  listen: [\"render\"],\n\n  render: function (event, three) {\n    if (three.scene && three.camera) {\n      three.renderer.render(three.scene, three.camera);\n    }\n  },\n});\n","export const REVISION = '137';\nexport const MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2, ROTATE: 0, DOLLY: 1, PAN: 2 };\nexport const TOUCH = { ROTATE: 0, PAN: 1, DOLLY_PAN: 2, DOLLY_ROTATE: 3 };\nexport const CullFaceNone = 0;\nexport const CullFaceBack = 1;\nexport const CullFaceFront = 2;\nexport const CullFaceFrontBack = 3;\nexport const BasicShadowMap = 0;\nexport const PCFShadowMap = 1;\nexport const PCFSoftShadowMap = 2;\nexport const VSMShadowMap = 3;\nexport const FrontSide = 0;\nexport const BackSide = 1;\nexport const DoubleSide = 2;\nexport const FlatShading = 1;\nexport const SmoothShading = 2;\nexport const NoBlending = 0;\nexport const NormalBlending = 1;\nexport const AdditiveBlending = 2;\nexport const SubtractiveBlending = 3;\nexport const MultiplyBlending = 4;\nexport const CustomBlending = 5;\nexport const AddEquation = 100;\nexport const SubtractEquation = 101;\nexport const ReverseSubtractEquation = 102;\nexport const MinEquation = 103;\nexport const MaxEquation = 104;\nexport const ZeroFactor = 200;\nexport const OneFactor = 201;\nexport const SrcColorFactor = 202;\nexport const OneMinusSrcColorFactor = 203;\nexport const SrcAlphaFactor = 204;\nexport const OneMinusSrcAlphaFactor = 205;\nexport const DstAlphaFactor = 206;\nexport const OneMinusDstAlphaFactor = 207;\nexport const DstColorFactor = 208;\nexport const OneMinusDstColorFactor = 209;\nexport const SrcAlphaSaturateFactor = 210;\nexport const NeverDepth = 0;\nexport const AlwaysDepth = 1;\nexport const LessDepth = 2;\nexport const LessEqualDepth = 3;\nexport const EqualDepth = 4;\nexport const GreaterEqualDepth = 5;\nexport const GreaterDepth = 6;\nexport const NotEqualDepth = 7;\nexport const MultiplyOperation = 0;\nexport const MixOperation = 1;\nexport const AddOperation = 2;\nexport const NoToneMapping = 0;\nexport const LinearToneMapping = 1;\nexport const ReinhardToneMapping = 2;\nexport const CineonToneMapping = 3;\nexport const ACESFilmicToneMapping = 4;\nexport const CustomToneMapping = 5;\n\nexport const UVMapping = 300;\nexport const CubeReflectionMapping = 301;\nexport const CubeRefractionMapping = 302;\nexport const EquirectangularReflectionMapping = 303;\nexport const EquirectangularRefractionMapping = 304;\nexport const CubeUVReflectionMapping = 306;\nexport const CubeUVRefractionMapping = 307;\nexport const RepeatWrapping = 1000;\nexport const ClampToEdgeWrapping = 1001;\nexport const MirroredRepeatWrapping = 1002;\nexport const NearestFilter = 1003;\nexport const NearestMipmapNearestFilter = 1004;\nexport const NearestMipMapNearestFilter = 1004;\nexport const NearestMipmapLinearFilter = 1005;\nexport const NearestMipMapLinearFilter = 1005;\nexport const LinearFilter = 1006;\nexport const LinearMipmapNearestFilter = 1007;\nexport const LinearMipMapNearestFilter = 1007;\nexport const LinearMipmapLinearFilter = 1008;\nexport const LinearMipMapLinearFilter = 1008;\nexport const UnsignedByteType = 1009;\nexport const ByteType = 1010;\nexport const ShortType = 1011;\nexport const UnsignedShortType = 1012;\nexport const IntType = 1013;\nexport const UnsignedIntType = 1014;\nexport const FloatType = 1015;\nexport const HalfFloatType = 1016;\nexport const UnsignedShort4444Type = 1017;\nexport const UnsignedShort5551Type = 1018;\nexport const UnsignedInt248Type = 1020;\nexport const AlphaFormat = 1021;\nexport const RGBFormat = 1022;\nexport const RGBAFormat = 1023;\nexport const LuminanceFormat = 1024;\nexport const LuminanceAlphaFormat = 1025;\nexport const DepthFormat = 1026;\nexport const DepthStencilFormat = 1027;\nexport const RedFormat = 1028;\nexport const RedIntegerFormat = 1029;\nexport const RGFormat = 1030;\nexport const RGIntegerFormat = 1031;\nexport const RGBAIntegerFormat = 1033;\n\nexport const RGB_S3TC_DXT1_Format = 33776;\nexport const RGBA_S3TC_DXT1_Format = 33777;\nexport const RGBA_S3TC_DXT3_Format = 33778;\nexport const RGBA_S3TC_DXT5_Format = 33779;\nexport const RGB_PVRTC_4BPPV1_Format = 35840;\nexport const RGB_PVRTC_2BPPV1_Format = 35841;\nexport const RGBA_PVRTC_4BPPV1_Format = 35842;\nexport const RGBA_PVRTC_2BPPV1_Format = 35843;\nexport const RGB_ETC1_Format = 36196;\nexport const RGB_ETC2_Format = 37492;\nexport const RGBA_ETC2_EAC_Format = 37496;\nexport const RGBA_ASTC_4x4_Format = 37808;\nexport const RGBA_ASTC_5x4_Format = 37809;\nexport const RGBA_ASTC_5x5_Format = 37810;\nexport const RGBA_ASTC_6x5_Format = 37811;\nexport const RGBA_ASTC_6x6_Format = 37812;\nexport const RGBA_ASTC_8x5_Format = 37813;\nexport const RGBA_ASTC_8x6_Format = 37814;\nexport const RGBA_ASTC_8x8_Format = 37815;\nexport const RGBA_ASTC_10x5_Format = 37816;\nexport const RGBA_ASTC_10x6_Format = 37817;\nexport const RGBA_ASTC_10x8_Format = 37818;\nexport const RGBA_ASTC_10x10_Format = 37819;\nexport const RGBA_ASTC_12x10_Format = 37820;\nexport const RGBA_ASTC_12x12_Format = 37821;\nexport const RGBA_BPTC_Format = 36492;\nexport const LoopOnce = 2200;\nexport const LoopRepeat = 2201;\nexport const LoopPingPong = 2202;\nexport const InterpolateDiscrete = 2300;\nexport const InterpolateLinear = 2301;\nexport const InterpolateSmooth = 2302;\nexport const ZeroCurvatureEnding = 2400;\nexport const ZeroSlopeEnding = 2401;\nexport const WrapAroundEnding = 2402;\nexport const NormalAnimationBlendMode = 2500;\nexport const AdditiveAnimationBlendMode = 2501;\nexport const TrianglesDrawMode = 0;\nexport const TriangleStripDrawMode = 1;\nexport const TriangleFanDrawMode = 2;\nexport const LinearEncoding = 3000;\nexport const sRGBEncoding = 3001;\nexport const BasicDepthPacking = 3200;\nexport const RGBADepthPacking = 3201;\nexport const TangentSpaceNormalMap = 0;\nexport const ObjectSpaceNormalMap = 1;\n\nexport const ZeroStencilOp = 0;\nexport const KeepStencilOp = 7680;\nexport const ReplaceStencilOp = 7681;\nexport const IncrementStencilOp = 7682;\nexport const DecrementStencilOp = 7683;\nexport const IncrementWrapStencilOp = 34055;\nexport const DecrementWrapStencilOp = 34056;\nexport const InvertStencilOp = 5386;\n\nexport const NeverStencilFunc = 512;\nexport const LessStencilFunc = 513;\nexport const EqualStencilFunc = 514;\nexport const LessEqualStencilFunc = 515;\nexport const GreaterStencilFunc = 516;\nexport const NotEqualStencilFunc = 517;\nexport const GreaterEqualStencilFunc = 518;\nexport const AlwaysStencilFunc = 519;\n\nexport const StaticDrawUsage = 35044;\nexport const DynamicDrawUsage = 35048;\nexport const StreamDrawUsage = 35040;\nexport const StaticReadUsage = 35045;\nexport const DynamicReadUsage = 35049;\nexport const StreamReadUsage = 35041;\nexport const StaticCopyUsage = 35046;\nexport const DynamicCopyUsage = 35050;\nexport const StreamCopyUsage = 35042;\n\nexport const GLSL1 = '100';\nexport const GLSL3 = '300 es';\n\nexport const _SRGBAFormat = 1035; // fallback for WebGL 1\n","import { Vector3 } from './Vector3.js';\n\nclass Box3 {\n\n\tconstructor( min = new Vector3( + Infinity, + Infinity, + Infinity ), max = new Vector3( - Infinity, - Infinity, - Infinity ) ) {\n\n\t\tthis.min = min;\n\t\tthis.max = max;\n\n\t}\n\n\tset( min, max ) {\n\n\t\tthis.min.copy( min );\n\t\tthis.max.copy( max );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromArray( array ) {\n\n\t\tlet minX = + Infinity;\n\t\tlet minY = + Infinity;\n\t\tlet minZ = + Infinity;\n\n\t\tlet maxX = - Infinity;\n\t\tlet maxY = - Infinity;\n\t\tlet maxZ = - Infinity;\n\n\t\tfor ( let i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\tconst x = array[ i ];\n\t\t\tconst y = array[ i + 1 ];\n\t\t\tconst z = array[ i + 2 ];\n\n\t\t\tif ( x < minX ) minX = x;\n\t\t\tif ( y < minY ) minY = y;\n\t\t\tif ( z < minZ ) minZ = z;\n\n\t\t\tif ( x > maxX ) maxX = x;\n\t\t\tif ( y > maxY ) maxY = y;\n\t\t\tif ( z > maxZ ) maxZ = z;\n\n\t\t}\n\n\t\tthis.min.set( minX, minY, minZ );\n\t\tthis.max.set( maxX, maxY, maxZ );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromBufferAttribute( attribute ) {\n\n\t\tlet minX = + Infinity;\n\t\tlet minY = + Infinity;\n\t\tlet minZ = + Infinity;\n\n\t\tlet maxX = - Infinity;\n\t\tlet maxY = - Infinity;\n\t\tlet maxZ = - Infinity;\n\n\t\tfor ( let i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\tconst x = attribute.getX( i );\n\t\t\tconst y = attribute.getY( i );\n\t\t\tconst z = attribute.getZ( i );\n\n\t\t\tif ( x < minX ) minX = x;\n\t\t\tif ( y < minY ) minY = y;\n\t\t\tif ( z < minZ ) minZ = z;\n\n\t\t\tif ( x > maxX ) maxX = x;\n\t\t\tif ( y > maxY ) maxY = y;\n\t\t\tif ( z > maxZ ) maxZ = z;\n\n\t\t}\n\n\t\tthis.min.set( minX, minY, minZ );\n\t\tthis.max.set( maxX, maxY, maxZ );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPoints( points ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetFromCenterAndSize( center, size ) {\n\n\t\tconst halfSize = _vector.copy( size ).multiplyScalar( 0.5 );\n\n\t\tthis.min.copy( center ).sub( halfSize );\n\t\tthis.max.copy( center ).add( halfSize );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromObject( object, precise = false ) {\n\n\t\tthis.makeEmpty();\n\n\t\treturn this.expandByObject( object, precise );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( box ) {\n\n\t\tthis.min.copy( box.min );\n\t\tthis.max.copy( box.max );\n\n\t\treturn this;\n\n\t}\n\n\tmakeEmpty() {\n\n\t\tthis.min.x = this.min.y = this.min.z = + Infinity;\n\t\tthis.max.x = this.max.y = this.max.z = - Infinity;\n\n\t\treturn this;\n\n\t}\n\n\tisEmpty() {\n\n\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z );\n\n\t}\n\n\tgetCenter( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t}\n\n\tgetSize( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0, 0 ) : target.subVectors( this.max, this.min );\n\n\t}\n\n\texpandByPoint( point ) {\n\n\t\tthis.min.min( point );\n\t\tthis.max.max( point );\n\n\t\treturn this;\n\n\t}\n\n\texpandByVector( vector ) {\n\n\t\tthis.min.sub( vector );\n\t\tthis.max.add( vector );\n\n\t\treturn this;\n\n\t}\n\n\texpandByScalar( scalar ) {\n\n\t\tthis.min.addScalar( - scalar );\n\t\tthis.max.addScalar( scalar );\n\n\t\treturn this;\n\n\t}\n\n\texpandByObject( object, precise = false ) {\n\n\t\t// Computes the world-axis-aligned bounding box of an object (including its children),\n\t\t// accounting for both the object's, and children's, world transforms\n\n\t\tobject.updateWorldMatrix( false, false );\n\n\t\tconst geometry = object.geometry;\n\n\t\tif ( geometry !== undefined ) {\n\n\t\t\tif ( precise && geometry.attributes != undefined && geometry.attributes.position !== undefined ) {\n\n\t\t\t\tconst position = geometry.attributes.position;\n\t\t\t\tfor ( let i = 0, l = position.count; i < l; i ++ ) {\n\n\t\t\t\t\t_vector.fromBufferAttribute( position, i ).applyMatrix4( object.matrixWorld );\n\t\t\t\t\tthis.expandByPoint( _vector );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( geometry.boundingBox === null ) {\n\n\t\t\t\t\tgeometry.computeBoundingBox();\n\n\t\t\t\t}\n\n\t\t\t\t_box.copy( geometry.boundingBox );\n\t\t\t\t_box.applyMatrix4( object.matrixWorld );\n\n\t\t\t\tthis.union( _box );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tthis.expandByObject( children[ i ], precise );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\treturn point.x < this.min.x || point.x > this.max.x ||\n\t\t\tpoint.y < this.min.y || point.y > this.max.y ||\n\t\t\tpoint.z < this.min.z || point.z > this.max.z ? false : true;\n\n\t}\n\n\tcontainsBox( box ) {\n\n\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y &&\n\t\t\tthis.min.z <= box.min.z && box.max.z <= this.max.z;\n\n\t}\n\n\tgetParameter( point, target ) {\n\n\t\t// This can potentially have a divide by zero if the box\n\t\t// has a size dimension of 0.\n\n\t\treturn target.set(\n\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y ),\n\t\t\t( point.z - this.min.z ) / ( this.max.z - this.min.z )\n\t\t);\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\t// using 6 splitting planes to rule out intersections.\n\t\treturn box.max.x < this.min.x || box.min.x > this.max.x ||\n\t\t\tbox.max.y < this.min.y || box.min.y > this.max.y ||\n\t\t\tbox.max.z < this.min.z || box.min.z > this.max.z ? false : true;\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\t// Find the point on the AABB closest to the sphere center.\n\t\tthis.clampPoint( sphere.center, _vector );\n\n\t\t// If that point is inside the sphere, the AABB and sphere intersect.\n\t\treturn _vector.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t}\n\n\tintersectsPlane( plane ) {\n\n\t\t// We compute the minimum and maximum dot product values. If those values\n\t\t// are on the same side (back or front) of the plane, then there is no intersection.\n\n\t\tlet min, max;\n\n\t\tif ( plane.normal.x > 0 ) {\n\n\t\t\tmin = plane.normal.x * this.min.x;\n\t\t\tmax = plane.normal.x * this.max.x;\n\n\t\t} else {\n\n\t\t\tmin = plane.normal.x * this.max.x;\n\t\t\tmax = plane.normal.x * this.min.x;\n\n\t\t}\n\n\t\tif ( plane.normal.y > 0 ) {\n\n\t\t\tmin += plane.normal.y * this.min.y;\n\t\t\tmax += plane.normal.y * this.max.y;\n\n\t\t} else {\n\n\t\t\tmin += plane.normal.y * this.max.y;\n\t\t\tmax += plane.normal.y * this.min.y;\n\n\t\t}\n\n\t\tif ( plane.normal.z > 0 ) {\n\n\t\t\tmin += plane.normal.z * this.min.z;\n\t\t\tmax += plane.normal.z * this.max.z;\n\n\t\t} else {\n\n\t\t\tmin += plane.normal.z * this.max.z;\n\t\t\tmax += plane.normal.z * this.min.z;\n\n\t\t}\n\n\t\treturn ( min <= - plane.constant && max >= - plane.constant );\n\n\t}\n\n\tintersectsTriangle( triangle ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// compute box center and extents\n\t\tthis.getCenter( _center );\n\t\t_extents.subVectors( this.max, _center );\n\n\t\t// translate triangle to aabb origin\n\t\t_v0.subVectors( triangle.a, _center );\n\t\t_v1.subVectors( triangle.b, _center );\n\t\t_v2.subVectors( triangle.c, _center );\n\n\t\t// compute edge vectors for triangle\n\t\t_f0.subVectors( _v1, _v0 );\n\t\t_f1.subVectors( _v2, _v1 );\n\t\t_f2.subVectors( _v0, _v2 );\n\n\t\t// test against axes that are given by cross product combinations of the edges of the triangle and the edges of the aabb\n\t\t// make an axis testing of each of the 3 sides of the aabb against each of the 3 sides of the triangle = 9 axis of separation\n\t\t// axis_ij = u_i x f_j (u0, u1, u2 = face normals of aabb = x,y,z axes vectors since aabb is axis aligned)\n\t\tlet axes = [\n\t\t\t0, - _f0.z, _f0.y, 0, - _f1.z, _f1.y, 0, - _f2.z, _f2.y,\n\t\t\t_f0.z, 0, - _f0.x, _f1.z, 0, - _f1.x, _f2.z, 0, - _f2.x,\n\t\t\t- _f0.y, _f0.x, 0, - _f1.y, _f1.x, 0, - _f2.y, _f2.x, 0\n\t\t];\n\t\tif ( ! satForAxes( axes, _v0, _v1, _v2, _extents ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// test 3 face normals from the aabb\n\t\taxes = [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ];\n\t\tif ( ! satForAxes( axes, _v0, _v1, _v2, _extents ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// finally testing the face normal of the triangle\n\t\t// use already existing triangle edge vectors here\n\t\t_triangleNormal.crossVectors( _f0, _f1 );\n\t\taxes = [ _triangleNormal.x, _triangleNormal.y, _triangleNormal.z ];\n\n\t\treturn satForAxes( axes, _v0, _v1, _v2, _extents );\n\n\t}\n\n\tclampPoint( point, target ) {\n\n\t\treturn target.copy( point ).clamp( this.min, this.max );\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\tconst clampedPoint = _vector.copy( point ).clamp( this.min, this.max );\n\n\t\treturn clampedPoint.sub( point ).length();\n\n\t}\n\n\tgetBoundingSphere( target ) {\n\n\t\tthis.getCenter( target.center );\n\n\t\ttarget.radius = this.getSize( _vector ).length() * 0.5;\n\n\t\treturn target;\n\n\t}\n\n\tintersect( box ) {\n\n\t\tthis.min.max( box.min );\n\t\tthis.max.min( box.max );\n\n\t\t// ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values.\n\t\tif ( this.isEmpty() ) this.makeEmpty();\n\n\t\treturn this;\n\n\t}\n\n\tunion( box ) {\n\n\t\tthis.min.min( box.min );\n\t\tthis.max.max( box.max );\n\n\t\treturn this;\n\n\t}\n\n\tapplyMatrix4( matrix ) {\n\n\t\t// transform of empty box is an empty box.\n\t\tif ( this.isEmpty() ) return this;\n\n\t\t// NOTE: I am using a binary pattern to specify all 2^3 combinations below\n\t\t_points[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000\n\t\t_points[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001\n\t\t_points[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010\n\t\t_points[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011\n\t\t_points[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100\n\t\t_points[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101\n\t\t_points[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110\n\t\t_points[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 111\n\n\t\tthis.setFromPoints( _points );\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( offset ) {\n\n\t\tthis.min.add( offset );\n\t\tthis.max.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\tequals( box ) {\n\n\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t}\n\n}\n\nBox3.prototype.isBox3 = true;\n\nconst _points = [\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3()\n];\n\nconst _vector = /*@__PURE__*/ new Vector3();\n\nconst _box = /*@__PURE__*/ new Box3();\n\n// triangle centered vertices\n\nconst _v0 = /*@__PURE__*/ new Vector3();\nconst _v1 = /*@__PURE__*/ new Vector3();\nconst _v2 = /*@__PURE__*/ new Vector3();\n\n// triangle edge vectors\n\nconst _f0 = /*@__PURE__*/ new Vector3();\nconst _f1 = /*@__PURE__*/ new Vector3();\nconst _f2 = /*@__PURE__*/ new Vector3();\n\nconst _center = /*@__PURE__*/ new Vector3();\nconst _extents = /*@__PURE__*/ new Vector3();\nconst _triangleNormal = /*@__PURE__*/ new Vector3();\nconst _testAxis = /*@__PURE__*/ new Vector3();\n\nfunction satForAxes( axes, v0, v1, v2, extents ) {\n\n\tfor ( let i = 0, j = axes.length - 3; i <= j; i += 3 ) {\n\n\t\t_testAxis.fromArray( axes, i );\n\t\t// project the aabb onto the seperating axis\n\t\tconst r = extents.x * Math.abs( _testAxis.x ) + extents.y * Math.abs( _testAxis.y ) + extents.z * Math.abs( _testAxis.z );\n\t\t// project all 3 vertices of the triangle onto the seperating axis\n\t\tconst p0 = v0.dot( _testAxis );\n\t\tconst p1 = v1.dot( _testAxis );\n\t\tconst p2 = v2.dot( _testAxis );\n\t\t// actual test, basically see if either of the most extreme of the triangle points intersects r\n\t\tif ( Math.max( - Math.max( p0, p1, p2 ), Math.min( p0, p1, p2 ) ) > r ) {\n\n\t\t\t// points of the projected triangle are outside the projected half-length of the aabb\n\t\t\t// the axis is seperating and we can exit\n\t\t\treturn false;\n\n\t\t}\n\n\t}\n\n\treturn true;\n\n}\n\nexport { Box3 };\n","import { Box3 } from './Box3.js';\nimport { Vector3 } from './Vector3.js';\n\nconst _box = /*@__PURE__*/ new Box3();\nconst _v1 = /*@__PURE__*/ new Vector3();\nconst _toFarthestPoint = /*@__PURE__*/ new Vector3();\nconst _toPoint = /*@__PURE__*/ new Vector3();\n\nclass Sphere {\n\n\tconstructor( center = new Vector3(), radius = - 1 ) {\n\n\t\tthis.center = center;\n\t\tthis.radius = radius;\n\n\t}\n\n\tset( center, radius ) {\n\n\t\tthis.center.copy( center );\n\t\tthis.radius = radius;\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPoints( points, optionalCenter ) {\n\n\t\tconst center = this.center;\n\n\t\tif ( optionalCenter !== undefined ) {\n\n\t\t\tcenter.copy( optionalCenter );\n\n\t\t} else {\n\n\t\t\t_box.setFromPoints( points ).getCenter( center );\n\n\t\t}\n\n\t\tlet maxRadiusSq = 0;\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) );\n\n\t\t}\n\n\t\tthis.radius = Math.sqrt( maxRadiusSq );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( sphere ) {\n\n\t\tthis.center.copy( sphere.center );\n\t\tthis.radius = sphere.radius;\n\n\t\treturn this;\n\n\t}\n\n\tisEmpty() {\n\n\t\treturn ( this.radius < 0 );\n\n\t}\n\n\tmakeEmpty() {\n\n\t\tthis.center.set( 0, 0, 0 );\n\t\tthis.radius = - 1;\n\n\t\treturn this;\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\treturn ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) );\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\treturn ( point.distanceTo( this.center ) - this.radius );\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\tconst radiusSum = this.radius + sphere.radius;\n\n\t\treturn sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum );\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsSphere( this );\n\n\t}\n\n\tintersectsPlane( plane ) {\n\n\t\treturn Math.abs( plane.distanceToPoint( this.center ) ) <= this.radius;\n\n\t}\n\n\tclampPoint( point, target ) {\n\n\t\tconst deltaLengthSq = this.center.distanceToSquared( point );\n\n\t\ttarget.copy( point );\n\n\t\tif ( deltaLengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\ttarget.sub( this.center ).normalize();\n\t\t\ttarget.multiplyScalar( this.radius ).add( this.center );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\tgetBoundingBox( target ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\t// Empty sphere produces empty bounding box\n\t\t\ttarget.makeEmpty();\n\t\t\treturn target;\n\n\t\t}\n\n\t\ttarget.set( this.center, this.center );\n\t\ttarget.expandByScalar( this.radius );\n\n\t\treturn target;\n\n\t}\n\n\tapplyMatrix4( matrix ) {\n\n\t\tthis.center.applyMatrix4( matrix );\n\t\tthis.radius = this.radius * matrix.getMaxScaleOnAxis();\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( offset ) {\n\n\t\tthis.center.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\texpandByPoint( point ) {\n\n\t\t// from https://github.com/juj/MathGeoLib/blob/2940b99b99cfe575dd45103ef20f4019dee15b54/src/Geometry/Sphere.cpp#L649-L671\n\n\t\t_toPoint.subVectors( point, this.center );\n\n\t\tconst lengthSq = _toPoint.lengthSq();\n\n\t\tif ( lengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\tconst length = Math.sqrt( lengthSq );\n\t\t\tconst missingRadiusHalf = ( length - this.radius ) * 0.5;\n\n\t\t\t// Nudge this sphere towards the target point. Add half the missing distance to radius,\n\t\t\t// and the other half to position. This gives a tighter enclosure, instead of if\n\t\t\t// the whole missing distance were just added to radius.\n\n\t\t\tthis.center.add( _toPoint.multiplyScalar( missingRadiusHalf / length ) );\n\t\t\tthis.radius += missingRadiusHalf;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tunion( sphere ) {\n\n\t\t// from https://github.com/juj/MathGeoLib/blob/2940b99b99cfe575dd45103ef20f4019dee15b54/src/Geometry/Sphere.cpp#L759-L769\n\n\t\t// To enclose another sphere into this sphere, we only need to enclose two points:\n\t\t// 1) Enclose the farthest point on the other sphere into this sphere.\n\t\t// 2) Enclose the opposite point of the farthest point into this sphere.\n\n\t\t if ( this.center.equals( sphere.center ) === true ) {\n\n\t\t\t _toFarthestPoint.set( 0, 0, 1 ).multiplyScalar( sphere.radius );\n\n\n\t\t} else {\n\n\t\t\t_toFarthestPoint.subVectors( sphere.center, this.center ).normalize().multiplyScalar( sphere.radius );\n\n\t\t}\n\n\t\tthis.expandByPoint( _v1.copy( sphere.center ).add( _toFarthestPoint ) );\n\t\tthis.expandByPoint( _v1.copy( sphere.center ).sub( _toFarthestPoint ) );\n\n\t\treturn this;\n\n\t}\n\n\tequals( sphere ) {\n\n\t\treturn sphere.center.equals( this.center ) && ( sphere.radius === this.radius );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nexport { Sphere };\n","import { Matrix3 } from './Matrix3.js';\nimport { Vector3 } from './Vector3.js';\n\nconst _vector1 = /*@__PURE__*/ new Vector3();\nconst _vector2 = /*@__PURE__*/ new Vector3();\nconst _normalMatrix = /*@__PURE__*/ new Matrix3();\n\nclass Plane {\n\n\tconstructor( normal = new Vector3( 1, 0, 0 ), constant = 0 ) {\n\n\t\t// normal is assumed to be normalized\n\n\t\tthis.normal = normal;\n\t\tthis.constant = constant;\n\n\t}\n\n\tset( normal, constant ) {\n\n\t\tthis.normal.copy( normal );\n\t\tthis.constant = constant;\n\n\t\treturn this;\n\n\t}\n\n\tsetComponents( x, y, z, w ) {\n\n\t\tthis.normal.set( x, y, z );\n\t\tthis.constant = w;\n\n\t\treturn this;\n\n\t}\n\n\tsetFromNormalAndCoplanarPoint( normal, point ) {\n\n\t\tthis.normal.copy( normal );\n\t\tthis.constant = - point.dot( this.normal );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromCoplanarPoints( a, b, c ) {\n\n\t\tconst normal = _vector1.subVectors( c, b ).cross( _vector2.subVectors( a, b ) ).normalize();\n\n\t\t// Q: should an error be thrown if normal is zero (e.g. degenerate plane)?\n\n\t\tthis.setFromNormalAndCoplanarPoint( normal, a );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( plane ) {\n\n\t\tthis.normal.copy( plane.normal );\n\t\tthis.constant = plane.constant;\n\n\t\treturn this;\n\n\t}\n\n\tnormalize() {\n\n\t\t// Note: will lead to a divide by zero if the plane is invalid.\n\n\t\tconst inverseNormalLength = 1.0 / this.normal.length();\n\t\tthis.normal.multiplyScalar( inverseNormalLength );\n\t\tthis.constant *= inverseNormalLength;\n\n\t\treturn this;\n\n\t}\n\n\tnegate() {\n\n\t\tthis.constant *= - 1;\n\t\tthis.normal.negate();\n\n\t\treturn this;\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\treturn this.normal.dot( point ) + this.constant;\n\n\t}\n\n\tdistanceToSphere( sphere ) {\n\n\t\treturn this.distanceToPoint( sphere.center ) - sphere.radius;\n\n\t}\n\n\tprojectPoint( point, target ) {\n\n\t\treturn target.copy( this.normal ).multiplyScalar( - this.distanceToPoint( point ) ).add( point );\n\n\t}\n\n\tintersectLine( line, target ) {\n\n\t\tconst direction = line.delta( _vector1 );\n\n\t\tconst denominator = this.normal.dot( direction );\n\n\t\tif ( denominator === 0 ) {\n\n\t\t\t// line is coplanar, return origin\n\t\t\tif ( this.distanceToPoint( line.start ) === 0 ) {\n\n\t\t\t\treturn target.copy( line.start );\n\n\t\t\t}\n\n\t\t\t// Unsure if this is the correct method to handle this case.\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst t = - ( line.start.dot( this.normal ) + this.constant ) / denominator;\n\n\t\tif ( t < 0 || t > 1 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\treturn target.copy( direction ).multiplyScalar( t ).add( line.start );\n\n\t}\n\n\tintersectsLine( line ) {\n\n\t\t// Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it.\n\n\t\tconst startSign = this.distanceToPoint( line.start );\n\t\tconst endSign = this.distanceToPoint( line.end );\n\n\t\treturn ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 );\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsPlane( this );\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\treturn sphere.intersectsPlane( this );\n\n\t}\n\n\tcoplanarPoint( target ) {\n\n\t\treturn target.copy( this.normal ).multiplyScalar( - this.constant );\n\n\t}\n\n\tapplyMatrix4( matrix, optionalNormalMatrix ) {\n\n\t\tconst normalMatrix = optionalNormalMatrix || _normalMatrix.getNormalMatrix( matrix );\n\n\t\tconst referencePoint = this.coplanarPoint( _vector1 ).applyMatrix4( matrix );\n\n\t\tconst normal = this.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\tthis.constant = - referencePoint.dot( normal );\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( offset ) {\n\n\t\tthis.constant -= offset.dot( this.normal );\n\n\t\treturn this;\n\n\t}\n\n\tequals( plane ) {\n\n\t\treturn plane.normal.equals( this.normal ) && ( plane.constant === this.constant );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nPlane.prototype.isPlane = true;\n\nexport { Plane };\n","import { Vector3 } from './Vector3.js';\nimport { Sphere } from './Sphere.js';\nimport { Plane } from './Plane.js';\n\nconst _sphere = /*@__PURE__*/ new Sphere();\nconst _vector = /*@__PURE__*/ new Vector3();\n\nclass Frustum {\n\n\tconstructor( p0 = new Plane(), p1 = new Plane(), p2 = new Plane(), p3 = new Plane(), p4 = new Plane(), p5 = new Plane() ) {\n\n\t\tthis.planes = [ p0, p1, p2, p3, p4, p5 ];\n\n\t}\n\n\tset( p0, p1, p2, p3, p4, p5 ) {\n\n\t\tconst planes = this.planes;\n\n\t\tplanes[ 0 ].copy( p0 );\n\t\tplanes[ 1 ].copy( p1 );\n\t\tplanes[ 2 ].copy( p2 );\n\t\tplanes[ 3 ].copy( p3 );\n\t\tplanes[ 4 ].copy( p4 );\n\t\tplanes[ 5 ].copy( p5 );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( frustum ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tplanes[ i ].copy( frustum.planes[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetFromProjectionMatrix( m ) {\n\n\t\tconst planes = this.planes;\n\t\tconst me = m.elements;\n\t\tconst me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ];\n\t\tconst me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ];\n\t\tconst me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ];\n\t\tconst me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ];\n\n\t\tplanes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize();\n\t\tplanes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();\n\t\tplanes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();\n\t\tplanes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();\n\t\tplanes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize();\n\t\tplanes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize();\n\n\t\treturn this;\n\n\t}\n\n\tintersectsObject( object ) {\n\n\t\tconst geometry = object.geometry;\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere.copy( geometry.boundingSphere ).applyMatrix4( object.matrixWorld );\n\n\t\treturn this.intersectsSphere( _sphere );\n\n\t}\n\n\tintersectsSprite( sprite ) {\n\n\t\t_sphere.center.set( 0, 0, 0 );\n\t\t_sphere.radius = 0.7071067811865476;\n\t\t_sphere.applyMatrix4( sprite.matrixWorld );\n\n\t\treturn this.intersectsSphere( _sphere );\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\tconst planes = this.planes;\n\t\tconst center = sphere.center;\n\t\tconst negRadius = - sphere.radius;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst distance = planes[ i ].distanceToPoint( center );\n\n\t\t\tif ( distance < negRadius ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst plane = planes[ i ];\n\n\t\t\t// corner at max distance\n\n\t\t\t_vector.x = plane.normal.x > 0 ? box.max.x : box.min.x;\n\t\t\t_vector.y = plane.normal.y > 0 ? box.max.y : box.min.y;\n\t\t\t_vector.z = plane.normal.z > 0 ? box.max.z : box.min.z;\n\n\t\t\tif ( plane.distanceToPoint( _vector ) < 0 ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tif ( planes[ i ].distanceToPoint( point ) < 0 ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\n\nexport { Frustum };\n","class Vector4 {\n\n\tconstructor( x = 0, y = 0, z = 0, w = 1 ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\tthis.w = w;\n\n\t}\n\n\tget width() {\n\n\t\treturn this.z;\n\n\t}\n\n\tset width( value ) {\n\n\t\tthis.z = value;\n\n\t}\n\n\tget height() {\n\n\t\treturn this.w;\n\n\t}\n\n\tset height( value ) {\n\n\t\tthis.w = value;\n\n\t}\n\n\tset( x, y, z, w ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\tthis.w = w;\n\n\t\treturn this;\n\n\t}\n\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\t\tthis.w = scalar;\n\n\t\treturn this;\n\n\t}\n\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetZ( z ) {\n\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetW( w ) {\n\n\t\tthis.w = w;\n\n\t\treturn this;\n\n\t}\n\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tcase 2: this.z = value; break;\n\t\t\tcase 3: this.w = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tcase 2: return this.z;\n\t\t\tcase 3: return this.w;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y, this.z, this.w );\n\n\t}\n\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\t\tthis.w = ( v.w !== undefined ) ? v.w : 1;\n\n\t\treturn this;\n\n\t}\n\n\tadd( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\treturn this.addVectors( v, w );\n\n\t\t}\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\t\tthis.w += v.w;\n\n\t\treturn this;\n\n\t}\n\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\t\tthis.w += s;\n\n\t\treturn this;\n\n\t}\n\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\t\tthis.w = a.w + b.w;\n\n\t\treturn this;\n\n\t}\n\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\t\tthis.w += v.w * s;\n\n\t\treturn this;\n\n\t}\n\n\tsub( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\treturn this.subVectors( v, w );\n\n\t\t}\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\t\tthis.w -= v.w;\n\n\t\treturn this;\n\n\t}\n\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\t\tthis.z -= s;\n\t\tthis.w -= s;\n\n\t\treturn this;\n\n\t}\n\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\t\tthis.w = a.w - b.w;\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\t\tthis.z *= v.z;\n\t\tthis.w *= v.w;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\t\tthis.w *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\tapplyMatrix4( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z, w = this.w;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w;\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w;\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w;\n\t\tthis.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w;\n\n\t\treturn this;\n\n\t}\n\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\tsetAxisAngleFromQuaternion( q ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\n\n\t\t// q is assumed to be normalized\n\n\t\tthis.w = 2 * Math.acos( q.w );\n\n\t\tconst s = Math.sqrt( 1 - q.w * q.w );\n\n\t\tif ( s < 0.0001 ) {\n\n\t\t\tthis.x = 1;\n\t\t\tthis.y = 0;\n\t\t\tthis.z = 0;\n\n\t\t} else {\n\n\t\t\tthis.x = q.x / s;\n\t\t\tthis.y = q.y / s;\n\t\t\tthis.z = q.z / s;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetAxisAngleFromRotationMatrix( m ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tlet angle, x, y, z; // variables for result\n\t\tconst epsilon = 0.01,\t\t// margin to allow for rounding errors\n\t\t\tepsilon2 = 0.1,\t\t// margin to distinguish between 0 and 180 degrees\n\n\t\t\tte = m.elements,\n\n\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\tif ( ( Math.abs( m12 - m21 ) < epsilon ) &&\n\t\t     ( Math.abs( m13 - m31 ) < epsilon ) &&\n\t\t     ( Math.abs( m23 - m32 ) < epsilon ) ) {\n\n\t\t\t// singularity found\n\t\t\t// first check for identity matrix which must have +1 for all terms\n\t\t\t// in leading diagonal and zero in other terms\n\n\t\t\tif ( ( Math.abs( m12 + m21 ) < epsilon2 ) &&\n\t\t\t     ( Math.abs( m13 + m31 ) < epsilon2 ) &&\n\t\t\t     ( Math.abs( m23 + m32 ) < epsilon2 ) &&\n\t\t\t     ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) {\n\n\t\t\t\t// this singularity is identity matrix so angle = 0\n\n\t\t\t\tthis.set( 1, 0, 0, 0 );\n\n\t\t\t\treturn this; // zero angle, arbitrary axis\n\n\t\t\t}\n\n\t\t\t// otherwise this singularity is angle = 180\n\n\t\t\tangle = Math.PI;\n\n\t\t\tconst xx = ( m11 + 1 ) / 2;\n\t\t\tconst yy = ( m22 + 1 ) / 2;\n\t\t\tconst zz = ( m33 + 1 ) / 2;\n\t\t\tconst xy = ( m12 + m21 ) / 4;\n\t\t\tconst xz = ( m13 + m31 ) / 4;\n\t\t\tconst yz = ( m23 + m32 ) / 4;\n\n\t\t\tif ( ( xx > yy ) && ( xx > zz ) ) {\n\n\t\t\t\t// m11 is the largest diagonal term\n\n\t\t\t\tif ( xx < epsilon ) {\n\n\t\t\t\t\tx = 0;\n\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tx = Math.sqrt( xx );\n\t\t\t\t\ty = xy / x;\n\t\t\t\t\tz = xz / x;\n\n\t\t\t\t}\n\n\t\t\t} else if ( yy > zz ) {\n\n\t\t\t\t// m22 is the largest diagonal term\n\n\t\t\t\tif ( yy < epsilon ) {\n\n\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\ty = 0;\n\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t} else {\n\n\t\t\t\t\ty = Math.sqrt( yy );\n\t\t\t\t\tx = xy / y;\n\t\t\t\t\tz = yz / y;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// m33 is the largest diagonal term so base result on this\n\n\t\t\t\tif ( zz < epsilon ) {\n\n\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\tz = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tz = Math.sqrt( zz );\n\t\t\t\t\tx = xz / z;\n\t\t\t\t\ty = yz / z;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.set( x, y, z, angle );\n\n\t\t\treturn this; // return 180 deg rotation\n\n\t\t}\n\n\t\t// as we have reached here there are no singularities so we can handle normally\n\n\t\tlet s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) +\n\t\t\t( m13 - m31 ) * ( m13 - m31 ) +\n\t\t\t( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize\n\n\t\tif ( Math.abs( s ) < 0.001 ) s = 1;\n\n\t\t// prevent divide by zero, should not happen if matrix is orthogonal and should be\n\t\t// caught by singularity test above, but I've left it in just in case\n\n\t\tthis.x = ( m32 - m23 ) / s;\n\t\tthis.y = ( m13 - m31 ) / s;\n\t\tthis.z = ( m21 - m12 ) / s;\n\t\tthis.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 );\n\n\t\treturn this;\n\n\t}\n\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\t\tthis.z = Math.min( this.z, v.z );\n\t\tthis.w = Math.min( this.w, v.w );\n\n\t\treturn this;\n\n\t}\n\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\t\tthis.z = Math.max( this.z, v.z );\n\t\tthis.w = Math.max( this.w, v.w );\n\n\t\treturn this;\n\n\t}\n\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\t\tthis.w = Math.max( min.w, Math.min( max.w, this.w ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = Math.max( minVal, Math.min( maxVal, this.x ) );\n\t\tthis.y = Math.max( minVal, Math.min( maxVal, this.y ) );\n\t\tthis.z = Math.max( minVal, Math.min( maxVal, this.z ) );\n\t\tthis.w = Math.max( minVal, Math.min( maxVal, this.w ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );\n\n\t}\n\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\t\tthis.z = Math.floor( this.z );\n\t\tthis.w = Math.floor( this.w );\n\n\t\treturn this;\n\n\t}\n\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\t\tthis.z = Math.ceil( this.z );\n\t\tthis.w = Math.ceil( this.w );\n\n\t\treturn this;\n\n\t}\n\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\t\tthis.z = Math.round( this.z );\n\t\tthis.w = Math.round( this.w );\n\n\t\treturn this;\n\n\t}\n\n\troundToZero() {\n\n\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\t\tthis.w = ( this.w < 0 ) ? Math.ceil( this.w ) : Math.floor( this.w );\n\n\t\treturn this;\n\n\t}\n\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\t\tthis.z = - this.z;\n\t\tthis.w = - this.w;\n\n\t\treturn this;\n\n\t}\n\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n\n\t}\n\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\n\n\t}\n\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );\n\n\t}\n\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w );\n\n\t}\n\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\tthis.z += ( v.z - this.z ) * alpha;\n\t\tthis.w += ( v.w - this.w ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\t\tthis.z = v1.z + ( v2.z - v1.z ) * alpha;\n\t\tthis.w = v1.w + ( v2.w - v1.w ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\t\tthis.z = array[ offset + 2 ];\n\t\tthis.w = array[ offset + 3 ];\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\t\tarray[ offset + 2 ] = this.z;\n\t\tarray[ offset + 3 ] = this.w;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index, offset ) {\n\n\t\tif ( offset !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector4: offset has been removed from .fromBufferAttribute().' );\n\n\t\t}\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\t\tthis.z = attribute.getZ( index );\n\t\tthis.w = attribute.getW( index );\n\n\t\treturn this;\n\n\t}\n\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\t\tthis.z = Math.random();\n\t\tthis.w = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\t\tyield this.z;\n\t\tyield this.w;\n\n\t}\n\n}\n\nVector4.prototype.isVector4 = true;\n\nexport { Vector4 };\n","function WebGLAnimation() {\n\n\tlet context = null;\n\tlet isAnimating = false;\n\tlet animationLoop = null;\n\tlet requestId = null;\n\n\tfunction onAnimationFrame( time, frame ) {\n\n\t\tanimationLoop( time, frame );\n\n\t\trequestId = context.requestAnimationFrame( onAnimationFrame );\n\n\t}\n\n\treturn {\n\n\t\tstart: function () {\n\n\t\t\tif ( isAnimating === true ) return;\n\t\t\tif ( animationLoop === null ) return;\n\n\t\t\trequestId = context.requestAnimationFrame( onAnimationFrame );\n\n\t\t\tisAnimating = true;\n\n\t\t},\n\n\t\tstop: function () {\n\n\t\t\tcontext.cancelAnimationFrame( requestId );\n\n\t\t\tisAnimating = false;\n\n\t\t},\n\n\t\tsetAnimationLoop: function ( callback ) {\n\n\t\t\tanimationLoop = callback;\n\n\t\t},\n\n\t\tsetContext: function ( value ) {\n\n\t\t\tcontext = value;\n\n\t\t}\n\n\t};\n\n}\n\nexport { WebGLAnimation };\n","function WebGLAttributes( gl, capabilities ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\n\tconst buffers = new WeakMap();\n\n\tfunction createBuffer( attribute, bufferType ) {\n\n\t\tconst array = attribute.array;\n\t\tconst usage = attribute.usage;\n\n\t\tconst buffer = gl.createBuffer();\n\n\t\tgl.bindBuffer( bufferType, buffer );\n\t\tgl.bufferData( bufferType, array, usage );\n\n\t\tattribute.onUploadCallback();\n\n\t\tlet type = gl.FLOAT;\n\n\t\tif ( array instanceof Float32Array ) {\n\n\t\t\ttype = gl.FLOAT;\n\n\t\t} else if ( array instanceof Float64Array ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLAttributes: Unsupported data buffer format: Float64Array.' );\n\n\t\t} else if ( array instanceof Uint16Array ) {\n\n\t\t\tif ( attribute.isFloat16BufferAttribute ) {\n\n\t\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\t\ttype = gl.HALF_FLOAT;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLAttributes: Usage of Float16BufferAttribute requires WebGL2.' );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\ttype = gl.UNSIGNED_SHORT;\n\n\t\t\t}\n\n\t\t} else if ( array instanceof Int16Array ) {\n\n\t\t\ttype = gl.SHORT;\n\n\t\t} else if ( array instanceof Uint32Array ) {\n\n\t\t\ttype = gl.UNSIGNED_INT;\n\n\t\t} else if ( array instanceof Int32Array ) {\n\n\t\t\ttype = gl.INT;\n\n\t\t} else if ( array instanceof Int8Array ) {\n\n\t\t\ttype = gl.BYTE;\n\n\t\t} else if ( array instanceof Uint8Array ) {\n\n\t\t\ttype = gl.UNSIGNED_BYTE;\n\n\t\t} else if ( array instanceof Uint8ClampedArray ) {\n\n\t\t\ttype = gl.UNSIGNED_BYTE;\n\n\t\t}\n\n\t\treturn {\n\t\t\tbuffer: buffer,\n\t\t\ttype: type,\n\t\t\tbytesPerElement: array.BYTES_PER_ELEMENT,\n\t\t\tversion: attribute.version\n\t\t};\n\n\t}\n\n\tfunction updateBuffer( buffer, attribute, bufferType ) {\n\n\t\tconst array = attribute.array;\n\t\tconst updateRange = attribute.updateRange;\n\n\t\tgl.bindBuffer( bufferType, buffer );\n\n\t\tif ( updateRange.count === - 1 ) {\n\n\t\t\t// Not using update ranges\n\n\t\t\tgl.bufferSubData( bufferType, 0, array );\n\n\t\t} else {\n\n\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\tgl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT,\n\t\t\t\t\tarray, updateRange.offset, updateRange.count );\n\n\t\t\t} else {\n\n\t\t\t\tgl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT,\n\t\t\t\t\tarray.subarray( updateRange.offset, updateRange.offset + updateRange.count ) );\n\n\t\t\t}\n\n\t\t\tupdateRange.count = - 1; // reset range\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction get( attribute ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\treturn buffers.get( attribute );\n\n\t}\n\n\tfunction remove( attribute ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\tconst data = buffers.get( attribute );\n\n\t\tif ( data ) {\n\n\t\t\tgl.deleteBuffer( data.buffer );\n\n\t\t\tbuffers.delete( attribute );\n\n\t\t}\n\n\t}\n\n\tfunction update( attribute, bufferType ) {\n\n\t\tif ( attribute.isGLBufferAttribute ) {\n\n\t\t\tconst cached = buffers.get( attribute );\n\n\t\t\tif ( ! cached || cached.version < attribute.version ) {\n\n\t\t\t\tbuffers.set( attribute, {\n\t\t\t\t\tbuffer: attribute.buffer,\n\t\t\t\t\ttype: attribute.type,\n\t\t\t\t\tbytesPerElement: attribute.elementSize,\n\t\t\t\t\tversion: attribute.version\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\tconst data = buffers.get( attribute );\n\n\t\tif ( data === undefined ) {\n\n\t\t\tbuffers.set( attribute, createBuffer( attribute, bufferType ) );\n\n\t\t} else if ( data.version < attribute.version ) {\n\n\t\t\tupdateBuffer( data.buffer, attribute, bufferType );\n\n\t\t\tdata.version = attribute.version;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\tget: get,\n\t\tremove: remove,\n\t\tupdate: update\n\n\t};\n\n}\n\n\nexport { WebGLAttributes };\n","class Vector2 {\n\n\tconstructor( x = 0, y = 0 ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\n\t}\n\n\tget width() {\n\n\t\treturn this.x;\n\n\t}\n\n\tset width( value ) {\n\n\t\tthis.x = value;\n\n\t}\n\n\tget height() {\n\n\t\treturn this.y;\n\n\t}\n\n\tset height( value ) {\n\n\t\tthis.y = value;\n\n\t}\n\n\tset( x, y ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\n\t\treturn this;\n\n\t}\n\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y );\n\n\t}\n\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\n\t\treturn this;\n\n\t}\n\n\tadd( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\treturn this.addVectors( v, w );\n\n\t\t}\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\n\t\treturn this;\n\n\t}\n\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\n\t\treturn this;\n\n\t}\n\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\n\t\treturn this;\n\n\t}\n\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\n\t\treturn this;\n\n\t}\n\n\tsub( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\treturn this.subVectors( v, w );\n\n\t\t}\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\n\t\treturn this;\n\n\t}\n\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\n\t\treturn this;\n\n\t}\n\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\tdivide( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\n\t\treturn this;\n\n\t}\n\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\tapplyMatrix3( m ) {\n\n\t\tconst x = this.x, y = this.y;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ];\n\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ];\n\n\t\treturn this;\n\n\t}\n\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\n\t\treturn this;\n\n\t}\n\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\n\t\treturn this;\n\n\t}\n\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = Math.max( minVal, Math.min( maxVal, this.x ) );\n\t\tthis.y = Math.max( minVal, Math.min( maxVal, this.y ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );\n\n\t}\n\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\n\t\treturn this;\n\n\t}\n\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\n\t\treturn this;\n\n\t}\n\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\n\t\treturn this;\n\n\t}\n\n\troundToZero() {\n\n\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\n\t\treturn this;\n\n\t}\n\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\n\t\treturn this;\n\n\t}\n\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y;\n\n\t}\n\n\tcross( v ) {\n\n\t\treturn this.x * v.y - this.y * v.x;\n\n\t}\n\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y;\n\n\t}\n\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y );\n\n\t}\n\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y );\n\n\t}\n\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\tangle() {\n\n\t\t// computes the angle in radians with respect to the positive x-axis\n\n\t\tconst angle = Math.atan2( - this.y, - this.x ) + Math.PI;\n\n\t\treturn angle;\n\n\t}\n\n\tdistanceTo( v ) {\n\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t}\n\n\tdistanceToSquared( v ) {\n\n\t\tconst dx = this.x - v.x, dy = this.y - v.y;\n\t\treturn dx * dx + dy * dy;\n\n\t}\n\n\tmanhattanDistanceTo( v ) {\n\n\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y );\n\n\t}\n\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index, offset ) {\n\n\t\tif ( offset !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector2: offset has been removed from .fromBufferAttribute().' );\n\n\t\t}\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\n\t\treturn this;\n\n\t}\n\n\trotateAround( center, angle ) {\n\n\t\tconst c = Math.cos( angle ), s = Math.sin( angle );\n\n\t\tconst x = this.x - center.x;\n\t\tconst y = this.y - center.y;\n\n\t\tthis.x = x * c - y * s + center.x;\n\t\tthis.y = x * s + y * c + center.y;\n\n\t\treturn this;\n\n\t}\n\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\n\t}\n\n}\n\nVector2.prototype.isVector2 = true;\n\nexport { Vector2 };\n","import * as MathUtils from './MathUtils.js';\n\nconst _colorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF,\n\t'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2,\n\t'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50,\n\t'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B,\n\t'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B,\n\t'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F,\n\t'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3,\n\t'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222,\n\t'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700,\n\t'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4,\n\t'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00,\n\t'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3,\n\t'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA,\n\t'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32,\n\t'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3,\n\t'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC,\n\t'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD,\n\t'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6,\n\t'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9,\n\t'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'rebeccapurple': 0x663399, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F,\n\t'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE,\n\t'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA,\n\t'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0,\n\t'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 };\n\nconst _hslA = { h: 0, s: 0, l: 0 };\nconst _hslB = { h: 0, s: 0, l: 0 };\n\nfunction hue2rgb( p, q, t ) {\n\n\tif ( t < 0 ) t += 1;\n\tif ( t > 1 ) t -= 1;\n\tif ( t < 1 / 6 ) return p + ( q - p ) * 6 * t;\n\tif ( t < 1 / 2 ) return q;\n\tif ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t );\n\treturn p;\n\n}\n\nfunction SRGBToLinear( c ) {\n\n\treturn ( c < 0.04045 ) ? c * 0.0773993808 : Math.pow( c * 0.9478672986 + 0.0521327014, 2.4 );\n\n}\n\nfunction LinearToSRGB( c ) {\n\n\treturn ( c < 0.0031308 ) ? c * 12.92 : 1.055 * ( Math.pow( c, 0.41666 ) ) - 0.055;\n\n}\n\nclass Color {\n\n\tconstructor( r, g, b ) {\n\n\t\tif ( g === undefined && b === undefined ) {\n\n\t\t\t// r is THREE.Color, hex or string\n\t\t\treturn this.set( r );\n\n\t\t}\n\n\t\treturn this.setRGB( r, g, b );\n\n\t}\n\n\tset( value ) {\n\n\t\tif ( value && value.isColor ) {\n\n\t\t\tthis.copy( value );\n\n\t\t} else if ( typeof value === 'number' ) {\n\n\t\t\tthis.setHex( value );\n\n\t\t} else if ( typeof value === 'string' ) {\n\n\t\t\tthis.setStyle( value );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetScalar( scalar ) {\n\n\t\tthis.r = scalar;\n\t\tthis.g = scalar;\n\t\tthis.b = scalar;\n\n\t\treturn this;\n\n\t}\n\n\tsetHex( hex ) {\n\n\t\thex = Math.floor( hex );\n\n\t\tthis.r = ( hex >> 16 & 255 ) / 255;\n\t\tthis.g = ( hex >> 8 & 255 ) / 255;\n\t\tthis.b = ( hex & 255 ) / 255;\n\n\t\treturn this;\n\n\t}\n\n\tsetRGB( r, g, b ) {\n\n\t\tthis.r = r;\n\t\tthis.g = g;\n\t\tthis.b = b;\n\n\t\treturn this;\n\n\t}\n\n\tsetHSL( h, s, l ) {\n\n\t\t// h,s,l ranges are in 0.0 - 1.0\n\t\th = MathUtils.euclideanModulo( h, 1 );\n\t\ts = MathUtils.clamp( s, 0, 1 );\n\t\tl = MathUtils.clamp( l, 0, 1 );\n\n\t\tif ( s === 0 ) {\n\n\t\t\tthis.r = this.g = this.b = l;\n\n\t\t} else {\n\n\t\t\tconst p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s );\n\t\t\tconst q = ( 2 * l ) - p;\n\n\t\t\tthis.r = hue2rgb( q, p, h + 1 / 3 );\n\t\t\tthis.g = hue2rgb( q, p, h );\n\t\t\tthis.b = hue2rgb( q, p, h - 1 / 3 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetStyle( style ) {\n\n\t\tfunction handleAlpha( string ) {\n\n\t\t\tif ( string === undefined ) return;\n\n\t\t\tif ( parseFloat( string ) < 1 ) {\n\n\t\t\t\tconsole.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' );\n\n\t\t\t}\n\n\t\t}\n\n\n\t\tlet m;\n\n\t\tif ( m = /^((?:rgb|hsl)a?)\\(([^\\)]*)\\)/.exec( style ) ) {\n\n\t\t\t// rgb / hsl\n\n\t\t\tlet color;\n\t\t\tconst name = m[ 1 ];\n\t\t\tconst components = m[ 2 ];\n\n\t\t\tswitch ( name ) {\n\n\t\t\t\tcase 'rgb':\n\t\t\t\tcase 'rgba':\n\n\t\t\t\t\tif ( color = /^\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// rgb(255,0,0) rgba(255,0,0,0.5)\n\t\t\t\t\t\tthis.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255;\n\t\t\t\t\t\tthis.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255;\n\t\t\t\t\t\tthis.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255;\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( color = /^\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// rgb(100%,0%,0%) rgba(100%,0%,0%,0.5)\n\t\t\t\t\t\tthis.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100;\n\t\t\t\t\t\tthis.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100;\n\t\t\t\t\t\tthis.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100;\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'hsl':\n\t\t\t\tcase 'hsla':\n\n\t\t\t\t\tif ( color = /^\\s*(\\d*\\.?\\d+)\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// hsl(120,50%,50%) hsla(120,50%,50%,0.5)\n\t\t\t\t\t\tconst h = parseFloat( color[ 1 ] ) / 360;\n\t\t\t\t\t\tconst s = parseInt( color[ 2 ], 10 ) / 100;\n\t\t\t\t\t\tconst l = parseInt( color[ 3 ], 10 ) / 100;\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this.setHSL( h, s, l );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t} else if ( m = /^\\#([A-Fa-f\\d]+)$/.exec( style ) ) {\n\n\t\t\t// hex color\n\n\t\t\tconst hex = m[ 1 ];\n\t\t\tconst size = hex.length;\n\n\t\t\tif ( size === 3 ) {\n\n\t\t\t\t// #ff0\n\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 0 ), 16 ) / 255;\n\t\t\t\tthis.g = parseInt( hex.charAt( 1 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\tthis.b = parseInt( hex.charAt( 2 ) + hex.charAt( 2 ), 16 ) / 255;\n\n\t\t\t\treturn this;\n\n\t\t\t} else if ( size === 6 ) {\n\n\t\t\t\t// #ff0000\n\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\tthis.g = parseInt( hex.charAt( 2 ) + hex.charAt( 3 ), 16 ) / 255;\n\t\t\t\tthis.b = parseInt( hex.charAt( 4 ) + hex.charAt( 5 ), 16 ) / 255;\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( style && style.length > 0 ) {\n\n\t\t\treturn this.setColorName( style );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetColorName( style ) {\n\n\t\t// color keywords\n\t\tconst hex = _colorKeywords[ style.toLowerCase() ];\n\n\t\tif ( hex !== undefined ) {\n\n\t\t\t// red\n\t\t\tthis.setHex( hex );\n\n\t\t} else {\n\n\t\t\t// unknown color\n\t\t\tconsole.warn( 'THREE.Color: Unknown color ' + style );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.r, this.g, this.b );\n\n\t}\n\n\tcopy( color ) {\n\n\t\tthis.r = color.r;\n\t\tthis.g = color.g;\n\t\tthis.b = color.b;\n\n\t\treturn this;\n\n\t}\n\n\tcopySRGBToLinear( color ) {\n\n\t\tthis.r = SRGBToLinear( color.r );\n\t\tthis.g = SRGBToLinear( color.g );\n\t\tthis.b = SRGBToLinear( color.b );\n\n\t\treturn this;\n\n\t}\n\n\tcopyLinearToSRGB( color ) {\n\n\t\tthis.r = LinearToSRGB( color.r );\n\t\tthis.g = LinearToSRGB( color.g );\n\t\tthis.b = LinearToSRGB( color.b );\n\n\t\treturn this;\n\n\t}\n\n\tconvertSRGBToLinear() {\n\n\t\tthis.copySRGBToLinear( this );\n\n\t\treturn this;\n\n\t}\n\n\tconvertLinearToSRGB() {\n\n\t\tthis.copyLinearToSRGB( this );\n\n\t\treturn this;\n\n\t}\n\n\tgetHex() {\n\n\t\treturn ( this.r * 255 ) << 16 ^ ( this.g * 255 ) << 8 ^ ( this.b * 255 ) << 0;\n\n\t}\n\n\tgetHexString() {\n\n\t\treturn ( '000000' + this.getHex().toString( 16 ) ).slice( - 6 );\n\n\t}\n\n\tgetHSL( target ) {\n\n\t\t// h,s,l ranges are in 0.0 - 1.0\n\n\t\tconst r = this.r, g = this.g, b = this.b;\n\n\t\tconst max = Math.max( r, g, b );\n\t\tconst min = Math.min( r, g, b );\n\n\t\tlet hue, saturation;\n\t\tconst lightness = ( min + max ) / 2.0;\n\n\t\tif ( min === max ) {\n\n\t\t\thue = 0;\n\t\t\tsaturation = 0;\n\n\t\t} else {\n\n\t\t\tconst delta = max - min;\n\n\t\t\tsaturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min );\n\n\t\t\tswitch ( max ) {\n\n\t\t\t\tcase r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break;\n\t\t\t\tcase g: hue = ( b - r ) / delta + 2; break;\n\t\t\t\tcase b: hue = ( r - g ) / delta + 4; break;\n\n\t\t\t}\n\n\t\t\thue /= 6;\n\n\t\t}\n\n\t\ttarget.h = hue;\n\t\ttarget.s = saturation;\n\t\ttarget.l = lightness;\n\n\t\treturn target;\n\n\t}\n\n\tgetStyle() {\n\n\t\treturn 'rgb(' + ( ( this.r * 255 ) | 0 ) + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')';\n\n\t}\n\n\toffsetHSL( h, s, l ) {\n\n\t\tthis.getHSL( _hslA );\n\n\t\t_hslA.h += h; _hslA.s += s; _hslA.l += l;\n\n\t\tthis.setHSL( _hslA.h, _hslA.s, _hslA.l );\n\n\t\treturn this;\n\n\t}\n\n\tadd( color ) {\n\n\t\tthis.r += color.r;\n\t\tthis.g += color.g;\n\t\tthis.b += color.b;\n\n\t\treturn this;\n\n\t}\n\n\taddColors( color1, color2 ) {\n\n\t\tthis.r = color1.r + color2.r;\n\t\tthis.g = color1.g + color2.g;\n\t\tthis.b = color1.b + color2.b;\n\n\t\treturn this;\n\n\t}\n\n\taddScalar( s ) {\n\n\t\tthis.r += s;\n\t\tthis.g += s;\n\t\tthis.b += s;\n\n\t\treturn this;\n\n\t}\n\n\tsub( color ) {\n\n\t\tthis.r = Math.max( 0, this.r - color.r );\n\t\tthis.g = Math.max( 0, this.g - color.g );\n\t\tthis.b = Math.max( 0, this.b - color.b );\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( color ) {\n\n\t\tthis.r *= color.r;\n\t\tthis.g *= color.g;\n\t\tthis.b *= color.b;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( s ) {\n\n\t\tthis.r *= s;\n\t\tthis.g *= s;\n\t\tthis.b *= s;\n\n\t\treturn this;\n\n\t}\n\n\tlerp( color, alpha ) {\n\n\t\tthis.r += ( color.r - this.r ) * alpha;\n\t\tthis.g += ( color.g - this.g ) * alpha;\n\t\tthis.b += ( color.b - this.b ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpColors( color1, color2, alpha ) {\n\n\t\tthis.r = color1.r + ( color2.r - color1.r ) * alpha;\n\t\tthis.g = color1.g + ( color2.g - color1.g ) * alpha;\n\t\tthis.b = color1.b + ( color2.b - color1.b ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpHSL( color, alpha ) {\n\n\t\tthis.getHSL( _hslA );\n\t\tcolor.getHSL( _hslB );\n\n\t\tconst h = MathUtils.lerp( _hslA.h, _hslB.h, alpha );\n\t\tconst s = MathUtils.lerp( _hslA.s, _hslB.s, alpha );\n\t\tconst l = MathUtils.lerp( _hslA.l, _hslB.l, alpha );\n\n\t\tthis.setHSL( h, s, l );\n\n\t\treturn this;\n\n\t}\n\n\tequals( c ) {\n\n\t\treturn ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.r = array[ offset ];\n\t\tthis.g = array[ offset + 1 ];\n\t\tthis.b = array[ offset + 2 ];\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.r;\n\t\tarray[ offset + 1 ] = this.g;\n\t\tarray[ offset + 2 ] = this.b;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.r = attribute.getX( index );\n\t\tthis.g = attribute.getY( index );\n\t\tthis.b = attribute.getZ( index );\n\n\t\tif ( attribute.normalized === true ) {\n\n\t\t\t// assuming Uint8Array\n\n\t\t\tthis.r /= 255;\n\t\t\tthis.g /= 255;\n\t\t\tthis.b /= 255;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\treturn this.getHex();\n\n\t}\n\n}\n\nColor.NAMES = _colorKeywords;\n\nColor.prototype.isColor = true;\nColor.prototype.r = 1;\nColor.prototype.g = 1;\nColor.prototype.b = 1;\n\nexport { Color, SRGBToLinear };\n","import { Vector4 } from '../math/Vector4.js';\nimport { Vector3 } from '../math/Vector3.js';\nimport { Vector2 } from '../math/Vector2.js';\nimport { Color } from '../math/Color.js';\nimport { StaticDrawUsage } from '../constants.js';\n\nconst _vector = /*@__PURE__*/ new Vector3();\nconst _vector2 = /*@__PURE__*/ new Vector2();\n\nclass BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tif ( Array.isArray( array ) ) {\n\n\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t}\n\n\t\tthis.name = '';\n\n\t\tthis.array = array;\n\t\tthis.itemSize = itemSize;\n\t\tthis.count = array !== undefined ? array.length / itemSize : 0;\n\t\tthis.normalized = normalized === true;\n\n\t\tthis.usage = StaticDrawUsage;\n\t\tthis.updateRange = { offset: 0, count: - 1 };\n\n\t\tthis.version = 0;\n\n\t}\n\n\tonUploadCallback() {}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\tsetUsage( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\t\tthis.array = new source.array.constructor( source.array );\n\t\tthis.itemSize = source.itemSize;\n\t\tthis.count = source.count;\n\t\tthis.normalized = source.normalized;\n\n\t\tthis.usage = source.usage;\n\n\t\treturn this;\n\n\t}\n\n\tcopyAt( index1, attribute, index2 ) {\n\n\t\tindex1 *= this.itemSize;\n\t\tindex2 *= attribute.itemSize;\n\n\t\tfor ( let i = 0, l = this.itemSize; i < l; i ++ ) {\n\n\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tcopyArray( array ) {\n\n\t\tthis.array.set( array );\n\n\t\treturn this;\n\n\t}\n\n\tcopyColorsArray( colors ) {\n\n\t\tconst array = this.array;\n\t\tlet offset = 0;\n\n\t\tfor ( let i = 0, l = colors.length; i < l; i ++ ) {\n\n\t\t\tlet color = colors[ i ];\n\n\t\t\tif ( color === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyColorsArray(): color is undefined', i );\n\t\t\t\tcolor = new Color();\n\n\t\t\t}\n\n\t\t\tarray[ offset ++ ] = color.r;\n\t\t\tarray[ offset ++ ] = color.g;\n\t\t\tarray[ offset ++ ] = color.b;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tcopyVector2sArray( vectors ) {\n\n\t\tconst array = this.array;\n\t\tlet offset = 0;\n\n\t\tfor ( let i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\tlet vector = vectors[ i ];\n\n\t\t\tif ( vector === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i );\n\t\t\t\tvector = new Vector2();\n\n\t\t\t}\n\n\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\tarray[ offset ++ ] = vector.y;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tcopyVector3sArray( vectors ) {\n\n\t\tconst array = this.array;\n\t\tlet offset = 0;\n\n\t\tfor ( let i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\tlet vector = vectors[ i ];\n\n\t\t\tif ( vector === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i );\n\t\t\t\tvector = new Vector3();\n\n\t\t\t}\n\n\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\tarray[ offset ++ ] = vector.y;\n\t\t\tarray[ offset ++ ] = vector.z;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tcopyVector4sArray( vectors ) {\n\n\t\tconst array = this.array;\n\t\tlet offset = 0;\n\n\t\tfor ( let i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\tlet vector = vectors[ i ];\n\n\t\t\tif ( vector === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i );\n\t\t\t\tvector = new Vector4();\n\n\t\t\t}\n\n\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\tarray[ offset ++ ] = vector.y;\n\t\t\tarray[ offset ++ ] = vector.z;\n\t\t\tarray[ offset ++ ] = vector.w;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tapplyMatrix3( m ) {\n\n\t\tif ( this.itemSize === 2 ) {\n\n\t\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t\t_vector2.fromBufferAttribute( this, i );\n\t\t\t\t_vector2.applyMatrix3( m );\n\n\t\t\t\tthis.setXY( i, _vector2.x, _vector2.y );\n\n\t\t\t}\n\n\t\t} else if ( this.itemSize === 3 ) {\n\n\t\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t\t_vector.fromBufferAttribute( this, i );\n\t\t\t\t_vector.applyMatrix3( m );\n\n\t\t\t\tthis.setXYZ( i, _vector.x, _vector.y, _vector.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tapplyMatrix4( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector.x = this.getX( i );\n\t\t\t_vector.y = this.getY( i );\n\t\t\t_vector.z = this.getZ( i );\n\n\t\t\t_vector.applyMatrix4( m );\n\n\t\t\tthis.setXYZ( i, _vector.x, _vector.y, _vector.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tapplyNormalMatrix( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector.x = this.getX( i );\n\t\t\t_vector.y = this.getY( i );\n\t\t\t_vector.z = this.getZ( i );\n\n\t\t\t_vector.applyNormalMatrix( m );\n\n\t\t\tthis.setXYZ( i, _vector.x, _vector.y, _vector.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttransformDirection( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector.x = this.getX( i );\n\t\t\t_vector.y = this.getY( i );\n\t\t\t_vector.z = this.getZ( i );\n\n\t\t\t_vector.transformDirection( m );\n\n\t\t\tthis.setXYZ( i, _vector.x, _vector.y, _vector.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tset( value, offset = 0 ) {\n\n\t\tthis.array.set( value, offset );\n\n\t\treturn this;\n\n\t}\n\n\tgetX( index ) {\n\n\t\treturn this.array[ index * this.itemSize ];\n\n\t}\n\n\tsetX( index, x ) {\n\n\t\tthis.array[ index * this.itemSize ] = x;\n\n\t\treturn this;\n\n\t}\n\n\tgetY( index ) {\n\n\t\treturn this.array[ index * this.itemSize + 1 ];\n\n\t}\n\n\tsetY( index, y ) {\n\n\t\tthis.array[ index * this.itemSize + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\tgetZ( index ) {\n\n\t\treturn this.array[ index * this.itemSize + 2 ];\n\n\t}\n\n\tsetZ( index, z ) {\n\n\t\tthis.array[ index * this.itemSize + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\tgetW( index ) {\n\n\t\treturn this.array[ index * this.itemSize + 3 ];\n\n\t}\n\n\tsetW( index, w ) {\n\n\t\tthis.array[ index * this.itemSize + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\tsetXY( index, x, y ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZ( index, x, y, z ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\t\tthis.array[ index + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZW( index, x, y, z, w ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\t\tthis.array[ index + 2 ] = z;\n\t\tthis.array[ index + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\tonUpload( callback ) {\n\n\t\tthis.onUploadCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.array, this.itemSize ).copy( this );\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\titemSize: this.itemSize,\n\t\t\ttype: this.array.constructor.name,\n\t\t\tarray: Array.prototype.slice.call( this.array ),\n\t\t\tnormalized: this.normalized\n\t\t};\n\n\t\tif ( this.name !== '' ) data.name = this.name;\n\t\tif ( this.usage !== StaticDrawUsage ) data.usage = this.usage;\n\t\tif ( this.updateRange.offset !== 0 || this.updateRange.count !== - 1 ) data.updateRange = this.updateRange;\n\n\t\treturn data;\n\n\t}\n\n}\n\nBufferAttribute.prototype.isBufferAttribute = true;\n\n//\n\nclass Int8BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int8Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Uint8BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint8Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Uint8ClampedBufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint8ClampedArray( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Int16BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int16Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Uint16BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint16Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Int32BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Uint32BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Float16BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint16Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nFloat16BufferAttribute.prototype.isFloat16BufferAttribute = true;\n\nclass Float32BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Float32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Float64BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Float64Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n//\n\nexport {\n\tFloat64BufferAttribute,\n\tFloat32BufferAttribute,\n\tFloat16BufferAttribute,\n\tUint32BufferAttribute,\n\tInt32BufferAttribute,\n\tUint16BufferAttribute,\n\tInt16BufferAttribute,\n\tUint8ClampedBufferAttribute,\n\tUint8BufferAttribute,\n\tInt8BufferAttribute,\n\tBufferAttribute\n};\n","function arrayMin( array ) {\n\n\tif ( array.length === 0 ) return Infinity;\n\n\tlet min = array[ 0 ];\n\n\tfor ( let i = 1, l = array.length; i < l; ++ i ) {\n\n\t\tif ( array[ i ] < min ) min = array[ i ];\n\n\t}\n\n\treturn min;\n\n}\n\nfunction arrayMax( array ) {\n\n\tif ( array.length === 0 ) return - Infinity;\n\n\tlet max = array[ 0 ];\n\n\tfor ( let i = 1, l = array.length; i < l; ++ i ) {\n\n\t\tif ( array[ i ] > max ) max = array[ i ];\n\n\t}\n\n\treturn max;\n\n}\n\nfunction arrayNeedsUint32( array ) {\n\n\t// assumes larger values usually on last\n\n\tfor ( let i = array.length - 1; i >= 0; -- i ) {\n\n\t\tif ( array[ i ] > 65535 ) return true;\n\n\t}\n\n\treturn false;\n\n}\n\nconst TYPED_ARRAYS = {\n\tInt8Array: Int8Array,\n\tUint8Array: Uint8Array,\n\tUint8ClampedArray: Uint8ClampedArray,\n\tInt16Array: Int16Array,\n\tUint16Array: Uint16Array,\n\tInt32Array: Int32Array,\n\tUint32Array: Uint32Array,\n\tFloat32Array: Float32Array,\n\tFloat64Array: Float64Array\n};\n\nfunction getTypedArray( type, buffer ) {\n\n\treturn new TYPED_ARRAYS[ type ]( buffer );\n\n}\n\nfunction createElementNS( name ) {\n\n\treturn document.createElementNS( 'http://www.w3.org/1999/xhtml', name );\n\n}\n\nexport { arrayMin, arrayMax, arrayNeedsUint32, getTypedArray, createElementNS };\n","import { Vector3 } from '../math/Vector3.js';\nimport { Vector2 } from '../math/Vector2.js';\nimport { Box3 } from '../math/Box3.js';\nimport { EventDispatcher } from './EventDispatcher.js';\nimport { BufferAttribute, Float32BufferAttribute, Uint16BufferAttribute, Uint32BufferAttribute } from './BufferAttribute.js';\nimport { Sphere } from '../math/Sphere.js';\nimport { Object3D } from './Object3D.js';\nimport { Matrix4 } from '../math/Matrix4.js';\nimport { Matrix3 } from '../math/Matrix3.js';\nimport * as MathUtils from '../math/MathUtils.js';\nimport { arrayNeedsUint32 } from '../utils.js';\n\nlet _id = 0;\n\nconst _m1 = /*@__PURE__*/ new Matrix4();\nconst _obj = /*@__PURE__*/ new Object3D();\nconst _offset = /*@__PURE__*/ new Vector3();\nconst _box = /*@__PURE__*/ new Box3();\nconst _boxMorphTargets = /*@__PURE__*/ new Box3();\nconst _vector = /*@__PURE__*/ new Vector3();\n\nclass BufferGeometry extends EventDispatcher {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tObject.defineProperty( this, 'id', { value: _id ++ } );\n\n\t\tthis.uuid = MathUtils.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'BufferGeometry';\n\n\t\tthis.index = null;\n\t\tthis.attributes = {};\n\n\t\tthis.morphAttributes = {};\n\t\tthis.morphTargetsRelative = false;\n\n\t\tthis.groups = [];\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\tthis.drawRange = { start: 0, count: Infinity };\n\n\t\tthis.userData = {};\n\n\t}\n\n\tgetIndex() {\n\n\t\treturn this.index;\n\n\t}\n\n\tsetIndex( index ) {\n\n\t\tif ( Array.isArray( index ) ) {\n\n\t\t\tthis.index = new ( arrayNeedsUint32( index ) ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 );\n\n\t\t} else {\n\n\t\t\tthis.index = index;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetAttribute( name ) {\n\n\t\treturn this.attributes[ name ];\n\n\t}\n\n\tsetAttribute( name, attribute ) {\n\n\t\tthis.attributes[ name ] = attribute;\n\n\t\treturn this;\n\n\t}\n\n\tdeleteAttribute( name ) {\n\n\t\tdelete this.attributes[ name ];\n\n\t\treturn this;\n\n\t}\n\n\thasAttribute( name ) {\n\n\t\treturn this.attributes[ name ] !== undefined;\n\n\t}\n\n\taddGroup( start, count, materialIndex = 0 ) {\n\n\t\tthis.groups.push( {\n\n\t\t\tstart: start,\n\t\t\tcount: count,\n\t\t\tmaterialIndex: materialIndex\n\n\t\t} );\n\n\t}\n\n\tclearGroups() {\n\n\t\tthis.groups = [];\n\n\t}\n\n\tsetDrawRange( start, count ) {\n\n\t\tthis.drawRange.start = start;\n\t\tthis.drawRange.count = count;\n\n\t}\n\n\tapplyMatrix4( matrix ) {\n\n\t\tconst position = this.attributes.position;\n\n\t\tif ( position !== undefined ) {\n\n\t\t\tposition.applyMatrix4( matrix );\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t}\n\n\t\tconst normal = this.attributes.normal;\n\n\t\tif ( normal !== undefined ) {\n\n\t\t\tconst normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\tnormal.applyNormalMatrix( normalMatrix );\n\n\t\t\tnormal.needsUpdate = true;\n\n\t\t}\n\n\t\tconst tangent = this.attributes.tangent;\n\n\t\tif ( tangent !== undefined ) {\n\n\t\t\ttangent.transformDirection( matrix );\n\n\t\t\ttangent.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( this.boundingBox !== null ) {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t}\n\n\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\tthis.computeBoundingSphere();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tapplyQuaternion( q ) {\n\n\t\t_m1.makeRotationFromQuaternion( q );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateX( angle ) {\n\n\t\t// rotate geometry around world x-axis\n\n\t\t_m1.makeRotationX( angle );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateY( angle ) {\n\n\t\t// rotate geometry around world y-axis\n\n\t\t_m1.makeRotationY( angle );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateZ( angle ) {\n\n\t\t// rotate geometry around world z-axis\n\n\t\t_m1.makeRotationZ( angle );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( x, y, z ) {\n\n\t\t// translate geometry\n\n\t\t_m1.makeTranslation( x, y, z );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\tscale( x, y, z ) {\n\n\t\t// scale geometry\n\n\t\t_m1.makeScale( x, y, z );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\tlookAt( vector ) {\n\n\t\t_obj.lookAt( vector );\n\n\t\t_obj.updateMatrix();\n\n\t\tthis.applyMatrix4( _obj.matrix );\n\n\t\treturn this;\n\n\t}\n\n\tcenter() {\n\n\t\tthis.computeBoundingBox();\n\n\t\tthis.boundingBox.getCenter( _offset ).negate();\n\n\t\tthis.translate( _offset.x, _offset.y, _offset.z );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPoints( points ) {\n\n\t\tconst position = [];\n\n\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\tconst point = points[ i ];\n\t\t\tposition.push( point.x, point.y, point.z || 0 );\n\n\t\t}\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( position, 3 ) );\n\n\t\treturn this;\n\n\t}\n\n\tcomputeBoundingBox() {\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tconst position = this.attributes.position;\n\t\tconst morphAttributesPosition = this.morphAttributes.position;\n\n\t\tif ( position && position.isGLBufferAttribute ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box. Alternatively set \"mesh.frustumCulled\" to \"false\".', this );\n\n\t\t\tthis.boundingBox.set(\n\t\t\t\tnew Vector3( - Infinity, - Infinity, - Infinity ),\n\t\t\t\tnew Vector3( + Infinity, + Infinity, + Infinity )\n\t\t\t);\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( position !== undefined ) {\n\n\t\t\tthis.boundingBox.setFromBufferAttribute( position );\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\t_box.setFromBufferAttribute( morphAttribute );\n\n\t\t\t\t\tif ( this.morphTargetsRelative ) {\n\n\t\t\t\t\t\t_vector.addVectors( this.boundingBox.min, _box.min );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _vector );\n\n\t\t\t\t\t\t_vector.addVectors( this.boundingBox.max, _box.max );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _vector );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _box.min );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _box.max );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthis.boundingBox.makeEmpty();\n\n\t\t}\n\n\t\tif ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingBox(): Computed min/max have NaN values. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t}\n\n\t}\n\n\tcomputeBoundingSphere() {\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tconst position = this.attributes.position;\n\t\tconst morphAttributesPosition = this.morphAttributes.position;\n\n\t\tif ( position && position.isGLBufferAttribute ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingSphere(): GLBufferAttribute requires a manual bounding sphere. Alternatively set \"mesh.frustumCulled\" to \"false\".', this );\n\n\t\t\tthis.boundingSphere.set( new Vector3(), Infinity );\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( position ) {\n\n\t\t\t// first, find the center of the bounding sphere\n\n\t\t\tconst center = this.boundingSphere.center;\n\n\t\t\t_box.setFromBufferAttribute( position );\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\t_boxMorphTargets.setFromBufferAttribute( morphAttribute );\n\n\t\t\t\t\tif ( this.morphTargetsRelative ) {\n\n\t\t\t\t\t\t_vector.addVectors( _box.min, _boxMorphTargets.min );\n\t\t\t\t\t\t_box.expandByPoint( _vector );\n\n\t\t\t\t\t\t_vector.addVectors( _box.max, _boxMorphTargets.max );\n\t\t\t\t\t\t_box.expandByPoint( _vector );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_box.expandByPoint( _boxMorphTargets.min );\n\t\t\t\t\t\t_box.expandByPoint( _boxMorphTargets.max );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_box.getCenter( center );\n\n\t\t\t// second, try to find a boundingSphere with a radius smaller than the\n\t\t\t// boundingSphere of the boundingBox: sqrt(3) smaller in the best case\n\n\t\t\tlet maxRadiusSq = 0;\n\n\t\t\tfor ( let i = 0, il = position.count; i < il; i ++ ) {\n\n\t\t\t\t_vector.fromBufferAttribute( position, i );\n\n\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector ) );\n\n\t\t\t}\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\tconst morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t\t\t\tfor ( let j = 0, jl = morphAttribute.count; j < jl; j ++ ) {\n\n\t\t\t\t\t\t_vector.fromBufferAttribute( morphAttribute, j );\n\n\t\t\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t\t\t_offset.fromBufferAttribute( position, j );\n\t\t\t\t\t\t\t_vector.add( _offset );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.boundingSphere.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\tif ( isNaN( this.boundingSphere.radius ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcomputeTangents() {\n\n\t\tconst index = this.index;\n\t\tconst attributes = this.attributes;\n\n\t\t// based on http://www.terathon.com/code/tangent.html\n\t\t// (per vertex tangents)\n\n\t\tif ( index === null ||\n\t\t\t attributes.position === undefined ||\n\t\t\t attributes.normal === undefined ||\n\t\t\t attributes.uv === undefined ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry: .computeTangents() failed. Missing required attributes (index, position, normal or uv)' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst indices = index.array;\n\t\tconst positions = attributes.position.array;\n\t\tconst normals = attributes.normal.array;\n\t\tconst uvs = attributes.uv.array;\n\n\t\tconst nVertices = positions.length / 3;\n\n\t\tif ( attributes.tangent === undefined ) {\n\n\t\t\tthis.setAttribute( 'tangent', new BufferAttribute( new Float32Array( 4 * nVertices ), 4 ) );\n\n\t\t}\n\n\t\tconst tangents = attributes.tangent.array;\n\n\t\tconst tan1 = [], tan2 = [];\n\n\t\tfor ( let i = 0; i < nVertices; i ++ ) {\n\n\t\t\ttan1[ i ] = new Vector3();\n\t\t\ttan2[ i ] = new Vector3();\n\n\t\t}\n\n\t\tconst vA = new Vector3(),\n\t\t\tvB = new Vector3(),\n\t\t\tvC = new Vector3(),\n\n\t\t\tuvA = new Vector2(),\n\t\t\tuvB = new Vector2(),\n\t\t\tuvC = new Vector2(),\n\n\t\t\tsdir = new Vector3(),\n\t\t\ttdir = new Vector3();\n\n\t\tfunction handleTriangle( a, b, c ) {\n\n\t\t\tvA.fromArray( positions, a * 3 );\n\t\t\tvB.fromArray( positions, b * 3 );\n\t\t\tvC.fromArray( positions, c * 3 );\n\n\t\t\tuvA.fromArray( uvs, a * 2 );\n\t\t\tuvB.fromArray( uvs, b * 2 );\n\t\t\tuvC.fromArray( uvs, c * 2 );\n\n\t\t\tvB.sub( vA );\n\t\t\tvC.sub( vA );\n\n\t\t\tuvB.sub( uvA );\n\t\t\tuvC.sub( uvA );\n\n\t\t\tconst r = 1.0 / ( uvB.x * uvC.y - uvC.x * uvB.y );\n\n\t\t\t// silently ignore degenerate uv triangles having coincident or colinear vertices\n\n\t\t\tif ( ! isFinite( r ) ) return;\n\n\t\t\tsdir.copy( vB ).multiplyScalar( uvC.y ).addScaledVector( vC, - uvB.y ).multiplyScalar( r );\n\t\t\ttdir.copy( vC ).multiplyScalar( uvB.x ).addScaledVector( vB, - uvC.x ).multiplyScalar( r );\n\n\t\t\ttan1[ a ].add( sdir );\n\t\t\ttan1[ b ].add( sdir );\n\t\t\ttan1[ c ].add( sdir );\n\n\t\t\ttan2[ a ].add( tdir );\n\t\t\ttan2[ b ].add( tdir );\n\t\t\ttan2[ c ].add( tdir );\n\n\t\t}\n\n\t\tlet groups = this.groups;\n\n\t\tif ( groups.length === 0 ) {\n\n\t\t\tgroups = [ {\n\t\t\t\tstart: 0,\n\t\t\t\tcount: indices.length\n\t\t\t} ];\n\n\t\t}\n\n\t\tfor ( let i = 0, il = groups.length; i < il; ++ i ) {\n\n\t\t\tconst group = groups[ i ];\n\n\t\t\tconst start = group.start;\n\t\t\tconst count = group.count;\n\n\t\t\tfor ( let j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\thandleTriangle(\n\t\t\t\t\tindices[ j + 0 ],\n\t\t\t\t\tindices[ j + 1 ],\n\t\t\t\t\tindices[ j + 2 ]\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst tmp = new Vector3(), tmp2 = new Vector3();\n\t\tconst n = new Vector3(), n2 = new Vector3();\n\n\t\tfunction handleVertex( v ) {\n\n\t\t\tn.fromArray( normals, v * 3 );\n\t\t\tn2.copy( n );\n\n\t\t\tconst t = tan1[ v ];\n\n\t\t\t// Gram-Schmidt orthogonalize\n\n\t\t\ttmp.copy( t );\n\t\t\ttmp.sub( n.multiplyScalar( n.dot( t ) ) ).normalize();\n\n\t\t\t// Calculate handedness\n\n\t\t\ttmp2.crossVectors( n2, t );\n\t\t\tconst test = tmp2.dot( tan2[ v ] );\n\t\t\tconst w = ( test < 0.0 ) ? - 1.0 : 1.0;\n\n\t\t\ttangents[ v * 4 ] = tmp.x;\n\t\t\ttangents[ v * 4 + 1 ] = tmp.y;\n\t\t\ttangents[ v * 4 + 2 ] = tmp.z;\n\t\t\ttangents[ v * 4 + 3 ] = w;\n\n\t\t}\n\n\t\tfor ( let i = 0, il = groups.length; i < il; ++ i ) {\n\n\t\t\tconst group = groups[ i ];\n\n\t\t\tconst start = group.start;\n\t\t\tconst count = group.count;\n\n\t\t\tfor ( let j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\thandleVertex( indices[ j + 0 ] );\n\t\t\t\thandleVertex( indices[ j + 1 ] );\n\t\t\t\thandleVertex( indices[ j + 2 ] );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcomputeVertexNormals() {\n\n\t\tconst index = this.index;\n\t\tconst positionAttribute = this.getAttribute( 'position' );\n\n\t\tif ( positionAttribute !== undefined ) {\n\n\t\t\tlet normalAttribute = this.getAttribute( 'normal' );\n\n\t\t\tif ( normalAttribute === undefined ) {\n\n\t\t\t\tnormalAttribute = new BufferAttribute( new Float32Array( positionAttribute.count * 3 ), 3 );\n\t\t\t\tthis.setAttribute( 'normal', normalAttribute );\n\n\t\t\t} else {\n\n\t\t\t\t// reset existing normals to zero\n\n\t\t\t\tfor ( let i = 0, il = normalAttribute.count; i < il; i ++ ) {\n\n\t\t\t\t\tnormalAttribute.setXYZ( i, 0, 0, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst pA = new Vector3(), pB = new Vector3(), pC = new Vector3();\n\t\t\tconst nA = new Vector3(), nB = new Vector3(), nC = new Vector3();\n\t\t\tconst cb = new Vector3(), ab = new Vector3();\n\n\t\t\t// indexed elements\n\n\t\t\tif ( index ) {\n\n\t\t\t\tfor ( let i = 0, il = index.count; i < il; i += 3 ) {\n\n\t\t\t\t\tconst vA = index.getX( i + 0 );\n\t\t\t\t\tconst vB = index.getX( i + 1 );\n\t\t\t\t\tconst vC = index.getX( i + 2 );\n\n\t\t\t\t\tpA.fromBufferAttribute( positionAttribute, vA );\n\t\t\t\t\tpB.fromBufferAttribute( positionAttribute, vB );\n\t\t\t\t\tpC.fromBufferAttribute( positionAttribute, vC );\n\n\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tnA.fromBufferAttribute( normalAttribute, vA );\n\t\t\t\t\tnB.fromBufferAttribute( normalAttribute, vB );\n\t\t\t\t\tnC.fromBufferAttribute( normalAttribute, vC );\n\n\t\t\t\t\tnA.add( cb );\n\t\t\t\t\tnB.add( cb );\n\t\t\t\t\tnC.add( cb );\n\n\t\t\t\t\tnormalAttribute.setXYZ( vA, nA.x, nA.y, nA.z );\n\t\t\t\t\tnormalAttribute.setXYZ( vB, nB.x, nB.y, nB.z );\n\t\t\t\t\tnormalAttribute.setXYZ( vC, nC.x, nC.y, nC.z );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed elements (unconnected triangle soup)\n\n\t\t\t\tfor ( let i = 0, il = positionAttribute.count; i < il; i += 3 ) {\n\n\t\t\t\t\tpA.fromBufferAttribute( positionAttribute, i + 0 );\n\t\t\t\t\tpB.fromBufferAttribute( positionAttribute, i + 1 );\n\t\t\t\t\tpC.fromBufferAttribute( positionAttribute, i + 2 );\n\n\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tnormalAttribute.setXYZ( i + 0, cb.x, cb.y, cb.z );\n\t\t\t\t\tnormalAttribute.setXYZ( i + 1, cb.x, cb.y, cb.z );\n\t\t\t\t\tnormalAttribute.setXYZ( i + 2, cb.x, cb.y, cb.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.normalizeNormals();\n\n\t\t\tnormalAttribute.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\tmerge( geometry, offset ) {\n\n\t\tif ( ! ( geometry && geometry.isBufferGeometry ) ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', geometry );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( offset === undefined ) {\n\n\t\t\toffset = 0;\n\n\t\t\tconsole.warn(\n\t\t\t\t'THREE.BufferGeometry.merge(): Overwriting original geometry, starting at offset=0. '\n\t\t\t\t+ 'Use BufferGeometryUtils.mergeBufferGeometries() for lossless merge.'\n\t\t\t);\n\n\t\t}\n\n\t\tconst attributes = this.attributes;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tif ( geometry.attributes[ key ] === undefined ) continue;\n\n\t\t\tconst attribute1 = attributes[ key ];\n\t\t\tconst attributeArray1 = attribute1.array;\n\n\t\t\tconst attribute2 = geometry.attributes[ key ];\n\t\t\tconst attributeArray2 = attribute2.array;\n\n\t\t\tconst attributeOffset = attribute2.itemSize * offset;\n\t\t\tconst length = Math.min( attributeArray2.length, attributeArray1.length - attributeOffset );\n\n\t\t\tfor ( let i = 0, j = attributeOffset; i < length; i ++, j ++ ) {\n\n\t\t\t\tattributeArray1[ j ] = attributeArray2[ i ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tnormalizeNormals() {\n\n\t\tconst normals = this.attributes.normal;\n\n\t\tfor ( let i = 0, il = normals.count; i < il; i ++ ) {\n\n\t\t\t_vector.fromBufferAttribute( normals, i );\n\n\t\t\t_vector.normalize();\n\n\t\t\tnormals.setXYZ( i, _vector.x, _vector.y, _vector.z );\n\n\t\t}\n\n\t}\n\n\ttoNonIndexed() {\n\n\t\tfunction convertBufferAttribute( attribute, indices ) {\n\n\t\t\tconst array = attribute.array;\n\t\t\tconst itemSize = attribute.itemSize;\n\t\t\tconst normalized = attribute.normalized;\n\n\t\t\tconst array2 = new array.constructor( indices.length * itemSize );\n\n\t\t\tlet index = 0, index2 = 0;\n\n\t\t\tfor ( let i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\tindex = indices[ i ] * attribute.data.stride + attribute.offset;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tindex = indices[ i ] * itemSize;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let j = 0; j < itemSize; j ++ ) {\n\n\t\t\t\t\tarray2[ index2 ++ ] = array[ index ++ ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new BufferAttribute( array2, itemSize, normalized );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.index === null ) {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry.toNonIndexed(): BufferGeometry is already non-indexed.' );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst geometry2 = new BufferGeometry();\n\n\t\tconst indices = this.index.array;\n\t\tconst attributes = this.attributes;\n\n\t\t// attributes\n\n\t\tfor ( const name in attributes ) {\n\n\t\t\tconst attribute = attributes[ name ];\n\n\t\t\tconst newAttribute = convertBufferAttribute( attribute, indices );\n\n\t\t\tgeometry2.setAttribute( name, newAttribute );\n\n\t\t}\n\n\t\t// morph attributes\n\n\t\tconst morphAttributes = this.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst morphArray = [];\n\t\t\tconst morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\tfor ( let i = 0, il = morphAttribute.length; i < il; i ++ ) {\n\n\t\t\t\tconst attribute = morphAttribute[ i ];\n\n\t\t\t\tconst newAttribute = convertBufferAttribute( attribute, indices );\n\n\t\t\t\tmorphArray.push( newAttribute );\n\n\t\t\t}\n\n\t\t\tgeometry2.morphAttributes[ name ] = morphArray;\n\n\t\t}\n\n\t\tgeometry2.morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t// groups\n\n\t\tconst groups = this.groups;\n\n\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tconst group = groups[ i ];\n\t\t\tgeometry2.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\treturn geometry2;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'BufferGeometry',\n\t\t\t\tgenerator: 'BufferGeometry.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard BufferGeometry serialization\n\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\t\tif ( this.name !== '' ) data.name = this.name;\n\t\tif ( Object.keys( this.userData ).length > 0 ) data.userData = this.userData;\n\n\t\tif ( this.parameters !== undefined ) {\n\n\t\t\tconst parameters = this.parameters;\n\n\t\t\tfor ( const key in parameters ) {\n\n\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\t// for simplicity the code assumes attributes are not shared across geometries, see #15811\n\n\t\tdata.data = { attributes: {} };\n\n\t\tconst index = this.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tdata.data.index = {\n\t\t\t\ttype: index.array.constructor.name,\n\t\t\t\tarray: Array.prototype.slice.call( index.array )\n\t\t\t};\n\n\t\t}\n\n\t\tconst attributes = this.attributes;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tconst attribute = attributes[ key ];\n\n\t\t\tdata.data.attributes[ key ] = attribute.toJSON( data.data );\n\n\t\t}\n\n\t\tconst morphAttributes = {};\n\t\tlet hasMorphAttributes = false;\n\n\t\tfor ( const key in this.morphAttributes ) {\n\n\t\t\tconst attributeArray = this.morphAttributes[ key ];\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0, il = attributeArray.length; i < il; i ++ ) {\n\n\t\t\t\tconst attribute = attributeArray[ i ];\n\n\t\t\t\tarray.push( attribute.toJSON( data.data ) );\n\n\t\t\t}\n\n\t\t\tif ( array.length > 0 ) {\n\n\t\t\t\tmorphAttributes[ key ] = array;\n\n\t\t\t\thasMorphAttributes = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( hasMorphAttributes ) {\n\n\t\t\tdata.data.morphAttributes = morphAttributes;\n\t\t\tdata.data.morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t}\n\n\t\tconst groups = this.groups;\n\n\t\tif ( groups.length > 0 ) {\n\n\t\t\tdata.data.groups = JSON.parse( JSON.stringify( groups ) );\n\n\t\t}\n\n\t\tconst boundingSphere = this.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tdata.data.boundingSphere = {\n\t\t\t\tcenter: boundingSphere.center.toArray(),\n\t\t\t\tradius: boundingSphere.radius\n\t\t\t};\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tclone() {\n\n\t\t return new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\n\n\t\t// reset\n\n\t\tthis.index = null;\n\t\tthis.attributes = {};\n\t\tthis.morphAttributes = {};\n\t\tthis.groups = [];\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// used for storing cloned, shared data\n\n\t\tconst data = {};\n\n\t\t// name\n\n\t\tthis.name = source.name;\n\n\t\t// index\n\n\t\tconst index = source.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tthis.setIndex( index.clone( data ) );\n\n\t\t}\n\n\t\t// attributes\n\n\t\tconst attributes = source.attributes;\n\n\t\tfor ( const name in attributes ) {\n\n\t\t\tconst attribute = attributes[ name ];\n\t\t\tthis.setAttribute( name, attribute.clone( data ) );\n\n\t\t}\n\n\t\t// morph attributes\n\n\t\tconst morphAttributes = source.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst array = [];\n\t\t\tconst morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\tfor ( let i = 0, l = morphAttribute.length; i < l; i ++ ) {\n\n\t\t\t\tarray.push( morphAttribute[ i ].clone( data ) );\n\n\t\t\t}\n\n\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t}\n\n\t\tthis.morphTargetsRelative = source.morphTargetsRelative;\n\n\t\t// groups\n\n\t\tconst groups = source.groups;\n\n\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tconst group = groups[ i ];\n\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\t// bounding box\n\n\t\tconst boundingBox = source.boundingBox;\n\n\t\tif ( boundingBox !== null ) {\n\n\t\t\tthis.boundingBox = boundingBox.clone();\n\n\t\t}\n\n\t\t// bounding sphere\n\n\t\tconst boundingSphere = source.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tthis.boundingSphere = boundingSphere.clone();\n\n\t\t}\n\n\t\t// draw range\n\n\t\tthis.drawRange.start = source.drawRange.start;\n\t\tthis.drawRange.count = source.drawRange.count;\n\n\t\t// user data\n\n\t\tthis.userData = source.userData;\n\n\t\t// geometry generator parameters\n\n\t\tif ( source.parameters !== undefined ) this.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n}\n\nBufferGeometry.prototype.isBufferGeometry = true;\n\nexport { BufferGeometry };\n","import { BufferGeometry } from '../core/BufferGeometry.js';\nimport { Float32BufferAttribute } from '../core/BufferAttribute.js';\nimport { Vector3 } from '../math/Vector3.js';\n\nclass BoxGeometry extends BufferGeometry {\n\n\tconstructor( width = 1, height = 1, depth = 1, widthSegments = 1, heightSegments = 1, depthSegments = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'BoxGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\tdepth: depth,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tdepthSegments: depthSegments\n\t\t};\n\n\t\tconst scope = this;\n\n\t\t// segments\n\n\t\twidthSegments = Math.floor( widthSegments );\n\t\theightSegments = Math.floor( heightSegments );\n\t\tdepthSegments = Math.floor( depthSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet numberOfVertices = 0;\n\t\tlet groupStart = 0;\n\n\t\t// build each side of the box geometry\n\n\t\tbuildPlane( 'z', 'y', 'x', - 1, - 1, depth, height, width, depthSegments, heightSegments, 0 ); // px\n\t\tbuildPlane( 'z', 'y', 'x', 1, - 1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx\n\t\tbuildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py\n\t\tbuildPlane( 'x', 'z', 'y', 1, - 1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny\n\t\tbuildPlane( 'x', 'y', 'z', 1, - 1, width, height, depth, widthSegments, heightSegments, 4 ); // pz\n\t\tbuildPlane( 'x', 'y', 'z', - 1, - 1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) {\n\n\t\t\tconst segmentWidth = width / gridX;\n\t\t\tconst segmentHeight = height / gridY;\n\n\t\t\tconst widthHalf = width / 2;\n\t\t\tconst heightHalf = height / 2;\n\t\t\tconst depthHalf = depth / 2;\n\n\t\t\tconst gridX1 = gridX + 1;\n\t\t\tconst gridY1 = gridY + 1;\n\n\t\t\tlet vertexCounter = 0;\n\t\t\tlet groupCount = 0;\n\n\t\t\tconst vector = new Vector3();\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( let iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\t\tconst y = iy * segmentHeight - heightHalf;\n\n\t\t\t\tfor ( let ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\t\tconst x = ix * segmentWidth - widthHalf;\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = x * udir;\n\t\t\t\t\tvector[ v ] = y * vdir;\n\t\t\t\t\tvector[ w ] = depthHalf;\n\n\t\t\t\t\t// now apply vector to vertex buffer\n\n\t\t\t\t\tvertices.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = 0;\n\t\t\t\t\tvector[ v ] = 0;\n\t\t\t\t\tvector[ w ] = depth > 0 ? 1 : - 1;\n\n\t\t\t\t\t// now apply vector to normal buffer\n\n\t\t\t\t\tnormals.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// uvs\n\n\t\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t\t\t// counters\n\n\t\t\t\t\tvertexCounter += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// indices\n\n\t\t\t// 1. you need three indices to draw a single face\n\t\t\t// 2. a single segment consists of two faces\n\t\t\t// 3. so we need to generate six (2*3) indices per segment\n\n\t\t\tfor ( let iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\t\tfor ( let ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\t\tconst a = numberOfVertices + ix + gridX1 * iy;\n\t\t\t\t\tconst b = numberOfVertices + ix + gridX1 * ( iy + 1 );\n\t\t\t\t\tconst c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\t\tconst d = numberOfVertices + ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t\t// increase counter\n\n\t\t\t\t\tgroupCount += 6;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, materialIndex );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t\t// update total number of vertices\n\n\t\t\tnumberOfVertices += vertexCounter;\n\n\t\t}\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new BoxGeometry( data.width, data.height, data.depth, data.widthSegments, data.heightSegments, data.depthSegments );\n\n\t}\n\n}\n\nexport { BoxGeometry, BoxGeometry as BoxBufferGeometry };\n","import { BufferGeometry } from '../core/BufferGeometry.js';\nimport { Float32BufferAttribute } from '../core/BufferAttribute.js';\n\nclass PlaneGeometry extends BufferGeometry {\n\n\tconstructor( width = 1, height = 1, widthSegments = 1, heightSegments = 1 ) {\n\n\t\tsuper();\n\t\tthis.type = 'PlaneGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments\n\t\t};\n\n\t\tconst width_half = width / 2;\n\t\tconst height_half = height / 2;\n\n\t\tconst gridX = Math.floor( widthSegments );\n\t\tconst gridY = Math.floor( heightSegments );\n\n\t\tconst gridX1 = gridX + 1;\n\t\tconst gridY1 = gridY + 1;\n\n\t\tconst segment_width = width / gridX;\n\t\tconst segment_height = height / gridY;\n\n\t\t//\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\tfor ( let iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\tconst y = iy * segment_height - height_half;\n\n\t\t\tfor ( let ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\tconst x = ix * segment_width - width_half;\n\n\t\t\t\tvertices.push( x, - y, 0 );\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\tfor ( let ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\tconst a = ix + gridX1 * iy;\n\t\t\t\tconst b = ix + gridX1 * ( iy + 1 );\n\t\t\t\tconst c = ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\tconst d = ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new PlaneGeometry( data.width, data.height, data.widthSegments, data.heightSegments );\n\n\t}\n\n}\n\nexport { PlaneGeometry, PlaneGeometry as PlaneBufferGeometry };\n","import { EventDispatcher } from '../core/EventDispatcher.js';\nimport { FrontSide, FlatShading, NormalBlending, LessEqualDepth, AddEquation, OneMinusSrcAlphaFactor, SrcAlphaFactor, AlwaysStencilFunc, KeepStencilOp } from '../constants.js';\nimport * as MathUtils from '../math/MathUtils.js';\n\nlet materialId = 0;\n\nclass Material extends EventDispatcher {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tObject.defineProperty( this, 'id', { value: materialId ++ } );\n\n\t\tthis.uuid = MathUtils.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Material';\n\n\t\tthis.fog = true;\n\n\t\tthis.blending = NormalBlending;\n\t\tthis.side = FrontSide;\n\t\tthis.vertexColors = false;\n\n\t\tthis.opacity = 1;\n\t\tthis.transparent = false;\n\n\t\tthis.blendSrc = SrcAlphaFactor;\n\t\tthis.blendDst = OneMinusSrcAlphaFactor;\n\t\tthis.blendEquation = AddEquation;\n\t\tthis.blendSrcAlpha = null;\n\t\tthis.blendDstAlpha = null;\n\t\tthis.blendEquationAlpha = null;\n\n\t\tthis.depthFunc = LessEqualDepth;\n\t\tthis.depthTest = true;\n\t\tthis.depthWrite = true;\n\n\t\tthis.stencilWriteMask = 0xff;\n\t\tthis.stencilFunc = AlwaysStencilFunc;\n\t\tthis.stencilRef = 0;\n\t\tthis.stencilFuncMask = 0xff;\n\t\tthis.stencilFail = KeepStencilOp;\n\t\tthis.stencilZFail = KeepStencilOp;\n\t\tthis.stencilZPass = KeepStencilOp;\n\t\tthis.stencilWrite = false;\n\n\t\tthis.clippingPlanes = null;\n\t\tthis.clipIntersection = false;\n\t\tthis.clipShadows = false;\n\n\t\tthis.shadowSide = null;\n\n\t\tthis.colorWrite = true;\n\n\t\tthis.precision = null; // override the renderer's default precision for this material\n\n\t\tthis.polygonOffset = false;\n\t\tthis.polygonOffsetFactor = 0;\n\t\tthis.polygonOffsetUnits = 0;\n\n\t\tthis.dithering = false;\n\n\t\tthis.alphaToCoverage = false;\n\t\tthis.premultipliedAlpha = false;\n\n\t\tthis.visible = true;\n\n\t\tthis.toneMapped = true;\n\n\t\tthis.userData = {};\n\n\t\tthis.version = 0;\n\n\t\tthis._alphaTest = 0;\n\n\t}\n\n\tget alphaTest() {\n\n\t\treturn this._alphaTest;\n\n\t}\n\n\tset alphaTest( value ) {\n\n\t\tif ( this._alphaTest > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._alphaTest = value;\n\n\t}\n\n\tonBuild( /* shaderobject, renderer */ ) {}\n\n\tonBeforeRender( /* renderer, scene, camera, geometry, object, group */ ) {}\n\n\tonBeforeCompile( /* shaderobject, renderer */ ) {}\n\n\tcustomProgramCacheKey() {\n\n\t\treturn this.onBeforeCompile.toString();\n\n\t}\n\n\tsetValues( values ) {\n\n\t\tif ( values === undefined ) return;\n\n\t\tfor ( const key in values ) {\n\n\t\t\tconst newValue = values[ key ];\n\n\t\t\tif ( newValue === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Material: \\'' + key + '\\' parameter is undefined.' );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\t// for backward compatability if shading is set in the constructor\n\t\t\tif ( key === 'shading' ) {\n\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' );\n\t\t\t\tthis.flatShading = ( newValue === FlatShading ) ? true : false;\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst currentValue = this[ key ];\n\n\t\t\tif ( currentValue === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': \\'' + key + '\\' is not a property of this material.' );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( currentValue && currentValue.isColor ) {\n\n\t\t\t\tcurrentValue.set( newValue );\n\n\t\t\t} else if ( ( currentValue && currentValue.isVector3 ) && ( newValue && newValue.isVector3 ) ) {\n\n\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t} else {\n\n\t\t\t\tthis[ key ] = newValue;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst isRoot = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( isRoot ) {\n\n\t\t\tmeta = {\n\t\t\t\ttextures: {},\n\t\t\t\timages: {}\n\t\t\t};\n\n\t\t}\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Material',\n\t\t\t\tgenerator: 'Material.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard Material serialization\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\n\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\tif ( this.color && this.color.isColor ) data.color = this.color.getHex();\n\n\t\tif ( this.roughness !== undefined ) data.roughness = this.roughness;\n\t\tif ( this.metalness !== undefined ) data.metalness = this.metalness;\n\n\t\tif ( this.sheen !== undefined ) data.sheen = this.sheen;\n\t\tif ( this.sheenColor && this.sheenColor.isColor ) data.sheenColor = this.sheenColor.getHex();\n\t\tif ( this.sheenRoughness !== undefined ) data.sheenRoughness = this.sheenRoughness;\n\t\tif ( this.emissive && this.emissive.isColor ) data.emissive = this.emissive.getHex();\n\t\tif ( this.emissiveIntensity && this.emissiveIntensity !== 1 ) data.emissiveIntensity = this.emissiveIntensity;\n\n\t\tif ( this.specular && this.specular.isColor ) data.specular = this.specular.getHex();\n\t\tif ( this.specularIntensity !== undefined ) data.specularIntensity = this.specularIntensity;\n\t\tif ( this.specularColor && this.specularColor.isColor ) data.specularColor = this.specularColor.getHex();\n\t\tif ( this.shininess !== undefined ) data.shininess = this.shininess;\n\t\tif ( this.clearcoat !== undefined ) data.clearcoat = this.clearcoat;\n\t\tif ( this.clearcoatRoughness !== undefined ) data.clearcoatRoughness = this.clearcoatRoughness;\n\n\t\tif ( this.clearcoatMap && this.clearcoatMap.isTexture ) {\n\n\t\t\tdata.clearcoatMap = this.clearcoatMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.clearcoatRoughnessMap && this.clearcoatRoughnessMap.isTexture ) {\n\n\t\t\tdata.clearcoatRoughnessMap = this.clearcoatRoughnessMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.clearcoatNormalMap && this.clearcoatNormalMap.isTexture ) {\n\n\t\t\tdata.clearcoatNormalMap = this.clearcoatNormalMap.toJSON( meta ).uuid;\n\t\t\tdata.clearcoatNormalScale = this.clearcoatNormalScale.toArray();\n\n\t\t}\n\n\t\tif ( this.map && this.map.isTexture ) data.map = this.map.toJSON( meta ).uuid;\n\t\tif ( this.matcap && this.matcap.isTexture ) data.matcap = this.matcap.toJSON( meta ).uuid;\n\t\tif ( this.alphaMap && this.alphaMap.isTexture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid;\n\n\t\tif ( this.lightMap && this.lightMap.isTexture ) {\n\n\t\t\tdata.lightMap = this.lightMap.toJSON( meta ).uuid;\n\t\t\tdata.lightMapIntensity = this.lightMapIntensity;\n\n\t\t}\n\n\t\tif ( this.aoMap && this.aoMap.isTexture ) {\n\n\t\t\tdata.aoMap = this.aoMap.toJSON( meta ).uuid;\n\t\t\tdata.aoMapIntensity = this.aoMapIntensity;\n\n\t\t}\n\n\t\tif ( this.bumpMap && this.bumpMap.isTexture ) {\n\n\t\t\tdata.bumpMap = this.bumpMap.toJSON( meta ).uuid;\n\t\t\tdata.bumpScale = this.bumpScale;\n\n\t\t}\n\n\t\tif ( this.normalMap && this.normalMap.isTexture ) {\n\n\t\t\tdata.normalMap = this.normalMap.toJSON( meta ).uuid;\n\t\t\tdata.normalMapType = this.normalMapType;\n\t\t\tdata.normalScale = this.normalScale.toArray();\n\n\t\t}\n\n\t\tif ( this.displacementMap && this.displacementMap.isTexture ) {\n\n\t\t\tdata.displacementMap = this.displacementMap.toJSON( meta ).uuid;\n\t\t\tdata.displacementScale = this.displacementScale;\n\t\t\tdata.displacementBias = this.displacementBias;\n\n\t\t}\n\n\t\tif ( this.roughnessMap && this.roughnessMap.isTexture ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid;\n\t\tif ( this.metalnessMap && this.metalnessMap.isTexture ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid;\n\n\t\tif ( this.emissiveMap && this.emissiveMap.isTexture ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid;\n\t\tif ( this.specularMap && this.specularMap.isTexture ) data.specularMap = this.specularMap.toJSON( meta ).uuid;\n\t\tif ( this.specularIntensityMap && this.specularIntensityMap.isTexture ) data.specularIntensityMap = this.specularIntensityMap.toJSON( meta ).uuid;\n\t\tif ( this.specularColorMap && this.specularColorMap.isTexture ) data.specularColorMap = this.specularColorMap.toJSON( meta ).uuid;\n\n\t\tif ( this.envMap && this.envMap.isTexture ) {\n\n\t\t\tdata.envMap = this.envMap.toJSON( meta ).uuid;\n\n\t\t\tif ( this.combine !== undefined ) data.combine = this.combine;\n\n\t\t}\n\n\t\tif ( this.envMapIntensity !== undefined ) data.envMapIntensity = this.envMapIntensity;\n\t\tif ( this.reflectivity !== undefined ) data.reflectivity = this.reflectivity;\n\t\tif ( this.refractionRatio !== undefined ) data.refractionRatio = this.refractionRatio;\n\n\t\tif ( this.gradientMap && this.gradientMap.isTexture ) {\n\n\t\t\tdata.gradientMap = this.gradientMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.transmission !== undefined ) data.transmission = this.transmission;\n\t\tif ( this.transmissionMap && this.transmissionMap.isTexture ) data.transmissionMap = this.transmissionMap.toJSON( meta ).uuid;\n\t\tif ( this.thickness !== undefined ) data.thickness = this.thickness;\n\t\tif ( this.thicknessMap && this.thicknessMap.isTexture ) data.thicknessMap = this.thicknessMap.toJSON( meta ).uuid;\n\t\tif ( this.attenuationDistance !== undefined ) data.attenuationDistance = this.attenuationDistance;\n\t\tif ( this.attenuationColor !== undefined ) data.attenuationColor = this.attenuationColor.getHex();\n\n\t\tif ( this.size !== undefined ) data.size = this.size;\n\t\tif ( this.shadowSide !== null ) data.shadowSide = this.shadowSide;\n\t\tif ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation;\n\n\t\tif ( this.blending !== NormalBlending ) data.blending = this.blending;\n\t\tif ( this.side !== FrontSide ) data.side = this.side;\n\t\tif ( this.vertexColors ) data.vertexColors = true;\n\n\t\tif ( this.opacity < 1 ) data.opacity = this.opacity;\n\t\tif ( this.transparent === true ) data.transparent = this.transparent;\n\n\t\tdata.depthFunc = this.depthFunc;\n\t\tdata.depthTest = this.depthTest;\n\t\tdata.depthWrite = this.depthWrite;\n\t\tdata.colorWrite = this.colorWrite;\n\n\t\tdata.stencilWrite = this.stencilWrite;\n\t\tdata.stencilWriteMask = this.stencilWriteMask;\n\t\tdata.stencilFunc = this.stencilFunc;\n\t\tdata.stencilRef = this.stencilRef;\n\t\tdata.stencilFuncMask = this.stencilFuncMask;\n\t\tdata.stencilFail = this.stencilFail;\n\t\tdata.stencilZFail = this.stencilZFail;\n\t\tdata.stencilZPass = this.stencilZPass;\n\n\t\t// rotation (SpriteMaterial)\n\t\tif ( this.rotation && this.rotation !== 0 ) data.rotation = this.rotation;\n\n\t\tif ( this.polygonOffset === true ) data.polygonOffset = true;\n\t\tif ( this.polygonOffsetFactor !== 0 ) data.polygonOffsetFactor = this.polygonOffsetFactor;\n\t\tif ( this.polygonOffsetUnits !== 0 ) data.polygonOffsetUnits = this.polygonOffsetUnits;\n\n\t\tif ( this.linewidth && this.linewidth !== 1 ) data.linewidth = this.linewidth;\n\t\tif ( this.dashSize !== undefined ) data.dashSize = this.dashSize;\n\t\tif ( this.gapSize !== undefined ) data.gapSize = this.gapSize;\n\t\tif ( this.scale !== undefined ) data.scale = this.scale;\n\n\t\tif ( this.dithering === true ) data.dithering = true;\n\n\t\tif ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest;\n\t\tif ( this.alphaToCoverage === true ) data.alphaToCoverage = this.alphaToCoverage;\n\t\tif ( this.premultipliedAlpha === true ) data.premultipliedAlpha = this.premultipliedAlpha;\n\n\t\tif ( this.wireframe === true ) data.wireframe = this.wireframe;\n\t\tif ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth;\n\t\tif ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap;\n\t\tif ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin;\n\n\t\tif ( this.flatShading === true ) data.flatShading = this.flatShading;\n\n\t\tif ( this.visible === false ) data.visible = false;\n\n\t\tif ( this.toneMapped === false ) data.toneMapped = false;\n\n\t\tif ( JSON.stringify( this.userData ) !== '{}' ) data.userData = this.userData;\n\n\t\t// TODO: Copied from Object3D.toJSON\n\n\t\tfunction extractFromCache( cache ) {\n\n\t\t\tconst values = [];\n\n\t\t\tfor ( const key in cache ) {\n\n\t\t\t\tconst data = cache[ key ];\n\t\t\t\tdelete data.metadata;\n\t\t\t\tvalues.push( data );\n\n\t\t\t}\n\n\t\t\treturn values;\n\n\t\t}\n\n\t\tif ( isRoot ) {\n\n\t\t\tconst textures = extractFromCache( meta.textures );\n\t\t\tconst images = extractFromCache( meta.images );\n\n\t\t\tif ( textures.length > 0 ) data.textures = textures;\n\t\t\tif ( images.length > 0 ) data.images = images;\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.fog = source.fog;\n\n\t\tthis.blending = source.blending;\n\t\tthis.side = source.side;\n\t\tthis.vertexColors = source.vertexColors;\n\n\t\tthis.opacity = source.opacity;\n\t\tthis.transparent = source.transparent;\n\n\t\tthis.blendSrc = source.blendSrc;\n\t\tthis.blendDst = source.blendDst;\n\t\tthis.blendEquation = source.blendEquation;\n\t\tthis.blendSrcAlpha = source.blendSrcAlpha;\n\t\tthis.blendDstAlpha = source.blendDstAlpha;\n\t\tthis.blendEquationAlpha = source.blendEquationAlpha;\n\n\t\tthis.depthFunc = source.depthFunc;\n\t\tthis.depthTest = source.depthTest;\n\t\tthis.depthWrite = source.depthWrite;\n\n\t\tthis.stencilWriteMask = source.stencilWriteMask;\n\t\tthis.stencilFunc = source.stencilFunc;\n\t\tthis.stencilRef = source.stencilRef;\n\t\tthis.stencilFuncMask = source.stencilFuncMask;\n\t\tthis.stencilFail = source.stencilFail;\n\t\tthis.stencilZFail = source.stencilZFail;\n\t\tthis.stencilZPass = source.stencilZPass;\n\t\tthis.stencilWrite = source.stencilWrite;\n\n\t\tconst srcPlanes = source.clippingPlanes;\n\t\tlet dstPlanes = null;\n\n\t\tif ( srcPlanes !== null ) {\n\n\t\t\tconst n = srcPlanes.length;\n\t\t\tdstPlanes = new Array( n );\n\n\t\t\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\t\t\tdstPlanes[ i ] = srcPlanes[ i ].clone();\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.clippingPlanes = dstPlanes;\n\t\tthis.clipIntersection = source.clipIntersection;\n\t\tthis.clipShadows = source.clipShadows;\n\n\t\tthis.shadowSide = source.shadowSide;\n\n\t\tthis.colorWrite = source.colorWrite;\n\n\t\tthis.precision = source.precision;\n\n\t\tthis.polygonOffset = source.polygonOffset;\n\t\tthis.polygonOffsetFactor = source.polygonOffsetFactor;\n\t\tthis.polygonOffsetUnits = source.polygonOffsetUnits;\n\n\t\tthis.dithering = source.dithering;\n\n\t\tthis.alphaTest = source.alphaTest;\n\t\tthis.alphaToCoverage = source.alphaToCoverage;\n\t\tthis.premultipliedAlpha = source.premultipliedAlpha;\n\n\t\tthis.visible = source.visible;\n\n\t\tthis.toneMapped = source.toneMapped;\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n}\n\nMaterial.prototype.isMaterial = true;\n\nexport { Material };\n","/**\n * Uniform Utilities\n */\n\nexport function cloneUniforms( src ) {\n\n\tconst dst = {};\n\n\tfor ( const u in src ) {\n\n\t\tdst[ u ] = {};\n\n\t\tfor ( const p in src[ u ] ) {\n\n\t\t\tconst property = src[ u ][ p ];\n\n\t\t\tif ( property && ( property.isColor ||\n\t\t\t\tproperty.isMatrix3 || property.isMatrix4 ||\n\t\t\t\tproperty.isVector2 || property.isVector3 || property.isVector4 ||\n\t\t\t\tproperty.isTexture || property.isQuaternion ) ) {\n\n\t\t\t\tdst[ u ][ p ] = property.clone();\n\n\t\t\t} else if ( Array.isArray( property ) ) {\n\n\t\t\t\tdst[ u ][ p ] = property.slice();\n\n\t\t\t} else {\n\n\t\t\t\tdst[ u ][ p ] = property;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn dst;\n\n}\n\nexport function mergeUniforms( uniforms ) {\n\n\tconst merged = {};\n\n\tfor ( let u = 0; u < uniforms.length; u ++ ) {\n\n\t\tconst tmp = cloneUniforms( uniforms[ u ] );\n\n\t\tfor ( const p in tmp ) {\n\n\t\t\tmerged[ p ] = tmp[ p ];\n\n\t\t}\n\n\t}\n\n\treturn merged;\n\n}\n\n// Legacy\n\nconst UniformsUtils = { clone: cloneUniforms, merge: mergeUniforms };\n\nexport { UniformsUtils };\n","export default /* glsl */`\nvoid main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}\n`;\n","export default /* glsl */`\nvoid main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}\n`;\n","import { Material } from './Material.js';\nimport { cloneUniforms } from '../renderers/shaders/UniformsUtils.js';\n\nimport default_vertex from '../renderers/shaders/ShaderChunk/default_vertex.glsl.js';\nimport default_fragment from '../renderers/shaders/ShaderChunk/default_fragment.glsl.js';\n\n/**\n * parameters = {\n *  defines: { \"label\" : \"value\" },\n *  uniforms: { \"parameter1\": { value: 1.0 }, \"parameter2\": { value2: 2 } },\n *\n *  fragmentShader: <string>,\n *  vertexShader: <string>,\n *\n *  wireframe: <boolean>,\n *  wireframeLinewidth: <float>,\n *\n *  lights: <bool>\n * }\n */\n\nclass ShaderMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ShaderMaterial';\n\n\t\tthis.defines = {};\n\t\tthis.uniforms = {};\n\n\t\tthis.vertexShader = default_vertex;\n\t\tthis.fragmentShader = default_fragment;\n\n\t\tthis.linewidth = 1;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.fog = false; // set to use scene fog\n\t\tthis.lights = false; // set to use scene lights\n\t\tthis.clipping = false; // set to use user-defined clipping planes\n\n\t\tthis.extensions = {\n\t\t\tderivatives: false, // set to use derivatives\n\t\t\tfragDepth: false, // set to use fragment depth values\n\t\t\tdrawBuffers: false, // set to use draw buffers\n\t\t\tshaderTextureLOD: false // set to use shader texture LOD\n\t\t};\n\n\t\t// When rendered geometry doesn't include these attributes but the material does,\n\t\t// use these default values in WebGL. This avoids errors when buffer data is missing.\n\t\tthis.defaultAttributeValues = {\n\t\t\t'color': [ 1, 1, 1 ],\n\t\t\t'uv': [ 0, 0 ],\n\t\t\t'uv2': [ 0, 0 ]\n\t\t};\n\n\t\tthis.index0AttributeName = undefined;\n\t\tthis.uniformsNeedUpdate = false;\n\n\t\tthis.glslVersion = null;\n\n\t\tif ( parameters !== undefined ) {\n\n\t\t\tif ( parameters.attributes !== undefined ) {\n\n\t\t\t\tconsole.error( 'THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.' );\n\n\t\t\t}\n\n\t\t\tthis.setValues( parameters );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.fragmentShader = source.fragmentShader;\n\t\tthis.vertexShader = source.vertexShader;\n\n\t\tthis.uniforms = cloneUniforms( source.uniforms );\n\n\t\tthis.defines = Object.assign( {}, source.defines );\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.lights = source.lights;\n\t\tthis.clipping = source.clipping;\n\n\t\tthis.extensions = Object.assign( {}, source.extensions );\n\n\t\tthis.glslVersion = source.glslVersion;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.glslVersion = this.glslVersion;\n\t\tdata.uniforms = {};\n\n\t\tfor ( const name in this.uniforms ) {\n\n\t\t\tconst uniform = this.uniforms[ name ];\n\t\t\tconst value = uniform.value;\n\n\t\t\tif ( value && value.isTexture ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 't',\n\t\t\t\t\tvalue: value.toJSON( meta ).uuid\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isColor ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'c',\n\t\t\t\t\tvalue: value.getHex()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector2 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v2',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector3 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v3',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector4 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v4',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isMatrix3 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'm3',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isMatrix4 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'm4',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\tvalue: value\n\t\t\t\t};\n\n\t\t\t\t// note: the array variants v2v, v3v, v4v, m4v and tv are not supported so far\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( Object.keys( this.defines ).length > 0 ) data.defines = this.defines;\n\n\t\tdata.vertexShader = this.vertexShader;\n\t\tdata.fragmentShader = this.fragmentShader;\n\n\t\tconst extensions = {};\n\n\t\tfor ( const key in this.extensions ) {\n\n\t\t\tif ( this.extensions[ key ] === true ) extensions[ key ] = true;\n\n\t\t}\n\n\t\tif ( Object.keys( extensions ).length > 0 ) data.extensions = extensions;\n\n\t\treturn data;\n\n\t}\n\n}\n\nShaderMaterial.prototype.isShaderMaterial = true;\n\nexport { ShaderMaterial };\n","import { Vector3 } from './Vector3.js';\n\nconst _vector = /*@__PURE__*/ new Vector3();\nconst _segCenter = /*@__PURE__*/ new Vector3();\nconst _segDir = /*@__PURE__*/ new Vector3();\nconst _diff = /*@__PURE__*/ new Vector3();\n\nconst _edge1 = /*@__PURE__*/ new Vector3();\nconst _edge2 = /*@__PURE__*/ new Vector3();\nconst _normal = /*@__PURE__*/ new Vector3();\n\nclass Ray {\n\n\tconstructor( origin = new Vector3(), direction = new Vector3( 0, 0, - 1 ) ) {\n\n\t\tthis.origin = origin;\n\t\tthis.direction = direction;\n\n\t}\n\n\tset( origin, direction ) {\n\n\t\tthis.origin.copy( origin );\n\t\tthis.direction.copy( direction );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( ray ) {\n\n\t\tthis.origin.copy( ray.origin );\n\t\tthis.direction.copy( ray.direction );\n\n\t\treturn this;\n\n\t}\n\n\tat( t, target ) {\n\n\t\treturn target.copy( this.direction ).multiplyScalar( t ).add( this.origin );\n\n\t}\n\n\tlookAt( v ) {\n\n\t\tthis.direction.copy( v ).sub( this.origin ).normalize();\n\n\t\treturn this;\n\n\t}\n\n\trecast( t ) {\n\n\t\tthis.origin.copy( this.at( t, _vector ) );\n\n\t\treturn this;\n\n\t}\n\n\tclosestPointToPoint( point, target ) {\n\n\t\ttarget.subVectors( point, this.origin );\n\n\t\tconst directionDistance = target.dot( this.direction );\n\n\t\tif ( directionDistance < 0 ) {\n\n\t\t\treturn target.copy( this.origin );\n\n\t\t}\n\n\t\treturn target.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\treturn Math.sqrt( this.distanceSqToPoint( point ) );\n\n\t}\n\n\tdistanceSqToPoint( point ) {\n\n\t\tconst directionDistance = _vector.subVectors( point, this.origin ).dot( this.direction );\n\n\t\t// point behind the ray\n\n\t\tif ( directionDistance < 0 ) {\n\n\t\t\treturn this.origin.distanceToSquared( point );\n\n\t\t}\n\n\t\t_vector.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t\treturn _vector.distanceToSquared( point );\n\n\t}\n\n\tdistanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) {\n\n\t\t// from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteDistRaySegment.h\n\t\t// It returns the min distance between the ray and the segment\n\t\t// defined by v0 and v1\n\t\t// It can also set two optional targets :\n\t\t// - The closest point on the ray\n\t\t// - The closest point on the segment\n\n\t\t_segCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 );\n\t\t_segDir.copy( v1 ).sub( v0 ).normalize();\n\t\t_diff.copy( this.origin ).sub( _segCenter );\n\n\t\tconst segExtent = v0.distanceTo( v1 ) * 0.5;\n\t\tconst a01 = - this.direction.dot( _segDir );\n\t\tconst b0 = _diff.dot( this.direction );\n\t\tconst b1 = - _diff.dot( _segDir );\n\t\tconst c = _diff.lengthSq();\n\t\tconst det = Math.abs( 1 - a01 * a01 );\n\t\tlet s0, s1, sqrDist, extDet;\n\n\t\tif ( det > 0 ) {\n\n\t\t\t// The ray and segment are not parallel.\n\n\t\t\ts0 = a01 * b1 - b0;\n\t\t\ts1 = a01 * b0 - b1;\n\t\t\textDet = segExtent * det;\n\n\t\t\tif ( s0 >= 0 ) {\n\n\t\t\t\tif ( s1 >= - extDet ) {\n\n\t\t\t\t\tif ( s1 <= extDet ) {\n\n\t\t\t\t\t\t// region 0\n\t\t\t\t\t\t// Minimum at interior points of ray and segment.\n\n\t\t\t\t\t\tconst invDet = 1 / det;\n\t\t\t\t\t\ts0 *= invDet;\n\t\t\t\t\t\ts1 *= invDet;\n\t\t\t\t\t\tsqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// region 1\n\n\t\t\t\t\t\ts1 = segExtent;\n\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// region 5\n\n\t\t\t\t\ts1 = - segExtent;\n\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( s1 <= - extDet ) {\n\n\t\t\t\t\t// region 4\n\n\t\t\t\t\ts0 = Math.max( 0, - ( - a01 * segExtent + b0 ) );\n\t\t\t\t\ts1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t} else if ( s1 <= extDet ) {\n\n\t\t\t\t\t// region 3\n\n\t\t\t\t\ts0 = 0;\n\t\t\t\t\ts1 = Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// region 2\n\n\t\t\t\t\ts0 = Math.max( 0, - ( a01 * segExtent + b0 ) );\n\t\t\t\t\ts1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// Ray and segment are parallel.\n\n\t\t\ts1 = ( a01 > 0 ) ? - segExtent : segExtent;\n\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t}\n\n\t\tif ( optionalPointOnRay ) {\n\n\t\t\toptionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin );\n\n\t\t}\n\n\t\tif ( optionalPointOnSegment ) {\n\n\t\t\toptionalPointOnSegment.copy( _segDir ).multiplyScalar( s1 ).add( _segCenter );\n\n\t\t}\n\n\t\treturn sqrDist;\n\n\t}\n\n\tintersectSphere( sphere, target ) {\n\n\t\t_vector.subVectors( sphere.center, this.origin );\n\t\tconst tca = _vector.dot( this.direction );\n\t\tconst d2 = _vector.dot( _vector ) - tca * tca;\n\t\tconst radius2 = sphere.radius * sphere.radius;\n\n\t\tif ( d2 > radius2 ) return null;\n\n\t\tconst thc = Math.sqrt( radius2 - d2 );\n\n\t\t// t0 = first intersect point - entrance on front of sphere\n\t\tconst t0 = tca - thc;\n\n\t\t// t1 = second intersect point - exit point on back of sphere\n\t\tconst t1 = tca + thc;\n\n\t\t// test to see if both t0 and t1 are behind the ray - if so, return null\n\t\tif ( t0 < 0 && t1 < 0 ) return null;\n\n\t\t// test to see if t0 is behind the ray:\n\t\t// if it is, the ray is inside the sphere, so return the second exit point scaled by t1,\n\t\t// in order to always return an intersect point that is in front of the ray.\n\t\tif ( t0 < 0 ) return this.at( t1, target );\n\n\t\t// else t0 is in front of the ray, so return the first collision point scaled by t0\n\t\treturn this.at( t0, target );\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\treturn this.distanceSqToPoint( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t}\n\n\tdistanceToPlane( plane ) {\n\n\t\tconst denominator = plane.normal.dot( this.direction );\n\n\t\tif ( denominator === 0 ) {\n\n\t\t\t// line is coplanar, return origin\n\t\t\tif ( plane.distanceToPoint( this.origin ) === 0 ) {\n\n\t\t\t\treturn 0;\n\n\t\t\t}\n\n\t\t\t// Null is preferable to undefined since undefined means.... it is undefined\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator;\n\n\t\t// Return if the ray never intersects the plane\n\n\t\treturn t >= 0 ? t : null;\n\n\t}\n\n\tintersectPlane( plane, target ) {\n\n\t\tconst t = this.distanceToPlane( plane );\n\n\t\tif ( t === null ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\treturn this.at( t, target );\n\n\t}\n\n\tintersectsPlane( plane ) {\n\n\t\t// check if the ray lies on the plane first\n\n\t\tconst distToPoint = plane.distanceToPoint( this.origin );\n\n\t\tif ( distToPoint === 0 ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tconst denominator = plane.normal.dot( this.direction );\n\n\t\tif ( denominator * distToPoint < 0 ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\t// ray origin is behind the plane (and is pointing behind it)\n\n\t\treturn false;\n\n\t}\n\n\tintersectBox( box, target ) {\n\n\t\tlet tmin, tmax, tymin, tymax, tzmin, tzmax;\n\n\t\tconst invdirx = 1 / this.direction.x,\n\t\t\tinvdiry = 1 / this.direction.y,\n\t\t\tinvdirz = 1 / this.direction.z;\n\n\t\tconst origin = this.origin;\n\n\t\tif ( invdirx >= 0 ) {\n\n\t\t\ttmin = ( box.min.x - origin.x ) * invdirx;\n\t\t\ttmax = ( box.max.x - origin.x ) * invdirx;\n\n\t\t} else {\n\n\t\t\ttmin = ( box.max.x - origin.x ) * invdirx;\n\t\t\ttmax = ( box.min.x - origin.x ) * invdirx;\n\n\t\t}\n\n\t\tif ( invdiry >= 0 ) {\n\n\t\t\ttymin = ( box.min.y - origin.y ) * invdiry;\n\t\t\ttymax = ( box.max.y - origin.y ) * invdiry;\n\n\t\t} else {\n\n\t\t\ttymin = ( box.max.y - origin.y ) * invdiry;\n\t\t\ttymax = ( box.min.y - origin.y ) * invdiry;\n\n\t\t}\n\n\t\tif ( ( tmin > tymax ) || ( tymin > tmax ) ) return null;\n\n\t\t// These lines also handle the case where tmin or tmax is NaN\n\t\t// (result of 0 * Infinity). x !== x returns true if x is NaN\n\n\t\tif ( tymin > tmin || tmin !== tmin ) tmin = tymin;\n\n\t\tif ( tymax < tmax || tmax !== tmax ) tmax = tymax;\n\n\t\tif ( invdirz >= 0 ) {\n\n\t\t\ttzmin = ( box.min.z - origin.z ) * invdirz;\n\t\t\ttzmax = ( box.max.z - origin.z ) * invdirz;\n\n\t\t} else {\n\n\t\t\ttzmin = ( box.max.z - origin.z ) * invdirz;\n\t\t\ttzmax = ( box.min.z - origin.z ) * invdirz;\n\n\t\t}\n\n\t\tif ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null;\n\n\t\tif ( tzmin > tmin || tmin !== tmin ) tmin = tzmin;\n\n\t\tif ( tzmax < tmax || tmax !== tmax ) tmax = tzmax;\n\n\t\t//return point closest to the ray (positive side)\n\n\t\tif ( tmax < 0 ) return null;\n\n\t\treturn this.at( tmin >= 0 ? tmin : tmax, target );\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\treturn this.intersectBox( box, _vector ) !== null;\n\n\t}\n\n\tintersectTriangle( a, b, c, backfaceCulling, target ) {\n\n\t\t// Compute the offset origin, edges, and normal.\n\n\t\t// from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h\n\n\t\t_edge1.subVectors( b, a );\n\t\t_edge2.subVectors( c, a );\n\t\t_normal.crossVectors( _edge1, _edge2 );\n\n\t\t// Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,\n\t\t// E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by\n\t\t//   |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))\n\t\t//   |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))\n\t\t//   |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)\n\t\tlet DdN = this.direction.dot( _normal );\n\t\tlet sign;\n\n\t\tif ( DdN > 0 ) {\n\n\t\t\tif ( backfaceCulling ) return null;\n\t\t\tsign = 1;\n\n\t\t} else if ( DdN < 0 ) {\n\n\t\t\tsign = - 1;\n\t\t\tDdN = - DdN;\n\n\t\t} else {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t_diff.subVectors( this.origin, a );\n\t\tconst DdQxE2 = sign * this.direction.dot( _edge2.crossVectors( _diff, _edge2 ) );\n\n\t\t// b1 < 0, no intersection\n\t\tif ( DdQxE2 < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst DdE1xQ = sign * this.direction.dot( _edge1.cross( _diff ) );\n\n\t\t// b2 < 0, no intersection\n\t\tif ( DdE1xQ < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// b1+b2 > 1, no intersection\n\t\tif ( DdQxE2 + DdE1xQ > DdN ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// Line intersects triangle, check if ray does.\n\t\tconst QdN = - sign * _diff.dot( _normal );\n\n\t\t// t < 0, no intersection\n\t\tif ( QdN < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// Ray intersects triangle.\n\t\treturn this.at( QdN / DdN, target );\n\n\t}\n\n\tapplyMatrix4( matrix4 ) {\n\n\t\tthis.origin.applyMatrix4( matrix4 );\n\t\tthis.direction.transformDirection( matrix4 );\n\n\t\treturn this;\n\n\t}\n\n\tequals( ray ) {\n\n\t\treturn ray.origin.equals( this.origin ) && ray.direction.equals( this.direction );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nexport { Ray };\n","import { Vector3 } from './Vector3.js';\n\nconst _v0 = /*@__PURE__*/ new Vector3();\nconst _v1 = /*@__PURE__*/ new Vector3();\nconst _v2 = /*@__PURE__*/ new Vector3();\nconst _v3 = /*@__PURE__*/ new Vector3();\n\nconst _vab = /*@__PURE__*/ new Vector3();\nconst _vac = /*@__PURE__*/ new Vector3();\nconst _vbc = /*@__PURE__*/ new Vector3();\nconst _vap = /*@__PURE__*/ new Vector3();\nconst _vbp = /*@__PURE__*/ new Vector3();\nconst _vcp = /*@__PURE__*/ new Vector3();\n\nclass Triangle {\n\n\tconstructor( a = new Vector3(), b = new Vector3(), c = new Vector3() ) {\n\n\t\tthis.a = a;\n\t\tthis.b = b;\n\t\tthis.c = c;\n\n\t}\n\n\tstatic getNormal( a, b, c, target ) {\n\n\t\ttarget.subVectors( c, b );\n\t\t_v0.subVectors( a, b );\n\t\ttarget.cross( _v0 );\n\n\t\tconst targetLengthSq = target.lengthSq();\n\t\tif ( targetLengthSq > 0 ) {\n\n\t\t\treturn target.multiplyScalar( 1 / Math.sqrt( targetLengthSq ) );\n\n\t\t}\n\n\t\treturn target.set( 0, 0, 0 );\n\n\t}\n\n\t// static/instance method to calculate barycentric coordinates\n\t// based on: http://www.blackpawn.com/texts/pointinpoly/default.html\n\tstatic getBarycoord( point, a, b, c, target ) {\n\n\t\t_v0.subVectors( c, a );\n\t\t_v1.subVectors( b, a );\n\t\t_v2.subVectors( point, a );\n\n\t\tconst dot00 = _v0.dot( _v0 );\n\t\tconst dot01 = _v0.dot( _v1 );\n\t\tconst dot02 = _v0.dot( _v2 );\n\t\tconst dot11 = _v1.dot( _v1 );\n\t\tconst dot12 = _v1.dot( _v2 );\n\n\t\tconst denom = ( dot00 * dot11 - dot01 * dot01 );\n\n\t\t// collinear or singular triangle\n\t\tif ( denom === 0 ) {\n\n\t\t\t// arbitrary location outside of triangle?\n\t\t\t// not sure if this is the best idea, maybe should be returning undefined\n\t\t\treturn target.set( - 2, - 1, - 1 );\n\n\t\t}\n\n\t\tconst invDenom = 1 / denom;\n\t\tconst u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;\n\t\tconst v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;\n\n\t\t// barycentric coordinates must always sum to 1\n\t\treturn target.set( 1 - u - v, v, u );\n\n\t}\n\n\tstatic containsPoint( point, a, b, c ) {\n\n\t\tthis.getBarycoord( point, a, b, c, _v3 );\n\n\t\treturn ( _v3.x >= 0 ) && ( _v3.y >= 0 ) && ( ( _v3.x + _v3.y ) <= 1 );\n\n\t}\n\n\tstatic getUV( point, p1, p2, p3, uv1, uv2, uv3, target ) {\n\n\t\tthis.getBarycoord( point, p1, p2, p3, _v3 );\n\n\t\ttarget.set( 0, 0 );\n\t\ttarget.addScaledVector( uv1, _v3.x );\n\t\ttarget.addScaledVector( uv2, _v3.y );\n\t\ttarget.addScaledVector( uv3, _v3.z );\n\n\t\treturn target;\n\n\t}\n\n\tstatic isFrontFacing( a, b, c, direction ) {\n\n\t\t_v0.subVectors( c, b );\n\t\t_v1.subVectors( a, b );\n\n\t\t// strictly front facing\n\t\treturn ( _v0.cross( _v1 ).dot( direction ) < 0 ) ? true : false;\n\n\t}\n\n\tset( a, b, c ) {\n\n\t\tthis.a.copy( a );\n\t\tthis.b.copy( b );\n\t\tthis.c.copy( c );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPointsAndIndices( points, i0, i1, i2 ) {\n\n\t\tthis.a.copy( points[ i0 ] );\n\t\tthis.b.copy( points[ i1 ] );\n\t\tthis.c.copy( points[ i2 ] );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromAttributeAndIndices( attribute, i0, i1, i2 ) {\n\n\t\tthis.a.fromBufferAttribute( attribute, i0 );\n\t\tthis.b.fromBufferAttribute( attribute, i1 );\n\t\tthis.c.fromBufferAttribute( attribute, i2 );\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( triangle ) {\n\n\t\tthis.a.copy( triangle.a );\n\t\tthis.b.copy( triangle.b );\n\t\tthis.c.copy( triangle.c );\n\n\t\treturn this;\n\n\t}\n\n\tgetArea() {\n\n\t\t_v0.subVectors( this.c, this.b );\n\t\t_v1.subVectors( this.a, this.b );\n\n\t\treturn _v0.cross( _v1 ).length() * 0.5;\n\n\t}\n\n\tgetMidpoint( target ) {\n\n\t\treturn target.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 );\n\n\t}\n\n\tgetNormal( target ) {\n\n\t\treturn Triangle.getNormal( this.a, this.b, this.c, target );\n\n\t}\n\n\tgetPlane( target ) {\n\n\t\treturn target.setFromCoplanarPoints( this.a, this.b, this.c );\n\n\t}\n\n\tgetBarycoord( point, target ) {\n\n\t\treturn Triangle.getBarycoord( point, this.a, this.b, this.c, target );\n\n\t}\n\n\tgetUV( point, uv1, uv2, uv3, target ) {\n\n\t\treturn Triangle.getUV( point, this.a, this.b, this.c, uv1, uv2, uv3, target );\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\treturn Triangle.containsPoint( point, this.a, this.b, this.c );\n\n\t}\n\n\tisFrontFacing( direction ) {\n\n\t\treturn Triangle.isFrontFacing( this.a, this.b, this.c, direction );\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsTriangle( this );\n\n\t}\n\n\tclosestPointToPoint( p, target ) {\n\n\t\tconst a = this.a, b = this.b, c = this.c;\n\t\tlet v, w;\n\n\t\t// algorithm thanks to Real-Time Collision Detection by Christer Ericson,\n\t\t// published by Morgan Kaufmann Publishers, (c) 2005 Elsevier Inc.,\n\t\t// under the accompanying license; see chapter 5.1.5 for detailed explanation.\n\t\t// basically, we're distinguishing which of the voronoi regions of the triangle\n\t\t// the point lies in with the minimum amount of redundant computation.\n\n\t\t_vab.subVectors( b, a );\n\t\t_vac.subVectors( c, a );\n\t\t_vap.subVectors( p, a );\n\t\tconst d1 = _vab.dot( _vap );\n\t\tconst d2 = _vac.dot( _vap );\n\t\tif ( d1 <= 0 && d2 <= 0 ) {\n\n\t\t\t// vertex region of A; barycentric coords (1, 0, 0)\n\t\t\treturn target.copy( a );\n\n\t\t}\n\n\t\t_vbp.subVectors( p, b );\n\t\tconst d3 = _vab.dot( _vbp );\n\t\tconst d4 = _vac.dot( _vbp );\n\t\tif ( d3 >= 0 && d4 <= d3 ) {\n\n\t\t\t// vertex region of B; barycentric coords (0, 1, 0)\n\t\t\treturn target.copy( b );\n\n\t\t}\n\n\t\tconst vc = d1 * d4 - d3 * d2;\n\t\tif ( vc <= 0 && d1 >= 0 && d3 <= 0 ) {\n\n\t\t\tv = d1 / ( d1 - d3 );\n\t\t\t// edge region of AB; barycentric coords (1-v, v, 0)\n\t\t\treturn target.copy( a ).addScaledVector( _vab, v );\n\n\t\t}\n\n\t\t_vcp.subVectors( p, c );\n\t\tconst d5 = _vab.dot( _vcp );\n\t\tconst d6 = _vac.dot( _vcp );\n\t\tif ( d6 >= 0 && d5 <= d6 ) {\n\n\t\t\t// vertex region of C; barycentric coords (0, 0, 1)\n\t\t\treturn target.copy( c );\n\n\t\t}\n\n\t\tconst vb = d5 * d2 - d1 * d6;\n\t\tif ( vb <= 0 && d2 >= 0 && d6 <= 0 ) {\n\n\t\t\tw = d2 / ( d2 - d6 );\n\t\t\t// edge region of AC; barycentric coords (1-w, 0, w)\n\t\t\treturn target.copy( a ).addScaledVector( _vac, w );\n\n\t\t}\n\n\t\tconst va = d3 * d6 - d5 * d4;\n\t\tif ( va <= 0 && ( d4 - d3 ) >= 0 && ( d5 - d6 ) >= 0 ) {\n\n\t\t\t_vbc.subVectors( c, b );\n\t\t\tw = ( d4 - d3 ) / ( ( d4 - d3 ) + ( d5 - d6 ) );\n\t\t\t// edge region of BC; barycentric coords (0, 1-w, w)\n\t\t\treturn target.copy( b ).addScaledVector( _vbc, w ); // edge region of BC\n\n\t\t}\n\n\t\t// face region\n\t\tconst denom = 1 / ( va + vb + vc );\n\t\t// u = va * denom\n\t\tv = vb * denom;\n\t\tw = vc * denom;\n\n\t\treturn target.copy( a ).addScaledVector( _vab, v ).addScaledVector( _vac, w );\n\n\t}\n\n\tequals( triangle ) {\n\n\t\treturn triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c );\n\n\t}\n\n}\n\nexport { Triangle };\n","import { Material } from './Material.js';\nimport { MultiplyOperation } from '../constants.js';\nimport { Color } from '../math/Color.js';\n\n/**\n * parameters = {\n *  color: <hex>,\n *  opacity: <float>,\n *  map: new THREE.Texture( <Image> ),\n *\n *  lightMap: new THREE.Texture( <Image> ),\n *  lightMapIntensity: <float>\n *\n *  aoMap: new THREE.Texture( <Image> ),\n *  aoMapIntensity: <float>\n *\n *  specularMap: new THREE.Texture( <Image> ),\n *\n *  alphaMap: new THREE.Texture( <Image> ),\n *\n *  envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),\n *  combine: THREE.Multiply,\n *  reflectivity: <float>,\n *  refractionRatio: <float>,\n *\n *  depthTest: <bool>,\n *  depthWrite: <bool>,\n *\n *  wireframe: <boolean>,\n *  wireframeLinewidth: <float>,\n * }\n */\n\nclass MeshBasicMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'MeshBasicMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // emissive\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.specularMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.combine = MultiplyOperation;\n\t\tthis.reflectivity = 1;\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\treturn this;\n\n\t}\n\n}\n\nMeshBasicMaterial.prototype.isMeshBasicMaterial = true;\n\nexport { MeshBasicMaterial };\n","import { Vector3 } from '../math/Vector3.js';\nimport { Vector2 } from '../math/Vector2.js';\nimport { Sphere } from '../math/Sphere.js';\nimport { Ray } from '../math/Ray.js';\nimport { Matrix4 } from '../math/Matrix4.js';\nimport { Object3D } from '../core/Object3D.js';\nimport { Triangle } from '../math/Triangle.js';\nimport { DoubleSide, BackSide } from '../constants.js';\nimport { MeshBasicMaterial } from '../materials/MeshBasicMaterial.js';\nimport { BufferGeometry } from '../core/BufferGeometry.js';\n\nconst _inverseMatrix = /*@__PURE__*/ new Matrix4();\nconst _ray = /*@__PURE__*/ new Ray();\nconst _sphere = /*@__PURE__*/ new Sphere();\n\nconst _vA = /*@__PURE__*/ new Vector3();\nconst _vB = /*@__PURE__*/ new Vector3();\nconst _vC = /*@__PURE__*/ new Vector3();\n\nconst _tempA = /*@__PURE__*/ new Vector3();\nconst _tempB = /*@__PURE__*/ new Vector3();\nconst _tempC = /*@__PURE__*/ new Vector3();\n\nconst _morphA = /*@__PURE__*/ new Vector3();\nconst _morphB = /*@__PURE__*/ new Vector3();\nconst _morphC = /*@__PURE__*/ new Vector3();\n\nconst _uvA = /*@__PURE__*/ new Vector2();\nconst _uvB = /*@__PURE__*/ new Vector2();\nconst _uvC = /*@__PURE__*/ new Vector2();\n\nconst _intersectionPoint = /*@__PURE__*/ new Vector3();\nconst _intersectionPointWorld = /*@__PURE__*/ new Vector3();\n\nclass Mesh extends Object3D {\n\n\tconstructor( geometry = new BufferGeometry(), material = new MeshBasicMaterial() ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'Mesh';\n\n\t\tthis.geometry = geometry;\n\t\tthis.material = material;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tif ( source.morphTargetInfluences !== undefined ) {\n\n\t\t\tthis.morphTargetInfluences = source.morphTargetInfluences.slice();\n\n\t\t}\n\n\t\tif ( source.morphTargetDictionary !== undefined ) {\n\n\t\t\tthis.morphTargetDictionary = Object.assign( {}, source.morphTargetDictionary );\n\n\t\t}\n\n\t\tthis.material = source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t}\n\n\tupdateMorphTargets() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\tconst morphAttributes = geometry.morphAttributes;\n\t\t\tconst keys = Object.keys( morphAttributes );\n\n\t\t\tif ( keys.length > 0 ) {\n\n\t\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst morphTargets = geometry.morphTargets;\n\n\t\t\tif ( morphTargets !== undefined && morphTargets.length > 0 ) {\n\n\t\t\t\tconsole.error( 'THREE.Mesh.updateMorphTargets() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst material = this.material;\n\t\tconst matrixWorld = this.matrixWorld;\n\n\t\tif ( material === undefined ) return;\n\n\t\t// Checking boundingSphere distance to ray\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere.copy( geometry.boundingSphere );\n\t\t_sphere.applyMatrix4( matrixWorld );\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere ) === false ) return;\n\n\t\t//\n\n\t\t_inverseMatrix.copy( matrixWorld ).invert();\n\t\t_ray.copy( raycaster.ray ).applyMatrix4( _inverseMatrix );\n\n\t\t// Check boundingBox before continuing\n\n\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\tif ( _ray.intersectsBox( geometry.boundingBox ) === false ) return;\n\n\t\t}\n\n\t\tlet intersection;\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\tconst index = geometry.index;\n\t\t\tconst position = geometry.attributes.position;\n\t\t\tconst morphPosition = geometry.morphAttributes.position;\n\t\t\tconst morphTargetsRelative = geometry.morphTargetsRelative;\n\t\t\tconst uv = geometry.attributes.uv;\n\t\t\tconst uv2 = geometry.attributes.uv2;\n\t\t\tconst groups = geometry.groups;\n\t\t\tconst drawRange = geometry.drawRange;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\t// indexed buffer geometry\n\n\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\tfor ( let i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\tconst start = Math.max( group.start, drawRange.start );\n\t\t\t\t\t\tconst end = Math.min( index.count, Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ) );\n\n\t\t\t\t\t\tfor ( let j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\t\t\tconst a = index.getX( j );\n\t\t\t\t\t\t\tconst b = index.getX( j + 1 );\n\t\t\t\t\t\t\tconst c = index.getX( j + 2 );\n\n\t\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, groupMaterial, raycaster, _ray, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c );\n\n\t\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( j / 3 ); // triangle number in indexed buffer semantics\n\t\t\t\t\t\t\t\tintersection.face.materialIndex = group.materialIndex;\n\t\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\t\tfor ( let i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\t\t\tconst a = index.getX( i );\n\t\t\t\t\t\tconst b = index.getX( i + 1 );\n\t\t\t\t\t\tconst c = index.getX( i + 2 );\n\n\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, material, raycaster, _ray, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in indexed buffer semantics\n\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( position !== undefined ) {\n\n\t\t\t\t// non-indexed buffer geometry\n\n\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\tfor ( let i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\tconst start = Math.max( group.start, drawRange.start );\n\t\t\t\t\t\tconst end = Math.min( position.count, Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ) );\n\n\t\t\t\t\t\tfor ( let j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\t\t\tconst a = j;\n\t\t\t\t\t\t\tconst b = j + 1;\n\t\t\t\t\t\t\tconst c = j + 2;\n\n\t\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, groupMaterial, raycaster, _ray, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c );\n\n\t\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( j / 3 ); // triangle number in non-indexed buffer semantics\n\t\t\t\t\t\t\t\tintersection.face.materialIndex = group.materialIndex;\n\t\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\t\tconst end = Math.min( position.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\t\tfor ( let i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\t\t\tconst a = i;\n\t\t\t\t\t\tconst b = i + 1;\n\t\t\t\t\t\tconst c = i + 2;\n\n\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, material, raycaster, _ray, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in non-indexed buffer semantics\n\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\tconsole.error( 'THREE.Mesh.raycast() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' );\n\n\t\t}\n\n\t}\n\n}\n\nMesh.prototype.isMesh = true;\n\nfunction checkIntersection( object, material, raycaster, ray, pA, pB, pC, point ) {\n\n\tlet intersect;\n\n\tif ( material.side === BackSide ) {\n\n\t\tintersect = ray.intersectTriangle( pC, pB, pA, true, point );\n\n\t} else {\n\n\t\tintersect = ray.intersectTriangle( pA, pB, pC, material.side !== DoubleSide, point );\n\n\t}\n\n\tif ( intersect === null ) return null;\n\n\t_intersectionPointWorld.copy( point );\n\t_intersectionPointWorld.applyMatrix4( object.matrixWorld );\n\n\tconst distance = raycaster.ray.origin.distanceTo( _intersectionPointWorld );\n\n\tif ( distance < raycaster.near || distance > raycaster.far ) return null;\n\n\treturn {\n\t\tdistance: distance,\n\t\tpoint: _intersectionPointWorld.clone(),\n\t\tobject: object\n\t};\n\n}\n\nfunction checkBufferGeometryIntersection( object, material, raycaster, ray, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c ) {\n\n\t_vA.fromBufferAttribute( position, a );\n\t_vB.fromBufferAttribute( position, b );\n\t_vC.fromBufferAttribute( position, c );\n\n\tconst morphInfluences = object.morphTargetInfluences;\n\n\tif ( morphPosition && morphInfluences ) {\n\n\t\t_morphA.set( 0, 0, 0 );\n\t\t_morphB.set( 0, 0, 0 );\n\t\t_morphC.set( 0, 0, 0 );\n\n\t\tfor ( let i = 0, il = morphPosition.length; i < il; i ++ ) {\n\n\t\t\tconst influence = morphInfluences[ i ];\n\t\t\tconst morphAttribute = morphPosition[ i ];\n\n\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t_tempA.fromBufferAttribute( morphAttribute, a );\n\t\t\t_tempB.fromBufferAttribute( morphAttribute, b );\n\t\t\t_tempC.fromBufferAttribute( morphAttribute, c );\n\n\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t_morphA.addScaledVector( _tempA, influence );\n\t\t\t\t_morphB.addScaledVector( _tempB, influence );\n\t\t\t\t_morphC.addScaledVector( _tempC, influence );\n\n\t\t\t} else {\n\n\t\t\t\t_morphA.addScaledVector( _tempA.sub( _vA ), influence );\n\t\t\t\t_morphB.addScaledVector( _tempB.sub( _vB ), influence );\n\t\t\t\t_morphC.addScaledVector( _tempC.sub( _vC ), influence );\n\n\t\t\t}\n\n\t\t}\n\n\t\t_vA.add( _morphA );\n\t\t_vB.add( _morphB );\n\t\t_vC.add( _morphC );\n\n\t}\n\n\tif ( object.isSkinnedMesh ) {\n\n\t\tobject.boneTransform( a, _vA );\n\t\tobject.boneTransform( b, _vB );\n\t\tobject.boneTransform( c, _vC );\n\n\t}\n\n\tconst intersection = checkIntersection( object, material, raycaster, ray, _vA, _vB, _vC, _intersectionPoint );\n\n\tif ( intersection ) {\n\n\t\tif ( uv ) {\n\n\t\t\t_uvA.fromBufferAttribute( uv, a );\n\t\t\t_uvB.fromBufferAttribute( uv, b );\n\t\t\t_uvC.fromBufferAttribute( uv, c );\n\n\t\t\tintersection.uv = Triangle.getUV( _intersectionPoint, _vA, _vB, _vC, _uvA, _uvB, _uvC, new Vector2() );\n\n\t\t}\n\n\t\tif ( uv2 ) {\n\n\t\t\t_uvA.fromBufferAttribute( uv2, a );\n\t\t\t_uvB.fromBufferAttribute( uv2, b );\n\t\t\t_uvC.fromBufferAttribute( uv2, c );\n\n\t\t\tintersection.uv2 = Triangle.getUV( _intersectionPoint, _vA, _vB, _vC, _uvA, _uvB, _uvC, new Vector2() );\n\n\t\t}\n\n\t\tconst face = {\n\t\t\ta: a,\n\t\t\tb: b,\n\t\t\tc: c,\n\t\t\tnormal: new Vector3(),\n\t\t\tmaterialIndex: 0\n\t\t};\n\n\t\tTriangle.getNormal( _vA, _vB, _vC, face.normal );\n\n\t\tintersection.face = face;\n\n\t}\n\n\treturn intersection;\n\n}\n\nexport { Mesh };\n","export default /* glsl */`\n#ifdef USE_ALPHAMAP\n\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_ALPHAMAP\n\n\tuniform sampler2D alphaMap;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_ALPHATEST\n\n\tif ( diffuseColor.a < alphaTest ) discard;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_ALPHATEST\n\tuniform float alphaTest;\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_AOMAP\n\n\t// reads channel R, compatible with a combined OcclusionRoughnessMetallic (RGB) texture\n\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\n\t#if defined( USE_ENVMAP ) && defined( STANDARD )\n\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.roughness );\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_AOMAP\n\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n\n#endif\n`;\n","export default /* glsl */`\nvec3 transformed = vec3( position );\n`;\n","export default /* glsl */`\nvec3 objectNormal = vec3( normal );\n\n#ifdef USE_TANGENT\n\n\tvec3 objectTangent = vec3( tangent.xyz );\n\n#endif\n`;\n","export default /* glsl */`\n\nvec3 BRDF_Lambert( const in vec3 diffuseColor ) {\n\n\treturn RECIPROCAL_PI * diffuseColor;\n\n} // validated\n\nvec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) {\n\n\t// Original approximation by Christophe Schlick '94\n\t// float fresnel = pow( 1.0 - dotVH, 5.0 );\n\n\t// Optimized variant (presented by Epic at SIGGRAPH '13)\n\t// https://cdn2.unrealengine.com/Resources/files/2013SiggraphPresentationsNotes-26915738.pdf\n\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\n\n\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\n\n} // validated\n\n// Moving Frostbite to Physically Based Rendering 3.0 - page 12, listing 2\n// https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf\nfloat V_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\n\tfloat a2 = pow2( alpha );\n\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\n\treturn 0.5 / max( gv + gl, EPSILON );\n\n}\n\n// Microfacet Models for Refraction through Rough Surfaces - equation (33)\n// http://graphicrants.blogspot.com/2013/08/specular-brdf-reference.html\n// alpha is \"roughness squared\" in Disney’s reparameterization\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\n\tfloat a2 = pow2( alpha );\n\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0; // avoid alpha = 0 with dotNH = 1\n\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n\n}\n\n// GGX Distribution, Schlick Fresnel, GGX_SmithCorrelated Visibility\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in vec3 f0, const in float f90, const in float roughness ) {\n\n\tfloat alpha = pow2( roughness ); // UE4's roughness\n\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\n\tvec3 F = F_Schlick( f0, f90, dotVH );\n\n\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\n\tfloat D = D_GGX( alpha, dotNH );\n\n\treturn F * ( V * D );\n\n}\n\n// Rect Area Light\n\n// Real-Time Polygonal-Light Shading with Linearly Transformed Cosines\n// by Eric Heitz, Jonathan Dupuy, Stephen Hill and David Neubelt\n// code: https://github.com/selfshadow/ltc_code/\n\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\n\tfloat dotNV = saturate( dot( N, V ) );\n\n\t// texture parameterized by sqrt( GGX alpha ) and sqrt( 1 - cos( theta ) )\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\n\treturn uv;\n\n}\n\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\n\t// Real-Time Area Lighting: a Journey from Research to Production (p.102)\n\t// An approximation of the form factor of a horizon-clipped rectangle.\n\n\tfloat l = length( f );\n\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n\n}\n\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\n\tfloat x = dot( v1, v2 );\n\n\tfloat y = abs( x );\n\n\t// rational polynomial approximation to theta / sin( theta ) / 2PI\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\n\treturn cross( v1, v2 ) * theta_sintheta;\n\n}\n\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\n\t// bail if point is on back side of plane of light\n\t// assumes ccw winding order of light vertices\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\n\t// construct orthonormal basis around N\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 ); // negated from paper; possibly due to a different handedness of world coordinate system\n\n\t// compute transform\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\n\t// transform rect\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\n\t// project rect onto sphere\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\n\t// calculate vector form factor\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\n\t// adjust for horizon clipping\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\n/*\n\t// alternate method of adjusting for horizon clipping (see referece)\n\t// refactoring required\n\tfloat len = length( vectorFormFactor );\n\tfloat z = vectorFormFactor.z / len;\n\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\n\t// tabulated horizon-clipped sphere, apparently...\n\tvec2 uv = vec2( z * 0.5 + 0.5, len );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\n\tfloat scale = texture2D( ltc_2, uv ).w;\n\n\tfloat result = len * scale;\n*/\n\n\treturn vec3( result );\n\n}\n\n// End Rect Area Light\n\n\nfloat G_BlinnPhong_Implicit( /* const in float dotNL, const in float dotNV */ ) {\n\n\t// geometry term is (n dot l)(n dot v) / 4(n dot l)(n dot v)\n\treturn 0.25;\n\n}\n\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n\n}\n\nvec3 BRDF_BlinnPhong( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float shininess ) {\n\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\n\tvec3 F = F_Schlick( specularColor, 1.0, dotVH );\n\n\tfloat G = G_BlinnPhong_Implicit( /* dotNL, dotNV */ );\n\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\n\treturn F * ( G * D );\n\n} // validated\n\n#if defined( USE_SHEEN )\n\n// https://github.com/google/filament/blob/master/shaders/src/brdf.fs\nfloat D_Charlie( float roughness, float dotNH ) {\n\n\tfloat alpha = pow2( roughness );\n\n\t// Estevez and Kulla 2017, \"Production Friendly Microfacet Sheen BRDF\"\n\tfloat invAlpha = 1.0 / alpha;\n\tfloat cos2h = dotNH * dotNH;\n\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 ); // 2^(-14/2), so sin2h^2 > 0 in fp16\n\n\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\n\n}\n\n// https://github.com/google/filament/blob/master/shaders/src/brdf.fs\nfloat V_Neubelt( float dotNV, float dotNL ) {\n\n\t// Neubelt and Pettineo 2013, \"Crafting a Next-gen Material Pipeline for The Order: 1886\"\n\treturn saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\n\n}\n\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\n\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\n\tfloat D = D_Charlie( sheenRoughness, dotNH );\n\tfloat V = V_Neubelt( dotNV, dotNL );\n\n\treturn sheenColor * ( D * V );\n\n}\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_BUMPMAP\n\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\n\t// Bump Mapping Unparametrized Surfaces on the GPU by Morten S. Mikkelsen\n\t// https://mmikk.github.io/papers3d/mm_sfgrad_bump.pdf\n\n\t// Evaluate the derivative of the height w.r.t. screen-space using forward differencing (listing 2)\n\n\tvec2 dHdxy_fwd() {\n\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\n\t\treturn vec2( dBx, dBy );\n\n\t}\n\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy, float faceDirection ) {\n\n\t\t// Workaround for Adreno 3XX dFd*( vec3 ) bug. See #9988\n\n\t\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\n\t\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\n\t\tvec3 vN = surf_norm;\t\t// normalized\n\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\n\t\tfloat fDet = dot( vSigmaX, R1 ) * faceDirection;\n\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\n\t}\n\n#endif\n`;\n","export default /* glsl */`\n#if NUM_CLIPPING_PLANES > 0\n\n\tvec4 plane;\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\n\t\tplane = clippingPlanes[ i ];\n\t\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\n\n\t}\n\t#pragma unroll_loop_end\n\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\n\t\tbool clipped = true;\n\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\n\n\t\t}\n\t\t#pragma unroll_loop_end\n\n\t\tif ( clipped ) discard;\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n#if NUM_CLIPPING_PLANES > 0\n\n\tvarying vec3 vClipPosition;\n\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n\n#endif\n`;\n","export default /* glsl */`\n#if NUM_CLIPPING_PLANES > 0\n\n\tvarying vec3 vClipPosition;\n\n#endif\n`;\n","export default /* glsl */`\n#if NUM_CLIPPING_PLANES > 0\n\n\tvClipPosition = - mvPosition.xyz;\n\n#endif\n`;\n","export default /* glsl */`\n#if defined( USE_COLOR_ALPHA )\n\n\tdiffuseColor *= vColor;\n\n#elif defined( USE_COLOR )\n\n\tdiffuseColor.rgb *= vColor;\n\n#endif\n`;\n","export default /* glsl */`\n#if defined( USE_COLOR_ALPHA )\n\n\tvarying vec4 vColor;\n\n#elif defined( USE_COLOR )\n\n\tvarying vec3 vColor;\n\n#endif\n`;\n","export default /* glsl */`\n#if defined( USE_COLOR_ALPHA )\n\n\tvarying vec4 vColor;\n\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\n\tvarying vec3 vColor;\n\n#endif\n`;\n","export default /* glsl */`\n#if defined( USE_COLOR_ALPHA )\n\n\tvColor = vec4( 1.0 );\n\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\n\tvColor = vec3( 1.0 );\n\n#endif\n\n#ifdef USE_COLOR\n\n\tvColor *= color;\n\n#endif\n\n#ifdef USE_INSTANCING_COLOR\n\n\tvColor.xyz *= instanceColor.xyz;\n\n#endif\n`;\n","export default /* glsl */`\n#define PI 3.141592653589793\n#define PI2 6.283185307179586\n#define PI_HALF 1.5707963267948966\n#define RECIPROCAL_PI 0.3183098861837907\n#define RECIPROCAL_PI2 0.15915494309189535\n#define EPSILON 1e-6\n\n#ifndef saturate\n// <tonemapping_pars_fragment> may have defined saturate() already\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement( a ) ( 1.0 - saturate( a ) )\n\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\n\n// expects values in the range of [0,1]x[0,1], returns values in the [0,1] range.\n// do not collapse into a single function per: http://byteblacksmith.com/improvements-to-the-canonical-one-liner-glsl-rand-for-opengl-es-2-0/\nhighp float rand( const in vec2 uv ) {\n\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\n\treturn fract( sin( sn ) * c );\n\n}\n\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\n\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\n\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\n\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n#ifdef USE_CLEARCOAT\n\tvec3 clearcoatNormal;\n#endif\n};\n\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n}\n\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t// dir can be either a direction vector or a normal vector\n\t// upper-left 3x3 of matrix is assumed to be orthogonal\n\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n\n}\n\nmat3 transposeMat3( const in mat3 m ) {\n\n\tmat3 tmp;\n\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\n\treturn tmp;\n\n}\n\n// https://en.wikipedia.org/wiki/Relative_luminance\nfloat linearToRelativeLuminance( const in vec3 color ) {\n\n\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\n\n\treturn dot( weights, color.rgb );\n\n}\n\nbool isPerspectiveMatrix( mat4 m ) {\n\n\treturn m[ 2 ][ 3 ] == - 1.0;\n\n}\n\nvec2 equirectUv( in vec3 dir ) {\n\n\t// dir is assumed to be unit length\n\n\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n\n\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\n\treturn vec2( u, v );\n\n}\n`;\n","export default /* glsl */`\n#ifdef ENVMAP_TYPE_CUBE_UV\n\n\t#define cubeUV_maxMipLevel 8.0\n\t#define cubeUV_minMipLevel 4.0\n\t#define cubeUV_maxTileSize 256.0\n\t#define cubeUV_minTileSize 16.0\n\n\t// These shader functions convert between the UV coordinates of a single face of\n\t// a cubemap, the 0-5 integer index of a cube face, and the direction vector for\n\t// sampling a textureCube (not generally normalized ).\n\n\tfloat getFace( vec3 direction ) {\n\n\t\tvec3 absDirection = abs( direction );\n\n\t\tfloat face = - 1.0;\n\n\t\tif ( absDirection.x > absDirection.z ) {\n\n\t\t\tif ( absDirection.x > absDirection.y )\n\n\t\t\t\tface = direction.x > 0.0 ? 0.0 : 3.0;\n\n\t\t\telse\n\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\n\t\t} else {\n\n\t\t\tif ( absDirection.z > absDirection.y )\n\n\t\t\t\tface = direction.z > 0.0 ? 2.0 : 5.0;\n\n\t\t\telse\n\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\n\t\t}\n\n\t\treturn face;\n\n\t}\n\n\t// RH coordinate system; PMREM face-indexing convention\n\tvec2 getUV( vec3 direction, float face ) {\n\n\t\tvec2 uv;\n\n\t\tif ( face == 0.0 ) {\n\n\t\t\tuv = vec2( direction.z, direction.y ) / abs( direction.x ); // pos x\n\n\t\t} else if ( face == 1.0 ) {\n\n\t\t\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y ); // pos y\n\n\t\t} else if ( face == 2.0 ) {\n\n\t\t\tuv = vec2( - direction.x, direction.y ) / abs( direction.z ); // pos z\n\n\t\t} else if ( face == 3.0 ) {\n\n\t\t\tuv = vec2( - direction.z, direction.y ) / abs( direction.x ); // neg x\n\n\t\t} else if ( face == 4.0 ) {\n\n\t\t\tuv = vec2( - direction.x, direction.z ) / abs( direction.y ); // neg y\n\n\t\t} else {\n\n\t\t\tuv = vec2( direction.x, direction.y ) / abs( direction.z ); // neg z\n\n\t\t}\n\n\t\treturn 0.5 * ( uv + 1.0 );\n\n\t}\n\n\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\n\n\t\tfloat face = getFace( direction );\n\n\t\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\n\n\t\tmipInt = max( mipInt, cubeUV_minMipLevel );\n\n\t\tfloat faceSize = exp2( mipInt );\n\n\t\tfloat texelSize = 1.0 / ( 3.0 * cubeUV_maxTileSize );\n\n\t\tvec2 uv = getUV( direction, face ) * ( faceSize - 1.0 ) + 0.5;\n\n\t\tif ( face > 2.0 ) {\n\n\t\t\tuv.y += faceSize;\n\n\t\t\tface -= 3.0;\n\n\t\t}\n\n\t\tuv.x += face * faceSize;\n\n\t\tif ( mipInt < cubeUV_maxMipLevel ) {\n\n\t\t\tuv.y += 2.0 * cubeUV_maxTileSize;\n\n\t\t}\n\n\t\tuv.y += filterInt * 2.0 * cubeUV_minTileSize;\n\n\t\tuv.x += 3.0 * max( 0.0, cubeUV_maxTileSize - 2.0 * faceSize );\n\n\t\tuv *= texelSize;\n\n\t\treturn texture2D( envMap, uv ).rgb;\n\n\t}\n\n\t// These defines must match with PMREMGenerator\n\n\t#define r0 1.0\n\t#define v0 0.339\n\t#define m0 - 2.0\n\t#define r1 0.8\n\t#define v1 0.276\n\t#define m1 - 1.0\n\t#define r4 0.4\n\t#define v4 0.046\n\t#define m4 2.0\n\t#define r5 0.305\n\t#define v5 0.016\n\t#define m5 3.0\n\t#define r6 0.21\n\t#define v6 0.0038\n\t#define m6 4.0\n\n\tfloat roughnessToMip( float roughness ) {\n\n\t\tfloat mip = 0.0;\n\n\t\tif ( roughness >= r1 ) {\n\n\t\t\tmip = ( r0 - roughness ) * ( m1 - m0 ) / ( r0 - r1 ) + m0;\n\n\t\t} else if ( roughness >= r4 ) {\n\n\t\t\tmip = ( r1 - roughness ) * ( m4 - m1 ) / ( r1 - r4 ) + m1;\n\n\t\t} else if ( roughness >= r5 ) {\n\n\t\t\tmip = ( r4 - roughness ) * ( m5 - m4 ) / ( r4 - r5 ) + m4;\n\n\t\t} else if ( roughness >= r6 ) {\n\n\t\t\tmip = ( r5 - roughness ) * ( m6 - m5 ) / ( r5 - r6 ) + m5;\n\n\t\t} else {\n\n\t\t\tmip = - 2.0 * log2( 1.16 * roughness ); // 1.16 = 1.79^0.25\n\t\t}\n\n\t\treturn mip;\n\n\t}\n\n\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\n\n\t\tfloat mip = clamp( roughnessToMip( roughness ), m0, cubeUV_maxMipLevel );\n\n\t\tfloat mipF = fract( mip );\n\n\t\tfloat mipInt = floor( mip );\n\n\t\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\n\n\t\tif ( mipF == 0.0 ) {\n\n\t\t\treturn vec4( color0, 1.0 );\n\n\t\t} else {\n\n\t\t\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\n\n\t\t\treturn vec4( mix( color0, color1, mipF ), 1.0 );\n\n\t\t}\n\n\t}\n\n#endif\n`;\n","export default /* glsl */`\nvec3 transformedNormal = objectNormal;\n\n#ifdef USE_INSTANCING\n\n\t// this is in lieu of a per-instance normal-matrix\n\t// shear transforms in the instance matrix are not supported\n\n\tmat3 m = mat3( instanceMatrix );\n\n\ttransformedNormal /= vec3( dot( m[ 0 ], m[ 0 ] ), dot( m[ 1 ], m[ 1 ] ), dot( m[ 2 ], m[ 2 ] ) );\n\n\ttransformedNormal = m * transformedNormal;\n\n#endif\n\ntransformedNormal = normalMatrix * transformedNormal;\n\n#ifdef FLIP_SIDED\n\n\ttransformedNormal = - transformedNormal;\n\n#endif\n\n#ifdef USE_TANGENT\n\n\tvec3 transformedTangent = ( modelViewMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\n\t#ifdef FLIP_SIDED\n\n\t\ttransformedTangent = - transformedTangent;\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_DISPLACEMENTMAP\n\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_DISPLACEMENTMAP\n\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vUv ).x * displacementScale + displacementBias );\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_EMISSIVEMAP\n\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_EMISSIVEMAP\n\n\tuniform sampler2D emissiveMap;\n\n#endif\n`;\n","export default /* glsl */`\ngl_FragColor = linearToOutputTexel( gl_FragColor );\n`;\n","export default /* glsl */`\n\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\n\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\n}\n\n`;\n","export default /* glsl */`\n#ifdef USE_ENVMAP\n\n\t#ifdef ENV_WORLDPOS\n\n\t\tvec3 cameraToFrag;\n\n\t\tif ( isOrthographic ) {\n\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\n\t\t} else {\n\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\n\t\t}\n\n\t\t// Transforming Normal Vectors with the Inverse Transformation\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\n\t\t#else\n\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\n\t\t#endif\n\n\t#else\n\n\t\tvec3 reflectVec = vReflect;\n\n\t#endif\n\n\t#ifdef ENVMAP_TYPE_CUBE\n\n\t\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\n\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\n\t\tvec4 envColor = textureCubeUV( envMap, reflectVec, 0.0 );\n\n\t#else\n\n\t\tvec4 envColor = vec4( 0.0 );\n\n\t#endif\n\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_ENVMAP\n\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\t\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_ENVMAP\n\n\tuniform float reflectivity;\n\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\n\t\t#define ENV_WORLDPOS\n\n\t#endif\n\n\t#ifdef ENV_WORLDPOS\n\n\t\tvarying vec3 vWorldPosition;\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_ENVMAP\n\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) ||defined( PHONG )\n\n\t\t#define ENV_WORLDPOS\n\n\t#endif\n\n\t#ifdef ENV_WORLDPOS\n\t\t\n\t\tvarying vec3 vWorldPosition;\n\n\t#else\n\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_ENVMAP\n\n\t#ifdef ENV_WORLDPOS\n\n\t\tvWorldPosition = worldPosition.xyz;\n\n\t#else\n\n\t\tvec3 cameraToVertex;\n\n\t\tif ( isOrthographic ) {\n\n\t\t\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\n\t\t} else {\n\n\t\t\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\n\t\t}\n\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\n\t\t#else\n\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\n\t\t#endif\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_FOG\n\n\tvFogDepth = - mvPosition.z;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_FOG\n\n\tvarying float vFogDepth;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_FOG\n\n\t#ifdef FOG_EXP2\n\n\t\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth );\n\n\t#else\n\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, vFogDepth );\n\n\t#endif\n\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_FOG\n\n\tuniform vec3 fogColor;\n\tvarying float vFogDepth;\n\n\t#ifdef FOG_EXP2\n\n\t\tuniform float fogDensity;\n\n\t#else\n\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n\n#ifdef USE_GRADIENTMAP\n\n\tuniform sampler2D gradientMap;\n\n#endif\n\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\n\t// dotNL will be from -1.0 to 1.0\n\tfloat dotNL = dot( normal, lightDirection );\n\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\n\t#ifdef USE_GRADIENTMAP\n\n\t\treturn vec3( texture2D( gradientMap, coord ).r );\n\n\t#else\n\n\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\n\t#endif\n\n}\n`;\n","export default /* glsl */`\n#ifdef USE_LIGHTMAP\n\n\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\n\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\n\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\n\t\tlightMapIrradiance *= PI;\n\n\t#endif\n\n\treflectedLight.indirectDiffuse += lightMapIrradiance;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_LIGHTMAP\n\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n\n#endif\n`;\n","export default /* glsl */`\nvec3 diffuse = vec3( 1.0 );\n\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( -mvPosition.xyz );\n\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\n\nvLightFront = vec3( 0.0 );\nvIndirectFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n\tvIndirectBack = vec3( 0.0 );\n#endif\n\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\n\nvIndirectFront += getAmbientLightIrradiance( ambientLightColor );\n\nvIndirectFront += getLightProbeIrradiance( lightProbe, geometry.normal );\n\n#ifdef DOUBLE_SIDED\n\n\tvIndirectBack += getAmbientLightIrradiance( ambientLightColor );\n\n\tvIndirectBack += getLightProbeIrradiance( lightProbe, backGeometry.normal );\n\n#endif\n\n#if NUM_POINT_LIGHTS > 0\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\n\t\tgetPointLightInfo( pointLights[ i ], geometry, directLight );\n\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = directLight.color;\n\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\n\t\t#ifdef DOUBLE_SIDED\n\n\t\t\tvLightBack += saturate( - dotNL ) * directLightColor_Diffuse;\n\n\t\t#endif\n\n\t}\n\t#pragma unroll_loop_end\n\n#endif\n\n#if NUM_SPOT_LIGHTS > 0\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\n\t\tgetSpotLightInfo( spotLights[ i ], geometry, directLight );\n\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = directLight.color;\n\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\n\t\t#ifdef DOUBLE_SIDED\n\n\t\t\tvLightBack += saturate( - dotNL ) * directLightColor_Diffuse;\n\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n\n#endif\n\n#if NUM_DIR_LIGHTS > 0\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\n\t\tgetDirectionalLightInfo( directionalLights[ i ], geometry, directLight );\n\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = directLight.color;\n\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\n\t\t#ifdef DOUBLE_SIDED\n\n\t\t\tvLightBack += saturate( - dotNL ) * directLightColor_Diffuse;\n\n\t\t#endif\n\n\t}\n\t#pragma unroll_loop_end\n\n#endif\n\n#if NUM_HEMI_LIGHTS > 0\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\n\t\tvIndirectFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry.normal );\n\n\t\t#ifdef DOUBLE_SIDED\n\n\t\t\tvIndirectBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry.normal );\n\n\t\t#endif\n\n\t}\n\t#pragma unroll_loop_end\n\n#endif\n`;\n","export default /* glsl */`\nuniform bool receiveShadow;\nuniform vec3 ambientLightColor;\nuniform vec3 lightProbe[ 9 ];\n\n// get the irradiance (radiance convolved with cosine lobe) at the point 'normal' on the unit sphere\n// source: https://graphics.stanford.edu/papers/envmap/envmap.pdf\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n\n\t// normal is assumed to have unit length\n\n\tfloat x = normal.x, y = normal.y, z = normal.z;\n\n\t// band 0\n\tvec3 result = shCoefficients[ 0 ] * 0.886227;\n\n\t// band 1\n\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n\n\t// band 2\n\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n\n\treturn result;\n\n}\n\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) {\n\n\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\n\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n\n\treturn irradiance;\n\n}\n\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\n\tvec3 irradiance = ambientLightColor;\n\n\treturn irradiance;\n\n}\n\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\n\t#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\n\t\t// based upon Frostbite 3 Moving to Physically-based Rendering\n\t\t// page 32, equation 26: E[window1]\n\t\t// https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf\n\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\n\t\tif ( cutoffDistance > 0.0 ) {\n\n\t\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\n\t\t}\n\n\t\treturn distanceFalloff;\n\n\t#else\n\n\t\tif ( cutoffDistance > 0.0 && decayExponent > 0.0 ) {\n\n\t\t\treturn pow( saturate( - lightDistance / cutoffDistance + 1.0 ), decayExponent );\n\n\t\t}\n\n\t\treturn 1.0;\n\n\t#endif\n\n}\n\nfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\n\n\treturn smoothstep( coneCosine, penumbraCosine, angleCosine );\n\n}\n\n#if NUM_DIR_LIGHTS > 0\n\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t};\n\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\n\tvoid getDirectionalLightInfo( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight light ) {\n\n\t\tlight.color = directionalLight.color;\n\t\tlight.direction = directionalLight.direction;\n\t\tlight.visible = true;\n\n\t}\n\n#endif\n\n\n#if NUM_POINT_LIGHTS > 0\n\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t};\n\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\n\t// light is an out parameter as having it as a return value caused compiler errors on some devices\n\tvoid getPointLightInfo( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight light ) {\n\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\n\t\tlight.direction = normalize( lVector );\n\n\t\tfloat lightDistance = length( lVector );\n\n\t\tlight.color = pointLight.color;\n\t\tlight.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );\n\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\n\t}\n\n#endif\n\n\n#if NUM_SPOT_LIGHTS > 0\n\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t};\n\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\n\t// light is an out parameter as having it as a return value caused compiler errors on some devices\n\tvoid getSpotLightInfo( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight light ) {\n\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\n\t\tlight.direction = normalize( lVector );\n\n\t\tfloat angleCos = dot( light.direction, spotLight.direction );\n\n\t\tfloat spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\n\t\tif ( spotAttenuation > 0.0 ) {\n\n\t\t\tfloat lightDistance = length( lVector );\n\n\t\t\tlight.color = spotLight.color * spotAttenuation;\n\t\t\tlight.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\n\t\t} else {\n\n\t\t\tlight.color = vec3( 0.0 );\n\t\t\tlight.visible = false;\n\n\t\t}\n\n\t}\n\n#endif\n\n\n#if NUM_RECT_AREA_LIGHTS > 0\n\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\n\t// Pre-computed values of LinearTransformedCosine approximation of BRDF\n\t// BRDF approximation Texture is 64x64\n\tuniform sampler2D ltc_1; // RGBA Float\n\tuniform sampler2D ltc_2; // RGBA Float\n\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n\n#endif\n\n\n#if NUM_HEMI_LIGHTS > 0\n\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in vec3 normal ) {\n\n\t\tfloat dotNL = dot( normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\n\t\treturn irradiance;\n\n\t}\n\n#endif\n`;\n","export default /* glsl */`\n#if defined( USE_ENVMAP )\n\n\t#ifdef ENVMAP_MODE_REFRACTION\n\n\t\tuniform float refractionRatio;\n\n\t#endif\n\n\tvec3 getIBLIrradiance( const in vec3 normal ) {\n\n\t\t#if defined( ENVMAP_TYPE_CUBE_UV )\n\n\t\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, worldNormal, 1.0 );\n\n\t\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\n\t\t#else\n\n\t\t\treturn vec3( 0.0 );\n\n\t\t#endif\n\n\t}\n\n\tvec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {\n\n\t\t#if defined( ENVMAP_TYPE_CUBE_UV )\n\n\t\t\tvec3 reflectVec;\n\n\t\t\t#ifdef ENVMAP_MODE_REFLECTION\n\n\t\t\t\treflectVec = reflect( - viewDir, normal );\n\n\t\t\t\t// Mixing the reflection with the normal is more accurate and keeps rough objects from gathering light from behind their tangent plane.\n\t\t\t\treflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\n\n\t\t\t#else\n\n\t\t\t\treflectVec = refract( - viewDir, normal, refractionRatio );\n\n\t\t\t#endif\n\n\t\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, reflectVec, roughness );\n\n\t\t\treturn envMapColor.rgb * envMapIntensity;\n\n\t\t#else\n\n\t\t\treturn vec3( 0.0 );\n\n\t\t#endif\n\n\t}\n\n#endif\n`;\n","export default /* glsl */`\nToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\n`;\n","export default /* glsl */`\nvarying vec3 vViewPosition;\n\nstruct ToonMaterial {\n\n\tvec3 diffuseColor;\n\n};\n\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\n\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\n}\n\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\n}\n\n#define RE_Direct\t\t\t\tRE_Direct_Toon\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Toon\n\n#define Material_LightProbeLOD( material )\t(0)\n`;\n","export default /* glsl */`\nBlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;\n`;\n","export default /* glsl */`\nvarying vec3 vViewPosition;\n\nstruct BlinnPhongMaterial {\n\n\tvec3 diffuseColor;\n\tvec3 specularColor;\n\tfloat specularShininess;\n\tfloat specularStrength;\n\n};\n\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\n\treflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometry.viewDir, geometry.normal, material.specularColor, material.specularShininess ) * material.specularStrength;\n\n}\n\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\n}\n\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n\n#define Material_LightProbeLOD( material )\t(0)\n`;\n","export default /* glsl */`\nPhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\n\nvec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\n\nmaterial.roughness = max( roughnessFactor, 0.0525 );// 0.0525 corresponds to the base mip of a 256 cubemap.\nmaterial.roughness += geometryRoughness;\nmaterial.roughness = min( material.roughness, 1.0 );\n\n#ifdef IOR\n\n\t#ifdef SPECULAR\n\n\t\tfloat specularIntensityFactor = specularIntensity;\n\t\tvec3 specularColorFactor = specularColor;\n\n\t\t#ifdef USE_SPECULARINTENSITYMAP\n\n\t\t\tspecularIntensityFactor *= texture2D( specularIntensityMap, vUv ).a;\n\n\t\t#endif\n\n\t\t#ifdef USE_SPECULARCOLORMAP\n\n\t\t\tspecularColorFactor *= texture2D( specularColorMap, vUv ).rgb;\n\n\t\t#endif\n\n\t\tmaterial.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\n\n\t#else\n\n\t\tfloat specularIntensityFactor = 1.0;\n\t\tvec3 specularColorFactor = vec3( 1.0 );\n\t\tmaterial.specularF90 = 1.0;\n\n\t#endif\n\n\tmaterial.specularColor = mix( min( pow2( ( ior - 1.0 ) / ( ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor );\n\n#else\n\n\tmaterial.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.specularF90 = 1.0;\n\n#endif\n\n#ifdef USE_CLEARCOAT\n\n\tmaterial.clearcoat = clearcoat;\n\tmaterial.clearcoatRoughness = clearcoatRoughness;\n\tmaterial.clearcoatF0 = vec3( 0.04 );\n\tmaterial.clearcoatF90 = 1.0;\n\n\t#ifdef USE_CLEARCOATMAP\n\n\t\tmaterial.clearcoat *= texture2D( clearcoatMap, vUv ).x;\n\n\t#endif\n\n\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\n\t\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vUv ).y;\n\n\t#endif\n\n\tmaterial.clearcoat = saturate( material.clearcoat ); // Burley clearcoat model\n\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\n\tmaterial.clearcoatRoughness += geometryRoughness;\n\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\n\n#endif\n\n#ifdef USE_SHEEN\n\n\tmaterial.sheenColor = sheenColor;\n\n\t#ifdef USE_SHEENCOLORMAP\n\n\t\tmaterial.sheenColor *= texture2D( sheenColorMap, vUv ).rgb;\n\n\t#endif\n\n\tmaterial.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 );\n\n\t#ifdef USE_SHEENROUGHNESSMAP\n\n\t\tmaterial.sheenRoughness *= texture2D( sheenRoughnessMap, vUv ).a;\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\nstruct PhysicalMaterial {\n\n\tvec3 diffuseColor;\n\tfloat roughness;\n\tvec3 specularColor;\n\tfloat specularF90;\n\n\t#ifdef USE_CLEARCOAT\n\t\tfloat clearcoat;\n\t\tfloat clearcoatRoughness;\n\t\tvec3 clearcoatF0;\n\t\tfloat clearcoatF90;\n\t#endif\n\n\t#ifdef USE_SHEEN\n\t\tvec3 sheenColor;\n\t\tfloat sheenRoughness;\n\t#endif\n\n};\n\n// temporary\nvec3 clearcoatSpecular = vec3( 0.0 );\nvec3 sheenSpecular = vec3( 0.0 );\n\n// This is a curve-fit approxmation to the \"Charlie sheen\" BRDF integrated over the hemisphere from \n// Estevez and Kulla 2017, \"Production Friendly Microfacet Sheen BRDF\". The analysis can be found\n// in the Sheen section of https://drive.google.com/file/d/1T0D1VSyR4AllqIJTQAraEIzjlb5h4FKH/view?usp=sharing\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness) {\n\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\n\tfloat r2 = roughness * roughness;\n\n\tfloat a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95;\n\n\tfloat b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72;\n\n\tfloat DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) );\n\n\treturn saturate( DG * RECIPROCAL_PI );\n\n}\n\n// Analytical approximation of the DFG LUT, one half of the\n// split-sum approximation used in indirect specular lighting.\n// via 'environmentBRDF' from \"Physically Based Shading on Mobile\"\n// https://www.unrealengine.com/blog/physically-based-shading-on-mobile\nvec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\n\tvec4 r = roughness * c0 + c1;\n\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\n\tvec2 fab = vec2( - 1.04, 1.04 ) * a004 + r.zw;\n\n\treturn fab;\n\n}\n\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\n\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\n\treturn specularColor * fab.x + specularF90 * fab.y;\n\n}\n\n// Fdez-Agüera's \"Multiple-Scattering Microfacet Model for Real-Time Image Based Lighting\"\n// Approximates multiscattering in order to preserve energy.\n// http://www.jcgt.org/published/0008/01/03/\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\n\tvec3 FssEss = specularColor * fab.x + specularF90 * fab.y;\n\n\tfloat Ess = fab.x + fab.y;\n\tfloat Ems = 1.0 - Ess;\n\n\tvec3 Favg = specularColor + ( 1.0 - specularColor ) * 0.047619; // 1/21\n\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n\n}\n\n#if NUM_RECT_AREA_LIGHTS > 0\n\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.roughness;\n\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight; // counterclockwise; light shines in local neg z direction\n\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3(    0, 1,    0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\n\t\t// LTC Fresnel Approximation by Stephen Hill\n\t\t// http://blog.selfshadow.com/publications/s2016-advances/s2016_ltc_fresnel.pdf\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\n\t}\n\n#endif\n\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\n\tvec3 irradiance = dotNL * directLight.color;\n\n\t#ifdef USE_CLEARCOAT\n\n\t\tfloat dotNLcc = saturate( dot( geometry.clearcoatNormal, directLight.direction ) );\n\n\t\tvec3 ccIrradiance = dotNLcc * directLight.color;\n\n\t\tclearcoatSpecular += ccIrradiance * BRDF_GGX( directLight.direction, geometry.viewDir, geometry.clearcoatNormal, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\n\t#endif\n\n\t#ifdef USE_SHEEN\n\n\t\tsheenSpecular += irradiance * BRDF_Sheen( directLight.direction, geometry.viewDir, geometry.normal, material.sheenColor, material.sheenRoughness );\n\n\t#endif\n\n\treflectedLight.directSpecular += irradiance * BRDF_GGX( directLight.direction, geometry.viewDir, geometry.normal, material.specularColor, material.specularF90, material.roughness );\n\n\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\n}\n\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\n\t#ifdef USE_CLEARCOAT\n\n\t\tclearcoatSpecular += clearcoatRadiance * EnvironmentBRDF( geometry.clearcoatNormal, geometry.viewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\n\t#endif\n\n\t#ifdef USE_SHEEN\n\n\t\tsheenSpecular += irradiance * material.sheenColor * IBLSheenBRDF( geometry.normal, geometry.viewDir, material.sheenRoughness );\n\n\t#endif\n\n\t// Both indirect specular and indirect diffuse light accumulate here\n\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\n\tcomputeMultiscattering( geometry.normal, geometry.viewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );\n\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - ( singleScattering + multiScattering ) );\n\n\treflectedLight.indirectSpecular += radiance * singleScattering;\n\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n\n\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n\n}\n\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\n\n// ref: https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n\n}\n`;\n","export default /* glsl */`\n/**\n * This is a template that can be used to light a material, it uses pluggable\n * RenderEquations (RE)for specific lighting scenarios.\n *\n * Instructions for use:\n * - Ensure that both RE_Direct, RE_IndirectDiffuse and RE_IndirectSpecular are defined\n * - If you have defined an RE_IndirectSpecular, you need to also provide a Material_LightProbeLOD. <---- ???\n * - Create a material parameter that is to be passed as the third parameter to your lighting functions.\n *\n * TODO:\n * - Add area light support.\n * - Add sphere light support.\n * - Add diffuse light probe (irradiance cubemap) support.\n */\n\nGeometricContext geometry;\n\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\n\n#ifdef USE_CLEARCOAT\n\n\tgeometry.clearcoatNormal = clearcoatNormal;\n\n#endif\n\nIncidentLight directLight;\n\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\n\t\tpointLight = pointLights[ i ];\n\n\t\tgetPointLightInfo( pointLight, geometry, directLight );\n\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\n\t}\n\t#pragma unroll_loop_end\n\n#endif\n\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\n\tSpotLight spotLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\n\t\tspotLight = spotLights[ i ];\n\n\t\tgetSpotLightInfo( spotLight, geometry, directLight );\n\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\n\t}\n\t#pragma unroll_loop_end\n\n#endif\n\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\n\t\tdirectionalLight = directionalLights[ i ];\n\n\t\tgetDirectionalLightInfo( directionalLight, geometry, directLight );\n\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\n\t}\n\t#pragma unroll_loop_end\n\n#endif\n\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\n\tRectAreaLight rectAreaLight;\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\n\t}\n\t#pragma unroll_loop_end\n\n#endif\n\n#if defined( RE_IndirectDiffuse )\n\n\tvec3 iblIrradiance = vec3( 0.0 );\n\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\n\tirradiance += getLightProbeIrradiance( lightProbe, geometry.normal );\n\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry.normal );\n\n\t\t}\n\t\t#pragma unroll_loop_end\n\n\t#endif\n\n#endif\n\n#if defined( RE_IndirectSpecular )\n\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n\n#endif\n`;\n","export default /* glsl */`\n#if defined( RE_IndirectDiffuse )\n\n\t#ifdef USE_LIGHTMAP\n\n\t\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\n\t\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\n\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\n\t\t\tlightMapIrradiance *= PI;\n\n\t\t#endif\n\n\t\tirradiance += lightMapIrradiance;\n\n\t#endif\n\n\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\n\n\t\tiblIrradiance += getIBLIrradiance( geometry.normal );\n\n\t#endif\n\n#endif\n\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\n\tradiance += getIBLRadiance( geometry.viewDir, geometry.normal, material.roughness );\n\n\t#ifdef USE_CLEARCOAT\n\n\t\tclearcoatRadiance += getIBLRadiance( geometry.viewDir, geometry.clearcoatNormal, material.clearcoatRoughness );\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n#if defined( RE_IndirectDiffuse )\n\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n\n#endif\n\n#if defined( RE_IndirectSpecular )\n\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometry, material, reflectedLight );\n\n#endif\n`;\n","export default /* glsl */`\n#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\n\t// Doing a strict comparison with == 1.0 can cause noise artifacts\n\t// on some platforms. See issue #17623.\n\tgl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n\n#endif\n`;\n","export default /* glsl */`\n#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_LOGDEPTHBUF\n\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\n\t\tvarying float vFragDepth;\n\t\tvarying float vIsPerspective;\n\n\t#else\n\n\t\tuniform float logDepthBufFC;\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_LOGDEPTHBUF\n\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\n\n\t#else\n\n\t\tif ( isPerspectiveMatrix( projectionMatrix ) ) {\n\n\t\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\n\t\t\tgl_Position.z *= gl_Position.w;\n\n\t\t}\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_MAP\n\n\tvec4 sampledDiffuseColor = texture2D( map, vUv );\n\n\t#ifdef DECODE_VIDEO_TEXTURE\n\n\t\t// inline sRGB decode (TODO: Remove this code when https://crbug.com/1256340 is solved)\n\n\t\tsampledDiffuseColor = vec4( mix( pow( sampledDiffuseColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), sampledDiffuseColor.rgb * 0.0773993808, vec3( lessThanEqual( sampledDiffuseColor.rgb, vec3( 0.04045 ) ) ) ), sampledDiffuseColor.w );\n\n\t#endif\n\n\tdiffuseColor *= sampledDiffuseColor;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_MAP\n\n\tuniform sampler2D map;\n\n#endif\n`;\n","export default /* glsl */`\n#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\n\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n\n#endif\n\n#ifdef USE_MAP\n\n\tdiffuseColor *= texture2D( map, uv );\n\n#endif\n\n#ifdef USE_ALPHAMAP\n\n\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\n\n#endif\n`;\n","export default /* glsl */`\n#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\n\tuniform mat3 uvTransform;\n\n#endif\n\n#ifdef USE_MAP\n\n\tuniform sampler2D map;\n\n#endif\n\n#ifdef USE_ALPHAMAP\n\n\tuniform sampler2D alphaMap;\n\n#endif\n`;\n","export default /* glsl */`\nfloat metalnessFactor = metalness;\n\n#ifdef USE_METALNESSMAP\n\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\n\t// reads channel B, compatible with a combined OcclusionRoughnessMetallic (RGB) texture\n\tmetalnessFactor *= texelMetalness.b;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_METALNESSMAP\n\n\tuniform sampler2D metalnessMap;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_MORPHNORMALS\n\n\t// morphTargetBaseInfluence is set based on BufferGeometry.morphTargetsRelative value:\n\t// When morphTargetsRelative is false, this is set to 1 - sum(influences); this results in normal = sum((target - base) * influence)\n\t// When morphTargetsRelative is true, this is set to 1; as a result, all morph targets are simply added to the base after weighting\n\tobjectNormal *= morphTargetBaseInfluence;\n\n\t#ifdef MORPHTARGETS_TEXTURE\n\n\t\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1, 2 ) * morphTargetInfluences[ i ];\n\n\t\t}\n\n\t#else\n\n\t\tobjectNormal += morphNormal0 * morphTargetInfluences[ 0 ];\n\t\tobjectNormal += morphNormal1 * morphTargetInfluences[ 1 ];\n\t\tobjectNormal += morphNormal2 * morphTargetInfluences[ 2 ];\n\t\tobjectNormal += morphNormal3 * morphTargetInfluences[ 3 ];\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_MORPHTARGETS\n\n\tuniform float morphTargetBaseInfluence;\n\n\t#ifdef MORPHTARGETS_TEXTURE\n\n\t\tuniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];\n\t\tuniform sampler2DArray morphTargetsTexture;\n\t\tuniform vec2 morphTargetsTextureSize;\n\n\t\tvec3 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset, const in int stride ) {\n\n\t\t\tfloat texelIndex = float( vertexIndex * stride + offset );\n\t\t\tfloat y = floor( texelIndex / morphTargetsTextureSize.x );\n\t\t\tfloat x = texelIndex - y * morphTargetsTextureSize.x;\n\n\t\t\tvec3 morphUV = vec3( ( x + 0.5 ) / morphTargetsTextureSize.x, y / morphTargetsTextureSize.y, morphTargetIndex );\n\t\t\treturn texture( morphTargetsTexture, morphUV ).xyz;\n\n\t\t}\n\n\t#else\n\n\t\t#ifndef USE_MORPHNORMALS\n\n\t\t\tuniform float morphTargetInfluences[ 8 ];\n\n\t\t#else\n\n\t\t\tuniform float morphTargetInfluences[ 4 ];\n\n\t\t#endif\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_MORPHTARGETS\n\n\t// morphTargetBaseInfluence is set based on BufferGeometry.morphTargetsRelative value:\n\t// When morphTargetsRelative is false, this is set to 1 - sum(influences); this results in position = sum((target - base) * influence)\n\t// When morphTargetsRelative is true, this is set to 1; as a result, all morph targets are simply added to the base after weighting\n\ttransformed *= morphTargetBaseInfluence;\n\n\t#ifdef MORPHTARGETS_TEXTURE\n\n\t\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\n\t\t\t#ifndef USE_MORPHNORMALS\n\n\t\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0, 1 ) * morphTargetInfluences[ i ];\n\n\t\t\t#else\n\n\t\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0, 2 ) * morphTargetInfluences[ i ];\n\n\t\t\t#endif\n\n\t\t}\n\n\t#else\n\n\t\ttransformed += morphTarget0 * morphTargetInfluences[ 0 ];\n\t\ttransformed += morphTarget1 * morphTargetInfluences[ 1 ];\n\t\ttransformed += morphTarget2 * morphTargetInfluences[ 2 ];\n\t\ttransformed += morphTarget3 * morphTargetInfluences[ 3 ];\n\n\t\t#ifndef USE_MORPHNORMALS\n\n\t\t\ttransformed += morphTarget4 * morphTargetInfluences[ 4 ];\n\t\t\ttransformed += morphTarget5 * morphTargetInfluences[ 5 ];\n\t\t\ttransformed += morphTarget6 * morphTargetInfluences[ 6 ];\n\t\t\ttransformed += morphTarget7 * morphTargetInfluences[ 7 ];\n\n\t\t#endif\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\nfloat faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\n\n#ifdef FLAT_SHADED\n\n\t// Workaround for Adreno GPUs not able to do dFdx( vViewPosition )\n\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n\n#else\n\n\tvec3 normal = normalize( vNormal );\n\n\t#ifdef DOUBLE_SIDED\n\n\t\tnormal = normal * faceDirection;\n\n\t#endif\n\n\t#ifdef USE_TANGENT\n\n\t\tvec3 tangent = normalize( vTangent );\n\t\tvec3 bitangent = normalize( vBitangent );\n\n\t\t#ifdef DOUBLE_SIDED\n\n\t\t\ttangent = tangent * faceDirection;\n\t\t\tbitangent = bitangent * faceDirection;\n\n\t\t#endif\n\n\t\t#if defined( TANGENTSPACE_NORMALMAP ) || defined( USE_CLEARCOAT_NORMALMAP )\n\n\t\t\tmat3 vTBN = mat3( tangent, bitangent, normal );\n\n\t\t#endif\n\n\t#endif\n\n#endif\n\n// non perturbed normal for clearcoat among others\n\nvec3 geometryNormal = normal;\n\n`;\n","export default /* glsl */`\n\n#ifdef OBJECTSPACE_NORMALMAP\n\n\tnormal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0; // overrides both flatShading and attribute normals\n\n\t#ifdef FLIP_SIDED\n\n\t\tnormal = - normal;\n\n\t#endif\n\n\t#ifdef DOUBLE_SIDED\n\n\t\tnormal = normal * faceDirection;\n\n\t#endif\n\n\tnormal = normalize( normalMatrix * normal );\n\n#elif defined( TANGENTSPACE_NORMALMAP )\n\n\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\tmapN.xy *= normalScale;\n\n\t#ifdef USE_TANGENT\n\n\t\tnormal = normalize( vTBN * mapN );\n\n\t#else\n\n\t\tnormal = perturbNormal2Arb( - vViewPosition, normal, mapN, faceDirection );\n\n\t#endif\n\n#elif defined( USE_BUMPMAP )\n\n\tnormal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\n\n#endif\n`;\n","export default /* glsl */`\n#ifndef FLAT_SHADED\n\n\tvarying vec3 vNormal;\n\n\t#ifdef USE_TANGENT\n\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n#ifndef FLAT_SHADED\n\n\tvarying vec3 vNormal;\n\n\t#ifdef USE_TANGENT\n\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n#ifndef FLAT_SHADED // normal is computed with derivatives when FLAT_SHADED\n\n\tvNormal = normalize( transformedNormal );\n\n\t#ifdef USE_TANGENT\n\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_NORMALMAP\n\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n\n#endif\n\n#ifdef OBJECTSPACE_NORMALMAP\n\n\tuniform mat3 normalMatrix;\n\n#endif\n\n#if ! defined ( USE_TANGENT ) && ( defined ( TANGENTSPACE_NORMALMAP ) || defined ( USE_CLEARCOAT_NORMALMAP ) )\n\n\t// Normal Mapping Without Precomputed Tangents\n\t// http://www.thetenthplanet.de/archives/1180\n\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm, vec3 mapN, float faceDirection ) {\n\n\t\t// Workaround for Adreno 3XX dFd*( vec3 ) bug. See #9988\n\n\t\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\n\t\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\n\t\tvec3 N = surf_norm; // normalized\n\n\t\tvec3 q1perp = cross( q1, N );\n\t\tvec3 q0perp = cross( N, q0 );\n\n\t\tvec3 T = q1perp * st0.x + q0perp * st1.x;\n\t\tvec3 B = q1perp * st0.y + q0perp * st1.y;\n\n\t\tfloat det = max( dot( T, T ), dot( B, B ) );\n\t\tfloat scale = ( det == 0.0 ) ? 0.0 : faceDirection * inversesqrt( det );\n\n\t\treturn normalize( T * ( mapN.x * scale ) + B * ( mapN.y * scale ) + N * mapN.z );\n\n\t}\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_CLEARCOAT\n\n\tvec3 clearcoatNormal = geometryNormal;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_CLEARCOAT_NORMALMAP\n\n\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vUv ).xyz * 2.0 - 1.0;\n\tclearcoatMapN.xy *= clearcoatNormalScale;\n\n\t#ifdef USE_TANGENT\n\n\t\tclearcoatNormal = normalize( vTBN * clearcoatMapN );\n\n\t#else\n\n\t\tclearcoatNormal = perturbNormal2Arb( - vViewPosition, clearcoatNormal, clearcoatMapN, faceDirection );\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n\n#ifdef USE_CLEARCOATMAP\n\n\tuniform sampler2D clearcoatMap;\n\n#endif\n\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\n\tuniform sampler2D clearcoatRoughnessMap;\n\n#endif\n\n#ifdef USE_CLEARCOAT_NORMALMAP\n\n\tuniform sampler2D clearcoatNormalMap;\n\tuniform vec2 clearcoatNormalScale;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef OPAQUE\ndiffuseColor.a = 1.0;\n#endif\n\n// https://github.com/mrdoob/three.js/pull/22425\n#ifdef USE_TRANSMISSION\ndiffuseColor.a *= transmissionAlpha + 0.1;\n#endif\n\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );\n`;\n","export default /* glsl */`\nvec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\n\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\n\nconst float PackUpscale = 256. / 255.; // fraction -> 0..1 (including 1)\nconst float UnpackDownscale = 255. / 256.; // 0..1 -> fraction (excluding 1)\n\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\n\nconst float ShiftRight8 = 1. / 256.;\n\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8; // tidy overflow\n\treturn r * PackUpscale;\n}\n\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\n\nvec4 pack2HalfToRGBA( vec2 v ) {\n\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) );\n\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w );\n}\n\nvec2 unpackRGBATo2Half( vec4 v ) {\n\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\n}\n\n// NOTE: viewZ/eyeZ is < 0 when in front of the camera per OpenGL conventions\n\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\n\n// NOTE: https://twitter.com/gonnavis/status/1377183786949959682\n\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}\n`;\n","export default /* glsl */`\n#ifdef PREMULTIPLIED_ALPHA\n\n\t// Get get normal blending with premultipled, use with CustomBlending, OneFactor, OneMinusSrcAlphaFactor, AddEquation.\n\tgl_FragColor.rgb *= gl_FragColor.a;\n\n#endif\n`;\n","export default /* glsl */`\nvec4 mvPosition = vec4( transformed, 1.0 );\n\n#ifdef USE_INSTANCING\n\n\tmvPosition = instanceMatrix * mvPosition;\n\n#endif\n\nmvPosition = modelViewMatrix * mvPosition;\n\ngl_Position = projectionMatrix * mvPosition;\n`;\n","export default /* glsl */`\n#ifdef DITHERING\n\n\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef DITHERING\n\n\t// based on https://www.shadertoy.com/view/MslGR8\n\tvec3 dithering( vec3 color ) {\n\t\t//Calculate grid position\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\n\t\t//Shift the individual colors differently, thus making it even harder to see the dithering pattern\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\n\t\t//modify shift acording to grid position.\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\n\t\t//shift the color by dither_shift\n\t\treturn color + dither_shift_RGB;\n\t}\n\n#endif\n`;\n","export default /* glsl */`\nfloat roughnessFactor = roughness;\n\n#ifdef USE_ROUGHNESSMAP\n\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\n\t// reads channel G, compatible with a combined OcclusionRoughnessMetallic (RGB) texture\n\troughnessFactor *= texelRoughness.g;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_ROUGHNESSMAP\n\n\tuniform sampler2D roughnessMap;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_SHADOWMAP\n\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\n\t#endif\n\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\n\t#endif\n\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\n\t#endif\n\n\t/*\n\t#if NUM_RECT_AREA_LIGHTS > 0\n\n\t\t// TODO (abelnation): create uniforms for area light shadows\n\n\t#endif\n\t*/\n\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\n\t}\n\n\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\n\n\t\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\n\n\t}\n\n\tfloat VSMShadow (sampler2D shadow, vec2 uv, float compare ){\n\n\t\tfloat occlusion = 1.0;\n\n\t\tvec2 distribution = texture2DDistribution( shadow, uv );\n\n\t\tfloat hard_shadow = step( compare , distribution.x ); // Hard Shadow\n\n\t\tif (hard_shadow != 1.0 ) {\n\n\t\t\tfloat distance = compare - distribution.x ;\n\t\t\tfloat variance = max( 0.00000, distribution.y * distribution.y );\n\t\t\tfloat softness_probability = variance / (variance + distance * distance ); // Chebeyshevs inequality\n\t\t\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 ); // 0.3 reduces light bleed\n\t\t\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\n\n\t\t}\n\t\treturn occlusion;\n\n\t}\n\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\n\t\tfloat shadow = 1.0;\n\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\n\t\t// if ( something && something ) breaks ATI OpenGL shader compiler\n\t\t// if ( all( something, something ) ) using this instead\n\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\n\t\tbool frustumTest = all( frustumTestVec );\n\n\t\tif ( frustumTest ) {\n\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tfloat dx2 = dx0 / 2.0;\n\t\t\tfloat dy2 = dy0 / 2.0;\n\t\t\tfloat dx3 = dx1 / 2.0;\n\t\t\tfloat dy3 = dy1 / 2.0;\n\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 17.0 );\n\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx = texelSize.x;\n\t\t\tfloat dy = texelSize.y;\n\n\t\t\tvec2 uv = shadowCoord.xy;\n\t\t\tvec2 f = fract( uv * shadowMapSize + 0.5 );\n\t\t\tuv -= f * texelSize;\n\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ), \n\t\t\t\t\t\t  texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t  f.x ),\n\t\t\t\t\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ), \n\t\t\t\t\t\t  texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t  f.x ),\n\t\t\t\t\t f.y )\n\t\t\t) * ( 1.0 / 9.0 );\n\n\t\t#elif defined( SHADOWMAP_TYPE_VSM )\n\n\t\t\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\n\n\t\t#else // no percentage-closer filtering:\n\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\n\t\t#endif\n\n\t\t}\n\n\t\treturn shadow;\n\n\t}\n\n\t// cubeToUV() maps a 3D direction vector suitable for cube texture mapping to a 2D\n\t// vector suitable for 2D texture mapping. This code uses the following layout for the\n\t// 2D texture:\n\t//\n\t// xzXZ\n\t//  y Y\n\t//\n\t// Y - Positive y direction\n\t// y - Negative y direction\n\t// X - Positive x direction\n\t// x - Negative x direction\n\t// Z - Positive z direction\n\t// z - Negative z direction\n\t//\n\t// Source and test bed:\n\t// https://gist.github.com/tschw/da10c43c467ce8afd0c4\n\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\n\t\t// Number of texels to avoid at the edge of each square\n\n\t\tvec3 absV = abs( v );\n\n\t\t// Intersect unit cube\n\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\n\t\t// Apply scale to avoid seams\n\n\t\t// two texels less per square (one texel will do for NEAREST)\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\n\t\t// Unwrap\n\n\t\t// space: -1 ... 1 range for each square\n\t\t//\n\t\t// #X##\t\tdim    := ( 4 , 2 )\n\t\t//  # #\t\tcenter := ( 1 , 1 )\n\n\t\tvec2 planar = v.xy;\n\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\n\t\tif ( absV.z >= almostOne ) {\n\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\n\t\t} else if ( absV.x >= almostOne ) {\n\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\n\t\t} else if ( absV.y >= almostOne ) {\n\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\n\t\t}\n\n\t\t// Transform to UV space\n\n\t\t// scale := 0.5 / dim\n\t\t// translate := ( center + 0.5 ) / dim\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\n\t}\n\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\n\t\t// for point lights, the uniform @vShadowCoord is re-purposed to hold\n\t\t// the vector from the light to the world-space position of the fragment.\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\n\t\t// dp = normalized distance from light to fragment position\n\t\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear ); // need to clamp?\n\t\tdp += shadowBias;\n\n\t\t// bd3D = base direction 3D\n\t\tvec3 bd3D = normalize( lightToPosition );\n\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\n\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\n\t\t#else // no percentage-closer filtering\n\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\n\t\t#endif\n\n\t}\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_SHADOWMAP\n\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\n\t#endif\n\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\n\t#endif\n\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\n\t#endif\n\n\t/*\n\t#if NUM_RECT_AREA_LIGHTS > 0\n\n\t\t// TODO (abelnation): uniforms for area light shadows\n\n\t#endif\n\t*/\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_SHADOWMAP\n\n\t#if NUM_DIR_LIGHT_SHADOWS > 0 || NUM_SPOT_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0\n\n\t\t// Offsetting the position used for querying occlusion along the world normal can be used to reduce shadow acne.\n\t\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\tvec4 shadowWorldPosition;\n\n\t#endif\n\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\n\n\t}\n\t#pragma unroll_loop_end\n\n\t#endif\n\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * shadowWorldPosition;\n\n\t}\n\t#pragma unroll_loop_end\n\n\t#endif\n\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\n\n\t}\n\t#pragma unroll_loop_end\n\n\t#endif\n\n\t/*\n\t#if NUM_RECT_AREA_LIGHTS > 0\n\n\t\t// TODO (abelnation): update vAreaShadowCoord with area light info\n\n\t#endif\n\t*/\n\n#endif\n`;\n","export default /* glsl */`\nfloat getShadowMask() {\n\n\tfloat shadow = 1.0;\n\n\t#ifdef USE_SHADOWMAP\n\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\n\tDirectionalLightShadow directionalLight;\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\n\t\tdirectionalLight = directionalLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\n\t}\n\t#pragma unroll_loop_end\n\n\t#endif\n\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\n\tSpotLightShadow spotLight;\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\n\t\tspotLight = spotLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\n\t}\n\t#pragma unroll_loop_end\n\n\t#endif\n\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\n\tPointLightShadow pointLight;\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\n\t\tpointLight = pointLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\n\t}\n\t#pragma unroll_loop_end\n\n\t#endif\n\n\t/*\n\t#if NUM_RECT_AREA_LIGHTS > 0\n\n\t\t// TODO (abelnation): update shadow for Area light\n\n\t#endif\n\t*/\n\n\t#endif\n\n\treturn shadow;\n\n}\n`;\n","export default /* glsl */`\n#ifdef USE_SKINNING\n\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_SKINNING\n\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\n\t#ifdef BONE_TEXTURE\n\n\t\tuniform highp sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\n\t\tmat4 getBoneMatrix( const in float i ) {\n\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\t\tfloat y = floor( j / float( boneTextureSize ) );\n\n\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\n\n\t\t\ty = dy * ( y + 0.5 );\n\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\n\t\t\treturn bone;\n\n\t\t}\n\n\t#else\n\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\n\t\tmat4 getBoneMatrix( const in float i ) {\n\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\n\t\t}\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_SKINNING\n\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_SKINNING\n\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\n\t#ifdef USE_TANGENT\n\n\t\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\nfloat specularStrength;\n\n#ifdef USE_SPECULARMAP\n\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n\n#else\n\n\tspecularStrength = 1.0;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_SPECULARMAP\n\n\tuniform sampler2D specularMap;\n\n#endif\n`;\n","export default /* glsl */`\n#if defined( TONE_MAPPING )\n\n\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n\n#endif\n`;\n","export default /* glsl */`\n#ifndef saturate\n// <common> may have defined saturate() already\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\n\nuniform float toneMappingExposure;\n\n// exposure only\nvec3 LinearToneMapping( vec3 color ) {\n\n\treturn toneMappingExposure * color;\n\n}\n\n// source: https://www.cs.utah.edu/docs/techreports/2002/pdf/UUCS-02-001.pdf\nvec3 ReinhardToneMapping( vec3 color ) {\n\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n\n}\n\n// source: http://filmicworlds.com/blog/filmic-tonemapping-operators/\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\n\t// optimized filmic operator by Jim Hejl and Richard Burgess-Dawson\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n\n}\n\n// source: https://github.com/selfshadow/ltc_code/blob/master/webgl/shaders/ltc/ltc_blit.fs\nvec3 RRTAndODTFit( vec3 v ) {\n\n\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\n\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\n\treturn a / b;\n\n}\n\n// this implementation of ACES is modified to accommodate a brighter viewing environment.\n// the scale factor of 1/0.6 is subjective. see discussion in #19621.\n\nvec3 ACESFilmicToneMapping( vec3 color ) {\n\n\t// sRGB => XYZ => D65_2_D60 => AP1 => RRT_SAT\n\tconst mat3 ACESInputMat = mat3(\n\t\tvec3( 0.59719, 0.07600, 0.02840 ), // transposed from source\n\t\tvec3( 0.35458, 0.90834, 0.13383 ),\n\t\tvec3( 0.04823, 0.01566, 0.83777 )\n\t);\n\n\t// ODT_SAT => XYZ => D60_2_D65 => sRGB\n\tconst mat3 ACESOutputMat = mat3(\n\t\tvec3(  1.60475, -0.10208, -0.00327 ), // transposed from source\n\t\tvec3( -0.53108,  1.10813, -0.07276 ),\n\t\tvec3( -0.07367, -0.00605,  1.07602 )\n\t);\n\n\tcolor *= toneMappingExposure / 0.6;\n\n\tcolor = ACESInputMat * color;\n\n\t// Apply RRT and ODT\n\tcolor = RRTAndODTFit( color );\n\n\tcolor = ACESOutputMat * color;\n\n\t// Clamp to [0, 1]\n\treturn saturate( color );\n\n}\n\nvec3 CustomToneMapping( vec3 color ) { return color; }\n`;\n","export default /* glsl */`\n#ifdef USE_TRANSMISSION\n\n\tfloat transmissionAlpha = 1.0;\n\tfloat transmissionFactor = transmission;\n\tfloat thicknessFactor = thickness;\n\n\t#ifdef USE_TRANSMISSIONMAP\n\n\t\ttransmissionFactor *= texture2D( transmissionMap, vUv ).r;\n\n\t#endif\n\n\t#ifdef USE_THICKNESSMAP\n\n\t\tthicknessFactor *= texture2D( thicknessMap, vUv ).g;\n\n\t#endif\n\n\tvec3 pos = vWorldPosition;\n\tvec3 v = normalize( cameraPosition - pos );\n\tvec3 n = inverseTransformDirection( normal, viewMatrix );\n\n\tvec4 transmission = getIBLVolumeRefraction(\n\t\tn, v, roughnessFactor, material.diffuseColor, material.specularColor, material.specularF90,\n\t\tpos, modelMatrix, viewMatrix, projectionMatrix, ior, thicknessFactor,\n\t\tattenuationColor, attenuationDistance );\n\n\ttotalDiffuse = mix( totalDiffuse, transmission.rgb, transmissionFactor );\n\ttransmissionAlpha = mix( transmissionAlpha, transmission.a, transmissionFactor );\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_TRANSMISSION\n\n\t// Transmission code is based on glTF-Sampler-Viewer\n\t// https://github.com/KhronosGroup/glTF-Sample-Viewer\n\n\tuniform float transmission;\n\tuniform float thickness;\n\tuniform float attenuationDistance;\n\tuniform vec3 attenuationColor;\n\n\t#ifdef USE_TRANSMISSIONMAP\n\n\t\tuniform sampler2D transmissionMap;\n\n\t#endif\n\n\t#ifdef USE_THICKNESSMAP\n\n\t\tuniform sampler2D thicknessMap;\n\n\t#endif\n\n\tuniform vec2 transmissionSamplerSize;\n\tuniform sampler2D transmissionSamplerMap;\n\n\tuniform mat4 modelMatrix;\n\tuniform mat4 projectionMatrix;\n\n\tvarying vec3 vWorldPosition;\n\n\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\n\n\t\t// Direction of refracted light.\n\t\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\n\n\t\t// Compute rotation-independant scaling of the model matrix.\n\t\tvec3 modelScale;\n\t\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\n\t\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\n\t\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\n\n\t\t// The thickness is specified in local space.\n\t\treturn normalize( refractionVector ) * thickness * modelScale;\n\n\t}\n\n\tfloat applyIorToRoughness( const in float roughness, const in float ior ) {\n\n\t\t// Scale roughness with IOR so that an IOR of 1.0 results in no microfacet refraction and\n\t\t// an IOR of 1.5 results in the default amount of microfacet refraction.\n\t\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\n\n\t}\n\n\tvec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\n\n\t\tfloat framebufferLod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\n\n\t\t#ifdef TEXTURE_LOD_EXT\n\n\t\t\treturn texture2DLodEXT( transmissionSamplerMap, fragCoord.xy, framebufferLod );\n\n\t\t#else\n\n\t\t\treturn texture2D( transmissionSamplerMap, fragCoord.xy, framebufferLod );\n\n\t\t#endif\n\n\t}\n\n\tvec3 applyVolumeAttenuation( const in vec3 radiance, const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\n\n\t\tif ( attenuationDistance == 0.0 ) {\n\n\t\t\t// Attenuation distance is +∞ (which we indicate by zero), i.e. the transmitted color is not attenuated at all.\n\t\t\treturn radiance;\n\n\t\t} else {\n\n\t\t\t// Compute light attenuation using Beer's law.\n\t\t\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\n\t\t\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance ); // Beer's law\n\t\t\treturn transmittance * radiance;\n\n\t\t}\n\n\t}\n\n\tvec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\n\t\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\n\t\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float ior, const in float thickness,\n\t\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\n\n\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\n\t\tvec3 refractedRayExit = position + transmissionRay;\n\n\t\t// Project refracted vector on the framebuffer, while mapping to normalized device coordinates.\n\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\trefractionCoords += 1.0;\n\t\trefractionCoords /= 2.0;\n\n\t\t// Sample framebuffer to get pixel the refracted ray hits.\n\t\tvec4 transmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\n\n\t\tvec3 attenuatedColor = applyVolumeAttenuation( transmittedLight.rgb, length( transmissionRay ), attenuationColor, attenuationDistance );\n\n\t\t// Get the specular component.\n\t\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\n\n\t\treturn vec4( ( 1.0 - F ) * attenuatedColor * diffuseColor, transmittedLight.a );\n\n\t}\n#endif\n`;\n","export default /* glsl */`\n#if ( defined( USE_UV ) && ! defined( UVS_VERTEX_ONLY ) )\n\n\tvarying vec2 vUv;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_UV\n\n\t#ifdef UVS_VERTEX_ONLY\n\n\t\tvec2 vUv;\n\n\t#else\n\n\t\tvarying vec2 vUv;\n\n\t#endif\n\n\tuniform mat3 uvTransform;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_UV\n\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\n#endif\n`;\n","export default /* glsl */`\n#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\n\tvarying vec2 vUv2;\n\n#endif\n`;\n","export default /* glsl */`\n#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n\n\tuniform mat3 uv2Transform;\n\n#endif\n`;\n","export default /* glsl */`\n#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\n\tvUv2 = ( uv2Transform * vec3( uv2, 1 ) ).xy;\n\n#endif\n`;\n","export default /* glsl */`\n#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION )\n\n\tvec4 worldPosition = vec4( transformed, 1.0 );\n\n\t#ifdef USE_INSTANCING\n\n\t\tworldPosition = instanceMatrix * worldPosition;\n\n\t#endif\n\n\tworldPosition = modelMatrix * worldPosition;\n\n#endif\n`;\n","export const vertex = /* glsl */`\nvarying vec2 vUv;\nuniform mat3 uvTransform;\n\nvoid main() {\n\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\n\tgl_Position = vec4( position.xy, 1.0, 1.0 );\n\n}\n`;\n\nexport const fragment = /* glsl */`\nuniform sampler2D t2D;\n\nvarying vec2 vUv;\n\nvoid main() {\n\n\tgl_FragColor = texture2D( t2D, vUv );\n\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\n}\n`;\n","export const vertex = /* glsl */`\nvarying vec3 vWorldDirection;\n\n#include <common>\n\nvoid main() {\n\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\n\tgl_Position.z = gl_Position.w; // set z to camera.far\n\n}\n`;\n\nexport const fragment = /* glsl */`\n#include <envmap_common_pars_fragment>\nuniform float opacity;\n\nvarying vec3 vWorldDirection;\n\n#include <cube_uv_reflection_fragment>\n\nvoid main() {\n\n\tvec3 vReflect = vWorldDirection;\n\t#include <envmap_fragment>\n\n\tgl_FragColor = envColor;\n\tgl_FragColor.a *= opacity;\n\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\n}\n`;\n","export const vertex = /* glsl */`\n#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\n// This is used for computing an equivalent of gl_FragCoord.z that is as high precision as possible.\n// Some platforms compute gl_FragCoord at a lower precision which makes the manually computed value better for\n// depth-based postprocessing effects. Reproduced on iPad with A10 processor / iPadOS 13.3.1.\nvarying vec2 vHighPrecisionZW;\n\nvoid main() {\n\n\t#include <uv_vertex>\n\n\t#include <skinbase_vertex>\n\n\t#ifdef USE_DISPLACEMENTMAP\n\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\n\t#endif\n\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\n\tvHighPrecisionZW = gl_Position.zw;\n\n}\n`;\n\nexport const fragment = /* glsl */`\n#if DEPTH_PACKING == 3200\n\n\tuniform float opacity;\n\n#endif\n\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvarying vec2 vHighPrecisionZW;\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( 1.0 );\n\n\t#if DEPTH_PACKING == 3200\n\n\t\tdiffuseColor.a = opacity;\n\n\t#endif\n\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\n\t#include <logdepthbuf_fragment>\n\n\t// Higher precision equivalent of gl_FragCoord.z. This assumes depthRange has been left to its default values.\n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\n\t#if DEPTH_PACKING == 3200\n\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\n\n\t#elif DEPTH_PACKING == 3201\n\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\n\t#endif\n\n}\n`;\n","export const vertex = /* glsl */`\n#define DISTANCE\n\nvarying vec3 vWorldPosition;\n\n#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\nvoid main() {\n\n\t#include <uv_vertex>\n\n\t#include <skinbase_vertex>\n\n\t#ifdef USE_DISPLACEMENTMAP\n\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\n\t#endif\n\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\n\tvWorldPosition = worldPosition.xyz;\n\n}\n`;\n\nexport const fragment = /* glsl */`\n#define DISTANCE\n\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvoid main () {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( 1.0 );\n\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist ); // clamp to [ 0, 1 ]\n\n\tgl_FragColor = packDepthToRGBA( dist );\n\n}\n`;\n","export const vertex = /* glsl */`\nvarying vec3 vWorldDirection;\n\n#include <common>\n\nvoid main() {\n\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\n}\n`;\n\nexport const fragment = /* glsl */`\nuniform sampler2D tEquirect;\n\nvarying vec3 vWorldDirection;\n\n#include <common>\n\nvoid main() {\n\n\tvec3 direction = normalize( vWorldDirection );\n\n\tvec2 sampleUV = equirectUv( direction );\n\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\n}\n`;\n","export const vertex = /* glsl */`\nuniform float scale;\nattribute float lineDistance;\n\nvarying float vLineDistance;\n\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\nvoid main() {\n\n\tvLineDistance = scale * lineDistance;\n\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n\n}\n`;\n\nexport const fragment = /* glsl */`\nuniform vec3 diffuse;\nuniform float opacity;\n\nuniform float dashSize;\nuniform float totalSize;\n\nvarying float vLineDistance;\n\n#include <common>\n#include <color_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\n\t\tdiscard;\n\n\t}\n\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\n\t#include <logdepthbuf_fragment>\n\t#include <color_fragment>\n\n\toutgoingLight = diffuseColor.rgb; // simple shader\n\n\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\n}\n`;\n","export const vertex = /* glsl */`\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\nvoid main() {\n\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\n\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\n\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinbase_vertex>\n\t\t#include <skinnormal_vertex>\n\t\t#include <defaultnormal_vertex>\n\n\t#endif\n\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <fog_vertex>\n\n}\n`;\n\nexport const fragment = /* glsl */`\nuniform vec3 diffuse;\nuniform float opacity;\n\n#ifndef FLAT_SHADED\n\n\tvarying vec3 vNormal;\n\n#endif\n\n#include <common>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <cube_uv_reflection_fragment>\n#include <fog_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\n\t// accumulation (baked indirect lighting only)\n\t#ifdef USE_LIGHTMAP\n\n\t\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\t\treflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity;\n\n\t#else\n\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\n\t#endif\n\n\t// modulation\n\t#include <aomap_fragment>\n\n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\n\t#include <envmap_fragment>\n\n\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n\n}\n`;\n","export const vertex = /* glsl */`\n#define LAMBERT\n\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\nvoid main() {\n\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <lights_lambert_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n`;\n\nexport const fragment = /* glsl */`\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n\n\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <cube_uv_reflection_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <emissivemap_fragment>\n\n\t// accumulation\n\n\t#ifdef DOUBLE_SIDED\n\n\t\treflectedLight.indirectDiffuse += ( gl_FrontFacing ) ? vIndirectFront : vIndirectBack;\n\n\t#else\n\n\t\treflectedLight.indirectDiffuse += vIndirectFront;\n\n\t#endif\n\n\t#include <lightmap_fragment>\n\n\treflectedLight.indirectDiffuse *= BRDF_Lambert( diffuseColor.rgb );\n\n\t#ifdef DOUBLE_SIDED\n\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\n\t#else\n\n\t\treflectedLight.directDiffuse = vLightFront;\n\n\t#endif\n\n\treflectedLight.directDiffuse *= BRDF_Lambert( diffuseColor.rgb ) * getShadowMask();\n\n\t// modulation\n\n\t#include <aomap_fragment>\n\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\n\t#include <envmap_fragment>\n\n\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n`;\n","export const vertex = /* glsl */`\n#define MATCAP\n\nvarying vec3 vViewPosition;\n\n#include <common>\n#include <uv_pars_vertex>\n#include <color_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <fog_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\nvoid main() {\n\n\t#include <uv_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n\n\tvViewPosition = - mvPosition.xyz;\n\n}\n`;\n\nexport const fragment = /* glsl */`\n#define MATCAP\n\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\n\nvarying vec3 vViewPosition;\n\n#include <common>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <fog_pars_fragment>\n#include <normal_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\n\tvec3 viewDir = normalize( vViewPosition );\n\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\n\tvec3 y = cross( viewDir, x );\n\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5; // 0.495 to remove artifacts caused by undersized matcap disks\n\n\t#ifdef USE_MATCAP\n\n\t\tvec4 matcapColor = texture2D( matcap, uv );\n\n\t#else\n\n\t\tvec4 matcapColor = vec4( vec3( mix( 0.2, 0.8, uv.y ) ), 1.0 ); // default if matcap is missing\n\n\t#endif\n\n\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\n\n\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n\n}\n`;\n","export const vertex = /* glsl */`\n#define NORMAL\n\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\n\tvarying vec3 vViewPosition;\n\n#endif\n\n#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\nvoid main() {\n\n\t#include <uv_vertex>\n\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\n\tvViewPosition = - mvPosition.xyz;\n\n#endif\n\n}\n`;\n\nexport const fragment = /* glsl */`\n#define NORMAL\n\nuniform float opacity;\n\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\n\tvarying vec3 vViewPosition;\n\n#endif\n\n#include <packing>\n#include <uv_pars_fragment>\n#include <normal_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\t#include <logdepthbuf_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n\n\t#ifdef OPAQUE\n\n\t\tgl_FragColor.a = 1.0;\n\n\t#endif\n\n}\n`;\n","export const vertex = /* glsl */`\n#define PHONG\n\nvarying vec3 vViewPosition;\n\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\nvoid main() {\n\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\n\tvViewPosition = - mvPosition.xyz;\n\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n\n}\n`;\n\nexport const fragment = /* glsl */`\n#define PHONG\n\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <cube_uv_reflection_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <normal_pars_fragment>\n#include <lights_phong_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\n\t// accumulation\n\t#include <lights_phong_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\n\t// modulation\n\t#include <aomap_fragment>\n\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\n\t#include <envmap_fragment>\n\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n\n}\n`;\n","export const vertex = /* glsl */`\n#define STANDARD\n\nvarying vec3 vViewPosition;\n\n#ifdef USE_TRANSMISSION\n\n\tvarying vec3 vWorldPosition;\n\n#endif\n\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\nvoid main() {\n\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\n\tvViewPosition = - mvPosition.xyz;\n\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n\n#ifdef USE_TRANSMISSION\n\n\tvWorldPosition = worldPosition.xyz;\n\n#endif\n}\n`;\n\nexport const fragment = /* glsl */`\n#define STANDARD\n\n#ifdef PHYSICAL\n\t#define IOR\n\t#define SPECULAR\n#endif\n\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n\n#ifdef IOR\n\tuniform float ior;\n#endif\n\n#ifdef SPECULAR\n\tuniform float specularIntensity;\n\tuniform vec3 specularColor;\n\n\t#ifdef USE_SPECULARINTENSITYMAP\n\t\tuniform sampler2D specularIntensityMap;\n\t#endif\n\n\t#ifdef USE_SPECULARCOLORMAP\n\t\tuniform sampler2D specularColorMap;\n\t#endif\n#endif\n\n#ifdef USE_CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n\n#ifdef USE_SHEEN\n\tuniform vec3 sheenColor;\n\tuniform float sheenRoughness;\n\n\t#ifdef USE_SHEENCOLORMAP\n\t\tuniform sampler2D sheenColorMap;\n\t#endif\n\n\t#ifdef USE_SHEENROUGHNESSMAP\n\t\tuniform sampler2D sheenRoughnessMap;\n\t#endif\n#endif\n\nvarying vec3 vViewPosition;\n\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <bsdfs>\n#include <cube_uv_reflection_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_physical_pars_fragment>\n#include <fog_pars_fragment>\n#include <lights_pars_begin>\n#include <normal_pars_fragment>\n#include <lights_physical_pars_fragment>\n#include <transmission_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <clearcoat_pars_fragment>\n#include <roughnessmap_pars_fragment>\n#include <metalnessmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <roughnessmap_fragment>\n\t#include <metalnessmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <clearcoat_normal_fragment_begin>\n\t#include <clearcoat_normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\n\t// accumulation\n\t#include <lights_physical_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\n\t// modulation\n\t#include <aomap_fragment>\n\n\tvec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\n\tvec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\n\n\t#include <transmission_fragment>\n\n\tvec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\n\n\t#ifdef USE_SHEEN\n\n\t\t// Sheen energy compensation approximation calculation can be found at the end of\n\t\t// https://drive.google.com/file/d/1T0D1VSyR4AllqIJTQAraEIzjlb5h4FKH/view?usp=sharing\n\t\tfloat sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor );\n\n\t\toutgoingLight = outgoingLight * sheenEnergyComp + sheenSpecular;\n\n\t#endif\n\n\t#ifdef USE_CLEARCOAT\n\n\t\tfloat dotNVcc = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) );\n\n\t\tvec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\n\n\t\toutgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + clearcoatSpecular * material.clearcoat;\n\n\t#endif\n\n\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n\n}\n`;\n","export const vertex = /* glsl */`\n#define TOON\n\nvarying vec3 vViewPosition;\n\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\nvoid main() {\n\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\n\tvViewPosition = - mvPosition.xyz;\n\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n\n}\n`;\n\nexport const fragment = /* glsl */`\n#define TOON\n\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <gradientmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <normal_pars_fragment>\n#include <lights_toon_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\n\t// accumulation\n\t#include <lights_toon_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\n\t// modulation\n\t#include <aomap_fragment>\n\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\n\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n\n}\n`;\n","export const vertex = /* glsl */`\nuniform float size;\nuniform float scale;\n\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\nvoid main() {\n\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <project_vertex>\n\n\tgl_PointSize = size;\n\n\t#ifdef USE_SIZEATTENUATION\n\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\n\t#endif\n\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <fog_vertex>\n\n}\n`;\n\nexport const fragment = /* glsl */`\nuniform vec3 diffuse;\nuniform float opacity;\n\n#include <common>\n#include <color_pars_fragment>\n#include <map_particle_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\n\t#include <logdepthbuf_fragment>\n\t#include <map_particle_fragment>\n\t#include <color_fragment>\n\t#include <alphatest_fragment>\n\n\toutgoingLight = diffuseColor.rgb;\n\n\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\n}\n`;\n","export const vertex = /* glsl */`\n#include <common>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n\nvoid main() {\n\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n\n}\n`;\n\nexport const fragment = /* glsl */`\nuniform vec3 color;\nuniform float opacity;\n\n#include <common>\n#include <packing>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\n\nvoid main() {\n\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\n}\n`;\n","export const vertex = /* glsl */`\nuniform float rotation;\nuniform vec2 center;\n\n#include <common>\n#include <uv_pars_vertex>\n#include <fog_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\nvoid main() {\n\n\t#include <uv_vertex>\n\n\tvec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\n\n\tvec2 scale;\n\tscale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );\n\tscale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );\n\n\t#ifndef USE_SIZEATTENUATION\n\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\n\t\tif ( isPerspective ) scale *= - mvPosition.z;\n\n\t#endif\n\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\n\tmvPosition.xy += rotatedPosition;\n\n\tgl_Position = projectionMatrix * mvPosition;\n\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n\n}\n`;\n\nexport const fragment = /* glsl */`\nuniform vec3 diffuse;\nuniform float opacity;\n\n#include <common>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\n\toutgoingLight = diffuseColor.rgb;\n\n\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\n}\n`;\n","import alphamap_fragment from './ShaderChunk/alphamap_fragment.glsl.js';\nimport alphamap_pars_fragment from './ShaderChunk/alphamap_pars_fragment.glsl.js';\nimport alphatest_fragment from './ShaderChunk/alphatest_fragment.glsl.js';\nimport alphatest_pars_fragment from './ShaderChunk/alphatest_pars_fragment.glsl.js';\nimport aomap_fragment from './ShaderChunk/aomap_fragment.glsl.js';\nimport aomap_pars_fragment from './ShaderChunk/aomap_pars_fragment.glsl.js';\nimport begin_vertex from './ShaderChunk/begin_vertex.glsl.js';\nimport beginnormal_vertex from './ShaderChunk/beginnormal_vertex.glsl.js';\nimport bsdfs from './ShaderChunk/bsdfs.glsl.js';\nimport bumpmap_pars_fragment from './ShaderChunk/bumpmap_pars_fragment.glsl.js';\nimport clipping_planes_fragment from './ShaderChunk/clipping_planes_fragment.glsl.js';\nimport clipping_planes_pars_fragment from './ShaderChunk/clipping_planes_pars_fragment.glsl.js';\nimport clipping_planes_pars_vertex from './ShaderChunk/clipping_planes_pars_vertex.glsl.js';\nimport clipping_planes_vertex from './ShaderChunk/clipping_planes_vertex.glsl.js';\nimport color_fragment from './ShaderChunk/color_fragment.glsl.js';\nimport color_pars_fragment from './ShaderChunk/color_pars_fragment.glsl.js';\nimport color_pars_vertex from './ShaderChunk/color_pars_vertex.glsl.js';\nimport color_vertex from './ShaderChunk/color_vertex.glsl.js';\nimport common from './ShaderChunk/common.glsl.js';\nimport cube_uv_reflection_fragment from './ShaderChunk/cube_uv_reflection_fragment.glsl.js';\nimport defaultnormal_vertex from './ShaderChunk/defaultnormal_vertex.glsl.js';\nimport displacementmap_pars_vertex from './ShaderChunk/displacementmap_pars_vertex.glsl.js';\nimport displacementmap_vertex from './ShaderChunk/displacementmap_vertex.glsl.js';\nimport emissivemap_fragment from './ShaderChunk/emissivemap_fragment.glsl.js';\nimport emissivemap_pars_fragment from './ShaderChunk/emissivemap_pars_fragment.glsl.js';\nimport encodings_fragment from './ShaderChunk/encodings_fragment.glsl.js';\nimport encodings_pars_fragment from './ShaderChunk/encodings_pars_fragment.glsl.js';\nimport envmap_fragment from './ShaderChunk/envmap_fragment.glsl.js';\nimport envmap_common_pars_fragment from './ShaderChunk/envmap_common_pars_fragment.glsl.js';\nimport envmap_pars_fragment from './ShaderChunk/envmap_pars_fragment.glsl.js';\nimport envmap_pars_vertex from './ShaderChunk/envmap_pars_vertex.glsl.js';\nimport envmap_vertex from './ShaderChunk/envmap_vertex.glsl.js';\nimport fog_vertex from './ShaderChunk/fog_vertex.glsl.js';\nimport fog_pars_vertex from './ShaderChunk/fog_pars_vertex.glsl.js';\nimport fog_fragment from './ShaderChunk/fog_fragment.glsl.js';\nimport fog_pars_fragment from './ShaderChunk/fog_pars_fragment.glsl.js';\nimport gradientmap_pars_fragment from './ShaderChunk/gradientmap_pars_fragment.glsl.js';\nimport lightmap_fragment from './ShaderChunk/lightmap_fragment.glsl.js';\nimport lightmap_pars_fragment from './ShaderChunk/lightmap_pars_fragment.glsl.js';\nimport lights_lambert_vertex from './ShaderChunk/lights_lambert_vertex.glsl.js';\nimport lights_pars_begin from './ShaderChunk/lights_pars_begin.glsl.js';\nimport envmap_physical_pars_fragment from './ShaderChunk/envmap_physical_pars_fragment.glsl.js';\nimport lights_toon_fragment from './ShaderChunk/lights_toon_fragment.glsl.js';\nimport lights_toon_pars_fragment from './ShaderChunk/lights_toon_pars_fragment.glsl.js';\nimport lights_phong_fragment from './ShaderChunk/lights_phong_fragment.glsl.js';\nimport lights_phong_pars_fragment from './ShaderChunk/lights_phong_pars_fragment.glsl.js';\nimport lights_physical_fragment from './ShaderChunk/lights_physical_fragment.glsl.js';\nimport lights_physical_pars_fragment from './ShaderChunk/lights_physical_pars_fragment.glsl.js';\nimport lights_fragment_begin from './ShaderChunk/lights_fragment_begin.glsl.js';\nimport lights_fragment_maps from './ShaderChunk/lights_fragment_maps.glsl.js';\nimport lights_fragment_end from './ShaderChunk/lights_fragment_end.glsl.js';\nimport logdepthbuf_fragment from './ShaderChunk/logdepthbuf_fragment.glsl.js';\nimport logdepthbuf_pars_fragment from './ShaderChunk/logdepthbuf_pars_fragment.glsl.js';\nimport logdepthbuf_pars_vertex from './ShaderChunk/logdepthbuf_pars_vertex.glsl.js';\nimport logdepthbuf_vertex from './ShaderChunk/logdepthbuf_vertex.glsl.js';\nimport map_fragment from './ShaderChunk/map_fragment.glsl.js';\nimport map_pars_fragment from './ShaderChunk/map_pars_fragment.glsl.js';\nimport map_particle_fragment from './ShaderChunk/map_particle_fragment.glsl.js';\nimport map_particle_pars_fragment from './ShaderChunk/map_particle_pars_fragment.glsl.js';\nimport metalnessmap_fragment from './ShaderChunk/metalnessmap_fragment.glsl.js';\nimport metalnessmap_pars_fragment from './ShaderChunk/metalnessmap_pars_fragment.glsl.js';\nimport morphnormal_vertex from './ShaderChunk/morphnormal_vertex.glsl.js';\nimport morphtarget_pars_vertex from './ShaderChunk/morphtarget_pars_vertex.glsl.js';\nimport morphtarget_vertex from './ShaderChunk/morphtarget_vertex.glsl.js';\nimport normal_fragment_begin from './ShaderChunk/normal_fragment_begin.glsl.js';\nimport normal_fragment_maps from './ShaderChunk/normal_fragment_maps.glsl.js';\nimport normal_pars_fragment from './ShaderChunk/normal_pars_fragment.glsl.js';\nimport normal_pars_vertex from './ShaderChunk/normal_pars_vertex.glsl.js';\nimport normal_vertex from './ShaderChunk/normal_vertex.glsl.js';\nimport normalmap_pars_fragment from './ShaderChunk/normalmap_pars_fragment.glsl.js';\nimport clearcoat_normal_fragment_begin from './ShaderChunk/clearcoat_normal_fragment_begin.glsl.js';\nimport clearcoat_normal_fragment_maps from './ShaderChunk/clearcoat_normal_fragment_maps.glsl.js';\nimport clearcoat_pars_fragment from './ShaderChunk/clearcoat_pars_fragment.glsl.js';\nimport output_fragment from './ShaderChunk/output_fragment.glsl.js';\nimport packing from './ShaderChunk/packing.glsl.js';\nimport premultiplied_alpha_fragment from './ShaderChunk/premultiplied_alpha_fragment.glsl.js';\nimport project_vertex from './ShaderChunk/project_vertex.glsl.js';\nimport dithering_fragment from './ShaderChunk/dithering_fragment.glsl.js';\nimport dithering_pars_fragment from './ShaderChunk/dithering_pars_fragment.glsl.js';\nimport roughnessmap_fragment from './ShaderChunk/roughnessmap_fragment.glsl.js';\nimport roughnessmap_pars_fragment from './ShaderChunk/roughnessmap_pars_fragment.glsl.js';\nimport shadowmap_pars_fragment from './ShaderChunk/shadowmap_pars_fragment.glsl.js';\nimport shadowmap_pars_vertex from './ShaderChunk/shadowmap_pars_vertex.glsl.js';\nimport shadowmap_vertex from './ShaderChunk/shadowmap_vertex.glsl.js';\nimport shadowmask_pars_fragment from './ShaderChunk/shadowmask_pars_fragment.glsl.js';\nimport skinbase_vertex from './ShaderChunk/skinbase_vertex.glsl.js';\nimport skinning_pars_vertex from './ShaderChunk/skinning_pars_vertex.glsl.js';\nimport skinning_vertex from './ShaderChunk/skinning_vertex.glsl.js';\nimport skinnormal_vertex from './ShaderChunk/skinnormal_vertex.glsl.js';\nimport specularmap_fragment from './ShaderChunk/specularmap_fragment.glsl.js';\nimport specularmap_pars_fragment from './ShaderChunk/specularmap_pars_fragment.glsl.js';\nimport tonemapping_fragment from './ShaderChunk/tonemapping_fragment.glsl.js';\nimport tonemapping_pars_fragment from './ShaderChunk/tonemapping_pars_fragment.glsl.js';\nimport transmission_fragment from './ShaderChunk/transmission_fragment.glsl.js';\nimport transmission_pars_fragment from './ShaderChunk/transmission_pars_fragment.glsl.js';\nimport uv_pars_fragment from './ShaderChunk/uv_pars_fragment.glsl.js';\nimport uv_pars_vertex from './ShaderChunk/uv_pars_vertex.glsl.js';\nimport uv_vertex from './ShaderChunk/uv_vertex.glsl.js';\nimport uv2_pars_fragment from './ShaderChunk/uv2_pars_fragment.glsl.js';\nimport uv2_pars_vertex from './ShaderChunk/uv2_pars_vertex.glsl.js';\nimport uv2_vertex from './ShaderChunk/uv2_vertex.glsl.js';\nimport worldpos_vertex from './ShaderChunk/worldpos_vertex.glsl.js';\n\nimport * as background from './ShaderLib/background.glsl.js';\nimport * as cube from './ShaderLib/cube.glsl.js';\nimport * as depth from './ShaderLib/depth.glsl.js';\nimport * as distanceRGBA from './ShaderLib/distanceRGBA.glsl.js';\nimport * as equirect from './ShaderLib/equirect.glsl.js';\nimport * as linedashed from './ShaderLib/linedashed.glsl.js';\nimport * as meshbasic from './ShaderLib/meshbasic.glsl.js';\nimport * as meshlambert from './ShaderLib/meshlambert.glsl.js';\nimport * as meshmatcap from './ShaderLib/meshmatcap.glsl.js';\nimport * as meshnormal from './ShaderLib/meshnormal.glsl.js';\nimport * as meshphong from './ShaderLib/meshphong.glsl.js';\nimport * as meshphysical from './ShaderLib/meshphysical.glsl.js';\nimport * as meshtoon from './ShaderLib/meshtoon.glsl.js';\nimport * as points from './ShaderLib/points.glsl.js';\nimport * as shadow from './ShaderLib/shadow.glsl.js';\nimport * as sprite from './ShaderLib/sprite.glsl.js';\n\nexport const ShaderChunk = {\n\talphamap_fragment: alphamap_fragment,\n\talphamap_pars_fragment: alphamap_pars_fragment,\n\talphatest_fragment: alphatest_fragment,\n\talphatest_pars_fragment: alphatest_pars_fragment,\n\taomap_fragment: aomap_fragment,\n\taomap_pars_fragment: aomap_pars_fragment,\n\tbegin_vertex: begin_vertex,\n\tbeginnormal_vertex: beginnormal_vertex,\n\tbsdfs: bsdfs,\n\tbumpmap_pars_fragment: bumpmap_pars_fragment,\n\tclipping_planes_fragment: clipping_planes_fragment,\n\tclipping_planes_pars_fragment: clipping_planes_pars_fragment,\n\tclipping_planes_pars_vertex: clipping_planes_pars_vertex,\n\tclipping_planes_vertex: clipping_planes_vertex,\n\tcolor_fragment: color_fragment,\n\tcolor_pars_fragment: color_pars_fragment,\n\tcolor_pars_vertex: color_pars_vertex,\n\tcolor_vertex: color_vertex,\n\tcommon: common,\n\tcube_uv_reflection_fragment: cube_uv_reflection_fragment,\n\tdefaultnormal_vertex: defaultnormal_vertex,\n\tdisplacementmap_pars_vertex: displacementmap_pars_vertex,\n\tdisplacementmap_vertex: displacementmap_vertex,\n\temissivemap_fragment: emissivemap_fragment,\n\temissivemap_pars_fragment: emissivemap_pars_fragment,\n\tencodings_fragment: encodings_fragment,\n\tencodings_pars_fragment: encodings_pars_fragment,\n\tenvmap_fragment: envmap_fragment,\n\tenvmap_common_pars_fragment: envmap_common_pars_fragment,\n\tenvmap_pars_fragment: envmap_pars_fragment,\n\tenvmap_pars_vertex: envmap_pars_vertex,\n\tenvmap_physical_pars_fragment: envmap_physical_pars_fragment,\n\tenvmap_vertex: envmap_vertex,\n\tfog_vertex: fog_vertex,\n\tfog_pars_vertex: fog_pars_vertex,\n\tfog_fragment: fog_fragment,\n\tfog_pars_fragment: fog_pars_fragment,\n\tgradientmap_pars_fragment: gradientmap_pars_fragment,\n\tlightmap_fragment: lightmap_fragment,\n\tlightmap_pars_fragment: lightmap_pars_fragment,\n\tlights_lambert_vertex: lights_lambert_vertex,\n\tlights_pars_begin: lights_pars_begin,\n\tlights_toon_fragment: lights_toon_fragment,\n\tlights_toon_pars_fragment: lights_toon_pars_fragment,\n\tlights_phong_fragment: lights_phong_fragment,\n\tlights_phong_pars_fragment: lights_phong_pars_fragment,\n\tlights_physical_fragment: lights_physical_fragment,\n\tlights_physical_pars_fragment: lights_physical_pars_fragment,\n\tlights_fragment_begin: lights_fragment_begin,\n\tlights_fragment_maps: lights_fragment_maps,\n\tlights_fragment_end: lights_fragment_end,\n\tlogdepthbuf_fragment: logdepthbuf_fragment,\n\tlogdepthbuf_pars_fragment: logdepthbuf_pars_fragment,\n\tlogdepthbuf_pars_vertex: logdepthbuf_pars_vertex,\n\tlogdepthbuf_vertex: logdepthbuf_vertex,\n\tmap_fragment: map_fragment,\n\tmap_pars_fragment: map_pars_fragment,\n\tmap_particle_fragment: map_particle_fragment,\n\tmap_particle_pars_fragment: map_particle_pars_fragment,\n\tmetalnessmap_fragment: metalnessmap_fragment,\n\tmetalnessmap_pars_fragment: metalnessmap_pars_fragment,\n\tmorphnormal_vertex: morphnormal_vertex,\n\tmorphtarget_pars_vertex: morphtarget_pars_vertex,\n\tmorphtarget_vertex: morphtarget_vertex,\n\tnormal_fragment_begin: normal_fragment_begin,\n\tnormal_fragment_maps: normal_fragment_maps,\n\tnormal_pars_fragment: normal_pars_fragment,\n\tnormal_pars_vertex: normal_pars_vertex,\n\tnormal_vertex: normal_vertex,\n\tnormalmap_pars_fragment: normalmap_pars_fragment,\n\tclearcoat_normal_fragment_begin: clearcoat_normal_fragment_begin,\n\tclearcoat_normal_fragment_maps: clearcoat_normal_fragment_maps,\n\tclearcoat_pars_fragment: clearcoat_pars_fragment,\n\toutput_fragment: output_fragment,\n\tpacking: packing,\n\tpremultiplied_alpha_fragment: premultiplied_alpha_fragment,\n\tproject_vertex: project_vertex,\n\tdithering_fragment: dithering_fragment,\n\tdithering_pars_fragment: dithering_pars_fragment,\n\troughnessmap_fragment: roughnessmap_fragment,\n\troughnessmap_pars_fragment: roughnessmap_pars_fragment,\n\tshadowmap_pars_fragment: shadowmap_pars_fragment,\n\tshadowmap_pars_vertex: shadowmap_pars_vertex,\n\tshadowmap_vertex: shadowmap_vertex,\n\tshadowmask_pars_fragment: shadowmask_pars_fragment,\n\tskinbase_vertex: skinbase_vertex,\n\tskinning_pars_vertex: skinning_pars_vertex,\n\tskinning_vertex: skinning_vertex,\n\tskinnormal_vertex: skinnormal_vertex,\n\tspecularmap_fragment: specularmap_fragment,\n\tspecularmap_pars_fragment: specularmap_pars_fragment,\n\ttonemapping_fragment: tonemapping_fragment,\n\ttonemapping_pars_fragment: tonemapping_pars_fragment,\n\ttransmission_fragment: transmission_fragment,\n\ttransmission_pars_fragment: transmission_pars_fragment,\n\tuv_pars_fragment: uv_pars_fragment,\n\tuv_pars_vertex: uv_pars_vertex,\n\tuv_vertex: uv_vertex,\n\tuv2_pars_fragment: uv2_pars_fragment,\n\tuv2_pars_vertex: uv2_pars_vertex,\n\tuv2_vertex: uv2_vertex,\n\tworldpos_vertex: worldpos_vertex,\n\n\tbackground_vert: background.vertex,\n\tbackground_frag: background.fragment,\n\tcube_vert: cube.vertex,\n\tcube_frag: cube.fragment,\n\tdepth_vert: depth.vertex,\n\tdepth_frag: depth.fragment,\n\tdistanceRGBA_vert: distanceRGBA.vertex,\n\tdistanceRGBA_frag: distanceRGBA.fragment,\n\tequirect_vert: equirect.vertex,\n\tequirect_frag: equirect.fragment,\n\tlinedashed_vert: linedashed.vertex,\n\tlinedashed_frag: linedashed.fragment,\n\tmeshbasic_vert: meshbasic.vertex,\n\tmeshbasic_frag: meshbasic.fragment,\n\tmeshlambert_vert: meshlambert.vertex,\n\tmeshlambert_frag: meshlambert.fragment,\n\tmeshmatcap_vert: meshmatcap.vertex,\n\tmeshmatcap_frag: meshmatcap.fragment,\n\tmeshnormal_vert: meshnormal.vertex,\n\tmeshnormal_frag: meshnormal.fragment,\n\tmeshphong_vert: meshphong.vertex,\n\tmeshphong_frag: meshphong.fragment,\n\tmeshphysical_vert: meshphysical.vertex,\n\tmeshphysical_frag: meshphysical.fragment,\n\tmeshtoon_vert: meshtoon.vertex,\n\tmeshtoon_frag: meshtoon.fragment,\n\tpoints_vert: points.vertex,\n\tpoints_frag: points.fragment,\n\tshadow_vert: shadow.vertex,\n\tshadow_frag: shadow.fragment,\n\tsprite_vert: sprite.vertex,\n\tsprite_frag: sprite.fragment\n};\n","import { Color } from '../../math/Color.js';\nimport { Vector2 } from '../../math/Vector2.js';\nimport { Matrix3 } from '../../math/Matrix3.js';\n\n/**\n * Uniforms library for shared webgl shaders\n */\n\nconst UniformsLib = {\n\n\tcommon: {\n\n\t\tdiffuse: { value: new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\n\t\tmap: { value: null },\n\t\tuvTransform: { value: new Matrix3() },\n\t\tuv2Transform: { value: new Matrix3() },\n\n\t\talphaMap: { value: null },\n\t\talphaTest: { value: 0 }\n\n\t},\n\n\tspecularmap: {\n\n\t\tspecularMap: { value: null },\n\n\t},\n\n\tenvmap: {\n\n\t\tenvMap: { value: null },\n\t\tflipEnvMap: { value: - 1 },\n\t\treflectivity: { value: 1.0 }, // basic, lambert, phong\n\t\tior: { value: 1.5 }, // standard, physical\n\t\trefractionRatio: { value: 0.98 }\n\n\t},\n\n\taomap: {\n\n\t\taoMap: { value: null },\n\t\taoMapIntensity: { value: 1 }\n\n\t},\n\n\tlightmap: {\n\n\t\tlightMap: { value: null },\n\t\tlightMapIntensity: { value: 1 }\n\n\t},\n\n\temissivemap: {\n\n\t\temissiveMap: { value: null }\n\n\t},\n\n\tbumpmap: {\n\n\t\tbumpMap: { value: null },\n\t\tbumpScale: { value: 1 }\n\n\t},\n\n\tnormalmap: {\n\n\t\tnormalMap: { value: null },\n\t\tnormalScale: { value: new Vector2( 1, 1 ) }\n\n\t},\n\n\tdisplacementmap: {\n\n\t\tdisplacementMap: { value: null },\n\t\tdisplacementScale: { value: 1 },\n\t\tdisplacementBias: { value: 0 }\n\n\t},\n\n\troughnessmap: {\n\n\t\troughnessMap: { value: null }\n\n\t},\n\n\tmetalnessmap: {\n\n\t\tmetalnessMap: { value: null }\n\n\t},\n\n\tgradientmap: {\n\n\t\tgradientMap: { value: null }\n\n\t},\n\n\tfog: {\n\n\t\tfogDensity: { value: 0.00025 },\n\t\tfogNear: { value: 1 },\n\t\tfogFar: { value: 2000 },\n\t\tfogColor: { value: new Color( 0xffffff ) }\n\n\t},\n\n\tlights: {\n\n\t\tambientLightColor: { value: [] },\n\n\t\tlightProbe: { value: [] },\n\n\t\tdirectionalLights: { value: [], properties: {\n\t\t\tdirection: {},\n\t\t\tcolor: {}\n\t\t} },\n\n\t\tdirectionalLightShadows: { value: [], properties: {\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {}\n\t\t} },\n\n\t\tdirectionalShadowMap: { value: [] },\n\t\tdirectionalShadowMatrix: { value: [] },\n\n\t\tspotLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\tdirection: {},\n\t\t\tdistance: {},\n\t\t\tconeCos: {},\n\t\t\tpenumbraCos: {},\n\t\t\tdecay: {}\n\t\t} },\n\n\t\tspotLightShadows: { value: [], properties: {\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {}\n\t\t} },\n\n\t\tspotShadowMap: { value: [] },\n\t\tspotShadowMatrix: { value: [] },\n\n\t\tpointLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\tdecay: {},\n\t\t\tdistance: {}\n\t\t} },\n\n\t\tpointLightShadows: { value: [], properties: {\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {},\n\t\t\tshadowCameraNear: {},\n\t\t\tshadowCameraFar: {}\n\t\t} },\n\n\t\tpointShadowMap: { value: [] },\n\t\tpointShadowMatrix: { value: [] },\n\n\t\themisphereLights: { value: [], properties: {\n\t\t\tdirection: {},\n\t\t\tskyColor: {},\n\t\t\tgroundColor: {}\n\t\t} },\n\n\t\t// TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src\n\t\trectAreaLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\twidth: {},\n\t\t\theight: {}\n\t\t} },\n\n\t\tltc_1: { value: null },\n\t\tltc_2: { value: null }\n\n\t},\n\n\tpoints: {\n\n\t\tdiffuse: { value: new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\t\tsize: { value: 1.0 },\n\t\tscale: { value: 1.0 },\n\t\tmap: { value: null },\n\t\talphaMap: { value: null },\n\t\talphaTest: { value: 0 },\n\t\tuvTransform: { value: new Matrix3() }\n\n\t},\n\n\tsprite: {\n\n\t\tdiffuse: { value: new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\t\tcenter: { value: new Vector2( 0.5, 0.5 ) },\n\t\trotation: { value: 0.0 },\n\t\tmap: { value: null },\n\t\talphaMap: { value: null },\n\t\talphaTest: { value: 0 },\n\t\tuvTransform: { value: new Matrix3() }\n\n\t}\n\n};\n\nexport { UniformsLib };\n","import { ShaderChunk } from './ShaderChunk.js';\nimport { mergeUniforms } from './UniformsUtils.js';\nimport { Vector2 } from '../../math/Vector2.js';\nimport { Vector3 } from '../../math/Vector3.js';\nimport { UniformsLib } from './UniformsLib.js';\nimport { Color } from '../../math/Color.js';\nimport { Matrix3 } from '../../math/Matrix3.js';\n\nconst ShaderLib = {\n\n\tbasic: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshbasic_vert,\n\t\tfragmentShader: ShaderChunk.meshbasic_frag\n\n\t},\n\n\tlambert: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: new Color( 0x000000 ) }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshlambert_vert,\n\t\tfragmentShader: ShaderChunk.meshlambert_frag\n\n\t},\n\n\tphong: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: new Color( 0x000000 ) },\n\t\t\t\tspecular: { value: new Color( 0x111111 ) },\n\t\t\t\tshininess: { value: 30 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphong_vert,\n\t\tfragmentShader: ShaderChunk.meshphong_frag\n\n\t},\n\n\tstandard: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.roughnessmap,\n\t\t\tUniformsLib.metalnessmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: new Color( 0x000000 ) },\n\t\t\t\troughness: { value: 1.0 },\n\t\t\t\tmetalness: { value: 0.0 },\n\t\t\t\tenvMapIntensity: { value: 1 } // temporary\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphysical_vert,\n\t\tfragmentShader: ShaderChunk.meshphysical_frag\n\n\t},\n\n\ttoon: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.gradientmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: new Color( 0x000000 ) }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshtoon_vert,\n\t\tfragmentShader: ShaderChunk.meshtoon_frag\n\n\t},\n\n\tmatcap: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tmatcap: { value: null }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshmatcap_vert,\n\t\tfragmentShader: ShaderChunk.meshmatcap_frag\n\n\t},\n\n\tpoints: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.points,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.points_vert,\n\t\tfragmentShader: ShaderChunk.points_frag\n\n\t},\n\n\tdashed: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tscale: { value: 1 },\n\t\t\t\tdashSize: { value: 1 },\n\t\t\t\ttotalSize: { value: 2 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.linedashed_vert,\n\t\tfragmentShader: ShaderChunk.linedashed_frag\n\n\t},\n\n\tdepth: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.displacementmap\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.depth_vert,\n\t\tfragmentShader: ShaderChunk.depth_frag\n\n\t},\n\n\tnormal: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\t{\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshnormal_vert,\n\t\tfragmentShader: ShaderChunk.meshnormal_frag\n\n\t},\n\n\tsprite: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.sprite,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.sprite_vert,\n\t\tfragmentShader: ShaderChunk.sprite_frag\n\n\t},\n\n\tbackground: {\n\n\t\tuniforms: {\n\t\t\tuvTransform: { value: new Matrix3() },\n\t\t\tt2D: { value: null },\n\t\t},\n\n\t\tvertexShader: ShaderChunk.background_vert,\n\t\tfragmentShader: ShaderChunk.background_frag\n\n\t},\n\t/* -------------------------------------------------------------------------\n\t//\tCube map shader\n\t ------------------------------------------------------------------------- */\n\n\tcube: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.envmap,\n\t\t\t{\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.cube_vert,\n\t\tfragmentShader: ShaderChunk.cube_frag\n\n\t},\n\n\tequirect: {\n\n\t\tuniforms: {\n\t\t\ttEquirect: { value: null },\n\t\t},\n\n\t\tvertexShader: ShaderChunk.equirect_vert,\n\t\tfragmentShader: ShaderChunk.equirect_frag\n\n\t},\n\n\tdistanceRGBA: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.displacementmap,\n\t\t\t{\n\t\t\t\treferencePosition: { value: new Vector3() },\n\t\t\t\tnearDistance: { value: 1 },\n\t\t\t\tfarDistance: { value: 1000 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.distanceRGBA_vert,\n\t\tfragmentShader: ShaderChunk.distanceRGBA_frag\n\n\t},\n\n\tshadow: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.lights,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tcolor: { value: new Color( 0x00000 ) },\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t},\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.shadow_vert,\n\t\tfragmentShader: ShaderChunk.shadow_frag\n\n\t}\n\n};\n\nShaderLib.physical = {\n\n\tuniforms: mergeUniforms( [\n\t\tShaderLib.standard.uniforms,\n\t\t{\n\t\t\tclearcoat: { value: 0 },\n\t\t\tclearcoatMap: { value: null },\n\t\t\tclearcoatRoughness: { value: 0 },\n\t\t\tclearcoatRoughnessMap: { value: null },\n\t\t\tclearcoatNormalScale: { value: new Vector2( 1, 1 ) },\n\t\t\tclearcoatNormalMap: { value: null },\n\t\t\tsheen: { value: 0 },\n\t\t\tsheenColor: { value: new Color( 0x000000 ) },\n\t\t\tsheenColorMap: { value: null },\n\t\t\tsheenRoughness: { value: 1 },\n\t\t\tsheenRoughnessMap: { value: null },\n\t\t\ttransmission: { value: 0 },\n\t\t\ttransmissionMap: { value: null },\n\t\t\ttransmissionSamplerSize: { value: new Vector2() },\n\t\t\ttransmissionSamplerMap: { value: null },\n\t\t\tthickness: { value: 0 },\n\t\t\tthicknessMap: { value: null },\n\t\t\tattenuationDistance: { value: 0 },\n\t\t\tattenuationColor: { value: new Color( 0x000000 ) },\n\t\t\tspecularIntensity: { value: 1 },\n\t\t\tspecularIntensityMap: { value: null },\n\t\t\tspecularColor: { value: new Color( 1, 1, 1 ) },\n\t\t\tspecularColorMap: { value: null },\n\t\t}\n\t] ),\n\n\tvertexShader: ShaderChunk.meshphysical_vert,\n\tfragmentShader: ShaderChunk.meshphysical_frag\n\n};\n\n\nexport { ShaderLib };\n","import { BackSide, FrontSide, CubeUVReflectionMapping } from '../../constants.js';\nimport { BoxGeometry } from '../../geometries/BoxGeometry.js';\nimport { PlaneGeometry } from '../../geometries/PlaneGeometry.js';\nimport { ShaderMaterial } from '../../materials/ShaderMaterial.js';\nimport { Color } from '../../math/Color.js';\nimport { Mesh } from '../../objects/Mesh.js';\nimport { ShaderLib } from '../shaders/ShaderLib.js';\nimport { cloneUniforms } from '../shaders/UniformsUtils.js';\n\nfunction WebGLBackground( renderer, cubemaps, state, objects, alpha, premultipliedAlpha ) {\n\n\tconst clearColor = new Color( 0x000000 );\n\tlet clearAlpha = alpha === true ? 0 : 1;\n\n\tlet planeMesh;\n\tlet boxMesh;\n\n\tlet currentBackground = null;\n\tlet currentBackgroundVersion = 0;\n\tlet currentTonemapping = null;\n\n\tfunction render( renderList, scene ) {\n\n\t\tlet forceClear = false;\n\t\tlet background = scene.isScene === true ? scene.background : null;\n\n\t\tif ( background && background.isTexture ) {\n\n\t\t\tbackground = cubemaps.get( background );\n\n\t\t}\n\n\t\t// Ignore background in AR\n\t\t// TODO: Reconsider this.\n\n\t\tconst xr = renderer.xr;\n\t\tconst session = xr.getSession && xr.getSession();\n\n\t\tif ( session && session.environmentBlendMode === 'additive' ) {\n\n\t\t\tbackground = null;\n\n\t\t}\n\n\t\tif ( background === null ) {\n\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t} else if ( background && background.isColor ) {\n\n\t\t\tsetClear( background, 1 );\n\t\t\tforceClear = true;\n\n\t\t}\n\n\t\tif ( renderer.autoClear || forceClear ) {\n\n\t\t\trenderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );\n\n\t\t}\n\n\t\tif ( background && ( background.isCubeTexture || background.mapping === CubeUVReflectionMapping ) ) {\n\n\t\t\tif ( boxMesh === undefined ) {\n\n\t\t\t\tboxMesh = new Mesh(\n\t\t\t\t\tnew BoxGeometry( 1, 1, 1 ),\n\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\tname: 'BackgroundCubeMaterial',\n\t\t\t\t\t\tuniforms: cloneUniforms( ShaderLib.cube.uniforms ),\n\t\t\t\t\t\tvertexShader: ShaderLib.cube.vertexShader,\n\t\t\t\t\t\tfragmentShader: ShaderLib.cube.fragmentShader,\n\t\t\t\t\t\tside: BackSide,\n\t\t\t\t\t\tdepthTest: false,\n\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\tfog: false\n\t\t\t\t\t} )\n\t\t\t\t);\n\n\t\t\t\tboxMesh.geometry.deleteAttribute( 'normal' );\n\t\t\t\tboxMesh.geometry.deleteAttribute( 'uv' );\n\n\t\t\t\tboxMesh.onBeforeRender = function ( renderer, scene, camera ) {\n\n\t\t\t\t\tthis.matrixWorld.copyPosition( camera.matrixWorld );\n\n\t\t\t\t};\n\n\t\t\t\t// enable code injection for non-built-in material\n\t\t\t\tObject.defineProperty( boxMesh.material, 'envMap', {\n\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn this.uniforms.envMap.value;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tobjects.update( boxMesh );\n\n\t\t\t}\n\n\t\t\tboxMesh.material.uniforms.envMap.value = background;\n\t\t\tboxMesh.material.uniforms.flipEnvMap.value = ( background.isCubeTexture && background.isRenderTargetTexture === false ) ? - 1 : 1;\n\n\t\t\tif ( currentBackground !== background ||\n\t\t\t\tcurrentBackgroundVersion !== background.version ||\n\t\t\t\tcurrentTonemapping !== renderer.toneMapping ) {\n\n\t\t\t\tboxMesh.material.needsUpdate = true;\n\n\t\t\t\tcurrentBackground = background;\n\t\t\t\tcurrentBackgroundVersion = background.version;\n\t\t\t\tcurrentTonemapping = renderer.toneMapping;\n\n\t\t\t}\n\n\t\t\t// push to the pre-sorted opaque render list\n\t\t\trenderList.unshift( boxMesh, boxMesh.geometry, boxMesh.material, 0, 0, null );\n\n\t\t} else if ( background && background.isTexture ) {\n\n\t\t\tif ( planeMesh === undefined ) {\n\n\t\t\t\tplaneMesh = new Mesh(\n\t\t\t\t\tnew PlaneGeometry( 2, 2 ),\n\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\tname: 'BackgroundMaterial',\n\t\t\t\t\t\tuniforms: cloneUniforms( ShaderLib.background.uniforms ),\n\t\t\t\t\t\tvertexShader: ShaderLib.background.vertexShader,\n\t\t\t\t\t\tfragmentShader: ShaderLib.background.fragmentShader,\n\t\t\t\t\t\tside: FrontSide,\n\t\t\t\t\t\tdepthTest: false,\n\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\tfog: false\n\t\t\t\t\t} )\n\t\t\t\t);\n\n\t\t\t\tplaneMesh.geometry.deleteAttribute( 'normal' );\n\n\t\t\t\t// enable code injection for non-built-in material\n\t\t\t\tObject.defineProperty( planeMesh.material, 'map', {\n\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn this.uniforms.t2D.value;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tobjects.update( planeMesh );\n\n\t\t\t}\n\n\t\t\tplaneMesh.material.uniforms.t2D.value = background;\n\n\t\t\tif ( background.matrixAutoUpdate === true ) {\n\n\t\t\t\tbackground.updateMatrix();\n\n\t\t\t}\n\n\t\t\tplaneMesh.material.uniforms.uvTransform.value.copy( background.matrix );\n\n\t\t\tif ( currentBackground !== background ||\n\t\t\t\tcurrentBackgroundVersion !== background.version ||\n\t\t\t\tcurrentTonemapping !== renderer.toneMapping ) {\n\n\t\t\t\tplaneMesh.material.needsUpdate = true;\n\n\t\t\t\tcurrentBackground = background;\n\t\t\t\tcurrentBackgroundVersion = background.version;\n\t\t\t\tcurrentTonemapping = renderer.toneMapping;\n\n\t\t\t}\n\n\n\t\t\t// push to the pre-sorted opaque render list\n\t\t\trenderList.unshift( planeMesh, planeMesh.geometry, planeMesh.material, 0, 0, null );\n\n\t\t}\n\n\t}\n\n\tfunction setClear( color, alpha ) {\n\n\t\tstate.buffers.color.setClear( color.r, color.g, color.b, alpha, premultipliedAlpha );\n\n\t}\n\n\treturn {\n\n\t\tgetClearColor: function () {\n\n\t\t\treturn clearColor;\n\n\t\t},\n\t\tsetClearColor: function ( color, alpha = 1 ) {\n\n\t\t\tclearColor.set( color );\n\t\t\tclearAlpha = alpha;\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t},\n\t\tgetClearAlpha: function () {\n\n\t\t\treturn clearAlpha;\n\n\t\t},\n\t\tsetClearAlpha: function ( alpha ) {\n\n\t\t\tclearAlpha = alpha;\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t},\n\t\trender: render\n\n\t};\n\n}\n\n\nexport { WebGLBackground };\n","function WebGLBindingStates( gl, extensions, attributes, capabilities ) {\n\n\tconst maxVertexAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\n\tconst extension = capabilities.isWebGL2 ? null : extensions.get( 'OES_vertex_array_object' );\n\tconst vaoAvailable = capabilities.isWebGL2 || extension !== null;\n\n\tconst bindingStates = {};\n\n\tconst defaultState = createBindingState( null );\n\tlet currentState = defaultState;\n\n\tfunction setup( object, material, program, geometry, index ) {\n\n\t\tlet updateBuffers = false;\n\n\t\tif ( vaoAvailable ) {\n\n\t\t\tconst state = getBindingState( geometry, program, material );\n\n\t\t\tif ( currentState !== state ) {\n\n\t\t\t\tcurrentState = state;\n\t\t\t\tbindVertexArrayObject( currentState.object );\n\n\t\t\t}\n\n\t\t\tupdateBuffers = needsUpdate( geometry, index );\n\n\t\t\tif ( updateBuffers ) saveCache( geometry, index );\n\n\t\t} else {\n\n\t\t\tconst wireframe = ( material.wireframe === true );\n\n\t\t\tif ( currentState.geometry !== geometry.id ||\n\t\t\t\tcurrentState.program !== program.id ||\n\t\t\t\tcurrentState.wireframe !== wireframe ) {\n\n\t\t\t\tcurrentState.geometry = geometry.id;\n\t\t\t\tcurrentState.program = program.id;\n\t\t\t\tcurrentState.wireframe = wireframe;\n\n\t\t\t\tupdateBuffers = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( object.isInstancedMesh === true ) {\n\n\t\t\tupdateBuffers = true;\n\n\t\t}\n\n\t\tif ( index !== null ) {\n\n\t\t\tattributes.update( index, gl.ELEMENT_ARRAY_BUFFER );\n\n\t\t}\n\n\t\tif ( updateBuffers ) {\n\n\t\t\tsetupVertexAttributes( object, material, program, geometry );\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, attributes.get( index ).buffer );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction createVertexArrayObject() {\n\n\t\tif ( capabilities.isWebGL2 ) return gl.createVertexArray();\n\n\t\treturn extension.createVertexArrayOES();\n\n\t}\n\n\tfunction bindVertexArrayObject( vao ) {\n\n\t\tif ( capabilities.isWebGL2 ) return gl.bindVertexArray( vao );\n\n\t\treturn extension.bindVertexArrayOES( vao );\n\n\t}\n\n\tfunction deleteVertexArrayObject( vao ) {\n\n\t\tif ( capabilities.isWebGL2 ) return gl.deleteVertexArray( vao );\n\n\t\treturn extension.deleteVertexArrayOES( vao );\n\n\t}\n\n\tfunction getBindingState( geometry, program, material ) {\n\n\t\tconst wireframe = ( material.wireframe === true );\n\n\t\tlet programMap = bindingStates[ geometry.id ];\n\n\t\tif ( programMap === undefined ) {\n\n\t\t\tprogramMap = {};\n\t\t\tbindingStates[ geometry.id ] = programMap;\n\n\t\t}\n\n\t\tlet stateMap = programMap[ program.id ];\n\n\t\tif ( stateMap === undefined ) {\n\n\t\t\tstateMap = {};\n\t\t\tprogramMap[ program.id ] = stateMap;\n\n\t\t}\n\n\t\tlet state = stateMap[ wireframe ];\n\n\t\tif ( state === undefined ) {\n\n\t\t\tstate = createBindingState( createVertexArrayObject() );\n\t\t\tstateMap[ wireframe ] = state;\n\n\t\t}\n\n\t\treturn state;\n\n\t}\n\n\tfunction createBindingState( vao ) {\n\n\t\tconst newAttributes = [];\n\t\tconst enabledAttributes = [];\n\t\tconst attributeDivisors = [];\n\n\t\tfor ( let i = 0; i < maxVertexAttributes; i ++ ) {\n\n\t\t\tnewAttributes[ i ] = 0;\n\t\t\tenabledAttributes[ i ] = 0;\n\t\t\tattributeDivisors[ i ] = 0;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\t// for backward compatibility on non-VAO support browser\n\t\t\tgeometry: null,\n\t\t\tprogram: null,\n\t\t\twireframe: false,\n\n\t\t\tnewAttributes: newAttributes,\n\t\t\tenabledAttributes: enabledAttributes,\n\t\t\tattributeDivisors: attributeDivisors,\n\t\t\tobject: vao,\n\t\t\tattributes: {},\n\t\t\tindex: null\n\n\t\t};\n\n\t}\n\n\tfunction needsUpdate( geometry, index ) {\n\n\t\tconst cachedAttributes = currentState.attributes;\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\tlet attributesNum = 0;\n\n\t\tfor ( const key in geometryAttributes ) {\n\n\t\t\tconst cachedAttribute = cachedAttributes[ key ];\n\t\t\tconst geometryAttribute = geometryAttributes[ key ];\n\n\t\t\tif ( cachedAttribute === undefined ) return true;\n\n\t\t\tif ( cachedAttribute.attribute !== geometryAttribute ) return true;\n\n\t\t\tif ( cachedAttribute.data !== geometryAttribute.data ) return true;\n\n\t\t\tattributesNum ++;\n\n\t\t}\n\n\t\tif ( currentState.attributesNum !== attributesNum ) return true;\n\n\t\tif ( currentState.index !== index ) return true;\n\n\t\treturn false;\n\n\t}\n\n\tfunction saveCache( geometry, index ) {\n\n\t\tconst cache = {};\n\t\tconst attributes = geometry.attributes;\n\t\tlet attributesNum = 0;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tconst attribute = attributes[ key ];\n\n\t\t\tconst data = {};\n\t\t\tdata.attribute = attribute;\n\n\t\t\tif ( attribute.data ) {\n\n\t\t\t\tdata.data = attribute.data;\n\n\t\t\t}\n\n\t\t\tcache[ key ] = data;\n\n\t\t\tattributesNum ++;\n\n\t\t}\n\n\t\tcurrentState.attributes = cache;\n\t\tcurrentState.attributesNum = attributesNum;\n\n\t\tcurrentState.index = index;\n\n\t}\n\n\tfunction initAttributes() {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\n\t\tfor ( let i = 0, il = newAttributes.length; i < il; i ++ ) {\n\n\t\t\tnewAttributes[ i ] = 0;\n\n\t\t}\n\n\t}\n\n\tfunction enableAttribute( attribute ) {\n\n\t\tenableAttributeAndDivisor( attribute, 0 );\n\n\t}\n\n\tfunction enableAttributeAndDivisor( attribute, meshPerAttribute ) {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\t\tconst enabledAttributes = currentState.enabledAttributes;\n\t\tconst attributeDivisors = currentState.attributeDivisors;\n\n\t\tnewAttributes[ attribute ] = 1;\n\n\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t}\n\n\t\tif ( attributeDivisors[ attribute ] !== meshPerAttribute ) {\n\n\t\t\tconst extension = capabilities.isWebGL2 ? gl : extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\textension[ capabilities.isWebGL2 ? 'vertexAttribDivisor' : 'vertexAttribDivisorANGLE' ]( attribute, meshPerAttribute );\n\t\t\tattributeDivisors[ attribute ] = meshPerAttribute;\n\n\t\t}\n\n\t}\n\n\tfunction disableUnusedAttributes() {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\t\tconst enabledAttributes = currentState.enabledAttributes;\n\n\t\tfor ( let i = 0, il = enabledAttributes.length; i < il; i ++ ) {\n\n\t\t\tif ( enabledAttributes[ i ] !== newAttributes[ i ] ) {\n\n\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction vertexAttribPointer( index, size, type, normalized, stride, offset ) {\n\n\t\tif ( capabilities.isWebGL2 === true && ( type === gl.INT || type === gl.UNSIGNED_INT ) ) {\n\n\t\t\tgl.vertexAttribIPointer( index, size, type, stride, offset );\n\n\t\t} else {\n\n\t\t\tgl.vertexAttribPointer( index, size, type, normalized, stride, offset );\n\n\t\t}\n\n\t}\n\n\tfunction setupVertexAttributes( object, material, program, geometry ) {\n\n\t\tif ( capabilities.isWebGL2 === false && ( object.isInstancedMesh || geometry.isInstancedBufferGeometry ) ) {\n\n\t\t\tif ( extensions.get( 'ANGLE_instanced_arrays' ) === null ) return;\n\n\t\t}\n\n\t\tinitAttributes();\n\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tconst materialDefaultAttributeValues = material.defaultAttributeValues;\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute.location >= 0 ) {\n\n\t\t\t\tlet geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\tif ( geometryAttribute === undefined ) {\n\n\t\t\t\t\tif ( name === 'instanceMatrix' && object.instanceMatrix ) geometryAttribute = object.instanceMatrix;\n\t\t\t\t\tif ( name === 'instanceColor' && object.instanceColor ) geometryAttribute = object.instanceColor;\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometryAttribute !== undefined ) {\n\n\t\t\t\t\tconst normalized = geometryAttribute.normalized;\n\t\t\t\t\tconst size = geometryAttribute.itemSize;\n\n\t\t\t\t\tconst attribute = attributes.get( geometryAttribute );\n\n\t\t\t\t\t// TODO Attribute may not be available on context restore\n\n\t\t\t\t\tif ( attribute === undefined ) continue;\n\n\t\t\t\t\tconst buffer = attribute.buffer;\n\t\t\t\t\tconst type = attribute.type;\n\t\t\t\t\tconst bytesPerElement = attribute.bytesPerElement;\n\n\t\t\t\t\tif ( geometryAttribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\tconst data = geometryAttribute.data;\n\t\t\t\t\t\tconst stride = data.stride;\n\t\t\t\t\t\tconst offset = geometryAttribute.offset;\n\n\t\t\t\t\t\tif ( data && data.isInstancedInterleavedBuffer ) {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttributeAndDivisor( programAttribute.location + i, data.meshPerAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( object.isInstancedMesh !== true && geometry._maxInstanceCount === undefined ) {\n\n\t\t\t\t\t\t\t\tgeometry._maxInstanceCount = data.meshPerAttribute * data.count;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttribute( programAttribute.location + i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, buffer );\n\n\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\tvertexAttribPointer(\n\t\t\t\t\t\t\t\tprogramAttribute.location + i,\n\t\t\t\t\t\t\t\tsize / programAttribute.locationSize,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\tnormalized,\n\t\t\t\t\t\t\t\tstride * bytesPerElement,\n\t\t\t\t\t\t\t\t( offset + ( size / programAttribute.locationSize ) * i ) * bytesPerElement\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( geometryAttribute.isInstancedBufferAttribute ) {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttributeAndDivisor( programAttribute.location + i, geometryAttribute.meshPerAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( object.isInstancedMesh !== true && geometry._maxInstanceCount === undefined ) {\n\n\t\t\t\t\t\t\t\tgeometry._maxInstanceCount = geometryAttribute.meshPerAttribute * geometryAttribute.count;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttribute( programAttribute.location + i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, buffer );\n\n\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\tvertexAttribPointer(\n\t\t\t\t\t\t\t\tprogramAttribute.location + i,\n\t\t\t\t\t\t\t\tsize / programAttribute.locationSize,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\tnormalized,\n\t\t\t\t\t\t\t\tsize * bytesPerElement,\n\t\t\t\t\t\t\t\t( size / programAttribute.locationSize ) * i * bytesPerElement\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( materialDefaultAttributeValues !== undefined ) {\n\n\t\t\t\t\tconst value = materialDefaultAttributeValues[ name ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\tswitch ( value.length ) {\n\n\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\tgl.vertexAttrib2fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\tgl.vertexAttrib3fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\tgl.vertexAttrib4fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tgl.vertexAttrib1fv( programAttribute.location, value );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tdisableUnusedAttributes();\n\n\t}\n\n\tfunction dispose() {\n\n\t\treset();\n\n\t\tfor ( const geometryId in bindingStates ) {\n\n\t\t\tconst programMap = bindingStates[ geometryId ];\n\n\t\t\tfor ( const programId in programMap ) {\n\n\t\t\t\tconst stateMap = programMap[ programId ];\n\n\t\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t\t}\n\n\t\t\t\tdelete programMap[ programId ];\n\n\t\t\t}\n\n\t\t\tdelete bindingStates[ geometryId ];\n\n\t\t}\n\n\t}\n\n\tfunction releaseStatesOfGeometry( geometry ) {\n\n\t\tif ( bindingStates[ geometry.id ] === undefined ) return;\n\n\t\tconst programMap = bindingStates[ geometry.id ];\n\n\t\tfor ( const programId in programMap ) {\n\n\t\t\tconst stateMap = programMap[ programId ];\n\n\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t}\n\n\t\t\tdelete programMap[ programId ];\n\n\t\t}\n\n\t\tdelete bindingStates[ geometry.id ];\n\n\t}\n\n\tfunction releaseStatesOfProgram( program ) {\n\n\t\tfor ( const geometryId in bindingStates ) {\n\n\t\t\tconst programMap = bindingStates[ geometryId ];\n\n\t\t\tif ( programMap[ program.id ] === undefined ) continue;\n\n\t\t\tconst stateMap = programMap[ program.id ];\n\n\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t}\n\n\t\t\tdelete programMap[ program.id ];\n\n\t\t}\n\n\t}\n\n\tfunction reset() {\n\n\t\tresetDefaultState();\n\n\t\tif ( currentState === defaultState ) return;\n\n\t\tcurrentState = defaultState;\n\t\tbindVertexArrayObject( currentState.object );\n\n\t}\n\n\t// for backward-compatilibity\n\n\tfunction resetDefaultState() {\n\n\t\tdefaultState.geometry = null;\n\t\tdefaultState.program = null;\n\t\tdefaultState.wireframe = false;\n\n\t}\n\n\treturn {\n\n\t\tsetup: setup,\n\t\treset: reset,\n\t\tresetDefaultState: resetDefaultState,\n\t\tdispose: dispose,\n\t\treleaseStatesOfGeometry: releaseStatesOfGeometry,\n\t\treleaseStatesOfProgram: releaseStatesOfProgram,\n\n\t\tinitAttributes: initAttributes,\n\t\tenableAttribute: enableAttribute,\n\t\tdisableUnusedAttributes: disableUnusedAttributes\n\n\t};\n\n}\n\n\nexport { WebGLBindingStates };\n","function WebGLBufferRenderer( gl, extensions, info, capabilities ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\n\tlet mode;\n\n\tfunction setMode( value ) {\n\n\t\tmode = value;\n\n\t}\n\n\tfunction render( start, count ) {\n\n\t\tgl.drawArrays( mode, start, count );\n\n\t\tinfo.update( count, mode, 1 );\n\n\t}\n\n\tfunction renderInstances( start, count, primcount ) {\n\n\t\tif ( primcount === 0 ) return;\n\n\t\tlet extension, methodName;\n\n\t\tif ( isWebGL2 ) {\n\n\t\t\textension = gl;\n\t\t\tmethodName = 'drawArraysInstanced';\n\n\t\t} else {\n\n\t\t\textension = extensions.get( 'ANGLE_instanced_arrays' );\n\t\t\tmethodName = 'drawArraysInstancedANGLE';\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\textension[ methodName ]( mode, start, count, primcount );\n\n\t\tinfo.update( count, mode, primcount );\n\n\t}\n\n\t//\n\n\tthis.setMode = setMode;\n\tthis.render = render;\n\tthis.renderInstances = renderInstances;\n\n}\n\n\nexport { WebGLBufferRenderer };\n","function WebGLCapabilities( gl, extensions, parameters ) {\n\n\tlet maxAnisotropy;\n\n\tfunction getMaxAnisotropy() {\n\n\t\tif ( maxAnisotropy !== undefined ) return maxAnisotropy;\n\n\t\tif ( extensions.has( 'EXT_texture_filter_anisotropic' ) === true ) {\n\n\t\t\tconst extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tmaxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT );\n\n\t\t} else {\n\n\t\t\tmaxAnisotropy = 0;\n\n\t\t}\n\n\t\treturn maxAnisotropy;\n\n\t}\n\n\tfunction getMaxPrecision( precision ) {\n\n\t\tif ( precision === 'highp' ) {\n\n\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.HIGH_FLOAT ).precision > 0 &&\n\t\t\t\tgl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision > 0 ) {\n\n\t\t\t\treturn 'highp';\n\n\t\t\t}\n\n\t\t\tprecision = 'mediump';\n\n\t\t}\n\n\t\tif ( precision === 'mediump' ) {\n\n\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.MEDIUM_FLOAT ).precision > 0 &&\n\t\t\t\tgl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision > 0 ) {\n\n\t\t\t\treturn 'mediump';\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn 'lowp';\n\n\t}\n\n\tconst isWebGL2 = ( typeof WebGL2RenderingContext !== 'undefined' && gl instanceof WebGL2RenderingContext ) ||\n\t\t( typeof WebGL2ComputeRenderingContext !== 'undefined' && gl instanceof WebGL2ComputeRenderingContext );\n\n\tlet precision = parameters.precision !== undefined ? parameters.precision : 'highp';\n\tconst maxPrecision = getMaxPrecision( precision );\n\n\tif ( maxPrecision !== precision ) {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' );\n\t\tprecision = maxPrecision;\n\n\t}\n\n\tconst drawBuffers = isWebGL2 || extensions.has( 'WEBGL_draw_buffers' );\n\n\tconst logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true;\n\n\tconst maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );\n\tconst maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );\n\tconst maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE );\n\tconst maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE );\n\n\tconst maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\tconst maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS );\n\tconst maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS );\n\tconst maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS );\n\n\tconst vertexTextures = maxVertexTextures > 0;\n\tconst floatFragmentTextures = isWebGL2 || extensions.has( 'OES_texture_float' );\n\tconst floatVertexTextures = vertexTextures && floatFragmentTextures;\n\n\tconst maxSamples = isWebGL2 ? gl.getParameter( gl.MAX_SAMPLES ) : 0;\n\n\treturn {\n\n\t\tisWebGL2: isWebGL2,\n\n\t\tdrawBuffers: drawBuffers,\n\n\t\tgetMaxAnisotropy: getMaxAnisotropy,\n\t\tgetMaxPrecision: getMaxPrecision,\n\n\t\tprecision: precision,\n\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\n\t\tmaxTextures: maxTextures,\n\t\tmaxVertexTextures: maxVertexTextures,\n\t\tmaxTextureSize: maxTextureSize,\n\t\tmaxCubemapSize: maxCubemapSize,\n\n\t\tmaxAttributes: maxAttributes,\n\t\tmaxVertexUniforms: maxVertexUniforms,\n\t\tmaxVaryings: maxVaryings,\n\t\tmaxFragmentUniforms: maxFragmentUniforms,\n\n\t\tvertexTextures: vertexTextures,\n\t\tfloatFragmentTextures: floatFragmentTextures,\n\t\tfloatVertexTextures: floatVertexTextures,\n\n\t\tmaxSamples: maxSamples\n\n\t};\n\n}\n\n\nexport { WebGLCapabilities };\n","import { Matrix3 } from '../../math/Matrix3.js';\nimport { Plane } from '../../math/Plane.js';\n\nfunction WebGLClipping( properties ) {\n\n\tconst scope = this;\n\n\tlet globalState = null,\n\t\tnumGlobalPlanes = 0,\n\t\tlocalClippingEnabled = false,\n\t\trenderingShadows = false;\n\n\tconst plane = new Plane(),\n\t\tviewNormalMatrix = new Matrix3(),\n\n\t\tuniform = { value: null, needsUpdate: false };\n\n\tthis.uniform = uniform;\n\tthis.numPlanes = 0;\n\tthis.numIntersection = 0;\n\n\tthis.init = function ( planes, enableLocalClipping, camera ) {\n\n\t\tconst enabled =\n\t\t\tplanes.length !== 0 ||\n\t\t\tenableLocalClipping ||\n\t\t\t// enable state of previous frame - the clipping code has to\n\t\t\t// run another frame in order to reset the state:\n\t\t\tnumGlobalPlanes !== 0 ||\n\t\t\tlocalClippingEnabled;\n\n\t\tlocalClippingEnabled = enableLocalClipping;\n\n\t\tglobalState = projectPlanes( planes, camera, 0 );\n\t\tnumGlobalPlanes = planes.length;\n\n\t\treturn enabled;\n\n\t};\n\n\tthis.beginShadows = function () {\n\n\t\trenderingShadows = true;\n\t\tprojectPlanes( null );\n\n\t};\n\n\tthis.endShadows = function () {\n\n\t\trenderingShadows = false;\n\t\tresetGlobalState();\n\n\t};\n\n\tthis.setState = function ( material, camera, useCache ) {\n\n\t\tconst planes = material.clippingPlanes,\n\t\t\tclipIntersection = material.clipIntersection,\n\t\t\tclipShadows = material.clipShadows;\n\n\t\tconst materialProperties = properties.get( material );\n\n\t\tif ( ! localClippingEnabled || planes === null || planes.length === 0 || renderingShadows && ! clipShadows ) {\n\n\t\t\t// there's no local clipping\n\n\t\t\tif ( renderingShadows ) {\n\n\t\t\t\t// there's no global clipping\n\n\t\t\t\tprojectPlanes( null );\n\n\t\t\t} else {\n\n\t\t\t\tresetGlobalState();\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst nGlobal = renderingShadows ? 0 : numGlobalPlanes,\n\t\t\t\tlGlobal = nGlobal * 4;\n\n\t\t\tlet dstArray = materialProperties.clippingState || null;\n\n\t\t\tuniform.value = dstArray; // ensure unique state\n\n\t\t\tdstArray = projectPlanes( planes, camera, lGlobal, useCache );\n\n\t\t\tfor ( let i = 0; i !== lGlobal; ++ i ) {\n\n\t\t\t\tdstArray[ i ] = globalState[ i ];\n\n\t\t\t}\n\n\t\t\tmaterialProperties.clippingState = dstArray;\n\t\t\tthis.numIntersection = clipIntersection ? this.numPlanes : 0;\n\t\t\tthis.numPlanes += nGlobal;\n\n\t\t}\n\n\n\t};\n\n\tfunction resetGlobalState() {\n\n\t\tif ( uniform.value !== globalState ) {\n\n\t\t\tuniform.value = globalState;\n\t\t\tuniform.needsUpdate = numGlobalPlanes > 0;\n\n\t\t}\n\n\t\tscope.numPlanes = numGlobalPlanes;\n\t\tscope.numIntersection = 0;\n\n\t}\n\n\tfunction projectPlanes( planes, camera, dstOffset, skipTransform ) {\n\n\t\tconst nPlanes = planes !== null ? planes.length : 0;\n\t\tlet dstArray = null;\n\n\t\tif ( nPlanes !== 0 ) {\n\n\t\t\tdstArray = uniform.value;\n\n\t\t\tif ( skipTransform !== true || dstArray === null ) {\n\n\t\t\t\tconst flatSize = dstOffset + nPlanes * 4,\n\t\t\t\t\tviewMatrix = camera.matrixWorldInverse;\n\n\t\t\t\tviewNormalMatrix.getNormalMatrix( viewMatrix );\n\n\t\t\t\tif ( dstArray === null || dstArray.length < flatSize ) {\n\n\t\t\t\t\tdstArray = new Float32Array( flatSize );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0, i4 = dstOffset; i !== nPlanes; ++ i, i4 += 4 ) {\n\n\t\t\t\t\tplane.copy( planes[ i ] ).applyMatrix4( viewMatrix, viewNormalMatrix );\n\n\t\t\t\t\tplane.normal.toArray( dstArray, i4 );\n\t\t\t\t\tdstArray[ i4 + 3 ] = plane.constant;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tuniform.value = dstArray;\n\t\t\tuniform.needsUpdate = true;\n\n\t\t}\n\n\t\tscope.numPlanes = nPlanes;\n\t\tscope.numIntersection = 0;\n\n\t\treturn dstArray;\n\n\t}\n\n}\n\n\nexport { WebGLClipping };\n","import { createElementNS } from '../utils.js';\nimport { SRGBToLinear } from '../math/Color.js';\n\nlet _canvas;\n\nclass ImageUtils {\n\n\tstatic getDataURL( image ) {\n\n\t\tif ( /^data:/i.test( image.src ) ) {\n\n\t\t\treturn image.src;\n\n\t\t}\n\n\t\tif ( typeof HTMLCanvasElement == 'undefined' ) {\n\n\t\t\treturn image.src;\n\n\t\t}\n\n\t\tlet canvas;\n\n\t\tif ( image instanceof HTMLCanvasElement ) {\n\n\t\t\tcanvas = image;\n\n\t\t} else {\n\n\t\t\tif ( _canvas === undefined ) _canvas = createElementNS( 'canvas' );\n\n\t\t\t_canvas.width = image.width;\n\t\t\t_canvas.height = image.height;\n\n\t\t\tconst context = _canvas.getContext( '2d' );\n\n\t\t\tif ( image instanceof ImageData ) {\n\n\t\t\t\tcontext.putImageData( image, 0, 0 );\n\n\t\t\t} else {\n\n\t\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\t}\n\n\t\t\tcanvas = _canvas;\n\n\t\t}\n\n\t\tif ( canvas.width > 2048 || canvas.height > 2048 ) {\n\n\t\t\tconsole.warn( 'THREE.ImageUtils.getDataURL: Image converted to jpg for performance reasons', image );\n\n\t\t\treturn canvas.toDataURL( 'image/jpeg', 0.6 );\n\n\t\t} else {\n\n\t\t\treturn canvas.toDataURL( 'image/png' );\n\n\t\t}\n\n\t}\n\n\tstatic sRGBToLinear( image ) {\n\n\t\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t\tconst canvas = createElementNS( 'canvas' );\n\n\t\t\tcanvas.width = image.width;\n\t\t\tcanvas.height = image.height;\n\n\t\t\tconst context = canvas.getContext( '2d' );\n\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\tconst imageData = context.getImageData( 0, 0, image.width, image.height );\n\t\t\tconst data = imageData.data;\n\n\t\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tdata[ i ] = SRGBToLinear( data[ i ] / 255 ) * 255;\n\n\t\t\t}\n\n\t\t\tcontext.putImageData( imageData, 0, 0 );\n\n\t\t\treturn canvas;\n\n\t\t} else if ( image.data ) {\n\n\t\t\tconst data = image.data.slice( 0 );\n\n\t\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tif ( data instanceof Uint8Array || data instanceof Uint8ClampedArray ) {\n\n\t\t\t\t\tdata[ i ] = Math.floor( SRGBToLinear( data[ i ] / 255 ) * 255 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// assuming float\n\n\t\t\t\t\tdata[ i ] = SRGBToLinear( data[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tdata: data,\n\t\t\t\twidth: image.width,\n\t\t\t\theight: image.height\n\t\t\t};\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.ImageUtils.sRGBToLinear(): Unsupported image type. No color space conversion applied.' );\n\t\t\treturn image;\n\n\t\t}\n\n\t}\n\n}\n\nexport { ImageUtils };\n","import { EventDispatcher } from '../core/EventDispatcher.js';\nimport {\n\tMirroredRepeatWrapping,\n\tClampToEdgeWrapping,\n\tRepeatWrapping,\n\tLinearEncoding,\n\tUnsignedByteType,\n\tRGBAFormat,\n\tLinearMipmapLinearFilter,\n\tLinearFilter,\n\tUVMapping\n} from '../constants.js';\nimport * as MathUtils from '../math/MathUtils.js';\nimport { Vector2 } from '../math/Vector2.js';\nimport { Matrix3 } from '../math/Matrix3.js';\nimport { ImageUtils } from '../extras/ImageUtils.js';\n\nlet textureId = 0;\n\nclass Texture extends EventDispatcher {\n\n\tconstructor( image = Texture.DEFAULT_IMAGE, mapping = Texture.DEFAULT_MAPPING, wrapS = ClampToEdgeWrapping, wrapT = ClampToEdgeWrapping, magFilter = LinearFilter, minFilter = LinearMipmapLinearFilter, format = RGBAFormat, type = UnsignedByteType, anisotropy = 1, encoding = LinearEncoding ) {\n\n\t\tsuper();\n\n\t\tObject.defineProperty( this, 'id', { value: textureId ++ } );\n\n\t\tthis.uuid = MathUtils.generateUUID();\n\n\t\tthis.name = '';\n\n\t\tthis.image = image;\n\t\tthis.mipmaps = [];\n\n\t\tthis.mapping = mapping;\n\n\t\tthis.wrapS = wrapS;\n\t\tthis.wrapT = wrapT;\n\n\t\tthis.magFilter = magFilter;\n\t\tthis.minFilter = minFilter;\n\n\t\tthis.anisotropy = anisotropy;\n\n\t\tthis.format = format;\n\t\tthis.internalFormat = null;\n\t\tthis.type = type;\n\n\t\tthis.offset = new Vector2( 0, 0 );\n\t\tthis.repeat = new Vector2( 1, 1 );\n\t\tthis.center = new Vector2( 0, 0 );\n\t\tthis.rotation = 0;\n\n\t\tthis.matrixAutoUpdate = true;\n\t\tthis.matrix = new Matrix3();\n\n\t\tthis.generateMipmaps = true;\n\t\tthis.premultiplyAlpha = false;\n\t\tthis.flipY = true;\n\t\tthis.unpackAlignment = 4;\t// valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml)\n\n\t\t// Values of encoding !== THREE.LinearEncoding only supported on map, envMap and emissiveMap.\n\t\t//\n\t\t// Also changing the encoding after already used by a Material will not automatically make the Material\n\t\t// update. You need to explicitly call Material.needsUpdate to trigger it to recompile.\n\t\tthis.encoding = encoding;\n\n\t\tthis.userData = {};\n\n\t\tthis.version = 0;\n\t\tthis.onUpdate = null;\n\n\t\tthis.isRenderTargetTexture = false; // indicates whether a texture belongs to a render target or not\n\t\tthis.needsPMREMUpdate = false; // indicates whether this texture should be processed by PMREMGenerator or not (only relevant for render target textures)\n\n\t}\n\n\tupdateMatrix() {\n\n\t\tthis.matrix.setUvTransform( this.offset.x, this.offset.y, this.repeat.x, this.repeat.y, this.rotation, this.center.x, this.center.y );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.image = source.image;\n\t\tthis.mipmaps = source.mipmaps.slice( 0 );\n\n\t\tthis.mapping = source.mapping;\n\n\t\tthis.wrapS = source.wrapS;\n\t\tthis.wrapT = source.wrapT;\n\n\t\tthis.magFilter = source.magFilter;\n\t\tthis.minFilter = source.minFilter;\n\n\t\tthis.anisotropy = source.anisotropy;\n\n\t\tthis.format = source.format;\n\t\tthis.internalFormat = source.internalFormat;\n\t\tthis.type = source.type;\n\n\t\tthis.offset.copy( source.offset );\n\t\tthis.repeat.copy( source.repeat );\n\t\tthis.center.copy( source.center );\n\t\tthis.rotation = source.rotation;\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\t\tthis.matrix.copy( source.matrix );\n\n\t\tthis.generateMipmaps = source.generateMipmaps;\n\t\tthis.premultiplyAlpha = source.premultiplyAlpha;\n\t\tthis.flipY = source.flipY;\n\t\tthis.unpackAlignment = source.unpackAlignment;\n\t\tthis.encoding = source.encoding;\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( ! isRootObject && meta.textures[ this.uuid ] !== undefined ) {\n\n\t\t\treturn meta.textures[ this.uuid ];\n\n\t\t}\n\n\t\tconst output = {\n\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Texture',\n\t\t\t\tgenerator: 'Texture.toJSON'\n\t\t\t},\n\n\t\t\tuuid: this.uuid,\n\t\t\tname: this.name,\n\n\t\t\tmapping: this.mapping,\n\n\t\t\trepeat: [ this.repeat.x, this.repeat.y ],\n\t\t\toffset: [ this.offset.x, this.offset.y ],\n\t\t\tcenter: [ this.center.x, this.center.y ],\n\t\t\trotation: this.rotation,\n\n\t\t\twrap: [ this.wrapS, this.wrapT ],\n\n\t\t\tformat: this.format,\n\t\t\ttype: this.type,\n\t\t\tencoding: this.encoding,\n\n\t\t\tminFilter: this.minFilter,\n\t\t\tmagFilter: this.magFilter,\n\t\t\tanisotropy: this.anisotropy,\n\n\t\t\tflipY: this.flipY,\n\n\t\t\tpremultiplyAlpha: this.premultiplyAlpha,\n\t\t\tunpackAlignment: this.unpackAlignment\n\n\t\t};\n\n\t\tif ( this.image !== undefined ) {\n\n\t\t\t// TODO: Move to THREE.Image\n\n\t\t\tconst image = this.image;\n\n\t\t\tif ( image.uuid === undefined ) {\n\n\t\t\t\timage.uuid = MathUtils.generateUUID(); // UGH\n\n\t\t\t}\n\n\t\t\tif ( ! isRootObject && meta.images[ image.uuid ] === undefined ) {\n\n\t\t\t\tlet url;\n\n\t\t\t\tif ( Array.isArray( image ) ) {\n\n\t\t\t\t\t// process array of images e.g. CubeTexture\n\n\t\t\t\t\turl = [];\n\n\t\t\t\t\tfor ( let i = 0, l = image.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t// check cube texture with data textures\n\n\t\t\t\t\t\tif ( image[ i ].isDataTexture ) {\n\n\t\t\t\t\t\t\turl.push( serializeImage( image[ i ].image ) );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\turl.push( serializeImage( image[ i ] ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// process single image\n\n\t\t\t\t\turl = serializeImage( image );\n\n\t\t\t\t}\n\n\t\t\t\tmeta.images[ image.uuid ] = {\n\t\t\t\t\tuuid: image.uuid,\n\t\t\t\t\turl: url\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\toutput.image = image.uuid;\n\n\t\t}\n\n\t\tif ( JSON.stringify( this.userData ) !== '{}' ) output.userData = this.userData;\n\n\t\tif ( ! isRootObject ) {\n\n\t\t\tmeta.textures[ this.uuid ] = output;\n\n\t\t}\n\n\t\treturn output;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n\ttransformUv( uv ) {\n\n\t\tif ( this.mapping !== UVMapping ) return uv;\n\n\t\tuv.applyMatrix3( this.matrix );\n\n\t\tif ( uv.x < 0 || uv.x > 1 ) {\n\n\t\t\tswitch ( this.wrapS ) {\n\n\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\tuv.x = uv.x < 0 ? 0 : 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\tif ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\tuv.x = Math.ceil( uv.x ) - uv.x;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( uv.y < 0 || uv.y > 1 ) {\n\n\t\t\tswitch ( this.wrapT ) {\n\n\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\tuv.y = uv.y < 0 ? 0 : 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\tif ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\tuv.y = Math.ceil( uv.y ) - uv.y;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.flipY ) {\n\n\t\t\tuv.y = 1 - uv.y;\n\n\t\t}\n\n\t\treturn uv;\n\n\t}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n}\n\nTexture.DEFAULT_IMAGE = undefined;\nTexture.DEFAULT_MAPPING = UVMapping;\n\nTexture.prototype.isTexture = true;\n\nfunction serializeImage( image ) {\n\n\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t// default images\n\n\t\treturn ImageUtils.getDataURL( image );\n\n\t} else {\n\n\t\tif ( image.data ) {\n\n\t\t\t// images of DataTexture\n\n\t\t\treturn {\n\t\t\t\tdata: Array.prototype.slice.call( image.data ),\n\t\t\t\twidth: image.width,\n\t\t\t\theight: image.height,\n\t\t\t\ttype: image.data.constructor.name\n\t\t\t};\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.Texture: Unable to serialize Texture.' );\n\t\t\treturn {};\n\n\t\t}\n\n\t}\n\n}\n\nexport { Texture };\n","import { EventDispatcher } from '../core/EventDispatcher.js';\nimport { Texture } from '../textures/Texture.js';\nimport { LinearFilter } from '../constants.js';\nimport { Vector4 } from '../math/Vector4.js';\n\n/*\n In options, we can specify:\n * Texture parameters for an auto-generated target texture\n * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers\n*/\nclass WebGLRenderTarget extends EventDispatcher {\n\n\tconstructor( width, height, options = {} ) {\n\n\t\tsuper();\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\t\tthis.depth = 1;\n\n\t\tthis.scissor = new Vector4( 0, 0, width, height );\n\t\tthis.scissorTest = false;\n\n\t\tthis.viewport = new Vector4( 0, 0, width, height );\n\n\t\tthis.texture = new Texture( undefined, options.mapping, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding );\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t\tthis.texture.image = { width: width, height: height, depth: 1 };\n\n\t\tthis.texture.generateMipmaps = options.generateMipmaps !== undefined ? options.generateMipmaps : false;\n\t\tthis.texture.internalFormat = options.internalFormat !== undefined ? options.internalFormat : null;\n\t\tthis.texture.minFilter = options.minFilter !== undefined ? options.minFilter : LinearFilter;\n\n\t\tthis.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true;\n\t\tthis.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : false;\n\t\tthis.depthTexture = options.depthTexture !== undefined ? options.depthTexture : null;\n\n\t}\n\n\tsetTexture( texture ) {\n\n\t\ttexture.image = {\n\t\t\twidth: this.width,\n\t\t\theight: this.height,\n\t\t\tdepth: this.depth\n\t\t};\n\n\t\tthis.texture = texture;\n\n\t}\n\n\tsetSize( width, height, depth = 1 ) {\n\n\t\tif ( this.width !== width || this.height !== height || this.depth !== depth ) {\n\n\t\t\tthis.width = width;\n\t\t\tthis.height = height;\n\t\t\tthis.depth = depth;\n\n\t\t\tthis.texture.image.width = width;\n\t\t\tthis.texture.image.height = height;\n\t\t\tthis.texture.image.depth = depth;\n\n\t\t\tthis.dispose();\n\n\t\t}\n\n\t\tthis.viewport.set( 0, 0, width, height );\n\t\tthis.scissor.set( 0, 0, width, height );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.width = source.width;\n\t\tthis.height = source.height;\n\t\tthis.depth = source.depth;\n\n\t\tthis.viewport.copy( source.viewport );\n\n\t\tthis.texture = source.texture.clone();\n\n\t\t// ensure image object is not shared, see #20328\n\n\t\tthis.texture.image = Object.assign( {}, source.texture.image );\n\n\t\tthis.depthBuffer = source.depthBuffer;\n\t\tthis.stencilBuffer = source.stencilBuffer;\n\t\tthis.depthTexture = source.depthTexture;\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n}\n\nWebGLRenderTarget.prototype.isWebGLRenderTarget = true;\n\nexport { WebGLRenderTarget };\n","import { Camera } from './Camera.js';\nimport * as MathUtils from '../math/MathUtils.js';\n\nclass PerspectiveCamera extends Camera {\n\n\tconstructor( fov = 50, aspect = 1, near = 0.1, far = 2000 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'PerspectiveCamera';\n\n\t\tthis.fov = fov;\n\t\tthis.zoom = 1;\n\n\t\tthis.near = near;\n\t\tthis.far = far;\n\t\tthis.focus = 10;\n\n\t\tthis.aspect = aspect;\n\t\tthis.view = null;\n\n\t\tthis.filmGauge = 35;\t// width of the film (default in millimeters)\n\t\tthis.filmOffset = 0;\t// horizontal film offset (same unit as gauge)\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.fov = source.fov;\n\t\tthis.zoom = source.zoom;\n\n\t\tthis.near = source.near;\n\t\tthis.far = source.far;\n\t\tthis.focus = source.focus;\n\n\t\tthis.aspect = source.aspect;\n\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\tthis.filmGauge = source.filmGauge;\n\t\tthis.filmOffset = source.filmOffset;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the FOV by focal length in respect to the current .filmGauge.\n\t *\n\t * The default film gauge is 35, so that the focal length can be specified for\n\t * a 35mm (full frame) camera.\n\t *\n\t * Values for focal length and film gauge must have the same unit.\n\t */\n\tsetFocalLength( focalLength ) {\n\n\t\t/** see {@link http://www.bobatkins.com/photography/technical/field_of_view.html} */\n\t\tconst vExtentSlope = 0.5 * this.getFilmHeight() / focalLength;\n\n\t\tthis.fov = MathUtils.RAD2DEG * 2 * Math.atan( vExtentSlope );\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Calculates the focal length from the current .fov and .filmGauge.\n\t */\n\tgetFocalLength() {\n\n\t\tconst vExtentSlope = Math.tan( MathUtils.DEG2RAD * 0.5 * this.fov );\n\n\t\treturn 0.5 * this.getFilmHeight() / vExtentSlope;\n\n\t}\n\n\tgetEffectiveFOV() {\n\n\t\treturn MathUtils.RAD2DEG * 2 * Math.atan(\n\t\t\tMath.tan( MathUtils.DEG2RAD * 0.5 * this.fov ) / this.zoom );\n\n\t}\n\n\tgetFilmWidth() {\n\n\t\t// film not completely covered in portrait format (aspect < 1)\n\t\treturn this.filmGauge * Math.min( this.aspect, 1 );\n\n\t}\n\n\tgetFilmHeight() {\n\n\t\t// film not completely covered in landscape format (aspect > 1)\n\t\treturn this.filmGauge / Math.max( this.aspect, 1 );\n\n\t}\n\n\t/**\n\t * Sets an offset in a larger frustum. This is useful for multi-window or\n\t * multi-monitor/multi-machine setups.\n\t *\n\t * For example, if you have 3x2 monitors and each monitor is 1920x1080 and\n\t * the monitors are in grid like this\n\t *\n\t *   +---+---+---+\n\t *   | A | B | C |\n\t *   +---+---+---+\n\t *   | D | E | F |\n\t *   +---+---+---+\n\t *\n\t * then for each monitor you would call it like this\n\t *\n\t *   const w = 1920;\n\t *   const h = 1080;\n\t *   const fullWidth = w * 3;\n\t *   const fullHeight = h * 2;\n\t *\n\t *   --A--\n\t *   camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 0, w, h );\n\t *   --B--\n\t *   camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 0, w, h );\n\t *   --C--\n\t *   camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 0, w, h );\n\t *   --D--\n\t *   camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 1, w, h );\n\t *   --E--\n\t *   camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 1, w, h );\n\t *   --F--\n\t *   camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 1, w, h );\n\t *\n\t *   Note there is no reason monitors have to be the same size or in a grid.\n\t */\n\tsetViewOffset( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\tthis.aspect = fullWidth / fullHeight;\n\n\t\tif ( this.view === null ) {\n\n\t\t\tthis.view = {\n\t\t\t\tenabled: true,\n\t\t\t\tfullWidth: 1,\n\t\t\t\tfullHeight: 1,\n\t\t\t\toffsetX: 0,\n\t\t\t\toffsetY: 0,\n\t\t\t\twidth: 1,\n\t\t\t\theight: 1\n\t\t\t};\n\n\t\t}\n\n\t\tthis.view.enabled = true;\n\t\tthis.view.fullWidth = fullWidth;\n\t\tthis.view.fullHeight = fullHeight;\n\t\tthis.view.offsetX = x;\n\t\tthis.view.offsetY = y;\n\t\tthis.view.width = width;\n\t\tthis.view.height = height;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tclearViewOffset() {\n\n\t\tif ( this.view !== null ) {\n\n\t\t\tthis.view.enabled = false;\n\n\t\t}\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tupdateProjectionMatrix() {\n\n\t\tconst near = this.near;\n\t\tlet top = near * Math.tan( MathUtils.DEG2RAD * 0.5 * this.fov ) / this.zoom;\n\t\tlet height = 2 * top;\n\t\tlet width = this.aspect * height;\n\t\tlet left = - 0.5 * width;\n\t\tconst view = this.view;\n\n\t\tif ( this.view !== null && this.view.enabled ) {\n\n\t\t\tconst fullWidth = view.fullWidth,\n\t\t\t\tfullHeight = view.fullHeight;\n\n\t\t\tleft += view.offsetX * width / fullWidth;\n\t\t\ttop -= view.offsetY * height / fullHeight;\n\t\t\twidth *= view.width / fullWidth;\n\t\t\theight *= view.height / fullHeight;\n\n\t\t}\n\n\t\tconst skew = this.filmOffset;\n\t\tif ( skew !== 0 ) left += near * skew / this.getFilmWidth();\n\n\t\tthis.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far );\n\n\t\tthis.projectionMatrixInverse.copy( this.projectionMatrix ).invert();\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.fov = this.fov;\n\t\tdata.object.zoom = this.zoom;\n\n\t\tdata.object.near = this.near;\n\t\tdata.object.far = this.far;\n\t\tdata.object.focus = this.focus;\n\n\t\tdata.object.aspect = this.aspect;\n\n\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\tdata.object.filmGauge = this.filmGauge;\n\t\tdata.object.filmOffset = this.filmOffset;\n\n\t\treturn data;\n\n\t}\n\n}\n\nPerspectiveCamera.prototype.isPerspectiveCamera = true;\n\nexport { PerspectiveCamera };\n","import { Object3D } from '../core/Object3D.js';\nimport { Vector3 } from '../math/Vector3.js';\nimport { PerspectiveCamera } from './PerspectiveCamera.js';\n\nconst fov = 90, aspect = 1;\n\nclass CubeCamera extends Object3D {\n\n\tconstructor( near, far, renderTarget ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CubeCamera';\n\n\t\tif ( renderTarget.isWebGLCubeRenderTarget !== true ) {\n\n\t\t\tconsole.error( 'THREE.CubeCamera: The constructor now expects an instance of WebGLCubeRenderTarget as third parameter.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.renderTarget = renderTarget;\n\n\t\tconst cameraPX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPX.layers = this.layers;\n\t\tcameraPX.up.set( 0, - 1, 0 );\n\t\tcameraPX.lookAt( new Vector3( 1, 0, 0 ) );\n\t\tthis.add( cameraPX );\n\n\t\tconst cameraNX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNX.layers = this.layers;\n\t\tcameraNX.up.set( 0, - 1, 0 );\n\t\tcameraNX.lookAt( new Vector3( - 1, 0, 0 ) );\n\t\tthis.add( cameraNX );\n\n\t\tconst cameraPY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPY.layers = this.layers;\n\t\tcameraPY.up.set( 0, 0, 1 );\n\t\tcameraPY.lookAt( new Vector3( 0, 1, 0 ) );\n\t\tthis.add( cameraPY );\n\n\t\tconst cameraNY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNY.layers = this.layers;\n\t\tcameraNY.up.set( 0, 0, - 1 );\n\t\tcameraNY.lookAt( new Vector3( 0, - 1, 0 ) );\n\t\tthis.add( cameraNY );\n\n\t\tconst cameraPZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPZ.layers = this.layers;\n\t\tcameraPZ.up.set( 0, - 1, 0 );\n\t\tcameraPZ.lookAt( new Vector3( 0, 0, 1 ) );\n\t\tthis.add( cameraPZ );\n\n\t\tconst cameraNZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNZ.layers = this.layers;\n\t\tcameraNZ.up.set( 0, - 1, 0 );\n\t\tcameraNZ.lookAt( new Vector3( 0, 0, - 1 ) );\n\t\tthis.add( cameraNZ );\n\n\t}\n\n\tupdate( renderer, scene ) {\n\n\t\tif ( this.parent === null ) this.updateMatrixWorld();\n\n\t\tconst renderTarget = this.renderTarget;\n\n\t\tconst [ cameraPX, cameraNX, cameraPY, cameraNY, cameraPZ, cameraNZ ] = this.children;\n\n\t\tconst currentXrEnabled = renderer.xr.enabled;\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\t\trenderer.xr.enabled = false;\n\n\t\tconst generateMipmaps = renderTarget.texture.generateMipmaps;\n\n\t\trenderTarget.texture.generateMipmaps = false;\n\n\t\trenderer.setRenderTarget( renderTarget, 0 );\n\t\trenderer.render( scene, cameraPX );\n\n\t\trenderer.setRenderTarget( renderTarget, 1 );\n\t\trenderer.render( scene, cameraNX );\n\n\t\trenderer.setRenderTarget( renderTarget, 2 );\n\t\trenderer.render( scene, cameraPY );\n\n\t\trenderer.setRenderTarget( renderTarget, 3 );\n\t\trenderer.render( scene, cameraNY );\n\n\t\trenderer.setRenderTarget( renderTarget, 4 );\n\t\trenderer.render( scene, cameraPZ );\n\n\t\trenderTarget.texture.generateMipmaps = generateMipmaps;\n\n\t\trenderer.setRenderTarget( renderTarget, 5 );\n\t\trenderer.render( scene, cameraNZ );\n\n\t\trenderer.setRenderTarget( currentRenderTarget );\n\n\t\trenderer.xr.enabled = currentXrEnabled;\n\n\t\trenderTarget.texture.needsPMREMUpdate = true;\n\n\t}\n\n}\n\nexport { CubeCamera };\n","import { Texture } from './Texture.js';\nimport { CubeReflectionMapping } from '../constants.js';\n\nclass CubeTexture extends Texture {\n\n\tconstructor( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {\n\n\t\timages = images !== undefined ? images : [];\n\t\tmapping = mapping !== undefined ? mapping : CubeReflectionMapping;\n\n\t\tsuper( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.flipY = false;\n\n\t}\n\n\tget images() {\n\n\t\treturn this.image;\n\n\t}\n\n\tset images( value ) {\n\n\t\tthis.image = value;\n\n\t}\n\n}\n\nCubeTexture.prototype.isCubeTexture = true;\n\nexport { CubeTexture };\n","import { BackSide, LinearFilter, LinearMipmapLinearFilter, NoBlending, RGBAFormat } from '../constants.js';\nimport { Mesh } from '../objects/Mesh.js';\nimport { BoxGeometry } from '../geometries/BoxGeometry.js';\nimport { ShaderMaterial } from '../materials/ShaderMaterial.js';\nimport { cloneUniforms } from './shaders/UniformsUtils.js';\nimport { WebGLRenderTarget } from './WebGLRenderTarget.js';\nimport { CubeCamera } from '../cameras/CubeCamera.js';\nimport { CubeTexture } from '../textures/CubeTexture.js';\n\nclass WebGLCubeRenderTarget extends WebGLRenderTarget {\n\n\tconstructor( size, options, dummy ) {\n\n\t\tif ( Number.isInteger( options ) ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLCubeRenderTarget: constructor signature is now WebGLCubeRenderTarget( size, options )' );\n\n\t\t\toptions = dummy;\n\n\t\t}\n\n\t\tsuper( size, size, options );\n\n\t\toptions = options || {};\n\n\t\t// By convention -- likely based on the RenderMan spec from the 1990's -- cube maps are specified by WebGL (and three.js)\n\t\t// in a coordinate system in which positive-x is to the right when looking up the positive-z axis -- in other words,\n\t\t// in a left-handed coordinate system. By continuing this convention, preexisting cube maps continued to render correctly.\n\n\t\t// three.js uses a right-handed coordinate system. So environment maps used in three.js appear to have px and nx swapped\n\t\t// and the flag isRenderTargetTexture controls this conversion. The flip is not required when using WebGLCubeRenderTarget.texture\n\t\t// as a cube texture (this is detected when isRenderTargetTexture is set to true for cube textures).\n\n\t\tthis.texture = new CubeTexture( undefined, options.mapping, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding );\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t\tthis.texture.generateMipmaps = options.generateMipmaps !== undefined ? options.generateMipmaps : false;\n\t\tthis.texture.minFilter = options.minFilter !== undefined ? options.minFilter : LinearFilter;\n\n\t}\n\n\tfromEquirectangularTexture( renderer, texture ) {\n\n\t\tthis.texture.type = texture.type;\n\t\tthis.texture.format = RGBAFormat; // see #18859\n\t\tthis.texture.encoding = texture.encoding;\n\n\t\tthis.texture.generateMipmaps = texture.generateMipmaps;\n\t\tthis.texture.minFilter = texture.minFilter;\n\t\tthis.texture.magFilter = texture.magFilter;\n\n\t\tconst shader = {\n\n\t\t\tuniforms: {\n\t\t\t\ttEquirect: { value: null },\n\t\t\t},\n\n\t\t\tvertexShader: /* glsl */`\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t\t#include <begin_vertex>\n\t\t\t\t\t#include <project_vertex>\n\n\t\t\t\t}\n\t\t\t`,\n\n\t\t\tfragmentShader: /* glsl */`\n\n\t\t\t\tuniform sampler2D tEquirect;\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\t#include <common>\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t\t}\n\t\t\t`\n\t\t};\n\n\t\tconst geometry = new BoxGeometry( 5, 5, 5 );\n\n\t\tconst material = new ShaderMaterial( {\n\n\t\t\tname: 'CubemapFromEquirect',\n\n\t\t\tuniforms: cloneUniforms( shader.uniforms ),\n\t\t\tvertexShader: shader.vertexShader,\n\t\t\tfragmentShader: shader.fragmentShader,\n\t\t\tside: BackSide,\n\t\t\tblending: NoBlending\n\n\t\t} );\n\n\t\tmaterial.uniforms.tEquirect.value = texture;\n\n\t\tconst mesh = new Mesh( geometry, material );\n\n\t\tconst currentMinFilter = texture.minFilter;\n\n\t\t// Avoid blurred poles\n\t\tif ( texture.minFilter === LinearMipmapLinearFilter ) texture.minFilter = LinearFilter;\n\n\t\tconst camera = new CubeCamera( 1, 10, this );\n\t\tcamera.update( renderer, mesh );\n\n\t\ttexture.minFilter = currentMinFilter;\n\n\t\tmesh.geometry.dispose();\n\t\tmesh.material.dispose();\n\n\t\treturn this;\n\n\t}\n\n\tclear( renderer, color, depth, stencil ) {\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\trenderer.setRenderTarget( this, i );\n\n\t\t\trenderer.clear( color, depth, stencil );\n\n\t\t}\n\n\t\trenderer.setRenderTarget( currentRenderTarget );\n\n\t}\n\n}\n\nWebGLCubeRenderTarget.prototype.isWebGLCubeRenderTarget = true;\n\nexport { WebGLCubeRenderTarget };\n","import { CubeReflectionMapping, CubeRefractionMapping, EquirectangularReflectionMapping, EquirectangularRefractionMapping } from '../../constants.js';\nimport { WebGLCubeRenderTarget } from '../WebGLCubeRenderTarget.js';\n\nfunction WebGLCubeMaps( renderer ) {\n\n\tlet cubemaps = new WeakMap();\n\n\tfunction mapTextureMapping( texture, mapping ) {\n\n\t\tif ( mapping === EquirectangularReflectionMapping ) {\n\n\t\t\ttexture.mapping = CubeReflectionMapping;\n\n\t\t} else if ( mapping === EquirectangularRefractionMapping ) {\n\n\t\t\ttexture.mapping = CubeRefractionMapping;\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction get( texture ) {\n\n\t\tif ( texture && texture.isTexture && texture.isRenderTargetTexture === false ) {\n\n\t\t\tconst mapping = texture.mapping;\n\n\t\t\tif ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping ) {\n\n\t\t\t\tif ( cubemaps.has( texture ) ) {\n\n\t\t\t\t\tconst cubemap = cubemaps.get( texture ).texture;\n\t\t\t\t\treturn mapTextureMapping( cubemap, texture.mapping );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst image = texture.image;\n\n\t\t\t\t\tif ( image && image.height > 0 ) {\n\n\t\t\t\t\t\tconst renderTarget = new WebGLCubeRenderTarget( image.height / 2 );\n\t\t\t\t\t\trenderTarget.fromEquirectangularTexture( renderer, texture );\n\t\t\t\t\t\tcubemaps.set( texture, renderTarget );\n\n\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\treturn mapTextureMapping( renderTarget.texture, texture.mapping );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// image not yet ready. try the conversion next frame\n\n\t\t\t\t\t\treturn null;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tconst cubemap = cubemaps.get( texture );\n\n\t\tif ( cubemap !== undefined ) {\n\n\t\t\tcubemaps.delete( texture );\n\t\t\tcubemap.dispose();\n\n\t\t}\n\n\t}\n\n\tfunction dispose() {\n\n\t\tcubemaps = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nexport { WebGLCubeMaps };\n","import { ShaderMaterial } from './ShaderMaterial.js';\n\nclass RawShaderMaterial extends ShaderMaterial {\n\n\tconstructor( parameters ) {\n\n\t\tsuper( parameters );\n\n\t\tthis.type = 'RawShaderMaterial';\n\n\t}\n\n}\n\nRawShaderMaterial.prototype.isRawShaderMaterial = true;\n\nexport { RawShaderMaterial };\n","import {\n\tCubeReflectionMapping,\n\tCubeRefractionMapping,\n\tCubeUVReflectionMapping,\n\tLinearEncoding,\n\tLinearFilter,\n\tNoToneMapping,\n\tNoBlending,\n\tRGBAFormat,\n\tHalfFloatType\n} from '../constants.js';\n\nimport { BufferAttribute } from '../core/BufferAttribute.js';\nimport { BufferGeometry } from '../core/BufferGeometry.js';\nimport { Mesh } from '../objects/Mesh.js';\nimport { OrthographicCamera } from '../cameras/OrthographicCamera.js';\nimport { PerspectiveCamera } from '../cameras/PerspectiveCamera.js';\nimport { RawShaderMaterial } from '../materials/RawShaderMaterial.js';\nimport { Vector2 } from '../math/Vector2.js';\nimport { Vector3 } from '../math/Vector3.js';\nimport { Color } from '../math/Color.js';\nimport { WebGLRenderTarget } from '../renderers/WebGLRenderTarget.js';\nimport { MeshBasicMaterial } from '../materials/MeshBasicMaterial.js';\nimport { BoxGeometry } from '../geometries/BoxGeometry.js';\nimport { BackSide } from '../constants.js';\n\nconst LOD_MIN = 4;\nconst LOD_MAX = 8;\nconst SIZE_MAX = Math.pow( 2, LOD_MAX );\n\n// The standard deviations (radians) associated with the extra mips. These are\n// chosen to approximate a Trowbridge-Reitz distribution function times the\n// geometric shadowing function. These sigma values squared must match the\n// variance #defines in cube_uv_reflection_fragment.glsl.js.\nconst EXTRA_LOD_SIGMA = [ 0.125, 0.215, 0.35, 0.446, 0.526, 0.582 ];\n\nconst TOTAL_LODS = LOD_MAX - LOD_MIN + 1 + EXTRA_LOD_SIGMA.length;\n\n// The maximum length of the blur for loop. Smaller sigmas will use fewer\n// samples and exit early, but not recompile the shader.\nconst MAX_SAMPLES = 20;\n\nconst _flatCamera = /*@__PURE__*/ new OrthographicCamera();\nconst { _lodPlanes, _sizeLods, _sigmas } = /*@__PURE__*/ _createPlanes();\nconst _clearColor = /*@__PURE__*/ new Color();\nlet _oldTarget = null;\n\n// Golden Ratio\nconst PHI = ( 1 + Math.sqrt( 5 ) ) / 2;\nconst INV_PHI = 1 / PHI;\n\n// Vertices of a dodecahedron (except the opposites, which represent the\n// same axis), used as axis directions evenly spread on a sphere.\nconst _axisDirections = [\n\t/*@__PURE__*/ new Vector3( 1, 1, 1 ),\n\t/*@__PURE__*/ new Vector3( - 1, 1, 1 ),\n\t/*@__PURE__*/ new Vector3( 1, 1, - 1 ),\n\t/*@__PURE__*/ new Vector3( - 1, 1, - 1 ),\n\t/*@__PURE__*/ new Vector3( 0, PHI, INV_PHI ),\n\t/*@__PURE__*/ new Vector3( 0, PHI, - INV_PHI ),\n\t/*@__PURE__*/ new Vector3( INV_PHI, 0, PHI ),\n\t/*@__PURE__*/ new Vector3( - INV_PHI, 0, PHI ),\n\t/*@__PURE__*/ new Vector3( PHI, INV_PHI, 0 ),\n\t/*@__PURE__*/ new Vector3( - PHI, INV_PHI, 0 ) ];\n\n/**\n * This class generates a Prefiltered, Mipmapped Radiance Environment Map\n * (PMREM) from a cubeMap environment texture. This allows different levels of\n * blur to be quickly accessed based on material roughness. It is packed into a\n * special CubeUV format that allows us to perform custom interpolation so that\n * we can support nonlinear formats such as RGBE. Unlike a traditional mipmap\n * chain, it only goes down to the LOD_MIN level (above), and then creates extra\n * even more filtered 'mips' at the same LOD_MIN resolution, associated with\n * higher roughness levels. In this way we maintain resolution to smoothly\n * interpolate diffuse lighting while limiting sampling computation.\n *\n * Paper: Fast, Accurate Image-Based Lighting\n * https://drive.google.com/file/d/15y8r_UpKlU9SvV4ILb0C3qCPecS8pvLz/view\n*/\n\nclass PMREMGenerator {\n\n\tconstructor( renderer ) {\n\n\t\tthis._renderer = renderer;\n\t\tthis._pingPongRenderTarget = null;\n\n\t\tthis._blurMaterial = _getBlurShader( MAX_SAMPLES );\n\t\tthis._equirectShader = null;\n\t\tthis._cubemapShader = null;\n\n\t\tthis._compileMaterial( this._blurMaterial );\n\n\t}\n\n\t/**\n\t * Generates a PMREM from a supplied Scene, which can be faster than using an\n\t * image if networking bandwidth is low. Optional sigma specifies a blur radius\n\t * in radians to be applied to the scene before PMREM generation. Optional near\n\t * and far planes ensure the scene is rendered in its entirety (the cubeCamera\n\t * is placed at the origin).\n\t */\n\tfromScene( scene, sigma = 0, near = 0.1, far = 100 ) {\n\n\t\t_oldTarget = this._renderer.getRenderTarget();\n\t\tconst cubeUVRenderTarget = this._allocateTargets();\n\n\t\tthis._sceneToCubeUV( scene, near, far, cubeUVRenderTarget );\n\t\tif ( sigma > 0 ) {\n\n\t\t\tthis._blur( cubeUVRenderTarget, 0, 0, sigma );\n\n\t\t}\n\n\t\tthis._applyPMREM( cubeUVRenderTarget );\n\t\tthis._cleanup( cubeUVRenderTarget );\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t/**\n\t * Generates a PMREM from an equirectangular texture, which can be either LDR\n\t * or HDR. The ideal input image size is 1k (1024 x 512),\n\t * as this matches best with the 256 x 256 cubemap output.\n\t */\n\tfromEquirectangular( equirectangular, renderTarget = null ) {\n\n\t\treturn this._fromTexture( equirectangular, renderTarget );\n\n\t}\n\n\t/**\n\t * Generates a PMREM from an cubemap texture, which can be either LDR\n\t * or HDR. The ideal input cube size is 256 x 256,\n\t * as this matches best with the 256 x 256 cubemap output.\n\t */\n\tfromCubemap( cubemap, renderTarget = null ) {\n\n\t\treturn this._fromTexture( cubemap, renderTarget );\n\n\t}\n\n\t/**\n\t * Pre-compiles the cubemap shader. You can get faster start-up by invoking this method during\n\t * your texture's network fetch for increased concurrency.\n\t */\n\tcompileCubemapShader() {\n\n\t\tif ( this._cubemapShader === null ) {\n\n\t\t\tthis._cubemapShader = _getCubemapShader();\n\t\t\tthis._compileMaterial( this._cubemapShader );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Pre-compiles the equirectangular shader. You can get faster start-up by invoking this method during\n\t * your texture's network fetch for increased concurrency.\n\t */\n\tcompileEquirectangularShader() {\n\n\t\tif ( this._equirectShader === null ) {\n\n\t\t\tthis._equirectShader = _getEquirectShader();\n\t\t\tthis._compileMaterial( this._equirectShader );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Disposes of the PMREMGenerator's internal memory. Note that PMREMGenerator is a static class,\n\t * so you should not need more than one PMREMGenerator object. If you do, calling dispose() on\n\t * one of them will cause any others to also become unusable.\n\t */\n\tdispose() {\n\n\t\tthis._blurMaterial.dispose();\n\n\t\tif ( this._pingPongRenderTarget !== null ) this._pingPongRenderTarget.dispose();\n\n\t\tif ( this._cubemapShader !== null ) this._cubemapShader.dispose();\n\t\tif ( this._equirectShader !== null ) this._equirectShader.dispose();\n\n\t\tfor ( let i = 0; i < _lodPlanes.length; i ++ ) {\n\n\t\t\t_lodPlanes[ i ].dispose();\n\n\t\t}\n\n\t}\n\n\t// private interface\n\n\t_cleanup( outputTarget ) {\n\n\t\tthis._renderer.setRenderTarget( _oldTarget );\n\t\toutputTarget.scissorTest = false;\n\t\t_setViewport( outputTarget, 0, 0, outputTarget.width, outputTarget.height );\n\n\t}\n\n\t_fromTexture( texture, renderTarget ) {\n\n\t\t_oldTarget = this._renderer.getRenderTarget();\n\t\tconst cubeUVRenderTarget = renderTarget || this._allocateTargets( texture );\n\t\tthis._textureToCubeUV( texture, cubeUVRenderTarget );\n\t\tthis._applyPMREM( cubeUVRenderTarget );\n\t\tthis._cleanup( cubeUVRenderTarget );\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t_allocateTargets( texture ) { // warning: null texture is valid\n\n\t\tconst params = {\n\t\t\tmagFilter: LinearFilter,\n\t\t\tminFilter: LinearFilter,\n\t\t\tgenerateMipmaps: false,\n\t\t\ttype: HalfFloatType,\n\t\t\tformat: RGBAFormat,\n\t\t\tencoding: LinearEncoding,\n\t\t\tdepthBuffer: false\n\t\t};\n\n\t\tconst cubeUVRenderTarget = _createRenderTarget( params );\n\t\tcubeUVRenderTarget.depthBuffer = texture ? false : true;\n\n\t\tif ( this._pingPongRenderTarget === null ) {\n\n\t\t\tthis._pingPongRenderTarget = _createRenderTarget( params );\n\n\t\t}\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t_compileMaterial( material ) {\n\n\t\tconst tmpMesh = new Mesh( _lodPlanes[ 0 ], material );\n\t\tthis._renderer.compile( tmpMesh, _flatCamera );\n\n\t}\n\n\t_sceneToCubeUV( scene, near, far, cubeUVRenderTarget ) {\n\n\t\tconst fov = 90;\n\t\tconst aspect = 1;\n\t\tconst cubeCamera = new PerspectiveCamera( fov, aspect, near, far );\n\t\tconst upSign = [ 1, - 1, 1, 1, 1, 1 ];\n\t\tconst forwardSign = [ 1, 1, 1, - 1, - 1, - 1 ];\n\t\tconst renderer = this._renderer;\n\n\t\tconst originalAutoClear = renderer.autoClear;\n\t\tconst toneMapping = renderer.toneMapping;\n\t\trenderer.getClearColor( _clearColor );\n\n\t\trenderer.toneMapping = NoToneMapping;\n\t\trenderer.autoClear = false;\n\n\t\tconst backgroundMaterial = new MeshBasicMaterial( {\n\t\t\tname: 'PMREM.Background',\n\t\t\tside: BackSide,\n\t\t\tdepthWrite: false,\n\t\t\tdepthTest: false,\n\t\t} );\n\n\t\tconst backgroundBox = new Mesh( new BoxGeometry(), backgroundMaterial );\n\n\t\tlet useSolidColor = false;\n\t\tconst background = scene.background;\n\n\t\tif ( background ) {\n\n\t\t\tif ( background.isColor ) {\n\n\t\t\t\tbackgroundMaterial.color.copy( background );\n\t\t\t\tscene.background = null;\n\t\t\t\tuseSolidColor = true;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tbackgroundMaterial.color.copy( _clearColor );\n\t\t\tuseSolidColor = true;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst col = i % 3;\n\t\t\tif ( col === 0 ) {\n\n\t\t\t\tcubeCamera.up.set( 0, upSign[ i ], 0 );\n\t\t\t\tcubeCamera.lookAt( forwardSign[ i ], 0, 0 );\n\n\t\t\t} else if ( col === 1 ) {\n\n\t\t\t\tcubeCamera.up.set( 0, 0, upSign[ i ] );\n\t\t\t\tcubeCamera.lookAt( 0, forwardSign[ i ], 0 );\n\n\t\t\t} else {\n\n\t\t\t\tcubeCamera.up.set( 0, upSign[ i ], 0 );\n\t\t\t\tcubeCamera.lookAt( 0, 0, forwardSign[ i ] );\n\n\t\t\t}\n\n\t\t\t_setViewport( cubeUVRenderTarget,\n\t\t\t\tcol * SIZE_MAX, i > 2 ? SIZE_MAX : 0, SIZE_MAX, SIZE_MAX );\n\t\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\n\t\t\tif ( useSolidColor ) {\n\n\t\t\t\trenderer.render( backgroundBox, cubeCamera );\n\n\t\t\t}\n\n\t\t\trenderer.render( scene, cubeCamera );\n\n\t\t}\n\n\t\tbackgroundBox.geometry.dispose();\n\t\tbackgroundBox.material.dispose();\n\n\t\trenderer.toneMapping = toneMapping;\n\t\trenderer.autoClear = originalAutoClear;\n\t\tscene.background = background;\n\n\t}\n\n\t_textureToCubeUV( texture, cubeUVRenderTarget ) {\n\n\t\tconst renderer = this._renderer;\n\n\t\tconst isCubeTexture = ( texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping );\n\n\t\tif ( isCubeTexture ) {\n\n\t\t\tif ( this._cubemapShader === null ) {\n\n\t\t\t\tthis._cubemapShader = _getCubemapShader();\n\n\t\t\t}\n\n\t\t\tthis._cubemapShader.uniforms.flipEnvMap.value = ( texture.isRenderTargetTexture === false ) ? - 1 : 1;\n\n\t\t} else {\n\n\t\t\tif ( this._equirectShader === null ) {\n\n\t\t\t\tthis._equirectShader = _getEquirectShader();\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst material = isCubeTexture ? this._cubemapShader : this._equirectShader;\n\t\tconst mesh = new Mesh( _lodPlanes[ 0 ], material );\n\n\t\tconst uniforms = material.uniforms;\n\n\t\tuniforms[ 'envMap' ].value = texture;\n\n\t\tif ( ! isCubeTexture ) {\n\n\t\t\tuniforms[ 'texelSize' ].value.set( 1.0 / texture.image.width, 1.0 / texture.image.height );\n\n\t\t}\n\n\t\t_setViewport( cubeUVRenderTarget, 0, 0, 3 * SIZE_MAX, 2 * SIZE_MAX );\n\n\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\t\trenderer.render( mesh, _flatCamera );\n\n\t}\n\n\t_applyPMREM( cubeUVRenderTarget ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst autoClear = renderer.autoClear;\n\t\trenderer.autoClear = false;\n\n\t\tfor ( let i = 1; i < TOTAL_LODS; i ++ ) {\n\n\t\t\tconst sigma = Math.sqrt( _sigmas[ i ] * _sigmas[ i ] - _sigmas[ i - 1 ] * _sigmas[ i - 1 ] );\n\n\t\t\tconst poleAxis = _axisDirections[ ( i - 1 ) % _axisDirections.length ];\n\n\t\t\tthis._blur( cubeUVRenderTarget, i - 1, i, sigma, poleAxis );\n\n\t\t}\n\n\t\trenderer.autoClear = autoClear;\n\n\t}\n\n\t/**\n\t * This is a two-pass Gaussian blur for a cubemap. Normally this is done\n\t * vertically and horizontally, but this breaks down on a cube. Here we apply\n\t * the blur latitudinally (around the poles), and then longitudinally (towards\n\t * the poles) to approximate the orthogonally-separable blur. It is least\n\t * accurate at the poles, but still does a decent job.\n\t */\n\t_blur( cubeUVRenderTarget, lodIn, lodOut, sigma, poleAxis ) {\n\n\t\tconst pingPongRenderTarget = this._pingPongRenderTarget;\n\n\t\tthis._halfBlur(\n\t\t\tcubeUVRenderTarget,\n\t\t\tpingPongRenderTarget,\n\t\t\tlodIn,\n\t\t\tlodOut,\n\t\t\tsigma,\n\t\t\t'latitudinal',\n\t\t\tpoleAxis );\n\n\t\tthis._halfBlur(\n\t\t\tpingPongRenderTarget,\n\t\t\tcubeUVRenderTarget,\n\t\t\tlodOut,\n\t\t\tlodOut,\n\t\t\tsigma,\n\t\t\t'longitudinal',\n\t\t\tpoleAxis );\n\n\t}\n\n\t_halfBlur( targetIn, targetOut, lodIn, lodOut, sigmaRadians, direction, poleAxis ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst blurMaterial = this._blurMaterial;\n\n\t\tif ( direction !== 'latitudinal' && direction !== 'longitudinal' ) {\n\n\t\t\tconsole.error(\n\t\t\t\t'blur direction must be either latitudinal or longitudinal!' );\n\n\t\t}\n\n\t\t// Number of standard deviations at which to cut off the discrete approximation.\n\t\tconst STANDARD_DEVIATIONS = 3;\n\n\t\tconst blurMesh = new Mesh( _lodPlanes[ lodOut ], blurMaterial );\n\t\tconst blurUniforms = blurMaterial.uniforms;\n\n\t\tconst pixels = _sizeLods[ lodIn ] - 1;\n\t\tconst radiansPerPixel = isFinite( sigmaRadians ) ? Math.PI / ( 2 * pixels ) : 2 * Math.PI / ( 2 * MAX_SAMPLES - 1 );\n\t\tconst sigmaPixels = sigmaRadians / radiansPerPixel;\n\t\tconst samples = isFinite( sigmaRadians ) ? 1 + Math.floor( STANDARD_DEVIATIONS * sigmaPixels ) : MAX_SAMPLES;\n\n\t\tif ( samples > MAX_SAMPLES ) {\n\n\t\t\tconsole.warn( `sigmaRadians, ${\n\t\t\t\tsigmaRadians}, is too large and will clip, as it requested ${\n\t\t\t\tsamples} samples when the maximum is set to ${MAX_SAMPLES}` );\n\n\t\t}\n\n\t\tconst weights = [];\n\t\tlet sum = 0;\n\n\t\tfor ( let i = 0; i < MAX_SAMPLES; ++ i ) {\n\n\t\t\tconst x = i / sigmaPixels;\n\t\t\tconst weight = Math.exp( - x * x / 2 );\n\t\t\tweights.push( weight );\n\n\t\t\tif ( i === 0 ) {\n\n\t\t\t\tsum += weight;\n\n\t\t\t} else if ( i < samples ) {\n\n\t\t\t\tsum += 2 * weight;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let i = 0; i < weights.length; i ++ ) {\n\n\t\t\tweights[ i ] = weights[ i ] / sum;\n\n\t\t}\n\n\t\tblurUniforms[ 'envMap' ].value = targetIn.texture;\n\t\tblurUniforms[ 'samples' ].value = samples;\n\t\tblurUniforms[ 'weights' ].value = weights;\n\t\tblurUniforms[ 'latitudinal' ].value = direction === 'latitudinal';\n\n\t\tif ( poleAxis ) {\n\n\t\t\tblurUniforms[ 'poleAxis' ].value = poleAxis;\n\n\t\t}\n\n\t\tblurUniforms[ 'dTheta' ].value = radiansPerPixel;\n\t\tblurUniforms[ 'mipInt' ].value = LOD_MAX - lodIn;\n\n\t\tconst outputSize = _sizeLods[ lodOut ];\n\t\tconst x = 3 * Math.max( 0, SIZE_MAX - 2 * outputSize );\n\t\tconst y = ( lodOut === 0 ? 0 : 2 * SIZE_MAX ) + 2 * outputSize * ( lodOut > LOD_MAX - LOD_MIN ? lodOut - LOD_MAX + LOD_MIN : 0 );\n\n\t\t_setViewport( targetOut, x, y, 3 * outputSize, 2 * outputSize );\n\t\trenderer.setRenderTarget( targetOut );\n\t\trenderer.render( blurMesh, _flatCamera );\n\n\t}\n\n}\n\nfunction _createPlanes() {\n\n\tconst _lodPlanes = [];\n\tconst _sizeLods = [];\n\tconst _sigmas = [];\n\n\tlet lod = LOD_MAX;\n\n\tfor ( let i = 0; i < TOTAL_LODS; i ++ ) {\n\n\t\tconst sizeLod = Math.pow( 2, lod );\n\t\t_sizeLods.push( sizeLod );\n\t\tlet sigma = 1.0 / sizeLod;\n\n\t\tif ( i > LOD_MAX - LOD_MIN ) {\n\n\t\t\tsigma = EXTRA_LOD_SIGMA[ i - LOD_MAX + LOD_MIN - 1 ];\n\n\t\t} else if ( i === 0 ) {\n\n\t\t\tsigma = 0;\n\n\t\t}\n\n\t\t_sigmas.push( sigma );\n\n\t\tconst texelSize = 1.0 / ( sizeLod - 1 );\n\t\tconst min = - texelSize / 2;\n\t\tconst max = 1 + texelSize / 2;\n\t\tconst uv1 = [ min, min, max, min, max, max, min, min, max, max, min, max ];\n\n\t\tconst cubeFaces = 6;\n\t\tconst vertices = 6;\n\t\tconst positionSize = 3;\n\t\tconst uvSize = 2;\n\t\tconst faceIndexSize = 1;\n\n\t\tconst position = new Float32Array( positionSize * vertices * cubeFaces );\n\t\tconst uv = new Float32Array( uvSize * vertices * cubeFaces );\n\t\tconst faceIndex = new Float32Array( faceIndexSize * vertices * cubeFaces );\n\n\t\tfor ( let face = 0; face < cubeFaces; face ++ ) {\n\n\t\t\tconst x = ( face % 3 ) * 2 / 3 - 1;\n\t\t\tconst y = face > 2 ? 0 : - 1;\n\t\t\tconst coordinates = [\n\t\t\t\tx, y, 0,\n\t\t\t\tx + 2 / 3, y, 0,\n\t\t\t\tx + 2 / 3, y + 1, 0,\n\t\t\t\tx, y, 0,\n\t\t\t\tx + 2 / 3, y + 1, 0,\n\t\t\t\tx, y + 1, 0\n\t\t\t];\n\t\t\tposition.set( coordinates, positionSize * vertices * face );\n\t\t\tuv.set( uv1, uvSize * vertices * face );\n\t\t\tconst fill = [ face, face, face, face, face, face ];\n\t\t\tfaceIndex.set( fill, faceIndexSize * vertices * face );\n\n\t\t}\n\n\t\tconst planes = new BufferGeometry();\n\t\tplanes.setAttribute( 'position', new BufferAttribute( position, positionSize ) );\n\t\tplanes.setAttribute( 'uv', new BufferAttribute( uv, uvSize ) );\n\t\tplanes.setAttribute( 'faceIndex', new BufferAttribute( faceIndex, faceIndexSize ) );\n\t\t_lodPlanes.push( planes );\n\n\t\tif ( lod > LOD_MIN ) {\n\n\t\t\tlod --;\n\n\t\t}\n\n\t}\n\n\treturn { _lodPlanes, _sizeLods, _sigmas };\n\n}\n\nfunction _createRenderTarget( params ) {\n\n\tconst cubeUVRenderTarget = new WebGLRenderTarget( 3 * SIZE_MAX, 3 * SIZE_MAX, params );\n\tcubeUVRenderTarget.texture.mapping = CubeUVReflectionMapping;\n\tcubeUVRenderTarget.texture.name = 'PMREM.cubeUv';\n\tcubeUVRenderTarget.scissorTest = true;\n\treturn cubeUVRenderTarget;\n\n}\n\nfunction _setViewport( target, x, y, width, height ) {\n\n\ttarget.viewport.set( x, y, width, height );\n\ttarget.scissor.set( x, y, width, height );\n\n}\n\nfunction _getBlurShader( maxSamples ) {\n\n\tconst weights = new Float32Array( maxSamples );\n\tconst poleAxis = new Vector3( 0, 1, 0 );\n\tconst shaderMaterial = new RawShaderMaterial( {\n\n\t\tname: 'SphericalGaussianBlur',\n\n\t\tdefines: { 'n': maxSamples },\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'samples': { value: 1 },\n\t\t\t'weights': { value: weights },\n\t\t\t'latitudinal': { value: false },\n\t\t\t'dTheta': { value: 0 },\n\t\t\t'mipInt': { value: 0 },\n\t\t\t'poleAxis': { value: poleAxis }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform int samples;\n\t\t\tuniform float weights[ n ];\n\t\t\tuniform bool latitudinal;\n\t\t\tuniform float dTheta;\n\t\t\tuniform float mipInt;\n\t\t\tuniform vec3 poleAxis;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include <cube_uv_reflection_fragment>\n\n\t\t\tvec3 getSample( float theta, vec3 axis ) {\n\n\t\t\t\tfloat cosTheta = cos( theta );\n\t\t\t\t// Rodrigues' axis-angle rotation\n\t\t\t\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t\t\t\t+ cross( axis, vOutputDirection ) * sin( theta )\n\t\t\t\t\t+ axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );\n\n\t\t\t\treturn bilinearCubeUV( envMap, sampleDirection, mipInt );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );\n\n\t\t\t\tif ( all( equal( axis, vec3( 0.0 ) ) ) ) {\n\n\t\t\t\t\taxis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );\n\n\t\t\t\t}\n\n\t\t\t\taxis = normalize( axis );\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );\n\n\t\t\t\tfor ( int i = 1; i < n; i++ ) {\n\n\t\t\t\t\tif ( i >= samples ) {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfloat theta = dTheta * float( i );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( theta, axis );\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n\treturn shaderMaterial;\n\n}\n\nfunction _getEquirectShader() {\n\n\tconst texelSize = new Vector2( 1, 1 );\n\tconst shaderMaterial = new RawShaderMaterial( {\n\n\t\tname: 'EquirectangularToCubeUV',\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'texelSize': { value: texelSize }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform vec2 texelSize;\n\n\t\t\t#include <common>\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\n\t\t\t\tvec3 outputDirection = normalize( vOutputDirection );\n\t\t\t\tvec2 uv = equirectUv( outputDirection );\n\n\t\t\t\tvec2 f = fract( uv / texelSize - 0.5 );\n\t\t\t\tuv -= f * texelSize;\n\t\t\t\tvec3 tl = texture2D ( envMap, uv ).rgb;\n\t\t\t\tuv.x += texelSize.x;\n\t\t\t\tvec3 tr = texture2D ( envMap, uv ).rgb;\n\t\t\t\tuv.y += texelSize.y;\n\t\t\t\tvec3 br = texture2D ( envMap, uv ).rgb;\n\t\t\t\tuv.x -= texelSize.x;\n\t\t\t\tvec3 bl = texture2D ( envMap, uv ).rgb;\n\n\t\t\t\tvec3 tm = mix( tl, tr, f.x );\n\t\t\t\tvec3 bm = mix( bl, br, f.x );\n\t\t\t\tgl_FragColor.rgb = mix( tm, bm, f.y );\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n\treturn shaderMaterial;\n\n}\n\nfunction _getCubemapShader() {\n\n\tconst shaderMaterial = new RawShaderMaterial( {\n\n\t\tname: 'CubemapToCubeUV',\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'flipEnvMap': { value: - 1 }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tuniform float flipEnvMap;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform samplerCube envMap;\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = textureCube( envMap, vec3( flipEnvMap * vOutputDirection.x, vOutputDirection.yz ) );\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n\treturn shaderMaterial;\n\n}\n\nfunction _getCommonVertexShader() {\n\n\treturn /* glsl */`\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute vec3 position;\n\t\tattribute vec2 uv;\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t`;\n\n}\n\nexport { PMREMGenerator };\n","import { CubeReflectionMapping, CubeRefractionMapping, EquirectangularReflectionMapping, EquirectangularRefractionMapping } from '../../constants.js';\nimport { PMREMGenerator } from '../../extras/PMREMGenerator.js';\n\nfunction WebGLCubeUVMaps( renderer ) {\n\n\tlet cubeUVmaps = new WeakMap();\n\n\tlet pmremGenerator = null;\n\n\tfunction get( texture ) {\n\n\t\tif ( texture && texture.isTexture ) {\n\n\t\t\tconst mapping = texture.mapping;\n\n\t\t\tconst isEquirectMap = ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping );\n\t\t\tconst isCubeMap = ( mapping === CubeReflectionMapping || mapping === CubeRefractionMapping );\n\n\t\t\t// equirect/cube map to cubeUV conversion\n\n\t\t\tif ( isEquirectMap || isCubeMap ) {\n\n\t\t\t\tif ( texture.isRenderTargetTexture && texture.needsPMREMUpdate === true ) {\n\n\t\t\t\t\ttexture.needsPMREMUpdate = false;\n\n\t\t\t\t\tlet renderTarget = cubeUVmaps.get( texture );\n\n\t\t\t\t\tif ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer );\n\n\t\t\t\t\trenderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture, renderTarget ) : pmremGenerator.fromCubemap( texture, renderTarget );\n\t\t\t\t\tcubeUVmaps.set( texture, renderTarget );\n\n\t\t\t\t\treturn renderTarget.texture;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( cubeUVmaps.has( texture ) ) {\n\n\t\t\t\t\t\treturn cubeUVmaps.get( texture ).texture;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst image = texture.image;\n\n\t\t\t\t\t\tif ( ( isEquirectMap && image && image.height > 0 ) || ( isCubeMap && image && isCubeTextureComplete( image ) ) ) {\n\n\t\t\t\t\t\t\tif ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer );\n\n\t\t\t\t\t\t\tconst renderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture ) : pmremGenerator.fromCubemap( texture );\n\t\t\t\t\t\t\tcubeUVmaps.set( texture, renderTarget );\n\n\t\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\t\treturn renderTarget.texture;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// image not yet ready. try the conversion next frame\n\n\t\t\t\t\t\t\treturn null;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction isCubeTextureComplete( image ) {\n\n\t\tlet count = 0;\n\t\tconst length = 6;\n\n\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\tif ( image[ i ] !== undefined ) count ++;\n\n\t\t}\n\n\t\treturn count === length;\n\n\n\t}\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tconst cubemapUV = cubeUVmaps.get( texture );\n\n\t\tif ( cubemapUV !== undefined ) {\n\n\t\t\tcubeUVmaps.delete( texture );\n\t\t\tcubemapUV.dispose();\n\n\t\t}\n\n\t}\n\n\tfunction dispose() {\n\n\t\tcubeUVmaps = new WeakMap();\n\n\t\tif ( pmremGenerator !== null ) {\n\n\t\t\tpmremGenerator.dispose();\n\t\t\tpmremGenerator = null;\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nexport { WebGLCubeUVMaps };\n","function WebGLExtensions( gl ) {\n\n\tconst extensions = {};\n\n\tfunction getExtension( name ) {\n\n\t\tif ( extensions[ name ] !== undefined ) {\n\n\t\t\treturn extensions[ name ];\n\n\t\t}\n\n\t\tlet extension;\n\n\t\tswitch ( name ) {\n\n\t\t\tcase 'WEBGL_depth_texture':\n\t\t\t\textension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' );\n\t\t\t\tbreak;\n\n\t\t\tcase 'EXT_texture_filter_anisotropic':\n\t\t\t\textension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' );\n\t\t\t\tbreak;\n\n\t\t\tcase 'WEBGL_compressed_texture_s3tc':\n\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' );\n\t\t\t\tbreak;\n\n\t\t\tcase 'WEBGL_compressed_texture_pvrtc':\n\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\textension = gl.getExtension( name );\n\n\t\t}\n\n\t\textensions[ name ] = extension;\n\n\t\treturn extension;\n\n\t}\n\n\treturn {\n\n\t\thas: function ( name ) {\n\n\t\t\treturn getExtension( name ) !== null;\n\n\t\t},\n\n\t\tinit: function ( capabilities ) {\n\n\t\t\tif ( capabilities.isWebGL2 ) {\n\n\t\t\t\tgetExtension( 'EXT_color_buffer_float' );\n\n\t\t\t} else {\n\n\t\t\t\tgetExtension( 'WEBGL_depth_texture' );\n\t\t\t\tgetExtension( 'OES_texture_float' );\n\t\t\t\tgetExtension( 'OES_texture_half_float' );\n\t\t\t\tgetExtension( 'OES_texture_half_float_linear' );\n\t\t\t\tgetExtension( 'OES_standard_derivatives' );\n\t\t\t\tgetExtension( 'OES_element_index_uint' );\n\t\t\t\tgetExtension( 'OES_vertex_array_object' );\n\t\t\t\tgetExtension( 'ANGLE_instanced_arrays' );\n\n\t\t\t}\n\n\t\t\tgetExtension( 'OES_texture_float_linear' );\n\t\t\tgetExtension( 'EXT_color_buffer_half_float' );\n\t\t\tgetExtension( 'WEBGL_multisampled_render_to_texture' );\n\n\t\t},\n\n\t\tget: function ( name ) {\n\n\t\t\tconst extension = getExtension( name );\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' );\n\n\t\t\t}\n\n\t\t\treturn extension;\n\n\t\t}\n\n\t};\n\n}\n\n\nexport { WebGLExtensions };\n","import { Uint16BufferAttribute, Uint32BufferAttribute } from '../../core/BufferAttribute.js';\nimport { arrayNeedsUint32 } from '../../utils.js';\n\nfunction WebGLGeometries( gl, attributes, info, bindingStates ) {\n\n\tconst geometries = {};\n\tconst wireframeAttributes = new WeakMap();\n\n\tfunction onGeometryDispose( event ) {\n\n\t\tconst geometry = event.target;\n\n\t\tif ( geometry.index !== null ) {\n\n\t\t\tattributes.remove( geometry.index );\n\n\t\t}\n\n\t\tfor ( const name in geometry.attributes ) {\n\n\t\t\tattributes.remove( geometry.attributes[ name ] );\n\n\t\t}\n\n\t\tgeometry.removeEventListener( 'dispose', onGeometryDispose );\n\n\t\tdelete geometries[ geometry.id ];\n\n\t\tconst attribute = wireframeAttributes.get( geometry );\n\n\t\tif ( attribute ) {\n\n\t\t\tattributes.remove( attribute );\n\t\t\twireframeAttributes.delete( geometry );\n\n\t\t}\n\n\t\tbindingStates.releaseStatesOfGeometry( geometry );\n\n\t\tif ( geometry.isInstancedBufferGeometry === true ) {\n\n\t\t\tdelete geometry._maxInstanceCount;\n\n\t\t}\n\n\t\t//\n\n\t\tinfo.memory.geometries --;\n\n\t}\n\n\tfunction get( object, geometry ) {\n\n\t\tif ( geometries[ geometry.id ] === true ) return geometry;\n\n\t\tgeometry.addEventListener( 'dispose', onGeometryDispose );\n\n\t\tgeometries[ geometry.id ] = true;\n\n\t\tinfo.memory.geometries ++;\n\n\t\treturn geometry;\n\n\t}\n\n\tfunction update( geometry ) {\n\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\t// Updating index buffer in VAO now. See WebGLBindingStates.\n\n\t\tfor ( const name in geometryAttributes ) {\n\n\t\t\tattributes.update( geometryAttributes[ name ], gl.ARRAY_BUFFER );\n\n\t\t}\n\n\t\t// morph targets\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst array = morphAttributes[ name ];\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\tattributes.update( array[ i ], gl.ARRAY_BUFFER );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction updateWireframeAttribute( geometry ) {\n\n\t\tconst indices = [];\n\n\t\tconst geometryIndex = geometry.index;\n\t\tconst geometryPosition = geometry.attributes.position;\n\t\tlet version = 0;\n\n\t\tif ( geometryIndex !== null ) {\n\n\t\t\tconst array = geometryIndex.array;\n\t\t\tversion = geometryIndex.version;\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\tconst a = array[ i + 0 ];\n\t\t\t\tconst b = array[ i + 1 ];\n\t\t\t\tconst c = array[ i + 2 ];\n\n\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst array = geometryPosition.array;\n\t\t\tversion = geometryPosition.version;\n\n\t\t\tfor ( let i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) {\n\n\t\t\t\tconst a = i + 0;\n\t\t\t\tconst b = i + 1;\n\t\t\t\tconst c = i + 2;\n\n\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst attribute = new ( arrayNeedsUint32( indices ) ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 );\n\t\tattribute.version = version;\n\n\t\t// Updating index buffer in VAO now. See WebGLBindingStates\n\n\t\t//\n\n\t\tconst previousAttribute = wireframeAttributes.get( geometry );\n\n\t\tif ( previousAttribute ) attributes.remove( previousAttribute );\n\n\t\t//\n\n\t\twireframeAttributes.set( geometry, attribute );\n\n\t}\n\n\tfunction getWireframeAttribute( geometry ) {\n\n\t\tconst currentAttribute = wireframeAttributes.get( geometry );\n\n\t\tif ( currentAttribute ) {\n\n\t\t\tconst geometryIndex = geometry.index;\n\n\t\t\tif ( geometryIndex !== null ) {\n\n\t\t\t\t// if the attribute is obsolete, create a new one\n\n\t\t\t\tif ( currentAttribute.version < geometryIndex.version ) {\n\n\t\t\t\t\tupdateWireframeAttribute( geometry );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tupdateWireframeAttribute( geometry );\n\n\t\t}\n\n\t\treturn wireframeAttributes.get( geometry );\n\n\t}\n\n\treturn {\n\n\t\tget: get,\n\t\tupdate: update,\n\n\t\tgetWireframeAttribute: getWireframeAttribute\n\n\t};\n\n}\n\n\nexport { WebGLGeometries };\n","function WebGLIndexedBufferRenderer( gl, extensions, info, capabilities ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\n\tlet mode;\n\n\tfunction setMode( value ) {\n\n\t\tmode = value;\n\n\t}\n\n\tlet type, bytesPerElement;\n\n\tfunction setIndex( value ) {\n\n\t\ttype = value.type;\n\t\tbytesPerElement = value.bytesPerElement;\n\n\t}\n\n\tfunction render( start, count ) {\n\n\t\tgl.drawElements( mode, count, type, start * bytesPerElement );\n\n\t\tinfo.update( count, mode, 1 );\n\n\t}\n\n\tfunction renderInstances( start, count, primcount ) {\n\n\t\tif ( primcount === 0 ) return;\n\n\t\tlet extension, methodName;\n\n\t\tif ( isWebGL2 ) {\n\n\t\t\textension = gl;\n\t\t\tmethodName = 'drawElementsInstanced';\n\n\t\t} else {\n\n\t\t\textension = extensions.get( 'ANGLE_instanced_arrays' );\n\t\t\tmethodName = 'drawElementsInstancedANGLE';\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\textension[ methodName ]( mode, count, type, start * bytesPerElement, primcount );\n\n\t\tinfo.update( count, mode, primcount );\n\n\t}\n\n\t//\n\n\tthis.setMode = setMode;\n\tthis.setIndex = setIndex;\n\tthis.render = render;\n\tthis.renderInstances = renderInstances;\n\n}\n\n\nexport { WebGLIndexedBufferRenderer };\n","function WebGLInfo( gl ) {\n\n\tconst memory = {\n\t\tgeometries: 0,\n\t\ttextures: 0\n\t};\n\n\tconst render = {\n\t\tframe: 0,\n\t\tcalls: 0,\n\t\ttriangles: 0,\n\t\tpoints: 0,\n\t\tlines: 0\n\t};\n\n\tfunction update( count, mode, instanceCount ) {\n\n\t\trender.calls ++;\n\n\t\tswitch ( mode ) {\n\n\t\t\tcase gl.TRIANGLES:\n\t\t\t\trender.triangles += instanceCount * ( count / 3 );\n\t\t\t\tbreak;\n\n\t\t\tcase gl.LINES:\n\t\t\t\trender.lines += instanceCount * ( count / 2 );\n\t\t\t\tbreak;\n\n\t\t\tcase gl.LINE_STRIP:\n\t\t\t\trender.lines += instanceCount * ( count - 1 );\n\t\t\t\tbreak;\n\n\t\t\tcase gl.LINE_LOOP:\n\t\t\t\trender.lines += instanceCount * count;\n\t\t\t\tbreak;\n\n\t\t\tcase gl.POINTS:\n\t\t\t\trender.points += instanceCount * count;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tconsole.error( 'THREE.WebGLInfo: Unknown draw mode:', mode );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\tfunction reset() {\n\n\t\trender.frame ++;\n\t\trender.calls = 0;\n\t\trender.triangles = 0;\n\t\trender.points = 0;\n\t\trender.lines = 0;\n\n\t}\n\n\treturn {\n\t\tmemory: memory,\n\t\trender: render,\n\t\tprograms: null,\n\t\tautoReset: true,\n\t\treset: reset,\n\t\tupdate: update\n\t};\n\n}\n\n\nexport { WebGLInfo };\n","import { Texture } from './Texture.js';\nimport { ClampToEdgeWrapping, NearestFilter } from '../constants.js';\n\nclass DataTexture2DArray extends Texture {\n\n\tconstructor( data = null, width = 1, height = 1, depth = 1 ) {\n\n\t\tsuper( null );\n\n\t\tthis.image = { data, width, height, depth };\n\n\t\tthis.magFilter = NearestFilter;\n\t\tthis.minFilter = NearestFilter;\n\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t\tthis.generateMipmaps = false;\n\t\tthis.flipY = false;\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n}\n\nDataTexture2DArray.prototype.isDataTexture2DArray = true;\n\nexport { DataTexture2DArray };\n","import { FloatType, RGBAFormat } from '../../constants.js';\nimport { DataTexture2DArray } from '../../textures/DataTexture2DArray.js';\nimport { Vector3 } from '../../math/Vector3.js';\nimport { Vector2 } from '../../math/Vector2.js';\n\nfunction numericalSort( a, b ) {\n\n\treturn a[ 0 ] - b[ 0 ];\n\n}\n\nfunction absNumericalSort( a, b ) {\n\n\treturn Math.abs( b[ 1 ] ) - Math.abs( a[ 1 ] );\n\n}\n\nfunction denormalize( morph, attribute ) {\n\n\tlet denominator = 1;\n\tconst array = attribute.isInterleavedBufferAttribute ? attribute.data.array : attribute.array;\n\n\tif ( array instanceof Int8Array ) denominator = 127;\n\telse if ( array instanceof Int16Array ) denominator = 32767;\n\telse if ( array instanceof Int32Array ) denominator = 2147483647;\n\telse console.error( 'THREE.WebGLMorphtargets: Unsupported morph attribute data type: ', array );\n\n\tmorph.divideScalar( denominator );\n\n}\n\nfunction WebGLMorphtargets( gl, capabilities, textures ) {\n\n\tconst influencesList = {};\n\tconst morphInfluences = new Float32Array( 8 );\n\tconst morphTextures = new WeakMap();\n\tconst morph = new Vector3();\n\n\tconst workInfluences = [];\n\n\tfor ( let i = 0; i < 8; i ++ ) {\n\n\t\tworkInfluences[ i ] = [ i, 0 ];\n\n\t}\n\n\tfunction update( object, geometry, material, program ) {\n\n\t\tconst objectInfluences = object.morphTargetInfluences;\n\n\t\tif ( capabilities.isWebGL2 === true ) {\n\n\t\t\t// instead of using attributes, the WebGL 2 code path encodes morph targets\n\t\t\t// into an array of data textures. Each layer represents a single morph target.\n\n\t\t\tconst numberOfMorphTargets = geometry.morphAttributes.position.length;\n\n\t\t\tlet entry = morphTextures.get( geometry );\n\n\t\t\tif ( entry === undefined || entry.count !== numberOfMorphTargets ) {\n\n\t\t\t\tif ( entry !== undefined ) entry.texture.dispose();\n\n\t\t\t\tconst hasMorphNormals = geometry.morphAttributes.normal !== undefined;\n\n\t\t\t\tconst morphTargets = geometry.morphAttributes.position;\n\t\t\t\tconst morphNormals = geometry.morphAttributes.normal || [];\n\n\t\t\t\tconst numberOfVertices = geometry.attributes.position.count;\n\t\t\t\tconst numberOfVertexData = ( hasMorphNormals === true ) ? 2 : 1; // (v,n) vs. (v)\n\n\t\t\t\tlet width = numberOfVertices * numberOfVertexData;\n\t\t\t\tlet height = 1;\n\n\t\t\t\tif ( width > capabilities.maxTextureSize ) {\n\n\t\t\t\t\theight = Math.ceil( width / capabilities.maxTextureSize );\n\t\t\t\t\twidth = capabilities.maxTextureSize;\n\n\t\t\t\t}\n\n\t\t\t\tconst buffer = new Float32Array( width * height * 4 * numberOfMorphTargets );\n\n\t\t\t\tconst texture = new DataTexture2DArray( buffer, width, height, numberOfMorphTargets );\n\t\t\t\ttexture.format = RGBAFormat; // using RGBA since RGB might be emulated (and is thus slower)\n\t\t\t\ttexture.type = FloatType;\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t// fill buffer\n\n\t\t\t\tconst vertexDataStride = numberOfVertexData * 4;\n\n\t\t\t\tfor ( let i = 0; i < numberOfMorphTargets; i ++ ) {\n\n\t\t\t\t\tconst morphTarget = morphTargets[ i ];\n\t\t\t\t\tconst morphNormal = morphNormals[ i ];\n\n\t\t\t\t\tconst offset = width * height * 4 * i;\n\n\t\t\t\t\tfor ( let j = 0; j < morphTarget.count; j ++ ) {\n\n\t\t\t\t\t\tmorph.fromBufferAttribute( morphTarget, j );\n\n\t\t\t\t\t\tif ( morphTarget.normalized === true ) denormalize( morph, morphTarget );\n\n\t\t\t\t\t\tconst stride = j * vertexDataStride;\n\n\t\t\t\t\t\tbuffer[ offset + stride + 0 ] = morph.x;\n\t\t\t\t\t\tbuffer[ offset + stride + 1 ] = morph.y;\n\t\t\t\t\t\tbuffer[ offset + stride + 2 ] = morph.z;\n\t\t\t\t\t\tbuffer[ offset + stride + 3 ] = 0;\n\n\t\t\t\t\t\tif ( hasMorphNormals === true ) {\n\n\t\t\t\t\t\t\tmorph.fromBufferAttribute( morphNormal, j );\n\n\t\t\t\t\t\t\tif ( morphNormal.normalized === true ) denormalize( morph, morphNormal );\n\n\t\t\t\t\t\t\tbuffer[ offset + stride + 4 ] = morph.x;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 5 ] = morph.y;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 6 ] = morph.z;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 7 ] = 0;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tentry = {\n\t\t\t\t\tcount: numberOfMorphTargets,\n\t\t\t\t\ttexture: texture,\n\t\t\t\t\tsize: new Vector2( width, height )\n\t\t\t\t};\n\n\t\t\t\tmorphTextures.set( geometry, entry );\n\n\t\t\t\tfunction disposeTexture() {\n\n\t\t\t\t\ttexture.dispose();\n\n\t\t\t\t\tmorphTextures.delete( geometry );\n\n\t\t\t\t\tgeometry.removeEventListener( 'dispose', disposeTexture );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.addEventListener( 'dispose', disposeTexture );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tlet morphInfluencesSum = 0;\n\n\t\t\tfor ( let i = 0; i < objectInfluences.length; i ++ ) {\n\n\t\t\t\tmorphInfluencesSum += objectInfluences[ i ];\n\n\t\t\t}\n\n\t\t\tconst morphBaseInfluence = geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum;\n\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetBaseInfluence', morphBaseInfluence );\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetInfluences', objectInfluences );\n\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetsTexture', entry.texture, textures );\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetsTextureSize', entry.size );\n\n\n\t\t} else {\n\n\t\t\t// When object doesn't have morph target influences defined, we treat it as a 0-length array\n\t\t\t// This is important to make sure we set up morphTargetBaseInfluence / morphTargetInfluences\n\n\t\t\tconst length = objectInfluences === undefined ? 0 : objectInfluences.length;\n\n\t\t\tlet influences = influencesList[ geometry.id ];\n\n\t\t\tif ( influences === undefined || influences.length !== length ) {\n\n\t\t\t\t// initialise list\n\n\t\t\t\tinfluences = [];\n\n\t\t\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\t\t\tinfluences[ i ] = [ i, 0 ];\n\n\t\t\t\t}\n\n\t\t\t\tinfluencesList[ geometry.id ] = influences;\n\n\t\t\t}\n\n\t\t\t// Collect influences\n\n\t\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\t\tconst influence = influences[ i ];\n\n\t\t\t\tinfluence[ 0 ] = i;\n\t\t\t\tinfluence[ 1 ] = objectInfluences[ i ];\n\n\t\t\t}\n\n\t\t\tinfluences.sort( absNumericalSort );\n\n\t\t\tfor ( let i = 0; i < 8; i ++ ) {\n\n\t\t\t\tif ( i < length && influences[ i ][ 1 ] ) {\n\n\t\t\t\t\tworkInfluences[ i ][ 0 ] = influences[ i ][ 0 ];\n\t\t\t\t\tworkInfluences[ i ][ 1 ] = influences[ i ][ 1 ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\tworkInfluences[ i ][ 0 ] = Number.MAX_SAFE_INTEGER;\n\t\t\t\t\tworkInfluences[ i ][ 1 ] = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tworkInfluences.sort( numericalSort );\n\n\t\t\tconst morphTargets = geometry.morphAttributes.position;\n\t\t\tconst morphNormals = geometry.morphAttributes.normal;\n\n\t\t\tlet morphInfluencesSum = 0;\n\n\t\t\tfor ( let i = 0; i < 8; i ++ ) {\n\n\t\t\t\tconst influence = workInfluences[ i ];\n\t\t\t\tconst index = influence[ 0 ];\n\t\t\t\tconst value = influence[ 1 ];\n\n\t\t\t\tif ( index !== Number.MAX_SAFE_INTEGER && value ) {\n\n\t\t\t\t\tif ( morphTargets && geometry.getAttribute( 'morphTarget' + i ) !== morphTargets[ index ] ) {\n\n\t\t\t\t\t\tgeometry.setAttribute( 'morphTarget' + i, morphTargets[ index ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( morphNormals && geometry.getAttribute( 'morphNormal' + i ) !== morphNormals[ index ] ) {\n\n\t\t\t\t\t\tgeometry.setAttribute( 'morphNormal' + i, morphNormals[ index ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tmorphInfluences[ i ] = value;\n\t\t\t\t\tmorphInfluencesSum += value;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( morphTargets && geometry.hasAttribute( 'morphTarget' + i ) === true ) {\n\n\t\t\t\t\t\tgeometry.deleteAttribute( 'morphTarget' + i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( morphNormals && geometry.hasAttribute( 'morphNormal' + i ) === true ) {\n\n\t\t\t\t\t\tgeometry.deleteAttribute( 'morphNormal' + i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tmorphInfluences[ i ] = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// GLSL shader uses formula baseinfluence * base + sum(target * influence)\n\t\t\t// This allows us to switch between absolute morphs and relative morphs without changing shader code\n\t\t\t// When baseinfluence = 1 - sum(influence), the above is equivalent to sum((target - base) * influence)\n\t\t\tconst morphBaseInfluence = geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum;\n\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetBaseInfluence', morphBaseInfluence );\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetInfluences', morphInfluences );\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\tupdate: update\n\n\t};\n\n}\n\n\nexport { WebGLMorphtargets };\n","import { WebGLRenderTarget } from './WebGLRenderTarget.js';\n\nclass WebGLMultisampleRenderTarget extends WebGLRenderTarget {\n\n\tconstructor( width, height, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\tthis.samples = 4;\n\n\t\tthis.ignoreDepthForMultisampleCopy = options.ignoreDepth !== undefined ? options.ignoreDepth : true;\n\t\tthis.useRenderToTexture = ( options.useRenderToTexture !== undefined ) ? options.useRenderToTexture : false;\n\t\tthis.useRenderbuffer = this.useRenderToTexture === false;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy.call( this, source );\n\n\t\tthis.samples = source.samples;\n\t\tthis.useRenderToTexture = source.useRenderToTexture;\n\t\tthis.useRenderbuffer = source.useRenderbuffer;\n\n\t\treturn this;\n\n\t}\n\n}\n\nWebGLMultisampleRenderTarget.prototype.isWebGLMultisampleRenderTarget = true;\n\nexport { WebGLMultisampleRenderTarget };\n","function WebGLObjects( gl, geometries, attributes, info ) {\n\n\tlet updateMap = new WeakMap();\n\n\tfunction update( object ) {\n\n\t\tconst frame = info.render.frame;\n\n\t\tconst geometry = object.geometry;\n\t\tconst buffergeometry = geometries.get( object, geometry );\n\n\t\t// Update once per frame\n\n\t\tif ( updateMap.get( buffergeometry ) !== frame ) {\n\n\t\t\tgeometries.update( buffergeometry );\n\n\t\t\tupdateMap.set( buffergeometry, frame );\n\n\t\t}\n\n\t\tif ( object.isInstancedMesh ) {\n\n\t\t\tif ( object.hasEventListener( 'dispose', onInstancedMeshDispose ) === false ) {\n\n\t\t\t\tobject.addEventListener( 'dispose', onInstancedMeshDispose );\n\n\t\t\t}\n\n\t\t\tattributes.update( object.instanceMatrix, gl.ARRAY_BUFFER );\n\n\t\t\tif ( object.instanceColor !== null ) {\n\n\t\t\t\tattributes.update( object.instanceColor, gl.ARRAY_BUFFER );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn buffergeometry;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tupdateMap = new WeakMap();\n\n\t}\n\n\tfunction onInstancedMeshDispose( event ) {\n\n\t\tconst instancedMesh = event.target;\n\n\t\tinstancedMesh.removeEventListener( 'dispose', onInstancedMeshDispose );\n\n\t\tattributes.remove( instancedMesh.instanceMatrix );\n\n\t\tif ( instancedMesh.instanceColor !== null ) attributes.remove( instancedMesh.instanceColor );\n\n\t}\n\n\treturn {\n\n\t\tupdate: update,\n\t\tdispose: dispose\n\n\t};\n\n}\n\n\nexport { WebGLObjects };\n","import { Texture } from './Texture.js';\nimport { ClampToEdgeWrapping, NearestFilter } from '../constants.js';\n\nclass DataTexture3D extends Texture {\n\n\tconstructor( data = null, width = 1, height = 1, depth = 1 ) {\n\n\t\t// We're going to add .setXXX() methods for setting properties later.\n\t\t// Users can still set in DataTexture3D directly.\n\t\t//\n\t\t//\tconst texture = new THREE.DataTexture3D( data, width, height, depth );\n\t\t// \ttexture.anisotropy = 16;\n\t\t//\n\t\t// See #14839\n\n\t\tsuper( null );\n\n\t\tthis.image = { data, width, height, depth };\n\n\t\tthis.magFilter = NearestFilter;\n\t\tthis.minFilter = NearestFilter;\n\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t\tthis.generateMipmaps = false;\n\t\tthis.flipY = false;\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n}\n\nDataTexture3D.prototype.isDataTexture3D = true;\n\nexport { DataTexture3D };\n","/**\n * Uniforms of a program.\n * Those form a tree structure with a special top-level container for the root,\n * which you get by calling 'new WebGLUniforms( gl, program )'.\n *\n *\n * Properties of inner nodes including the top-level container:\n *\n * .seq - array of nested uniforms\n * .map - nested uniforms by name\n *\n *\n * Methods of all nodes except the top-level container:\n *\n * .setValue( gl, value, [textures] )\n *\n * \t\tuploads a uniform value(s)\n *  \tthe 'textures' parameter is needed for sampler uniforms\n *\n *\n * Static methods of the top-level container (textures factorizations):\n *\n * .upload( gl, seq, values, textures )\n *\n * \t\tsets uniforms in 'seq' to 'values[id].value'\n *\n * .seqWithValue( seq, values ) : filteredSeq\n *\n * \t\tfilters 'seq' entries with corresponding entry in values\n *\n *\n * Methods of the top-level container (textures factorizations):\n *\n * .setValue( gl, name, value, textures )\n *\n * \t\tsets uniform with  name 'name' to 'value'\n *\n * .setOptional( gl, obj, prop )\n *\n * \t\tlike .set for an optional property of the object\n *\n */\n\nimport { CubeTexture } from '../../textures/CubeTexture.js';\nimport { Texture } from '../../textures/Texture.js';\nimport { DataTexture2DArray } from '../../textures/DataTexture2DArray.js';\nimport { DataTexture3D } from '../../textures/DataTexture3D.js';\n\nconst emptyTexture = new Texture();\nconst emptyTexture2dArray = new DataTexture2DArray();\nconst emptyTexture3d = new DataTexture3D();\nconst emptyCubeTexture = new CubeTexture();\n\n// --- Utilities ---\n\n// Array Caches (provide typed arrays for temporary by size)\n\nconst arrayCacheF32 = [];\nconst arrayCacheI32 = [];\n\n// Float32Array caches used for uploading Matrix uniforms\n\nconst mat4array = new Float32Array( 16 );\nconst mat3array = new Float32Array( 9 );\nconst mat2array = new Float32Array( 4 );\n\n// Flattening for arrays of vectors and matrices\n\nfunction flatten( array, nBlocks, blockSize ) {\n\n\tconst firstElem = array[ 0 ];\n\n\tif ( firstElem <= 0 || firstElem > 0 ) return array;\n\t// unoptimized: ! isNaN( firstElem )\n\t// see http://jacksondunstan.com/articles/983\n\n\tconst n = nBlocks * blockSize;\n\tlet r = arrayCacheF32[ n ];\n\n\tif ( r === undefined ) {\n\n\t\tr = new Float32Array( n );\n\t\tarrayCacheF32[ n ] = r;\n\n\t}\n\n\tif ( nBlocks !== 0 ) {\n\n\t\tfirstElem.toArray( r, 0 );\n\n\t\tfor ( let i = 1, offset = 0; i !== nBlocks; ++ i ) {\n\n\t\t\toffset += blockSize;\n\t\t\tarray[ i ].toArray( r, offset );\n\n\t\t}\n\n\t}\n\n\treturn r;\n\n}\n\nfunction arraysEqual( a, b ) {\n\n\tif ( a.length !== b.length ) return false;\n\n\tfor ( let i = 0, l = a.length; i < l; i ++ ) {\n\n\t\tif ( a[ i ] !== b[ i ] ) return false;\n\n\t}\n\n\treturn true;\n\n}\n\nfunction copyArray( a, b ) {\n\n\tfor ( let i = 0, l = b.length; i < l; i ++ ) {\n\n\t\ta[ i ] = b[ i ];\n\n\t}\n\n}\n\n// Texture unit allocation\n\nfunction allocTexUnits( textures, n ) {\n\n\tlet r = arrayCacheI32[ n ];\n\n\tif ( r === undefined ) {\n\n\t\tr = new Int32Array( n );\n\t\tarrayCacheI32[ n ] = r;\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\tr[ i ] = textures.allocateTextureUnit();\n\n\t}\n\n\treturn r;\n\n}\n\n// --- Setters ---\n\n// Note: Defining these methods externally, because they come in a bunch\n// and this way their names minify.\n\n// Single scalar\n\nfunction setValueV1f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1f( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single float vector (from flat array or THREE.VectorN)\n\nfunction setValueV2f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {\n\n\t\t\tgl.uniform2f( this.addr, v.x, v.y );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform2fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV3f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {\n\n\t\t\tgl.uniform3f( this.addr, v.x, v.y, v.z );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\n\t\t}\n\n\t} else if ( v.r !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.r || cache[ 1 ] !== v.g || cache[ 2 ] !== v.b ) {\n\n\t\t\tgl.uniform3f( this.addr, v.r, v.g, v.b );\n\n\t\t\tcache[ 0 ] = v.r;\n\t\t\tcache[ 1 ] = v.g;\n\t\t\tcache[ 2 ] = v.b;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform3fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV4f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {\n\n\t\t\tgl.uniform4f( this.addr, v.x, v.y, v.z, v.w );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\t\t\tcache[ 3 ] = v.w;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform4fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\n// Single matrix (from flat array or THREE.MatrixN)\n\nfunction setValueM2( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix2fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat2array.set( elements );\n\n\t\tgl.uniformMatrix2fv( this.addr, false, mat2array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\nfunction setValueM3( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix3fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat3array.set( elements );\n\n\t\tgl.uniformMatrix3fv( this.addr, false, mat3array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\nfunction setValueM4( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix4fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat4array.set( elements );\n\n\t\tgl.uniformMatrix4fv( this.addr, false, mat4array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\n// Single integer / boolean\n\nfunction setValueV1i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1i( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single integer / boolean vector (from flat array)\n\nfunction setValueV2i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( arraysEqual( cache, v ) ) return;\n\n\tgl.uniform2iv( this.addr, v );\n\n\tcopyArray( cache, v );\n\n}\n\nfunction setValueV3i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( arraysEqual( cache, v ) ) return;\n\n\tgl.uniform3iv( this.addr, v );\n\n\tcopyArray( cache, v );\n\n}\n\nfunction setValueV4i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( arraysEqual( cache, v ) ) return;\n\n\tgl.uniform4iv( this.addr, v );\n\n\tcopyArray( cache, v );\n\n}\n\n// Single unsigned integer\n\nfunction setValueV1ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1ui( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single unsigned integer vector (from flat array)\n\nfunction setValueV2ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( arraysEqual( cache, v ) ) return;\n\n\tgl.uniform2uiv( this.addr, v );\n\n\tcopyArray( cache, v );\n\n}\n\nfunction setValueV3ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( arraysEqual( cache, v ) ) return;\n\n\tgl.uniform3uiv( this.addr, v );\n\n\tcopyArray( cache, v );\n\n}\n\nfunction setValueV4ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( arraysEqual( cache, v ) ) return;\n\n\tgl.uniform4uiv( this.addr, v );\n\n\tcopyArray( cache, v );\n\n}\n\n\n// Single texture (2D / Cube)\n\nfunction setValueT1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.safeSetTexture2D( v || emptyTexture, unit );\n\n}\n\nfunction setValueT3D1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTexture3D( v || emptyTexture3d, unit );\n\n}\n\nfunction setValueT6( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.safeSetTextureCube( v || emptyCubeTexture, unit );\n\n}\n\nfunction setValueT2DArray1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTexture2DArray( v || emptyTexture2dArray, unit );\n\n}\n\n// Helper to pick the right setter for the singular case\n\nfunction getSingularSetter( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase 0x1406: return setValueV1f; // FLOAT\n\t\tcase 0x8b50: return setValueV2f; // _VEC2\n\t\tcase 0x8b51: return setValueV3f; // _VEC3\n\t\tcase 0x8b52: return setValueV4f; // _VEC4\n\n\t\tcase 0x8b5a: return setValueM2; // _MAT2\n\t\tcase 0x8b5b: return setValueM3; // _MAT3\n\t\tcase 0x8b5c: return setValueM4; // _MAT4\n\n\t\tcase 0x1404: case 0x8b56: return setValueV1i; // INT, BOOL\n\t\tcase 0x8b53: case 0x8b57: return setValueV2i; // _VEC2\n\t\tcase 0x8b54: case 0x8b58: return setValueV3i; // _VEC3\n\t\tcase 0x8b55: case 0x8b59: return setValueV4i; // _VEC4\n\n\t\tcase 0x1405: return setValueV1ui; // UINT\n\t\tcase 0x8dc6: return setValueV2ui; // _VEC2\n\t\tcase 0x8dc7: return setValueV3ui; // _VEC3\n\t\tcase 0x8dc8: return setValueV4ui; // _VEC4\n\n\t\tcase 0x8b5e: // SAMPLER_2D\n\t\tcase 0x8d66: // SAMPLER_EXTERNAL_OES\n\t\tcase 0x8dca: // INT_SAMPLER_2D\n\t\tcase 0x8dd2: // UNSIGNED_INT_SAMPLER_2D\n\t\tcase 0x8b62: // SAMPLER_2D_SHADOW\n\t\t\treturn setValueT1;\n\n\t\tcase 0x8b5f: // SAMPLER_3D\n\t\tcase 0x8dcb: // INT_SAMPLER_3D\n\t\tcase 0x8dd3: // UNSIGNED_INT_SAMPLER_3D\n\t\t\treturn setValueT3D1;\n\n\t\tcase 0x8b60: // SAMPLER_CUBE\n\t\tcase 0x8dcc: // INT_SAMPLER_CUBE\n\t\tcase 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE\n\t\tcase 0x8dc5: // SAMPLER_CUBE_SHADOW\n\t\t\treturn setValueT6;\n\n\t\tcase 0x8dc1: // SAMPLER_2D_ARRAY\n\t\tcase 0x8dcf: // INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dd7: // UNSIGNED_INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dc4: // SAMPLER_2D_ARRAY_SHADOW\n\t\t\treturn setValueT2DArray1;\n\n\t}\n\n}\n\n\n// Array of scalars\n\nfunction setValueV1fArray( gl, v ) {\n\n\tgl.uniform1fv( this.addr, v );\n\n}\n\n// Array of vectors (from flat array or array of THREE.VectorN)\n\nfunction setValueV2fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 2 );\n\n\tgl.uniform2fv( this.addr, data );\n\n}\n\nfunction setValueV3fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 3 );\n\n\tgl.uniform3fv( this.addr, data );\n\n}\n\nfunction setValueV4fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 4 );\n\n\tgl.uniform4fv( this.addr, data );\n\n}\n\n// Array of matrices (from flat array or array of THREE.MatrixN)\n\nfunction setValueM2Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 4 );\n\n\tgl.uniformMatrix2fv( this.addr, false, data );\n\n}\n\nfunction setValueM3Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 9 );\n\n\tgl.uniformMatrix3fv( this.addr, false, data );\n\n}\n\nfunction setValueM4Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 16 );\n\n\tgl.uniformMatrix4fv( this.addr, false, data );\n\n}\n\n// Array of integer / boolean\n\nfunction setValueV1iArray( gl, v ) {\n\n\tgl.uniform1iv( this.addr, v );\n\n}\n\n// Array of integer / boolean vectors (from flat array)\n\nfunction setValueV2iArray( gl, v ) {\n\n\tgl.uniform2iv( this.addr, v );\n\n}\n\nfunction setValueV3iArray( gl, v ) {\n\n\tgl.uniform3iv( this.addr, v );\n\n}\n\nfunction setValueV4iArray( gl, v ) {\n\n\tgl.uniform4iv( this.addr, v );\n\n}\n\n// Array of unsigned integer\n\nfunction setValueV1uiArray( gl, v ) {\n\n\tgl.uniform1uiv( this.addr, v );\n\n}\n\n// Array of unsigned integer vectors (from flat array)\n\nfunction setValueV2uiArray( gl, v ) {\n\n\tgl.uniform2uiv( this.addr, v );\n\n}\n\nfunction setValueV3uiArray( gl, v ) {\n\n\tgl.uniform3uiv( this.addr, v );\n\n}\n\nfunction setValueV4uiArray( gl, v ) {\n\n\tgl.uniform4uiv( this.addr, v );\n\n}\n\n\n// Array of textures (2D / 3D / Cube / 2DArray)\n\nfunction setValueT1Array( gl, v, textures ) {\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tgl.uniform1iv( this.addr, units );\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.safeSetTexture2D( v[ i ] || emptyTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT3DArray( gl, v, textures ) {\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tgl.uniform1iv( this.addr, units );\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture3D( v[ i ] || emptyTexture3d, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT6Array( gl, v, textures ) {\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tgl.uniform1iv( this.addr, units );\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.safeSetTextureCube( v[ i ] || emptyCubeTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT2DArrayArray( gl, v, textures ) {\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tgl.uniform1iv( this.addr, units );\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture2DArray( v[ i ] || emptyTexture2dArray, units[ i ] );\n\n\t}\n\n}\n\n\n// Helper to pick the right setter for a pure (bottom-level) array\n\nfunction getPureArraySetter( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase 0x1406: return setValueV1fArray; // FLOAT\n\t\tcase 0x8b50: return setValueV2fArray; // _VEC2\n\t\tcase 0x8b51: return setValueV3fArray; // _VEC3\n\t\tcase 0x8b52: return setValueV4fArray; // _VEC4\n\n\t\tcase 0x8b5a: return setValueM2Array; // _MAT2\n\t\tcase 0x8b5b: return setValueM3Array; // _MAT3\n\t\tcase 0x8b5c: return setValueM4Array; // _MAT4\n\n\t\tcase 0x1404: case 0x8b56: return setValueV1iArray; // INT, BOOL\n\t\tcase 0x8b53: case 0x8b57: return setValueV2iArray; // _VEC2\n\t\tcase 0x8b54: case 0x8b58: return setValueV3iArray; // _VEC3\n\t\tcase 0x8b55: case 0x8b59: return setValueV4iArray; // _VEC4\n\n\t\tcase 0x1405: return setValueV1uiArray; // UINT\n\t\tcase 0x8dc6: return setValueV2uiArray; // _VEC2\n\t\tcase 0x8dc7: return setValueV3uiArray; // _VEC3\n\t\tcase 0x8dc8: return setValueV4uiArray; // _VEC4\n\n\t\tcase 0x8b5e: // SAMPLER_2D\n\t\tcase 0x8d66: // SAMPLER_EXTERNAL_OES\n\t\tcase 0x8dca: // INT_SAMPLER_2D\n\t\tcase 0x8dd2: // UNSIGNED_INT_SAMPLER_2D\n\t\tcase 0x8b62: // SAMPLER_2D_SHADOW\n\t\t\treturn setValueT1Array;\n\n\t\tcase 0x8b5f: // SAMPLER_3D\n\t\tcase 0x8dcb: // INT_SAMPLER_3D\n\t\tcase 0x8dd3: // UNSIGNED_INT_SAMPLER_3D\n\t\t\treturn setValueT3DArray;\n\n\t\tcase 0x8b60: // SAMPLER_CUBE\n\t\tcase 0x8dcc: // INT_SAMPLER_CUBE\n\t\tcase 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE\n\t\tcase 0x8dc5: // SAMPLER_CUBE_SHADOW\n\t\t\treturn setValueT6Array;\n\n\t\tcase 0x8dc1: // SAMPLER_2D_ARRAY\n\t\tcase 0x8dcf: // INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dd7: // UNSIGNED_INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dc4: // SAMPLER_2D_ARRAY_SHADOW\n\t\t\treturn setValueT2DArrayArray;\n\n\t}\n\n}\n\n// --- Uniform Classes ---\n\nfunction SingleUniform( id, activeInfo, addr ) {\n\n\tthis.id = id;\n\tthis.addr = addr;\n\tthis.cache = [];\n\tthis.setValue = getSingularSetter( activeInfo.type );\n\n\t// this.path = activeInfo.name; // DEBUG\n\n}\n\nfunction PureArrayUniform( id, activeInfo, addr ) {\n\n\tthis.id = id;\n\tthis.addr = addr;\n\tthis.cache = [];\n\tthis.size = activeInfo.size;\n\tthis.setValue = getPureArraySetter( activeInfo.type );\n\n\t// this.path = activeInfo.name; // DEBUG\n\n}\n\nPureArrayUniform.prototype.updateCache = function ( data ) {\n\n\tconst cache = this.cache;\n\n\tif ( data instanceof Float32Array && cache.length !== data.length ) {\n\n\t\tthis.cache = new Float32Array( data.length );\n\n\t}\n\n\tcopyArray( cache, data );\n\n};\n\nfunction StructuredUniform( id ) {\n\n\tthis.id = id;\n\n\tthis.seq = [];\n\tthis.map = {};\n\n}\n\nStructuredUniform.prototype.setValue = function ( gl, value, textures ) {\n\n\tconst seq = this.seq;\n\n\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\tconst u = seq[ i ];\n\t\tu.setValue( gl, value[ u.id ], textures );\n\n\t}\n\n};\n\n// --- Top-level ---\n\n// Parser - builds up the property tree from the path strings\n\nconst RePathPart = /(\\w+)(\\])?(\\[|\\.)?/g;\n\n// extracts\n// \t- the identifier (member name or array index)\n//  - followed by an optional right bracket (found when array index)\n//  - followed by an optional left bracket or dot (type of subscript)\n//\n// Note: These portions can be read in a non-overlapping fashion and\n// allow straightforward parsing of the hierarchy that WebGL encodes\n// in the uniform names.\n\nfunction addUniform( container, uniformObject ) {\n\n\tcontainer.seq.push( uniformObject );\n\tcontainer.map[ uniformObject.id ] = uniformObject;\n\n}\n\nfunction parseUniform( activeInfo, addr, container ) {\n\n\tconst path = activeInfo.name,\n\t\tpathLength = path.length;\n\n\t// reset RegExp object, because of the early exit of a previous run\n\tRePathPart.lastIndex = 0;\n\n\twhile ( true ) {\n\n\t\tconst match = RePathPart.exec( path ),\n\t\t\tmatchEnd = RePathPart.lastIndex;\n\n\t\tlet id = match[ 1 ];\n\t\tconst idIsIndex = match[ 2 ] === ']',\n\t\t\tsubscript = match[ 3 ];\n\n\t\tif ( idIsIndex ) id = id | 0; // convert to integer\n\n\t\tif ( subscript === undefined || subscript === '[' && matchEnd + 2 === pathLength ) {\n\n\t\t\t// bare name or \"pure\" bottom-level array \"[0]\" suffix\n\n\t\t\taddUniform( container, subscript === undefined ?\n\t\t\t\tnew SingleUniform( id, activeInfo, addr ) :\n\t\t\t\tnew PureArrayUniform( id, activeInfo, addr ) );\n\n\t\t\tbreak;\n\n\t\t} else {\n\n\t\t\t// step into inner node / create it in case it doesn't exist\n\n\t\t\tconst map = container.map;\n\t\t\tlet next = map[ id ];\n\n\t\t\tif ( next === undefined ) {\n\n\t\t\t\tnext = new StructuredUniform( id );\n\t\t\t\taddUniform( container, next );\n\n\t\t\t}\n\n\t\t\tcontainer = next;\n\n\t\t}\n\n\t}\n\n}\n\n// Root Container\n\nfunction WebGLUniforms( gl, program ) {\n\n\tthis.seq = [];\n\tthis.map = {};\n\n\tconst n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS );\n\n\tfor ( let i = 0; i < n; ++ i ) {\n\n\t\tconst info = gl.getActiveUniform( program, i ),\n\t\t\taddr = gl.getUniformLocation( program, info.name );\n\n\t\tparseUniform( info, addr, this );\n\n\t}\n\n}\n\nWebGLUniforms.prototype.setValue = function ( gl, name, value, textures ) {\n\n\tconst u = this.map[ name ];\n\n\tif ( u !== undefined ) u.setValue( gl, value, textures );\n\n};\n\nWebGLUniforms.prototype.setOptional = function ( gl, object, name ) {\n\n\tconst v = object[ name ];\n\n\tif ( v !== undefined ) this.setValue( gl, name, v );\n\n};\n\n\n// Static interface\n\nWebGLUniforms.upload = function ( gl, seq, values, textures ) {\n\n\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\tconst u = seq[ i ],\n\t\t\tv = values[ u.id ];\n\n\t\tif ( v.needsUpdate !== false ) {\n\n\t\t\t// note: always updating when .needsUpdate is undefined\n\t\t\tu.setValue( gl, v.value, textures );\n\n\t\t}\n\n\t}\n\n};\n\nWebGLUniforms.seqWithValue = function ( seq, values ) {\n\n\tconst r = [];\n\n\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\tconst u = seq[ i ];\n\t\tif ( u.id in values ) r.push( u );\n\n\t}\n\n\treturn r;\n\n};\n\nexport { WebGLUniforms };\n","function WebGLShader( gl, type, string ) {\n\n\tconst shader = gl.createShader( type );\n\n\tgl.shaderSource( shader, string );\n\tgl.compileShader( shader );\n\n\treturn shader;\n\n}\n\nexport { WebGLShader };\n","import { WebGLUniforms } from './WebGLUniforms.js';\nimport { WebGLShader } from './WebGLShader.js';\nimport { ShaderChunk } from '../shaders/ShaderChunk.js';\nimport { NoToneMapping, AddOperation, MixOperation, MultiplyOperation, CubeRefractionMapping, CubeUVRefractionMapping, CubeUVReflectionMapping, CubeReflectionMapping, PCFSoftShadowMap, PCFShadowMap, VSMShadowMap, ACESFilmicToneMapping, CineonToneMapping, CustomToneMapping, ReinhardToneMapping, LinearToneMapping, sRGBEncoding, LinearEncoding, GLSL3 } from '../../constants.js';\n\nlet programIdCount = 0;\n\nfunction addLineNumbers( string ) {\n\n\tconst lines = string.split( '\\n' );\n\n\tfor ( let i = 0; i < lines.length; i ++ ) {\n\n\t\tlines[ i ] = ( i + 1 ) + ': ' + lines[ i ];\n\n\t}\n\n\treturn lines.join( '\\n' );\n\n}\n\nfunction getEncodingComponents( encoding ) {\n\n\tswitch ( encoding ) {\n\n\t\tcase LinearEncoding:\n\t\t\treturn [ 'Linear', '( value )' ];\n\t\tcase sRGBEncoding:\n\t\t\treturn [ 'sRGB', '( value )' ];\n\t\tdefault:\n\t\t\tconsole.warn( 'THREE.WebGLProgram: Unsupported encoding:', encoding );\n\t\t\treturn [ 'Linear', '( value )' ];\n\n\t}\n\n}\n\nfunction getShaderErrors( gl, shader, type ) {\n\n\tconst status = gl.getShaderParameter( shader, gl.COMPILE_STATUS );\n\tconst errors = gl.getShaderInfoLog( shader ).trim();\n\n\tif ( status && errors === '' ) return '';\n\n\t// --enable-privileged-webgl-extension\n\t// console.log( '**' + type + '**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) );\n\n\treturn type.toUpperCase() + '\\n\\n' + errors + '\\n\\n' + addLineNumbers( gl.getShaderSource( shader ) );\n\n}\n\nfunction getTexelEncodingFunction( functionName, encoding ) {\n\n\tconst components = getEncodingComponents( encoding );\n\treturn 'vec4 ' + functionName + '( vec4 value ) { return LinearTo' + components[ 0 ] + components[ 1 ] + '; }';\n\n}\n\nfunction getToneMappingFunction( functionName, toneMapping ) {\n\n\tlet toneMappingName;\n\n\tswitch ( toneMapping ) {\n\n\t\tcase LinearToneMapping:\n\t\t\ttoneMappingName = 'Linear';\n\t\t\tbreak;\n\n\t\tcase ReinhardToneMapping:\n\t\t\ttoneMappingName = 'Reinhard';\n\t\t\tbreak;\n\n\t\tcase CineonToneMapping:\n\t\t\ttoneMappingName = 'OptimizedCineon';\n\t\t\tbreak;\n\n\t\tcase ACESFilmicToneMapping:\n\t\t\ttoneMappingName = 'ACESFilmic';\n\t\t\tbreak;\n\n\t\tcase CustomToneMapping:\n\t\t\ttoneMappingName = 'Custom';\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tconsole.warn( 'THREE.WebGLProgram: Unsupported toneMapping:', toneMapping );\n\t\t\ttoneMappingName = 'Linear';\n\n\t}\n\n\treturn 'vec3 ' + functionName + '( vec3 color ) { return ' + toneMappingName + 'ToneMapping( color ); }';\n\n}\n\nfunction generateExtensions( parameters ) {\n\n\tconst chunks = [\n\t\t( parameters.extensionDerivatives || parameters.envMapCubeUV || parameters.bumpMap || parameters.tangentSpaceNormalMap || parameters.clearcoatNormalMap || parameters.flatShading || parameters.shaderID === 'physical' ) ? '#extension GL_OES_standard_derivatives : enable' : '',\n\t\t( parameters.extensionFragDepth || parameters.logarithmicDepthBuffer ) && parameters.rendererExtensionFragDepth ? '#extension GL_EXT_frag_depth : enable' : '',\n\t\t( parameters.extensionDrawBuffers && parameters.rendererExtensionDrawBuffers ) ? '#extension GL_EXT_draw_buffers : require' : '',\n\t\t( parameters.extensionShaderTextureLOD || parameters.envMap || parameters.transmission ) && parameters.rendererExtensionShaderTextureLod ? '#extension GL_EXT_shader_texture_lod : enable' : ''\n\t];\n\n\treturn chunks.filter( filterEmptyLine ).join( '\\n' );\n\n}\n\nfunction generateDefines( defines ) {\n\n\tconst chunks = [];\n\n\tfor ( const name in defines ) {\n\n\t\tconst value = defines[ name ];\n\n\t\tif ( value === false ) continue;\n\n\t\tchunks.push( '#define ' + name + ' ' + value );\n\n\t}\n\n\treturn chunks.join( '\\n' );\n\n}\n\nfunction fetchAttributeLocations( gl, program ) {\n\n\tconst attributes = {};\n\n\tconst n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES );\n\n\tfor ( let i = 0; i < n; i ++ ) {\n\n\t\tconst info = gl.getActiveAttrib( program, i );\n\t\tconst name = info.name;\n\n\t\tlet locationSize = 1;\n\t\tif ( info.type === gl.FLOAT_MAT2 ) locationSize = 2;\n\t\tif ( info.type === gl.FLOAT_MAT3 ) locationSize = 3;\n\t\tif ( info.type === gl.FLOAT_MAT4 ) locationSize = 4;\n\n\t\t// console.log( 'THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:', name, i );\n\n\t\tattributes[ name ] = {\n\t\t\ttype: info.type,\n\t\t\tlocation: gl.getAttribLocation( program, name ),\n\t\t\tlocationSize: locationSize\n\t\t};\n\n\t}\n\n\treturn attributes;\n\n}\n\nfunction filterEmptyLine( string ) {\n\n\treturn string !== '';\n\n}\n\nfunction replaceLightNums( string, parameters ) {\n\n\treturn string\n\t\t.replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights )\n\t\t.replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights )\n\t\t.replace( /NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights )\n\t\t.replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights )\n\t\t.replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights )\n\t\t.replace( /NUM_DIR_LIGHT_SHADOWS/g, parameters.numDirLightShadows )\n\t\t.replace( /NUM_SPOT_LIGHT_SHADOWS/g, parameters.numSpotLightShadows )\n\t\t.replace( /NUM_POINT_LIGHT_SHADOWS/g, parameters.numPointLightShadows );\n\n}\n\nfunction replaceClippingPlaneNums( string, parameters ) {\n\n\treturn string\n\t\t.replace( /NUM_CLIPPING_PLANES/g, parameters.numClippingPlanes )\n\t\t.replace( /UNION_CLIPPING_PLANES/g, ( parameters.numClippingPlanes - parameters.numClipIntersection ) );\n\n}\n\n// Resolve Includes\n\nconst includePattern = /^[ \\t]*#include +<([\\w\\d./]+)>/gm;\n\nfunction resolveIncludes( string ) {\n\n\treturn string.replace( includePattern, includeReplacer );\n\n}\n\nfunction includeReplacer( match, include ) {\n\n\tconst string = ShaderChunk[ include ];\n\n\tif ( string === undefined ) {\n\n\t\tthrow new Error( 'Can not resolve #include <' + include + '>' );\n\n\t}\n\n\treturn resolveIncludes( string );\n\n}\n\n// Unroll Loops\n\nconst deprecatedUnrollLoopPattern = /#pragma unroll_loop[\\s]+?for \\( int i \\= (\\d+)\\; i < (\\d+)\\; i \\+\\+ \\) \\{([\\s\\S]+?)(?=\\})\\}/g;\nconst unrollLoopPattern = /#pragma unroll_loop_start\\s+for\\s*\\(\\s*int\\s+i\\s*=\\s*(\\d+)\\s*;\\s*i\\s*<\\s*(\\d+)\\s*;\\s*i\\s*\\+\\+\\s*\\)\\s*{([\\s\\S]+?)}\\s+#pragma unroll_loop_end/g;\n\nfunction unrollLoops( string ) {\n\n\treturn string\n\t\t.replace( unrollLoopPattern, loopReplacer )\n\t\t.replace( deprecatedUnrollLoopPattern, deprecatedLoopReplacer );\n\n}\n\nfunction deprecatedLoopReplacer( match, start, end, snippet ) {\n\n\tconsole.warn( 'WebGLProgram: #pragma unroll_loop shader syntax is deprecated. Please use #pragma unroll_loop_start syntax instead.' );\n\treturn loopReplacer( match, start, end, snippet );\n\n}\n\nfunction loopReplacer( match, start, end, snippet ) {\n\n\tlet string = '';\n\n\tfor ( let i = parseInt( start ); i < parseInt( end ); i ++ ) {\n\n\t\tstring += snippet\n\t\t\t.replace( /\\[\\s*i\\s*\\]/g, '[ ' + i + ' ]' )\n\t\t\t.replace( /UNROLLED_LOOP_INDEX/g, i );\n\n\t}\n\n\treturn string;\n\n}\n\n//\n\nfunction generatePrecision( parameters ) {\n\n\tlet precisionstring = 'precision ' + parameters.precision + ' float;\\nprecision ' + parameters.precision + ' int;';\n\n\tif ( parameters.precision === 'highp' ) {\n\n\t\tprecisionstring += '\\n#define HIGH_PRECISION';\n\n\t} else if ( parameters.precision === 'mediump' ) {\n\n\t\tprecisionstring += '\\n#define MEDIUM_PRECISION';\n\n\t} else if ( parameters.precision === 'lowp' ) {\n\n\t\tprecisionstring += '\\n#define LOW_PRECISION';\n\n\t}\n\n\treturn precisionstring;\n\n}\n\nfunction generateShadowMapTypeDefine( parameters ) {\n\n\tlet shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC';\n\n\tif ( parameters.shadowMapType === PCFShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF';\n\n\t} else if ( parameters.shadowMapType === PCFSoftShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT';\n\n\t} else if ( parameters.shadowMapType === VSMShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_VSM';\n\n\t}\n\n\treturn shadowMapTypeDefine;\n\n}\n\nfunction generateEnvMapTypeDefine( parameters ) {\n\n\tlet envMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.envMapMode ) {\n\n\t\t\tcase CubeReflectionMapping:\n\t\t\tcase CubeRefractionMapping:\n\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\t\t\t\tbreak;\n\n\t\t\tcase CubeUVReflectionMapping:\n\t\t\tcase CubeUVRefractionMapping:\n\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapTypeDefine;\n\n}\n\nfunction generateEnvMapModeDefine( parameters ) {\n\n\tlet envMapModeDefine = 'ENVMAP_MODE_REFLECTION';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.envMapMode ) {\n\n\t\t\tcase CubeRefractionMapping:\n\t\t\tcase CubeUVRefractionMapping:\n\n\t\t\t\tenvMapModeDefine = 'ENVMAP_MODE_REFRACTION';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapModeDefine;\n\n}\n\nfunction generateEnvMapBlendingDefine( parameters ) {\n\n\tlet envMapBlendingDefine = 'ENVMAP_BLENDING_NONE';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.combine ) {\n\n\t\t\tcase MultiplyOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\t\t\t\tbreak;\n\n\t\t\tcase MixOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MIX';\n\t\t\t\tbreak;\n\n\t\t\tcase AddOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_ADD';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapBlendingDefine;\n\n}\n\nfunction WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {\n\n\t// TODO Send this event to Three.js DevTools\n\t// console.log( 'WebGLProgram', cacheKey );\n\n\tconst gl = renderer.getContext();\n\n\tconst defines = parameters.defines;\n\n\tlet vertexShader = parameters.vertexShader;\n\tlet fragmentShader = parameters.fragmentShader;\n\n\tconst shadowMapTypeDefine = generateShadowMapTypeDefine( parameters );\n\tconst envMapTypeDefine = generateEnvMapTypeDefine( parameters );\n\tconst envMapModeDefine = generateEnvMapModeDefine( parameters );\n\tconst envMapBlendingDefine = generateEnvMapBlendingDefine( parameters );\n\n\tconst customExtensions = parameters.isWebGL2 ? '' : generateExtensions( parameters );\n\n\tconst customDefines = generateDefines( defines );\n\n\tconst program = gl.createProgram();\n\n\tlet prefixVertex, prefixFragment;\n\tlet versionString = parameters.glslVersion ? '#version ' + parameters.glslVersion + '\\n' : '';\n\n\tif ( parameters.isRawShaderMaterial ) {\n\n\t\tprefixVertex = [\n\n\t\t\tcustomDefines\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tif ( prefixVertex.length > 0 ) {\n\n\t\t\tprefixVertex += '\\n';\n\n\t\t}\n\n\t\tprefixFragment = [\n\n\t\t\tcustomExtensions,\n\t\t\tcustomDefines\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tif ( prefixFragment.length > 0 ) {\n\n\t\t\tprefixFragment += '\\n';\n\n\t\t}\n\n\t} else {\n\n\t\tprefixVertex = [\n\n\t\t\tgeneratePrecision( parameters ),\n\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines,\n\n\t\t\tparameters.instancing ? '#define USE_INSTANCING' : '',\n\t\t\tparameters.instancingColor ? '#define USE_INSTANCING_COLOR' : '',\n\n\t\t\tparameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '',\n\n\t\t\t'#define MAX_BONES ' + parameters.maxBones,\n\t\t\t( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',\n\t\t\t( parameters.useFog && parameters.fogExp2 ) ? '#define FOG_EXP2' : '',\n\n\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\t( parameters.normalMap && parameters.objectSpaceNormalMap ) ? '#define OBJECTSPACE_NORMALMAP' : '',\n\t\t\t( parameters.normalMap && parameters.tangentSpaceNormalMap ) ? '#define TANGENTSPACE_NORMALMAP' : '',\n\n\t\t\tparameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',\n\t\t\tparameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',\n\t\t\tparameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',\n\n\t\t\tparameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '',\n\n\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\tparameters.specularIntensityMap ? '#define USE_SPECULARINTENSITYMAP' : '',\n\t\t\tparameters.specularColorMap ? '#define USE_SPECULARCOLORMAP' : '',\n\n\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\n\t\t\tparameters.transmission ? '#define USE_TRANSMISSION' : '',\n\t\t\tparameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '',\n\t\t\tparameters.thicknessMap ? '#define USE_THICKNESSMAP' : '',\n\n\t\t\tparameters.sheenColorMap ? '#define USE_SHEENCOLORMAP' : '',\n\t\t\tparameters.sheenRoughnessMap ? '#define USE_SHEENROUGHNESSMAP' : '',\n\n\t\t\tparameters.vertexTangents ? '#define USE_TANGENT' : '',\n\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\t\t\tparameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '',\n\t\t\tparameters.vertexUvs ? '#define USE_UV' : '',\n\t\t\tparameters.uvsVertexOnly ? '#define UVS_VERTEX_ONLY' : '',\n\n\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\tparameters.skinning ? '#define USE_SKINNING' : '',\n\t\t\tparameters.useVertexTexture ? '#define BONE_TEXTURE' : '',\n\n\t\t\tparameters.morphTargets ? '#define USE_MORPHTARGETS' : '',\n\t\t\tparameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '',\n\t\t\t( parameters.morphTargets && parameters.isWebGL2 ) ? '#define MORPHTARGETS_TEXTURE' : '',\n\t\t\t( parameters.morphTargets && parameters.isWebGL2 ) ? '#define MORPHTARGETS_COUNT ' + parameters.morphTargetsCount : '',\n\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\tparameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '',\n\n\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\t( parameters.logarithmicDepthBuffer && parameters.rendererExtensionFragDepth ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\t'uniform mat4 modelMatrix;',\n\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t'uniform mat3 normalMatrix;',\n\t\t\t'uniform vec3 cameraPosition;',\n\t\t\t'uniform bool isOrthographic;',\n\n\t\t\t'#ifdef USE_INSTANCING',\n\n\t\t\t'\tattribute mat4 instanceMatrix;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_INSTANCING_COLOR',\n\n\t\t\t'\tattribute vec3 instanceColor;',\n\n\t\t\t'#endif',\n\n\t\t\t'attribute vec3 position;',\n\t\t\t'attribute vec3 normal;',\n\t\t\t'attribute vec2 uv;',\n\n\t\t\t'#ifdef USE_TANGENT',\n\n\t\t\t'\tattribute vec4 tangent;',\n\n\t\t\t'#endif',\n\n\t\t\t'#if defined( USE_COLOR_ALPHA )',\n\n\t\t\t'\tattribute vec4 color;',\n\n\t\t\t'#elif defined( USE_COLOR )',\n\n\t\t\t'\tattribute vec3 color;',\n\n\t\t\t'#endif',\n\n\t\t\t'#if ( defined( USE_MORPHTARGETS ) && ! defined( MORPHTARGETS_TEXTURE ) )',\n\n\t\t\t'\tattribute vec3 morphTarget0;',\n\t\t\t'\tattribute vec3 morphTarget1;',\n\t\t\t'\tattribute vec3 morphTarget2;',\n\t\t\t'\tattribute vec3 morphTarget3;',\n\n\t\t\t'\t#ifdef USE_MORPHNORMALS',\n\n\t\t\t'\t\tattribute vec3 morphNormal0;',\n\t\t\t'\t\tattribute vec3 morphNormal1;',\n\t\t\t'\t\tattribute vec3 morphNormal2;',\n\t\t\t'\t\tattribute vec3 morphNormal3;',\n\n\t\t\t'\t#else',\n\n\t\t\t'\t\tattribute vec3 morphTarget4;',\n\t\t\t'\t\tattribute vec3 morphTarget5;',\n\t\t\t'\t\tattribute vec3 morphTarget6;',\n\t\t\t'\t\tattribute vec3 morphTarget7;',\n\n\t\t\t'\t#endif',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_SKINNING',\n\n\t\t\t'\tattribute vec4 skinIndex;',\n\t\t\t'\tattribute vec4 skinWeight;',\n\n\t\t\t'#endif',\n\n\t\t\t'\\n'\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tprefixFragment = [\n\n\t\t\tcustomExtensions,\n\n\t\t\tgeneratePrecision( parameters ),\n\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines,\n\n\t\t\t( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',\n\t\t\t( parameters.useFog && parameters.fogExp2 ) ? '#define FOG_EXP2' : '',\n\n\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\tparameters.matcap ? '#define USE_MATCAP' : '',\n\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\tparameters.envMap ? '#define ' + envMapTypeDefine : '',\n\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\tparameters.envMap ? '#define ' + envMapBlendingDefine : '',\n\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\t( parameters.normalMap && parameters.objectSpaceNormalMap ) ? '#define OBJECTSPACE_NORMALMAP' : '',\n\t\t\t( parameters.normalMap && parameters.tangentSpaceNormalMap ) ? '#define TANGENTSPACE_NORMALMAP' : '',\n\n\t\t\tparameters.clearcoat ? '#define USE_CLEARCOAT' : '',\n\t\t\tparameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',\n\t\t\tparameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',\n\t\t\tparameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',\n\n\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\tparameters.specularIntensityMap ? '#define USE_SPECULARINTENSITYMAP' : '',\n\t\t\tparameters.specularColorMap ? '#define USE_SPECULARCOLORMAP' : '',\n\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\n\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\tparameters.alphaTest ? '#define USE_ALPHATEST' : '',\n\n\t\t\tparameters.sheen ? '#define USE_SHEEN' : '',\n\t\t\tparameters.sheenColorMap ? '#define USE_SHEENCOLORMAP' : '',\n\t\t\tparameters.sheenRoughnessMap ? '#define USE_SHEENROUGHNESSMAP' : '',\n\n\t\t\tparameters.transmission ? '#define USE_TRANSMISSION' : '',\n\t\t\tparameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '',\n\t\t\tparameters.thicknessMap ? '#define USE_THICKNESSMAP' : '',\n\n\t\t\tparameters.decodeVideoTexture ? '#define DECODE_VIDEO_TEXTURE' : '',\n\n\t\t\tparameters.vertexTangents ? '#define USE_TANGENT' : '',\n\t\t\tparameters.vertexColors || parameters.instancingColor ? '#define USE_COLOR' : '',\n\t\t\tparameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '',\n\t\t\tparameters.vertexUvs ? '#define USE_UV' : '',\n\t\t\tparameters.uvsVertexOnly ? '#define UVS_VERTEX_ONLY' : '',\n\n\t\t\tparameters.gradientMap ? '#define USE_GRADIENTMAP' : '',\n\n\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\tparameters.premultipliedAlpha ? '#define PREMULTIPLIED_ALPHA' : '',\n\n\t\t\tparameters.physicallyCorrectLights ? '#define PHYSICALLY_CORRECT_LIGHTS' : '',\n\n\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\t( parameters.logarithmicDepthBuffer && parameters.rendererExtensionFragDepth ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\t( ( parameters.extensionShaderTextureLOD || parameters.envMap ) && parameters.rendererExtensionShaderTextureLod ) ? '#define TEXTURE_LOD_EXT' : '',\n\n\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t'uniform vec3 cameraPosition;',\n\t\t\t'uniform bool isOrthographic;',\n\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? '#define TONE_MAPPING' : '',\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( 'toneMapping', parameters.toneMapping ) : '',\n\n\t\t\tparameters.dithering ? '#define DITHERING' : '',\n\t\t\tparameters.transparent ? '' : '#define OPAQUE',\n\n\t\t\tShaderChunk[ 'encodings_pars_fragment' ], // this code is required here because it is used by the various encoding/decoding function defined below\n\t\t\tgetTexelEncodingFunction( 'linearToOutputTexel', parameters.outputEncoding ),\n\n\t\t\tparameters.depthPacking ? '#define DEPTH_PACKING ' + parameters.depthPacking : '',\n\n\t\t\t'\\n'\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t}\n\n\tvertexShader = resolveIncludes( vertexShader );\n\tvertexShader = replaceLightNums( vertexShader, parameters );\n\tvertexShader = replaceClippingPlaneNums( vertexShader, parameters );\n\n\tfragmentShader = resolveIncludes( fragmentShader );\n\tfragmentShader = replaceLightNums( fragmentShader, parameters );\n\tfragmentShader = replaceClippingPlaneNums( fragmentShader, parameters );\n\n\tvertexShader = unrollLoops( vertexShader );\n\tfragmentShader = unrollLoops( fragmentShader );\n\n\tif ( parameters.isWebGL2 && parameters.isRawShaderMaterial !== true ) {\n\n\t\t// GLSL 3.0 conversion for built-in materials and ShaderMaterial\n\n\t\tversionString = '#version 300 es\\n';\n\n\t\tprefixVertex = [\n\t\t\t'precision mediump sampler2DArray;',\n\t\t\t'#define attribute in',\n\t\t\t'#define varying out',\n\t\t\t'#define texture2D texture'\n\t\t].join( '\\n' ) + '\\n' + prefixVertex;\n\n\t\tprefixFragment = [\n\t\t\t'#define varying in',\n\t\t\t( parameters.glslVersion === GLSL3 ) ? '' : 'layout(location = 0) out highp vec4 pc_fragColor;',\n\t\t\t( parameters.glslVersion === GLSL3 ) ? '' : '#define gl_FragColor pc_fragColor',\n\t\t\t'#define gl_FragDepthEXT gl_FragDepth',\n\t\t\t'#define texture2D texture',\n\t\t\t'#define textureCube texture',\n\t\t\t'#define texture2DProj textureProj',\n\t\t\t'#define texture2DLodEXT textureLod',\n\t\t\t'#define texture2DProjLodEXT textureProjLod',\n\t\t\t'#define textureCubeLodEXT textureLod',\n\t\t\t'#define texture2DGradEXT textureGrad',\n\t\t\t'#define texture2DProjGradEXT textureProjGrad',\n\t\t\t'#define textureCubeGradEXT textureGrad'\n\t\t].join( '\\n' ) + '\\n' + prefixFragment;\n\n\t}\n\n\tconst vertexGlsl = versionString + prefixVertex + vertexShader;\n\tconst fragmentGlsl = versionString + prefixFragment + fragmentShader;\n\n\t// console.log( '*VERTEX*', vertexGlsl );\n\t// console.log( '*FRAGMENT*', fragmentGlsl );\n\n\tconst glVertexShader = WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl );\n\tconst glFragmentShader = WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl );\n\n\tgl.attachShader( program, glVertexShader );\n\tgl.attachShader( program, glFragmentShader );\n\n\t// Force a particular attribute to index 0.\n\n\tif ( parameters.index0AttributeName !== undefined ) {\n\n\t\tgl.bindAttribLocation( program, 0, parameters.index0AttributeName );\n\n\t} else if ( parameters.morphTargets === true ) {\n\n\t\t// programs with morphTargets displace position out of attribute 0\n\t\tgl.bindAttribLocation( program, 0, 'position' );\n\n\t}\n\n\tgl.linkProgram( program );\n\n\t// check for link errors\n\tif ( renderer.debug.checkShaderErrors ) {\n\n\t\tconst programLog = gl.getProgramInfoLog( program ).trim();\n\t\tconst vertexLog = gl.getShaderInfoLog( glVertexShader ).trim();\n\t\tconst fragmentLog = gl.getShaderInfoLog( glFragmentShader ).trim();\n\n\t\tlet runnable = true;\n\t\tlet haveDiagnostics = true;\n\n\t\tif ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) {\n\n\t\t\trunnable = false;\n\n\t\t\tconst vertexErrors = getShaderErrors( gl, glVertexShader, 'vertex' );\n\t\t\tconst fragmentErrors = getShaderErrors( gl, glFragmentShader, 'fragment' );\n\n\t\t\tconsole.error(\n\t\t\t\t'THREE.WebGLProgram: Shader Error ' + gl.getError() + ' - ' +\n\t\t\t\t'VALIDATE_STATUS ' + gl.getProgramParameter( program, gl.VALIDATE_STATUS ) + '\\n\\n' +\n\t\t\t\t'Program Info Log: ' + programLog + '\\n' +\n\t\t\t\tvertexErrors + '\\n' +\n\t\t\t\tfragmentErrors\n\t\t\t);\n\n\t\t} else if ( programLog !== '' ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLProgram: Program Info Log:', programLog );\n\n\t\t} else if ( vertexLog === '' || fragmentLog === '' ) {\n\n\t\t\thaveDiagnostics = false;\n\n\t\t}\n\n\t\tif ( haveDiagnostics ) {\n\n\t\t\tthis.diagnostics = {\n\n\t\t\t\trunnable: runnable,\n\n\t\t\t\tprogramLog: programLog,\n\n\t\t\t\tvertexShader: {\n\n\t\t\t\t\tlog: vertexLog,\n\t\t\t\t\tprefix: prefixVertex\n\n\t\t\t\t},\n\n\t\t\t\tfragmentShader: {\n\n\t\t\t\t\tlog: fragmentLog,\n\t\t\t\t\tprefix: prefixFragment\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t}\n\n\t// Clean up\n\n\t// Crashes in iOS9 and iOS10. #18402\n\t// gl.detachShader( program, glVertexShader );\n\t// gl.detachShader( program, glFragmentShader );\n\n\tgl.deleteShader( glVertexShader );\n\tgl.deleteShader( glFragmentShader );\n\n\t// set up caching for uniform locations\n\n\tlet cachedUniforms;\n\n\tthis.getUniforms = function () {\n\n\t\tif ( cachedUniforms === undefined ) {\n\n\t\t\tcachedUniforms = new WebGLUniforms( gl, program );\n\n\t\t}\n\n\t\treturn cachedUniforms;\n\n\t};\n\n\t// set up caching for attribute locations\n\n\tlet cachedAttributes;\n\n\tthis.getAttributes = function () {\n\n\t\tif ( cachedAttributes === undefined ) {\n\n\t\t\tcachedAttributes = fetchAttributeLocations( gl, program );\n\n\t\t}\n\n\t\treturn cachedAttributes;\n\n\t};\n\n\t// free resource\n\n\tthis.destroy = function () {\n\n\t\tbindingStates.releaseStatesOfProgram( this );\n\n\t\tgl.deleteProgram( program );\n\t\tthis.program = undefined;\n\n\t};\n\n\t//\n\n\tthis.name = parameters.shaderName;\n\tthis.id = programIdCount ++;\n\tthis.cacheKey = cacheKey;\n\tthis.usedTimes = 1;\n\tthis.program = program;\n\tthis.vertexShader = glVertexShader;\n\tthis.fragmentShader = glFragmentShader;\n\n\treturn this;\n\n}\n\nexport { WebGLProgram };\n","let _id = 0;\n\nclass WebGLShaderCache {\n\n\tconstructor() {\n\n\t\tthis.shaderCache = new Map();\n\t\tthis.materialCache = new Map();\n\n\t}\n\n\tupdate( material ) {\n\n\t\tconst vertexShader = material.vertexShader;\n\t\tconst fragmentShader = material.fragmentShader;\n\n\t\tconst vertexShaderStage = this._getShaderStage( vertexShader );\n\t\tconst fragmentShaderStage = this._getShaderStage( fragmentShader );\n\n\t\tconst materialShaders = this._getShaderCacheForMaterial( material );\n\n\t\tif ( materialShaders.has( vertexShaderStage ) === false ) {\n\n\t\t\tmaterialShaders.add( vertexShaderStage );\n\t\t\tvertexShaderStage.usedTimes ++;\n\n\t\t}\n\n\t\tif ( materialShaders.has( fragmentShaderStage ) === false ) {\n\n\t\t\tmaterialShaders.add( fragmentShaderStage );\n\t\t\tfragmentShaderStage.usedTimes ++;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tremove( material ) {\n\n\t\tconst materialShaders = this.materialCache.get( material );\n\n\t\tfor ( const shaderStage of materialShaders ) {\n\n\t\t\tshaderStage.usedTimes --;\n\n\t\t\tif ( shaderStage.usedTimes === 0 ) this.shaderCache.delete( shaderStage );\n\n\t\t}\n\n\t\tthis.materialCache.delete( material );\n\n\t\treturn this;\n\n\t}\n\n\tgetVertexShaderID( material ) {\n\n\t\treturn this._getShaderStage( material.vertexShader ).id;\n\n\t}\n\n\tgetFragmentShaderID( material ) {\n\n\t\treturn this._getShaderStage( material.fragmentShader ).id;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shaderCache.clear();\n\t\tthis.materialCache.clear();\n\n\t}\n\n\t_getShaderCacheForMaterial( material ) {\n\n\t\tconst cache = this.materialCache;\n\n\t\tif ( cache.has( material ) === false ) {\n\n\t\t\tcache.set( material, new Set() );\n\n\t\t}\n\n\t\treturn cache.get( material );\n\n\t}\n\n\t_getShaderStage( code ) {\n\n\t\tconst cache = this.shaderCache;\n\n\t\tif ( cache.has( code ) === false ) {\n\n\t\t\tconst stage = new WebGLShaderStage();\n\t\t\tcache.set( code, stage );\n\n\t\t}\n\n\t\treturn cache.get( code );\n\n\t}\n\n}\n\nclass WebGLShaderStage {\n\n\tconstructor() {\n\n\t\tthis.id = _id ++;\n\n\t\tthis.usedTimes = 0;\n\n\t}\n\n}\n\nexport { WebGLShaderCache };\n","import { BackSide, DoubleSide, CubeUVRefractionMapping, CubeUVReflectionMapping, ObjectSpaceNormalMap, TangentSpaceNormalMap, NoToneMapping, LinearEncoding, sRGBEncoding } from '../../constants.js';\nimport { Layers } from '../../core/Layers.js';\nimport { WebGLProgram } from './WebGLProgram.js';\nimport { WebGLShaderCache } from './WebGLShaderCache.js';\nimport { ShaderLib } from '../shaders/ShaderLib.js';\nimport { UniformsUtils } from '../shaders/UniformsUtils.js';\n\nfunction WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping ) {\n\n\tconst _programLayers = new Layers();\n\tconst _customShaders = new WebGLShaderCache();\n\tconst programs = [];\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\tconst logarithmicDepthBuffer = capabilities.logarithmicDepthBuffer;\n\tconst floatVertexTextures = capabilities.floatVertexTextures;\n\tconst maxVertexUniforms = capabilities.maxVertexUniforms;\n\tconst vertexTextures = capabilities.vertexTextures;\n\tlet precision = capabilities.precision;\n\n\tconst shaderIDs = {\n\t\tMeshDepthMaterial: 'depth',\n\t\tMeshDistanceMaterial: 'distanceRGBA',\n\t\tMeshNormalMaterial: 'normal',\n\t\tMeshBasicMaterial: 'basic',\n\t\tMeshLambertMaterial: 'lambert',\n\t\tMeshPhongMaterial: 'phong',\n\t\tMeshToonMaterial: 'toon',\n\t\tMeshStandardMaterial: 'physical',\n\t\tMeshPhysicalMaterial: 'physical',\n\t\tMeshMatcapMaterial: 'matcap',\n\t\tLineBasicMaterial: 'basic',\n\t\tLineDashedMaterial: 'dashed',\n\t\tPointsMaterial: 'points',\n\t\tShadowMaterial: 'shadow',\n\t\tSpriteMaterial: 'sprite'\n\t};\n\n\tfunction getMaxBones( object ) {\n\n\t\tconst skeleton = object.skeleton;\n\t\tconst bones = skeleton.bones;\n\n\t\tif ( floatVertexTextures ) {\n\n\t\t\treturn 1024;\n\n\t\t} else {\n\n\t\t\t// default for when object is not specified\n\t\t\t// ( for example when prebuilding shader to be used with multiple objects )\n\t\t\t//\n\t\t\t//  - leave some extra space for other uniforms\n\t\t\t//  - limit here is ANGLE's 254 max uniform vectors\n\t\t\t//    (up to 54 should be safe)\n\n\t\t\tconst nVertexUniforms = maxVertexUniforms;\n\t\t\tconst nVertexMatrices = Math.floor( ( nVertexUniforms - 20 ) / 4 );\n\n\t\t\tconst maxBones = Math.min( nVertexMatrices, bones.length );\n\n\t\t\tif ( maxBones < bones.length ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Skeleton has ' + bones.length + ' bones. This GPU supports ' + maxBones + '.' );\n\t\t\t\treturn 0;\n\n\t\t\t}\n\n\t\t\treturn maxBones;\n\n\t\t}\n\n\t}\n\n\tfunction getParameters( material, lights, shadows, scene, object ) {\n\n\t\tconst fog = scene.fog;\n\t\tconst environment = material.isMeshStandardMaterial ? scene.environment : null;\n\n\t\tconst envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment );\n\n\t\tconst shaderID = shaderIDs[ material.type ];\n\n\t\t// heuristics to create shader parameters according to lights in the scene\n\t\t// (not to blow over maxLights budget)\n\n\t\tconst maxBones = object.isSkinnedMesh ? getMaxBones( object ) : 0;\n\n\t\tif ( material.precision !== null ) {\n\n\t\t\tprecision = capabilities.getMaxPrecision( material.precision );\n\n\t\t\tif ( precision !== material.precision ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet vertexShader, fragmentShader;\n\t\tlet customVertexShaderID, customFragmentShaderID;\n\n\t\tif ( shaderID ) {\n\n\t\t\tconst shader = ShaderLib[ shaderID ];\n\n\t\t\tvertexShader = shader.vertexShader;\n\t\t\tfragmentShader = shader.fragmentShader;\n\n\t\t} else {\n\n\t\t\tvertexShader = material.vertexShader;\n\t\t\tfragmentShader = material.fragmentShader;\n\n\t\t\t_customShaders.update( material );\n\n\t\t\tcustomVertexShaderID = _customShaders.getVertexShaderID( material );\n\t\t\tcustomFragmentShaderID = _customShaders.getFragmentShaderID( material );\n\n\t\t}\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\t\tconst useAlphaTest = material.alphaTest > 0;\n\t\tconst useClearcoat = material.clearcoat > 0;\n\n\t\tconst parameters = {\n\n\t\t\tisWebGL2: isWebGL2,\n\n\t\t\tshaderID: shaderID,\n\t\t\tshaderName: material.type,\n\n\t\t\tvertexShader: vertexShader,\n\t\t\tfragmentShader: fragmentShader,\n\t\t\tdefines: material.defines,\n\n\t\t\tcustomVertexShaderID: customVertexShaderID,\n\t\t\tcustomFragmentShaderID: customFragmentShaderID,\n\n\t\t\tisRawShaderMaterial: material.isRawShaderMaterial === true,\n\t\t\tglslVersion: material.glslVersion,\n\n\t\t\tprecision: precision,\n\n\t\t\tinstancing: object.isInstancedMesh === true,\n\t\t\tinstancingColor: object.isInstancedMesh === true && object.instanceColor !== null,\n\n\t\t\tsupportsVertexTextures: vertexTextures,\n\t\t\toutputEncoding: ( currentRenderTarget === null ) ? renderer.outputEncoding : ( currentRenderTarget.isXRRenderTarget === true ? currentRenderTarget.texture.encoding : LinearEncoding ),\n\t\t\tmap: !! material.map,\n\t\t\tmatcap: !! material.matcap,\n\t\t\tenvMap: !! envMap,\n\t\t\tenvMapMode: envMap && envMap.mapping,\n\t\t\tenvMapCubeUV: ( !! envMap ) && ( ( envMap.mapping === CubeUVReflectionMapping ) || ( envMap.mapping === CubeUVRefractionMapping ) ),\n\t\t\tlightMap: !! material.lightMap,\n\t\t\taoMap: !! material.aoMap,\n\t\t\temissiveMap: !! material.emissiveMap,\n\t\t\tbumpMap: !! material.bumpMap,\n\t\t\tnormalMap: !! material.normalMap,\n\t\t\tobjectSpaceNormalMap: material.normalMapType === ObjectSpaceNormalMap,\n\t\t\ttangentSpaceNormalMap: material.normalMapType === TangentSpaceNormalMap,\n\n\t\t\tdecodeVideoTexture: !! material.map && ( material.map.isVideoTexture === true ) && ( material.map.encoding === sRGBEncoding ),\n\n\t\t\tclearcoat: useClearcoat,\n\t\t\tclearcoatMap: useClearcoat && !! material.clearcoatMap,\n\t\t\tclearcoatRoughnessMap: useClearcoat && !! material.clearcoatRoughnessMap,\n\t\t\tclearcoatNormalMap: useClearcoat && !! material.clearcoatNormalMap,\n\n\t\t\tdisplacementMap: !! material.displacementMap,\n\t\t\troughnessMap: !! material.roughnessMap,\n\t\t\tmetalnessMap: !! material.metalnessMap,\n\t\t\tspecularMap: !! material.specularMap,\n\t\t\tspecularIntensityMap: !! material.specularIntensityMap,\n\t\t\tspecularColorMap: !! material.specularColorMap,\n\n\t\t\ttransparent: material.transparent,\n\n\t\t\talphaMap: !! material.alphaMap,\n\t\t\talphaTest: useAlphaTest,\n\n\t\t\tgradientMap: !! material.gradientMap,\n\n\t\t\tsheen: material.sheen > 0,\n\t\t\tsheenColorMap: !! material.sheenColorMap,\n\t\t\tsheenRoughnessMap: !! material.sheenRoughnessMap,\n\n\t\t\ttransmission: material.transmission > 0,\n\t\t\ttransmissionMap: !! material.transmissionMap,\n\t\t\tthicknessMap: !! material.thicknessMap,\n\n\t\t\tcombine: material.combine,\n\n\t\t\tvertexTangents: ( !! material.normalMap && !! object.geometry && !! object.geometry.attributes.tangent ),\n\t\t\tvertexColors: material.vertexColors,\n\t\t\tvertexAlphas: material.vertexColors === true && !! object.geometry && !! object.geometry.attributes.color && object.geometry.attributes.color.itemSize === 4,\n\t\t\tvertexUvs: !! material.map || !! material.bumpMap || !! material.normalMap || !! material.specularMap || !! material.alphaMap || !! material.emissiveMap || !! material.roughnessMap || !! material.metalnessMap || !! material.clearcoatMap || !! material.clearcoatRoughnessMap || !! material.clearcoatNormalMap || !! material.displacementMap || !! material.transmissionMap || !! material.thicknessMap || !! material.specularIntensityMap || !! material.specularColorMap || !! material.sheenColorMap || !! material.sheenRoughnessMap,\n\t\t\tuvsVertexOnly: ! ( !! material.map || !! material.bumpMap || !! material.normalMap || !! material.specularMap || !! material.alphaMap || !! material.emissiveMap || !! material.roughnessMap || !! material.metalnessMap || !! material.clearcoatNormalMap || material.transmission > 0 || !! material.transmissionMap || !! material.thicknessMap || !! material.specularIntensityMap || !! material.specularColorMap || material.sheen > 0 || !! material.sheenColorMap || !! material.sheenRoughnessMap ) && !! material.displacementMap,\n\n\t\t\tfog: !! fog,\n\t\t\tuseFog: material.fog,\n\t\t\tfogExp2: ( fog && fog.isFogExp2 ),\n\n\t\t\tflatShading: !! material.flatShading,\n\n\t\t\tsizeAttenuation: material.sizeAttenuation,\n\t\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\n\t\t\tskinning: object.isSkinnedMesh === true && maxBones > 0,\n\t\t\tmaxBones: maxBones,\n\t\t\tuseVertexTexture: floatVertexTextures,\n\n\t\t\tmorphTargets: !! object.geometry && !! object.geometry.morphAttributes.position,\n\t\t\tmorphNormals: !! object.geometry && !! object.geometry.morphAttributes.normal,\n\t\t\tmorphTargetsCount: ( !! object.geometry && !! object.geometry.morphAttributes.position ) ? object.geometry.morphAttributes.position.length : 0,\n\n\t\t\tnumDirLights: lights.directional.length,\n\t\t\tnumPointLights: lights.point.length,\n\t\t\tnumSpotLights: lights.spot.length,\n\t\t\tnumRectAreaLights: lights.rectArea.length,\n\t\t\tnumHemiLights: lights.hemi.length,\n\n\t\t\tnumDirLightShadows: lights.directionalShadowMap.length,\n\t\t\tnumPointLightShadows: lights.pointShadowMap.length,\n\t\t\tnumSpotLightShadows: lights.spotShadowMap.length,\n\n\t\t\tnumClippingPlanes: clipping.numPlanes,\n\t\t\tnumClipIntersection: clipping.numIntersection,\n\n\t\t\tdithering: material.dithering,\n\n\t\t\tshadowMapEnabled: renderer.shadowMap.enabled && shadows.length > 0,\n\t\t\tshadowMapType: renderer.shadowMap.type,\n\n\t\t\ttoneMapping: material.toneMapped ? renderer.toneMapping : NoToneMapping,\n\t\t\tphysicallyCorrectLights: renderer.physicallyCorrectLights,\n\n\t\t\tpremultipliedAlpha: material.premultipliedAlpha,\n\n\t\t\tdoubleSided: material.side === DoubleSide,\n\t\t\tflipSided: material.side === BackSide,\n\n\t\t\tdepthPacking: ( material.depthPacking !== undefined ) ? material.depthPacking : false,\n\n\t\t\tindex0AttributeName: material.index0AttributeName,\n\n\t\t\textensionDerivatives: material.extensions && material.extensions.derivatives,\n\t\t\textensionFragDepth: material.extensions && material.extensions.fragDepth,\n\t\t\textensionDrawBuffers: material.extensions && material.extensions.drawBuffers,\n\t\t\textensionShaderTextureLOD: material.extensions && material.extensions.shaderTextureLOD,\n\n\t\t\trendererExtensionFragDepth: isWebGL2 || extensions.has( 'EXT_frag_depth' ),\n\t\t\trendererExtensionDrawBuffers: isWebGL2 || extensions.has( 'WEBGL_draw_buffers' ),\n\t\t\trendererExtensionShaderTextureLod: isWebGL2 || extensions.has( 'EXT_shader_texture_lod' ),\n\n\t\t\tcustomProgramCacheKey: material.customProgramCacheKey()\n\n\t\t};\n\n\t\treturn parameters;\n\n\t}\n\n\tfunction getProgramCacheKey( parameters ) {\n\n\t\tconst array = [];\n\n\t\tif ( parameters.shaderID ) {\n\n\t\t\tarray.push( parameters.shaderID );\n\n\t\t} else {\n\n\t\t\tarray.push( parameters.customVertexShaderID );\n\t\t\tarray.push( parameters.customFragmentShaderID );\n\n\t\t}\n\n\t\tif ( parameters.defines !== undefined ) {\n\n\t\t\tfor ( const name in parameters.defines ) {\n\n\t\t\t\tarray.push( name );\n\t\t\t\tarray.push( parameters.defines[ name ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( parameters.isRawShaderMaterial === false ) {\n\n\t\t\tgetProgramCacheKeyParameters( array, parameters );\n\t\t\tgetProgramCacheKeyBooleans( array, parameters );\n\t\t\tarray.push( renderer.outputEncoding );\n\n\t\t}\n\n\t\tarray.push( parameters.customProgramCacheKey );\n\n\t\treturn array.join();\n\n\t}\n\n\tfunction getProgramCacheKeyParameters( array, parameters ) {\n\n\t\tarray.push( parameters.precision );\n\t\tarray.push( parameters.outputEncoding );\n\t\tarray.push( parameters.envMapMode );\n\t\tarray.push( parameters.combine );\n\t\tarray.push( parameters.vertexUvs );\n\t\tarray.push( parameters.fogExp2 );\n\t\tarray.push( parameters.sizeAttenuation );\n\t\tarray.push( parameters.maxBones );\n\t\tarray.push( parameters.morphTargetsCount );\n\t\tarray.push( parameters.numDirLights );\n\t\tarray.push( parameters.numPointLights );\n\t\tarray.push( parameters.numSpotLights );\n\t\tarray.push( parameters.numHemiLights );\n\t\tarray.push( parameters.numRectAreaLights );\n\t\tarray.push( parameters.numDirLightShadows );\n\t\tarray.push( parameters.numPointLightShadows );\n\t\tarray.push( parameters.numSpotLightShadows );\n\t\tarray.push( parameters.shadowMapType );\n\t\tarray.push( parameters.toneMapping );\n\t\tarray.push( parameters.numClippingPlanes );\n\t\tarray.push( parameters.numClipIntersection );\n\n\t}\n\n\tfunction getProgramCacheKeyBooleans( array, parameters ) {\n\n\t\t_programLayers.disableAll();\n\n\t\tif ( parameters.isWebGL2 )\n\t\t\t_programLayers.enable( 0 );\n\t\tif ( parameters.supportsVertexTextures )\n\t\t\t_programLayers.enable( 1 );\n\t\tif ( parameters.instancing )\n\t\t\t_programLayers.enable( 2 );\n\t\tif ( parameters.instancingColor )\n\t\t\t_programLayers.enable( 3 );\n\t\tif ( parameters.map )\n\t\t\t_programLayers.enable( 4 );\n\t\tif ( parameters.matcap )\n\t\t\t_programLayers.enable( 5 );\n\t\tif ( parameters.envMap )\n\t\t\t_programLayers.enable( 6 );\n\t\tif ( parameters.envMapCubeUV )\n\t\t\t_programLayers.enable( 7 );\n\t\tif ( parameters.lightMap )\n\t\t\t_programLayers.enable( 8 );\n\t\tif ( parameters.aoMap )\n\t\t\t_programLayers.enable( 9 );\n\t\tif ( parameters.emissiveMap )\n\t\t\t_programLayers.enable( 10 );\n\t\tif ( parameters.bumpMap )\n\t\t\t_programLayers.enable( 11 );\n\t\tif ( parameters.normalMap )\n\t\t\t_programLayers.enable( 12 );\n\t\tif ( parameters.objectSpaceNormalMap )\n\t\t\t_programLayers.enable( 13 );\n\t\tif ( parameters.tangentSpaceNormalMap )\n\t\t\t_programLayers.enable( 14 );\n\t\tif ( parameters.clearcoat )\n\t\t\t_programLayers.enable( 15 );\n\t\tif ( parameters.clearcoatMap )\n\t\t\t_programLayers.enable( 16 );\n\t\tif ( parameters.clearcoatRoughnessMap )\n\t\t\t_programLayers.enable( 17 );\n\t\tif ( parameters.clearcoatNormalMap )\n\t\t\t_programLayers.enable( 18 );\n\t\tif ( parameters.displacementMap )\n\t\t\t_programLayers.enable( 19 );\n\t\tif ( parameters.specularMap )\n\t\t\t_programLayers.enable( 20 );\n\t\tif ( parameters.roughnessMap )\n\t\t\t_programLayers.enable( 21 );\n\t\tif ( parameters.metalnessMap )\n\t\t\t_programLayers.enable( 22 );\n\t\tif ( parameters.gradientMap )\n\t\t\t_programLayers.enable( 23 );\n\t\tif ( parameters.alphaMap )\n\t\t\t_programLayers.enable( 24 );\n\t\tif ( parameters.alphaTest )\n\t\t\t_programLayers.enable( 25 );\n\t\tif ( parameters.vertexColors )\n\t\t\t_programLayers.enable( 26 );\n\t\tif ( parameters.vertexAlphas )\n\t\t\t_programLayers.enable( 27 );\n\t\tif ( parameters.vertexUvs )\n\t\t\t_programLayers.enable( 28 );\n\t\tif ( parameters.vertexTangents )\n\t\t\t_programLayers.enable( 29 );\n\t\tif ( parameters.uvsVertexOnly )\n\t\t\t_programLayers.enable( 30 );\n\t\tif ( parameters.fog )\n\t\t\t_programLayers.enable( 31 );\n\n\t\tarray.push( _programLayers.mask );\n\t\t_programLayers.disableAll();\n\n\t\tif ( parameters.useFog )\n\t\t\t_programLayers.enable( 0 );\n\t\tif ( parameters.flatShading )\n\t\t\t_programLayers.enable( 1 );\n\t\tif ( parameters.logarithmicDepthBuffer )\n\t\t\t_programLayers.enable( 2 );\n\t\tif ( parameters.skinning )\n\t\t\t_programLayers.enable( 3 );\n\t\tif ( parameters.useVertexTexture )\n\t\t\t_programLayers.enable( 4 );\n\t\tif ( parameters.morphTargets )\n\t\t\t_programLayers.enable( 5 );\n\t\tif ( parameters.morphNormals )\n\t\t\t_programLayers.enable( 6 );\n\t\tif ( parameters.premultipliedAlpha )\n\t\t\t_programLayers.enable( 7 );\n\t\tif ( parameters.shadowMapEnabled )\n\t\t\t_programLayers.enable( 8 );\n\t\tif ( parameters.physicallyCorrectLights )\n\t\t\t_programLayers.enable( 9 );\n\t\tif ( parameters.doubleSided )\n\t\t\t_programLayers.enable( 10 );\n\t\tif ( parameters.flipSided )\n\t\t\t_programLayers.enable( 11 );\n\t\tif ( parameters.depthPacking )\n\t\t\t_programLayers.enable( 12 );\n\t\tif ( parameters.dithering )\n\t\t\t_programLayers.enable( 13 );\n\t\tif ( parameters.specularIntensityMap )\n\t\t\t_programLayers.enable( 14 );\n\t\tif ( parameters.specularColorMap )\n\t\t\t_programLayers.enable( 15 );\n\t\tif ( parameters.transmission )\n\t\t\t_programLayers.enable( 16 );\n\t\tif ( parameters.transmissionMap )\n\t\t\t_programLayers.enable( 17 );\n\t\tif ( parameters.thicknessMap )\n\t\t\t_programLayers.enable( 18 );\n\t\tif ( parameters.sheen )\n\t\t\t_programLayers.enable( 19 );\n\t\tif ( parameters.sheenColorMap )\n\t\t\t_programLayers.enable( 20 );\n\t\tif ( parameters.sheenRoughnessMap )\n\t\t\t_programLayers.enable( 21 );\n\t\tif ( parameters.decodeVideoTexture )\n\t\t\t_programLayers.enable( 22 );\n\t\tif ( parameters.transparent )\n\t\t\t_programLayers.enable( 23 );\n\n\t\tarray.push( _programLayers.mask );\n\n\t}\n\n\tfunction getUniforms( material ) {\n\n\t\tconst shaderID = shaderIDs[ material.type ];\n\t\tlet uniforms;\n\n\t\tif ( shaderID ) {\n\n\t\t\tconst shader = ShaderLib[ shaderID ];\n\t\t\tuniforms = UniformsUtils.clone( shader.uniforms );\n\n\t\t} else {\n\n\t\t\tuniforms = material.uniforms;\n\n\t\t}\n\n\t\treturn uniforms;\n\n\t}\n\n\tfunction acquireProgram( parameters, cacheKey ) {\n\n\t\tlet program;\n\n\t\t// Check if code has been already compiled\n\t\tfor ( let p = 0, pl = programs.length; p < pl; p ++ ) {\n\n\t\t\tconst preexistingProgram = programs[ p ];\n\n\t\t\tif ( preexistingProgram.cacheKey === cacheKey ) {\n\n\t\t\t\tprogram = preexistingProgram;\n\t\t\t\t++ program.usedTimes;\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( program === undefined ) {\n\n\t\t\tprogram = new WebGLProgram( renderer, cacheKey, parameters, bindingStates );\n\t\t\tprograms.push( program );\n\n\t\t}\n\n\t\treturn program;\n\n\t}\n\n\tfunction releaseProgram( program ) {\n\n\t\tif ( -- program.usedTimes === 0 ) {\n\n\t\t\t// Remove from unordered set\n\t\t\tconst i = programs.indexOf( program );\n\t\t\tprograms[ i ] = programs[ programs.length - 1 ];\n\t\t\tprograms.pop();\n\n\t\t\t// Free WebGL resources\n\t\t\tprogram.destroy();\n\n\t\t}\n\n\t}\n\n\tfunction releaseShaderCache( material ) {\n\n\t\t_customShaders.remove( material );\n\n\t}\n\n\tfunction dispose() {\n\n\t\t_customShaders.dispose();\n\n\t}\n\n\treturn {\n\t\tgetParameters: getParameters,\n\t\tgetProgramCacheKey: getProgramCacheKey,\n\t\tgetUniforms: getUniforms,\n\t\tacquireProgram: acquireProgram,\n\t\treleaseProgram: releaseProgram,\n\t\treleaseShaderCache: releaseShaderCache,\n\t\t// Exposed for resource monitoring & error feedback via renderer.info:\n\t\tprograms: programs,\n\t\tdispose: dispose\n\t};\n\n}\n\n\nexport { WebGLPrograms };\n","function WebGLProperties() {\n\n\tlet properties = new WeakMap();\n\n\tfunction get( object ) {\n\n\t\tlet map = properties.get( object );\n\n\t\tif ( map === undefined ) {\n\n\t\t\tmap = {};\n\t\t\tproperties.set( object, map );\n\n\t\t}\n\n\t\treturn map;\n\n\t}\n\n\tfunction remove( object ) {\n\n\t\tproperties.delete( object );\n\n\t}\n\n\tfunction update( object, key, value ) {\n\n\t\tproperties.get( object )[ key ] = value;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tproperties = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tremove: remove,\n\t\tupdate: update,\n\t\tdispose: dispose\n\t};\n\n}\n\n\nexport { WebGLProperties };\n","function painterSortStable( a, b ) {\n\n\tif ( a.groupOrder !== b.groupOrder ) {\n\n\t\treturn a.groupOrder - b.groupOrder;\n\n\t} else if ( a.renderOrder !== b.renderOrder ) {\n\n\t\treturn a.renderOrder - b.renderOrder;\n\n\t} else if ( a.material.id !== b.material.id ) {\n\n\t\treturn a.material.id - b.material.id;\n\n\t} else if ( a.z !== b.z ) {\n\n\t\treturn a.z - b.z;\n\n\t} else {\n\n\t\treturn a.id - b.id;\n\n\t}\n\n}\n\nfunction reversePainterSortStable( a, b ) {\n\n\tif ( a.groupOrder !== b.groupOrder ) {\n\n\t\treturn a.groupOrder - b.groupOrder;\n\n\t} else if ( a.renderOrder !== b.renderOrder ) {\n\n\t\treturn a.renderOrder - b.renderOrder;\n\n\t} else if ( a.z !== b.z ) {\n\n\t\treturn b.z - a.z;\n\n\t} else {\n\n\t\treturn a.id - b.id;\n\n\t}\n\n}\n\n\nfunction WebGLRenderList() {\n\n\tconst renderItems = [];\n\tlet renderItemsIndex = 0;\n\n\tconst opaque = [];\n\tconst transmissive = [];\n\tconst transparent = [];\n\n\tfunction init() {\n\n\t\trenderItemsIndex = 0;\n\n\t\topaque.length = 0;\n\t\ttransmissive.length = 0;\n\t\ttransparent.length = 0;\n\n\t}\n\n\tfunction getNextRenderItem( object, geometry, material, groupOrder, z, group ) {\n\n\t\tlet renderItem = renderItems[ renderItemsIndex ];\n\n\t\tif ( renderItem === undefined ) {\n\n\t\t\trenderItem = {\n\t\t\t\tid: object.id,\n\t\t\t\tobject: object,\n\t\t\t\tgeometry: geometry,\n\t\t\t\tmaterial: material,\n\t\t\t\tgroupOrder: groupOrder,\n\t\t\t\trenderOrder: object.renderOrder,\n\t\t\t\tz: z,\n\t\t\t\tgroup: group\n\t\t\t};\n\n\t\t\trenderItems[ renderItemsIndex ] = renderItem;\n\n\t\t} else {\n\n\t\t\trenderItem.id = object.id;\n\t\t\trenderItem.object = object;\n\t\t\trenderItem.geometry = geometry;\n\t\t\trenderItem.material = material;\n\t\t\trenderItem.groupOrder = groupOrder;\n\t\t\trenderItem.renderOrder = object.renderOrder;\n\t\t\trenderItem.z = z;\n\t\t\trenderItem.group = group;\n\n\t\t}\n\n\t\trenderItemsIndex ++;\n\n\t\treturn renderItem;\n\n\t}\n\n\tfunction push( object, geometry, material, groupOrder, z, group ) {\n\n\t\tconst renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group );\n\n\t\tif ( material.transmission > 0.0 ) {\n\n\t\t\ttransmissive.push( renderItem );\n\n\t\t} else if ( material.transparent === true ) {\n\n\t\t\ttransparent.push( renderItem );\n\n\t\t} else {\n\n\t\t\topaque.push( renderItem );\n\n\t\t}\n\n\t}\n\n\tfunction unshift( object, geometry, material, groupOrder, z, group ) {\n\n\t\tconst renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group );\n\n\t\tif ( material.transmission > 0.0 ) {\n\n\t\t\ttransmissive.unshift( renderItem );\n\n\t\t} else if ( material.transparent === true ) {\n\n\t\t\ttransparent.unshift( renderItem );\n\n\t\t} else {\n\n\t\t\topaque.unshift( renderItem );\n\n\t\t}\n\n\t}\n\n\tfunction sort( customOpaqueSort, customTransparentSort ) {\n\n\t\tif ( opaque.length > 1 ) opaque.sort( customOpaqueSort || painterSortStable );\n\t\tif ( transmissive.length > 1 ) transmissive.sort( customTransparentSort || reversePainterSortStable );\n\t\tif ( transparent.length > 1 ) transparent.sort( customTransparentSort || reversePainterSortStable );\n\n\t}\n\n\tfunction finish() {\n\n\t\t// Clear references from inactive renderItems in the list\n\n\t\tfor ( let i = renderItemsIndex, il = renderItems.length; i < il; i ++ ) {\n\n\t\t\tconst renderItem = renderItems[ i ];\n\n\t\t\tif ( renderItem.id === null ) break;\n\n\t\t\trenderItem.id = null;\n\t\t\trenderItem.object = null;\n\t\t\trenderItem.geometry = null;\n\t\t\trenderItem.material = null;\n\t\t\trenderItem.group = null;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\topaque: opaque,\n\t\ttransmissive: transmissive,\n\t\ttransparent: transparent,\n\n\t\tinit: init,\n\t\tpush: push,\n\t\tunshift: unshift,\n\t\tfinish: finish,\n\n\t\tsort: sort\n\t};\n\n}\n\nfunction WebGLRenderLists() {\n\n\tlet lists = new WeakMap();\n\n\tfunction get( scene, renderCallDepth ) {\n\n\t\tlet list;\n\n\t\tif ( lists.has( scene ) === false ) {\n\n\t\t\tlist = new WebGLRenderList();\n\t\t\tlists.set( scene, [ list ] );\n\n\t\t} else {\n\n\t\t\tif ( renderCallDepth >= lists.get( scene ).length ) {\n\n\t\t\t\tlist = new WebGLRenderList();\n\t\t\t\tlists.get( scene ).push( list );\n\n\t\t\t} else {\n\n\t\t\t\tlist = lists.get( scene )[ renderCallDepth ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn list;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tlists = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\n\nexport { WebGLRenderLists, WebGLRenderList };\n","import { Color } from '../../math/Color.js';\nimport { Matrix4 } from '../../math/Matrix4.js';\nimport { Vector2 } from '../../math/Vector2.js';\nimport { Vector3 } from '../../math/Vector3.js';\nimport { UniformsLib } from '../shaders/UniformsLib.js';\n\nfunction UniformsCache() {\n\n\tconst lights = {};\n\n\treturn {\n\n\t\tget: function ( light ) {\n\n\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\treturn lights[ light.id ];\n\n\t\t\t}\n\n\t\t\tlet uniforms;\n\n\t\t\tswitch ( light.type ) {\n\n\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tcolor: new Color()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'SpotLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\tconeCos: 0,\n\t\t\t\t\t\tpenumbraCos: 0,\n\t\t\t\t\t\tdecay: 0\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PointLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\tdecay: 0\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'HemisphereLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tskyColor: new Color(),\n\t\t\t\t\t\tgroundColor: new Color()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'RectAreaLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\thalfWidth: new Vector3(),\n\t\t\t\t\t\thalfHeight: new Vector3()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\treturn uniforms;\n\n\t\t}\n\n\t};\n\n}\n\nfunction ShadowUniformsCache() {\n\n\tconst lights = {};\n\n\treturn {\n\n\t\tget: function ( light ) {\n\n\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\treturn lights[ light.id ];\n\n\t\t\t}\n\n\t\t\tlet uniforms;\n\n\t\t\tswitch ( light.type ) {\n\n\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'SpotLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PointLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2(),\n\t\t\t\t\t\tshadowCameraNear: 1,\n\t\t\t\t\t\tshadowCameraFar: 1000\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\t// TODO (abelnation): set RectAreaLight shadow uniforms\n\n\t\t\t}\n\n\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\treturn uniforms;\n\n\t\t}\n\n\t};\n\n}\n\n\n\nlet nextVersion = 0;\n\nfunction shadowCastingLightsFirst( lightA, lightB ) {\n\n\treturn ( lightB.castShadow ? 1 : 0 ) - ( lightA.castShadow ? 1 : 0 );\n\n}\n\nfunction WebGLLights( extensions, capabilities ) {\n\n\tconst cache = new UniformsCache();\n\n\tconst shadowCache = ShadowUniformsCache();\n\n\tconst state = {\n\n\t\tversion: 0,\n\n\t\thash: {\n\t\t\tdirectionalLength: - 1,\n\t\t\tpointLength: - 1,\n\t\t\tspotLength: - 1,\n\t\t\trectAreaLength: - 1,\n\t\t\themiLength: - 1,\n\n\t\t\tnumDirectionalShadows: - 1,\n\t\t\tnumPointShadows: - 1,\n\t\t\tnumSpotShadows: - 1\n\t\t},\n\n\t\tambient: [ 0, 0, 0 ],\n\t\tprobe: [],\n\t\tdirectional: [],\n\t\tdirectionalShadow: [],\n\t\tdirectionalShadowMap: [],\n\t\tdirectionalShadowMatrix: [],\n\t\tspot: [],\n\t\tspotShadow: [],\n\t\tspotShadowMap: [],\n\t\tspotShadowMatrix: [],\n\t\trectArea: [],\n\t\trectAreaLTC1: null,\n\t\trectAreaLTC2: null,\n\t\tpoint: [],\n\t\tpointShadow: [],\n\t\tpointShadowMap: [],\n\t\tpointShadowMatrix: [],\n\t\themi: []\n\n\t};\n\n\tfor ( let i = 0; i < 9; i ++ ) state.probe.push( new Vector3() );\n\n\tconst vector3 = new Vector3();\n\tconst matrix4 = new Matrix4();\n\tconst matrix42 = new Matrix4();\n\n\tfunction setup( lights, physicallyCorrectLights ) {\n\n\t\tlet r = 0, g = 0, b = 0;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) state.probe[ i ].set( 0, 0, 0 );\n\n\t\tlet directionalLength = 0;\n\t\tlet pointLength = 0;\n\t\tlet spotLength = 0;\n\t\tlet rectAreaLength = 0;\n\t\tlet hemiLength = 0;\n\n\t\tlet numDirectionalShadows = 0;\n\t\tlet numPointShadows = 0;\n\t\tlet numSpotShadows = 0;\n\n\t\tlights.sort( shadowCastingLightsFirst );\n\n\t\t// artist-friendly light intensity scaling factor\n\t\tconst scaleFactor = ( physicallyCorrectLights !== true ) ? Math.PI : 1;\n\n\t\tfor ( let i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\n\t\t\tconst color = light.color;\n\t\t\tconst intensity = light.intensity;\n\t\t\tconst distance = light.distance;\n\n\t\t\tconst shadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null;\n\n\t\t\tif ( light.isAmbientLight ) {\n\n\t\t\t\tr += color.r * intensity * scaleFactor;\n\t\t\t\tg += color.g * intensity * scaleFactor;\n\t\t\t\tb += color.b * intensity * scaleFactor;\n\n\t\t\t} else if ( light.isLightProbe ) {\n\n\t\t\t\tfor ( let j = 0; j < 9; j ++ ) {\n\n\t\t\t\t\tstate.probe[ j ].addScaledVector( light.sh.coefficients[ j ], intensity );\n\n\t\t\t\t}\n\n\t\t\t} else if ( light.isDirectionalLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity * scaleFactor );\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\n\t\t\t\t\tstate.directionalShadow[ directionalLength ] = shadowUniforms;\n\t\t\t\t\tstate.directionalShadowMap[ directionalLength ] = shadowMap;\n\t\t\t\t\tstate.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix;\n\n\t\t\t\t\tnumDirectionalShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.directional[ directionalLength ] = uniforms;\n\n\t\t\t\tdirectionalLength ++;\n\n\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\n\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity * scaleFactor );\n\t\t\t\tuniforms.distance = distance;\n\n\t\t\t\tuniforms.coneCos = Math.cos( light.angle );\n\t\t\t\tuniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) );\n\t\t\t\tuniforms.decay = light.decay;\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\n\t\t\t\t\tstate.spotShadow[ spotLength ] = shadowUniforms;\n\t\t\t\t\tstate.spotShadowMap[ spotLength ] = shadowMap;\n\t\t\t\t\tstate.spotShadowMatrix[ spotLength ] = light.shadow.matrix;\n\n\t\t\t\t\tnumSpotShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.spot[ spotLength ] = uniforms;\n\n\t\t\t\tspotLength ++;\n\n\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\t// (a) intensity is the total visible light emitted\n\t\t\t\t//uniforms.color.copy( color ).multiplyScalar( intensity / ( light.width * light.height * Math.PI ) );\n\n\t\t\t\t// (b) intensity is the brightness of the light\n\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\n\t\t\t\tuniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );\n\t\t\t\tuniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );\n\n\t\t\t\tstate.rectArea[ rectAreaLength ] = uniforms;\n\n\t\t\t\trectAreaLength ++;\n\n\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity * scaleFactor );\n\t\t\t\tuniforms.distance = light.distance;\n\t\t\t\tuniforms.decay = light.decay;\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\t\t\t\t\tshadowUniforms.shadowCameraNear = shadow.camera.near;\n\t\t\t\t\tshadowUniforms.shadowCameraFar = shadow.camera.far;\n\n\t\t\t\t\tstate.pointShadow[ pointLength ] = shadowUniforms;\n\t\t\t\t\tstate.pointShadowMap[ pointLength ] = shadowMap;\n\t\t\t\t\tstate.pointShadowMatrix[ pointLength ] = light.shadow.matrix;\n\n\t\t\t\t\tnumPointShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.point[ pointLength ] = uniforms;\n\n\t\t\t\tpointLength ++;\n\n\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.skyColor.copy( light.color ).multiplyScalar( intensity * scaleFactor );\n\t\t\t\tuniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity * scaleFactor );\n\n\t\t\t\tstate.hemi[ hemiLength ] = uniforms;\n\n\t\t\t\themiLength ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( rectAreaLength > 0 ) {\n\n\t\t\tif ( capabilities.isWebGL2 ) {\n\n\t\t\t\t// WebGL 2\n\n\t\t\t\tstate.rectAreaLTC1 = UniformsLib.LTC_FLOAT_1;\n\t\t\t\tstate.rectAreaLTC2 = UniformsLib.LTC_FLOAT_2;\n\n\t\t\t} else {\n\n\t\t\t\t// WebGL 1\n\n\t\t\t\tif ( extensions.has( 'OES_texture_float_linear' ) === true ) {\n\n\t\t\t\t\tstate.rectAreaLTC1 = UniformsLib.LTC_FLOAT_1;\n\t\t\t\t\tstate.rectAreaLTC2 = UniformsLib.LTC_FLOAT_2;\n\n\t\t\t\t} else if ( extensions.has( 'OES_texture_half_float_linear' ) === true ) {\n\n\t\t\t\t\tstate.rectAreaLTC1 = UniformsLib.LTC_HALF_1;\n\t\t\t\t\tstate.rectAreaLTC2 = UniformsLib.LTC_HALF_2;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer: Unable to use RectAreaLight. Missing WebGL extensions.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.ambient[ 0 ] = r;\n\t\tstate.ambient[ 1 ] = g;\n\t\tstate.ambient[ 2 ] = b;\n\n\t\tconst hash = state.hash;\n\n\t\tif ( hash.directionalLength !== directionalLength ||\n\t\t\thash.pointLength !== pointLength ||\n\t\t\thash.spotLength !== spotLength ||\n\t\t\thash.rectAreaLength !== rectAreaLength ||\n\t\t\thash.hemiLength !== hemiLength ||\n\t\t\thash.numDirectionalShadows !== numDirectionalShadows ||\n\t\t\thash.numPointShadows !== numPointShadows ||\n\t\t\thash.numSpotShadows !== numSpotShadows ) {\n\n\t\t\tstate.directional.length = directionalLength;\n\t\t\tstate.spot.length = spotLength;\n\t\t\tstate.rectArea.length = rectAreaLength;\n\t\t\tstate.point.length = pointLength;\n\t\t\tstate.hemi.length = hemiLength;\n\n\t\t\tstate.directionalShadow.length = numDirectionalShadows;\n\t\t\tstate.directionalShadowMap.length = numDirectionalShadows;\n\t\t\tstate.pointShadow.length = numPointShadows;\n\t\t\tstate.pointShadowMap.length = numPointShadows;\n\t\t\tstate.spotShadow.length = numSpotShadows;\n\t\t\tstate.spotShadowMap.length = numSpotShadows;\n\t\t\tstate.directionalShadowMatrix.length = numDirectionalShadows;\n\t\t\tstate.pointShadowMatrix.length = numPointShadows;\n\t\t\tstate.spotShadowMatrix.length = numSpotShadows;\n\n\t\t\thash.directionalLength = directionalLength;\n\t\t\thash.pointLength = pointLength;\n\t\t\thash.spotLength = spotLength;\n\t\t\thash.rectAreaLength = rectAreaLength;\n\t\t\thash.hemiLength = hemiLength;\n\n\t\t\thash.numDirectionalShadows = numDirectionalShadows;\n\t\t\thash.numPointShadows = numPointShadows;\n\t\t\thash.numSpotShadows = numSpotShadows;\n\n\t\t\tstate.version = nextVersion ++;\n\n\t\t}\n\n\t}\n\n\tfunction setupView( lights, camera ) {\n\n\t\tlet directionalLength = 0;\n\t\tlet pointLength = 0;\n\t\tlet spotLength = 0;\n\t\tlet rectAreaLength = 0;\n\t\tlet hemiLength = 0;\n\n\t\tconst viewMatrix = camera.matrixWorldInverse;\n\n\t\tfor ( let i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\n\t\t\tif ( light.isDirectionalLight ) {\n\n\t\t\t\tconst uniforms = state.directional[ directionalLength ];\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tvector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\tuniforms.direction.sub( vector3 );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\tdirectionalLength ++;\n\n\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\tconst uniforms = state.spot[ spotLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tvector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\tuniforms.direction.sub( vector3 );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\tspotLength ++;\n\n\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\tconst uniforms = state.rectArea[ rectAreaLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t// extract local rotation of light to derive width/height half vectors\n\t\t\t\tmatrix42.identity();\n\t\t\t\tmatrix4.copy( light.matrixWorld );\n\t\t\t\tmatrix4.premultiply( viewMatrix );\n\t\t\t\tmatrix42.extractRotation( matrix4 );\n\n\t\t\t\tuniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );\n\t\t\t\tuniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );\n\n\t\t\t\tuniforms.halfWidth.applyMatrix4( matrix42 );\n\t\t\t\tuniforms.halfHeight.applyMatrix4( matrix42 );\n\n\t\t\t\trectAreaLength ++;\n\n\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\tconst uniforms = state.point[ pointLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\tpointLength ++;\n\n\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\tconst uniforms = state.hemi[ hemiLength ];\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\t\t\t\tuniforms.direction.normalize();\n\n\t\t\t\themiLength ++;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tsetup: setup,\n\t\tsetupView: setupView,\n\t\tstate: state\n\t};\n\n}\n\n\nexport { WebGLLights };\n","import { WebGLLights } from './WebGLLights.js';\n\nfunction WebGLRenderState( extensions, capabilities ) {\n\n\tconst lights = new WebGLLights( extensions, capabilities );\n\n\tconst lightsArray = [];\n\tconst shadowsArray = [];\n\n\tfunction init() {\n\n\t\tlightsArray.length = 0;\n\t\tshadowsArray.length = 0;\n\n\t}\n\n\tfunction pushLight( light ) {\n\n\t\tlightsArray.push( light );\n\n\t}\n\n\tfunction pushShadow( shadowLight ) {\n\n\t\tshadowsArray.push( shadowLight );\n\n\t}\n\n\tfunction setupLights( physicallyCorrectLights ) {\n\n\t\tlights.setup( lightsArray, physicallyCorrectLights );\n\n\t}\n\n\tfunction setupLightsView( camera ) {\n\n\t\tlights.setupView( lightsArray, camera );\n\n\t}\n\n\tconst state = {\n\t\tlightsArray: lightsArray,\n\t\tshadowsArray: shadowsArray,\n\n\t\tlights: lights\n\t};\n\n\treturn {\n\t\tinit: init,\n\t\tstate: state,\n\t\tsetupLights: setupLights,\n\t\tsetupLightsView: setupLightsView,\n\n\t\tpushLight: pushLight,\n\t\tpushShadow: pushShadow\n\t};\n\n}\n\nfunction WebGLRenderStates( extensions, capabilities ) {\n\n\tlet renderStates = new WeakMap();\n\n\tfunction get( scene, renderCallDepth = 0 ) {\n\n\t\tlet renderState;\n\n\t\tif ( renderStates.has( scene ) === false ) {\n\n\t\t\trenderState = new WebGLRenderState( extensions, capabilities );\n\t\t\trenderStates.set( scene, [ renderState ] );\n\n\t\t} else {\n\n\t\t\tif ( renderCallDepth >= renderStates.get( scene ).length ) {\n\n\t\t\t\trenderState = new WebGLRenderState( extensions, capabilities );\n\t\t\t\trenderStates.get( scene ).push( renderState );\n\n\t\t\t} else {\n\n\t\t\t\trenderState = renderStates.get( scene )[ renderCallDepth ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn renderState;\n\n\t}\n\n\tfunction dispose() {\n\n\t\trenderStates = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\n\nexport { WebGLRenderStates };\n","import { Material } from './Material.js';\nimport { BasicDepthPacking } from '../constants.js';\n\n/**\n * parameters = {\n *\n *  opacity: <float>,\n *\n *  map: new THREE.Texture( <Image> ),\n *\n *  alphaMap: new THREE.Texture( <Image> ),\n *\n *  displacementMap: new THREE.Texture( <Image> ),\n *  displacementScale: <float>,\n *  displacementBias: <float>,\n *\n *  wireframe: <boolean>,\n *  wireframeLinewidth: <float>\n * }\n */\n\nclass MeshDepthMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'MeshDepthMaterial';\n\n\t\tthis.depthPacking = BasicDepthPacking;\n\n\t\tthis.map = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.fog = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.depthPacking = source.depthPacking;\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\treturn this;\n\n\t}\n\n}\n\nMeshDepthMaterial.prototype.isMeshDepthMaterial = true;\n\nexport { MeshDepthMaterial };\n","import { Material } from './Material.js';\nimport { Vector3 } from '../math/Vector3.js';\n\n/**\n * parameters = {\n *\n *  referencePosition: <float>,\n *  nearDistance: <float>,\n *  farDistance: <float>,\n *\n *  map: new THREE.Texture( <Image> ),\n *\n *  alphaMap: new THREE.Texture( <Image> ),\n *\n *  displacementMap: new THREE.Texture( <Image> ),\n *  displacementScale: <float>,\n *  displacementBias: <float>\n *\n * }\n */\n\nclass MeshDistanceMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'MeshDistanceMaterial';\n\n\t\tthis.referencePosition = new Vector3();\n\t\tthis.nearDistance = 1;\n\t\tthis.farDistance = 1000;\n\n\t\tthis.map = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.fog = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.referencePosition.copy( source.referencePosition );\n\t\tthis.nearDistance = source.nearDistance;\n\t\tthis.farDistance = source.farDistance;\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\treturn this;\n\n\t}\n\n}\n\nMeshDistanceMaterial.prototype.isMeshDistanceMaterial = true;\n\nexport { MeshDistanceMaterial };\n","export const vertex = /* glsl */`\nvoid main() {\n\n\tgl_Position = vec4( position, 1.0 );\n\n}\n`;\n\nexport const fragment = /* glsl */`\nuniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\n\n#include <packing>\n\nvoid main() {\n\n\tconst float samples = float( VSM_SAMPLES );\n\n\tfloat mean = 0.0;\n\tfloat squared_mean = 0.0;\n\n\t// This seems totally useless but it's a crazy work around for a Adreno compiler bug\n\t// float depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy ) / resolution ) );\n\n\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\n\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\n\tfor ( float i = 0.0; i < samples; i ++ ) {\n\n\t\tfloat uvOffset = uvStart + i * uvStride;\n\n\t\t#ifdef HORIZONTAL_PASS\n\n\t\t\tvec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ) );\n\t\t\tmean += distribution.x;\n\t\t\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n\n\t\t#else\n\n\t\t\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ) );\n\t\t\tmean += depth;\n\t\t\tsquared_mean += depth * depth;\n\n\t\t#endif\n\n\t}\n\n\tmean = mean / samples;\n\tsquared_mean = squared_mean / samples;\n\n\tfloat std_dev = sqrt( squared_mean - mean * mean );\n\n\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\n\n}\n`;\n","import { FrontSide, BackSide, DoubleSide, RGBAFormat, NearestFilter, LinearFilter, PCFShadowMap, VSMShadowMap, RGBADepthPacking, NoBlending } from '../../constants.js';\nimport { WebGLRenderTarget } from '../WebGLRenderTarget.js';\nimport { MeshDepthMaterial } from '../../materials/MeshDepthMaterial.js';\nimport { MeshDistanceMaterial } from '../../materials/MeshDistanceMaterial.js';\nimport { ShaderMaterial } from '../../materials/ShaderMaterial.js';\nimport { BufferAttribute } from '../../core/BufferAttribute.js';\nimport { BufferGeometry } from '../../core/BufferGeometry.js';\nimport { Mesh } from '../../objects/Mesh.js';\nimport { Vector4 } from '../../math/Vector4.js';\nimport { Vector2 } from '../../math/Vector2.js';\nimport { Frustum } from '../../math/Frustum.js';\n\nimport * as vsm from '../shaders/ShaderLib/vsm.glsl.js';\n\nfunction WebGLShadowMap( _renderer, _objects, _capabilities ) {\n\n\tlet _frustum = new Frustum();\n\n\tconst _shadowMapSize = new Vector2(),\n\t\t_viewportSize = new Vector2(),\n\n\t\t_viewport = new Vector4(),\n\n\t\t_depthMaterial = new MeshDepthMaterial( { depthPacking: RGBADepthPacking } ),\n\t\t_distanceMaterial = new MeshDistanceMaterial(),\n\n\t\t_materialCache = {},\n\n\t\t_maxTextureSize = _capabilities.maxTextureSize;\n\n\tconst shadowSide = { 0: BackSide, 1: FrontSide, 2: DoubleSide };\n\n\tconst shadowMaterialVertical = new ShaderMaterial( {\n\t\tdefines: {\n\t\t\tVSM_SAMPLES: 8\n\t\t},\n\t\tuniforms: {\n\t\t\tshadow_pass: { value: null },\n\t\t\tresolution: { value: new Vector2() },\n\t\t\tradius: { value: 4.0 }\n\t\t},\n\n\t\tvertexShader: vsm.vertex,\n\t\tfragmentShader: vsm.fragment\n\n\t} );\n\n\tconst shadowMaterialHorizontal = shadowMaterialVertical.clone();\n\tshadowMaterialHorizontal.defines.HORIZONTAL_PASS = 1;\n\n\tconst fullScreenTri = new BufferGeometry();\n\tfullScreenTri.setAttribute(\n\t\t'position',\n\t\tnew BufferAttribute(\n\t\t\tnew Float32Array( [ - 1, - 1, 0.5, 3, - 1, 0.5, - 1, 3, 0.5 ] ),\n\t\t\t3\n\t\t)\n\t);\n\n\tconst fullScreenMesh = new Mesh( fullScreenTri, shadowMaterialVertical );\n\n\tconst scope = this;\n\n\tthis.enabled = false;\n\n\tthis.autoUpdate = true;\n\tthis.needsUpdate = false;\n\n\tthis.type = PCFShadowMap;\n\n\tthis.render = function ( lights, scene, camera ) {\n\n\t\tif ( scope.enabled === false ) return;\n\t\tif ( scope.autoUpdate === false && scope.needsUpdate === false ) return;\n\n\t\tif ( lights.length === 0 ) return;\n\n\t\tconst currentRenderTarget = _renderer.getRenderTarget();\n\t\tconst activeCubeFace = _renderer.getActiveCubeFace();\n\t\tconst activeMipmapLevel = _renderer.getActiveMipmapLevel();\n\n\t\tconst _state = _renderer.state;\n\n\t\t// Set GL state for depth map.\n\t\t_state.setBlending( NoBlending );\n\t\t_state.buffers.color.setClear( 1, 1, 1, 1 );\n\t\t_state.buffers.depth.setTest( true );\n\t\t_state.setScissorTest( false );\n\n\t\t// render depth map\n\n\t\tfor ( let i = 0, il = lights.length; i < il; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\t\t\tconst shadow = light.shadow;\n\n\t\t\tif ( shadow === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLShadowMap:', light, 'has no shadow.' );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( shadow.autoUpdate === false && shadow.needsUpdate === false ) continue;\n\n\t\t\t_shadowMapSize.copy( shadow.mapSize );\n\n\t\t\tconst shadowFrameExtents = shadow.getFrameExtents();\n\n\t\t\t_shadowMapSize.multiply( shadowFrameExtents );\n\n\t\t\t_viewportSize.copy( shadow.mapSize );\n\n\t\t\tif ( _shadowMapSize.x > _maxTextureSize || _shadowMapSize.y > _maxTextureSize ) {\n\n\t\t\t\tif ( _shadowMapSize.x > _maxTextureSize ) {\n\n\t\t\t\t\t_viewportSize.x = Math.floor( _maxTextureSize / shadowFrameExtents.x );\n\t\t\t\t\t_shadowMapSize.x = _viewportSize.x * shadowFrameExtents.x;\n\t\t\t\t\tshadow.mapSize.x = _viewportSize.x;\n\n\t\t\t\t}\n\n\t\t\t\tif ( _shadowMapSize.y > _maxTextureSize ) {\n\n\t\t\t\t\t_viewportSize.y = Math.floor( _maxTextureSize / shadowFrameExtents.y );\n\t\t\t\t\t_shadowMapSize.y = _viewportSize.y * shadowFrameExtents.y;\n\t\t\t\t\tshadow.mapSize.y = _viewportSize.y;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( shadow.map === null && ! shadow.isPointLightShadow && this.type === VSMShadowMap ) {\n\n\t\t\t\tconst pars = { minFilter: LinearFilter, magFilter: LinearFilter, format: RGBAFormat };\n\n\t\t\t\tshadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );\n\t\t\t\tshadow.map.texture.name = light.name + '.shadowMap';\n\n\t\t\t\tshadow.mapPass = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );\n\n\t\t\t\tshadow.camera.updateProjectionMatrix();\n\n\t\t\t}\n\n\t\t\tif ( shadow.map === null ) {\n\n\t\t\t\tconst pars = { minFilter: NearestFilter, magFilter: NearestFilter, format: RGBAFormat };\n\n\t\t\t\tshadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );\n\t\t\t\tshadow.map.texture.name = light.name + '.shadowMap';\n\n\t\t\t\tshadow.camera.updateProjectionMatrix();\n\n\t\t\t}\n\n\t\t\t_renderer.setRenderTarget( shadow.map );\n\t\t\t_renderer.clear();\n\n\t\t\tconst viewportCount = shadow.getViewportCount();\n\n\t\t\tfor ( let vp = 0; vp < viewportCount; vp ++ ) {\n\n\t\t\t\tconst viewport = shadow.getViewport( vp );\n\n\t\t\t\t_viewport.set(\n\t\t\t\t\t_viewportSize.x * viewport.x,\n\t\t\t\t\t_viewportSize.y * viewport.y,\n\t\t\t\t\t_viewportSize.x * viewport.z,\n\t\t\t\t\t_viewportSize.y * viewport.w\n\t\t\t\t);\n\n\t\t\t\t_state.viewport( _viewport );\n\n\t\t\t\tshadow.updateMatrices( light, vp );\n\n\t\t\t\t_frustum = shadow.getFrustum();\n\n\t\t\t\trenderObject( scene, camera, shadow.camera, light, this.type );\n\n\t\t\t}\n\n\t\t\t// do blur pass for VSM\n\n\t\t\tif ( ! shadow.isPointLightShadow && this.type === VSMShadowMap ) {\n\n\t\t\t\tVSMPass( shadow, camera );\n\n\t\t\t}\n\n\t\t\tshadow.needsUpdate = false;\n\n\t\t}\n\n\t\tscope.needsUpdate = false;\n\n\t\t_renderer.setRenderTarget( currentRenderTarget, activeCubeFace, activeMipmapLevel );\n\n\t};\n\n\tfunction VSMPass( shadow, camera ) {\n\n\t\tconst geometry = _objects.update( fullScreenMesh );\n\n\t\tif ( shadowMaterialVertical.defines.VSM_SAMPLES !== shadow.blurSamples ) {\n\n\t\t\tshadowMaterialVertical.defines.VSM_SAMPLES = shadow.blurSamples;\n\t\t\tshadowMaterialHorizontal.defines.VSM_SAMPLES = shadow.blurSamples;\n\n\t\t\tshadowMaterialVertical.needsUpdate = true;\n\t\t\tshadowMaterialHorizontal.needsUpdate = true;\n\n\t\t}\n\n\t\t// vertical pass\n\n\t\tshadowMaterialVertical.uniforms.shadow_pass.value = shadow.map.texture;\n\t\tshadowMaterialVertical.uniforms.resolution.value = shadow.mapSize;\n\t\tshadowMaterialVertical.uniforms.radius.value = shadow.radius;\n\t\t_renderer.setRenderTarget( shadow.mapPass );\n\t\t_renderer.clear();\n\t\t_renderer.renderBufferDirect( camera, null, geometry, shadowMaterialVertical, fullScreenMesh, null );\n\n\t\t// horizontal pass\n\n\t\tshadowMaterialHorizontal.uniforms.shadow_pass.value = shadow.mapPass.texture;\n\t\tshadowMaterialHorizontal.uniforms.resolution.value = shadow.mapSize;\n\t\tshadowMaterialHorizontal.uniforms.radius.value = shadow.radius;\n\t\t_renderer.setRenderTarget( shadow.map );\n\t\t_renderer.clear();\n\t\t_renderer.renderBufferDirect( camera, null, geometry, shadowMaterialHorizontal, fullScreenMesh, null );\n\n\t}\n\n\tfunction getDepthMaterial( object, geometry, material, light, shadowCameraNear, shadowCameraFar, type ) {\n\n\t\tlet result = null;\n\n\t\tconst customMaterial = ( light.isPointLight === true ) ? object.customDistanceMaterial : object.customDepthMaterial;\n\n\t\tif ( customMaterial !== undefined ) {\n\n\t\t\tresult = customMaterial;\n\n\t\t} else {\n\n\t\t\tresult = ( light.isPointLight === true ) ? _distanceMaterial : _depthMaterial;\n\n\t\t}\n\n\t\tif ( ( _renderer.localClippingEnabled && material.clipShadows === true && material.clippingPlanes.length !== 0 ) ||\n\t\t\t( material.displacementMap && material.displacementScale !== 0 ) ||\n\t\t\t( material.alphaMap && material.alphaTest > 0 ) ) {\n\n\t\t\t// in this case we need a unique material instance reflecting the\n\t\t\t// appropriate state\n\n\t\t\tconst keyA = result.uuid, keyB = material.uuid;\n\n\t\t\tlet materialsForVariant = _materialCache[ keyA ];\n\n\t\t\tif ( materialsForVariant === undefined ) {\n\n\t\t\t\tmaterialsForVariant = {};\n\t\t\t\t_materialCache[ keyA ] = materialsForVariant;\n\n\t\t\t}\n\n\t\t\tlet cachedMaterial = materialsForVariant[ keyB ];\n\n\t\t\tif ( cachedMaterial === undefined ) {\n\n\t\t\t\tcachedMaterial = result.clone();\n\t\t\t\tmaterialsForVariant[ keyB ] = cachedMaterial;\n\n\t\t\t}\n\n\t\t\tresult = cachedMaterial;\n\n\t\t}\n\n\t\tresult.visible = material.visible;\n\t\tresult.wireframe = material.wireframe;\n\n\t\tif ( type === VSMShadowMap ) {\n\n\t\t\tresult.side = ( material.shadowSide !== null ) ? material.shadowSide : material.side;\n\n\t\t} else {\n\n\t\t\tresult.side = ( material.shadowSide !== null ) ? material.shadowSide : shadowSide[ material.side ];\n\n\t\t}\n\n\t\tresult.alphaMap = material.alphaMap;\n\t\tresult.alphaTest = material.alphaTest;\n\n\t\tresult.clipShadows = material.clipShadows;\n\t\tresult.clippingPlanes = material.clippingPlanes;\n\t\tresult.clipIntersection = material.clipIntersection;\n\n\t\tresult.displacementMap = material.displacementMap;\n\t\tresult.displacementScale = material.displacementScale;\n\t\tresult.displacementBias = material.displacementBias;\n\n\t\tresult.wireframeLinewidth = material.wireframeLinewidth;\n\t\tresult.linewidth = material.linewidth;\n\n\t\tif ( light.isPointLight === true && result.isMeshDistanceMaterial === true ) {\n\n\t\t\tresult.referencePosition.setFromMatrixPosition( light.matrixWorld );\n\t\t\tresult.nearDistance = shadowCameraNear;\n\t\t\tresult.farDistance = shadowCameraFar;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tfunction renderObject( object, camera, shadowCamera, light, type ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tconst visible = object.layers.test( camera.layers );\n\n\t\tif ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) {\n\n\t\t\tif ( ( object.castShadow || ( object.receiveShadow && type === VSMShadowMap ) ) && ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) ) {\n\n\t\t\t\tobject.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld );\n\n\t\t\t\tconst geometry = _objects.update( object );\n\t\t\t\tconst material = object.material;\n\n\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\tconst groups = geometry.groups;\n\n\t\t\t\t\tfor ( let k = 0, kl = groups.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\tconst group = groups[ k ];\n\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\tif ( groupMaterial && groupMaterial.visible ) {\n\n\t\t\t\t\t\t\tconst depthMaterial = getDepthMaterial( object, geometry, groupMaterial, light, shadowCamera.near, shadowCamera.far, type );\n\n\t\t\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( material.visible ) {\n\n\t\t\t\t\tconst depthMaterial = getDepthMaterial( object, geometry, material, light, shadowCamera.near, shadowCamera.far, type );\n\n\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\trenderObject( children[ i ], camera, shadowCamera, light, type );\n\n\t\t}\n\n\t}\n\n}\n\n\nexport { WebGLShadowMap };\n","import { NotEqualDepth, GreaterDepth, GreaterEqualDepth, EqualDepth, LessEqualDepth, LessDepth, AlwaysDepth, NeverDepth, CullFaceFront, CullFaceBack, CullFaceNone, DoubleSide, BackSide, CustomBlending, MultiplyBlending, SubtractiveBlending, AdditiveBlending, NoBlending, NormalBlending, AddEquation, SubtractEquation, ReverseSubtractEquation, MinEquation, MaxEquation, ZeroFactor, OneFactor, SrcColorFactor, SrcAlphaFactor, SrcAlphaSaturateFactor, DstColorFactor, DstAlphaFactor, OneMinusSrcColorFactor, OneMinusSrcAlphaFactor, OneMinusDstColorFactor, OneMinusDstAlphaFactor } from '../../constants.js';\nimport { Vector4 } from '../../math/Vector4.js';\n\nfunction WebGLState( gl, extensions, capabilities ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\n\tfunction ColorBuffer() {\n\n\t\tlet locked = false;\n\n\t\tconst color = new Vector4();\n\t\tlet currentColorMask = null;\n\t\tconst currentColorClear = new Vector4( 0, 0, 0, 0 );\n\n\t\treturn {\n\n\t\t\tsetMask: function ( colorMask ) {\n\n\t\t\t\tif ( currentColorMask !== colorMask && ! locked ) {\n\n\t\t\t\t\tgl.colorMask( colorMask, colorMask, colorMask, colorMask );\n\t\t\t\t\tcurrentColorMask = colorMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( r, g, b, a, premultipliedAlpha ) {\n\n\t\t\t\tif ( premultipliedAlpha === true ) {\n\n\t\t\t\t\tr *= a; g *= a; b *= a;\n\n\t\t\t\t}\n\n\t\t\t\tcolor.set( r, g, b, a );\n\n\t\t\t\tif ( currentColorClear.equals( color ) === false ) {\n\n\t\t\t\t\tgl.clearColor( r, g, b, a );\n\t\t\t\t\tcurrentColorClear.copy( color );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentColorMask = null;\n\t\t\t\tcurrentColorClear.set( - 1, 0, 0, 0 ); // set to invalid state\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tfunction DepthBuffer() {\n\n\t\tlet locked = false;\n\n\t\tlet currentDepthMask = null;\n\t\tlet currentDepthFunc = null;\n\t\tlet currentDepthClear = null;\n\n\t\treturn {\n\n\t\t\tsetTest: function ( depthTest ) {\n\n\t\t\t\tif ( depthTest ) {\n\n\t\t\t\t\tenable( gl.DEPTH_TEST );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdisable( gl.DEPTH_TEST );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetMask: function ( depthMask ) {\n\n\t\t\t\tif ( currentDepthMask !== depthMask && ! locked ) {\n\n\t\t\t\t\tgl.depthMask( depthMask );\n\t\t\t\t\tcurrentDepthMask = depthMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetFunc: function ( depthFunc ) {\n\n\t\t\t\tif ( currentDepthFunc !== depthFunc ) {\n\n\t\t\t\t\tif ( depthFunc ) {\n\n\t\t\t\t\t\tswitch ( depthFunc ) {\n\n\t\t\t\t\t\t\tcase NeverDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( gl.NEVER );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase AlwaysDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( gl.ALWAYS );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase LessDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( gl.LESS );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase LessEqualDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase EqualDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( gl.EQUAL );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase GreaterEqualDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( gl.GEQUAL );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase GreaterDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( gl.GREATER );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase NotEqualDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( gl.NOTEQUAL );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcurrentDepthFunc = depthFunc;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( depth ) {\n\n\t\t\t\tif ( currentDepthClear !== depth ) {\n\n\t\t\t\t\tgl.clearDepth( depth );\n\t\t\t\t\tcurrentDepthClear = depth;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentDepthMask = null;\n\t\t\t\tcurrentDepthFunc = null;\n\t\t\t\tcurrentDepthClear = null;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tfunction StencilBuffer() {\n\n\t\tlet locked = false;\n\n\t\tlet currentStencilMask = null;\n\t\tlet currentStencilFunc = null;\n\t\tlet currentStencilRef = null;\n\t\tlet currentStencilFuncMask = null;\n\t\tlet currentStencilFail = null;\n\t\tlet currentStencilZFail = null;\n\t\tlet currentStencilZPass = null;\n\t\tlet currentStencilClear = null;\n\n\t\treturn {\n\n\t\t\tsetTest: function ( stencilTest ) {\n\n\t\t\t\tif ( ! locked ) {\n\n\t\t\t\t\tif ( stencilTest ) {\n\n\t\t\t\t\t\tenable( gl.STENCIL_TEST );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdisable( gl.STENCIL_TEST );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetMask: function ( stencilMask ) {\n\n\t\t\t\tif ( currentStencilMask !== stencilMask && ! locked ) {\n\n\t\t\t\t\tgl.stencilMask( stencilMask );\n\t\t\t\t\tcurrentStencilMask = stencilMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetFunc: function ( stencilFunc, stencilRef, stencilMask ) {\n\n\t\t\t\tif ( currentStencilFunc !== stencilFunc ||\n\t\t\t\t     currentStencilRef !== stencilRef ||\n\t\t\t\t     currentStencilFuncMask !== stencilMask ) {\n\n\t\t\t\t\tgl.stencilFunc( stencilFunc, stencilRef, stencilMask );\n\n\t\t\t\t\tcurrentStencilFunc = stencilFunc;\n\t\t\t\t\tcurrentStencilRef = stencilRef;\n\t\t\t\t\tcurrentStencilFuncMask = stencilMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetOp: function ( stencilFail, stencilZFail, stencilZPass ) {\n\n\t\t\t\tif ( currentStencilFail !== stencilFail ||\n\t\t\t\t     currentStencilZFail !== stencilZFail ||\n\t\t\t\t     currentStencilZPass !== stencilZPass ) {\n\n\t\t\t\t\tgl.stencilOp( stencilFail, stencilZFail, stencilZPass );\n\n\t\t\t\t\tcurrentStencilFail = stencilFail;\n\t\t\t\t\tcurrentStencilZFail = stencilZFail;\n\t\t\t\t\tcurrentStencilZPass = stencilZPass;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( stencil ) {\n\n\t\t\t\tif ( currentStencilClear !== stencil ) {\n\n\t\t\t\t\tgl.clearStencil( stencil );\n\t\t\t\t\tcurrentStencilClear = stencil;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentStencilMask = null;\n\t\t\t\tcurrentStencilFunc = null;\n\t\t\t\tcurrentStencilRef = null;\n\t\t\t\tcurrentStencilFuncMask = null;\n\t\t\t\tcurrentStencilFail = null;\n\t\t\t\tcurrentStencilZFail = null;\n\t\t\t\tcurrentStencilZPass = null;\n\t\t\t\tcurrentStencilClear = null;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t//\n\n\tconst colorBuffer = new ColorBuffer();\n\tconst depthBuffer = new DepthBuffer();\n\tconst stencilBuffer = new StencilBuffer();\n\n\tlet enabledCapabilities = {};\n\n\tlet currentBoundFramebuffers = {};\n\tlet currentDrawbuffers = new WeakMap();\n\tlet defaultDrawbuffers = [];\n\n\tlet currentProgram = null;\n\n\tlet currentBlendingEnabled = false;\n\tlet currentBlending = null;\n\tlet currentBlendEquation = null;\n\tlet currentBlendSrc = null;\n\tlet currentBlendDst = null;\n\tlet currentBlendEquationAlpha = null;\n\tlet currentBlendSrcAlpha = null;\n\tlet currentBlendDstAlpha = null;\n\tlet currentPremultipledAlpha = false;\n\n\tlet currentFlipSided = null;\n\tlet currentCullFace = null;\n\n\tlet currentLineWidth = null;\n\n\tlet currentPolygonOffsetFactor = null;\n\tlet currentPolygonOffsetUnits = null;\n\n\tconst maxTextures = gl.getParameter( gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS );\n\n\tlet lineWidthAvailable = false;\n\tlet version = 0;\n\tconst glVersion = gl.getParameter( gl.VERSION );\n\n\tif ( glVersion.indexOf( 'WebGL' ) !== - 1 ) {\n\n\t\tversion = parseFloat( /^WebGL (\\d)/.exec( glVersion )[ 1 ] );\n\t\tlineWidthAvailable = ( version >= 1.0 );\n\n\t} else if ( glVersion.indexOf( 'OpenGL ES' ) !== - 1 ) {\n\n\t\tversion = parseFloat( /^OpenGL ES (\\d)/.exec( glVersion )[ 1 ] );\n\t\tlineWidthAvailable = ( version >= 2.0 );\n\n\t}\n\n\tlet currentTextureSlot = null;\n\tlet currentBoundTextures = {};\n\n\tconst scissorParam = gl.getParameter( gl.SCISSOR_BOX );\n\tconst viewportParam = gl.getParameter( gl.VIEWPORT );\n\n\tconst currentScissor = new Vector4().fromArray( scissorParam );\n\tconst currentViewport = new Vector4().fromArray( viewportParam );\n\n\tfunction createTexture( type, target, count ) {\n\n\t\tconst data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4.\n\t\tconst texture = gl.createTexture();\n\n\t\tgl.bindTexture( type, texture );\n\t\tgl.texParameteri( type, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\t\tgl.texParameteri( type, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tgl.texImage2D( target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data );\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tconst emptyTextures = {};\n\temptyTextures[ gl.TEXTURE_2D ] = createTexture( gl.TEXTURE_2D, gl.TEXTURE_2D, 1 );\n\temptyTextures[ gl.TEXTURE_CUBE_MAP ] = createTexture( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6 );\n\n\t// init\n\n\tcolorBuffer.setClear( 0, 0, 0, 1 );\n\tdepthBuffer.setClear( 1 );\n\tstencilBuffer.setClear( 0 );\n\n\tenable( gl.DEPTH_TEST );\n\tdepthBuffer.setFunc( LessEqualDepth );\n\n\tsetFlipSided( false );\n\tsetCullFace( CullFaceBack );\n\tenable( gl.CULL_FACE );\n\n\tsetBlending( NoBlending );\n\n\t//\n\n\tfunction enable( id ) {\n\n\t\tif ( enabledCapabilities[ id ] !== true ) {\n\n\t\t\tgl.enable( id );\n\t\t\tenabledCapabilities[ id ] = true;\n\n\t\t}\n\n\t}\n\n\tfunction disable( id ) {\n\n\t\tif ( enabledCapabilities[ id ] !== false ) {\n\n\t\t\tgl.disable( id );\n\t\t\tenabledCapabilities[ id ] = false;\n\n\t\t}\n\n\t}\n\n\tfunction bindFramebuffer( target, framebuffer ) {\n\n\t\tif ( currentBoundFramebuffers[ target ] !== framebuffer ) {\n\n\t\t\tgl.bindFramebuffer( target, framebuffer );\n\n\t\t\tcurrentBoundFramebuffers[ target ] = framebuffer;\n\n\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\t// gl.DRAW_FRAMEBUFFER is equivalent to gl.FRAMEBUFFER\n\n\t\t\t\tif ( target === gl.DRAW_FRAMEBUFFER ) {\n\n\t\t\t\t\tcurrentBoundFramebuffers[ gl.FRAMEBUFFER ] = framebuffer;\n\n\t\t\t\t}\n\n\t\t\t\tif ( target === gl.FRAMEBUFFER ) {\n\n\t\t\t\t\tcurrentBoundFramebuffers[ gl.DRAW_FRAMEBUFFER ] = framebuffer;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tfunction drawBuffers( renderTarget, framebuffer ) {\n\n\t\tlet drawBuffers = defaultDrawbuffers;\n\n\t\tlet needsUpdate = false;\n\n\t\tif ( renderTarget ) {\n\n\t\t\tdrawBuffers = currentDrawbuffers.get( framebuffer );\n\n\t\t\tif ( drawBuffers === undefined ) {\n\n\t\t\t\tdrawBuffers = [];\n\t\t\t\tcurrentDrawbuffers.set( framebuffer, drawBuffers );\n\n\t\t\t}\n\n\t\t\tif ( renderTarget.isWebGLMultipleRenderTargets ) {\n\n\t\t\t\tconst textures = renderTarget.texture;\n\n\t\t\t\tif ( drawBuffers.length !== textures.length || drawBuffers[ 0 ] !== gl.COLOR_ATTACHMENT0 ) {\n\n\t\t\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tdrawBuffers[ i ] = gl.COLOR_ATTACHMENT0 + i;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tdrawBuffers.length = textures.length;\n\n\t\t\t\t\tneedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( drawBuffers[ 0 ] !== gl.COLOR_ATTACHMENT0 ) {\n\n\t\t\t\t\tdrawBuffers[ 0 ] = gl.COLOR_ATTACHMENT0;\n\n\t\t\t\t\tneedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( drawBuffers[ 0 ] !== gl.BACK ) {\n\n\t\t\t\tdrawBuffers[ 0 ] = gl.BACK;\n\n\t\t\t\tneedsUpdate = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( needsUpdate ) {\n\n\t\t\tif ( capabilities.isWebGL2 ) {\n\n\t\t\t\tgl.drawBuffers( drawBuffers );\n\n\t\t\t} else {\n\n\t\t\t\textensions.get( 'WEBGL_draw_buffers' ).drawBuffersWEBGL( drawBuffers );\n\n\t\t\t}\n\n\t\t}\n\n\n\t}\n\n\tfunction useProgram( program ) {\n\n\t\tif ( currentProgram !== program ) {\n\n\t\t\tgl.useProgram( program );\n\n\t\t\tcurrentProgram = program;\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tconst equationToGL = {\n\t\t[ AddEquation ]: gl.FUNC_ADD,\n\t\t[ SubtractEquation ]: gl.FUNC_SUBTRACT,\n\t\t[ ReverseSubtractEquation ]: gl.FUNC_REVERSE_SUBTRACT\n\t};\n\n\tif ( isWebGL2 ) {\n\n\t\tequationToGL[ MinEquation ] = gl.MIN;\n\t\tequationToGL[ MaxEquation ] = gl.MAX;\n\n\t} else {\n\n\t\tconst extension = extensions.get( 'EXT_blend_minmax' );\n\n\t\tif ( extension !== null ) {\n\n\t\t\tequationToGL[ MinEquation ] = extension.MIN_EXT;\n\t\t\tequationToGL[ MaxEquation ] = extension.MAX_EXT;\n\n\t\t}\n\n\t}\n\n\tconst factorToGL = {\n\t\t[ ZeroFactor ]: gl.ZERO,\n\t\t[ OneFactor ]: gl.ONE,\n\t\t[ SrcColorFactor ]: gl.SRC_COLOR,\n\t\t[ SrcAlphaFactor ]: gl.SRC_ALPHA,\n\t\t[ SrcAlphaSaturateFactor ]: gl.SRC_ALPHA_SATURATE,\n\t\t[ DstColorFactor ]: gl.DST_COLOR,\n\t\t[ DstAlphaFactor ]: gl.DST_ALPHA,\n\t\t[ OneMinusSrcColorFactor ]: gl.ONE_MINUS_SRC_COLOR,\n\t\t[ OneMinusSrcAlphaFactor ]: gl.ONE_MINUS_SRC_ALPHA,\n\t\t[ OneMinusDstColorFactor ]: gl.ONE_MINUS_DST_COLOR,\n\t\t[ OneMinusDstAlphaFactor ]: gl.ONE_MINUS_DST_ALPHA\n\t};\n\n\tfunction setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha ) {\n\n\t\tif ( blending === NoBlending ) {\n\n\t\t\tif ( currentBlendingEnabled === true ) {\n\n\t\t\t\tdisable( gl.BLEND );\n\t\t\t\tcurrentBlendingEnabled = false;\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( currentBlendingEnabled === false ) {\n\n\t\t\tenable( gl.BLEND );\n\t\t\tcurrentBlendingEnabled = true;\n\n\t\t}\n\n\t\tif ( blending !== CustomBlending ) {\n\n\t\t\tif ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) {\n\n\t\t\t\tif ( currentBlendEquation !== AddEquation || currentBlendEquationAlpha !== AddEquation ) {\n\n\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\n\t\t\t\t\tcurrentBlendEquation = AddEquation;\n\t\t\t\t\tcurrentBlendEquationAlpha = AddEquation;\n\n\t\t\t\t}\n\n\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\tswitch ( blending ) {\n\n\t\t\t\t\t\tcase NormalBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AdditiveBlending:\n\t\t\t\t\t\t\tgl.blendFunc( gl.ONE, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase SubtractiveBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ZERO, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase MultiplyBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.SRC_COLOR, gl.ZERO, gl.SRC_ALPHA );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.WebGLState: Invalid blending: ', blending );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tswitch ( blending ) {\n\n\t\t\t\t\t\tcase NormalBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AdditiveBlending:\n\t\t\t\t\t\t\tgl.blendFunc( gl.SRC_ALPHA, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase SubtractiveBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ZERO, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase MultiplyBlending:\n\t\t\t\t\t\t\tgl.blendFunc( gl.ZERO, gl.SRC_COLOR );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.WebGLState: Invalid blending: ', blending );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tcurrentBlendSrc = null;\n\t\t\t\tcurrentBlendDst = null;\n\t\t\t\tcurrentBlendSrcAlpha = null;\n\t\t\t\tcurrentBlendDstAlpha = null;\n\n\t\t\t\tcurrentBlending = blending;\n\t\t\t\tcurrentPremultipledAlpha = premultipliedAlpha;\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// custom blending\n\n\t\tblendEquationAlpha = blendEquationAlpha || blendEquation;\n\t\tblendSrcAlpha = blendSrcAlpha || blendSrc;\n\t\tblendDstAlpha = blendDstAlpha || blendDst;\n\n\t\tif ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) {\n\n\t\t\tgl.blendEquationSeparate( equationToGL[ blendEquation ], equationToGL[ blendEquationAlpha ] );\n\n\t\t\tcurrentBlendEquation = blendEquation;\n\t\t\tcurrentBlendEquationAlpha = blendEquationAlpha;\n\n\t\t}\n\n\t\tif ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) {\n\n\t\t\tgl.blendFuncSeparate( factorToGL[ blendSrc ], factorToGL[ blendDst ], factorToGL[ blendSrcAlpha ], factorToGL[ blendDstAlpha ] );\n\n\t\t\tcurrentBlendSrc = blendSrc;\n\t\t\tcurrentBlendDst = blendDst;\n\t\t\tcurrentBlendSrcAlpha = blendSrcAlpha;\n\t\t\tcurrentBlendDstAlpha = blendDstAlpha;\n\n\t\t}\n\n\t\tcurrentBlending = blending;\n\t\tcurrentPremultipledAlpha = null;\n\n\t}\n\n\tfunction setMaterial( material, frontFaceCW ) {\n\n\t\tmaterial.side === DoubleSide\n\t\t\t? disable( gl.CULL_FACE )\n\t\t\t: enable( gl.CULL_FACE );\n\n\t\tlet flipSided = ( material.side === BackSide );\n\t\tif ( frontFaceCW ) flipSided = ! flipSided;\n\n\t\tsetFlipSided( flipSided );\n\n\t\t( material.blending === NormalBlending && material.transparent === false )\n\t\t\t? setBlending( NoBlending )\n\t\t\t: setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha );\n\n\t\tdepthBuffer.setFunc( material.depthFunc );\n\t\tdepthBuffer.setTest( material.depthTest );\n\t\tdepthBuffer.setMask( material.depthWrite );\n\t\tcolorBuffer.setMask( material.colorWrite );\n\n\t\tconst stencilWrite = material.stencilWrite;\n\t\tstencilBuffer.setTest( stencilWrite );\n\t\tif ( stencilWrite ) {\n\n\t\t\tstencilBuffer.setMask( material.stencilWriteMask );\n\t\t\tstencilBuffer.setFunc( material.stencilFunc, material.stencilRef, material.stencilFuncMask );\n\t\t\tstencilBuffer.setOp( material.stencilFail, material.stencilZFail, material.stencilZPass );\n\n\t\t}\n\n\t\tsetPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );\n\n\t\tmaterial.alphaToCoverage === true\n\t\t\t? enable( gl.SAMPLE_ALPHA_TO_COVERAGE )\n\t\t\t: disable( gl.SAMPLE_ALPHA_TO_COVERAGE );\n\n\t}\n\n\t//\n\n\tfunction setFlipSided( flipSided ) {\n\n\t\tif ( currentFlipSided !== flipSided ) {\n\n\t\t\tif ( flipSided ) {\n\n\t\t\t\tgl.frontFace( gl.CW );\n\n\t\t\t} else {\n\n\t\t\t\tgl.frontFace( gl.CCW );\n\n\t\t\t}\n\n\t\t\tcurrentFlipSided = flipSided;\n\n\t\t}\n\n\t}\n\n\tfunction setCullFace( cullFace ) {\n\n\t\tif ( cullFace !== CullFaceNone ) {\n\n\t\t\tenable( gl.CULL_FACE );\n\n\t\t\tif ( cullFace !== currentCullFace ) {\n\n\t\t\t\tif ( cullFace === CullFaceBack ) {\n\n\t\t\t\t\tgl.cullFace( gl.BACK );\n\n\t\t\t\t} else if ( cullFace === CullFaceFront ) {\n\n\t\t\t\t\tgl.cullFace( gl.FRONT );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.cullFace( gl.FRONT_AND_BACK );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tdisable( gl.CULL_FACE );\n\n\t\t}\n\n\t\tcurrentCullFace = cullFace;\n\n\t}\n\n\tfunction setLineWidth( width ) {\n\n\t\tif ( width !== currentLineWidth ) {\n\n\t\t\tif ( lineWidthAvailable ) gl.lineWidth( width );\n\n\t\t\tcurrentLineWidth = width;\n\n\t\t}\n\n\t}\n\n\tfunction setPolygonOffset( polygonOffset, factor, units ) {\n\n\t\tif ( polygonOffset ) {\n\n\t\t\tenable( gl.POLYGON_OFFSET_FILL );\n\n\t\t\tif ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) {\n\n\t\t\t\tgl.polygonOffset( factor, units );\n\n\t\t\t\tcurrentPolygonOffsetFactor = factor;\n\t\t\t\tcurrentPolygonOffsetUnits = units;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tdisable( gl.POLYGON_OFFSET_FILL );\n\n\t\t}\n\n\t}\n\n\tfunction setScissorTest( scissorTest ) {\n\n\t\tif ( scissorTest ) {\n\n\t\t\tenable( gl.SCISSOR_TEST );\n\n\t\t} else {\n\n\t\t\tdisable( gl.SCISSOR_TEST );\n\n\t\t}\n\n\t}\n\n\t// texture\n\n\tfunction activeTexture( webglSlot ) {\n\n\t\tif ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1;\n\n\t\tif ( currentTextureSlot !== webglSlot ) {\n\n\t\t\tgl.activeTexture( webglSlot );\n\t\t\tcurrentTextureSlot = webglSlot;\n\n\t\t}\n\n\t}\n\n\tfunction bindTexture( webglType, webglTexture ) {\n\n\t\tif ( currentTextureSlot === null ) {\n\n\t\t\tactiveTexture();\n\n\t\t}\n\n\t\tlet boundTexture = currentBoundTextures[ currentTextureSlot ];\n\n\t\tif ( boundTexture === undefined ) {\n\n\t\t\tboundTexture = { type: undefined, texture: undefined };\n\t\t\tcurrentBoundTextures[ currentTextureSlot ] = boundTexture;\n\n\t\t}\n\n\t\tif ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) {\n\n\t\t\tgl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] );\n\n\t\t\tboundTexture.type = webglType;\n\t\t\tboundTexture.texture = webglTexture;\n\n\t\t}\n\n\t}\n\n\tfunction unbindTexture() {\n\n\t\tconst boundTexture = currentBoundTextures[ currentTextureSlot ];\n\n\t\tif ( boundTexture !== undefined && boundTexture.type !== undefined ) {\n\n\t\t\tgl.bindTexture( boundTexture.type, null );\n\n\t\t\tboundTexture.type = undefined;\n\t\t\tboundTexture.texture = undefined;\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexImage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texSubImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texSubImage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texSubImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texSubImage3D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexSubImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexSubImage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texStorage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texStorage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texStorage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texStorage3D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texImage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texImage3D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction scissor( scissor ) {\n\n\t\tif ( currentScissor.equals( scissor ) === false ) {\n\n\t\t\tgl.scissor( scissor.x, scissor.y, scissor.z, scissor.w );\n\t\t\tcurrentScissor.copy( scissor );\n\n\t\t}\n\n\t}\n\n\tfunction viewport( viewport ) {\n\n\t\tif ( currentViewport.equals( viewport ) === false ) {\n\n\t\t\tgl.viewport( viewport.x, viewport.y, viewport.z, viewport.w );\n\t\t\tcurrentViewport.copy( viewport );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction reset() {\n\n\t\t// reset state\n\n\t\tgl.disable( gl.BLEND );\n\t\tgl.disable( gl.CULL_FACE );\n\t\tgl.disable( gl.DEPTH_TEST );\n\t\tgl.disable( gl.POLYGON_OFFSET_FILL );\n\t\tgl.disable( gl.SCISSOR_TEST );\n\t\tgl.disable( gl.STENCIL_TEST );\n\t\tgl.disable( gl.SAMPLE_ALPHA_TO_COVERAGE );\n\n\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\tgl.blendFunc( gl.ONE, gl.ZERO );\n\t\tgl.blendFuncSeparate( gl.ONE, gl.ZERO, gl.ONE, gl.ZERO );\n\n\t\tgl.colorMask( true, true, true, true );\n\t\tgl.clearColor( 0, 0, 0, 0 );\n\n\t\tgl.depthMask( true );\n\t\tgl.depthFunc( gl.LESS );\n\t\tgl.clearDepth( 1 );\n\n\t\tgl.stencilMask( 0xffffffff );\n\t\tgl.stencilFunc( gl.ALWAYS, 0, 0xffffffff );\n\t\tgl.stencilOp( gl.KEEP, gl.KEEP, gl.KEEP );\n\t\tgl.clearStencil( 0 );\n\n\t\tgl.cullFace( gl.BACK );\n\t\tgl.frontFace( gl.CCW );\n\n\t\tgl.polygonOffset( 0, 0 );\n\n\t\tgl.activeTexture( gl.TEXTURE0 );\n\n\t\tgl.bindFramebuffer( gl.FRAMEBUFFER, null );\n\n\t\tif ( isWebGL2 === true ) {\n\n\t\t\tgl.bindFramebuffer( gl.DRAW_FRAMEBUFFER, null );\n\t\t\tgl.bindFramebuffer( gl.READ_FRAMEBUFFER, null );\n\n\t\t}\n\n\t\tgl.useProgram( null );\n\n\t\tgl.lineWidth( 1 );\n\n\t\tgl.scissor( 0, 0, gl.canvas.width, gl.canvas.height );\n\t\tgl.viewport( 0, 0, gl.canvas.width, gl.canvas.height );\n\n\t\t// reset internals\n\n\t\tenabledCapabilities = {};\n\n\t\tcurrentTextureSlot = null;\n\t\tcurrentBoundTextures = {};\n\n\t\tcurrentBoundFramebuffers = {};\n\t\tcurrentDrawbuffers = new WeakMap();\n\t\tdefaultDrawbuffers = [];\n\n\t\tcurrentProgram = null;\n\n\t\tcurrentBlendingEnabled = false;\n\t\tcurrentBlending = null;\n\t\tcurrentBlendEquation = null;\n\t\tcurrentBlendSrc = null;\n\t\tcurrentBlendDst = null;\n\t\tcurrentBlendEquationAlpha = null;\n\t\tcurrentBlendSrcAlpha = null;\n\t\tcurrentBlendDstAlpha = null;\n\t\tcurrentPremultipledAlpha = false;\n\n\t\tcurrentFlipSided = null;\n\t\tcurrentCullFace = null;\n\n\t\tcurrentLineWidth = null;\n\n\t\tcurrentPolygonOffsetFactor = null;\n\t\tcurrentPolygonOffsetUnits = null;\n\n\t\tcurrentScissor.set( 0, 0, gl.canvas.width, gl.canvas.height );\n\t\tcurrentViewport.set( 0, 0, gl.canvas.width, gl.canvas.height );\n\n\t\tcolorBuffer.reset();\n\t\tdepthBuffer.reset();\n\t\tstencilBuffer.reset();\n\n\t}\n\n\treturn {\n\n\t\tbuffers: {\n\t\t\tcolor: colorBuffer,\n\t\t\tdepth: depthBuffer,\n\t\t\tstencil: stencilBuffer\n\t\t},\n\n\t\tenable: enable,\n\t\tdisable: disable,\n\n\t\tbindFramebuffer: bindFramebuffer,\n\t\tdrawBuffers: drawBuffers,\n\n\t\tuseProgram: useProgram,\n\n\t\tsetBlending: setBlending,\n\t\tsetMaterial: setMaterial,\n\n\t\tsetFlipSided: setFlipSided,\n\t\tsetCullFace: setCullFace,\n\n\t\tsetLineWidth: setLineWidth,\n\t\tsetPolygonOffset: setPolygonOffset,\n\n\t\tsetScissorTest: setScissorTest,\n\n\t\tactiveTexture: activeTexture,\n\t\tbindTexture: bindTexture,\n\t\tunbindTexture: unbindTexture,\n\t\tcompressedTexImage2D: compressedTexImage2D,\n\t\ttexImage2D: texImage2D,\n\t\ttexImage3D: texImage3D,\n\n\t\ttexStorage2D: texStorage2D,\n\t\ttexStorage3D: texStorage3D,\n\t\ttexSubImage2D: texSubImage2D,\n\t\ttexSubImage3D: texSubImage3D,\n\t\tcompressedTexSubImage2D: compressedTexSubImage2D,\n\n\t\tscissor: scissor,\n\t\tviewport: viewport,\n\n\t\treset: reset\n\n\t};\n\n}\n\nexport { WebGLState };\n","import { LinearFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, NearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, RGBAFormat, DepthFormat, DepthStencilFormat, UnsignedShortType, UnsignedIntType, UnsignedInt248Type, FloatType, HalfFloatType, MirroredRepeatWrapping, ClampToEdgeWrapping, RepeatWrapping, sRGBEncoding, LinearEncoding, UnsignedByteType, _SRGBAFormat } from '../../constants.js';\nimport * as MathUtils from '../../math/MathUtils.js';\nimport { ImageUtils } from '../../extras/ImageUtils.js';\nimport { createElementNS } from '../../utils.js';\n\nfunction WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\tconst maxTextures = capabilities.maxTextures;\n\tconst maxCubemapSize = capabilities.maxCubemapSize;\n\tconst maxTextureSize = capabilities.maxTextureSize;\n\tconst maxSamples = capabilities.maxSamples;\n\tconst hasMultisampledRenderToTexture = extensions.has( 'WEBGL_multisampled_render_to_texture' );\n\tconst MultisampledRenderToTextureExtension = hasMultisampledRenderToTexture ? extensions.get( 'WEBGL_multisampled_render_to_texture' ) : undefined;\n\n\tconst _videoTextures = new WeakMap();\n\tlet _canvas;\n\n\t// cordova iOS (as of 5.0) still uses UIWebView, which provides OffscreenCanvas,\n\t// also OffscreenCanvas.getContext(\"webgl\"), but not OffscreenCanvas.getContext(\"2d\")!\n\t// Some implementations may only implement OffscreenCanvas partially (e.g. lacking 2d).\n\n\tlet useOffscreenCanvas = false;\n\n\ttry {\n\n\t\tuseOffscreenCanvas = typeof OffscreenCanvas !== 'undefined'\n\t\t\t&& ( new OffscreenCanvas( 1, 1 ).getContext( '2d' ) ) !== null;\n\n\t} catch ( err ) {\n\n\t\t// Ignore any errors\n\n\t}\n\n\tfunction createCanvas( width, height ) {\n\n\t\t// Use OffscreenCanvas when available. Specially needed in web workers\n\n\t\treturn useOffscreenCanvas ?\n\t\t\tnew OffscreenCanvas( width, height ) : createElementNS( 'canvas' );\n\n\t}\n\n\tfunction resizeImage( image, needsPowerOfTwo, needsNewCanvas, maxSize ) {\n\n\t\tlet scale = 1;\n\n\t\t// handle case if texture exceeds max size\n\n\t\tif ( image.width > maxSize || image.height > maxSize ) {\n\n\t\t\tscale = maxSize / Math.max( image.width, image.height );\n\n\t\t}\n\n\t\t// only perform resize if necessary\n\n\t\tif ( scale < 1 || needsPowerOfTwo === true ) {\n\n\t\t\t// only perform resize for certain image types\n\n\t\t\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t\t\tconst floor = needsPowerOfTwo ? MathUtils.floorPowerOfTwo : Math.floor;\n\n\t\t\t\tconst width = floor( scale * image.width );\n\t\t\t\tconst height = floor( scale * image.height );\n\n\t\t\t\tif ( _canvas === undefined ) _canvas = createCanvas( width, height );\n\n\t\t\t\t// cube textures can't reuse the same canvas\n\n\t\t\t\tconst canvas = needsNewCanvas ? createCanvas( width, height ) : _canvas;\n\n\t\t\t\tcanvas.width = width;\n\t\t\t\tcanvas.height = height;\n\n\t\t\t\tconst context = canvas.getContext( '2d' );\n\t\t\t\tcontext.drawImage( image, 0, 0, width, height );\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture has been resized from (' + image.width + 'x' + image.height + ') to (' + width + 'x' + height + ').' );\n\n\t\t\t\treturn canvas;\n\n\t\t\t} else {\n\n\t\t\t\tif ( 'data' in image ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Image in DataTexture is too big (' + image.width + 'x' + image.height + ').' );\n\n\t\t\t\t}\n\n\t\t\t\treturn image;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn image;\n\n\t}\n\n\tfunction isPowerOfTwo( image ) {\n\n\t\treturn MathUtils.isPowerOfTwo( image.width ) && MathUtils.isPowerOfTwo( image.height );\n\n\t}\n\n\tfunction textureNeedsPowerOfTwo( texture ) {\n\n\t\tif ( isWebGL2 ) return false;\n\n\t\treturn ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) ||\n\t\t\t( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter );\n\n\t}\n\n\tfunction textureNeedsGenerateMipmaps( texture, supportsMips ) {\n\n\t\treturn texture.generateMipmaps && supportsMips &&\n\t\t\ttexture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter;\n\n\t}\n\n\tfunction generateMipmap( target ) {\n\n\t\t_gl.generateMipmap( target );\n\n\t}\n\n\tfunction getInternalFormat( internalFormatName, glFormat, glType, encoding, isVideoTexture = false ) {\n\n\t\tif ( isWebGL2 === false ) return glFormat;\n\n\t\tif ( internalFormatName !== null ) {\n\n\t\t\tif ( _gl[ internalFormatName ] !== undefined ) return _gl[ internalFormatName ];\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format \\'' + internalFormatName + '\\'' );\n\n\t\t}\n\n\t\tlet internalFormat = glFormat;\n\n\t\tif ( glFormat === _gl.RED ) {\n\n\t\t\tif ( glType === _gl.FLOAT ) internalFormat = _gl.R32F;\n\t\t\tif ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.R16F;\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.R8;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RG ) {\n\n\t\t\tif ( glType === _gl.FLOAT ) internalFormat = _gl.RG32F;\n\t\t\tif ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.RG16F;\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RG8;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RGBA ) {\n\n\t\t\tif ( glType === _gl.FLOAT ) internalFormat = _gl.RGBA32F;\n\t\t\tif ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.RGBA16F;\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = ( encoding === sRGBEncoding && isVideoTexture === false ) ? _gl.SRGB8_ALPHA8 : _gl.RGBA8;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT_4_4_4_4 ) internalFormat = _gl.RGBA4;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT_5_5_5_1 ) internalFormat = _gl.RGB5_A1;\n\n\t\t}\n\n\t\tif ( internalFormat === _gl.R16F || internalFormat === _gl.R32F ||\n\t\t\tinternalFormat === _gl.RG16F || internalFormat === _gl.RG32F ||\n\t\t\tinternalFormat === _gl.RGBA16F || internalFormat === _gl.RGBA32F ) {\n\n\t\t\textensions.get( 'EXT_color_buffer_float' );\n\n\t\t}\n\n\t\treturn internalFormat;\n\n\t}\n\n\tfunction getMipLevels( texture, image, supportsMips ) {\n\n\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) === true || ( texture.isFramebufferTexture && texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) ) {\n\n\t\t\treturn Math.log2( Math.max( image.width, image.height ) ) + 1;\n\n\t\t} else if ( texture.mipmaps !== undefined && texture.mipmaps.length > 0 ) {\n\n\t\t\t// user-defined mipmaps\n\n\t\t\treturn texture.mipmaps.length;\n\n\t\t} else if ( texture.isCompressedTexture && Array.isArray( texture.image ) ) {\n\n\t\t\treturn image.mipmaps.length;\n\n\t\t} else {\n\n\t\t\t// texture without mipmaps (only base level)\n\n\t\t\treturn 1;\n\n\t\t}\n\n\t}\n\n\t// Fallback filters for non-power-of-2 textures\n\n\tfunction filterFallback( f ) {\n\n\t\tif ( f === NearestFilter || f === NearestMipmapNearestFilter || f === NearestMipmapLinearFilter ) {\n\n\t\t\treturn _gl.NEAREST;\n\n\t\t}\n\n\t\treturn _gl.LINEAR;\n\n\t}\n\n\t//\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tdeallocateTexture( texture );\n\n\t\tif ( texture.isVideoTexture ) {\n\n\t\t\t_videoTextures.delete( texture );\n\n\t\t}\n\n\t\tinfo.memory.textures --;\n\n\t}\n\n\tfunction onRenderTargetDispose( event ) {\n\n\t\tconst renderTarget = event.target;\n\n\t\trenderTarget.removeEventListener( 'dispose', onRenderTargetDispose );\n\n\t\tdeallocateRenderTarget( renderTarget );\n\n\t}\n\n\t//\n\n\tfunction deallocateTexture( texture ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( textureProperties.__webglInit === undefined ) return;\n\n\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\tproperties.remove( texture );\n\n\t}\n\n\tfunction deallocateRenderTarget( renderTarget ) {\n\n\t\tconst texture = renderTarget.texture;\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( ! renderTarget ) return;\n\n\t\tif ( textureProperties.__webglTexture !== undefined ) {\n\n\t\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\t\tinfo.memory.textures --;\n\n\t\t}\n\n\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\trenderTarget.depthTexture.dispose();\n\n\t\t}\n\n\t\tif ( renderTarget.isWebGLCubeRenderTarget ) {\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );\n\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );\n\t\t\tif ( renderTargetProperties.__webglMultisampledFramebuffer ) _gl.deleteFramebuffer( renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\tif ( renderTargetProperties.__webglColorRenderbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglColorRenderbuffer );\n\t\t\tif ( renderTargetProperties.__webglDepthRenderbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthRenderbuffer );\n\n\t\t}\n\n\t\tif ( renderTarget.isWebGLMultipleRenderTargets ) {\n\n\t\t\tfor ( let i = 0, il = texture.length; i < il; i ++ ) {\n\n\t\t\t\tconst attachmentProperties = properties.get( texture[ i ] );\n\n\t\t\t\tif ( attachmentProperties.__webglTexture ) {\n\n\t\t\t\t\t_gl.deleteTexture( attachmentProperties.__webglTexture );\n\n\t\t\t\t\tinfo.memory.textures --;\n\n\t\t\t\t}\n\n\t\t\t\tproperties.remove( texture[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tproperties.remove( texture );\n\t\tproperties.remove( renderTarget );\n\n\t}\n\n\t//\n\n\tlet textureUnits = 0;\n\n\tfunction resetTextureUnits() {\n\n\t\ttextureUnits = 0;\n\n\t}\n\n\tfunction allocateTextureUnit() {\n\n\t\tconst textureUnit = textureUnits;\n\n\t\tif ( textureUnit >= maxTextures ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLTextures: Trying to use ' + textureUnit + ' texture units while this GPU supports only ' + maxTextures );\n\n\t\t}\n\n\t\ttextureUnits += 1;\n\n\t\treturn textureUnit;\n\n\t}\n\n\t//\n\n\tfunction setTexture2D( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.isVideoTexture ) updateVideoTexture( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tconst image = texture.image;\n\n\t\t\tif ( image === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is undefined' );\n\n\t\t\t} else if ( image.complete === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete' );\n\n\t\t\t} else {\n\n\t\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\n\n\t}\n\n\tfunction setTexture2DArray( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\tstate.bindTexture( _gl.TEXTURE_2D_ARRAY, textureProperties.__webglTexture );\n\n\t}\n\n\tfunction setTexture3D( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\tstate.bindTexture( _gl.TEXTURE_3D, textureProperties.__webglTexture );\n\n\t}\n\n\tfunction setTextureCube( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadCubeTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );\n\n\t}\n\n\tconst wrappingToGL = {\n\t\t[ RepeatWrapping ]: _gl.REPEAT,\n\t\t[ ClampToEdgeWrapping ]: _gl.CLAMP_TO_EDGE,\n\t\t[ MirroredRepeatWrapping ]: _gl.MIRRORED_REPEAT\n\t};\n\n\tconst filterToGL = {\n\t\t[ NearestFilter ]: _gl.NEAREST,\n\t\t[ NearestMipmapNearestFilter ]: _gl.NEAREST_MIPMAP_NEAREST,\n\t\t[ NearestMipmapLinearFilter ]: _gl.NEAREST_MIPMAP_LINEAR,\n\n\t\t[ LinearFilter ]: _gl.LINEAR,\n\t\t[ LinearMipmapNearestFilter ]: _gl.LINEAR_MIPMAP_NEAREST,\n\t\t[ LinearMipmapLinearFilter ]: _gl.LINEAR_MIPMAP_LINEAR\n\t};\n\n\tfunction setTextureParameters( textureType, texture, supportsMips ) {\n\n\t\tif ( supportsMips ) {\n\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, wrappingToGL[ texture.wrapS ] );\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, wrappingToGL[ texture.wrapT ] );\n\n\t\t\tif ( textureType === _gl.TEXTURE_3D || textureType === _gl.TEXTURE_2D_ARRAY ) {\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_R, wrappingToGL[ texture.wrapR ] );\n\n\t\t\t}\n\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterToGL[ texture.magFilter ] );\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterToGL[ texture.minFilter ] );\n\n\t\t} else {\n\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE );\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE );\n\n\t\t\tif ( textureType === _gl.TEXTURE_3D || textureType === _gl.TEXTURE_2D_ARRAY ) {\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_R, _gl.CLAMP_TO_EDGE );\n\n\t\t\t}\n\n\t\t\tif ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.' );\n\n\t\t\t}\n\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterFallback( texture.magFilter ) );\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterFallback( texture.minFilter ) );\n\n\t\t\tif ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( extensions.has( 'EXT_texture_filter_anisotropic' ) === true ) {\n\n\t\t\tconst extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tif ( texture.type === FloatType && extensions.has( 'OES_texture_float_linear' ) === false ) return; // verify extension for WebGL 1 and WebGL 2\n\t\t\tif ( isWebGL2 === false && ( texture.type === HalfFloatType && extensions.has( 'OES_texture_half_float_linear' ) === false ) ) return; // verify extension for WebGL 1 only\n\n\t\t\tif ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) {\n\n\t\t\t\t_gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) );\n\t\t\t\tproperties.get( texture ).__currentAnisotropy = texture.anisotropy;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction initTexture( textureProperties, texture ) {\n\n\t\tif ( textureProperties.__webglInit === undefined ) {\n\n\t\t\ttextureProperties.__webglInit = true;\n\n\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\tinfo.memory.textures ++;\n\n\t\t}\n\n\t}\n\n\tfunction uploadTexture( textureProperties, texture, slot ) {\n\n\t\tlet textureType = _gl.TEXTURE_2D;\n\n\t\tif ( texture.isDataTexture2DArray ) textureType = _gl.TEXTURE_2D_ARRAY;\n\t\tif ( texture.isDataTexture3D ) textureType = _gl.TEXTURE_3D;\n\n\t\tinitTexture( textureProperties, texture );\n\n\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\tstate.bindTexture( textureType, textureProperties.__webglTexture );\n\n\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );\n\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );\n\t\t_gl.pixelStorei( _gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, _gl.NONE );\n\n\t\tconst needsPowerOfTwo = textureNeedsPowerOfTwo( texture ) && isPowerOfTwo( texture.image ) === false;\n\t\tlet image = resizeImage( texture.image, needsPowerOfTwo, false, maxTextureSize );\n\t\timage = verifyColorSpace( texture, image );\n\n\t\tconst supportsMips = isPowerOfTwo( image ) || isWebGL2,\n\t\t\tglFormat = utils.convert( texture.format, texture.encoding );\n\n\t\tlet glType = utils.convert( texture.type ),\n\t\t\tglInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding, texture.isVideoTexture );\n\n\t\tsetTextureParameters( textureType, texture, supportsMips );\n\n\t\tlet mipmap;\n\t\tconst mipmaps = texture.mipmaps;\n\n\t\tconst useTexStorage = ( isWebGL2 && texture.isVideoTexture !== true );\n\t\tconst allocateMemory = ( textureProperties.__version === undefined );\n\t\tconst levels = getMipLevels( texture, image, supportsMips );\n\n\t\tif ( texture.isDepthTexture ) {\n\n\t\t\t// populate depth texture with dummy data\n\n\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT;\n\n\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\tif ( texture.type === FloatType ) {\n\n\t\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT32F;\n\n\t\t\t\t} else if ( texture.type === UnsignedIntType ) {\n\n\t\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT24;\n\n\t\t\t\t} else if ( texture.type === UnsignedInt248Type ) {\n\n\t\t\t\t\tglInternalFormat = _gl.DEPTH24_STENCIL8;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT16; // WebGL2 requires sized internalformat for glTexImage2D\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( texture.type === FloatType ) {\n\n\t\t\t\t\tconsole.error( 'WebGLRenderer: Floating point depth texture requires WebGL2.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// validation checks for WebGL 1\n\n\t\t\tif ( texture.format === DepthFormat && glInternalFormat === _gl.DEPTH_COMPONENT ) {\n\n\t\t\t\t// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are\n\t\t\t\t// DEPTH_COMPONENT and type is not UNSIGNED_SHORT or UNSIGNED_INT\n\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\tif ( texture.type !== UnsignedShortType && texture.type !== UnsignedIntType ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.' );\n\n\t\t\t\t\ttexture.type = UnsignedShortType;\n\t\t\t\t\tglType = utils.convert( texture.type );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( texture.format === DepthStencilFormat && glInternalFormat === _gl.DEPTH_COMPONENT ) {\n\n\t\t\t\t// Depth stencil textures need the DEPTH_STENCIL internal format\n\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\tglInternalFormat = _gl.DEPTH_STENCIL;\n\n\t\t\t\t// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are\n\t\t\t\t// DEPTH_STENCIL and type is not UNSIGNED_INT_24_8_WEBGL.\n\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\tif ( texture.type !== UnsignedInt248Type ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.' );\n\n\t\t\t\t\ttexture.type = UnsignedInt248Type;\n\t\t\t\t\tglType = utils.convert( texture.type );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, 1, glInternalFormat, image.width, image.height );\n\n\t\t\t} else {\n\n\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, null );\n\n\t\t\t}\n\n\t\t} else if ( texture.isDataTexture ) {\n\n\t\t\t// use manually created mipmaps if available\n\t\t\t// if there are no manual mipmaps\n\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\tif ( mipmaps.length > 0 && supportsMips ) {\n\n\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t} else {\n\n\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, image.width, image.height, glFormat, glType, image.data );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, image.data );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( texture.isCompressedTexture ) {\n\n\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\tif ( texture.format !== RGBAFormat ) {\n\n\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tstate.compressedTexSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( texture.isDataTexture2DArray ) {\n\n\t\t\tif ( useTexStorage ) {\n\n\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\tstate.texStorage3D( _gl.TEXTURE_2D_ARRAY, levels, glInternalFormat, image.width, image.height, image.depth );\n\n\t\t\t\t}\n\n\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_2D_ARRAY, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );\n\n\t\t\t} else {\n\n\t\t\t\tstate.texImage3D( _gl.TEXTURE_2D_ARRAY, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );\n\n\t\t\t}\n\n\t\t} else if ( texture.isDataTexture3D ) {\n\n\t\t\tif ( useTexStorage ) {\n\n\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\tstate.texStorage3D( _gl.TEXTURE_3D, levels, glInternalFormat, image.width, image.height, image.depth );\n\n\t\t\t\t}\n\n\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_3D, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );\n\n\t\t\t} else {\n\n\t\t\t\tstate.texImage3D( _gl.TEXTURE_3D, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );\n\n\t\t\t}\n\n\t\t} else if ( texture.isFramebufferTexture ) {\n\n\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t} else {\n\n\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, null );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// regular Texture (image, video, canvas)\n\n\t\t\t// use manually created mipmaps if available\n\t\t\t// if there are no manual mipmaps\n\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\tif ( mipmaps.length > 0 && supportsMips ) {\n\n\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, glFormat, glType, mipmap );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, glFormat, glType, mipmap );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t} else {\n\n\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, glFormat, glType, image );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, glFormat, glType, image );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {\n\n\t\t\tgenerateMipmap( textureType );\n\n\t\t}\n\n\t\ttextureProperties.__version = texture.version;\n\n\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t}\n\n\tfunction uploadCubeTexture( textureProperties, texture, slot ) {\n\n\t\tif ( texture.image.length !== 6 ) return;\n\n\t\tinitTexture( textureProperties, texture );\n\n\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );\n\n\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );\n\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );\n\t\t_gl.pixelStorei( _gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, _gl.NONE );\n\n\t\tconst isCompressed = ( texture && ( texture.isCompressedTexture || texture.image[ 0 ].isCompressedTexture ) );\n\t\tconst isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture );\n\n\t\tconst cubeImage = [];\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tif ( ! isCompressed && ! isDataTexture ) {\n\n\t\t\t\tcubeImage[ i ] = resizeImage( texture.image[ i ], false, true, maxCubemapSize );\n\n\t\t\t} else {\n\n\t\t\t\tcubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ];\n\n\t\t\t}\n\n\t\t\tcubeImage[ i ] = verifyColorSpace( texture, cubeImage[ i ] );\n\n\t\t}\n\n\t\tconst image = cubeImage[ 0 ],\n\t\t\tsupportsMips = isPowerOfTwo( image ) || isWebGL2,\n\t\t\tglFormat = utils.convert( texture.format, texture.encoding ),\n\t\t\tglType = utils.convert( texture.type ),\n\t\t\tglInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );\n\n\t\tconst useTexStorage = ( isWebGL2 && texture.isVideoTexture !== true );\n\t\tconst allocateMemory = ( textureProperties.__version === undefined );\n\t\tlet levels = getMipLevels( texture, image, supportsMips );\n\n\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, supportsMips );\n\n\t\tlet mipmaps;\n\n\t\tif ( isCompressed ) {\n\n\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\tstate.texStorage2D( _gl.TEXTURE_CUBE_MAP, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tmipmaps = cubeImage[ i ].mipmaps;\n\n\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\n\t\t\t\t\tif ( texture.format !== RGBAFormat ) {\n\n\t\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tstate.compressedTexSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tmipmaps = texture.mipmaps;\n\n\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t// TODO: Uniformly handle mipmap definitions\n\t\t\t\t// Normal textures and compressed cube textures define base level + mips with their mipmap array\n\t\t\t\t// Uncompressed cube textures use their mipmap array only for mips (no base level)\n\n\t\t\t\tif ( mipmaps.length > 0 ) levels ++;\n\n\t\t\t\tstate.texStorage2D( _gl.TEXTURE_CUBE_MAP, levels, glInternalFormat, cubeImage[ 0 ].width, cubeImage[ 0 ].height );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( isDataTexture ) {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, cubeImage[ i ].width, cubeImage[ i ].height, glFormat, glType, cubeImage[ i ].data );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\t\t\t\t\t\tconst mipmapImage = mipmap.image[ i ].image;\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, 0, 0, mipmapImage.width, mipmapImage.height, glFormat, glType, mipmapImage.data );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, mipmapImage.width, mipmapImage.height, 0, glFormat, glType, mipmapImage.data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, 0, 0, glFormat, glType, mipmap.image[ i ] );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, glFormat, glType, mipmap.image[ i ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {\n\n\t\t\t// We assume images for cube map have the same size.\n\t\t\tgenerateMipmap( _gl.TEXTURE_CUBE_MAP );\n\n\t\t}\n\n\t\ttextureProperties.__version = texture.version;\n\n\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t}\n\n\t// Render targets\n\n\t// Setup storage for target texture and bind it to correct framebuffer\n\tfunction setupFrameBufferTexture( framebuffer, renderTarget, texture, attachment, textureTarget ) {\n\n\t\tconst glFormat = utils.convert( texture.format, texture.encoding );\n\t\tconst glType = utils.convert( texture.type );\n\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\tif ( ! renderTargetProperties.__hasExternalTextures ) {\n\n\t\t\tif ( textureTarget === _gl.TEXTURE_3D || textureTarget === _gl.TEXTURE_2D_ARRAY ) {\n\n\t\t\t\tstate.texImage3D( textureTarget, 0, glInternalFormat, renderTarget.width, renderTarget.height, renderTarget.depth, 0, glFormat, glType, null );\n\n\t\t\t} else {\n\n\t\t\t\tstate.texImage2D( textureTarget, 0, glInternalFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\t\tif ( renderTarget.useRenderToTexture ) {\n\n\t\t\tMultisampledRenderToTextureExtension.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( texture ).__webglTexture, 0, getRenderTargetSamples( renderTarget ) );\n\n\t\t} else {\n\n\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( texture ).__webglTexture, 0 );\n\n\t\t}\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t}\n\n\n\t// Setup storage for internal depth/stencil buffers and bind to correct framebuffer\n\tfunction setupRenderBufferStorage( renderbuffer, renderTarget, isMultisample ) {\n\n\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );\n\n\t\tif ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) {\n\n\t\t\tlet glInternalFormat = _gl.DEPTH_COMPONENT16;\n\n\t\t\tif ( isMultisample || renderTarget.useRenderToTexture ) {\n\n\t\t\t\tconst depthTexture = renderTarget.depthTexture;\n\n\t\t\t\tif ( depthTexture && depthTexture.isDepthTexture ) {\n\n\t\t\t\t\tif ( depthTexture.type === FloatType ) {\n\n\t\t\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT32F;\n\n\t\t\t\t\t} else if ( depthTexture.type === UnsignedIntType ) {\n\n\t\t\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT24;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\t\t\tif ( renderTarget.useRenderToTexture ) {\n\n\t\t\t\t\tMultisampledRenderToTextureExtension.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t} else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) {\n\n\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\t\tif ( isMultisample && renderTarget.useRenderbuffer ) {\n\n\t\t\t\t_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, _gl.DEPTH24_STENCIL8, renderTarget.width, renderTarget.height );\n\n\t\t\t} else if ( renderTarget.useRenderToTexture ) {\n\n\t\t\t\tMultisampledRenderToTextureExtension.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, _gl.DEPTH24_STENCIL8, renderTarget.width, renderTarget.height );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\n\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t} else {\n\n\t\t\t// Use the first texture for MRT so far\n\t\t\tconst texture = renderTarget.isWebGLMultipleRenderTargets === true ? renderTarget.texture[ 0 ] : renderTarget.texture;\n\n\t\t\tconst glFormat = utils.convert( texture.format, texture.encoding );\n\t\t\tconst glType = utils.convert( texture.type );\n\t\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );\n\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\t\tif ( isMultisample && renderTarget.useRenderbuffer ) {\n\n\t\t\t\t_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t} else if ( renderTarget.useRenderToTexture ) {\n\n\t\t\t\tMultisampledRenderToTextureExtension.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t}\n\n\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );\n\n\t}\n\n\t// Setup resources for a Depth Texture for a FBO (needs an extension)\n\tfunction setupDepthTexture( framebuffer, renderTarget ) {\n\n\t\tconst isCube = ( renderTarget && renderTarget.isWebGLCubeRenderTarget );\n\t\tif ( isCube ) throw new Error( 'Depth Texture with cube render targets is not supported' );\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\tif ( ! ( renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture ) ) {\n\n\t\t\tthrow new Error( 'renderTarget.depthTexture must be an instance of THREE.DepthTexture' );\n\n\t\t}\n\n\t\t// upload an empty depth texture with framebuffer size\n\t\tif ( ! properties.get( renderTarget.depthTexture ).__webglTexture ||\n\t\t\t\trenderTarget.depthTexture.image.width !== renderTarget.width ||\n\t\t\t\trenderTarget.depthTexture.image.height !== renderTarget.height ) {\n\n\t\t\trenderTarget.depthTexture.image.width = renderTarget.width;\n\t\t\trenderTarget.depthTexture.image.height = renderTarget.height;\n\t\t\trenderTarget.depthTexture.needsUpdate = true;\n\n\t\t}\n\n\t\tsetTexture2D( renderTarget.depthTexture, 0 );\n\n\t\tconst webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture;\n\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\tif ( renderTarget.depthTexture.format === DepthFormat ) {\n\n\t\t\tif ( renderTarget.useRenderToTexture ) {\n\n\t\t\t\tMultisampledRenderToTextureExtension.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0, samples );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t}\n\n\t\t} else if ( renderTarget.depthTexture.format === DepthStencilFormat ) {\n\n\t\t\tif ( renderTarget.useRenderToTexture ) {\n\n\t\t\t\tMultisampledRenderToTextureExtension.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0, samples );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'Unknown depthTexture format' );\n\n\t\t}\n\n\t}\n\n\t// Setup GL resources for a non-texture depth buffer\n\tfunction setupDepthRenderbuffer( renderTarget ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst isCube = ( renderTarget.isWebGLCubeRenderTarget === true );\n\n\t\tif ( renderTarget.depthTexture && ! renderTargetProperties.__autoAllocateDepthBuffer ) {\n\n\t\t\tif ( isCube ) throw new Error( 'target.depthTexture not supported in Cube render targets' );\n\n\t\t\tsetupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget );\n\n\t\t} else {\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\trenderTargetProperties.__webglDepthbuffer = [];\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget, false );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\t\t\t\trenderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer();\n\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget, false );\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t}\n\n\t// rebind framebuffer with external textures\n\tfunction rebindTextures( renderTarget, colorTexture, depthTexture ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\tif ( colorTexture !== undefined ) {\n\n\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, renderTarget.texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D );\n\n\t\t}\n\n\t\tif ( depthTexture !== undefined ) {\n\n\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t}\n\n\t}\n\n\t// Set up GL resources for the render target\n\tfunction setupRenderTarget( renderTarget ) {\n\n\t\tconst texture = renderTarget.texture;\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst textureProperties = properties.get( texture );\n\n\t\trenderTarget.addEventListener( 'dispose', onRenderTargetDispose );\n\n\t\tif ( renderTarget.isWebGLMultipleRenderTargets !== true ) {\n\n\t\t\tif ( textureProperties.__webglTexture === undefined ) {\n\n\t\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t}\n\n\t\t\ttextureProperties.__version = texture.version;\n\t\t\tinfo.memory.textures ++;\n\n\t\t}\n\n\t\tconst isCube = ( renderTarget.isWebGLCubeRenderTarget === true );\n\t\tconst isMultipleRenderTargets = ( renderTarget.isWebGLMultipleRenderTargets === true );\n\t\tconst isRenderTarget3D = texture.isDataTexture3D || texture.isDataTexture2DArray;\n\t\tconst supportsMips = isPowerOfTwo( renderTarget ) || isWebGL2;\n\n\t\t// Setup framebuffer\n\n\t\tif ( isCube ) {\n\n\t\t\trenderTargetProperties.__webglFramebuffer = [];\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer();\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\trenderTargetProperties.__webglFramebuffer = _gl.createFramebuffer();\n\n\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\tif ( capabilities.drawBuffers ) {\n\n\t\t\t\t\tconst textures = renderTarget.texture;\n\n\t\t\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst attachmentProperties = properties.get( textures[ i ] );\n\n\t\t\t\t\t\tif ( attachmentProperties.__webglTexture === undefined ) {\n\n\t\t\t\t\t\t\tattachmentProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t\t\t\t\tinfo.memory.textures ++;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: WebGLMultipleRenderTargets can only be used with WebGL2 or WEBGL_draw_buffers extension.' );\n\n\t\t\t\t}\n\n\t\t\t} else if ( renderTarget.useRenderbuffer ) {\n\n\t\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\t\trenderTargetProperties.__webglMultisampledFramebuffer = _gl.createFramebuffer();\n\t\t\t\t\trenderTargetProperties.__webglColorRenderbuffer = _gl.createRenderbuffer();\n\n\t\t\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer );\n\n\t\t\t\t\tconst glFormat = utils.convert( texture.format, texture.encoding );\n\t\t\t\t\tconst glType = utils.convert( texture.type );\n\t\t\t\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );\n\t\t\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\t\t\t\t\t_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer );\n\t\t\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );\n\n\t\t\t\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t\t\t\trenderTargetProperties.__webglDepthRenderbuffer = _gl.createRenderbuffer();\n\t\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthRenderbuffer, renderTarget, true );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Setup color buffer\n\n\t\tif ( isCube ) {\n\n\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );\n\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, supportsMips );\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i );\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {\n\n\t\t\t\tgenerateMipmap( _gl.TEXTURE_CUBE_MAP );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t} else if ( isMultipleRenderTargets ) {\n\n\t\t\tconst textures = renderTarget.texture;\n\n\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\tconst attachment = textures[ i ];\n\t\t\t\tconst attachmentProperties = properties.get( attachment );\n\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_2D, attachmentProperties.__webglTexture );\n\t\t\t\tsetTextureParameters( _gl.TEXTURE_2D, attachment, supportsMips );\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, attachment, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D );\n\n\t\t\t\tif ( textureNeedsGenerateMipmaps( attachment, supportsMips ) ) {\n\n\t\t\t\t\tgenerateMipmap( _gl.TEXTURE_2D );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t} else {\n\n\t\t\tlet glTextureType = _gl.TEXTURE_2D;\n\n\t\t\tif ( isRenderTarget3D ) {\n\n\t\t\t\t// Render targets containing layers, i.e: Texture 3D and 2d arrays\n\n\t\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\t\tconst isTexture3D = texture.isDataTexture3D;\n\t\t\t\t\tglTextureType = isTexture3D ? _gl.TEXTURE_3D : _gl.TEXTURE_2D_ARRAY;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.DataTexture3D and THREE.DataTexture2DArray only supported with WebGL2.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.bindTexture( glTextureType, textureProperties.__webglTexture );\n\t\t\tsetTextureParameters( glTextureType, texture, supportsMips );\n\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, texture, _gl.COLOR_ATTACHMENT0, glTextureType );\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {\n\n\t\t\t\tgenerateMipmap( glTextureType );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t}\n\n\t\t// Setup depth and stencil buffers\n\n\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t}\n\n\t}\n\n\tfunction updateRenderTargetMipmap( renderTarget ) {\n\n\t\tconst supportsMips = isPowerOfTwo( renderTarget ) || isWebGL2;\n\n\t\tconst textures = renderTarget.isWebGLMultipleRenderTargets === true ? renderTarget.texture : [ renderTarget.texture ];\n\n\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\tconst texture = textures[ i ];\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {\n\n\t\t\t\tconst target = renderTarget.isWebGLCubeRenderTarget ? _gl.TEXTURE_CUBE_MAP : _gl.TEXTURE_2D;\n\t\t\t\tconst webglTexture = properties.get( texture ).__webglTexture;\n\n\t\t\t\tstate.bindTexture( target, webglTexture );\n\t\t\t\tgenerateMipmap( target );\n\t\t\t\tstate.unbindTexture();\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction updateMultisampleRenderTarget( renderTarget ) {\n\n\t\tif ( renderTarget.useRenderbuffer ) {\n\n\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\tconst width = renderTarget.width;\n\t\t\t\tconst height = renderTarget.height;\n\t\t\t\tlet mask = _gl.COLOR_BUFFER_BIT;\n\t\t\t\tconst invalidationArray = [ _gl.COLOR_ATTACHMENT0 ];\n\t\t\t\tconst depthStyle = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\n\t\t\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t\t\tinvalidationArray.push( depthStyle );\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! renderTarget.ignoreDepthForMultisampleCopy ) {\n\n\t\t\t\t\tif ( renderTarget.depthBuffer ) mask |= _gl.DEPTH_BUFFER_BIT;\n\t\t\t\t\tif ( renderTarget.stencilBuffer ) mask |= _gl.STENCIL_BUFFER_BIT;\n\n\t\t\t\t}\n\n\t\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\n\t\t\t\tif ( renderTarget.ignoreDepthForMultisampleCopy ) {\n\n\t\t\t\t\t_gl.invalidateFramebuffer( _gl.READ_FRAMEBUFFER, [ depthStyle ] );\n\t\t\t\t\t_gl.invalidateFramebuffer( _gl.DRAW_FRAMEBUFFER, [ depthStyle ] );\n\n\t\t\t\t}\n\n\t\t\t\t_gl.blitFramebuffer( 0, 0, width, height, 0, 0, width, height, mask, _gl.NEAREST );\n\t\t\t\t_gl.invalidateFramebuffer( _gl.READ_FRAMEBUFFER, invalidationArray );\n\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, null );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.' );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction getRenderTargetSamples( renderTarget ) {\n\n\t\treturn ( isWebGL2 && ( renderTarget.useRenderbuffer || renderTarget.useRenderToTexture ) ) ?\n\t\t\tMath.min( maxSamples, renderTarget.samples ) : 0;\n\n\t}\n\n\tfunction updateVideoTexture( texture ) {\n\n\t\tconst frame = info.render.frame;\n\n\t\t// Check the last frame we updated the VideoTexture\n\n\t\tif ( _videoTextures.get( texture ) !== frame ) {\n\n\t\t\t_videoTextures.set( texture, frame );\n\t\t\ttexture.update();\n\n\t\t}\n\n\t}\n\n\tfunction verifyColorSpace( texture, image ) {\n\n\t\tconst encoding = texture.encoding;\n\t\tconst format = texture.format;\n\t\tconst type = texture.type;\n\n\t\tif ( texture.isCompressedTexture === true || texture.isVideoTexture === true || texture.format === _SRGBAFormat ) return image;\n\n\t\tif ( encoding !== LinearEncoding ) {\n\n\t\t\t// sRGB\n\n\t\t\tif ( encoding === sRGBEncoding ) {\n\n\t\t\t\tif ( isWebGL2 === false ) {\n\n\t\t\t\t\t// in WebGL 1, try to use EXT_sRGB extension and unsized formats\n\n\t\t\t\t\tif ( extensions.has( 'EXT_sRGB' ) === true && format === RGBAFormat ) {\n\n\t\t\t\t\t\ttexture.format = _SRGBAFormat;\n\n\t\t\t\t\t\t// it's not possible to generate mips in WebGL 1 with this extension\n\n\t\t\t\t\t\ttexture.minFilter = LinearFilter;\n\t\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// slow fallback (CPU decode)\n\n\t\t\t\t\t\timage = ImageUtils.sRGBToLinear( image );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// in WebGL 2 uncompressed textures can only be sRGB encoded if they have the RGBA8 format\n\n\t\t\t\t\tif ( format !== RGBAFormat || type !== UnsignedByteType ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.WebGLTextures: Unsupported texture encoding:', encoding );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn image;\n\n\t}\n\n\t// backwards compatibility\n\n\tlet warnedTexture2D = false;\n\tlet warnedTextureCube = false;\n\n\tfunction safeSetTexture2D( texture, slot ) {\n\n\t\tif ( texture && texture.isWebGLRenderTarget ) {\n\n\t\t\tif ( warnedTexture2D === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLTextures.safeSetTexture2D: don\\'t use render targets as textures. Use their .texture property instead.' );\n\t\t\t\twarnedTexture2D = true;\n\n\t\t\t}\n\n\t\t\ttexture = texture.texture;\n\n\t\t}\n\n\t\tsetTexture2D( texture, slot );\n\n\t}\n\n\tfunction safeSetTextureCube( texture, slot ) {\n\n\t\tif ( texture && texture.isWebGLCubeRenderTarget ) {\n\n\t\t\tif ( warnedTextureCube === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLTextures.safeSetTextureCube: don\\'t use cube render targets as textures. Use their .texture property instead.' );\n\t\t\t\twarnedTextureCube = true;\n\n\t\t\t}\n\n\t\t\ttexture = texture.texture;\n\n\t\t}\n\n\n\t\tsetTextureCube( texture, slot );\n\n\t}\n\n\t//\n\n\tthis.allocateTextureUnit = allocateTextureUnit;\n\tthis.resetTextureUnits = resetTextureUnits;\n\n\tthis.setTexture2D = setTexture2D;\n\tthis.setTexture2DArray = setTexture2DArray;\n\tthis.setTexture3D = setTexture3D;\n\tthis.setTextureCube = setTextureCube;\n\tthis.rebindTextures = rebindTextures;\n\tthis.setupRenderTarget = setupRenderTarget;\n\tthis.updateRenderTargetMipmap = updateRenderTargetMipmap;\n\tthis.updateMultisampleRenderTarget = updateMultisampleRenderTarget;\n\tthis.setupDepthRenderbuffer = setupDepthRenderbuffer;\n\tthis.setupFrameBufferTexture = setupFrameBufferTexture;\n\n\tthis.safeSetTexture2D = safeSetTexture2D;\n\tthis.safeSetTextureCube = safeSetTextureCube;\n\n}\n\nexport { WebGLTextures };\n","import { RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_10x10_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGB_ETC1_Format, RGB_ETC2_Format, RGBA_ETC2_EAC_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT5_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT1_Format, RGB_S3TC_DXT1_Format, DepthFormat, DepthStencilFormat, LuminanceAlphaFormat, LuminanceFormat, RedFormat, RGBFormat, RGBAFormat, AlphaFormat, RedIntegerFormat, RGFormat, RGIntegerFormat, RGBAIntegerFormat, HalfFloatType, FloatType, UnsignedIntType, IntType, UnsignedShortType, ShortType, ByteType, UnsignedInt248Type, UnsignedShort5551Type, UnsignedShort4444Type, UnsignedByteType, RGBA_BPTC_Format, sRGBEncoding, _SRGBAFormat } from '../../constants.js';\n\nfunction WebGLUtils( gl, extensions, capabilities ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\n\tfunction convert( p, encoding = null ) {\n\n\t\tlet extension;\n\n\t\tif ( p === UnsignedByteType ) return gl.UNSIGNED_BYTE;\n\t\tif ( p === UnsignedShort4444Type ) return gl.UNSIGNED_SHORT_4_4_4_4;\n\t\tif ( p === UnsignedShort5551Type ) return gl.UNSIGNED_SHORT_5_5_5_1;\n\n\t\tif ( p === ByteType ) return gl.BYTE;\n\t\tif ( p === ShortType ) return gl.SHORT;\n\t\tif ( p === UnsignedShortType ) return gl.UNSIGNED_SHORT;\n\t\tif ( p === IntType ) return gl.INT;\n\t\tif ( p === UnsignedIntType ) return gl.UNSIGNED_INT;\n\t\tif ( p === FloatType ) return gl.FLOAT;\n\n\t\tif ( p === HalfFloatType ) {\n\n\t\t\tif ( isWebGL2 ) return gl.HALF_FLOAT;\n\n\t\t\textension = extensions.get( 'OES_texture_half_float' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\treturn extension.HALF_FLOAT_OES;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( p === AlphaFormat ) return gl.ALPHA;\n\t\tif ( p === RGBAFormat ) return gl.RGBA;\n\t\tif ( p === LuminanceFormat ) return gl.LUMINANCE;\n\t\tif ( p === LuminanceAlphaFormat ) return gl.LUMINANCE_ALPHA;\n\t\tif ( p === DepthFormat ) return gl.DEPTH_COMPONENT;\n\t\tif ( p === DepthStencilFormat ) return gl.DEPTH_STENCIL;\n\t\tif ( p === RedFormat ) return gl.RED;\n\n\t\tif ( p === RGBFormat ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: THREE.RGBFormat has been removed. Use THREE.RGBAFormat instead. https://github.com/mrdoob/three.js/pull/23228' );\n\t\t\treturn gl.RGBA;\n\n\t\t}\n\n\t\t// WebGL 1 sRGB fallback\n\n\t\tif ( p === _SRGBAFormat ) {\n\n\t\t\textension = extensions.get( 'EXT_sRGB' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\treturn extension.SRGB_ALPHA_EXT;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// WebGL2 formats.\n\n\t\tif ( p === RedIntegerFormat ) return gl.RED_INTEGER;\n\t\tif ( p === RGFormat ) return gl.RG;\n\t\tif ( p === RGIntegerFormat ) return gl.RG_INTEGER;\n\t\tif ( p === RGBAIntegerFormat ) return gl.RGBA_INTEGER;\n\n\t\t// S3TC\n\n\t\tif ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format || p === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) {\n\n\t\t\tif ( encoding === sRGBEncoding ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc_srgb' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_SRGB_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// PVRTC\n\n\t\tif ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format || p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;\n\t\t\t\tif ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;\n\t\t\t\tif ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;\n\t\t\t\tif ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ETC1\n\n\t\tif ( p === RGB_ETC1_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_etc1' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\treturn extension.COMPRESSED_RGB_ETC1_WEBGL;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ETC2\n\n\t\tif ( p === RGB_ETC2_Format || p === RGBA_ETC2_EAC_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_etc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGB_ETC2_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ETC2 : extension.COMPRESSED_RGB8_ETC2;\n\t\t\t\tif ( p === RGBA_ETC2_EAC_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC : extension.COMPRESSED_RGBA8_ETC2_EAC;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ASTC\n\n\t\tif ( p === RGBA_ASTC_4x4_Format || p === RGBA_ASTC_5x4_Format || p === RGBA_ASTC_5x5_Format ||\n\t\t\tp === RGBA_ASTC_6x5_Format || p === RGBA_ASTC_6x6_Format || p === RGBA_ASTC_8x5_Format ||\n\t\t\tp === RGBA_ASTC_8x6_Format || p === RGBA_ASTC_8x8_Format || p === RGBA_ASTC_10x5_Format ||\n\t\t\tp === RGBA_ASTC_10x6_Format || p === RGBA_ASTC_10x8_Format || p === RGBA_ASTC_10x10_Format ||\n\t\t\tp === RGBA_ASTC_12x10_Format || p === RGBA_ASTC_12x12_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_astc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGBA_ASTC_4x4_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR : extension.COMPRESSED_RGBA_ASTC_4x4_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_5x4_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR : extension.COMPRESSED_RGBA_ASTC_5x4_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_5x5_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR : extension.COMPRESSED_RGBA_ASTC_5x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_6x5_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR : extension.COMPRESSED_RGBA_ASTC_6x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_6x6_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR : extension.COMPRESSED_RGBA_ASTC_6x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x5_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR : extension.COMPRESSED_RGBA_ASTC_8x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x6_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR : extension.COMPRESSED_RGBA_ASTC_8x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x8_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR : extension.COMPRESSED_RGBA_ASTC_8x8_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x5_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR : extension.COMPRESSED_RGBA_ASTC_10x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x6_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR : extension.COMPRESSED_RGBA_ASTC_10x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x8_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR : extension.COMPRESSED_RGBA_ASTC_10x8_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x10_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR : extension.COMPRESSED_RGBA_ASTC_10x10_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_12x10_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR : extension.COMPRESSED_RGBA_ASTC_12x10_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_12x12_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR : extension.COMPRESSED_RGBA_ASTC_12x12_KHR;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// BPTC\n\n\t\tif ( p === RGBA_BPTC_Format ) {\n\n\t\t\textension = extensions.get( 'EXT_texture_compression_bptc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGBA_BPTC_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT : extension.COMPRESSED_RGBA_BPTC_UNORM_EXT;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( p === UnsignedInt248Type ) {\n\n\t\t\tif ( isWebGL2 ) return gl.UNSIGNED_INT_24_8;\n\n\t\t\textension = extensions.get( 'WEBGL_depth_texture' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\treturn extension.UNSIGNED_INT_24_8_WEBGL;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn { convert: convert };\n\n}\n\n\nexport { WebGLUtils };\n","import { PerspectiveCamera } from './PerspectiveCamera.js';\n\nclass ArrayCamera extends PerspectiveCamera {\n\n\tconstructor( array = [] ) {\n\n\t\tsuper();\n\n\t\tthis.cameras = array;\n\n\t}\n\n}\n\nArrayCamera.prototype.isArrayCamera = true;\n\n\nexport { ArrayCamera };\n","import { Object3D } from '../core/Object3D.js';\n\nclass Group extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'Group';\n\n\t}\n\n}\n\nGroup.prototype.isGroup = true;\n\nexport { Group };\n","import { Vector3 } from '../../math/Vector3.js';\nimport { Group } from '../../objects/Group.js';\n\nconst _moveEvent = { type: 'move' };\n\nclass WebXRController {\n\n\tconstructor() {\n\n\t\tthis._targetRay = null;\n\t\tthis._grip = null;\n\t\tthis._hand = null;\n\n\t}\n\n\tgetHandSpace() {\n\n\t\tif ( this._hand === null ) {\n\n\t\t\tthis._hand = new Group();\n\t\t\tthis._hand.matrixAutoUpdate = false;\n\t\t\tthis._hand.visible = false;\n\n\t\t\tthis._hand.joints = {};\n\t\t\tthis._hand.inputState = { pinching: false };\n\n\t\t}\n\n\t\treturn this._hand;\n\n\t}\n\n\tgetTargetRaySpace() {\n\n\t\tif ( this._targetRay === null ) {\n\n\t\t\tthis._targetRay = new Group();\n\t\t\tthis._targetRay.matrixAutoUpdate = false;\n\t\t\tthis._targetRay.visible = false;\n\t\t\tthis._targetRay.hasLinearVelocity = false;\n\t\t\tthis._targetRay.linearVelocity = new Vector3();\n\t\t\tthis._targetRay.hasAngularVelocity = false;\n\t\t\tthis._targetRay.angularVelocity = new Vector3();\n\n\t\t}\n\n\t\treturn this._targetRay;\n\n\t}\n\n\tgetGripSpace() {\n\n\t\tif ( this._grip === null ) {\n\n\t\t\tthis._grip = new Group();\n\t\t\tthis._grip.matrixAutoUpdate = false;\n\t\t\tthis._grip.visible = false;\n\t\t\tthis._grip.hasLinearVelocity = false;\n\t\t\tthis._grip.linearVelocity = new Vector3();\n\t\t\tthis._grip.hasAngularVelocity = false;\n\t\t\tthis._grip.angularVelocity = new Vector3();\n\n\t\t}\n\n\t\treturn this._grip;\n\n\t}\n\n\tdispatchEvent( event ) {\n\n\t\tif ( this._targetRay !== null ) {\n\n\t\t\tthis._targetRay.dispatchEvent( event );\n\n\t\t}\n\n\t\tif ( this._grip !== null ) {\n\n\t\t\tthis._grip.dispatchEvent( event );\n\n\t\t}\n\n\t\tif ( this._hand !== null ) {\n\n\t\t\tthis._hand.dispatchEvent( event );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tdisconnect( inputSource ) {\n\n\t\tthis.dispatchEvent( { type: 'disconnected', data: inputSource } );\n\n\t\tif ( this._targetRay !== null ) {\n\n\t\t\tthis._targetRay.visible = false;\n\n\t\t}\n\n\t\tif ( this._grip !== null ) {\n\n\t\t\tthis._grip.visible = false;\n\n\t\t}\n\n\t\tif ( this._hand !== null ) {\n\n\t\t\tthis._hand.visible = false;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tupdate( inputSource, frame, referenceSpace ) {\n\n\t\tlet inputPose = null;\n\t\tlet gripPose = null;\n\t\tlet handPose = null;\n\n\t\tconst targetRay = this._targetRay;\n\t\tconst grip = this._grip;\n\t\tconst hand = this._hand;\n\n\t\tif ( inputSource && frame.session.visibilityState !== 'visible-blurred' ) {\n\n\t\t\tif ( targetRay !== null ) {\n\n\t\t\t\tinputPose = frame.getPose( inputSource.targetRaySpace, referenceSpace );\n\n\t\t\t\tif ( inputPose !== null ) {\n\n\t\t\t\t\ttargetRay.matrix.fromArray( inputPose.transform.matrix );\n\t\t\t\t\ttargetRay.matrix.decompose( targetRay.position, targetRay.rotation, targetRay.scale );\n\n\t\t\t\t\tif ( inputPose.linearVelocity ) {\n\n\t\t\t\t\t\ttargetRay.hasLinearVelocity = true;\n\t\t\t\t\t\ttargetRay.linearVelocity.copy( inputPose.linearVelocity );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttargetRay.hasLinearVelocity = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( inputPose.angularVelocity ) {\n\n\t\t\t\t\t\ttargetRay.hasAngularVelocity = true;\n\t\t\t\t\t\ttargetRay.angularVelocity.copy( inputPose.angularVelocity );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttargetRay.hasAngularVelocity = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.dispatchEvent( _moveEvent );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( hand && inputSource.hand ) {\n\n\t\t\t\thandPose = true;\n\n\t\t\t\tfor ( const inputjoint of inputSource.hand.values() ) {\n\n\t\t\t\t\t// Update the joints groups with the XRJoint poses\n\t\t\t\t\tconst jointPose = frame.getJointPose( inputjoint, referenceSpace );\n\n\t\t\t\t\tif ( hand.joints[ inputjoint.jointName ] === undefined ) {\n\n\t\t\t\t\t\t// The transform of this joint will be updated with the joint pose on each frame\n\t\t\t\t\t\tconst joint = new Group();\n\t\t\t\t\t\tjoint.matrixAutoUpdate = false;\n\t\t\t\t\t\tjoint.visible = false;\n\t\t\t\t\t\thand.joints[ inputjoint.jointName ] = joint;\n\t\t\t\t\t\t// ??\n\t\t\t\t\t\thand.add( joint );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst joint = hand.joints[ inputjoint.jointName ];\n\n\t\t\t\t\tif ( jointPose !== null ) {\n\n\t\t\t\t\t\tjoint.matrix.fromArray( jointPose.transform.matrix );\n\t\t\t\t\t\tjoint.matrix.decompose( joint.position, joint.rotation, joint.scale );\n\t\t\t\t\t\tjoint.jointRadius = jointPose.radius;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tjoint.visible = jointPose !== null;\n\n\t\t\t\t}\n\n\t\t\t\t// Custom events\n\n\t\t\t\t// Check pinchz\n\t\t\t\tconst indexTip = hand.joints[ 'index-finger-tip' ];\n\t\t\t\tconst thumbTip = hand.joints[ 'thumb-tip' ];\n\t\t\t\tconst distance = indexTip.position.distanceTo( thumbTip.position );\n\n\t\t\t\tconst distanceToPinch = 0.02;\n\t\t\t\tconst threshold = 0.005;\n\n\t\t\t\tif ( hand.inputState.pinching && distance > distanceToPinch + threshold ) {\n\n\t\t\t\t\thand.inputState.pinching = false;\n\t\t\t\t\tthis.dispatchEvent( {\n\t\t\t\t\t\ttype: 'pinchend',\n\t\t\t\t\t\thandedness: inputSource.handedness,\n\t\t\t\t\t\ttarget: this\n\t\t\t\t\t} );\n\n\t\t\t\t} else if ( ! hand.inputState.pinching && distance <= distanceToPinch - threshold ) {\n\n\t\t\t\t\thand.inputState.pinching = true;\n\t\t\t\t\tthis.dispatchEvent( {\n\t\t\t\t\t\ttype: 'pinchstart',\n\t\t\t\t\t\thandedness: inputSource.handedness,\n\t\t\t\t\t\ttarget: this\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( grip !== null && inputSource.gripSpace ) {\n\n\t\t\t\t\tgripPose = frame.getPose( inputSource.gripSpace, referenceSpace );\n\n\t\t\t\t\tif ( gripPose !== null ) {\n\n\t\t\t\t\t\tgrip.matrix.fromArray( gripPose.transform.matrix );\n\t\t\t\t\t\tgrip.matrix.decompose( grip.position, grip.rotation, grip.scale );\n\n\t\t\t\t\t\tif ( gripPose.linearVelocity ) {\n\n\t\t\t\t\t\t\tgrip.hasLinearVelocity = true;\n\t\t\t\t\t\t\tgrip.linearVelocity.copy( gripPose.linearVelocity );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgrip.hasLinearVelocity = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( gripPose.angularVelocity ) {\n\n\t\t\t\t\t\t\tgrip.hasAngularVelocity = true;\n\t\t\t\t\t\t\tgrip.angularVelocity.copy( gripPose.angularVelocity );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgrip.hasAngularVelocity = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( targetRay !== null ) {\n\n\t\t\ttargetRay.visible = ( inputPose !== null );\n\n\t\t}\n\n\t\tif ( grip !== null ) {\n\n\t\t\tgrip.visible = ( gripPose !== null );\n\n\t\t}\n\n\t\tif ( hand !== null ) {\n\n\t\t\thand.visible = ( handPose !== null );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n\nexport { WebXRController };\n","import { Texture } from './Texture.js';\nimport { NearestFilter, UnsignedShortType, UnsignedInt248Type, DepthFormat, DepthStencilFormat } from '../constants.js';\n\nclass DepthTexture extends Texture {\n\n\tconstructor( width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format ) {\n\n\t\tformat = format !== undefined ? format : DepthFormat;\n\n\t\tif ( format !== DepthFormat && format !== DepthStencilFormat ) {\n\n\t\t\tthrow new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' );\n\n\t\t}\n\n\t\tif ( type === undefined && format === DepthFormat ) type = UnsignedShortType;\n\t\tif ( type === undefined && format === DepthStencilFormat ) type = UnsignedInt248Type;\n\n\t\tsuper( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.image = { width: width, height: height };\n\n\t\tthis.magFilter = magFilter !== undefined ? magFilter : NearestFilter;\n\t\tthis.minFilter = minFilter !== undefined ? minFilter : NearestFilter;\n\n\t\tthis.flipY = false;\n\t\tthis.generateMipmaps\t= false;\n\n\t}\n\n\n}\n\nDepthTexture.prototype.isDepthTexture = true;\n\nexport { DepthTexture };\n","import { ArrayCamera } from '../../cameras/ArrayCamera.js';\nimport { EventDispatcher } from '../../core/EventDispatcher.js';\nimport { PerspectiveCamera } from '../../cameras/PerspectiveCamera.js';\nimport { Vector3 } from '../../math/Vector3.js';\nimport { Vector4 } from '../../math/Vector4.js';\nimport { WebGLAnimation } from '../webgl/WebGLAnimation.js';\nimport { WebGLRenderTarget } from '../WebGLRenderTarget.js';\nimport { WebXRController } from './WebXRController.js';\nimport { DepthTexture } from '../../textures/DepthTexture.js';\nimport { WebGLMultisampleRenderTarget } from '../WebGLMultisampleRenderTarget.js';\nimport {\n\tDepthFormat,\n\tDepthStencilFormat,\n\tRGBAFormat,\n\tsRGBEncoding,\n\tUnsignedByteType,\n\tUnsignedShortType,\n\tUnsignedInt248Type,\n} from '../../constants.js';\n\nclass WebXRManager extends EventDispatcher {\n\n\tconstructor( renderer, gl ) {\n\n\t\tsuper();\n\n\t\tconst scope = this;\n\n\t\tlet session = null;\n\t\tlet framebufferScaleFactor = 1.0;\n\n\t\tlet referenceSpace = null;\n\t\tlet referenceSpaceType = 'local-floor';\n\t\tconst hasMultisampledRenderToTexture = renderer.extensions.has( 'WEBGL_multisampled_render_to_texture' );\n\n\t\tlet pose = null;\n\t\tlet glBinding = null;\n\t\tlet glProjLayer = null;\n\t\tlet glBaseLayer = null;\n\t\tlet isMultisample = false;\n\t\tlet xrFrame = null;\n\t\tconst attributes = gl.getContextAttributes();\n\t\tlet initialRenderTarget = null;\n\t\tlet newRenderTarget = null;\n\n\t\tconst controllers = [];\n\t\tconst inputSourcesMap = new Map();\n\n\t\t//\n\n\t\tconst cameraL = new PerspectiveCamera();\n\t\tcameraL.layers.enable( 1 );\n\t\tcameraL.viewport = new Vector4();\n\n\t\tconst cameraR = new PerspectiveCamera();\n\t\tcameraR.layers.enable( 2 );\n\t\tcameraR.viewport = new Vector4();\n\n\t\tconst cameras = [ cameraL, cameraR ];\n\n\t\tconst cameraVR = new ArrayCamera();\n\t\tcameraVR.layers.enable( 1 );\n\t\tcameraVR.layers.enable( 2 );\n\n\t\tlet _currentDepthNear = null;\n\t\tlet _currentDepthFar = null;\n\n\t\t//\n\n\t\tthis.cameraAutoUpdate = true;\n\t\tthis.enabled = false;\n\n\t\tthis.isPresenting = false;\n\n\t\tthis.getController = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getTargetRaySpace();\n\n\t\t};\n\n\t\tthis.getControllerGrip = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getGripSpace();\n\n\t\t};\n\n\t\tthis.getHand = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getHandSpace();\n\n\t\t};\n\n\t\t//\n\n\t\tfunction onSessionEvent( event ) {\n\n\t\t\tconst controller = inputSourcesMap.get( event.inputSource );\n\n\t\t\tif ( controller ) {\n\n\t\t\t\tcontroller.dispatchEvent( { type: event.type, data: event.inputSource } );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onSessionEnd() {\n\n\t\t\tinputSourcesMap.forEach( function ( controller, inputSource ) {\n\n\t\t\t\tcontroller.disconnect( inputSource );\n\n\t\t\t} );\n\n\t\t\tinputSourcesMap.clear();\n\n\t\t\t_currentDepthNear = null;\n\t\t\t_currentDepthFar = null;\n\n\t\t\t// restore framebuffer/rendering state\n\n\t\t\trenderer.setRenderTarget( initialRenderTarget );\n\n\t\t\tglBaseLayer = null;\n\t\t\tglProjLayer = null;\n\t\t\tglBinding = null;\n\t\t\tsession = null;\n\t\t\tnewRenderTarget = null;\n\n\t\t\t//\n\n\t\t\tanimation.stop();\n\n\t\t\tscope.isPresenting = false;\n\n\t\t\tscope.dispatchEvent( { type: 'sessionend' } );\n\n\t\t}\n\n\t\tthis.setFramebufferScaleFactor = function ( value ) {\n\n\t\t\tframebufferScaleFactor = value;\n\n\t\t\tif ( scope.isPresenting === true ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebXRManager: Cannot change framebuffer scale while presenting.' );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.setReferenceSpaceType = function ( value ) {\n\n\t\t\treferenceSpaceType = value;\n\n\t\t\tif ( scope.isPresenting === true ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebXRManager: Cannot change reference space type while presenting.' );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.getReferenceSpace = function () {\n\n\t\t\treturn referenceSpace;\n\n\t\t};\n\n\t\tthis.getBaseLayer = function () {\n\n\t\t\treturn glProjLayer !== null ? glProjLayer : glBaseLayer;\n\n\t\t};\n\n\t\tthis.getBinding = function () {\n\n\t\t\treturn glBinding;\n\n\t\t};\n\n\t\tthis.getFrame = function () {\n\n\t\t\treturn xrFrame;\n\n\t\t};\n\n\t\tthis.getSession = function () {\n\n\t\t\treturn session;\n\n\t\t};\n\n\t\tthis.setSession = async function ( value ) {\n\n\t\t\tsession = value;\n\n\t\t\tif ( session !== null ) {\n\n\t\t\t\tinitialRenderTarget = renderer.getRenderTarget();\n\n\t\t\t\tsession.addEventListener( 'select', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'selectstart', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'selectend', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeeze', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeezestart', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeezeend', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'end', onSessionEnd );\n\t\t\t\tsession.addEventListener( 'inputsourceschange', onInputSourcesChange );\n\n\t\t\t\tif ( attributes.xrCompatible !== true ) {\n\n\t\t\t\t\tawait gl.makeXRCompatible();\n\n\t\t\t\t}\n\n\t\t\t\tif ( ( session.renderState.layers === undefined ) || ( renderer.capabilities.isWebGL2 === false ) ) {\n\n\t\t\t\t\tconst layerInit = {\n\t\t\t\t\t\tantialias: ( session.renderState.layers === undefined ) ? attributes.antialias : true,\n\t\t\t\t\t\talpha: attributes.alpha,\n\t\t\t\t\t\tdepth: attributes.depth,\n\t\t\t\t\t\tstencil: attributes.stencil,\n\t\t\t\t\t\tframebufferScaleFactor: framebufferScaleFactor\n\t\t\t\t\t};\n\n\t\t\t\t\tglBaseLayer = new XRWebGLLayer( session, gl, layerInit );\n\n\t\t\t\t\tsession.updateRenderState( { baseLayer: glBaseLayer } );\n\n\t\t\t\t\tnewRenderTarget = new WebGLRenderTarget(\n\t\t\t\t\t\tglBaseLayer.framebufferWidth,\n\t\t\t\t\t\tglBaseLayer.framebufferHeight,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tformat: RGBAFormat,\n\t\t\t\t\t\t\ttype: UnsignedByteType,\n\t\t\t\t\t\t\tencoding: renderer.outputEncoding\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\n\t\t\t\t} else {\n\n\t\t\t\t\tisMultisample = attributes.antialias;\n\t\t\t\t\tlet depthFormat = null;\n\t\t\t\t\tlet depthType = null;\n\t\t\t\t\tlet glDepthFormat = null;\n\n\t\t\t\t\tif ( attributes.depth ) {\n\n\t\t\t\t\t\tglDepthFormat = attributes.stencil ? gl.DEPTH24_STENCIL8 : gl.DEPTH_COMPONENT24;\n\t\t\t\t\t\tdepthFormat = attributes.stencil ? DepthStencilFormat : DepthFormat;\n\t\t\t\t\t\tdepthType = attributes.stencil ? UnsignedInt248Type : UnsignedShortType;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst projectionlayerInit = {\n\t\t\t\t\t\tcolorFormat: ( renderer.outputEncoding === sRGBEncoding ) ? gl.SRGB8_ALPHA8 : gl.RGBA8,\n\t\t\t\t\t\tdepthFormat: glDepthFormat,\n\t\t\t\t\t\tscaleFactor: framebufferScaleFactor\n\t\t\t\t\t};\n\n\t\t\t\t\tglBinding = new XRWebGLBinding( session, gl );\n\n\t\t\t\t\tglProjLayer = glBinding.createProjectionLayer( projectionlayerInit );\n\n\t\t\t\t\tsession.updateRenderState( { layers: [ glProjLayer ] } );\n\n\t\t\t\t\tif ( isMultisample ) {\n\n\t\t\t\t\t\tnewRenderTarget = new WebGLMultisampleRenderTarget(\n\t\t\t\t\t\t\tglProjLayer.textureWidth,\n\t\t\t\t\t\t\tglProjLayer.textureHeight,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tformat: RGBAFormat,\n\t\t\t\t\t\t\t\ttype: UnsignedByteType,\n\t\t\t\t\t\t\t\tdepthTexture: new DepthTexture( glProjLayer.textureWidth, glProjLayer.textureHeight, depthType, undefined, undefined, undefined, undefined, undefined, undefined, depthFormat ),\n\t\t\t\t\t\t\t\tstencilBuffer: attributes.stencil,\n\t\t\t\t\t\t\t\tignoreDepth: glProjLayer.ignoreDepthValues,\n\t\t\t\t\t\t\t\tuseRenderToTexture: hasMultisampledRenderToTexture,\n\t\t\t\t\t\t\t\tencoding: renderer.outputEncoding\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tnewRenderTarget = new WebGLRenderTarget(\n\t\t\t\t\t\t\tglProjLayer.textureWidth,\n\t\t\t\t\t\t\tglProjLayer.textureHeight,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tformat: RGBAFormat,\n\t\t\t\t\t\t\t\ttype: UnsignedByteType,\n\t\t\t\t\t\t\t\tdepthTexture: new DepthTexture( glProjLayer.textureWidth, glProjLayer.textureHeight, depthType, undefined, undefined, undefined, undefined, undefined, undefined, depthFormat ),\n\t\t\t\t\t\t\t\tstencilBuffer: attributes.stencil,\n\t\t\t\t\t\t\t\tignoreDepth: glProjLayer.ignoreDepthValues,\n\t\t\t\t\t\t\t\tencoding: renderer.outputEncoding\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tnewRenderTarget.isXRRenderTarget = true; // TODO Remove this when possible, see #23278\n\n\t\t\t\t// Set foveation to maximum.\n\t\t\t\tthis.setFoveation( 1.0 );\n\n\t\t\t\treferenceSpace = await session.requestReferenceSpace( referenceSpaceType );\n\n\t\t\t\tanimation.setContext( session );\n\t\t\t\tanimation.start();\n\n\t\t\t\tscope.isPresenting = true;\n\n\t\t\t\tscope.dispatchEvent( { type: 'sessionstart' } );\n\n\t\t\t}\n\n\t\t};\n\n\t\tfunction onInputSourcesChange( event ) {\n\n\t\t\tconst inputSources = session.inputSources;\n\n\t\t\t// Assign inputSources to available controllers\n\n\t\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\tinputSourcesMap.set( inputSources[ i ], controllers[ i ] );\n\n\t\t\t}\n\n\t\t\t// Notify disconnected\n\n\t\t\tfor ( let i = 0; i < event.removed.length; i ++ ) {\n\n\t\t\t\tconst inputSource = event.removed[ i ];\n\t\t\t\tconst controller = inputSourcesMap.get( inputSource );\n\n\t\t\t\tif ( controller ) {\n\n\t\t\t\t\tcontroller.dispatchEvent( { type: 'disconnected', data: inputSource } );\n\t\t\t\t\tinputSourcesMap.delete( inputSource );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Notify connected\n\n\t\t\tfor ( let i = 0; i < event.added.length; i ++ ) {\n\n\t\t\t\tconst inputSource = event.added[ i ];\n\t\t\t\tconst controller = inputSourcesMap.get( inputSource );\n\n\t\t\t\tif ( controller ) {\n\n\t\t\t\t\tcontroller.dispatchEvent( { type: 'connected', data: inputSource } );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst cameraLPos = new Vector3();\n\t\tconst cameraRPos = new Vector3();\n\n\t\t/**\n\t\t * Assumes 2 cameras that are parallel and share an X-axis, and that\n\t\t * the cameras' projection and world matrices have already been set.\n\t\t * And that near and far planes are identical for both cameras.\n\t\t * Visualization of this technique: https://computergraphics.stackexchange.com/a/4765\n\t\t */\n\t\tfunction setProjectionFromUnion( camera, cameraL, cameraR ) {\n\n\t\t\tcameraLPos.setFromMatrixPosition( cameraL.matrixWorld );\n\t\t\tcameraRPos.setFromMatrixPosition( cameraR.matrixWorld );\n\n\t\t\tconst ipd = cameraLPos.distanceTo( cameraRPos );\n\n\t\t\tconst projL = cameraL.projectionMatrix.elements;\n\t\t\tconst projR = cameraR.projectionMatrix.elements;\n\n\t\t\t// VR systems will have identical far and near planes, and\n\t\t\t// most likely identical top and bottom frustum extents.\n\t\t\t// Use the left camera for these values.\n\t\t\tconst near = projL[ 14 ] / ( projL[ 10 ] - 1 );\n\t\t\tconst far = projL[ 14 ] / ( projL[ 10 ] + 1 );\n\t\t\tconst topFov = ( projL[ 9 ] + 1 ) / projL[ 5 ];\n\t\t\tconst bottomFov = ( projL[ 9 ] - 1 ) / projL[ 5 ];\n\n\t\t\tconst leftFov = ( projL[ 8 ] - 1 ) / projL[ 0 ];\n\t\t\tconst rightFov = ( projR[ 8 ] + 1 ) / projR[ 0 ];\n\t\t\tconst left = near * leftFov;\n\t\t\tconst right = near * rightFov;\n\n\t\t\t// Calculate the new camera's position offset from the\n\t\t\t// left camera. xOffset should be roughly half `ipd`.\n\t\t\tconst zOffset = ipd / ( - leftFov + rightFov );\n\t\t\tconst xOffset = zOffset * - leftFov;\n\n\t\t\t// TODO: Better way to apply this offset?\n\t\t\tcameraL.matrixWorld.decompose( camera.position, camera.quaternion, camera.scale );\n\t\t\tcamera.translateX( xOffset );\n\t\t\tcamera.translateZ( zOffset );\n\t\t\tcamera.matrixWorld.compose( camera.position, camera.quaternion, camera.scale );\n\t\t\tcamera.matrixWorldInverse.copy( camera.matrixWorld ).invert();\n\n\t\t\t// Find the union of the frustum values of the cameras and scale\n\t\t\t// the values so that the near plane's position does not change in world space,\n\t\t\t// although must now be relative to the new union camera.\n\t\t\tconst near2 = near + zOffset;\n\t\t\tconst far2 = far + zOffset;\n\t\t\tconst left2 = left - xOffset;\n\t\t\tconst right2 = right + ( ipd - xOffset );\n\t\t\tconst top2 = topFov * far / far2 * near2;\n\t\t\tconst bottom2 = bottomFov * far / far2 * near2;\n\n\t\t\tcamera.projectionMatrix.makePerspective( left2, right2, top2, bottom2, near2, far2 );\n\n\t\t}\n\n\t\tfunction updateCamera( camera, parent ) {\n\n\t\t\tif ( parent === null ) {\n\n\t\t\t\tcamera.matrixWorld.copy( camera.matrix );\n\n\t\t\t} else {\n\n\t\t\t\tcamera.matrixWorld.multiplyMatrices( parent.matrixWorld, camera.matrix );\n\n\t\t\t}\n\n\t\t\tcamera.matrixWorldInverse.copy( camera.matrixWorld ).invert();\n\n\t\t}\n\n\t\tthis.updateCamera = function ( camera ) {\n\n\t\t\tif ( session === null ) return;\n\n\t\t\tcameraVR.near = cameraR.near = cameraL.near = camera.near;\n\t\t\tcameraVR.far = cameraR.far = cameraL.far = camera.far;\n\n\t\t\tif ( _currentDepthNear !== cameraVR.near || _currentDepthFar !== cameraVR.far ) {\n\n\t\t\t\t// Note that the new renderState won't apply until the next frame. See #18320\n\n\t\t\t\tsession.updateRenderState( {\n\t\t\t\t\tdepthNear: cameraVR.near,\n\t\t\t\t\tdepthFar: cameraVR.far\n\t\t\t\t} );\n\n\t\t\t\t_currentDepthNear = cameraVR.near;\n\t\t\t\t_currentDepthFar = cameraVR.far;\n\n\t\t\t}\n\n\t\t\tconst parent = camera.parent;\n\t\t\tconst cameras = cameraVR.cameras;\n\n\t\t\tupdateCamera( cameraVR, parent );\n\n\t\t\tfor ( let i = 0; i < cameras.length; i ++ ) {\n\n\t\t\t\tupdateCamera( cameras[ i ], parent );\n\n\t\t\t}\n\n\t\t\tcameraVR.matrixWorld.decompose( cameraVR.position, cameraVR.quaternion, cameraVR.scale );\n\n\t\t\t// update user camera and its children\n\n\t\t\tcamera.position.copy( cameraVR.position );\n\t\t\tcamera.quaternion.copy( cameraVR.quaternion );\n\t\t\tcamera.scale.copy( cameraVR.scale );\n\t\t\tcamera.matrix.copy( cameraVR.matrix );\n\t\t\tcamera.matrixWorld.copy( cameraVR.matrixWorld );\n\n\t\t\tconst children = camera.children;\n\n\t\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].updateMatrixWorld( true );\n\n\t\t\t}\n\n\t\t\t// update projection matrix for proper view frustum culling\n\n\t\t\tif ( cameras.length === 2 ) {\n\n\t\t\t\tsetProjectionFromUnion( cameraVR, cameraL, cameraR );\n\n\t\t\t} else {\n\n\t\t\t\t// assume single camera setup (AR)\n\n\t\t\t\tcameraVR.projectionMatrix.copy( cameraL.projectionMatrix );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.getCamera = function () {\n\n\t\t\treturn cameraVR;\n\n\t\t};\n\n\t\tthis.getFoveation = function () {\n\n\t\t\tif ( glProjLayer !== null ) {\n\n\t\t\t\treturn glProjLayer.fixedFoveation;\n\n\t\t\t}\n\n\t\t\tif ( glBaseLayer !== null ) {\n\n\t\t\t\treturn glBaseLayer.fixedFoveation;\n\n\t\t\t}\n\n\t\t\treturn undefined;\n\n\t\t};\n\n\t\tthis.setFoveation = function ( foveation ) {\n\n\t\t\t// 0 = no foveation = full resolution\n\t\t\t// 1 = maximum foveation = the edges render at lower resolution\n\n\t\t\tif ( glProjLayer !== null ) {\n\n\t\t\t\tglProjLayer.fixedFoveation = foveation;\n\n\t\t\t}\n\n\t\t\tif ( glBaseLayer !== null && glBaseLayer.fixedFoveation !== undefined ) {\n\n\t\t\t\tglBaseLayer.fixedFoveation = foveation;\n\n\t\t\t}\n\n\t\t};\n\n\t\t// Animation Loop\n\n\t\tlet onAnimationFrameCallback = null;\n\n\t\tfunction onAnimationFrame( time, frame ) {\n\n\t\t\tpose = frame.getViewerPose( referenceSpace );\n\t\t\txrFrame = frame;\n\n\t\t\tif ( pose !== null ) {\n\n\t\t\t\tconst views = pose.views;\n\n\t\t\t\tif ( glBaseLayer !== null ) {\n\n\t\t\t\t\trenderer.setRenderTargetFramebuffer( newRenderTarget, glBaseLayer.framebuffer );\n\t\t\t\t\trenderer.setRenderTarget( newRenderTarget );\n\n\t\t\t\t}\n\n\t\t\t\tlet cameraVRNeedsUpdate = false;\n\n\t\t\t\t// check if it's necessary to rebuild cameraVR's camera list\n\n\t\t\t\tif ( views.length !== cameraVR.cameras.length ) {\n\n\t\t\t\t\tcameraVR.cameras.length = 0;\n\t\t\t\t\tcameraVRNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < views.length; i ++ ) {\n\n\t\t\t\t\tconst view = views[ i ];\n\n\t\t\t\t\tlet viewport = null;\n\n\t\t\t\t\tif ( glBaseLayer !== null ) {\n\n\t\t\t\t\t\tviewport = glBaseLayer.getViewport( view );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst glSubImage = glBinding.getViewSubImage( glProjLayer, view );\n\t\t\t\t\t\tviewport = glSubImage.viewport;\n\n\t\t\t\t\t\t// For side-by-side projection, we only produce a single texture for both eyes.\n\t\t\t\t\t\tif ( i === 0 ) {\n\n\t\t\t\t\t\t\trenderer.setRenderTargetTextures(\n\t\t\t\t\t\t\t\tnewRenderTarget,\n\t\t\t\t\t\t\t\tglSubImage.colorTexture,\n\t\t\t\t\t\t\t\tglProjLayer.ignoreDepthValues ? undefined : glSubImage.depthStencilTexture );\n\n\t\t\t\t\t\t\trenderer.setRenderTarget( newRenderTarget );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst camera = cameras[ i ];\n\n\t\t\t\t\tcamera.matrix.fromArray( view.transform.matrix );\n\t\t\t\t\tcamera.projectionMatrix.fromArray( view.projectionMatrix );\n\t\t\t\t\tcamera.viewport.set( viewport.x, viewport.y, viewport.width, viewport.height );\n\n\t\t\t\t\tif ( i === 0 ) {\n\n\t\t\t\t\t\tcameraVR.matrix.copy( camera.matrix );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( cameraVRNeedsUpdate === true ) {\n\n\t\t\t\t\t\tcameraVR.cameras.push( camera );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tconst inputSources = session.inputSources;\n\n\t\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\tconst controller = controllers[ i ];\n\t\t\t\tconst inputSource = inputSources[ i ];\n\n\t\t\t\tcontroller.update( inputSource, frame, referenceSpace );\n\n\t\t\t}\n\n\t\t\tif ( onAnimationFrameCallback ) onAnimationFrameCallback( time, frame );\n\n\t\t\txrFrame = null;\n\n\t\t}\n\n\t\tconst animation = new WebGLAnimation();\n\n\t\tanimation.setAnimationLoop( onAnimationFrame );\n\n\t\tthis.setAnimationLoop = function ( callback ) {\n\n\t\t\tonAnimationFrameCallback = callback;\n\n\t\t};\n\n\t\tthis.dispose = function () {};\n\n\t}\n\n}\n\nexport { WebXRManager };\n","import { BackSide } from '../../constants.js';\n\nfunction WebGLMaterials( properties ) {\n\n\tfunction refreshFogUniforms( uniforms, fog ) {\n\n\t\tuniforms.fogColor.value.copy( fog.color );\n\n\t\tif ( fog.isFog ) {\n\n\t\t\tuniforms.fogNear.value = fog.near;\n\t\t\tuniforms.fogFar.value = fog.far;\n\n\t\t} else if ( fog.isFogExp2 ) {\n\n\t\t\tuniforms.fogDensity.value = fog.density;\n\n\t\t}\n\n\t}\n\n\tfunction refreshMaterialUniforms( uniforms, material, pixelRatio, height, transmissionRenderTarget ) {\n\n\t\tif ( material.isMeshBasicMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshLambertMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsLambert( uniforms, material );\n\n\t\t} else if ( material.isMeshToonMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsToon( uniforms, material );\n\n\t\t} else if ( material.isMeshPhongMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsPhong( uniforms, material );\n\n\t\t} else if ( material.isMeshStandardMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t\tif ( material.isMeshPhysicalMaterial ) {\n\n\t\t\t\trefreshUniformsPhysical( uniforms, material, transmissionRenderTarget );\n\n\t\t\t} else {\n\n\t\t\t\trefreshUniformsStandard( uniforms, material );\n\n\t\t\t}\n\n\t\t} else if ( material.isMeshMatcapMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsMatcap( uniforms, material );\n\n\t\t} else if ( material.isMeshDepthMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsDepth( uniforms, material );\n\n\t\t} else if ( material.isMeshDistanceMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsDistance( uniforms, material );\n\n\t\t} else if ( material.isMeshNormalMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsNormal( uniforms, material );\n\n\t\t} else if ( material.isLineBasicMaterial ) {\n\n\t\t\trefreshUniformsLine( uniforms, material );\n\n\t\t\tif ( material.isLineDashedMaterial ) {\n\n\t\t\t\trefreshUniformsDash( uniforms, material );\n\n\t\t\t}\n\n\t\t} else if ( material.isPointsMaterial ) {\n\n\t\t\trefreshUniformsPoints( uniforms, material, pixelRatio, height );\n\n\t\t} else if ( material.isSpriteMaterial ) {\n\n\t\t\trefreshUniformsSprites( uniforms, material );\n\n\t\t} else if ( material.isShadowMaterial ) {\n\n\t\t\tuniforms.color.value.copy( material.color );\n\t\t\tuniforms.opacity.value = material.opacity;\n\n\t\t} else if ( material.isShaderMaterial ) {\n\n\t\t\tmaterial.uniformsNeedUpdate = false; // #15581\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsCommon( uniforms, material ) {\n\n\t\tuniforms.opacity.value = material.opacity;\n\n\t\tif ( material.color ) {\n\n\t\t\tuniforms.diffuse.value.copy( material.color );\n\n\t\t}\n\n\t\tif ( material.emissive ) {\n\n\t\t\tuniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity );\n\n\t\t}\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t}\n\n\t\tif ( material.specularMap ) {\n\n\t\t\tuniforms.specularMap.value = material.specularMap;\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t\tconst envMap = properties.get( material ).envMap;\n\n\t\tif ( envMap ) {\n\n\t\t\tuniforms.envMap.value = envMap;\n\n\t\t\tuniforms.flipEnvMap.value = ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) ? - 1 : 1;\n\n\t\t\tuniforms.reflectivity.value = material.reflectivity;\n\t\t\tuniforms.ior.value = material.ior;\n\t\t\tuniforms.refractionRatio.value = material.refractionRatio;\n\n\t\t}\n\n\t\tif ( material.lightMap ) {\n\n\t\t\tuniforms.lightMap.value = material.lightMap;\n\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity;\n\n\t\t}\n\n\t\tif ( material.aoMap ) {\n\n\t\t\tuniforms.aoMap.value = material.aoMap;\n\t\t\tuniforms.aoMapIntensity.value = material.aoMapIntensity;\n\n\t\t}\n\n\t\t// uv repeat and offset setting priorities\n\t\t// 1. color map\n\t\t// 2. specular map\n\t\t// 3. displacementMap map\n\t\t// 4. normal map\n\t\t// 5. bump map\n\t\t// 6. roughnessMap map\n\t\t// 7. metalnessMap map\n\t\t// 8. alphaMap map\n\t\t// 9. emissiveMap map\n\t\t// 10. clearcoat map\n\t\t// 11. clearcoat normal map\n\t\t// 12. clearcoat roughnessMap map\n\t\t// 13. specular intensity map\n\t\t// 14. specular tint map\n\t\t// 15. transmission map\n\t\t// 16. thickness map\n\n\t\tlet uvScaleMap;\n\n\t\tif ( material.map ) {\n\n\t\t\tuvScaleMap = material.map;\n\n\t\t} else if ( material.specularMap ) {\n\n\t\t\tuvScaleMap = material.specularMap;\n\n\t\t} else if ( material.displacementMap ) {\n\n\t\t\tuvScaleMap = material.displacementMap;\n\n\t\t} else if ( material.normalMap ) {\n\n\t\t\tuvScaleMap = material.normalMap;\n\n\t\t} else if ( material.bumpMap ) {\n\n\t\t\tuvScaleMap = material.bumpMap;\n\n\t\t} else if ( material.roughnessMap ) {\n\n\t\t\tuvScaleMap = material.roughnessMap;\n\n\t\t} else if ( material.metalnessMap ) {\n\n\t\t\tuvScaleMap = material.metalnessMap;\n\n\t\t} else if ( material.alphaMap ) {\n\n\t\t\tuvScaleMap = material.alphaMap;\n\n\t\t} else if ( material.emissiveMap ) {\n\n\t\t\tuvScaleMap = material.emissiveMap;\n\n\t\t} else if ( material.clearcoatMap ) {\n\n\t\t\tuvScaleMap = material.clearcoatMap;\n\n\t\t} else if ( material.clearcoatNormalMap ) {\n\n\t\t\tuvScaleMap = material.clearcoatNormalMap;\n\n\t\t} else if ( material.clearcoatRoughnessMap ) {\n\n\t\t\tuvScaleMap = material.clearcoatRoughnessMap;\n\n\t\t} else if ( material.specularIntensityMap ) {\n\n\t\t\tuvScaleMap = material.specularIntensityMap;\n\n\t\t} else if ( material.specularColorMap ) {\n\n\t\t\tuvScaleMap = material.specularColorMap;\n\n\t\t} else if ( material.transmissionMap ) {\n\n\t\t\tuvScaleMap = material.transmissionMap;\n\n\t\t} else if ( material.thicknessMap ) {\n\n\t\t\tuvScaleMap = material.thicknessMap;\n\n\t\t} else if ( material.sheenColorMap ) {\n\n\t\t\tuvScaleMap = material.sheenColorMap;\n\n\t\t} else if ( material.sheenRoughnessMap ) {\n\n\t\t\tuvScaleMap = material.sheenRoughnessMap;\n\n\t\t}\n\n\t\tif ( uvScaleMap !== undefined ) {\n\n\t\t\t// backwards compatibility\n\t\t\tif ( uvScaleMap.isWebGLRenderTarget ) {\n\n\t\t\t\tuvScaleMap = uvScaleMap.texture;\n\n\t\t\t}\n\n\t\t\tif ( uvScaleMap.matrixAutoUpdate === true ) {\n\n\t\t\t\tuvScaleMap.updateMatrix();\n\n\t\t\t}\n\n\t\t\tuniforms.uvTransform.value.copy( uvScaleMap.matrix );\n\n\t\t}\n\n\t\t// uv repeat and offset setting priorities for uv2\n\t\t// 1. ao map\n\t\t// 2. light map\n\n\t\tlet uv2ScaleMap;\n\n\t\tif ( material.aoMap ) {\n\n\t\t\tuv2ScaleMap = material.aoMap;\n\n\t\t} else if ( material.lightMap ) {\n\n\t\t\tuv2ScaleMap = material.lightMap;\n\n\t\t}\n\n\t\tif ( uv2ScaleMap !== undefined ) {\n\n\t\t\t// backwards compatibility\n\t\t\tif ( uv2ScaleMap.isWebGLRenderTarget ) {\n\n\t\t\t\tuv2ScaleMap = uv2ScaleMap.texture;\n\n\t\t\t}\n\n\t\t\tif ( uv2ScaleMap.matrixAutoUpdate === true ) {\n\n\t\t\t\tuv2ScaleMap.updateMatrix();\n\n\t\t\t}\n\n\t\t\tuniforms.uv2Transform.value.copy( uv2ScaleMap.matrix );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsLine( uniforms, material ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\n\t}\n\n\tfunction refreshUniformsDash( uniforms, material ) {\n\n\t\tuniforms.dashSize.value = material.dashSize;\n\t\tuniforms.totalSize.value = material.dashSize + material.gapSize;\n\t\tuniforms.scale.value = material.scale;\n\n\t}\n\n\tfunction refreshUniformsPoints( uniforms, material, pixelRatio, height ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\t\tuniforms.size.value = material.size * pixelRatio;\n\t\tuniforms.scale.value = height * 0.5;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t\t// uv repeat and offset setting priorities\n\t\t// 1. color map\n\t\t// 2. alpha map\n\n\t\tlet uvScaleMap;\n\n\t\tif ( material.map ) {\n\n\t\t\tuvScaleMap = material.map;\n\n\t\t} else if ( material.alphaMap ) {\n\n\t\t\tuvScaleMap = material.alphaMap;\n\n\t\t}\n\n\t\tif ( uvScaleMap !== undefined ) {\n\n\t\t\tif ( uvScaleMap.matrixAutoUpdate === true ) {\n\n\t\t\t\tuvScaleMap.updateMatrix();\n\n\t\t\t}\n\n\t\t\tuniforms.uvTransform.value.copy( uvScaleMap.matrix );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsSprites( uniforms, material ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\t\tuniforms.rotation.value = material.rotation;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t\t// uv repeat and offset setting priorities\n\t\t// 1. color map\n\t\t// 2. alpha map\n\n\t\tlet uvScaleMap;\n\n\t\tif ( material.map ) {\n\n\t\t\tuvScaleMap = material.map;\n\n\t\t} else if ( material.alphaMap ) {\n\n\t\t\tuvScaleMap = material.alphaMap;\n\n\t\t}\n\n\t\tif ( uvScaleMap !== undefined ) {\n\n\t\t\tif ( uvScaleMap.matrixAutoUpdate === true ) {\n\n\t\t\t\tuvScaleMap.updateMatrix();\n\n\t\t\t}\n\n\t\t\tuniforms.uvTransform.value.copy( uvScaleMap.matrix );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsLambert( uniforms, material ) {\n\n\t\tif ( material.emissiveMap ) {\n\n\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsPhong( uniforms, material ) {\n\n\t\tuniforms.specular.value.copy( material.specular );\n\t\tuniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 )\n\n\t\tif ( material.emissiveMap ) {\n\n\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t}\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\t\t\tif ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;\n\n\t\t}\n\n\t\tif ( material.normalMap ) {\n\n\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\t\t\tif ( material.side === BackSide ) uniforms.normalScale.value.negate();\n\n\t\t}\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsToon( uniforms, material ) {\n\n\t\tif ( material.gradientMap ) {\n\n\t\t\tuniforms.gradientMap.value = material.gradientMap;\n\n\t\t}\n\n\t\tif ( material.emissiveMap ) {\n\n\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t}\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\t\t\tif ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;\n\n\t\t}\n\n\t\tif ( material.normalMap ) {\n\n\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\t\t\tif ( material.side === BackSide ) uniforms.normalScale.value.negate();\n\n\t\t}\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsStandard( uniforms, material ) {\n\n\t\tuniforms.roughness.value = material.roughness;\n\t\tuniforms.metalness.value = material.metalness;\n\n\t\tif ( material.roughnessMap ) {\n\n\t\t\tuniforms.roughnessMap.value = material.roughnessMap;\n\n\t\t}\n\n\t\tif ( material.metalnessMap ) {\n\n\t\t\tuniforms.metalnessMap.value = material.metalnessMap;\n\n\t\t}\n\n\t\tif ( material.emissiveMap ) {\n\n\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t}\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\t\t\tif ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;\n\n\t\t}\n\n\t\tif ( material.normalMap ) {\n\n\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\t\t\tif ( material.side === BackSide ) uniforms.normalScale.value.negate();\n\n\t\t}\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t\tconst envMap = properties.get( material ).envMap;\n\n\t\tif ( envMap ) {\n\n\t\t\t//uniforms.envMap.value = material.envMap; // part of uniforms common\n\t\t\tuniforms.envMapIntensity.value = material.envMapIntensity;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsPhysical( uniforms, material, transmissionRenderTarget ) {\n\n\t\trefreshUniformsStandard( uniforms, material );\n\n\t\tuniforms.ior.value = material.ior; // also part of uniforms common\n\n\t\tif ( material.sheen > 0 ) {\n\n\t\t\tuniforms.sheenColor.value.copy( material.sheenColor ).multiplyScalar( material.sheen );\n\n\t\t\tuniforms.sheenRoughness.value = material.sheenRoughness;\n\n\t\t\tif ( material.sheenColorMap ) {\n\n\t\t\t\tuniforms.sheenColorMap.value = material.sheenColorMap;\n\n\t\t\t}\n\n\t\t\tif ( material.sheenRoughnessMap ) {\n\n\t\t\t\tuniforms.sheenRoughnessMap.value = material.sheenRoughnessMap;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.clearcoat > 0 ) {\n\n\t\t\tuniforms.clearcoat.value = material.clearcoat;\n\t\t\tuniforms.clearcoatRoughness.value = material.clearcoatRoughness;\n\n\t\t\tif ( material.clearcoatMap ) {\n\n\t\t\t\tuniforms.clearcoatMap.value = material.clearcoatMap;\n\n\t\t\t}\n\n\t\t\tif ( material.clearcoatRoughnessMap ) {\n\n\t\t\t\tuniforms.clearcoatRoughnessMap.value = material.clearcoatRoughnessMap;\n\n\t\t\t}\n\n\t\t\tif ( material.clearcoatNormalMap ) {\n\n\t\t\t\tuniforms.clearcoatNormalScale.value.copy( material.clearcoatNormalScale );\n\t\t\t\tuniforms.clearcoatNormalMap.value = material.clearcoatNormalMap;\n\n\t\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\t\tuniforms.clearcoatNormalScale.value.negate();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.transmission > 0 ) {\n\n\t\t\tuniforms.transmission.value = material.transmission;\n\t\t\tuniforms.transmissionSamplerMap.value = transmissionRenderTarget.texture;\n\t\t\tuniforms.transmissionSamplerSize.value.set( transmissionRenderTarget.width, transmissionRenderTarget.height );\n\n\t\t\tif ( material.transmissionMap ) {\n\n\t\t\t\tuniforms.transmissionMap.value = material.transmissionMap;\n\n\t\t\t}\n\n\t\t\tuniforms.thickness.value = material.thickness;\n\n\t\t\tif ( material.thicknessMap ) {\n\n\t\t\t\tuniforms.thicknessMap.value = material.thicknessMap;\n\n\t\t\t}\n\n\t\t\tuniforms.attenuationDistance.value = material.attenuationDistance;\n\t\t\tuniforms.attenuationColor.value.copy( material.attenuationColor );\n\n\t\t}\n\n\t\tuniforms.specularIntensity.value = material.specularIntensity;\n\t\tuniforms.specularColor.value.copy( material.specularColor );\n\n\t\tif ( material.specularIntensityMap ) {\n\n\t\t\tuniforms.specularIntensityMap.value = material.specularIntensityMap;\n\n\t\t}\n\n\t\tif ( material.specularColorMap ) {\n\n\t\t\tuniforms.specularColorMap.value = material.specularColorMap;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsMatcap( uniforms, material ) {\n\n\t\tif ( material.matcap ) {\n\n\t\t\tuniforms.matcap.value = material.matcap;\n\n\t\t}\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\t\t\tif ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;\n\n\t\t}\n\n\t\tif ( material.normalMap ) {\n\n\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\t\t\tif ( material.side === BackSide ) uniforms.normalScale.value.negate();\n\n\t\t}\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsDepth( uniforms, material ) {\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsDistance( uniforms, material ) {\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t\tuniforms.referencePosition.value.copy( material.referencePosition );\n\t\tuniforms.nearDistance.value = material.nearDistance;\n\t\tuniforms.farDistance.value = material.farDistance;\n\n\t}\n\n\tfunction refreshUniformsNormal( uniforms, material ) {\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\t\t\tif ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;\n\n\t\t}\n\n\t\tif ( material.normalMap ) {\n\n\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\t\t\tif ( material.side === BackSide ) uniforms.normalScale.value.negate();\n\n\t\t}\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\trefreshFogUniforms: refreshFogUniforms,\n\t\trefreshMaterialUniforms: refreshMaterialUniforms\n\t};\n\n}\n\nexport { WebGLMaterials };\n","import {\n\tREVISION,\n\tBackSide,\n\tDoubleSide,\n\tFrontSide,\n\tRGBAFormat,\n\tHalfFloatType,\n\tFloatType,\n\tUnsignedByteType,\n\tLinearEncoding,\n\tNoToneMapping,\n\tLinearMipmapLinearFilter,\n\tNearestFilter,\n\tClampToEdgeWrapping\n} from '../constants.js';\nimport { Frustum } from '../math/Frustum.js';\nimport { Matrix4 } from '../math/Matrix4.js';\nimport { Vector3 } from '../math/Vector3.js';\nimport { Vector4 } from '../math/Vector4.js';\nimport { WebGLAnimation } from './webgl/WebGLAnimation.js';\nimport { WebGLAttributes } from './webgl/WebGLAttributes.js';\nimport { WebGLBackground } from './webgl/WebGLBackground.js';\nimport { WebGLBindingStates } from './webgl/WebGLBindingStates.js';\nimport { WebGLBufferRenderer } from './webgl/WebGLBufferRenderer.js';\nimport { WebGLCapabilities } from './webgl/WebGLCapabilities.js';\nimport { WebGLClipping } from './webgl/WebGLClipping.js';\nimport { WebGLCubeMaps } from './webgl/WebGLCubeMaps.js';\nimport { WebGLCubeUVMaps } from './webgl/WebGLCubeUVMaps.js';\nimport { WebGLExtensions } from './webgl/WebGLExtensions.js';\nimport { WebGLGeometries } from './webgl/WebGLGeometries.js';\nimport { WebGLIndexedBufferRenderer } from './webgl/WebGLIndexedBufferRenderer.js';\nimport { WebGLInfo } from './webgl/WebGLInfo.js';\nimport { WebGLMorphtargets } from './webgl/WebGLMorphtargets.js';\nimport { WebGLMultisampleRenderTarget } from './WebGLMultisampleRenderTarget.js';\nimport { WebGLObjects } from './webgl/WebGLObjects.js';\nimport { WebGLPrograms } from './webgl/WebGLPrograms.js';\nimport { WebGLProperties } from './webgl/WebGLProperties.js';\nimport { WebGLRenderLists } from './webgl/WebGLRenderLists.js';\nimport { WebGLRenderStates } from './webgl/WebGLRenderStates.js';\nimport { WebGLRenderTarget } from './WebGLRenderTarget.js';\nimport { WebGLShadowMap } from './webgl/WebGLShadowMap.js';\nimport { WebGLState } from './webgl/WebGLState.js';\nimport { WebGLTextures } from './webgl/WebGLTextures.js';\nimport { WebGLUniforms } from './webgl/WebGLUniforms.js';\nimport { WebGLUtils } from './webgl/WebGLUtils.js';\nimport { WebXRManager } from './webxr/WebXRManager.js';\nimport { WebGLMaterials } from './webgl/WebGLMaterials.js';\nimport { createElementNS } from '../utils.js';\n\nfunction createCanvasElement() {\n\n\tconst canvas = createElementNS( 'canvas' );\n\tcanvas.style.display = 'block';\n\treturn canvas;\n\n}\n\nfunction WebGLRenderer( parameters = {} ) {\n\n\tconst _canvas = parameters.canvas !== undefined ? parameters.canvas : createCanvasElement(),\n\t\t_context = parameters.context !== undefined ? parameters.context : null,\n\n\t\t_alpha = parameters.alpha !== undefined ? parameters.alpha : false,\n\t\t_depth = parameters.depth !== undefined ? parameters.depth : true,\n\t\t_stencil = parameters.stencil !== undefined ? parameters.stencil : true,\n\t\t_antialias = parameters.antialias !== undefined ? parameters.antialias : false,\n\t\t_premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true,\n\t\t_preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false,\n\t\t_powerPreference = parameters.powerPreference !== undefined ? parameters.powerPreference : 'default',\n\t\t_failIfMajorPerformanceCaveat = parameters.failIfMajorPerformanceCaveat !== undefined ? parameters.failIfMajorPerformanceCaveat : false;\n\n\tlet currentRenderList = null;\n\tlet currentRenderState = null;\n\n\t// render() can be called from within a callback triggered by another render.\n\t// We track this so that the nested render call gets its list and state isolated from the parent render call.\n\n\tconst renderListStack = [];\n\tconst renderStateStack = [];\n\n\t// public properties\n\n\tthis.domElement = _canvas;\n\n\t// Debug configuration container\n\tthis.debug = {\n\n\t\t/**\n\t\t * Enables error checking and reporting when shader programs are being compiled\n\t\t * @type {boolean}\n\t\t */\n\t\tcheckShaderErrors: true\n\t};\n\n\t// clearing\n\n\tthis.autoClear = true;\n\tthis.autoClearColor = true;\n\tthis.autoClearDepth = true;\n\tthis.autoClearStencil = true;\n\n\t// scene graph\n\n\tthis.sortObjects = true;\n\n\t// user-defined clipping\n\n\tthis.clippingPlanes = [];\n\tthis.localClippingEnabled = false;\n\n\t// physically based shading\n\n\tthis.outputEncoding = LinearEncoding;\n\n\t// physical lights\n\n\tthis.physicallyCorrectLights = false;\n\n\t// tone mapping\n\n\tthis.toneMapping = NoToneMapping;\n\tthis.toneMappingExposure = 1.0;\n\n\t// internal properties\n\n\tconst _this = this;\n\n\tlet _isContextLost = false;\n\n\t// internal state cache\n\n\tlet _currentActiveCubeFace = 0;\n\tlet _currentActiveMipmapLevel = 0;\n\tlet _currentRenderTarget = null;\n\tlet _currentMaterialId = - 1;\n\n\tlet _currentCamera = null;\n\n\tconst _currentViewport = new Vector4();\n\tconst _currentScissor = new Vector4();\n\tlet _currentScissorTest = null;\n\n\t//\n\n\tlet _width = _canvas.width;\n\tlet _height = _canvas.height;\n\n\tlet _pixelRatio = 1;\n\tlet _opaqueSort = null;\n\tlet _transparentSort = null;\n\n\tconst _viewport = new Vector4( 0, 0, _width, _height );\n\tconst _scissor = new Vector4( 0, 0, _width, _height );\n\tlet _scissorTest = false;\n\n\t// frustum\n\n\tconst _frustum = new Frustum();\n\n\t// clipping\n\n\tlet _clippingEnabled = false;\n\tlet _localClippingEnabled = false;\n\n\t// transmission\n\n\tlet _transmissionRenderTarget = null;\n\n\t// camera matrices cache\n\n\tconst _projScreenMatrix = new Matrix4();\n\n\tconst _vector3 = new Vector3();\n\n\tconst _emptyScene = { background: null, fog: null, environment: null, overrideMaterial: null, isScene: true };\n\n\tfunction getTargetPixelRatio() {\n\n\t\treturn _currentRenderTarget === null ? _pixelRatio : 1;\n\n\t}\n\n\t// initialize\n\n\tlet _gl = _context;\n\n\tfunction getContext( contextNames, contextAttributes ) {\n\n\t\tfor ( let i = 0; i < contextNames.length; i ++ ) {\n\n\t\t\tconst contextName = contextNames[ i ];\n\t\t\tconst context = _canvas.getContext( contextName, contextAttributes );\n\t\t\tif ( context !== null ) return context;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\ttry {\n\n\t\tconst contextAttributes = {\n\t\t\talpha: true,\n\t\t\tdepth: _depth,\n\t\t\tstencil: _stencil,\n\t\t\tantialias: _antialias,\n\t\t\tpremultipliedAlpha: _premultipliedAlpha,\n\t\t\tpreserveDrawingBuffer: _preserveDrawingBuffer,\n\t\t\tpowerPreference: _powerPreference,\n\t\t\tfailIfMajorPerformanceCaveat: _failIfMajorPerformanceCaveat\n\t\t};\n\n\t\t// OffscreenCanvas does not have setAttribute, see #22811\n\t\tif ( 'setAttribute' in _canvas ) _canvas.setAttribute( 'data-engine', `three.js r${REVISION}` );\n\n\t\t// event listeners must be registered before WebGL context is created, see #12753\n\t\t_canvas.addEventListener( 'webglcontextlost', onContextLost, false );\n\t\t_canvas.addEventListener( 'webglcontextrestored', onContextRestore, false );\n\n\t\tif ( _gl === null ) {\n\n\t\t\tconst contextNames = [ 'webgl2', 'webgl', 'experimental-webgl' ];\n\n\t\t\tif ( _this.isWebGL1Renderer === true ) {\n\n\t\t\t\tcontextNames.shift();\n\n\t\t\t}\n\n\t\t\t_gl = getContext( contextNames, contextAttributes );\n\n\t\t\tif ( _gl === null ) {\n\n\t\t\t\tif ( getContext( contextNames ) ) {\n\n\t\t\t\t\tthrow new Error( 'Error creating WebGL context with your selected attributes.' );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( 'Error creating WebGL context.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Some experimental-webgl implementations do not have getShaderPrecisionFormat\n\n\t\tif ( _gl.getShaderPrecisionFormat === undefined ) {\n\n\t\t\t_gl.getShaderPrecisionFormat = function () {\n\n\t\t\t\treturn { 'rangeMin': 1, 'rangeMax': 1, 'precision': 1 };\n\n\t\t\t};\n\n\t\t}\n\n\t} catch ( error ) {\n\n\t\tconsole.error( 'THREE.WebGLRenderer: ' + error.message );\n\t\tthrow error;\n\n\t}\n\n\tlet extensions, capabilities, state, info;\n\tlet properties, textures, cubemaps, cubeuvmaps, attributes, geometries, objects;\n\tlet programCache, materials, renderLists, renderStates, clipping, shadowMap;\n\n\tlet background, morphtargets, bufferRenderer, indexedBufferRenderer;\n\n\tlet utils, bindingStates;\n\n\tfunction initGLContext() {\n\n\t\textensions = new WebGLExtensions( _gl );\n\n\t\tcapabilities = new WebGLCapabilities( _gl, extensions, parameters );\n\n\t\textensions.init( capabilities );\n\n\t\tutils = new WebGLUtils( _gl, extensions, capabilities );\n\n\t\tstate = new WebGLState( _gl, extensions, capabilities );\n\n\t\tinfo = new WebGLInfo( _gl );\n\t\tproperties = new WebGLProperties();\n\t\ttextures = new WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info );\n\t\tcubemaps = new WebGLCubeMaps( _this );\n\t\tcubeuvmaps = new WebGLCubeUVMaps( _this );\n\t\tattributes = new WebGLAttributes( _gl, capabilities );\n\t\tbindingStates = new WebGLBindingStates( _gl, extensions, attributes, capabilities );\n\t\tgeometries = new WebGLGeometries( _gl, attributes, info, bindingStates );\n\t\tobjects = new WebGLObjects( _gl, geometries, attributes, info );\n\t\tmorphtargets = new WebGLMorphtargets( _gl, capabilities, textures );\n\t\tclipping = new WebGLClipping( properties );\n\t\tprogramCache = new WebGLPrograms( _this, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping );\n\t\tmaterials = new WebGLMaterials( properties );\n\t\trenderLists = new WebGLRenderLists();\n\t\trenderStates = new WebGLRenderStates( extensions, capabilities );\n\t\tbackground = new WebGLBackground( _this, cubemaps, state, objects, _alpha, _premultipliedAlpha );\n\t\tshadowMap = new WebGLShadowMap( _this, objects, capabilities );\n\n\t\tbufferRenderer = new WebGLBufferRenderer( _gl, extensions, info, capabilities );\n\t\tindexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, info, capabilities );\n\n\t\tinfo.programs = programCache.programs;\n\n\t\t_this.capabilities = capabilities;\n\t\t_this.extensions = extensions;\n\t\t_this.properties = properties;\n\t\t_this.renderLists = renderLists;\n\t\t_this.shadowMap = shadowMap;\n\t\t_this.state = state;\n\t\t_this.info = info;\n\n\t}\n\n\tinitGLContext();\n\n\t// xr\n\n\tconst xr = new WebXRManager( _this, _gl );\n\n\tthis.xr = xr;\n\n\t// API\n\n\tthis.getContext = function () {\n\n\t\treturn _gl;\n\n\t};\n\n\tthis.getContextAttributes = function () {\n\n\t\treturn _gl.getContextAttributes();\n\n\t};\n\n\tthis.forceContextLoss = function () {\n\n\t\tconst extension = extensions.get( 'WEBGL_lose_context' );\n\t\tif ( extension ) extension.loseContext();\n\n\t};\n\n\tthis.forceContextRestore = function () {\n\n\t\tconst extension = extensions.get( 'WEBGL_lose_context' );\n\t\tif ( extension ) extension.restoreContext();\n\n\t};\n\n\tthis.getPixelRatio = function () {\n\n\t\treturn _pixelRatio;\n\n\t};\n\n\tthis.setPixelRatio = function ( value ) {\n\n\t\tif ( value === undefined ) return;\n\n\t\t_pixelRatio = value;\n\n\t\tthis.setSize( _width, _height, false );\n\n\t};\n\n\tthis.getSize = function ( target ) {\n\n\t\treturn target.set( _width, _height );\n\n\t};\n\n\tthis.setSize = function ( width, height, updateStyle ) {\n\n\t\tif ( xr.isPresenting ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: Can\\'t change size while VR device is presenting.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\t_width = width;\n\t\t_height = height;\n\n\t\t_canvas.width = Math.floor( width * _pixelRatio );\n\t\t_canvas.height = Math.floor( height * _pixelRatio );\n\n\t\tif ( updateStyle !== false ) {\n\n\t\t\t_canvas.style.width = width + 'px';\n\t\t\t_canvas.style.height = height + 'px';\n\n\t\t}\n\n\t\tthis.setViewport( 0, 0, width, height );\n\n\t};\n\n\tthis.getDrawingBufferSize = function ( target ) {\n\n\t\treturn target.set( _width * _pixelRatio, _height * _pixelRatio ).floor();\n\n\t};\n\n\tthis.setDrawingBufferSize = function ( width, height, pixelRatio ) {\n\n\t\t_width = width;\n\t\t_height = height;\n\n\t\t_pixelRatio = pixelRatio;\n\n\t\t_canvas.width = Math.floor( width * pixelRatio );\n\t\t_canvas.height = Math.floor( height * pixelRatio );\n\n\t\tthis.setViewport( 0, 0, width, height );\n\n\t};\n\n\tthis.getCurrentViewport = function ( target ) {\n\n\t\treturn target.copy( _currentViewport );\n\n\t};\n\n\tthis.getViewport = function ( target ) {\n\n\t\treturn target.copy( _viewport );\n\n\t};\n\n\tthis.setViewport = function ( x, y, width, height ) {\n\n\t\tif ( x.isVector4 ) {\n\n\t\t\t_viewport.set( x.x, x.y, x.z, x.w );\n\n\t\t} else {\n\n\t\t\t_viewport.set( x, y, width, height );\n\n\t\t}\n\n\t\tstate.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).floor() );\n\n\t};\n\n\tthis.getScissor = function ( target ) {\n\n\t\treturn target.copy( _scissor );\n\n\t};\n\n\tthis.setScissor = function ( x, y, width, height ) {\n\n\t\tif ( x.isVector4 ) {\n\n\t\t\t_scissor.set( x.x, x.y, x.z, x.w );\n\n\t\t} else {\n\n\t\t\t_scissor.set( x, y, width, height );\n\n\t\t}\n\n\t\tstate.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).floor() );\n\n\t};\n\n\tthis.getScissorTest = function () {\n\n\t\treturn _scissorTest;\n\n\t};\n\n\tthis.setScissorTest = function ( boolean ) {\n\n\t\tstate.setScissorTest( _scissorTest = boolean );\n\n\t};\n\n\tthis.setOpaqueSort = function ( method ) {\n\n\t\t_opaqueSort = method;\n\n\t};\n\n\tthis.setTransparentSort = function ( method ) {\n\n\t\t_transparentSort = method;\n\n\t};\n\n\t// Clearing\n\n\tthis.getClearColor = function ( target ) {\n\n\t\treturn target.copy( background.getClearColor() );\n\n\t};\n\n\tthis.setClearColor = function () {\n\n\t\tbackground.setClearColor.apply( background, arguments );\n\n\t};\n\n\tthis.getClearAlpha = function () {\n\n\t\treturn background.getClearAlpha();\n\n\t};\n\n\tthis.setClearAlpha = function () {\n\n\t\tbackground.setClearAlpha.apply( background, arguments );\n\n\t};\n\n\tthis.clear = function ( color, depth, stencil ) {\n\n\t\tlet bits = 0;\n\n\t\tif ( color === undefined || color ) bits |= _gl.COLOR_BUFFER_BIT;\n\t\tif ( depth === undefined || depth ) bits |= _gl.DEPTH_BUFFER_BIT;\n\t\tif ( stencil === undefined || stencil ) bits |= _gl.STENCIL_BUFFER_BIT;\n\n\t\t_gl.clear( bits );\n\n\t};\n\n\tthis.clearColor = function () {\n\n\t\tthis.clear( true, false, false );\n\n\t};\n\n\tthis.clearDepth = function () {\n\n\t\tthis.clear( false, true, false );\n\n\t};\n\n\tthis.clearStencil = function () {\n\n\t\tthis.clear( false, false, true );\n\n\t};\n\n\t//\n\n\tthis.dispose = function () {\n\n\t\t_canvas.removeEventListener( 'webglcontextlost', onContextLost, false );\n\t\t_canvas.removeEventListener( 'webglcontextrestored', onContextRestore, false );\n\n\t\trenderLists.dispose();\n\t\trenderStates.dispose();\n\t\tproperties.dispose();\n\t\tcubemaps.dispose();\n\t\tcubeuvmaps.dispose();\n\t\tobjects.dispose();\n\t\tbindingStates.dispose();\n\t\tprogramCache.dispose();\n\n\t\txr.dispose();\n\n\t\txr.removeEventListener( 'sessionstart', onXRSessionStart );\n\t\txr.removeEventListener( 'sessionend', onXRSessionEnd );\n\n\t\tif ( _transmissionRenderTarget ) {\n\n\t\t\t_transmissionRenderTarget.dispose();\n\t\t\t_transmissionRenderTarget = null;\n\n\t\t}\n\n\t\tanimation.stop();\n\n\t};\n\n\t// Events\n\n\tfunction onContextLost( event ) {\n\n\t\tevent.preventDefault();\n\n\t\tconsole.log( 'THREE.WebGLRenderer: Context Lost.' );\n\n\t\t_isContextLost = true;\n\n\t}\n\n\tfunction onContextRestore( /* event */ ) {\n\n\t\tconsole.log( 'THREE.WebGLRenderer: Context Restored.' );\n\n\t\t_isContextLost = false;\n\n\t\tconst infoAutoReset = info.autoReset;\n\t\tconst shadowMapEnabled = shadowMap.enabled;\n\t\tconst shadowMapAutoUpdate = shadowMap.autoUpdate;\n\t\tconst shadowMapNeedsUpdate = shadowMap.needsUpdate;\n\t\tconst shadowMapType = shadowMap.type;\n\n\t\tinitGLContext();\n\n\t\tinfo.autoReset = infoAutoReset;\n\t\tshadowMap.enabled = shadowMapEnabled;\n\t\tshadowMap.autoUpdate = shadowMapAutoUpdate;\n\t\tshadowMap.needsUpdate = shadowMapNeedsUpdate;\n\t\tshadowMap.type = shadowMapType;\n\n\t}\n\n\tfunction onMaterialDispose( event ) {\n\n\t\tconst material = event.target;\n\n\t\tmaterial.removeEventListener( 'dispose', onMaterialDispose );\n\n\t\tdeallocateMaterial( material );\n\n\t}\n\n\t// Buffer deallocation\n\n\tfunction deallocateMaterial( material ) {\n\n\t\treleaseMaterialProgramReferences( material );\n\n\t\tproperties.remove( material );\n\n\t}\n\n\n\tfunction releaseMaterialProgramReferences( material ) {\n\n\t\tconst programs = properties.get( material ).programs;\n\n\t\tif ( programs !== undefined ) {\n\n\t\t\tprograms.forEach( function ( program ) {\n\n\t\t\t\tprogramCache.releaseProgram( program );\n\n\t\t\t} );\n\n\t\t\tif ( material.isShaderMaterial ) {\n\n\t\t\t\tprogramCache.releaseShaderCache( material );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// Buffer rendering\n\n\tthis.renderBufferDirect = function ( camera, scene, geometry, material, object, group ) {\n\n\t\tif ( scene === null ) scene = _emptyScene; // renderBufferDirect second parameter used to be fog (could be null)\n\n\t\tconst frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 );\n\n\t\tconst program = setProgram( camera, scene, geometry, material, object );\n\n\t\tstate.setMaterial( material, frontFaceCW );\n\n\t\t//\n\n\t\tlet index = geometry.index;\n\t\tconst position = geometry.attributes.position;\n\n\t\t//\n\n\t\tif ( index === null ) {\n\n\t\t\tif ( position === undefined || position.count === 0 ) return;\n\n\t\t} else if ( index.count === 0 ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t//\n\n\t\tlet rangeFactor = 1;\n\n\t\tif ( material.wireframe === true ) {\n\n\t\t\tindex = geometries.getWireframeAttribute( geometry );\n\t\t\trangeFactor = 2;\n\n\t\t}\n\n\t\tbindingStates.setup( object, material, program, geometry, index );\n\n\t\tlet attribute;\n\t\tlet renderer = bufferRenderer;\n\n\t\tif ( index !== null ) {\n\n\t\t\tattribute = attributes.get( index );\n\n\t\t\trenderer = indexedBufferRenderer;\n\t\t\trenderer.setIndex( attribute );\n\n\t\t}\n\n\t\t//\n\n\t\tconst dataCount = ( index !== null ) ? index.count : position.count;\n\n\t\tconst rangeStart = geometry.drawRange.start * rangeFactor;\n\t\tconst rangeCount = geometry.drawRange.count * rangeFactor;\n\n\t\tconst groupStart = group !== null ? group.start * rangeFactor : 0;\n\t\tconst groupCount = group !== null ? group.count * rangeFactor : Infinity;\n\n\t\tconst drawStart = Math.max( rangeStart, groupStart );\n\t\tconst drawEnd = Math.min( dataCount, rangeStart + rangeCount, groupStart + groupCount ) - 1;\n\n\t\tconst drawCount = Math.max( 0, drawEnd - drawStart + 1 );\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\t//\n\n\t\tif ( object.isMesh ) {\n\n\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\tstate.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() );\n\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t} else {\n\n\t\t\t\trenderer.setMode( _gl.TRIANGLES );\n\n\t\t\t}\n\n\t\t} else if ( object.isLine ) {\n\n\t\t\tlet lineWidth = material.linewidth;\n\n\t\t\tif ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material\n\n\t\t\tstate.setLineWidth( lineWidth * getTargetPixelRatio() );\n\n\t\t\tif ( object.isLineSegments ) {\n\n\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t} else if ( object.isLineLoop ) {\n\n\t\t\t\trenderer.setMode( _gl.LINE_LOOP );\n\n\t\t\t} else {\n\n\t\t\t\trenderer.setMode( _gl.LINE_STRIP );\n\n\t\t\t}\n\n\t\t} else if ( object.isPoints ) {\n\n\t\t\trenderer.setMode( _gl.POINTS );\n\n\t\t} else if ( object.isSprite ) {\n\n\t\t\trenderer.setMode( _gl.TRIANGLES );\n\n\t\t}\n\n\t\tif ( object.isInstancedMesh ) {\n\n\t\t\trenderer.renderInstances( drawStart, drawCount, object.count );\n\n\t\t} else if ( geometry.isInstancedBufferGeometry ) {\n\n\t\t\tconst instanceCount = Math.min( geometry.instanceCount, geometry._maxInstanceCount );\n\n\t\t\trenderer.renderInstances( drawStart, drawCount, instanceCount );\n\n\t\t} else {\n\n\t\t\trenderer.render( drawStart, drawCount );\n\n\t\t}\n\n\t};\n\n\t// Compile\n\n\tthis.compile = function ( scene, camera ) {\n\n\t\tcurrentRenderState = renderStates.get( scene );\n\t\tcurrentRenderState.init();\n\n\t\trenderStateStack.push( currentRenderState );\n\n\t\tscene.traverseVisible( function ( object ) {\n\n\t\t\tif ( object.isLight && object.layers.test( camera.layers ) ) {\n\n\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t\tcurrentRenderState.setupLights( _this.physicallyCorrectLights );\n\n\t\tscene.traverse( function ( object ) {\n\n\t\t\tconst material = object.material;\n\n\t\t\tif ( material ) {\n\n\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\tfor ( let i = 0; i < material.length; i ++ ) {\n\n\t\t\t\t\t\tconst material2 = material[ i ];\n\n\t\t\t\t\t\tgetProgram( material2, scene, object );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgetProgram( material, scene, object );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t\trenderStateStack.pop();\n\t\tcurrentRenderState = null;\n\n\t};\n\n\t// Animation Loop\n\n\tlet onAnimationFrameCallback = null;\n\n\tfunction onAnimationFrame( time ) {\n\n\t\tif ( onAnimationFrameCallback ) onAnimationFrameCallback( time );\n\n\t}\n\n\tfunction onXRSessionStart() {\n\n\t\tanimation.stop();\n\n\t}\n\n\tfunction onXRSessionEnd() {\n\n\t\tanimation.start();\n\n\t}\n\n\tconst animation = new WebGLAnimation();\n\tanimation.setAnimationLoop( onAnimationFrame );\n\n\tif ( typeof window !== 'undefined' ) animation.setContext( window );\n\n\tthis.setAnimationLoop = function ( callback ) {\n\n\t\tonAnimationFrameCallback = callback;\n\t\txr.setAnimationLoop( callback );\n\n\t\t( callback === null ) ? animation.stop() : animation.start();\n\n\t};\n\n\txr.addEventListener( 'sessionstart', onXRSessionStart );\n\txr.addEventListener( 'sessionend', onXRSessionEnd );\n\n\t// Rendering\n\n\tthis.render = function ( scene, camera ) {\n\n\t\tif ( camera !== undefined && camera.isCamera !== true ) {\n\n\t\t\tconsole.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( _isContextLost === true ) return;\n\n\t\t// update scene graph\n\n\t\tif ( scene.autoUpdate === true ) scene.updateMatrixWorld();\n\n\t\t// update camera matrices and frustum\n\n\t\tif ( camera.parent === null ) camera.updateMatrixWorld();\n\n\t\tif ( xr.enabled === true && xr.isPresenting === true ) {\n\n\t\t\tif ( xr.cameraAutoUpdate === true ) xr.updateCamera( camera );\n\n\t\t\tcamera = xr.getCamera(); // use XR camera for rendering\n\n\t\t}\n\n\t\t//\n\t\tif ( scene.isScene === true ) scene.onBeforeRender( _this, scene, camera, _currentRenderTarget );\n\n\t\tcurrentRenderState = renderStates.get( scene, renderStateStack.length );\n\t\tcurrentRenderState.init();\n\n\t\trenderStateStack.push( currentRenderState );\n\n\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\t_frustum.setFromProjectionMatrix( _projScreenMatrix );\n\n\t\t_localClippingEnabled = this.localClippingEnabled;\n\t\t_clippingEnabled = clipping.init( this.clippingPlanes, _localClippingEnabled, camera );\n\n\t\tcurrentRenderList = renderLists.get( scene, renderListStack.length );\n\t\tcurrentRenderList.init();\n\n\t\trenderListStack.push( currentRenderList );\n\n\t\tprojectObject( scene, camera, 0, _this.sortObjects );\n\n\t\tcurrentRenderList.finish();\n\n\t\tif ( _this.sortObjects === true ) {\n\n\t\t\tcurrentRenderList.sort( _opaqueSort, _transparentSort );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( _clippingEnabled === true ) clipping.beginShadows();\n\n\t\tconst shadowsArray = currentRenderState.state.shadowsArray;\n\n\t\tshadowMap.render( shadowsArray, scene, camera );\n\n\t\tif ( _clippingEnabled === true ) clipping.endShadows();\n\n\t\t//\n\n\t\tif ( this.info.autoReset === true ) this.info.reset();\n\n\t\t//\n\n\t\tbackground.render( currentRenderList, scene );\n\n\t\t// render scene\n\n\t\tcurrentRenderState.setupLights( _this.physicallyCorrectLights );\n\n\t\tif ( camera.isArrayCamera ) {\n\n\t\t\tconst cameras = camera.cameras;\n\n\t\t\tfor ( let i = 0, l = cameras.length; i < l; i ++ ) {\n\n\t\t\t\tconst camera2 = cameras[ i ];\n\n\t\t\t\trenderScene( currentRenderList, scene, camera2, camera2.viewport );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\trenderScene( currentRenderList, scene, camera );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( _currentRenderTarget !== null ) {\n\n\t\t\t// resolve multisample renderbuffers to a single-sample texture if necessary\n\n\t\t\ttextures.updateMultisampleRenderTarget( _currentRenderTarget );\n\n\t\t\t// Generate mipmap if we're using any kind of mipmap filtering\n\n\t\t\ttextures.updateRenderTargetMipmap( _currentRenderTarget );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( scene.isScene === true ) scene.onAfterRender( _this, scene, camera );\n\n\t\t// Ensure depth buffer writing is enabled so it can be cleared on next render\n\n\t\tstate.buffers.depth.setTest( true );\n\t\tstate.buffers.depth.setMask( true );\n\t\tstate.buffers.color.setMask( true );\n\n\t\tstate.setPolygonOffset( false );\n\n\t\t// _gl.finish();\n\n\t\tbindingStates.resetDefaultState();\n\t\t_currentMaterialId = - 1;\n\t\t_currentCamera = null;\n\n\t\trenderStateStack.pop();\n\n\t\tif ( renderStateStack.length > 0 ) {\n\n\t\t\tcurrentRenderState = renderStateStack[ renderStateStack.length - 1 ];\n\n\t\t} else {\n\n\t\t\tcurrentRenderState = null;\n\n\t\t}\n\n\t\trenderListStack.pop();\n\n\t\tif ( renderListStack.length > 0 ) {\n\n\t\t\tcurrentRenderList = renderListStack[ renderListStack.length - 1 ];\n\n\t\t} else {\n\n\t\t\tcurrentRenderList = null;\n\n\t\t}\n\n\t};\n\n\tfunction projectObject( object, camera, groupOrder, sortObjects ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tconst visible = object.layers.test( camera.layers );\n\n\t\tif ( visible ) {\n\n\t\t\tif ( object.isGroup ) {\n\n\t\t\t\tgroupOrder = object.renderOrder;\n\n\t\t\t} else if ( object.isLOD ) {\n\n\t\t\t\tif ( object.autoUpdate === true ) object.update( camera );\n\n\t\t\t} else if ( object.isLight ) {\n\n\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\tif ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) {\n\n\t\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld )\n\t\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\t\tconst material = object.material;\n\n\t\t\t\t\tif ( material.visible ) {\n\n\t\t\t\t\t\tcurrentRenderList.push( object, geometry, material, groupOrder, _vector3.z, null );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isMesh || object.isLine || object.isPoints ) {\n\n\t\t\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\t\t\t// update skeleton only once in a frame\n\n\t\t\t\t\tif ( object.skeleton.frame !== info.render.frame ) {\n\n\t\t\t\t\t\tobject.skeleton.update();\n\t\t\t\t\t\tobject.skeleton.frame = info.render.frame;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) {\n\n\t\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld )\n\t\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\t\tconst material = object.material;\n\n\t\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\t\tconst groups = geometry.groups;\n\n\t\t\t\t\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\t\tif ( groupMaterial && groupMaterial.visible ) {\n\n\t\t\t\t\t\t\t\tcurrentRenderList.push( object, geometry, groupMaterial, groupOrder, _vector3.z, group );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( material.visible ) {\n\n\t\t\t\t\t\tcurrentRenderList.push( object, geometry, material, groupOrder, _vector3.z, null );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tprojectObject( children[ i ], camera, groupOrder, sortObjects );\n\n\t\t}\n\n\t}\n\n\tfunction renderScene( currentRenderList, scene, camera, viewport ) {\n\n\t\tconst opaqueObjects = currentRenderList.opaque;\n\t\tconst transmissiveObjects = currentRenderList.transmissive;\n\t\tconst transparentObjects = currentRenderList.transparent;\n\n\t\tcurrentRenderState.setupLightsView( camera );\n\n\t\tif ( transmissiveObjects.length > 0 ) renderTransmissionPass( opaqueObjects, scene, camera );\n\n\t\tif ( viewport ) state.viewport( _currentViewport.copy( viewport ) );\n\n\t\tif ( opaqueObjects.length > 0 ) renderObjects( opaqueObjects, scene, camera );\n\t\tif ( transmissiveObjects.length > 0 ) renderObjects( transmissiveObjects, scene, camera );\n\t\tif ( transparentObjects.length > 0 ) renderObjects( transparentObjects, scene, camera );\n\n\t}\n\n\tfunction renderTransmissionPass( opaqueObjects, scene, camera ) {\n\n\t\tif ( _transmissionRenderTarget === null ) {\n\n\t\t\tconst needsAntialias = _antialias === true && capabilities.isWebGL2 === true;\n\t\t\tconst renderTargetType = needsAntialias ? WebGLMultisampleRenderTarget : WebGLRenderTarget;\n\n\t\t\t_transmissionRenderTarget = new renderTargetType( 1024, 1024, {\n\t\t\t\tgenerateMipmaps: true,\n\t\t\t\ttype: utils.convert( HalfFloatType ) !== null ? HalfFloatType : UnsignedByteType,\n\t\t\t\tminFilter: LinearMipmapLinearFilter,\n\t\t\t\tmagFilter: NearestFilter,\n\t\t\t\twrapS: ClampToEdgeWrapping,\n\t\t\t\twrapT: ClampToEdgeWrapping,\n\t\t\t\tuseRenderToTexture: extensions.has( 'WEBGL_multisampled_render_to_texture' )\n\t\t\t} );\n\n\t\t}\n\n\t\tconst currentRenderTarget = _this.getRenderTarget();\n\t\t_this.setRenderTarget( _transmissionRenderTarget );\n\t\t_this.clear();\n\n\t\t// Turn off the features which can affect the frag color for opaque objects pass.\n\t\t// Otherwise they are applied twice in opaque objects pass and transmission objects pass.\n\t\tconst currentToneMapping = _this.toneMapping;\n\t\t_this.toneMapping = NoToneMapping;\n\n\t\trenderObjects( opaqueObjects, scene, camera );\n\n\t\t_this.toneMapping = currentToneMapping;\n\n\t\ttextures.updateMultisampleRenderTarget( _transmissionRenderTarget );\n\t\ttextures.updateRenderTargetMipmap( _transmissionRenderTarget );\n\n\t\t_this.setRenderTarget( currentRenderTarget );\n\n\t}\n\n\tfunction renderObjects( renderList, scene, camera ) {\n\n\t\tconst overrideMaterial = scene.isScene === true ? scene.overrideMaterial : null;\n\n\t\tfor ( let i = 0, l = renderList.length; i < l; i ++ ) {\n\n\t\t\tconst renderItem = renderList[ i ];\n\n\t\t\tconst object = renderItem.object;\n\t\t\tconst geometry = renderItem.geometry;\n\t\t\tconst material = overrideMaterial === null ? renderItem.material : overrideMaterial;\n\t\t\tconst group = renderItem.group;\n\n\t\t\tif ( object.layers.test( camera.layers ) ) {\n\n\t\t\t\trenderObject( object, scene, camera, geometry, material, group );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction renderObject( object, scene, camera, geometry, material, group ) {\n\n\t\tobject.onBeforeRender( _this, scene, camera, geometry, material, group );\n\n\t\tobject.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );\n\t\tobject.normalMatrix.getNormalMatrix( object.modelViewMatrix );\n\n\t\tmaterial.onBeforeRender( _this, scene, camera, geometry, object, group );\n\n\t\tif ( material.transparent === true && material.side === DoubleSide ) {\n\n\t\t\tmaterial.side = BackSide;\n\t\t\tmaterial.needsUpdate = true;\n\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t\tmaterial.side = FrontSide;\n\t\t\tmaterial.needsUpdate = true;\n\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t\tmaterial.side = DoubleSide;\n\n\t\t} else {\n\n\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t}\n\n\t\tobject.onAfterRender( _this, scene, camera, geometry, material, group );\n\n\t}\n\n\tfunction getProgram( material, scene, object ) {\n\n\t\tif ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ...\n\n\t\tconst materialProperties = properties.get( material );\n\n\t\tconst lights = currentRenderState.state.lights;\n\t\tconst shadowsArray = currentRenderState.state.shadowsArray;\n\n\t\tconst lightsStateVersion = lights.state.version;\n\n\t\tconst parameters = programCache.getParameters( material, lights.state, shadowsArray, scene, object );\n\t\tconst programCacheKey = programCache.getProgramCacheKey( parameters );\n\n\t\tlet programs = materialProperties.programs;\n\n\t\t// always update environment and fog - changing these trigger an getProgram call, but it's possible that the program doesn't change\n\n\t\tmaterialProperties.environment = material.isMeshStandardMaterial ? scene.environment : null;\n\t\tmaterialProperties.fog = scene.fog;\n\t\tmaterialProperties.envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || materialProperties.environment );\n\n\t\tif ( programs === undefined ) {\n\n\t\t\t// new material\n\n\t\t\tmaterial.addEventListener( 'dispose', onMaterialDispose );\n\n\t\t\tprograms = new Map();\n\t\t\tmaterialProperties.programs = programs;\n\n\t\t}\n\n\t\tlet program = programs.get( programCacheKey );\n\n\t\tif ( program !== undefined ) {\n\n\t\t\t// early out if program and light state is identical\n\n\t\t\tif ( materialProperties.currentProgram === program && materialProperties.lightsStateVersion === lightsStateVersion ) {\n\n\t\t\t\tupdateCommonMaterialProperties( material, parameters );\n\n\t\t\t\treturn program;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tparameters.uniforms = programCache.getUniforms( material );\n\n\t\t\tmaterial.onBuild( object, parameters, _this );\n\n\t\t\tmaterial.onBeforeCompile( parameters, _this );\n\n\t\t\tprogram = programCache.acquireProgram( parameters, programCacheKey );\n\t\t\tprograms.set( programCacheKey, program );\n\n\t\t\tmaterialProperties.uniforms = parameters.uniforms;\n\n\t\t}\n\n\t\tconst uniforms = materialProperties.uniforms;\n\n\t\tif ( ( ! material.isShaderMaterial && ! material.isRawShaderMaterial ) || material.clipping === true ) {\n\n\t\t\tuniforms.clippingPlanes = clipping.uniform;\n\n\t\t}\n\n\t\tupdateCommonMaterialProperties( material, parameters );\n\n\t\t// store the light setup it was created for\n\n\t\tmaterialProperties.needsLights = materialNeedsLights( material );\n\t\tmaterialProperties.lightsStateVersion = lightsStateVersion;\n\n\t\tif ( materialProperties.needsLights ) {\n\n\t\t\t// wire up the material to this renderer's lighting state\n\n\t\t\tuniforms.ambientLightColor.value = lights.state.ambient;\n\t\t\tuniforms.lightProbe.value = lights.state.probe;\n\t\t\tuniforms.directionalLights.value = lights.state.directional;\n\t\t\tuniforms.directionalLightShadows.value = lights.state.directionalShadow;\n\t\t\tuniforms.spotLights.value = lights.state.spot;\n\t\t\tuniforms.spotLightShadows.value = lights.state.spotShadow;\n\t\t\tuniforms.rectAreaLights.value = lights.state.rectArea;\n\t\t\tuniforms.ltc_1.value = lights.state.rectAreaLTC1;\n\t\t\tuniforms.ltc_2.value = lights.state.rectAreaLTC2;\n\t\t\tuniforms.pointLights.value = lights.state.point;\n\t\t\tuniforms.pointLightShadows.value = lights.state.pointShadow;\n\t\t\tuniforms.hemisphereLights.value = lights.state.hemi;\n\n\t\t\tuniforms.directionalShadowMap.value = lights.state.directionalShadowMap;\n\t\t\tuniforms.directionalShadowMatrix.value = lights.state.directionalShadowMatrix;\n\t\t\tuniforms.spotShadowMap.value = lights.state.spotShadowMap;\n\t\t\tuniforms.spotShadowMatrix.value = lights.state.spotShadowMatrix;\n\t\t\tuniforms.pointShadowMap.value = lights.state.pointShadowMap;\n\t\t\tuniforms.pointShadowMatrix.value = lights.state.pointShadowMatrix;\n\t\t\t// TODO (abelnation): add area lights shadow info to uniforms\n\n\t\t}\n\n\t\tconst progUniforms = program.getUniforms();\n\t\tconst uniformsList = WebGLUniforms.seqWithValue( progUniforms.seq, uniforms );\n\n\t\tmaterialProperties.currentProgram = program;\n\t\tmaterialProperties.uniformsList = uniformsList;\n\n\t\treturn program;\n\n\t}\n\n\tfunction updateCommonMaterialProperties( material, parameters ) {\n\n\t\tconst materialProperties = properties.get( material );\n\n\t\tmaterialProperties.outputEncoding = parameters.outputEncoding;\n\t\tmaterialProperties.instancing = parameters.instancing;\n\t\tmaterialProperties.skinning = parameters.skinning;\n\t\tmaterialProperties.morphTargets = parameters.morphTargets;\n\t\tmaterialProperties.morphNormals = parameters.morphNormals;\n\t\tmaterialProperties.morphTargetsCount = parameters.morphTargetsCount;\n\t\tmaterialProperties.numClippingPlanes = parameters.numClippingPlanes;\n\t\tmaterialProperties.numIntersection = parameters.numClipIntersection;\n\t\tmaterialProperties.vertexAlphas = parameters.vertexAlphas;\n\t\tmaterialProperties.vertexTangents = parameters.vertexTangents;\n\t\tmaterialProperties.toneMapping = parameters.toneMapping;\n\n\t}\n\n\tfunction setProgram( camera, scene, geometry, material, object ) {\n\n\t\tif ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ...\n\n\t\ttextures.resetTextureUnits();\n\n\t\tconst fog = scene.fog;\n\t\tconst environment = material.isMeshStandardMaterial ? scene.environment : null;\n\t\tconst encoding = ( _currentRenderTarget === null ) ? _this.outputEncoding : ( _currentRenderTarget.isXRRenderTarget === true ? _currentRenderTarget.texture.encoding : LinearEncoding );\n\t\tconst envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment );\n\t\tconst vertexAlphas = material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4;\n\t\tconst vertexTangents = !! material.normalMap && !! geometry.attributes.tangent;\n\t\tconst morphTargets = !! geometry.morphAttributes.position;\n\t\tconst morphNormals = !! geometry.morphAttributes.normal;\n\t\tconst morphTargetsCount = !! geometry.morphAttributes.position ? geometry.morphAttributes.position.length : 0;\n\t\tconst toneMapping = material.toneMapped ? _this.toneMapping : NoToneMapping;\n\n\t\tconst materialProperties = properties.get( material );\n\t\tconst lights = currentRenderState.state.lights;\n\n\t\tif ( _clippingEnabled === true ) {\n\n\t\t\tif ( _localClippingEnabled === true || camera !== _currentCamera ) {\n\n\t\t\t\tconst useCache =\n\t\t\t\t\tcamera === _currentCamera &&\n\t\t\t\t\tmaterial.id === _currentMaterialId;\n\n\t\t\t\t// we might want to call this function with some ClippingGroup\n\t\t\t\t// object instead of the material, once it becomes feasible\n\t\t\t\t// (#8465, #8379)\n\t\t\t\tclipping.setState( material, camera, useCache );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tlet needsProgramChange = false;\n\n\t\tif ( material.version === materialProperties.__version ) {\n\n\t\t\tif ( materialProperties.needsLights && ( materialProperties.lightsStateVersion !== lights.state.version ) ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.outputEncoding !== encoding ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancing === false ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( ! object.isInstancedMesh && materialProperties.instancing === true ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( object.isSkinnedMesh && materialProperties.skinning === false ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( ! object.isSkinnedMesh && materialProperties.skinning === true ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.envMap !== envMap ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( material.fog && materialProperties.fog !== fog ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.numClippingPlanes !== undefined &&\n\t\t\t\t( materialProperties.numClippingPlanes !== clipping.numPlanes ||\n\t\t\t\tmaterialProperties.numIntersection !== clipping.numIntersection ) ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.vertexAlphas !== vertexAlphas ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.vertexTangents !== vertexTangents ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.morphTargets !== morphTargets ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.morphNormals !== morphNormals ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.toneMapping !== toneMapping ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( capabilities.isWebGL2 === true && materialProperties.morphTargetsCount !== morphTargetsCount ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tneedsProgramChange = true;\n\t\t\tmaterialProperties.__version = material.version;\n\n\t\t}\n\n\t\t//\n\n\t\tlet program = materialProperties.currentProgram;\n\n\t\tif ( needsProgramChange === true ) {\n\n\t\t\tprogram = getProgram( material, scene, object );\n\n\t\t}\n\n\t\tlet refreshProgram = false;\n\t\tlet refreshMaterial = false;\n\t\tlet refreshLights = false;\n\n\t\tconst p_uniforms = program.getUniforms(),\n\t\t\tm_uniforms = materialProperties.uniforms;\n\n\t\tif ( state.useProgram( program.program ) ) {\n\n\t\t\trefreshProgram = true;\n\t\t\trefreshMaterial = true;\n\t\t\trefreshLights = true;\n\n\t\t}\n\n\t\tif ( material.id !== _currentMaterialId ) {\n\n\t\t\t_currentMaterialId = material.id;\n\n\t\t\trefreshMaterial = true;\n\n\t\t}\n\n\t\tif ( refreshProgram || _currentCamera !== camera ) {\n\n\t\t\tp_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix );\n\n\t\t\tif ( capabilities.logarithmicDepthBuffer ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'logDepthBufFC',\n\t\t\t\t\t2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) );\n\n\t\t\t}\n\n\t\t\tif ( _currentCamera !== camera ) {\n\n\t\t\t\t_currentCamera = camera;\n\n\t\t\t\t// lighting uniforms depend on the camera so enforce an update\n\t\t\t\t// now, in case this material supports lights - or later, when\n\t\t\t\t// the next material that does gets activated:\n\n\t\t\t\trefreshMaterial = true;\t\t// set to true on material change\n\t\t\t\trefreshLights = true;\t\t// remains set until update done\n\n\t\t\t}\n\n\t\t\t// load material specific uniforms\n\t\t\t// (shader material also gets them for the sake of genericity)\n\n\t\t\tif ( material.isShaderMaterial ||\n\t\t\t\tmaterial.isMeshPhongMaterial ||\n\t\t\t\tmaterial.isMeshToonMaterial ||\n\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\tmaterial.envMap ) {\n\n\t\t\t\tconst uCamPos = p_uniforms.map.cameraPosition;\n\n\t\t\t\tif ( uCamPos !== undefined ) {\n\n\t\t\t\t\tuCamPos.setValue( _gl,\n\t\t\t\t\t\t_vector3.setFromMatrixPosition( camera.matrixWorld ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.isMeshPhongMaterial ||\n\t\t\t\tmaterial.isMeshToonMaterial ||\n\t\t\t\tmaterial.isMeshLambertMaterial ||\n\t\t\t\tmaterial.isMeshBasicMaterial ||\n\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\tmaterial.isShaderMaterial ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'isOrthographic', camera.isOrthographicCamera === true );\n\n\t\t\t}\n\n\t\t\tif ( material.isMeshPhongMaterial ||\n\t\t\t\tmaterial.isMeshToonMaterial ||\n\t\t\t\tmaterial.isMeshLambertMaterial ||\n\t\t\t\tmaterial.isMeshBasicMaterial ||\n\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\tmaterial.isShaderMaterial ||\n\t\t\t\tmaterial.isShadowMaterial ||\n\t\t\t\tobject.isSkinnedMesh ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// skinning and morph target uniforms must be set even if material didn't change\n\t\t// auto-setting of texture unit for bone and morph texture must go before other textures\n\t\t// otherwise textures used for skinning and morphing can take over texture units reserved for other material textures\n\n\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrix' );\n\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrixInverse' );\n\n\t\t\tconst skeleton = object.skeleton;\n\n\t\t\tif ( skeleton ) {\n\n\t\t\t\tif ( capabilities.floatVertexTextures ) {\n\n\t\t\t\t\tif ( skeleton.boneTexture === null ) skeleton.computeBoneTexture();\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture, textures );\n\t\t\t\t\tp_uniforms.setValue( _gl, 'boneTextureSize', skeleton.boneTextureSize );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tp_uniforms.setOptional( _gl, skeleton, 'boneMatrices' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( !! geometry && ( geometry.morphAttributes.position !== undefined || geometry.morphAttributes.normal !== undefined ) ) {\n\n\t\t\tmorphtargets.update( object, geometry, material, program );\n\n\t\t}\n\n\n\t\tif ( refreshMaterial || materialProperties.receiveShadow !== object.receiveShadow ) {\n\n\t\t\tmaterialProperties.receiveShadow = object.receiveShadow;\n\t\t\tp_uniforms.setValue( _gl, 'receiveShadow', object.receiveShadow );\n\n\t\t}\n\n\t\tif ( refreshMaterial ) {\n\n\t\t\tp_uniforms.setValue( _gl, 'toneMappingExposure', _this.toneMappingExposure );\n\n\t\t\tif ( materialProperties.needsLights ) {\n\n\t\t\t\t// the current material requires lighting info\n\n\t\t\t\t// note: all lighting uniforms are always set correctly\n\t\t\t\t// they simply reference the renderer's state for their\n\t\t\t\t// values\n\t\t\t\t//\n\t\t\t\t// use the current material's .needsUpdate flags to set\n\t\t\t\t// the GL state when required\n\n\t\t\t\tmarkUniformsLightsNeedsUpdate( m_uniforms, refreshLights );\n\n\t\t\t}\n\n\t\t\t// refresh uniforms common to several materials\n\n\t\t\tif ( fog && material.fog ) {\n\n\t\t\t\tmaterials.refreshFogUniforms( m_uniforms, fog );\n\n\t\t\t}\n\n\t\t\tmaterials.refreshMaterialUniforms( m_uniforms, material, _pixelRatio, _height, _transmissionRenderTarget );\n\n\t\t\tWebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, textures );\n\n\t\t}\n\n\t\tif ( material.isShaderMaterial && material.uniformsNeedUpdate === true ) {\n\n\t\t\tWebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, textures );\n\t\t\tmaterial.uniformsNeedUpdate = false;\n\n\t\t}\n\n\t\tif ( material.isSpriteMaterial ) {\n\n\t\t\tp_uniforms.setValue( _gl, 'center', object.center );\n\n\t\t}\n\n\t\t// common matrices\n\n\t\tp_uniforms.setValue( _gl, 'modelViewMatrix', object.modelViewMatrix );\n\t\tp_uniforms.setValue( _gl, 'normalMatrix', object.normalMatrix );\n\t\tp_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld );\n\n\t\treturn program;\n\n\t}\n\n\t// If uniforms are marked as clean, they don't need to be loaded to the GPU.\n\n\tfunction markUniformsLightsNeedsUpdate( uniforms, value ) {\n\n\t\tuniforms.ambientLightColor.needsUpdate = value;\n\t\tuniforms.lightProbe.needsUpdate = value;\n\n\t\tuniforms.directionalLights.needsUpdate = value;\n\t\tuniforms.directionalLightShadows.needsUpdate = value;\n\t\tuniforms.pointLights.needsUpdate = value;\n\t\tuniforms.pointLightShadows.needsUpdate = value;\n\t\tuniforms.spotLights.needsUpdate = value;\n\t\tuniforms.spotLightShadows.needsUpdate = value;\n\t\tuniforms.rectAreaLights.needsUpdate = value;\n\t\tuniforms.hemisphereLights.needsUpdate = value;\n\n\t}\n\n\tfunction materialNeedsLights( material ) {\n\n\t\treturn material.isMeshLambertMaterial || material.isMeshToonMaterial || material.isMeshPhongMaterial ||\n\t\t\tmaterial.isMeshStandardMaterial || material.isShadowMaterial ||\n\t\t\t( material.isShaderMaterial && material.lights === true );\n\n\t}\n\n\tthis.getActiveCubeFace = function () {\n\n\t\treturn _currentActiveCubeFace;\n\n\t};\n\n\tthis.getActiveMipmapLevel = function () {\n\n\t\treturn _currentActiveMipmapLevel;\n\n\t};\n\n\tthis.getRenderTarget = function () {\n\n\t\treturn _currentRenderTarget;\n\n\t};\n\n\tthis.setRenderTargetTextures = function ( renderTarget, colorTexture, depthTexture ) {\n\n\t\tproperties.get( renderTarget.texture ).__webglTexture = colorTexture;\n\t\tproperties.get( renderTarget.depthTexture ).__webglTexture = depthTexture;\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\trenderTargetProperties.__hasExternalTextures = true;\n\n\t\tif ( renderTargetProperties.__hasExternalTextures ) {\n\n\t\t\trenderTargetProperties.__autoAllocateDepthBuffer = depthTexture === undefined;\n\n\t\t\tif ( ! renderTargetProperties.__autoAllocateDepthBuffer ) {\n\n\t\t\t\t// The multisample_render_to_texture extension doesn't work properly if there\n\t\t\t\t// are midframe flushes and an external depth buffer. Disable use of the extension.\n\t\t\t\tif ( renderTarget.useRenderToTexture ) {\n\n\t\t\t\t\tconsole.warn( 'render-to-texture extension was disabled because an external texture was provided' );\n\t\t\t\t\trenderTarget.useRenderToTexture = false;\n\t\t\t\t\trenderTarget.useRenderbuffer = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tthis.setRenderTargetFramebuffer = function ( renderTarget, defaultFramebuffer ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\trenderTargetProperties.__webglFramebuffer = defaultFramebuffer;\n\t\trenderTargetProperties.__useDefaultFramebuffer = defaultFramebuffer === undefined;\n\n\t};\n\n\tthis.setRenderTarget = function ( renderTarget, activeCubeFace = 0, activeMipmapLevel = 0 ) {\n\n\t\t_currentRenderTarget = renderTarget;\n\t\t_currentActiveCubeFace = activeCubeFace;\n\t\t_currentActiveMipmapLevel = activeMipmapLevel;\n\t\tlet useDefaultFramebuffer = true;\n\n\t\tif ( renderTarget ) {\n\n\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\t\tif ( renderTargetProperties.__useDefaultFramebuffer !== undefined ) {\n\n\t\t\t\t// We need to make sure to rebind the framebuffer.\n\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\t\t\t\tuseDefaultFramebuffer = false;\n\n\t\t\t} else if ( renderTargetProperties.__webglFramebuffer === undefined ) {\n\n\t\t\t\ttextures.setupRenderTarget( renderTarget );\n\n\t\t\t} else if ( renderTargetProperties.__hasExternalTextures ) {\n\n\t\t\t\t// Color and depth texture must be rebound in order for the swapchain to update.\n\t\t\t\ttextures.rebindTextures( renderTarget, properties.get( renderTarget.texture ).__webglTexture, properties.get( renderTarget.depthTexture ).__webglTexture );\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet framebuffer = null;\n\t\tlet isCube = false;\n\t\tlet isRenderTarget3D = false;\n\n\t\tif ( renderTarget ) {\n\n\t\t\tconst texture = renderTarget.texture;\n\n\t\t\tif ( texture.isDataTexture3D || texture.isDataTexture2DArray ) {\n\n\t\t\t\tisRenderTarget3D = true;\n\n\t\t\t}\n\n\t\t\tconst __webglFramebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\t\tif ( renderTarget.isWebGLCubeRenderTarget ) {\n\n\t\t\t\tframebuffer = __webglFramebuffer[ activeCubeFace ];\n\t\t\t\tisCube = true;\n\n\t\t\t} else if ( renderTarget.useRenderbuffer ) {\n\n\t\t\t\tframebuffer = properties.get( renderTarget ).__webglMultisampledFramebuffer;\n\n\t\t\t} else {\n\n\t\t\t\tframebuffer = __webglFramebuffer;\n\n\t\t\t}\n\n\t\t\t_currentViewport.copy( renderTarget.viewport );\n\t\t\t_currentScissor.copy( renderTarget.scissor );\n\t\t\t_currentScissorTest = renderTarget.scissorTest;\n\n\t\t} else {\n\n\t\t\t_currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).floor();\n\t\t\t_currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).floor();\n\t\t\t_currentScissorTest = _scissorTest;\n\n\t\t}\n\n\t\tconst framebufferBound = state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\tif ( framebufferBound && capabilities.drawBuffers && useDefaultFramebuffer ) {\n\n\t\t\tstate.drawBuffers( renderTarget, framebuffer );\n\n\t\t}\n\n\t\tstate.viewport( _currentViewport );\n\t\tstate.scissor( _currentScissor );\n\t\tstate.setScissorTest( _currentScissorTest );\n\n\t\tif ( isCube ) {\n\n\t\t\tconst textureProperties = properties.get( renderTarget.texture );\n\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + activeCubeFace, textureProperties.__webglTexture, activeMipmapLevel );\n\n\t\t} else if ( isRenderTarget3D ) {\n\n\t\t\tconst textureProperties = properties.get( renderTarget.texture );\n\t\t\tconst layer = activeCubeFace || 0;\n\t\t\t_gl.framebufferTextureLayer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, textureProperties.__webglTexture, activeMipmapLevel || 0, layer );\n\n\t\t}\n\n\t\t_currentMaterialId = - 1; // reset current material to ensure correct uniform bindings\n\n\t};\n\n\tthis.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer, activeCubeFaceIndex ) {\n\n\t\tif ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) {\n\n\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tlet framebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\tif ( renderTarget.isWebGLCubeRenderTarget && activeCubeFaceIndex !== undefined ) {\n\n\t\t\tframebuffer = framebuffer[ activeCubeFaceIndex ];\n\n\t\t}\n\n\t\tif ( framebuffer ) {\n\n\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\ttry {\n\n\t\t\t\tconst texture = renderTarget.texture;\n\t\t\t\tconst textureFormat = texture.format;\n\t\t\t\tconst textureType = texture.type;\n\n\t\t\t\tif ( textureFormat !== RGBAFormat && utils.convert( textureFormat ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tconst halfFloatSupportedByExt = ( textureType === HalfFloatType ) && ( extensions.has( 'EXT_color_buffer_half_float' ) || ( capabilities.isWebGL2 && extensions.has( 'EXT_color_buffer_float' ) ) );\n\n\t\t\t\tif ( textureType !== UnsignedByteType && utils.convert( textureType ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // Edge and Chrome Mac < 52 (#9513)\n\t\t\t\t\t! ( textureType === FloatType && ( capabilities.isWebGL2 || extensions.has( 'OES_texture_float' ) || extensions.has( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox\n\t\t\t\t\t! halfFloatSupportedByExt ) {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( _gl.checkFramebufferStatus( _gl.FRAMEBUFFER ) === _gl.FRAMEBUFFER_COMPLETE ) {\n\n\t\t\t\t\t// the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)\n\n\t\t\t\t\tif ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {\n\n\t\t\t\t\t\t_gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), buffer );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.' );\n\n\t\t\t\t}\n\n\t\t\t} finally {\n\n\t\t\t\t// restore framebuffer of current render target if necessary\n\n\t\t\t\tconst framebuffer = ( _currentRenderTarget !== null ) ? properties.get( _currentRenderTarget ).__webglFramebuffer : null;\n\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tthis.copyFramebufferToTexture = function ( position, texture, level = 0 ) {\n\n\t\tif ( texture.isFramebufferTexture !== true ) {\n\n\t\t\tconsole.error( 'THREE.WebGLRenderer: copyFramebufferToTexture() can only be used with FramebufferTexture.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst levelScale = Math.pow( 2, - level );\n\t\tconst width = Math.floor( texture.image.width * levelScale );\n\t\tconst height = Math.floor( texture.image.height * levelScale );\n\n\t\ttextures.setTexture2D( texture, 0 );\n\n\t\t_gl.copyTexSubImage2D( _gl.TEXTURE_2D, level, 0, 0, position.x, position.y, width, height );\n\n\t\tstate.unbindTexture();\n\n\t};\n\n\tthis.copyTextureToTexture = function ( position, srcTexture, dstTexture, level = 0 ) {\n\n\t\tconst width = srcTexture.image.width;\n\t\tconst height = srcTexture.image.height;\n\t\tconst glFormat = utils.convert( dstTexture.format );\n\t\tconst glType = utils.convert( dstTexture.type );\n\n\t\ttextures.setTexture2D( dstTexture, 0 );\n\n\t\t// As another texture upload may have changed pixelStorei\n\t\t// parameters, make sure they are correct for the dstTexture\n\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, dstTexture.flipY );\n\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, dstTexture.premultiplyAlpha );\n\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, dstTexture.unpackAlignment );\n\n\t\tif ( srcTexture.isDataTexture ) {\n\n\t\t\t_gl.texSubImage2D( _gl.TEXTURE_2D, level, position.x, position.y, width, height, glFormat, glType, srcTexture.image.data );\n\n\t\t} else {\n\n\t\t\tif ( srcTexture.isCompressedTexture ) {\n\n\t\t\t\t_gl.compressedTexSubImage2D( _gl.TEXTURE_2D, level, position.x, position.y, srcTexture.mipmaps[ 0 ].width, srcTexture.mipmaps[ 0 ].height, glFormat, srcTexture.mipmaps[ 0 ].data );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.texSubImage2D( _gl.TEXTURE_2D, level, position.x, position.y, glFormat, glType, srcTexture.image );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Generate mipmaps only when copying level 0\n\t\tif ( level === 0 && dstTexture.generateMipmaps ) _gl.generateMipmap( _gl.TEXTURE_2D );\n\n\t\tstate.unbindTexture();\n\n\t};\n\n\tthis.copyTextureToTexture3D = function ( sourceBox, position, srcTexture, dstTexture, level = 0 ) {\n\n\t\tif ( _this.isWebGL1Renderer ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer.copyTextureToTexture3D: can only be used with WebGL2.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst width = sourceBox.max.x - sourceBox.min.x + 1;\n\t\tconst height = sourceBox.max.y - sourceBox.min.y + 1;\n\t\tconst depth = sourceBox.max.z - sourceBox.min.z + 1;\n\t\tconst glFormat = utils.convert( dstTexture.format );\n\t\tconst glType = utils.convert( dstTexture.type );\n\t\tlet glTarget;\n\n\t\tif ( dstTexture.isDataTexture3D ) {\n\n\t\t\ttextures.setTexture3D( dstTexture, 0 );\n\t\t\tglTarget = _gl.TEXTURE_3D;\n\n\t\t} else if ( dstTexture.isDataTexture2DArray ) {\n\n\t\t\ttextures.setTexture2DArray( dstTexture, 0 );\n\t\t\tglTarget = _gl.TEXTURE_2D_ARRAY;\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer.copyTextureToTexture3D: only supports THREE.DataTexture3D and THREE.DataTexture2DArray.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, dstTexture.flipY );\n\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, dstTexture.premultiplyAlpha );\n\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, dstTexture.unpackAlignment );\n\n\t\tconst unpackRowLen = _gl.getParameter( _gl.UNPACK_ROW_LENGTH );\n\t\tconst unpackImageHeight = _gl.getParameter( _gl.UNPACK_IMAGE_HEIGHT );\n\t\tconst unpackSkipPixels = _gl.getParameter( _gl.UNPACK_SKIP_PIXELS );\n\t\tconst unpackSkipRows = _gl.getParameter( _gl.UNPACK_SKIP_ROWS );\n\t\tconst unpackSkipImages = _gl.getParameter( _gl.UNPACK_SKIP_IMAGES );\n\n\t\tconst image = srcTexture.isCompressedTexture ? srcTexture.mipmaps[ 0 ] : srcTexture.image;\n\n\t\t_gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, image.width );\n\t\t_gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, image.height );\n\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, sourceBox.min.x );\n\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, sourceBox.min.y );\n\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, sourceBox.min.z );\n\n\t\tif ( srcTexture.isDataTexture || srcTexture.isDataTexture3D ) {\n\n\t\t\t_gl.texSubImage3D( glTarget, level, position.x, position.y, position.z, width, height, depth, glFormat, glType, image.data );\n\n\t\t} else {\n\n\t\t\tif ( srcTexture.isCompressedTexture ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer.copyTextureToTexture3D: untested support for compressed srcTexture.' );\n\t\t\t\t_gl.compressedTexSubImage3D( glTarget, level, position.x, position.y, position.z, width, height, depth, glFormat, image.data );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.texSubImage3D( glTarget, level, position.x, position.y, position.z, width, height, depth, glFormat, glType, image );\n\n\t\t\t}\n\n\t\t}\n\n\t\t_gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, unpackRowLen );\n\t\t_gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, unpackImageHeight );\n\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, unpackSkipPixels );\n\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, unpackSkipRows );\n\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, unpackSkipImages );\n\n\t\t// Generate mipmaps only when copying level 0\n\t\tif ( level === 0 && dstTexture.generateMipmaps ) _gl.generateMipmap( glTarget );\n\n\t\tstate.unbindTexture();\n\n\t};\n\n\tthis.initTexture = function ( texture ) {\n\n\t\ttextures.setTexture2D( texture, 0 );\n\n\t\tstate.unbindTexture();\n\n\t};\n\n\tthis.resetState = function () {\n\n\t\t_currentActiveCubeFace = 0;\n\t\t_currentActiveMipmapLevel = 0;\n\t\t_currentRenderTarget = null;\n\n\t\tstate.reset();\n\t\tbindingStates.reset();\n\n\t};\n\n\tif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) );\n\n\t}\n\n}\n\nWebGLRenderer.prototype.isWebGLRenderer = true;\n\nexport { WebGLRenderer };\n","import { WebGLRenderer } from './WebGLRenderer.js';\n\nclass WebGL1Renderer extends WebGLRenderer {}\n\nWebGL1Renderer.prototype.isWebGL1Renderer = true;\n\nexport { WebGL1Renderer };\n","import { WebGL1Renderer } from \"three/src/renderers/WebGL1Renderer.js\";\nimport { Bootstrap } from \"../bootstrap\";\n\nBootstrap.registerPlugin(\"renderer\", {\n  defaults: {\n    klass: WebGL1Renderer,\n    parameters: {\n      depth: true,\n      stencil: true,\n      preserveDrawingBuffer: true,\n      antialias: true,\n    },\n  },\n\n  listen: [\"resize\"],\n\n  install: function (three) {\n    // Instantiate Three renderer\n    const renderer = (three.renderer = new this.options.klass(\n      this.options.parameters\n    ));\n    three.canvas = renderer.domElement;\n\n    // Add to DOM\n    three.element.appendChild(renderer.domElement);\n  },\n\n  uninstall: function (three) {\n    // Remove from DOM\n    three.element.removeChild(three.renderer.domElement);\n\n    delete three.renderer;\n    delete three.canvas;\n  },\n\n  resize: function (event, three) {\n    const renderer = three.renderer;\n    const el = renderer.domElement;\n\n    // Resize renderer to render size if it's a canvas\n    if (el && el.tagName == \"CANVAS\") {\n      renderer.setSize(event.renderWidth, event.renderHeight, false);\n    }\n    // Or view size if it's just a DOM element or multi-renderer\n    else {\n      if (renderer.setRenderSize) {\n        renderer.setRenderSize(event.renderWidth, event.renderHeight);\n      }\n      renderer.setSize(event.viewWidth, event.viewHeight, false);\n    }\n  },\n});\n","import { Scene } from \"three/src/scenes/Scene.js\";\nimport { Bootstrap } from \"../bootstrap\";\n\nBootstrap.registerPlugin(\"scene\", {\n  install: function (three) {\n    three.scene = new Scene();\n  },\n\n  uninstall: function (three) {\n    delete three.scene;\n  },\n});\n","import { Bootstrap } from \"../bootstrap\";\n\nBootstrap.registerPlugin(\"size\", {\n  defaults: {\n    width: null,\n    height: null,\n    aspect: null,\n    scale: 1,\n    maxRenderWidth: Infinity,\n    maxRenderHeight: Infinity,\n    devicePixelRatio: true,\n  },\n\n  listen: [\n    \"window.resize:queue\",\n    \"element.resize:queue\",\n    \"this.change:queue\",\n    \"ready:resize\",\n    \"pre:pre\",\n  ],\n\n  install: function (three) {\n    three.Size = this.api({\n      renderWidth: 0,\n      renderHeight: 0,\n      viewWidth: 0,\n      viewHeight: 0,\n    });\n\n    this.resized = false;\n  },\n\n  uninstall: function (three) {\n    delete three.Size;\n  },\n\n  queue: function (_event, _three) {\n    this.resized = true;\n  },\n\n  pre: function (event, three) {\n    if (!this.resized) return;\n    this.resized = false;\n    this.resize(event, three);\n  },\n\n  resize: function (event, three) {\n    const options = this.options;\n    const element = three.element;\n    const renderer = three.renderer;\n\n    let w,\n      h,\n      ew,\n      eh,\n      rw,\n      rh,\n      aspect,\n      ratio,\n      ml = 0,\n      mt = 0;\n\n    // Measure element\n    w = ew =\n      options.width === undefined || options.width == null\n        ? element.offsetWidth || element.innerWidth || 0\n        : options.width;\n\n    h = eh =\n      options.height === undefined || options.height == null\n        ? element.offsetHeight || element.innerHeight || 0\n        : options.height;\n\n    // Force aspect ratio\n    aspect = w / h;\n    if (options.aspect) {\n      if (options.aspect > aspect) {\n        h = Math.round(w / options.aspect);\n        mt = Math.floor((eh - h) / 2);\n      } else {\n        w = Math.round(h * options.aspect);\n        ml = Math.floor((ew - w) / 2);\n      }\n      aspect = w / h;\n    }\n\n    // Get device pixel ratio\n    ratio = 1;\n    if (options.devicePixelRatio && typeof window != \"undefined\") {\n      ratio = window.devicePixelRatio || 1;\n    }\n\n    // Apply scale and resolution max\n    rw = Math.round(\n      Math.min(w * ratio * options.scale, options.maxRenderWidth)\n    );\n    rh = Math.round(\n      Math.min(h * ratio * options.scale, options.maxRenderHeight)\n    );\n\n    // Retain aspect ratio\n    const raspect = rw / rh;\n    if (raspect > aspect) {\n      rw = Math.round(rh * aspect);\n    } else {\n      rh = Math.round(rw / aspect);\n    }\n\n    // Measure final pixel ratio\n    ratio = rh / h;\n\n    // Resize and position renderer element\n    const style = renderer.domElement.style;\n    style.width = w + \"px\";\n    style.height = h + \"px\";\n    style.marginLeft = ml + \"px\";\n    style.marginTop = mt + \"px\";\n\n    // Notify\n    Object.assign(three.Size, {\n      renderWidth: rw,\n      renderHeight: rh,\n      viewWidth: w,\n      viewHeight: h,\n      aspect: aspect,\n      pixelRatio: ratio,\n    });\n\n    three.trigger({\n      type: \"resize\",\n      renderWidth: rw,\n      renderHeight: rh,\n      viewWidth: w,\n      viewHeight: h,\n      aspect: aspect,\n      pixelRatio: ratio,\n    });\n  },\n});\n","import { Bootstrap } from \"../bootstrap\";\n\nBootstrap.registerPlugin(\"time\", {\n  defaults: {\n    speed: 1, // Clock speed\n    warmup: 0, // Wait N frames before starting clock\n    timeout: 1, // Timeout in seconds. Pause if no tick happens in this time.\n  },\n\n  listen: [\"pre:tick\", \"this.change\"],\n\n  now: function () {\n    return +new Date() / 1000;\n  },\n\n  install: function (three) {\n    three.Time = this.api({\n      now: this.now(), // Time since 1970 in seconds\n\n      clock: 0, // Adjustable clock that counts up from 0 seconds\n      step: 1 / 60, // Clock step in seconds\n\n      frames: 0, // Framenumber\n      time: 0, // Real time in seconds\n      delta: 1 / 60, // Frame step in seconds\n\n      average: 0, // Average frame time in seconds\n      fps: 0, // Average frames per second\n    });\n\n    this.last = 0;\n    this.time = 0;\n    this.clock = 0;\n    this.wait = this.options.warmup;\n\n    this.clockStart = 0;\n    this.timeStart = 0;\n  },\n\n  tick: function (event, three) {\n    const speed = this.options.speed;\n    const timeout = this.options.timeout;\n\n    const api = three.Time;\n    const now = (api.now = this.now());\n    const last = this.last;\n    let time = this.time;\n    let clock = this.clock;\n\n    if (last) {\n      let delta = (api.delta = now - last);\n      const average = api.average || delta;\n\n      if (delta > timeout) {\n        delta = 0;\n      }\n\n      const step = delta * speed;\n\n      time += delta;\n      clock += step;\n\n      if (api.frames > 0) {\n        api.average = average + (delta - average) * 0.1;\n        api.fps = 1 / average;\n      }\n\n      api.step = step;\n      api.clock = clock - this.clockStart;\n      api.time = time - this.timeStart;\n\n      api.frames++;\n\n      if (this.wait-- > 0) {\n        this.clockStart = clock;\n        this.timeStart = time;\n        api.clock = 0;\n        api.step = 1e-100;\n      }\n    }\n\n    this.last = now;\n    this.clock = clock;\n    this.time = time;\n  },\n\n  uninstall: function (three) {\n    delete three.Time;\n  },\n});\n","import { Bootstrap } from \"../bootstrap\";\n\nBootstrap.registerPlugin(\"warmup\", {\n  defaults: {\n    delay: 2,\n  },\n\n  listen: [\"ready\", \"post\"],\n\n  ready: function (event, three) {\n    three.renderer.domElement.style.visibility = \"hidden\";\n    this.frame = 0;\n    this.hidden = true;\n  },\n\n  post: function (event, three) {\n    if (this.hidden && this.frame >= this.options.delay) {\n      three.renderer.domElement.style.visibility = \"visible\";\n      this.hidden = false;\n    }\n    this.frame++;\n  },\n});\n","import \"./bind\";\nimport \"./camera\";\nimport \"./fallback\";\nimport \"./fill\";\nimport \"./loop\";\nimport \"./render\";\nimport \"./renderer\";\nimport \"./scene\";\nimport \"./size\";\nimport \"./time\";\nimport \"./warmup\";\n","import { PerspectiveCamera } from \"three/src/cameras/PerspectiveCamera.js\";\nimport { Bootstrap } from \"../bootstrap\";\n\nBootstrap.registerPlugin(\"controls\", {\n  listen: [\"update\", \"resize\", \"camera\", \"this.change\"],\n\n  defaults: {\n    klass: null,\n    parameters: {},\n  },\n\n  install: function (three) {\n    if (!this.options.klass) throw \"Must provide class for `controls.klass`\";\n\n    three.controls = null;\n\n    this._camera = three.camera || new PerspectiveCamera();\n    this.change(null, three);\n  },\n\n  uninstall: function (three) {\n    delete three.controls;\n  },\n\n  change: function (event, three) {\n    if (this.options.klass) {\n      if (!event || event.changes.klass) {\n        three.controls = new this.options.klass(\n          this._camera,\n          three.renderer.domElement\n        );\n      }\n\n      Object.assign(three.controls, this.options.parameters);\n    } else {\n      three.controls = null;\n    }\n  },\n\n  update: function (event, three) {\n    const delta = (three.Time && three.Time.delta) || 1 / 60;\n    const vr = three.VR && three.VR.state;\n\n    if (three.controls.vr) three.controls.vr(vr);\n    three.controls.update(delta);\n  },\n\n  camera: function (event, three) {\n    three.controls.object = this._camera = event.camera;\n  },\n\n  resize: function (event, three) {\n    three.controls.handleResize && three.controls.handleResize();\n  },\n});\n","import { Bootstrap } from \"../bootstrap\";\n\nBootstrap.registerPlugin(\"cursor\", {\n  listen: [\n    \"update\",\n    \"this.change\",\n    \"install:change\",\n    \"uninstall:change\",\n    \"element.mousemove\",\n    \"vr\",\n  ],\n\n  defaults: {\n    cursor: null,\n    hide: false,\n    timeout: 3,\n  },\n\n  install: function (three) {\n    this.timeout = this.options.timeout;\n    this.element = three.element;\n    this.change(null, three);\n  },\n\n  uninstall: function (three) {\n    delete three.controls;\n  },\n\n  change: function (event, three) {\n    this.applyCursor(three);\n  },\n\n  mousemove: function (event, three) {\n    if (this.options.hide) {\n      this.applyCursor(three);\n      this.timeout = +this.options.timeout || 0;\n    }\n  },\n\n  update: function (event, three) {\n    const delta = (three.Time && three.Time.delta) || 1 / 60;\n\n    if (this.options.hide) {\n      this.timeout -= delta;\n      if (this.timeout < 0) {\n        this.applyCursor(three, \"none\");\n      }\n    }\n  },\n\n  vr: function (event, three) {\n    this.hide = event.active && !event.hmd.fake;\n    this.applyCursor(three);\n  },\n\n  applyCursor: function (three, cursor) {\n    const auto = three.controls ? \"move\" : \"\";\n    cursor = cursor || this.options.cursor || auto;\n    if (this.hide) cursor = \"none\";\n    if (this.cursor != cursor) {\n      this.element.style.cursor = cursor;\n    }\n  },\n});\n","import { Bootstrap } from \"../bootstrap\";\n\nBootstrap.registerPlugin(\"fullscreen\", {\n  defaults: {\n    key: \"f\",\n  },\n\n  listen: [\"ready\", \"update\"],\n\n  install: function (three) {\n    three.Fullscreen = this.api(\n      {\n        active: false,\n        toggle: this.toggle.bind(this),\n      },\n      three\n    );\n  },\n\n  uninstall: function (three) {\n    delete three.Fullscreen;\n  },\n\n  ready: function (event, three) {\n    document.body.addEventListener(\n      \"keypress\",\n      function (event) {\n        if (\n          this.options.key &&\n          event.charCode == this.options.key.charCodeAt(0)\n        ) {\n          this.toggle(three);\n        }\n      }.bind(this)\n    );\n\n    const changeHandler = function () {\n      const active =\n        !!document.fullscreenElement ||\n        !!document.mozFullScreenElement ||\n        !!document.webkitFullscreenElement ||\n        !!document.msFullscreenElement;\n      three.Fullscreen.active = this.active = active;\n      three.trigger({\n        type: \"fullscreen\",\n        active: active,\n      });\n    }.bind(this);\n    document.addEventListener(\"fullscreenchange\", changeHandler, false);\n    document.addEventListener(\"webkitfullscreenchange\", changeHandler, false);\n    document.addEventListener(\"mozfullscreenchange\", changeHandler, false);\n  },\n\n  toggle: function (three) {\n    const canvas = three.canvas;\n    const options =\n      three.VR && three.VR.active ? { vrDisplay: three.VR.hmd } : {};\n\n    if (!this.active) {\n      if (canvas.requestFullScreen) {\n        canvas.requestFullScreen(options);\n      } else if (canvas.msRequestFullScreen) {\n        canvas.msRequestFullscreen(options);\n      } else if (canvas.webkitRequestFullscreen) {\n        canvas.webkitRequestFullscreen(options);\n      } else if (canvas.mozRequestFullScreen) {\n        canvas.mozRequestFullScreen(options); // s vs S\n      }\n    } else {\n      if (document.exitFullscreen) {\n        document.exitFullscreen();\n      } else if (document.msExitFullscreen) {\n        document.msExitFullscreen();\n      } else if (document.webkitExitFullscreen) {\n        document.webkitExitFullscreen();\n      } else if (document.mozCancelFullScreen) {\n        document.mozCancelFullScreen(); // s vs S\n      }\n    }\n  },\n});\n","import { default as Stats } from \"stats.js\";\nimport { Bootstrap } from \"../bootstrap\";\n\nBootstrap.registerPlugin(\"stats\", {\n  listen: [\"pre\", \"post\"],\n\n  install: function (three) {\n    const stats = (this.stats = new Stats());\n    const style = stats.domElement.style;\n\n    style.position = \"absolute\";\n    style.top = style.left = 0;\n    three.element.appendChild(stats.domElement);\n\n    three.stats = stats;\n  },\n\n  uninstall: function (three) {\n    document.body.removeChild(this.stats.domElement);\n\n    delete three.stats;\n  },\n\n  pre: function (_event, _three) {\n    this.stats.begin();\n  },\n\n  post: function (_event, _three) {\n    this.stats.end();\n  },\n});\n","import { Bootstrap } from \"../bootstrap\";\n\nBootstrap.registerPlugin(\"ui\", {\n  defaults: {\n    theme: \"white\",\n    style:\n      \".threestrap-ui { position: absolute; bottom: 5px; right: 5px; float: left; }\" +\n      \".threestrap-ui button { border: 0; background: none;\" +\n      \"  vertical-align: middle; font-weight: bold; } \" +\n      \".threestrap-ui .glyphicon { top: 2px; font-weight: bold; } \" +\n      \"@media (max-width: 640px) { .threestrap-ui button { font-size: 120% } }\" +\n      \".threestrap-white button { color: #fff; text-shadow: 0 1px 1px rgba(0, 0, 0, 1), \" +\n      \"0 1px 3px rgba(0, 0, 0, 1); }\" +\n      \".threestrap-black button { color: #000; text-shadow: 0 0px 1px rgba(255, 255, 255, 1), \" +\n      \"0 0px 2px rgba(255, 255, 255, 1), \" +\n      \"0 0px 2px rgba(255, 255, 255, 1) }\",\n  },\n\n  listen: [\"fullscreen\"],\n\n  markup: function (three, theme, style) {\n    let url =\n      \"//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap-glyphicons.css\";\n    if (location.href.match(/^file:\\/\\//)) url = \"http://\" + url;\n\n    const buttons = [];\n\n    if (three.Fullscreen) {\n      buttons.push(\n        '<button class=\"fullscreen\" title=\"Full Screen\">' +\n          '<span class=\"glyphicon glyphicon-fullscreen\"></span>' +\n          \"</button>\"\n      );\n    }\n    if (three.VR) {\n      buttons.push('<button class=\"vr\" title=\"VR Headset\">VR</button>');\n    }\n\n    return (\n      '<style type=\"text/css\">@import url(\"' +\n      url +\n      '\"); ' +\n      style +\n      \"</style>\" +\n      '<div class=\"threestrap-ui threestrap-' +\n      theme +\n      '\">' +\n      buttons.join(\"\\n\") +\n      \"</div>\"\n    );\n  },\n\n  install: function (three) {\n    const ui = (this.ui = document.createElement(\"div\"));\n    ui.innerHTML = this.markup(three, this.options.theme, this.options.style);\n    document.body.appendChild(ui);\n\n    const fullscreen = (this.ui.fullscreen =\n      ui.querySelector(\"button.fullscreen\"));\n    if (fullscreen) {\n      three.bind([fullscreen, \"click:goFullscreen\"], this);\n    }\n\n    const vr = (this.ui.vr = ui.querySelector(\"button.vr\"));\n    if (vr && three.VR) {\n      three.VR.set({ mode: \"2d\" });\n      three.bind([vr, \"click:goVR\"], this);\n    }\n  },\n\n  fullscreen: function (event, three) {\n    this.ui.style.display = event.active ? \"none\" : \"block\";\n    if (!event.active) three.VR && three.VR.set({ mode: \"2d\" });\n  },\n\n  goFullscreen: function (event, three) {\n    if (three.Fullscreen) {\n      three.Fullscreen.toggle();\n    }\n  },\n\n  goVR: function (event, three) {\n    if (three.VR) {\n      three.VR.set({ mode: \"auto\" });\n      three.Fullscreen.toggle();\n    }\n  },\n\n  uninstall: function (_three) {\n    document.body.removeChild(this.ui);\n  },\n});\n","/**\n * VRRenderer\n *\n * @author wwwtyro https://github.com/wwwtyro\n * @author unconed https://github.com/unconed\n */\nimport { PerspectiveCamera } from \"three/src/cameras/PerspectiveCamera.js\";\nimport { Vector3 } from \"three/src/math/Vector3.js\";\n\nexport class VRRenderer {\n  constructor(renderer, hmd) {\n    this.renderer = renderer;\n\n    this.right = new Vector3();\n    this.cameraLeft = new PerspectiveCamera();\n    this.cameraRight = new PerspectiveCamera();\n\n    const et = hmd.getEyeTranslation(\"left\");\n    this.halfIPD = new Vector3(et.x, et.y, et.z).length();\n    this.fovLeft = hmd.getRecommendedEyeFieldOfView(\"left\");\n    this.fovRight = hmd.getRecommendedEyeFieldOfView(\"right\");\n  }\n\n  FovToNDCScaleOffset(fov) {\n    const pxscale = 2.0 / (fov.leftTan + fov.rightTan);\n    const pxoffset = (fov.leftTan - fov.rightTan) * pxscale * 0.5;\n    const pyscale = 2.0 / (fov.upTan + fov.downTan);\n    const pyoffset = (fov.upTan - fov.downTan) * pyscale * 0.5;\n    return {\n      scale: [pxscale, pyscale],\n      offset: [pxoffset, pyoffset],\n    };\n  }\n\n  FovPortToProjection(\n    matrix,\n    fov,\n    rightHanded /* = true */,\n    zNear /* = 0.01 */,\n    zFar /* = 10000.0 */\n  ) {\n    rightHanded = rightHanded === undefined ? true : rightHanded;\n    zNear = zNear === undefined ? 0.01 : zNear;\n    zFar = zFar === undefined ? 10000.0 : zFar;\n    const handednessScale = rightHanded ? -1.0 : 1.0;\n    const m = matrix.elements;\n    const scaleAndOffset = this.FovToNDCScaleOffset(fov);\n    m[0 * 4 + 0] = scaleAndOffset.scale[0];\n    m[0 * 4 + 1] = 0.0;\n    m[0 * 4 + 2] = scaleAndOffset.offset[0] * handednessScale;\n    m[0 * 4 + 3] = 0.0;\n    m[1 * 4 + 0] = 0.0;\n    m[1 * 4 + 1] = scaleAndOffset.scale[1];\n    m[1 * 4 + 2] = -scaleAndOffset.offset[1] * handednessScale;\n    m[1 * 4 + 3] = 0.0;\n    m[2 * 4 + 0] = 0.0;\n    m[2 * 4 + 1] = 0.0;\n    m[2 * 4 + 2] = (zFar / (zNear - zFar)) * -handednessScale;\n    m[2 * 4 + 3] = (zFar * zNear) / (zNear - zFar);\n    m[3 * 4 + 0] = 0.0;\n    m[3 * 4 + 1] = 0.0;\n    m[3 * 4 + 2] = handednessScale;\n    m[3 * 4 + 3] = 0.0;\n    matrix.transpose();\n  }\n\n  FovToProjection(\n    matrix,\n    fov,\n    rightHanded /* = true */,\n    zNear /* = 0.01 */,\n    zFar /* = 10000.0 */\n  ) {\n    const fovPort = {\n      upTan: Math.tan((fov.upDegrees * Math.PI) / 180.0),\n      downTan: Math.tan((fov.downDegrees * Math.PI) / 180.0),\n      leftTan: Math.tan((fov.leftDegrees * Math.PI) / 180.0),\n      rightTan: Math.tan((fov.rightDegrees * Math.PI) / 180.0),\n    };\n    return this.FovPortToProjection(matrix, fovPort, rightHanded, zNear, zFar);\n  }\n\n  render(scene, camera) {\n    this.FovToProjection(\n      this.cameraLeft.projectionMatrix,\n      this.fovLeft,\n      true,\n      camera.near,\n      camera.far\n    );\n    this.FovToProjection(\n      this.cameraRight.projectionMatrix,\n      this.fovRight,\n      true,\n      camera.near,\n      camera.far\n    );\n\n    this.right.set(this.halfIPD, 0, 0);\n    this.right.applyQuaternion(camera.quaternion);\n\n    this.cameraLeft.position.copy(camera.position).sub(this.right);\n    this.cameraRight.position.copy(camera.position).add(this.right);\n\n    this.cameraLeft.quaternion.copy(camera.quaternion);\n    this.cameraRight.quaternion.copy(camera.quaternion);\n\n    const dpr = this.renderer.devicePixelRatio || 1;\n    const width = this.renderer.domElement.width / 2 / dpr;\n    const height = this.renderer.domElement.height / dpr;\n\n    this.renderer.enableScissorTest(true);\n\n    this.renderer.setViewport(0, 0, width, height);\n    this.renderer.setScissor(0, 0, width, height);\n    this.renderer.render(scene, this.cameraLeft);\n\n    this.renderer.setViewport(width, 0, width, height);\n    this.renderer.setScissor(width, 0, width, height);\n    this.renderer.render(scene, this.cameraRight);\n  }\n}\n","import { Bootstrap } from \"../bootstrap.js\";\nimport { VRRenderer } from \"../renderers/VRRenderer.js\";\n\n/*\nVR sensor / HMD hookup.\n*/\nBootstrap.registerPlugin(\"vr\", {\n  defaults: {\n    mode: \"auto\", // 'auto', '2d'\n    device: null,\n    fov: 80, // emulated FOV for fallback\n  },\n\n  listen: [\"window.load\", \"pre\", \"render\", \"resize\", \"this.change\"],\n\n  install: function (three) {\n    three.VR = this.api(\n      {\n        active: false,\n        devices: [],\n        hmd: null,\n        sensor: null,\n        renderer: null,\n        state: null,\n      },\n      three\n    );\n  },\n\n  uninstall: function (three) {\n    delete three.VR;\n  },\n\n  mocks: function (three, fov, def) {\n    // Fake VR device for cardboard / desktop\n\n    // Interpuppilary distance\n    const ipd = 0.03;\n\n    // Symmetric eye FOVs (Cardboard style)\n    const getEyeTranslation = function (key) {\n      return { left: { x: -ipd, y: 0, z: 0 }, right: { x: ipd, y: 0, z: 0 } }[\n        key\n      ];\n    };\n    const getRecommendedEyeFieldOfView = function (key) {\n      const camera = three.camera;\n      const aspect = (camera && camera.aspect) || 16 / 9;\n      const fov2 = (fov || (camera && camera.fov) || def) / 2;\n      const fovX =\n        (Math.atan((Math.tan((fov2 * Math.PI) / 180) * aspect) / 2) * 180) /\n        Math.PI;\n      const fovY = fov2;\n\n      return {\n        left: {\n          rightDegrees: fovX,\n          leftDegrees: fovX,\n          downDegrees: fovY,\n          upDegrees: fovY,\n        },\n        right: {\n          rightDegrees: fovX,\n          leftDegrees: fovX,\n          downDegrees: fovY,\n          upDegrees: fovY,\n        },\n      }[key];\n    };\n    // Will be replaced with orbit controls or device orientation controls by VRControls\n    const getState = function () {\n      return {};\n    };\n\n    return [\n      {\n        fake: true,\n        force: 1,\n        deviceId: \"emu\",\n        deviceName: \"Emulated\",\n        getEyeTranslation: getEyeTranslation,\n        getRecommendedEyeFieldOfView: getRecommendedEyeFieldOfView,\n      },\n      {\n        force: 2,\n        getState: getState,\n      },\n    ];\n  },\n\n  load: function (event, three) {\n    const callback = function (devs) {\n      this.callback(devs, three);\n    }.bind(this);\n\n    if (navigator.getVRDevices) {\n      navigator.getVRDevices().then(callback);\n    } else if (navigator.mozGetVRDevices) {\n      navigator.mozGetVRDevices(callback);\n    } else {\n      console.warn(\"No native VR support detected.\");\n      callback(this.mocks(three, this.options.fov, this.defaults.fov), three);\n    }\n  },\n\n  callback: function (vrdevs, three) {\n    let hmd, sensor;\n\n    const HMD = window.HMDVRDevice || function () {};\n    const SENSOR = window.PositionSensorVRDevice || function () {};\n\n    // Export list of devices\n    vrdevs = three.VR.devices = vrdevs || three.VR.devices;\n\n    // Get HMD device\n    const deviceId = this.options.device;\n    let dev;\n\n    for (let i = 0; i < vrdevs.length; ++i) {\n      dev = vrdevs[i];\n      if (dev.force == 1 || dev instanceof HMD) {\n        if (deviceId && deviceId != dev.deviceId) continue;\n        hmd = dev;\n        break;\n      }\n    }\n\n    if (hmd) {\n      // Get sensor device\n      let dev;\n      for (let i = 0; i < vrdevs.length; ++i) {\n        dev = vrdevs[i];\n        if (\n          dev.force == 2 ||\n          (dev instanceof SENSOR && dev.hardwareUnitId == hmd.hardwareUnitId)\n        ) {\n          sensor = dev;\n          break;\n        }\n      }\n\n      this.hookup(hmd, sensor, three);\n    }\n  },\n\n  hookup: function (hmd, sensor, three) {\n    if (!VRRenderer) console.log(\"VRRenderer not found\");\n    const klass = VRRenderer || function () {};\n\n    this.renderer = new klass(three.renderer, hmd);\n    this.hmd = hmd;\n    this.sensor = sensor;\n\n    three.VR.renderer = this.renderer;\n    three.VR.hmd = hmd;\n    three.VR.sensor = sensor;\n\n    console.log(\"VRRenderer\", hmd.deviceName);\n  },\n\n  change: function (event, three) {\n    if (event.changes.device) {\n      this.callback(null, three);\n    }\n    this.pre(event, three);\n  },\n\n  pre: function (event, three) {\n    const last = this.active;\n\n    // Global active flag\n    const active = (this.active = this.renderer && this.options.mode != \"2d\");\n    three.VR.active = active;\n\n    // Load sensor state\n    if (active && this.sensor) {\n      const state = this.sensor.getState();\n      three.VR.state = state;\n    } else {\n      three.VR.state = null;\n    }\n\n    // Notify if VR state changed\n    if (last != this.active) {\n      three.trigger({\n        type: \"vr\",\n        active: active,\n        hmd: this.hmd,\n        sensor: this.sensor,\n      });\n    }\n  },\n\n  resize: function (_event, _three) {\n    if (this.active) {\n      // Reinit HMD projection\n      this.renderer.initialize();\n    }\n  },\n\n  render: function (event, three) {\n    if (three.scene && three.camera) {\n      const renderer = this.active ? this.renderer : three.renderer;\n\n      if (this.last != renderer) {\n        if (renderer == three.renderer) {\n          // Cleanup leftover renderer state when swapping back to normal\n          const dpr = renderer.getPixelRatio();\n          const width = renderer.domElement.width / dpr;\n          const height = renderer.domElement.height / dpr;\n          renderer.setScissorTest(false);\n          renderer.setViewport(0, 0, width, height);\n        }\n      }\n\n      this.last = renderer;\n\n      renderer.render(three.scene, three.camera);\n    }\n  },\n});\n","import \"./controls\";\nimport \"./cursor\";\nimport \"./fullscreen\";\nimport \"./stats\";\nimport \"./ui\";\nimport \"./vr\";\n","/**\n * @author dmarcos / https://github.com/dmarcos\n * @author mrdoob / http://mrdoob.com\n *\n * VRControls from\n * https://cdn.jsdelivr.net/npm/three@0.93.0/examples/js/controls/VRControls.js.\n * Added here so that the existing VR examples still work... this will stay\n * until we get everything upgraded to the modern three.js approach to VR. See\n * https://threejs.org/docs/index.html#manual/en/introduction/How-to-create-VR-content\n * for more info.\n */\n\nimport { Matrix4 } from \"three/src/math/Matrix4.js\";\n\nexport class VRControls {\n  constructor(object, onError) {\n    this.object = object;\n    this.standingMatrix = new Matrix4();\n    this.frameData = null;\n\n    if (\"VRFrameData\" in window) {\n      // eslint-disable-next-line no-undef\n      this.frameData = new VRFrameData();\n    }\n\n    function gotVRDisplays(displays) {\n      this.vrDisplays = displays;\n\n      if (displays.length > 0) {\n        this.vrDisplay = displays[0];\n      } else {\n        if (onError) onError(\"VR input not available.\");\n      }\n    }\n\n    if (navigator.getVRDisplays) {\n      navigator\n        .getVRDisplays()\n        .then(gotVRDisplays)\n        .catch(function () {\n          console.warn(\"VRControls: Unable to get VR Displays\");\n        });\n    }\n\n    // the Rift SDK returns the position in meters\n    // this scale factor allows the user to define how meters\n    // are converted to scene units.\n\n    this.scale = 1;\n\n    // If true will use \"standing space\" coordinate system where y=0 is the\n    // floor and x=0, z=0 is the center of the room.\n    this.standing = false;\n\n    // Distance from the users eyes to the floor in meters. Used when\n    // standing=true but the VRDisplay doesn't provide stageParameters.\n    this.userHeight = 1.6;\n  }\n\n  getVRDisplay() {\n    return this.vrDisplay;\n  }\n\n  setVRDisplay(value) {\n    this.vrDisplay = value;\n  }\n\n  getVRDisplays() {\n    console.warn(\"VRControls: getVRDisplays() is being deprecated.\");\n    return this.vrDisplays;\n  }\n\n  getStandingMatrix() {\n    return this.standingMatrix;\n  }\n\n  update() {\n    if (this.vrDisplay) {\n      let pose;\n\n      if (this.vrDisplay.getFrameData) {\n        this.vrDisplay.getFrameData(this.frameData);\n        pose = this.frameData.pose;\n      } else if (this.vrDisplay.getPose) {\n        pose = this.vrDisplay.getPose();\n      }\n\n      if (pose.orientation !== null) {\n        this.object.quaternion.fromArray(pose.orientation);\n      }\n\n      if (pose.position !== null) {\n        this.object.position.fromArray(pose.position);\n      } else {\n        this.object.position.set(0, 0, 0);\n      }\n\n      if (this.standing) {\n        if (this.vrDisplay.stageParameters) {\n          this.object.updateMatrix();\n\n          this.standingMatrix.fromArray(\n            this.vrDisplay.stageParameters.sittingToStandingTransform\n          );\n          this.object.applyMatrix(this.standingMatrix);\n        } else {\n          this.object.position.setY(this.object.position.y + this.userHeight);\n        }\n      }\n\n      this.object.position.multiplyScalar(this.scale);\n    }\n  }\n\n  dispose() {\n    this.vrDisplay = null;\n  }\n}\n","import \"./VRControls.js\";\n","/**\n * Allows a stack of renderers to be treated as a single renderer.\n * @author Gheric Speiginer\n */\nimport { REVISION } from \"three\";\n\nexport class MultiRenderer {\n  constructor(parameters) {\n    console.log(\"MultiRenderer\", REVISION);\n\n    this.domElement = document.createElement(\"div\");\n    this.domElement.style.position = \"relative\";\n\n    this.renderers = [];\n    this._renderSizeSet = false;\n\n    const rendererClasses = parameters.renderers || [];\n    const rendererParameters = parameters.parameters || [];\n\n    // elements are stacked back-to-front\n    for (let i = 0; i < rendererClasses.length; i++) {\n      const renderer = new rendererClasses[i](rendererParameters[i]);\n      renderer.domElement.style.position = \"absolute\";\n      renderer.domElement.style.top = \"0px\";\n      renderer.domElement.style.left = \"0px\";\n      this.domElement.appendChild(renderer.domElement);\n      this.renderers.push(renderer);\n    }\n  }\n\n  setSize(w, h) {\n    this.domElement.style.width = w + \"px\";\n    this.domElement.style.height = h + \"px\";\n\n    for (let i = 0; i < this.renderers.length; i++) {\n      const renderer = this.renderers[i];\n      const el = renderer.domElement;\n\n      if (!this._renderSizeSet || (el && el.tagName !== \"CANVAS\")) {\n        renderer.setSize(w, h);\n      }\n\n      el.style.width = w + \"px\";\n      el.style.height = h + \"px\";\n    }\n  }\n\n  setRenderSize(rw, rh) {\n    this._renderSizeSet = true;\n\n    for (let i = 0; i < this.renderers.length; i++) {\n      const renderer = this.renderers[i];\n      const el = renderer.domElement;\n\n      if (el && el.tagName === \"CANVAS\") {\n        renderer.setSize(rw, rh, false);\n      }\n    }\n  }\n\n  render(scene, camera) {\n    for (let i = 0; i < this.renderers.length; i++) {\n      this.renderers[i].render(scene, camera);\n    }\n  }\n}\n","import \"./MultiRenderer\";\nimport \"./VRRenderer\";\n","import \"./aliases\";\nimport \"./binder\";\nimport \"./bootstrap\";\nimport \"./core\";\nimport \"./extra\";\n\n// These should probably be in their own build!\nimport \"./controls\";\nimport \"./renderers\";\n\nexport { Api } from \"./api.js\";\nexport { Binder } from \"./binder.js\";\nexport { Bootstrap } from \"./bootstrap.js\";\n\nexport { VRControls } from \"./controls/VRControls.js\";\nexport { MultiRenderer } from \"./renderers/MultiRenderer.js\";\nexport { VRRenderer } from \"./renderers/VRRenderer.js\";\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining\n * DS104: Avoid inline assignments\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n/*\n Custom attribute model\n - Organizes attributes by trait in .attributes\n - Provides constant-time .props / .get() access to flat dictionary\n - Provides .get(key) with or without trait namespaces\n - Change attributes with .set(key) or .set(dictionary)\n - Validation is double-buffered and in-place to detect changes and nops\n - Change notifications are coalesced per object and per trait, digested later\n - Values are stored in three.js uniform-style objects so they can be bound as GL uniforms\n - Originally passed (unnormalized) values are preserved and can be fetched via .orig()\n - Attributes can be defined as final/const\n - Attributes can be computed from both public or private expressions with .bind(key, false/true)\n - Expressions are time-dependent, can be time-travelled with .evaluate()\n - This enables continous simulation and data logging despite choppy animation updates\n\n  Actual type and trait definitions are injected from Primitives\n*/\n\nexport class Attributes {\n  constructor(definitions, context) {\n    this.context = context;\n    this.traits = definitions.Traits;\n    this.types = definitions.Types;\n    this.pending = [];\n    this.bound = [];\n    this.last = null;\n  }\n\n  make(type) {\n    return {\n      enum: typeof type.enum === \"function\" ? type.enum() : undefined,\n      type: typeof type.uniform === \"function\" ? type.uniform() : undefined, // for three.js\n      value: type.make(),\n    };\n  }\n\n  apply(object, config) {\n    return new Data(object, config, this);\n  }\n\n  bind(callback) {\n    return this.bound.push(callback);\n  }\n  unbind(callback) {\n    return (this.bound = Array.from(this.bound).filter(\n      (cb) => cb !== callback\n    ));\n  }\n\n  queue(callback, object, key, value) {\n    this.lastObject = object;\n    this.lastKey = key;\n    this.lastValue = value;\n    return this.pending.push(callback);\n  }\n\n  invoke(callback) {\n    return callback(this.context.time.clock, this.context.time.step);\n  }\n\n  compute() {\n    if (this.bound.length) {\n      for (const cb of Array.from(this.bound)) {\n        this.invoke(cb);\n      }\n    }\n  }\n\n  digest() {\n    let calls;\n    if (!this.pending.length) {\n      return false;\n    }\n\n    [calls, this.pending] = Array.from([this.pending, []]);\n    for (const callback of Array.from(calls)) {\n      callback();\n    }\n\n    return true;\n  }\n\n  getTrait(name) {\n    return this.traits[name];\n  }\n\n  getLastTrigger() {\n    return `${this.lastObject.toString()} - ${this.lastKey}=\\`${\n      this.lastValue\n    }\\``;\n  }\n}\n\nconst shallowCopy = function (x) {\n  const out = {};\n  for (const k in x) {\n    const v = x[k];\n    out[k] = v;\n  }\n  return out;\n};\n\nclass Data {\n  constructor(object, config, _attributes) {\n    let key, ns, oldComputed, oldExpr, oldOrig, oldProps, spec;\n    let { props } = config;\n    const { traits, finals, freeform } = config;\n    const data = this;\n\n    // Save existing (original) values if re-applying\n    if (\n      object.props != null &&\n      object.expr != null &&\n      object.orig != null &&\n      object.computed != null &&\n      object.attributes != null\n    ) {\n      oldProps = shallowCopy(object.props);\n      oldExpr = shallowCopy(object.expr);\n      oldOrig = object.orig();\n      oldComputed = object.computed();\n\n      // Dispose of old attributes/bindings\n      if (object.attributes != null) {\n        object.attributes.dispose();\n      }\n    }\n\n    // Flattened and original values\n    const flattened = {};\n    const originals = {};\n\n    // Aliases\n    const mapTo = {};\n    const to = (name) => (mapTo[name] != null ? mapTo[name] : name);\n    const define = function (name, alias) {\n      if (mapTo[alias]) {\n        throw new Error(\n          `${object.toString()} - Duplicate property \\`${alias}\\``\n        );\n      }\n      return (mapTo[alias] = name);\n    };\n\n    // Get/set\n    const get = (key) =>\n      (data[key] != null ? data[key].value : undefined) != null\n        ? data[key] != null\n          ? data[key].value\n          : undefined\n        : __guard__(data[to(key)], (x) => x.value);\n    const set = function (key, value, ignore, initial) {\n      let attr;\n      key = to(key);\n\n      // Look for defined attribute\n      if ((attr = data[key]) == null) {\n        if (!freeform) {\n          throw new Error(\n            `${object.toString()} - Setting unknown property \\`${key}={${value}}\\``\n          );\n        }\n\n        // Define attribute on the fly (placeholder)\n        attr = data[key] = {\n          short: key,\n          type: null,\n          last: null,\n          value: null,\n        };\n        validators[key] = (v) => v;\n      }\n\n      if (!ignore) {\n        // See if prop isn't bound\n        if (_expr[key]) {\n          throw new Error(\n            `${object.toString()} - Can't set bound property \\`${key}={${value}}\\``\n          );\n        }\n\n        // See if prop isn't computed\n        if (_computed[key]) {\n          throw new Error(\n            `${object.toString()} - Can't set computed property \\`${key}={${value}}\\``\n          );\n        }\n\n        // See if prop isn't final\n        if (_finals[key]) {\n          throw new Error(\n            `${object.toString()} - Can't set final property \\`${key}={${value}}\\``\n          );\n        }\n      }\n\n      // Validate new value\n      let valid = true;\n      const validated = validate(key, value, attr.last, function () {\n        valid = false;\n        return null;\n      });\n\n      // Accept and insert into flattened/original list\n      if (valid) {\n        [attr.value, attr.last] = Array.from([validated, attr.value]);\n\n        // Remember in flattened dict\n        const { short } = attr;\n        flattened[short] = validated;\n        if (!ignore) {\n          originals[short] = value;\n        } // Remember original unvalidated value\n\n        // Compare to last value unless setting initial value\n        if (!initial && !equals(key, attr.value, attr.last)) {\n          change(key, value);\n        }\n      }\n\n      return valid;\n    };\n\n    const constant = function (key, value, initial) {\n      key = to(key);\n\n      set(key, value, true, initial);\n      return (_finals[key] = true);\n    };\n\n    // Prop/expression binding\n    const expr = {};\n\n    const _bound = {};\n    const _eval = {};\n    const _expr = {};\n    const _computed = {};\n    const _finals = {};\n\n    const bind = function (key, expression, computed) {\n      if (computed == null) {\n        computed = false;\n      }\n      key = to(key);\n\n      if (typeof expression !== \"function\") {\n        throw new Error(\n          `${object.toString()} - Expression \\`${key}=>{${expr}}\\` is not a function`\n        );\n      }\n      if (_expr[key]) {\n        throw new Error(\n          `${object.toString()} - Property \\`${key}=>{${expr}}\\` is already bound`\n        );\n      }\n      if (_computed[key]) {\n        throw new Error(\n          `${object.toString()} - Property \\`${key}\\` is computed`\n        );\n      }\n      if (_finals[key]) {\n        throw new Error(`${object.toString()} - Property \\`${key}\\` is final`);\n      }\n\n      const list = computed ? _computed : _expr;\n      list[key] = expression;\n\n      const short = data[key] != null ? data[key].short : key;\n      if (!computed) {\n        expr[short] = expression;\n      } // flattened\n      _eval[key] = expression;\n\n      expression = expression.bind(object);\n      _bound[key] = function (t, d) {\n        let clock;\n        if (\n          (clock = object.clock != null ? object.clock.getTime() : undefined)\n        ) {\n          t = clock.clock;\n          d = clock.step;\n        }\n\n        return object.set(key, expression(t, d), true);\n      };\n      return _attributes.bind(_bound[key]);\n    };\n\n    const unbind = function (key, computed) {\n      if (computed == null) {\n        computed = false;\n      }\n      key = to(key);\n\n      const list = computed ? _computed : _expr;\n      if (!list[key]) {\n        return;\n      }\n      _attributes.unbind(_bound[key]);\n      delete _bound[key];\n      delete list[key];\n\n      if (data[key] != null) {\n        key = data[key].short;\n      }\n      return delete expr[key];\n    };\n\n    const evaluate = function (key, time) {\n      let left;\n      key = to(key);\n      return (left =\n        typeof _eval[key] === \"function\" ? _eval[key](time, 0) : undefined) !=\n        null\n        ? left\n        : data[key].value;\n    };\n\n    // Public interface\n    object.expr = expr;\n    object.props = flattened;\n\n    object.evaluate = function (key, time) {\n      if (key != null) {\n        return evaluate(key, time);\n      } else {\n        const out = {};\n        for (key in props) {\n          out[key] = evaluate(key, time);\n        }\n        return out;\n      }\n    };\n\n    object.get = function (key) {\n      if (key != null) {\n        return get(key);\n      } else {\n        return flattened;\n      }\n    };\n\n    object.set = function (key, value, ignore, initial) {\n      if (typeof key === \"string\") {\n        set(key, value, ignore, initial);\n      } else {\n        initial = ignore;\n        ignore = value;\n        const options = key;\n        for (key in options) {\n          value = options[key];\n          set(key, value, ignore, initial);\n        }\n      }\n    };\n\n    object.bind = function (key, expr, computed) {\n      if (typeof key === \"string\") {\n        bind(key, expr, computed);\n      } else {\n        computed = expr;\n        const binds = key;\n        for (key in binds) {\n          expr = binds[key];\n          bind(key, expr, computed);\n        }\n      }\n    };\n\n    object.unbind = function (key, computed) {\n      if (typeof key === \"string\") {\n        unbind(key, computed);\n      } else {\n        computed = expr;\n        const binds = key;\n        for (key in binds) {\n          unbind(key, computed);\n        }\n      }\n    };\n\n    object.attribute = function (key) {\n      if (key != null) {\n        return data[to(key)];\n      } else {\n        return data;\n      }\n    };\n    object.orig = function (key) {\n      if (key != null) {\n        return originals[to(key)];\n      } else {\n        return shallowCopy(originals);\n      }\n    };\n    object.computed = function (key) {\n      if (key != null) {\n        return _computed[to(key)];\n      } else {\n        return shallowCopy(_computed);\n      }\n    };\n\n    // Validate value for key\n    const makers = {};\n    const validators = {};\n    const equalors = {};\n\n    const equals = (key, value, target) => equalors[key](value, target);\n    const validate = (key, value, target, invalid) =>\n      validators[key](value, target, invalid);\n\n    object.validate = function (key, value) {\n      let target;\n      key = to(key);\n      const make = makers[key];\n      if (make != null) {\n        target = make();\n      }\n      return (target = validate(key, value, target, function () {\n        throw new Error(\n          `${object.toString()} - Invalid value \\`${key}={${value}}\\``\n        );\n      }));\n    };\n\n    // Accumulate changes\n    let dirty = false;\n    let changes = {};\n    let touches = {};\n    let changed = {};\n    let touched = {};\n    const getNS = (key) => key.split(\".\")[0];\n    const change = function (key, value) {\n      if (!dirty) {\n        dirty = true;\n        _attributes.queue(digest, object, key, value);\n      }\n\n      const trait = getNS(key);\n\n      // Log change\n      changes[key] = true;\n\n      // Mark trait/namespace as dirty\n      return (touches[trait] = true);\n    };\n\n    const event = {\n      type: \"change\",\n      changed: null,\n      touched: null,\n    };\n\n    // Notify listeners of accumulated changes\n    const digest = function () {\n      // Swap double buffered changes objects\n      let k;\n      event.changed = changes;\n      event.touched = touches;\n      changes = changed;\n      touches = touched;\n      ({ changed } = event);\n      ({ touched } = event);\n\n      // Reset all dirty flags\n      dirty = false;\n      for (k in changes) {\n        changes[k] = false;\n      }\n      for (k in touches) {\n        touches[k] = false;\n      }\n\n      event.type = \"change\";\n      object.trigger(event);\n\n      return (() => {\n        const result = [];\n        for (const trait in event.touched) {\n          event.type = `change:${trait}`;\n          result.push(object.trigger(event));\n        }\n        return result;\n      })();\n    };\n\n    // Convert name.trait.key into keyName\n    const shorthand = function (name) {\n      const parts = name.split(/\\./g);\n      const suffix = parts.pop();\n      parts.pop(); // Discard\n      parts.unshift(suffix);\n      return parts.reduce(\n        (a, b) => a + b.charAt(0).toUpperCase() + b.substring(1)\n      );\n    };\n\n    // Define attributes for given trait spec by namespace\n    const addSpec = (name, spec) =>\n      (() => {\n        const result = [];\n        for (let key in spec) {\n          let value;\n          const type = spec[key];\n          key = [name, key].join(\".\");\n          const short = shorthand(key);\n\n          // Make attribute object\n          data[key] = {\n            T: type,\n            ns: name,\n            short,\n            enum: typeof type.enum === \"function\" ? type.enum() : undefined,\n            type:\n              typeof type.uniform === \"function\" ? type.uniform() : undefined,\n            last: type.make(),\n            value: (value = type.make()),\n          };\n\n          // Define flat namespace alias\n          define(key, short);\n          flattened[short] = value;\n\n          // Collect makers, validators and comparators\n          makers[key] = type.make;\n          validators[key] = type.validate != null ? type.validate : (a) => a;\n          result.push(\n            (equalors[key] =\n              type.equals != null ? type.equals : (a, b) => a === b)\n          );\n        }\n        return result;\n      })();\n\n    // Add in traits\n    const list = [];\n    for (let trait of Array.from(traits)) {\n      [trait, ns] = Array.from(trait.split(\":\"));\n      const name = ns ? [ns, trait].join(\".\") : trait;\n      spec = _attributes.getTrait(trait);\n      list.push(trait);\n\n      if (spec != null) {\n        addSpec(name, spec);\n      }\n    }\n\n    // Add custom props by namespace\n    if (props != null) {\n      for (ns in props) {\n        spec = props[ns];\n        addSpec(ns, spec);\n      }\n    }\n\n    // Store array of traits\n    const unique = list.filter((object, i) => list.indexOf(object) === i);\n    object.traits = unique;\n\n    // Set previous internal values\n    if (oldProps != null) {\n      object.set(oldProps, true, true);\n    }\n\n    // Set final props\n    if (finals != null) {\n      for (key in finals) {\n        const value = finals[key];\n        constant(key, value, true);\n      }\n    }\n\n    // Set previous external values\n    if (oldOrig != null) {\n      object.set(oldOrig, false, true);\n    }\n\n    // Bind previous computed props/expressions\n    if (oldComputed != null) {\n      object.bind(oldComputed, true);\n    }\n    if (oldExpr != null) {\n      object.bind(oldExpr, false);\n    }\n\n    // Destructor\n    this.dispose = function () {\n      for (key in _computed) {\n        unbind(key, true);\n      }\n      for (key in _expr) {\n        unbind(key, false);\n      }\n      props = {};\n      delete object.attributes;\n      delete object.get;\n      return delete object.set;\n    };\n\n    null;\n  }\n}\n\nfunction __guard__(value, transform) {\n  return typeof value !== \"undefined\" && value !== null\n    ? transform(value)\n    : undefined;\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nconst NUMBER_PRECISION = 5;\nconst NUMBER_THRESHOLD = 0.0001;\n\nconst checkFactor = (v, f) =>\n  Math.abs(v / f - Math.round(v / f)) < NUMBER_THRESHOLD;\nconst checkUnit = (v) => checkFactor(v, 1);\n\nconst formatMultiple = function (v, f, k, compact) {\n  const d = Math.round(v / f);\n  if (d === 1) {\n    return `${k}`;\n  }\n  if (d === -1) {\n    return `-${k}`;\n  }\n  if (k === \"1\") {\n    return `${d}`;\n  }\n  if (compact) {\n    return `${d}${k}`;\n  } else {\n    return `${d}*${k}`;\n  }\n};\n\nconst formatFraction = function (v, f, k, compact) {\n  let d = Math.round(v * f);\n  if (Math.abs(d) === 1) {\n    d = d < 0 ? \"-\" : \"\";\n    d += k;\n  } else if (k !== \"1\") {\n    d += compact ? `${k}` : `*${k}`;\n  }\n\n  return `${d}/${f}`;\n};\n\nconst formatFactors = [\n  { 1: 1 },\n  { 1: 1, τ: Math.PI * 2 },\n  { 1: 1, π: Math.PI },\n  { 1: 1, τ: Math.PI * 2, π: Math.PI },\n  { 1: 1, e: Math.E },\n  { 1: 1, τ: Math.PI * 2, e: Math.E },\n  { 1: 1, π: Math.PI, e: Math.E },\n  { 1: 1, τ: Math.PI * 2, π: Math.PI, e: Math.E },\n];\nconst formatPrimes = [\n  // denominators 1-30 + interesting multiples\n  [2 * 2 * 3 * 5 * 7, [2, 3, 5, 7]], // 1-7\n  [2 * 2 * 2 * 3 * 3 * 5 * 5 * 7 * 7, [2, 3, 5, 7]], // 8-11\n  [2 * 2 * 3 * 5 * 7 * 11 * 13, [2, 3, 5, 7, 11, 13]], // 12-16\n  [2 * 2 * 17 * 19 * 23 * 29, [2, 17, 19, 23, 29]], // 17-30\n  [256 * 256, [2]], // Powers of 2\n  [1000000, [2, 5]], // Powers of 10\n];\n\nconst prettyNumber = function (options) {\n  let cache, compact, e, pi, tau;\n  if (options) {\n    ({ cache, compact, tau, pi, e } = options);\n  }\n\n  compact = +!!(compact != null ? compact : true);\n  tau = +!!(tau != null ? tau : true);\n  pi = +!!(pi != null ? pi : true);\n  e = +!!(e != null ? e : true);\n  cache = +!!(cache != null ? cache : true);\n\n  const formatIndex = tau + pi * 2 + e * 4;\n\n  const numberCache = cache ? {} : null;\n\n  return function (v) {\n    if (numberCache != null) {\n      let cached;\n      if ((cached = numberCache[v]) != null) {\n        return cached;\n      }\n      if (v === Math.round(v)) {\n        return (numberCache[v] = `${v}`);\n      }\n    }\n\n    let out = `${v}`;\n    let best = out.length + out.indexOf(\".\") + 2;\n    const match = function (x) {\n      const d = x.length;\n      if (d <= best) {\n        out = `${x}`;\n        return (best = d);\n      }\n    };\n\n    for (const k in formatFactors[formatIndex]) {\n      const f = formatFactors[formatIndex][k];\n      if (checkUnit(v / f)) {\n        match(`${formatMultiple(v / f, 1, k, compact)}`);\n      } else {\n        // eslint-disable-next-line prefer-const\n        for (let [denom, list] of Array.from(formatPrimes)) {\n          let numer = (v / f) * denom;\n          if (checkUnit(numer)) {\n            for (const p of Array.from(list)) {\n              let d, n;\n              while (checkUnit((n = numer / p)) && checkUnit((d = denom / p))) {\n                numer = n;\n                denom = d;\n              }\n            }\n\n            match(`${formatFraction(v / f, denom, k, compact)}`);\n            break;\n          }\n        }\n      }\n    }\n\n    if (`${v}`.length > NUMBER_PRECISION) {\n      match(`${v.toPrecision(NUMBER_PRECISION)}`);\n    }\n\n    if (numberCache != null) {\n      numberCache[v] = out;\n    }\n\n    return out;\n  };\n};\n\nconst prettyPrint = function (markup, level) {\n  if (level == null) {\n    level = \"info\";\n  }\n  markup = prettyMarkup(markup);\n  return console[level].apply(console, markup);\n};\n\nconst prettyMarkup = function (markup) {\n  // quick n dirty\n\n  const tag = \"color:rgb(128,0,128)\";\n  const attr = \"color:rgb(144,64,0)\";\n  const str = \"color:rgb(0,0,192)\";\n  const obj = \"color:rgb(0,70,156)\";\n  const txt = \"color:inherit\";\n\n  let quoted = false;\n  let nested = 0;\n\n  const args = [];\n  markup = markup.replace(\n    /(\\\\[<={}> \"'])|(=>|[<={}> \"'])/g,\n    function (_, escape, char) {\n      if (escape != null ? escape.length : undefined) {\n        return escape;\n      }\n      if (quoted && !['\"', \"'\"].includes(char)) {\n        return char;\n      }\n      if (nested && !['\"', \"'\", \"{\", \"}\"].includes(char)) {\n        return char;\n      }\n\n      return (() => {\n        switch (char) {\n          case \"<\":\n            args.push(tag);\n            return \"%c<\";\n          case \">\":\n            args.push(tag);\n            args.push(txt);\n            return \"%c>%c\";\n          case \" \":\n            args.push(attr);\n            return \" %c\";\n          case \"=\":\n          case \"=>\":\n            args.push(tag);\n            return `%c${char}`;\n          case '\"':\n          case \"'\":\n            quoted = !quoted;\n            if (quoted) {\n              args.push(nested ? attr : str);\n              return `${char}%c`;\n            } else {\n              args.push(nested ? obj : tag);\n              return `%c${char}`;\n            }\n          case \"{\":\n            if (nested++ === 0) {\n              args.push(obj);\n              return `%c${char}`;\n            } else {\n              return char;\n            }\n          case \"}\":\n            if (--nested === 0) {\n              args.push(tag);\n              return `${char}%c`;\n            } else {\n              return char;\n            }\n          default:\n            return char;\n        }\n      })();\n    }\n  );\n\n  return [markup].concat(args);\n};\n\nconst prettyJSXProp = (k, v) => prettyJSXPair(k, v, \"=\");\nconst prettyJSXBind = (k, v) => prettyJSXPair(k, v, \"=>\");\n\nconst prettyJSXPair = (function () {\n  const formatNumber = prettyNumber({ compact: false });\n\n  return function (k, v, op) {\n    const key = function (k) {\n      if (k === \"\" + +k || k.match(/^[A-Za-z_][A-Za-z0-9]*$/)) {\n        return k;\n      } else {\n        return JSON.stringify(k);\n      }\n    };\n    const wrap = function (v) {\n      if (v.match('\\n*\"')) {\n        return v;\n      } else {\n        return `{${v}}`;\n      }\n    };\n    const value = function (v) {\n      if (v instanceof Array) {\n        return `[${v.map(value).join(\", \")}]`;\n      }\n\n      switch (typeof v) {\n        case \"string\":\n          if (v.match(\"\\n\")) {\n            return `\"\\n${v}\"\\n`;\n          } else {\n            return `\"${v}\"`;\n          }\n        case \"function\":\n          v = `${v}`;\n          if (v.match(\"\\n\")) {\n            `\\n${v}\\n`;\n          } else {\n            `${v}`;\n          }\n          v = v.replace(/^function (\\([^)]+\\))/, \"$1 =>\");\n          return (v = v.replace(\n            /^(\\([^)]+\\)) =>\\s*{\\s*return\\s*([^}]+)\\s*;\\s*}/,\n            \"$1 => $2\"\n          ));\n        case \"number\":\n          return formatNumber(v);\n        default:\n          if (v != null && v !== !!v) {\n            if (v._up != null) {\n              return value(v.map((v) => v));\n            }\n            if (v.toMarkup) {\n              return v.toString();\n            } else {\n              return (\n                \"{\" +\n                (() => {\n                  const result = [];\n                  for (const kk in v) {\n                    const vv = v[kk];\n                    if (Object.prototype.hasOwnProperty.call(v, kk)) {\n                      result.push(`${key(kk)}: ${value(vv)}`);\n                    }\n                  }\n                  return result;\n                })().join(\", \") +\n                \"}\"\n              );\n            }\n          } else {\n            return `${JSON.stringify(v)}`;\n          }\n      }\n    };\n\n    return [k, op, wrap(value(v))].join(\"\");\n  };\n})();\n\nconst escapeHTML = function (str) {\n  str = str.replace(/&/g, \"&amp;\");\n  str = str.replace(/</g, \"&lt;\");\n  return (str = str.replace(/\"/g, \"&quot;\"));\n};\n\nconst prettyFormat = function (str) {\n  const args = [].slice.call(arguments);\n  args.shift();\n\n  let out = \"<span>\";\n\n  str = escapeHTML(str);\n\n  // eslint-disable-next-line no-unused-vars\n  for (const _arg of Array.from(args)) {\n    str = str.replace(/%([a-z])/, function (_, f) {\n      const v = args.shift();\n      switch (f) {\n        case \"c\":\n          return `</span><span style=\"${escapeHTML(v)}\">`;\n        default:\n          return escapeHTML(v);\n      }\n    });\n  }\n\n  out += str;\n  return (out += \"</span>\");\n};\n\nexport const JSX = { prop: prettyJSXProp, bind: prettyJSXBind };\n\nexport {\n  prettyMarkup as markup,\n  prettyNumber as number,\n  prettyPrint as print,\n  prettyFormat as format,\n};\n\n/*\nfor x in [1, 2, 1/2, 3, 1/3, Math.PI, Math.PI / 2, Math.PI * 2, Math.PI * 3, Math.PI * 4, Math.PI * 3 / 4, Math.E * 100, Math.E / 100]\n  console.log prettyNumber({})(x)\n*/\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as Pretty from \"../util/pretty.js\";\nimport { Binder } from \"threestrap/src/binder.js\";\n\nlet nodeIndex = 0;\n\nexport class Node {\n  constructor(type, defaults, options, binds, config, attributes) {\n    this.type = type;\n    this._id = (++nodeIndex).toString();\n\n    this.configure(config, attributes);\n    this.parent = this.root = this.path = this.index = null;\n\n    this.set(defaults, true, true);\n    this.set(options, false, true);\n    this.bind(binds, false);\n  }\n\n  configure(config, attributes) {\n    let { traits, props, finals, freeform } = config;\n    if (traits == null) {\n      traits =\n        (this._config != null ? this._config.traits : undefined) != null\n          ? this._config != null\n            ? this._config.traits\n            : undefined\n          : [];\n    }\n    if (props == null) {\n      props =\n        (this._config != null ? this._config.props : undefined) != null\n          ? this._config != null\n            ? this._config.props\n            : undefined\n          : {};\n    }\n    if (finals == null) {\n      finals =\n        (this._config != null ? this._config.finals : undefined) != null\n          ? this._config != null\n            ? this._config.finals\n            : undefined\n          : {};\n    }\n    if (freeform == null) {\n      freeform =\n        (this._config != null ? this._config.freeform : undefined) != null\n          ? this._config != null\n            ? this._config.freeform\n            : undefined\n          : false;\n    }\n\n    this._config = { traits, props, finals, freeform };\n    return (this.attributes = attributes.apply(this, this._config));\n  }\n\n  dispose() {\n    this.attributes.dispose();\n    return (this.attributes = null);\n  }\n\n  // Add/removal callback\n  _added(parent) {\n    this.parent = parent;\n    this.root = parent.root;\n\n    // Notify root listeners of child addition\n    const event = {\n      type: \"add\",\n      node: this,\n      parent: this.parent,\n    };\n    if (this.root) {\n      this.root.trigger(event);\n    }\n\n    // Notify self listeners of own addition\n    event.type = \"added\";\n    return this.trigger(event);\n  }\n\n  _removed() {\n    // Notify root listeners of child removal\n    const event = {\n      type: \"remove\",\n      node: this,\n    };\n    if (this.root) {\n      this.root.trigger(event);\n    }\n\n    // Notify self listeners of own removal\n    event.type = \"removed\";\n    this.trigger(event);\n\n    return (this.root = this.parent = null);\n  }\n\n  // Assign unique indices to nodes to make paths\n  _index(index, parent) {\n    let path;\n    if (parent == null) {\n      ({ parent } = this);\n    }\n    this.index = index;\n    this.path = path =\n      index != null\n        ? ((parent != null ? parent.path : undefined) != null\n            ? parent != null\n              ? parent.path\n              : undefined\n            : []\n          ).concat([index])\n        : null;\n    this.order = path != null ? this._encode(path) : Infinity;\n    if (this.root != null) {\n      return this.trigger({ type: \"reindex\" });\n    }\n  }\n\n  // Asymptotic arithmetic encoding\n  // Computes invariant node order from path of indices\n  // Goes from 1 at the root [0] of the tree, to 0 at [∞] (best for FP precision).\n  // Divides the interval into countably infinite many intervals, nested recursively.\n  //\n  // (loses precision eventually, it's used cos three.js needs a single numerical order)\n  _encode(path) {\n    // Tune precision between deep and narrow (1) vs shallow and wide (n)\n    const k = 3;\n\n    const map = (x) => k / (x + k);\n    const lerp = (t) => b + (a - b) * t;\n\n    let a = 1 + 1 / k;\n    let b = 0;\n    for (const index of Array.from(path)) {\n      const f = map(index + 1);\n      const g = map(index + 2);\n      [a, b] = Array.from([lerp(f), lerp(g)]);\n    }\n    return a;\n  }\n\n  toString() {\n    const _id = this.id != null ? this.id : this._id;\n\n    const tag = this.type != null ? this.type : \"node\";\n    let id = tag;\n    id += `#${_id}`;\n    if (this.classes != null ? this.classes.length : undefined) {\n      id += `.${this.classes.join(\".\")}`;\n    }\n\n    if (this.children != null) {\n      let count;\n      if ((count = this.children.length)) {\n        return `<${id}>…(${count})…</${tag}>`;\n      } else {\n        return `<${id}></${tag}>`;\n      }\n    } else {\n      return `<${id} />`;\n    }\n  }\n\n  toMarkup(selector = null, indent) {\n    let k, v;\n    if (indent == null) {\n      indent = \"\";\n    }\n    if (selector && typeof selector !== \"function\") {\n      let left;\n      selector =\n        (left =\n          this.root != null ? this.root.model._matcher(selector) : undefined) !=\n        null\n          ? left\n          : () => true;\n    }\n\n    const tag = this.type != null ? this.type : \"node\";\n    let { expr } = this;\n\n    // Ensure generated ID goes first\n    const orig = { id: this._id };\n    const object = typeof this.orig === \"function\" ? this.orig() : undefined;\n    for (k in object) {\n      v = object[k];\n      orig[k] = v;\n    }\n\n    const props = (() => {\n      const result = [];\n      for (k in orig) {\n        v = orig[k];\n        if (!this.expr[k]) {\n          result.push(Pretty.JSX.prop(k, v));\n        }\n      }\n      return result;\n    })();\n    expr = (() => {\n      const result1 = [];\n      for (k in expr) {\n        v = expr[k];\n        result1.push(Pretty.JSX.bind(k, v));\n      }\n      return result1;\n    })();\n\n    let attr = [\"\"];\n    if (props.length) {\n      attr = attr.concat(props);\n    }\n    if (expr.length) {\n      attr = attr.concat(expr);\n    }\n    attr = attr.join(\" \");\n\n    let child = indent;\n    const recurse = () => {\n      if (!(this.children != null ? this.children.length : undefined)) {\n        return \"\";\n      }\n      return this.children\n        .map((x) => x.toMarkup(selector, child))\n        .filter((x) => x != null && x.length)\n        .join(\"\\n\");\n    };\n\n    if (selector && !selector(this)) {\n      return recurse();\n    }\n\n    if (this.children != null) {\n      const open = `<${tag}${attr}>`;\n      const close = `</${tag}>`;\n\n      child = indent + \"  \";\n      let children = recurse();\n      if (children.length) {\n        children = \"\\n\" + children + \"\\n\" + indent;\n      }\n      if (children == null) {\n        children = \"\";\n      }\n\n      return indent + open + children + close;\n    } else {\n      return `${indent}<${tag}${attr} />`;\n    }\n  }\n\n  print(selector, level) {\n    return Pretty.print(this.toMarkup(selector), level);\n  }\n}\n\nBinder.apply(Node.prototype);\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Node } from \"./node.js\";\n\nexport class Group extends Node {\n  constructor(type, defaults, options, binds, config, attributes) {\n    super(type, defaults, options, binds, config, attributes);\n\n    this.children = [];\n    this.on(\"reindex\", (event) =>\n      Array.from(this.children).map((child) => child.trigger(event))\n    );\n  }\n\n  add(node) {\n    if (node.parent != null) {\n      node.parent.remove(node);\n    }\n\n    node._index(this.children.length, this);\n    this.children.push(node);\n    return node._added(this);\n  }\n\n  remove(node) {\n    if (node.children != null ? node.children.length : undefined) {\n      node.empty();\n    }\n\n    const index = this.children.indexOf(node);\n    if (index === -1) {\n      return;\n    }\n\n    this.children.splice(index, 1);\n    node._index(null);\n    node._removed(this);\n\n    for (let i = 0; i < this.children.length; i++) {\n      node = this.children[i];\n      if (i >= index) {\n        node._index(i);\n      }\n    }\n  }\n\n  empty() {\n    const children = this.children.slice().reverse();\n    for (const node of Array.from(children)) {\n      this.remove(node);\n    }\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nexport class Guard {\n  constructor(limit) {\n    if (limit == null) {\n      limit = 10;\n    }\n    this.limit = limit;\n  }\n  iterate(options) {\n    const { step, last } = options;\n\n    let { limit } = this;\n    while (step()) {\n      if (!--limit) {\n        console.warn(\n          \"Last iteration\",\n          typeof last === \"function\" ? last() : undefined\n        );\n        throw new Error(\"Exceeded iteration limit.\");\n      }\n    }\n    return null;\n  }\n}\n","/**\n * This file contains an *adapter* for css-select. css-select is a CSS selection\n * engine for HTML that can be used with other data structures (XML, etc) via\n * adapters. Here we define an adapter for MathBox's vdom.\n *\n * The adapter interface is described here:\n *    https://github.com/fb55/css-select/blob/1aa44bdd64aaf2ebdfd7f338e2e76bed36521957/src/types.ts#L6-L96\n *\n * Nodes vs Elements:\n * In general, CSS Selectors act on a document tree built from nodes, which can\n * include element nodes and non-element nodes. For example, in HTML, tags are\n * element nodes but lines of text are non-element node. Non-element text nodes\n * can influence css selection, e.g., via :first-line pseudoclass, but these\n * non-element nodes are never returned by selectors.\n *\n * Mathbox only has element nodes.\n */\n\n/**\n * Is this node an element node? Yes. Mathbox only has element nodes.\n */\nfunction isTag(_elem) {\n  return true;\n}\n\nfunction getChildren(elem) {\n  return elem.children || [];\n}\n\nfunction getParent(elem) {\n  return elem.parent;\n}\n\n/**\n * Takes an array of nodes, and removes any duplicates, as well as any\n * nodes whose ancestors are also in the array.\n */\nfunction removeSubsets(nodes) {\n  const deduped = new Set(nodes);\n\n  deduped.forEach((node) => {\n    let ancestor = node.parent;\n    while (ancestor) {\n      if (deduped.has(ancestor)) {\n        deduped.delete(node);\n        return;\n      }\n      ancestor = ancestor.parent;\n    }\n  });\n\n  return Array.from(deduped);\n}\n\nconst adapter = {\n  isTag,\n  /**\n   * Does at least one of passed element nodes pass the test predicate?\n   */\n  existsOne(test, elems) {\n    return elems.some((elem) =>\n      isTag(elem)\n        ? test(elem) || adapter.existsOne(test, getChildren(elem))\n        : false\n    );\n  },\n  /**\n   * Get the siblings of the node. Note that unlike jQuery's `siblings` method,\n   * this is expected to include the current node as well\n   */\n  getSiblings(elem) {\n    const parent = getParent(elem);\n    return parent ? getChildren(parent) : [elem];\n  },\n  getChildren,\n  getParent,\n  getAttributeValue(elem, name) {\n    if (name === \"class\") return elem.props.classes.join(\" \");\n    if (name === \"id\") return elem.id;\n    return \"\";\n  },\n  hasAttrib(elem, name) {\n    if (name === \"id\") return !!elem.id;\n    if (name === \"class\") return elem.props.classes.length > 0;\n    if (!elem.traits.hash) return false;\n    return Object.prototype.hasOwnProperty.call(elem.traits.hash, name);\n  },\n  removeSubsets,\n  getName(elem) {\n    return elem.type ?? \"\";\n  },\n  /**\n   * Finds the first node in the array that matches the test predicate, or one\n   * of its children.\n   */\n  findOne: function findOne(test, elems) {\n    for (const node of elems) {\n      if (test(node)) {\n        return node;\n      } else {\n        const match = findOne(test, getChildren(node));\n        if (match) return match;\n      }\n    }\n\n    return null;\n  },\n  findAll: function findAll(test, elems) {\n    const result = [];\n    for (const elem of elems) {\n      if (!isTag(elem)) continue;\n      if (test(elem)) {\n        result.push(elem);\n      }\n      result.push(...findAll(test, getChildren(elem)));\n    }\n    return result;\n  },\n  getText: function getText(_elem) {\n    return \"\";\n  },\n};\n\nexport default adapter;\n","import * as CSSselect from \"css-select\";\nimport adapter from \"./css-select-adapter.js\";\n\n/**\n * Returns a filtered array of elements which are contained in context.\n */\nconst filter = (nodes, context) => {\n  const out = [];\n  const contextNodes = Array.isArray(context) ? context : [context];\n  const contextSet = new Set(contextNodes);\n  for (const node of Array.from(nodes)) {\n    let ancestor = node;\n    while (ancestor != null) {\n      if (contextSet.has(ancestor)) {\n        out.push(node);\n        break;\n      }\n      ancestor = adapter.getParent(ancestor);\n    }\n  }\n  return out;\n};\n\nconst getRoot = (element) => {\n  let ancestor = element;\n  while (adapter.getParent(ancestor) !== null) {\n    ancestor = adapter.getParent(ancestor);\n  }\n  return ancestor;\n};\n\n/**\n * Finds elements in the given context matching the given css-selector.\n *\n * Does NOT throw if css query is invalid.\n *\n * @param {string} query A css selector\n * @param {*} context Element or array of elements\n * @returns All elements in context matching query\n */\nexport const selectAll = (query, context) => {\n  try {\n    /**\n     * Try/catch to tolerate invalid css queries.\n     * See https://gitgud.io/unconed/mathbox/-/issues/23\n     */\n    CSSselect.compile(query);\n  } catch (err) {\n    return [];\n  }\n\n  /**\n   * Delegate to css-select, except always make queries relative to root and\n   * filter matches outside of context ourselves. css-select does not currently\n   * handle contextualized queries relative to root correctly.\n   *\n   * See https://github.com/fb55/css-select/issues/709\n   */\n\n  const isArray = Array.isArray(context);\n  if (isArray && context.length === 0) return [];\n  const root = getRoot(isArray ? context[0] : context);\n  const matches = CSSselect.selectAll(query, root, { adapter });\n  if (context) return filter(matches, context);\n  return matches;\n};\n\nexport const compile = (query) => {\n  try {\n    /**\n     * Try/catch to tolerate invalid css queries.\n     * See https://gitgud.io/unconed/mathbox/-/issues/23\n     */\n    return CSSselect.compile(query, { adapter });\n  } catch (err) {\n    return () => false;\n  }\n};\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { compile, selectAll } from \"./css-select-adapted\";\nconst AUTO = /^<([0-9]+|<*)$/;\n\n/*\n  Model that wraps a root node and its children.\n\n  Monitors adds, removals and ID/class changes.\n  Enables CSS selectors, both querying and watching.\n\n  Watchers are primed differentially as changes come in,\n  and fired with digest().\n*/\nexport class Model {\n  constructor(root) {\n    this.root = root;\n    this.root.model = this;\n    this.root.root = this.root;\n\n    this.ids = {};\n    this.classes = {};\n    this.traits = {};\n    this.types = {};\n    this.nodes = [];\n    this.watchers = [];\n    this.fire = false;\n\n    this.lastNode = null;\n\n    this.event = { type: \"update\" };\n\n    // Triggered by child addition/removal\n    const add = (event) => adopt(event.node);\n    const remove = (event) => dispose(event.node);\n\n    this.root.on(\"add\", add);\n    this.root.on(\"remove\", remove);\n\n    // Track node lifecycle\n    const adopt = (node) => {\n      addNode(node);\n      addType(node);\n      addTraits(node);\n\n      node.on(\"change:node\", update);\n      update(null, node, true);\n      return force(node);\n    };\n\n    const dispose = (node) => {\n      removeNode(node);\n      removeType(node);\n      removeTraits(node);\n      removeID(node.id, node);\n      removeClasses(node.classes, node);\n\n      node.off(\"change:node\", update);\n      return force(node);\n    };\n\n    // Watcher cycle for catching changes in id/classes\n    const prime = (node) => {\n      for (const watcher of Array.from(this.watchers)) {\n        watcher.match = watcher.matcher(node);\n      }\n      return null;\n    };\n\n    const check = (node) => {\n      for (const watcher of Array.from(this.watchers)) {\n        const fire =\n          watcher.fire ||\n          (watcher.fire = watcher.match !== watcher.matcher(node));\n        if (fire) {\n          this.lastNode = node;\n        }\n        if (!this.fire) {\n          this.fire = fire;\n        }\n      }\n      return null;\n    };\n\n    const force = (node) => {\n      for (const watcher of Array.from(this.watchers)) {\n        const fire = watcher.fire || (watcher.fire = watcher.matcher(node));\n        if (fire) {\n          this.lastNode = node;\n        }\n        if (!this.fire) {\n          this.fire = fire;\n        }\n      }\n      return null;\n    };\n\n    this.digest = () => {\n      if (!this.fire) {\n        return false;\n      }\n      for (const watcher of Array.from(this.watchers.slice())) {\n        if (watcher.fire) {\n          watcher.fire = false;\n          watcher.handler();\n        }\n      }\n      this.fire = false;\n      return true;\n    };\n\n    // Track id/class changes\n    const update = (event, node, init) => {\n      const _id = init || event.changed[\"node.id\"];\n      const _klass = init || event.changed[\"node.classes\"];\n      let primed = false;\n\n      if (_id) {\n        const id = node.get(\"node.id\");\n        if (id !== node.id) {\n          if (!init) {\n            prime(node);\n          }\n          primed = true;\n\n          if (node.id != null) {\n            removeID(node.id, node);\n          }\n          addID(id, node);\n        }\n      }\n\n      if (_klass) {\n        let left;\n        let classes = (left = node.get(\"node.classes\")) != null ? left : [];\n        const klass = classes.join(\",\");\n        if (klass !== (node.classes != null ? node.classes.klass : undefined)) {\n          classes = classes.slice();\n\n          if (!init && !primed) {\n            prime(node);\n          }\n          primed = true;\n\n          if (node.classes != null) {\n            removeClasses(node.classes, node);\n          }\n          addClasses(classes, node);\n\n          node.classes = classes;\n          node.classes.klass = klass;\n        }\n      }\n\n      if (!init && primed) {\n        check(node);\n      }\n      return null;\n    };\n\n    // Manage lookup tables for types/classes/traits\n    const addTags = function (sets, tags, node) {\n      if (tags == null) {\n        return;\n      }\n      for (const k of Array.from(tags)) {\n        const list = sets[k] != null ? sets[k] : [];\n        list.push(node);\n        sets[k] = list;\n      }\n      return null;\n    };\n\n    const removeTags = function (sets, tags, node) {\n      if (tags == null) {\n        return;\n      }\n      for (const k of Array.from(tags)) {\n        const list = sets[k];\n        const index = list.indexOf(node);\n        if (index >= 0) {\n          list.splice(index, 1);\n        }\n        if (list.length === 0) {\n          delete sets[k];\n        }\n      }\n      return null;\n    };\n\n    // Build a hash for an array of tags for quick lookups\n    const hashTags = function (array) {\n      if (!(array.length > 0)) {\n        return;\n      }\n      const hash = (array.hash = {});\n      return Array.from(array).map((klass) => (hash[klass] = true));\n    };\n\n    const unhashTags = (array) => delete array.hash;\n\n    // Track IDs (live)\n    const addID = (id, node) => {\n      if (this.ids[id]) {\n        throw new Error(`Duplicate node id \\`${id}\\``);\n      }\n\n      if (id != null) {\n        this.ids[id] = [node];\n      }\n      return (node.id = id != null ? id : node._id);\n    };\n\n    const removeID = (id, node) => {\n      if (id != null) {\n        delete this.ids[id];\n      }\n      return (node.id = node._id);\n    };\n\n    // Track classes (live)\n    const addClasses = (classes, node) => {\n      addTags(this.classes, classes, node);\n      if (classes != null) {\n        return hashTags(classes);\n      }\n    };\n\n    const removeClasses = (classes, node) => {\n      removeTags(this.classes, classes, node);\n      if (classes != null) {\n        return unhashTags(classes);\n      }\n    };\n\n    // Track nodes\n    const addNode = (node) => this.nodes.push(node);\n    const removeNode = (node) => this.nodes.splice(this.nodes.indexOf(node), 1);\n\n    // Track nodes by type\n    const addType = (node) => addTags(this.types, [node.type], node);\n    const removeType = (node) => removeTags(this.types, [node.type], node);\n\n    // Track nodes by trait\n    const addTraits = (node) => {\n      addTags(this.traits, node.traits, node);\n      return hashTags(node.traits);\n    };\n\n    const removeTraits = (node) => {\n      removeTags(this.traits, node.traits, node);\n      return unhashTags(node.traits);\n    };\n\n    adopt(this.root);\n    this.root.trigger({ type: \"added\" });\n  }\n\n  select(query, context) {\n    return selectAll(query, context || this.getRoot());\n  }\n\n  // Watch selector with handler\n  watch(selector, handler) {\n    let watcher;\n    handler.unwatch = () => this.unwatch(handler);\n    handler.watcher = watcher = {\n      selector,\n      handler,\n      matcher: this._matcher(selector),\n      match: false,\n      fire: false,\n    };\n    this.watchers.push(watcher);\n    return this.select(selector);\n  }\n\n  // Unwatch a handler\n  unwatch(handler) {\n    const { watcher } = handler;\n    if (watcher == null) {\n      return;\n    }\n\n    this.watchers.splice(this.watchers.indexOf(watcher), 1);\n    delete handler.unwatch;\n    return delete handler.watcher;\n  }\n\n  // Make a matcher for a single selector\n  _matcher(query) {\n    if (AUTO.test(query)) {\n      throw new Error(\"Auto-link matcher unsupported\");\n    }\n    return compile(query);\n  }\n\n  getRoot() {\n    return this.root;\n  }\n\n  getLastTrigger() {\n    return this.lastNode.toString();\n  }\n}\n","export * from \"./attributes.js\";\nexport * from \"./group.js\";\nexport * from \"./guard.js\";\nexport * from \"./model.js\";\nexport * from \"./node.js\";\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nexport class OverlayFactory {\n  constructor(classes, canvas) {\n    this.classes = classes;\n    this.canvas = canvas;\n    const div = document.createElement(\"div\");\n    div.classList.add(\"mathbox-overlays\");\n    this.div = div;\n  }\n\n  inject() {\n    const element = this.canvas.parentNode;\n    if (!element) {\n      throw new Error(\"Canvas not inserted into document.\");\n    }\n    return element.insertBefore(this.div, this.canvas);\n  }\n\n  unject() {\n    const element = this.div.parentNode;\n    return element.removeChild(this.div);\n  }\n\n  getTypes() {\n    return Object.keys(this.classes);\n  }\n\n  make(type, options) {\n    return new this.classes[type](this.div, options);\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n// Quick'n'dirty Virtual DOM diffing\n// with a poor man's React for components\n//\n// This is for rendering HTML with data from a GL readback. See DOM examples.\nconst HEAP = [];\nlet id = 0;\n\n// Static render components\nexport const Types = {\n  /*\n  * el('example', props, children);\n  example: MathBox.DOM.createClass({\n    render: (el, props, children) ->\n      * VDOM node\n      return el('span', { className: \"foo\" }, \"Hello World\")\n  })\n  */\n};\n\nconst descriptor = () => ({\n  id: id++,\n  type: null,\n  props: null,\n  children: null,\n  rendered: null,\n  instance: null,\n});\n\nexport const hint = function (n) {\n  n *= 2;\n  n = Math.max(0, HEAP.length - n);\n  return __range__(0, n, false).map((_i) => HEAP.push(descriptor()));\n};\n\nexport const element = function (type, props, children) {\n  const el = HEAP.length ? HEAP.pop() : descriptor();\n\n  el.type = type != null ? type : \"div\";\n  el.props = props != null ? props : null;\n  el.children = children != null ? children : null;\n  // Can't use `arguments` here to pass children as direct args, it de-optimizes label emitters\n\n  return el;\n};\n\nexport const recycle = function (el) {\n  if (!el.type) {\n    return;\n  }\n\n  const { children } = el;\n  el.type = el.props = el.children = el.instance = null;\n\n  HEAP.push(el);\n\n  if (children != null) {\n    for (const child of Array.from(children)) {\n      recycle(child);\n    }\n  }\n};\n\nexport const apply = function (el, last, node, parent, index) {\n  if (el != null) {\n    if (last == null) {\n      // New node\n      return mount(el, parent, index);\n    } else {\n      // Literal DOM node\n      let same;\n      if (el instanceof Node) {\n        same = el === last;\n        if (same) {\n          return;\n        }\n      } else {\n        // Check compatibility\n        same =\n          typeof el === typeof last &&\n          last !== null &&\n          el !== null &&\n          el.type === last.type;\n      }\n\n      if (!same) {\n        // Not compatible: unmount and remount\n        unmount(last.instance, node);\n        node.remove();\n        return mount(el, parent, index);\n      } else {\n        // Maintain component ref\n        let key, ref, value;\n        el.instance = last.instance;\n\n        // Check if it's a component\n        const type = (el.type != null ? el.type.isComponentClass : undefined)\n          ? el.type\n          : Types[el.type];\n\n        // Prepare to diff props and children\n        const props = last != null ? last.props : undefined;\n        const nextProps = el.props;\n        const children =\n          (last != null ? last.children : undefined) != null\n            ? last != null\n              ? last.children\n              : undefined\n            : null;\n        const nextChildren = el.children;\n\n        if (nextProps != null) {\n          nextProps.children = nextChildren;\n        }\n\n        // Component\n        if (type != null) {\n          // See if it changed\n          let dirty = node._COMPONENT_DIRTY;\n\n          if ((props != null) !== (nextProps != null)) {\n            dirty = true;\n          }\n          if (children !== nextChildren) {\n            dirty = true;\n          }\n\n          if (props != null && nextProps != null) {\n            if (!dirty) {\n              for (key in props) {\n                if (!Object.prototype.hasOwnProperty.call(nextProps, key)) {\n                  dirty = true;\n                }\n              }\n            }\n            if (!dirty) {\n              for (key in nextProps) {\n                value = nextProps[key];\n                if ((ref = props[key]) !== value) {\n                  dirty = true;\n                }\n              }\n            }\n          }\n\n          if (dirty) {\n            let left;\n            const comp = last.instance;\n            if (el.props == null) {\n              el.props = {};\n            }\n            for (const k in comp.defaultProps) {\n              const v = comp.defaultProps[k];\n              if (el.props[k] == null) {\n                el.props[k] = v;\n              }\n            }\n            el.props.children = el.children;\n\n            if (typeof comp.willReceiveProps === \"function\") {\n              comp.willReceiveProps(el.props);\n            }\n            const should =\n              node._COMPONENT_FORCE ||\n              ((left =\n                typeof comp.shouldUpdate === \"function\"\n                  ? comp.shouldUpdate(el.props)\n                  : undefined) != null\n                ? left\n                : true);\n\n            if (should) {\n              const nextState = comp.getNextState();\n              if (typeof comp.willUpdate === \"function\") {\n                comp.willUpdate(el.props, nextState);\n              }\n            }\n\n            const prevProps = comp.props;\n            const prevState = comp.applyNextState();\n\n            comp.props = el.props;\n            comp.children = el.children;\n\n            if (should) {\n              el = el.rendered =\n                typeof comp.render === \"function\"\n                  ? comp.render(element, el.props, el.children)\n                  : undefined;\n              apply(el, last.rendered, node, parent, index);\n\n              if (typeof comp.didUpdate === \"function\") {\n                comp.didUpdate(prevProps, prevState);\n              }\n            }\n          }\n\n          return;\n        } else {\n          // VDOM node\n          if (props != null) {\n            for (key in props) {\n              if (!Object.prototype.hasOwnProperty.call(nextProps, key)) {\n                unset(node, key, props[key]);\n              }\n            }\n          }\n          if (nextProps != null) {\n            for (key in nextProps) {\n              value = nextProps[key];\n              if ((ref = props[key]) !== value && key !== \"children\") {\n                set(node, key, value, ref);\n              }\n            }\n          }\n\n          // Diff children\n          if (nextChildren != null) {\n            if ([\"string\", \"number\"].includes(typeof nextChildren)) {\n              // Insert text directly\n              if (nextChildren !== children) {\n                node.textContent = nextChildren;\n              }\n            } else {\n              if (nextChildren.type != null) {\n                // Single child\n                apply(nextChildren, children, node.childNodes[0], node, 0);\n              } else {\n                // Diff children\n                let child, i;\n                const { childNodes } = node;\n                if (children != null) {\n                  for (i = 0; i < nextChildren.length; i++) {\n                    child = nextChildren[i];\n                    apply(child, children[i], childNodes[i], node, i);\n                  }\n                } else {\n                  for (i = 0; i < nextChildren.length; i++) {\n                    child = nextChildren[i];\n                    apply(child, null, childNodes[i], node, i);\n                  }\n                }\n              }\n            }\n          } else if (children != null) {\n            // Unmount all child components\n            unmount(null, node);\n\n            // Remove all children\n            node.innerHTML = \"\";\n          }\n        }\n\n        return;\n      }\n    }\n  }\n\n  if (last != null) {\n    // Removed node\n    unmount(last.instance, node);\n    return last.node.remove();\n  }\n};\n\nconst mount = function (el, parent, index) {\n  let node;\n  if (index == null) {\n    index = 0;\n  }\n  const type = (el.type != null ? el.type.isComponentClass : undefined)\n    ? el.type\n    : Types[el.type];\n\n  // Literal DOM node\n  if (el instanceof Node) {\n    node = el;\n  } else {\n    if (type != null) {\n      // Component\n      let comp;\n      const ctor = (el.type != null ? el.type.isComponentClass : undefined)\n        ? el.type\n        : Types[el.type];\n\n      // No component class found\n      if (!ctor) {\n        el = el.rendered = element(\"noscript\");\n        node = mount(el, parent, index);\n        return node;\n      }\n\n      // Construct component class\n      el.instance = comp = new ctor(parent);\n      if (el.props == null) {\n        el.props = {};\n      }\n      for (const k in comp.defaultProps) {\n        const v = comp.defaultProps[k];\n        if (el.props[k] == null) {\n          el.props[k] = v;\n        }\n      }\n      el.props.children = el.children;\n\n      // Do initial state transition\n      comp.props = el.props;\n      comp.children = el.children;\n      comp.setState(\n        typeof comp.getInitialState === \"function\"\n          ? comp.getInitialState()\n          : undefined\n      );\n      if (typeof comp.willMount === \"function\") {\n        comp.willMount();\n      }\n\n      // Render\n      el = el.rendered =\n        typeof comp.render === \"function\"\n          ? comp.render(element, el.props, el.children)\n          : undefined;\n      node = mount(el, parent, index);\n\n      // Finish mounting and remember component/node association\n      if (typeof comp.didMount === \"function\") {\n        comp.didMount(el);\n      }\n      node._COMPONENT = comp;\n\n      return node;\n    } else if ([\"string\", \"number\"].includes(typeof el)) {\n      // Text\n      node = document.createTextNode(el);\n    } else {\n      // VDOM Node\n      node = document.createElement(el.type);\n      for (const key in el.props) {\n        const value = el.props[key];\n        set(node, key, value);\n      }\n    }\n\n    const { children } = el;\n    if (children != null) {\n      if ([\"string\", \"number\"].includes(typeof children)) {\n        // Insert text directly\n        node.textContent = children;\n      } else {\n        if (children.type != null) {\n          // Single child\n          mount(children, node, 0);\n        } else {\n          // Insert children\n          for (let i = 0; i < children.length; i++) {\n            const child = children[i];\n            mount(child, node, i);\n          }\n        }\n      }\n    }\n  }\n\n  parent.insertBefore(node, parent.childNodes[index]);\n  return node;\n};\n\nconst unmount = function (comp, node) {\n  if (comp) {\n    if (typeof comp.willUnmount === \"function\") {\n      comp.willUnmount();\n    }\n    for (const k in comp) {\n      delete comp[k];\n    }\n  }\n\n  return (() => {\n    const result = [];\n    for (const child of Array.from(node.childNodes)) {\n      unmount(child._COMPONENT, child);\n      result.push(delete child._COMPONENT);\n    }\n    return result;\n  })();\n};\n\nconst prop = function (key) {\n  if (typeof document === \"undefined\") {\n    return true;\n  }\n  if (document.documentElement.style[key] != null) {\n    return key;\n  }\n\n  key = key[0].toUpperCase() + key.slice(1);\n  const prefixes = [\"webkit\", \"moz\", \"ms\", \"o\"];\n  for (const prefix of Array.from(prefixes)) {\n    if (document.documentElement.style[prefix + key] != null) {\n      return prefix + key;\n    }\n  }\n};\n\nconst map = {};\nfor (const key of [\"transform\"]) {\n  map[key] = prop(key);\n}\n\nconst set = function (node, key, value, orig) {\n  if (key === \"style\") {\n    for (const k in value) {\n      const v = value[k];\n      if ((orig != null ? orig[k] : undefined) !== v) {\n        node.style[map[k] != null ? map[k] : k] = v;\n      }\n    }\n    return;\n  }\n\n  if (node[key] != null) {\n    try {\n      node[key] = value;\n    } catch (e1) {\n      console.log(\"failed setting \" + key);\n    }\n    return;\n  }\n\n  if (node instanceof Node) {\n    node.setAttribute(key, value);\n    return;\n  }\n};\n\nconst unset = function (node, key, orig) {\n  if (key === \"style\") {\n    for (const k in orig) {\n      node.style[map[k] != null ? map[k] : k] = \"\";\n    }\n    return;\n  }\n\n  if (node[key] != null) {\n    node[key] = undefined;\n  }\n\n  if (node instanceof Node) {\n    node.removeAttribute(key);\n    return;\n  }\n};\n\nexport const createClass = function (prototype) {\n  let left;\n  const aliases = {\n    willMount: \"componentWillMount\",\n    didMount: \"componentDidMount\",\n    willReceiveProps: \"componentWillReceiveProps\",\n    shouldUpdate: \"shouldComponentUpdate\",\n    willUpdate: \"componentWillUpdate\",\n    didUpdate: \"componentDidUpdate\",\n    willUnmount: \"componentWillUnmount\",\n  };\n  for (const a in aliases) {\n    const b = aliases[a];\n    if (prototype[a] == null) {\n      prototype[a] = prototype[b];\n    }\n  }\n\n  class Component {\n    constructor(node, props, state = null, children = null) {\n      let k, v;\n      if (props == null) {\n        props = {};\n      }\n      this.props = props;\n      this.state = state;\n      this.children = children;\n      const bind = function (f, self) {\n        if (typeof f === \"function\") {\n          return f.bind(self);\n        } else {\n          return f;\n        }\n      };\n      for (k in prototype) {\n        v = prototype[k];\n        this[k] = bind(v, this);\n      }\n\n      let nextState = null;\n\n      this.setState = function (state) {\n        if (nextState == null) {\n          nextState = state ? (nextState != null ? nextState : {}) : null;\n        }\n        for (k in state) {\n          v = state[k];\n          nextState[k] = v;\n        }\n        node._COMPONENT_DIRTY = true;\n      };\n\n      this.forceUpdate = function () {\n        node._COMPONENT_FORCE = node._COMPONENT_DIRTY = true;\n\n        let el = node;\n        return (() => {\n          const result = [];\n          while ((el = el.parentNode)) {\n            if (el._COMPONENT) {\n              result.push((el._COMPONENT_FORCE = true));\n            } else {\n              result.push(undefined);\n            }\n          }\n          return result;\n        })();\n      };\n\n      this.getNextState = () => nextState;\n\n      this.applyNextState = function () {\n        node._COMPONENT_FORCE = node._COMPONENT_DIRTY = false;\n        const prevState = this.state;\n        [nextState, this.state] = Array.from([null, nextState]);\n        return prevState;\n      };\n    }\n  }\n\n  Component.isComponentClass = true;\n  Component.prototype.defaultProps =\n    (left =\n      typeof prototype.getDefaultProps === \"function\"\n        ? prototype.getDefaultProps()\n        : undefined) != null\n      ? left\n      : {};\n  return Component;\n};\n\nfunction __range__(left, right, inclusive) {\n  const range = [];\n  const ascending = left < right;\n  const end = !inclusive ? right : ascending ? right + 1 : right - 1;\n  for (let i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {\n    range.push(i);\n  }\n  return range;\n}\n","export class Overlay {\n  constructor(element, options) {\n    this.element = element;\n    if (typeof this.init === \"function\") {\n      this.init(options);\n    }\n  }\n\n  dispose() {}\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as VDOM from \"../util/vdom.js\";\nimport { Overlay } from \"./overlay.js\";\n\nexport class DOM extends Overlay {\n  static initClass() {\n    this.prototype.el = VDOM.element;\n    this.prototype.hint = VDOM.hint;\n    this.prototype.apply = VDOM.apply;\n    this.prototype.recycle = VDOM.recycle;\n  }\n\n  init(_options) {\n    return (this.last = null);\n  }\n\n  dispose() {\n    this.unmount();\n    return super.dispose();\n  }\n\n  mount() {\n    const overlay = document.createElement(\"div\");\n    overlay.classList.add(\"mathbox-overlay\");\n    this.element.appendChild(overlay);\n    return (this.overlay = overlay);\n  }\n\n  unmount(_overlay) {\n    if (this.overlay && this.overlay.parentNode) {\n      this.element.removeChild(this.overlay);\n    }\n    return (this.overlay = null);\n  }\n\n  render(el) {\n    // Lazy mounting\n    if (!this.overlay) {\n      this.mount();\n    }\n\n    // Wrap naked string or array in a div\n    if ([\"string\", \"number\"].includes(typeof el)) {\n      el = this.el(\"div\", null, el);\n    }\n    if (el instanceof Array) {\n      el = this.el(\"div\", null, el);\n    }\n\n    // Create empty div if el is null\n    if (el == null) {\n      el = this.el(\"div\");\n    }\n\n    // See if it can be mounted directly\n    const naked = el.type === \"div\";\n\n    // Fetch last DOM state\n    let { last } = this;\n\n    // Start with root node\n    const { overlay } = this;\n    const node = naked ? overlay : overlay.childNodes[0];\n    const parent = naked ? overlay.parentNode : overlay;\n\n    // Create phantom DOM state if mounting into existing element\n    if (!last && node) {\n      last = this.el(\"div\");\n    }\n\n    // Update DOM\n    this.apply(el, last, node, parent, 0);\n    this.last = el;\n\n    // Recycle old descriptors\n    if (last != null) {\n      this.recycle(last);\n    }\n  }\n}\nDOM.initClass();\n","import { DOM } from \"./dom.js\";\n\nexport const Classes = { dom: DOM };\n","export { OverlayFactory as Factory } from \"./factory.js\";\nexport * from \"./classes.js\";\nexport * from \"./overlay.js\";\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as Model from \"../model\";\nimport { Binder } from \"threestrap/src/binder.js\";\n\nexport class Primitive {\n  static initClass() {\n    this.Node = Model.Node;\n    this.Group = Model.Group;\n\n    // Class default\n    this.model = this.Node;\n    this.defaults = null;\n    this.traits = null;\n    this.props = null;\n    this.finals = null;\n    this.freeform = false;\n  }\n\n  constructor(node, _context, helpers) {\n    this.node = node;\n    this._context = _context;\n    this._renderables = this._context.renderables;\n    this._attributes = this._context.attributes;\n    this._shaders = this._context.shaders;\n    this._overlays = this._context.overlays;\n    this._animator = this._context.animator;\n    this._types = this._attributes.types;\n\n    // Link up node 1-to-1\n    this.node.controller = this;\n\n    // This node has been inserted/removed\n    this.node.on(\"added\", (_event) => this._added());\n    this.node.on(\"removed\", (_event) => this._removed());\n\n    // Property change (if mounted)\n    this.node.on(\"change\", (event) => {\n      if (this._root) {\n        return this.change(event.changed, event.touched);\n      }\n    });\n\n    // Store local refs\n    this.reconfigure();\n\n    // Attribute getter / helpers\n    this._get = this.node.get.bind(this.node);\n    this._helpers = helpers(this, this.node.traits);\n\n    // Keep track of various handlers to do auto-cleanup on unmake()\n    this._handlers = { inherit: {}, listen: [], watch: [], compute: [] };\n\n    // Detached initially\n    this._root = this._parent = null;\n\n    // Friendly constructor\n    this.init();\n  }\n\n  is(trait) {\n    return this.traits.hash[trait];\n  }\n\n  // Primitive lifecycle\n  init() {}\n  make() {}\n  made() {}\n  unmake(_rebuild) {}\n  unmade() {}\n  change(_changed, _touched, _init) {}\n\n  // Force property reinit\n  refresh() {\n    return this.change({}, {}, true);\n  }\n\n  // Destroy and create cycle\n  rebuild() {\n    if (this._root) {\n      this._removed(true);\n      return this._added();\n    }\n  }\n\n  // Reconfigure traits/props\n  reconfigure(config) {\n    if (config != null) {\n      this.node.configure(config, this._attributes);\n    }\n\n    this.traits = this.node.traits;\n    return (this.props = this.node.props);\n  }\n\n  // This node has been inserted\n  _added() {\n    let e, left;\n    this._parent =\n      this.node.parent != null ? this.node.parent.controller : undefined;\n    this._root = this.node.root != null ? this.node.root.controller : undefined;\n\n    this.node.clock =\n      (left = this._inherit(\"clock\")) != null ? left : this._root;\n\n    try {\n      try {\n        this.make();\n        this.refresh();\n        return this.made();\n      } catch (error) {\n        e = error;\n        this.node.print(\"warn\");\n        console.error(e);\n        throw e;\n      }\n    } catch (error1) {\n      e = error1;\n      try {\n        return this._removed();\n        // eslint-disable-next-line no-empty\n      } catch (error2) {}\n    }\n  }\n\n  _removed(rebuild) {\n    if (rebuild == null) {\n      rebuild = false;\n    }\n    this.unmake(rebuild);\n\n    this._unlisten();\n    this._unattach();\n    this._uncompute();\n\n    this._root = null;\n    this._parent = null;\n\n    return this.unmade(rebuild);\n  }\n\n  // Bind event listeners to methods\n  _listen(object, type, method, self) {\n    if (self == null) {\n      self = this;\n    }\n    if (object instanceof Array) {\n      for (const o of Array.from(object)) {\n        return this.__listen(o, type, method, self);\n      }\n    }\n    return this.__listen(object, type, method, self);\n  }\n\n  __listen(object, type, method, self) {\n    if (self == null) {\n      self = this;\n    }\n    if (typeof object === \"string\") {\n      object = this._inherit(object);\n    }\n\n    if (object != null) {\n      const handler = method.bind(self);\n      handler.node = this.node;\n      object.on(type, handler);\n\n      this._handlers.listen.push([object, type, handler]);\n    }\n    return object;\n  }\n\n  _unlisten() {\n    if (!this._handlers.listen.length) {\n      return;\n    }\n\n    for (const [object, type, handler] of Array.from(this._handlers.listen)) {\n      object.off(type, handler);\n    }\n    return (this._handlers.listen = []);\n  }\n\n  // Find parent with certain trait\n  _inherit(trait) {\n    const cached = this._handlers.inherit[trait];\n    if (cached !== undefined) {\n      return cached;\n    }\n\n    return (this._handlers.inherit[trait] =\n      this._parent != null\n        ? this._parent._find(trait != null ? trait : null)\n        : undefined);\n  }\n\n  _find(trait) {\n    if (this.is(trait)) {\n      return this;\n    }\n    return this._parent != null ? this._parent._find(trait) : undefined;\n  }\n\n  _uninherit() {\n    return (this._handlers.inherit = {});\n  }\n\n  // Attach to controller by trait and watch the selector\n  _attach(selector, trait, method, self, start, optional, multiple) {\n    if (self == null) {\n      self = this;\n    }\n    if (start == null) {\n      start = this;\n    }\n    if (optional == null) {\n      optional = false;\n    }\n    if (multiple == null) {\n      multiple = false;\n    }\n    const filter = function (node) {\n      if (node != null && Array.from(node.traits).includes(trait)) {\n        return node;\n      }\n    };\n    const map = (node) => (node != null ? node.controller : undefined);\n    const flatten = function (list) {\n      if (list == null) {\n        return list;\n      }\n      let out = [];\n      for (const sub of Array.from(list)) {\n        if (sub instanceof Array) {\n          out = out.concat(sub);\n        } else {\n          out.push(sub);\n        }\n      }\n      return out;\n    };\n\n    const resolve = (selector) => {\n      // Direct JS binding, no watcher.\n      let node, nodes;\n      if (typeof selector === \"object\") {\n        node = selector;\n\n        // API object\n        if (node != null ? node._up : undefined) {\n          selector = multiple ? node._targets : [node[0]];\n          return selector;\n        }\n\n        // Array of things\n        if (node instanceof Array) {\n          selector = multiple ? flatten(node.map(resolve)) : resolve(node[0]);\n          return selector;\n        }\n\n        // Node\n        if (node instanceof Model.Node) {\n          return [node];\n        }\n\n        // Auto-link selector '<'\n      } else if (typeof selector === \"string\" && selector[0] === \"<\") {\n        let match;\n        let discard = 0;\n        if ((match = selector.match(/^<([0-9])+$/))) {\n          discard = +match[1] - 1;\n        }\n        if (selector.match(/^<+$/)) {\n          discard = +selector.length - 1;\n        }\n\n        nodes = [];\n\n        // Implicitly associated node (scan backwards until we find one)\n        let previous = start.node;\n        while (previous) {\n          // Find previous node\n          const { parent } = previous;\n          if (!parent) {\n            break;\n          }\n          previous = parent.children[previous.index - 1];\n\n          // If we reached the first child, ascend if nothing found yet\n          if (!previous && !nodes.length) {\n            previous = parent;\n          }\n\n          // Include if matched\n          node = null;\n          if (filter(previous)) {\n            node = previous;\n          }\n          if (node != null && discard-- <= 0) {\n            nodes.push(node);\n          }\n\n          // Return solo match\n          if (!multiple && nodes.length) {\n            return nodes;\n          }\n        }\n\n        // Return list match\n        if (multiple && nodes.length) {\n          return nodes;\n        }\n\n        // Selector binding\n      } else if (typeof selector === \"string\") {\n        const watcher = method.bind(self);\n        this._handlers.watch.push(watcher);\n\n        const selection = this._root.watch(selector, watcher);\n        if (!multiple) {\n          if (filter(selection[0])) {\n            node = selection[0];\n          }\n          if (node != null) {\n            return [node];\n          }\n        } else {\n          nodes = selection.filter(filter);\n          if (nodes.length) {\n            return nodes;\n          }\n        }\n      }\n\n      // Nothing found\n      if (!optional) {\n        console.warn(this.node.toMarkup());\n        throw new Error(\n          `${this.node.toString()} - Could not find ${trait} \\`${selector}\\``\n        );\n      }\n      if (multiple) {\n        return [];\n      } else {\n        return null;\n      }\n    };\n\n    // Resolve selection recursively\n    const nodes = flatten(resolve(selector));\n\n    // Return node's controllers if found\n    if (multiple) {\n      if (nodes != null) {\n        return nodes.map(map);\n      } else {\n        return null;\n      }\n    } else {\n      if (nodes != null) {\n        return map(nodes[0]);\n      } else {\n        return null;\n      }\n    }\n  }\n\n  // Remove watcher attachments\n  _unattach() {\n    if (!this._handlers.watch.length) {\n      return;\n    }\n\n    for (const watcher of Array.from(this._handlers.watch)) {\n      if (watcher != null) {\n        watcher.unwatch();\n      }\n    }\n    return (this._handlers.watch = []);\n  }\n\n  // Bind a computed value to a prop\n  _compute(key, expr) {\n    this._handlers.compute.push(key);\n    return this.node.bind(key, expr, true);\n  }\n\n  // Remove prop bindings\n  _uncompute() {\n    if (!this._handlers.compute.length) {\n      return;\n    }\n    for (const key of Array.from(this._handlers.compute)) {\n      this.node.unbind(key, true);\n    }\n    return (this._handlers.compute = []);\n  }\n}\nPrimitive.initClass();\n\nBinder.apply(Primitive.prototype);\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Primitive } from \"../../primitive.js\";\n\nexport class Parent extends Primitive {\n  static initClass() {\n    this.model = Primitive.Group;\n    this.traits = [\"node\"];\n  }\n}\nParent.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Parent } from \"./parent.js\";\n\nexport class Group extends Parent {\n  static initClass() {\n    this.traits = [\"node\", \"object\", \"entity\", \"visible\", \"active\"];\n  }\n\n  make() {\n    this._helpers.visible.make();\n    return this._helpers.active.make();\n  }\n\n  unmake() {\n    this._helpers.visible.unmake();\n    return this._helpers.active.unmake();\n  }\n}\nGroup.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Parent } from \"./parent.js\";\n\nexport class Inherit extends Parent {\n  static initClass() {\n    this.traits = [\"node\", \"bind\"];\n  }\n\n  make() {\n    // Bind to attached trait source\n    return this._helpers.bind.make([{ to: \"inherit.source\", trait: \"node\" }]);\n  }\n\n  unmake() {\n    return this._helpers.bind.unmake();\n  }\n\n  _find(trait) {\n    if (this.bind.source && Array.from(this.props.traits).includes(trait)) {\n      return this.bind.source._inherit(trait);\n    }\n    return super._find();\n  }\n}\nInherit.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining\n * DS104: Avoid inline assignments\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Parent } from \"./parent.js\";\n\nexport class Root extends Parent {\n  static initClass() {\n    this.traits = [\"node\", \"root\", \"clock\", \"scene\", \"vertex\", \"unit\"];\n  }\n\n  init() {\n    this.size = null;\n\n    this.cameraEvent = { type: \"root.camera\" };\n    this.preEvent = { type: \"root.pre\" };\n    this.updateEvent = { type: \"root.update\" };\n    this.renderEvent = { type: \"root.render\" };\n    this.postEvent = { type: \"root.post\" };\n\n    this.clockEvent = { type: \"clock.tick\" };\n\n    return (this.camera = null);\n  }\n\n  make() {\n    return this._helpers.unit.make();\n  }\n  unmake() {\n    return this._helpers.unit.unmake();\n  }\n\n  change(changed, touched, init) {\n    if (changed[\"root.camera\"] || init) {\n      this._unattach();\n      this._attach(\n        this.props.camera,\n        \"camera\",\n        this.setCamera,\n        this,\n        this,\n        true\n      );\n      return this.setCamera();\n    }\n  }\n\n  adopt(renderable) {\n    return Array.from(renderable.renders).map((object) =>\n      this._context.scene.add(object)\n    );\n  }\n  unadopt(renderable) {\n    return Array.from(renderable.renders).map((object) =>\n      this._context.scene.remove(object)\n    );\n  }\n\n  select(selector) {\n    return this.node.model.select(selector);\n  }\n\n  watch(selector, handler) {\n    return this.node.model.watch(selector, handler);\n  }\n\n  unwatch(handler) {\n    return this.node.model.unwatch(handler);\n  }\n\n  resize(size) {\n    this.size = size;\n    return this.trigger({\n      type: \"root.resize\",\n      size,\n    });\n  }\n\n  getSize() {\n    return this.size;\n  }\n  getSpeed() {\n    return this.props.speed;\n  }\n\n  getUnit() {\n    return this._helpers.unit.get();\n  }\n  getUnitUniforms() {\n    return this._helpers.unit.uniforms();\n  }\n\n  pre() {\n    this.getCamera().updateProjectionMatrix();\n    this.trigger(this.clockEvent);\n    return this.trigger(this.preEvent);\n  }\n\n  update() {\n    return this.trigger(this.updateEvent);\n  }\n  render() {\n    return this.trigger(this.renderEvent);\n  }\n  post() {\n    return this.trigger(this.postEvent);\n  }\n\n  setCamera() {\n    const camera = __guard__(\n      this.select(this.props.camera)[0],\n      (x) => x.controller\n    );\n    if (this.camera !== camera) {\n      this.camera = camera;\n      return this.trigger({ type: \"root.camera\" });\n    }\n  }\n\n  getCamera() {\n    let left;\n    return (left = this.camera != null ? this.camera.getCamera() : undefined) !=\n      null\n      ? left\n      : this._context.defaultCamera;\n  }\n\n  getTime() {\n    return this._context.time;\n  }\n\n  // End transform chain here\n  vertex(shader, pass) {\n    if (pass === 2) {\n      return shader.pipe(\"view.position\");\n    }\n    if (pass === 3) {\n      return shader.pipe(\"root.position\");\n    }\n    return shader;\n  }\n}\nRoot.initClass();\n\nfunction __guard__(value, transform) {\n  return typeof value !== \"undefined\" && value !== null\n    ? transform(value)\n    : undefined;\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Parent } from \"./parent.js\";\n\nexport class Unit extends Parent {\n  static initClass() {\n    this.traits = [\"node\", \"unit\"];\n  }\n\n  make() {\n    return this._helpers.unit.make();\n  }\n  unmake() {\n    return this._helpers.unit.unmake();\n  }\n\n  getUnit() {\n    return this._helpers.unit.get();\n  }\n  getUnitUniforms() {\n    return this._helpers.unit.uniforms();\n  }\n}\nUnit.initClass();\n","export * from \"./group.js\";\nexport * from \"./inherit.js\";\nexport * from \"./root.js\";\nexport * from \"./unit.js\";\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport * as CONST from \"three/src/constants.js\";\n\nimport { Euler } from \"three/src/math/Euler.js\";\nimport { Matrix4 } from \"three/src/math/Matrix4.js\";\nimport { Quaternion } from \"three/src/math/Quaternion.js\";\nimport { Vector3 } from \"three/src/math/Vector3.js\";\n\nexport const paramToGL = function (gl, p) {\n  if (p === CONST.RepeatWrapping) {\n    return gl.REPEAT;\n  }\n  if (p === CONST.ClampToEdgeWrapping) {\n    return gl.CLAMP_TO_EDGE;\n  }\n  if (p === CONST.MirroredRepeatWrapping) {\n    return gl.MIRRORED_REPEAT;\n  }\n\n  if (p === CONST.NearestFilter) {\n    return gl.NEAREST;\n  }\n  if (p === CONST.NearestMipMapNearestFilter) {\n    return gl.NEAREST_MIPMAP_NEAREST;\n  }\n  if (p === CONST.NearestMipMapLinearFilter) {\n    return gl.NEAREST_MIPMAP_LINEAR;\n  }\n\n  if (p === CONST.LinearFilter) {\n    return gl.LINEAR;\n  }\n  if (p === CONST.LinearMipMapNearestFilter) {\n    return gl.LINEAR_MIPMAP_NEAREST;\n  }\n  if (p === CONST.LinearMipMapLinearFilter) {\n    return gl.LINEAR_MIPMAP_LINEAR;\n  }\n\n  if (p === CONST.UnsignedByteType) {\n    return gl.UNSIGNED_BYTE;\n  }\n  if (p === CONST.UnsignedShort4444Type) {\n    return gl.UNSIGNED_SHORT_4_4_4_4;\n  }\n  if (p === CONST.UnsignedShort5551Type) {\n    return gl.UNSIGNED_SHORT_5_5_5_1;\n  }\n  if (p === CONST.ByteType) {\n    return gl.BYTE;\n  }\n  if (p === CONST.ShortType) {\n    return gl.SHORT;\n  }\n  if (p === CONST.UnsignedShortType) {\n    return gl.UNSIGNED_SHORT;\n  }\n  if (p === CONST.IntType) {\n    return gl.INT;\n  }\n  if (p === CONST.UnsignedIntType) {\n    return gl.UNSIGNED_INT;\n  }\n  if (p === CONST.FloatType) {\n    return gl.FLOAT;\n  }\n\n  if (p === CONST.AlphaFormat) {\n    return gl.ALPHA;\n  }\n  if (p === CONST.RGBAFormat) {\n    return gl.RGBA;\n  }\n  if (p === CONST.LuminanceFormat) {\n    return gl.LUMINANCE;\n  }\n  if (p === CONST.LuminanceAlphaFormat) {\n    return gl.LUMINANCE_ALPHA;\n  }\n\n  if (p === CONST.AddEquation) {\n    return gl.FUNC_ADD;\n  }\n  if (p === CONST.SubtractEquation) {\n    return gl.FUNC_SUBTRACT;\n  }\n  if (p === CONST.ReverseSubtractEquation) {\n    return gl.FUNC_REVERSE_SUBTRACT;\n  }\n\n  if (p === CONST.ZeroFactor) {\n    return gl.ZERO;\n  }\n  if (p === CONST.OneFactor) {\n    return gl.ONE;\n  }\n  if (p === CONST.SrcColorFactor) {\n    return gl.SRC_COLOR;\n  }\n  if (p === CONST.OneMinusSrcColorFactor) {\n    return gl.ONE_MINUS_SRC_COLOR;\n  }\n  if (p === CONST.SrcAlphaFactor) {\n    return gl.SRC_ALPHA;\n  }\n  if (p === CONST.OneMinusSrcAlphaFactor) {\n    return gl.ONE_MINUS_SRC_ALPHA;\n  }\n  if (p === CONST.DstAlphaFactor) {\n    return gl.DST_ALPHA;\n  }\n  if (p === CONST.OneMinusDstAlphaFactor) {\n    return gl.ONE_MINUS_DST_ALPHA;\n  }\n\n  if (p === CONST.DstColorFactor) {\n    return gl.DST_COLOR;\n  }\n  if (p === CONST.OneMinusDstColorFactor) {\n    return gl.ONE_MINUS_DST_COLOR;\n  }\n  if (p === CONST.SrcAlphaSaturateFactor) {\n    return gl.SRC_ALPHA_SATURATE;\n  }\n\n  return 0;\n};\n\nexport const paramToArrayStorage = function (type) {\n  switch (type) {\n    case CONST.UnsignedByteType:\n      return Uint8Array;\n    case CONST.ByteType:\n      return Int8Array;\n    case CONST.ShortType:\n      return Int16Array;\n    case CONST.UnsignedShortType:\n      return Uint16Array;\n    case CONST.IntType:\n      return Int32Array;\n    case CONST.UnsignedIntType:\n      return Uint32Array;\n    case CONST.FloatType:\n      return Float32Array;\n  }\n};\n\nexport const swizzleToEulerOrder = (swizzle) =>\n  swizzle.map((i) => [\"\", \"X\", \"Y\", \"Z\"][i]).join(\"\");\n\nexport const transformComposer = function () {\n  const euler = new Euler();\n  const quat = new Quaternion();\n  const pos = new Vector3();\n  const scl = new Vector3();\n  const transform = new Matrix4();\n\n  return function (position, rotation, quaternion, scale, matrix, eulerOrder) {\n    if (eulerOrder == null) {\n      eulerOrder = \"XYZ\";\n    }\n    if (rotation != null) {\n      if (eulerOrder instanceof Array) {\n        eulerOrder = swizzleToEulerOrder(eulerOrder);\n      }\n      euler.setFromVector3(rotation, eulerOrder);\n      quat.setFromEuler(euler);\n    } else {\n      quat.set(0, 0, 0, 1);\n    }\n\n    if (quaternion != null) {\n      quat.multiply(quaternion);\n    }\n\n    if (position != null) {\n      pos.copy(position);\n    } else {\n      pos.set(0, 0, 0);\n    }\n\n    if (scale != null) {\n      scl.copy(scale);\n    } else {\n      scl.set(1, 1, 1);\n    }\n\n    transform.compose(pos, quat, scl);\n    if (matrix != null) {\n      transform.multiplyMatrices(transform, matrix);\n    }\n\n    return transform;\n  };\n};\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UThree from \"../../../util/three.js\";\nimport { Euler } from \"three/src/math/Euler.js\";\nimport { Primitive } from \"../../primitive.js\";\nimport { Quaternion } from \"three/src/math/Quaternion.js\";\n\nexport class Camera extends Primitive {\n  static initClass() {\n    this.traits = [\"node\", \"camera\"];\n  }\n\n  init() {}\n\n  make() {\n    const camera = this._context.defaultCamera;\n    this.camera = this.props.proxy ? camera : camera.clone();\n\n    this.euler = new Euler();\n    return (this.quat = new Quaternion());\n  }\n\n  unmake() {}\n\n  getCamera() {\n    return this.camera;\n  }\n\n  change(changed, touched, init) {\n    if (\n      changed[\"camera.position\"] ||\n      changed[\"camera.quaternion\"] ||\n      changed[\"camera.rotation\"] ||\n      changed[\"camera.lookAt\"] ||\n      changed[\"camera.up\"] ||\n      changed[\"camera.fov\"] ||\n      init\n    ) {\n      const { position, quaternion, rotation, lookAt, up, fov } = this.props;\n\n      // Apply transform conservatively to avoid conflicts with controls / proxy\n      if (position != null) {\n        this.camera.position.copy(position);\n      }\n\n      if (quaternion != null || rotation != null || lookAt != null) {\n        if (lookAt != null) {\n          this.camera.lookAt(lookAt);\n        } else {\n          this.camera.quaternion.set(0, 0, 0, 1);\n        }\n\n        if (rotation != null) {\n          this.euler.setFromVector3(\n            rotation,\n            UThree.swizzleToEulerOrder(this.props.eulerOrder)\n          );\n          this.quat.setFromEuler(this.euler);\n          this.camera.quaternion.multiply(this.quat);\n        }\n\n        if (quaternion != null) {\n          this.camera.quaternion.multiply(quaternion);\n        }\n      }\n\n      if (fov != null && this.camera.fov != null) {\n        this.camera.fov = fov;\n      }\n\n      if (up != null) {\n        this.camera.up.copy(up);\n      }\n\n      return this.camera.updateMatrix();\n    }\n  }\n}\nCamera.initClass();\n","export * from \"./camera.js\";\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS202: Simplify dynamic range loops\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nexport const getSizes = function (data) {\n  const sizes = [];\n  let array = data;\n  while (\n    typeof array !== \"string\" &&\n    (array != null ? array.length : undefined) != null\n  ) {\n    sizes.push(array.length);\n    array = array[0];\n  }\n  return sizes;\n};\n\nexport const getDimensions = function (data, spec) {\n  let left;\n  if (spec == null) {\n    spec = {};\n  }\n  const { items, channels, width, height, depth } = spec;\n\n  const dims = {};\n\n  if (!data || !data.length) {\n    return {\n      items,\n      channels,\n      width: width != null ? width : 0,\n      height: height != null ? height : 0,\n      depth: depth != null ? depth : 0,\n    };\n  }\n\n  const sizes = getSizes(data);\n  const nesting = sizes.length;\n\n  dims.channels = channels !== 1 && sizes.length > 1 ? sizes.pop() : channels;\n  dims.items = items !== 1 && sizes.length > 1 ? sizes.pop() : items;\n  dims.width = width !== 1 && sizes.length > 1 ? sizes.pop() : width;\n  dims.height = height !== 1 && sizes.length > 1 ? sizes.pop() : height;\n  dims.depth = depth !== 1 && sizes.length > 1 ? sizes.pop() : depth;\n\n  let levels = nesting;\n  if (channels === 1) {\n    levels++;\n  }\n  if (items === 1 && levels > 1) {\n    levels++;\n  }\n  if (width === 1 && levels > 2) {\n    levels++;\n  }\n  if (height === 1 && levels > 3) {\n    levels++;\n  }\n\n  let n = (left = sizes.pop()) != null ? left : 1;\n  if (levels <= 1) {\n    n /= dims.channels != null ? dims.channels : 1;\n  }\n  if (levels <= 2) {\n    n /= dims.items != null ? dims.items : 1;\n  }\n  if (levels <= 3) {\n    n /= dims.width != null ? dims.width : 1;\n  }\n  if (levels <= 4) {\n    n /= dims.height != null ? dims.height : 1;\n  }\n  n = Math.floor(n);\n\n  if (dims.width == null) {\n    dims.width = n;\n    n = 1;\n  }\n  if (dims.height == null) {\n    dims.height = n;\n    n = 1;\n  }\n  if (dims.depth == null) {\n    dims.depth = n;\n    n = 1;\n  }\n\n  return dims;\n};\n\nexport const repeatCall = function (call, times) {\n  switch (times) {\n    case 0:\n      return () => true;\n    case 1:\n      return () => call();\n    case 2:\n      return function () {\n        call();\n        return call();\n      };\n    case 3:\n      return function () {\n        call();\n        call();\n        call();\n        return call();\n      };\n    case 4:\n      return function () {\n        call();\n        call();\n        call();\n        return call();\n      };\n    case 6:\n      return function () {\n        call();\n        call();\n        call();\n        call();\n        call();\n        return call();\n      };\n    case 8:\n      return function () {\n        call();\n        call();\n        call();\n        call();\n        call();\n        return call();\n      };\n  }\n};\n\nexport const makeEmitter = function (thunk, items, channels) {\n  let outer;\n  const inner = (() => {\n    switch (channels) {\n      case 0:\n        return () => true;\n      case 1:\n        return (emit) => emit(thunk());\n      case 2:\n        return (emit) => emit(thunk(), thunk());\n      case 3:\n        return (emit) => emit(thunk(), thunk(), thunk());\n      case 4:\n        return (emit) => emit(thunk(), thunk(), thunk(), thunk());\n      case 6:\n        return (emit) =>\n          emit(thunk(), thunk(), thunk(), thunk(), thunk(), thunk());\n      case 8:\n        return (emit) =>\n          emit(\n            thunk(),\n            thunk(),\n            thunk(),\n            thunk(),\n            thunk(),\n            thunk(),\n            thunk(),\n            thunk()\n          );\n    }\n  })();\n\n  let next = null;\n  while (items > 0) {\n    const n = Math.min(items, 8);\n    outer = (() => {\n      switch (n) {\n        case 1:\n          return (emit) => inner(emit);\n        case 2:\n          return function (emit) {\n            inner(emit);\n            return inner(emit);\n          };\n        case 3:\n          return function (emit) {\n            inner(emit);\n            inner(emit);\n            return inner(emit);\n          };\n        case 4:\n          return function (emit) {\n            inner(emit);\n            inner(emit);\n            inner(emit);\n            return inner(emit);\n          };\n        case 5:\n          return function (emit) {\n            inner(emit);\n            inner(emit);\n            inner(emit);\n            inner(emit);\n            return inner(emit);\n          };\n        case 6:\n          return function (emit) {\n            inner(emit);\n            inner(emit);\n            inner(emit);\n            inner(emit);\n            inner(emit);\n            return inner(emit);\n          };\n        case 7:\n          return function (emit) {\n            inner(emit);\n            inner(emit);\n            inner(emit);\n            inner(emit);\n            inner(emit);\n            inner(emit);\n            return inner(emit);\n          };\n        case 8:\n          return function (emit) {\n            inner(emit);\n            inner(emit);\n            inner(emit);\n            inner(emit);\n            inner(emit);\n            inner(emit);\n            inner(emit);\n            return inner(emit);\n          };\n      }\n    })();\n    if (next != null) {\n      next = ((outer, next) =>\n        function (emit) {\n          outer(emit);\n          return next(emit);\n        })(outer, next);\n    } else {\n      next = outer;\n    }\n    items -= n;\n  }\n\n  outer = next != null ? next : () => true;\n  outer.reset = thunk.reset;\n  outer.rebind = thunk.rebind;\n  return outer;\n};\n\nexport const getThunk = function (data) {\n  let thunk;\n  let j, k, l, m;\n  let sizes = getSizes(data);\n  const nesting = sizes.length;\n\n  let a = sizes.pop();\n  let b = sizes.pop();\n  let c = sizes.pop();\n  const d = sizes.pop();\n\n  let i, first, second, third, fourth;\n\n  switch (nesting) {\n    case 0:\n      thunk = () => 0;\n      thunk.reset = function () {};\n      break;\n\n    case 1:\n      i = 0;\n      thunk = () => data[i++];\n      thunk.reset = () => (i = 0);\n      break;\n\n    case 2:\n      i = j = 0;\n      first = data[j] != null ? data[j] : [];\n\n      thunk = function () {\n        const x = first[i++];\n        if (i === a) {\n          i = 0;\n          j++;\n          first = data[j] != null ? data[j] : [];\n        }\n        return x;\n      };\n\n      thunk.reset = function () {\n        i = j = 0;\n        first = data[j] != null ? data[j] : [];\n      };\n      break;\n\n    case 3:\n      i = j = k = 0;\n      second = data[k] != null ? data[k] : [];\n      first = second[j] != null ? second[j] : [];\n\n      thunk = function () {\n        const x = first[i++];\n        if (i === a) {\n          i = 0;\n          j++;\n          if (j === b) {\n            j = 0;\n            k++;\n            second = data[k] != null ? data[k] : [];\n          }\n          first = second[j] != null ? second[j] : [];\n        }\n        return x;\n      };\n\n      thunk.reset = function () {\n        i = j = k = 0;\n        second = data[k] != null ? data[k] : [];\n        first = second[j] != null ? second[j] : [];\n      };\n      break;\n\n    case 4:\n      i = j = k = l = 0;\n      third = data[l] != null ? data[l] : [];\n      second = third[k] != null ? third[k] : [];\n      first = second[j] != null ? second[j] : [];\n\n      thunk = function () {\n        const x = first[i++];\n        if (i === a) {\n          i = 0;\n          j++;\n          if (j === b) {\n            j = 0;\n            k++;\n            if (k === c) {\n              k = 0;\n              l++;\n              third = data[l] != null ? data[l] : [];\n            }\n            second = third[k] != null ? third[k] : [];\n          }\n          first = second[j] != null ? second[j] : [];\n        }\n        return x;\n      };\n\n      thunk.reset = function () {\n        i = j = k = l = 0;\n        third = data[l] != null ? data[l] : [];\n        second = third[k] != null ? third[k] : [];\n        first = second[j] != null ? second[j] : [];\n      };\n      break;\n\n    case 5:\n      i = j = k = l = m = 0;\n      fourth = data[m] != null ? data[m] : [];\n      third = fourth[l] != null ? fourth[l] : [];\n      second = third[k] != null ? third[k] : [];\n      first = second[j] != null ? second[j] : [];\n\n      thunk = function () {\n        const x = first[i++];\n        if (i === a) {\n          i = 0;\n          j++;\n          if (j === b) {\n            j = 0;\n            k++;\n            if (k === c) {\n              k = 0;\n              l++;\n              if (l === d) {\n                l = 0;\n                m++;\n                fourth = data[m] != null ? data[m] : [];\n              }\n              third = fourth[l] != null ? fourth[l] : [];\n            }\n            second = third[k] != null ? third[k] : [];\n          }\n          first = second[j] != null ? second[j] : [];\n        }\n        return x;\n      };\n\n      thunk.reset = function () {\n        i = j = k = l = m = 0;\n        fourth = data[m] != null ? data[m] : [];\n        third = fourth[l] != null ? fourth[l] : [];\n        second = third[k] != null ? third[k] : [];\n        first = second[j] != null ? second[j] : [];\n      };\n      break;\n  }\n\n  thunk.rebind = function (d) {\n    data = d;\n\n    sizes = getSizes(data);\n    if (sizes.length) {\n      a = sizes.pop();\n    }\n    if (sizes.length) {\n      b = sizes.pop();\n    }\n    if (sizes.length) {\n      c = sizes.pop();\n    }\n    if (sizes.length) {\n      return (d = sizes.pop());\n    }\n  };\n\n  return thunk;\n};\n\nexport const getStreamer = function (array, samples, channels, items) {\n  let i, j;\n  let limit = (i = j = 0);\n\n  const reset = function () {\n    limit = samples * channels * items;\n    return (i = j = 0);\n  };\n\n  const count = () => j;\n  const done = () => limit - i <= 0;\n\n  const skip = (() => {\n    switch (channels) {\n      case 1:\n        return function (n) {\n          i += n;\n          j += n;\n        };\n\n      case 2:\n        return function (n) {\n          i += n * 2;\n          j += n;\n        };\n\n      case 3:\n        return function (n) {\n          i += n * 3;\n          j += n;\n        };\n\n      case 4:\n        return function (n) {\n          i += n * 4;\n          j += n;\n        };\n    }\n  })();\n\n  const consume = (() => {\n    switch (channels) {\n      case 1:\n        return function (emit) {\n          emit(array[i++]);\n          ++j;\n        };\n\n      case 2:\n        return function (emit) {\n          emit(array[i++], array[i++]);\n          ++j;\n        };\n\n      case 3:\n        return function (emit) {\n          emit(array[i++], array[i++], array[i++]);\n          ++j;\n        };\n\n      case 4:\n        return function (emit) {\n          emit(array[i++], array[i++], array[i++], array[i++]);\n          ++j;\n        };\n    }\n  })();\n\n  const emit = (() => {\n    switch (channels) {\n      case 1:\n        return function (x) {\n          array[i++] = x;\n          ++j;\n        };\n\n      case 2:\n        return function (x, y) {\n          array[i++] = x;\n          array[i++] = y;\n          ++j;\n        };\n\n      case 3:\n        return function (x, y, z) {\n          array[i++] = x;\n          array[i++] = y;\n          array[i++] = z;\n          ++j;\n        };\n\n      case 4:\n        return function (x, y, z, w) {\n          array[i++] = x;\n          array[i++] = y;\n          array[i++] = z;\n          array[i++] = w;\n          ++j;\n        };\n    }\n  })();\n\n  consume.reset = reset;\n  emit.reset = reset;\n\n  reset();\n  return { emit, consume, skip, count, done, reset };\n};\n\nexport const getLerpEmitter = function (expr1, expr2) {\n  let emitter, lerp2, q, r, s;\n  const scratch = new Float32Array(4096);\n  let lerp1 = (lerp2 = 0.5);\n  let p = (q = r = s = 0);\n\n  const emit1 = function (x, y, z, w) {\n    r++;\n    scratch[p++] = x * lerp1;\n    scratch[p++] = y * lerp1;\n    scratch[p++] = z * lerp1;\n    return (scratch[p++] = w * lerp1);\n  };\n\n  const emit2 = function (x, y, z, w) {\n    s++;\n    scratch[q++] += x * lerp2;\n    scratch[q++] += y * lerp2;\n    scratch[q++] += z * lerp2;\n    return (scratch[q++] += w * lerp2);\n  };\n\n  const args = Math.max(expr1.length, expr2.length);\n\n  if (args <= 3) {\n    emitter = function (emit, x, i) {\n      p = q = r = s = 0;\n      expr1(emit1, x, i);\n      expr2(emit2, x, i);\n      const n = Math.min(r, s);\n      let l = 0;\n      return __range__(0, n, false).map((_k) =>\n        emit(scratch[l++], scratch[l++], scratch[l++], scratch[l++])\n      );\n    };\n  } else if (args <= 5) {\n    emitter = function (emit, x, y, i, j) {\n      p = q = r = s = 0;\n      expr1(emit1, x, y, i, j);\n      expr2(emit2, x, y, i, j);\n      const n = Math.min(r, s);\n      let l = 0;\n      return __range__(0, n, false).map((_k) =>\n        emit(scratch[l++], scratch[l++], scratch[l++], scratch[l++])\n      );\n    };\n  } else if (args <= 7) {\n    emitter = function (emit, x, y, z, i, j, k) {\n      p = q = r = s = 0;\n      expr1(emit1, x, y, z, i, j, k);\n      expr2(emit2, x, y, z, i, j, k);\n      const n = Math.min(r, s);\n      let l = 0;\n      return (() => {\n        let asc, end;\n        const result = [];\n        for (\n          k = 0, end = n, asc = 0 <= end;\n          asc ? k < end : k > end;\n          asc ? k++ : k--\n        ) {\n          result.push(\n            emit(scratch[l++], scratch[l++], scratch[l++], scratch[l++])\n          );\n        }\n        return result;\n      })();\n    };\n  } else if (args <= 9) {\n    emitter = function (emit, x, y, z, w, i, j, k, l) {\n      p = q = r = s = 0;\n      expr1(emit1, x, y, z, w, i, j, k, l);\n      expr2(emit2, x, y, z, w, i, j, k, l);\n      const n = Math.min(r, s);\n      l = 0;\n      return (() => {\n        let asc, end;\n        const result = [];\n        for (\n          k = 0, end = n, asc = 0 <= end;\n          asc ? k < end : k > end;\n          asc ? k++ : k--\n        ) {\n          result.push(\n            emit(scratch[l++], scratch[l++], scratch[l++], scratch[l++])\n          );\n        }\n        return result;\n      })();\n    };\n  } else {\n    emitter = function (emit, x, y, z, w, i, j, k, l, d, t) {\n      p = q = 0;\n      expr1(emit1, x, y, z, w, i, j, k, l, d, t);\n      expr2(emit2, x, y, z, w, i, j, k, l, d, t);\n      const n = Math.min(r, s);\n      l = 0;\n      return (() => {\n        let asc, end;\n        const result = [];\n        for (\n          k = 0, end = n, asc = 0 <= end;\n          asc ? k < end : k > end;\n          asc ? k++ : k--\n        ) {\n          result.push(\n            emit(scratch[l++], scratch[l++], scratch[l++], scratch[l++])\n          );\n        }\n        return result;\n      })();\n    };\n  }\n\n  emitter.lerp = function (f) {\n    let ref;\n    return ([lerp1, lerp2] = Array.from((ref = [1 - f, f]))), ref;\n  };\n\n  return emitter;\n};\n\nexport const getLerpThunk = function (data1, data2) {\n  // Get sizes\n  const n1 = getSizes(data1).reduce((a, b) => a * b);\n  const n2 = getSizes(data2).reduce((a, b) => a * b);\n  const n = Math.min(n1, n2);\n\n  // Create data thunks to copy (multi-)array\n  const thunk1 = getThunk(data1);\n  const thunk2 = getThunk(data2);\n\n  // Create scratch array\n  const scratch = new Float32Array(n);\n\n  scratch.lerp = function (f) {\n    thunk1.reset();\n    thunk2.reset();\n\n    let i = 0;\n    return (() => {\n      const result = [];\n      while (i < n) {\n        const a = thunk1();\n        const b = thunk2();\n        result.push((scratch[i++] = a + (b - a) * f));\n      }\n      return result;\n    })();\n  };\n\n  return scratch;\n};\n\nfunction __range__(left, right, inclusive) {\n  const range = [];\n  const ascending = left < right;\n  const end = !inclusive ? right : ascending ? right + 1 : right - 1;\n  for (let i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {\n    range.push(i);\n  }\n  return range;\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nconst letters = \"xyzw\".split(\"\");\n\nconst index = {\n  0: -1,\n  x: 0,\n  y: 1,\n  z: 2,\n  w: 3,\n};\n\nconst parseOrder = function (order) {\n  if (order === \"\" + order) {\n    order = order.split(\"\");\n  }\n  if (order === +order) {\n    order = [order];\n  }\n  return order;\n};\n\nexport const toType = function (type) {\n  if (type === +type) {\n    type = \"vec\" + type;\n  }\n  if (type === \"vec1\") {\n    type = \"float\";\n  }\n  return type;\n};\n\nconst toFloatString = function (value) {\n  value = \"\" + value;\n  if (value.indexOf(\".\") < 0) {\n    return (value += \".0\");\n  }\n};\n\n// Helper for float to byte conversion on the w axis, for readback\nexport const mapByte2FloatOffset = function (stretch) {\n  if (stretch == null) {\n    stretch = 4;\n  }\n  const factor = toFloatString(stretch);\n  return `\\\nvec4 float2ByteIndex(vec4 xyzw, out float channelIndex) {\n  float relative = xyzw.w / ${factor};\n  float w = floor(relative);\n  channelIndex = (relative - w) * ${factor};\n  return vec4(xyzw.xyz, w);\n}\\\n`;\n};\n\n// Sample data texture array\nexport const sample2DArray = function (textures) {\n  const divide = function (a, b) {\n    let out;\n    if (a === b) {\n      out = `\\\nreturn texture2D(dataTextures[${a}], uv);\\\n`;\n    } else {\n      const mid = Math.ceil(a + (b - a) / 2);\n      out = `\\\nif (z < ${mid - 0.5}) {\n  ${divide(a, mid - 1)}\n}\nelse {\n  ${divide(mid, b)}\n}\\\n`;\n    }\n    return (out = out.replace(/\\n/g, \"\\n  \"));\n  };\n\n  const body = divide(0, textures - 1);\n\n  return `\\\nuniform sampler2D dataTextures[${textures}];\n\nvec4 sample2DArray(vec2 uv, float z) {\n  ${body}\n}\\\n`;\n};\n\n// Binary operator\nexport const binaryOperator = function (type, op, curry) {\n  type = toType(type);\n  if (curry != null) {\n    return `\\\n${type} binaryOperator(${type} a) {\n  return a ${op} ${curry};\n}\\\n`;\n  } else {\n    return `\\\n${type} binaryOperator(${type} a, ${type} b) {\n  return a ${op} b;\n}\\\n`;\n  }\n};\n\n// Extend to n-vector with zeroes\nexport const extendVec = function (from, to, value) {\n  if (value == null) {\n    value = 0;\n  }\n  if (from > to) {\n    return truncateVec(from, to);\n  }\n\n  const diff = to - from;\n\n  from = toType(from);\n  to = toType(to);\n\n  value = toFloatString(value);\n\n  const parts = __range__(0, diff, true).map(function (x) {\n    if (x) {\n      return value;\n    } else {\n      return \"v\";\n    }\n  });\n  const ctor = parts.join(\",\");\n\n  return `\\\n${to} extendVec(${from} v) { return ${to}(${ctor}); }\\\n`;\n};\n\n// Truncate n-vector\nexport const truncateVec = function (from, to) {\n  if (from < to) {\n    return extendVec(from, to);\n  }\n\n  const swizzle = \".\" + \"xyzw\".substr(0, to);\n\n  from = toType(from);\n  to = toType(to);\n\n  return `\\\n${to} truncateVec(${from} v) { return v${swizzle}; }\\\n`;\n};\n\n// Inject float into 4-component vector\nexport const injectVec4 = function (order) {\n  const swizzler = [\"0.0\", \"0.0\", \"0.0\", \"0.0\"];\n\n  order = parseOrder(order);\n  order = order.map(function (v) {\n    if (v === \"\" + v) {\n      return index[v];\n    } else {\n      return v;\n    }\n  });\n\n  for (let i = 0; i < order.length; i++) {\n    const channel = order[i];\n    swizzler[channel] = [\"a\", \"b\", \"c\", \"d\"][i];\n  }\n\n  const mask = swizzler.slice(0, 4).join(\", \");\n\n  const args = [\"float a\", \"float b\", \"float c\", \"float d\"].slice(\n    0,\n    order.length\n  );\n\n  return `\\\nvec4 inject(${args}) {\n  return vec4(${mask});\n}\\\n`;\n};\n\n// Apply 4-component vector swizzle\nexport const swizzleVec4 = function (order, size = null) {\n  const lookup = [\"0.0\", \"xyzw.x\", \"xyzw.y\", \"xyzw.z\", \"xyzw.w\"];\n\n  if (size == null) {\n    size = order.length;\n  }\n\n  order = parseOrder(order);\n  order = order.map(function (v) {\n    if (Array.from([0, 1, 2, 3, 4]).includes(+v)) {\n      v = +v;\n    }\n    if (v === \"\" + v) {\n      v = index[v] + 1;\n    }\n    return lookup[v];\n  });\n\n  while (order.length < size) {\n    order.push(\"0.0\");\n  }\n  const mask = order.join(\", \");\n\n  return `\\\nvec${size} swizzle(vec4 xyzw) {\n  return vec${size}(${mask});\n}\\\n`.replace(/vec1/g, \"float\");\n};\n\n// Invert full or truncated swizzles for pointer lookups\nexport const invertSwizzleVec4 = function (order) {\n  const swizzler = [\"0.0\", \"0.0\", \"0.0\", \"0.0\"];\n\n  order = parseOrder(order);\n  order = order.map(function (v) {\n    if (v === +v) {\n      return letters[v - 1];\n    } else {\n      return v;\n    }\n  });\n\n  for (let i = 0; i < order.length; i++) {\n    const letter = order[i];\n    const src = letters[i];\n    const j = index[letter];\n\n    swizzler[j] = `xyzw.${src}`;\n  }\n\n  const mask = swizzler.join(\", \");\n\n  return `\\\nvec4 invertSwizzle(vec4 xyzw) {\n  return vec4(${mask});\n}\\\n`;\n};\n\nexport const identity = function (type) {\n  let args = [].slice.call(arguments);\n  if (args.length > 1) {\n    args = args.map((t, i) =>\n      [\"inout\", t, String.fromCharCode(97 + i)].join(\" \")\n    );\n    args = args.join(\", \");\n    return `\\\nvoid identity(${args}) { }\\\n`;\n  } else {\n    return `\\\n${type} identity(${type} x) {\n  return x;\n}\\\n`;\n  }\n};\n\nexport const constant = (type, value) => `\\\n${type} constant() {\nreturn ${value};\n}\\\n`;\n\nfunction __range__(left, right, inclusive) {\n  const range = [];\n  const ascending = left < right;\n  const end = !inclusive ? right : ascending ? right + 1 : right - 1;\n  for (let i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {\n    range.push(i);\n  }\n  return range;\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as GLSL from \"../../../util/glsl.js\";\nimport { Primitive } from \"../../primitive.js\";\n\nexport class Source extends Primitive {\n  static initClass() {\n    this.traits = [\"node\", \"source\", \"index\"];\n  }\n\n  made() {\n    // Notify of buffer reallocation\n    return this.trigger({\n      type: \"source.rebuild\",\n    });\n  }\n\n  indexShader(shader) {\n    return shader.pipe(GLSL.identity(\"vec4\"));\n  }\n  sourceShader(shader) {\n    return shader.pipe(GLSL.identity(\"vec4\"));\n  }\n\n  getDimensions() {\n    return {\n      items: 1,\n      width: 1,\n      height: 1,\n      depth: 1,\n    };\n  }\n\n  getActiveDimensions() {\n    return this.getDimensions();\n  }\n\n  getIndexDimensions() {\n    return this.getActiveDimensions();\n  }\n  getFutureDimensions() {\n    return this.getActiveDimensions();\n  }\n}\nSource.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UData from \"../../../util/data.js\";\nimport { Source } from \"../base/source.js\";\n\nexport class Data extends Source {\n  static initClass() {\n    this.traits = [\"node\", \"data\", \"source\", \"index\", \"entity\", \"active\"];\n  }\n\n  init() {\n    this.dataEmitter = null;\n    return (this.dataSizes = null);\n  }\n\n  emitter(channels, items) {\n    let emitter, resolve;\n    const { data, bind, expr } = this.props;\n\n    if (data != null) {\n      // Make new emitter if data geometry doesn't match\n      const last = this.dataSizes;\n      const sizes = UData.getSizes(data);\n\n      if (!last || last.length !== sizes.length) {\n        // Create data thunk to copy (multi-)array\n        const thunk = UData.getThunk(data);\n        this.dataEmitter = this.callback(\n          UData.makeEmitter(thunk, items, channels)\n        );\n        this.dataSizes = sizes;\n      }\n\n      emitter = this.dataEmitter;\n    } else if (resolve != null) {\n      // Hook up data-bound expression to its source\n      resolve = this._inherit(\"resolve\");\n      emitter = this.callback(resolve.callback(bind));\n    } else if (expr != null) {\n      // Convert given free expression to appropriate callback\n      emitter = this.callback(expr);\n    } else {\n      // Passthrough\n      emitter = this.callback(this.passthrough);\n    }\n\n    return emitter;\n  }\n\n  callback(callback) {\n    return callback != null ? callback : function () {};\n  }\n\n  update() {}\n\n  make() {\n    this._helpers.active.make();\n\n    // Always run update at least once to prime JS VM optimization for entering elements\n    this.first = true;\n    return this._listen(\"root\", \"root.update\", () => {\n      if (this.isActive || this.first) {\n        this.update();\n      }\n      return (this.first = false);\n    });\n  }\n\n  unmake() {\n    this._helpers.active.unmake();\n\n    this.dataEmitter = null;\n    return (this.dataSizes = null);\n  }\n}\nData.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS202: Simplify dynamic range loops\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Data } from \"./data.js\";\n\nexport class Buffer extends Data {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"buffer\",\n      \"active\",\n      \"data\",\n      \"source\",\n      \"index\",\n      \"texture\",\n    ];\n  }\n\n  init() {\n    this.bufferSlack = 0;\n    this.bufferFrames = 0;\n\n    this.bufferTime = 0;\n    this.bufferDelta = 0;\n\n    this.bufferClock = 0;\n    this.bufferStep = 0;\n    super.init();\n  }\n\n  make() {\n    super.make();\n\n    return (this.clockParent = this._inherit(\"clock\"));\n  }\n\n  unmake() {\n    return super.unmake();\n  }\n\n  rawBuffer() {\n    return this.buffer;\n  }\n\n  emitter() {\n    const { channels, items } = this.props;\n\n    return super.emitter(channels, items);\n  }\n\n  change(changed, touched, init) {\n    if (changed[\"buffer.fps\"] || init) {\n      const { fps } = this.props;\n      return (this.bufferSlack = fps ? 0.5 / fps : 0);\n    }\n  }\n\n  syncBuffer(callback) {\n    let delta, step;\n    if (!this.buffer) {\n      return;\n    }\n    const { live, fps, hurry, limit, realtime, observe } = this.props;\n\n    const filled = this.buffer.getFilled();\n    if (!!filled && !live) {\n      return;\n    }\n\n    const time = this.clockParent.getTime();\n\n    if (fps != null) {\n      const slack = this.bufferSlack;\n      const speed = time.step / time.delta;\n      delta = realtime ? time.delta : time.step;\n      const frame = 1 / fps;\n      step = realtime && observe ? speed * frame : frame;\n\n      this.bufferSlack = Math.min(limit / fps, slack + delta);\n      this.bufferDelta = delta;\n      this.bufferStep = step;\n\n      let frames = Math.min(hurry, Math.floor(slack * fps));\n      if (!filled) {\n        frames = Math.max(1, frames);\n      }\n\n      let stop = false;\n      const abort = () => (stop = true);\n      return (() => {\n        const result = [];\n        for (\n          let i = 0, end = frames, asc = 0 <= end;\n          asc ? i < end : i > end;\n          asc ? i++ : i--\n        ) {\n          this.bufferTime += delta;\n          this.bufferClock += step;\n\n          if (stop) {\n            break;\n          }\n          callback(abort, this.bufferFrames++, i, frames);\n\n          result.push((this.bufferSlack -= frame));\n        }\n        return result;\n      })();\n    } else {\n      this.bufferTime = time.time;\n      this.bufferDelta = time.delta;\n      this.bufferClock = time.clock;\n      this.bufferStep = time.step;\n      return callback(function () {}, this.bufferFrames++, 0, 1);\n    }\n  }\n\n  alignShader(dims, shader) {\n    const { minFilter, magFilter, aligned } = this.props;\n    const mixed =\n      (dims.items > 1 && dims.width > 1) || (dims.height > 1 && dims.depth > 1);\n\n    if (aligned || !mixed) {\n      return;\n    }\n\n    const nearest =\n      minFilter === this.node.attributes[\"texture.minFilter\"].enum.nearest &&\n      magFilter === this.node.attributes[\"texture.magFilter\"].enum.nearest;\n\n    if (!nearest) {\n      console.warn(\n        `${this.node.toString()} - Cannot use linear min/magFilter with 3D/4D sampling`\n      );\n    }\n\n    return shader.pipe(\"map.xyzw.align\");\n  }\n}\nBuffer.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UData from \"../../../util/data.js\";\nimport { Buffer } from \"./buffer.js\";\n\nexport class Array_ extends Buffer {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"buffer\",\n      \"active\",\n      \"data\",\n      \"source\",\n      \"index\",\n      \"array\",\n      \"texture\",\n      \"raw\",\n    ];\n  }\n\n  init() {\n    this.buffer = this.spec = null;\n\n    this.space = {\n      width: 0,\n      history: 0,\n    };\n\n    this.used = { width: 0 };\n\n    this.storage = \"arrayBuffer\";\n    this.passthrough = (emit, x) => emit(x, 0, 0, 0);\n\n    return super.init();\n  }\n\n  sourceShader(shader) {\n    const dims = this.getDimensions();\n    this.alignShader(dims, shader);\n    return this.buffer.shader(shader);\n  }\n\n  getDimensions() {\n    return {\n      items: this.items,\n      width: this.space.width,\n      height: this.space.history,\n      depth: 1,\n    };\n  }\n\n  getActiveDimensions() {\n    return {\n      items: this.items,\n      width: this.used.width,\n      height: this.buffer.getFilled(),\n      depth: 1,\n    };\n  }\n\n  getFutureDimensions() {\n    return {\n      items: this.items,\n      width: this.used.width,\n      height: this.space.history,\n      depth: 1,\n    };\n  }\n\n  getRawDimensions() {\n    return {\n      items: this.items,\n      width: this.space.width,\n      height: 1,\n      depth: 1,\n    };\n  }\n\n  make() {\n    super.make();\n\n    // Read sampling parameters\n    const minFilter =\n      this.minFilter != null ? this.minFilter : this.props.minFilter;\n    const magFilter =\n      this.magFilter != null ? this.magFilter : this.props.magFilter;\n    const type = this.type != null ? this.type : this.props.type;\n\n    // Read given dimensions\n    const { width } = this.props;\n    const { history } = this.props;\n    const reserve = this.props.bufferWidth;\n    const { channels } = this.props;\n    const { items } = this.props;\n\n    let dims = (this.spec = { channels, items, width });\n\n    this.items = dims.items;\n    this.channels = dims.channels;\n\n    // Init to right size if data supplied\n    const { data } = this.props;\n    dims = UData.getDimensions(data, dims);\n\n    const { space } = this;\n    space.width = Math.max(reserve, dims.width || 1);\n    space.history = history;\n\n    // Create array buffer\n    return (this.buffer = this._renderables.make(this.storage, {\n      width: space.width,\n      history: space.history,\n      channels,\n      items,\n      minFilter,\n      magFilter,\n      type,\n    }));\n  }\n\n  unmake() {\n    super.unmake();\n    if (this.buffer) {\n      this.buffer.dispose();\n      return (this.buffer = this.spec = null);\n    }\n  }\n\n  change(changed, touched, init) {\n    if (\n      touched[\"texture\"] ||\n      changed[\"history.history\"] ||\n      changed[\"buffer.channels\"] ||\n      changed[\"buffer.items\"] ||\n      changed[\"array.bufferWidth\"]\n    ) {\n      return this.rebuild();\n    }\n\n    if (!this.buffer) {\n      return;\n    }\n\n    if (changed[\"array.width\"]) {\n      const { width } = this.props;\n      if (width > this.space.width) {\n        return this.rebuild();\n      }\n    }\n\n    if (\n      changed[\"data.map\"] ||\n      changed[\"data.data\"] ||\n      changed[\"data.resolve\"] ||\n      changed[\"data.expr\"] ||\n      init\n    ) {\n      return this.buffer.setCallback(this.emitter());\n    }\n  }\n\n  callback(callback) {\n    if (callback.length <= 2) {\n      return callback;\n    } else {\n      return (emit, i) => {\n        return callback(emit, i, this.bufferClock, this.bufferStep);\n      };\n    }\n  }\n\n  update() {\n    if (!this.buffer) {\n      return;\n    }\n\n    const { data } = this.props;\n    const { space, used } = this;\n    const l = used.width;\n\n    const filled = this.buffer.getFilled();\n\n    this.syncBuffer((abort) => {\n      if (data != null) {\n        const dims = UData.getDimensions(data, this.spec);\n\n        // Grow width if needed\n        if (dims.width > space.width) {\n          abort();\n          return this.rebuild();\n        }\n\n        used.width = dims.width;\n\n        this.buffer.setActive(used.width);\n        if (typeof this.buffer.callback.rebind === \"function\") {\n          this.buffer.callback.rebind(data);\n        }\n        return this.buffer.update();\n      } else {\n        let width = this.spec.width || 1;\n\n        this.buffer.setActive(width);\n\n        width = this.buffer.update();\n        return (used.width = width);\n      }\n    });\n\n    if (used.width !== l || filled !== this.buffer.getFilled()) {\n      return this.trigger({\n        type: \"source.resize\",\n      });\n    }\n  }\n}\nArray_.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Array_ } from \"./array.js\";\n\nexport class Interval extends Array_ {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"buffer\",\n      \"active\",\n      \"data\",\n      \"source\",\n      \"index\",\n      \"texture\",\n      \"array\",\n      \"span\",\n      \"interval\",\n      \"sampler\",\n      \"raw\",\n    ];\n  }\n\n  updateSpan() {\n    let inverse;\n    const dimension = this.props.axis;\n    let { width } = this.props;\n    const { centered } = this.props;\n    const pad = this.props.padding;\n\n    const range = this._helpers.span.get(\"\", dimension);\n\n    width += pad * 2;\n\n    this.a = range.x;\n    const span = range.y - range.x;\n\n    if (centered) {\n      inverse = 1 / Math.max(1, width);\n      this.a += (span * inverse) / 2;\n    } else {\n      inverse = 1 / Math.max(1, width - 1);\n    }\n\n    this.b = span * inverse;\n\n    return (this.a += pad * this.b);\n  }\n\n  callback(callback) {\n    this.updateSpan();\n\n    if (this.last === callback) {\n      return this._callback;\n    }\n    this.last = callback;\n\n    if (callback.length <= 3) {\n      return (this._callback = (emit, i) => {\n        const x = this.a + this.b * i;\n        return callback(emit, x, i);\n      });\n    } else {\n      return (this._callback = (emit, i) => {\n        const x = this.a + this.b * i;\n        return callback(emit, x, i, this.bufferClock, this.bufferStep);\n      });\n    }\n  }\n\n  make() {\n    super.make();\n    this._helpers.span.make();\n    return this._listen(this, \"span.range\", this.updateSpan);\n  }\n\n  unmake() {\n    super.unmake();\n    return this._helpers.span.unmake();\n  }\n}\nInterval.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UData from \"../../../util/data.js\";\nimport { Buffer } from \"./buffer.js\";\n\nexport class Matrix extends Buffer {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"buffer\",\n      \"active\",\n      \"data\",\n      \"source\",\n      \"index\",\n      \"texture\",\n      \"matrix\",\n      \"raw\",\n    ];\n  }\n\n  init() {\n    this.buffer = this.spec = null;\n\n    this.space = {\n      width: 0,\n      height: 0,\n      history: 0,\n    };\n\n    this.used = {\n      width: 0,\n      height: 0,\n    };\n\n    this.storage = \"matrixBuffer\";\n    this.passthrough = (emit, x, y) => emit(x, y, 0, 0);\n\n    return super.init();\n  }\n\n  sourceShader(shader) {\n    const dims = this.getDimensions();\n    this.alignShader(dims, shader);\n    return this.buffer.shader(shader);\n  }\n\n  getDimensions() {\n    return {\n      items: this.items,\n      width: this.space.width,\n      height: this.space.height,\n      depth: this.space.history,\n    };\n  }\n\n  getActiveDimensions() {\n    return {\n      items: this.items,\n      width: this.used.width,\n      height: this.used.height,\n      depth: this.buffer.getFilled(),\n    };\n  }\n\n  getFutureDimensions() {\n    return {\n      items: this.items,\n      width: this.used.width,\n      height: this.used.height,\n      depth: this.space.history,\n    };\n  }\n\n  getRawDimensions() {\n    return {\n      items: this.items,\n      width: this.space.width,\n      height: this.space.height,\n      depth: 1,\n    };\n  }\n\n  make() {\n    super.make();\n\n    // Read sampling parameters\n    const minFilter =\n      this.minFilter != null ? this.minFilter : this.props.minFilter;\n    const magFilter =\n      this.magFilter != null ? this.magFilter : this.props.magFilter;\n    const type = this.type != null ? this.type : this.props.type;\n\n    // Read given dimensions\n    const { width } = this.props;\n    const { height } = this.props;\n    const { history } = this.props;\n    const reserveX = this.props.bufferWidth;\n    const reserveY = this.props.bufferHeight;\n    const { channels } = this.props;\n    const { items } = this.props;\n\n    let dims = (this.spec = { channels, items, width, height });\n\n    this.items = dims.items;\n    this.channels = dims.channels;\n\n    // Init to right size if data supplied\n    const { data } = this.props;\n    dims = UData.getDimensions(data, dims);\n\n    const { space } = this;\n    space.width = Math.max(reserveX, dims.width || 1);\n    space.height = Math.max(reserveY, dims.height || 1);\n    space.history = history;\n\n    // Create matrix buffer\n    return (this.buffer = this._renderables.make(this.storage, {\n      width: space.width,\n      height: space.height,\n      history: space.history,\n      channels,\n      items,\n      minFilter,\n      magFilter,\n      type,\n    }));\n  }\n\n  unmake() {\n    super.unmake();\n    if (this.buffer) {\n      this.buffer.dispose();\n      return (this.buffer = this.spec = null);\n    }\n  }\n\n  change(changed, touched, init) {\n    if (\n      touched[\"texture\"] ||\n      changed[\"matrix.history\"] ||\n      changed[\"buffer.channels\"] ||\n      changed[\"buffer.items\"] ||\n      changed[\"matrix.bufferWidth\"] ||\n      changed[\"matrix.bufferHeight\"]\n    ) {\n      return this.rebuild();\n    }\n\n    if (!this.buffer) {\n      return;\n    }\n\n    if (changed[\"matrix.width\"]) {\n      const { width } = this.props;\n      if (width > this.space.width) {\n        return this.rebuild();\n      }\n    }\n\n    if (changed[\"matrix.height\"]) {\n      const { height } = this.props;\n      if (height > this.space.height) {\n        return this.rebuild();\n      }\n    }\n\n    if (\n      changed[\"data.map\"] ||\n      changed[\"data.data\"] ||\n      changed[\"data.resolve\"] ||\n      changed[\"data.expr\"] ||\n      init\n    ) {\n      return this.buffer.setCallback(this.emitter());\n    }\n  }\n\n  callback(callback) {\n    if (callback.length <= 3) {\n      return callback;\n    } else {\n      return (emit, i, j) => {\n        return callback(emit, i, j, this.bufferClock, this.bufferStep);\n      };\n    }\n  }\n\n  update() {\n    if (!this.buffer) {\n      return;\n    }\n\n    const { data } = this.props;\n    const { space, used } = this;\n    const w = used.width;\n    const h = used.height;\n\n    const filled = this.buffer.getFilled();\n\n    this.syncBuffer((abort) => {\n      if (data != null) {\n        const dims = UData.getDimensions(data, this.spec);\n\n        // Grow if needed\n        if (dims.width > space.width || dims.height > space.height) {\n          abort();\n          return this.rebuild();\n        }\n\n        used.width = dims.width;\n        used.height = dims.height;\n\n        this.buffer.setActive(used.width, used.height);\n        if (typeof this.buffer.callback.rebind === \"function\") {\n          this.buffer.callback.rebind(data);\n        }\n        return this.buffer.update();\n      } else {\n        let _w;\n        const width = this.spec.width || 1;\n        const height = this.spec.height || 1;\n\n        this.buffer.setActive(width, height);\n\n        const length = this.buffer.update();\n\n        used.width = _w = width;\n        used.height = Math.ceil(length / _w);\n        if (used.height === 1) {\n          return (used.width = length);\n        }\n      }\n    });\n\n    if (\n      used.width !== w ||\n      used.height !== h ||\n      filled !== this.buffer.getFilled()\n    ) {\n      return this.trigger({\n        type: \"source.resize\",\n      });\n    }\n  }\n}\nMatrix.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { Matrix } from \"./matrix.js\";\n\nexport class Area extends Matrix {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"buffer\",\n      \"active\",\n      \"data\",\n      \"source\",\n      \"index\",\n      \"matrix\",\n      \"texture\",\n      \"raw\",\n      \"span:x\",\n      \"span:y\",\n      \"area\",\n      \"sampler:x\",\n      \"sampler:y\",\n    ];\n  }\n\n  updateSpan() {\n    let inverseX, inverseY;\n    const dimensions = this.props.axes;\n    let { width } = this.props;\n    let { height } = this.props;\n\n    const { centeredX } = this.props;\n    const { centeredY } = this.props;\n\n    const padX = this.props.paddingX;\n    const padY = this.props.paddingY;\n\n    const rangeX = this._helpers.span.get(\"x.\", dimensions[0]);\n    const rangeY = this._helpers.span.get(\"y.\", dimensions[1]);\n\n    this.aX = rangeX.x;\n    this.aY = rangeY.x;\n\n    const spanX = rangeX.y - rangeX.x;\n    const spanY = rangeY.y - rangeY.x;\n\n    width += padX * 2;\n    height += padY * 2;\n\n    if (centeredX) {\n      inverseX = 1 / Math.max(1, width);\n      this.aX += (spanX * inverseX) / 2;\n    } else {\n      inverseX = 1 / Math.max(1, width - 1);\n    }\n\n    if (centeredY) {\n      inverseY = 1 / Math.max(1, height);\n      this.aY += (spanY * inverseY) / 2;\n    } else {\n      inverseY = 1 / Math.max(1, height - 1);\n    }\n\n    this.bX = spanX * inverseX;\n    this.bY = spanY * inverseY;\n\n    this.aX += padX * this.bX;\n    return (this.aY += padY * this.bY);\n  }\n\n  callback(callback) {\n    this.updateSpan();\n\n    if (this.last === callback) {\n      return this._callback;\n    }\n    this.last = callback;\n\n    if (callback.length <= 5) {\n      return (this._callback = (emit, i, j) => {\n        const x = this.aX + this.bX * i;\n        const y = this.aY + this.bY * j;\n        return callback(emit, x, y, i, j);\n      });\n    } else {\n      return (this._callback = (emit, i, j) => {\n        const x = this.aX + this.bX * i;\n        const y = this.aY + this.bY * j;\n        return callback(emit, x, y, i, j, this.bufferClock, this.bufferStep);\n      });\n    }\n  }\n\n  make() {\n    super.make();\n    this._helpers.span.make();\n    return this._listen(this, \"span.range\", this.updateSpan);\n  }\n\n  unmake() {\n    super.unmake();\n    return this._helpers.span.unmake();\n  }\n}\nArea.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS002: Fix invalid constructor\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UData from \"../../../util/data.js\";\nimport { Buffer } from \"./buffer.js\";\n\nexport class Voxel extends Buffer {\n  constructor(...args) {\n    super(...args);\n    this.update = this.update.bind(this);\n  }\n\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"buffer\",\n      \"active\",\n      \"data\",\n      \"source\",\n      \"index\",\n      \"texture\",\n      \"voxel\",\n      \"raw\",\n    ];\n  }\n\n  init() {\n    this.buffer = this.spec = null;\n\n    this.space = {\n      width: 0,\n      height: 0,\n      depth: 0,\n    };\n\n    this.used = {\n      width: 0,\n      height: 0,\n      depth: 0,\n    };\n\n    this.storage = \"voxelBuffer\";\n    this.passthrough = (emit, x, y, z) => emit(x, y, z, 0);\n    super.init();\n  }\n\n  sourceShader(shader) {\n    const dims = this.getDimensions();\n    this.alignShader(dims, shader);\n    return this.buffer.shader(shader);\n  }\n\n  getDimensions() {\n    return {\n      items: this.items,\n      width: this.space.width,\n      height: this.space.height,\n      depth: this.space.depth,\n    };\n  }\n\n  getActiveDimensions() {\n    return {\n      items: this.items,\n      width: this.used.width,\n      height: this.used.height,\n      depth: this.used.depth * this.buffer.getFilled(),\n    };\n  }\n\n  getRawDimensions() {\n    return this.getDimensions();\n  }\n\n  make() {\n    super.make();\n\n    // Read sampling parameters\n    const minFilter =\n      this.minFilter != null ? this.minFilter : this.props.minFilter;\n    const magFilter =\n      this.magFilter != null ? this.magFilter : this.props.magFilter;\n    const type = this.type != null ? this.type : this.props.type;\n\n    // Read given dimensions\n    const { width } = this.props;\n    const { height } = this.props;\n    const { depth } = this.props;\n    const reserveX = this.props.bufferWidth;\n    const reserveY = this.props.bufferHeight;\n    const reserveZ = this.props.bufferDepth;\n    const { channels } = this.props;\n    const { items } = this.props;\n\n    let dims = (this.spec = { channels, items, width, height, depth });\n\n    this.items = dims.items;\n    this.channels = dims.channels;\n\n    // Init to right size if data supplied\n    const { data } = this.props;\n    dims = UData.getDimensions(data, dims);\n\n    const { space } = this;\n    space.width = Math.max(reserveX, dims.width || 1);\n    space.height = Math.max(reserveY, dims.height || 1);\n    space.depth = Math.max(reserveZ, dims.depth || 1);\n\n    // Create voxel buffer\n    return (this.buffer = this._renderables.make(this.storage, {\n      width: space.width,\n      height: space.height,\n      depth: space.depth,\n      channels,\n      items,\n      minFilter,\n      magFilter,\n      type,\n    }));\n  }\n\n  unmake() {\n    super.unmake();\n    if (this.buffer) {\n      this.buffer.dispose();\n      return (this.buffer = this.spec = null);\n    }\n  }\n\n  change(changed, touched, init) {\n    if (\n      touched[\"texture\"] ||\n      changed[\"buffer.channels\"] ||\n      changed[\"buffer.items\"] ||\n      changed[\"voxel.bufferWidth\"] ||\n      changed[\"voxel.bufferHeight\"] ||\n      changed[\"voxel.bufferDepth\"]\n    ) {\n      return this.rebuild();\n    }\n\n    if (!this.buffer) {\n      return;\n    }\n\n    if (changed[\"voxel.width\"]) {\n      const { width } = this.props;\n      if (width > this.space.width) {\n        return this.rebuild();\n      }\n    }\n\n    if (changed[\"voxel.height\"]) {\n      const { height } = this.props;\n      if (height > this.space.height) {\n        return this.rebuild();\n      }\n    }\n\n    if (changed[\"voxel.depth\"]) {\n      const { depth } = this.props;\n      if (depth > this.space.depth) {\n        return this.rebuild();\n      }\n    }\n\n    if (\n      changed[\"data.map\"] ||\n      changed[\"data.data\"] ||\n      changed[\"data.resolve\"] ||\n      changed[\"data.expr\"] ||\n      init\n    ) {\n      return this.buffer.setCallback(this.emitter());\n    }\n  }\n\n  callback(callback) {\n    if (callback.length <= 4) {\n      return callback;\n    } else {\n      return (emit, i, j, k) => {\n        return callback(emit, i, j, k, this.bufferClock, this.bufferStep);\n      };\n    }\n  }\n\n  update() {\n    if (!this.buffer) {\n      return;\n    }\n\n    const { data } = this.props;\n    const { space, used } = this;\n    const w = used.width;\n    const h = used.height;\n    const d = used.depth;\n\n    const filled = this.buffer.getFilled();\n\n    this.syncBuffer((abort) => {\n      if (data != null) {\n        const dims = UData.getDimensions(data, this.spec);\n\n        // Grow dimensions if needed\n        if (\n          dims.width > space.width ||\n          dims.height > space.height ||\n          dims.depth > space.depth\n        ) {\n          abort();\n          return this.rebuild();\n        }\n\n        used.width = dims.width;\n        used.height = dims.height;\n        used.depth = dims.depth;\n\n        this.buffer.setActive(used.width, used.height, used.depth);\n        if (typeof this.buffer.callback.rebind === \"function\") {\n          this.buffer.callback.rebind(data);\n        }\n        return this.buffer.update();\n      } else {\n        let _h, _w;\n        const width = this.spec.width || 1;\n        const height = this.spec.height || 1;\n        const depth = this.spec.depth || 1;\n\n        this.buffer.setActive(width, height, depth);\n\n        const length = this.buffer.update();\n\n        used.width = _w = width;\n        used.height = _h = height;\n        used.depth = Math.ceil(length / _w / _h);\n\n        if (used.depth === 1) {\n          used.height = Math.ceil(length / _w);\n          if (used.height === 1) {\n            return (used.width = length);\n          }\n        }\n      }\n    });\n\n    if (\n      used.width !== w ||\n      used.height !== h ||\n      used.depth !== d ||\n      filled !== this.buffer.getFilled()\n    ) {\n      return this.trigger({\n        type: \"source.resize\",\n      });\n    }\n  }\n}\nVoxel.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Voxel } from \"./voxel.js\";\n\nexport class Volume extends Voxel {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"buffer\",\n      \"active\",\n      \"data\",\n      \"source\",\n      \"index\",\n      \"texture\",\n      \"voxel\",\n      \"span:x\",\n      \"span:y\",\n      \"span:z\",\n      \"volume\",\n      \"sampler:x\",\n      \"sampler:y\",\n      \"sampler:z\",\n      \"raw\",\n    ];\n  }\n\n  updateSpan() {\n    let inverseX, inverseY, inverseZ;\n    const dimensions = this.props.axes;\n    let { width } = this.props;\n    let { height } = this.props;\n    let { depth } = this.props;\n\n    const { centeredX } = this.props;\n    const { centeredY } = this.props;\n    const { centeredZ } = this.props;\n\n    const padX = this.props.paddingX;\n    const padY = this.props.paddingY;\n    const padZ = this.props.paddingZ;\n\n    const rangeX = this._helpers.span.get(\"x.\", dimensions[0]);\n    const rangeY = this._helpers.span.get(\"y.\", dimensions[1]);\n    const rangeZ = this._helpers.span.get(\"z.\", dimensions[2]);\n\n    this.aX = rangeX.x;\n    this.aY = rangeY.x;\n    this.aZ = rangeZ.x;\n\n    const spanX = rangeX.y - rangeX.x;\n    const spanY = rangeY.y - rangeY.x;\n    const spanZ = rangeZ.y - rangeZ.x;\n\n    width += padX * 2;\n    height += padY * 2;\n    depth += padZ * 2;\n\n    if (centeredX) {\n      inverseX = 1 / Math.max(1, width);\n      this.aX += (spanX * inverseX) / 2;\n    } else {\n      inverseX = 1 / Math.max(1, width - 1);\n    }\n\n    if (centeredY) {\n      inverseY = 1 / Math.max(1, height);\n      this.aY += (spanY * inverseY) / 2;\n    } else {\n      inverseY = 1 / Math.max(1, height - 1);\n    }\n\n    if (centeredZ) {\n      inverseZ = 1 / Math.max(1, depth);\n      this.aZ += (spanZ * inverseZ) / 2;\n    } else {\n      inverseZ = 1 / Math.max(1, depth - 1);\n    }\n\n    this.bX = spanX * inverseX;\n    this.bY = spanY * inverseY;\n    this.bZ = spanZ * inverseZ;\n\n    this.aX += this.bX * padX;\n    this.aY += this.bY * padY;\n    return (this.aZ += this.bZ * padY);\n  }\n\n  callback(callback) {\n    this.updateSpan();\n\n    if (this.last === callback) {\n      return this._callback;\n    }\n    this.last = callback;\n\n    if (callback.length <= 7) {\n      return (this._callback = (emit, i, j, k) => {\n        const x = this.aX + this.bX * i;\n        const y = this.aY + this.bY * j;\n        const z = this.aZ + this.bZ * k;\n        return callback(emit, x, y, z, i, j, k);\n      });\n    } else {\n      return (this._callback = (emit, i, j, k) => {\n        const x = this.aX + this.bX * i;\n        const y = this.aY + this.bY * j;\n        const z = this.aZ + this.bZ * k;\n        return callback(\n          emit,\n          x,\n          y,\n          z,\n          i,\n          j,\n          k,\n          this.bufferClock,\n          this.bufferStep\n        );\n      });\n    }\n  }\n\n  make() {\n    super.make();\n    this._helpers.span.make();\n    return this._listen(this, \"span.range\", this.updateSpan);\n  }\n\n  unmake() {\n    super.unmake();\n    return this._helpers.span.unmake();\n  }\n}\nVolume.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Vector4 } from \"three/src/math/Vector4.js\";\n\nexport const setOrigin = function (vec, dimensions, origin) {\n  if (+dimensions === dimensions) {\n    dimensions = [dimensions];\n  }\n  const x = Array.from(dimensions).includes(1) ? 0 : origin.x;\n  const y = Array.from(dimensions).includes(2) ? 0 : origin.y;\n  const z = Array.from(dimensions).includes(3) ? 0 : origin.z;\n  const w = Array.from(dimensions).includes(4) ? 0 : origin.w;\n  return vec.set(x, y, z, w);\n};\n\nexport const addOrigin = (function () {\n  const v = new Vector4();\n  return function (vec, dimension, origin) {\n    setOrigin(v, dimension, origin);\n    return vec.add(v);\n  };\n})();\n\nexport const setDimension = function (vec, dimension) {\n  const x = dimension === 1 ? 1 : 0;\n  const y = dimension === 2 ? 1 : 0;\n  const z = dimension === 3 ? 1 : 0;\n  const w = dimension === 4 ? 1 : 0;\n  return vec.set(x, y, z, w);\n};\n\nexport const setDimensionNormal = function (vec, dimension) {\n  const x = dimension === 1 ? 1 : 0;\n  const y = dimension === 2 ? 1 : 0;\n  const z = dimension === 3 ? 1 : 0;\n  const w = dimension === 4 ? 1 : 0;\n  return vec.set(y, z + x, w, 0);\n};\n\nexport const recenterAxis = (function () {\n  const axis = [0, 0];\n\n  return function (x, dx, bend, f) {\n    if (f == null) {\n      f = 0;\n    }\n    if (bend > 0) {\n      const x1 = x;\n      const x2 = x + dx;\n\n      const abs = Math.max(Math.abs(x1), Math.abs(x2));\n      const fabs = abs * f;\n\n      const min = Math.min(x1, x2);\n      const max = Math.max(x1, x2);\n\n      x = min + (-abs + fabs - min) * bend;\n      dx = max + (abs + fabs - max) * bend - x;\n    }\n\n    axis[0] = x;\n    axis[1] = dx;\n    return axis;\n  };\n})();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UAxis from \"../../../util/axis.js\";\nimport { Source } from \"../base/source.js\";\n\nexport class Scale extends Source {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"source\",\n      \"index\",\n      \"interval\",\n      \"span\",\n      \"scale\",\n      \"raw\",\n      \"origin\",\n    ];\n  }\n\n  init() {\n    return (this.used = this.space = this.scaleAxis = this.sampler = null);\n  }\n\n  rawBuffer() {\n    return this.buffer;\n  }\n\n  sourceShader(shader) {\n    return shader.pipe(this.sampler);\n  }\n\n  getDimensions() {\n    return {\n      items: 1,\n      width: this.space,\n      height: 1,\n      depth: 1,\n    };\n  }\n\n  getActiveDimensions() {\n    return {\n      items: 1,\n      width: this.used,\n      height: this.buffer.getFilled(),\n      depth: 1,\n    };\n  }\n\n  getRawDimensions() {\n    return this.getDimensions();\n  }\n\n  make() {\n    // Prepare data buffer of tick positions\n    let samples;\n    this.space = samples = this._helpers.scale.divide(\"\");\n\n    this.buffer = this._renderables.make(\"dataBuffer\", {\n      width: samples,\n      channels: 1,\n      items: 1,\n    });\n\n    // Prepare position shader\n    const positionUniforms = {\n      scaleAxis: this._attributes.make(this._types.vec4()),\n      scaleOffset: this._attributes.make(this._types.vec4()),\n    };\n\n    this.scaleAxis = positionUniforms.scaleAxis.value;\n    this.scaleOffset = positionUniforms.scaleOffset.value;\n\n    // Build sampler\n    const p = (this.sampler = this._shaders.shader());\n    // Require buffer sampler as callback\n    p.require(this.buffer.shader(this._shaders.shader(), 1));\n    // Shader to expand scalars to 4D vector on an axis.\n    p.pipe(\"scale.position\", positionUniforms);\n\n    this._helpers.span.make();\n\n    // Monitor view range\n    return this._listen(this, \"span.range\", this.updateRanges);\n  }\n\n  unmake() {\n    this.scaleAxis = null;\n\n    return this._helpers.span.unmake();\n  }\n\n  change(changed, touched, init) {\n    if (changed[\"scale.divide\"]) {\n      return this.rebuild();\n    }\n\n    if (\n      touched[\"view\"] ||\n      touched[\"interval\"] ||\n      touched[\"span\"] ||\n      touched[\"scale\"] ||\n      init\n    ) {\n      return this.updateRanges();\n    }\n  }\n\n  updateRanges() {\n    const { used } = this;\n\n    // Fetch range along axis\n    const { axis, origin } = this.props;\n    const range = this._helpers.span.get(\"\", axis);\n\n    // Calculate scale along axis\n    const min = range.x;\n    const max = range.y;\n    const ticks = this._helpers.scale.generate(\"\", this.buffer, min, max);\n\n    UAxis.setDimension(this.scaleAxis, axis);\n    UAxis.setOrigin(this.scaleOffset, axis, origin);\n\n    // Clip to number of ticks\n    this.used = ticks.length;\n\n    // Notify of resize\n    if (this.used !== used) {\n      return this.trigger({\n        type: \"source.resize\",\n      });\n    }\n  }\n}\nScale.initClass();\n","export * from \"./array.js\";\nexport * from \"./interval.js\";\nexport * from \"./matrix.js\";\nexport * from \"./area.js\";\nexport * from \"./voxel.js\";\nexport * from \"./volume.js\";\nexport * from \"./scale.js\";\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n// Merge multiple objects\nexport const merge = function () {\n  const x = {};\n  for (const obj of Array.from(arguments)) {\n    for (const k in obj) {\n      const v = obj[k];\n      x[k] = v;\n    }\n  }\n  return x;\n};\n\nexport const clone = (o) => JSON.parse(JSON.serialize(o));\n\nexport const parseQuoted = function (str) {\n  let accum = \"\";\n\n  const unescape = (str) => (str = str.replace(/\\\\/g, \"\"));\n  const munch = function (next) {\n    if (accum.length) {\n      list.push(unescape(accum));\n    }\n    return (accum = next != null ? next : \"\");\n  };\n\n  str = str.split(/(?=(?:\\\\.|[\"' ,]))/g);\n  let quote = false;\n  const list = [];\n\n  for (const chunk of Array.from(str)) {\n    const char = chunk[0];\n    const token = chunk.slice(1);\n    switch (char) {\n      case '\"':\n      case \"'\":\n        if (quote) {\n          if (quote === char) {\n            quote = false;\n            munch(token);\n          } else {\n            accum += chunk;\n          }\n        } else {\n          if (accum !== \"\") {\n            throw new Error(\n              `ParseError: String \\`${str}\\` does not contain comma-separated quoted tokens.`\n            );\n          }\n\n          quote = char;\n          accum += token;\n        }\n        break;\n      case \" \":\n      case \",\":\n        if (!quote) {\n          munch(token);\n        } else {\n          accum += chunk;\n        }\n        break;\n      default:\n        accum += chunk;\n    }\n  }\n  munch();\n  return list;\n};\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UAxis from \"../../../util/axis.js\";\nimport * as UJS from \"../../../util/js.js\";\nimport { Primitive } from \"../../primitive.js\";\n\nexport class Axis extends Primitive {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"object\",\n      \"visible\",\n      \"style\",\n      \"line\",\n      \"axis\",\n      \"span\",\n      \"interval\",\n      \"arrow\",\n      \"position\",\n      \"origin\",\n      \"shade\",\n    ];\n    this.defaults = {\n      end: true,\n      zBias: -1,\n    };\n  }\n\n  constructor(node, context, helpers) {\n    super(node, context, helpers);\n\n    this.axisPosition =\n      this.axisStep =\n      this.resolution =\n      this.line =\n      this.arrows =\n        null;\n  }\n\n  make() {\n    // Prepare position shader\n    const positionUniforms = {\n      axisPosition: this._attributes.make(this._types.vec4()),\n      axisStep: this._attributes.make(this._types.vec4()),\n    };\n\n    this.axisPosition = positionUniforms.axisPosition.value;\n    this.axisStep = positionUniforms.axisStep.value;\n\n    // Build transform chain\n    let position = this._shaders.shader();\n    position.pipe(\"axis.position\", positionUniforms);\n    position = this._helpers.position.pipeline(position);\n\n    // Prepare bound uniforms\n    const styleUniforms = this._helpers.style.uniforms();\n    const lineUniforms = this._helpers.line.uniforms();\n    const arrowUniforms = this._helpers.arrow.uniforms();\n    const unitUniforms = this._inherit(\"unit\").getUnitUniforms();\n\n    // Line geometry\n    const { detail } = this.props;\n    const samples = detail + 1;\n    this.resolution = 1 / detail;\n\n    // Clip start/end for terminating arrow\n    const { start, end } = this.props;\n\n    // Stroke style\n    const { stroke, join } = this.props;\n\n    // Build transition mask lookup\n    let mask = this._helpers.object.mask();\n\n    // Build fragment material lookup\n    const material = this._helpers.shade.pipeline() || false;\n\n    // Indexing by fixed or by given axis\n    const { crossed, axis } = this.props;\n    if (!crossed && mask != null && axis > 1) {\n      const swizzle = [\"x000\", \"y000\", \"z000\", \"w000\"][axis];\n      mask = this._helpers.position.swizzle(mask, swizzle);\n    }\n\n    // Make line renderable\n    const uniforms = UJS.merge(\n      arrowUniforms,\n      lineUniforms,\n      styleUniforms,\n      unitUniforms\n    );\n    this.line = this._renderables.make(\"line\", {\n      uniforms,\n      samples,\n      position,\n      clip: start || end,\n      stroke,\n      join,\n      mask,\n      material,\n    });\n\n    // Make arrow renderables\n    this.arrows = [];\n    if (start) {\n      this.arrows.push(\n        this._renderables.make(\"arrow\", {\n          uniforms,\n          flip: true,\n          samples,\n          position,\n          mask,\n          material,\n        })\n      );\n    }\n\n    if (end) {\n      this.arrows.push(\n        this._renderables.make(\"arrow\", {\n          uniforms,\n          samples,\n          position,\n          mask,\n          material,\n        })\n      );\n    }\n\n    // Visible, object and span traits\n    this._helpers.visible.make();\n    this._helpers.object.make(this.arrows.concat([this.line]));\n    this._helpers.span.make();\n\n    // Monitor view range\n    return this._listen(this, \"span.range\", this.updateRanges);\n  }\n\n  unmake() {\n    this._helpers.visible.unmake();\n    this._helpers.object.unmake();\n    return this._helpers.span.unmake();\n  }\n\n  change(changed, touched, init) {\n    if (\n      changed[\"axis.detail\"] ||\n      changed[\"line.stroke\"] ||\n      changed[\"line.join\"] ||\n      changed[\"axis.crossed\"] ||\n      (changed[\"interval.axis\"] && this.props.crossed)\n    ) {\n      return this.rebuild();\n    }\n\n    if (touched[\"interval\"] || touched[\"span\"] || touched[\"view\"] || init) {\n      return this.updateRanges();\n    }\n  }\n\n  updateRanges() {\n    const { axis, origin } = this.props;\n\n    const range = this._helpers.span.get(\"\", axis);\n\n    const min = range.x;\n    const max = range.y;\n\n    UAxis.setDimension(this.axisPosition, axis).multiplyScalar(min);\n    UAxis.setDimension(this.axisStep, axis).multiplyScalar(\n      (max - min) * this.resolution\n    );\n\n    return UAxis.addOrigin(this.axisPosition, axis, origin);\n  }\n}\nAxis.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UGLSL from \"../../../util/glsl.js\";\nimport * as UJS from \"../../../util/js.js\";\nimport { Primitive } from \"../../primitive.js\";\n\nexport class Face extends Primitive {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"object\",\n      \"visible\",\n      \"style\",\n      \"line\",\n      \"mesh\",\n      \"face\",\n      \"geometry\",\n      \"position\",\n      \"bind\",\n      \"shade\",\n    ];\n  }\n\n  constructor(node, context, helpers) {\n    super(node, context, helpers);\n\n    this.face = null;\n  }\n\n  resize() {\n    if (this.bind.points == null) {\n      return;\n    }\n\n    const dims = this.bind.points.getActiveDimensions();\n    const { items, width, height, depth } = dims;\n\n    if (this.face) {\n      this.face.geometry.clip(width, height, depth, items);\n    }\n    if (this.line) {\n      this.line.geometry.clip(items, width, height, depth);\n    }\n\n    if (this.bind.map != null) {\n      const map = this.bind.map.getActiveDimensions();\n      if (this.face) {\n        return this.face.geometry.map(\n          map.width,\n          map.height,\n          map.depth,\n          map.items\n        );\n      }\n    }\n  }\n\n  make() {\n    // Bind to attached data sources\n    let color, uniforms;\n    this._helpers.bind.make([\n      { to: \"geometry.points\", trait: \"source\" },\n      { to: \"geometry.colors\", trait: \"source\" },\n      { to: \"mesh.map\", trait: \"source\" },\n    ]);\n\n    if (this.bind.points == null) {\n      return;\n    }\n\n    // Fetch position and transform to view\n    let position = this.bind.points.sourceShader(this._shaders.shader());\n    position = this._helpers.position.pipeline(position);\n\n    // Prepare bound uniforms\n    const styleUniforms = this._helpers.style.uniforms();\n    const lineUniforms = this._helpers.line.uniforms();\n    const unitUniforms = this._inherit(\"unit\").getUnitUniforms();\n\n    // Auto z-bias wireframe over surface\n    const wireUniforms = {};\n    wireUniforms.styleZBias = this._attributes.make(this._types.number());\n    this.wireZBias = wireUniforms.styleZBias;\n\n    // Fetch geometry dimensions\n    const dims = this.bind.points.getDimensions();\n    const { items, width, height, depth } = dims;\n\n    // Get display properties\n    const { line, shaded, fill, stroke, join } = this.props;\n\n    // Build color lookup\n    if (this.bind.colors) {\n      color = this._shaders.shader();\n      this.bind.colors.sourceShader(color);\n    }\n\n    // Build transition mask lookup\n    const mask = this._helpers.object.mask();\n\n    // Build texture map lookup\n    const map = this._helpers.shade.map(\n      this.bind.map != null\n        ? this.bind.map.sourceShader(this._shaders.shader())\n        : undefined\n    );\n\n    // Build fragment material lookup\n    const material = this._helpers.shade.pipeline();\n    const faceMaterial = material || shaded;\n    const lineMaterial = material || false;\n\n    const objects = [];\n\n    // Make line renderable\n    if (line) {\n      // Swizzle face edges into segments\n      const swizzle = this._shaders.shader();\n      swizzle.pipe(UGLSL.swizzleVec4(\"yzwx\"));\n      swizzle.pipe(position);\n\n      uniforms = UJS.merge(\n        unitUniforms,\n        lineUniforms,\n        styleUniforms,\n        wireUniforms\n      );\n      this.line = this._renderables.make(\"line\", {\n        uniforms,\n        samples: items,\n        strips: width,\n        ribbons: height,\n        layers: depth,\n        position: swizzle,\n        color,\n        stroke,\n        join,\n        material: lineMaterial,\n        mask,\n        closed: true,\n      });\n      objects.push(this.line);\n    }\n\n    // Make face renderable\n    if (fill) {\n      uniforms = UJS.merge(unitUniforms, styleUniforms, {});\n      this.face = this._renderables.make(\"face\", {\n        uniforms,\n        width,\n        height,\n        depth,\n        items,\n        position,\n        color,\n        material: faceMaterial,\n        mask,\n        map,\n      });\n      objects.push(this.face);\n    }\n\n    this._helpers.visible.make();\n    return this._helpers.object.make(objects);\n  }\n\n  made() {\n    return this.resize();\n  }\n\n  unmake() {\n    this._helpers.bind.unmake();\n    this._helpers.visible.unmake();\n    this._helpers.object.unmake();\n\n    return (this.face = this.line = null);\n  }\n\n  change(changed, touched, init) {\n    if (changed[\"geometry.points\"] || touched[\"mesh\"]) {\n      return this.rebuild();\n    }\n\n    if (changed[\"style.zBias\"] || changed[\"mesh.lineBias\"] || init) {\n      const { fill, zBias, lineBias } = this.props;\n      return (this.wireZBias.value = zBias + (fill ? lineBias : 0));\n    }\n  }\n}\nFace.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UAxis from \"../../../util/axis.js\";\nimport * as UJS from \"../../../util/js.js\";\nimport { Primitive } from \"../../primitive.js\";\n\nexport class Grid extends Primitive {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"object\",\n      \"visible\",\n      \"style\",\n      \"line\",\n      \"grid\",\n      \"area\",\n      \"position\",\n      \"origin\",\n      \"shade\",\n      \"axis:x\",\n      \"axis:y\",\n      \"scale:x\",\n      \"scale:y\",\n      \"span:x\",\n      \"span:y\",\n    ];\n    this.defaults = {\n      width: 1,\n      zBias: -2,\n    };\n  }\n\n  constructor(node, context, helpers) {\n    super(node, context, helpers);\n\n    this.axes = null;\n  }\n\n  make() {\n    // Build transition mask lookup\n    let axis;\n    let mask = this._helpers.object.mask();\n\n    // Build fragment material lookup\n    const material = this._helpers.shade.pipeline() || false;\n\n    axis = (first, second, transpose) => {\n      // Prepare data buffer of tick positions\n      let position;\n      const detail = this._get(first + \"axis.detail\");\n      const samples = detail + 1;\n      const resolution = 1 / detail;\n\n      const strips = this._helpers.scale.divide(second);\n      const buffer = this._renderables.make(\"dataBuffer\", {\n        width: strips,\n        channels: 1,\n      });\n\n      // Prepare position shader\n      const positionUniforms = {\n        gridPosition: this._attributes.make(this._types.vec4()),\n        gridStep: this._attributes.make(this._types.vec4()),\n        gridAxis: this._attributes.make(this._types.vec4()),\n      };\n\n      const values = {\n        gridPosition: positionUniforms.gridPosition.value,\n        gridStep: positionUniforms.gridStep.value,\n        gridAxis: positionUniforms.gridAxis.value,\n      };\n\n      // Build transform chain\n      const p = (position = this._shaders.shader());\n\n      // Align second grid with first in mask space if requested\n      if (transpose != null && mask != null) {\n        mask = this._helpers.position.swizzle(mask, transpose);\n      }\n\n      // Require buffer sampler as callback\n      p.require(buffer.shader(this._shaders.shader(), 2));\n\n      // Calculate grid position\n      p.pipe(\"grid.position\", positionUniforms);\n\n      // Apply view transform\n      position = this._helpers.position.pipeline(p);\n\n      // Prepare bound uniforms\n      const styleUniforms = this._helpers.style.uniforms();\n      const lineUniforms = this._helpers.line.uniforms();\n      const unitUniforms = this._inherit(\"unit\").getUnitUniforms();\n      const uniforms = UJS.merge(lineUniforms, styleUniforms, unitUniforms);\n\n      // Make line renderable\n      const line = this._renderables.make(\"line\", {\n        uniforms,\n        samples,\n        strips,\n        position,\n        stroke,\n        join,\n        mask,\n        material,\n      });\n\n      // Store axis object for manipulation later\n      return { first, second, resolution, samples, line, buffer, values };\n    };\n\n    // Generate both line sets\n    const { lineX, lineY, crossed, axes } = this.props;\n    const transpose = [\"0000\", \"x000\", \"y000\", \"z000\", \"w000\"][axes[1]];\n\n    // Stroke style\n    const { stroke, join } = this.props;\n\n    this.axes = [];\n    lineX && this.axes.push(axis(\"x.\", \"y.\", null));\n    lineY && this.axes.push(axis(\"y.\", \"x.\", crossed ? null : transpose));\n\n    // Register lines\n    const lines = (() => {\n      const result = [];\n      for (axis of this.axes) {\n        result.push(axis.line);\n      }\n      return result;\n    })();\n    this._helpers.visible.make();\n    this._helpers.object.make(lines);\n    this._helpers.span.make();\n\n    // Monitor view range\n    return this._listen(this, \"span.range\", this.updateRanges);\n  }\n\n  unmake() {\n    this._helpers.visible.unmake();\n    this._helpers.object.unmake();\n    this._helpers.span.unmake();\n\n    for (const axis of this.axes) {\n      axis.buffer.dispose();\n    }\n\n    this.axes = null;\n  }\n\n  change(changed, touched, init) {\n    if (\n      changed[\"x.axis.detail\"] ||\n      changed[\"y.axis.detail\"] ||\n      changed[\"x.axis.factor\"] ||\n      changed[\"y.axis.factor\"] ||\n      changed[\"grid.lineX\"] ||\n      changed[\"grid.lineY\"] ||\n      changed[\"line.stroke\"] ||\n      changed[\"line.join\"] ||\n      changed[\"grid.crossed\"] ||\n      (changed[\"grid.axes\"] && this.props.crossed)\n    ) {\n      return this.rebuild();\n    }\n\n    if (\n      touched[\"x\"] ||\n      touched[\"y\"] ||\n      touched[\"area\"] ||\n      touched[\"grid\"] ||\n      touched[\"view\"] ||\n      init\n    ) {\n      return this.updateRanges();\n    }\n  }\n\n  updateRanges() {\n    const axis = (x, y, range1, range2, axis) => {\n      const { second, resolution, samples, line, buffer, values } = axis;\n\n      // Set line steps along first axis\n      let min = range1.x;\n      let max = range1.y;\n      UAxis.setDimension(values.gridPosition, x).multiplyScalar(min);\n      UAxis.setDimension(values.gridStep, x).multiplyScalar(\n        (max - min) * resolution\n      );\n\n      // Add origin on remaining two axes\n      UAxis.addOrigin(values.gridPosition, axes, origin);\n\n      // Calculate scale along second axis\n      min = range2.x;\n      max = range2.y;\n      const ticks = this._helpers.scale.generate(second, buffer, min, max);\n      UAxis.setDimension(values.gridAxis, y);\n\n      // Clip to number of ticks\n      const n = ticks.length;\n      return line.geometry.clip(samples, n, 1, 1);\n    };\n\n    // Fetch grid range in both dimensions\n    const { axes, origin } = this.props;\n    const range1 = this._helpers.span.get(\"x.\", axes[0]);\n    const range2 = this._helpers.span.get(\"y.\", axes[1]);\n\n    // Update both line sets\n    const { lineX, lineY } = this.props;\n\n    if (lineX) {\n      axis(axes[0], axes[1], range1, range2, this.axes[0]);\n    }\n    if (lineY) {\n      axis(axes[1], axes[0], range2, range1, this.axes[+lineX]);\n    }\n    window.cake1 = this.axes[0].buffer;\n    window.cake2 = this.axes[1].buffer;\n    window.cake3 = this.axes[0];\n  }\n}\nGrid.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UJS from \"../../../util/js.js\";\nimport { Primitive } from \"../../primitive.js\";\n\nexport class Line extends Primitive {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"object\",\n      \"visible\",\n      \"style\",\n      \"line\",\n      \"arrow\",\n      \"geometry\",\n      \"position\",\n      \"bind\",\n      \"shade\",\n    ];\n  }\n\n  constructor(node, context, helpers) {\n    super(node, context, helpers);\n\n    this.line = this.arrows = null;\n  }\n\n  resize() {\n    if (this.bind.points == null) {\n      return;\n    }\n    const dims = this.bind.points.getActiveDimensions();\n\n    const samples = dims.width;\n    const strips = dims.height;\n    const ribbons = dims.depth;\n    const layers = dims.items;\n\n    this.line.geometry.clip(samples, strips, ribbons, layers);\n    return Array.from(this.arrows).map((arrow) =>\n      arrow.geometry.clip(samples, strips, ribbons, layers)\n    );\n  }\n\n  make() {\n    // Bind to attached data sources\n    let color;\n    this._helpers.bind.make([\n      { to: \"geometry.points\", trait: \"source\" },\n      { to: \"geometry.colors\", trait: \"source\" },\n    ]);\n\n    if (this.bind.points == null) {\n      return;\n    }\n\n    // Build transform chain\n    let position = this._shaders.shader();\n\n    // Fetch position\n    position = this.bind.points.sourceShader(position);\n\n    // Transform position to view\n    position = this._helpers.position.pipeline(position);\n\n    // Prepare bound uniforms\n    const styleUniforms = this._helpers.style.uniforms();\n    const lineUniforms = this._helpers.line.uniforms();\n    const arrowUniforms = this._helpers.arrow.uniforms();\n    const unitUniforms = this._inherit(\"unit\").getUnitUniforms();\n\n    // Clip start/end for terminating arrow\n    const { start, end } = this.props;\n\n    // Stroke style\n    const { stroke, join, proximity } = this.props;\n    this.proximity = proximity;\n\n    // Fetch geometry dimensions\n    const dims = this.bind.points.getDimensions();\n    const samples = dims.width;\n    const strips = dims.height;\n    const ribbons = dims.depth;\n    const layers = dims.items;\n\n    // Build color lookup\n    if (this.bind.colors) {\n      color = this._shaders.shader();\n      this.bind.colors.sourceShader(color);\n    }\n\n    // Build transition mask lookup\n    const mask = this._helpers.object.mask();\n\n    // Build fragment material lookup\n    const material = this._helpers.shade.pipeline() || false;\n\n    // Make line renderable\n    const uniforms = UJS.merge(\n      arrowUniforms,\n      lineUniforms,\n      styleUniforms,\n      unitUniforms\n    );\n    this.line = this._renderables.make(\"line\", {\n      uniforms,\n      samples,\n      strips,\n      ribbons,\n      layers,\n      position,\n      color,\n      clip: start || end,\n      stroke,\n      join,\n      proximity,\n      mask,\n      material,\n    });\n\n    // Make arrow renderables\n    this.arrows = [];\n    if (start) {\n      this.arrows.push(\n        this._renderables.make(\"arrow\", {\n          uniforms,\n          flip: true,\n          samples,\n          strips,\n          ribbons,\n          layers,\n          position,\n          color,\n          mask,\n          material,\n        })\n      );\n    }\n\n    if (end) {\n      this.arrows.push(\n        this._renderables.make(\"arrow\", {\n          uniforms,\n          samples,\n          strips,\n          ribbons,\n          layers,\n          position,\n          color,\n          mask,\n          material,\n        })\n      );\n    }\n\n    this._helpers.visible.make();\n    return this._helpers.object.make(this.arrows.concat([this.line]));\n  }\n\n  made() {\n    return this.resize();\n  }\n\n  unmake() {\n    this._helpers.bind.unmake();\n    this._helpers.visible.unmake();\n    this._helpers.object.unmake();\n\n    return (this.line = this.arrows = null);\n  }\n\n  change(changed, _touched, _init) {\n    if (\n      changed[\"geometry.points\"] ||\n      changed[\"line.stroke\"] ||\n      changed[\"line.join\"] ||\n      changed[\"arrow.start\"] ||\n      changed[\"arrow.end\"]\n    ) {\n      return this.rebuild();\n    }\n\n    if (changed[\"line.proximity\"]) {\n      if ((this.proximity != null) !== (this.props.proximity != null)) {\n        return this.rebuild();\n      }\n    }\n  }\n}\nLine.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UJS from \"../../../util/js.js\";\nimport { Primitive } from \"../../primitive.js\";\n\nexport class Point extends Primitive {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"object\",\n      \"visible\",\n      \"style\",\n      \"point\",\n      \"geometry\",\n      \"position\",\n      \"bind\",\n      \"shade\",\n    ];\n  }\n\n  constructor(node, context, helpers) {\n    super(node, context, helpers);\n\n    this.point = null;\n  }\n\n  resize() {\n    if (this.bind.points == null) {\n      return;\n    }\n\n    const dims = this.bind.points.getActiveDimensions();\n    const { items, width, height, depth } = dims;\n\n    return this.point.geometry.clip(width, height, depth, items);\n  }\n\n  make() {\n    // Bind to attached data sources\n    let color, size;\n    this._helpers.bind.make([\n      { to: \"geometry.points\", trait: \"source\" },\n      { to: \"geometry.colors\", trait: \"source\" },\n      { to: \"point.sizes\", trait: \"source\" },\n    ]);\n\n    if (this.bind.points == null) {\n      return;\n    }\n\n    // Build transform chain\n    let position = this._shaders.shader();\n\n    // Fetch position and transform to view\n    position = this.bind.points.sourceShader(position);\n    position = this._helpers.position.pipeline(position);\n\n    // Fetch geometry dimensions\n    const dims = this.bind.points.getDimensions();\n    const { items, width, height, depth } = dims;\n\n    // Prepare bound uniforms\n    const styleUniforms = this._helpers.style.uniforms();\n    const pointUniforms = this._helpers.point.uniforms();\n    const unitUniforms = this._inherit(\"unit\").getUnitUniforms();\n\n    // Build color lookup\n    if (this.bind.colors) {\n      color = this._shaders.shader();\n      this.bind.colors.sourceShader(color);\n    }\n\n    // Build size lookup\n    if (this.bind.sizes) {\n      size = this._shaders.shader();\n      this.bind.sizes.sourceShader(size);\n    }\n\n    // Build transition mask lookup\n    const mask = this._helpers.object.mask();\n\n    // Build fragment material lookup\n    const material = this._helpers.shade.pipeline() || false;\n\n    // Point style\n    const { shape } = this.props;\n    const { fill } = this.props;\n    const { optical } = this.props;\n\n    // Make point renderable\n    const uniforms = UJS.merge(unitUniforms, pointUniforms, styleUniforms);\n    this.point = this._renderables.make(\"point\", {\n      uniforms,\n      width,\n      height,\n      depth,\n      items,\n      position,\n      color,\n      size,\n      shape,\n      optical,\n      fill,\n      mask,\n      material,\n    });\n\n    this._helpers.visible.make();\n    this._helpers.object.make([this.point]);\n  }\n\n  made() {\n    return this.resize();\n  }\n\n  unmake() {\n    this._helpers.bind.unmake();\n    this._helpers.visible.unmake();\n    this._helpers.object.unmake();\n\n    this.point = null;\n  }\n\n  change(changed, _touched, _init) {\n    if (\n      changed[\"geometry.points\"] ||\n      changed[\"point.shape\"] ||\n      changed[\"point.fill\"]\n    ) {\n      return this.rebuild();\n    }\n  }\n}\nPoint.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UGLSL from \"../../../util/glsl.js\";\nimport * as UJS from \"../../../util/js.js\";\nimport { Primitive } from \"../../primitive.js\";\n\nexport class Strip extends Primitive {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"object\",\n      \"visible\",\n      \"style\",\n      \"line\",\n      \"mesh\",\n      \"strip\",\n      \"geometry\",\n      \"position\",\n      \"bind\",\n      \"shade\",\n    ];\n  }\n\n  constructor(node, context, helpers) {\n    super(node, context, helpers);\n\n    this.strip = null;\n  }\n\n  resize() {\n    if (this.bind.points == null) {\n      return;\n    }\n\n    const dims = this.bind.points.getActiveDimensions();\n    const { items, width, height, depth } = dims;\n\n    if (this.strip) {\n      this.strip.geometry.clip(width, height, depth, items);\n    }\n    if (this.line) {\n      this.line.geometry.clip(items, width, height, depth);\n    }\n\n    if (this.bind.map != null) {\n      const map = this.bind.map.getActiveDimensions();\n      if (this.strip) {\n        return this.strip.geometry.map(\n          map.width,\n          map.height,\n          map.depth,\n          map.items\n        );\n      }\n    }\n  }\n\n  make() {\n    // Bind to attached data sources\n    let color, uniforms;\n    this._helpers.bind.make([\n      { to: \"geometry.points\", trait: \"source\" },\n      { to: \"geometry.colors\", trait: \"source\" },\n      { to: \"mesh.map\", trait: \"source\" },\n    ]);\n\n    if (this.bind.points == null) {\n      return;\n    }\n\n    // Build transform chain\n    let position = this._shaders.shader();\n\n    // Fetch position\n    position = this.bind.points.sourceShader(position);\n\n    // Transform position to view\n    position = this._helpers.position.pipeline(position);\n\n    // Prepare bound uniforms\n    const styleUniforms = this._helpers.style.uniforms();\n    const lineUniforms = this._helpers.line.uniforms();\n    const unitUniforms = this._inherit(\"unit\").getUnitUniforms();\n\n    // Get display properties\n    const { line, shaded, fill, stroke, join } = this.props;\n\n    // Auto z-bias wireframe over surface\n    const wireUniforms = {};\n    wireUniforms.styleZBias = this._attributes.make(this._types.number());\n    this.wireZBias = wireUniforms.styleZBias;\n\n    // Fetch geometry dimensions\n    const dims = this.bind.points.getDimensions();\n    const { items, width, height, depth } = dims;\n\n    // Build color lookup\n    if (this.bind.colors) {\n      color = this._shaders.shader();\n      color = this.bind.colors.sourceShader(color);\n    }\n\n    // Build transition mask lookup\n    const mask = this._helpers.object.mask();\n\n    // Build texture map lookup\n    this._helpers.shade.map(\n      this.bind.map != null\n        ? this.bind.map.sourceShader(this._shaders.shader())\n        : undefined\n    );\n\n    // Build fragment material lookup\n    const material = this._helpers.shade.pipeline();\n    const faceMaterial = material || shaded;\n    const lineMaterial = material || false;\n\n    const objects = [];\n\n    // Make line renderable\n    if (line) {\n      // Swizzle strip edges into segments\n      const swizzle = this._shaders.shader();\n      swizzle.pipe(UGLSL.swizzleVec4(\"yzwx\"));\n      swizzle.pipe(position);\n\n      uniforms = UJS.merge(\n        unitUniforms,\n        lineUniforms,\n        styleUniforms,\n        wireUniforms\n      );\n\n      this.line = this._renderables.make(\"line\", {\n        uniforms,\n        samples: items,\n        strips: width,\n        ribbons: height,\n        layers: depth,\n        position: swizzle,\n        color,\n        stroke,\n        join,\n        mask,\n        material: lineMaterial,\n      });\n\n      objects.push(this.line);\n    }\n\n    // Make strip renderable\n    if (fill) {\n      uniforms = UJS.merge(styleUniforms, {});\n\n      this.strip = this._renderables.make(\"strip\", {\n        uniforms,\n        width,\n        height,\n        depth,\n        items,\n        position,\n        color,\n        material: faceMaterial,\n      });\n      objects.push(this.strip);\n    }\n\n    this._helpers.visible.make();\n    return this._helpers.object.make(objects);\n  }\n\n  made() {\n    return this.resize();\n  }\n\n  unmake() {\n    this._helpers.bind.unmake();\n    this._helpers.visible.unmake();\n    this._helpers.object.unmake();\n\n    return (this.strip = null);\n  }\n\n  change(changed, touched, init) {\n    if (changed[\"geometry.points\"] || touched[\"mesh\"]) {\n      return this.rebuild();\n    }\n\n    if (changed[\"style.zBias\"] || changed[\"mesh.lineBias\"] || init) {\n      const { fill, zBias, lineBias } = this.props;\n      return (this.wireZBias.value = zBias + (fill ? lineBias : 0));\n    }\n  }\n}\nStrip.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UJS from \"../../../util/js.js\";\nimport { Color } from \"three/src/math/Color.js\";\nimport { Primitive } from \"../../primitive.js\";\n\nexport class Surface extends Primitive {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"object\",\n      \"visible\",\n      \"style\",\n      \"line\",\n      \"mesh\",\n      \"geometry\",\n      \"surface\",\n      \"position\",\n      \"grid\",\n      \"bind\",\n      \"shade\",\n    ];\n    this.defaults = {\n      lineX: false,\n      lineY: false,\n    };\n  }\n\n  constructor(node, context, helpers) {\n    super(node, context, helpers);\n\n    this.lineX = this.lineY = this.surface = null;\n  }\n\n  resize() {\n    if (this.bind.points == null) {\n      return;\n    }\n\n    const dims = this.bind.points.getActiveDimensions();\n    const { width, height, depth, items } = dims;\n\n    if (this.surface) {\n      this.surface.geometry.clip(width, height, depth, items);\n    }\n    if (this.lineX) {\n      this.lineX.geometry.clip(width, height, depth, items);\n    }\n    if (this.lineY) {\n      this.lineY.geometry.clip(height, width, depth, items);\n    }\n\n    if (this.bind.map != null) {\n      const map = this.bind.map.getActiveDimensions();\n      if (this.surface) {\n        return this.surface.geometry.map(\n          map.width,\n          map.height,\n          map.depth,\n          map.items\n        );\n      }\n    }\n  }\n\n  make() {\n    // Bind to attached data sources\n    let color;\n    this._helpers.bind.make([\n      { to: \"geometry.points\", trait: \"source\" },\n      { to: \"geometry.colors\", trait: \"source\" },\n      { to: \"mesh.map\", trait: \"source\" },\n    ]);\n\n    if (this.bind.points == null) {\n      return;\n    }\n\n    // Build transform chain\n    let position = this._shaders.shader();\n\n    // Fetch position and transform to view\n    position = this.bind.points.sourceShader(position);\n    position = this._helpers.position.pipeline(position);\n\n    // Prepare bound uniforms\n    const styleUniforms = this._helpers.style.uniforms();\n    const wireUniforms = this._helpers.style.uniforms();\n    const lineUniforms = this._helpers.line.uniforms();\n    const surfaceUniforms = this._helpers.surface.uniforms();\n    const unitUniforms = this._inherit(\"unit\").getUnitUniforms();\n\n    // Darken wireframe if needed for contrast\n    // Auto z-bias wireframe over surface\n    wireUniforms.styleColor = this._attributes.make(this._types.color());\n    wireUniforms.styleZBias = this._attributes.make(this._types.number());\n    this.wireColor = wireUniforms.styleColor.value;\n    this.wireZBias = wireUniforms.styleZBias;\n    this.wireScratch = new Color();\n\n    // Fetch geometry dimensions\n    const dims = this.bind.points.getDimensions();\n    const { width, height, depth, items } = dims;\n\n    // Get display properties\n    const {\n      shaded,\n      fill,\n      lineX,\n      lineY,\n      closedX,\n      closedY,\n      stroke,\n      join,\n      proximity,\n      crossed,\n    } = this.props;\n    const objects = [];\n    this.proximity = proximity;\n\n    // Build color lookup\n    if (this.bind.colors) {\n      color = this._shaders.shader();\n      this.bind.colors.sourceShader(color);\n    }\n\n    // Build transition mask lookup\n    const mask = this._helpers.object.mask();\n\n    // Build texture map lookup\n    const map = this._helpers.shade.map(\n      this.bind.map != null\n        ? this.bind.map.sourceShader(this._shaders.shader())\n        : undefined\n    );\n\n    // Build fragment material lookup\n    const material = this._helpers.shade.pipeline();\n    const faceMaterial = material || shaded;\n    const lineMaterial = material || false;\n\n    // Make line and surface renderables\n    const { swizzle, swizzle2 } = this._helpers.position;\n    let uniforms = UJS.merge(\n      unitUniforms,\n      lineUniforms,\n      styleUniforms,\n      wireUniforms\n    );\n    const zUnits = lineX || lineY ? -50 : 0;\n    if (lineX) {\n      this.lineX = this._renderables.make(\"line\", {\n        uniforms,\n        samples: width,\n        strips: height,\n        ribbons: depth,\n        layers: items,\n        position,\n        color,\n        zUnits: -zUnits,\n        stroke,\n        join,\n        mask,\n        material: lineMaterial,\n        proximity,\n        closed: closedX || closed,\n      });\n      objects.push(this.lineX);\n    }\n\n    if (lineY) {\n      this.lineY = this._renderables.make(\"line\", {\n        uniforms,\n        samples: height,\n        strips: width,\n        ribbons: depth,\n        layers: items,\n        position: swizzle2(position, \"yxzw\", \"yxzw\"),\n        color: swizzle(color, \"yxzw\"),\n        zUnits: -zUnits,\n        stroke,\n        join,\n        mask: swizzle(mask, crossed ? \"xyzw\" : \"yxzw\"),\n        material: lineMaterial,\n        proximity,\n        closed: closedY || closed,\n      });\n      objects.push(this.lineY);\n    }\n\n    if (fill) {\n      uniforms = UJS.merge(unitUniforms, surfaceUniforms, styleUniforms);\n      this.surface = this._renderables.make(\"surface\", {\n        uniforms,\n        width,\n        height,\n        surfaces: depth,\n        layers: items,\n        position,\n        color,\n        zUnits,\n        stroke,\n        material: faceMaterial,\n        mask,\n        map,\n        intUV: true,\n        closedX: closedX || closed,\n        closedY: closedY || closed,\n      });\n      objects.push(this.surface);\n    }\n\n    this._helpers.visible.make();\n    return this._helpers.object.make(objects);\n  }\n\n  made() {\n    return this.resize();\n  }\n\n  unmake() {\n    this._helpers.bind.unmake();\n    this._helpers.visible.unmake();\n    this._helpers.object.unmake();\n\n    return (this.lineX = this.lineY = this.surface = null);\n  }\n\n  _convertGammaToLinear(color, gammaFactor = 2.0) {\n    color.r = Math.pow(color.r, gammaFactor);\n    color.g = Math.pow(color.g, gammaFactor);\n    color.b = Math.pow(color.b, gammaFactor);\n\n    return color;\n  }\n\n  _convertLinearToGamma(color, gammaFactor = 2.0) {\n    const safeInverse = gammaFactor > 0 ? 1.0 / gammaFactor : 1.0;\n\n    color.r = Math.pow(color.r, safeInverse);\n    color.g = Math.pow(color.g, safeInverse);\n    color.b = Math.pow(color.b, safeInverse);\n\n    return color;\n  }\n\n  change(changed, touched, init) {\n    if (\n      changed[\"geometry.points\"] ||\n      changed[\"mesh.shaded\"] ||\n      changed[\"mesh.fill\"] ||\n      changed[\"line.stroke\"] ||\n      changed[\"line.join\"] ||\n      touched[\"grid\"]\n    ) {\n      return this.rebuild();\n    }\n\n    if (\n      changed[\"style.color\"] ||\n      changed[\"style.zBias\"] ||\n      changed[\"mesh.fill\"] ||\n      changed[\"mesh.lineBias\"] ||\n      init\n    ) {\n      const { fill, color, zBias, lineBias } = this.props;\n\n      this.wireZBias.value = zBias + (fill ? lineBias : 0);\n      this.wireColor.copy(color);\n      if (fill) {\n        const c = this.wireScratch;\n        c.setRGB(color.x, color.y, color.z);\n        this._convertLinearToGamma(\n          this._convertGammaToLinear(c).multiplyScalar(0.75)\n        );\n        this.wireColor.x = c.r;\n        this.wireColor.y = c.g;\n        this.wireColor.z = c.b;\n      }\n    }\n\n    if (changed[\"line.proximity\"]) {\n      if ((this.proximity != null) !== (this.props.proximity != null)) {\n        return this.rebuild();\n      }\n    }\n  }\n}\nSurface.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UJS from \"../../../util/js.js\";\nimport { Primitive } from \"../../primitive.js\";\n\nexport class Ticks extends Primitive {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"object\",\n      \"visible\",\n      \"style\",\n      \"line\",\n      \"ticks\",\n      \"geometry\",\n      \"position\",\n      \"bind\",\n      \"shade\",\n    ];\n  }\n\n  init() {\n    return (this.tickStrip = this.line = null);\n  }\n\n  resize() {\n    if (this.bind.points == null) {\n      return;\n    }\n    const dims = this.bind.points.getActiveDimensions();\n\n    const active = +(dims.items > 0);\n    const strips = dims.width * active;\n    const ribbons = dims.height * active;\n    const layers = dims.depth * active;\n\n    this.line.geometry.clip(2, strips, ribbons, layers);\n    return this.tickStrip.set(0, strips - 1);\n  }\n\n  make() {\n    // Bind to attached data sources\n    let color, position;\n    this._helpers.bind.make([\n      { to: \"geometry.points\", trait: \"source\" },\n      { to: \"geometry.colors\", trait: \"source\" },\n    ]);\n\n    if (this.bind.points == null) {\n      return;\n    }\n\n    // Prepare bound uniforms\n    const styleUniforms = this._helpers.style.uniforms();\n    const lineUniforms = this._helpers.line.uniforms();\n    const unitUniforms = this._inherit(\"unit\").getUnitUniforms();\n    const uniforms = UJS.merge(lineUniforms, styleUniforms, unitUniforms);\n\n    // Prepare position shader\n    const positionUniforms = {\n      tickEpsilon: this.node.attributes[\"ticks.epsilon\"],\n      tickSize: this.node.attributes[\"ticks.size\"],\n      tickNormal: this.node.attributes[\"ticks.normal\"],\n      tickStrip: this._attributes.make(this._types.vec2(0, 0)),\n      worldUnit: uniforms.worldUnit,\n      focusDepth: uniforms.focusDepth,\n    };\n\n    this.tickStrip = positionUniforms.tickStrip.value;\n\n    // Build transform chain\n    const p = (position = this._shaders.shader());\n\n    // Require buffer sampler as callback\n    p.require(this.bind.points.sourceShader(this._shaders.shader()));\n\n    // Require view transform as callback\n    p.require(this._helpers.position.pipeline(this._shaders.shader()));\n\n    // Link to tick shader\n    p.pipe(\"ticks.position\", positionUniforms);\n\n    // Stroke style\n    const { stroke, join } = this.props;\n\n    // Fetch geometry dimensions\n    const dims = this.bind.points.getDimensions();\n    const strips = dims.width;\n    const ribbons = dims.height;\n    const layers = dims.depth;\n\n    // Build color lookup\n    if (this.bind.colors) {\n      color = this._shaders.shader();\n      this.bind.colors.sourceShader(color);\n    }\n\n    // Build transition mask lookup\n    const mask = this._helpers.object.mask();\n\n    // Build fragment material lookup\n    const material = this._helpers.shade.pipeline() || false;\n\n    // Make line renderable\n    const { swizzle } = this._helpers.position;\n    this.line = this._renderables.make(\"line\", {\n      uniforms,\n      samples: 2,\n      strips,\n      ribbons,\n      layers,\n      position,\n      color,\n      stroke,\n      join,\n      mask: swizzle(mask, \"yzwx\"),\n      material,\n    });\n\n    this._helpers.visible.make();\n    return this._helpers.object.make([this.line]);\n  }\n\n  made() {\n    return this.resize();\n  }\n\n  unmake() {\n    this.line = null;\n\n    this._helpers.visible.unmake();\n    return this._helpers.object.unmake();\n  }\n\n  change(changed, _touched, _init) {\n    if (\n      changed[\"geometry.points\"] ||\n      changed[\"line.stroke\"] ||\n      changed[\"line.join\"]\n    ) {\n      return this.rebuild();\n    }\n  }\n}\nTicks.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UJS from \"../../../util/js.js\";\nimport { Primitive } from \"../../primitive.js\";\n\nexport class Vector extends Primitive {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"object\",\n      \"visible\",\n      \"style\",\n      \"line\",\n      \"arrow\",\n      \"geometry\",\n      \"position\",\n      \"bind\",\n      \"shade\",\n    ];\n  }\n\n  constructor(node, context, helpers) {\n    super(node, context, helpers);\n\n    this.line = this.arrows = null;\n  }\n\n  resize() {\n    if (this.bind.points == null) {\n      return;\n    }\n    const dims = this.bind.points.getActiveDimensions();\n\n    const samples = dims.items;\n    const strips = dims.width;\n    const ribbons = dims.height;\n    const layers = dims.depth;\n\n    this.line.geometry.clip(samples, strips, ribbons, layers);\n    return Array.from(this.arrows).map((arrow) =>\n      arrow.geometry.clip(samples, strips, ribbons, layers)\n    );\n  }\n\n  make() {\n    // Bind to attached data sources\n    let color;\n    this._helpers.bind.make([\n      { to: \"geometry.points\", trait: \"source\" },\n      { to: \"geometry.colors\", trait: \"source\" },\n    ]);\n\n    if (this.bind.points == null) {\n      return;\n    }\n\n    // Build transform chain\n    let position = this._shaders.shader();\n\n    // Fetch position\n    this.bind.points.sourceShader(position);\n\n    // Transform position to view\n    this._helpers.position.pipeline(position);\n\n    // Prepare bound uniforms\n    const styleUniforms = this._helpers.style.uniforms();\n    const lineUniforms = this._helpers.line.uniforms();\n    const arrowUniforms = this._helpers.arrow.uniforms();\n    const unitUniforms = this._inherit(\"unit\").getUnitUniforms();\n\n    // Clip start/end for terminating arrow\n    const { start, end } = this.props;\n\n    // Stroke style\n    const { stroke, join, proximity } = this.props;\n    this.proximity = proximity;\n\n    // Fetch geometry dimensions\n    const dims = this.bind.points.getDimensions();\n    const samples = dims.items;\n    const strips = dims.width;\n    const ribbons = dims.height;\n    const layers = dims.depth;\n\n    // Build color lookup\n    if (this.bind.colors) {\n      color = this._shaders.shader();\n      this.bind.colors.sourceShader(color);\n    }\n\n    // Build transition mask lookup\n    let mask = this._helpers.object.mask();\n\n    // Build fragment material lookup\n    let material = this._helpers.shade.pipeline() || false;\n\n    // Swizzle vector to line\n    const { swizzle, swizzle2 } = this._helpers.position;\n    position = swizzle2(position, \"yzwx\", \"yzwx\");\n    color = swizzle(color, \"yzwx\");\n    mask = swizzle(mask, \"yzwx\");\n    material = swizzle(material, \"yzwx\");\n\n    // Make line renderable\n    const uniforms = UJS.merge(\n      arrowUniforms,\n      lineUniforms,\n      styleUniforms,\n      unitUniforms\n    );\n    this.line = this._renderables.make(\"line\", {\n      uniforms,\n      samples,\n      ribbons,\n      strips,\n      layers,\n      position,\n      color,\n      clip: start || end,\n      stroke,\n      join,\n      proximity,\n      mask,\n      material,\n    });\n\n    // Make arrow renderables\n    this.arrows = [];\n    if (start) {\n      this.arrows.push(\n        this._renderables.make(\"arrow\", {\n          uniforms,\n          flip: true,\n          samples,\n          ribbons,\n          strips,\n          layers,\n          position,\n          color,\n          mask,\n          material,\n        })\n      );\n    }\n\n    if (end) {\n      this.arrows.push(\n        this._renderables.make(\"arrow\", {\n          uniforms,\n          samples,\n          ribbons,\n          strips,\n          layers,\n          position,\n          color,\n          mask,\n          material,\n        })\n      );\n    }\n\n    this._helpers.visible.make();\n    return this._helpers.object.make(this.arrows.concat([this.line]));\n  }\n\n  made() {\n    return this.resize();\n  }\n\n  unmake() {\n    this._helpers.bind.unmake();\n    this._helpers.visible.unmake();\n    this._helpers.object.unmake();\n\n    return (this.line = this.arrows = null);\n  }\n\n  change(changed, _touched, _init) {\n    if (\n      changed[\"geometry.points\"] ||\n      changed[\"line.stroke\"] ||\n      changed[\"line.join\"] ||\n      changed[\"arrow.start\"] ||\n      changed[\"arrow.end\"]\n    ) {\n      return this.rebuild();\n    }\n\n    if (changed[\"line.proximity\"]) {\n      if ((this.proximity != null) !== (this.props.proximity != null)) {\n        return this.rebuild();\n      }\n    }\n  }\n}\nVector.initClass();\n","export * from \"./axis.js\";\nexport * from \"./face.js\";\nexport * from \"./grid.js\";\nexport * from \"./line.js\";\nexport * from \"./point.js\";\nexport * from \"./strip.js\";\nexport * from \"./surface.js\";\nexport * from \"./ticks.js\";\nexport * from \"./vector.js\";\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Voxel } from \"../data/voxel.js\";\n\nexport class HTML extends Voxel {\n  static initClass() {\n    this.traits = [\"node\", \"buffer\", \"active\", \"data\", \"voxel\", \"html\"];\n    this.finals = { channels: 1 };\n  }\n\n  init() {\n    super.init();\n    this.storage = \"pushBuffer\";\n  }\n\n  make() {\n    super.make();\n\n    // Get our own size\n    const { items, width, height, depth } = this.getDimensions();\n\n    // Prepare DOM element factory\n    this.dom = this._overlays.make(\"dom\");\n    return this.dom.hint(items * width * height * depth);\n  }\n\n  unmake() {\n    super.unmake();\n    if (this.dom != null) {\n      this.dom.dispose();\n      return (this.dom = null);\n    }\n  }\n\n  update() {\n    return super.update();\n  }\n\n  change(changed, touched, init) {\n    if (touched[\"html\"]) {\n      return this.rebuild();\n    }\n    return super.change(changed, touched, init);\n  }\n\n  nodes() {\n    return this.buffer.read();\n  }\n\n  callback(callback) {\n    const { el } = this.dom;\n\n    if (callback.length <= 6) {\n      return (emit, i, j, k, l) => callback(emit, el, i, j, k, l);\n    } else {\n      return (emit, i, j, k, l) => {\n        return callback(\n          emit,\n          el,\n          i,\n          j,\n          k,\n          l,\n          this.bufferClock,\n          this.bufferStep\n        );\n      };\n    }\n  }\n}\nHTML.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Primitive } from \"../../primitive.js\";\n\nexport class DOM extends Primitive {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"bind\",\n      \"object\",\n      \"visible\",\n      \"overlay\",\n      \"dom\",\n      \"attach\",\n      \"position\",\n    ];\n  }\n\n  init() {\n    this.emitter = this.root = null;\n    this.active = {};\n  }\n\n  make() {\n    super.make();\n\n    // Bind to attached objects\n    this._helpers.bind.make([\n      { to: \"dom.html\", trait: \"html\" },\n      { to: \"dom.points\", trait: \"source\" },\n    ]);\n\n    if (this.bind.points == null || this.bind.html == null) {\n      return;\n    }\n\n    // Listen for updates\n    this.root = this._inherit(\"root\");\n    this._listen(\"root\", \"root.update\", this.update);\n    this._listen(\"root\", \"root.post\", this.post);\n\n    // Fetch geometry dimensions\n    const pointDims = this.bind.points.getDimensions();\n    const htmlDims = this.bind.html.getDimensions();\n\n    const items = Math.min(pointDims.items, htmlDims.items);\n    const width = Math.min(pointDims.width, htmlDims.width);\n    const height = Math.min(pointDims.height, htmlDims.height);\n    const depth = Math.min(pointDims.depth, htmlDims.depth);\n\n    // Build shader to sample position data\n    let position = this.bind.points.sourceShader(this._shaders.shader());\n\n    // Transform data into screen space\n    position = this._helpers.position.pipeline(position);\n\n    // Apply global projection\n    const projection = this._shaders.shader({ globals: [\"projectionMatrix\"] });\n    projection.pipe(\"project.readback\");\n    position.pipe(projection);\n\n    // Build nop index shader\n    const indexer = this._shaders.shader();\n\n    // Prepare readback/memo RTT\n    this.readback = this._renderables.make(\"readback\", {\n      map: position,\n      indexer,\n      items,\n      width,\n      height,\n      depth,\n      channels: 4,\n      stpq: true,\n    });\n\n    // Prepare overlay container VDOM\n    this.dom = this._overlays.make(\"dom\");\n    this.dom.hint(items * width * height * depth * 2);\n    // Make sure we have enough for wrapping each given element once\n\n    // Prepare readback consumer\n    this.emitter = this.callback(this.bind.html.nodes());\n    this.readback.setCallback(this.emitter);\n\n    this._helpers.visible.make();\n  }\n\n  unmake() {\n    if (this.readback != null) {\n      this.readback.dispose();\n      this.dom.dispose();\n      this.readback = this.dom = null;\n\n      this.root = null;\n      this.emitter = null;\n      this.active = {};\n    }\n\n    this._helpers.bind.unmake();\n    this._helpers.visible.unmake();\n  }\n\n  update() {\n    if (this.readback == null) {\n      return;\n    }\n    if (this.props.visible) {\n      this.readback.update(\n        this.root != null ? this.root.getCamera() : undefined\n      );\n      this.readback.post();\n      this.readback.iterate();\n    }\n  }\n\n  post() {\n    if (this.readback == null) {\n      return;\n    }\n    this.dom.render(this.isVisible ? this.emitter.nodes() : null);\n  }\n\n  callback(data) {\n    // Create static consumer for the readback\n    let strideJ, strideK;\n    const uniforms = this._inherit(\"unit\").getUnitUniforms();\n    const width = uniforms.viewWidth;\n    const height = uniforms.viewHeight;\n\n    const attr = this.node.attributes[\"dom.attributes\"];\n    const size = this.node.attributes[\"dom.size\"];\n    const zoom = this.node.attributes[\"dom.zoom\"];\n    const color = this.node.attributes[\"dom.color\"];\n    const outline = this.node.attributes[\"dom.outline\"];\n    const pointer = this.node.attributes[\"dom.pointerEvents\"];\n    const opacity = this.node.attributes[\"overlay.opacity\"];\n    const zIndex = this.node.attributes[\"overlay.zIndex\"];\n    const offset = this.node.attributes[\"attach.offset\"];\n    const depth = this.node.attributes[\"attach.depth\"];\n    const snap = this.node.attributes[\"attach.snap\"];\n    const { el } = this.dom;\n\n    let nodes = [];\n    let styles = null;\n    let className = null;\n\n    let strideI = (strideJ = strideK = 0);\n    let colorString = \"\";\n\n    const f = function (x, y, z, w, i, j, k, l) {\n      // Get HTML item by offset\n      let v;\n      const index = l + strideI * i + strideJ * j + strideK * k;\n      const children = data[index];\n\n      // Clip behind camera or when invisible\n      const clip = w < 0;\n\n      // Depth blending\n      const iw = 1 / w;\n      const flatZ = 1 + (iw - 1) * depth.value;\n      const scale = clip ? 0 : flatZ;\n\n      // GL to CSS coordinate transform\n      const ox = +offset.value.x * scale;\n      const oy = +offset.value.y * scale;\n      let xx = (x + 1) * width.value * 0.5 + ox;\n      let yy = (y - 1) * height.value * 0.5 + oy;\n\n      // Handle zoom/scale\n      xx /= zoom.value;\n      yy /= zoom.value;\n\n      // Snap to pixel\n      if (snap.value) {\n        xx = Math.round(xx);\n        yy = Math.round(yy);\n      }\n\n      // Clip and apply opacity\n      const alpha = Math.min(0.999, clip ? 0 : opacity.value);\n\n      // Generate div\n      const props = {\n        className,\n        style: {\n          transform: `translate3d(${xx}px, ${-yy}px, ${\n            1 - w\n          }px) translate(-50%, -50%) scale(${scale},${scale})`,\n          opacity: alpha,\n        },\n      };\n      for (k in styles) {\n        v = styles[k];\n        props.style[k] = v;\n      }\n\n      // Merge in external attributes\n      const a = attr.value;\n      if (a != null) {\n        const s = a.style;\n        for (k in a) {\n          v = a[k];\n          if (![\"style\", \"className\"].includes(k)) {\n            props[k] = v;\n          }\n        }\n        if (s != null) {\n          for (k in s) {\n            v = s[k];\n            props.style[k] = v;\n          }\n        }\n      }\n      props.className +=\n        \" \" +\n        ((a != null ? a.className : undefined) != null\n          ? a != null\n            ? a.className\n            : undefined\n          : \"mathbox-label\");\n\n      // Push node onto list\n      return nodes.push(el(\"div\", props, children));\n    };\n\n    f.reset = () => {\n      nodes = [];\n      [strideI, strideJ, strideK] = Array.from([\n        this.strideI,\n        this.strideJ,\n        this.strideK,\n      ]);\n\n      const c = color.value;\n      const m = (x) => Math.floor(x * 255);\n      colorString = c ? `rgb(${[m(c.x), m(c.y), m(c.z)]})` : \"\";\n\n      className = `mathbox-outline-${Math.round(outline.value)}`;\n      styles = {};\n      if (c) {\n        styles.color = colorString;\n      }\n      styles.fontSize = `${size.value}px`;\n      if (zoom.value !== 1) {\n        styles.zoom = zoom.value;\n      }\n      if (zIndex.value > 0) {\n        styles.zIndex = zIndex.value;\n      }\n      if (pointer.value) {\n        return (styles.pointerEvents = \"auto\");\n      }\n    };\n\n    f.nodes = () => nodes;\n    return f;\n  }\n\n  resize() {\n    let sI, sJ;\n    if (this.readback == null) {\n      return;\n    }\n\n    // Fetch geometry/html dimensions\n    const pointDims = this.bind.points.getActiveDimensions();\n    const htmlDims = this.bind.html.getActiveDimensions();\n\n    const items = Math.min(pointDims.items, htmlDims.items);\n    const width = Math.min(pointDims.width, htmlDims.width);\n    const height = Math.min(pointDims.height, htmlDims.height);\n    const depth = Math.min(pointDims.depth, htmlDims.depth);\n\n    // Limit readback to active area\n    this.readback.setActive(items, width, height, depth);\n\n    // Recalculate iteration strides\n    this.strideI = sI = htmlDims.items;\n    this.strideJ = sJ = sI * htmlDims.width;\n    this.strideK = sJ * htmlDims.height;\n  }\n\n  change(changed, _touched, _init) {\n    if (changed[\"dom.html\"] || changed[\"dom.points\"]) {\n      return this.rebuild();\n    }\n  }\n}\nDOM.initClass();\n","export * from \"./html.js\";\nexport * from \"./dom.js\";\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UData from \"../../../util/data.js\";\n\nimport { FloatType, NearestFilter } from \"three/src/constants.js\";\nimport { Buffer } from \"../data/buffer.js\";\nimport { Voxel } from \"../data/voxel.js\";\n\nexport class Text extends Voxel {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"buffer\",\n      \"active\",\n      \"data\",\n      \"texture\",\n      \"voxel\",\n      \"text\",\n      \"font\",\n    ];\n    this.defaults = {\n      minFilter: \"linear\",\n      magFilter: \"linear\",\n    };\n    this.finals = { channels: 1 };\n  }\n\n  init() {\n    super.init();\n    return (this.atlas = null);\n  }\n\n  textShader(shader) {\n    return this.atlas.shader(shader);\n  }\n\n  textIsSDF() {\n    return this.props.sdf > 0;\n  }\n  textHeight() {\n    return this.props.detail;\n  }\n\n  make() {\n    // Read sampling parameters\n    let { minFilter, magFilter, type } = this.props;\n\n    // Read font parameters\n    const { font, style, variant, weight, detail, sdf } = this.props;\n\n    // Prepare text atlas\n    this.atlas = this._renderables.make(\"textAtlas\", {\n      font,\n      size: detail,\n      style,\n      variant,\n      weight,\n      outline: sdf,\n      minFilter,\n      magFilter,\n      type,\n    });\n\n    // Underlying data buffer needs no filtering\n    this.minFilter = NearestFilter;\n    this.magFilter = NearestFilter;\n    this.type = FloatType;\n\n    // Skip voxel::make(), as we need 4 channels internally in our buffer to store sprite x/y/w/h per string\n    Buffer.prototype.make.call(this);\n\n    // Read sampling parameters\n    minFilter = this.minFilter != null ? this.minFilter : this.props.minFilter;\n    magFilter = this.magFilter != null ? this.magFilter : this.props.magFilter;\n    type = this.type != null ? this.type : this.props.type;\n\n    // Read given dimensions\n    const { width } = this.props;\n    const { height } = this.props;\n    const { depth } = this.props;\n    const reserveX = this.props.bufferWidth;\n    const reserveY = this.props.bufferHeight;\n    const reserveZ = this.props.bufferDepth;\n    const { channels } = this.props;\n    const { items } = this.props;\n\n    let dims = (this.spec = { channels, items, width, height, depth });\n\n    this.items = dims.items;\n    this.channels = dims.channels;\n\n    // Init to right size if data supplied\n    const { data } = this.props;\n    dims = UData.getDimensions(data, dims);\n\n    const { space } = this;\n    space.width = Math.max(reserveX, dims.width || 1);\n    space.height = Math.max(reserveY, dims.height || 1);\n    space.depth = Math.max(reserveZ, dims.depth || 1);\n\n    // Create text voxel buffer\n    this.buffer = this._renderables.make(this.storage, {\n      width: space.width,\n      height: space.height,\n      depth: space.depth,\n      channels: 4,\n      items,\n      minFilter,\n      magFilter,\n      type,\n    });\n\n    // Hook buffer emitter to map atlas text\n    const { atlas } = this;\n    const { emit } = this.buffer.streamer;\n    return (this.buffer.streamer.emit = (text) => atlas.map(text, emit));\n  }\n\n  unmake() {\n    super.unmake();\n    if (this.atlas) {\n      this.atlas.dispose();\n      return (this.atlas = null);\n    }\n  }\n\n  update() {\n    this.atlas.begin();\n    super.update();\n    return this.atlas.end();\n  }\n\n  change(changed, touched, init) {\n    if (touched[\"font\"]) {\n      return this.rebuild();\n    }\n    return super.change(changed, touched, init);\n  }\n}\nText.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Source } from \"../base/source\";\n\nexport class Operator extends Source {\n  static initClass() {\n    this.traits = [\"node\", \"bind\", \"operator\", \"source\", \"index\"];\n  }\n\n  indexShader(shader) {\n    return __guardMethod__(this.bind.source, \"indexShader\", (o) =>\n      o.indexShader(shader)\n    );\n  }\n  sourceShader(shader) {\n    return __guardMethod__(this.bind.source, \"sourceShader\", (o) =>\n      o.sourceShader(shader)\n    );\n  }\n\n  getDimensions() {\n    return this.bind.source.getDimensions();\n  }\n  getFutureDimensions() {\n    return this.bind.source.getFutureDimensions();\n  }\n  getActiveDimensions() {\n    return this.bind.source.getActiveDimensions();\n  }\n  getIndexDimensions() {\n    return this.bind.source.getIndexDimensions();\n  }\n\n  init() {\n    return (this.sourceSpec = [{ to: \"operator.source\", trait: \"source\" }]);\n  }\n\n  make() {\n    super.make();\n\n    // Bind to attached data sources\n    return this._helpers.bind.make(this.sourceSpec);\n  }\n\n  made() {\n    this.resize();\n    return super.made();\n  }\n\n  unmake() {\n    return this._helpers.bind.unmake();\n  }\n\n  resize(_rebuild) {\n    return this.trigger({\n      type: \"source.resize\",\n    });\n  }\n}\nOperator.initClass();\n\nfunction __guardMethod__(obj, methodName, transform) {\n  if (\n    typeof obj !== \"undefined\" &&\n    obj !== null &&\n    typeof obj[methodName] === \"function\"\n  ) {\n    return transform(obj, methodName);\n  } else {\n    return undefined;\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { FloatType, NearestFilter } from \"three/src/constants.js\";\nimport { Operator } from \"../operator/operator.js\";\n\nexport class Format extends Operator {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"bind\",\n      \"operator\",\n      \"texture\",\n      \"text\",\n      \"format\",\n      \"font\",\n    ];\n    this.defaults = {\n      minFilter: \"linear\",\n      magFilter: \"linear\",\n    };\n  }\n\n  init() {\n    super.init();\n    this.atlas = this.buffer = this.used = this.time = null;\n    return (this.filled = false);\n  }\n\n  sourceShader(shader) {\n    return this.buffer.shader(shader);\n  }\n\n  textShader(shader) {\n    return this.atlas.shader(shader);\n  }\n\n  textIsSDF() {\n    return this.props.sdf > 0;\n  }\n\n  textHeight() {\n    return this.props.detail;\n  }\n\n  make() {\n    // Bind to attached data sources    # super()\n    this._helpers.bind.make([{ to: \"operator.source\", trait: \"raw\" }]);\n\n    // Read sampling parameters\n    let { minFilter, magFilter, type } = this.props;\n\n    // Read font parameters\n    const { font, style, variant, weight, detail, sdf } = this.props;\n\n    // Prepare text atlas\n    this.atlas = this._renderables.make(\"textAtlas\", {\n      font,\n      size: detail,\n      style,\n      variant,\n      weight,\n      outline: sdf,\n      minFilter,\n      magFilter,\n      type,\n    });\n\n    // Underlying data buffer needs no filtering\n    minFilter = NearestFilter;\n    magFilter = NearestFilter;\n    type = FloatType;\n\n    // Fetch geometry dimensions\n    const dims = this.bind.source.getDimensions();\n    const { items, width, height, depth } = dims;\n\n    // Create voxel buffer for text atlas coords\n    this.buffer = this._renderables.make(\"voxelBuffer\", {\n      width,\n      height,\n      depth,\n      channels: 4,\n      items,\n      minFilter,\n      magFilter,\n      type,\n    });\n\n    // Hook buffer emitter to map atlas text\n    const { atlas } = this;\n    const { emit } = this.buffer.streamer;\n    this.buffer.streamer.emit = (t) => atlas.map(t, emit);\n\n    // Grab parent clock\n    this.clockParent = this._inherit(\"clock\");\n    return this._listen(\"root\", \"root.update\", this.update);\n  }\n\n  made() {\n    super.made();\n    return this.resize();\n  }\n\n  unmake() {\n    super.unmake();\n    if (this.buffer) {\n      this.buffer.dispose();\n      this.buffer = null;\n    }\n\n    if (this.atlas) {\n      this.atlas.dispose();\n      return (this.atlas = null);\n    }\n  }\n\n  update() {\n    if ((this.filled && !this.props.live) || !this.through) {\n      return;\n    }\n\n    this.time = this.clockParent.getTime();\n\n    const { used } = this;\n\n    this.atlas.begin();\n    this.used = this.through();\n    this.buffer.write(this.used);\n    this.atlas.end();\n\n    this.filled = true;\n\n    if (used !== this.used) {\n      return this.trigger({\n        type: \"source.resize\",\n      });\n    }\n  }\n\n  change(changed, touched, init) {\n    if (touched[\"font\"]) {\n      return this.rebuild();\n    }\n\n    if (\n      changed[\"format.expr\"] ||\n      changed[\"format.digits\"] ||\n      changed[\"format.data\"] ||\n      init\n    ) {\n      let map;\n      let { expr } = this.props;\n      const { digits, data } = this.props;\n\n      if (expr == null) {\n        if (data != null) {\n          expr = (x, y, z, w, i) => data[i];\n        } else {\n          expr = (x) => x;\n        }\n      }\n\n      const { length } = expr;\n\n      if (digits != null) {\n        expr = (\n          (expr) => (x, y, z, w, i, j, k, l, t, d) =>\n            +expr(x, y, z, w, i, j, k, l, t, d).toPrecision(digits)\n        )(expr);\n      }\n\n      // Stream raw source data and format it with expression\n      if (length > 8) {\n        map = (emit, x, y, z, w, i, j, k, l, _t, _d) => {\n          return emit(\n            expr(x, y, z, w, i, j, k, l, this.time.clock, this.time.step)\n          );\n        };\n      } else {\n        map = (emit, x, y, z, w, i, j, k, l) => {\n          return emit(expr(x, y, z, w, i, j, k, l));\n        };\n      }\n\n      return (this.through = this.bind.source\n        .rawBuffer()\n        .through(map, this.buffer));\n    }\n  }\n}\nFormat.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UJS from \"../../../util/js.js\";\n\nimport { Primitive } from \"../../primitive.js\";\n\nexport class Label extends Primitive {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"bind\",\n      \"object\",\n      \"visible\",\n      \"style\",\n      \"label\",\n      \"attach\",\n      \"geometry\",\n      \"position\",\n    ];\n  }\n\n  make() {\n    let color;\n    super.make();\n\n    // Bind to attached objects\n    this._helpers.bind.make([\n      { to: \"label.text\", trait: \"text\" },\n      { to: \"geometry.points\", trait: \"source\" },\n      { to: \"geometry.colors\", trait: \"source\" },\n    ]);\n\n    if (this.bind.points == null) {\n      return;\n    }\n    if (this.bind.text == null) {\n      return;\n    }\n\n    // Fetch geometry/text dimensions\n    const pointDims = this.bind.points.getDimensions();\n    const textDims = this.bind.text.getDimensions();\n    const textIsSDF = this.bind.text.textIsSDF();\n\n    const items = Math.min(pointDims.items, textDims.items);\n    const width = Math.min(pointDims.width, textDims.width);\n    const height = Math.min(pointDims.height, textDims.height);\n    const depth = Math.min(pointDims.depth, textDims.depth);\n\n    // Build shader to sample position data\n    // and transform into screen space\n    let position = this.bind.points.sourceShader(this._shaders.shader());\n    position = this._helpers.position.pipeline(position);\n\n    // Build shader to sample text geometry data\n    const sprite = this.bind.text.sourceShader(this._shaders.shader());\n\n    // Build shader to sample text image data\n    const map = this._shaders.shader().pipe(\"label.map\");\n    map.pipe(this.bind.text.textShader(this._shaders.shader()));\n\n    // Build shader to resolve text data\n    const labelUniforms = {\n      spriteDepth: this.node.attributes[\"attach.depth\"],\n      spriteOffset: this.node.attributes[\"attach.offset\"],\n      spriteSnap: this.node.attributes[\"attach.snap\"],\n      spriteScale: this._attributes.make(this._types.number()),\n      outlineStep: this._attributes.make(this._types.number()),\n      outlineExpand: this._attributes.make(this._types.number()),\n      outlineColor: this.node.attributes[\"label.background\"],\n    };\n\n    this.spriteScale = labelUniforms.spriteScale;\n    this.outlineStep = labelUniforms.outlineStep;\n    this.outlineExpand = labelUniforms.outlineExpand;\n\n    const snippet = textIsSDF ? \"label.outline\" : \"label.alpha\";\n    const combine = this._shaders.shader().pipe(snippet, labelUniforms);\n\n    // Build color lookup\n    if (this.bind.colors) {\n      color = this._shaders.shader();\n      this.bind.colors.sourceShader(color);\n    }\n\n    // Build transition mask lookup\n    const mask = this._helpers.object.mask();\n\n    // Prepare bound uniforms\n    const styleUniforms = this._helpers.style.uniforms();\n    const unitUniforms = this._inherit(\"unit\").getUnitUniforms();\n\n    // Make sprite renderable\n    const uniforms = UJS.merge(unitUniforms, styleUniforms, labelUniforms);\n    this.sprite = this._renderables.make(\"sprite\", {\n      uniforms,\n      width,\n      height,\n      depth,\n      items,\n      position,\n      sprite,\n      map,\n      combine,\n      color,\n      mask,\n      linear: true,\n    });\n\n    this._helpers.visible.make();\n    return this._helpers.object.make([this.sprite]);\n  }\n\n  unmake() {\n    this._helpers.bind.unmake();\n    this._helpers.visible.unmake();\n    this._helpers.object.unmake();\n\n    return (this.sprite = null);\n  }\n\n  resize() {\n    // Fetch geometry/text dimensions\n    const pointDims = this.bind.points.getActiveDimensions();\n    const textDims = this.bind.text.getActiveDimensions();\n\n    const items = Math.min(pointDims.items, textDims.items);\n    const width = Math.min(pointDims.width, textDims.width);\n    const height = Math.min(pointDims.height, textDims.height);\n    const depth = Math.min(pointDims.depth, textDims.depth);\n\n    return this.sprite.geometry.clip(width, height, depth, items);\n  }\n\n  change(changed, touched, _init) {\n    if (touched[\"geometry\"] || changed[\"label.text\"]) {\n      return this.rebuild();\n    }\n    if (this.bind.points == null) {\n      return;\n    }\n\n    const { size } = this.props;\n    const { outline } = this.props;\n    const { expand } = this.props;\n    const height = this.bind.text.textHeight();\n    const scale = size / height;\n\n    this.outlineExpand.value = ((expand / scale) * 16) / 255;\n    this.outlineStep.value = ((outline / scale) * 16) / 255;\n    return (this.spriteScale.value = scale);\n  }\n}\nLabel.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UGLSL from \"../../../util/glsl.js\";\nimport { Operator } from \"./operator.js\";\n\nexport class Resample extends Operator {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"bind\",\n      \"operator\",\n      \"source\",\n      \"index\",\n      \"resample\",\n      \"sampler:x\",\n      \"sampler:y\",\n      \"sampler:z\",\n      \"sampler:w\",\n      \"include\",\n    ];\n  }\n\n  indexShader(shader) {\n    shader.pipe(this.indexer);\n    return super.indexShader(shader);\n  }\n\n  sourceShader(shader) {\n    return shader.pipe(this.operator);\n  }\n\n  getDimensions() {\n    return this._resample(this.bind.source.getDimensions());\n  }\n  getActiveDimensions() {\n    return this._resample(this.bind.source.getActiveDimensions());\n  }\n  getFutureDimensions() {\n    return this._resample(this.bind.source.getFutureDimensions());\n  }\n  getIndexDimensions() {\n    return this._resample(this.bind.source.getIndexDimensions());\n  }\n\n  _resample(dims) {\n    const r = this.resampled;\n    const c = this.centered;\n    const p = this.padding;\n\n    if (this.relativeSize) {\n      if (!c.items) {\n        dims.items--;\n      }\n      if (!c.width) {\n        dims.width--;\n      }\n      if (!c.height) {\n        dims.height--;\n      }\n      if (!c.depth) {\n        dims.depth--;\n      }\n\n      if (r.items != null) {\n        dims.items *= r.items;\n      }\n      if (r.width != null) {\n        dims.width *= r.width;\n      }\n      if (r.height != null) {\n        dims.height *= r.height;\n      }\n      if (r.depth != null) {\n        dims.depth *= r.depth;\n      }\n\n      if (!c.items) {\n        dims.items++;\n      }\n      if (!c.width) {\n        dims.width++;\n      }\n      if (!c.height) {\n        dims.height++;\n      }\n      if (!c.depth) {\n        dims.depth++;\n      }\n\n      dims.items -= p.items * 2;\n      dims.width -= p.width * 2;\n      dims.height -= p.height * 2;\n      dims.depth -= p.depth * 2;\n    } else {\n      if (r.items != null) {\n        dims.items = r.items;\n      }\n      if (r.width != null) {\n        dims.width = r.width;\n      }\n      if (r.height != null) {\n        dims.height = r.height;\n      }\n      if (r.depth != null) {\n        dims.depth = r.depth;\n      }\n    }\n\n    dims.items = Math.max(0, Math.floor(dims.items));\n    dims.width = Math.max(0, Math.floor(dims.width));\n    dims.height = Math.max(0, Math.floor(dims.height));\n    dims.depth = Math.max(0, Math.floor(dims.depth));\n\n    return dims;\n  }\n\n  make() {\n    super.make();\n    if (this.bind.source == null) {\n      return;\n    }\n\n    // Bind to attached shader\n    this._helpers.bind.make([\n      { to: \"include.shader\", trait: \"shader\", optional: true },\n    ]);\n\n    // Get custom shader\n    const { indices, channels } = this.props;\n    const { shader } = this.bind;\n\n    // Get resampled dimensions (if any)\n    const { sample, size, items, width, height, depth } = this.props;\n\n    // Sampler behavior\n    const relativeSample =\n      sample === this.node.attributes[\"resample.sample\"].enum.relative;\n    const relativeSize =\n      size === this.node.attributes[\"resample.size\"].enum.relative;\n\n    this.resampled = {};\n    if (items != null) {\n      this.resampled.items = items;\n    }\n    if (width != null) {\n      this.resampled.width = width;\n    }\n    if (height != null) {\n      this.resampled.height = height;\n    }\n    if (depth != null) {\n      this.resampled.depth = depth;\n    }\n\n    this.centered = {};\n    this.centered.items = this.props.centeredW;\n    this.centered.width = this.props.centeredX;\n    this.centered.height = this.props.centeredY;\n    this.centered.depth = this.props.centeredZ;\n\n    this.padding = {};\n    this.padding.items = this.props.paddingW;\n    this.padding.width = this.props.paddingX;\n    this.padding.height = this.props.paddingY;\n    this.padding.depth = this.props.paddingZ;\n\n    // Build shader to resample data\n    const operator = this._shaders.shader();\n    const indexer = this._shaders.shader();\n\n    // Uniforms\n    const type = [\n      null,\n      this._types.number,\n      this._types.vec2,\n      this._types.vec3,\n      this._types.vec4,\n    ][indices];\n    const uniforms = {\n      dataSize: this._attributes.make(type(0, 0, 0, 0)),\n      dataResolution: this._attributes.make(type(0, 0, 0, 0)),\n\n      targetSize: this._attributes.make(type(0, 0, 0, 0)),\n      targetResolution: this._attributes.make(type(0, 0, 0, 0)),\n\n      resampleFactor: this._attributes.make(this._types.vec4(0, 0, 0, 0)),\n      resampleBias: this._attributes.make(this._types.vec4(0, 0, 0, 0)),\n    };\n\n    this.dataResolution = uniforms.dataResolution;\n    this.dataSize = uniforms.dataSize;\n    this.targetResolution = uniforms.targetResolution;\n    this.targetSize = uniforms.targetSize;\n    this.resampleFactor = uniforms.resampleFactor;\n    this.resampleBias = uniforms.resampleBias;\n\n    // Has resize props?\n    const resize =\n      items != null || width != null || height != null || depth != null;\n\n    // Add padding\n    operator.pipe(\"resample.padding\", uniforms);\n\n    // Add centered sampling offset\n    let vec = [];\n    let any = false;\n    const iterable = [\"width\", \"height\", \"depth\", \"items\"];\n    for (let i = 0; i < iterable.length; i++) {\n      const key = iterable[i];\n      const centered = this.centered[key];\n      if (!any) {\n        any = centered;\n      }\n      vec[i] = centered ? \"0.5\" : \"0.0\";\n    }\n\n    if (any) {\n      vec = `vec4(${vec})`;\n      // TODO is this right? seems like copy paste.\n      operator.pipe(UGLSL.binaryOperator(4, \"+\", vec));\n      if (resize) {\n        indexer.pipe(UGLSL.binaryOperator(4, \"+\", vec));\n      }\n    }\n\n    if (relativeSample) {\n      // Addressing relative to target\n      if (resize) {\n        operator.pipe(\"resample.relative\", uniforms);\n        indexer.pipe(\"resample.relative\", uniforms);\n      } else {\n        indexer.pipe(UGLSL.identity(\"vec4\"));\n      }\n    }\n\n    if (shader != null) {\n      if (indices !== 4) {\n        operator.pipe(UGLSL.truncateVec(4, indices));\n      }\n\n      operator.callback();\n      if (indices !== 4) {\n        operator.pipe(UGLSL.extendVec(indices, 4));\n      }\n      if (any) {\n        operator.pipe(UGLSL.binaryOperator(4, \"-\", vec));\n      }\n      operator.pipe(this.bind.source.sourceShader(this._shaders.shader()));\n      if (channels !== 4) {\n        operator.pipe(UGLSL.truncateVec(4, channels));\n      }\n      operator.join();\n\n      if (this.bind.shader != null) {\n        operator.pipe(this.bind.shader.shaderBind(uniforms));\n      }\n\n      if (channels !== 4) {\n        operator.pipe(UGLSL.extendVec(channels, 4));\n      }\n    } else {\n      if (any) {\n        operator.pipe(UGLSL.binaryOperator(4, \"-\", vec));\n      }\n      operator.pipe(this.bind.source.sourceShader(this._shaders.shader()));\n    }\n\n    if (any && resize) {\n      indexer.pipe(UGLSL.binaryOperator(4, \"-\", vec));\n    }\n\n    this.operator = operator;\n    this.indexer = indexer;\n    this.indices = indices;\n\n    this.relativeSample = relativeSample;\n    return (this.relativeSize = relativeSize);\n  }\n\n  unmake() {\n    super.unmake();\n    return (this.operator = null);\n  }\n\n  resize() {\n    if (this.bind.source == null) {\n      return;\n    }\n\n    const dims = this.bind.source.getActiveDimensions();\n    const target = this.getActiveDimensions();\n\n    const axis = (key) => {\n      const centered = this.centered[key];\n      const pad = this.padding[key];\n\n      target[key] += pad * 2;\n\n      const res = centered\n        ? dims[key] / Math.max(1, target[key])\n        : Math.max(1, dims[key] - 1) / Math.max(1, target[key] - 1);\n      return [res, pad];\n    };\n\n    const [rw, bw] = Array.from(axis(\"width\"));\n    const [rh, bh] = Array.from(axis(\"height\"));\n    const [rd, bd] = Array.from(axis(\"depth\"));\n    const [ri, bi] = Array.from(axis(\"items\"));\n\n    if (this.indices === 1) {\n      this.dataResolution.value = 1 / dims.width;\n      this.targetResolution.value = 1 / target.width;\n\n      this.dataSize.value = dims.width;\n      this.targetSize.value = target.width;\n    } else {\n      this.dataResolution.value.set(\n        1 / dims.width,\n        1 / dims.height,\n        1 / dims.depth,\n        1 / dims.items\n      );\n      this.targetResolution.value.set(\n        1 / target.width,\n        1 / target.height,\n        1 / target.depth,\n        1 / target.items\n      );\n\n      this.dataSize.value.set(dims.width, dims.height, dims.depth, dims.items);\n      this.targetSize.value.set(\n        target.width,\n        target.height,\n        target.depth,\n        target.items\n      );\n    }\n\n    this.resampleFactor.value.set(rw, rh, rd, ri);\n    this.resampleBias.value.set(bw, bh, bd, bi);\n\n    return super.resize();\n  }\n\n  change(changed, touched, _init) {\n    if (\n      touched[\"operator\"] ||\n      touched[\"resample\"] ||\n      touched[\"sampler\"] ||\n      touched[\"include\"]\n    ) {\n      return this.rebuild();\n    }\n  }\n}\nResample.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Resample } from \"../operator/resample.js\";\n\nexport class Retext extends Resample {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"bind\",\n      \"operator\",\n      \"resample\",\n      \"sampler:x\",\n      \"sampler:y\",\n      \"sampler:z\",\n      \"sampler:w\",\n      \"include\",\n      \"text\",\n    ];\n  }\n\n  init() {\n    return (this.sourceSpec = [{ to: \"operator.source\", trait: \"text\" }]);\n  }\n\n  textShader(shader) {\n    return this.bind.source.textShader(shader);\n  }\n\n  textIsSDF() {\n    return (\n      (this.bind.source != null ? this.bind.source.props.sdf : undefined) > 0\n    );\n  }\n  textHeight() {\n    return this.bind.source != null ? this.bind.source.props.detail : undefined;\n  }\n}\nRetext.initClass();\n","export * from \"./text.js\";\nexport * from \"./format.js\";\nexport * from \"./label.js\";\nexport * from \"./retext.js\";\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Parent } from \"../base/parent.js\";\n\nexport class Clock extends Parent {\n  static initClass() {\n    this.traits = [\"node\", \"clock\", \"seek\", \"play\"];\n  }\n\n  init() {\n    this.skew = 0;\n    this.last = 0;\n    return (this.time = {\n      now: +new Date() / 1000,\n      time: 0,\n      delta: 0,\n      clock: 0,\n      step: 0,\n    });\n  }\n\n  make() {\n    // Listen to parent clock\n    return this._listen(\"clock\", \"clock.tick\", this.tick);\n  }\n\n  reset() {\n    return (this.skew = 0);\n  }\n\n  tick(e) {\n    const { from, to, speed, seek, pace, delay, realtime } = this.props;\n\n    const parent = this._inherit(\"clock\").getTime();\n\n    const time = realtime ? parent.time : parent.clock;\n    const delta = realtime ? parent.delta : parent.step;\n    const ratio = speed / pace;\n\n    this.skew += delta * (ratio - 1);\n    if (this.last > time) {\n      this.skew = 0;\n    }\n\n    this.time.now = parent.now + this.skew;\n\n    this.time.time = parent.time;\n    this.time.delta = parent.delta;\n\n    const clock = seek != null ? seek : parent.clock + this.skew;\n    this.time.clock = Math.min(to, from + Math.max(0, clock - delay * ratio));\n    this.time.step = delta * ratio;\n\n    this.last = time;\n\n    return this.trigger(e);\n  }\n\n  getTime() {\n    return this.time;\n  }\n}\nClock.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Parent } from \"../base/parent.js\";\n\nexport class Now extends Parent {\n  static initClass() {\n    this.traits = [\"node\", \"clock\", \"now\"];\n  }\n\n  init() {\n    let now;\n    this.now = now = +new Date() / 1000;\n    this.skew = 0;\n    return (this.time = {\n      now,\n      time: 0,\n      delta: 0,\n      clock: 0,\n      step: 0,\n    });\n  }\n\n  make() {\n    // Listen to parent clock\n    this.clockParent = this._inherit(\"clock\");\n    return this._listen(\"clock\", \"clock.tick\", this.tick);\n  }\n\n  unmake() {\n    return (this.clockParent = null);\n  }\n\n  change(changed, _touched, _init) {\n    if (changed[\"date.now\"]) {\n      return (this.skew = 0);\n    }\n  }\n\n  tick(e) {\n    const { seek, pace, speed } = this.props;\n\n    const parent = this.clockParent.getTime();\n\n    this.skew += (parent.step * pace) / speed;\n    if (seek != null) {\n      this.skew = seek;\n    }\n\n    this.time.now =\n      this.time.time =\n      this.time.clock =\n        (this.props.now != null ? this.props.now : this.now) + this.skew;\n    this.time.delta = this.time.step = parent.delta;\n\n    return this.trigger(e);\n  }\n\n  getTime() {\n    return this.time;\n  }\n}\nNow.initClass();\n","export * from \"./clock.js\";\nexport * from \"./now.js\";\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining\n * DS104: Avoid inline assignments\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Parent } from \"../base/parent.js\";\n\nexport class Transform extends Parent {\n  static initClass() {\n    this.traits = [\"node\", \"vertex\", \"fragment\"];\n  }\n\n  vertex(shader, pass) {\n    let left;\n    return (left = __guard__(this._inherit(\"vertex\"), (x) =>\n      x.vertex(shader, pass)\n    )) != null\n      ? left\n      : shader;\n  }\n\n  fragment(shader, pass) {\n    let left;\n    return (left = __guard__(this._inherit(\"fragment\"), (x) =>\n      x.fragment(shader, pass)\n    )) != null\n      ? left\n      : shader;\n  }\n}\nTransform.initClass();\n\nfunction __guard__(value, xform) {\n  return typeof value !== \"undefined\" && value !== null\n    ? xform(value)\n    : undefined;\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UThree from \"../../../util/three.js\";\nimport { Transform } from \"./transform.js\";\n\nexport class Transform3 extends Transform {\n  static initClass() {\n    this.traits = [\"node\", \"vertex\", \"transform3\"];\n  }\n\n  make() {\n    this.uniforms = {\n      transformMatrix: this._attributes.make(this._types.mat4()),\n    };\n\n    return (this.composer = UThree.transformComposer());\n  }\n\n  unmake() {\n    return delete this.uniforms;\n  }\n\n  change(changed, touched, init) {\n    if (changed[\"transform3.pass\"]) {\n      return this.rebuild();\n    }\n    if (!touched[\"transform3\"] && !init) {\n      return;\n    }\n\n    const p = this.props.position;\n    const q = this.props.quaternion;\n    const r = this.props.rotation;\n    const s = this.props.scale;\n    const m = this.props.matrix;\n    const e = this.props.eulerOrder;\n\n    return (this.uniforms.transformMatrix.value = this.composer(\n      p,\n      r,\n      q,\n      s,\n      m,\n      e\n    ));\n  }\n\n  vertex(shader, pass) {\n    if (pass === this.props.pass) {\n      shader.pipe(\"transform3.position\", this.uniforms);\n    }\n    return super.vertex(shader, pass);\n  }\n}\nTransform3.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Transform } from \"./transform.js\";\n\nexport class Transform4 extends Transform {\n  static initClass() {\n    this.traits = [\"node\", \"vertex\", \"transform4\"];\n  }\n\n  make() {\n    this.uniforms = {\n      transformMatrix: this._attributes.make(this._types.mat4()),\n      transformOffset: this.node.attributes[\"transform4.position\"],\n    };\n\n    return (this.transformMatrix = this.uniforms.transformMatrix.value);\n  }\n\n  unmake() {\n    return delete this.uniforms;\n  }\n\n  change(changed, touched, init) {\n    if (changed[\"transform4.pass\"]) {\n      return this.rebuild();\n    }\n    if (!touched[\"transform4\"] && !init) {\n      return;\n    }\n\n    const s = this.props.scale;\n    const m = this.props.matrix;\n\n    const t = this.transformMatrix;\n    t.copy(m);\n    return t.scale(s);\n  }\n\n  vertex(shader, pass) {\n    if (pass === this.props.pass) {\n      shader.pipe(\"transform4.position\", this.uniforms);\n    }\n    return super.vertex(shader, pass);\n  }\n}\nTransform4.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Transform } from \"./transform.js\";\n\nexport class Vertex extends Transform {\n  static initClass() {\n    this.traits = [\"node\", \"include\", \"vertex\", \"bind\"];\n  }\n\n  make() {\n    // Bind to attached shader\n    return this._helpers.bind.make([\n      { to: \"include.shader\", trait: \"shader\", optional: true },\n    ]);\n  }\n\n  unmake() {\n    return this._helpers.bind.unmake();\n  }\n\n  change(changed, touched, _init) {\n    if (touched[\"include\"]) {\n      return this.rebuild();\n    }\n  }\n\n  vertex(shader, pass) {\n    if (this.bind.shader != null) {\n      if (pass === this.props.pass) {\n        shader.pipe(this.bind.shader.shaderBind());\n      }\n    }\n    return super.vertex(shader, pass);\n  }\n}\nVertex.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Transform } from \"./transform.js\";\n\nexport class Fragment extends Transform {\n  static initClass() {\n    this.traits = [\"node\", \"include\", \"fragment\", \"bind\"];\n  }\n\n  make() {\n    // Bind to attached shader\n    return this._helpers.bind.make([\n      { to: \"include.shader\", trait: \"shader\", optional: true },\n    ]);\n  }\n\n  unmake() {\n    return this._helpers.bind.unmake();\n  }\n\n  change(changed, touched, _init) {\n    if (touched[\"include\"] || changed[\"fragment.gamma\"]) {\n      return this.rebuild();\n    }\n  }\n\n  fragment(shader, pass) {\n    if (this.bind.shader != null) {\n      if (pass === this.props.pass) {\n        if (this.props.gamma) {\n          shader.pipe(\"mesh.gamma.out\");\n        }\n        shader.pipe(this.bind.shader.shaderBind());\n        shader.split();\n        if (this.props.gamma) {\n          shader.pipe(\"mesh.gamma.in\");\n        }\n        shader.pass();\n      }\n    }\n    return super.fragment(shader, pass);\n  }\n}\nFragment.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Transform } from \"./transform.js\";\n\nexport class Layer extends Transform {\n  static initClass() {\n    this.traits = [\"node\", \"vertex\", \"layer\"];\n  }\n\n  make() {\n    this._listen(\"root\", \"root.resize\", this.update);\n\n    return (this.uniforms = {\n      layerScale: this._attributes.make(this._types.vec4()),\n      layerBias: this._attributes.make(this._types.vec4()),\n    });\n  }\n\n  update() {\n    const camera = this._inherit(\"root\").getCamera();\n\n    const aspect = camera.aspect != null ? camera.aspect : 1;\n    const fov = camera.fov != null ? camera.fov : 1;\n\n    const pitch = Math.tan((fov * Math.PI) / 360);\n\n    const _enum = this.node.attributes[\"layer.fit\"].enum;\n\n    let { fit } = this.props;\n    const { depth } = this.props;\n\n    // Convert contain/cover into x/y\n    switch (fit) {\n      case _enum.contain:\n        fit = aspect > 1 ? _enum.y : _enum.x;\n        break;\n      case _enum.cover:\n        fit = aspect > 1 ? _enum.x : _enum.y;\n        break;\n    }\n\n    // Fit x/y\n    switch (fit) {\n      case _enum.x:\n        this.uniforms.layerScale.value.set(pitch * aspect, pitch * aspect);\n        break;\n      case _enum.y:\n        this.uniforms.layerScale.value.set(pitch, pitch);\n        break;\n    }\n\n    return this.uniforms.layerBias.value.set(0, 0, -depth, 0);\n  }\n\n  change(changed, touched, init) {\n    if (changed[\"layer.fit\"] || changed[\"layer.depth\"] || init) {\n      return this.update();\n    }\n  }\n\n  // End transform chain here without applying camera view\n  vertex(shader, pass) {\n    if (pass === 2) {\n      return shader.pipe(\"layer.position\", this.uniforms);\n    }\n    if (pass === 3) {\n      return shader.pipe(\"root.position\");\n    }\n    return shader;\n  }\n}\nLayer.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining\n * DS104: Avoid inline assignments\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UGLSL from \"../../../util/glsl.js\";\nimport { Parent } from \"../base/parent.js\";\n\nexport class Mask extends Parent {\n  static initClass() {\n    this.traits = [\"node\", \"include\", \"mask\", \"bind\"];\n  }\n\n  make() {\n    // Bind to attached shader\n    return this._helpers.bind.make([\n      { to: \"include.shader\", trait: \"shader\", optional: true },\n    ]);\n  }\n\n  unmake() {\n    return this._helpers.bind.unmake();\n  }\n\n  change(changed, touched, _init) {\n    if (touched[\"include\"]) {\n      return this.rebuild();\n    }\n  }\n\n  mask(shader) {\n    let left, s;\n    if (this.bind.shader != null) {\n      if (shader) {\n        s = this._shaders.shader();\n        s.pipe(UGLSL.identity(\"vec4\"));\n        s.fan();\n        s.pipe(shader);\n        s.next();\n        s.pipe(this.bind.shader.shaderBind());\n        s.end();\n        s.pipe(\"float combine(float a, float b) { return min(a, b); }\");\n      } else {\n        s = this._shaders.shader();\n        s.pipe(this.bind.shader.shaderBind());\n      }\n    } else {\n      s = shader;\n    }\n\n    return (left = __guard__(this._inherit(\"mask\"), (x) => x.mask(s))) != null\n      ? left\n      : s;\n  }\n}\nMask.initClass();\n\nfunction __guard__(value, transform) {\n  return typeof value !== \"undefined\" && value !== null\n    ? transform(value)\n    : undefined;\n}\n","export * from \"./transform.js\";\nexport * from \"./transform3.js\";\nexport * from \"./transform4.js\";\nexport * from \"./vertex.js\";\nexport * from \"./fragment.js\";\nexport * from \"./layer.js\";\nexport * from \"./mask.js\";\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Operator } from \"./operator.js\";\n\nexport class Clamp extends Operator {\n  static initClass() {\n    this.traits = [\"node\", \"bind\", \"operator\", \"source\", \"index\", \"clamp\"];\n  }\n\n  indexShader(shader) {\n    shader.pipe(this.operator);\n    return super.indexShader(shader);\n  }\n\n  sourceShader(shader) {\n    shader.pipe(this.operator);\n    return super.sourceShader(shader);\n  }\n\n  make() {\n    super.make();\n    if (this.bind.source == null) {\n      return;\n    }\n\n    // Max index on all 4 dimensions\n    const uniforms = { clampLimit: this._attributes.make(this._types.vec4()) };\n    this.clampLimit = uniforms.clampLimit;\n\n    // Build shader to clamp along all dimensions\n    const transform = this._shaders.shader();\n    transform.pipe(\"clamp.position\", uniforms);\n    return (this.operator = transform);\n  }\n\n  unmake() {\n    return super.unmake();\n  }\n\n  resize() {\n    if (this.bind.source != null) {\n      const dims = this.bind.source.getActiveDimensions();\n      this.clampLimit.value.set(\n        dims.width - 1,\n        dims.height - 1,\n        dims.depth - 1,\n        dims.items - 1\n      );\n    }\n\n    return super.resize();\n  }\n\n  change(changed, touched, _init) {\n    if (touched[\"operator\"] || touched[\"clamp\"]) {\n      return this.rebuild();\n    }\n  }\n}\nClamp.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Operator } from \"./operator.js\";\n\nexport class Grow extends Operator {\n  static initClass() {\n    this.traits = [\"node\", \"bind\", \"operator\", \"source\", \"index\", \"grow\"];\n  }\n\n  sourceShader(shader) {\n    return shader.pipe(this.operator);\n  }\n\n  make() {\n    super.make();\n    if (this.bind.source == null) {\n      return;\n    }\n\n    // Uniforms\n    const uniforms = {\n      growScale: this.node.attributes[\"grow.scale\"],\n      growMask: this._attributes.make(this._types.vec4()),\n      growAnchor: this._attributes.make(this._types.vec4()),\n    };\n\n    this.growMask = uniforms.growMask.value;\n    this.growAnchor = uniforms.growAnchor.value;\n\n    // Build shader to spread data on one dimension\n    const transform = this._shaders.shader();\n    transform.require(this.bind.source.sourceShader(this._shaders.shader()));\n    transform.pipe(\"grow.position\", uniforms);\n\n    return (this.operator = transform);\n  }\n\n  unmake() {\n    return super.unmake();\n  }\n\n  resize() {\n    this.update();\n    return super.resize();\n  }\n\n  update() {\n    // Size to fit to include future history\n    const dims = this.bind.source.getFutureDimensions();\n\n    const order = [\"width\", \"height\", \"depth\", \"items\"];\n\n    const m = (d, anchor) => ((d || 1) - 1) * (0.5 - anchor * 0.5);\n\n    return (() => {\n      const result = [];\n      for (let i = 0; i < order.length; i++) {\n        const key = order[i];\n        const anchor = this.props[key];\n\n        this.growMask.setComponent(i, +(anchor == null));\n        result.push(\n          this.growAnchor.setComponent(\n            i,\n            anchor != null ? m(dims[key], anchor) : 0\n          )\n        );\n      }\n      return result;\n    })();\n  }\n\n  change(changed, touched, _init) {\n    if (touched[\"operator\"]) {\n      return this.rebuild();\n    }\n\n    if (touched[\"grow\"]) {\n      return this.update();\n    }\n  }\n}\nGrow.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UGLSL from \"../../../util/glsl.js\";\nimport { Operator } from \"./operator.js\";\n\n/*\nsplit:\n  order:       Types.transpose('wxyz')\n  axis:        Types.axis()\n  overlap:     Types.int(0)\n*/\n\nexport class Join extends Operator {\n  static initClass() {\n    this.traits = [\"node\", \"bind\", \"operator\", \"source\", \"index\", \"join\"];\n  }\n\n  indexShader(shader) {\n    shader.pipe(this.operator);\n    return super.indexShader(shader);\n  }\n\n  sourceShader(shader) {\n    shader.pipe(this.operator);\n    return super.sourceShader(shader);\n  }\n\n  getDimensions() {\n    return this._resample(this.bind.source.getDimensions());\n  }\n  getActiveDimensions() {\n    return this._resample(this.bind.source.getActiveDimensions());\n  }\n  getFutureDimensions() {\n    return this._resample(this.bind.source.getFutureDimensions());\n  }\n  getIndexDimensions() {\n    return this._resample(this.bind.source.getIndexDimensions());\n  }\n\n  _resample(dims) {\n    let left;\n    let dim;\n    const { order, axis, stride } = this;\n\n    const labels = [\"width\", \"height\", \"depth\", \"items\"];\n    const mapped = order.map((x) => labels[x - 1]);\n    const index = order.indexOf(axis);\n    let set = (() => {\n      const result = [];\n      for (dim of Array.from(mapped)) {\n        result.push(dims[dim]);\n      }\n      return result;\n    })();\n    const product = ((left = set[index + 1]) != null ? left : 1) * stride;\n\n    set.splice(index, 2, product);\n    set = set.slice(0, 3);\n    set.push(1);\n\n    const out = {};\n    for (let i = 0; i < mapped.length; i++) {\n      dim = mapped[i];\n      out[dim] = set[i];\n    }\n\n    //console.log 'join', order, axis, length, stride\n    //console.log dims, out\n\n    return out;\n  }\n\n  make() {\n    super.make();\n    if (this.bind.source == null) {\n      return;\n    }\n\n    const { order } = this.props;\n    let { axis } = this.props;\n    let { overlap } = this.props;\n\n    /*\n    Calculate index transform\n\n    order: wxyz\n    length: 3\n    overlap: 1\n\n    axis: w\n    index: 0\n    rest: 00xy\n\n    axis: x\n    index: 1\n    rest: w00y\n\n    axis: y\n    index: 2\n    rest: wx00\n\n    axis: z\n    index: 3\n    rest: wxy0\n\n    */\n\n    const permute = order.join(\"\");\n    if (axis == null) {\n      axis = order[0];\n    }\n    const index = permute.indexOf(axis);\n    const rest = permute.replace(axis, \"00\").substring(0, 4);\n\n    const labels = [null, \"width\", \"height\", \"depth\", \"items\"];\n    const major = labels[axis];\n\n    // Prepare uniforms\n    const dims = this.bind.source.getDimensions();\n    const length = dims[major];\n\n    overlap = Math.min(length - 1, overlap);\n    const stride = length - overlap;\n\n    const uniforms = {\n      joinStride: this._attributes.make(this._types.number(stride)),\n      joinStrideInv: this._attributes.make(this._types.number(1 / stride)),\n    };\n\n    // Build shader to split a dimension into two\n    const transform = this._shaders.shader();\n    transform.require(UGLSL.swizzleVec4(axis, 1));\n    transform.require(UGLSL.swizzleVec4(rest, 4));\n    transform.require(UGLSL.injectVec4([index, index + 1]));\n    transform.pipe(\"join.position\", uniforms);\n    transform.pipe(UGLSL.invertSwizzleVec4(order));\n\n    this.operator = transform;\n\n    this.order = order;\n    this.axis = axis;\n    this.overlap = overlap;\n    this.length = length;\n    return (this.stride = stride);\n  }\n\n  unmake() {\n    return super.unmake();\n  }\n\n  change(changed, touched, _init) {\n    if (touched[\"join\"] || touched[\"operator\"]) {\n      return this.rebuild();\n    }\n  }\n}\nJoin.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UGLSL from \"../../../util/glsl.js\";\nimport { Operator } from \"./operator.js\";\n\nexport class Lerp extends Operator {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"bind\",\n      \"operator\",\n      \"source\",\n      \"index\",\n      \"lerp\",\n      \"sampler:x\",\n      \"sampler:y\",\n      \"sampler:z\",\n      \"sampler:w\",\n    ];\n  }\n\n  indexShader(shader) {\n    shader.pipe(this.indexer);\n    return super.indexShader(shader);\n  }\n\n  sourceShader(shader) {\n    return shader.pipe(this.operator);\n  }\n\n  getDimensions() {\n    return this._resample(this.bind.source.getDimensions());\n  }\n  getActiveDimensions() {\n    return this._resample(this.bind.source.getActiveDimensions());\n  }\n  getFutureDimensions() {\n    return this._resample(this.bind.source.getFutureDimensions());\n  }\n  getIndexDimensions() {\n    return this._resample(this.bind.source.getIndexDimensions());\n  }\n\n  _resample(dims) {\n    const r = this.resampled;\n    const c = this.centered;\n    const p = this.padding;\n\n    if (this.relativeSize) {\n      if (!c.items) {\n        dims.items--;\n      }\n      if (!c.width) {\n        dims.width--;\n      }\n      if (!c.height) {\n        dims.height--;\n      }\n      if (!c.depth) {\n        dims.depth--;\n      }\n\n      if (r.items != null) {\n        dims.items *= r.items;\n      }\n      if (r.width != null) {\n        dims.width *= r.width;\n      }\n      if (r.height != null) {\n        dims.height *= r.height;\n      }\n      if (r.depth != null) {\n        dims.depth *= r.depth;\n      }\n\n      if (!c.items) {\n        dims.items++;\n      }\n      if (!c.width) {\n        dims.width++;\n      }\n      if (!c.height) {\n        dims.height++;\n      }\n      if (!c.depth) {\n        dims.depth++;\n      }\n\n      dims.items -= p.items * 2;\n      dims.width -= p.width * 2;\n      dims.height -= p.height * 2;\n      dims.depth -= p.depth * 2;\n    } else {\n      if (r.items != null) {\n        dims.items = r.items;\n      }\n      if (r.width != null) {\n        dims.width = r.width;\n      }\n      if (r.height != null) {\n        dims.height = r.height;\n      }\n      if (r.depth != null) {\n        dims.depth = r.depth;\n      }\n    }\n\n    dims.items = Math.max(0, Math.floor(dims.items));\n    dims.width = Math.max(0, Math.floor(dims.width));\n    dims.height = Math.max(0, Math.floor(dims.height));\n    dims.depth = Math.max(0, Math.floor(dims.depth));\n\n    return dims;\n  }\n\n  make() {\n    let i, key;\n    super.make();\n    if (this.bind.source == null) {\n      return;\n    }\n\n    // Get resampled dimensions\n    const { size, items, width, height, depth } = this.props;\n\n    // Sampler behavior\n    const relativeSize =\n      size === this.node.attributes[\"lerp.size\"].enum.relative;\n\n    this.resampled = {};\n    if (items != null) {\n      this.resampled.items = items;\n    }\n    if (width != null) {\n      this.resampled.width = width;\n    }\n    if (height != null) {\n      this.resampled.height = height;\n    }\n    if (depth != null) {\n      this.resampled.depth = depth;\n    }\n\n    this.centered = {};\n    this.centered.items = this.props.centeredW;\n    this.centered.width = this.props.centeredX;\n    this.centered.height = this.props.centeredY;\n    this.centered.depth = this.props.centeredZ;\n\n    this.padding = {};\n    this.padding.items = this.props.paddingW;\n    this.padding.width = this.props.paddingX;\n    this.padding.height = this.props.paddingY;\n    this.padding.depth = this.props.paddingZ;\n\n    // Build shader to resample data\n    const operator = this._shaders.shader();\n    const indexer = this._shaders.shader();\n\n    // Uniforms\n    const uniforms = {\n      resampleFactor: this._attributes.make(this._types.vec4(0, 0, 0, 0)),\n      resampleBias: this._attributes.make(this._types.vec4(0, 0, 0, 0)),\n    };\n\n    this.resampleFactor = uniforms.resampleFactor;\n    this.resampleBias = uniforms.resampleBias;\n\n    // Has resize props?\n    const resize =\n      items != null || width != null || height != null || depth != null;\n\n    // Add padding\n    operator.pipe(\"resample.padding\", uniforms);\n\n    // Prepare centered sampling offset\n    const vec = [];\n    let any = false;\n    const iterable = [\"width\", \"height\", \"depth\", \"items\"];\n    for (i = 0; i < iterable.length; i++) {\n      key = iterable[i];\n      const centered = this.centered[key];\n      if (!any) {\n        any = centered;\n      }\n      vec[i] = centered ? \"0.5\" : \"0.0\";\n    }\n\n    let vec4;\n\n    // Add centered sampling offset (from source)\n    if (any && resize) {\n      vec4 = `vec4(${vec})`;\n      operator.pipe(UGLSL.binaryOperator(4, \"+\", vec4));\n      indexer.pipe(UGLSL.binaryOperator(4, \"+\", vec4));\n    }\n\n    // Addressing relative to target\n    if (resize) {\n      operator.pipe(\"resample.relative\", uniforms);\n      indexer.pipe(\"resample.relative\", uniforms);\n    } else {\n      operator.pipe(UGLSL.identity(\"vec4\"));\n      indexer.pipe(UGLSL.identity(\"vec4\"));\n    }\n\n    // Remove centered sampling offset (to target)\n    if (any && resize) {\n      operator.pipe(UGLSL.binaryOperator(4, \"-\", vec4));\n      indexer.pipe(UGLSL.binaryOperator(4, \"-\", vec4));\n    }\n\n    // Make sampler\n    let sampler = this.bind.source.sourceShader(this._shaders.shader());\n\n    // Iterate over dimensions (items, width, height, depth)\n    const iterable1 = [\"width\", \"height\", \"depth\", \"items\"];\n    for (i = 0; i < iterable1.length; i++) {\n      key = iterable1[i];\n      const id = `lerp.${key}`;\n\n      if (this.props[key] != null) {\n        sampler = this._shaders.shader().require(sampler);\n        sampler.pipe(id, uniforms);\n      }\n    }\n\n    // Combine operator and composite lerp sampler\n    operator.pipe(sampler);\n\n    this.operator = operator;\n    this.indexer = indexer;\n\n    return (this.relativeSize = relativeSize);\n  }\n\n  unmake() {\n    super.unmake();\n    return (this.operator = null);\n  }\n\n  resize() {\n    if (this.bind.source == null) {\n      return;\n    }\n\n    const dims = this.bind.source.getActiveDimensions();\n    const target = this.getActiveDimensions();\n\n    const axis = (key) => {\n      const centered = this.centered[key];\n      const pad = this.padding[key];\n\n      target[key] += pad * 2;\n\n      const res = centered\n        ? dims[key] / Math.max(1, target[key])\n        : Math.max(1, dims[key] - 1) / Math.max(1, target[key] - 1);\n      return [res, pad];\n    };\n\n    const [rw, bw] = Array.from(axis(\"width\"));\n    const [rh, bh] = Array.from(axis(\"height\"));\n    const [rd, bd] = Array.from(axis(\"depth\"));\n    const [ri, bi] = Array.from(axis(\"items\"));\n\n    this.resampleFactor.value.set(rw, rh, rd, ri);\n    this.resampleBias.value.set(bw, bh, bd, bi);\n\n    return super.resize();\n  }\n\n  change(changed, touched, _init) {\n    if (touched[\"operator\"] || touched[\"lerp\"] || touched[\"sampler\"]) {\n      return this.rebuild();\n    }\n  }\n}\nLerp.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Operator } from \"./operator\";\n\nexport class Memo extends Operator {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"bind\",\n      \"active\",\n      \"operator\",\n      \"source\",\n      \"index\",\n      \"texture\",\n      \"memo\",\n    ];\n  }\n\n  sourceShader(shader) {\n    return this.memo.shaderAbsolute(shader, 1);\n  }\n\n  make() {\n    super.make();\n    if (this.bind.source == null) {\n      return;\n    }\n\n    // Listen for updates\n    this._helpers.active.make();\n    this._listen(\"root\", \"root.update\", () => {\n      if (this.isActive) {\n        return this.update();\n      }\n    });\n\n    // Read sampling parameters\n    const { minFilter, magFilter, type } = this.props;\n\n    // Fetch geometry dimensions\n    const dims = this.bind.source.getDimensions();\n    const { items, width, height, depth } = dims;\n\n    // Prepare memoization RTT\n    this.memo = this._renderables.make(\"memo\", {\n      items,\n      width,\n      height,\n      depth,\n      minFilter,\n      magFilter,\n      type,\n    });\n\n    // Build shader to remap data (do it after RTT creation to allow feedback)\n    const operator = this._shaders.shader();\n    this.bind.source.sourceShader(operator);\n\n    // Make screen renderable inside RTT scene\n    this.compose = this._renderables.make(\"memoScreen\", {\n      map: operator,\n      items,\n      width,\n      height,\n      depth,\n    });\n    this.memo.adopt(this.compose);\n\n    this.objects = [this.compose];\n    return (this.renders = this.compose.renders);\n  }\n\n  unmake() {\n    super.unmake();\n\n    if (this.bind.source != null) {\n      this._helpers.active.unmake();\n\n      this.memo.unadopt(this.compose);\n      this.memo.dispose();\n\n      return (this.memo = this.compose = null);\n    }\n  }\n\n  update() {\n    return this.memo != null ? this.memo.render() : undefined;\n  }\n\n  resize() {\n    if (this.bind.source == null) {\n      return;\n    }\n\n    // Fetch geometry dimensions\n    const dims = this.bind.source.getActiveDimensions();\n    const { width, height, depth } = dims;\n\n    // Cover only part of the RTT viewport\n    this.compose.cover(width, height, depth);\n\n    return super.resize();\n  }\n\n  change(changed, touched, _init) {\n    if (touched[\"texture\"] || touched[\"operator\"]) {\n      return this.rebuild();\n    }\n  }\n}\nMemo.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Primitive } from \"../../primitive.js\";\n\nexport class Readback extends Primitive {\n  static initClass() {\n    this.traits = [\"node\", \"bind\", \"operator\", \"readback\", \"entity\", \"active\"];\n    this.finals = { channels: 4 };\n  }\n\n  init() {\n    this.emitter = this.root = null;\n    return (this.active = {});\n  }\n\n  make() {\n    super.make();\n\n    this._compute(\"readback.data\", () =>\n      this.readback != null ? this.readback.data : undefined\n    );\n    this._compute(\"readback.items\", () =>\n      this.readback != null ? this.readback.items : undefined\n    );\n    this._compute(\"readback.width\", () =>\n      this.readback != null ? this.readback.width : undefined\n    );\n    this._compute(\"readback.height\", () =>\n      this.readback != null ? this.readback.height : undefined\n    );\n    this._compute(\"readback.depth\", () =>\n      this.readback != null ? this.readback.depth : undefined\n    );\n\n    // Bind to attached objects\n    this._helpers.bind.make([{ to: \"operator.source\", trait: \"source\" }]);\n\n    if (this.bind.source == null) {\n      return;\n    }\n\n    // Sampler props\n    const { type, channels, expr } = this.props;\n\n    // Listen for updates\n    this.root = this._inherit(\"root\");\n    this._listen(\"root\", \"root.update\", this.update);\n\n    // Fetch source dimensions\n    const { items, width, height, depth } = this.bind.source.getDimensions();\n\n    // Build shader to sample source data\n    const sampler = this.bind.source.sourceShader(this._shaders.shader());\n\n    // Prepare readback/memo RTT\n    this.readback = this._renderables.make(\"readback\", {\n      map: sampler,\n      items,\n      width,\n      height,\n      depth,\n      channels,\n      type,\n    });\n\n    // Prepare readback consumer\n    if (expr != null) {\n      this.readback.setCallback(expr);\n    }\n\n    this._helpers.active.make();\n  }\n\n  unmake() {\n    if (this.readback != null) {\n      this.readback.dispose();\n      this.readback = null;\n\n      this.root = null;\n      this.emitter = null;\n      this.active = {};\n    }\n\n    this._helpers.active.unmake();\n    return this._helpers.bind.unmake();\n  }\n\n  update() {\n    if (this.readback == null) {\n      return;\n    }\n    if (this.isActive) {\n      this.readback.update(\n        this.root != null ? this.root.getCamera() : undefined\n      );\n      this.readback.post();\n      if (this.props.expr != null) {\n        this.readback.iterate();\n      }\n    }\n  }\n\n  resize() {\n    let sI, sJ;\n    if (this.readback == null) {\n      return;\n    }\n\n    // Fetch geometry/html dimensions\n    const { items, width, height, depth } =\n      this.bind.source.getActiveDimensions();\n\n    // Limit readback to active area\n    this.readback.setActive(items, width, height, depth);\n\n    // Recalculate iteration strides\n    this.strideI = sI = items;\n    this.strideJ = sJ = sI * width;\n    return (this.strideK = sJ * height);\n  }\n\n  change(changed, _touched, _init) {\n    if (changed[\"readback.type\"]) {\n      return this.rebuild();\n    }\n\n    if (changed[\"readback.expr\"] && this.readback) {\n      return this.readback.setCallback(this.props.expr);\n    }\n  }\n}\nReadback.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Operator } from \"./operator.js\";\n\nexport class Repeat extends Operator {\n  static initClass() {\n    this.traits = [\"node\", \"bind\", \"operator\", \"source\", \"index\", \"repeat\"];\n  }\n\n  indexShader(shader) {\n    shader.pipe(this.operator);\n    return super.indexShader(shader);\n  }\n\n  sourceShader(shader) {\n    shader.pipe(this.operator);\n    return super.sourceShader(shader);\n  }\n\n  getDimensions() {\n    return this._resample(this.bind.source.getDimensions());\n  }\n  getActiveDimensions() {\n    return this._resample(this.bind.source.getActiveDimensions());\n  }\n  getFutureDimensions() {\n    return this._resample(this.bind.source.getFutureDimensions());\n  }\n  getIndexDimensions() {\n    return this._resample(this.bind.source.getIndexDimensions());\n  }\n\n  _resample(dims) {\n    const r = this.resample;\n    return {\n      items: r.items * dims.items,\n      width: r.width * dims.width,\n      height: r.height * dims.height,\n      depth: r.depth * dims.depth,\n    };\n  }\n\n  make() {\n    super.make();\n    if (this.bind.source == null) {\n      return;\n    }\n\n    // Repeat multipliers\n    this.resample = {};\n\n    // Modulus on all 4 dimensions\n    const uniforms = {\n      repeatModulus: this._attributes.make(this._types.vec4()),\n    };\n    this.repeatModulus = uniforms.repeatModulus;\n\n    // Build shader to repeat along all dimensions\n    const transform = this._shaders.shader();\n    transform.pipe(\"repeat.position\", uniforms);\n    return (this.operator = transform);\n  }\n\n  unmake() {\n    return super.unmake();\n  }\n\n  resize() {\n    if (this.bind.source != null) {\n      const dims = this.bind.source.getActiveDimensions();\n      this.repeatModulus.value.set(\n        dims.width,\n        dims.height,\n        dims.depth,\n        dims.items\n      );\n    }\n\n    return super.resize();\n  }\n\n  change(changed, touched, init) {\n    if (touched[\"operator\"] || touched[\"repeat\"]) {\n      return this.rebuild();\n    }\n\n    if (init) {\n      return [\"items\", \"width\", \"height\", \"depth\"].map(\n        (key) => (this.resample[key] = this.props[key])\n      );\n    }\n  }\n}\nRepeat.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UGLSL from \"../../../util/glsl.js\";\nimport { Operator } from \"./operator.js\";\n\nexport class Swizzle extends Operator {\n  static initClass() {\n    this.traits = [\"node\", \"bind\", \"operator\", \"source\", \"index\", \"swizzle\"];\n  }\n\n  sourceShader(shader) {\n    shader = super.sourceShader(shader);\n    if (this.swizzler) {\n      shader.pipe(this.swizzler);\n    }\n    return shader;\n  }\n\n  make() {\n    super.make();\n    if (this.bind.source == null) {\n      return;\n    }\n\n    // Swizzling order\n    const { order } = this.props;\n    if (order.join() !== \"1234\") {\n      return (this.swizzler = UGLSL.swizzleVec4(order, 4));\n    }\n  }\n\n  unmake() {\n    super.unmake();\n    return (this.swizzler = null);\n  }\n\n  change(changed, touched, _init) {\n    if (touched[\"swizzle\"] || touched[\"operator\"]) {\n      return this.rebuild();\n    }\n  }\n}\nSwizzle.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Operator } from \"./operator.js\";\n\nexport class Spread extends Operator {\n  static initClass() {\n    this.traits = [\"node\", \"bind\", \"operator\", \"source\", \"index\", \"spread\"];\n  }\n\n  sourceShader(shader) {\n    return shader.pipe(this.operator);\n  }\n\n  make() {\n    super.make();\n    if (this.bind.source == null) {\n      return;\n    }\n\n    // Uniforms\n    const uniforms = {\n      spreadMatrix: this._attributes.make(this._types.mat4()),\n      spreadOffset: this._attributes.make(this._types.vec4()),\n    };\n\n    this.spreadMatrix = uniforms.spreadMatrix;\n    this.spreadOffset = uniforms.spreadOffset;\n\n    // Build shader to spread data on one dimension\n    const transform = this._shaders.shader();\n    transform.require(this.bind.source.sourceShader(this._shaders.shader()));\n    transform.pipe(\"spread.position\", uniforms);\n\n    return (this.operator = transform);\n  }\n\n  unmake() {\n    return super.unmake();\n  }\n\n  resize() {\n    this.update();\n    return super.resize();\n  }\n\n  update() {\n    // Size to fit to include future history\n    let key, i, k, v;\n    const dims = this.bind.source.getFutureDimensions();\n\n    const matrix = this.spreadMatrix.value;\n    const els = matrix.elements;\n\n    const order = [\"width\", \"height\", \"depth\", \"items\"];\n    const align = [\"alignWidth\", \"alignHeight\", \"alignDepth\", \"alignItems\"];\n\n    const { unit } = this.props;\n    const unitEnum = this.node.attributes[\"spread.unit\"].enum;\n\n    const map = (() => {\n      switch (unit) {\n        case unitEnum.relative:\n          return (key, i, k, v) =>\n            (els[i * 4 + k] = v / Math.max(1, dims[key] - 1));\n        case unitEnum.absolute:\n          return (key, i, k, v) => (els[i * 4 + k] = v);\n      }\n    })();\n\n    return (() => {\n      const result = [];\n      for (i = 0; i < order.length; i++) {\n        let offset;\n        key = order[i];\n        const spread = this.props[key];\n        const anchor = this.props[align[i]];\n\n        if (spread != null) {\n          const d = dims[key] != null ? dims[key] : 1;\n          offset = -(d - 1) * (0.5 - anchor * 0.5);\n        } else {\n          offset = 0;\n        }\n        this.spreadOffset.value.setComponent(i, offset);\n\n        result.push(\n          (() => {\n            const result1 = [];\n            for (k = 0; k <= 3; k++) {\n              let left;\n              v =\n                (left = spread != null ? spread.getComponent(k) : undefined) !=\n                null\n                  ? left\n                  : 0;\n              result1.push((els[i * 4 + k] = map(key, i, k, v)));\n            }\n            return result1;\n          })()\n        );\n      }\n      return result;\n    })();\n  }\n\n  change(changed, touched, _init) {\n    if (touched[\"operator\"]) {\n      return this.rebuild();\n    }\n\n    if (touched[\"spread\"]) {\n      return this.update();\n    }\n  }\n}\nSpread.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UGLSL from \"../../../util/glsl.js\";\nimport { Operator } from \"./operator.js\";\n\n/*\nsplit:\n  order:       Types.transpose('wxyz')\n  axis:        Types.axis()\n  length:      Types.int(1)\n  overlap:     Types.int(0)\n*/\n\nexport class Split extends Operator {\n  static initClass() {\n    this.traits = [\"node\", \"bind\", \"operator\", \"source\", \"index\", \"split\"];\n  }\n\n  indexShader(shader) {\n    shader.pipe(this.operator);\n    return super.indexShader(shader);\n  }\n\n  sourceShader(shader) {\n    shader.pipe(this.operator);\n    return super.sourceShader(shader);\n  }\n\n  getDimensions() {\n    return this._resample(this.bind.source.getDimensions());\n  }\n  getActiveDimensions() {\n    return this._resample(this.bind.source.getActiveDimensions());\n  }\n  getFutureDimensions() {\n    return this._resample(this.bind.source.getFutureDimensions());\n  }\n  getIndexDimensions() {\n    return this._resample(this.bind.source.getIndexDimensions());\n  }\n\n  _resample(dims) {\n    let dim;\n    const { order } = this;\n    const { axis } = this;\n    const { overlap } = this;\n    const { length } = this;\n    const { stride } = this;\n\n    const labels = [\"width\", \"height\", \"depth\", \"items\"];\n    const mapped = order.map((x) => labels[x - 1]);\n    const index = order.indexOf(axis);\n    let set = (() => {\n      const result = [];\n      for (dim of Array.from(mapped)) {\n        result.push(dims[dim]);\n      }\n      return result;\n    })();\n    const remain = Math.floor((set[index] - overlap) / stride);\n\n    set.splice(index, 1, length, remain);\n    set = set.slice(0, 4);\n\n    const out = {};\n    for (let i = 0; i < mapped.length; i++) {\n      dim = mapped[i];\n      out[dim] = set[i];\n    }\n\n    //console.log 'split', order, axis, length, stride\n    //console.log dims, out\n\n    return out;\n  }\n\n  make() {\n    let left;\n    super.make();\n    if (this.bind.source == null) {\n      return;\n    }\n\n    const { order } = this.props;\n    let { axis } = this.props;\n    let { overlap } = this.props;\n    const { length } = this.props;\n\n    /*\n    Calculate index transform\n\n    order: wxyz\n    length: 3\n    overlap: 1\n\n    axis: w\n    index: 0\n    split: wx\n    rest:  0yz0\n           s\n\n    axis: x\n    index: 1\n    split: xy\n    rest:  w0z0\n            s\n\n    axis: y\n    index: 2\n    split: yz\n    rest:  wx00\n             s\n\n    axis: z\n    index: 3\n    split: z0\n    rest: wxy0\n             s\n\n    */\n\n    const permute = order.join(\"\");\n    if (axis == null) {\n      axis = order[0];\n    }\n\n    const index = permute.indexOf(axis);\n    const split =\n      permute[index] + ((left = permute[index + 1]) != null ? left : 0);\n    const rest = permute.replace(split[1], \"\").replace(split[0], \"0\") + \"0\";\n\n    // Prepare uniforms\n    overlap = Math.min(length - 1, overlap);\n    const stride = length - overlap;\n\n    const uniforms = {\n      splitStride: this._attributes.make(this._types.number(stride)),\n    };\n\n    // Build shader to split a dimension into two\n    const transform = this._shaders.shader();\n    transform.require(UGLSL.swizzleVec4(split, 2));\n    transform.require(UGLSL.swizzleVec4(rest, 4));\n    transform.require(UGLSL.injectVec4(index));\n    transform.pipe(\"split.position\", uniforms);\n    transform.pipe(UGLSL.invertSwizzleVec4(order));\n\n    this.operator = transform;\n\n    this.order = order;\n    this.axis = axis;\n    this.overlap = overlap;\n    this.length = length;\n    return (this.stride = stride);\n  }\n\n  unmake() {\n    return super.unmake();\n  }\n\n  change(changed, touched, _init) {\n    if (\n      changed[\"split.axis\"] ||\n      changed[\"split.order\"] ||\n      touched[\"operator\"]\n    ) {\n      return this.rebuild();\n    }\n  }\n}\nSplit.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Operator } from \"./operator.js\";\n\nexport class Slice extends Operator {\n  static initClass() {\n    this.traits = [\"node\", \"bind\", \"operator\", \"source\", \"index\", \"slice\"];\n  }\n\n  getDimensions() {\n    return this._resample(this.bind.source.getDimensions());\n  }\n  getActiveDimensions() {\n    return this._resample(this.bind.source.getActiveDimensions());\n  }\n  getFutureDimensions() {\n    return this._resample(this.bind.source.getFutureDimensions());\n  }\n  getIndexDimensions() {\n    return this._resample(this.bind.source.getIndexDimensions());\n  }\n\n  sourceShader(shader) {\n    shader.pipe(\"slice.position\", this.uniforms);\n    return this.bind.source.sourceShader(shader);\n  }\n\n  _resolve(key, dims) {\n    const range = this.props[key];\n    const dim = dims[key];\n    if (range == null) {\n      return [0, dim];\n    }\n\n    const index = function (i, dim) {\n      if (i < 0) {\n        return dim + i;\n      } else {\n        return i;\n      }\n    };\n\n    const start = index(Math.round(range.x), dim);\n    let end = index(Math.round(range.y), dim);\n\n    end = Math.max(start, end);\n    return [start, end - start];\n  }\n\n  _resample(dims) {\n    dims.width = this._resolve(\"width\", dims)[1];\n    dims.height = this._resolve(\"height\", dims)[1];\n    dims.depth = this._resolve(\"depth\", dims)[1];\n    dims.items = this._resolve(\"items\", dims)[1];\n    return dims;\n  }\n\n  make() {\n    super.make();\n    if (this.bind.source == null) {\n      return;\n    }\n\n    return (this.uniforms = {\n      sliceOffset: this._attributes.make(this._types.vec4()),\n    });\n  }\n\n  unmake() {\n    return super.unmake();\n  }\n\n  resize() {\n    if (this.bind.source == null) {\n      return;\n    }\n\n    const dims = this.bind.source.getActiveDimensions();\n\n    this.uniforms.sliceOffset.value.set(\n      this._resolve(\"width\", dims)[0],\n      this._resolve(\"height\", dims)[0],\n      this._resolve(\"depth\", dims)[0],\n      this._resolve(\"items\", dims)[0]\n    );\n\n    return super.resize();\n  }\n\n  change(changed, touched, _init) {\n    if (touched[\"operator\"]) {\n      return this.rebuild();\n    }\n\n    if (touched[\"slice\"]) {\n      return this.resize();\n    }\n  }\n}\nSlice.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UGLSL from \"../../../util/glsl.js\";\nimport { Operator } from \"./operator.js\";\n\nexport class Subdivide extends Operator {\n  static initClass() {\n    this.traits = [\"node\", \"bind\", \"operator\", \"source\", \"index\", \"subdivide\"];\n  }\n\n  indexShader(shader) {\n    shader.pipe(this.indexer);\n    return super.indexShader(shader);\n  }\n\n  sourceShader(shader) {\n    return shader.pipe(this.operator);\n  }\n\n  getDimensions() {\n    return this._resample(this.bind.source.getDimensions());\n  }\n  getActiveDimensions() {\n    return this._resample(this.bind.source.getActiveDimensions());\n  }\n  getFutureDimensions() {\n    return this._resample(this.bind.source.getFutureDimensions());\n  }\n  getIndexDimensions() {\n    return this._resample(this.bind.source.getIndexDimensions());\n  }\n\n  _resample(dims) {\n    const r = this.resampled;\n\n    dims.items--;\n    dims.width--;\n    dims.height--;\n    dims.depth--;\n\n    if (r.items != null) {\n      dims.items *= r.items;\n    }\n    if (r.width != null) {\n      dims.width *= r.width;\n    }\n    if (r.height != null) {\n      dims.height *= r.height;\n    }\n    if (r.depth != null) {\n      dims.depth *= r.depth;\n    }\n\n    dims.items++;\n    dims.width++;\n    dims.height++;\n    dims.depth++;\n\n    return dims;\n  }\n\n  make() {\n    super.make();\n    if (this.bind.source == null) {\n      return;\n    }\n\n    // Get resampled dimensions\n    let { lerp } = this.props;\n    const { items, width, height, depth } = this.props;\n\n    this.resampled = {};\n    if (items != null) {\n      this.resampled.items = items;\n    }\n    if (width != null) {\n      this.resampled.width = width;\n    }\n    if (height != null) {\n      this.resampled.height = height;\n    }\n    if (depth != null) {\n      this.resampled.depth = depth;\n    }\n\n    // Build shader to resample data\n    const operator = this._shaders.shader();\n    const indexer = this._shaders.shader();\n\n    // Uniforms\n    const uniforms = {\n      resampleFactor: this._attributes.make(this._types.vec4(0, 0, 0, 0)),\n      subdivideBevel: this.node.attributes[\"subdivide.bevel\"],\n    };\n\n    this.resampleFactor = uniforms.resampleFactor;\n    this.resampleBias = uniforms.resampleBias;\n\n    // Has resize props?\n    const resize =\n      items != null || width != null || height != null || depth != null;\n\n    // Addressing relative to target\n    if (resize) {\n      operator.pipe(\"resample.relative\", uniforms);\n      indexer.pipe(\"resample.relative\", uniforms);\n    } else {\n      operator.pipe(UGLSL.identity(\"vec4\"));\n      indexer.pipe(UGLSL.identity(\"vec4\"));\n    }\n\n    // Make sampler\n    let sampler = this.bind.source.sourceShader(this._shaders.shader());\n    lerp = lerp ? \".lerp\" : \"\";\n\n    // Iterate over dimensions (items, width, height, depth)\n    const iterable = [\"width\", \"height\", \"depth\", \"items\"];\n    for (let i = 0; i < iterable.length; i++) {\n      const key = iterable[i];\n      const id = `subdivide.${key}${lerp}`;\n\n      if (this.props[key] != null) {\n        sampler = this._shaders.shader().require(sampler);\n        sampler.pipe(id, uniforms);\n      }\n    }\n\n    // Combine operator and composite lerp sampler\n    operator.pipe(sampler);\n\n    this.operator = operator;\n    return (this.indexer = indexer);\n  }\n\n  unmake() {\n    super.unmake();\n    return (this.operator = null);\n  }\n\n  resize() {\n    if (this.bind.source == null) {\n      return;\n    }\n\n    const dims = this.bind.source.getActiveDimensions();\n    const target = this.getActiveDimensions();\n\n    const axis = (key) =>\n      Math.max(1, dims[key] - 1) / Math.max(1, target[key] - 1);\n\n    const rw = axis(\"width\");\n    const rh = axis(\"height\");\n    const rd = axis(\"depth\");\n    const ri = axis(\"items\");\n\n    this.resampleFactor.value.set(rw, rh, rd, ri);\n\n    return super.resize();\n  }\n\n  change(changed, touched, _init) {\n    if (touched[\"operator\"] || touched[\"subdivide\"]) {\n      return this.rebuild();\n    }\n  }\n}\nSubdivide.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UGLSL from \"../../../util/glsl.js\";\nimport { Operator } from \"./operator.js\";\n\nconst labels = {\n  1: \"width\",\n  2: \"height\",\n  3: \"depth\",\n  4: \"items\",\n};\n\nexport class Transpose extends Operator {\n  static initClass() {\n    this.traits = [\"node\", \"bind\", \"operator\", \"source\", \"index\", \"transpose\"];\n  }\n\n  indexShader(shader) {\n    if (this.swizzler) {\n      shader.pipe(this.swizzler);\n    }\n    return super.indexShader(shader);\n  }\n\n  sourceShader(shader) {\n    if (this.swizzler) {\n      shader.pipe(this.swizzler);\n    }\n    return super.sourceShader(shader);\n  }\n\n  getDimensions() {\n    return this._remap(this.transpose, this.bind.source.getDimensions());\n  }\n  getActiveDimensions() {\n    return this._remap(this.transpose, this.bind.source.getActiveDimensions());\n  }\n  getFutureDimensions() {\n    return this._remap(this.transpose, this.bind.source.getFutureDimensions());\n  }\n  getIndexDimensions() {\n    return this._remap(this.transpose, this.bind.source.getIndexDimensions());\n  }\n\n  _remap(transpose, dims) {\n    // Map dimensions onto their new axis\n    const out = {};\n\n    for (let i = 0; i <= 3; i++) {\n      const dst = labels[i + 1];\n      const src = labels[transpose[i]];\n      out[dst] = dims[src] != null ? dims[src] : 1;\n    }\n\n    return out;\n  }\n\n  make() {\n    super.make();\n    if (this.bind.source == null) {\n      return;\n    }\n\n    // Transposition order\n    const { order } = this.props;\n    if (order.join() !== \"1234\") {\n      this.swizzler = UGLSL.invertSwizzleVec4(order);\n    }\n    this.transpose = order;\n\n    // Notify of reallocation\n    return this.trigger({\n      type: \"source.rebuild\",\n    });\n  }\n\n  unmake() {\n    super.unmake();\n    return (this.swizzler = null);\n  }\n\n  change(changed, touched, _init) {\n    if (touched[\"transpose\"] || touched[\"operator\"]) {\n      return this.rebuild();\n    }\n  }\n}\nTranspose.initClass();\n","export * from \"./clamp.js\";\nexport * from \"./grow.js\";\nexport * from \"./join.js\";\nexport * from \"./lerp.js\";\nexport * from \"./memo.js\";\nexport * from \"./readback.js\";\nexport * from \"./resample.js\";\nexport * from \"./repeat.js\";\nexport * from \"./swizzle.js\";\nexport * from \"./spread.js\";\nexport * from \"./split.js\";\nexport * from \"./slice.js\";\nexport * from \"./subdivide.js\";\nexport * from \"./transpose.js\";\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Parent } from \"../base/parent.js\";\n\nexport class Transition extends Parent {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"transition\",\n      \"transform\",\n      \"mask\",\n      \"visible\",\n      \"active\",\n    ];\n  }\n\n  init() {\n    this.animate = null;\n    this.uniforms = null;\n\n    this.state = {\n      isVisible: true,\n      isActive: true,\n      enter: 1,\n      exit: 1,\n    };\n\n    this.latched = null;\n    return (this.locked = null);\n  }\n\n  make() {\n    this.uniforms = {\n      transitionFrom: this._attributes.make(this._types.vec4()),\n      transitionTo: this._attributes.make(this._types.vec4()),\n\n      transitionActive: this._attributes.make(this._types.bool()),\n      transitionScale: this._attributes.make(this._types.vec4()),\n      transitionBias: this._attributes.make(this._types.vec4()),\n      transitionEnter: this._attributes.make(this._types.number()),\n      transitionExit: this._attributes.make(this._types.number()),\n      transitionSkew: this._attributes.make(this._types.number()),\n    };\n\n    const slideParent = this._inherit(\"slide\");\n    const visibleParent = this._inherit(\"visible\");\n    const activeParent = this._inherit(\"active\");\n\n    this._listen(slideParent, \"transition.latch\", (e) => this.latch(e.step));\n    this._listen(slideParent, \"transition.release\", () => this.release());\n\n    this._listen(visibleParent, \"visible.change\", () => {\n      //console.log @node.toString(), 'visible.change ^', visibleParent.isVisible\n      return this.update((this.state.isVisible = visibleParent.isVisible));\n    });\n\n    this._listen(activeParent, \"active.change\", () => {\n      //console.log @node.toString(), 'active.change ^', activeParent.isActive\n      return this.update((this.state.isActive = activeParent.isActive));\n    });\n\n    this.animate = this._animator.make(this._types.vec2(1, 1), {\n      step: (value) => {\n        this.state.enter = value.x;\n        this.state.exit = value.y;\n        return this.update();\n      },\n      complete: (done) => this.complete(done),\n    });\n\n    return (this.move = this.props.from != null || this.props.to != null);\n  }\n\n  //@_helpers.visible.make()\n  //@_helpers.active.make()\n\n  unmake() {\n    return this.animate.dispose();\n  }\n\n  //@_helpers.visible.unmake()\n  //@_helpers.active.unmake()\n\n  latch(step) {\n    let latched;\n    this.locked = null;\n    this.latched = latched = {\n      isVisible: this.state.isVisible,\n      isActive: this.state.isActive,\n      step,\n    };\n\n    // Reset enter/exit animation if invisible\n    const visible = this.isVisible;\n    if (!visible) {\n      const forward = latched.step >= 0;\n      const [enter, exit] = Array.from(forward ? [0, 1] : [1, 0]);\n      return this.animate.set(enter, exit);\n    }\n  }\n\n  //console.log @node.toString(), 'transition::latch', @latched, enter, exit\n\n  release() {\n    // Get before/after and unlatch state\n    const { latched } = this;\n    const { state } = this;\n    this.latched = null;\n\n    //console.log @node.toString(), 'transition::release', JSON.parse JSON.stringify {latched, state}\n\n    //p = @; console.log '-> ', p.node.toString(), p.isVisible while p = p._inherit 'visible'\n\n    // Transition if visibility state change\n    if (latched.isVisible !== state.isVisible) {\n      // Maintain step direction\n      const forward = latched.step >= 0;\n      const visible = state.isVisible;\n      const [enter, exit] = Array.from(\n        visible ? [1, 1] : forward ? [1, 0] : [0, 1]\n      );\n\n      // Get duration\n      let { duration, durationEnter, durationExit } = this.props;\n      if (durationEnter == null) {\n        durationEnter = duration;\n      }\n      if (durationExit == null) {\n        durationExit = duration;\n      }\n      duration = visible * durationEnter + !visible * durationExit;\n\n      // Get delay\n      let { delay, delayEnter, delayExit } = this.props;\n      if (delayEnter == null) {\n        delayEnter = delay;\n      }\n      if (delayExit == null) {\n        delayExit = delay;\n      }\n      delay = visible * delayEnter + !visible * delayExit;\n\n      // Animate enter/exit\n      //console.log @node.toString(), '@animate.immediate', {x: enter, y: exit}, {duration, delay, ease: 'linear'}\n      this.animate.immediate(\n        { x: enter, y: exit },\n        { duration, delay, ease: \"linear\" }\n      );\n\n      // Lock visibility and active open during transition\n      this.locked = {\n        isVisible: true,\n        isActive: latched.isActive || state.isActive,\n      };\n    }\n\n    return this.update();\n  }\n\n  complete(done) {\n    if (!done) {\n      return;\n    }\n    this.locked = null;\n    return this.update();\n  }\n\n  update() {\n    if (this.latched != null) {\n      return;\n    } // latched\n\n    let { enter, exit } = this.props;\n\n    // Resolve transition state\n    if (enter == null) {\n      ({ enter } = this.state);\n    }\n    if (exit == null) {\n      ({ exit } = this.state);\n    }\n\n    const level = enter * exit;\n    let visible = level > 0;\n    const partial = level < 1;\n\n    this.uniforms.transitionEnter.value = enter;\n    this.uniforms.transitionExit.value = exit;\n    this.uniforms.transitionActive.value = partial;\n\n    // Resolve visibility state\n    if (visible) {\n      visible = !!this.state.isVisible;\n    }\n    if (this.locked != null) {\n      visible = this.locked.isVisible;\n    }\n\n    if (this.isVisible !== visible) {\n      this.isVisible = visible;\n      this.trigger({ type: \"visible.change\" });\n    }\n\n    // Resolve active state\n    const active = !!(\n      this.state.isActive ||\n      (this.locked != null ? this.locked.isActive : undefined)\n    );\n\n    if (this.isActive !== active) {\n      this.isActive = active;\n      return this.trigger({ type: \"active.change\" });\n    }\n  }\n\n  //console.log 'transition update', 'enter', enter, 'exit', exit, 'visible', visible, 'active', active\n\n  change(changed, touched, init) {\n    if (changed[\"transition.enter\"] || changed[\"transition.exit\"] || init) {\n      this.update();\n    }\n\n    if (changed[\"transition.stagger\"] || init) {\n      const { stagger } = this.props;\n\n      // Precompute shader constants\n\n      const flipX = stagger.x < 0;\n      const flipY = stagger.y < 0;\n      const flipZ = stagger.z < 0;\n      const flipW = stagger.w < 0;\n\n      const staggerX = Math.abs(stagger.x);\n      const staggerY = Math.abs(stagger.y);\n      const staggerZ = Math.abs(stagger.z);\n      const staggerW = Math.abs(stagger.w);\n\n      this.uniforms.transitionSkew.value =\n        staggerX + staggerY + staggerZ + staggerW;\n\n      this.uniforms.transitionScale.value.set(\n        (1 - flipX * 2) * staggerX,\n        (1 - flipY * 2) * staggerY,\n        (1 - flipZ * 2) * staggerZ,\n        (1 - flipW * 2) * staggerW\n      );\n\n      return this.uniforms.transitionBias.value.set(\n        flipX * staggerX,\n        flipY * staggerY,\n        flipZ * staggerZ,\n        flipW * staggerW\n      );\n    }\n  }\n}\nTransition.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining\n * DS104: Avoid inline assignments\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Transition } from \"./transition.js\";\n\nexport class Move extends Transition {\n  static initClass() {\n    this.traits = [\"node\", \"transition\", \"vertex\", \"move\", \"visible\", \"active\"];\n  }\n\n  make() {\n    super.make();\n\n    const object = {\n      moveFrom: this.node.attributes[\"move.from\"],\n      moveTo: this.node.attributes[\"move.to\"],\n    };\n    for (const k in object) {\n      const v = object[k];\n      this.uniforms[k] = v;\n    }\n  }\n\n  vertex(shader, pass) {\n    let left;\n    if (pass === this.props.pass) {\n      shader.pipe(\"move.position\", this.uniforms);\n    }\n    return (left = __guard__(this._inherit(\"vertex\"), (x) =>\n      x.vertex(shader, pass)\n    )) != null\n      ? left\n      : shader;\n  }\n}\nMove.initClass();\n\nfunction __guard__(value, transform) {\n  return typeof value !== \"undefined\" && value !== null\n    ? transform(value)\n    : undefined;\n}\n","export function clamp(x, a, b) {\n  return Math.max(a, Math.min(b, x));\n}\n\nexport function cosine(x) {\n  return 0.5 - 0.5 * Math.cos(clamp(x, 0, 1) * Math.PI);\n}\n\nexport function binary(x) {\n  return +(x >= 0.5);\n}\n\nexport function hold(x) {\n  return +(x >= 1);\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as Ease from \"../../../util/ease.js\";\nimport { Primitive } from \"../../primitive.js\";\n\nconst deepCopy = function (x) {\n  const out = {};\n  for (const k in x) {\n    const v = x[k];\n    if (v instanceof Array) {\n      out[k] = v.slice();\n    } else if (v != null && typeof v === \"object\") {\n      out[k] = deepCopy(v);\n    } else {\n      out[k] = v;\n    }\n  }\n\n  return out;\n};\n\nexport class Track extends Primitive {\n  static initClass() {\n    this.traits = [\"node\", \"track\", \"seek\", \"bind\"];\n  }\n\n  init() {\n    this.handlers = {};\n    this.script = null;\n    this.values = null;\n    this.playhead = 0;\n    this.velocity = null;\n    this.section = null;\n    return (this.expr = null);\n  }\n\n  make() {\n    // Bind to attached data sources\n    let ref;\n    this._helpers.bind.make([\n      { to: \"track.target\", trait: \"node\", callback: null },\n    ]);\n\n    const { script } = this.props;\n    const { node } = this.bind.target;\n\n    this.targetNode = node;\n    return (\n      ([this.script, this.values, this.start, this.end] = Array.from(\n        (ref = this._process(node, script))\n      )),\n      ref\n    );\n  }\n\n  unmake() {\n    this.unbindExpr();\n    this._helpers.bind.unmake();\n    this.script =\n      this.values =\n      this.start =\n      this.end =\n      this.section =\n      this.expr =\n        null;\n    return (this.playhead = 0);\n  }\n\n  // Bind animated expressions\n  bindExpr(expr) {\n    this.unbindExpr();\n    this.expr = expr;\n    this.targetNode.bind(expr, true);\n\n    // Measure playhead velocity on attribute computation\n    const { clock } = this.targetNode;\n    const self = this;\n    return this._attributes.bind(\n      (this.measure = (function () {\n        let playhead = null;\n        return () => {\n          const { step } = clock.getTime();\n          if (playhead != null) {\n            self.velocity = (self.playhead - playhead) / step;\n          }\n          return (playhead = self.playhead);\n        };\n      })())\n    );\n  }\n\n  unbindExpr() {\n    if (this.expr != null) {\n      this.targetNode.unbind(this.expr, true);\n    }\n    if (this.measure != null) {\n      this._attributes.unbind(this.measure);\n    }\n    return (this.expr = this.measure = null);\n  }\n\n  // Process script steps by filling out missing props\n  _process(object, script) {\n    let k, key, last, message, s, step, v;\n    if (script instanceof Array) {\n      // Normalize array to numbered dict\n      s = {};\n      for (let i = 0; i < script.length; i++) {\n        step = script[i];\n        s[i] = step;\n      }\n      script = s;\n    }\n\n    // Normalize keyed steps to array of step objects\n    s = [];\n    for (key in script) {\n      step = script[key];\n      if (step == null) {\n        step = [];\n      }\n\n      if (step instanceof Array) {\n        // [props, expr] array\n        step = {\n          key: +key,\n          props: step[0] != null ? deepCopy(step[0]) : {},\n          expr: step[1] != null ? deepCopy(step[1]) : {},\n        };\n      } else {\n        if (step.key == null && !step.props && !step.expr) {\n          // Direct props object (iffy, but people will do this anyhow)\n          step = { props: deepCopy(step) };\n        } else {\n          // Proper step\n          step = deepCopy(step);\n        }\n\n        // Prepare step object\n        step.key = step.key != null ? +step.key : +key;\n        if (step.props == null) {\n          step.props = {};\n        }\n        if (step.expr == null) {\n          step.expr = {};\n        }\n      }\n\n      s.push(step);\n    }\n    script = s;\n\n    if (!script.length) {\n      return [[], {}, 0, 0];\n    }\n\n    // Sort by keys\n    script.sort((a, b) => a.key - b.key);\n    const start = script[0].key;\n    const end = script[script.length - 1].key;\n\n    // Connect steps\n    for (key in script) {\n      step = script[key];\n      if (last != null) {\n        last.next = step;\n      }\n      last = step;\n    }\n\n    // Last step leads to itself\n    last.next = last;\n    script = s;\n\n    // Determine starting props\n    const props = {};\n    const values = {};\n    for (key in script) {\n      step = script[key];\n      for (k in step.props) {\n        v = step.props[k];\n        props[k] = true;\n      }\n    }\n    for (key in script) {\n      step = script[key];\n      for (k in step.expr) {\n        v = step.expr[k];\n        props[k] = true;\n      }\n    }\n    for (k in props) {\n      props[k] = object.get(k);\n    }\n    try {\n      // Need two sources and one destination value for correct mixing of live expressions\n      for (k in props) {\n        values[k] = [\n          object.attribute(k).T.make(),\n          object.attribute(k).T.make(),\n          object.attribute(k).T.make(),\n        ];\n      }\n    } catch (error) {\n      console.warn(this.node.toMarkup());\n      message = `${this.node.toString()} - Target ${object} has no \\`${k}\\` property`;\n      throw new Error(message);\n    }\n\n    const result = [];\n\n    // Normalize script props, insert held values\n    for (step of Array.from(script)) {\n      for (k in props) {\n        v = props[k];\n        v = object.validate(k, step.props[k] != null ? step.props[k] : v);\n        props[k] = step.props[k] = v;\n\n        if (step.expr[k] != null && typeof step.expr[k] !== \"function\") {\n          console.warn(this.node.toMarkup());\n          message = `${this.node.toString()} - Expression \\`${\n            step.expr[k]\n          }\\` on property \\`${k}\\` is not a function`;\n          throw new Error(message);\n        }\n      }\n      result.push(step);\n    }\n\n    return [result, values, start, end];\n  }\n\n  update() {\n    let { playhead } = this;\n    const { script } = this;\n    const { ease, seek } = this.props;\n    const node = this.targetNode;\n\n    if (seek != null) {\n      playhead = seek;\n    }\n\n    if (script.length) {\n      let k;\n      const find = function () {\n        let last = script[0];\n        for (let i = 0; i < script.length; i++) {\n          const step = script[i];\n          if (step.key > playhead) {\n            break;\n          }\n          last = step;\n        }\n        return last;\n      };\n\n      let { section } = this;\n      if (!section || playhead < section.key || playhead > section.next.key) {\n        section = find(script, playhead);\n      }\n\n      if (section === this.section) {\n        return;\n      }\n      this.section = section;\n\n      const from = section;\n      const to = section.next;\n      const start = from.key;\n      const end = to.key;\n\n      // Easing of playhead along track\n      const easeMethod = (() => {\n        switch (ease) {\n          case \"linear\":\n          case 0:\n            return Ease.clamp;\n          case \"cosine\":\n          case 1:\n            return Ease.cosine;\n          case \"binary\":\n          case 2:\n            return Ease.binary;\n          case \"hold\":\n          case 3:\n            return Ease.hold;\n          default:\n            return Ease.cosine;\n        }\n      })();\n\n      // Callback for live playhead interpolator (linear approx time travel)\n      const { clock } = node;\n      const getPlayhead = (time) => {\n        if (this.velocity == null) {\n          return this.playhead;\n        }\n        const now = clock.getTime();\n        return this.playhead + this.velocity * (time - now.time);\n      };\n\n      const getLerpFactor = (function () {\n        const scale = 1 / Math.max(0.0001, end - start);\n        return (time) => easeMethod((getPlayhead(time) - start) * scale, 0, 1);\n      })();\n\n      // Create prop expression interpolator\n      const live = (key) => {\n        const fromE = from.expr[key];\n        const toE = to.expr[key];\n        const fromP = from.props[key];\n        const toP = to.props[key];\n\n        const invalid = function () {\n          console.warn(node.toMarkup());\n          throw new Error(\n            `${this.node.toString()} - Invalid expression result on track \\`${key}\\``\n          );\n        };\n\n        const attr = node.attribute(key);\n        const values = this.values[key];\n        const animator = this._animator;\n\n        // Lerp between two expressions\n        if (fromE && toE) {\n          return ((values, _from, _to) =>\n            function (time, delta) {\n              let _from, _to;\n              values[0] = _from = attr.T.validate(\n                fromE(time, delta),\n                values[0],\n                invalid\n              );\n              values[1] = _to = attr.T.validate(\n                toE(time, delta),\n                values[1],\n                invalid\n              );\n              return (values[2] = animator.lerp(\n                attr.T,\n                _from,\n                _to,\n                getLerpFactor(time),\n                values[2]\n              ));\n            })(values, from, to);\n\n          // Lerp between an expression and a constant\n        } else if (fromE) {\n          return ((values, _from, _to) =>\n            function (time, delta) {\n              let _from;\n              values[0] = _from = attr.T.validate(\n                fromE(time, delta),\n                values[0],\n                invalid\n              );\n              return (values[1] = animator.lerp(\n                attr.T,\n                _from,\n                toP,\n                getLerpFactor(time),\n                values[1]\n              ));\n            })(values, from, to);\n\n          // Lerp between a constant and an expression\n        } else if (toE) {\n          return ((values, _from, _to) =>\n            function (time, delta) {\n              let _to;\n              values[0] = _to = attr.T.validate(\n                toE(time, delta),\n                values[0],\n                invalid\n              );\n              return (values[1] = animator.lerp(\n                attr.T,\n                fromP,\n                _to,\n                getLerpFactor(time),\n                values[1]\n              ));\n            })(values, from, to);\n\n          // Lerp between two constants\n        } else {\n          return (\n            (values, _from, _to) => (time, _delta) =>\n              (values[0] = animator.lerp(\n                attr.T,\n                fromP,\n                toP,\n                getLerpFactor(time),\n                values[0]\n              ))\n          )(values, from, to);\n        }\n      };\n\n      // Handle expr / props on both ends\n      const expr = {};\n      for (k in from.expr) {\n        if (expr[k] == null) {\n          expr[k] = live(k);\n        }\n      }\n      for (k in to.expr) {\n        if (expr[k] == null) {\n          expr[k] = live(k);\n        }\n      }\n      for (k in from.props) {\n        if (expr[k] == null) {\n          expr[k] = live(k);\n        }\n      }\n      for (k in to.props) {\n        if (expr[k] == null) {\n          expr[k] = live(k);\n        }\n      }\n\n      // Bind node props\n      return this.bindExpr(expr);\n    }\n  }\n\n  change(changed, touched, init) {\n    if (\n      changed[\"track.target\"] ||\n      changed[\"track.script\"] ||\n      changed[\"track.mode\"]\n    ) {\n      return this.rebuild();\n    }\n\n    if (changed[\"seek.seek\"] || init) {\n      return this.update();\n    }\n  }\n}\nTrack.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Track } from \"./track.js\";\n\nexport class Play extends Track {\n  static initClass() {\n    this.traits = [\"node\", \"track\", \"trigger\", \"play\", \"bind\"];\n  }\n\n  init() {\n    super.init();\n    this.skew = null;\n    return (this.start = null);\n  }\n\n  reset(go) {\n    if (go == null) {\n      go = true;\n    }\n    this.skew = go ? 0 : null;\n    return (this.start = null);\n  }\n\n  make() {\n    super.make();\n\n    // Start on slide, or immediately if not inside slide\n    this._listen(\"slide\", \"slide.step\", (e) => {\n      const { trigger } = this.props;\n      if (trigger != null && e.index === trigger) {\n        return this.reset();\n      }\n      if (trigger != null && e.index === 0) {\n        return this.reset(false);\n      }\n    });\n    if (!this.props.trigger || this._inherit(\"slide\") == null) {\n      this.reset();\n    }\n\n    // Find parent clock\n    const parentClock = this._inherit(\"clock\");\n\n    // Update clock\n    return this._listen(parentClock, \"clock.tick\", () => {\n      const { from, to, speed, pace, delay, realtime } = this.props;\n\n      const time = parentClock.getTime();\n      if (this.skew != null) {\n        const now = realtime ? time.time : time.clock;\n        const delta = realtime ? time.delta : time.step;\n        const ratio = speed / pace;\n\n        if (this.start == null) {\n          this.start = now;\n        }\n        this.skew += delta * (ratio - 1);\n\n        let offset = Math.max(0, now - this.start + this.skew - delay * ratio);\n        if (this.props.loop) {\n          offset = offset % (to - from);\n        }\n\n        this.playhead = Math.min(to, from + offset);\n      } else {\n        this.playhead = 0;\n      }\n\n      return this.update();\n    });\n  }\n\n  update() {\n    return super.update();\n  }\n\n  change(changed, touched, init) {\n    if (changed[\"trigger.trigger\"] || changed[\"play.realtime\"]) {\n      return this.rebuild();\n    }\n    return super.change(changed, touched, init);\n  }\n}\nPlay.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS202: Simplify dynamic range loops\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Parent } from \"../base/parent.js\";\n\nexport class Present extends Parent {\n  static initClass() {\n    this.traits = [\"node\", \"present\"];\n  }\n\n  init() {}\n\n  make() {\n    this.nodes = [];\n    this.steps = [];\n    this.length = 0;\n    this.last = [];\n    this.index = 0;\n    this.dirty = [];\n\n    this._listen(\"root\", \"root.update\", this.update);\n    return this._compute(\"present.length\", () => this.length);\n  }\n\n  adopt(controller) {\n    const { node } = controller;\n    if (this.nodes.indexOf(controller) < 0) {\n      this.nodes.push(node);\n    }\n    return this.dirty.push(controller);\n  }\n\n  unadopt(controller) {\n    this.nodes = this.nodes.filter((x) => x !== controller);\n    return this.dirty.push(controller);\n  }\n\n  update() {\n    if (!this.dirty.length) {\n      return;\n    }\n\n    for (const controller of Array.from(this.dirty)) {\n      this.slideReset(controller);\n    }\n\n    [this.steps, this.indices] = Array.from(this.process(this.nodes));\n\n    this.length = this.steps.length;\n    this.index = null;\n    this.go(this.props.index);\n\n    return (this.dirty = []);\n  }\n\n  slideLatch(controller, enabled, step) {\n    return controller.slideLatch(enabled, step);\n  }\n  slideStep(controller, index, step) {\n    return controller.slideStep(this.mapIndex(controller, index), step);\n  }\n  slideRelease(controller, _step) {\n    return controller.slideRelease();\n  }\n  slideReset(controller) {\n    return controller.slideReset();\n  }\n\n  mapIndex(controller, index) {\n    return index - this.indices[controller.node._id];\n  }\n\n  process(nodes) {\n    // Grab nodes' path of slide parents\n    const slides = (nodes) =>\n      Array.from(nodes).map((el) => parents(el).filter(isSlide));\n    const traverse = (map) => (el) =>\n      (() => {\n        let ref, ref1;\n        const result = [];\n        while (el && (([el, ref] = Array.from((ref1 = [map(el), el]))), ref1)) {\n          result.push(ref);\n        }\n        return result;\n      })();\n\n    const parents = traverse(function (el) {\n      if (el.parent.traits.hash.present) {\n        return null;\n      } else {\n        return el.parent;\n      }\n    });\n\n    // Helpers\n    const isSlide = (el) => nodes.indexOf(el) >= 0;\n\n    // Order paths (leaf -> parent slide -> ...)\n    const order = (paths) =>\n      paths.sort(function (a, b) {\n        // Path lengths\n        const c = a.length;\n        const d = b.length;\n\n        // Compare from outside in\n        let e = Math.min(c, d);\n        for (\n          let i = 1, end = e, asc = 1 <= end;\n          asc ? i <= end : i >= end;\n          asc ? i++ : i--\n        ) {\n          // inclusive end\n          const nodeA = a[c - i];\n          const nodeB = b[d - i];\n\n          // Explicit sibling order (natural)\n          const f = nodeA.props.order;\n          const g = nodeB.props.order;\n          if (f != null || g != null) {\n            if (f != null && g != null && (e = f - g) !== 0) {\n              return e;\n            }\n            if (f != null) {\n              return -1;\n            }\n            if (g != null) {\n              return 1;\n            }\n          }\n\n          // Document sibling order (inverted)\n          if (nodeB.order !== nodeA.order) {\n            return nodeB.order - nodeA.order;\n          }\n        }\n\n        // Different tree level\n        e = c - d;\n        if (e !== 0) {\n          return e;\n        }\n\n        // Equal\n        return 0;\n      });\n\n    const split = function (steps) {\n      const relative = [];\n      const absolute = [];\n      for (const step of Array.from(steps)) {\n        (step[0].props.steps != null ? relative : absolute).push(step);\n      }\n      return [relative, absolute];\n    };\n\n    const expand = function (lists) {\n      let step;\n      const [relative, absolute] = Array.from(lists);\n\n      const limit = 100;\n\n      const indices = {};\n      let steps = [];\n      const slide = function (step, index) {\n        let node;\n        const { props } = (node = step[0]);\n        const parent = step[1];\n\n        const parentIndex = parent != null ? indices[parent._id] : 0;\n        //throw \"parent index missing\" if !parentIndex?\n        const childIndex = index;\n\n        let from =\n          props.from != null\n            ? parentIndex + props.from\n            : childIndex - props.early;\n        let to =\n          props.to != null\n            ? parentIndex + props.to\n            : childIndex + props.steps + props.late;\n\n        from = Math.max(0, from);\n        to = Math.min(limit, to);\n\n        if (indices[node._id] == null) {\n          indices[node._id] = from;\n        }\n        for (\n          let i = from, end = to, asc = from <= end;\n          asc ? i < end : i > end;\n          asc ? i++ : i--\n        ) {\n          steps[i] = (steps[i] != null ? steps[i] : (steps[i] = [])).concat(\n            step\n          );\n        }\n\n        return props.steps;\n      };\n\n      let i = 0;\n      for (step of Array.from(relative)) {\n        i += slide(step, i);\n      }\n      for (step of Array.from(absolute)) {\n        slide(step, 0);\n      }\n\n      // Dedupe and order\n      steps = (() => {\n        const result = [];\n        for (step of Array.from(steps)) {\n          result.push(finalize(dedupe(step)));\n        }\n        return result;\n      })();\n\n      return [steps, indices];\n    };\n\n    // Remove duplicates\n    const dedupe = function (step) {\n      if (step) {\n        return (() => {\n          const result = [];\n          for (let i = 0; i < step.length; i++) {\n            const node = step[i];\n            if (step.indexOf(node) === i) {\n              result.push(node);\n            }\n          }\n          return result;\n        })();\n      } else {\n        return [];\n      }\n    };\n\n    // Finalize individual step by document order\n    const finalize = (step) => step.sort((a, b) => a.order - b.order);\n\n    const paths = slides(nodes);\n    const steps = order(paths);\n    return expand(split(steps));\n  }\n\n  go(index) {\n    // Pad with an empty slide before and after for initial enter/final exit\n    let left;\n    let node;\n    index = Math.max(0, Math.min(this.length + 1, +index || 0));\n\n    const active = (left = this.steps[index - 1]) != null ? left : [];\n    const step = this.props.directed ? index - this.index : 1;\n    this.index = index;\n\n    const enter = (() => {\n      const result = [];\n      for (node of Array.from(active)) {\n        if (this.last.indexOf(node) < 0) {\n          result.push(node);\n        }\n      }\n      return result;\n    })();\n    const exit = (() => {\n      const result1 = [];\n      for (node of Array.from(this.last)) {\n        if (active.indexOf(node) < 0) {\n          result1.push(node);\n        }\n      }\n      return result1;\n    })();\n    const stay = (() => {\n      const result2 = [];\n      for (node of Array.from(active)) {\n        if (enter.indexOf(node) < 0 && exit.indexOf(node) < 0) {\n          result2.push(node);\n        }\n      }\n      return result2;\n    })();\n\n    const ascend = (nodes) => nodes.sort((a, b) => a.order - b.order);\n    const descend = (nodes) => nodes.sort((a, b) => b.order - a.order);\n\n    //const toStr = (x) => x.toString();\n    //console.log '============================================================'\n    //console.log 'go',  index, {enter: enter.map(toStr), stay: stay.map(toStr), exit: exit.map(toStr)}\n\n    for (node of Array.from(ascend(enter))) {\n      this.slideLatch(node.controller, true, step);\n    }\n    for (node of Array.from(ascend(stay))) {\n      this.slideLatch(node.controller, null, step);\n    }\n    for (node of Array.from(ascend(exit))) {\n      this.slideLatch(node.controller, false, step);\n    }\n\n    for (node of Array.from(enter)) {\n      this.slideStep(node.controller, index, step);\n    }\n    for (node of Array.from(stay)) {\n      this.slideStep(node.controller, index, step);\n    }\n    for (node of Array.from(exit)) {\n      this.slideStep(node.controller, index, step);\n    }\n\n    for (node of Array.from(descend(enter))) {\n      this.slideRelease(node.controller);\n    }\n    for (node of Array.from(descend(stay))) {\n      this.slideRelease(node.controller);\n    }\n    for (node of Array.from(descend(exit))) {\n      this.slideRelease(node.controller);\n    }\n\n    this.last = active;\n  }\n\n  change(changed, touched, init) {\n    if (changed[\"present.index\"] || init) {\n      return this.go(this.props.index);\n    }\n  }\n}\nPresent.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining\n * DS104: Avoid inline assignments\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UGLSL from \"../../../util/glsl.js\";\nimport { Transition } from \"./transition.js\";\n\nexport class Reveal extends Transition {\n  static initClass() {\n    this.traits = [\"node\", \"transition\", \"mask\", \"visible\", \"active\"];\n  }\n\n  mask(shader) {\n    let left, s;\n    if (shader) {\n      s = this._shaders.shader();\n      s.pipe(UGLSL.identity(\"vec4\"));\n      s.fan();\n      s.pipe(shader, this.uniforms);\n      s.next();\n      s.pipe(\"reveal.mask\", this.uniforms);\n      s.end();\n      s.pipe(\"float combine(float a, float b) { return min(a, b); }\");\n    } else {\n      s = this._shaders.shader();\n      s.pipe(\"reveal.mask\", this.uniforms);\n    }\n\n    return (left = __guard__(this._inherit(\"mask\"), (x) => x.mask(s))) != null\n      ? left\n      : s;\n  }\n}\nReveal.initClass();\n\nfunction __guard__(value, transform) {\n  return typeof value !== \"undefined\" && value !== null\n    ? transform(value)\n    : undefined;\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Parent } from \"../base/parent.js\";\n\nexport class Slide extends Parent {\n  static initClass() {\n    this.traits = [\"node\", \"slide\", \"visible\", \"active\"];\n  }\n\n  make() {\n    this._helpers.visible.make();\n    this._helpers.active.make();\n\n    if (!this._inherit(\"present\")) {\n      throw new Error(\n        `${this.node.toString()} must be placed inside <present></present>`\n      );\n    }\n\n    return this._inherit(\"present\").adopt(this);\n  }\n\n  unmake() {\n    this._helpers.visible.unmake();\n    this._helpers.active.unmake();\n\n    return this._inherit(\"present\").unadopt(this);\n  }\n\n  change(changed, _touched, _init) {\n    if (\n      changed[\"slide.early\"] ||\n      changed[\"slide.late\"] ||\n      changed[\"slide.steps\"] ||\n      changed[\"slide.from\"] ||\n      changed[\"slide.to\"]\n    ) {\n      return this.rebuild();\n    }\n  }\n\n  slideLatch(enabled, step) {\n    //console.log 'slide:latch', @node.toString(), enabled, step\n    this.trigger({\n      type: \"transition.latch\",\n      step: step,\n    });\n\n    if (enabled != null) {\n      return this._instant(enabled);\n    }\n  }\n\n  slideStep(index, step) {\n    //console.log 'slide:step', @node.toString(), index, step\n    return this.trigger({\n      type: \"slide.step\",\n      index: index,\n      step: step,\n    });\n  }\n\n  slideRelease() {\n    //console.log 'slide:release', @node.toString()\n    return this.trigger({\n      type: \"transition.release\",\n    });\n  }\n\n  slideReset() {\n    this._instant(false);\n    return this.trigger({\n      type: \"slide.reset\",\n    });\n  }\n\n  _instant(enabled) {\n    //console.log 'slide:instant', @node.toString(), enabled\n    this.setVisible(enabled);\n    return this.setActive(enabled);\n  }\n}\nSlide.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Track } from \"./track.js\";\n\nexport class Step extends Track {\n  static initClass() {\n    this.traits = [\"node\", \"track\", \"step\", \"trigger\", \"bind\"];\n  }\n\n  make() {\n    super.make();\n\n    const clock = this._inherit(\"clock\");\n\n    if (this.actualIndex == null) {\n      this.actualIndex = null;\n    }\n    this.animateIndex = this._animator.make(this._types.number(0), {\n      clock,\n      realtime: this.props.realtime,\n      step: (value) => {\n        return (this.actualIndex = value);\n      },\n    });\n\n    if (this.lastIndex == null) {\n      this.lastIndex = null;\n    }\n    this.animateStep = this._animator.make(this._types.number(0), {\n      clock,\n      realtime: this.props.realtime,\n      step: (value) => {\n        this.playhead = value;\n        return this.update();\n      },\n    });\n\n    this.stops =\n      this.props.stops != null\n        ? this.props.stops\n        : __range__(0, this.script.length, false);\n\n    // Seek instantly after reset\n    this._listen(\"slide\", \"slide.reset\", (_e) => {\n      return (this.lastIndex = null);\n    });\n\n    // Update playhead in response to slide change\n    return this._listen(\"slide\", \"slide.step\", (e) => {\n      let left;\n      let { duration } = this.props;\n      const { delay, pace, speed, playback, rewind, skip, trigger } =\n        this.props;\n\n      // Note: enter phase is from index 0 to 1\n      const i = Math.max(0, Math.min(this.stops.length - 1, e.index - trigger));\n\n      // Animation range\n      const from = this.playhead;\n      const to = this.stops[i];\n\n      // Seek if first step after reset\n      if (this.lastIndex == null && trigger) {\n        this.lastIndex = i;\n        this.animateStep.set(to);\n        this.animateIndex.set(i);\n        return;\n      }\n\n      // Calculate actual step from current offset (may be still animating)\n      let last =\n        (left = this.actualIndex != null ? this.actualIndex : this.lastIndex) !=\n        null\n          ? left\n          : 0;\n      const step = i - last;\n\n      // Don't count duped stops\n      const skips = this.stops.slice(Math.min(last, i), Math.max(last, i));\n      let free = 0;\n      last = skips.shift();\n      for (const stop of Array.from(skips)) {\n        if (last === stop) {\n          free++;\n        }\n        last = stop;\n      }\n\n      // Remember last intended stop\n      this.lastIndex = i;\n\n      // Apply rewind factor\n      let factor = speed * (e.step >= 0 ? 1 : rewind);\n\n      // Pass through multiple steps at faster rate if skip is enabled\n      factor *= skip ? Math.max(1, Math.abs(step) - free) : 1;\n\n      // Apply pace\n      duration += (Math.abs(to - from) * pace) / factor;\n\n      if (from !== to) {\n        this.animateIndex.immediate(i, { delay, duration, ease: playback });\n        return this.animateStep.immediate(to, {\n          delay,\n          duration,\n          ease: playback,\n        });\n      }\n    });\n  }\n\n  made() {\n    return this.update();\n  }\n\n  unmake() {\n    this.animateIndex.dispose();\n    this.animateStep.dispose();\n    this.animateIndex = this.animateStep = null;\n\n    return super.unmake();\n  }\n\n  change(changed, touched, init) {\n    if (changed[\"step.stops\"] || changed[\"step.realtime\"]) {\n      return this.rebuild();\n    }\n    return super.change(changed, touched, init);\n  }\n}\nStep.initClass();\n\nfunction __range__(left, right, inclusive) {\n  const range = [];\n  const ascending = left < right;\n  const end = !inclusive ? right : ascending ? right + 1 : right - 1;\n  for (let i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {\n    range.push(i);\n  }\n  return range;\n}\n","export * from \"./move.js\";\nexport * from \"./play.js\";\nexport * from \"./present.js\";\nexport * from \"./reveal.js\";\nexport * from \"./slide.js\";\nexport * from \"./step.js\";\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining\n * DS104: Avoid inline assignments\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Parent } from \"../base/parent.js\";\n\nexport class RTT extends Parent {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"root\",\n      \"scene\",\n      \"vertex\",\n      \"texture\",\n      \"rtt\",\n      \"source\",\n      \"index\",\n      \"image\",\n    ];\n    this.defaults = {\n      minFilter: \"linear\",\n      magFilter: \"linear\",\n      type: \"unsignedByte\",\n    };\n  }\n\n  init() {\n    return (this.rtt =\n      this.scene =\n      this.camera =\n      this.width =\n      this.height =\n      this.history =\n      this.rootSize =\n      this.size =\n        null);\n  }\n\n  indexShader(shader) {\n    return shader;\n  }\n  imageShader(shader) {\n    return this.rtt.shaderRelative(shader);\n  }\n  sourceShader(shader) {\n    return this.rtt.shaderAbsolute(shader, this.history);\n  }\n\n  getDimensions() {\n    return {\n      items: 1,\n      width: this.width,\n      height: this.height,\n      depth: this.history,\n    };\n  }\n\n  getActiveDimensions() {\n    return this.getDimensions();\n  }\n\n  make() {\n    let aspect;\n    this.parentRoot = this._inherit(\"root\");\n    this.rootSize = this.parentRoot.getSize();\n\n    this._listen(this.parentRoot, \"root.pre\", this.pre);\n    this._listen(this.parentRoot, \"root.update\", this.update);\n    this._listen(this.parentRoot, \"root.render\", this.render);\n    this._listen(this.parentRoot, \"root.post\", this.post);\n    this._listen(this.parentRoot, \"root.camera\", this.setCamera);\n    this._listen(this.parentRoot, \"root.resize\", function (event) {\n      return this.resize(event.size);\n    });\n\n    if (this.rootSize == null) {\n      return;\n    }\n\n    const { minFilter, magFilter, type } = this.props;\n\n    const { width, height, history, size } = this.props;\n\n    const relativeSize =\n      size === this.node.attributes[\"rtt.size\"].enum.relative;\n    const widthFactor = relativeSize ? this.rootSize.renderWidth : 1;\n    const heightFactor = relativeSize ? this.rootSize.renderHeight : 1;\n\n    this.width = Math.round(\n      width != null ? width * widthFactor : this.rootSize.renderWidth\n    );\n    this.height = Math.round(\n      height != null ? height * heightFactor : this.rootSize.renderHeight\n    );\n    this.history = history;\n    this.aspect = aspect = this.width / this.height;\n\n    if (this.scene == null) {\n      this.scene = this._renderables.make(\"scene\");\n    }\n    this.rtt = this._renderables.make(\"renderToTexture\", {\n      scene: this.scene,\n      camera: this._context.defaultCamera,\n      width: this.width,\n      height: this.height,\n      frames: this.history,\n      minFilter,\n      magFilter,\n      type,\n    });\n\n    aspect = width || height ? aspect : this.rootSize.aspect;\n    const viewWidth = width != null ? width : this.rootSize.viewWidth;\n    const viewHeight = height != null ? height : this.rootSize.viewHeight;\n\n    return (this.size = {\n      renderWidth: this.width,\n      renderHeight: this.height,\n      aspect,\n      viewWidth,\n      viewHeight,\n      pixelRatio: this.height / viewHeight,\n    });\n  }\n\n  made() {\n    // Notify of buffer reallocation\n    this.trigger({\n      type: \"source.rebuild\",\n    });\n\n    if (this.size) {\n      return this.trigger({\n        type: \"root.resize\",\n        size: this.size,\n      });\n    }\n  }\n\n  unmake(rebuild) {\n    if (this.rtt == null) {\n      return;\n    }\n\n    this.rtt.dispose();\n    if (!rebuild) {\n      this.scene.dispose();\n    }\n\n    return (this.rtt = this.width = this.height = this.history = null);\n  }\n\n  change(changed, touched, init) {\n    if (touched[\"texture\"] || changed[\"rtt.width\"] || changed[\"rtt.height\"]) {\n      return this.rebuild();\n    }\n\n    if (changed[\"root.camera\"] || init) {\n      this._unattach();\n      this._attach(\n        this.props.camera,\n        \"camera\",\n        this.setCamera,\n        this,\n        this,\n        true\n      );\n      return this.setCamera();\n    }\n  }\n\n  adopt(renderable) {\n    return Array.from(renderable.renders).map((object) =>\n      this.scene.add(object)\n    );\n  }\n  unadopt(renderable) {\n    return Array.from(renderable.renders).map((object) =>\n      this.scene.remove(object)\n    );\n  }\n\n  resize(size) {\n    let height, width;\n    this.rootSize = size;\n\n    ({ width, height, size } = this.props);\n    const relativeSize =\n      size === this.node.attributes[\"rtt.size\"].enum.relative;\n\n    if (!this.rtt || width == null || height == null || relativeSize) {\n      return this.rebuild();\n    }\n  }\n\n  select(selector) {\n    return this._root.node.model.select(selector, [this.node]);\n  }\n\n  watch(selector, handler) {\n    return this._root.node.model.watch(selector, handler);\n  }\n\n  unwatch(handler) {\n    return this._root.node.model.unwatch(handler);\n  }\n\n  pre(e) {\n    return this.trigger(e);\n  }\n  update(e) {\n    let camera;\n    if ((camera = this.getOwnCamera()) != null) {\n      camera.aspect = this.aspect || 1;\n      camera.updateProjectionMatrix();\n    }\n    return this.trigger(e);\n  }\n  render(e) {\n    this.trigger(e);\n    return this.rtt != null ? this.rtt.render(this.getCamera()) : undefined;\n  }\n  post(e) {\n    return this.trigger(e);\n  }\n\n  setCamera() {\n    const camera = __guard__(\n      this.select(this.props.camera)[0],\n      (x) => x.controller\n    );\n    if (this.camera !== camera) {\n      this.camera = camera;\n      this.rtt.camera = this.getCamera();\n      return this.trigger({ type: \"root.camera\" });\n    } else if (!this.camera) {\n      return this.trigger({ type: \"root.camera\" });\n    }\n  }\n\n  getOwnCamera() {\n    return this.camera != null ? this.camera.getCamera() : undefined;\n  }\n  getCamera() {\n    let left;\n    return (left = this.getOwnCamera()) != null\n      ? left\n      : this._inherit(\"root\").getCamera();\n  }\n\n  // End transform chain here\n  vertex(shader, pass) {\n    if (pass === 2) {\n      return shader.pipe(\"view.position\");\n    }\n    if (pass === 3) {\n      return shader.pipe(\"root.position\");\n    }\n    return shader;\n  }\n}\nRTT.initClass();\n\nfunction __guard__(value, transform) {\n  return typeof value !== \"undefined\" && value !== null\n    ? transform(value)\n    : undefined;\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Primitive } from \"../../primitive.js\";\n\nexport class Compose extends Primitive {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"bind\",\n      \"object\",\n      \"visible\",\n      \"operator\",\n      \"style\",\n      \"compose\",\n    ];\n    this.defaults = {\n      zWrite: false,\n      zTest: false,\n      color: \"#ffffff\",\n    };\n  }\n\n  init() {\n    return (this.compose = null);\n  }\n\n  //rebuild: () ->\n  //  console.log 'compose.rebuild', @node.get(null, true), @bind.source?\n  //  super()\n\n  resize() {\n    if (!this.compose || !this.bind.source) {\n      return;\n    }\n\n    const dims = this.bind.source.getActiveDimensions();\n    const { width } = dims;\n    const { height } = dims;\n\n    return this.remapUVScale.set(width, height);\n  }\n\n  make() {\n    // Bind to attached data sources\n    this._helpers.bind.make([{ to: \"operator.source\", trait: \"source\" }]);\n\n    if (this.bind.source == null) {\n      return;\n    }\n\n    // Prepare uniforms for remapping to absolute coords on the fly\n    const resampleUniforms = {\n      remapUVScale: this._attributes.make(this._types.vec2()),\n    };\n    this.remapUVScale = resampleUniforms.remapUVScale.value;\n\n    // Build fragment shader\n    let fragment = this._shaders.shader();\n    const { alpha } = this.props;\n\n    if (this.bind.source.is(\"image\")) {\n      // Sample image directly in 2D UV\n      fragment.pipe(\"screen.pass.uv\", resampleUniforms);\n      fragment = this.bind.source.imageShader(fragment);\n    } else {\n      // Sample data source in 4D\n      fragment.pipe(\"screen.map.xy\", resampleUniforms);\n      fragment = this.bind.source.sourceShader(fragment);\n    }\n\n    // Force pixels to solid if requested\n    if (!alpha) {\n      fragment.pipe(\"color.opaque\");\n    }\n\n    // Make screen renderable\n    const composeUniforms = this._helpers.style.uniforms();\n    this.compose = this._renderables.make(\"screen\", {\n      map: fragment,\n      uniforms: composeUniforms,\n      linear: true,\n    });\n\n    this._helpers.visible.make();\n    return this._helpers.object.make([this.compose]);\n  }\n\n  made() {\n    return this.resize();\n  }\n\n  unmake() {\n    this._helpers.bind.unmake();\n    this._helpers.visible.unmake();\n    return this._helpers.object.unmake();\n  }\n\n  change(changed, _touched, _init) {\n    if (changed[\"operator.source\"] || changed[\"compose.alpha\"]) {\n      return this.rebuild();\n    }\n  }\n}\nCompose.initClass();\n","export * from \"./rtt.js\";\nexport * from \"./compose.js\";\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { Transform } from \"../transform/transform.js\";\n\nexport class View extends Transform {\n  static initClass() {\n    this.traits = [\"node\", \"object\", \"visible\", \"view\", \"vertex\"];\n  }\n\n  make() {\n    return this._helpers.visible.make();\n  }\n\n  unmake() {\n    return this._helpers.visible.unmake();\n  }\n\n  axis(dimension) {\n    return this.props.range[dimension - 1];\n  }\n}\nView.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UThree from \"../../../util/three.js\";\nimport { View } from \"./view.js\";\n\nexport class Cartesian extends View {\n  static initClass() {\n    this.traits = [\"node\", \"object\", \"visible\", \"view\", \"view3\", \"vertex\"];\n  }\n\n  make() {\n    super.make();\n\n    this.uniforms = { viewMatrix: this._attributes.make(this._types.mat4()) };\n\n    this.viewMatrix = this.uniforms.viewMatrix.value;\n    this.composer = UThree.transformComposer();\n  }\n\n  unmake() {\n    super.unmake();\n\n    delete this.viewMatrix;\n    delete this.objectMatrix;\n    delete this.uniforms;\n  }\n\n  change(changed, touched, init) {\n    if (!touched[\"view\"] && !touched[\"view3\"] && !init) {\n      return;\n    }\n\n    const p = this.props.position;\n    const s = this.props.scale;\n    const q = this.props.quaternion;\n    const r = this.props.rotation;\n    const g = this.props.range;\n    const e = this.props.eulerOrder;\n\n    const { x } = g[0];\n    const y = g[1].x;\n    const z = g[2].x;\n    const dx = g[0].y - x || 1;\n    const dy = g[1].y - y || 1;\n    const dz = g[2].y - z || 1;\n\n    // Forward transform\n    this.viewMatrix.set(\n      2 / dx,\n      0,\n      0,\n      -(2 * x + dx) / dx,\n      0,\n      2 / dy,\n      0,\n      -(2 * y + dy) / dy,\n      0,\n      0,\n      2 / dz,\n      -(2 * z + dz) / dz,\n      0,\n      0,\n      0,\n      1\n    );\n\n    const transformMatrix = this.composer(p, r, q, s, null, e);\n    this.viewMatrix.multiplyMatrices(transformMatrix, this.viewMatrix);\n\n    if (changed[\"view.range\"]) {\n      this.trigger({\n        type: \"view.range\",\n      });\n    }\n  }\n\n  vertex(shader, pass) {\n    if (pass === 1) {\n      shader.pipe(\"cartesian.position\", this.uniforms);\n    }\n    return super.vertex(shader, pass);\n  }\n}\nCartesian.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { View } from \"./view.js\";\n\nexport class Cartesian4 extends View {\n  static initClass() {\n    this.traits = [\"node\", \"object\", \"visible\", \"view\", \"view4\", \"vertex\"];\n  }\n\n  make() {\n    super.make();\n\n    this.uniforms = {\n      basisOffset: this._attributes.make(this._types.vec4()),\n      basisScale: this._attributes.make(this._types.vec4()),\n    };\n\n    this.basisScale = this.uniforms.basisScale.value;\n    return (this.basisOffset = this.uniforms.basisOffset.value);\n  }\n\n  unmake() {\n    super.unmake();\n    delete this.basisScale;\n    delete this.basisOffset;\n    return delete this.uniforms;\n  }\n\n  change(changed, touched, init) {\n    if (!touched[\"view\"] && !touched[\"view4\"] && !init) {\n      return;\n    }\n\n    const p = this.props.position;\n    const s = this.props.scale;\n    const g = this.props.range;\n\n    const { x } = g[0];\n    const y = g[1].x;\n    const z = g[2].x;\n    const w = g[3].x;\n    const dx = g[0].y - x || 1;\n    const dy = g[1].y - y || 1;\n    const dz = g[2].y - z || 1;\n    const dw = g[3].y - w || 1;\n\n    const mult = function (a, b) {\n      a.x *= b.x;\n      a.y *= b.y;\n      a.z *= b.z;\n      return (a.w *= b.w);\n    };\n\n    // 4D axis adjustment\n    this.basisScale.set(2 / dx, 2 / dy, 2 / dz, 2 / dw);\n    this.basisOffset.set(\n      -(2 * x + dx) / dx,\n      -(2 * y + dy) / dy,\n      -(2 * z + dz) / dz,\n      -(2 * w + dw) / dw\n    );\n\n    // 4D scale\n    mult(this.basisScale, s);\n    mult(this.basisOffset, s);\n\n    // 4D position\n    this.basisOffset.add(p);\n\n    if (changed[\"view.range\"]) {\n      return this.trigger({\n        type: \"view.range\",\n      });\n    }\n  }\n\n  vertex(shader, pass) {\n    if (pass === 1) {\n      shader.pipe(\"cartesian4.position\", this.uniforms);\n    }\n    return super.vertex(shader, pass);\n  }\n}\nCartesian4.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UAxis from \"../../../util/axis.js\";\nimport * as UThree from \"../../../util/three.js\";\n\nimport { Vector2 } from \"three/src/math/Vector2.js\";\nimport { View } from \"./view.js\";\n\nexport class Polar extends View {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"object\",\n      \"visible\",\n      \"view\",\n      \"view3\",\n      \"polar\",\n      \"vertex\",\n    ];\n  }\n\n  make() {\n    super.make();\n\n    const { types } = this._attributes;\n    this.uniforms = {\n      polarBend: this.node.attributes[\"polar.bend\"],\n      polarHelix: this.node.attributes[\"polar.helix\"],\n      polarFocus: this._attributes.make(types.number()),\n      polarAspect: this._attributes.make(types.number()),\n      viewMatrix: this._attributes.make(types.mat4()),\n    };\n\n    this.viewMatrix = this.uniforms.viewMatrix.value;\n    this.composer = UThree.transformComposer();\n\n    return (this.aspect = 1);\n  }\n\n  unmake() {\n    super.unmake();\n\n    delete this.viewMatrix;\n    delete this.objectMatrix;\n    delete this.aspect;\n    return delete this.uniforms;\n  }\n\n  change(changed, touched, init) {\n    let aspect, bend, focus;\n    if (!touched[\"view\"] && !touched[\"view3\"] && !touched[\"polar\"] && !init) {\n      return;\n    }\n\n    this.helix = this.props.helix;\n    this.bend = bend = this.props.bend;\n\n    this.focus = focus = bend > 0 ? 1 / bend - 1 : 0;\n\n    const p = this.props.position;\n    const s = this.props.scale;\n    const q = this.props.quaternion;\n    const r = this.props.rotation;\n    const g = this.props.range;\n    const e = this.props.eulerOrder;\n\n    const { x } = g[0];\n    let y = g[1].x;\n    const z = g[2].x;\n    const dx = g[0].y - x || 1;\n    let dy = g[1].y - y || 1;\n    const dz = g[2].y - z || 1;\n    const sx = s.x;\n    const sy = s.y;\n\n    // Watch for negative scales.\n    const idx = dx > 0 ? 1 : -1;\n\n    // Recenter viewport on origin the more it's bent\n    [y, dy] = Array.from(UAxis.recenterAxis(y, dy, bend));\n\n    // Adjust viewport range for polar transform.\n    // As the viewport goes polar, the X-range is interpolated to the Y-range instead,\n    // creating a square/circular viewport.\n    const ady = Math.abs(dy);\n    const fdx = dx + (ady * idx - dx) * bend;\n    const sdx = fdx / sx;\n    const sdy = dy / sy;\n    this.aspect = aspect = Math.abs(sdx / sdy);\n\n    this.uniforms.polarFocus.value = focus;\n    this.uniforms.polarAspect.value = aspect;\n\n    // Forward transform\n    this.viewMatrix.set(\n      2 / fdx,\n      0,\n      0,\n      -(2 * x + dx) / dx,\n      0,\n      2 / dy,\n      0,\n      -(2 * y + dy) / dy,\n      0,\n      0,\n      2 / dz,\n      -(2 * z + dz) / dz,\n      0,\n      0,\n      0,\n      1 //,\n    );\n\n    const transformMatrix = this.composer(p, r, q, s, null, e);\n    this.viewMatrix.multiplyMatrices(transformMatrix, this.viewMatrix);\n\n    if (changed[\"view.range\"] || touched[\"polar\"]) {\n      this.trigger({\n        type: \"view.range\",\n      });\n    }\n  }\n\n  vertex(shader, pass) {\n    if (pass === 1) {\n      shader.pipe(\"polar.position\", this.uniforms);\n    }\n    return super.vertex(shader, pass);\n  }\n\n  axis(dimension) {\n    const range = this.props.range[dimension - 1];\n    let min = range.x;\n    let max = range.y;\n\n    // Correct Y extents during polar warp.\n    if (dimension === 2 && this.bend > 0) {\n      max = Math.max(Math.abs(max), Math.abs(min));\n      min = Math.max(-this.focus / this.aspect, min);\n    }\n\n    return new Vector2(min, max);\n  }\n}\nPolar.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UAxis from \"../../../util/axis.js\";\nimport * as UThree from \"../../../util/three.js\";\n\nimport { Vector2 } from \"three/src/math/Vector2.js\";\nimport { View } from \"./view.js\";\n\nexport class Spherical extends View {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"object\",\n      \"visible\",\n      \"view\",\n      \"view3\",\n      \"spherical\",\n      \"vertex\",\n    ];\n  }\n\n  make() {\n    super.make();\n\n    this.uniforms = {\n      sphericalBend: this.node.attributes[\"spherical.bend\"],\n      sphericalFocus: this._attributes.make(this._types.number()),\n      sphericalAspectX: this._attributes.make(this._types.number()),\n      sphericalAspectY: this._attributes.make(this._types.number()),\n      sphericalScaleY: this._attributes.make(this._types.number()),\n      viewMatrix: this._attributes.make(this._types.mat4()),\n    };\n\n    this.viewMatrix = this.uniforms.viewMatrix.value;\n    this.composer = UThree.transformComposer();\n\n    this.aspectX = 1;\n    return (this.aspectY = 1);\n  }\n\n  unmake() {\n    super.unmake();\n\n    delete this.viewMatrix;\n    delete this.objectMatrix;\n    delete this.aspectX;\n    delete this.aspectY;\n    return delete this.uniforms;\n  }\n\n  change(changed, touched, init) {\n    let aspectX, aspectY, bend, focus, scaleY;\n    if (\n      !touched[\"view\"] &&\n      !touched[\"view3\"] &&\n      !touched[\"spherical\"] &&\n      !init\n    ) {\n      return;\n    }\n\n    this.bend = bend = this.props.bend;\n    this.focus = focus = bend > 0 ? 1 / bend - 1 : 0;\n\n    const p = this.props.position;\n    const s = this.props.scale;\n    const q = this.props.quaternion;\n    const r = this.props.rotation;\n    const g = this.props.range;\n    const e = this.props.eulerOrder;\n\n    const { x } = g[0];\n    let y = g[1].x;\n    let z = g[2].x;\n    const dx = g[0].y - x || 1;\n    let dy = g[1].y - y || 1;\n    let dz = g[2].y - z || 1;\n    const sx = s.x;\n    const sy = s.y;\n    const sz = s.z;\n\n    // Recenter viewport on origin the more it's bent\n    [y, dy] = Array.from(UAxis.recenterAxis(y, dy, bend));\n    [z, dz] = Array.from(UAxis.recenterAxis(z, dz, bend));\n\n    // Watch for negative scales.\n    const idx = dx > 0 ? 1 : -1;\n    const idy = dy > 0 ? 1 : -1;\n\n    // Adjust viewport range for spherical transform.\n    // As the viewport goes spherical, the X/Y-ranges are interpolated to the Z-range,\n    // creating a perfectly spherical viewport.\n    const adz = Math.abs(dz);\n    const fdx = dx + (adz * idx - dx) * bend;\n    const fdy = dy + (adz * idy - dy) * bend;\n    const sdx = fdx / sx;\n    const sdy = fdy / sy;\n    const sdz = dz / sz;\n    this.aspectX = aspectX = Math.abs(sdx / sdz);\n    this.aspectY = aspectY = Math.abs(sdy / sdz / aspectX);\n\n    // Scale Y coordinates before transforming, but cap at aspectY/alpha to prevent from poking through the poles mid-transform.\n    // See shaders/glsl/spherical.position.glsl\n    const aspectZ = (((dy / dx) * sx) / sy) * 2; // Factor of 2 due to the fact that in the Y direction we only go 180º from pole to pole.\n    this.scaleY = scaleY = Math.min(aspectY / bend, 1 + (aspectZ - 1) * bend);\n\n    this.uniforms.sphericalBend.value = bend;\n    this.uniforms.sphericalFocus.value = focus;\n    this.uniforms.sphericalAspectX.value = aspectX;\n    this.uniforms.sphericalAspectY.value = aspectY;\n    this.uniforms.sphericalScaleY.value = scaleY;\n\n    // Forward transform\n    this.viewMatrix.set(\n      2 / fdx,\n      0,\n      0,\n      -(2 * x + dx) / dx,\n      0,\n      2 / fdy,\n      0,\n      -(2 * y + dy) / dy,\n      0,\n      0,\n      2 / dz,\n      -(2 * z + dz) / dz,\n      0,\n      0,\n      0,\n      1 //,\n    );\n\n    const transformMatrix = this.composer(p, r, q, s, null, e);\n    this.viewMatrix.multiplyMatrices(transformMatrix, this.viewMatrix);\n\n    if (changed[\"view.range\"] || touched[\"spherical\"]) {\n      return this.trigger({\n        type: \"view.range\",\n      });\n    }\n  }\n\n  vertex(shader, pass) {\n    if (pass === 1) {\n      shader.pipe(\"spherical.position\", this.uniforms);\n    }\n    return super.vertex(shader, pass);\n  }\n\n  axis(dimension) {\n    const range = this.props.range[dimension - 1];\n    let min = range.x;\n    let max = range.y;\n\n    // Correct Z extents during polar warp.\n    if (dimension === 3 && this.bend > 0) {\n      max = Math.max(Math.abs(max), Math.abs(min));\n      min = Math.max(-this.focus / this.aspectX + 0.001, min);\n    }\n\n    return new Vector2(min, max);\n  }\n}\nSpherical.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UAxis from \"../../../util/axis.js\";\nimport * as UThree from \"../../../util/three.js\";\n\nimport { View } from \"./view.js\";\n\nexport class Stereographic extends View {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"object\",\n      \"visible\",\n      \"view\",\n      \"view3\",\n      \"stereographic\",\n      \"vertex\",\n    ];\n  }\n\n  make() {\n    super.make();\n\n    this.uniforms = {\n      stereoBend: this.node.attributes[\"stereographic.bend\"],\n      viewMatrix: this._attributes.make(this._types.mat4()),\n    };\n\n    this.viewMatrix = this.uniforms.viewMatrix.value;\n    return (this.composer = UThree.transformComposer());\n  }\n\n  unmake() {\n    super.unmake();\n\n    delete this.viewMatrix;\n    delete this.rotationMatrix;\n    return delete this.uniforms;\n  }\n\n  change(changed, touched, init) {\n    let bend;\n    if (\n      !touched[\"view\"] &&\n      !touched[\"view3\"] &&\n      !touched[\"stereographic\"] &&\n      !init\n    ) {\n      return;\n    }\n\n    this.bend = bend = this.props.bend;\n\n    const p = this.props.position;\n    const s = this.props.scale;\n    const q = this.props.quaternion;\n    const r = this.props.rotation;\n    const g = this.props.range;\n    const e = this.props.eulerOrder;\n\n    const { x } = g[0];\n    const y = g[1].x;\n    let z = g[2].x;\n    const dx = g[0].y - x || 1;\n    const dy = g[1].y - y || 1;\n    let dz = g[2].y - z || 1;\n\n    // Recenter viewport on projection point the more it's bent\n    [z, dz] = Array.from(UAxis.recenterAxis(z, dz, bend, 1));\n\n    this.uniforms.stereoBend.value = bend;\n\n    // Forward transform\n    this.viewMatrix.set(\n      2 / dx,\n      0,\n      0,\n      -(2 * x + dx) / dx,\n      0,\n      2 / dy,\n      0,\n      -(2 * y + dy) / dy,\n      0,\n      0,\n      2 / dz,\n      -(2 * z + dz) / dz,\n      0,\n      0,\n      0,\n      1 //,\n    );\n\n    const transformMatrix = this.composer(p, r, q, s, null, e);\n    this.viewMatrix.multiplyMatrices(transformMatrix, this.viewMatrix);\n\n    if (changed[\"view.range\"] || touched[\"stereographic\"]) {\n      return this.trigger({\n        type: \"view.range\",\n      });\n    }\n  }\n\n  vertex(shader, pass) {\n    if (pass === 1) {\n      shader.pipe(\"stereographic.position\", this.uniforms);\n    }\n    return super.vertex(shader, pass);\n  }\n}\nStereographic.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UAxis from \"../../../util/axis.js\";\n\nimport { View } from \"./view.js\";\n\nexport class Stereographic4 extends View {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"object\",\n      \"visible\",\n      \"view\",\n      \"view4\",\n      \"stereographic\",\n      \"vertex\",\n    ];\n  }\n\n  make() {\n    super.make();\n\n    this.uniforms = {\n      basisOffset: this._attributes.make(this._types.vec4()),\n      basisScale: this._attributes.make(this._types.vec4()),\n      stereoBend: this.node.attributes[\"stereographic.bend\"],\n    };\n\n    this.basisScale = this.uniforms.basisScale.value;\n    this.basisOffset = this.uniforms.basisOffset.value;\n  }\n\n  unmake() {\n    super.unmake();\n\n    delete this.basisScale;\n    delete this.basisOffset;\n    delete this.uniforms;\n  }\n\n  change(changed, touched, init) {\n    let bend;\n    if (\n      !touched[\"view\"] &&\n      !touched[\"view4\"] &&\n      !touched[\"stereographic\"] &&\n      !init\n    ) {\n      return;\n    }\n\n    this.bend = bend = this.props.bend;\n\n    const p = this.props.position;\n    const s = this.props.scale;\n    const g = this.props.range;\n\n    const { x } = g[0];\n    const y = g[1].x;\n    const z = g[2].x;\n    let w = g[3].x;\n    const dx = g[0].y - x || 1;\n    const dy = g[1].y - y || 1;\n    const dz = g[2].y - z || 1;\n    let dw = g[3].y - w || 1;\n\n    const mult = function (a, b) {\n      a.x *= b.x;\n      a.y *= b.y;\n      a.z *= b.z;\n      a.w *= b.w;\n    };\n\n    // Recenter viewport on projection point the more it's bent\n    [w, dw] = Array.from(UAxis.recenterAxis(w, dw, bend, 1));\n\n    // 4D axis adjustment\n    this.basisScale.set(2 / dx, 2 / dy, 2 / dz, 2 / dw);\n    this.basisOffset.set(\n      -(2 * x + dx) / dx,\n      -(2 * y + dy) / dy,\n      -(2 * z + dz) / dz,\n      -(2 * w + dw) / dw\n    );\n\n    // 4D scale\n    mult(this.basisScale, s);\n    mult(this.basisOffset, s);\n\n    // 4D position\n    this.basisOffset.add(p);\n\n    if (changed[\"view.range\"] || touched[\"stereographic\"]) {\n      this.trigger({\n        type: \"view.range\",\n      });\n    }\n  }\n\n  vertex(shader, pass) {\n    if (pass === 1) {\n      shader.pipe(\"stereographic4.position\", this.uniforms);\n    }\n    return super.vertex(shader, pass);\n  }\n}\nStereographic4.initClass();\n","export * from \"./view.js\";\nexport * from \"./cartesian.js\";\nexport * from \"./cartesian4.js\";\nexport * from \"./polar.js\";\nexport * from \"./spherical.js\";\nexport * from \"./stereographic.js\";\nexport * from \"./stereographic4.js\";\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Primitive } from \"../../primitive.js\";\n\nexport class Shader extends Primitive {\n  static initClass() {\n    this.traits = [\"node\", \"bind\", \"shader\"];\n    this.freeform = true;\n  }\n\n  init() {\n    return (this.shader = null);\n  }\n\n  make() {\n    const { language, code } = this.props;\n    if (language !== \"glsl\") {\n      throw new Error(\"GLSL required\");\n    }\n\n    // Bind to attached data sources\n    this._helpers.bind.make([\n      { to: \"shader.sources\", trait: \"source\", multiple: true },\n    ]);\n\n    // Parse snippet w/ shadergraph (will do implicit DOM script tag by ID\n    // lookup if simple selector or ID given)\n    const snippet = this._shaders.fetch(code);\n\n    // Convert uniforms to attributes\n    const types = this._types;\n    const uniforms = {};\n    const make = (type) => {\n      let t;\n      switch (type) {\n        case \"i\":\n          return types.int();\n        case \"f\":\n          return types.number();\n        case \"v2\":\n          return types.vec2();\n        case \"v3\":\n          return types.vec3();\n        case \"v4\":\n          return types.vec4();\n        case \"m3\":\n          return types.mat3();\n        case \"m4\":\n          return types.mat4();\n        case \"t\":\n          return types.object();\n        default:\n          t = type.split(\"\");\n          if (t.pop() === \"v\") {\n            return types.array(make(t.join(\"\")));\n          } else {\n            return null;\n          }\n      }\n    };\n\n    for (const def of Array.from(snippet._signatures.uniform)) {\n      let type;\n      if ((type = make(def.type))) {\n        uniforms[def.name] = type;\n      }\n    }\n\n    // Reconfigure node model\n    return this.reconfigure({ props: { uniform: uniforms } });\n  }\n\n  made() {\n    // Notify of shader reallocation\n    return this.trigger({\n      type: \"source.rebuild\",\n    });\n  }\n\n  unmake() {\n    return (this.shader = null);\n  }\n\n  change(changed, _touched, _init) {\n    if (\n      changed[\"shader.uniforms\"] ||\n      changed[\"shader.code\"] ||\n      changed[\"shader.language\"]\n    ) {\n      return this.rebuild();\n    }\n  }\n\n  shaderBind(uniforms) {\n    let k, u, v;\n    if (uniforms == null) {\n      uniforms = {};\n    }\n    const { code } = this.props;\n\n    // Merge in prop attributes as uniforms\n    for (k in this.node.attributes) {\n      v = this.node.attributes[k];\n      if (v.type != null && v.short != null && v.ns === \"uniform\") {\n        if (uniforms[v.short] == null) {\n          uniforms[v.short] = v;\n        }\n      }\n    }\n\n    // Merge in explicit uniform object if set\n    if ((u = this.props.uniforms) != null) {\n      for (k in u) {\n        v = u[k];\n        uniforms[k] = v;\n      }\n    }\n\n    // New shader\n    const s = this._shaders.shader();\n\n    // Require sources\n    if (this.bind.sources != null) {\n      for (const source of Array.from(this.bind.sources)) {\n        s.require(source.sourceShader(this._shaders.shader()));\n      }\n    }\n\n    // Build bound shader\n    return s.pipe(code, uniforms);\n  }\n}\nShader.initClass();\n","export * from \"./shader.js\";\n","/* eslint-disable sort-imports */\nimport { Group, Inherit, Root, Unit } from \"./base\";\nimport { Camera } from \"./camera\";\nimport { Area, Array_, Interval, Matrix, Scale, Volume, Voxel } from \"./data\";\nimport {\n  Axis,\n  Face,\n  Grid,\n  Line,\n  Point,\n  Strip,\n  Surface,\n  Ticks,\n  Vector,\n} from \"./draw\";\nimport { DOM, HTML } from \"./overlay\";\nimport { Format, Label, Retext, Text } from \"./text\";\nimport { Clock, Now } from \"./time\";\nimport {\n  Fragment,\n  Layer,\n  Mask,\n  Transform3,\n  Transform4,\n  Vertex,\n} from \"./transform\";\nimport {\n  Clamp,\n  Grow,\n  Join,\n  Lerp,\n  Memo,\n  Readback,\n  Repeat,\n  Resample,\n  Slice,\n  Split,\n  Spread,\n  Subdivide,\n  Swizzle,\n  Transpose,\n} from \"./operator\";\nimport { Move, Play, Present, Reveal, Slide, Step } from \"./present\";\nimport { Compose, RTT } from \"./rtt\";\nimport {\n  Cartesian,\n  Cartesian4,\n  Polar,\n  Spherical,\n  Stereographic,\n  Stereographic4,\n  View,\n} from \"./view\";\n\nimport { Shader } from \"./shader\";\n\nexport const Classes = {\n  axis: Axis,\n  face: Face,\n  grid: Grid,\n  line: Line,\n  point: Point,\n  strip: Strip,\n  surface: Surface,\n  ticks: Ticks,\n  vector: Vector,\n\n  view: View,\n  cartesian: Cartesian,\n  cartesian4: Cartesian4,\n  polar: Polar,\n  spherical: Spherical,\n  stereographic: Stereographic,\n  stereographic4: Stereographic4,\n\n  transform: Transform3,\n  transform4: Transform4,\n  vertex: Vertex,\n  fragment: Fragment,\n  layer: Layer,\n  mask: Mask,\n\n  array: Array_,\n  interval: Interval,\n  matrix: Matrix,\n  area: Area,\n  voxel: Voxel,\n  volume: Volume,\n  scale: Scale,\n\n  html: HTML,\n  dom: DOM,\n\n  text: Text,\n  format: Format,\n  label: Label,\n  retext: Retext,\n\n  clamp: Clamp,\n  grow: Grow,\n  join: Join,\n  lerp: Lerp,\n  memo: Memo,\n  readback: Readback,\n  resample: Resample,\n  repeat: Repeat,\n  swizzle: Swizzle,\n  spread: Spread,\n  split: Split,\n  slice: Slice,\n  subdivide: Subdivide,\n  transpose: Transpose,\n\n  group: Group,\n  inherit: Inherit,\n  root: Root,\n  unit: Unit,\n\n  shader: Shader,\n\n  camera: Camera,\n\n  rtt: RTT,\n  compose: Compose,\n\n  clock: Clock,\n  now: Now,\n\n  move: Move,\n  play: Play,\n  present: Present,\n  reveal: Reveal,\n  slide: Slide,\n  step: Step,\n};\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining\n * DS104: Avoid inline assignments\n * DS202: Simplify dynamic range loops\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UData from \"../../util/data.js\";\nimport * as UJS from \"../../util/js.js\";\n\nimport {\n  ByteType,\n  FloatType,\n  IntType,\n  LinearFilter,\n  LinearMipMapLinearFilter,\n  LinearMipMapNearestFilter,\n  NearestFilter,\n  NearestMipMapLinearFilter,\n  NearestMipMapNearestFilter,\n  ShortType,\n  UnsignedByteType,\n  UnsignedIntType,\n  UnsignedShortType,\n} from \"three/src/constants.js\";\nimport { Color } from \"three/src/math/Color.js\";\nimport { Matrix3 } from \"three/src/math/Matrix3.js\";\nimport { Matrix4 } from \"three/src/math/Matrix4.js\";\nimport { Quaternion } from \"three/src/math/Quaternion.js\";\nimport { Vector2 } from \"three/src/math/Vector2.js\";\nimport { Vector3 } from \"three/src/math/Vector3.js\";\nimport { Vector4 } from \"three/src/math/Vector4.js\";\n\n// Property types\n//\n// The weird calling convention is for double-buffering the values\n// while validating compound types like arrays and nullables.\n//\n// validate: (value, target, invalid) ->\n//\n//   # Option 1: Call invalid() to reject\n//   return invalid() if value < 0\n//\n//   # Option 2: Change target in-place\n//   target.set(value)\n//   return target\n//\n//   # Option 3: Return new value\n//   return +value\n//\nconst _Types = {\n  array(type, size, value = null) {\n    const lerp = type.lerp\n      ? function (a, b, target, f) {\n          const l = Math.min(a.length, b.length);\n          for (\n            let i = 0, end = l, asc = 0 <= end;\n            asc ? i < end : i > end;\n            asc ? i++ : i--\n          ) {\n            target[i] = type.lerp(a[i], b[i], target[i], f);\n          }\n          return target;\n        }\n      : undefined;\n\n    const op = type.op\n      ? function (a, b, target, op) {\n          const l = Math.min(a.length, b.length);\n          for (\n            let i = 0, end = l, asc = 0 <= end;\n            asc ? i < end : i > end;\n            asc ? i++ : i--\n          ) {\n            target[i] = type.op(a[i], b[i], target[i], op);\n          }\n          return target;\n        }\n      : undefined;\n\n    if (value != null && !(value instanceof Array)) {\n      value = [value];\n    }\n\n    return {\n      uniform() {\n        if (type.uniform) {\n          return type.uniform() + \"v\";\n        } else {\n          return undefined;\n        }\n      },\n      make() {\n        if (value != null) {\n          return value.slice();\n        }\n        if (!size) {\n          return [];\n        }\n        return __range__(0, size, false).map((_i) => type.make());\n      },\n      validate(value, target, invalid) {\n        if (!(value instanceof Array)) {\n          value = [value];\n        }\n\n        const l = (target.length = size ? size : value.length);\n        for (\n          let i = 0, end = l, asc = 0 <= end;\n          asc ? i < end : i > end;\n          asc ? i++ : i--\n        ) {\n          const input = value[i] != null ? value[i] : type.make();\n          target[i] = type.validate(input, target[i], invalid);\n        }\n\n        return target;\n      },\n      equals(a, b) {\n        const al = a.length;\n        const bl = b.length;\n        if (al !== bl) {\n          return false;\n        }\n\n        const l = Math.min(al, bl);\n        for (\n          let i = 0, end = l, asc = 0 <= end;\n          asc ? i < end : i > end;\n          asc ? i++ : i--\n        ) {\n          if (\n            !(typeof type.equals === \"function\"\n              ? type.equals(a[i], b[i])\n              : undefined)\n          ) {\n            return false;\n          }\n        }\n        return true;\n      },\n      lerp,\n      op,\n      clone(v) {\n        return Array.from(v).map((x) => type.clone(x));\n      },\n    };\n  },\n\n  letters(type, size, value = null) {\n    if (value != null) {\n      if (value === \"\" + value) {\n        value = value.split(\"\");\n      }\n      for (let i = 0; i < value.length; i++) {\n        const v = value[i];\n        value[i] = type.validate(v, v);\n      }\n    }\n\n    const array = Types.array(type, size, value);\n\n    return {\n      uniform() {\n        return array.uniform();\n      },\n      make() {\n        return array.make();\n      },\n      validate(value, target, invalid) {\n        if (value === \"\" + value) {\n          value = value.split(\"\");\n        }\n        return array.validate(value, target, invalid);\n      },\n      equals(a, b) {\n        return array.equals(a, b);\n      },\n      clone: array.clone,\n    };\n  },\n\n  nullable(type, make) {\n    if (make == null) {\n      make = false;\n    }\n    let value = make ? type.make() : null;\n\n    const emitter = type.emitter\n      ? function (expr1, expr2) {\n          if (expr2 == null) {\n            return expr1;\n          }\n          if (expr1 == null) {\n            return expr2;\n          }\n          return type.emitter(expr1, expr2);\n        }\n      : undefined;\n\n    const lerp = type.lerp\n      ? function (a, b, target, f) {\n          if (a === null || b === null) {\n            if (f < 0.5) {\n              return a;\n            } else {\n              return b;\n            }\n          }\n          if (target == null) {\n            target = type.make();\n          }\n          value = type.lerp(a, b, target, f);\n          return target;\n        }\n      : undefined;\n\n    const op = type.op\n      ? function (a, b, target, op) {\n          if (a === null || b === null) {\n            return null;\n          }\n          if (target == null) {\n            target = type.make();\n          }\n          value = type.op(a, b, target, op);\n          return value;\n        }\n      : undefined;\n\n    return {\n      make() {\n        return value;\n      },\n      validate(value, target, invalid) {\n        if (value === null) {\n          return value;\n        }\n        if (target === null) {\n          target = type.make();\n        }\n        return type.validate(value, target, invalid);\n      },\n      uniform() {\n        return typeof type.uniform === \"function\" ? type.uniform() : undefined;\n      },\n      equals(a, b) {\n        let left;\n        const an = a === null;\n        const bn = b === null;\n        if (an && bn) {\n          return true;\n        }\n        if (an ^ bn) {\n          return false;\n        }\n        return (left =\n          typeof type.equals === \"function\" ? type.equals(a, b) : undefined) !=\n          null\n          ? left\n          : a === b;\n      },\n      lerp,\n      op,\n      emitter,\n    };\n  },\n\n  enum(value, keys, map) {\n    let key;\n    if (keys == null) {\n      keys = [];\n    }\n    if (map == null) {\n      map = {};\n    }\n    let i = 0;\n    const values = {};\n    for (key of Array.from(keys)) {\n      if (key !== +key) {\n        if (map[key] == null) {\n          map[key] = i++;\n        }\n      }\n    }\n    for (key of Array.from(keys)) {\n      if (key === +key) {\n        values[key] = key;\n      }\n    }\n    for (key in map) {\n      i = map[key];\n      values[i] = true;\n    }\n\n    if (values[value] == null) {\n      value = map[value];\n    }\n\n    return {\n      enum() {\n        return map;\n      },\n      make() {\n        return value;\n      },\n      validate(value, target, invalid) {\n        const v = values[value] ? value : map[value];\n        if (v != null) {\n          return v;\n        }\n        return invalid();\n      },\n    };\n  },\n\n  enumber(value, keys, map) {\n    if (map == null) {\n      map = {};\n    }\n    const _enum = Types.enum(value, keys, map);\n\n    return {\n      enum: _enum.enum,\n      uniform() {\n        return \"f\";\n      },\n      make() {\n        let left;\n        return (left = _enum.make()) != null ? left : +value;\n      },\n      validate(value, target, invalid) {\n        if (value === +value) {\n          return value;\n        }\n        return _enum.validate(value, target, invalid);\n      },\n      op(a, b, target, op) {\n        return op(a, b);\n      },\n    };\n  },\n\n  select(value) {\n    if (value == null) {\n      value = \"<\";\n    }\n    value;\n    return {\n      make() {\n        return value;\n      },\n      validate(value, target, invalid) {\n        if (typeof value === \"string\") {\n          return value;\n        }\n        if (typeof value === \"object\") {\n          return value;\n        }\n        return invalid();\n      },\n    };\n  },\n\n  bool(value) {\n    value = !!value;\n    return {\n      uniform() {\n        return \"f\";\n      },\n      make() {\n        return value;\n      },\n      validate(value, _target, _invalid) {\n        return !!value;\n      },\n    };\n  },\n\n  int(value) {\n    if (value == null) {\n      value = 0;\n    }\n    value = +Math.round(value);\n    return {\n      uniform() {\n        return \"i\";\n      },\n      make() {\n        return value;\n      },\n      validate(value, target, invalid) {\n        let x;\n        if (value !== (x = +value)) {\n          return invalid();\n        }\n        return Math.round(x) || 0;\n      },\n      op(a, b, target, op) {\n        return op(a, b);\n      },\n    };\n  },\n\n  round(value) {\n    if (value == null) {\n      value = 0;\n    }\n    value = +Math.round(value);\n    return {\n      uniform() {\n        return \"f\";\n      },\n      make() {\n        return value;\n      },\n      validate(value, target, invalid) {\n        let x;\n        if (value !== (x = +value)) {\n          return invalid();\n        }\n        return Math.round(x) || 0;\n      },\n      op(a, b, target, op) {\n        return op(a, b);\n      },\n    };\n  },\n\n  number(value) {\n    if (value == null) {\n      value = 0;\n    }\n    return {\n      uniform() {\n        return \"f\";\n      },\n      make() {\n        return +value;\n      },\n      validate(value, target, invalid) {\n        let x;\n        if (value !== (x = +value)) {\n          return invalid();\n        }\n        return x || 0;\n      },\n      op(a, b, target, op) {\n        return op(a, b);\n      },\n    };\n  },\n\n  positive(type, strict) {\n    if (strict == null) {\n      strict = false;\n    }\n    return {\n      uniform: type.uniform,\n      make: type.make,\n      validate(value, target, invalid) {\n        value = type.validate(value, target, invalid);\n        if (value < 0 || (strict && value <= 0)) {\n          return invalid();\n        }\n        return value;\n      },\n      op(a, b, target, op) {\n        return op(a, b);\n      },\n    };\n  },\n\n  string(value) {\n    if (value == null) {\n      value = \"\";\n    }\n    return {\n      make() {\n        return \"\" + value;\n      },\n      validate(value, target, invalid) {\n        let x;\n        if (value !== (x = \"\" + value)) {\n          return invalid();\n        }\n        return x;\n      },\n    };\n  },\n\n  func() {\n    return {\n      make() {\n        return function () {};\n      },\n      validate(value, target, invalid) {\n        if (typeof value === \"function\") {\n          return value;\n        }\n        return invalid();\n      },\n    };\n  },\n\n  emitter() {\n    return {\n      make() {\n        return (emit) => emit(1, 1, 1, 1);\n      },\n      validate(value, target, invalid) {\n        if (typeof value === \"function\") {\n          return value;\n        }\n        return invalid();\n      },\n      emitter(a, b) {\n        return UData.getLerpEmitter(a, b);\n      },\n    };\n  },\n\n  object(value) {\n    return {\n      make() {\n        return value != null ? value : {};\n      },\n      validate(value, target, invalid) {\n        if (typeof value === \"object\") {\n          return value;\n        }\n        return invalid();\n      },\n      clone(v) {\n        return JSON.parse(JSON.stringify(v));\n      },\n    };\n  },\n\n  timestamp(value = null) {\n    if (typeof value === \"string\") {\n      value = Date.parse(value);\n    }\n\n    return {\n      uniform() {\n        return \"f\";\n      },\n      make() {\n        return value != null ? value : +new Date();\n      },\n      validate(value, target, invalid) {\n        value = Date.parse(value);\n        if (value !== +value) {\n          return invalid();\n        }\n        return value;\n      },\n      op(a, b, target, op) {\n        return op(a, b);\n      },\n    };\n  },\n\n  vec2(x, y) {\n    if (x == null) {\n      x = 0;\n    }\n    if (y == null) {\n      y = 0;\n    }\n    const defaults = [x, y];\n    return {\n      uniform() {\n        return \"v2\";\n      },\n      make() {\n        return new Vector2(x, y);\n      },\n      validate(value, target, invalid) {\n        if (value === +value) {\n          value = [value];\n        }\n\n        if (value instanceof Vector2) {\n          target.copy(value);\n        } else if (value instanceof Array) {\n          value = value.concat(defaults.slice(value.length));\n          target.set.apply(target, value);\n        } else if (value != null) {\n          const xx = value.x != null ? value.x : x;\n          const yy = value.y != null ? value.y : y;\n          target.set(xx, yy);\n        } else {\n          return invalid();\n        }\n        return target;\n      },\n\n      equals(a, b) {\n        return a.x === b.x && a.y === b.y;\n      },\n      op(a, b, target, op) {\n        target.x = op(a.x, b.x);\n        target.y = op(a.y, b.y);\n        return target;\n      },\n    };\n  },\n\n  ivec2(x, y) {\n    if (x == null) {\n      x = 0;\n    }\n    if (y == null) {\n      y = 0;\n    }\n    const vec2 = Types.vec2(x, y);\n    const { validate } = vec2;\n    vec2.validate = function (value, target, invalid) {\n      validate(value, target, invalid);\n      target.x = Math.round(target.x);\n      target.y = Math.round(target.y);\n      return target;\n    };\n    return vec2;\n  },\n\n  vec3(x, y, z) {\n    if (x == null) {\n      x = 0;\n    }\n    if (y == null) {\n      y = 0;\n    }\n    if (z == null) {\n      z = 0;\n    }\n    const defaults = [x, y, z];\n    return {\n      uniform() {\n        return \"v3\";\n      },\n      make() {\n        return new Vector3(x, y, z);\n      },\n      validate(value, target, invalid) {\n        if (value === +value) {\n          value = [value];\n        }\n\n        if (value instanceof Vector3) {\n          target.copy(value);\n        } else if (value instanceof Array) {\n          value = value.concat(defaults.slice(value.length));\n          target.set.apply(target, value);\n        } else if (value != null) {\n          const xx = value.x != null ? value.x : x;\n          const yy = value.y != null ? value.y : y;\n          const zz = value.z != null ? value.z : z;\n          target.set(xx, yy, zz);\n        } else {\n          return invalid();\n        }\n        return target;\n      },\n\n      equals(a, b) {\n        return a.x === b.x && a.y === b.y && a.z === b.z;\n      },\n      op(a, b, target, op) {\n        target.x = op(a.x, b.x);\n        target.y = op(a.y, b.y);\n        target.z = op(a.z, b.z);\n        return target;\n      },\n    };\n  },\n\n  ivec3(x, y, z) {\n    if (x == null) {\n      x = 0;\n    }\n    if (y == null) {\n      y = 0;\n    }\n    if (z == null) {\n      z = 0;\n    }\n    const vec3 = Types.vec3(x, y, z);\n    const { validate } = vec3;\n    vec3.validate = function (value, target, invalid) {\n      validate(value, target, invalid);\n      target.x = Math.round(target.x);\n      target.y = Math.round(target.y);\n      target.z = Math.round(target.z);\n      return target;\n    };\n    return vec3;\n  },\n\n  vec4(x, y, z, w) {\n    if (x == null) {\n      x = 0;\n    }\n    if (y == null) {\n      y = 0;\n    }\n    if (z == null) {\n      z = 0;\n    }\n    if (w == null) {\n      w = 0;\n    }\n    const defaults = [x, y, z, w];\n    return {\n      uniform() {\n        return \"v4\";\n      },\n      make() {\n        return new Vector4(x, y, z, w);\n      },\n      validate(value, target, invalid) {\n        if (value === +value) {\n          value = [value];\n        }\n\n        if (value instanceof Vector4) {\n          target.copy(value);\n        } else if (value instanceof Array) {\n          value = value.concat(defaults.slice(value.length));\n          target.set.apply(target, value);\n        } else if (value != null) {\n          const xx = value.x != null ? value.x : x;\n          const yy = value.y != null ? value.y : y;\n          const zz = value.z != null ? value.z : z;\n          const ww = value.w != null ? value.w : w;\n          target.set(xx, yy, zz, ww);\n        } else {\n          return invalid();\n        }\n        return target;\n      },\n      equals(a, b) {\n        return a.x === b.x && a.y === b.y && a.z === b.z && a.w === b.w;\n      },\n      op(a, b, target, op) {\n        target.x = op(a.x, b.x);\n        target.y = op(a.y, b.y);\n        target.z = op(a.z, b.z);\n        target.w = op(a.w, b.w);\n        return target;\n      },\n    };\n  },\n\n  ivec4(x, y, z, w) {\n    if (x == null) {\n      x = 0;\n    }\n    if (y == null) {\n      y = 0;\n    }\n    if (z == null) {\n      z = 0;\n    }\n    if (w == null) {\n      w = 0;\n    }\n    const vec4 = Types.vec4(x, y, z, w);\n    const { validate } = vec4;\n    vec4.validate = function (value, target, invalid) {\n      validate(value, target, invalid);\n      target.x = Math.round(target.x);\n      target.y = Math.round(target.y);\n      target.z = Math.round(target.z);\n      target.w = Math.round(target.w);\n      return target;\n    };\n    return vec4;\n  },\n\n  mat3(n11, n12, n13, n21, n22, n23, n31, n32, n33) {\n    if (n11 == null) {\n      n11 = 1;\n    }\n    if (n12 == null) {\n      n12 = 0;\n    }\n    if (n13 == null) {\n      n13 = 0;\n    }\n    if (n21 == null) {\n      n21 = 0;\n    }\n    if (n22 == null) {\n      n22 = 1;\n    }\n    if (n23 == null) {\n      n23 = 0;\n    }\n    if (n31 == null) {\n      n31 = 0;\n    }\n    if (n32 == null) {\n      n32 = 0;\n    }\n    if (n33 == null) {\n      n33 = 1;\n    }\n    const defaults = [n11, n12, n13, n21, n22, n23, n31, n32, n33];\n\n    return {\n      uniform() {\n        return \"m4\";\n      },\n      make() {\n        const m = new Matrix3();\n        m.set(n11, n12, n13, n21, n22, n23, n31, n32, n33);\n        return m;\n      },\n      validate(value, target, invalid) {\n        if (value instanceof Matrix3) {\n          target.copy(value);\n        } else if (value instanceof Array) {\n          value = value.concat(defaults.slice(value.length));\n          target.set.apply(target, value);\n        } else {\n          return invalid();\n        }\n        return target;\n      },\n    };\n  },\n\n  mat4(\n    n11,\n    n12,\n    n13,\n    n14,\n    n21,\n    n22,\n    n23,\n    n24,\n    n31,\n    n32,\n    n33,\n    n34,\n    n41,\n    n42,\n    n43,\n    n44\n  ) {\n    if (n11 == null) {\n      n11 = 1;\n    }\n    if (n12 == null) {\n      n12 = 0;\n    }\n    if (n13 == null) {\n      n13 = 0;\n    }\n    if (n14 == null) {\n      n14 = 0;\n    }\n    if (n21 == null) {\n      n21 = 0;\n    }\n    if (n22 == null) {\n      n22 = 1;\n    }\n    if (n23 == null) {\n      n23 = 0;\n    }\n    if (n24 == null) {\n      n24 = 0;\n    }\n    if (n31 == null) {\n      n31 = 0;\n    }\n    if (n32 == null) {\n      n32 = 0;\n    }\n    if (n33 == null) {\n      n33 = 1;\n    }\n    if (n34 == null) {\n      n34 = 0;\n    }\n    if (n41 == null) {\n      n41 = 0;\n    }\n    if (n42 == null) {\n      n42 = 0;\n    }\n    if (n43 == null) {\n      n43 = 0;\n    }\n    if (n44 == null) {\n      n44 = 1;\n    }\n    const defaults = [\n      n11,\n      n12,\n      n13,\n      n14,\n      n21,\n      n22,\n      n23,\n      n24,\n      n31,\n      n32,\n      n33,\n      n34,\n      n41,\n      n42,\n      n43,\n      n44,\n    ];\n\n    return {\n      uniform() {\n        return \"m4\";\n      },\n      make() {\n        const m = new Matrix4();\n        m.set(\n          n11,\n          n12,\n          n13,\n          n14,\n          n21,\n          n22,\n          n23,\n          n24,\n          n31,\n          n32,\n          n33,\n          n34,\n          n41,\n          n42,\n          n43,\n          n44\n        );\n        return m;\n      },\n      validate(value, target, invalid) {\n        if (value instanceof Matrix4) {\n          target.copy(value);\n        } else if (value instanceof Array) {\n          value = value.concat(defaults.slice(value.length));\n          target.set.apply(target, value);\n        } else {\n          return invalid();\n        }\n        return target;\n      },\n    };\n  },\n\n  quat(x, y, z, w) {\n    if (x == null) {\n      x = 0;\n    }\n    if (y == null) {\n      y = 0;\n    }\n    if (z == null) {\n      z = 0;\n    }\n    if (w == null) {\n      w = 1;\n    }\n    const vec4 = Types.vec4(x, y, z, w);\n\n    return {\n      uniform() {\n        return \"v4\";\n      },\n      make() {\n        return new Quaternion();\n      },\n      validate(value, target, invalid) {\n        if (value instanceof Quaternion) {\n          target.copy(value);\n        } else {\n          target = vec4.validate(value, target, invalid);\n        }\n        target.normalize();\n        return target;\n      },\n      equals(a, b) {\n        return a.x === b.x && a.y === b.y && a.z === b.z && a.w === b.w;\n      },\n      op(a, b, target, op) {\n        target.x = op(a.x, b.x);\n        target.y = op(a.y, b.y);\n        target.z = op(a.z, b.z);\n        target.w = op(a.w, b.w);\n        target.normalize();\n        return target;\n      },\n      lerp(a, b, target, f) {\n        if (target.slerpQuaternions) {\n          // NOTE: slerpQuaternions replaced the static slerp method in three.js\n          // r127. This switch removes the deprecation warning and keeps the\n          // project three.js compatible across this version.\n          target.slerpQuaternions(a, b, f);\n        } else {\n          Quaternion.slerp(a, b, target, f);\n        }\n        return target;\n      },\n    };\n  },\n\n  color(r, g, b) {\n    if (r == null) {\n      r = 0.5;\n    }\n    if (g == null) {\n      g = 0.5;\n    }\n    if (b == null) {\n      b = 0.5;\n    }\n    const defaults = [r, g, b];\n\n    return {\n      uniform() {\n        return \"c\";\n      },\n      make() {\n        return new Color(r, g, b);\n      },\n      validate(value, target, invalid) {\n        if (value === \"\" + value) {\n          value = new Color().setStyle(value);\n        } else if (value === +value) {\n          value = new Color(value);\n        }\n\n        if (value instanceof Color) {\n          target.copy(value);\n        } else if (value instanceof Array) {\n          value = value.concat(defaults.slice(value.length));\n          target.setRGB.apply(target, value);\n        } else if (value != null) {\n          const rr = value.r != null ? value.r : r;\n          const gg = value.g != null ? value.g : g;\n          const bb = value.b != null ? value.b : b;\n          target.set(rr, gg, bb);\n        } else {\n          return invalid();\n        }\n        return target;\n      },\n\n      equals(a, b) {\n        return a.r === b.r && a.g === b.g && a.b === b.b;\n      },\n      op(a, b, target, op) {\n        target.r = op(a.r, b.r);\n        target.g = op(a.g, b.g);\n        target.b = op(a.b, b.b);\n        return target;\n      },\n    };\n  },\n\n  axis(value, allowZero) {\n    let v;\n    if (value == null) {\n      value = 1;\n    }\n    if (allowZero == null) {\n      allowZero = false;\n    }\n    const map = {\n      x: 1,\n      y: 2,\n      z: 3,\n      w: 4,\n      W: 1,\n      H: 2,\n      D: 3,\n      I: 4,\n      zero: 0,\n      null: 0,\n      width: 1,\n      height: 2,\n      depth: 3,\n      items: 4,\n    };\n\n    const range = allowZero ? [0, 1, 2, 3, 4] : [1, 2, 3, 4];\n    if ((v = map[value]) != null) {\n      value = v;\n    }\n\n    return {\n      make() {\n        return value;\n      },\n      validate(value, target, invalid) {\n        let left;\n        if ((v = map[value]) != null) {\n          value = v;\n        }\n        value = (left = Math.round(value)) != null ? left : 0;\n        if (Array.from(range).includes(value)) {\n          return value;\n        }\n        return invalid();\n      },\n    };\n  },\n\n  transpose(order) {\n    if (order == null) {\n      order = [1, 2, 3, 4];\n    }\n    const looseArray = Types.letters(Types.axis(null, false), 0, order);\n    const axesArray = Types.letters(Types.axis(null, false), 4, order);\n\n    return {\n      make() {\n        return axesArray.make();\n      },\n      validate(value, target, invalid) {\n        let temp = [1, 2, 3, 4];\n        looseArray.validate(value, temp, invalid);\n\n        if (temp.length < 4) {\n          const missing = [1, 2, 3, 4].filter((x) => temp.indexOf(x) === -1);\n          temp = temp.concat(missing);\n        }\n\n        const unique = Array.from(temp).map(\n          (letter, i) => temp.indexOf(letter) === i\n        );\n        if (unique.indexOf(false) < 0) {\n          return axesArray.validate(temp, target, invalid);\n        }\n        return invalid();\n      },\n      equals: axesArray.equals,\n      clone: axesArray.clone,\n    };\n  },\n\n  swizzle(order, size = null) {\n    if (order == null) {\n      order = [1, 2, 3, 4];\n    }\n    if (size == null) {\n      size = order.length;\n    }\n    order = order.slice(0, size);\n    const looseArray = Types.letters(Types.axis(null, false), 0, order);\n    const axesArray = Types.letters(Types.axis(null, true), size, order);\n\n    return {\n      make() {\n        return axesArray.make();\n      },\n      validate(value, target, invalid) {\n        let temp = order.slice();\n        looseArray.validate(value, temp, invalid);\n\n        if (temp.length < size) {\n          temp = temp.concat([0, 0, 0, 0]).slice(0, size);\n        }\n\n        return axesArray.validate(temp, target, invalid);\n      },\n      equals: axesArray.equals,\n      clone: axesArray.clone,\n    };\n  },\n\n  classes() {\n    const stringArray = Types.array(Types.string());\n\n    return {\n      make() {\n        return stringArray.make();\n      },\n      validate(value, target, invalid) {\n        if (value === \"\" + value) {\n          value = value.split(\" \");\n        }\n        value = value.filter((x) => !!x.length);\n        return stringArray.validate(value, target, invalid);\n      },\n      equals: stringArray.equals,\n      clone: stringArray.clone,\n    };\n  },\n\n  blending(value) {\n    if (value == null) {\n      value = \"normal\";\n    }\n    const keys = [\"no\", \"normal\", \"add\", \"subtract\", \"multiply\", \"custom\"];\n    return Types.enum(value, keys);\n  },\n\n  filter(value) {\n    if (value == null) {\n      value = \"nearest\";\n    }\n    const map = {\n      nearest: NearestFilter,\n      nearestMipMapNearest: NearestMipMapNearestFilter,\n      nearestMipMapLinear: NearestMipMapLinearFilter,\n      linear: LinearFilter,\n      linearMipMapNearest: LinearMipMapNearestFilter,\n      linearMipmapLinear: LinearMipMapLinearFilter,\n    };\n\n    return Types.enum(value, [], map);\n  },\n\n  type(value) {\n    if (value == null) {\n      value = \"unsignedByte\";\n    }\n    const map = {\n      unsignedByte: UnsignedByteType,\n      byte: ByteType,\n      short: ShortType,\n      unsignedShort: UnsignedShortType,\n      int: IntType,\n      unsignedInt: UnsignedIntType,\n      float: FloatType,\n    };\n\n    return Types.enum(value, [], map);\n  },\n\n  scale(value) {\n    if (value == null) {\n      value = \"linear\";\n    }\n    const keys = [\"linear\", \"log\"];\n    return Types.enum(value, keys);\n  },\n\n  mapping(value) {\n    if (value == null) {\n      value = \"relative\";\n    }\n    const keys = [\"relative\", \"absolute\"];\n    return Types.enum(value, keys);\n  },\n\n  indexing(value) {\n    if (value == null) {\n      value = \"original\";\n    }\n    const keys = [\"original\", \"final\"];\n    return Types.enum(value, keys);\n  },\n\n  shape(value) {\n    if (value == null) {\n      value = \"circle\";\n    }\n    const keys = [\"circle\", \"square\", \"diamond\", \"up\", \"down\", \"left\", \"right\"];\n    return Types.enum(value, keys);\n  },\n\n  join(value) {\n    if (value == null) {\n      value = \"miter\";\n    }\n    const keys = [\"miter\", \"round\", \"bevel\"];\n    return Types.enum(value, keys);\n  },\n\n  stroke(value) {\n    if (value == null) {\n      value = \"solid\";\n    }\n    const keys = [\"solid\", \"dotted\", \"dashed\"];\n    return Types.enum(value, keys);\n  },\n\n  vertexPass(value) {\n    if (value == null) {\n      value = \"view\";\n    }\n    const keys = [\"data\", \"view\", \"world\", \"eye\"];\n    return Types.enum(value, keys);\n  },\n\n  fragmentPass(value) {\n    if (value == null) {\n      value = \"light\";\n    }\n    const keys = [\"color\", \"light\", \"rgba\"];\n    return Types.enum(value, keys);\n  },\n\n  ease(value) {\n    if (value == null) {\n      value = \"linear\";\n    }\n    const keys = [\"linear\", \"cosine\", \"binary\", \"hold\"];\n    return Types.enum(value, keys);\n  },\n\n  fit(value) {\n    if (value == null) {\n      value = \"contain\";\n    }\n    const keys = [\"x\", \"y\", \"contain\", \"cover\"];\n    return Types.enum(value, keys);\n  },\n\n  anchor(value) {\n    if (value == null) {\n      value = \"middle\";\n    }\n    const map = {\n      first: 1,\n      middle: 0,\n      last: -1,\n    };\n\n    return Types.enumber(value, [], map);\n  },\n\n  transitionState(value) {\n    if (value == null) {\n      value = \"enter\";\n    }\n    const map = {\n      enter: -1,\n      visible: 0,\n      exit: 1,\n    };\n\n    return Types.enumber(value, [], map);\n  },\n\n  font(value) {\n    if (value == null) {\n      value = \"sans-serif\";\n    }\n    const parse = UJS.parseQuoted;\n    if (!(value instanceof Array)) {\n      value = parse(value);\n    }\n    const stringArray = Types.array(Types.string(), 0, value);\n\n    return {\n      make() {\n        return stringArray.make();\n      },\n      validate(value, target, invalid) {\n        try {\n          if (!(value instanceof Array)) {\n            value = parse(value);\n          }\n        } catch (error) {\n          return invalid();\n        }\n\n        value = value.filter((x) => !!x.length);\n        return stringArray.validate(value, target, invalid);\n      },\n      equals: stringArray.equals,\n      clone: stringArray.clone,\n    };\n  },\n\n  data(value) {\n    if (value == null) {\n      value = [];\n    }\n    return {\n      make() {\n        return [];\n      },\n      validate(value, target, invalid) {\n        if (value instanceof Array) {\n          return value;\n        } else if ((value != null ? value.length : undefined) != null) {\n          return value;\n        } else {\n          return invalid();\n        }\n      },\n\n      emitter(a, b) {\n        return UData.getLerpThunk(a, b);\n      },\n    };\n  },\n};\n\nconst decorate = function (types) {\n  for (const k in types) {\n    const type = types[k];\n    types[k] = ((type) =>\n      function () {\n        const t = type.apply(type, arguments);\n        if (t.validate == null) {\n          t.validate = (v) => v != null;\n        }\n        if (t.equals == null) {\n          t.equals = (a, b) => a === b;\n        }\n        if (t.clone == null) {\n          t.clone = function (v) {\n            let left;\n            return (left = __guardMethod__(v, \"clone\", (o) => o.clone())) !=\n              null\n              ? left\n              : v;\n          };\n        }\n        return t;\n      })(type);\n  }\n  return types;\n};\n\nexport const Types = decorate(_Types);\n\nfunction __range__(left, right, inclusive) {\n  const range = [];\n  const ascending = left < right;\n  const end = !inclusive ? right : ascending ? right + 1 : right - 1;\n  for (let i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {\n    range.push(i);\n  }\n  return range;\n}\nfunction __guardMethod__(obj, methodName, transform) {\n  if (\n    typeof obj !== \"undefined\" &&\n    obj !== null &&\n    typeof obj[methodName] === \"function\"\n  ) {\n    return transform(obj, methodName);\n  } else {\n    return undefined;\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\nimport { Types } from \"./types.js\";\n\nexport const Traits = {\n  node: {\n    id: Types.nullable(Types.string()),\n    classes: Types.classes(),\n  },\n\n  entity: {\n    active: Types.bool(true),\n  },\n\n  object: {\n    visible: Types.bool(true),\n  },\n\n  unit: {\n    scale: Types.nullable(Types.number()),\n    fov: Types.nullable(Types.number()),\n    focus: Types.nullable(Types.number(1), true),\n  },\n\n  span: {\n    range: Types.nullable(Types.vec2(-1, 1)),\n  },\n  view: {\n    range: Types.array(Types.vec2(-1, 1), 4),\n  },\n  view3: {\n    position: Types.vec3(),\n    quaternion: Types.quat(),\n    rotation: Types.vec3(),\n    scale: Types.vec3(1, 1, 1),\n    eulerOrder: Types.swizzle(\"xyz\"),\n  },\n  view4: {\n    position: Types.vec4(),\n    scale: Types.vec4(1, 1, 1, 1),\n  },\n\n  layer: {\n    depth: Types.number(1),\n    fit: Types.fit(\"y\"),\n  },\n\n  vertex: {\n    pass: Types.vertexPass(),\n  },\n  fragment: {\n    pass: Types.fragmentPass(),\n    gamma: Types.bool(false),\n  },\n\n  transform3: {\n    position: Types.vec3(),\n    quaternion: Types.quat(),\n    rotation: Types.vec3(),\n    eulerOrder: Types.swizzle(\"xyz\"),\n    scale: Types.vec3(1, 1, 1),\n    matrix: Types.mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1),\n  },\n  transform4: {\n    position: Types.vec4(),\n    scale: Types.vec4(1, 1, 1, 1),\n    matrix: Types.mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1),\n  },\n\n  camera: {\n    proxy: Types.bool(false),\n    position: Types.nullable(Types.vec3()),\n    quaternion: Types.nullable(Types.quat()),\n    rotation: Types.nullable(Types.vec3()),\n    lookAt: Types.nullable(Types.vec3()),\n    up: Types.nullable(Types.vec3()),\n    eulerOrder: Types.swizzle(\"xyz\"),\n    fov: Types.nullable(Types.number(1)),\n  },\n  //ortho:             Types.nullable(Types.number(0))\n\n  polar: {\n    bend: Types.number(1),\n    helix: Types.number(0),\n  },\n  spherical: {\n    bend: Types.number(1),\n  },\n  stereographic: {\n    bend: Types.number(1),\n  },\n\n  interval: {\n    axis: Types.axis(),\n  },\n  area: {\n    axes: Types.swizzle([1, 2], 2),\n  },\n  volume: {\n    axes: Types.swizzle([1, 2, 3], 3),\n  },\n\n  origin: {\n    origin: Types.vec4(),\n  },\n  scale: {\n    divide: Types.number(10),\n    unit: Types.number(1),\n    base: Types.number(10),\n    mode: Types.scale(),\n    start: Types.bool(true),\n    end: Types.bool(true),\n    zero: Types.bool(true),\n    factor: Types.positive(Types.number(1)),\n    nice: Types.bool(true),\n  },\n  grid: {\n    lineX: Types.bool(true),\n    lineY: Types.bool(true),\n    crossed: Types.bool(false),\n    closedX: Types.bool(false),\n    closedY: Types.bool(false),\n  },\n  axis: {\n    detail: Types.int(1),\n    crossed: Types.bool(false),\n  },\n\n  data: {\n    data: Types.nullable(Types.data()),\n    expr: Types.nullable(Types.emitter()),\n    bind: Types.nullable(Types.func()),\n    live: Types.bool(true),\n  },\n  buffer: {\n    channels: Types.enum(4, [1, 2, 3, 4]),\n    items: Types.int(1),\n    fps: Types.nullable(Types.int(60)),\n    hurry: Types.int(5),\n    limit: Types.int(60),\n    realtime: Types.bool(false),\n    observe: Types.bool(false),\n    aligned: Types.bool(false),\n  },\n  sampler: {\n    centered: Types.bool(false),\n    padding: Types.number(0),\n  },\n  array: {\n    width: Types.nullable(Types.positive(Types.int(1), true)),\n    bufferWidth: Types.int(1),\n    history: Types.int(1),\n  },\n  matrix: {\n    width: Types.nullable(Types.positive(Types.int(1), true)),\n    height: Types.nullable(Types.positive(Types.int(1), true)),\n    history: Types.int(1),\n    bufferWidth: Types.int(1),\n    bufferHeight: Types.int(1),\n  },\n  voxel: {\n    width: Types.nullable(Types.positive(Types.int(1), true)),\n    height: Types.nullable(Types.positive(Types.int(1), true)),\n    depth: Types.nullable(Types.positive(Types.int(1), true)),\n    bufferWidth: Types.int(1),\n    bufferHeight: Types.int(1),\n    bufferDepth: Types.int(1),\n  },\n\n  resolve: {\n    expr: Types.nullable(Types.func()),\n    items: Types.int(1),\n  },\n\n  style: {\n    opacity: Types.positive(Types.number(1)),\n    color: Types.color(),\n    blending: Types.blending(),\n    zWrite: Types.bool(true),\n    zTest: Types.bool(true),\n    zIndex: Types.positive(Types.round()),\n    zBias: Types.number(0),\n    zOrder: Types.nullable(Types.int()),\n  },\n\n  geometry: {\n    points: Types.select(),\n    colors: Types.nullable(Types.select()),\n  },\n\n  point: {\n    size: Types.positive(Types.number(4)),\n    sizes: Types.nullable(Types.select()),\n\n    shape: Types.shape(),\n    optical: Types.bool(true),\n    fill: Types.bool(true),\n    depth: Types.number(1),\n  },\n\n  line: {\n    width: Types.positive(Types.number(2)),\n    depth: Types.positive(Types.number(1)),\n    join: Types.join(),\n    stroke: Types.stroke(),\n    proximity: Types.nullable(Types.number(Infinity)),\n    closed: Types.bool(false),\n  },\n  mesh: {\n    fill: Types.bool(true),\n    shaded: Types.bool(false),\n    map: Types.nullable(Types.select()),\n    lineBias: Types.number(5),\n  },\n  strip: {\n    line: Types.bool(false),\n  },\n  face: {\n    line: Types.bool(false),\n  },\n  arrow: {\n    size: Types.number(3),\n    start: Types.bool(false),\n    end: Types.bool(false),\n  },\n  ticks: {\n    normal: Types.vec3(0, 0, 1),\n    size: Types.positive(Types.number(10)),\n    epsilon: Types.positive(Types.number(0.001)),\n  },\n  attach: {\n    offset: Types.vec2(0, -20),\n    snap: Types.bool(false),\n    depth: Types.number(0),\n  },\n\n  format: {\n    digits: Types.nullable(Types.positive(Types.number(3))),\n    data: Types.nullable(Types.data()),\n    expr: Types.nullable(Types.func()),\n    live: Types.bool(true),\n  },\n  font: {\n    font: Types.font(\"sans-serif\"),\n    style: Types.string(),\n    variant: Types.string(),\n    weight: Types.string(),\n    detail: Types.number(24),\n    sdf: Types.number(5),\n  },\n  label: {\n    text: Types.select(),\n    size: Types.number(16),\n    outline: Types.number(2),\n    expand: Types.number(0),\n    background: Types.color(1, 1, 1),\n  },\n\n  overlay: {\n    opacity: Types.number(1),\n    zIndex: Types.positive(Types.round(0)),\n  },\n  dom: {\n    points: Types.select(),\n    html: Types.select(),\n    size: Types.number(16),\n    outline: Types.number(2),\n    zoom: Types.number(1),\n    color: Types.nullable(Types.color()),\n    attributes: Types.nullable(Types.object()),\n    pointerEvents: Types.bool(false),\n  },\n\n  texture: {\n    minFilter: Types.filter(\"nearest\"),\n    magFilter: Types.filter(\"nearest\"),\n    type: Types.type(\"float\"),\n  },\n\n  shader: {\n    sources: Types.nullable(Types.select()),\n    language: Types.string(\"glsl\"),\n    code: Types.string(),\n    uniforms: Types.nullable(Types.object()),\n  },\n  include: {\n    shader: Types.select(),\n  },\n\n  operator: {\n    source: Types.select(),\n  },\n  spread: {\n    unit: Types.mapping(),\n    items: Types.nullable(Types.vec4()),\n    width: Types.nullable(Types.vec4()),\n    height: Types.nullable(Types.vec4()),\n    depth: Types.nullable(Types.vec4()),\n    alignItems: Types.anchor(),\n    alignWidth: Types.anchor(),\n    alignHeight: Types.anchor(),\n    alignDepth: Types.anchor(),\n  },\n  grow: {\n    scale: Types.number(1),\n    items: Types.nullable(Types.anchor()),\n    width: Types.nullable(Types.anchor()),\n    height: Types.nullable(Types.anchor()),\n    depth: Types.nullable(Types.anchor()),\n  },\n  split: {\n    order: Types.transpose(\"wxyz\"),\n    axis: Types.nullable(Types.axis()),\n    length: Types.int(1),\n    overlap: Types.int(0),\n  },\n  join: {\n    order: Types.transpose(\"wxyz\"),\n    axis: Types.nullable(Types.axis()),\n    overlap: Types.int(0),\n  },\n  swizzle: {\n    order: Types.swizzle(),\n  },\n  transpose: {\n    order: Types.transpose(),\n  },\n  repeat: {\n    items: Types.number(1),\n    width: Types.number(1),\n    height: Types.number(1),\n    depth: Types.number(1),\n  },\n  slice: {\n    items: Types.nullable(Types.vec2()),\n    width: Types.nullable(Types.vec2()),\n    height: Types.nullable(Types.vec2()),\n    depth: Types.nullable(Types.vec2()),\n  },\n  lerp: {\n    size: Types.mapping(\"absolute\"),\n    items: Types.nullable(Types.number()),\n    width: Types.nullable(Types.number()),\n    height: Types.nullable(Types.number()),\n    depth: Types.nullable(Types.number()),\n  },\n  subdivide: {\n    items: Types.nullable(Types.positive(Types.int(), true)),\n    width: Types.nullable(Types.positive(Types.int(), true)),\n    height: Types.nullable(Types.positive(Types.int(), true)),\n    depth: Types.nullable(Types.positive(Types.int(), true)),\n    bevel: Types.number(1),\n    lerp: Types.bool(true),\n  },\n  resample: {\n    indices: Types.number(4),\n    channels: Types.number(4),\n    sample: Types.mapping(),\n    size: Types.mapping(\"absolute\"),\n    items: Types.nullable(Types.number()),\n    width: Types.nullable(Types.number()),\n    height: Types.nullable(Types.number()),\n    depth: Types.nullable(Types.number()),\n  },\n  readback: {\n    type: Types.type(\"float\"),\n    expr: Types.nullable(Types.func()),\n    data: Types.data(),\n    channels: Types.enum(4, [1, 2, 3, 4]),\n    items: Types.nullable(Types.int()),\n    width: Types.nullable(Types.int()),\n    height: Types.nullable(Types.int()),\n    depth: Types.nullable(Types.int()),\n  },\n  root: {\n    speed: Types.number(1),\n    camera: Types.select(\"[camera]\"),\n  },\n  inherit: {\n    source: Types.select(),\n    traits: Types.array(Types.string()),\n  },\n\n  rtt: {\n    size: Types.mapping(\"absolute\"),\n    width: Types.nullable(Types.number()),\n    height: Types.nullable(Types.number()),\n    history: Types.int(1),\n  },\n  compose: {\n    alpha: Types.bool(false),\n  },\n\n  present: {\n    index: Types.int(1),\n    directed: Types.bool(true),\n    length: Types.number(0),\n  },\n  slide: {\n    order: Types.nullable(Types.int(0)),\n    steps: Types.number(1),\n    early: Types.int(0),\n    late: Types.int(0),\n    from: Types.nullable(Types.int(0)),\n    to: Types.nullable(Types.int(1)),\n  },\n\n  transition: {\n    stagger: Types.vec4(),\n    enter: Types.nullable(Types.number(1)),\n    exit: Types.nullable(Types.number(1)),\n    delay: Types.number(0),\n    delayEnter: Types.nullable(Types.number(0)),\n    delayExit: Types.nullable(Types.number(0)),\n    duration: Types.number(0.3),\n    durationEnter: Types.nullable(Types.number(0)),\n    durationExit: Types.nullable(Types.number(0)),\n  },\n  move: {\n    from: Types.vec4(),\n    to: Types.vec4(),\n  },\n\n  seek: {\n    seek: Types.nullable(Types.number(0)),\n  },\n  track: {\n    target: Types.select(),\n    script: Types.object({}),\n    ease: Types.ease(\"cosine\"),\n  },\n  trigger: {\n    trigger: Types.nullable(Types.int(1), true),\n  },\n  step: {\n    playback: Types.ease(\"linear\"),\n    stops: Types.nullable(Types.array(Types.number())),\n    delay: Types.number(0),\n    duration: Types.number(0.3),\n    pace: Types.number(0),\n    speed: Types.number(1),\n    rewind: Types.number(2),\n    skip: Types.bool(true),\n    realtime: Types.bool(false),\n  },\n  play: {\n    delay: Types.number(0),\n    pace: Types.number(1),\n    speed: Types.number(1),\n    from: Types.number(0),\n    to: Types.number(Infinity),\n    realtime: Types.bool(false),\n    loop: Types.bool(false),\n  },\n  now: {\n    now: Types.nullable(Types.timestamp()),\n    seek: Types.nullable(Types.number(0)),\n    pace: Types.number(1),\n    speed: Types.number(1),\n  },\n};\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS202: Simplify dynamic range loops\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n/*\n Generate equally spaced ticks in a range at sensible positions.\n\n @param min/max - Minimum and maximum of range\n @param n - Desired number of ticks in range\n @param unit - Base unit of scale (e.g. 1 or π).\n @param scale - Division scale (e.g. 2 = binary division, or 10 = decimal division).\n @param bias - Integer to bias divisions one or more levels up or down (to create nested scales)\n @param start - Whether to include a tick at the start\n @param end - Whether to include a tick at the end\n @param zero - Whether to include zero as a tick\n @param nice - Whether to round to a more reasonable interval\n*/\n\nexport const linear = function (\n  min,\n  max,\n  n,\n  unit,\n  base,\n  factor,\n  start,\n  end,\n  zero,\n  nice\n) {\n  let ticks;\n  let i, f;\n  if (nice == null) {\n    nice = true;\n  }\n  if (!n) {\n    n = 10;\n  }\n  if (!unit) {\n    unit = 1;\n  }\n  if (!base) {\n    base = 10;\n  }\n  if (!factor) {\n    factor = 1;\n  }\n\n  // Calculate naive tick size.\n  const span = max - min;\n  const ideal = span / n;\n\n  // Unsnapped division\n  if (!nice) {\n    ticks = (() => {\n      let asc, end1;\n      const result = [];\n      for (\n        i = 0, end1 = n, asc = 0 <= end1;\n        asc ? i <= end1 : i >= end1;\n        asc ? i++ : i--\n      ) {\n        result.push(min + i * ideal);\n      }\n      return result;\n    })();\n    if (!start) {\n      ticks.shift();\n    }\n    if (!end) {\n      ticks.pop();\n    }\n    if (!zero) {\n      ticks = ticks.filter((x) => x !== 0);\n    }\n    return ticks;\n  }\n\n  // Round to the floor'd power of 'scale'\n  if (!unit) {\n    unit = 1;\n  }\n  if (!base) {\n    base = 10;\n  }\n  const ref =\n    unit * Math.pow(base, Math.floor(Math.log(ideal / unit) / Math.log(base)));\n\n  // Make derived steps at sensible factors.\n  const factors =\n    base % 2 === 0\n      ? [base / 2, 1, 1 / 2]\n      : base % 3 === 0\n      ? [base / 3, 1, 1 / 3]\n      : [1];\n  const steps = (() => {\n    const result1 = [];\n    for (f of Array.from(factors)) {\n      result1.push(ref * f);\n    }\n    return result1;\n  })();\n\n  // Find step size closest to ideal.\n  let distance = Infinity;\n  let step = steps.reduce(function (ref, step) {\n    f = step / ideal;\n    const d = Math.max(f, 1 / f);\n\n    if (d < distance) {\n      distance = d;\n      return step;\n    } else {\n      return ref;\n    }\n  }, ref);\n\n  // Scale final step\n  step *= factor;\n\n  // Renormalize min/max onto aligned steps.\n  min = Math.ceil(min / step + +!start) * step;\n  max = (Math.floor(max / step) - +!end) * step;\n  n = Math.ceil((max - min) / step);\n\n  // Generate equally spaced ticks\n  ticks = (() => {\n    let asc1, end2;\n    const result2 = [];\n    for (\n      i = 0, end2 = n, asc1 = 0 <= end2;\n      asc1 ? i <= end2 : i >= end2;\n      asc1 ? i++ : i--\n    ) {\n      result2.push(min + i * step);\n    }\n    return result2;\n  })();\n  if (!zero) {\n    ticks = ticks.filter((x) => x !== 0);\n  }\n  return ticks;\n};\n\n/*\n Generate logarithmically spaced ticks in a range at sensible positions.\n*/\n\nexport const log = function (\n  _min,\n  _max,\n  _n,\n  _unit,\n  _base,\n  _bias,\n  _start,\n  _end,\n  _zero,\n  _nice\n) {\n  throw new Error(\"Log ticks not yet implemented.\");\n};\n\nconst LINEAR = 0;\nconst LOG = 1;\n\nexport const make = function (\n  type,\n  min,\n  max,\n  n,\n  unit,\n  base,\n  bias,\n  start,\n  end,\n  zero,\n  nice\n) {\n  switch (type) {\n    case LINEAR:\n      return linear(min, max, n, unit, base, bias, start, end, zero, nice);\n    case LOG:\n      return log(min, max, n, unit, base, bias, start, end, zero, nice);\n  }\n};\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining\n * DS104: Avoid inline assignments\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UGLSL from \"../../util/glsl.js\";\nimport * as UTicks from \"../../util/ticks.js\";\n\nimport { NormalBlending } from \"three/src/constants.js\";\nimport { Vector2 } from \"three/src/math/Vector2.js\";\nimport { Vector3 } from \"three/src/math/Vector3.js\";\n/*\n\nThis is the general dumping ground for trait behavior.\n\nHelpers are auto-attached to primitives that have the matching trait\n\n*/\n\nconst helpers = {\n  bind: {\n    make(slots) {\n      if (this.bind == null) {\n        this.bind = {};\n      }\n      if (this.bound == null) {\n        this.bound = [];\n      }\n\n      // Fetch attached objects and bind to them\n      // Attach rebuild watcher for DOM changes to bound nodes\n      for (const slot of Array.from(slots)) {\n        let { callback } = slot;\n        const { to, trait, optional, unique, multiple } = slot;\n\n        if (callback == null) {\n          callback = this.rebuild;\n        }\n        const name = to.split(/\\./g).pop();\n        const selector = this._get(to);\n\n        // Find by selector\n        let source = null;\n        if (selector != null) {\n          let start = this;\n          let done = false;\n          while (!done) {\n            // Keep scanning back until a new node is found\n            start = source = this._attach(\n              selector,\n              trait,\n              callback,\n              this,\n              start,\n              optional,\n              multiple\n            );\n            const isUnique =\n              unique && (source == null || this.bound.indexOf(source) < 0);\n            done = multiple || optional || !unique || isUnique;\n          }\n        }\n\n        // Monitor source for reallocation / resize\n        if (source != null) {\n          if (this.resize != null) {\n            this._listen(source, \"source.resize\", this.resize);\n          }\n          if (callback) {\n            this._listen(source, \"source.rebuild\", callback);\n          }\n\n          if (multiple) {\n            for (const s of Array.from(source)) {\n              this.bound.push(s);\n            }\n          } else {\n            this.bound.push(source);\n          }\n        }\n\n        this.bind[name] = source;\n      }\n\n      return null;\n    },\n\n    unmake() {\n      if (!this.bind) {\n        return;\n      }\n      delete this.bind;\n      return delete this.bound;\n    },\n  },\n\n  span: {\n    make() {\n      // Look up nearest view to inherit from\n      // Monitor size changes\n      this.spanView = this._inherit(\"view\");\n      return this._listen(\"view\", \"view.range\", () =>\n        this.trigger({ type: \"span.range\" })\n      );\n    },\n\n    unmake() {\n      return delete this.spanView;\n    },\n\n    get: (function () {\n      const def = new Vector2(-1, 1);\n\n      return function (prefix, dimension) {\n        // Return literal range\n        let left;\n        const range = this._get(prefix + \"span.range\");\n        if (range != null) {\n          return range;\n        }\n\n        // Inherit from view\n        return (left =\n          this.spanView != null ? this.spanView.axis(dimension) : undefined) !=\n          null\n          ? left\n          : def;\n      };\n    })(),\n  },\n\n  scale: {\n    // Divisions to allocate on scale\n    divide(prefix) {\n      const divide = this._get(prefix + \"scale.divide\");\n      const factor = this._get(prefix + \"scale.factor\");\n      return Math.round((divide * 2.5) / factor);\n    },\n\n    // Generate ticks on scale\n    generate(prefix, buffer, min, max) {\n      const mode = this._get(prefix + \"scale.mode\");\n      const divide = this._get(prefix + \"scale.divide\");\n      const unit = this._get(prefix + \"scale.unit\");\n      const base = this._get(prefix + \"scale.base\");\n      const factor = this._get(prefix + \"scale.factor\");\n      const start = this._get(prefix + \"scale.start\");\n      const end = this._get(prefix + \"scale.end\");\n      const zero = this._get(prefix + \"scale.zero\");\n      const nice = this._get(prefix + \"scale.nice\");\n\n      const ticks = UTicks.make(\n        mode,\n        min,\n        max,\n        divide,\n        unit,\n        base,\n        factor,\n        start,\n        end,\n        zero,\n        nice\n      );\n      buffer.copy(ticks);\n      return ticks;\n    },\n  },\n\n  style: {\n    // Return bound style uniforms\n    uniforms() {\n      return {\n        styleColor: this.node.attributes[\"style.color\"],\n        styleOpacity: this.node.attributes[\"style.opacity\"],\n        styleZBias: this.node.attributes[\"style.zBias\"],\n        styleZIndex: this.node.attributes[\"style.zIndex\"],\n      };\n    },\n  },\n\n  arrow: {\n    // Return bound arrow style uniforms\n    uniforms() {\n      const { start } = this.props;\n      const { end } = this.props;\n\n      const space = this._attributes.make(\n        this._types.number(1.25 / (start + end))\n      );\n      const style = this._attributes.make(this._types.vec2(+start, +end));\n      const size = this.node.attributes[\"arrow.size\"];\n\n      return {\n        clipStyle: style,\n        clipRange: size,\n        clipSpace: space,\n\n        arrowSpace: space,\n        arrowSize: size,\n      };\n    },\n  },\n\n  point: {\n    // Return bound point style uniforms\n    uniforms() {\n      return {\n        pointSize: this.node.attributes[\"point.size\"],\n        pointDepth: this.node.attributes[\"point.depth\"],\n      };\n    },\n  },\n\n  line: {\n    // Return bound line style uniforms\n    uniforms() {\n      return {\n        lineWidth: this.node.attributes[\"line.width\"],\n        lineDepth: this.node.attributes[\"line.depth\"],\n        lineProximity: this.node.attributes[\"line.proximity\"],\n      };\n    },\n  },\n\n  surface: {\n    // Return bound surface style uniforms\n    uniforms() {\n      return {};\n    },\n  },\n\n  shade: {\n    pipeline(shader) {\n      if (!this._inherit(\"fragment\")) {\n        return shader;\n      }\n      if (shader == null) {\n        shader = this._shaders.shader();\n      }\n      for (let pass = 0; pass <= 2; pass++) {\n        shader = __guard__(this._inherit(\"fragment\"), (x) =>\n          x.fragment(shader, pass)\n        );\n      }\n      shader.pipe(\"fragment.map.rgba\");\n      return shader;\n    },\n\n    map(shader) {\n      if (!shader) {\n        return shader;\n      }\n      return (shader = this._shaders\n        .shader()\n        .pipe(\"mesh.map.uvwo\")\n        .pipe(shader));\n    },\n  },\n\n  position: {\n    pipeline(shader) {\n      if (!this._inherit(\"vertex\")) {\n        return shader;\n      }\n      if (shader == null) {\n        shader = this._shaders.shader();\n      }\n      for (let pass = 0; pass <= 3; pass++) {\n        shader = __guard__(this._inherit(\"vertex\"), (x) =>\n          x.vertex(shader, pass)\n        );\n      }\n      return shader;\n    },\n\n    swizzle(shader, order) {\n      if (shader) {\n        return this._shaders\n          .shader()\n          .pipe(UGLSL.swizzleVec4(order))\n          .pipe(shader);\n      }\n    },\n\n    swizzle2(shader, order1, order2) {\n      if (shader) {\n        return this._shaders\n          .shader()\n          .split()\n          .pipe(UGLSL.swizzleVec4(order1))\n          .next()\n          .pipe(UGLSL.swizzleVec4(order2))\n          .join()\n          .pipe(shader);\n      }\n    },\n  },\n\n  visible: {\n    make() {\n      const e = { type: \"visible.change\" };\n\n      let visible = null;\n      this.setVisible = function (vis) {\n        if (vis != null) {\n          visible = vis;\n        }\n        return onVisible();\n      };\n\n      const onVisible = () => {\n        let left;\n        const last = this.isVisible;\n        let self =\n          (left = visible != null ? visible : this._get(\"object.visible\")) !=\n          null\n            ? left\n            : true;\n        if (visibleParent != null) {\n          if (self) {\n            self = visibleParent.isVisible;\n          }\n        }\n        this.isVisible = self;\n        if (last !== this.isVisible) {\n          return this.trigger(e);\n        }\n      };\n\n      const visibleParent = this._inherit(\"visible\");\n      if (visibleParent) {\n        this._listen(visibleParent, \"visible.change\", onVisible);\n      }\n      if (this.is(\"object\")) {\n        this._listen(this.node, \"change:object\", onVisible);\n      }\n\n      return onVisible();\n    },\n\n    unmake() {\n      return delete this.isVisible;\n    },\n  },\n\n  active: {\n    make() {\n      const e = { type: \"active.change\" };\n\n      let active = null;\n      this.setActive = function (act) {\n        if (act != null) {\n          active = act;\n        }\n        return onActive();\n      };\n\n      const onActive = () => {\n        let left;\n        const last = this.isActive;\n        let self =\n          (left = active != null ? active : this._get(\"entity.active\")) != null\n            ? left\n            : true;\n        if (activeParent != null) {\n          if (self) {\n            self = activeParent.isActive;\n          }\n        }\n        this.isActive = self;\n        if (last !== this.isActive) {\n          return this.trigger(e);\n        }\n      };\n\n      const activeParent = this._inherit(\"active\");\n      if (activeParent) {\n        this._listen(activeParent, \"active.change\", onActive);\n      }\n      if (this.is(\"entity\")) {\n        this._listen(this.node, \"change:entity\", onActive);\n      }\n\n      return onActive();\n    },\n\n    unmake() {\n      return delete this.isActive;\n    },\n  },\n\n  object: {\n    // Generic 3D renderable wrapper, handles the fiddly Three.js bits that require a 'style recalculation'.\n    //\n    // Pass renderables to nearest root for rendering\n    // Track visibility from parent and notify children\n    // Track blends / transparency for three.js materials\n    make(objects) {\n      // Aggregate rendered three objects for reference\n      let blending, zOrder;\n      if (objects == null) {\n        objects = [];\n      }\n      this.objects = objects;\n      this.renders = this.objects.reduce((a, b) => a.concat(b.renders), []);\n\n      const objectScene = this._inherit(\"scene\");\n\n      let opacity = (blending = zOrder = null);\n\n      const hasStyle = Array.from(this.traits).includes(\"style\");\n      opacity = 1;\n      blending = NormalBlending;\n      let zWrite = true;\n      let zTest = true;\n\n      if (hasStyle) {\n        ({ opacity } = this.props);\n        ({ blending } = this.props);\n        ({ zOrder } = this.props);\n        ({ zWrite } = this.props);\n        ({ zTest } = this.props);\n      }\n\n      const onChange = (event) => {\n        const { changed } = event;\n        let refresh = null;\n        if (changed[\"style.opacity\"]) {\n          refresh = opacity = this.props.opacity;\n        }\n        if (changed[\"style.blending\"]) {\n          refresh = blending = this.props.blending;\n        }\n        if (changed[\"style.zOrder\"]) {\n          refresh = zOrder = this.props.zOrder;\n        }\n        if (changed[\"style.zWrite\"]) {\n          refresh = zWrite = this.props.zWrite;\n        }\n        if (changed[\"style.zTest\"]) {\n          refresh = zTest = this.props.zTest;\n        }\n        if (refresh != null) {\n          return onVisible();\n        }\n      };\n\n      const onVisible = () => {\n        const order = zOrder != null ? -zOrder : this.node.order;\n\n        const visible =\n          (this.isVisible != null ? this.isVisible : true) && opacity > 0;\n\n        if (visible) {\n          if (hasStyle) {\n            return (() => {\n              const result = [];\n              for (const o of Array.from(this.objects)) {\n                o.show(opacity < 1, blending, order);\n                result.push(o.depth(zWrite, zTest));\n              }\n              return result;\n            })();\n          } else {\n            return (() => {\n              const result1 = [];\n              for (const o of Array.from(this.objects)) {\n                result1.push(o.show(true, blending, order));\n              }\n              return result1;\n            })();\n          }\n        } else {\n          return (() => {\n            const result2 = [];\n            for (const o of Array.from(this.objects)) {\n              result2.push(o.hide());\n            }\n            return result2;\n          })();\n        }\n      };\n\n      this._listen(this.node, \"change:style\", onChange);\n      this._listen(this.node, \"reindex\", onVisible);\n      this._listen(this, \"visible.change\", onVisible);\n\n      for (const object of Array.from(this.objects)) {\n        objectScene.adopt(object);\n      }\n      return onVisible();\n    },\n\n    unmake(dispose) {\n      let object;\n      if (dispose == null) {\n        dispose = true;\n      }\n      if (!this.objects) {\n        return;\n      }\n\n      const objectScene = this._inherit(\"scene\");\n      for (object of Array.from(this.objects)) {\n        objectScene.unadopt(object);\n      }\n      if (dispose) {\n        return (() => {\n          const result = [];\n          for (object of Array.from(this.objects)) {\n            result.push(object.dispose());\n          }\n          return result;\n        })();\n      }\n    },\n\n    mask() {\n      let mask, shader;\n      if (!(mask = this._inherit(\"mask\"))) {\n        return;\n      }\n      return (shader = mask.mask(shader));\n    },\n  },\n\n  unit: {\n    make() {\n      let focusDepth,\n        pixelRatio,\n        pixelUnit,\n        renderAspect,\n        renderHeight,\n        renderOdd,\n        renderScale,\n        renderScaleInv,\n        renderWidth,\n        viewHeight,\n        viewWidth,\n        worldUnit;\n      let π = Math.PI;\n\n      this.unitUniforms = {\n        renderScaleInv: (renderScaleInv = this._attributes.make(\n          this._types.number(1)\n        )),\n        renderScale: (renderScale = this._attributes.make(\n          this._types.number(1)\n        )),\n        renderAspect: (renderAspect = this._attributes.make(\n          this._types.number(1)\n        )),\n        renderWidth: (renderWidth = this._attributes.make(\n          this._types.number(0)\n        )),\n        renderHeight: (renderHeight = this._attributes.make(\n          this._types.number(0)\n        )),\n        viewWidth: (viewWidth = this._attributes.make(this._types.number(0))),\n        viewHeight: (viewHeight = this._attributes.make(this._types.number(0))),\n        pixelRatio: (pixelRatio = this._attributes.make(this._types.number(1))),\n        pixelUnit: (pixelUnit = this._attributes.make(this._types.number(1))),\n        worldUnit: (worldUnit = this._attributes.make(this._types.number(1))),\n        focusDepth: (focusDepth = this._attributes.make(this._types.number(1))),\n        renderOdd: (renderOdd = this._attributes.make(this._types.vec2())),\n      };\n\n      const top = new Vector3();\n      const bottom = new Vector3();\n\n      const handler = () => {\n        let camera, size;\n        if ((size = root != null ? root.getSize() : undefined) == null) {\n          return;\n        }\n\n        π = Math.PI;\n\n        const { scale } = this.props;\n        const { fov } = this.props;\n        const focus =\n          this.props.focus != null\n            ? this.props.focus\n            : this.inherit(\"unit\").props.focus;\n\n        const isAbsolute = scale === null;\n\n        // Measure live FOV to be able to accurately predict anti-aliasing in\n        // perspective\n        let measure = 1;\n        if ((camera = root != null ? root.getCamera() : undefined)) {\n          const m = camera.projectionMatrix;\n\n          // Measure top to bottom\n          top.set(0, -0.5, 1).applyMatrix4(m);\n          bottom.set(0, 0.5, 1).applyMatrix4(m);\n          top.sub(bottom);\n          measure = top.y;\n        }\n\n        // Calculate device pixel ratio\n        const dpr = size.renderHeight / size.viewHeight;\n\n        // Calculate correction for fixed on-screen size regardless of FOV\n        const fovtan = fov != null ? measure * Math.tan((fov * π) / 360) : 1;\n\n        // Calculate device pixels per virtual pixel\n        const pixel = isAbsolute ? dpr : (size.renderHeight / scale) * fovtan;\n\n        // Calculate device pixels per world unit\n        const rscale = (size.renderHeight * measure) / 2;\n\n        // Calculate world units per virtual pixel\n        const world = pixel / rscale;\n\n        viewWidth.value = size.viewWidth;\n        viewHeight.value = size.viewHeight;\n        renderWidth.value = size.renderWidth;\n        renderHeight.value = size.renderHeight;\n        renderAspect.value = size.aspect;\n        renderScale.value = rscale;\n        renderScaleInv.value = 1 / rscale;\n        pixelRatio.value = dpr;\n        pixelUnit.value = pixel;\n        worldUnit.value = world;\n        focusDepth.value = focus;\n\n        return renderOdd.value\n          .set(size.renderWidth % 2, size.renderHeight % 2)\n          .multiplyScalar(0.5);\n      };\n\n      //console.log 'worldUnit', world, pixel, rscale, isAbsolute\n\n      const root = this.is(\"root\") ? this : this._inherit(\"root\");\n      //@_listen root, 'root.resize', handler\n      //@_listen root, 'root.camera', handler\n      //@_listen @node, 'change:unit', handler\n      this._listen(root, \"root.update\", handler);\n\n      return handler();\n    },\n\n    unmake() {\n      return delete this.unitUniforms;\n    },\n\n    get() {\n      const u = {};\n      for (const k in this.unitUniforms) {\n        const v = this.unitUniforms[k];\n        u[k] = v.value;\n      }\n      return u;\n    },\n\n    uniforms() {\n      return this.unitUniforms;\n    },\n  },\n};\n\nexport const Helpers = function (object, traits) {\n  const h = {};\n  for (const trait of Array.from(traits)) {\n    let methods;\n    if (!(methods = helpers[trait])) {\n      continue;\n    }\n\n    h[trait] = {};\n    for (const key in methods) {\n      const method = methods[key];\n      h[trait][key] = method.bind(object);\n    }\n  }\n  return h;\n};\n\nfunction __guard__(value, transform) {\n  return typeof value !== \"undefined\" && value !== null\n    ? transform(value)\n    : undefined;\n}\n","export * from \"./classes.js\";\nexport * from \"./types.js\";\nexport * from \"./traits.js\";\nexport * from \"./helpers.js\";\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nexport class PrimitiveFactory {\n  constructor(definitions, context) {\n    this.context = context;\n    this.classes = definitions.Classes;\n    this.helpers = definitions.Helpers;\n  }\n\n  getTypes() {\n    return Object.keys(this.classes);\n  }\n\n  make(type, options, binds = null) {\n    if (options == null) {\n      options = {};\n    }\n\n    const klass = this.classes[type];\n\n    if (klass == null) {\n      throw new Error(`Unknown primitive class \\`${type}\\``);\n    }\n\n    const node = new klass.model(\n      type,\n      klass.defaults,\n      options,\n      binds,\n      klass,\n      this.context.attributes\n    );\n\n    // NOTE: keep for side effects.\n    new klass(node, this.context, this.helpers);\n    return node;\n  }\n}\n","import * as types from \"./types\";\n\nexport { PrimitiveFactory as Factory } from \"./factory.js\";\nexport * from \"./primitive.js\";\nexport const Types = types;\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nexport class Renderable {\n  constructor(renderer, shaders) {\n    this.renderer = renderer;\n    this.shaders = shaders;\n    this.gl = this.renderer.getContext();\n    if (this.uniforms == null) {\n      this.uniforms = {};\n    }\n  }\n\n  dispose() {\n    this.uniforms = null;\n  }\n\n  _adopt(uniforms) {\n    for (const key in uniforms) {\n      const value = uniforms[key];\n      this.uniforms[key] = value;\n    }\n  }\n\n  _set(uniforms) {\n    for (const key in uniforms) {\n      const value = uniforms[key];\n      if (this.uniforms[key] != null) {\n        this.uniforms[key].value = value;\n      }\n    }\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS202: Simplify dynamic range loops\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { Object3D } from \"three/src/core/Object3D.js\";\nimport { PerspectiveCamera } from \"three/src/cameras/PerspectiveCamera.js\";\nimport { Renderable } from \"./renderable.js\";\nimport { Scene as ThreeScene } from \"three/src/scenes/Scene.js\";\nimport { WebGLRenderTarget } from \"three/src/renderers/WebGLRenderTarget.js\";\n\n/*\n All MathBox renderables sit inside this root, to keep things tidy.\n*/\nclass MathBox extends Object3D {\n  constructor() {\n    super();\n    this.rotationAutoUpdate = false;\n    this.frustumCulled = false;\n    this.matrixAutoUpdate = false;\n  }\n}\n\n/*\n Holds the root and binds to a THREE.Scene\n\n Will hold objects and inject them a few at a time\n to avoid long UI blocks.\n\n Will render injected objects to a 1x1 scratch buffer to ensure availability\n*/\nexport class Scene extends Renderable {\n  constructor(renderer, shaders, options) {\n    super(renderer, shaders, options);\n    this.root = new MathBox();\n\n    if ((options != null ? options.scene : undefined) != null) {\n      this.scene = options.scene;\n    }\n    if (this.scene == null) {\n      this.scene = new ThreeScene();\n    }\n\n    this.pending = [];\n    this.async = 0;\n\n    this.scratch = new WebGLRenderTarget(1, 1);\n    this.camera = new PerspectiveCamera();\n  }\n\n  inject(scene) {\n    if (scene != null) {\n      this.scene = scene;\n    }\n    return this.scene.add(this.root);\n  }\n\n  unject() {\n    return this.scene != null ? this.scene.remove(this.root) : undefined;\n  }\n\n  add(object) {\n    if (this.async) {\n      return this.pending.push(object);\n    } else {\n      return this._add(object);\n    }\n  }\n\n  remove(object) {\n    this.pending = this.pending.filter((o) => o !== object);\n    if (object.parent != null) {\n      return this._remove(object);\n    }\n  }\n\n  _add(object) {\n    return this.root.add(object);\n  }\n\n  _remove(object) {\n    return this.root.remove(object);\n  }\n\n  dispose() {\n    if (this.root.parent != null) {\n      return this.unject();\n    }\n  }\n\n  warmup(n) {\n    return (this.async = +n || 0);\n  }\n\n  render() {\n    if (!this.pending.length) {\n      return;\n    }\n    const { children } = this.root;\n\n    // Insert up to @async children\n    const added = [];\n    for (\n      let i = 0, end = this.async, asc = 0 <= end;\n      asc ? i < end : i > end;\n      asc ? i++ : i--\n    ) {\n      const pending = this.pending.shift();\n      if (!pending) {\n        break;\n      }\n\n      // Insert new child\n      this._add(pending);\n      added.push(added);\n    }\n\n    // Remember current visibility\n    const visible = children.map(function (o) {\n      return o.visible;\n    });\n\n    // Force only this child visible\n    children.map((o) => (o.visible = !Array.from(added).includes(o)));\n\n    // Render and throw away\n    const currentTarget = this.renderer.getRenderTarget();\n    this.renderer.setRenderTarget(this.scratch);\n    this.renderer.render(this.scene, this.camera);\n    this.renderer.setRenderTarget(currentTarget);\n\n    // Restore visibility\n    return children.map((o, i) => (o.visible = visible[i]));\n  }\n\n  toJSON() {\n    return this.root.toJSON();\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nexport class RenderFactory {\n  constructor(classes, renderer, shaders) {\n    this.classes = classes;\n    this.renderer = renderer;\n    this.shaders = shaders;\n  }\n\n  getTypes() {\n    return Object.keys(this.classes);\n  }\n\n  make(type, options) {\n    return new this.classes[type](this.renderer, this.shaders, options);\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UData from \"../../util/data.js\";\nimport { Renderable } from \"../renderable.js\";\n\n/*\n * Base class for sample buffers\n */\nexport class Buffer extends Renderable {\n  constructor(renderer, shaders, options) {\n    super(renderer, shaders);\n\n    if (this.items == null) {\n      this.items = options.items || 1;\n    }\n    if (this.samples == null) {\n      this.samples = options.samples || 1;\n    }\n    if (this.channels == null) {\n      this.channels = options.channels || 4;\n    }\n    if (this.callback == null) {\n      this.callback = options.callback || function () {};\n    }\n  }\n\n  dispose() {\n    return super.dispose();\n  }\n\n  update() {\n    const n = this.fill();\n    this.write(n);\n    return n;\n  }\n\n  setActive(_i, _j, _k, _l) {}\n\n  setCallback(callback) {\n    this.callback = callback;\n  }\n\n  write() {}\n  fill() {}\n  generate(data) {\n    return UData.getStreamer(data, this.samples, this.channels, this.items);\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as CONST from \"three/src/constants.js\";\nimport * as UThree from \"../../../util/three.js\";\n\nimport { Texture } from \"three/src/textures/Texture.js\";\nimport { Vector2 } from \"three/src/math/Vector2.js\";\n\n/*\nManually allocated GL texture for data streaming.\n\nAllows partial updates via subImage.\n*/\nexport class DataTexture {\n  constructor(renderer, width, height, channels, options) {\n    this.renderer = renderer;\n    this.width = width;\n    this.height = height;\n    this.channels = channels;\n    this.n = this.width * this.height * this.channels;\n\n    const gl = this.renderer.getContext();\n    this.gl = gl;\n    const minFilter =\n      (options != null ? options.minFilter : undefined) != null\n        ? options != null\n          ? options.minFilter\n          : undefined\n        : CONST.NearestFilter;\n    const magFilter =\n      (options != null ? options.magFilter : undefined) != null\n        ? options != null\n          ? options.magFilter\n          : undefined\n        : CONST.NearestFilter;\n    const type =\n      (options != null ? options.type : undefined) != null\n        ? options != null\n          ? options.type\n          : undefined\n        : CONST.FloatType;\n\n    this.minFilter = UThree.paramToGL(gl, minFilter);\n    this.magFilter = UThree.paramToGL(gl, magFilter);\n    this.type = UThree.paramToGL(gl, type);\n    this.ctor = UThree.paramToArrayStorage(type);\n\n    this.build(options);\n  }\n\n  build(options) {\n    const { gl } = this;\n    const state = this.renderer.state;\n\n    // Make GL texture\n    this.texture = gl.createTexture();\n    this.format = [null, gl.LUMINANCE, gl.LUMINANCE_ALPHA, gl.RGB, gl.RGBA][\n      this.channels\n    ];\n    this.format3 = [\n      null,\n      CONST.LuminanceFormat,\n      CONST.LuminanceAlphaFormat,\n      CONST.RGBFormat,\n      CONST.RGBAFormat,\n    ][this.channels];\n\n    state.bindTexture(gl.TEXTURE_2D, this.texture);\n\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, this.minFilter);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, this.magFilter);\n\n    // Attach empty data\n    this.data = new this.ctor(this.n);\n    gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);\n    gl.texImage2D(\n      gl.TEXTURE_2D,\n      0,\n      this.format,\n      this.width,\n      this.height,\n      0,\n      this.format,\n      this.type,\n      this.data\n    );\n\n    // Make wrapper texture object.\n    this.textureObject = new Texture(\n      new Image(),\n      CONST.UVMapping,\n      CONST.ClampToEdgeWrapping,\n      CONST.ClampToEdgeWrapping,\n      options != null ? options.minFilter : undefined,\n      options != null ? options.magFilter : undefined\n    );\n\n    // Pre-init texture to trick WebGLRenderer\n    this.textureProperties = this.renderer.properties.get(this.textureObject);\n    this.textureProperties.__webglInit = true;\n    this.textureProperties.__webglTexture = this.texture;\n\n    this.textureObject.format = this.format3;\n    this.textureObject.type = CONST.FloatType;\n    this.textureObject.unpackAlignment = 1;\n    this.textureObject.flipY = false;\n    this.textureObject.generateMipmaps = false;\n\n    // Create uniforms\n    this.uniforms = {\n      dataResolution: {\n        type: \"v2\",\n        value: new Vector2(1 / this.width, 1 / this.height),\n      },\n      dataTexture: {\n        type: \"t\",\n        value: this.textureObject,\n      },\n    };\n  }\n\n  write(data, x, y, w, h) {\n    const { gl } = this;\n    const state = this.renderer.state;\n\n    // Write to rectangle\n    state.bindTexture(gl.TEXTURE_2D, this.texture);\n    gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);\n    gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);\n    gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);\n    return gl.texSubImage2D(\n      gl.TEXTURE_2D,\n      0,\n      x,\n      y,\n      w,\n      h,\n      this.format,\n      this.type,\n      data\n    );\n  }\n\n  dispose() {\n    this.gl.deleteTexture(this.texture);\n\n    this.textureProperties.__webglInit = false;\n    this.textureProperties.__webglTexture = null;\n    this.textureProperties = null;\n    return (this.textureObject = this.texture = null);\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS202: Simplify dynamic range loops\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UData from \"../../util/data.js\";\nimport * as UGLSL from \"../../util/glsl.js\";\n\nimport { Buffer } from \"./buffer.js\";\nimport { DataTexture } from \"./texture/datatexture.js\";\nimport { Vector2 } from \"three/src/math/Vector2.js\";\n\n/*\n * Data buffer on the GPU\n * - Stores samples (1-n) x items (1-n) x channels (1-4)\n * - Provides generic sampler shader\n * - Provides generic copy/write handler\n * => specialized into Array/Matrix/VoxelBuffer\n */\nexport class DataBuffer extends Buffer {\n  constructor(renderer, shaders, options, build) {\n    if (build == null) {\n      build = true;\n    }\n    const width = options.width || 1;\n    const height = options.height || 1;\n    const depth = options.depth || 1;\n    const samples = width * height * depth;\n\n    if (!options.samples) {\n      options.samples = samples;\n    }\n\n    super(renderer, shaders, options);\n\n    this.width = width;\n    this.height = height;\n    this.depth = depth;\n    if (this.samples == null) {\n      this.samples = samples;\n    }\n\n    if (build) {\n      this.build(options);\n    }\n  }\n\n  shader(shader, indices) {\n    if (indices == null) {\n      indices = 4;\n    }\n    if (this.items > 1 || this.depth > 1) {\n      if (indices !== 4) {\n        shader.pipe(UGLSL.extendVec(indices, 4));\n      }\n      shader.pipe(\"map.xyzw.texture\", this.uniforms);\n    } else {\n      if (indices !== 2) {\n        shader.pipe(UGLSL.truncateVec(indices, 2));\n      }\n    }\n\n    const wrap = this.wrap ? \".wrap\" : \"\";\n    shader.pipe(`map.2d.data${wrap}`, this.uniforms);\n    shader.pipe(\"sample.2d\", this.uniforms);\n    if (this.channels < 4) {\n      shader.pipe(\n        UGLSL.swizzleVec4([\"0000\", \"x000\", \"xw00\", \"xyz0\"][this.channels])\n      );\n    }\n    return shader;\n  }\n\n  build(options) {\n    this.data = new Float32Array(this.samples * this.channels * this.items);\n    this.texture = new DataTexture(\n      this.renderer,\n      this.items * this.width,\n      this.height * this.depth,\n      this.channels,\n      options\n    );\n    this.filled = 0;\n    this.used = 0;\n\n    this._adopt(this.texture.uniforms);\n    this._adopt({\n      dataPointer: { type: \"v2\", value: new Vector2() },\n      textureItems: { type: \"f\", value: this.items },\n      textureHeight: { type: \"f\", value: this.height },\n    });\n\n    this.dataPointer = this.uniforms.dataPointer.value;\n    this.streamer = this.generate(this.data);\n  }\n\n  dispose() {\n    this.data = null;\n    this.texture.dispose();\n    return super.dispose();\n  }\n\n  getFilled() {\n    return this.filled;\n  }\n  setCallback(callback) {\n    this.callback = callback;\n    return (this.filled = 0);\n  }\n\n  copy(data) {\n    const n = Math.min(data.length, this.samples * this.channels * this.items);\n    const d = this.data;\n    for (\n      let i = 0, end = n, asc = 0 <= end;\n      asc ? i < end : i > end;\n      asc ? i++ : i--\n    ) {\n      d[i] = data[i];\n    }\n    this.write(Math.ceil(n / this.channels / this.items));\n  }\n\n  write(n) {\n    if (n == null) {\n      n = this.samples;\n    }\n    let height = n / this.width;\n    n *= this.items;\n    const width = height < 1 ? n : this.items * this.width;\n    height = Math.ceil(height);\n\n    this.texture.write(this.data, 0, 0, width, height);\n    this.dataPointer.set(0.5, 0.5);\n\n    this.filled = 1;\n    this.used = n;\n  }\n\n  through(callback, target) {\n    let dst, src;\n    const { consume, done } = (src = this.streamer);\n    const { emit } = (dst = target.streamer);\n\n    let i = 0;\n\n    let pipe = () => consume((x, y, z, w) => callback(emit, x, y, z, w, i));\n    pipe = UData.repeatCall(pipe, this.items);\n\n    return () => {\n      src.reset();\n      dst.reset();\n      const limit = this.used;\n      i = 0;\n      while (!done() && i < limit) {\n        pipe();\n        i++;\n      }\n\n      return src.count();\n    };\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UData from \"../../util/data.js\";\nimport { DataBuffer } from \"./databuffer.js\";\n\n/*\n * 1D + history array\n */\nexport class ArrayBuffer_ extends DataBuffer {\n  constructor(renderer, shaders, options) {\n    const width = options.width || 1;\n    const history = options.history || 1;\n\n    options.width = width;\n    options.height = history;\n    options.depth = 1;\n\n    super(renderer, shaders, options, false);\n\n    this.width = width;\n    this.history = history;\n    this.samples = width;\n    this.wrap = history > 1;\n\n    this.build(options);\n  }\n\n  build(_options) {\n    super.build();\n\n    this.index = 0;\n    this.pad = 0;\n    return (this.streamer = this.generate(this.data));\n  }\n\n  setActive(i) {\n    return (this.pad = Math.max(0, this.width - i));\n  }\n\n  fill() {\n    const { callback } = this;\n    if (typeof callback.reset === \"function\") {\n      callback.reset();\n    }\n\n    const { emit, count, done, reset } = this.streamer;\n    reset();\n\n    const limit = this.samples - this.pad;\n\n    let i = 0;\n    while (!done() && i < limit && callback(emit, i++) !== false) {\n      true;\n    }\n\n    return Math.floor(count() / this.items);\n  }\n\n  write(n) {\n    if (n == null) {\n      n = this.samples;\n    }\n    n *= this.items;\n    this.texture.write(this.data, 0, this.index, n, 1);\n    this.dataPointer.set(0.5, this.index + 0.5);\n    this.index = (this.index + this.history - 1) % this.history;\n    return (this.filled = Math.min(this.history, this.filled + 1));\n  }\n\n  through(callback, target) {\n    let dst, src;\n    const { consume, done } = (src = this.streamer);\n    const { emit } = (dst = target.streamer);\n\n    let i = 0;\n\n    let pipe = () => consume((x, y, z, w) => callback(emit, x, y, z, w, i));\n    pipe = UData.repeatCall(pipe, this.items);\n\n    return () => {\n      src.reset();\n      dst.reset();\n      const limit = this.samples - this.pad;\n      i = 0;\n      while (!done() && i < limit) {\n        pipe();\n        i++;\n      }\n\n      return src.count();\n    };\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS202: Simplify dynamic range loops\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { BufferGeometry } from \"three/src/core/BufferGeometry.js\";\n\nexport class Geometry extends BufferGeometry {\n  constructor() {\n    super();\n    new BufferGeometry(this);\n    if (this.uniforms == null) {\n      this.uniforms = {};\n    }\n    if (this.groups == null) {\n      this.groups = [];\n    }\n  }\n\n  _reduce(dims, maxs) {\n    let multiple = false;\n    for (let i = 0; i < dims.length; i++) {\n      const dim = dims[i];\n      const max = maxs[i];\n      if (multiple) {\n        dims[i] = max;\n      }\n      if (dim > 1) {\n        multiple = true;\n      }\n    }\n\n    return dims.reduce((a, b) => a * b);\n  }\n\n  _emitter(name) {\n    const attribute =\n      name == \"index\" ? this.getIndex() : this.getAttribute(name);\n    const dimensions = attribute.itemSize;\n    const { array } = attribute;\n\n    let offset = 0;\n    const one = function (a) {\n      array[offset++] = a;\n    };\n    const two = function (a, b) {\n      array[offset++] = a;\n      array[offset++] = b;\n    };\n    const three = function (a, b, c) {\n      array[offset++] = a;\n      array[offset++] = b;\n      array[offset++] = c;\n    };\n    const four = function (a, b, c, d) {\n      array[offset++] = a;\n      array[offset++] = b;\n      array[offset++] = c;\n      array[offset++] = d;\n    };\n\n    return [null, one, two, three, four][dimensions];\n  }\n\n  _finalize() {\n    return;\n  }\n\n  _offsets(offsets) {\n    this.groups = offsets;\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { Geometry } from \"./geometry.js\";\nimport { Vector4 } from \"three/src/math/Vector4.js\";\n\n// Instanced geometry that is clippable along 4 dimensions\nexport class ClipGeometry extends Geometry {\n  _clipUniforms() {\n    this.geometryClip = new Vector4(1e10, 1e10, 1e10, 1e10);\n    this.geometryResolution = new Vector4();\n    this.mapSize = new Vector4();\n\n    if (this.uniforms == null) {\n      this.uniforms = {};\n    }\n    this.uniforms.geometryClip = {\n      type: \"v4\",\n      value: this.geometryClip,\n    };\n    this.uniforms.geometryResolution = {\n      type: \"v4\",\n      value: this.geometryResolution,\n    };\n    return (this.uniforms.mapSize = {\n      type: \"v4\",\n      value: this.mapSize,\n    });\n  }\n\n  _clipGeometry(width, height, depth, items) {\n    const c = (x) => Math.max(0, x - 1);\n    const r = (x) => 1 / Math.max(1, x - 1);\n\n    this.geometryClip.set(c(width), c(height), c(depth), c(items));\n    return this.geometryResolution.set(r(width), r(height), r(depth), r(items));\n  }\n\n  _clipMap(mapWidth, mapHeight, mapDepth, mapItems) {\n    return this.mapSize.set(mapWidth, mapHeight, mapDepth, mapItems);\n  }\n\n  _clipOffsets(\n    factor,\n    width,\n    height,\n    depth,\n    items,\n    _width,\n    _height,\n    _depth,\n    _items\n  ) {\n    const dims = [depth, height, width, items];\n    const maxs = [_depth, _height, _width, _items];\n    const elements = this._reduce(dims, maxs);\n\n    return this._offsets([\n      {\n        start: 0,\n        count: elements * factor,\n        materialIndex: 0,\n      },\n    ]);\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS202: Simplify dynamic range loops\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { BufferAttribute } from \"three/src/core/BufferAttribute.js\";\nimport { ClipGeometry } from \"./clipgeometry.js\";\n\n/*\nCones to attach as arrowheads on line strips\n\n.....> .....> .....> .....>\n\n.....> .....> .....> .....>\n\n.....> .....> .....> .....>\n*/\n\nexport class ArrowGeometry extends ClipGeometry {\n  constructor(options) {\n    let anchor, flip, k, layers, ribbons, samples, sides, strips;\n    let asc, end;\n    super(options);\n\n    this._clipUniforms();\n\n    this.sides = sides = +options.sides || 12;\n    this.samples = samples = +options.samples || 2;\n    this.strips = strips = +options.strips || 1;\n    this.ribbons = ribbons = +options.ribbons || 1;\n    this.layers = layers = +options.layers || 1;\n    this.flip = flip = options.flip != null ? options.flip : false;\n    this.anchor = anchor =\n      options.anchor != null ? options.anchor : flip ? 0 : samples - 1;\n\n    const arrows = strips * ribbons * layers;\n    const points = (sides + 2) * arrows;\n    const triangles = sides * 2 * arrows;\n\n    this.setIndex(new BufferAttribute(new Uint32Array(triangles * 3), 1));\n\n    this.setAttribute(\n      \"position4\",\n      new BufferAttribute(new Float32Array(points * 4), 4)\n    );\n    this.setAttribute(\n      \"arrow\",\n      new BufferAttribute(new Float32Array(points * 3), 3)\n    );\n    this.setAttribute(\n      \"attach\",\n      new BufferAttribute(new Float32Array(points * 2), 2)\n    );\n\n    const index = this._emitter(\"index\");\n    const position = this._emitter(\"position4\");\n    const arrow = this._emitter(\"arrow\");\n    const attach = this._emitter(\"attach\");\n\n    const circle = [];\n    for (\n      k = 0, end = sides, asc = 0 <= end;\n      asc ? k < end : k > end;\n      asc ? k++ : k--\n    ) {\n      const angle = (k / sides) * 2 * Math.PI;\n      circle.push([Math.cos(angle), Math.sin(angle), 1]);\n    }\n\n    let base = 0;\n    for (\n      let i = 0, end1 = arrows, asc1 = 0 <= end1;\n      asc1 ? i < end1 : i > end1;\n      asc1 ? i++ : i--\n    ) {\n      let asc2, end2;\n      const tip = base++;\n      const back = tip + sides + 1;\n\n      for (\n        k = 0, end2 = sides, asc2 = 0 <= end2;\n        asc2 ? k < end2 : k > end2;\n        asc2 ? k++ : k--\n      ) {\n        const a = base + (k % sides);\n        const b = base + ((k + 1) % sides);\n\n        index(tip);\n        index(a);\n        index(b);\n\n        index(b);\n        index(a);\n        index(back);\n      }\n\n      base += sides + 1;\n    }\n\n    const step = flip ? 1 : -1;\n    const far = flip ? samples - 1 : 0;\n    const near = anchor + step;\n    const x = anchor;\n\n    for (\n      let l = 0, end3 = layers, asc3 = 0 <= end3;\n      asc3 ? l < end3 : l > end3;\n      asc3 ? l++ : l--\n    ) {\n      for (\n        let z = 0, end4 = ribbons, asc4 = 0 <= end4;\n        asc4 ? z < end4 : z > end4;\n        asc4 ? z++ : z--\n      ) {\n        for (\n          let y = 0, end5 = strips, asc5 = 0 <= end5;\n          asc5 ? y < end5 : y > end5;\n          asc5 ? y++ : y--\n        ) {\n          let asc6, end6;\n          position(x, y, z, l);\n          arrow(0, 0, 0);\n          attach(near, far);\n\n          for (\n            k = 0, end6 = sides, asc6 = 0 <= end6;\n            asc6 ? k < end6 : k > end6;\n            asc6 ? k++ : k--\n          ) {\n            position(x, y, z, l);\n\n            const c = circle[k];\n            arrow(c[0], c[1], c[2]);\n            attach(near, far);\n          }\n\n          position(x, y, z, l);\n          arrow(0, 0, 1);\n          attach(near, far);\n        }\n      }\n    }\n\n    this._finalize();\n    this.clip();\n  }\n\n  clip(samples, strips, ribbons, layers) {\n    let quads;\n    if (samples == null) {\n      ({ samples } = this);\n    }\n    if (strips == null) {\n      ({ strips } = this);\n    }\n    if (ribbons == null) {\n      ({ ribbons } = this);\n    }\n    if (layers == null) {\n      ({ layers } = this);\n    }\n\n    this._clipGeometry(samples, strips, ribbons, layers);\n\n    if (samples > this.anchor) {\n      const dims = [layers, ribbons, strips];\n      const maxs = [this.layers, this.ribbons, this.strips];\n      quads = this.sides * this._reduce(dims, maxs);\n    } else {\n      quads = 0;\n    }\n\n    return this._offsets([\n      {\n        start: 0,\n        count: quads * 6,\n        materialIndex: 0,\n      },\n    ]);\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UGLSL from \"../../util/glsl.js\";\n\nimport { RawShaderMaterial } from \"three/src/materials/RawShaderMaterial.js\";\nimport { Renderable } from \"../renderable.js\";\n\nexport class Base extends Renderable {\n  constructor(renderer, shaders, options) {\n    super(renderer, shaders, options);\n    this.zUnits = options.zUnits != null ? options.zUnits : 0;\n  }\n\n  raw() {\n    for (const object of Array.from(this.renders)) {\n      this._raw(object);\n    }\n    return null;\n  }\n\n  depth(write, test) {\n    for (const object of Array.from(this.renders)) {\n      this._depth(object, write, test);\n    }\n    return null;\n  }\n\n  polygonOffset(factor, units) {\n    for (const object of Array.from(this.renders)) {\n      this._polygonOffset(object, factor, units);\n    }\n    return null;\n  }\n\n  show(transparent, blending, order) {\n    return Array.from(this.renders).map((object) =>\n      this._show(object, transparent, blending, order)\n    );\n  }\n\n  hide() {\n    for (const object of Array.from(this.renders)) {\n      this._hide(object);\n    }\n    return null;\n  }\n\n  _material(options) {\n    const precision = this.renderer.capabilities.precision;\n\n    const vertexPrefix = `\\\n    precision ${precision} float;\n    precision ${precision} int;\nuniform mat4 modelMatrix;\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform mat4 viewMatrix;\nuniform mat3 normalMatrix;\nuniform vec3 cameraPosition;\\\n`;\n\n    const fragmentPrefix = `\\\n    precision ${precision} float;\n    precision ${precision} int;\nuniform mat4 viewMatrix;\nuniform vec3 cameraPosition;\\\n`;\n\n    const shaderOptions = {};\n    Object.assign(shaderOptions, options);\n    delete shaderOptions.attributes;\n    delete shaderOptions.varyings;\n    delete shaderOptions.inspect;\n    delete shaderOptions.vertexGraph;\n    delete shaderOptions.fragmentGraph;\n\n    const material = new RawShaderMaterial(shaderOptions);\n\n    [\"vertexGraph\", \"fragmentGraph\", \"inspect\"].forEach(\n      (key) => (material[key] = options[key])\n    );\n\n    material.vertexShader = [vertexPrefix, material.vertexShader].join(\"\\n\");\n    material.fragmentShader = [fragmentPrefix, material.fragmentShader].join(\n      \"\\n\"\n    );\n    return material;\n  }\n\n  _raw(object) {\n    object.rotationAutoUpdate = false;\n    object.frustumCulled = false;\n    object.matrixAutoUpdate = false;\n    object.material.defaultAttributeValues = undefined;\n  }\n\n  _depth(object, write, test) {\n    const m = object.material;\n    m.depthWrite = write;\n    return (m.depthTest = test);\n  }\n\n  _polygonOffset(object, factor, units) {\n    units -= this.zUnits;\n    const enabled = units !== 0;\n\n    const m = object.material;\n\n    m.polygonOffset = enabled;\n    if (enabled) {\n      m.polygonOffsetFactor = factor;\n      return (m.polygonOffsetUnits = units);\n    }\n  }\n\n  _show(object, transparent, blending, order) {\n    // Force transparent to true to ensure all renderables drawn in order\n    transparent = true;\n\n    const m = object.material;\n\n    object.renderOrder = -order;\n    object.visible = true;\n    m.transparent = transparent;\n    m.blending = blending;\n\n    return null;\n  }\n\n  _hide(object) {\n    return (object.visible = false);\n  }\n\n  _vertexColor(color, mask) {\n    if (!color && !mask) {\n      return;\n    }\n\n    const v = this.shaders.shader();\n\n    if (color) {\n      v.require(color);\n      v.pipe(\"mesh.vertex.color\", this.uniforms);\n    }\n\n    if (mask) {\n      v.require(mask);\n      v.pipe(\"mesh.vertex.mask\", this.uniforms);\n    }\n\n    return v;\n  }\n\n  _vertexPosition(position, material, map, channels, stpq) {\n    let defs;\n    const v = this.shaders.shader();\n\n    if (map || (material && material !== true)) {\n      defs = {};\n      if (channels > 0 || stpq) {\n        defs.POSITION_MAP = \"\";\n      }\n      if (channels > 0) {\n        defs[\n          [\"POSITION_U\", \"POSITION_UV\", \"POSITION_UVW\", \"POSITION_UVWO\"][\n            channels - 1\n          ]\n        ] = \"\";\n      }\n      if (stpq) {\n        defs.POSITION_STPQ = \"\";\n      }\n    }\n\n    v.require(position);\n    return v.pipe(\"mesh.vertex.position\", this.uniforms, defs);\n  }\n\n  _fragmentColor(\n    hasStyle,\n    material,\n    color,\n    mask,\n    map,\n    channels,\n    stpq,\n    combine,\n    linear\n  ) {\n    const f = this.shaders.shader();\n\n    // metacode is terrible\n    let join = false;\n    let gamma = false;\n\n    const defs = {};\n    if (channels > 0) {\n      defs[\n        [\"POSITION_U\", \"POSITION_UV\", \"POSITION_UVW\", \"POSITION_UVWO\"][\n          channels - 1\n        ]\n      ] = \"\";\n    }\n    if (stpq) {\n      defs.POSITION_STPQ = \"\";\n    }\n\n    if (hasStyle) {\n      f.pipe(\"style.color\", this.uniforms);\n      join = true;\n\n      if (color || map || material) {\n        if (!linear || color) {\n          f.pipe(\"mesh.gamma.in\");\n        }\n        gamma = true;\n      }\n    }\n\n    if (color) {\n      f.isolate();\n      f.pipe(\"mesh.fragment.color\", this.uniforms);\n      if (!linear || join) {\n        f.pipe(\"mesh.gamma.in\");\n      }\n      f.end();\n      if (join) {\n        f.pipe(UGLSL.binaryOperator(\"vec4\", \"*\"));\n      }\n\n      if (linear && join) {\n        f.pipe(\"mesh.gamma.out\");\n      }\n\n      join = true;\n      gamma = true;\n    }\n\n    if (map) {\n      if (!join && combine) {\n        f.pipe(UGLSL.constant(\"vec4\", \"vec4(1.0)\"));\n      }\n\n      f.isolate();\n      f.require(map);\n      f.pipe(\"mesh.fragment.map\", this.uniforms, defs);\n      if (!linear) {\n        f.pipe(\"mesh.gamma.in\");\n      }\n      f.end();\n\n      if (combine) {\n        f.pipe(combine);\n      } else {\n        if (join) {\n          f.pipe(UGLSL.binaryOperator(\"vec4\", \"*\"));\n        }\n      }\n\n      join = true;\n      gamma = true;\n    }\n\n    if (material) {\n      if (!join) {\n        f.pipe(UGLSL.constant(\"vec4\", \"vec4(1.0)\"));\n      }\n      if (material === true) {\n        f.pipe(\"mesh.fragment.shaded\", this.uniforms);\n      } else {\n        f.require(material);\n        f.pipe(\"mesh.fragment.material\", this.uniforms, defs);\n      }\n\n      gamma = true;\n    }\n\n    if (gamma && !linear) {\n      f.pipe(\"mesh.gamma.out\");\n    }\n\n    if (mask) {\n      f.pipe(\"mesh.fragment.mask\", this.uniforms);\n      if (join) {\n        f.pipe(UGLSL.binaryOperator(\"vec4\", \"*\"));\n      }\n    }\n\n    return f;\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { ArrowGeometry } from \"../geometry/arrowgeometry.js\";\nimport { Base } from \"./base.js\";\nimport { DoubleSide } from \"three/src/constants.js\";\nimport { Mesh } from \"three/src/objects/Mesh.js\";\n\nexport class Arrow extends Base {\n  constructor(renderer, shaders, options) {\n    let f;\n    super(renderer, shaders, options);\n\n    let { uniforms } = options;\n\n    const { material, position, color, mask, map, combine, stpq, linear } =\n      options;\n    if (uniforms == null) {\n      uniforms = {};\n    }\n\n    const hasStyle = uniforms.styleColor != null;\n\n    this.geometry = new ArrowGeometry({\n      sides: options.sides,\n      samples: options.samples,\n      strips: options.strips,\n      ribbons: options.ribbons,\n      layers: options.layers,\n      anchor: options.anchor,\n      flip: options.flip,\n    });\n\n    this._adopt(uniforms);\n    this._adopt(this.geometry.uniforms);\n\n    const factory = shaders.material();\n\n    const v = factory.vertex;\n\n    v.pipe(this._vertexColor(color, mask));\n\n    v.require(this._vertexPosition(position, material, map, 1, stpq));\n    v.pipe(\"arrow.position\", this.uniforms);\n    v.pipe(\"project.position\", this.uniforms);\n\n    factory.fragment = f = this._fragmentColor(\n      hasStyle,\n      material,\n      color,\n      mask,\n      map,\n      1,\n      stpq,\n      combine,\n      linear\n    );\n\n    f.pipe(\"fragment.color\", this.uniforms);\n\n    const opts = factory.link({\n      side: DoubleSide,\n    });\n    this.material = this._material(opts);\n\n    const object = new Mesh(this.geometry, this.material);\n    object.frustumCulled = false;\n    object.matrixAutoUpdate = false;\n    object.userData = opts;\n\n    this._raw(object);\n    this.renders = [object];\n  }\n\n  dispose() {\n    this.geometry.dispose();\n    this.material.dispose();\n    this.renders = this.geometry = this.material = null;\n    return super.dispose();\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { DataTexture } from \"./datatexture.js\";\n\n/*\nManually allocated GL texture for data streaming, locally backed.\n\nAllows partial updates via subImage.\nContains local copy of its data to allow quick resizing without gl.copyTexImage2d\n(which requires render-to-framebuffer)\n*/\nexport class BackedTexture extends DataTexture {\n  constructor(renderer, width, height, channels, options) {\n    super(renderer, width, height, channels, options);\n    this.data = new this.ctor(this.n);\n  }\n\n  resize(width, height) {\n    const old = this.data;\n    const oldWidth = this.width;\n    const oldHeight = this.height;\n\n    this.width = width;\n    this.height = height;\n    this.n = width * height * this.channels;\n    this.data = new this.ctor(this.n);\n\n    const { gl } = this;\n    const state = this.renderer.state;\n    state.bindTexture(gl.TEXTURE_2D, this.texture);\n    gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);\n    gl.texImage2D(\n      gl.TEXTURE_2D,\n      0,\n      this.format,\n      width,\n      height,\n      0,\n      this.format,\n      this.type,\n      this.data\n    );\n\n    this.uniforms.dataResolution.value.set(1 / width, 1 / height);\n\n    return this.write(old, 0, 0, oldWidth, oldHeight);\n  }\n\n  write(src, x, y, w, h) {\n    let j;\n    const { width } = this;\n    const dst = this.data;\n    const { channels } = this;\n\n    let i = 0;\n    if (width === w && x === 0) {\n      j = y * w * channels;\n      const n = w * h * channels;\n      while (i < n) {\n        dst[j++] = src[i++];\n      }\n    } else {\n      const stride = width * channels;\n      const ww = w * channels;\n      const xx = x * channels;\n      let yy = y;\n      const yh = y + h;\n      while (yy < yh) {\n        let k = 0;\n        j = xx + yy * stride;\n        while (k++ < ww) {\n          dst[j++] = src[i++];\n        }\n        yy++;\n      }\n    }\n\n    return super.write(src, x, y, w, h);\n  }\n\n  dispose() {\n    this.data = null;\n    return super.dispose();\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining\n * DS104: Avoid inline assignments\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UGLSL from \"../../util/glsl.js\";\n\nimport { BackedTexture } from \"./texture/backedtexture.js\";\nimport { DataTexture } from \"./texture/datatexture.js\";\nimport { Renderable } from \"../renderable.js\";\nimport { Vector2 } from \"three/src/math/Vector2.js\";\n\n/*\n * Dynamic sprite atlas\n *\n * - Allocates variable-sized sprites in rows\n * - Will grow itself when full\n */\nexport class Atlas extends Renderable {\n  constructor(renderer, shaders, options, build) {\n    if (build == null) {\n      build = true;\n    }\n    super(renderer, shaders);\n\n    if (this.width == null) {\n      this.width = options.width || 512;\n    }\n    if (this.height == null) {\n      this.height = options.height || 512;\n    }\n    if (this.channels == null) {\n      this.channels = options.channels || 4;\n    }\n    if (this.backed == null) {\n      this.backed = options.backed || false;\n    }\n    this.samples = this.width * this.height;\n\n    if (build) {\n      this.build(options);\n    }\n  }\n\n  shader(shader) {\n    shader.pipe(\"map.2d.data\", this.uniforms);\n    shader.pipe(\"sample.2d\", this.uniforms);\n    if (this.channels < 4) {\n      shader.pipe(\n        UGLSL.swizzleVec4([\"0000\", \"x000\", \"xw00\", \"xyz0\"][this.channels])\n      );\n    }\n    return shader;\n  }\n\n  build(options) {\n    let klass;\n    this.klass = klass = this.backed ? BackedTexture : DataTexture;\n    this.texture = new klass(\n      this.renderer,\n      this.width,\n      this.height,\n      this.channels,\n      options\n    );\n\n    this.uniforms = {\n      dataPointer: {\n        type: \"v2\",\n        value: new Vector2(0, 0),\n      },\n    };\n    this._adopt(this.texture.uniforms);\n\n    return this.reset();\n  }\n\n  reset() {\n    this.rows = [];\n    return (this.bottom = 0);\n  }\n\n  resize(width, height) {\n    if (!this.backed) {\n      throw new Error(\"Cannot resize unbacked texture atlas\");\n    }\n    if (width > 2048 && height > 2048) {\n      console.warn(`Giant text atlas ${width}x${height}.`);\n    } else {\n      console.info(`Resizing text atlas ${width}x${height}.`);\n    }\n\n    this.texture.resize(width, height);\n\n    this.width = width;\n    this.height = height;\n    return (this.samples = width * height);\n  }\n\n  collapse(row) {\n    let left;\n    const { rows } = this;\n    rows.splice(rows.indexOf(row), 1);\n    this.bottom =\n      (left = __guard__(rows[rows.length - 1], (x) => x.bottom)) != null\n        ? left\n        : 0;\n    if (this.last === row) {\n      return (this.last = null);\n    }\n  }\n\n  allocate(key, width, height, emit) {\n    const w = this.width;\n    const h = this.height;\n\n    const max = height * 2;\n\n    if (width > w) {\n      this.resize(w * 2, h * 2);\n      this.last = null;\n      // Try again\n      return this.allocate(key, width, height, emit);\n    }\n\n    // See if we can append to the last used row (fast code path)\n    let row = this.last;\n    if (row != null) {\n      if (row.height >= height && row.height < max && row.width + width <= w) {\n        row.append(key, width, height, emit);\n        return;\n      }\n    }\n\n    // Scan all rows and append to the first suitable one (slower code path)\n    let bottom = 0;\n    let index = -1;\n    let top = 0;\n    for (let i = 0; i < this.rows.length; i++) {\n      // Measure gap between rows\n      // Note suitable holes for later\n      row = this.rows[i];\n      const gap = row.top - bottom;\n      if (gap >= height && index < 0) {\n        index = i;\n        top = bottom;\n      }\n      ({ bottom } = row);\n\n      if (row.height >= height && row.height < max && row.width + width <= w) {\n        row.append(key, width, height, emit);\n        this.last = row;\n        return;\n      }\n    }\n\n    // New row (slowest path)\n    if (index >= 0) {\n      // Fill a gap\n      row = new Row(top, height);\n      this.rows.splice(index, 0, row);\n      //console.log 'fill gap', row\n    } else {\n      // Append to bottom\n      top = bottom;\n      bottom += height;\n\n      // Resize if atlas is full\n      if (bottom >= h) {\n        this.resize(w * 2, h * 2);\n        this.last = null;\n        // Try again\n        return this.allocate(key, width, height, emit);\n      }\n\n      // Add new row to the end\n      row = new Row(top, height);\n      this.rows.push(row);\n      this.bottom = bottom;\n    }\n\n    row.append(key, width, height, emit);\n    this.last = row;\n  }\n\n  read() {\n    return this.texture.textureObject;\n  }\n\n  write(data, x, y, w, h) {\n    return this.texture.write(data, x, y, w, h);\n  }\n\n  dispose() {\n    this.texture.dispose();\n    this.data = null;\n    return super.dispose();\n  }\n}\n\nclass Row {\n  constructor(top, height) {\n    this.top = top;\n    this.bottom = top + height;\n    this.width = 0;\n    this.height = height;\n    this.alive = 0;\n    this.keys = [];\n  }\n\n  append(key, width, height, emit) {\n    const x = this.width;\n    const y = this.top;\n    this.alive++;\n    this.width += width;\n    this.keys.push(key);\n    return emit(this, x, y);\n  }\n}\n\nfunction __guard__(value, transform) {\n  return typeof value !== \"undefined\" && value !== null\n    ? transform(value)\n    : undefined;\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { Base } from \"./base.js\";\nimport { DoubleSide } from \"three/src/constants.js\";\nimport { Mesh } from \"three/src/objects/Mesh.js\";\nimport { MeshBasicMaterial } from \"three/src/materials/MeshBasicMaterial.js\";\nimport { PlaneGeometry } from \"three/src/geometries/PlaneGeometry.js\";\n\nexport class Debug extends Base {\n  constructor(renderer, shaders, options) {\n    super(renderer, shaders, options);\n\n    this.geometry = new PlaneGeometry(1, 1);\n    this.material = new MeshBasicMaterial({ map: options.map });\n    this.material.side = DoubleSide;\n\n    const object = new Mesh(this.geometry, this.material);\n    object.position.x += options.x || 0;\n    object.position.y += options.y || 0;\n    object.frustumCulled = false;\n    object.scale.set(2, 2, 2);\n    object.__debug = true;\n\n    this.objects = [object];\n  }\n\n  dispose() {\n    this.geometry.dispose();\n    this.material.dispose();\n    this.objects = this.geometry = this.material = null;\n    return super.dispose();\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS202: Simplify dynamic range loops\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { BufferAttribute } from \"three/src/core/BufferAttribute.js\";\nimport { ClipGeometry } from \"./clipgeometry.js\";\n\n/*\n(flat) Triangle fans arranged in items, columns and rows\n\n+-+     +-+     +-+     +-+\n|\\\\\\    |\\\\\\    |\\\\\\    |\\\\\\\n+-+-+   +-+-+   +-+-+   +-+-+\n\n+-+     +-+     +-+     +-+\n|\\\\\\    |\\\\\\    |\\\\\\    |\\\\\\\n+-+-+   +-+-+   +-+-+   +-+-+\n\n+-+     +-+     +-+     +-+\n|\\\\\\    |\\\\\\    |\\\\\\    |\\\\\\\n+-+-+   +-+-+   +-+-+   +-+-+\n*/\n\nexport class FaceGeometry extends ClipGeometry {\n  constructor(options) {\n    let depth, height, items, sides, width;\n    super(options);\n\n    this._clipUniforms();\n\n    this.items = items = +options.items || 2;\n    this.width = width = +options.width || 1;\n    this.height = height = +options.height || 1;\n    this.depth = depth = +options.depth || 1;\n    this.sides = sides = Math.max(0, items - 2);\n\n    const samples = width * height * depth;\n    const points = items * samples;\n    const triangles = sides * samples;\n\n    this.setIndex(new BufferAttribute(new Uint32Array(triangles * 3), 1));\n\n    this.setAttribute(\n      \"position4\",\n      new BufferAttribute(new Float32Array(points * 4), 4)\n    );\n\n    const index = this._emitter(\"index\");\n    const position = this._emitter(\"position4\");\n\n    let base = 0;\n    for (\n      let i = 0, end = samples, asc = 0 <= end;\n      asc ? i < end : i > end;\n      asc ? i++ : i--\n    ) {\n      for (\n        let j = 0, end1 = sides, asc1 = 0 <= end1;\n        asc1 ? j < end1 : j > end1;\n        asc1 ? j++ : j--\n      ) {\n        index(base);\n        index(base + j + 1);\n        index(base + j + 2);\n      }\n\n      base += items;\n    }\n\n    for (\n      let z = 0, end2 = depth, asc2 = 0 <= end2;\n      asc2 ? z < end2 : z > end2;\n      asc2 ? z++ : z--\n    ) {\n      for (\n        let y = 0, end3 = height, asc3 = 0 <= end3;\n        asc3 ? y < end3 : y > end3;\n        asc3 ? y++ : y--\n      ) {\n        for (\n          let x = 0, end4 = width, asc4 = 0 <= end4;\n          asc4 ? x < end4 : x > end4;\n          asc4 ? x++ : x--\n        ) {\n          for (\n            let l = 0, end5 = items, asc5 = 0 <= end5;\n            asc5 ? l < end5 : l > end5;\n            asc5 ? l++ : l--\n          ) {\n            position(x, y, z, l);\n          }\n        }\n      }\n    }\n\n    this._finalize();\n    this.clip();\n  }\n\n  clip(width, height, depth, items) {\n    if (width == null) {\n      ({ width } = this);\n    }\n    if (height == null) {\n      ({ height } = this);\n    }\n    if (depth == null) {\n      ({ depth } = this);\n    }\n    if (items == null) {\n      ({ items } = this);\n    }\n    const sides = Math.max(0, items - 2);\n\n    this._clipGeometry(width, height, depth, items);\n    return this._clipOffsets(\n      3,\n      width,\n      height,\n      depth,\n      sides,\n      this.width,\n      this.height,\n      this.depth,\n      this.sides\n    );\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { Base } from \"./base.js\";\nimport { DoubleSide } from \"three/src/constants.js\";\nimport { FaceGeometry } from \"../geometry/facegeometry.js\";\nimport { Mesh } from \"three/src/objects/Mesh.js\";\n\nexport class Face extends Base {\n  constructor(renderer, shaders, options) {\n    let f;\n    super(renderer, shaders, options);\n\n    let { uniforms, material } = options;\n    const { position, color, mask, map, combine, stpq, linear } = options;\n\n    if (uniforms == null) {\n      uniforms = {};\n    }\n    if (material == null) {\n      material = true;\n    }\n\n    const hasStyle = uniforms.styleColor != null;\n\n    this.geometry = new FaceGeometry({\n      items: options.items,\n      width: options.width,\n      height: options.height,\n      depth: options.depth,\n    });\n\n    this._adopt(uniforms);\n    this._adopt(this.geometry.uniforms);\n\n    const factory = shaders.material();\n\n    const v = factory.vertex;\n\n    v.pipe(this._vertexColor(color, mask));\n\n    v.require(this._vertexPosition(position, material, map, 2, stpq));\n    if (!material) {\n      v.pipe(\"face.position\", this.uniforms);\n    }\n    if (material) {\n      v.pipe(\"face.position.normal\", this.uniforms);\n    }\n    v.pipe(\"project.position\", this.uniforms);\n\n    factory.fragment = f = this._fragmentColor(\n      hasStyle,\n      material,\n      color,\n      mask,\n      map,\n      2,\n      stpq,\n      combine,\n      linear\n    );\n\n    f.pipe(\"fragment.color\", this.uniforms);\n\n    const opts = factory.link({\n      side: DoubleSide,\n    });\n    this.material = this._material(opts);\n\n    const object = new Mesh(this.geometry, this.material);\n    object.userData = opts;\n\n    this._raw(object);\n    this.renders = [object];\n  }\n\n  dispose() {\n    this.geometry.dispose();\n    this.material.dispose();\n    this.renders = this.geometry = this.material = null;\n    return super.dispose();\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS202: Simplify dynamic range loops\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { BufferAttribute } from \"three/src/core/BufferAttribute.js\";\nimport { ClipGeometry } from \"./clipgeometry.js\";\n\n/*\nLine strips arranged in columns and rows\n\n+----+ +----+ +----+ +----+\n\n+----+ +----+ +----+ +----+\n\n+----+ +----+ +----+ +----+\n*/\n\nexport class LineGeometry extends ClipGeometry {\n  constructor(options) {\n    let closed,\n      detail,\n      edge,\n      joint,\n      joints,\n      l,\n      layers,\n      ribbons,\n      samples,\n      segments,\n      strips,\n      vertices,\n      x,\n      y,\n      z;\n    super(options);\n\n    this._clipUniforms();\n\n    this.closed = closed = options.closed || false;\n    this.samples = samples = (+options.samples || 2) + (closed ? 1 : 0);\n    this.strips = strips = +options.strips || 1;\n    this.ribbons = ribbons = +options.ribbons || 1;\n    this.layers = layers = +options.layers || 1;\n    this.detail = detail = +options.detail || 1;\n\n    const lines = samples - 1;\n    this.joints = joints = detail - 1;\n\n    this.vertices = vertices = (lines - 1) * joints + samples;\n    this.segments = segments = (lines - 1) * joints + lines;\n\n    const wrap = samples - (closed ? 1 : 0);\n    const points = vertices * strips * ribbons * layers * 2;\n    const quads = segments * strips * ribbons * layers;\n    const triangles = quads * 2;\n\n    this.setIndex(new BufferAttribute(new Uint32Array(triangles * 3), 1));\n\n    this.setAttribute(\n      \"position4\",\n      new BufferAttribute(new Float32Array(points * 4), 4)\n    );\n    this.setAttribute(\n      \"line\",\n      new BufferAttribute(new Float32Array(points * 2), 2)\n    );\n    this.setAttribute(\n      \"strip\",\n      new BufferAttribute(new Float32Array(points * 2), 2)\n    );\n    if (detail > 1) {\n      this.setAttribute(\n        \"joint\",\n        new BufferAttribute(new Float32Array(points), 1)\n      );\n    }\n\n    const index = this._emitter(\"index\");\n    const position = this._emitter(\"position4\");\n    const line = this._emitter(\"line\");\n    const strip = this._emitter(\"strip\");\n    if (detail > 1) {\n      joint = this._emitter(\"joint\");\n    }\n\n    let base = 0;\n    for (\n      let i = 0, end = ribbons * layers, asc = 0 <= end;\n      asc ? i < end : i > end;\n      asc ? i++ : i--\n    ) {\n      for (\n        let j = 0, end1 = strips, asc1 = 0 <= end1;\n        asc1 ? j < end1 : j > end1;\n        asc1 ? j++ : j--\n      ) {\n        for (\n          let k = 0, end2 = segments, asc2 = 0 <= end2;\n          asc2 ? k < end2 : k > end2;\n          asc2 ? k++ : k--\n        ) {\n          // note implied - 1\n          index(base);\n          index(base + 1);\n          index(base + 2);\n\n          index(base + 2);\n          index(base + 1);\n          index(base + 3);\n\n          base += 2;\n        }\n        base += 2;\n      }\n    }\n\n    const edger = closed\n      ? () => 0\n      : function (x) {\n          if (x === 0) {\n            return -1;\n          } else if (x === samples - 1) {\n            return 1;\n          } else {\n            return 0;\n          }\n        };\n\n    if (detail > 1) {\n      let asc3, end3;\n      for (\n        l = 0, end3 = layers, asc3 = 0 <= end3;\n        asc3 ? l < end3 : l > end3;\n        asc3 ? l++ : l--\n      ) {\n        let asc4, end4;\n        for (\n          z = 0, end4 = ribbons, asc4 = 0 <= end4;\n          asc4 ? z < end4 : z > end4;\n          asc4 ? z++ : z--\n        ) {\n          let asc5, end5;\n          for (\n            y = 0, end5 = strips, asc5 = 0 <= end5;\n            asc5 ? y < end5 : y > end5;\n            asc5 ? y++ : y--\n          ) {\n            let asc6, end6, i1;\n            for (\n              i1 = 0, x = i1, end6 = samples, asc6 = 0 <= end6;\n              asc6 ? i1 < end6 : i1 > end6;\n              asc6 ? i1++ : i1--, x = i1\n            ) {\n              if (closed) {\n                x = x % wrap;\n              }\n              edge = edger(x);\n\n              if (edge !== 0) {\n                position(x, y, z, l);\n                position(x, y, z, l);\n\n                line(edge, 1);\n                line(edge, -1);\n\n                strip(0, segments);\n                strip(0, segments);\n\n                joint(0.5);\n                joint(0.5);\n              } else {\n                for (\n                  let m = 0, end7 = detail, asc7 = 0 <= end7;\n                  asc7 ? m < end7 : m > end7;\n                  asc7 ? m++ : m--\n                ) {\n                  position(x, y, z, l);\n                  position(x, y, z, l);\n\n                  line(edge, 1);\n                  line(edge, -1);\n\n                  strip(0, segments);\n                  strip(0, segments);\n\n                  joint(m / joints);\n                  joint(m / joints);\n                }\n              }\n            }\n          }\n        }\n      }\n    } else {\n      let asc8, end8;\n      for (\n        l = 0, end8 = layers, asc8 = 0 <= end8;\n        asc8 ? l < end8 : l > end8;\n        asc8 ? l++ : l--\n      ) {\n        let asc9, end9;\n        for (\n          z = 0, end9 = ribbons, asc9 = 0 <= end9;\n          asc9 ? z < end9 : z > end9;\n          asc9 ? z++ : z--\n        ) {\n          let asc10, end10;\n          for (\n            y = 0, end10 = strips, asc10 = 0 <= end10;\n            asc10 ? y < end10 : y > end10;\n            asc10 ? y++ : y--\n          ) {\n            let asc11, end11, j1;\n            for (\n              j1 = 0, x = j1, end11 = samples, asc11 = 0 <= end11;\n              asc11 ? j1 < end11 : j1 > end11;\n              asc11 ? j1++ : j1--, x = j1\n            ) {\n              if (closed) {\n                x = x % wrap;\n              }\n              edge = edger(x);\n\n              position(x, y, z, l);\n              position(x, y, z, l);\n\n              line(edge, 1);\n              line(edge, -1);\n\n              strip(0, segments);\n              strip(0, segments);\n            }\n          }\n        }\n      }\n    }\n\n    this._finalize();\n    this.clip();\n  }\n\n  clip(samples, strips, ribbons, layers) {\n    if (samples == null) {\n      samples = this.samples - this.closed;\n    }\n    if (strips == null) {\n      ({ strips } = this);\n    }\n    if (ribbons == null) {\n      ({ ribbons } = this);\n    }\n    if (layers == null) {\n      ({ layers } = this);\n    }\n    let segments = Math.max(0, samples - (this.closed ? 0 : 1));\n\n    const vertices = samples + (samples - 2) * this.joints;\n    segments = vertices - 1;\n\n    this._clipGeometry(vertices, strips, ribbons, layers);\n    return this._clipOffsets(\n      6,\n      segments,\n      strips,\n      ribbons,\n      layers,\n      this.segments,\n      this.strips,\n      this.ribbons,\n      this.layers\n    );\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { Base } from \"./base.js\";\nimport { DoubleSide } from \"three/src/constants.js\";\nimport { LineGeometry } from \"../geometry/linegeometry.js\";\nimport { Mesh } from \"three/src/objects/Mesh.js\";\n\nexport class Line extends Base {\n  constructor(renderer, shaders, options) {\n    let left;\n    super(renderer, shaders, options);\n\n    let { uniforms, stroke, join } = options;\n\n    const {\n      material,\n      position,\n      color,\n      mask,\n      map,\n      combine,\n      stpq,\n      linear,\n      clip,\n      proximity,\n    } = options;\n\n    if (uniforms == null) {\n      uniforms = {};\n    }\n    stroke = [null, \"dotted\", \"dashed\"][stroke];\n\n    const hasStyle = uniforms.styleColor != null;\n\n    // Line join\n    join = (left = [\"miter\", \"round\", \"bevel\"][join]) != null ? left : \"miter\";\n    const detail = { miter: 1, round: 4, bevel: 2 }[join];\n\n    this.geometry = new LineGeometry({\n      samples: options.samples,\n      strips: options.strips,\n      ribbons: options.ribbons,\n      layers: options.layers,\n      anchor: options.anchor,\n      closed: options.closed,\n      detail,\n    });\n\n    this._adopt(uniforms);\n    this._adopt(this.geometry.uniforms);\n\n    const factory = shaders.material();\n\n    const defs = {};\n    if (stroke) {\n      defs.LINE_STROKE = \"\";\n    }\n    if (clip) {\n      defs.LINE_CLIP = \"\";\n    }\n    if (proximity != null) {\n      defs.LINE_PROXIMITY = \"\";\n    }\n\n    defs[\"LINE_JOIN_\" + join.toUpperCase()] = \"\";\n    if (detail > 1) {\n      defs[\"LINE_JOIN_DETAIL\"] = detail;\n    }\n\n    const v = factory.vertex;\n\n    v.pipe(this._vertexColor(color, mask));\n\n    v.require(this._vertexPosition(position, material, map, 2, stpq));\n    v.pipe(\"line.position\", this.uniforms, defs);\n    v.pipe(\"project.position\", this.uniforms);\n\n    const f = factory.fragment;\n    if (stroke) {\n      f.pipe(`fragment.clip.${stroke}`, this.uniforms);\n    }\n    if (clip) {\n      f.pipe(\"fragment.clip.ends\", this.uniforms);\n    }\n    if (proximity != null) {\n      f.pipe(\"fragment.clip.proximity\", this.uniforms);\n    }\n\n    f.pipe(\n      this._fragmentColor(\n        hasStyle,\n        material,\n        color,\n        mask,\n        map,\n        2,\n        stpq,\n        combine,\n        linear\n      )\n    );\n\n    f.pipe(\"fragment.color\", this.uniforms);\n\n    const opts = factory.link({\n      side: DoubleSide,\n    });\n    this.material = this._material(opts);\n\n    const object = new Mesh(this.geometry, this.material);\n    object.userData = opts;\n\n    this._raw(object);\n    this.renders = [object];\n  }\n\n  dispose() {\n    this.geometry.dispose();\n    this.material.dispose();\n    this.renders = this.geometry = this.material = null;\n    return super.dispose();\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UData from \"../../util/data.js\";\nimport { DataBuffer } from \"./databuffer.js\";\n\n/*\n * 2D + history array\n */\nexport class MatrixBuffer extends DataBuffer {\n  constructor(renderer, shaders, options) {\n    const width = options.width || 1;\n    const height = options.height || 1;\n    const history = options.history || 1;\n\n    options.depth = history;\n\n    super(renderer, shaders, options, false);\n\n    this.width = width;\n    this.height = height;\n    this.history = history;\n    this.samples = width * height;\n    this.wrap = history > 1;\n\n    this.build(options);\n  }\n\n  build(_options) {\n    super.build();\n\n    this.index = 0;\n    this.pad = { x: 0, y: 0 };\n    return (this.streamer = this.generate(this.data));\n  }\n\n  getFilled() {\n    return this.filled;\n  }\n\n  setActive(i, j) {\n    let ref;\n    return (\n      ([this.pad.x, this.pad.y] = Array.from(\n        (ref = [Math.max(0, this.width - i), Math.max(0, this.height - j)])\n      )),\n      ref\n    );\n  }\n\n  fill() {\n    let j, k, repeat;\n    const { callback } = this;\n    if (typeof callback.reset === \"function\") {\n      callback.reset();\n    }\n\n    const { emit, skip, count, done, reset } = this.streamer;\n    reset();\n\n    const n = this.width;\n    const pad = this.pad.x;\n    const limit = this.samples - this.pad.y * n;\n\n    let i = (j = k = 0);\n    if (pad) {\n      while (!done() && k < limit) {\n        k++;\n        repeat = callback(emit, i, j);\n        if (++i === n - pad) {\n          skip(pad);\n          i = 0;\n          j++;\n        }\n        if (repeat === false) {\n          break;\n        }\n      }\n    } else {\n      while (!done() && k < limit) {\n        k++;\n        repeat = callback(emit, i, j);\n        if (++i === n) {\n          i = 0;\n          j++;\n        }\n        if (repeat === false) {\n          break;\n        }\n      }\n    }\n\n    return Math.floor(count() / this.items);\n  }\n\n  write(n) {\n    if (n == null) {\n      n = this.samples;\n    }\n    n *= this.items;\n    const width = this.width * this.items;\n    const height = Math.ceil(n / width);\n\n    this.texture.write(this.data, 0, this.index * this.height, width, height);\n    this.dataPointer.set(0.5, this.index * this.height + 0.5);\n    this.index = (this.index + this.history - 1) % this.history;\n    return (this.filled = Math.min(this.history, this.filled + 1));\n  }\n\n  through(callback, target) {\n    let dst, j, src;\n    const { consume, skip, done } = (src = this.streamer);\n    const { emit } = (dst = target.streamer);\n\n    let i = (j = 0);\n\n    let pipe = () => consume((x, y, z, w) => callback(emit, x, y, z, w, i, j));\n    pipe = UData.repeatCall(pipe, this.items);\n\n    return () => {\n      let k;\n      src.reset();\n      dst.reset();\n\n      const n = this.width;\n      const pad = this.pad.x;\n      const limit = this.samples - this.pad.y * n;\n\n      i = j = k = 0;\n      if (pad) {\n        while (!done() && k < limit) {\n          k++;\n          pipe();\n          if (++i === n - pad) {\n            skip(pad);\n            i = 0;\n            j++;\n          }\n        }\n      } else {\n        while (!done() && k < limit) {\n          k++;\n          pipe();\n          if (++i === n) {\n            i = 0;\n            j++;\n          }\n        }\n      }\n\n      return src.count();\n    };\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS202: Simplify dynamic range loops\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n/*\nVirtual RenderTarget that cycles through multiple frames\nProvides easy access to past rendered frames\n@reads[] and @write contain WebGLRenderTargets whose internal pointers are rotated automatically\n*/\n\nimport {\n  NearestFilter,\n  RGBAFormat,\n  UnsignedByteType,\n} from \"three/src/constants.js\";\nimport { Vector2 } from \"three/src/math/Vector2.js\";\nimport { WebGLRenderTarget } from \"three/src/renderers/WebGLRenderTarget.js\";\n\nexport class RenderTarget {\n  constructor(gl, width, height, frames, options) {\n    this.gl = gl;\n    if (options == null) {\n      options = {};\n    }\n    if (options.minFilter == null) {\n      options.minFilter = NearestFilter;\n    }\n    if (options.magFilter == null) {\n      options.magFilter = NearestFilter;\n    }\n    if (options.format == null) {\n      options.format = RGBAFormat;\n    }\n    if (options.type == null) {\n      options.type = UnsignedByteType;\n    }\n\n    this.options = options;\n\n    this.width = width || 1;\n    this.height = height || 1;\n    this.frames = frames || 1;\n    this.buffers = this.frames + 1;\n\n    this.build();\n  }\n\n  build() {\n    let i;\n    const make = () =>\n      new WebGLRenderTarget(this.width, this.height, this.options);\n\n    this.targets = (() => {\n      let asc, end;\n      const result = [];\n      for (\n        i = 0, end = this.buffers, asc = 0 <= end;\n        asc ? i < end : i > end;\n        asc ? i++ : i--\n      ) {\n        result.push(make());\n      }\n      return result;\n    })();\n\n    const acc = [];\n    this.targets.forEach((target) => acc.push(target.texture));\n    this.reads = acc;\n\n    this.write = this.targets[this.buffers - 1];\n\n    // Texture access uniforms\n    this.uniforms = {\n      dataResolution: {\n        type: \"v2\",\n        value: new Vector2(1 / this.width, 1 / this.height),\n      },\n      dataTexture: {\n        type: \"t\",\n        value: this.reads[0],\n      },\n      dataTextures: {\n        type: \"tv\",\n        value: this.reads,\n      },\n    };\n  }\n\n  cycle() {\n    this.targets.unshift(this.targets.pop());\n    this.write = this.targets[this.buffers - 1];\n    this.reads.unshift(this.reads.pop());\n    this.uniforms.dataTexture.value = this.reads[0];\n  }\n\n  warmup(callback) {\n    return (() => {\n      const result = [];\n      for (\n        let i = 0, end = this.buffers, asc = 0 <= end;\n        asc ? i < end : i > end;\n        asc ? i++ : i--\n      ) {\n        callback(this.write);\n        result.push(this.cycle());\n      }\n      return result;\n    })();\n  }\n\n  dispose() {\n    for (const target of Array.from(this.targets)) {\n      target.dispose();\n    }\n    return (this.targets = this.reads = this.write = null);\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UGLSL from \"../../util/glsl.js\";\n\nimport { PerspectiveCamera } from \"three/src/cameras/PerspectiveCamera.js\";\nimport { RenderTarget } from \"./texture/rendertarget.js\";\nimport { Renderable } from \"../renderable.js\";\nimport { Scene } from \"three/src/scenes/Scene.js\";\nimport { Vector2 } from \"three/src/math/Vector2.js\";\nimport { Vector3 } from \"three/src/math/Vector3.js\";\n\n/*\n * Render-To-Texture with history\n */\nexport class RenderToTexture extends Renderable {\n  constructor(renderer, shaders, options) {\n    super(renderer, shaders);\n\n    this.scene = options.scene != null ? options.scene : new Scene();\n    this.camera = options.camera;\n\n    this.build(options);\n  }\n\n  shaderRelative(shader) {\n    if (shader == null) {\n      shader = this.shaders.shader();\n    }\n    return shader.pipe(\"sample.2d\", this.uniforms);\n  }\n\n  shaderAbsolute(shader, frames, indices) {\n    if (frames == null) {\n      frames = 1;\n    }\n    if (indices == null) {\n      indices = 4;\n    }\n    if (shader == null) {\n      shader = this.shaders.shader();\n    }\n    if (frames <= 1) {\n      if (indices > 2) {\n        shader.pipe(UGLSL.truncateVec(indices, 2));\n      }\n      shader.pipe(\"map.2d.data\", this.uniforms);\n      return shader.pipe(\"sample.2d\", this.uniforms);\n    } else {\n      const sample2DArray = UGLSL.sample2DArray(\n        Math.min(frames, this.target.frames)\n      );\n      if (indices < 4) {\n        shader.pipe(UGLSL.extendVec(indices, 4));\n      }\n      shader.pipe(\"map.xyzw.2dv\");\n      shader.split();\n      shader.pipe(\"map.2d.data\", this.uniforms);\n      shader.pass();\n      return shader.pipe(sample2DArray, this.uniforms);\n    }\n  }\n\n  build(options) {\n    if (!this.camera) {\n      this.camera = new PerspectiveCamera();\n      this.camera.position.set(0, 0, 3);\n      this.camera.lookAt(new Vector3());\n    }\n    if (typeof this.scene.inject === \"function\") {\n      this.scene.inject();\n    }\n\n    this.target = new RenderTarget(\n      this.gl,\n      options.width,\n      options.height,\n      options.frames,\n      options\n    );\n    this.target.warmup((target) => this.renderer.setRenderTarget(target));\n    this.renderer.setRenderTarget(null);\n\n    this._adopt(this.target.uniforms);\n    this._adopt({\n      dataPointer: {\n        type: \"v2\",\n        value: new Vector2(0.5, 0.5),\n      },\n    });\n\n    return (this.filled = 0);\n  }\n\n  adopt(renderable) {\n    return Array.from(renderable.renders).map((object) =>\n      this.scene.add(object)\n    );\n  }\n  unadopt(renderable) {\n    return Array.from(renderable.renders).map((object) =>\n      this.scene.remove(object)\n    );\n  }\n\n  render(camera) {\n    if (camera == null) {\n      ({ camera } = this);\n    }\n    const currentTarget = this.renderer.getRenderTarget();\n    this.renderer.setRenderTarget(this.target.write);\n    this.renderer.render(\n      this.scene.scene != null ? this.scene.scene : this.scene,\n      camera\n    );\n    this.renderer.setRenderTarget(currentTarget);\n\n    this.target.cycle();\n    if (this.filled < this.target.frames) {\n      return this.filled++;\n    }\n  }\n\n  read(frame) {\n    if (frame == null) {\n      frame = 0;\n    }\n    return this.target.reads[Math.abs(frame)];\n  }\n\n  getFrames() {\n    return this.target.frames;\n  }\n\n  getFilled() {\n    return this.filled;\n  }\n\n  dispose() {\n    if (typeof this.scene.unject === \"function\") {\n      this.scene.unject();\n    }\n    this.scene = this.camera = null;\n\n    this.target.dispose();\n\n    return super.dispose();\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { RGBAFormat } from \"three/src/constants.js\";\nimport { RenderToTexture } from \"./rendertotexture.js\";\n\n/*\n * Wrapped RTT for memoizing 4D arrays back to a 2D texture\n */\nexport class Memo extends RenderToTexture {\n  constructor(renderer, shaders, options) {\n    let _height, _width;\n    const items = options.items || 1;\n    const channels = options.channels || 4;\n    const width = options.width || 1;\n    const height = options.height || 1;\n    const depth = options.depth || 1;\n\n    //options.format = [null, THREE.LuminanceFormat, THREE.LuminanceAlphaFormat, THREE.RGBFormat, THREE.RGBAFormat][@channels]\n    options.format = RGBAFormat;\n    options.width = _width = items * width;\n    options.height = _height = height * depth;\n    options.frames = 1;\n\n    delete options.items;\n    delete options.depth;\n    delete options.channels;\n\n    super(renderer, shaders, options);\n\n    if (this.items == null) {\n      this.items = items;\n    }\n    if (this.channels == null) {\n      this.channels = channels;\n    }\n    if (this.width == null) {\n      this.width = width;\n    }\n    this._width = _width;\n    if (this.height == null) {\n      this.height = height;\n    }\n    this._height = _height;\n    if (this.depth == null) {\n      this.depth = depth;\n    }\n\n    this._adopt({\n      textureItems: { type: \"f\", value: this.items },\n      textureHeight: { type: \"f\", value: this.height },\n    });\n  }\n\n  shaderAbsolute(shader) {\n    if (shader == null) {\n      shader = this.shaders.shader();\n    }\n    shader.pipe(\"map.xyzw.texture\", this.uniforms);\n    return super.shaderAbsolute(shader, 1, 2);\n  }\n}\n//shader.pipe Util.GLSL.swizzleVec4 ['0000', 'x000', 'xw00', 'xyz0'][@channels] if @channels < 4\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS202: Simplify dynamic range loops\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { BufferAttribute } from \"three/src/core/BufferAttribute.js\";\nimport { ClipGeometry } from \"./clipgeometry.js\";\n\n/*\nGrid Surface\n\n+----+----+----+----+\n|    |    |    |    |\n+----+----+----+----+\n|    |    |    |    |\n+----+----+----+----+\n\n+----+----+----+----+\n|    |    |    |    |\n+----+----+----+----+\n|    |    |    |    |\n+----+----+----+----+\n*/\n\nexport class SurfaceGeometry extends ClipGeometry {\n  constructor(options, build) {\n    if (build == null) {\n      build = true;\n    }\n    super();\n    // TODO not great... but use this pattern, maybe, to defer construction if\n    // options are missing, NOT the boolean.\n    if (build) {\n      this.construct(options);\n    }\n  }\n\n  construct(options) {\n    let closedX, closedY, height, layers, segmentsX, segmentsY, surfaces, width;\n    this._clipUniforms();\n\n    this.closedX = closedX = options.closedX || false;\n    this.closedY = closedY = options.closedY || false;\n    this.width = width = (+options.width || 2) + (closedX ? 1 : 0);\n    this.height = height = (+options.height || 2) + (closedY ? 1 : 0);\n    this.surfaces = surfaces = +options.surfaces || 1;\n    this.layers = layers = +options.layers || 1;\n\n    const wrapX = width - (closedX ? 1 : 0);\n    const wrapY = height - (closedY ? 1 : 0);\n\n    this.segmentsX = segmentsX = Math.max(0, width - 1);\n    this.segmentsY = segmentsY = Math.max(0, height - 1);\n\n    const points = width * height * surfaces * layers;\n    const quads = segmentsX * segmentsY * surfaces * layers;\n    const triangles = quads * 2;\n\n    this.setIndex(new BufferAttribute(new Uint32Array(triangles * 3), 1));\n\n    this.setAttribute(\n      \"position4\",\n      new BufferAttribute(new Float32Array(points * 4), 4)\n    );\n    this.setAttribute(\n      \"surface\",\n      new BufferAttribute(new Float32Array(points * 2), 2)\n    );\n\n    const index = this._emitter(\"index\");\n    const position = this._emitter(\"position4\");\n    const surface = this._emitter(\"surface\");\n\n    let base = 0;\n    for (\n      let i = 0, end = surfaces * layers, asc = 0 <= end;\n      asc ? i < end : i > end;\n      asc ? i++ : i--\n    ) {\n      for (\n        let j = 0, end1 = segmentsY, asc1 = 0 <= end1;\n        asc1 ? j < end1 : j > end1;\n        asc1 ? j++ : j--\n      ) {\n        for (\n          let k = 0, end2 = segmentsX, asc2 = 0 <= end2;\n          asc2 ? k < end2 : k > end2;\n          asc2 ? k++ : k--\n        ) {\n          index(base);\n          index(base + 1);\n          index(base + width);\n\n          index(base + width);\n          index(base + 1);\n          index(base + width + 1);\n\n          base++;\n        }\n        base++;\n      }\n      base += width;\n    }\n\n    const edgerX = closedX\n      ? () => 0\n      : function (x) {\n          if (x === 0) {\n            return -1;\n          } else if (x === segmentsX) {\n            return 1;\n          } else {\n            return 0;\n          }\n        };\n\n    const edgerY = closedY\n      ? () => 0\n      : function (y) {\n          if (y === 0) {\n            return -1;\n          } else if (y === segmentsY) {\n            return 1;\n          } else {\n            return 0;\n          }\n        };\n\n    for (\n      let l = 0, end3 = layers, asc3 = 0 <= end3;\n      asc3 ? l < end3 : l > end3;\n      asc3 ? l++ : l--\n    ) {\n      for (\n        let z = 0, end4 = surfaces, asc4 = 0 <= end4;\n        asc4 ? z < end4 : z > end4;\n        asc4 ? z++ : z--\n      ) {\n        for (\n          let i1 = 0, y = i1, end5 = height, asc5 = 0 <= end5;\n          asc5 ? i1 < end5 : i1 > end5;\n          asc5 ? i1++ : i1--, y = i1\n        ) {\n          if (closedY) {\n            y = y % wrapY;\n          }\n          const edgeY = edgerY(y);\n\n          for (\n            let j1 = 0, x = j1, end6 = width, asc6 = 0 <= end6;\n            asc6 ? j1 < end6 : j1 > end6;\n            asc6 ? j1++ : j1--, x = j1\n          ) {\n            if (closedX) {\n              x = x % wrapX;\n            }\n            const edgeX = edgerX(x);\n\n            position(x, y, z, l);\n\n            surface(edgeX, edgeY);\n          }\n        }\n      }\n    }\n\n    this._finalize();\n    this.clip();\n  }\n\n  clip(width, height, surfaces, layers) {\n    if (width == null) {\n      ({ width } = this);\n    }\n    if (height == null) {\n      ({ height } = this);\n    }\n    if (surfaces == null) {\n      ({ surfaces } = this);\n    }\n    if (layers == null) {\n      ({ layers } = this);\n    }\n    const segmentsX = Math.max(0, width - 1);\n    const segmentsY = Math.max(0, height - 1);\n\n    this._clipGeometry(width, height, surfaces, layers);\n    return this._clipOffsets(\n      6,\n      segmentsX,\n      segmentsY,\n      surfaces,\n      layers,\n      this.segmentsX,\n      this.segmentsY,\n      this.surfaces,\n      this.layers\n    );\n  }\n\n  map(width, height, surfaces, layers) {\n    if (width == null) {\n      ({ width } = this);\n    }\n    if (height == null) {\n      ({ height } = this);\n    }\n    if (surfaces == null) {\n      ({ surfaces } = this);\n    }\n    if (layers == null) {\n      ({ layers } = this);\n    }\n    return this._clipMap(width, height, surfaces, layers);\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { SurfaceGeometry } from \"./surfacegeometry.js\";\nimport { Vector4 } from \"three/src/math/Vector4.js\";\n\n/*\nGrid Surface in normalized screen space\n\n+----+----+----+----+\n|    |    |    |    |\n+----+----+----+----+\n|    |    |    |    |\n+----+----+----+----+\n\n+----+----+----+----+\n|    |    |    |    |\n+----+----+----+----+\n|    |    |    |    |\n+----+----+----+----+\n*/\n\nexport class ScreenGeometry extends SurfaceGeometry {\n  constructor(options) {\n    options.width = Math.max(2, +options.width != null ? +options.width : 2);\n    options.height = Math.max(2, +options.height != null ? +options.height : 2);\n\n    super(options, false);\n\n    if (this.uniforms == null) {\n      this.uniforms = {};\n    }\n    this.uniforms.geometryScale = {\n      type: \"v4\",\n      value: new Vector4(),\n    };\n\n    this.cover();\n    this.construct(options);\n  }\n\n  cover(scaleX, scaleY, scaleZ, scaleW) {\n    if (scaleX == null) {\n      scaleX = 1;\n    }\n    this.scaleX = scaleX;\n    if (scaleY == null) {\n      scaleY = 1;\n    }\n    this.scaleY = scaleY;\n    if (scaleZ == null) {\n      scaleZ = 1;\n    }\n    this.scaleZ = scaleZ;\n    if (scaleW == null) {\n      scaleW = 1;\n    }\n    this.scaleW = scaleW;\n  }\n\n  clip(width, height, surfaces, layers) {\n    if (width == null) {\n      ({ width } = this);\n    }\n    if (height == null) {\n      ({ height } = this);\n    }\n    if (surfaces == null) {\n      ({ surfaces } = this);\n    }\n    if (layers == null) {\n      ({ layers } = this);\n    }\n    super.clip(width, height, surfaces, layers);\n\n    const invert = (x) => 1 / Math.max(1, x - 1);\n    return this.uniforms.geometryScale.value.set(\n      invert(width) * this.scaleX,\n      invert(height) * this.scaleY,\n      invert(surfaces) * this.scaleZ,\n      invert(layers) * this.scaleW\n    );\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { Base } from \"./base.js\";\nimport { DoubleSide } from \"three/src/constants.js\";\nimport { Mesh } from \"three/src/objects/Mesh.js\";\nimport { ScreenGeometry } from \"../geometry/screengeometry.js\";\n\nexport class Screen extends Base {\n  constructor(renderer, shaders, options) {\n    let f;\n    super(renderer, shaders, options);\n\n    let { uniforms } = options;\n    const { map, combine, stpq, linear } = options;\n\n    if (uniforms == null) {\n      uniforms = {};\n    }\n\n    const hasStyle = uniforms.styleColor != null;\n\n    this.geometry = new ScreenGeometry({\n      width: options.width,\n      height: options.height,\n    });\n\n    this._adopt(uniforms);\n    this._adopt(this.geometry.uniforms);\n\n    const factory = shaders.material();\n\n    const v = factory.vertex;\n    v.pipe(\"raw.position.scale\", this.uniforms);\n    v.fan();\n    v.pipe(\"stpq.xyzw.2d\", this.uniforms);\n    v.next();\n    v.pipe(\"screen.position\", this.uniforms);\n    v.join();\n\n    factory.fragment = f = this._fragmentColor(\n      hasStyle,\n      false,\n      null,\n      null,\n      map,\n      2,\n      stpq,\n      combine,\n      linear\n    );\n\n    f.pipe(\"fragment.color\", this.uniforms);\n\n    const opts = factory.link({\n      side: DoubleSide,\n    });\n    this.material = this._material(opts);\n\n    const object = new Mesh(this.geometry, this.material);\n    object.frustumCulled = false;\n    object.userData = opts;\n\n    this._raw(object);\n    this.renders = [object];\n  }\n\n  dispose() {\n    this.geometry.dispose();\n    this.material.dispose();\n    this.renders = this.geometry = this.material = null;\n    return super.dispose();\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { Screen } from \"./screen.js\";\nimport { Vector2 } from \"three/src/math/Vector2.js\";\nimport { Vector4 } from \"three/src/math/Vector4.js\";\n\nexport class MemoScreen extends Screen {\n  constructor(renderer, shaders, options) {\n    const { items, width, height, depth, stpq } = options;\n\n    const inv = (x) => 1 / Math.max(1, x);\n    const inv1 = (x) => 1 / Math.max(1, x - 1);\n\n    const uniforms = {\n      remapUVScale: {\n        type: \"v2\",\n        value: new Vector2(items * width, height * depth),\n      },\n      remapModulus: {\n        type: \"v2\",\n        value: new Vector2(items, height),\n      },\n      remapModulusInv: {\n        type: \"v2\",\n        value: new Vector2(inv(items), inv(height)),\n      },\n      remapSTPQScale: {\n        type: \"v4\",\n        value: new Vector4(inv1(width), inv1(height), inv1(depth), inv1(items)),\n      },\n    };\n\n    const map = shaders.shader();\n    map.pipe(\"screen.map.xyzw\", uniforms);\n    if (options.map != null) {\n      // Need artifical STPQs because the screen is not the real geometry\n      if (stpq) {\n        map.pipe(\"screen.map.stpq\", uniforms);\n      }\n      map.pipe(options.map);\n    }\n\n    super(renderer, shaders, { map, linear: true });\n    this.memo = options;\n    this.uniforms = uniforms;\n\n    for (const object of Array.from(this.renders)) {\n      object.transparent = false;\n    }\n  }\n\n  cover(width, height, depth, items) {\n    if (width == null) {\n      ({ width } = this.memo);\n    }\n    if (height == null) {\n      ({ height } = this.memo);\n    }\n    if (depth == null) {\n      ({ depth } = this.memo);\n    }\n    if (items == null) {\n      ({ items } = this.memo);\n    }\n    const inv1 = (x) => 1 / Math.max(1, x - 1);\n    this.uniforms.remapSTPQScale.value.set(\n      inv1(width),\n      inv1(height),\n      inv1(depth),\n      inv1(items)\n    );\n\n    const x = width / this.memo.width;\n    let y = depth / this.memo.depth;\n    if (this.memo.depth === 1) {\n      y = height / this.memo.height;\n    }\n\n    return this.geometry.cover(x, y);\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS202: Simplify dynamic range loops\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { BufferAttribute } from \"three/src/core/BufferAttribute.js\";\nimport { ClipGeometry } from \"./clipgeometry.js\";\n\n/*\nRender points as quads\n\n+----+  +----+  +----+  +----+\n|    |  |    |  |    |  |    |\n+----+  +----+  +----+  +----+\n\n+----+  +----+  +----+  +----+\n|    |  |    |  |    |  |    |\n+----+  +----+  +----+  +----+\n\n+----+  +----+  +----+  +----+\n|    |  |    |  |    |  |    |\n+----+  +----+  +----+  +----+\n\n*/\n\nexport class SpriteGeometry extends ClipGeometry {\n  constructor(options) {\n    let depth, height, items, width;\n    super(options);\n\n    this._clipUniforms();\n\n    this.items = items = +options.items || 2;\n    this.width = width = +options.width || 1;\n    this.height = height = +options.height || 1;\n    this.depth = depth = +options.depth || 1;\n\n    const samples = items * width * height * depth;\n    const points = samples * 4;\n    const triangles = samples * 2;\n\n    this.setIndex(new BufferAttribute(new Uint32Array(triangles * 3), 1));\n\n    this.setAttribute(\n      \"position4\",\n      new BufferAttribute(new Float32Array(points * 4), 4)\n    );\n    this.setAttribute(\n      \"sprite\",\n      new BufferAttribute(new Float32Array(points * 2), 2)\n    );\n\n    const index = this._emitter(\"index\");\n    const position = this._emitter(\"position4\");\n    const sprite = this._emitter(\"sprite\");\n\n    const quad = [\n      [-1, -1],\n      [-1, 1],\n      [1, -1],\n      [1, 1],\n    ];\n\n    let base = 0;\n    for (\n      let i = 0, end = samples, asc = 0 <= end;\n      asc ? i < end : i > end;\n      asc ? i++ : i--\n    ) {\n      index(base);\n      index(base + 1);\n      index(base + 2);\n\n      index(base + 1);\n      index(base + 2);\n      index(base + 3);\n\n      base += 4;\n    }\n\n    for (\n      let z = 0, end1 = depth, asc1 = 0 <= end1;\n      asc1 ? z < end1 : z > end1;\n      asc1 ? z++ : z--\n    ) {\n      for (\n        let y = 0, end2 = height, asc2 = 0 <= end2;\n        asc2 ? y < end2 : y > end2;\n        asc2 ? y++ : y--\n      ) {\n        for (\n          let x = 0, end3 = width, asc3 = 0 <= end3;\n          asc3 ? x < end3 : x > end3;\n          asc3 ? x++ : x--\n        ) {\n          for (\n            let l = 0, end4 = items, asc4 = 0 <= end4;\n            asc4 ? l < end4 : l > end4;\n            asc4 ? l++ : l--\n          ) {\n            for (const v of Array.from(quad)) {\n              position(x, y, z, l);\n              sprite(v[0], v[1]);\n            }\n          }\n        }\n      }\n    }\n\n    this._finalize();\n    this.clip();\n  }\n\n  clip(width, height, depth, items) {\n    if (width == null) {\n      ({ width } = this);\n    }\n    if (height == null) {\n      ({ height } = this);\n    }\n    if (depth == null) {\n      ({ depth } = this);\n    }\n    if (items == null) {\n      ({ items } = this);\n    }\n    this._clipGeometry(width, height, depth, items);\n    return this._clipOffsets(\n      6,\n      width,\n      height,\n      depth,\n      items,\n      this.width,\n      this.height,\n      this.depth,\n      this.items\n    );\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { Base } from \"./base.js\";\nimport { DoubleSide } from \"three/src/constants.js\";\nimport { Mesh } from \"three/src/objects/Mesh.js\";\nimport { SpriteGeometry } from \"../geometry/spritegeometry.js\";\n\nexport class Point extends Base {\n  constructor(renderer, shaders, options) {\n    let f, left;\n    super(renderer, shaders, options);\n\n    let { uniforms, shape, fill } = options;\n\n    const {\n      material,\n      position,\n      color,\n      size,\n      mask,\n      map,\n      combine,\n      linear,\n      optical,\n      stpq,\n    } = options;\n\n    if (uniforms == null) {\n      uniforms = {};\n    }\n    shape = +shape != null ? +shape : 0;\n    if (fill == null) {\n      fill = true;\n    }\n\n    const hasStyle = uniforms.styleColor != null;\n\n    const shapes = [\n      \"circle\",\n      \"square\",\n      \"diamond\",\n      \"up\",\n      \"down\",\n      \"left\",\n      \"right\",\n    ];\n    const passes = [\n      \"circle\",\n      \"generic\",\n      \"generic\",\n      \"generic\",\n      \"generic\",\n      \"generic\",\n      \"generic\",\n    ];\n    const scales = [1.2, 1, 1.414, 1.16, 1.16, 1.16, 1.16];\n    const pass = passes[shape] != null ? passes[shape] : passes[0];\n    const _shape = shapes[shape] != null ? shapes[shape] : shapes[0];\n    const _scale = (left = optical && scales[shape]) != null ? left : 1;\n    const alpha = fill ? pass : `${pass}.hollow`;\n\n    this.geometry = new SpriteGeometry({\n      items: options.items,\n      width: options.width,\n      height: options.height,\n      depth: options.depth,\n    });\n\n    this._adopt(uniforms);\n    this._adopt(this.geometry.uniforms);\n\n    const defines = { POINT_SHAPE_SCALE: +(_scale + 0.00001) };\n\n    // Shared vertex shader\n    const factory = shaders.material();\n    const v = factory.vertex;\n\n    v.pipe(this._vertexColor(color, mask));\n\n    // Point sizing\n    if (size) {\n      v.isolate();\n      v.require(size);\n      v.require(\"point.size.varying\", this.uniforms);\n      v.end();\n    } else {\n      v.require(\"point.size.uniform\", this.uniforms);\n    }\n\n    v.require(this._vertexPosition(position, material, map, 2, stpq));\n\n    v.pipe(\"point.position\", this.uniforms, defines);\n    v.pipe(\"project.position\", this.uniforms);\n\n    // Shared fragment shader\n    factory.fragment = f = this._fragmentColor(\n      hasStyle,\n      material,\n      color,\n      mask,\n      map,\n      2,\n      stpq,\n      combine,\n      linear\n    );\n\n    // Split fragment into edge and fill pass for better z layering\n    const edgeFactory = shaders.material();\n    edgeFactory.vertex.pipe(v);\n    f = edgeFactory.fragment.pipe(factory.fragment);\n    f.require(`point.mask.${_shape}`, this.uniforms);\n    f.require(`point.alpha.${alpha}`, this.uniforms);\n    f.pipe(\"point.edge\", this.uniforms);\n\n    const fillFactory = shaders.material();\n    fillFactory.vertex.pipe(v);\n    f = fillFactory.fragment.pipe(factory.fragment);\n    f.require(`point.mask.${_shape}`, this.uniforms);\n    f.require(`point.alpha.${alpha}`, this.uniforms);\n    f.pipe(\"point.fill\", this.uniforms);\n\n    const fillOpts = fillFactory.link({\n      side: DoubleSide,\n    });\n    this.fillMaterial = this._material(fillOpts);\n\n    const edgeOpts = edgeFactory.link({\n      side: DoubleSide,\n    });\n    this.edgeMaterial = this._material(edgeOpts);\n\n    this.fillObject = new Mesh(this.geometry, this.fillMaterial);\n    this.edgeObject = new Mesh(this.geometry, this.edgeMaterial);\n\n    this._raw(this.fillObject);\n    this.fillObject.userData = fillOpts;\n\n    this._raw(this.edgeObject);\n    this.edgeObject.userData = edgeOpts;\n\n    this.renders = [this.fillObject, this.edgeObject];\n  }\n\n  show(transparent, blending, order, depth) {\n    this._show(this.edgeObject, true, blending, order, depth);\n    return this._show(this.fillObject, transparent, blending, order, depth);\n  }\n\n  dispose() {\n    this.geometry.dispose();\n    this.edgeMaterial.dispose();\n    this.fillMaterial.dispose();\n    this.renders =\n      this.edgeObject =\n      this.fillObject =\n      this.geometry =\n      this.edgeMaterial =\n      this.fillMaterial =\n        null;\n    return super.dispose();\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Buffer } from \"./buffer.js\";\n\n/*\n * Buffer for CPU-side use\n */\nexport class PushBuffer extends Buffer {\n  constructor(renderer, shaders, options) {\n    const width = options.width || 1;\n    const height = options.height || 1;\n    const depth = options.depth || 1;\n    const samples = width * height * depth;\n\n    if (!options.samples) {\n      options.samples = samples;\n    }\n\n    super(renderer, shaders, options);\n\n    this.width = width;\n    this.height = height;\n    this.depth = depth;\n    if (this.samples == null) {\n      this.samples = samples;\n    }\n\n    this.build(options);\n  }\n\n  build(_options) {\n    this.data = [];\n    this.data.length = this.samples;\n\n    this.filled = 0;\n    this.pad = { x: 0, y: 0, z: 0 };\n    return (this.streamer = this.generate(this.data));\n  }\n\n  dispose() {\n    this.data = null;\n    return super.dispose();\n  }\n\n  getFilled() {\n    return this.filled;\n  }\n\n  setActive(i, j, k) {\n    let ref;\n    return (\n      ([this.pad.x, this.pad.y, this.pad.z] = Array.from(\n        (ref = [this.width - i, this.height - j, this.depth - k])\n      )),\n      ref\n    );\n  }\n\n  read() {\n    return this.data;\n  }\n\n  copy(data) {\n    const n = Math.min(data.length, this.samples);\n    const d = this.data;\n    return __range__(0, n, false).map((i) => (d[i] = data[i]));\n  }\n\n  fill() {\n    let j, k, l, repeat;\n    const { callback } = this;\n    if (typeof callback.reset === \"function\") {\n      callback.reset();\n    }\n\n    const { emit, skip, count, done, reset } = this.streamer;\n    reset();\n\n    const n = this.width;\n    const m = this.height;\n    const padX = this.pad.x;\n    const padY = this.pad.y;\n    const limit = this.samples - this.pad.z * n * m;\n\n    let i = (j = k = l = 0);\n    if (padX > 0 || padY > 0) {\n      while (!done() && l < limit) {\n        l++;\n        repeat = callback(emit, i, j, k);\n        if (++i === n - padX) {\n          skip(padX);\n          i = 0;\n          if (++j === m - padY) {\n            skip(n * padY);\n            j = 0;\n            k++;\n          }\n        }\n        if (repeat === false) {\n          break;\n        }\n      }\n    } else {\n      while (!done() && l < limit) {\n        l++;\n        repeat = callback(emit, i, j, k);\n        if (++i === n) {\n          i = 0;\n          if (++j === m) {\n            j = 0;\n            k++;\n          }\n        }\n        if (repeat === false) {\n          break;\n        }\n      }\n    }\n\n    this.filled = 1;\n    return count();\n  }\n}\n\nfunction __range__(left, right, inclusive) {\n  const range = [];\n  const ascending = left < right;\n  const end = !inclusive ? right : ascending ? right + 1 : right - 1;\n  for (let i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {\n    range.push(i);\n  }\n  return range;\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UData from \"../../util/data.js\";\nimport * as UGLSL from \"../../util/glsl.js\";\n\nimport { FloatType, UnsignedByteType } from \"three/src/constants.js\";\nimport { Memo } from \"./memo.js\";\nimport { MemoScreen } from \"../meshes/memoscreen.js\";\nimport { Renderable } from \"../renderable.js\";\nimport { Vector4 } from \"three/src/math/Vector4.js\";\n\n/*\n * Readback up to 4D array of up to 4D data from GL\n */\nexport class Readback extends Renderable {\n  constructor(renderer, shaders, options) {\n    super(renderer, shaders);\n\n    if (this.items == null) {\n      this.items = options.items || 1;\n    }\n    if (this.channels == null) {\n      this.channels = options.channels || 4;\n    }\n    if (this.width == null) {\n      this.width = options.width || 1;\n    }\n    if (this.height == null) {\n      this.height = options.height || 1;\n    }\n    if (this.depth == null) {\n      this.depth = options.depth || 1;\n    }\n    if (this.type == null) {\n      this.type = options.type || FloatType;\n    }\n    if (this.stpq == null) {\n      this.stpq = options.stpq || false;\n    }\n    this.isFloat = this.type === FloatType;\n\n    this.active = this.sampled = this.rect = this.pad = null;\n\n    this.build(options);\n\n    /*\n    * log precision\n    gl = @gl\n    for name, pass of {Vertex: gl.VERTEX_SHADER, Fragment: gl.FRAGMENT_SHADER}\n      bits = for prec in [gl.LOW_FLOAT, gl.MEDIUM_FLOAT, gl.HIGH_FLOAT]\n        gl.getShaderPrecisionFormat(pass, prec).precision\n      console.log name, 'shader precision',  bits\n    */\n  }\n\n  build(options) {\n    let channels, encoder, stretch;\n    const { map } = options;\n    const { indexer } = options;\n    const isIndexed = indexer != null && !indexer.empty();\n\n    let { stpq } = this;\n    const { items, width, height, depth } = this;\n\n    let sampler = map;\n    if (isIndexed) {\n      // Preserve original xyzw offset of datapoint to tie it back to the source\n\n      // Modulus to pack xyzw into a single integer index\n      this._adopt({\n        indexModulus: {\n          type: \"v4\",\n          value: new Vector4(items, items * width, items * width * height, 1),\n        },\n      });\n\n      // Build shader to pack XYZ + index into a single RGBA\n      sampler = this.shaders.shader();\n      sampler.require(map);\n      sampler.require(indexer);\n      //sampler.require UGLSL.identity 'vec4'\n      sampler.pipe(\"float.index.pack\", this.uniforms);\n    }\n\n    if (this.isFloat && this.channels > 1) {\n      // Memoize multi-channel float data into float buffer first\n      this.floatMemo = new Memo(this.renderer, this.shaders, {\n        items,\n        channels: 4, // non-RGBA render target not supported\n        width,\n        height,\n        depth,\n        history: 0,\n        type: FloatType,\n      });\n\n      this.floatCompose = new MemoScreen(this.renderer, this.shaders, {\n        map: sampler,\n        items,\n        width,\n        height,\n        depth,\n        stpq,\n      });\n\n      this.floatMemo.adopt(this.floatCompose);\n\n      // Second pass won't need texture coordinates\n      stpq = false;\n\n      // Replace sampler with memoized sampler\n      sampler = this.shaders.shader();\n      this.floatMemo.shaderAbsolute(sampler);\n    }\n\n    if (this.isFloat) {\n      // Encode float data into byte buffer\n      stretch = this.channels;\n      channels = 4; // one 32-bit float per pixel\n    } else {\n      // Render byte data directly\n      stretch = 1;\n      channels = this.channels;\n    }\n\n    if (stretch > 1) {\n      // Stretch horizontally, sampling once per channel\n      encoder = this.shaders.shader();\n      encoder.pipe(UGLSL.mapByte2FloatOffset(stretch));\n      encoder.require(sampler);\n      encoder.pipe(\"float.stretch\");\n      encoder.pipe(\"float.encode\");\n      sampler = encoder;\n    } else if (this.isFloat) {\n      // Direct sampling\n      encoder = this.shaders.shader();\n      encoder.pipe(sampler);\n      encoder.pipe(UGLSL.truncateVec(4, 1));\n      encoder.pipe(\"float.encode\");\n      sampler = encoder;\n    }\n\n    // Memoize byte data\n    this.byteMemo = new Memo(this.renderer, this.shaders, {\n      items: items * stretch,\n      channels: channels, // non-RGBA render target not supported\n      width,\n      height,\n      depth,\n      history: 0,\n      type: UnsignedByteType,\n    });\n\n    this.byteCompose = new MemoScreen(this.renderer, this.shaders, {\n      map: sampler,\n      items: items * stretch,\n      width,\n      height,\n      depth,\n      stpq,\n    });\n\n    this.byteMemo.adopt(this.byteCompose);\n\n    // CPU-side buffers\n    const w = items * width * stretch;\n    const h = height * depth;\n\n    this.samples = this.width * this.height * this.depth;\n\n    this.bytes = new Uint8Array(w * h * 4); // non-RGBA render target not supported\n    if (this.isFloat) {\n      this.floats = new Float32Array(this.bytes.buffer);\n    }\n    this.data = this.isFloat ? this.floats : this.bytes;\n    this.streamer = this.generate(this.data);\n\n    this.active = { items: 0, width: 0, height: 0, depth: 0 };\n    this.sampled = { items: 0, width: 0, height: 0, depth: 0 };\n    this.rect = { w: 0, h: 0 };\n    this.pad = { x: 0, y: 0, z: 0, w: 0 };\n\n    this.stretch = stretch;\n    this.isIndexed = isIndexed;\n\n    return this.setActive(items, width, height, depth);\n  }\n\n  generate(data) {\n    return UData.getStreamer(data, this.samples, 4, this.items);\n  } // non-RGBA render target not supported\n\n  setActive(items, width, height, depth) {\n    let ref;\n    if (\n      items === this.active.items &&\n      width === this.active.width &&\n      height === this.active.height &&\n      depth === this.active.depth\n    ) {\n      return;\n    }\n\n    // Actively sampled area\n    [\n      this.active.items,\n      this.active.width,\n      this.active.height,\n      this.active.depth,\n    ] = Array.from([items, width, height, depth]);\n\n    // Render only necessary samples in RTTs\n    if (this.floatCompose != null) {\n      this.floatCompose.cover(width, height, depth);\n    }\n    if (this.byteCompose != null) {\n      this.byteCompose.cover(width * this.stretch, height, depth);\n    }\n\n    // Calculate readback buffer geometry\n    ({ items } = this);\n    ({ width } = this.active);\n    height = this.depth === 1 ? this.active.height : this.height;\n    ({ depth } = this.active);\n    const w = items * width * this.stretch;\n    const h = height * depth;\n\n    // Calculate array paddings on readback\n    [\n      this.sampled.items,\n      this.sampled.width,\n      this.sampled.height,\n      this.sampled.depth,\n    ] = Array.from([items, width, height, depth]);\n    [this.rect.w, this.rect.h] = Array.from([w, h]);\n    return (\n      ([this.pad.x, this.pad.y, this.pad.z, this.pad.w] = Array.from(\n        (ref = [\n          this.sampled.width - this.active.width,\n          this.sampled.height - this.active.height,\n          this.sampled.depth - this.active.depth,\n          this.sampled.items - this.active.items,\n        ])\n      )),\n      ref\n    );\n  }\n\n  update(camera) {\n    if (this.floatMemo != null) {\n      this.floatMemo.render(camera);\n    }\n    return this.byteMemo != null ? this.byteMemo.render(camera) : undefined;\n  }\n\n  post() {\n    const currentTarget = this.renderer.getRenderTarget();\n    this.renderer.setRenderTarget(this.byteMemo.target.targets[0]);\n    this.gl.readPixels(\n      0,\n      0,\n      this.rect.w,\n      this.rect.h,\n      this.gl.RGBA,\n      this.gl.UNSIGNED_BYTE,\n      this.bytes\n    );\n    this.renderer.setRenderTarget(currentTarget);\n  }\n\n  readFloat(n) {\n    return this.floatMemo != null ? this.floatMemo.read(n) : undefined;\n  }\n  readByte(n) {\n    return this.byteMemo != null ? this.byteMemo.read(n) : undefined;\n  }\n\n  setCallback(callback) {\n    this.emitter = this.callback(callback);\n  }\n\n  callback(callback) {\n    if (!this.isIndexed) {\n      return callback;\n    }\n\n    const n = this.width;\n    const m = this.height;\n    const p = this.items;\n\n    // Decode packed index\n    const f = function (x, y, z, w) {\n      let idx = w;\n      const ll = idx % p;\n      idx = (idx - ll) / p;\n      const ii = idx % n;\n      idx = (idx - ii) / n;\n      const jj = idx % m;\n      idx = (idx - jj) / m;\n      const kk = idx;\n\n      return callback(x, y, z, w, ii, jj, kk, ll);\n    };\n\n    f.reset = () =>\n      typeof callback.reset === \"function\" ? callback.reset() : undefined;\n    return f;\n  }\n\n  iterate() {\n    let j, k, l;\n    let emit = this.emitter;\n    if (typeof emit.reset === \"function\") {\n      emit.reset();\n    }\n\n    const { consume, skip, count, done, reset } = this.streamer;\n    reset();\n\n    const n = this.sampled.width | 0;\n    let m = this.sampled.height | 0;\n    const o = this.sampled.depth | 0;\n    const p = this.sampled.items | 0;\n    const padX = this.pad.x | 0;\n    const padY = this.pad.y | 0;\n    const padZ = this.pad.z | 0;\n    const padW = this.pad.w | 0;\n    const limit = n * m * p * (o - padZ);\n\n    if (!this.isIndexed) {\n      const callback = emit;\n      emit = (x, y, z, w) => callback(x, y, z, w, i, j, k, l);\n    }\n\n    let i = (j = k = l = m = 0);\n    while (!done() && m < limit) {\n      m++;\n      const repeat = consume(emit);\n      if (++l === p - padW) {\n        skip(padX);\n        l = 0;\n        if (++i === n - padX) {\n          skip(p * padX);\n          i = 0;\n          if (++j === m - padY) {\n            skip(p * n * padY);\n            j = 0;\n            k++;\n          }\n        }\n      }\n      if (repeat === false) {\n        break;\n      }\n    }\n\n    return Math.floor(count() / p);\n  }\n\n  dispose() {\n    if (this.floatMemo != null) {\n      this.floatMemo.unadopt(this.floatCompose);\n    }\n    if (this.floatMemo != null) {\n      this.floatMemo.dispose();\n    }\n    if (this.floatCompose != null) {\n      this.floatCompose.dispose();\n    }\n\n    if (this.byteMemo != null) {\n      this.byteMemo.unadopt(this.byteCompose);\n    }\n    if (this.byteMemo != null) {\n      this.byteMemo.dispose();\n    }\n    if (this.byteCompose != null) {\n      this.byteCompose.dispose();\n    }\n\n    return (this.floatMemo =\n      this.byteMemo =\n      this.floatCompose =\n      this.byteCompose =\n        null);\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { Base } from \"./base.js\";\nimport { DoubleSide } from \"three/src/constants.js\";\nimport { Mesh } from \"three/src/objects/Mesh.js\";\nimport { SpriteGeometry } from \"../geometry/spritegeometry.js\";\n\nexport class Sprite extends Base {\n  constructor(renderer, shaders, options) {\n    let f;\n    super(renderer, shaders, options);\n\n    let { uniforms } = options;\n    const {\n      material,\n      position,\n      sprite,\n      map,\n      combine,\n      linear,\n      color,\n      mask,\n      stpq,\n    } = options;\n\n    if (uniforms == null) {\n      uniforms = {};\n    }\n\n    const hasStyle = uniforms.styleColor != null;\n\n    this.geometry = new SpriteGeometry({\n      items: options.items,\n      width: options.width,\n      height: options.height,\n      depth: options.depth,\n    });\n\n    this._adopt(uniforms);\n    this._adopt(this.geometry.uniforms);\n\n    // Shared vertex shader\n    const factory = shaders.material();\n    const v = factory.vertex;\n\n    v.pipe(this._vertexColor(color, mask));\n\n    v.require(this._vertexPosition(position, material, map, 2, stpq));\n    v.require(sprite);\n    v.pipe(\"sprite.position\", this.uniforms);\n    v.pipe(\"project.position\", this.uniforms);\n\n    // Shared fragment shader\n    factory.fragment = f = this._fragmentColor(\n      hasStyle,\n      material,\n      color,\n      mask,\n      map,\n      2,\n      stpq,\n      combine,\n      linear\n    );\n\n    // Split fragment into edge and fill pass for better z layering\n    const edgeFactory = shaders.material();\n    edgeFactory.vertex.pipe(v);\n    edgeFactory.fragment.pipe(f);\n    edgeFactory.fragment.pipe(\"fragment.transparent\", this.uniforms);\n\n    const fillFactory = shaders.material();\n    fillFactory.vertex.pipe(v);\n    fillFactory.fragment.pipe(f);\n    fillFactory.fragment.pipe(\"fragment.solid\", this.uniforms);\n\n    const fillOpts = fillFactory.link({\n      side: DoubleSide,\n    });\n    this.fillMaterial = this._material(fillOpts);\n\n    const edgeOpts = edgeFactory.link({\n      side: DoubleSide,\n    });\n    this.edgeMaterial = this._material(edgeOpts);\n\n    this.fillObject = new Mesh(this.geometry, this.fillMaterial);\n    this.edgeObject = new Mesh(this.geometry, this.edgeMaterial);\n\n    this._raw(this.fillObject);\n    this.fillObject.userData = fillOpts;\n\n    this._raw(this.edgeObject);\n    this.edgeObject.userData = edgeOpts;\n\n    this.renders = [this.fillObject, this.edgeObject];\n  }\n\n  show(transparent, blending, order, depth) {\n    this._show(this.edgeObject, true, blending, order, depth);\n    return this._show(this.fillObject, transparent, blending, order, depth);\n  }\n\n  dispose() {\n    this.geometry.dispose();\n    this.edgeMaterial.dispose();\n    this.fillMaterial.dispose();\n    this.nreders =\n      this.geometry =\n      this.edgeMaterial =\n      this.fillMaterial =\n      this.edgeObject =\n      this.fillObject =\n        null;\n    return super.dispose();\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS202: Simplify dynamic range loops\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { BufferAttribute } from \"three/src/core/BufferAttribute.js\";\nimport { ClipGeometry } from \"./clipgeometry.js\";\n\n/*\nTriangle strips arranged in items, columns and rows\n\n+--+--+--+  +--+--+--+  +--+--+--+  +--+--+--+\n| /| /| /   | /| /| /   | /| /| /   | /| /| /\n+--+--+/    +--+--+/    +--+--+/    +--+--+/\n\n+--+--+--+  +--+--+--+  +--+--+--+  +--+--+--+\n| /| /| /   | /| /| /   | /| /| /   | /| /| /\n+--+--+/    +--+--+/    +--+--+/    +--+--+/\n\n+--+--+--+  +--+--+--+  +--+--+--+  +--+--+--+\n| /| /| /   | /| /| /   | /| /| /   | /| /| /\n+--+--+/    +--+--+/    +--+--+/    +--+--+/\n\n*/\n\nexport class StripGeometry extends ClipGeometry {\n  constructor(options) {\n    let depth, height, items, sides, width;\n    super(options);\n\n    this._clipUniforms();\n\n    this.items = items = +options.items || 2;\n    this.width = width = +options.width || 1;\n    this.height = height = +options.height || 1;\n    this.depth = depth = +options.depth || 1;\n    this.sides = sides = Math.max(0, items - 2);\n\n    const samples = width * height * depth;\n    const points = items * samples;\n    const triangles = sides * samples;\n\n    this.setIndex(new BufferAttribute(new Uint32Array(triangles * 3), 1));\n\n    this.setAttribute(\n      \"position4\",\n      new BufferAttribute(new Float32Array(points * 4), 4)\n    );\n    this.setAttribute(\n      \"strip\",\n      new BufferAttribute(new Float32Array(points * 3), 3)\n    );\n\n    const index = this._emitter(\"index\");\n    const position = this._emitter(\"position4\");\n    const strip = this._emitter(\"strip\");\n\n    let base = 0;\n    for (\n      let i = 0, end = samples, asc = 0 <= end;\n      asc ? i < end : i > end;\n      asc ? i++ : i--\n    ) {\n      let o = base;\n      for (\n        let j = 0, end1 = sides, asc1 = 0 <= end1;\n        asc1 ? j < end1 : j > end1;\n        asc1 ? j++ : j--\n      ) {\n        if (j & 1) {\n          index(o + 1);\n          index(o);\n          index(o + 2);\n        } else {\n          index(o);\n          index(o + 1);\n          index(o + 2);\n        }\n        o++;\n      }\n      base += items;\n    }\n\n    const last = items - 1;\n    for (\n      let z = 0, end2 = depth, asc2 = 0 <= end2;\n      asc2 ? z < end2 : z > end2;\n      asc2 ? z++ : z--\n    ) {\n      for (\n        let y = 0, end3 = height, asc3 = 0 <= end3;\n        asc3 ? y < end3 : y > end3;\n        asc3 ? y++ : y--\n      ) {\n        for (\n          let x = 0, end4 = width, asc4 = 0 <= end4;\n          asc4 ? x < end4 : x > end4;\n          asc4 ? x++ : x--\n        ) {\n          let f = 1;\n\n          position(x, y, z, 0);\n          strip(1, 2, f);\n\n          for (\n            let l = 1, end5 = last, asc5 = 1 <= end5;\n            asc5 ? l < end5 : l > end5;\n            asc5 ? l++ : l--\n          ) {\n            position(x, y, z, l);\n            strip(l - 1, l + 1, (f = -f));\n          }\n\n          position(x, y, z, last);\n          strip(last - 2, last - 1, -f);\n        }\n      }\n    }\n\n    this._finalize();\n    this.clip();\n  }\n\n  clip(width, height, depth, items) {\n    if (width == null) {\n      ({ width } = this);\n    }\n    if (height == null) {\n      ({ height } = this);\n    }\n    if (depth == null) {\n      ({ depth } = this);\n    }\n    if (items == null) {\n      ({ items } = this);\n    }\n    const sides = Math.max(0, items - 2);\n\n    this._clipGeometry(width, height, depth, items);\n    return this._clipOffsets(\n      3,\n      width,\n      height,\n      depth,\n      sides,\n      this.width,\n      this.height,\n      this.depth,\n      this.sides\n    );\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { Base } from \"./base.js\";\nimport { DoubleSide } from \"three/src/constants.js\";\nimport { Mesh } from \"three/src/objects/Mesh.js\";\nimport { StripGeometry } from \"../geometry/stripgeometry.js\";\n\nexport class Strip extends Base {\n  constructor(renderer, shaders, options) {\n    let f;\n    super(renderer, shaders, options);\n\n    let { uniforms, material } = options;\n    const { position, color, mask, map, combine, linear, stpq } = options;\n\n    if (uniforms == null) {\n      uniforms = {};\n    }\n    if (material == null) {\n      material = true;\n    }\n\n    const hasStyle = uniforms.styleColor != null;\n\n    this.geometry = new StripGeometry({\n      items: options.items,\n      width: options.width,\n      height: options.height,\n      depth: options.depth,\n    });\n\n    this._adopt(uniforms);\n    this._adopt(this.geometry.uniforms);\n\n    const factory = shaders.material();\n\n    const v = factory.vertex;\n\n    v.pipe(this._vertexColor(color, mask));\n\n    v.require(this._vertexPosition(position, material, map, 2, stpq));\n    if (!material) {\n      v.pipe(\"mesh.position\", this.uniforms);\n    }\n    if (material) {\n      v.pipe(\"strip.position.normal\", this.uniforms);\n    }\n    v.pipe(\"project.position\", this.uniforms);\n\n    factory.fragment = f = this._fragmentColor(\n      hasStyle,\n      material,\n      color,\n      mask,\n      map,\n      2,\n      stpq,\n      combine,\n      linear\n    );\n\n    f.pipe(\"fragment.color\", this.uniforms);\n\n    const opts = factory.link({\n      side: DoubleSide,\n    });\n    this.material = this._material(opts);\n\n    const object = new Mesh(this.geometry, this.material);\n    object.userData = opts;\n\n    this._raw(object);\n    this.renders = [object];\n  }\n\n  dispose() {\n    this.geometry.dispose();\n    this.material.dispose();\n    this.renders = this.geometry = this.material = null;\n    return super.dispose();\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { Base } from \"./base.js\";\nimport { DoubleSide } from \"three/src/constants.js\";\nimport { Mesh } from \"three/src/objects/Mesh.js\";\nimport { SurfaceGeometry } from \"../geometry/surfacegeometry.js\";\n\nexport class Surface extends Base {\n  constructor(renderer, shaders, options) {\n    let defs, f;\n    super(renderer, shaders, options);\n\n    let { uniforms, material } = options;\n\n    const { position, color, mask, map, combine, linear, stpq, intUV } =\n      options;\n\n    if (uniforms == null) {\n      uniforms = {};\n    }\n    if (material == null) {\n      material = true;\n    }\n\n    const hasStyle = uniforms.styleColor != null;\n\n    this.geometry = new SurfaceGeometry({\n      width: options.width,\n      height: options.height,\n      surfaces: options.surfaces,\n      layers: options.layers,\n      closedX: options.closedX,\n      closedY: options.closedY,\n    });\n\n    this._adopt(uniforms);\n    this._adopt(this.geometry.uniforms);\n\n    const factory = shaders.material();\n\n    const v = factory.vertex;\n\n    if (intUV) {\n      defs = { POSITION_UV_INT: \"\" };\n    }\n\n    v.pipe(this._vertexColor(color, mask));\n\n    v.require(this._vertexPosition(position, material, map, 2, stpq));\n    if (!material) {\n      v.pipe(\"surface.position\", this.uniforms, defs);\n    }\n    if (material) {\n      v.pipe(\"surface.position.normal\", this.uniforms, defs);\n    }\n    v.pipe(\"project.position\", this.uniforms);\n\n    factory.fragment = f = this._fragmentColor(\n      hasStyle,\n      material,\n      color,\n      mask,\n      map,\n      2,\n      stpq,\n      combine,\n      linear\n    );\n\n    f.pipe(\"fragment.color\", this.uniforms);\n\n    const opts = factory.link({\n      side: DoubleSide,\n    });\n    this.material = this._material(opts);\n\n    const object = new Mesh(this.geometry, this.material);\n    object.userData = opts;\n\n    this._raw(object);\n    this.renders = [object];\n  }\n\n  dispose() {\n    this.geometry.dispose();\n    this.material.dispose();\n    this.renders = this.geometry = this.material = null;\n    return super.dispose();\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS202: Simplify dynamic range loops\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { Atlas } from \"./atlas.js\";\nimport { UnsignedByteType } from \"three/src/constants.js\";\n\nconst SCRATCH_SIZE = 512 / 16;\n\n/*\n * Dynamic text atlas\n * - Stores entire strings as sprites\n * - Renders alpha mask (fast) or signed distance field (slow)\n * - Emits (x,y,width,height) pointers into the atlas\n */\nexport class TextAtlas extends Atlas {\n  constructor(renderer, shaders, options) {\n    let left;\n    if (!options.width) {\n      options.width = 256;\n    }\n    if (!options.height) {\n      options.height = 256;\n    }\n    options.type = UnsignedByteType;\n    options.channels = 1;\n    options.backed = true;\n\n    super(renderer, shaders, options, false);\n\n    this.font = options.font != null ? options.font : [\"sans-serif\"];\n    this.size = options.size || 24;\n    this.style = options.style != null ? options.style : \"normal\";\n    this.variant = options.variant != null ? options.variant : \"normal\";\n    this.weight = options.weight != null ? options.weight : \"normal\";\n    this.outline =\n      (left = +(options.outline != null ? options.outline : 5)) != null\n        ? left\n        : 0;\n    this.gamma = 1;\n\n    if (typeof navigator !== \"undefined\") {\n      const ua = navigator.userAgent;\n      if (ua.match(/Chrome/) && ua.match(/OS X/)) {\n        this.gamma = 0.5;\n      }\n    }\n\n    this.scratchW = this.scratchH = 0;\n\n    this.build(options);\n  }\n\n  build(options) {\n    super.build(options);\n\n    // Prepare line-height with room for outline\n    let lineHeight = 16;\n    lineHeight = this.size;\n    lineHeight += 4 + 2 * Math.min(1, this.outline);\n    const maxWidth = SCRATCH_SIZE * lineHeight;\n\n    // Prepare scratch canvas\n    const canvas = document.createElement(\"canvas\");\n    canvas.width = maxWidth;\n    canvas.height = lineHeight;\n\n    const quote = (str) => `${str.replace(/(['\"\\\\])/g, \"\\\\$1\")}`;\n    const font = this.font.map(quote).join(\", \");\n\n    const context = canvas.getContext(\"2d\");\n    context.font = `${this.style} ${this.variant} ${this.weight} ${this.size}px ${font}`;\n    context.fillStyle = \"#FF0000\";\n    context.textAlign = \"left\";\n    context.textBaseline = \"bottom\";\n    context.lineJoin = \"round\";\n\n    // debug: show scratch canvas\n    /*\n    document.body.appendChild canvas\n    canvas.setAttribute('style', \"position: absolute; top: 0; left: 0; z-index: 100; border: 1px solid red; background: rgba(255,0,255,.25);\")\n    */\n\n    // Cache hex colors for distance field rendering\n    const colors = [];\n    const dilate = this.outline * 3;\n    for (\n      let i = 0, end = dilate, asc = 0 <= end;\n      asc ? i < end : i > end;\n      asc ? i++ : i--\n    ) {\n      // 8 rgb levels = 1 step = .5 pixel increase\n      const hex = (\n        \"00\" + Math.max(0, -i * 8 + 128 - !i * 8).toString(16)\n      ).slice(-2);\n      colors.push(\"#\" + hex + hex + hex);\n    }\n\n    const scratch = new Uint8Array(maxWidth * lineHeight * 2);\n\n    this.canvas = canvas;\n    this.context = context;\n    this.lineHeight = lineHeight;\n    this.maxWidth = maxWidth;\n    this.colors = colors;\n    this.scratch = scratch;\n\n    this._allocate = this.allocate.bind(this);\n    return (this._write = this.write.bind(this));\n  }\n\n  reset() {\n    super.reset();\n    return (this.mapped = {});\n  }\n\n  begin() {\n    return Array.from(this.rows).map((row) => (row.alive = 0));\n  }\n\n  end() {\n    const { mapped } = this;\n    for (const row of Array.from(this.rows.slice())) {\n      if (row.alive === 0) {\n        for (const key of Array.from(row.keys)) {\n          delete mapped[key];\n        }\n        this.collapse(row);\n      }\n    }\n  }\n\n  map(text, emit) {\n    // See if already mapped into atlas\n    const { mapped } = this;\n    const c = mapped[text];\n    if (c != null) {\n      c.row.alive++;\n      return emit(c.x, c.y, c.w, c.h);\n    }\n\n    // Draw text (don't recurse stack in @draw so it can be optimized cleanly)\n    this.draw(text);\n    const data = this.scratch;\n    const w = this.scratchW;\n    const h = this.scratchH;\n\n    // Allocate and write into atlas\n    const allocate = this._allocate;\n    const write = this._write;\n    return allocate(text, w, h, function (row, x, y) {\n      mapped[text] = { x, y, w, h, row };\n      write(data, x, y, w, h);\n      return emit(x, y, w, h);\n    });\n  }\n\n  draw(text) {\n    let data, i, j;\n    let w = this.width;\n    const h = this.lineHeight;\n    const o = this.outline;\n    const ctx = this.context;\n    const dst = this.scratch;\n    const max = this.maxWidth;\n    const { colors } = this;\n\n    // Bottom aligned\n    const x = o + 1;\n    const y = Math.round(h * 1.05 - 1);\n\n    // Measure text\n    const m = ctx.measureText(text);\n    w = Math.min(max, Math.ceil(m.width + 2 * x + 1));\n\n    // Clear scratch area\n    ctx.clearRect(0, 0, w, h);\n\n    if (this.outline === 0) {\n      // Alpha sprite (fast)\n      let asc, end;\n      ctx.fillText(text, x, y);\n      ({ data } = ctx.getImageData(0, 0, w, h));\n      j = 3; // Skip to alpha channel\n      for (\n        i = 0, end = data.length / 4, asc = 0 <= end;\n        asc ? i < end : i > end;\n        asc ? i++ : i--\n      ) {\n        //dst[i] = 255 * (i%2); # test pattern to check pixel perfect alignment\n        dst[i] = data[j];\n        j += 4;\n      }\n\n      this.scratchW = w;\n      return (this.scratchH = h);\n    } else {\n      // Signed distance field sprite (approximation) (slow)\n\n      // Draw strokes of decreasing width to create nested outlines (absolute distance)\n      let asc1, start;\n      let asc2, end1;\n      ctx.globalCompositeOperation = \"source-over\";\n      for (\n        start = o + 1, i = start, asc1 = start <= 1;\n        asc1 ? i <= 1 : i >= 1;\n        asc1 ? i++ : i--\n      ) {\n        j = i > 1 ? i * 2 - 2 : i; // Eliminate odd strokes once past > 1px, don't need the detail\n        ctx.strokeStyle = colors[j - 1];\n        ctx.lineWidth = j;\n        ctx.strokeText(text, x, y);\n      }\n      //console.log 'stroke', j, j+.5, colors[j]\n\n      // Fill center with multiply blend #FF0000 to mark inside/outside\n      ctx.globalCompositeOperation = \"multiply\";\n      ctx.fillText(text, x, y);\n\n      // Pull image data\n      ({ data } = ctx.getImageData(0, 0, w, h));\n      j = 0;\n      const { gamma } = this;\n\n      for (\n        i = 0, end1 = data.length / 4, asc2 = 0 <= end1;\n        asc2 ? i < end1 : i > end1;\n        asc2 ? i++ : i--\n      ) {\n        // Get value + mask\n        const a = data[j];\n        let mask = a ? data[j + 1] / a : 1;\n        if (gamma === 0.5) {\n          mask = Math.sqrt(mask);\n        }\n        mask = Math.min(1, Math.max(0, mask));\n\n        // Blend between positive/outside and negative/inside\n        const b = 256 - a;\n        const c = b + (a - b) * mask;\n\n        // Clamp\n        // (slight expansion to hide errors around the transition)\n        dst[i] = Math.max(0, Math.min(255, c + 2));\n        j += 4;\n      }\n\n      // Debug: copy back into canvas\n      //\n      // TODO hide behind debug flag or delete.\n      /*\n      j = 0\n      for i in [0...data.length / 4]\n        v = dst[i]\n        *data[j] = v\n        *data[j+1] = v\n        data[j+2] = v\n        data[j+3] = 255\n        j += 4\n      ctx.putImageData(imageData, 0, 0);\n      */\n\n      this.scratchW = w;\n      return (this.scratchH = h);\n    }\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UData from \"../../util/data.js\";\nimport { DataBuffer } from \"./databuffer.js\";\n\n//\n// 3D array\n//\nexport class VoxelBuffer extends DataBuffer {\n  build(_options) {\n    super.build();\n    this.pad = { x: 0, y: 0, z: 0 };\n    return (this.streamer = this.generate(this.data));\n  }\n\n  setActive(i, j, k) {\n    let ref;\n    return (\n      ([this.pad.x, this.pad.y, this.pad.z] = Array.from(\n        (ref = [\n          Math.max(0, this.width - i),\n          Math.max(0, this.height - j),\n          Math.max(0, this.depth - k),\n        ])\n      )),\n      ref\n    );\n  }\n\n  fill() {\n    let j, k, l, repeat;\n    const { callback } = this;\n    if (typeof callback.reset === \"function\") {\n      callback.reset();\n    }\n\n    const { emit, skip, count, done, reset } = this.streamer;\n    reset();\n\n    const n = this.width;\n    const m = this.height;\n    const padX = this.pad.x;\n    const padY = this.pad.y;\n    const limit = this.samples - this.pad.z * n * m;\n\n    let i = (j = k = l = 0);\n    if (padX > 0 || padY > 0) {\n      while (!done() && l < limit) {\n        l++;\n        repeat = callback(emit, i, j, k);\n        if (++i === n - padX) {\n          skip(padX);\n          i = 0;\n          if (++j === m - padY) {\n            skip(n * padY);\n            j = 0;\n            k++;\n          }\n        }\n        if (repeat === false) {\n          break;\n        }\n      }\n    } else {\n      while (!done() && l < limit) {\n        l++;\n        repeat = callback(emit, i, j, k);\n        if (++i === n) {\n          i = 0;\n          if (++j === m) {\n            j = 0;\n            k++;\n          }\n        }\n        if (repeat === false) {\n          break;\n        }\n      }\n    }\n\n    return Math.floor(count() / this.items);\n  }\n\n  through(callback, target) {\n    // must be identical sized buffers w/ identical active areas\n\n    let dst, j, k, src;\n    const { consume, done, skip } = (src = this.streamer);\n    const { emit } = (dst = target.streamer);\n\n    let i = (j = k = 0);\n\n    let pipe = () =>\n      consume((x, y, z, w) => callback(emit, x, y, z, w, i, j, k));\n    pipe = UData.repeatCall(pipe, this.items);\n\n    return () => {\n      let l;\n      src.reset();\n      dst.reset();\n      const n = this.width;\n      const m = this.height;\n      const padX = this.pad.x;\n      const padY = this.pad.y;\n      const limit = this.samples - this.pad.z * n * m;\n\n      i = j = k = l = 0;\n      if (padX > 0 || padY > 0) {\n        while (!done() && l < limit) {\n          l++;\n          pipe();\n          if (++i === n - padX) {\n            skip(padX);\n            i = 0;\n            if (++j === m - padY) {\n              skip(n * padY);\n              j = 0;\n              k++;\n            }\n          }\n        }\n      } else {\n        while (!done() && l < limit) {\n          l++;\n          pipe();\n          if (++i === n) {\n            i = 0;\n            if (++j === m) {\n              j = 0;\n              k++;\n            }\n          }\n        }\n      }\n\n      return src.count();\n    };\n  }\n}\n","import { ArrayBuffer_ } from \"./buffer/arraybuffer.js\";\nimport { Arrow } from \"./meshes/arrow.js\";\nimport { Atlas } from \"./buffer/atlas.js\";\nimport { DataBuffer } from \"./buffer/databuffer.js\";\nimport { Debug } from \"./meshes/debug.js\";\nimport { Face } from \"./meshes/face.js\";\nimport { Line } from \"./meshes/line.js\";\nimport { MatrixBuffer } from \"./buffer/matrixbuffer.js\";\nimport { Memo } from \"./buffer/memo.js\";\nimport { MemoScreen } from \"./meshes/memoscreen.js\";\nimport { Point } from \"./meshes/point.js\";\nimport { PushBuffer } from \"./buffer/pushbuffer.js\";\nimport { Readback } from \"./buffer/readback.js\";\nimport { RenderToTexture } from \"./buffer/rendertotexture.js\";\nimport { Scene } from \"./scene.js\";\nimport { Screen } from \"./meshes/screen.js\";\nimport { Sprite } from \"./meshes/sprite.js\";\nimport { Strip } from \"./meshes/strip.js\";\nimport { Surface } from \"./meshes/surface.js\";\nimport { TextAtlas } from \"./buffer/textatlas.js\";\nimport { VoxelBuffer } from \"./buffer/voxelbuffer.js\";\n\nexport const Classes = {\n  sprite: Sprite,\n  point: Point,\n  line: Line,\n  surface: Surface,\n  face: Face,\n  strip: Strip,\n  arrow: Arrow,\n  screen: Screen,\n  memoScreen: MemoScreen,\n  debug: Debug,\n  dataBuffer: DataBuffer,\n  arrayBuffer: ArrayBuffer_,\n  matrixBuffer: MatrixBuffer,\n  voxelBuffer: VoxelBuffer,\n  pushBuffer: PushBuffer,\n  renderToTexture: RenderToTexture,\n  memo: Memo,\n  readback: Readback,\n  atlas: Atlas,\n  textAtlas: TextAtlas,\n  scene: Scene,\n};\n","export * from \"./scene.js\";\nexport { RenderFactory as Factory } from \"./factory.js\";\nexport * from \"./scene.js\";\nexport * from \"./classes.js\";\n","export default /* glsl */ `uniform float worldUnit;\nuniform float lineDepth;\nuniform float lineWidth;\nuniform float focusDepth;\n\nuniform vec4 geometryClip;\nuniform float arrowSize;\nuniform float arrowSpace;\n\nattribute vec4 position4;\nattribute vec3 arrow;\nattribute vec2 attach;\n\n// External\nvec3 getPosition(vec4 xyzw, float canonical);\n\nvoid getArrowGeometry(vec4 xyzw, float near, float far, out vec3 left, out vec3 right, out vec3 start) {\n  right = getPosition(xyzw, 1.0);\n  left  = getPosition(vec4(near, xyzw.yzw), 0.0);\n  start = getPosition(vec4(far, xyzw.yzw), 0.0);\n}\n\nmat4 getArrowMatrix(vec3 left, vec3 right, vec3 start) {\n\n  float depth = focusDepth;\n  if (lineDepth < 1.0) {\n    // Depth blending\n    float z = max(0.00001, -right.z);\n    depth = mix(z, focusDepth, lineDepth);\n  }\n    \n  vec3 diff = left - right;\n  float l = length(diff);\n  if (l == 0.0) {\n    return mat4(1.0, 0.0, 0.0, 0.0,\n                0.0, 1.0, 0.0, 0.0,\n                0.0, 0.0, 1.0, 0.0,\n                0.0, 0.0, 0.0, 1.0);\n  }\n\n  // Construct TBN matrix around shaft\n  vec3 t = normalize(diff);\n  vec3 n = normalize(cross(t, t.yzx + vec3(.1, .2, .3)));\n  vec3 b = cross(n, t);\n  \n  // Shrink arrows when vector gets too small\n  // Approach linear scaling with cubic ease the smaller we get\n  float size = arrowSize * lineWidth * worldUnit * depth * 1.25;\n  diff = right - start;\n  l = length(diff) * arrowSpace;\n  float mini = clamp(1.0 - l / size * .333, 0.0, 1.0);\n  float scale = 1.0 - mini * mini * mini;\n  float range = size * scale;\n  \n  // Size to 2.5:1 ratio\n  float rangeNB = range / 2.5;\n\n  // Anchor at end position\n  return mat4(vec4(n * rangeNB,  0),\n              vec4(b * rangeNB,  0),\n              vec4(t * range, 0),\n              vec4(right,  1.0));\n}\n\nvec3 getArrowPosition() {\n  vec3 left, right, start;\n  \n  vec4 p = min(geometryClip, position4);\n  \n  getArrowGeometry(p, attach.x, attach.y, left, right, start);\n  mat4 matrix = getArrowMatrix(left, right, start);\n  return (matrix * vec4(arrow.xyz, 1.0)).xyz;\n\n}\n`;\n","export default /* glsl */ `uniform vec4 axisStep;\nuniform vec4 axisPosition;\n\nvec4 getAxisPosition(vec4 xyzw, inout vec4 stpq) {\n  return axisStep * xyzw.x + axisPosition;\n}\n`;","export default /* glsl */ `uniform vec4 basisScale;\nuniform vec4 basisOffset;\nuniform vec4 viewScale;\nuniform vec4 viewOffset;\n\nvec4 getCartesian4Position(vec4 position, inout vec4 stpq) {\n  return position * basisScale + basisOffset;\n}\n`;","export default /* glsl */ `uniform mat4 viewMatrix;\n\nvec4 getCartesianPosition(vec4 position, inout vec4 stpq) {\n  return viewMatrix * vec4(position.xyz, 1.0);\n}\n`;","export default /* glsl */ `uniform vec4 clampLimit;\n\nvec4 getClampXYZW(vec4 xyzw) {\n  return clamp(xyzw, vec4(0.0), clampLimit);\n}\n`;","export default /* glsl */ `vec4 opaqueColor(vec4 color) {\n  return vec4(color.rgb, 1.0);\n}\n`;","export default /* glsl */ `uniform vec4 geometryClip;\nattribute vec4 position4;\n\n// External\nvec3 getPosition(vec4 xyzw, float canonical);\n\nvec3 getFacePosition() {\n  vec4 p = min(geometryClip, position4);\n  return getPosition(p, 1.0);\n}\n`;","export default /* glsl */ `attribute vec4 position4;\n\n// External\nvec3 getPosition(vec4 xyzw, float canonical);\n\nvarying vec3 vNormal;\nvarying vec3 vLight;\nvarying vec3 vPosition;\n\nvoid getFaceGeometry(vec4 xyzw, out vec3 pos, out vec3 normal) {\n  vec3 a, b, c;\n\n  a   = getPosition(vec4(xyzw.xyz, 0.0), 0.0);\n  b   = getPosition(vec4(xyzw.xyz, 1.0), 0.0);\n  c   = getPosition(vec4(xyzw.xyz, 2.0), 0.0);\n\n  pos = getPosition(xyzw, 1.0);\n  normal = normalize(cross(c - a, b - a));\n}\n\nvec3 getFacePositionNormal() {\n  vec3 center, normal;\n\n  getFaceGeometry(position4, center, normal);\n  vNormal   = normal;\n  vLight    = normalize((viewMatrix * vec4(1.0, 2.0, 2.0, 0.0)).xyz);\n  vPosition = -center;\n\n  return center;\n}\n`;","export default /* glsl */ `/*\nFloat encoding technique by\nCarlos Scheidegger\nhttps://github.com/cscheid/lux/blob/master/src/shade/bits/encode_float.js\n\nConversion to GLSL by:\nhttp://concord-consortium.github.io/lab/experiments/webgl-gpgpu/script.js\n*/\n\nfloat shift_right(float v, float amt) { \n  v = floor(v) + 0.5; \n  return floor(v / exp2(amt)); \n}\n\nfloat shift_left(float v, float amt) { \n  return floor(v * exp2(amt) + 0.5); \n}\n\nfloat mask_last(float v, float bits) { \n  return mod(v, shift_left(1.0, bits)); \n}\n\nfloat extract_bits(float num, float from, float to) { \n  from = floor(from + 0.5); to = floor(to + 0.5); \n  return mask_last(shift_right(num, from), to - from); \n}\n\nvec4 encode_float(float val) { \n  if (val == 0.0) return vec4(0, 0, 0, 0); \n  float valuesign = val > 0.0 ? 0.0 : 1.0; \n  val = abs(val); \n  float exponent = floor(log2(val)); \n  float biased_exponent = exponent + 127.0; \n  float fraction = ((val / exp2(exponent)) - 1.0) * 8388608.0; \n  float t = biased_exponent / 2.0; \n  float last_bit_of_biased_exponent = fract(t) * 2.0; \n  float remaining_bits_of_biased_exponent = floor(t); \n  float byte4 = extract_bits(fraction, 0.0, 8.0) / 255.0; \n  float byte3 = extract_bits(fraction, 8.0, 16.0) / 255.0; \n  float byte2 = (last_bit_of_biased_exponent * 128.0 + extract_bits(fraction, 16.0, 23.0)) / 255.0; \n  float byte1 = (valuesign * 128.0 + remaining_bits_of_biased_exponent) / 255.0; \n  return vec4(byte4, byte3, byte2, byte1); \n}\n`;","export default /* glsl */ `uniform vec4 indexModulus;\n\nvec4 getSample(vec4 xyzw);\nvec4 getIndex(vec4 xyzw);\n\nvec4 floatPackIndex(vec4 xyzw) {\n  vec4 value = getSample(xyzw);\n  vec4 index = getIndex(xyzw);\n\n  vec4 offset = floor(index + .5) * indexModulus;\n  vec2 sum2 = offset.xy + offset.zw;\n  float sum = sum2.x + sum2.y;\n  return vec4(value.xyz, sum);\n}`;","export default /* glsl */ `vec4 getSample(vec4 xyzw);\n\nfloat floatStretch(vec4 xyzw, float channelIndex) {\n  vec4 sample = getSample(xyzw);\n  vec2 xy = channelIndex > 1.5 ? sample.zw : sample.xy;\n  return mod(channelIndex, 2.0) > .5 ? xy.y : xy.x;\n}`;","export default /* glsl */ `varying float vClipStrokeWidth;\nvarying float vClipStrokeIndex;\nvarying vec3  vClipStrokeEven;\nvarying vec3  vClipStrokeOdd;\nvarying vec3  vClipStrokePosition;\n\nvoid clipStrokeFragment() {\n  bool odd = mod(vClipStrokeIndex, 2.0) >= 1.0;\n\n  vec3 tangent;\n  if (odd) {\n    tangent = vClipStrokeOdd;\n  }\n  else {\n    tangent = vClipStrokeEven;\n  }\n\n  float travel = dot(vClipStrokePosition, normalize(tangent)) / vClipStrokeWidth;\n  if (mod(travel, 16.0) > 8.0) {\n    discard;\n  }\n}\n`;","export default /* glsl */ `varying float vClipStrokeWidth;\nvarying float vClipStrokeIndex;\nvarying vec3  vClipStrokeEven;\nvarying vec3  vClipStrokeOdd;\nvarying vec3  vClipStrokePosition;\n\nvoid clipStrokeFragment() {\n  bool odd = mod(vClipStrokeIndex, 2.0) >= 1.0;\n\n  vec3 tangent;\n  if (odd) {\n    tangent = vClipStrokeOdd;\n  }\n  else {\n    tangent = vClipStrokeEven;\n  }\n\n  float travel = dot(vClipStrokePosition, normalize(tangent)) / vClipStrokeWidth;\n  if (mod(travel, 4.0) > 2.0) {\n    discard;\n  }\n}\n`;","export default /* glsl */ `varying vec2 vClipEnds;\n\nvoid clipEndsFragment() {\n  if (vClipEnds.x < 0.0 || vClipEnds.y < 0.0) discard;\n}\n`;","export default /* glsl */ `varying float vClipProximity;\n\nvoid clipProximityFragment() {\n  if (vClipProximity >= 0.5) discard;\n}`;","export default /* glsl */ `void setFragmentColor(vec4 color) {\n  gl_FragColor = color;\n}`;","export default /* glsl */ `vec4 fragmentRGBA(vec4 rgba, vec4 stpq) {\n  return rgba;\n}`;","export default /* glsl */ `void setFragmentColor(vec4 color) {\n  if (color.a < 1.0) discard;\n  gl_FragColor = color;\n}`;","export default /* glsl */ `void setFragmentColor(vec4 color) {\n  if (color.a >= 1.0) discard;\n  gl_FragColor = color;\n}`;","export default /* glsl */ `uniform vec4 gridPosition;\nuniform vec4 gridStep;\nuniform vec4 gridAxis;\n\nvec4 sampleData(vec2 xy);\n\nvec4 getGridPosition(vec4 xyzw) {\n  vec4 onAxis  = gridAxis * sampleData(vec2(xyzw.y, 0.0)).x;\n  vec4 offAxis = gridStep * xyzw.x + gridPosition;\n  return onAxis + offAxis;\n}\n`;","export default /* glsl */ `uniform float growScale;\nuniform vec4  growMask;\nuniform vec4  growAnchor;\n\nvec4 getSample(vec4 xyzw);\n\nvec4 getGrowSample(vec4 xyzw) {\n  vec4 anchor = xyzw * growMask + growAnchor;\n\n  vec4 position = getSample(xyzw);\n  vec4 center = getSample(anchor);\n\n  return mix(center, position, growScale);\n}`;","export default /* glsl */ `uniform float joinStride;\nuniform float joinStrideInv;\n\nfloat getIndex(vec4 xyzw);\nvec4 getRest(vec4 xyzw);\nvec4 injectIndices(float a, float b);\n\nvec4 getJoinXYZW(vec4 xyzw) {\n\n  float a = getIndex(xyzw);\n  float b = a * joinStrideInv;\n\n  float integer  = floor(b);\n  float fraction = b - integer;\n  \n  return injectIndices(fraction * joinStride, integer) + getRest(xyzw);\n}\n`;","export default /* glsl */ `varying float vPixelSize;\n\nvec4 getLabelAlphaColor(vec4 color, vec4 sample) {\n  float mask = clamp(sample.r * 1000.0, 0.0, 1.0);\n  float alpha = (sample.r - .5) * vPixelSize + .5;\n  float a = mask * alpha * color.a;\n  if (a <= 0.0) discard;\n  return vec4(color.xyz, a);\n}\n`;","export default /* glsl */ `vec2 mapUV(vec4 uvwo, vec4 stpq) {\n  return uvwo.xy;\n}\n`;","export default /* glsl */ `uniform float outlineExpand;\nuniform float outlineStep;\nuniform vec3  outlineColor;\n\nvarying float vPixelSize;\n\nconst float PIXEL_STEP = 255.0 / 16.0;\n\nvec4 getLabelOutlineColor(vec4 color, vec4 sample) {\n  float ps = vPixelSize * PIXEL_STEP;\n  float os = outlineStep;\n\n  float sdf = sample.r - .5 + outlineExpand;\n  vec2  sdfs = vec2(sdf, sdf + os);\n  vec2  alpha = clamp(sdfs * ps + .5, 0.0, 1.0);\n\n  if (alpha.y <= 0.0) {\n    discard;\n  }\n\n  vec3 blend = color.xyz;\n  if (alpha.y > alpha.x) {\n    blend = sqrt(mix(outlineColor * outlineColor, blend * blend, alpha.x));\n  }\n  \n  return vec4(blend, alpha.y * color.a);\n}\n`;","export default /* glsl */ `uniform vec4 layerScale;\nuniform vec4 layerBias;\n\nvec4 layerPosition(vec4 position, inout vec4 stpq) {\n  return layerScale * position + layerBias;\n}\n`;","export default /* glsl */ `// External\nvec4 sampleData(vec4 xyzw);\n\nvec4 lerpDepth(vec4 xyzw) {\n  float x = xyzw.z;\n  float i = floor(x);\n  float f = x - i;\n    \n  vec4 xyzw1 = vec4(xyzw.xy, i, xyzw.w);\n  vec4 xyzw2 = vec4(xyzw.xy, i + 1.0, xyzw.w);\n  \n  vec4 a = sampleData(xyzw1);\n  vec4 b = sampleData(xyzw2);\n\n  return mix(a, b, f);\n}\n`;","export default /* glsl */ `// External\nvec4 sampleData(vec4 xyzw);\n\nvec4 lerpHeight(vec4 xyzw) {\n  float x = xyzw.y;\n  float i = floor(x);\n  float f = x - i;\n    \n  vec4 xyzw1 = vec4(xyzw.x, i, xyzw.zw);\n  vec4 xyzw2 = vec4(xyzw.x, i + 1.0, xyzw.zw);\n  \n  vec4 a = sampleData(xyzw1);\n  vec4 b = sampleData(xyzw2);\n\n  return mix(a, b, f);\n}\n`;","export default /* glsl */ `// External\nvec4 sampleData(vec4 xyzw);\n\nvec4 lerpItems(vec4 xyzw) {\n  float x = xyzw.w;\n  float i = floor(x);\n  float f = x - i;\n    \n  vec4 xyzw1 = vec4(xyzw.xyz, i);\n  vec4 xyzw2 = vec4(xyzw.xyz, i + 1.0);\n  \n  vec4 a = sampleData(xyzw1);\n  vec4 b = sampleData(xyzw2);\n\n  return mix(a, b, f);\n}\n`;","export default /* glsl */ `// External\nvec4 sampleData(vec4 xyzw);\n\nvec4 lerpWidth(vec4 xyzw) {\n  float x = xyzw.x;\n  float i = floor(x);\n  float f = x - i;\n    \n  vec4 xyzw1 = vec4(i, xyzw.yzw);\n  vec4 xyzw2 = vec4(i + 1.0, xyzw.yzw);\n  \n  vec4 a = sampleData(xyzw1);\n  vec4 b = sampleData(xyzw2);\n\n  return mix(a, b, f);\n}\n`;","export default /* glsl */ `// Units and calibration\nuniform float worldUnit;\nuniform float lineWidth;\nuniform float lineDepth;\nuniform float focusDepth;\n\n// General data index\nuniform vec4 geometryClip;\nattribute vec4 position4;\n\n// (Start/mid/end -1/0/1, top/bottom -1,1)\nattribute vec2 line;\n\n// 0...1 for round or bevel joins\n#ifdef LINE_JOIN_DETAIL\nattribute float joint;\n#else\nconst float joint = 0.0;\n#endif\n\n// Knock out excessively long line segments (e.g. for asymtpotes)\n#ifdef LINE_PROXIMITY\nuniform float lineProximity;\nvarying float vClipProximity;\n#endif\n\n// Ghetto line stroking (local only, not global)\n#ifdef LINE_STROKE\nvarying float vClipStrokeWidth;\nvarying float vClipStrokeIndex;\nvarying vec3  vClipStrokeEven;\nvarying vec3  vClipStrokeOdd;\nvarying vec3  vClipStrokePosition;\n#endif\n\n// External\nvec3 getPosition(vec4 xyzw, float canonical);\n\n// Clip line ends for arrows / decoration\n#ifdef LINE_CLIP\nuniform float clipRange;\nuniform vec2  clipStyle;\nuniform float clipSpace;\n\nattribute vec2 strip;\n\nvarying vec2 vClipEnds;\n\nvoid clipEnds(vec4 xyzw, vec3 center, vec3 pos) {\n\n  // Sample end of line strip\n  vec4 xyzwE = vec4(strip.y, xyzw.yzw);\n  vec3 end   = getPosition(xyzwE, 0.0);\n\n  // Sample start of line strip\n  vec4 xyzwS = vec4(strip.x, xyzw.yzw);\n  vec3 start = getPosition(xyzwS, 0.0);\n\n  // Measure length\n  vec3 diff = end - start;\n  float l = length(diff) * clipSpace;\n\n  // Arrow length (=2.5x radius)\n  float arrowSize = 1.25 * clipRange * lineWidth * worldUnit;\n\n  vClipEnds = vec2(1.0);\n\n  if (clipStyle.y > 0.0) {\n    // Depth blend end\n    float depth = focusDepth;\n    if (lineDepth < 1.0) {\n      float z = max(0.00001, -end.z);\n      depth = mix(z, focusDepth, lineDepth);\n    }\n\n    // Absolute arrow length\n    float size = arrowSize * depth;\n\n    // Adjust clip range\n    // Approach linear scaling with cubic ease the smaller we get\n    float mini = clamp(1.0 - l / size * .333, 0.0, 1.0);\n    float scale = 1.0 - mini * mini * mini;\n    float invrange = 1.0 / (size * scale);\n\n    // Clip end\n    diff = end - center;\n    if(diff == vec3(0.0))\n      vClipEnds.x = -1.0;\n    else {\n      diff = normalize(end - center);\n      float d = dot(end - pos, diff);\n      vClipEnds.x = d * invrange - 1.0;\n    }\n  }\n\n  if (clipStyle.x > 0.0) {\n    // Depth blend start\n    float depth = focusDepth;\n    if (lineDepth < 1.0) {\n      float z = max(0.00001, -start.z);\n      depth = mix(z, focusDepth, lineDepth);\n    }\n\n    // Absolute arrow length\n    float size = arrowSize * depth;\n\n    // Adjust clip range\n    // Approach linear scaling with cubic ease the smaller we get\n    float mini = clamp(1.0 - l / size * .333, 0.0, 1.0);\n    float scale = 1.0 - mini * mini * mini;\n    float invrange = 1.0 / (size * scale);\n\n    // Clip start\n    diff = center - start;\n    if(diff == vec3(0.0))\n      vClipEnds.y = -1.0;\n    else {\n      diff = normalize(center - start);\n      float d = dot(pos - start, diff);\n      vClipEnds.y = d * invrange - 1.0;\n    }\n  }\n\n\n}\n#endif\n\n// Adjust left/center/right to be inside near/far z range\nconst float epsilon = 1e-5;\nvoid fixCenter(inout vec3 left, inout vec3 center, inout vec3 right) {\n  if (center.z >= 0.0) {\n    if (left.z < 0.0) {\n      float d = (center.z + epsilon) / (center.z - left.z);\n      center = mix(center, left, d);\n    }\n    else if (right.z < 0.0) {\n      float d = (center.z + epsilon) / (center.z - right.z);\n      center = mix(center, right, d);\n    }\n  }\n\n  if (left.z >= 0.0) {\n    if (center.z < 0.0) {\n      float d = (left.z + epsilon) / (left.z - center.z);\n      left = mix(left, center, d);\n    }\n  }\n\n  if (right.z >= 0.0) {\n    if (center.z < 0.0) {\n      float d = (right.z + epsilon) / (right.z - center.z);\n      right = mix(right, center, d);\n    }\n  }\n}\n\n// Sample the source data in an edge-aware manner\nvoid getLineGeometry(vec4 xyzw, float edge, out vec3 left, out vec3 center, out vec3 right) {\n  vec4 delta = vec4(1.0, 0.0, 0.0, 0.0);\n\n  center =                 getPosition(xyzw, 1.0);\n  left   = (edge > -0.5) ? getPosition(xyzw - delta, 0.0) : center;\n  right  = (edge < 0.5)  ? getPosition(xyzw + delta, 0.0) : center;\n}\n\n// Calculate the position for a vertex along the line, including joins\nvec3 getLineJoin(float edge, bool odd, vec3 left, vec3 center, vec3 right, float width, float offset, float joint) {\n  vec2 join = vec2(1.0, 0.0);\n\n  fixCenter(left, center, right);\n\n  vec4 a = vec4(left.xy, right.xy);\n  vec4 b = a / vec4(left.zz, right.zz);\n\n  vec2 l = b.xy;\n  vec2 r = b.zw;\n  vec2 c = center.xy / center.z;\n\n  vec4 d = vec4(l, c) - vec4(c, r);\n  float l1 = dot(d.xy, d.xy);\n  float l2 = dot(d.zw, d.zw);\n\n  if (l1 + l2 > 0.0) {\n\n    if (edge > 0.5 || l2 == 0.0) {\n      vec2 nl = normalize(d.xy);\n      vec2 tl = vec2(nl.y, -nl.x);\n\n#ifdef LINE_PROXIMITY\n      vClipProximity = 1.0;\n#endif\n\n#ifdef LINE_STROKE\n      vClipStrokeEven = vClipStrokeOdd = normalize(left - center);\n#endif\n      join = tl;\n    }\n    else if (edge < -0.5 || l1 == 0.0) {\n      vec2 nr = normalize(d.zw);\n      vec2 tr = vec2(nr.y, -nr.x);\n\n#ifdef LINE_PROXIMITY\n      vClipProximity = 1.0;\n#endif\n\n#ifdef LINE_STROKE\n      vClipStrokeEven = vClipStrokeOdd = normalize(center - right);\n#endif\n      join = tr;\n    }\n    else {\n      // Limit join stretch for tiny segments\n      float lmin2 = min(l1, l2) / (width * width);\n\n      // Hide line segment if ratio of leg lengths exceeds promixity threshold\n#ifdef LINE_PROXIMITY\n      float lr     = l1 / l2;\n      float rl     = l2 / l1;\n      float ratio  = max(lr, rl);\n      float thresh = lineProximity + 1.0;\n      vClipProximity = (ratio > thresh * thresh) ? 1.0 : 0.0;\n#endif\n\n      // Calculate normals/tangents\n      vec2 nl = normalize(d.xy);\n      vec2 nr = normalize(d.zw);\n\n      // Calculate tangents\n      vec2 tl = vec2(nl.y, -nl.x);\n      vec2 tr = vec2(nr.y, -nr.x);\n\n#ifdef LINE_PROXIMITY\n      // Mix tangents according to leg lengths\n      vec2 tc = normalize(mix(tl, tr, l1/(l1+l2)));\n#else\n      // Average tangent\n      vec2 tc = normalize(tl + tr);\n#endif\n\n      // Miter join\n      float cosA   = dot(nl, tc);\n      float sinA   = max(0.1, abs(dot(tl, tc)));\n      float factor = cosA / sinA;\n      float scale  = sqrt(1.0 + min(lmin2, factor * factor));\n\n      // Stroke normals\n#ifdef LINE_STROKE\n      vec3 stroke1 = normalize(left - center);\n      vec3 stroke2 = normalize(center - right);\n\n      if (odd) {\n        vClipStrokeEven = stroke1;\n        vClipStrokeOdd  = stroke2;\n      }\n      else {\n        vClipStrokeEven = stroke2;\n        vClipStrokeOdd  = stroke1;\n      }\n#endif\n\n#ifdef LINE_JOIN_MITER\n      // Apply straight up miter\n      join = tc * scale;\n#endif\n\n#ifdef LINE_JOIN_ROUND\n      // Slerp bevel join into circular arc\n      float dotProduct = dot(nl, nr);\n      float angle = acos(dotProduct);\n      float sinT  = sin(angle);\n      join = (sin((1.0 - joint) * angle) * tl + sin(joint * angle) * tr) / sinT;\n#endif\n\n#ifdef LINE_JOIN_BEVEL\n      // Direct bevel join between two flat ends\n      float dotProduct = dot(nl, nr);\n      join = mix(tl, tr, joint);\n#endif\n\n#ifdef LINE_JOIN_DETAIL\n      // Check if on inside or outside of joint\n      float crossProduct = nl.x * nr.y - nl.y * nr.x;\n      if (offset * crossProduct < 0.0) {\n        // For near-180-degree bends, correct back to a miter to avoid discontinuities\n        float ratio = clamp(-dotProduct * 2.0 - 1.0, 0.0, 1.0);\n        // Otherwise collapse the inside vertices into one.\n        join = mix(tc * scale, join, ratio * ratio * ratio);\n      }\n#endif\n\n    }\n    return vec3(join, 0.0);\n  }\n  else {\n    return vec3(0.0);\n  }\n\n}\n\n// Calculate final line position\nvec3 getLinePosition() {\n  vec3 left, center, right, join;\n\n  // left/center/right\n  float edge = line.x;\n  // up/down\n  float offset = line.y;\n\n  // Clip data\n  vec4 p = min(geometryClip, position4);\n  edge += max(0.0, position4.x - geometryClip.x);\n\n  // Get position + adjacent neighbours\n  getLineGeometry(p, edge, left, center, right);\n\n#ifdef LINE_STROKE\n  // Set parameters for line stroke fragment shader\n  vClipStrokePosition = center;\n  vClipStrokeIndex = p.x;\n  bool odd = mod(p.x, 2.0) >= 1.0;\n#else\n  bool odd = true;\n#endif\n\n  // Divide line width up/down\n  float width = lineWidth * 0.5;\n\n  float depth = focusDepth;\n  if (lineDepth < 1.0) {\n    // Depth blending\n    float z = max(0.00001, -center.z);\n    depth = mix(z, focusDepth, lineDepth);\n  }\n  width *= depth;\n\n  // Convert to world units\n  width *= worldUnit;\n\n  // Calculate line join\n  join = getLineJoin(edge, odd, left, center, right, width, offset, joint);\n  vec3 pos = center + join * offset * width;\n\n#ifdef LINE_STROKE\n  vClipStrokeWidth = width;\n#endif\n\n#ifdef LINE_CLIP\n  clipEnds(p, center, pos);\n#endif\n\n  return pos;\n}\n`;","export default /* glsl */ `uniform vec2 dataResolution;\nuniform vec2 dataPointer;\n\nvec2 map2DData(vec2 xy) {\n  return (xy + dataPointer) * dataResolution;\n}\n`;","export default /* glsl */ `uniform vec2 dataResolution;\nuniform vec2 dataPointer;\n\nvec2 map2DData(vec2 xy) {\n  return fract((xy + dataPointer) * dataResolution);\n}\n`;","export default /* glsl */ `void mapXyzw2DV(vec4 xyzw, out vec2 xy, out float z) {\n  xy = xyzw.xy;\n  z  = xyzw.z;\n}\n\n`;","export default /* glsl */ `vec4 alignXYZW(vec4 xyzw) {\n  return floor(xyzw + .5);\n}\n\n`;","export default /* glsl */ `uniform float textureItems;\nuniform float textureHeight;\n\nvec2 mapXyzwTexture(vec4 xyzw) {\n  \n  float x = xyzw.x;\n  float y = xyzw.y;\n  float z = xyzw.z;\n  float i = xyzw.w;\n  \n  return vec2(i, y) + vec2(x, z) * vec2(textureItems, textureHeight);\n}\n\n`;","export default /* glsl */ `varying vec4 vColor;\n\nvec4 getColor() {\n  return vColor;\n}\n`;","export default /* glsl */ `#ifdef POSITION_STPQ\nvarying vec4 vSTPQ;\n#endif\n#ifdef POSITION_U\nvarying float vU;\n#endif\n#ifdef POSITION_UV\nvarying vec2 vUV;\n#endif\n#ifdef POSITION_UVW\nvarying vec3 vUVW;\n#endif\n#ifdef POSITION_UVWO\nvarying vec4 vUVWO;\n#endif\n\nvec4 getSample(vec4 uvwo, vec4 stpq);\n\nvec4 getMapColor() {\n  #ifdef POSITION_STPQ\n  vec4 stpq = vSTPQ;\n  #else\n  vec4 stpq = vec4(0.0);\n  #endif\n\n  #ifdef POSITION_U\n  vec4 uvwo = vec4(vU, 0.0, 0.0, 0.0);\n  #endif\n  #ifdef POSITION_UV\n  vec4 uvwo = vec4(vUV, 0.0, 0.0);\n  #endif\n  #ifdef POSITION_UVW\n  vec4 uvwo = vec4(vUVW, 0.0);\n  #endif\n  #ifdef POSITION_UVWO\n  vec4 uvwo = vec4(vUVWO);\n  #endif\n\n  return getSample(uvwo, stpq);\n}\n`;","export default /* glsl */ `varying float vMask;\n\nfloat ease(float t) {\n  t = clamp(t, 0.0, 1.0);\n  return t * t * (3.0 - 2.0 * t);\n}\n\nvec4 maskColor() {\n  if (vMask <= 0.0) discard;\n  return vec4(vec3(1.0), ease(vMask));\n}\n`;","export default /* glsl */ `#ifdef POSITION_STPQ\nvarying vec4 vSTPQ;\n#endif\n#ifdef POSITION_U\nvarying float vU;\n#endif\n#ifdef POSITION_UV\nvarying vec2 vUV;\n#endif\n#ifdef POSITION_UVW\nvarying vec3 vUVW;\n#endif\n#ifdef POSITION_UVWO\nvarying vec4 vUVWO;\n#endif\n\nvec4 getSample(vec4 rgba, vec4 stpq);\n\nvec4 getMaterialColor(vec4 rgba) {\n  vec4 stpq = vec4(0.0);\n\n  #ifdef POSITION_U\n  stpq.x = vU;\n  #endif\n  #ifdef POSITION_UV\n  stpq.xy = vUV;\n  #endif\n  #ifdef POSITION_UVW\n  stpq.xyz = vUVW;\n  #endif\n  #ifdef POSITION_UVWO\n  stpq = vUVWO;\n  #endif\n\n  #ifdef POSITION_STPQ\n  stpq = vSTPQ;\n  #endif\n\n  return getSample(rgba, stpq);\n}\n`;","export default /* glsl */ `varying vec3 vNormal;\nvarying vec3 vLight;\nvarying vec3 vPosition;\n\nvec3 offSpecular(vec3 color) {\n  vec3 c = 1.0 - color;\n  return 1.0 - c * c;\n}\n\nvec4 getShadedColor(vec4 rgba) {\n  \n  vec3 color = rgba.xyz;\n  vec3 color2 = offSpecular(rgba.xyz);\n\n  vec3 normal = normalize(vNormal);\n  vec3 light = normalize(vLight);\n  vec3 position = normalize(vPosition);\n  \n  float side    = gl_FrontFacing ? -1.0 : 1.0;\n  float cosine  = side * dot(normal, light);\n  float diffuse = mix(max(0.0, cosine), .5 + .5 * cosine, .1);\n  \n  vec3  halfLight = normalize(light + position);\n\tfloat cosineHalf = max(0.0, side * dot(normal, halfLight));\n\tfloat specular = pow(cosineHalf, 16.0);\n\t\n\treturn vec4(color * (diffuse * .9 + .05) + .25 * color2 * specular, rgba.a);\n}\n`;","export default /* glsl */ ``;","export default /* glsl */ `vec4 getGammaInColor(vec4 rgba) {\n  return vec4(rgba.rgb * rgba.rgb, rgba.a);\n}\n`;","export default /* glsl */ `vec4 getGammaOutColor(vec4 rgba) {\n  return vec4(sqrt(rgba.rgb), rgba.a);\n}\n`;","export default /* glsl */ `vec4 mapUVWO(vec4 uvwo, vec4 stpq) {\n  return uvwo;\n}\n`;","export default /* glsl */ `uniform vec4 geometryClip;\nattribute vec4 position4;\n\n// External\nvec3 getPosition(vec4 xyzw, float canonical);\n\nvec3 getMeshPosition() {\n  vec4 p = min(geometryClip, position4);\n  return getPosition(p, 1.0);\n}\n`;","export default /* glsl */ `attribute vec4 position4;\nuniform vec4 geometryClip;\nvarying vec4 vColor;\n\n// External\nvec4 getSample(vec4 xyzw);\n\nvoid vertexColor() {\n  vec4 p = min(geometryClip, position4);\n  vColor = getSample(p);\n}\n`;","export default /* glsl */ `attribute vec4 position4;\nuniform vec4 geometryResolution;\nuniform vec4 geometryClip;\nvarying float vMask;\n\n// External\nfloat getSample(vec4 xyzw);\n\nvoid maskLevel() {\n  vec4 p = min(geometryClip, position4);\n  vMask = getSample(p * geometryResolution);\n}\n`;","export default /* glsl */ `uniform vec4 geometryResolution;\n\n#ifdef POSITION_STPQ\nvarying vec4 vSTPQ;\n#endif\n#ifdef POSITION_U\nvarying float vU;\n#endif\n#ifdef POSITION_UV\nvarying vec2 vUV;\n#endif\n#ifdef POSITION_UVW\nvarying vec3 vUVW;\n#endif\n#ifdef POSITION_UVWO\nvarying vec4 vUVWO;\n#endif\n\n// External\nvec3 getPosition(vec4 xyzw, in vec4 stpqIn, out vec4 stpqOut);\n\nvec3 getMeshPosition(vec4 xyzw, float canonical) {\n  vec4 stpqOut, stpqIn = xyzw * geometryResolution;\n  vec3 xyz = getPosition(xyzw, stpqIn, stpqOut);\n\n  #ifdef POSITION_MAP\n  if (canonical > 0.5) {\n    #ifdef POSITION_STPQ\n    vSTPQ = stpqOut;\n    #endif\n    #ifdef POSITION_U\n    vU = stpqOut.x;\n    #endif\n    #ifdef POSITION_UV\n    vUV = stpqOut.xy;\n    #endif\n    #ifdef POSITION_UVW\n    vUVW = stpqOut.xyz;\n    #endif\n    #ifdef POSITION_UVWO\n    vUVWO = stpqOut;\n    #endif\n  }\n  #endif\n  return xyz;\n}\n`;","export default /* glsl */ `uniform float transitionEnter;\nuniform float transitionExit;\nuniform vec4  transitionScale;\nuniform vec4  transitionBias;\nuniform float transitionSkew;\nuniform float transitionActive;\n\nuniform vec4  moveFrom;\nuniform vec4  moveTo;\n\nfloat ease(float t) {\n  t = clamp(t, 0.0, 1.0);\n  return 1.0 - (2.0 - t) * t;\n}\n\nvec4 getTransitionPosition(vec4 xyzw, inout vec4 stpq) {\n  if (transitionActive < 0.5) return xyzw;\n\n  float enter   = transitionEnter;\n  float exit    = transitionExit;\n  float skew    = transitionSkew;\n  vec4  scale   = transitionScale;\n  vec4  bias    = transitionBias;\n\n  float factor  = 1.0 + skew;\n  float offset  = dot(vec4(1.0), stpq * scale + bias);\n\n  float a1 = ease(enter * factor - offset);\n  float a2 = ease(exit  * factor + offset - skew);\n\n  return xyzw + a1 * moveFrom + a2 * moveTo;\n}`;","export default /* glsl */ `vec4 getMask(vec4 xyzw) {\n  return vec4(1.0);\n}`;","export default /* glsl */ `varying float vPixelSize;\n\nfloat getDiscAlpha(float mask) {\n  // Approximation: 1 - x*x is approximately linear around x = 1 with slope 2\n  return vPixelSize * (1.0 - mask);\n  //  return vPixelSize * 2.0 * (1.0 - sqrt(mask));\n}\n`;","export default /* glsl */ `varying float vPixelSize;\n\nfloat getDiscHollowAlpha(float mask) {\n  return vPixelSize * (0.5 - 2.0 * abs(sqrt(mask) - .75));\n}\n`;","export default /* glsl */ `varying float vPixelSize;\n\nfloat getGenericAlpha(float mask) {\n  return vPixelSize * 2.0 * (1.0 - mask);\n}\n`;","export default /* glsl */ `varying float vPixelSize;\n\nfloat getGenericHollowAlpha(float mask) {\n  return vPixelSize * (0.5 - 2.0 * abs(mask - .75));\n}\n`;","export default /* glsl */ `varying vec2 vSprite;\n\nfloat getSpriteMask(vec2 xy);\nfloat getSpriteAlpha(float mask);\n\nvoid setFragmentColorFill(vec4 color) {\n  float mask = getSpriteMask(vSprite);\n  if (mask > 1.0) {\n    discard;\n  }\n  float alpha = getSpriteAlpha(mask);\n  if (alpha >= 1.0) {\n    discard;\n  }\n  gl_FragColor = vec4(color.rgb, alpha * color.a);\n}\n`;","export default /* glsl */ `varying vec2 vSprite;\n\nfloat getSpriteMask(vec2 xy);\nfloat getSpriteAlpha(float mask);\n\nvoid setFragmentColorFill(vec4 color) {\n  float mask = getSpriteMask(vSprite);\n  if (mask > 1.0) {\n    discard;\n  }\n  float alpha = getSpriteAlpha(mask);\n  if (alpha < 1.0) {\n    discard;\n  }\n  gl_FragColor = color;\n}\n\n`;","export default /* glsl */ `varying float vPixelSize;\n\nfloat getCircleMask(vec2 uv) {\n  return dot(uv, uv);\n}\n`;","export default /* glsl */ `varying float vPixelSize;\n\nfloat getDiamondMask(vec2 uv) {\n  vec2 a = abs(uv);\n  return a.x + a.y;\n}\n`;","export default /* glsl */ `varying float vPixelSize;\n\nfloat getTriangleDownMask(vec2 uv) {\n  uv.y += .25;\n  return max(uv.y, abs(uv.x) * .866 - uv.y * .5 + .6);\n}\n`;","export default /* glsl */ `varying float vPixelSize;\n\nfloat getTriangleLeftMask(vec2 uv) {\n  uv.x += .25;\n  return max(uv.x, abs(uv.y) * .866 - uv.x * .5 + .6);\n}\n`;","export default /* glsl */ `varying float vPixelSize;\n\nfloat getTriangleRightMask(vec2 uv) {\n  uv.x -= .25;\n  return max(-uv.x, abs(uv.y) * .866 + uv.x * .5 + .6);\n}\n`;","export default /* glsl */ `varying float vPixelSize;\n\nfloat getSquareMask(vec2 uv) {\n  vec2 a = abs(uv);\n  return max(a.x, a.y);\n}\n`;","export default /* glsl */ `varying float vPixelSize;\n\nfloat getTriangleUpMask(vec2 uv) {\n  uv.y -= .25;\n  return max(-uv.y, abs(uv.x) * .866 + uv.y * .5 + .6);\n}\n`;","export default /* glsl */ `uniform float pointDepth;\n\nuniform float pixelUnit;\nuniform float renderScale;\nuniform float renderScaleInv;\nuniform float focusDepth;\n\nuniform vec4 geometryClip;\nattribute vec4 position4;\nattribute vec2 sprite;\n\nvarying vec2 vSprite;\nvarying float vPixelSize;\n\nconst float pointScale = POINT_SHAPE_SCALE;\n\n// External\nfloat getPointSize(vec4 xyzw);\nvec3 getPosition(vec4 xyzw, float canonical);\n\nvec3 getPointPosition() {\n  vec4 p = min(geometryClip, position4);\n  vec3 center = getPosition(p, 1.0);\n\n  // Depth blending\n  // TODO: orthographic camera\n  // Workaround: set depth = 0\n  float z = -center.z;\n  float depth = mix(z, focusDepth, pointDepth);\n  \n  // Match device/unit mapping \n  // Sprite goes from -1..1, width = 2.\n  float pointSize = getPointSize(p);\n  float size = pointScale * pointSize * pixelUnit * .5;\n  float depthSize = depth * size;\n  \n  // Pad sprite by half a pixel to make the anti-aliasing straddle the pixel edge\n  // Note: pixelsize measures radius\n  float pixelSize = .5 * (pointDepth > 0.0 ? depthSize / z : size);\n  float paddedSize = pixelSize + 0.5;\n  float padFactor = paddedSize / pixelSize;\n\n  vPixelSize = paddedSize;\n  vSprite    = sprite;\n\n  return center + vec3(sprite * depthSize * renderScaleInv * padFactor, 0.0);\n}\n`;","export default /* glsl */ `uniform float pointSize;\n\nfloat getPointSize(vec4 xyzw) {\n  return pointSize;\n}`;","export default /* glsl */ `uniform float pointSize;\n\nvec4 getSample(vec4 xyzw);\n\nfloat getPointSize(vec4 xyzw) {\n  return pointSize * getSample(xyzw).x;\n}`;","export default /* glsl */ `uniform float polarBend;\nuniform float polarFocus;\nuniform float polarAspect;\nuniform float polarHelix;\n\nuniform mat4 viewMatrix;\n\nvec4 getPolarPosition(vec4 position, inout vec4 stpq) {\n  if (polarBend > 0.0) {\n\n    if (polarBend < 0.001) {\n      // Factor out large addition/subtraction of polarFocus\n      // to avoid numerical error\n      // sin(x) ~ x\n      // cos(x) ~ 1 - x * x / 2\n      vec2 pb = position.xy * polarBend;\n      float ppbbx = pb.x * pb.x;\n      return viewMatrix * vec4(\n        position.x * (1.0 - polarBend + (pb.y * polarAspect)),\n        position.y * (1.0 - .5 * ppbbx) - (.5 * ppbbx) * polarFocus / polarAspect,\n        position.z + position.x * polarHelix * polarBend,\n        1.0\n      );\n    }\n    else {\n      vec2 xy = position.xy * vec2(polarBend, polarAspect);\n      float radius = polarFocus + xy.y;\n      return viewMatrix * vec4(\n        sin(xy.x) * radius,\n        (cos(xy.x) * radius - polarFocus) / polarAspect,\n        position.z + position.x * polarHelix * polarBend,\n        1.0\n      );\n    }\n  }\n  else {\n    return viewMatrix * vec4(position.xyz, 1.0);\n  }\n}`;","export default /* glsl */ `uniform float styleZBias;\nuniform float styleZIndex;\n\nvoid setPosition(vec3 position) {\n  vec4 pos = projectionMatrix * vec4(position, 1.0);\n\n  // Apply relative Z bias\n  float bias  = (1.0 - styleZBias / 32768.0);\n  pos.z *= bias;\n  \n  // Apply large scale Z index changes\n  if (styleZIndex > 0.0) {\n    float z = pos.z / pos.w;\n    pos.z = ((z + 1.0) / (styleZIndex + 1.0) - 1.0) * pos.w;\n  }\n  \n  gl_Position = pos;\n}`;","export default /* glsl */ `// This is three.js' global uniform, missing from fragment shaders.\nuniform mat4 projectionMatrix;\n\nvec4 readbackPosition(vec3 position, vec4 stpq) {\n  vec4 pos = projectionMatrix * vec4(position, 1.0);\n  vec3 final = pos.xyz / pos.w;\n  if (final.z < -1.0) {\n    return vec4(0.0, 0.0, 0.0, -1.0);\n  }\n  else {\n    return vec4(final, -position.z);\n  }\n}\n`;","export default /* glsl */ `uniform vec4 geometryScale;\nattribute vec4 position4;\n\nvec4 getRawPositionScale() {\n  return geometryScale * position4;\n}\n`;","export default /* glsl */ `uniform vec4 repeatModulus;\n\nvec4 getRepeatXYZW(vec4 xyzw) {\n  return mod(xyzw + .5, repeatModulus) - .5;\n}\n`;","export default /* glsl */ `uniform vec4 resampleBias;\n\nvec4 resamplePadding(vec4 xyzw) {\n  return xyzw + resampleBias;\n}`;","export default /* glsl */ `uniform vec4 resampleFactor;\n\nvec4 resampleRelative(vec4 xyzw) {\n  return xyzw * resampleFactor;\n}`;","export default /* glsl */ `uniform float transitionEnter;\nuniform float transitionExit;\nuniform vec4  transitionScale;\nuniform vec4  transitionBias;\nuniform float transitionSkew;\nuniform float transitionActive;\n\nfloat getTransitionSDFMask(vec4 stpq) {\n  if (transitionActive < 0.5) return 1.0;\n\n  float enter   = transitionEnter;\n  float exit    = transitionExit;\n  float skew    = transitionSkew;\n  vec4  scale   = transitionScale;\n  vec4  bias    = transitionBias;\n\n  float factor  = 1.0 + skew;\n  float offset  = dot(vec4(1.0), stpq * scale + bias);\n\n  vec2 d = vec2(enter, exit) * factor + vec2(-offset, offset - skew);\n  if (exit  == 1.0) return d.x;\n  if (enter == 1.0) return d.y;\n  return min(d.x, d.y);\n}`;","export default /* glsl */ `vec3 getRootPosition(vec4 position, in vec4 stpqIn, out vec4 stpqOut) {\n  stpqOut = stpqIn; // avoid inout confusion\n  return position.xyz;\n}`;","export default /* glsl */ `uniform sampler2D dataTexture;\n\nvec4 sample2D(vec2 uv) {\n  return texture2D(dataTexture, uv);\n}\n`;","export default /* glsl */ `uniform vec4 scaleAxis;\nuniform vec4 scaleOffset;\n\nvec4 sampleData(float x);\n\nvec4 getScalePosition(vec4 xyzw) {\n  return scaleAxis * sampleData(xyzw.x).x + scaleOffset;\n}\n`;","export default /* glsl */ `uniform vec4 remapSTPQScale;\n\nvec4 screenMapSTPQ(vec4 xyzw, out vec4 stpq) {\n  stpq = xyzw * remapSTPQScale;\n  return xyzw;\n}\n`;","export default /* glsl */ `uniform vec2 remapUVScale;\n\nvec4 screenMapXY(vec4 uvwo, vec4 stpq) {\n  return vec4(floor(remapUVScale * uvwo.xy), 0.0, 0.0);\n}\n`;","export default /* glsl */ `uniform vec2 remapUVScale;\nuniform vec2 remapModulus;\nuniform vec2 remapModulusInv;\n\nvec4 screenMapXYZW(vec4 uvwo, vec4 stpq) {\n  vec2 st = floor(remapUVScale * uvwo.xy);\n  vec2 xy = st * remapModulusInv;\n  vec2 ixy = floor(xy);\n  vec2 fxy = xy - ixy;\n  vec2 zw = fxy * remapModulus;\n  return vec4(ixy.x, zw.y, ixy.y, zw.x);\n}\n`;","export default /* glsl */ `vec2 screenPassUV(vec4 uvwo, vec4 stpq) {\n  return uvwo.xy;\n}\n`;","export default /* glsl */ `void setScreenPosition(vec4 position) {\n  gl_Position = vec4(position.xy * 2.0 - 1.0, 0.5, 1.0);\n}\n`;","export default /* glsl */ `uniform vec4 sliceOffset;\n\nvec4 getSliceOffset(vec4 xyzw) {\n  return xyzw + sliceOffset;\n}\n`;","export default /* glsl */ `uniform float sphericalBend;\nuniform float sphericalFocus;\nuniform float sphericalAspectX;\nuniform float sphericalAspectY;\nuniform float sphericalScaleY;\n\nuniform mat4 viewMatrix;\n\nvec4 getSphericalPosition(vec4 position, inout vec4 stpq) {\n  if (sphericalBend > 0.0001) {\n\n    vec3 xyz = position.xyz * vec3(sphericalBend, sphericalBend / sphericalAspectY * sphericalScaleY, sphericalAspectX);\n    float radius = sphericalFocus + xyz.z;\n    float cosine = cos(xyz.y) * radius;\n\n    return viewMatrix * vec4(\n      sin(xyz.x) * cosine,\n      sin(xyz.y) * radius * sphericalAspectY,\n      (cos(xyz.x) * cosine - sphericalFocus) / sphericalAspectX,\n      1.0\n    );\n  }\n  else {\n    return viewMatrix * vec4(position.xyz, 1.0);\n  }\n}`;","export default /* glsl */ `uniform float splitStride;\n\nvec2 getIndices(vec4 xyzw);\nvec4 getRest(vec4 xyzw);\nvec4 injectIndex(float v);\n\nvec4 getSplitXYZW(vec4 xyzw) {\n  vec2 uv = getIndices(xyzw);\n  float offset = uv.x + uv.y * splitStride;\n  return injectIndex(offset) + getRest(xyzw);\n}\n`;","export default /* glsl */ `uniform vec4 spreadOffset;\nuniform mat4 spreadMatrix;\n\n// External\nvec4 getSample(vec4 xyzw);\n\nvec4 getSpreadSample(vec4 xyzw) {\n  vec4 sample = getSample(xyzw);\n  return sample + spreadMatrix * (spreadOffset + xyzw);\n}\n`;","export default /* glsl */ `varying vec2 vSprite;\n\nvec4 getSample(vec2 xy);\n\nvec4 getSpriteColor() {\n  return getSample(vSprite);\n}`;","export default /* glsl */ `uniform vec2 spriteOffset;\nuniform float spriteScale;\nuniform float spriteDepth;\nuniform float spriteSnap;\n\nuniform vec2 renderOdd;\nuniform float renderScale;\nuniform float renderScaleInv;\nuniform float pixelUnit;\nuniform float focusDepth;\n\nuniform vec4 geometryClip;\nattribute vec4 position4;\nattribute vec2 sprite;\n\nvarying float vPixelSize;\n\n// External\nvec3 getPosition(vec4 xyzw, float canonical);\nvec4 getSprite(vec4 xyzw);\n\nvec3 getSpritePosition() {\n  // Clip points\n  vec4 p = min(geometryClip, position4);\n  float diff = length(position4 - p);\n  if (diff > 0.0) {\n    return vec3(0.0, 0.0, 1000.0);\n  }\n\n  // Make sprites\n  vec3 center = getPosition(p, 1.0);\n  vec4 atlas = getSprite(p);\n\n  // Sprite goes from -1..1, width = 2.\n  // -1..1 -> -0.5..0.5\n  vec2 halfSprite = sprite * .5;\n  vec2 halfFlipSprite = vec2(halfSprite.x, -halfSprite.y);\n\n#ifdef POSITION_UV\n  // Assign UVs\n  vUV = atlas.xy + atlas.zw * (halfFlipSprite + .5);\n#endif\n\n  // Depth blending\n  // TODO: orthographic camera\n  // Workaround: set depth = 0\n  float depth = focusDepth, z;\n  z = -center.z;\n  if (spriteDepth < 1.0) {\n    depth = mix(z, focusDepth, spriteDepth);\n  }\n  \n  // Match device/unit mapping \n  float size = pixelUnit * spriteScale;\n  float depthSize = depth * size;\n\n  // Calculate pixelSize for anti-aliasing\n  float pixelSize = (spriteDepth > 0.0 ? depthSize / z : size);\n  vPixelSize = pixelSize;\n\n  // Position sprite\n  vec2 atlasOdd = fract(atlas.zw / 2.0);\n  vec2 offset = (spriteOffset + halfSprite * atlas.zw) * depthSize;\n  if (spriteSnap > 0.5) {\n    // Snap to pixel (w/ epsilon shift to avoid jitter)\n    return vec3(((floor(center.xy / center.z * renderScale + 0.001) + renderOdd + atlasOdd) * center.z + offset) * renderScaleInv, center.z);\n  }\n  else {\n    // Place directly\n    return center + vec3(offset * renderScaleInv, 0.0);\n  }\n\n}\n`;","export default /* glsl */ `uniform float stereoBend;\nuniform vec4 basisScale;\nuniform vec4 basisOffset;\nuniform mat4 viewMatrix;\nuniform vec2 view4D;\n\nvec4 getStereographic4Position(vec4 position, inout vec4 stpq) {\n  \n  vec4 transformed;\n  if (stereoBend > 0.0001) {\n\n    float r = length(position);\n    float w = r + position.w;\n    vec4 project = vec4(position.xyz / w, r);\n    \n    transformed = mix(position, project, stereoBend);\n  }\n  else {\n    transformed = position;\n  }\n\n  vec4 pos4 = transformed * basisScale - basisOffset;\n  vec3 xyz = (viewMatrix * vec4(pos4.xyz, 1.0)).xyz;\n  return vec4(xyz, pos4.w * view4D.y + view4D.x);\n}\n`;","export default /* glsl */ `uniform float stereoBend;\n\nuniform mat4 viewMatrix;\n\nvec4 getStereoPosition(vec4 position, inout vec4 stpq) {\n  if (stereoBend > 0.0001) {\n\n    vec3 pos = position.xyz;\n    float r = length(pos);\n    float z = r + pos.z;\n    vec3 project = vec3(pos.xy / z, r);\n    \n    vec3 lerped = mix(pos, project, stereoBend);\n\n    return viewMatrix * vec4(lerped, 1.0);\n  }\n  else {\n    return viewMatrix * vec4(position.xyz, 1.0);\n  }\n}`;","export default /* glsl */ `varying vec2 vST;\n\nvec4 getSample(vec2 st);\n\nvec4 getSTSample() {\n  return getSample(vST);\n}\n`;","export default /* glsl */ `varying vec2 vUV;\n\nvoid setRawUV(vec4 xyzw) {\n  vUV = xyzw.xy;\n}\n`;","export default /* glsl */ `uniform vec4 geometryClip;\nattribute vec4 position4;\nattribute vec3 strip;\n\n// External\nvec3 getPosition(vec4 xyzw, float canonical);\n\nvarying vec3 vNormal;\nvarying vec3 vLight;\nvarying vec3 vPosition;\n\nvoid getStripGeometry(vec4 xyzw, vec3 strip, out vec3 pos, out vec3 normal) {\n  vec3 a, b, c;\n\n  a   = getPosition(xyzw, 1.0);\n  b   = getPosition(vec4(xyzw.xyz, strip.x), 0.0);\n  c   = getPosition(vec4(xyzw.xyz, strip.y), 0.0);\n\n  normal = normalize(cross(c - a, b - a)) * strip.z;\n  \n  pos = a;\n}\n\nvec3 getStripPositionNormal() {\n  vec3 center, normal;\n\n  vec4 p = min(geometryClip, position4);\n\n  getStripGeometry(p, strip, center, normal);\n  vNormal   = normal;\n  vLight    = normalize((viewMatrix * vec4(1.0, 2.0, 2.0, 0.0)).xyz);\n  vPosition = -center;\n\n  return center;\n}\n`;","export default /* glsl */ `uniform vec3 styleColor;\nuniform float styleOpacity;\n\nvec4 getStyleColor() {\n  return vec4(styleColor, styleOpacity);\n}\n`;","export default /* glsl */ `uniform float subdivideBevel;\n\n// External\nvec4 sampleData(vec4 xyzw);\n\nvec4 subdivideDepth(vec4 xyzw) {\n  float x = xyzw.z;\n  float i = floor(x);\n  float f = x - i;\n\n  float minf = subdivideBevel * min(f, 1.0 - f);\n  float g = (f > 0.5) ? 1.0 - minf : (f < 0.5) ? minf : 0.5;\n\n  return sampleData(vec4(xyzw.xy, i + g, xyzw.w));\n}\n`;","export default /* glsl */ `uniform float subdivideBevel;\n\n// External\nvec4 sampleData(vec4 xyzw);\n\nvec4 subdivideDepthLerp(vec4 xyzw) {\n  float x = xyzw.z;\n  float i = floor(x);\n  float f = x - i;\n\n  float minf = subdivideBevel * min(f, 1.0 - f);\n  float g = (f > 0.5) ? 1.0 - minf : (f < 0.5) ? minf : 0.5;\n\n  vec4 xyzw1 = vec4(xyzw.xy, i, xyzw.w);\n  vec4 xyzw2 = vec4(xyzw.xy, i + 1.0, xyzw.w);\n  \n  vec4 a = sampleData(xyzw1);\n  vec4 b = sampleData(xyzw2);\n\n  return mix(a, b, g);\n}\n`;","export default /* glsl */ `uniform float subdivideBevel;\n\n// External\nvec4 sampleData(vec4 xyzw);\n\nvec4 subdivideHeight(vec4 xyzw) {\n  float x = xyzw.y;\n  float i = floor(x);\n  float f = x - i;\n\n  float minf = subdivideBevel * min(f, 1.0 - f);\n  float g = (f > 0.5) ? 1.0 - minf : (f < 0.5) ? minf : 0.5;\n\n  return sampleData(vec4(xyzw.x, i + g, xyzw.zw));\n}\n`;","export default /* glsl */ `uniform float subdivideBevel;\n\n// External\nvec4 sampleData(vec4 xyzw);\n\nvec4 subdivideHeightLerp(vec4 xyzw) {\n  float x = xyzw.y;\n  float i = floor(x);\n  float f = x - i;\n\n  float minf = subdivideBevel * min(f, 1.0 - f);\n  float g = (f > 0.5) ? 1.0 - minf : (f < 0.5) ? minf : 0.5;\n\n  vec4 xyzw1 = vec4(xyzw.x, i, xyzw.zw);\n  vec4 xyzw2 = vec4(xyzw.x, i + 1.0, xyzw.zw);\n  \n  vec4 a = sampleData(xyzw1);\n  vec4 b = sampleData(xyzw2);\n\n  return mix(a, b, g);\n}\n`;","export default /* glsl */ `uniform float subdivideBevel;\n\n// External\nvec4 sampleData(vec4 xyzw);\n\nvec4 subdivideItems(vec4 xyzw) {\n  float x = xyzw.w;\n  float i = floor(x);\n  float f = x - i;\n\n  float minf = subdivideBevel * min(f, 1.0 - f);\n  float g = (f > 0.5) ? 1.0 - minf : (f < 0.5) ? minf : 0.5;\n\n  return sampleData(vec4(xyzw.xyz, i + g));\n}\n`;","export default /* glsl */ `uniform float subdivideBevel;\n\n// External\nvec4 sampleData(vec4 xyzw);\n\nvec4 subdivideItemsLerp(vec4 xyzw) {\n  float x = xyzw.w;\n  float i = floor(x);\n  float f = x - i;\n\n  float minf = subdivideBevel * min(f, 1.0 - f);\n  float g = (f > 0.5) ? 1.0 - minf : (f < 0.5) ? minf : 0.5;\n\n  vec4 xyzw1 = vec4(xyzw.xyz, i);\n  vec4 xyzw2 = vec4(xyzw.xyz, i + 1.0);\n  \n  vec4 a = sampleData(xyzw1);\n  vec4 b = sampleData(xyzw2);\n\n  return mix(a, b, g);\n}\n`;","export default /* glsl */ `uniform float subdivideBevel;\n\n// External\nvec4 sampleData(vec4 xyzw);\n\nvec4 subdivideWidth(vec4 xyzw) {\n  float x = xyzw.x;\n  float i = floor(x);\n  float f = x - i;\n\n  float minf = subdivideBevel * min(f, 1.0 - f);\n  float g = (f > 0.5) ? 1.0 - minf : (f < 0.5) ? minf : 0.5;\n\n  return sampleData(vec4(i + g, xyzw.yzw));\n}\n`;","export default /* glsl */ `uniform float subdivideBevel;\n\n// External\nvec4 sampleData(vec4 xyzw);\n\nvec4 subdivideWidthLerp(vec4 xyzw) {\n  float x = xyzw.x;\n  float i = floor(x);\n  float f = x - i;\n\n  float minf = subdivideBevel * min(f, 1.0 - f);\n  float g = (f > 0.5) ? 1.0 - minf : (f < 0.5) ? minf : 0.5;\n\n  vec4 xyzw1 = vec4(i, xyzw.yzw);\n  vec4 xyzw2 = vec4(i + 1.0, xyzw.yzw);\n  \n  vec4 a = sampleData(xyzw1);\n  vec4 b = sampleData(xyzw2);\n\n  return mix(a, b, g);\n}\n`;","export default /* glsl */ `attribute vec4 position4;\n\nfloat getSurfaceHollowMask(vec4 xyzw) {\n  vec4 df = abs(fract(position4) - .5);\n  vec2 df2 = min(df.xy, df.zw);\n  float df3 = min(df2.x, df2.y);\n  return df3;\n}`;","export default /* glsl */ `uniform vec4 geometryClip;\nuniform vec4 geometryResolution;\nuniform vec4 mapSize;\n\nattribute vec4 position4;\n\n// External\nvec3 getPosition(vec4 xyzw, float canonical);\n\nvec3 getSurfacePosition() {\n  vec4 p = min(geometryClip, position4);\n  vec3 xyz = getPosition(p, 1.0);\n\n  // Overwrite UVs\n#ifdef POSITION_UV\n#ifdef POSITION_UV_INT\n  vUV = -.5 + (position4.xy * geometryResolution.xy) * mapSize.xy;\n#else\n  vUV = position4.xy * geometryResolution.xy;\n#endif\n#endif\n\n  return xyz;\n}\n`;","export default /* glsl */ `uniform vec4 mapSize;\nuniform vec4 geometryResolution;\nuniform vec4 geometryClip;\nattribute vec4 position4;\nattribute vec2 surface;\n\n// External\nvec3 getPosition(vec4 xyzw, float canonical);\n\nvoid getSurfaceGeometry(vec4 xyzw, float edgeX, float edgeY, out vec3 left, out vec3 center, out vec3 right, out vec3 up, out vec3 down) {\n  vec4 deltaX = vec4(1.0, 0.0, 0.0, 0.0);\n  vec4 deltaY = vec4(0.0, 1.0, 0.0, 0.0);\n\n  /*\n  // high quality, 5 tap\n  center =                  getPosition(xyzw, 1.0);\n  left   = (edgeX > -0.5) ? getPosition(xyzw - deltaX, 0.0) : center;\n  right  = (edgeX < 0.5)  ? getPosition(xyzw + deltaX, 0.0) : center;\n  down   = (edgeY > -0.5) ? getPosition(xyzw - deltaY, 0.0) : center;\n  up     = (edgeY < 0.5)  ? getPosition(xyzw + deltaY, 0.0) : center;\n  */\n  \n  // low quality, 3 tap\n  center =                  getPosition(xyzw, 1.0);\n  left   =                  center;\n  down   =                  center;\n  right  = (edgeX < 0.5)  ? getPosition(xyzw + deltaX, 0.0) : (2.0 * center - getPosition(xyzw - deltaX, 0.0));\n  up     = (edgeY < 0.5)  ? getPosition(xyzw + deltaY, 0.0) : (2.0 * center - getPosition(xyzw - deltaY, 0.0));\n}\n\nvec3 getSurfaceNormal(vec3 left, vec3 center, vec3 right, vec3 up, vec3 down) {\n  vec3 dx = right - left;\n  vec3 dy = up    - down;\n  vec3 n = cross(dy, dx);\n  if (length(n) > 0.0) {\n    return normalize(n);\n  }\n  return vec3(0.0, 1.0, 0.0);\n}\n\nvarying vec3 vNormal;\nvarying vec3 vLight;\nvarying vec3 vPosition;\n\nvec3 getSurfacePositionNormal() {\n  vec3 left, center, right, up, down;\n\n  vec4 p = min(geometryClip, position4);\n\n  getSurfaceGeometry(p, surface.x, surface.y, left, center, right, up, down);\n  vNormal   = getSurfaceNormal(left, center, right, up, down);\n  vLight    = normalize((viewMatrix * vec4(1.0, 2.0, 2.0, 0.0)).xyz); // hardcoded directional light\n  vPosition = -center;\n\n#ifdef POSITION_UV\n#ifdef POSITION_UV_INT\n  vUV = -.5 + (position4.xy * geometryResolution.xy) * mapSize.xy;\n#else\n  vUV = position4.xy * geometryResolution.xy;\n#endif\n#endif\n  \n  return center;\n}\n`;","export default /* glsl */ `uniform float worldUnit;\nuniform float focusDepth;\nuniform float tickSize;\nuniform float tickEpsilon;\nuniform vec3  tickNormal;\nuniform vec2  tickStrip;\n\nvec4 getSample(vec4 xyzw);\n\nvec3 transformPosition(vec4 position, in vec4 stpqIn, out vec4 stpqOut);\n\nvec3 getTickPosition(vec4 xyzw, in vec4 stpqIn, out vec4 stpqOut) {\n  float epsilon = tickEpsilon;\n\n  // determine tick direction\n  float leftX  = max(tickStrip.x, xyzw.y - 1.0);\n  float rightX = min(tickStrip.y, xyzw.y + 1.0);\n  \n  vec4 left    = getSample(vec4(leftX,  xyzw.zw, 0.0));\n  vec4 right   = getSample(vec4(rightX, xyzw.zw, 0.0));\n  vec4 diff    = right - left;\n\n  vec3 normal  = cross(normalize(diff.xyz + vec3(diff.w)), tickNormal);\n  float bias   = max(0.0, 1.0 - length(normal) * 2.0);\n       normal  = mix(normal, tickNormal.yzx, bias * bias);\n  \n  // transform (point) and (point + delta)\n  vec4 center  = getSample(vec4(xyzw.yzw, 0.0));\n  vec4 delta   = vec4(normal, 0.0) * epsilon;\n\n  vec4 a = center;\n  vec4 b = center + delta;\n\n  vec4 _;\n  vec3 c = transformPosition(a, stpqIn, stpqOut);\n  vec3 d = transformPosition(b, stpqIn, _);\n  \n  // sample on either side to create line\n  float line = xyzw.x - .5;\n  vec3  mid  = c;\n  vec3  side = normalize(d - c);\n\n  return mid + side * line * tickSize * worldUnit * focusDepth;\n}\n`;","export default /* glsl */ `uniform mat4 transformMatrix;\n\nvec4 transformPosition(vec4 position, inout vec4 stpq) {\n  return transformMatrix * vec4(position.xyz, 1.0);\n}\n`;","export default /* glsl */ `uniform mat4 transformMatrix;\nuniform vec4 transformOffset;\n\nvec4 transformPosition(vec4 position, inout vec4 stpq) {\n  return transformMatrix * position + transformOffset;\n}\n`;","export default /* glsl */ `// Implicit three.js uniform\n// uniform mat4 viewMatrix;\n\nvec4 getViewPosition(vec4 position, inout vec4 stpq) {\n  return (viewMatrix * vec4(position.xyz, 1.0));\n}\n`;","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n/*\n  Graph of nodes with outlets\n*/\nexport class Graph {\n  static initClass() {\n    this.index = 0;\n\n    this.IN = 0;\n    this.OUT = 1;\n  }\n  // eslint-disable-next-line no-unused-vars\n  static id(name) {\n    return ++Graph.index;\n  }\n\n  constructor(nodes, parent = null) {\n    this.parent = parent;\n    this.id = Graph.id();\n    this.nodes = [];\n    nodes && this.add(nodes);\n  }\n\n  inputs() {\n    const inputs = [];\n    for (const node of Array.from(this.nodes)) {\n      for (const outlet of Array.from(node.inputs)) {\n        if (outlet.input === null) {\n          inputs.push(outlet);\n        }\n      }\n    }\n    return inputs;\n  }\n\n  outputs() {\n    const outputs = [];\n    for (const node of Array.from(this.nodes)) {\n      for (const outlet of Array.from(node.outputs)) {\n        if (outlet.output.length === 0) {\n          outputs.push(outlet);\n        }\n      }\n    }\n    return outputs;\n  }\n\n  getIn(name) {\n    return Array.from(this.inputs()).filter(\n      (outlet) => outlet.name === name\n    )[0];\n  }\n  getOut(name) {\n    return Array.from(this.outputs()).filter(\n      (outlet) => outlet.name === name\n    )[0];\n  }\n\n  add(node, ignore) {\n    if (node.length) {\n      for (const _node of Array.from(node)) {\n        this.add(_node);\n      }\n      return;\n    }\n\n    if (node.graph && !ignore) {\n      throw new Error(\"Adding node to two graphs at once\");\n    }\n\n    node.graph = this;\n    this.nodes.push(node);\n  }\n\n  remove(node, ignore) {\n    if (node.length) {\n      for (const _node of Array.from(node)) {\n        this.remove(_node);\n      }\n      return;\n    }\n\n    if (node.graph !== this) {\n      throw new Error(\"Removing node from wrong graph.\");\n    }\n\n    ignore || node.disconnect();\n\n    this.nodes.splice(this.nodes.indexOf(node), 1);\n    node.graph = null;\n  }\n\n  adopt(node) {\n    if (node.length) {\n      for (const _node of Array.from(node)) {\n        this.adopt(_node);\n      }\n      return;\n    }\n\n    node.graph.remove(node, true);\n    this.add(node, true);\n  }\n}\nGraph.initClass();\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Graph } from \"./graph\";\n\n/*\n  In/out outlet on node\n*/\nexport class Outlet {\n  static initClass() {\n    this.index = 0;\n  }\n  static make(outlet, extra) {\n    if (extra == null) {\n      extra = {};\n    }\n    const meta = extra;\n    if (outlet.meta != null) {\n      for (const key in outlet.meta) {\n        const value = outlet.meta[key];\n        meta[key] = value;\n      }\n    }\n    return new Outlet(\n      outlet.inout,\n      outlet.name,\n      outlet.hint,\n      outlet.type,\n      meta\n    );\n  }\n  static id(name) {\n    return `_io_${++Outlet.index}_${name}`;\n  }\n\n  static hint(name) {\n    name = name.replace(/^_io_[0-9]+_/, \"\");\n    name = name.replace(/_i_o$/, \"\");\n    return (name = name.replace(/(In|Out|Inout|InOut)$/, \"\"));\n  }\n\n  constructor(inout, name, hint, type, meta, id) {\n    this.inout = inout;\n    this.name = name;\n    this.hint = hint;\n    this.type = type;\n    if (meta == null) {\n      meta = {};\n    }\n    this.meta = meta;\n    this.id = id;\n    if (this.hint == null) {\n      this.hint = Outlet.hint(this.name);\n    }\n\n    this.node = null;\n    this.input = null;\n    this.output = [];\n    if (this.id == null) {\n      this.id = Outlet.id(this.hint);\n    }\n  }\n\n  // Change into given outlet without touching connections\n  morph(outlet) {\n    this.inout = outlet.inout;\n    this.name = outlet.name;\n    this.hint = outlet.hint;\n    this.type = outlet.type;\n    return (this.meta = outlet.meta);\n  }\n\n  // Copy with unique name and cloned metadata\n  dupe(name) {\n    if (name == null) {\n      name = this.id;\n    }\n    const outlet = Outlet.make(this);\n    outlet.name = name;\n    return outlet;\n  }\n\n  // Connect to given outlet\n  connect(outlet) {\n    // Auto-reverse in/out to out/in\n    if (this.inout === Graph.IN && outlet.inout === Graph.OUT) {\n      return outlet.connect(this);\n    }\n\n    // Disallow bad combinations\n    if (this.inout !== Graph.OUT || outlet.inout !== Graph.IN) {\n      throw new Error(\"Can only connect out to in.\");\n    }\n\n    // Check for existing connection\n    if (outlet.input === this) {\n      return;\n    }\n\n    // Disconnect existing connections\n    outlet.disconnect();\n\n    // Add new connection.\n    outlet.input = this;\n    return this.output.push(outlet);\n  }\n\n  // Disconnect given outlet (or all)\n  disconnect(outlet) {\n    // Disconnect input from the other side.\n    if (this.input) {\n      this.input.disconnect(this);\n    }\n\n    if (this.output.length) {\n      if (outlet) {\n        // Remove one outgoing connection.\n        const index = this.output.indexOf(outlet);\n        if (index >= 0) {\n          this.output.splice(index, 1);\n          return (outlet.input = null);\n        }\n      } else {\n        // Remove all outgoing connections.\n        for (outlet of Array.from(this.output)) {\n          outlet.input = null;\n        }\n        return (this.output = []);\n      }\n    }\n  }\n}\nOutlet.initClass();\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Graph } from \"./graph\";\nimport { Outlet } from \"./outlet\";\n\n/*\n Node in graph.\n*/\nexport class Node {\n  static initClass() {\n    this.index = 0;\n  }\n  static id(_name) {\n    return ++Node.index;\n  }\n\n  constructor(owner, outlets) {\n    this.owner = owner;\n    this.graph = null;\n    this.inputs = [];\n    this.outputs = [];\n    this.all = [];\n    this.outlets = null;\n    this.id = Node.id();\n\n    this.setOutlets(outlets);\n  }\n\n  // Retrieve input\n  getIn(name) {\n    return Array.from(this.inputs).filter((outlet) => outlet.name === name)[0];\n  }\n\n  // Retrieve output\n  getOut(name) {\n    return Array.from(this.outputs).filter((outlet) => outlet.name === name)[0];\n  }\n\n  // Retrieve by name\n  get(name) {\n    return this.getIn(name) || this.getOut(name);\n  }\n\n  // Set new outlet definition\n  setOutlets(outlets) {\n    if (outlets != null) {\n      // First init\n      let outlet;\n      if (this.outlets == null) {\n        this.outlets = {};\n        for (outlet of Array.from(outlets)) {\n          if (!(outlet instanceof Outlet)) {\n            outlet = Outlet.make(outlet);\n          }\n          this._add(outlet);\n        }\n        return;\n      }\n\n      // Return new/old outlet matching hash key\n      const hash = (\n        outlet // Match by name, direction and type.\n      ) => [outlet.name, outlet.inout, outlet.type].join(\"-\");\n\n      // Build hash of new outlets\n      const match = {};\n      for (outlet of Array.from(outlets)) {\n        match[hash(outlet)] = true;\n      }\n\n      // Remove missing outlets, record matches\n      for (let key in this.outlets) {\n        outlet = this.outlets[key];\n        key = hash(outlet);\n        if (match[key]) {\n          match[key] = outlet;\n        } else {\n          this._remove(outlet);\n        }\n      }\n\n      // Insert new outlets\n      for (outlet of Array.from(outlets)) {\n        // Find match by hash\n        const existing = match[hash(outlet)];\n        if (existing instanceof Outlet) {\n          // Update existing outlets in place to retain connections.\n          this._morph(existing, outlet);\n        } else {\n          // Spawn new outlet\n          if (!(outlet instanceof Outlet)) {\n            outlet = Outlet.make(outlet);\n          }\n          this._add(outlet);\n        }\n      }\n\n      this;\n    }\n    return this.outlets;\n  }\n\n  // Connect to the target node by matching up inputs and outputs.\n  connect(node, empty, force) {\n    let dest, dests, hint, source, type;\n    const outlets = {};\n    const hints = {};\n\n    const typeHint = (outlet) => type + \"/\" + outlet.hint;\n\n    // Hash the types/hints of available target outlets.\n    for (dest of Array.from(node.inputs)) {\n      // Only autoconnect if not already connected\n      let list;\n      if (!force && dest.input) {\n        continue;\n      }\n\n      // Match outlets by type/name hint, then type/position key\n      ({ type } = dest);\n      hint = typeHint(dest);\n\n      if (!hints[hint]) {\n        hints[hint] = dest;\n      }\n      outlets[type] = list = outlets[type] || [];\n      list.push(dest);\n    }\n\n    // Available source outlets\n    let sources = this.outputs;\n\n    // Ignore connected source if only matching empties.\n    sources = sources.filter((outlet) => !(empty && outlet.output.length));\n\n    // Match hints first\n    for (source of Array.from(sources.slice())) {\n      // Match outlets by type and name\n      ({ type } = source);\n      hint = typeHint(source);\n      dests = outlets[type];\n\n      // Connect if found\n      if ((dest = hints[hint])) {\n        source.connect(dest);\n\n        // Remove from potential set\n        delete hints[hint];\n        dests.splice(dests.indexOf(dest), 1);\n        sources.splice(sources.indexOf(source), 1);\n      }\n    }\n\n    // Match what's left\n    if (!sources.length) {\n      return this;\n    }\n    for (source of Array.from(sources.slice())) {\n      ({ type } = source);\n      dests = outlets[type];\n\n      // Match outlets by type and order\n      if (dests && dests.length) {\n        // Link up and remove from potential set\n        source.connect(dests.shift());\n      }\n    }\n\n    return this;\n  }\n\n  // Disconnect entire node\n  disconnect(_node) {\n    let outlet;\n    for (outlet of Array.from(this.inputs)) {\n      outlet.disconnect();\n    }\n    for (outlet of Array.from(this.outputs)) {\n      outlet.disconnect();\n    }\n\n    return this;\n  }\n\n  // Return hash key for outlet\n  _key(outlet) {\n    return [outlet.name, outlet.inout].join(\"-\");\n  }\n\n  // Add outlet object to node\n  _add(outlet) {\n    const key = this._key(outlet);\n\n    // Sanity checks\n    if (outlet.node) {\n      throw new Error(\"Adding outlet to two nodes at once.\");\n    }\n    if (this.outlets[key]) {\n      throw new Error(`Adding two identical outlets to same node. (${key})`);\n    }\n\n    // Link back outlet\n    outlet.node = this;\n\n    // Add to name hash and inout list\n    if (outlet.inout === Graph.IN) {\n      this.inputs.push(outlet);\n    }\n    if (outlet.inout === Graph.OUT) {\n      this.outputs.push(outlet);\n    }\n    this.all.push(outlet);\n    return (this.outlets[key] = outlet);\n  }\n\n  // Morph outlet to other\n  _morph(existing, outlet) {\n    let key = this._key(outlet);\n    delete this.outlets[key];\n\n    existing.morph(outlet);\n\n    key = this._key(outlet);\n    return (this.outlets[key] = outlet);\n  }\n\n  // Remove outlet object from node.\n  _remove(outlet) {\n    const key = this._key(outlet);\n\n    // Sanity checks\n    if (outlet.node !== this) {\n      throw new Error(\"Removing outlet from wrong node.\");\n    }\n\n    // Disconnect outlet.\n    outlet.disconnect();\n\n    // Unlink outlet.\n    outlet.node = null;\n\n    // Remove from name list and inout list.\n    delete this.outlets[key];\n    if (outlet.inout === Graph.IN) {\n      this.inputs.splice(this.inputs.indexOf(outlet), 1);\n    }\n    if (outlet.inout === Graph.OUT) {\n      this.outputs.splice(this.outputs.indexOf(outlet), 1);\n    }\n    this.all.splice(this.all.indexOf(outlet), 1);\n    return this;\n  }\n}\nNode.initClass();\n","import { Graph } from \"./graph\";\nexport const { IN, OUT } = Graph;\n\nexport * from \"./graph\";\nexport * from \"./node\";\nexport * from \"./outlet\";\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nexport class Snippet {\n  static initClass() {\n    this.index = 0;\n  }\n  static namespace() {\n    return `_sn_${++Snippet.index}_`;\n  }\n\n  static load(language, name, code) {\n    const program = language.parse(name, code);\n    const [sigs, compiler] = Array.from(language.compile(program));\n    return new Snippet(language, sigs, compiler, name, code);\n  }\n\n  constructor(language, _signatures, _compiler, _name, _original) {\n    this.language = language;\n    this._signatures = _signatures;\n    this._compiler = _compiler;\n    this._name = _name;\n    this._original = _original;\n    this.namespace = null;\n    this.code = null;\n\n    this.main = null;\n    this.entry = null;\n\n    this.uniforms = null;\n    this.externals = null;\n    this.symbols = null;\n    this.attributes = null;\n    this.varyings = null;\n\n    // Tidy up object for export\n    if (!this.language) {\n      delete this.language;\n    }\n    if (!this._signatures) {\n      delete this._signatures;\n    }\n    if (!this._compiler) {\n      delete this._compiler;\n    }\n    if (!this._original) {\n      delete this._original;\n    }\n\n    // Insert snippet name if not provided\n    if (!this._name) {\n      this._name =\n        this._signatures != null ? this._signatures.main.name : undefined;\n    }\n  }\n\n  clone() {\n    return new Snippet(\n      this.language,\n      this._signatures,\n      this._compiler,\n      this._name,\n      this._original\n    );\n  }\n\n  bind(config, uniforms, namespace, defines) {\n    // Alt syntax (namespace, uniforms, defines)\n    let def, left;\n    let v;\n    if (uniforms === \"\" + uniforms) {\n      [namespace, uniforms, defines] = Array.from([\n        uniforms,\n        namespace != null ? namespace : {},\n        defines != null ? defines : {},\n      ]);\n      // Alt syntax (uniforms, defines)\n    } else if (namespace !== \"\" + namespace) {\n      [defines, namespace] = Array.from([\n        namespace != null ? namespace : {},\n        undefined,\n      ]);\n    }\n\n    // Prepare data structure\n    this.main = this._signatures.main;\n    this.namespace =\n      (left = namespace != null ? namespace : this.namespace) != null\n        ? left\n        : Snippet.namespace();\n    this.entry = this.namespace + this.main.name;\n\n    this.uniforms = {};\n    this.varyings = {};\n    this.attributes = {};\n    this.externals = {};\n    this.symbols = [];\n    const exist = {};\n    const exceptions = {};\n\n    // Handle globals and locals for prefixing\n    const global = function (name) {\n      exceptions[name] = true;\n      return name;\n    };\n    const local = (name) => {\n      return this.namespace + name;\n    };\n\n    // Apply config\n    if (config.globals) {\n      for (const key of Array.from(config.globals)) {\n        global(key);\n      }\n    }\n    const _u = config.globalUniforms ? global : local;\n    const _v = config.globalVaryings ? global : local;\n    const _a = config.globalAttributes ? global : local;\n    const _e = local;\n\n    // Build finalized properties\n    const x = (def) => {\n      return (exist[def.name] = true);\n    };\n    const u = (def, name) => {\n      return (this.uniforms[_u(name != null ? name : def.name)] = def);\n    };\n    v = (def) => {\n      return (this.varyings[_v(def.name)] = def);\n    };\n    const a = (def) => {\n      return (this.attributes[_a(def.name)] = def);\n    };\n    const e = (def) => {\n      const name = _e(def.name);\n      this.externals[name] = def;\n      return this.symbols.push(name);\n    };\n\n    const redef = (def) => ({\n      type: def.type,\n      name: def.name,\n      value: def.value,\n    });\n\n    for (def of Array.from(this._signatures.uniform)) {\n      x(def);\n    }\n    for (def of Array.from(this._signatures.uniform)) {\n      u(redef(def));\n    }\n    for (def of Array.from(this._signatures.varying)) {\n      v(redef(def));\n    }\n    for (def of Array.from(this._signatures.external)) {\n      e(def);\n    }\n    for (def of Array.from(this._signatures.attribute)) {\n      a(redef(def));\n    }\n    for (const name in uniforms) {\n      def = uniforms[name];\n      if (exist[name]) {\n        u(def, name);\n      }\n    }\n\n    this.body = this.code = this._compiler(this.namespace, exceptions, defines);\n\n    // Adds defs to original snippet for inspection\n    if (defines) {\n      const defs = (() => {\n        const result = [];\n        for (const k in defines) {\n          v = defines[k];\n          result.push(`#define ${k} ${v}`);\n        }\n        return result;\n      })().join(\"\\n\");\n      if (defs.length) {\n        this._original = [\n          defs,\n          \"//----------------------------------------\",\n          this._original,\n        ].join(\"\\n\");\n      }\n    }\n\n    return null;\n  }\n}\nSnippet.initClass();\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport * as Graph from \"../graph\";\nimport * as Priority from \"./priority\";\n\n/*\n  Program assembler\n\n  Builds composite program that can act as new module/snippet\n  Unconnected input/outputs and undefined callbacks are exposed in the new global/main scope\n  If there is only one call with an identical call signature, a #define is output instead.\n*/\nexport const assemble = function (language, namespace, calls, requires) {\n  const generate = language;\n\n  const externals = {};\n  const symbols = [];\n  const uniforms = {};\n  const varyings = {};\n  const attributes = {};\n  const library = {};\n\n  const process = function () {\n    let body;\n    let ns;\n    for (ns in requires) {\n      const r = requires[ns];\n      required(r.node, r.module);\n    }\n\n    [body, calls] = Array.from(handle(calls));\n    if (namespace != null) {\n      body.entry = namespace;\n    }\n    const main = generate.build(body, calls);\n\n    const sorted = (() => {\n      const result = [];\n      for (ns in library) {\n        const lib = library[ns];\n        result.push(lib);\n      }\n      return result;\n    })().sort((a, b) => Priority.compare(a.priority, b.priority));\n    const includes = sorted.map((x) => x.code);\n    includes.push(main.code);\n    const code = generate.lines(includes);\n\n    // Build new virtual snippet\n    return {\n      namespace: main.name,\n      library, // Included library functions\n      body: main.code, // Snippet body\n      code, // Complete snippet (tests/debug)\n      main, // Function signature\n      entry: main.name, // Entry point name\n      symbols,\n      externals,\n      uniforms,\n      varyings,\n      attributes,\n    };\n  };\n\n  // Sort and process calls\n  const handle = (calls) => {\n    let c;\n    calls = (() => {\n      const result = [];\n      for (const ns in calls) {\n        c = calls[ns];\n        result.push(c);\n      }\n      return result;\n    })();\n    calls.sort((a, b) => b.priority - a.priority);\n\n    // Call module in DAG chain\n    const call = (node, module, priority) => {\n      include(node, module, priority);\n      const { main } = module;\n      const { entry } = module;\n\n      const _lookup = (name) => lookup(node, name);\n      const _dangling = (name) => isDangling(node, name);\n      return generate.call(_lookup, _dangling, entry, main.signature, body);\n    };\n\n    const body = generate.body();\n    for (c of Array.from(calls)) {\n      call(c.node, c.module, c.priority);\n    }\n\n    return [body, calls];\n  };\n\n  // Adopt given code as a library at given priority\n  const adopt = function (namespace, code, priority) {\n    const record = library[namespace];\n    if (record != null) {\n      return (record.priority = Priority.max(record.priority, priority));\n    } else {\n      return (library[namespace] = { code, priority });\n    }\n  };\n\n  // Include snippet for a call\n  const include = function (node, module, priority) {\n    let def, key;\n    priority = Priority.make(priority);\n\n    // Adopt snippet's libraries\n    for (const ns in module.library) {\n      const lib = module.library[ns];\n      adopt(ns, lib.code, Priority.nest(priority, lib.priority));\n    }\n\n    // Adopt snippet body as library\n    adopt(module.namespace, module.body, priority);\n\n    // Adopt GL vars\n    for (key in module.uniforms) {\n      def = module.uniforms[key];\n      uniforms[key] = def;\n    }\n    for (key in module.varyings) {\n      def = module.varyings[key];\n      varyings[key] = def;\n    }\n    for (key in module.attributes) {\n      def = module.attributes[key];\n      attributes[key] = def;\n    }\n\n    return required(node, module);\n  };\n\n  const required = (\n    node,\n    module // Adopt external symbols\n  ) =>\n    (() => {\n      const result = [];\n      for (const key of Array.from(module.symbols)) {\n        const ext = module.externals[key];\n        if (isDangling(node, ext.name)) {\n          const copy = {};\n          for (const k in ext) {\n            const v = ext[k];\n            copy[k] = v;\n          }\n          copy.name = lookup(node, ext.name);\n          externals[key] = copy;\n          result.push(symbols.push(key));\n        } else {\n          result.push(undefined);\n        }\n      }\n      return result;\n    })();\n\n  // Check for dangling input/output\n  const isDangling = function (node, name) {\n    const outlet = node.get(name);\n\n    if (outlet.inout === Graph.IN) {\n      return outlet.input === null;\n    } else if (outlet.inout === Graph.OUT) {\n      return outlet.output.length === 0;\n    }\n  };\n\n  // Look up unique name for outlet\n  const lookup = function (node, name) {\n    // Traverse graph edge\n    let outlet = node.get(name);\n    if (!outlet) {\n      return null;\n    }\n\n    if (outlet.input) {\n      outlet = outlet.input;\n    }\n    ({ name } = outlet);\n\n    return outlet.id;\n  };\n\n  return process();\n};\n","/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Snippet } from \"./snippet\";\nimport { assemble } from \"./assemble\";\n\n/*\n  Program assembly model\n\n  Snippets are added to its queue, registering calls and code includes.\n  Calls are de-duped and scheduled at the earliest point required for correct data flow.\n\n  When assemble() is called, it builds a main() function to\n  execute all calls in final order.\n\n  The result is a new instance of Snippet that acts as if it\n  was parsed from the combined source of the component\n  nodes.\n*/\nexport class Program {\n  static initClass() {\n    this.index = 0;\n  }\n  static entry() {\n    return `_pg_${++Program.index}_`;\n  }\n\n  // Program starts out empty, ready to compile starting from a particular block\n  constructor(language, namespace, graph) {\n    this.language = language;\n    this.namespace = namespace;\n    this.graph = graph;\n    this.calls = {};\n    this.requires = {};\n  }\n\n  // Call a given module at certain priority\n  call(node, module, priority) {\n    let exists;\n    const ns = module.namespace;\n\n    // Merge all calls down into one with the right priority\n    if ((exists = this.calls[ns])) {\n      exists.priority = Math.max(exists.priority, priority);\n    } else {\n      this.calls[ns] = { node, module, priority };\n    }\n\n    return this;\n  }\n\n  // Require a given (callback) module's externals\n  require(node, module) {\n    const ns = module.namespace;\n    return (this.requires[ns] = { node, module });\n  }\n\n  // Compile queued ops into result\n  assemble() {\n    const data = assemble(\n      this.language,\n      this.namespace != null ? this.namespace : Program.entry,\n      this.calls,\n      this.requires\n    );\n    const snippet = new Snippet();\n    for (const key in data) {\n      snippet[key] = data[key];\n    }\n    snippet.graph = this.graph;\n    return snippet;\n  }\n}\nProgram.initClass();\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport * as Graph from \"../graph\";\nimport * as Priority from \"./priority\";\n\n/*\n Callback linker\n\n Imports given modules and generates linkages for registered callbacks.\n\n Builds composite program with single module as exported entry point\n*/\n\nexport const link = function (language, links, modules, exported) {\n  const generate = language;\n  let includes = [];\n\n  const symbols = [];\n  const externals = {};\n  const uniforms = {};\n  const attributes = {};\n  const varyings = {};\n  const library = {};\n\n  const process = function () {\n    const exports = generate.links(links);\n\n    const header = [];\n    if (exports.defs != null) {\n      header.push(exports.defs);\n    }\n    if (exports.bodies != null) {\n      header.push(exports.bodies);\n    }\n\n    for (const m of Array.from(modules)) {\n      include(m.node, m.module, m.priority);\n    }\n    const sorted = (() => {\n      const result = [];\n      for (const ns in library) {\n        const lib = library[ns];\n        result.push(lib);\n      }\n      return result;\n    })().sort((a, b) => Priority.compare(a.priority, b.priority));\n    includes = sorted.map((x) => x.code);\n\n    let code = generate.lines(includes);\n    code = generate.defuse(code);\n    if (header.length) {\n      code = [generate.lines(header), code].join(\"\\n\");\n    }\n    code = generate.hoist(code);\n    code = generate.dedupe(code);\n\n    // Export module's externals\n    const e = exported;\n    return {\n      namespace: e.main.name,\n      code, // Complete snippet (tests/debug)\n      main: e.main, // Function signature\n      entry: e.main.name, // Entry point name\n      externals,\n      uniforms,\n      attributes,\n      varyings,\n    };\n  };\n\n  // Adopt given code as a library at given priority\n  const adopt = function (namespace, code, priority) {\n    const record = library[namespace];\n    if (record != null) {\n      return (record.priority = Priority.max(record.priority, priority));\n    } else {\n      return (library[namespace] = { code, priority });\n    }\n  };\n\n  // Include piece of code\n  const include = function (node, module, priority) {\n    let def, key;\n    priority = Priority.make(priority);\n\n    // Adopt snippet's libraries\n    for (const ns in module.library) {\n      const lib = module.library[ns];\n      adopt(ns, lib.code, Priority.nest(priority, lib.priority));\n    }\n\n    // Adopt snippet body as library\n    adopt(module.namespace, module.body, priority);\n\n    // Adopt externals\n    for (key in module.uniforms) {\n      def = module.uniforms[key];\n      uniforms[key] = def;\n    }\n    for (key in module.varyings) {\n      def = module.varyings[key];\n      varyings[key] = def;\n    }\n    for (key in module.attributes) {\n      def = module.attributes[key];\n      attributes[key] = def;\n    }\n\n    return (() => {\n      const result = [];\n      for (key of Array.from(module.symbols)) {\n        const ext = module.externals[key];\n        if (isDangling(node, ext.name)) {\n          externals[key] = ext;\n          result.push(symbols.push(key));\n        } else {\n          result.push(undefined);\n        }\n      }\n      return result;\n    })();\n  };\n\n  // Check for dangling input/output\n  const isDangling = function (node, name) {\n    const outlet = node.get(name);\n\n    if (!outlet) {\n      const module =\n        (node.owner.snippet != null ? node.owner.snippet._name : undefined) !=\n        null\n          ? node.owner.snippet != null\n            ? node.owner.snippet._name\n            : undefined\n          : node.owner.namespace;\n      throw new Error(\n        `Unable to link program. Unlinked callback \\`${name}\\` on \\`${module}\\``\n      );\n    }\n\n    if (outlet.inout === Graph.IN) {\n      return outlet.input === null;\n    } else if (outlet.inout === Graph.OUT) {\n      return outlet.output.length === 0;\n    }\n  };\n\n  return process();\n};\n","/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Snippet } from \"./snippet\";\nimport { link } from \"./link\";\n\nconst debug = false;\n\n/*\n  Program linkage layout\n\n  Entry points are added to its dependency graph\n  Callbacks are linked either with a go-between function\n  or a #define if the signatures are identical.\n*/\nexport class Layout {\n  constructor(language, graph) {\n    this.language = language;\n    this.graph = graph;\n    this.links = [];\n    this.includes = [];\n    this.modules = {};\n    this.visits = {};\n  }\n\n  // Link up a given named external to this module's entry point\n  callback(node, module, priority, name, external) {\n    return this.links.push({ node, module, priority, name, external });\n  }\n\n  // Include this module of code\n  include(node, module, priority) {\n    let m;\n    if ((m = this.modules[module.namespace]) != null) {\n      return (m.priority = Math.max(priority, m.priority));\n    } else {\n      this.modules[module.namespace] = true;\n      return this.includes.push({ node, module, priority });\n    }\n  }\n\n  // Visit each namespace at most once to avoid infinite recursion\n  visit(namespace) {\n    debug && console.log(\"Visit\", namespace, !this.visits[namespace]);\n    if (this.visits[namespace]) {\n      return false;\n    }\n    return (this.visits[namespace] = true);\n  }\n\n  // Compile queued ops into result\n  link(module) {\n    const data = link(this.language, this.links, this.includes, module);\n    const snippet = new Snippet();\n    for (const key in data) {\n      snippet[key] = data[key];\n    }\n    snippet.graph = this.graph;\n    return snippet;\n  }\n}\n","import { Snippet } from \"./snippet\";\n\nexport const { load } = Snippet;\n\nexport * from \"./snippet\";\nexport * from \"./program\";\nexport * from \"./layout\";\nexport * from \"./assemble\";\nexport * from \"./link\";\nexport * from \"./priority\";\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining\n * DS104: Avoid inline assignments\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as Graph from \"../graph\";\nimport { Program, Layout } from \"../linker\";\n\nconst debug = false;\n\nexport class Block {\n  static previous(outlet) {\n    return outlet.input != null ? outlet.input.node.owner : undefined;\n  }\n\n  constructor(delay) {\n    // Subclasses can pass `delay` to allow them to initialize before they call\n    // `@construct`.\n    if (delay == null) {\n      delay = false;\n    }\n    if (!delay) {\n      this.construct();\n    }\n  }\n\n  construct() {\n    let left;\n    if (this.namespace == null) {\n      this.namespace = Program.entry();\n    }\n    return (this.node = new Graph.Node(\n      this,\n      (left =\n        typeof this.makeOutlets === \"function\"\n          ? this.makeOutlets()\n          : undefined) != null\n        ? left\n        : {}\n    ));\n  }\n\n  refresh() {\n    let left;\n    return this.node.setOutlets(\n      (left =\n        typeof this.makeOutlets === \"function\"\n          ? this.makeOutlets()\n          : undefined) != null\n        ? left\n        : {}\n    );\n  }\n\n  clone() {\n    return new Block();\n  }\n\n  // Compile a new program starting from this block\n  compile(language, namespace) {\n    const program = new Program(\n      language,\n      namespace != null ? namespace : Program.entry(),\n      this.node.graph\n    );\n    this.call(program, 0);\n    return program.assemble();\n  }\n\n  // Link up programs into a layout, starting from this block\n  link(language, namespace) {\n    const module = this.compile(language, namespace);\n\n    const layout = new Layout(language, this.node.graph);\n    this._include(module, layout, 0);\n    this.export(layout, 0);\n    return layout.link(module);\n  }\n\n  // Subclassed methods\n  call(_program, _depth) {}\n  callback(_layout, _depth, _name, _external, _outlet) {}\n  export(_layout, _depth) {}\n\n  // Info string for debugging\n  _info(suffix) {\n    let string =\n      (this.node.owner.snippet != null\n        ? this.node.owner.snippet._name\n        : undefined) != null\n        ? this.node.owner.snippet != null\n          ? this.node.owner.snippet._name\n          : undefined\n        : this.node.owner.namespace;\n    if (suffix != null) {\n      return (string += \".\" + suffix);\n    }\n  }\n\n  // Create an outlet for a signature definition\n  _outlet(def, props) {\n    const outlet = Graph.Outlet.make(def, props);\n    outlet.meta.def = def;\n    return outlet;\n  }\n\n  // Make a call to this module in the given program\n  _call(module, program, depth) {\n    return program.call(this.node, module, depth);\n  }\n\n  // Require this module's dependencies in the given program\n  _require(module, program) {\n    return program.require(this.node, module);\n  }\n\n  // Make a call to all connected inputs\n  _inputs(module, program, depth) {\n    return (() => {\n      const result = [];\n      for (const arg of Array.from(module.main.signature)) {\n        const outlet = this.node.get(arg.name);\n        result.push(\n          __guard__(Block.previous(outlet), (x) => x.call(program, depth + 1))\n        );\n      }\n      return result;\n    })();\n  }\n\n  // Insert callback to this module in the given layout\n  _callback(module, layout, depth, name, external, outlet) {\n    return layout.callback(this.node, module, depth, name, external, outlet);\n  }\n\n  // Include this module in the given layout\n  _include(module, layout, depth) {\n    return layout.include(this.node, module, depth);\n  }\n\n  // Link this module's connected callbacks\n  _link(module, layout, depth) {\n    debug && console.log(\"block::_link\", this.toString(), module.namespace);\n    return (() => {\n      const result = [];\n      for (const key of Array.from(module.symbols)) {\n        const ext = module.externals[key];\n        let outlet = this.node.get(ext.name);\n        if (!outlet) {\n          throw new OutletError(\n            `External not found on ${this._info(ext.name)}`\n          );\n        }\n\n        if (outlet.meta.child != null) {\n          continue;\n        }\n\n        let parent = outlet;\n\n        // eslint-disable-next-line prefer-const\n        let block;\n        while (!block && parent) {\n          [parent, outlet] = Array.from([outlet.meta.parent, parent]);\n        }\n\n        block = Block.previous(outlet);\n        if (!block) {\n          throw new OutletError(\n            `Missing connection on ${this._info(ext.name)}`\n          );\n        }\n\n        debug && console.log(\"callback -> \", this.toString(), ext.name, outlet);\n        block.callback(layout, depth + 1, key, ext, outlet.input);\n        result.push(\n          block != null ? block.export(layout, depth + 1) : undefined\n        );\n      }\n      return result;\n    })();\n  }\n\n  // Trace backwards to discover callbacks further up\n  _trace(module, layout, depth) {\n    debug && console.log(\"block::_trace\", this.toString(), module.namespace);\n    return (() => {\n      const result = [];\n      for (const arg of Array.from(module.main.signature)) {\n        const outlet = this.node.get(arg.name);\n        result.push(\n          __guard__(Block.previous(outlet), (x) => x.export(layout, depth + 1))\n        );\n      }\n      return result;\n    })();\n  }\n}\n\nconst OutletError = function (message) {\n  const e = new Error(message);\n  e.name = \"OutletError\";\n  return e;\n};\n\nOutletError.prototype = new Error();\n\nfunction __guard__(value, transform) {\n  return typeof value !== \"undefined\" && value !== null\n    ? transform(value)\n    : undefined;\n}\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Block } from \"./block\";\n\nexport class Call extends Block {\n  constructor(snippet) {\n    super(true);\n\n    this.snippet = snippet;\n    this.namespace = snippet.namespace;\n    this.construct();\n  }\n\n  clone() {\n    return new Call(this.snippet);\n  }\n\n  makeOutlets() {\n    const main = this.snippet.main.signature;\n    const { externals } = this.snippet;\n    const { symbols } = this.snippet;\n\n    const params = Array.from(main).map((outlet) =>\n      this._outlet(outlet, { callback: false })\n    );\n    const callbacks = Array.from(symbols).map((key) =>\n      this._outlet(externals[key], { callback: true })\n    );\n\n    return params.concat(callbacks);\n  }\n\n  call(program, depth) {\n    this._call(this.snippet, program, depth);\n    return this._inputs(this.snippet, program, depth);\n  }\n\n  export(layout, depth) {\n    if (!layout.visit(this.namespace, depth)) {\n      return;\n    }\n\n    this._link(this.snippet, layout, depth);\n    return this._trace(this.snippet, layout, depth);\n  }\n}\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Graph } from \"../graph\";\nimport { Block } from \"./block\";\n\n/*\n  Re-use a subgraph as a callback\n*/\nexport class Callback extends Block {\n  constructor(graph) {\n    super(true);\n    this.graph = graph;\n    this.construct();\n  }\n\n  refresh() {\n    super.refresh();\n    return delete this.subroutine;\n  }\n\n  clone() {\n    return new Callback(this.graph);\n  }\n\n  makeOutlets() {\n    let outlet;\n    this.make();\n\n    const outlets = [];\n    let ins = [];\n    let outs = [];\n\n    // Pass-through existing callbacks\n    // Collect open inputs/outputs\n    const handle = (outlet, list) => {\n      if (outlet.meta.callback) {\n        if (outlet.inout === Graph.IN) {\n          // Dupe outlet and create two-way link between cloned outlets\n          const dupe = outlet.dupe();\n          if (dupe.meta.child == null) {\n            dupe.meta.child = outlet;\n          }\n          outlet.meta.parent = dupe;\n\n          return outlets.push(dupe);\n        }\n      } else {\n        return list.push(outlet.type);\n      }\n    };\n\n    for (outlet of Array.from(this.graph.inputs())) {\n      handle(outlet, ins);\n    }\n    for (outlet of Array.from(this.graph.outputs())) {\n      handle(outlet, outs);\n    }\n\n    // Merge inputs/outputs into new callback signature\n    ins = ins.join(\",\");\n    outs = outs.join(\",\");\n    const type = `(${ins})(${outs})`;\n\n    outlets.push({\n      name: \"callback\",\n      type,\n      inout: Graph.OUT,\n      meta: {\n        callback: true,\n        def: this.subroutine.main,\n      },\n    });\n\n    return outlets;\n  }\n\n  make() {\n    return (this.subroutine = this.graph.compile(this.namespace));\n  }\n\n  export(layout, depth) {\n    if (!layout.visit(this.namespace, depth)) {\n      return;\n    }\n\n    this._link(this.subroutine, layout, depth);\n    return this.graph.export(layout, depth);\n  }\n\n  call(program, depth) {\n    return this._require(this.subroutine, program, depth);\n  }\n\n  callback(layout, depth, name, external, outlet) {\n    this._include(this.subroutine, layout, depth);\n    return this._callback(\n      this.subroutine,\n      layout,\n      depth,\n      name,\n      external,\n      outlet\n    );\n  }\n}\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Graph } from \"../graph\";\nimport { Block } from \"./block\";\n\n/*\n  Isolate a subgraph as a single node\n*/\nexport class Isolate extends Block {\n  constructor(graph) {\n    super(true);\n    this.graph = graph;\n    this.construct();\n  }\n\n  refresh() {\n    super.refresh();\n    return delete this.subroutine;\n  }\n\n  clone() {\n    return new Isolate(this.graph);\n  }\n\n  makeOutlets() {\n    this.make();\n\n    const outlets = [];\n\n    const seen = {};\n    const done = {};\n    for (const set of [\"inputs\", \"outputs\"]) {\n      for (const outlet of Array.from(this.graph[set]())) {\n        // Preserve name of 'return' and 'callback' outlets\n        let name = undefined;\n        if (\n          [\"return\", \"callback\"].includes(outlet.hint) &&\n          outlet.inout === Graph.OUT\n        ) {\n          name = outlet.hint;\n        }\n\n        // Unless it already exists\n        if (seen[name] != null) {\n          name = undefined;\n        }\n\n        // Dupe outlet and remember link to original\n        const dupe = outlet.dupe(name);\n        if (dupe.meta.child == null) {\n          dupe.meta.child = outlet;\n        }\n        outlet.meta.parent = dupe;\n        if (name != null) {\n          seen[name] = true;\n        }\n        done[outlet.name] = dupe;\n\n        outlets.push(dupe);\n      }\n    }\n\n    return outlets;\n  }\n\n  make() {\n    return (this.subroutine = this.graph.compile(this.namespace));\n  }\n\n  call(program, depth) {\n    this._call(this.subroutine, program, depth);\n    return this._inputs(this.subroutine, program, depth);\n  }\n\n  export(layout, depth) {\n    if (!layout.visit(this.namespace, depth)) {\n      return;\n    }\n\n    // Link up with normal inputs\n    this._link(this.subroutine, layout, depth);\n    this._trace(this.subroutine, layout, depth);\n\n    // Export callbacks needed to call the subroutine\n    return this.graph.export(layout, depth);\n  }\n\n  callback(layout, depth, name, external, outlet) {\n    outlet = outlet.meta.child;\n    return outlet.node.owner.callback(layout, depth, name, external, outlet);\n  }\n}\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS205: Consider reworking code to avoid use of IIFEs\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Block } from \"./block\";\n\n/*\n  Join multiple disconnected nodes\n*/\nexport class Join extends Block {\n  constructor(nodes) {\n    super(true);\n    this.nodes = nodes;\n    this.construct();\n  }\n\n  clone() {\n    return new Join(this.nodes);\n  }\n\n  makeOutlets() {\n    return [];\n  }\n\n  call(program, depth) {\n    return (() => {\n      const result = [];\n      for (const node of Array.from(this.nodes)) {\n        const block = node.owner;\n        result.push(block.call(program, depth));\n      }\n      return result;\n    })();\n  }\n\n  export(layout, depth) {\n    return (() => {\n      const result = [];\n      for (const node of Array.from(this.nodes)) {\n        const block = node.owner;\n        result.push(block.export(layout, depth));\n      }\n      return result;\n    })();\n  }\n}\n","export * from \"./block\";\nexport * from \"./call\";\nexport * from \"./callback\";\nexport * from \"./isolate\";\nexport * from \"./join\";\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n// Dump graph for debug/visualization purposes\nimport * as Block from \"../block\";\n\nexport const serialize = function (graph) {\n  const nodes = [];\n  const links = [];\n\n  for (const node of Array.from(graph.nodes)) {\n    let outlet;\n    const record = {\n      // Data\n      id: node.id,\n      name: null,\n      type: null,\n      depth: null,\n      graph: null,\n      inputs: [],\n      outputs: [],\n    };\n\n    nodes.push(record);\n\n    const { inputs } = record;\n    const { outputs } = record;\n\n    const block = node.owner;\n\n    if (block instanceof Block.Call) {\n      record.name = block.snippet._name;\n      record.type = \"call\";\n      record.code = block.snippet._original;\n    } else if (block instanceof Block.Callback) {\n      record.name = \"Callback\";\n      record.type = \"callback\";\n      record.graph = serialize(block.graph);\n    } else if (block instanceof Block.Isolate) {\n      record.name = \"Isolate\";\n      record.type = \"isolate\";\n      record.graph = serialize(block.graph);\n    } else if (block instanceof Block.Join) {\n      record.name = \"Join\";\n      record.type = \"join\";\n    } else if (block != null) {\n      if (record.name == null) {\n        record.name = block.name != null ? block.name : block.type;\n      }\n      if (record.type == null) {\n        record.type = block.type;\n      }\n      if (record.code == null) {\n        record.code = block.code;\n      }\n      if (block.graph != null) {\n        record.graph = serialize(block.graph);\n      }\n    }\n\n    const format = function (type) {\n      type = type.replace(\")(\", \")→(\");\n      return (type = type.replace(\"()\", \"\"));\n    };\n\n    for (outlet of Array.from(node.inputs)) {\n      inputs.push({\n        id: outlet.id,\n        name: outlet.name,\n        type: format(outlet.type),\n        open: outlet.input == null,\n      });\n    }\n\n    for (outlet of Array.from(node.outputs)) {\n      outputs.push({\n        id: outlet.id,\n        name: outlet.name,\n        type: format(outlet.type),\n        open: !outlet.output.length,\n      });\n\n      for (const other of Array.from(outlet.output)) {\n        links.push({\n          from: node.id,\n          out: outlet.id,\n          to: other.node.id,\n          in: other.id,\n          type: format(outlet.type),\n        });\n      }\n    }\n  }\n\n  return { nodes, links };\n};\n","/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n// Hash string into a 32-bit key (murmurhash3)\nconst c1 = 0xcc9e2d51;\nconst c2 = 0x1b873593;\nconst c3 = 0xe6546b64;\nconst c4 = 0x85ebca6b;\nconst c5 = 0xc2b2ae35;\n\n// Fix imul in old/broken browsers\nlet imul = function (a, b) {\n  const ah = (a >>> 16) & 0xffff;\n  const al = a & 0xffff;\n  const bh = (b >>> 16) & 0xffff;\n  const bl = b & 0xffff;\n  return (al * bl + (((ah * bl + al * bh) << 16) >>> 0)) | 0;\n};\n\nif (Math.imul != null) {\n  const test = Math.imul(0xffffffff, 5);\n  if (test === -5) {\n    ({ imul } = Math);\n  }\n}\n\nexport const hash = function (string) {\n  let h;\n  const n = string.length;\n  let m = Math.floor(n / 2);\n  let j = (h = 0);\n\n  const next = () => string.charCodeAt(j++);\n  const iterate = function (a, b) {\n    let k = a | (b << 16); // two utf-16 words\n    k ^= k << 9; // whitening for ascii-only strings\n\n    k = imul(k, c1);\n    k = (k << 15) | (k >>> 17);\n    k = imul(k, c2);\n\n    h ^= k;\n\n    h = (h << 13) | (h >>> 19);\n    h = imul(h, 5);\n    return (h = (h + c3) | 0);\n  };\n\n  while (m--) {\n    iterate(next(), next());\n  }\n  if (n & 1) {\n    iterate(next(), 0);\n  }\n\n  h ^= n;\n  h ^= h >>> 16;\n  h = imul(h, c4);\n  h ^= h >>> 13;\n  h = imul(h, c5);\n\n  return (h ^= h >>> 16);\n};\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { hash } from \"../factory/hash\";\n\nconst trim = (string) => (\"\" + string).replace(/^\\s+|\\s+$/g, \"\");\n\nconst cssColor = (r, g, b, alpha) =>\n  \"rgba(\" + [r, g, b, alpha].join(\", \") + \")\";\n\nconst hashColor = function (string, alpha) {\n  if (alpha == null) {\n    alpha = 1;\n  }\n  const color = hash(string) ^ 0x123456;\n\n  let r = color & 0xff;\n  let g = (color >>> 8) & 0xff;\n  let b = (color >>> 16) & 0xff;\n\n  const max = Math.max(r, g, b);\n  const norm = 140 / max;\n  const min = Math.round(max / 3);\n\n  r = Math.min(255, Math.round(norm * Math.max(r, min)));\n  g = Math.min(255, Math.round(norm * Math.max(g, min)));\n  b = Math.min(255, Math.round(norm * Math.max(b, min)));\n\n  return cssColor(r, g, b, alpha);\n};\n\nconst escapeText = function (string) {\n  string = string != null ? string : \"\";\n  return string\n    .replace(/&/g, \"&amp;\")\n    .replace(/</g, \"&lt;\")\n    .replace(/>/g, \"&gt;\")\n    .replace(/'/g, \"&#39;\")\n    .replace(/\"/g, \"&quot;\");\n};\n\nexport const process = function (data) {\n  const links = [];\n  const el = _markup(data, links);\n  el.update = () => connect(el, links);\n  _activate(el);\n  return el;\n};\n\nconst _activate = function (el) {\n  const codes = el.querySelectorAll(\".shadergraph-code\");\n  return Array.from(codes).map((code) =>\n    (function () {\n      const popup = code;\n      popup.parentNode.classList.add(\"shadergraph-has-code\");\n      return popup.parentNode.addEventListener(\n        \"click\",\n        (_event) =>\n          (popup.style.display = {\n            block: \"none\",\n            none: \"block\",\n          }[popup.style.display || \"none\"])\n      );\n    })()\n  );\n};\n\nconst _order = function (data) {\n  let link, node;\n  const nodeMap = {};\n  const linkMap = {};\n  for (node of Array.from(data.nodes)) {\n    nodeMap[node.id] = node;\n  }\n\n  for (link of Array.from(data.links)) {\n    if (linkMap[link.from] == null) {\n      linkMap[link.from] = [];\n    }\n    linkMap[link.from].push(link);\n  }\n\n  const recurse = function (node, depth) {\n    let next;\n    if (depth == null) {\n      depth = 0;\n    }\n    node.depth = Math.max(node.depth != null ? node.depth : 0, depth);\n    if ((next = linkMap[node.id])) {\n      for (link of Array.from(next)) {\n        recurse(nodeMap[link.to], depth + 1);\n      }\n    }\n    return null;\n  };\n\n  for (node of Array.from(data.nodes)) {\n    if (node.depth == null) {\n      recurse(node);\n    }\n  }\n\n  return null;\n};\n\nconst _markup = function (data, links) {\n  let column;\n  _order(data);\n\n  const wrapper = document.createElement(\"div\");\n  wrapper.classList.add(\"shadergraph-graph\");\n\n  const columns = [];\n  const outlets = {};\n\n  for (const node of Array.from(data.nodes)) {\n    let outlet;\n    const block = document.createElement(\"div\");\n    block.classList.add(\"shadergraph-node\");\n    block.classList.add(`shadergraph-node-${node.type}`);\n\n    block.innerHTML = `\\\n<div class=\"shadergraph-header\">${escapeText(node.name)}</div>\\\n`;\n\n    const addOutlet = function (outlet, inout) {\n      const color = hashColor(outlet.type);\n\n      const div = document.createElement(\"div\");\n      div.classList.add(\"shadergraph-outlet\");\n      div.classList.add(`shadergraph-outlet-${inout}`);\n      div.innerHTML = `\\\n<div class=\"shadergraph-point\" style=\"background: ${color}\"></div>\n<div class=\"shadergraph-type\" style=\"color: ${color}\">${escapeText(\n        outlet.type\n      )}</div>\n<div class=\"shadergraph-name\">${escapeText(outlet.name)}</div>\\\n`;\n      block.appendChild(div);\n\n      return (outlets[outlet.id] = div.querySelector(\".shadergraph-point\"));\n    };\n\n    for (outlet of Array.from(node.inputs)) {\n      addOutlet(outlet, \"in\");\n    }\n    for (outlet of Array.from(node.outputs)) {\n      addOutlet(outlet, \"out\");\n    }\n\n    if (node.graph != null) {\n      block.appendChild(_markup(node.graph, links));\n    } else {\n      const clear = document.createElement(\"div\");\n      clear.classList.add(\"shadergraph-clear\");\n      block.appendChild(clear);\n    }\n\n    if (node.code != null) {\n      const div = document.createElement(\"div\");\n      div.classList.add(\"shadergraph-code\");\n      div.innerHTML = escapeText(trim(node.code));\n      block.appendChild(div);\n    }\n\n    column = columns[node.depth];\n    if (column == null) {\n      column = document.createElement(\"div\");\n      column.classList.add(\"shadergraph-column\");\n      columns[node.depth] = column;\n    }\n    column.appendChild(block);\n  }\n\n  for (column of Array.from(columns)) {\n    if (column != null) {\n      wrapper.appendChild(column);\n    }\n  }\n\n  for (const link of Array.from(data.links)) {\n    const color = hashColor(link.type);\n\n    links.push({\n      color,\n      out: outlets[link.out],\n      in: outlets[link.in],\n    });\n  }\n\n  return wrapper;\n};\n\nconst sqr = (x) => x * x;\n\nconst path = function (x1, y1, x2, y2) {\n  let h;\n  const dx = x2 - x1;\n  const dy = y2 - y1;\n  const d = Math.sqrt(sqr(dx) + sqr(dy));\n\n  const vert = Math.abs(dy) > Math.abs(dx);\n  if (vert) {\n    const mx = (x1 + x2) / 2;\n    const my = (y1 + y2) / 2;\n\n    const f = dy > 0 ? 0.3 : -0.3;\n    h = Math.min(Math.abs(dx) / 2, 20 + d / 8);\n\n    return [\n      \"M\",\n      x1,\n      y1,\n      \"C\",\n      x1 + h,\n      y1 + \",\",\n      mx,\n      my - d * f,\n      mx,\n      my,\n      \"C\",\n      mx,\n      my + d * f,\n      x2 - h,\n      y2 + \",\",\n      x2,\n      y2,\n    ].join(\" \");\n  } else {\n    h = Math.min(Math.abs(dx) / 2.5, 20 + d / 4);\n\n    return [\"M\", x1, y1, \"C\", x1 + h, y1 + \",\", x2 - h, y2 + \",\", x2, y2].join(\n      \" \"\n    );\n  }\n};\n\nconst makeSVG = function (tag) {\n  if (tag == null) {\n    tag = \"svg\";\n  }\n  return document.createElementNS(\"http://www.w3.org/2000/svg\", tag);\n};\n\nconst connect = function (element, links) {\n  let link;\n  if (element.parentNode == null) {\n    return;\n  }\n\n  const ref = element.getBoundingClientRect();\n\n  for (link of Array.from(links)) {\n    const a = link.out.getBoundingClientRect();\n    const b = link.in.getBoundingClientRect();\n\n    link.coords = {\n      x1: (a.left + a.right) / 2 - ref.left,\n      y1: (a.top + a.bottom) / 2 - ref.top,\n      x2: (b.left + b.right) / 2 - ref.left,\n      y2: (b.top + b.bottom) / 2 - ref.top,\n    };\n  }\n\n  let svg = element.querySelector(\"svg\");\n  if (svg != null) {\n    element.removeChild(svg);\n  }\n\n  let box = element;\n  while (box.parentNode && box.offsetHeight === 0) {\n    box = box.parentNode;\n  }\n\n  svg = makeSVG();\n  svg.setAttribute(\"width\", box.offsetWidth);\n  svg.setAttribute(\"height\", box.offsetHeight);\n\n  for (link of Array.from(links)) {\n    const c = link.coords;\n\n    const line = makeSVG(\"path\");\n    line.setAttribute(\"d\", path(c.x1, c.y1, c.x2, c.y2));\n    line.setAttribute(\"stroke\", link.color);\n    line.setAttribute(\"stroke-width\", 3);\n    line.setAttribute(\"fill\", \"transparent\");\n    svg.appendChild(line);\n  }\n\n  return element.appendChild(svg);\n};\n\nexport const overlay = function (contents) {\n  const div = document.createElement(\"div\");\n  div.setAttribute(\"class\", \"shadergraph-overlay\");\n\n  const close = document.createElement(\"div\");\n  close.setAttribute(\"class\", \"shadergraph-close\");\n  close.innerHTML = \"&times;\";\n\n  const view = document.createElement(\"div\");\n  view.setAttribute(\"class\", \"shadergraph-view\");\n\n  const inside = document.createElement(\"div\");\n  inside.setAttribute(\"class\", \"shadergraph-inside\");\n\n  inside.appendChild(contents);\n  view.appendChild(inside);\n  div.appendChild(view);\n  div.appendChild(close);\n\n  close.addEventListener(\"click\", () => div.parentNode.removeChild(div));\n\n  return div;\n};\n\nconst wrap = function (markup) {\n  if (markup instanceof Node) {\n    return markup;\n  }\n  const p = document.createElement(\"span\");\n  p.innerText = markup != null ? markup : \"\";\n  return p;\n};\n\nexport const merge = function (markup) {\n  if (markup.length !== 1) {\n    let el;\n    const div = document.createElement(\"div\");\n    for (el of Array.from(markup)) {\n      div.appendChild(wrap(el));\n    }\n    div.update = () =>\n      (() => {\n        const result = [];\n        for (el of Array.from(markup)) {\n          result.push(\n            typeof el.update === \"function\" ? el.update() : undefined\n          );\n        }\n        return result;\n      })();\n    return div;\n  } else {\n    return wrap(markup[0]);\n  }\n};\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { serialize as _serialize } from \"./serialize\";\nimport * as _markup from \"./markup\";\n\nexport const serialize = _serialize;\nexport const markup = _markup;\n\nconst _visualize = function (graph) {\n  if (!graph) {\n    return;\n  }\n  if (!graph.nodes) {\n    return graph;\n  }\n\n  const data = serialize(graph);\n  return markup.process(data);\n};\n\nconst resolve = function (arg) {\n  if (arg == null) {\n    return arg;\n  }\n  if (arg instanceof Array) {\n    return arg.map(resolve);\n  }\n  if (arg.vertex != null && arg.fragment != null) {\n    return [resolve(arg.vertex, resolve(arg.fragment))];\n  }\n  if (arg._graph != null) {\n    return arg._graph;\n  }\n  if (arg.graph != null) {\n    return arg.graph;\n  }\n  return arg;\n};\n\nconst merge = function (args) {\n  let out = [];\n  for (const arg of Array.from(args)) {\n    if (arg instanceof Array) {\n      out = out.concat(merge(arg));\n    } else if (arg != null) {\n      out.push(arg);\n    }\n  }\n  return out;\n};\n\nexport const visualize = function () {\n  const list = merge(resolve([].slice.call(arguments)));\n  return markup.merge(\n    Array.from(list)\n      .filter((graph) => graph)\n      .map((graph) => _visualize(graph))\n  );\n};\n\nexport const inspect = function () {\n  const contents = visualize.apply(null, arguments);\n  const element = markup.overlay(contents);\n\n  for (const el of Array.from(\n    document.querySelectorAll(\".shadergraph-overlay\")\n  )) {\n    el.remove();\n  }\n  document.body.appendChild(element);\n  contents.update();\n\n  return element;\n};\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Graph } from \"../graph\";\nimport * as Block from \"../block\";\nimport * as Visualize from \"../visualize\";\n\n/*\n  Chainable factory\n\n  Exposes methods to build a graph incrementally\n*/\nexport class Factory {\n  constructor(language, fetch, config) {\n    this.language = language;\n    this.fetch = fetch;\n    this.config = config;\n    this.graph();\n  }\n\n  // Combined call/concat shortcut\n  pipe(name, uniforms, namespace, defines) {\n    if (name instanceof Factory) {\n      this._concat(name);\n    } else if (name != null) {\n      this._call(name, uniforms, namespace, defines);\n    }\n    return this;\n  }\n\n  // Old name\n  call(name, uniforms, namespace, defines) {\n    return this.pipe(name, uniforms, namespace, defines);\n  }\n\n  // Combined callback/import shortcut\n  require(name, uniforms, namespace, defines) {\n    if (name instanceof Factory) {\n      this._import(name);\n    } else if (name != null) {\n      this.callback();\n      this._call(name, uniforms, namespace, defines);\n      this.end();\n    }\n    return this;\n  }\n\n  // Old name\n  import(name, uniforms, namespace, defines) {\n    return this.require(name, uniforms, namespace, defines);\n  }\n\n  // Create parallel branches that connect as one block to the end\n  // (one outgoing connection per outlet)\n  split() {\n    this._group(\"_combine\", true);\n    return this;\n  }\n\n  // Create parallel branches that fan out from the end\n  // (multiple outgoing connections per outlet)\n  fan() {\n    this._group(\"_combine\", false);\n    return this;\n  }\n\n  // Create isolated subgraph\n  isolate() {\n    this._group(\"_isolate\");\n    return this;\n  }\n\n  // Create callback subgraph\n  callback() {\n    this._group(\"_callback\");\n    return this;\n  }\n\n  // Next branch in group\n  next() {\n    this._next();\n    return this;\n  }\n\n  // Connect branches to previous tail and add pass-through from end\n  pass() {\n    const pass = this._stack[2].end;\n    this.end();\n    this._state.end = this._state.end.concat(pass);\n    return this;\n  }\n\n  // Leave nested branches and join up with main graph,\n  // applying stored op along the way\n  end() {\n    const [sub, main] = Array.from(this._exit());\n    const { op } = sub;\n    if (this[op]) {\n      this[op](sub, main);\n    }\n    return this;\n  }\n\n  // Old name\n  join() {\n    return this.end();\n  }\n\n  // Return finalized graph / reset factory\n  graph() {\n    // Pop remaining stack\n    while ((this._stack != null ? this._stack.length : undefined) > 1) {\n      this.end();\n    }\n\n    // Remember terminating node(s) of graph\n    if (this._graph) {\n      this._tail(this._state, this._graph);\n    }\n\n    const graph = this._graph;\n\n    this._graph = new Graph();\n    this._state = new State();\n    this._stack = [this._state];\n\n    return graph;\n  }\n\n  // Compile shortcut (graph is thrown away)\n  compile(namespace) {\n    if (namespace == null) {\n      namespace = \"main\";\n    }\n    return this.graph().compile(namespace);\n  }\n\n  // Link shortcut (graph is thrown away)\n  link(namespace) {\n    if (namespace == null) {\n      namespace = \"main\";\n    }\n    return this.graph().link(namespace);\n  }\n\n  // Serialize for debug\n  serialize() {\n    return Visualize.serialize(this._graph);\n  }\n\n  // Return true if empty\n  empty() {\n    return this._graph.nodes.length === 0;\n  }\n\n  // Concatenate existing factory onto tail\n  // Retains original factory\n  _concat(factory) {\n    // Ignore empty concat\n    let block;\n    if (factory._state.nodes.length === 0) {\n      return this;\n    }\n\n    this._tail(factory._state, factory._graph);\n\n    try {\n      block = new Block.Isolate(factory._graph);\n    } catch (error) {\n      if (this.config.autoInspect) {\n        Visualize.inspect(error, this._graph, factory);\n      }\n      throw error;\n    }\n\n    this._auto(block);\n    return this;\n  }\n\n  // Add existing factory as callback\n  // Retains original factory\n  _import(factory) {\n    // Check for empty require\n    let block;\n    if (factory._state.nodes.length === 0) {\n      throw \"Can't import empty callback\";\n    }\n\n    this._tail(factory._state, factory._graph);\n\n    try {\n      block = new Block.Callback(factory._graph);\n    } catch (error) {\n      if (this.config.autoInspect) {\n        Visualize.inspect(error, this._graph, factory);\n      }\n      throw error;\n    }\n\n    this._auto(block);\n    return this;\n  }\n\n  // Connect parallel branches to tail\n  _combine(sub, main) {\n    for (const to of Array.from(sub.start)) {\n      for (const from of Array.from(main.end)) {\n        from.connect(to, sub.multi);\n      }\n    }\n\n    main.end = sub.end;\n    return (main.nodes = main.nodes.concat(sub.nodes));\n  }\n\n  // Make subgraph and connect to tail\n  _isolate(sub, _main) {\n    if (sub.nodes.length) {\n      let block;\n      const subgraph = this._subgraph(sub);\n      this._tail(sub, subgraph);\n\n      try {\n        block = new Block.Isolate(subgraph);\n      } catch (error) {\n        if (this.config.autoInspect) {\n          Visualize.inspect(error, this._graph, subgraph);\n        }\n        throw error;\n      }\n\n      return this._auto(block);\n    }\n  }\n\n  // Convert to callback and connect to tail\n  _callback(sub, _main) {\n    if (sub.nodes.length) {\n      let block;\n      const subgraph = this._subgraph(sub);\n      this._tail(sub, subgraph);\n\n      try {\n        block = new Block.Callback(subgraph);\n      } catch (error) {\n        if (this.config.autoInspect) {\n          Visualize.inspect(error, this._graph, subgraph);\n        }\n        throw error;\n      }\n\n      return this._auto(block);\n    }\n  }\n\n  // Create next call block\n  _call(name, uniforms, namespace, defines) {\n    const snippet = this.fetch(name);\n    snippet.bind(this.config, uniforms, namespace, defines);\n    const block = new Block.Call(snippet);\n    return this._auto(block);\n  }\n\n  // Move current state into subgraph\n  _subgraph(sub) {\n    const subgraph = new Graph(null, this._graph);\n    subgraph.adopt(sub.nodes);\n    return subgraph;\n  }\n\n  // Finalize graph tail\n  _tail(state, graph) {\n    // Merge (unique) terminating ends into single tail node if needed\n    let tail = state.end.concat(state.tail);\n    tail = tail.filter((node, i) => tail.indexOf(node) === i);\n\n    if (tail.length > 1) {\n      tail = new Block.Join(tail);\n      tail = [tail.node];\n      this._graph.add(tail);\n    }\n\n    // Save single endpoint\n    graph.tail = tail[0];\n    state.end = tail;\n    state.tail = [];\n\n    if (!graph.tail) {\n      throw new Error(\"Cannot finalize empty graph\");\n    }\n\n    // Add compile/link/export/inspect shortcut methods\n    graph.compile = (namespace) => {\n      if (namespace == null) {\n        namespace = \"main\";\n      }\n      try {\n        return graph.tail.owner.compile(this.language, namespace);\n      } catch (error) {\n        if (this.config.autoInspect) {\n          graph.inspect(error);\n        }\n        throw error;\n      }\n    };\n\n    graph.link = (namespace) => {\n      if (namespace == null) {\n        namespace = \"main\";\n      }\n      try {\n        return graph.tail.owner.link(this.language, namespace);\n      } catch (error) {\n        if (this.config.autoInspect) {\n          graph.inspect(error);\n        }\n        throw error;\n      }\n    };\n\n    graph.export = (layout, depth) => {\n      return graph.tail.owner.export(layout, depth);\n    };\n\n    return (graph.inspect = (message = null) =>\n      Visualize.inspect(message, graph));\n  }\n\n  // Create group for branches or callbacks\n  _group(op, multi) {\n    this._push(op, multi); // Accumulator\n    this._push(); // Current\n    return this;\n  }\n\n  // Merge branch into accumulator and reset state\n  _next() {\n    const sub = this._pop();\n\n    this._state.start = this._state.start.concat(sub.start);\n    this._state.end = this._state.end.concat(sub.end);\n    this._state.nodes = this._state.nodes.concat(sub.nodes);\n    this._state.tail = this._state.tail.concat(sub.tail);\n\n    return this._push();\n  }\n\n  // Exit nested branches\n  _exit() {\n    this._next();\n    this._pop();\n    return [this._pop(), this._state];\n  }\n\n  // State stack\n  _push(op, multi) {\n    this._stack.unshift(new State(op, multi));\n    return (this._state = this._stack[0]);\n  }\n\n  _pop() {\n    let left;\n    this._state = this._stack[1];\n    if (this._state == null) {\n      this._state = new State();\n    }\n    return (left = this._stack.shift()) != null ? left : new State();\n  }\n\n  // Auto append or insert depending on whether we have inputs\n  _auto(block) {\n    if (block.node.inputs.length) {\n      return this._append(block);\n    } else {\n      return this._insert(block);\n    }\n  }\n\n  // Add block and connect to end\n  _append(block) {\n    let end;\n    const { node } = block;\n    this._graph.add(node);\n\n    for (end of Array.from(this._state.end)) {\n      end.connect(node);\n    }\n\n    if (!this._state.start.length) {\n      this._state.start = [node];\n    }\n    this._state.end = [node];\n\n    this._state.nodes.push(node);\n    if (!node.outputs.length) {\n      this._state.tail.push(node);\n    }\n  }\n\n  // Add block and connect to start\n  _prepend(block) {\n    let start;\n    const { node } = block;\n    this._graph.add(node);\n\n    for (start of Array.from(this._state.start)) {\n      node.connect(start);\n    }\n\n    if (!this._state.end.length) {\n      this._state.end = [node];\n    }\n    this._state.start = [node];\n\n    this._state.nodes.push(node);\n    if (!node.outputs.length) {\n      this._state.tail.push(node);\n    }\n  }\n\n  // Insert loose block\n  _insert(block) {\n    const { node } = block;\n    this._graph.add(node);\n\n    this._state.start.push(node);\n    this._state.end.push(node);\n\n    this._state.nodes.push(node);\n    if (!node.outputs.length) {\n      return this._state.tail.push(node);\n    }\n  }\n}\n\nclass State {\n  constructor(op = null, multi, start, end, nodes, tail) {\n    this.op = op;\n    if (multi == null) {\n      multi = false;\n    }\n    this.multi = multi;\n    if (start == null) {\n      start = [];\n    }\n    this.start = start;\n    if (end == null) {\n      end = [];\n    }\n    this.end = end;\n    if (nodes == null) {\n      nodes = [];\n    }\n    this.nodes = nodes;\n    if (tail == null) {\n      tail = [];\n    }\n    this.tail = tail;\n  }\n}\n","/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as Visualize from \"../visualize\";\n\nconst debug = false;\n\nconst tick = function () {\n  const now = +new Date();\n  return function (label) {\n    const delta = +new Date() - now;\n    console.log(label, delta + \" ms\");\n    return delta;\n  };\n};\n\nexport class Material {\n  constructor(vertex, fragment) {\n    this.vertex = vertex;\n    this.fragment = fragment;\n    if (debug) {\n      this.tock = tick();\n    }\n  }\n\n  build(options) {\n    return this.link(options);\n  }\n\n  link(options) {\n    if (options == null) {\n      options = {};\n    }\n    const uniforms = {};\n    const varyings = {};\n    const attributes = {};\n\n    const vertex = this.vertex.link(\"main\");\n    const fragment = this.fragment.link(\"main\");\n\n    for (const shader of [vertex, fragment]) {\n      for (const key in shader.uniforms) {\n        const value = shader.uniforms[key];\n        uniforms[key] = value;\n      }\n      for (const key in shader.varyings) {\n        const value = shader.varyings[key];\n        varyings[key] = value;\n      }\n      for (const key in shader.attributes) {\n        const value = shader.attributes[key];\n        attributes[key] = value;\n      }\n    }\n\n    options.vertexShader = vertex.code;\n    options.vertexGraph = vertex.graph;\n    options.fragmentShader = fragment.code;\n    options.fragmentGraph = fragment.graph;\n    options.attributes = attributes;\n    options.uniforms = uniforms;\n    options.varyings = varyings;\n    options.inspect = () =>\n      Visualize.inspect(\n        \"Vertex Shader\",\n        vertex,\n        \"Fragment Shader\",\n        fragment.graph\n      );\n\n    if (debug) {\n      this.tock(\"Material build\");\n    }\n\n    return options;\n  }\n\n  inspect() {\n    return Visualize.inspect(\n      \"Vertex Shader\",\n      this.vertex,\n      \"Fragment Shader\",\n      this.fragment.graph\n    );\n  }\n}\n","/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n/*\n  Snippet library\n\n  Takes:\n    - Hash of snippets: named library\n    - (name) -> getter: dynamic lookup\n    - nothing:          no library, only pass in inline source code\n\n  If 'name' contains any of \"{;(#\" it is assumed to be direct GLSL code.\n*/\nexport const library = function (language, snippets, load) {\n  let callback = null;\n  let used = {};\n\n  if (snippets != null) {\n    if (typeof snippets === \"function\") {\n      callback = (name) => load(language, name, snippets(name));\n    } else if (typeof snippets === \"object\") {\n      callback = function (name) {\n        if (snippets[name] == null) {\n          throw new Error(`Unknown snippet \\`${name}\\``);\n        }\n        return load(language, name, snippets[name]);\n      };\n    }\n  }\n\n  const inline = (code) => load(language, \"\", code);\n\n  if (callback == null) {\n    return inline;\n  }\n\n  const fetch = function (name) {\n    if (name.match(/[{;]/)) {\n      return inline(name);\n    }\n    used[name] = true;\n    return callback(name);\n  };\n\n  fetch.used = function (_used) {\n    if (_used == null) {\n      _used = used;\n    }\n    return (used = _used);\n  };\n\n  return fetch;\n};\n","/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n// Least-recently-used queue for key expiry via linked list\nexport const queue = function (limit) {\n  if (limit == null) {\n    limit = 100;\n  }\n  const map = {};\n\n  let head = null;\n  let tail = null;\n  let count = 0;\n\n  // Insert at front\n  const add = function (item) {\n    item.prev = null;\n    item.next = head;\n\n    if (head != null) {\n      head.prev = item;\n    }\n\n    head = item;\n    if (tail == null) {\n      return (tail = item);\n    }\n  };\n\n  // Remove from list\n  const remove = function (item) {\n    const { prev } = item;\n    const { next } = item;\n\n    if (prev != null) {\n      prev.next = next;\n    }\n    if (next != null) {\n      next.prev = prev;\n    }\n\n    if (head === item) {\n      head = next;\n    }\n    if (tail === item) {\n      return (tail = prev);\n    }\n  };\n\n  // Push key to top of list\n  return function (key) {\n    let dead, item;\n    if ((item = map[key]) && item !== head) {\n      // Already in queue\n      remove(item);\n      add(item);\n    } else {\n      // Check capacity\n      if (count === limit) {\n        // Pop tail\n        dead = tail.key;\n        remove(tail);\n\n        // Expire key\n        delete map[dead];\n      } else {\n        count++;\n      }\n\n      // Replace head\n      item = { next: head, prev: null, key };\n      add(item);\n\n      // Map record for lookup\n      map[key] = item;\n    }\n\n    // Return expired key\n    return dead;\n  };\n};\n","/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n/*\n  Cache decorator\n  Fetches snippets once, clones for reuse\n  Inline code is hashed to avoid bloat\n*/\nimport { queue } from \"./queue\";\nimport { hash } from \"./hash\";\n\nexport const cache = function (fetch) {\n  const cached = {};\n  const push = queue(100);\n\n  // Snippet factory\n  return function (name) {\n    const key = name.length > 32 ? \"##\" + hash(name).toString(16) : name;\n\n    // Push new key onto queue, see if an old key expired\n    const expire = push(key);\n    if (expire != null) {\n      delete cached[expire];\n    }\n\n    // Clone cached snippet\n    if (cached[key] == null) {\n      cached[key] = fetch(name);\n    }\n    return cached[key].clone();\n  };\n};\n","export * from \"./factory\";\nexport * from \"./material\";\n\nexport * from \"./library\";\nexport * from \"./cache\";\nexport * from \"./queue\";\nexport * from \"./hash\";\n","/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n/*\n  Compile snippet back into GLSL, but with certain symbols replaced by prefixes / placeholders\n*/\n\nexport const compile = function (program) {\n  const { code, signatures } = program;\n\n  // Prepare list of placeholders\n  const placeholders = replaced(signatures);\n\n  // Compile\n  const assembler = string_compiler(code, placeholders);\n\n  return [signatures, assembler];\n};\n\nconst replaced = function (signatures) {\n  const out = {};\n  const s = (sig) => (out[sig.name] = true);\n\n  s(signatures.main);\n\n  // Prefix all global symbols\n  for (const key of [\n    \"external\",\n    \"internal\",\n    \"varying\",\n    \"uniform\",\n    \"attribute\",\n  ]) {\n    for (const sig of signatures[key]) {\n      s(sig);\n    }\n  }\n\n  return out;\n};\n\n/*\nString-replacement based compiler\n*/\nconst string_compiler = function (code, placeholders) {\n  // Make regexp for finding placeholders\n  // Replace on word boundaries\n  let key;\n  const re = new RegExp(\n    \"\\\\b(\" +\n      (() => {\n        const result = [];\n        for (key in placeholders) {\n          result.push(key);\n        }\n        return result;\n      })().join(\"|\") +\n      \")\\\\b\",\n    \"g\"\n  );\n\n  // Strip comments\n  code = code.replace(/\\/\\/[^\\n]*/g, \"\");\n  code = code.replace(/\\/\\*([^*]|\\*[^/])*\\*\\//g, \"\");\n\n  // Strip all preprocessor commands (lazy)\n  //code = code.replace /^#[^\\n]*/mg, ''\n\n  // Assembler function that takes namespace prefix and exceptions\n  // and returns GLSL source code\n  return function (prefix, exceptions, defines) {\n    let key;\n    if (prefix == null) {\n      prefix = \"\";\n    }\n    if (exceptions == null) {\n      exceptions = {};\n    }\n    if (defines == null) {\n      defines = {};\n    }\n    const replace = {};\n    for (key in placeholders) {\n      replace[key] = exceptions[key] != null ? key : prefix + key;\n    }\n\n    const compiled = code.replace(re, (key) => replace[key]);\n\n    const defs = (() => {\n      const result1 = [];\n      for (key in defines) {\n        const value = defines[key];\n        result1.push(`#define ${key} ${value}`);\n      }\n      return result1;\n    })();\n    if (defs.length) {\n      defs.push(\"\");\n    }\n    return defs.join(\"\\n\") + compiled;\n  };\n};\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n// AST node parsers\n\nimport { Vector2 } from \"three/src/math/Vector2.js\";\nimport { Vector3 } from \"three/src/math/Vector3.js\";\nimport { Vector4 } from \"three/src/math/Vector4.js\";\nimport { Matrix3 } from \"three/src/math/Matrix3.js\";\nimport { Matrix4 } from \"three/src/math/Matrix4.js\";\n\nexport const decl = {};\n\ndecl.in = 0;\ndecl.out = 1;\ndecl.inout = 2;\n\nconst get = (n) => n.token.data;\n\ndecl.node = function (node) {\n  if (\n    (node.children[5] != null ? node.children[5].type : undefined) ===\n    \"function\"\n  ) {\n    return decl.function(node);\n  } else if ((node.token != null ? node.token.type : undefined) === \"keyword\") {\n    return decl.external(node);\n  }\n};\n\ndecl.external = function (node) {\n  //    console.log 'external', node\n  let c = node.children;\n\n  let storage = get(c[1]);\n  const type = get(c[4]);\n  const list = c[5];\n\n  if (![\"attribute\", \"uniform\", \"varying\"].includes(storage)) {\n    storage = \"global\";\n  }\n\n  const out = [];\n\n  for (let i = 0; i < list.children.length; i++) {\n    c = list.children[i];\n    if (c.type === \"ident\") {\n      const ident = get(c);\n      const next = list.children[i + 1];\n      const quant = (next != null ? next.type : undefined) === \"quantifier\";\n\n      out.push({\n        decl: \"external\",\n        storage,\n        type,\n        ident,\n        quant: !!quant,\n        count: quant,\n      });\n    }\n  }\n\n  return out;\n};\n\ndecl.function = function (node) {\n  const c = node.children;\n\n  //    console.log 'function', node\n\n  const storage = get(c[1]);\n  const type = get(c[4]);\n  const func = c[5];\n  const ident = get(func.children[0]);\n  const args = func.children[1];\n  const body = func.children[2];\n\n  const decls = Array.from(args.children).map((child) => decl.argument(child));\n\n  return [\n    {\n      decl: \"function\",\n      storage,\n      type,\n      ident,\n      body: !!body,\n      args: decls,\n    },\n  ];\n};\n\ndecl.argument = function (node) {\n  const c = node.children;\n\n  //    console.log 'argument', node\n\n  const storage = get(c[1]);\n  const inout = get(c[2]);\n  const type = get(c[4]);\n  const list = c[5];\n  const ident = get(list.children[0]);\n  const quant = list.children[1];\n\n  const count = quant ? quant.children[0].token.data : undefined;\n\n  return {\n    decl: \"argument\",\n    storage,\n    inout,\n    type,\n    ident,\n    quant: !!quant,\n    count,\n  };\n};\n\ndecl.param = function (dir, storage, spec, quant, count) {\n  let prefix = [];\n  if (storage != null) {\n    prefix.push(storage);\n  }\n  if (spec != null) {\n    prefix.push(spec);\n  }\n  prefix.push(\"\");\n\n  prefix = prefix.join(\" \");\n  const suffix = quant ? \"[\" + count + \"]\" : \"\";\n  if (dir !== \"\") {\n    dir += \" \";\n  }\n\n  const f = (name, long) => (long ? dir : \"\") + `${prefix}${name}${suffix}`;\n  f.split = (dir) => decl.param(dir, storage, spec, quant, count);\n\n  return f;\n};\n\n// Three.js sugar\nconst win = typeof window !== \"undefined\";\nconst threejs = win && !!window.THREE;\n\nconst defaults = {\n  int: 0,\n  float: 0,\n  vec2: threejs ? Vector2 : null,\n  vec3: threejs ? Vector3 : null,\n  vec4: threejs ? Vector4 : null,\n  mat2: null,\n  mat3: threejs ? Matrix3 : null,\n  mat4: threejs ? Matrix4 : null,\n  sampler2D: 0,\n  samplerCube: 0,\n};\n\nconst three = {\n  int: \"i\",\n  float: \"f\",\n  vec2: \"v2\",\n  vec3: \"v3\",\n  vec4: \"v4\",\n  mat2: \"m2\",\n  mat3: \"m3\",\n  mat4: \"m4\",\n  sampler2D: \"t\",\n  samplerCube: \"t\",\n};\n\ndecl.type = function (name, spec, quant, count, dir, storage) {\n  const dirs = {\n    in: decl.in,\n    out: decl.out,\n    inout: decl.inout,\n  };\n\n  const storages = { const: \"const\" };\n\n  let type = three[spec];\n  if (quant) {\n    type += \"v\";\n  }\n\n  let value = defaults[spec];\n  if (value != null ? value.call : undefined) {\n    value = new value();\n  }\n  if (quant) {\n    value = [value];\n  }\n\n  const inout = dirs[dir] != null ? dirs[dir] : dirs.in;\n  storage = storages[storage];\n\n  const param = decl.param(dir, storage, spec, quant, count);\n  return new Definition(name, type, spec, param, value, inout);\n};\n\nclass Definition {\n  constructor(name, type, spec, param, value, inout, meta) {\n    this.name = name;\n    this.type = type;\n    this.spec = spec;\n    this.param = param;\n    this.value = value;\n    this.inout = inout;\n    this.meta = meta;\n  }\n\n  split() {\n    // Split inouts\n    const isIn = this.meta.shadowed != null;\n    const dir = isIn ? \"in\" : \"out\";\n    const inout = isIn ? decl.in : decl.out;\n    const param = this.param.split(dir);\n    return new Definition(\n      this.name,\n      this.type,\n      this.spec,\n      param,\n      this.value,\n      inout\n    );\n  }\n\n  copy(name, meta) {\n    return new Definition(\n      name != null ? name : this.name,\n      this.type,\n      this.spec,\n      this.param,\n      this.value,\n      this.inout,\n      meta\n    );\n  }\n}\n","export const SHADOW_ARG = \"_i_o\";\nexport const RETURN_ARG = \"return\";\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS201: Simplify complex destructure assignments\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport tokenize from \"glsl-tokenizer/string\";\nimport parser from \"@sicmutils/glsl-parser/direct\";\nimport { decl } from \"./decl\";\nimport { SHADOW_ARG, RETURN_ARG } from \"./constants\";\n\nlet debug = false;\n\n/*\nparse GLSL into AST\nextract all global symbols and make type signatures\n*/\n// Parse a GLSL snippet\nexport const parse = function (name, code) {\n  const ast = parseGLSL(name, code);\n  return processAST(ast, code);\n};\n\n// Parse GLSL language into AST\nconst parseGLSL = function (name, code) {\n  let ast, tock;\n  let errors = [];\n  if (debug) {\n    tock = tick();\n  }\n\n  try {\n    const tokens = tokenize(code);\n    ast = parser(tokens);\n  } catch (e) {\n    errors = [{ message: e }];\n  }\n\n  if (debug) {\n    tock(\"GLSL Tokenize & Parse\");\n  }\n\n  const fmt = function (code) {\n    code = code.split(\"\\n\");\n    const max = (\"\" + code.length).length;\n    const pad = function (v) {\n      if ((v = \"\" + v).length < max) {\n        return (\"       \" + v).slice(-max);\n      } else {\n        return v;\n      }\n    };\n    return code.map((line, i) => `${pad(i + 1)}: ${line}`).join(\"\\n\");\n  };\n\n  if (!ast || errors.length) {\n    if (!name) {\n      name = \"(inline code)\";\n    }\n    console.warn(fmt(code));\n    for (const error of errors) {\n      console.error(`${name} -`, error.message);\n    }\n    throw new Error(\"GLSL parse error\");\n  }\n\n  return ast;\n};\n\n// Process AST for compilation\nconst processAST = function (ast, code) {\n  let tock;\n  if (debug) {\n    tock = tick();\n  }\n\n  // Walk AST tree and collect global declarations\n  const symbols = [];\n  walk(mapSymbols, collect(symbols), ast, \"\");\n\n  // Sort symbols into bins\n  const [main, internals, externals] = Array.from(sortSymbols(symbols));\n\n  // Extract storage/type signatures of symbols\n  const signatures = extractSignatures(main, internals, externals);\n\n  if (debug) {\n    tock(\"GLSL AST\");\n  }\n\n  return { ast, code, signatures };\n};\n\n// Extract functions and external symbols from AST\nconst mapSymbols = function (node, collect) {\n  switch (node.type) {\n    case \"decl\":\n      collect(decl.node(node));\n      return false;\n  }\n  return true;\n};\n\nconst collect = (out) =>\n  function (value) {\n    if (value != null) {\n      Array.from(value).map((obj) => out.push(obj));\n    }\n  };\n\n// Identify internals, externals and main function\nconst sortSymbols = function (symbols) {\n  let main = null;\n  const internals = [];\n  let externals = [];\n  const maybe = {};\n  let found = false;\n\n  for (const s of Array.from(symbols)) {\n    if (!s.body) {\n      // Unmarked globals are definitely internal\n      if (s.storage === \"global\") {\n        internals.push(s);\n\n        // Possible external\n      } else {\n        externals.push(s);\n        maybe[s.ident] = true;\n      }\n    } else {\n      // Remove earlier forward declaration\n      if (maybe[s.ident]) {\n        externals = Array.from(externals).filter((e) => e.ident !== s.ident);\n        delete maybe[s.ident];\n      }\n\n      // Internal function\n      internals.push(s);\n\n      // Last function is main\n      // unless there is a function called 'main'\n      if (s.ident === \"main\") {\n        main = s;\n        found = true;\n      } else if (!found) {\n        main = s;\n      }\n    }\n  }\n\n  return [main, internals, externals];\n};\n\n// Generate type signatures and appropriate ins/outs\nconst extractSignatures = function (main, internals, externals) {\n  let symbol;\n  const sigs = {\n    uniform: [],\n    attribute: [],\n    varying: [],\n    external: [],\n    internal: [],\n    global: [],\n    main: null,\n  };\n\n  const defn = (symbol) =>\n    decl.type(\n      symbol.ident,\n      symbol.type,\n      symbol.quant,\n      symbol.count,\n      symbol.inout,\n      symbol.storage\n    );\n\n  const func = function (symbol, inout) {\n    let d;\n    const signature = Array.from(symbol.args).map((arg) => defn(arg));\n\n    // Split inouts into in and out\n    for (d of Array.from(signature)) {\n      if (d.inout === decl.inout) {\n        const a = d;\n        const b = d.copy();\n\n        a.inout = decl.in;\n        b.inout = decl.out;\n        b.meta = { shadow: a.name };\n        b.name += SHADOW_ARG;\n        a.meta = { shadowed: b.name };\n\n        signature.push(b);\n      }\n    }\n\n    // Add output for return type\n    if (symbol.type !== \"void\") {\n      signature.unshift(decl.type(RETURN_ARG, symbol.type, false, \"\", \"out\"));\n    }\n\n    // Make type string\n    const inTypes = (() => {\n      const result = [];\n      for (d of Array.from(signature)) {\n        if (d.inout === decl.in) {\n          result.push(d.type);\n        }\n      }\n      return result;\n    })().join(\",\");\n    const outTypes = (() => {\n      const result1 = [];\n      for (d of Array.from(signature)) {\n        if (d.inout === decl.out) {\n          result1.push(d.type);\n        }\n      }\n      return result1;\n    })().join(\",\");\n    const type = `(${inTypes})(${outTypes})`;\n\n    return {\n      name: symbol.ident,\n      type,\n      signature,\n      inout,\n      spec: symbol.type,\n    };\n  };\n\n  // Main\n  sigs.main = func(main, decl.out);\n\n  // Internals (for name replacement only)\n  for (symbol of Array.from(internals)) {\n    sigs.internal.push({\n      name: symbol.ident,\n    });\n  }\n\n  // Externals\n  for (symbol of Array.from(externals)) {\n    let def;\n    switch (symbol.decl) {\n      // Uniforms/attributes/varyings\n      case \"external\":\n        def = defn(symbol);\n        sigs[symbol.storage].push(def);\n        break;\n\n      // Callbacks\n      case \"function\":\n        def = func(symbol, decl.in);\n        sigs.external.push(def);\n        break;\n    }\n  }\n\n  return sigs;\n};\n\n// Walk AST, apply map and collect values\ndebug = false;\n\nexport const walk = function (map, collect, node, indent) {\n  debug &&\n    console.log(\n      indent,\n      node.type,\n      node.token != null ? node.token.data : undefined,\n      node.token != null ? node.token.type : undefined\n    );\n\n  const recurse = map(node, collect);\n\n  if (recurse) {\n    for (let i = 0; i < node.children.length; i++) {\n      const child = node.children[i];\n      walk(map, collect, child, indent + \"  \", debug);\n    }\n  }\n\n  return null;\n};\n\n// #####\n\nconst tick = function () {\n  const now = +new Date();\n  return function (label) {\n    const delta = +new Date() - now;\n    console.log(label, delta + \" ms\");\n    return delta;\n  };\n};\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as Graph from \"../graph\";\nimport * as $ from \"./constants\";\n\n/*\n  GLSL code generator for compiler and linker stubs\n*/\n\n// Check if shadow outlet\nexport function unshadow(name) {\n  const real = name.replace($.SHADOW_ARG, \"\");\n  if (real !== name) {\n    return real;\n  } else {\n    return null;\n  }\n}\n\n// Line joiners\nexport function lines(lines) {\n  return lines.join(\"\\n\");\n}\nexport function list(lines) {\n  return lines.join(\", \");\n}\nexport function statements(lines) {\n  return lines.join(\";\\n\");\n}\n\n// Function body\nexport function body(entry) {\n  return {\n    entry,\n    type: \"void\",\n    params: [],\n    signature: [],\n    return: \"\",\n    vars: {},\n    calls: [],\n    post: [],\n    chain: {},\n  };\n}\n\n// Symbol define\nexport function define(a, b) {\n  return `#define ${a} ${b}`;\n}\n\n// Function define\nexport function fn(type, entry, params, vars, calls) {\n  return `${type} ${entry}(${params}) {\\n${vars}${calls}}`;\n}\n\n// Function invocation\nexport function invoke(ret, entry, args) {\n  ret = ret ? `${ret} = ` : \"\";\n  args = list(args);\n  return `  ${ret}${entry}(${args})`;\n}\n\n// Compare two signatures\nexport function same(a, b) {\n  for (let i = 0; i < a.length; i++) {\n    const A = a[i];\n    const B = b[i];\n    if (!B) {\n      return false;\n    }\n    if (A.type !== B.type) {\n      return false;\n    }\n    if ((A.name === $.RETURN_ARG) !== (B.name === $.RETURN_ARG)) {\n      return false;\n    }\n  }\n  return true;\n}\n\n// Generate call signature for module invocation\nexport function call(lookup, dangling, entry, signature, body) {\n  const args = [];\n  let ret = \"\";\n\n  for (let arg of Array.from(signature)) {\n    let id, shadow;\n    const { name } = arg;\n\n    let copy = (id = lookup(name));\n    let other = null;\n    let meta = null;\n    let omit = false;\n\n    const isReturn = name === $.RETURN_ARG;\n\n    // Shadowed inout: input side\n    if ((shadow = arg.meta != null ? arg.meta.shadowed : undefined)) {\n      other = lookup(shadow);\n      if (other) {\n        body.vars[other] = \"  \" + arg.param(other);\n        body.calls.push(`  ${other} = ${id}`);\n\n        if (!dangling(shadow)) {\n          arg = arg.split();\n        } else {\n          meta = { shadowed: other };\n        }\n      }\n    }\n\n    // Shadowed inout: output side\n    if ((shadow = arg.meta != null ? arg.meta.shadow : undefined)) {\n      other = lookup(shadow);\n      if (other) {\n        if (!dangling(shadow)) {\n          arg = arg.split();\n          omit = true;\n        } else {\n          meta = { shadow: other };\n          continue;\n        }\n      }\n    }\n\n    if (isReturn) {\n      // Capture return value\n      ret = id;\n    } else if (!omit) {\n      // Pass all non return, non shadow args in\n      args.push(other != null ? other : id);\n    }\n\n    // Export argument if unconnected\n    if (dangling(name)) {\n      let op = \"push\";\n      if (isReturn) {\n        if (body.return === \"\") {\n          op = \"unshift\";\n          // Preserve 'return' arg name\n          copy = name;\n          body.type = arg.spec;\n          body.return = `  return ${id}`;\n          body.vars[id] = \"  \" + arg.param(id);\n        } else {\n          body.vars[id] = \"  \" + arg.param(id);\n          body.params.push(arg.param(id, true));\n        }\n      } else {\n        body.params.push(arg.param(id, true));\n      }\n\n      // Copy argument into new signature\n      arg = arg.copy(copy, meta);\n      body.signature[op](arg);\n    } else {\n      body.vars[id] = \"  \" + arg.param(id);\n    }\n  }\n\n  return body.calls.push(invoke(ret, entry, args));\n}\n\n// Assemble main() function from body and call reference\nexport function build(body, calls) {\n  const { entry } = body;\n  let code = null;\n\n  // Check if we're only calling one snippet with identical signature\n  // and not building void main();\n  if (calls && calls.length === 1 && entry !== \"main\") {\n    const b = calls[0].module;\n\n    if (same(body.signature, b.main.signature)) {\n      code = define(entry, b.entry);\n    }\n  }\n\n  // Otherwise build function body\n  if (code == null) {\n    let vars = (() => {\n      const result = [];\n      for (const v in body.vars) {\n        const decl = body.vars[v];\n        result.push(decl);\n      }\n      return result;\n    })();\n    ({ calls } = body);\n    const { post } = body;\n    let { params } = body;\n    const { type } = body;\n    const ret = body.return;\n\n    calls = calls.concat(post);\n    if (ret !== \"\") {\n      calls.push(ret);\n    }\n    calls.push(\"\");\n\n    if (vars.length) {\n      vars.push(\"\");\n      vars = statements(vars) + \"\\n\";\n    } else {\n      vars = \"\";\n    }\n\n    calls = statements(calls);\n    params = list(params);\n\n    code = fn(type, entry, params, vars, calls);\n  }\n\n  return {\n    signature: body.signature,\n    code,\n    name: entry,\n  };\n}\n\n// Build links to other callbacks\nexport function links(links) {\n  const out = {\n    defs: [],\n    bodies: [],\n  };\n\n  for (const l of Array.from(links)) {\n    link(l, out);\n  }\n\n  out.defs = lines(out.defs);\n  out.bodies = statements(out.bodies);\n\n  if (out.defs === \"\") {\n    delete out.defs;\n  }\n  if (out.bodies === \"\") {\n    delete out.bodies;\n  }\n\n  return out;\n}\n\n// Link a module's entry point as a callback\nexport const link = (link, out) => {\n  let arg, list;\n  const { module, name, external } = link;\n  const { main } = module;\n  const { entry } = module;\n\n  // If signatures match, #define alias for the symbol\n  if (same(main.signature, external.signature)) {\n    return out.defs.push(define(name, entry));\n  }\n\n  // Signatures differ, build one-line callback to match defined prototype\n\n  // Map names to names\n  const ins = [];\n  const outs = [];\n  let map = {};\n  const returnVar = [module.namespace, $.RETURN_ARG].join(\"\");\n\n  for (arg of Array.from(external.signature)) {\n    list = arg.inout === Graph.IN ? ins : outs;\n    list.push(arg);\n  }\n\n  for (arg of Array.from(main.signature)) {\n    list = arg.inout === Graph.IN ? ins : outs;\n    const other = list.shift();\n    let _name = other.name;\n\n    // Avoid 'return' keyword\n    if (_name === $.RETURN_ARG) {\n      _name = returnVar;\n    }\n\n    map[arg.name] = _name;\n  }\n\n  // Build function prototype to invoke the other side\n  let _lookup = (name) => map[name];\n  const _dangling = () => true;\n\n  const inner = body();\n  call(_lookup, _dangling, entry, main.signature, inner);\n  inner.entry = entry;\n\n  // Avoid 'return' keyword\n  map = { return: returnVar };\n  _lookup = (name) => (map[name] != null ? map[name] : name);\n\n  // Build wrapper function for the calling side\n  const outer = body();\n  call(_lookup, _dangling, entry, external.signature, outer);\n\n  outer.calls = inner.calls;\n  outer.entry = name;\n\n  out.bodies.push(build(inner).code.split(\" {\")[0]);\n  return out.bodies.push(build(outer).code);\n};\n\n// Remove all function prototypes to avoid redefinition errors\nexport function defuse(code) {\n  // Don't try this at home kids\n  const re =\n    /([A-Za-z0-9_]+\\s+)?[A-Za-z0-9_]+\\s+[A-Za-z0-9_]+\\s*\\([^)]*\\)\\s*;\\s*/gm;\n  const strip = (code) => code.replace(re, (_m) => \"\");\n\n  // Split into scopes by braces\n  const blocks = code.split(/(?=[{}])/g);\n  let level = 0;\n  for (let i = 0; i < blocks.length; i++) {\n    const b = blocks[i];\n    switch (b[0]) {\n      case \"{\":\n        level++;\n        break;\n      case \"}\":\n        level--;\n        break;\n    }\n\n    // Only mess with top level scope\n    if (level === 0) {\n      // Preprocessor lines will fuck us up. Split on them.\n      const hash = b.split(/^[ \\t]*#/m);\n      for (let j = 0; j < hash.length; j++) {\n        let line = hash[j];\n        if (j > 0) {\n          // Trim off preprocessor directive\n          line = line.split(/\\n/);\n          const head = line.shift();\n          const rest = line.join(\"\\n\");\n\n          // Process rest\n          hash[j] = [head, strip(rest)].join(\"\\n\");\n        } else {\n          // Process entire line\n          hash[j] = strip(line);\n        }\n      }\n\n      // Reassemble\n      blocks[i] = hash.join(\"#\");\n    }\n  }\n\n  return (code = blocks.join(\"\"));\n}\n\n// Remove duplicate uniforms / varyings / attributes\nexport function dedupe(code) {\n  const map = {};\n  const re =\n    /((attribute|uniform|varying)\\s+)[A-Za-z0-9_]+\\s+([A-Za-z0-9_]+)\\s*(\\[[^\\]]*\\]\\s*)?;\\s*/gm;\n  return code.replace(re, function (m, qual, type, name, _struct) {\n    if (map[name]) {\n      return \"\";\n    }\n    map[name] = true;\n    return m;\n  });\n}\n\n// Move definitions to top so they compile properly\nexport function hoist(code) {\n  const filter = function (lines, re) {\n    const defs = [];\n    const out = [];\n    for (const line of Array.from(lines)) {\n      const list = line.match(re) ? defs : out;\n      list.push(line);\n    }\n\n    return defs.concat(out);\n  };\n\n  let lines = code.split(\"\\n\");\n\n  // Hoist symbol defines to the top so (re)definitions use the right alias\n  lines = filter(lines, /^#define ([^ ]+ _pg_[0-9]+_|_pg_[0-9]+_ [^ ]+)$/);\n\n  // Hoist extensions\n  lines = filter(lines, /^#extension/);\n\n  return lines.join(\"\\n\");\n}\n","export * from \"./compile\";\nexport * from \"./parse\";\nexport * from \"./generate\";\nexport * from \"./constants\";\n","/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Block } from \"./block\";\nimport * as Factory from \"./factory\";\nimport * as GLSL from \"./glsl\";\nimport * as Graph from \"./graph\";\nimport * as Linker from \"./linker\";\nimport * as Visualize from \"./visualize\";\n\nconst { library, cache } = Factory;\nexport const { visualize, inspect } = Visualize;\nconst { Snippet } = Linker;\n\nconst merge = function (a, b = {}) {\n  const out = {};\n  for (let key in a) {\n    out[key] = b[key] || a[key];\n  }\n  return out;\n};\n\nexport class ShaderGraph {\n  constructor(snippets, config) {\n    const defaults = {\n      globalUniforms: false,\n      globalVaryings: true,\n      globalAttributes: true,\n      globals: [],\n      autoInspect: false,\n    };\n\n    this.config = merge(defaults, config);\n    this.fetch = cache(library(GLSL, snippets, Snippet.load));\n  }\n\n  shader(config) {\n    if (config == null) {\n      config = {};\n    }\n    const _config = merge(this.config, config);\n    return new Factory.Factory(GLSL, this.fetch, _config);\n  }\n\n  material(config) {\n    return new Factory.Material(this.shader(config), this.shader(config));\n  }\n\n  inspect(shader) {\n    return ShaderGraph.inspect(shader);\n  }\n  visualize(shader) {\n    return ShaderGraph.visualize(shader);\n  }\n\n  // Static visualization method\n  static inspect(shader) {\n    return inspect(shader);\n  }\n  static visualize(shader) {\n    return visualize(shader);\n  }\n}\n\n// Expose class hierarchy\nShaderGraph.Block = Block;\nShaderGraph.Factory = Factory;\nShaderGraph.GLSL = GLSL;\nShaderGraph.Graph = Graph;\nShaderGraph.Linker = Linker;\nShaderGraph.Visualize = Visualize;\n\nexport function load(snippets, config = {}) {\n  return new ShaderGraph(snippets, config);\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as ShaderGraph from \"shadergraph\";\n\nexport const Factory = function (snippets) {\n  function fetch(name) {\n    // Built-in library\n    const s = snippets[name];\n    if (s != null) {\n      return s;\n    }\n\n    // Load from <script> tags by ID\n    const ref = [\"#\", \".\", \":\", \"[\"].includes(name[0]);\n    const sel = ref ? name : `#${name}`;\n    const element = document.querySelector(sel);\n    if (element != null && element.tagName === \"SCRIPT\") {\n      return element.textContent || element.innerText;\n    }\n\n    throw new Error(`Unknown shader \\`${name}\\``);\n  }\n\n  return ShaderGraph.load(fetch, { autoInspect: true });\n};\n","import arrowposition from \"./glsl/arrow.position\";\nimport axisposition from \"./glsl/axis.position\";\nimport cartesian4position from \"./glsl/cartesian4.position\";\nimport cartesianposition from \"./glsl/cartesian.position\";\nimport clampposition from \"./glsl/clamp.position\";\nimport coloropaque from \"./glsl/color.opaque\";\nimport faceposition from \"./glsl/face.position\";\nimport facepositionnormal from \"./glsl/face.position.normal\";\nimport floatencode from \"./glsl/float.encode\";\nimport floatindexpack from \"./glsl/float.index.pack\";\nimport floatstretch from \"./glsl/float.stretch\";\nimport fragmentclipdashed from \"./glsl/fragment.clip.dashed\";\nimport fragmentclipdotted from \"./glsl/fragment.clip.dotted\";\nimport fragmentclipends from \"./glsl/fragment.clip.ends\";\nimport fragmentclipproximity from \"./glsl/fragment.clip.proximity\";\nimport fragmentcolor from \"./glsl/fragment.color\";\nimport fragmentmaprgba from \"./glsl/fragment.map.rgba\";\nimport fragmentsolid from \"./glsl/fragment.solid\";\nimport fragmenttransparent from \"./glsl/fragment.transparent\";\nimport gridposition from \"./glsl/grid.position\";\nimport growposition from \"./glsl/grow.position\";\nimport joinposition from \"./glsl/join.position\";\nimport labelalpha from \"./glsl/label.alpha\";\nimport labelmap from \"./glsl/label.map\";\nimport labeloutline from \"./glsl/label.outline\";\nimport layerposition from \"./glsl/layer.position\";\nimport lerpdepth from \"./glsl/lerp.depth\";\nimport lerpheight from \"./glsl/lerp.height\";\nimport lerpitems from \"./glsl/lerp.items\";\nimport lerpwidth from \"./glsl/lerp.width\";\nimport lineposition from \"./glsl/line.position\";\nimport map2ddata from \"./glsl/map.2d.data\";\nimport map2ddatawrap from \"./glsl/map.2d.data.wrap\";\nimport mapxyzw2dv from \"./glsl/map.xyzw.2dv\";\nimport mapxyzwalign from \"./glsl/map.xyzw.align\";\nimport mapxyzwtexture from \"./glsl/map.xyzw.texture\";\nimport meshfragmentcolor from \"./glsl/mesh.fragment.color\";\nimport meshfragmentmap from \"./glsl/mesh.fragment.map\";\nimport meshfragmentmask from \"./glsl/mesh.fragment.mask\";\nimport meshfragmentmaterial from \"./glsl/mesh.fragment.material\";\nimport meshfragmentshaded from \"./glsl/mesh.fragment.shaded\";\nimport meshfragmenttexture from \"./glsl/mesh.fragment.texture\";\nimport meshgammain from \"./glsl/mesh.gamma.in\";\nimport meshgammaout from \"./glsl/mesh.gamma.out\";\nimport meshmapuvwo from \"./glsl/mesh.map.uvwo\";\nimport meshposition from \"./glsl/mesh.position\";\nimport meshvertexcolor from \"./glsl/mesh.vertex.color\";\nimport meshvertexmask from \"./glsl/mesh.vertex.mask\";\nimport meshvertexposition from \"./glsl/mesh.vertex.position\";\nimport moveposition from \"./glsl/move.position\";\nimport objectmaskdefault from \"./glsl/object.mask.default\";\nimport pointalphacircle from \"./glsl/point.alpha.circle\";\nimport pointalphacirclehollow from \"./glsl/point.alpha.circle.hollow\";\nimport pointalphageneric from \"./glsl/point.alpha.generic\";\nimport pointalphagenerichollow from \"./glsl/point.alpha.generic.hollow\";\nimport pointedge from \"./glsl/point.edge\";\nimport pointfill from \"./glsl/point.fill\";\nimport pointmaskcircle from \"./glsl/point.mask.circle\";\nimport pointmaskdiamond from \"./glsl/point.mask.diamond\";\nimport pointmaskdown from \"./glsl/point.mask.down\";\nimport pointmaskleft from \"./glsl/point.mask.left\";\nimport pointmaskright from \"./glsl/point.mask.right\";\nimport pointmasksquare from \"./glsl/point.mask.square\";\nimport pointmaskup from \"./glsl/point.mask.up\";\nimport pointposition from \"./glsl/point.position\";\nimport pointsizeuniform from \"./glsl/point.size.uniform\";\nimport pointsizevarying from \"./glsl/point.size.varying\";\nimport polarposition from \"./glsl/polar.position\";\nimport projectposition from \"./glsl/project.position\";\nimport projectreadback from \"./glsl/project.readback\";\nimport rawpositionscale from \"./glsl/raw.position.scale\";\nimport repeatposition from \"./glsl/repeat.position\";\nimport resamplepadding from \"./glsl/resample.padding\";\nimport resamplerelative from \"./glsl/resample.relative\";\nimport revealmask from \"./glsl/reveal.mask\";\nimport rootposition from \"./glsl/root.position\";\nimport sample2d from \"./glsl/sample.2d\";\nimport scaleposition from \"./glsl/scale.position\";\nimport screenmapstpq from \"./glsl/screen.map.stpq\";\nimport screenmapxy from \"./glsl/screen.map.xy\";\nimport screenmapxyzw from \"./glsl/screen.map.xyzw\";\nimport screenpassuv from \"./glsl/screen.pass.uv\";\nimport screenposition from \"./glsl/screen.position\";\nimport sliceposition from \"./glsl/slice.position\";\nimport sphericalposition from \"./glsl/spherical.position\";\nimport splitposition from \"./glsl/split.position\";\nimport spreadposition from \"./glsl/spread.position\";\nimport spritefragment from \"./glsl/sprite.fragment\";\nimport spriteposition from \"./glsl/sprite.position\";\nimport stereographic4position from \"./glsl/stereographic4.position\";\nimport stereographicposition from \"./glsl/stereographic.position\";\nimport stpqsample2d from \"./glsl/stpq.sample.2d\";\nimport stpqxyzw2d from \"./glsl/stpq.xyzw.2d\";\nimport strippositionnormal from \"./glsl/strip.position.normal\";\nimport stylecolor from \"./glsl/style.color\";\nimport subdividedepth from \"./glsl/subdivide.depth\";\nimport subdividedepthlerp from \"./glsl/subdivide.depth.lerp\";\nimport subdivideheight from \"./glsl/subdivide.height\";\nimport subdivideheightlerp from \"./glsl/subdivide.height.lerp\";\nimport subdivideitems from \"./glsl/subdivide.items\";\nimport subdivideitemslerp from \"./glsl/subdivide.items.lerp\";\nimport subdividewidth from \"./glsl/subdivide.width\";\nimport subdividewidthlerp from \"./glsl/subdivide.width.lerp\";\nimport surfacemaskhollow from \"./glsl/surface.mask.hollow\";\nimport surfaceposition from \"./glsl/surface.position\";\nimport surfacepositionnormal from \"./glsl/surface.position.normal\";\nimport ticksposition from \"./glsl/ticks.position\";\nimport transform3position from \"./glsl/transform3.position\";\nimport transform4position from \"./glsl/transform4.position\";\nimport viewposition from \"./glsl/view.position\";\n\nexport const Snippets = {\n  \"arrow.position\": arrowposition,\n  \"axis.position\": axisposition,\n  \"cartesian.position\": cartesianposition,\n  \"cartesian4.position\": cartesian4position,\n  \"clamp.position\": clampposition,\n  \"color.opaque\": coloropaque,\n  \"face.position\": faceposition,\n  \"face.position.normal\": facepositionnormal,\n  \"float.encode\": floatencode,\n  \"float.index.pack\": floatindexpack,\n  \"float.stretch\": floatstretch,\n  \"fragment.clip.dashed\": fragmentclipdashed,\n  \"fragment.clip.dotted\": fragmentclipdotted,\n  \"fragment.clip.ends\": fragmentclipends,\n  \"fragment.clip.proximity\": fragmentclipproximity,\n  \"fragment.color\": fragmentcolor,\n  \"fragment.map.rgba\": fragmentmaprgba,\n  \"fragment.solid\": fragmentsolid,\n  \"fragment.transparent\": fragmenttransparent,\n  \"grid.position\": gridposition,\n  \"grow.position\": growposition,\n  \"join.position\": joinposition,\n  \"label.alpha\": labelalpha,\n  \"label.map\": labelmap,\n  \"label.outline\": labeloutline,\n  \"layer.position\": layerposition,\n  \"lerp.depth\": lerpdepth,\n  \"lerp.height\": lerpheight,\n  \"lerp.items\": lerpitems,\n  \"lerp.width\": lerpwidth,\n  \"line.position\": lineposition,\n  \"map.2d.data\": map2ddata,\n  \"map.2d.data.wrap\": map2ddatawrap,\n  \"map.xyzw.2dv\": mapxyzw2dv,\n  \"map.xyzw.align\": mapxyzwalign,\n  \"map.xyzw.texture\": mapxyzwtexture,\n  \"mesh.fragment.color\": meshfragmentcolor,\n  \"mesh.fragment.map\": meshfragmentmap,\n  \"mesh.fragment.mask\": meshfragmentmask,\n  \"mesh.fragment.material\": meshfragmentmaterial,\n  \"mesh.fragment.shaded\": meshfragmentshaded,\n  \"mesh.fragment.texture\": meshfragmenttexture,\n  \"mesh.gamma.in\": meshgammain,\n  \"mesh.gamma.out\": meshgammaout,\n  \"mesh.map.uvwo\": meshmapuvwo,\n  \"mesh.position\": meshposition,\n  \"mesh.vertex.color\": meshvertexcolor,\n  \"mesh.vertex.mask\": meshvertexmask,\n  \"mesh.vertex.position\": meshvertexposition,\n  \"move.position\": moveposition,\n  \"object.mask.default\": objectmaskdefault,\n  \"point.alpha.circle\": pointalphacircle,\n  \"point.alpha.circle.hollow\": pointalphacirclehollow,\n  \"point.alpha.generic\": pointalphageneric,\n  \"point.alpha.generic.hollow\": pointalphagenerichollow,\n  \"point.edge\": pointedge,\n  \"point.fill\": pointfill,\n  \"point.mask.circle\": pointmaskcircle,\n  \"point.mask.diamond\": pointmaskdiamond,\n  \"point.mask.down\": pointmaskdown,\n  \"point.mask.left\": pointmaskleft,\n  \"point.mask.right\": pointmaskright,\n  \"point.mask.square\": pointmasksquare,\n  \"point.mask.up\": pointmaskup,\n  \"point.position\": pointposition,\n  \"point.size.uniform\": pointsizeuniform,\n  \"point.size.varying\": pointsizevarying,\n  \"polar.position\": polarposition,\n  \"project.position\": projectposition,\n  \"project.readback\": projectreadback,\n  \"raw.position.scale\": rawpositionscale,\n  \"repeat.position\": repeatposition,\n  \"resample.padding\": resamplepadding,\n  \"resample.relative\": resamplerelative,\n  \"reveal.mask\": revealmask,\n  \"root.position\": rootposition,\n  \"sample.2d\": sample2d,\n  \"scale.position\": scaleposition,\n  \"screen.map.stpq\": screenmapstpq,\n  \"screen.map.xy\": screenmapxy,\n  \"screen.map.xyzw\": screenmapxyzw,\n  \"screen.pass.uv\": screenpassuv,\n  \"screen.position\": screenposition,\n  \"slice.position\": sliceposition,\n  \"spherical.position\": sphericalposition,\n  \"split.position\": splitposition,\n  \"spread.position\": spreadposition,\n  \"sprite.fragment\": spritefragment,\n  \"sprite.position\": spriteposition,\n  \"stereographic.position\": stereographicposition,\n  \"stereographic4.position\": stereographic4position,\n  \"stpq.sample.2d\": stpqsample2d,\n  \"stpq.xyzw.2d\": stpqxyzw2d,\n  \"strip.position.normal\": strippositionnormal,\n  \"style.color\": stylecolor,\n  \"subdivide.depth\": subdividedepth,\n  \"subdivide.depth.lerp\": subdividedepthlerp,\n  \"subdivide.height\": subdivideheight,\n  \"subdivide.height.lerp\": subdivideheightlerp,\n  \"subdivide.items\": subdivideitems,\n  \"subdivide.items.lerp\": subdivideitemslerp,\n  \"subdivide.width\": subdividewidth,\n  \"subdivide.width.lerp\": subdividewidthlerp,\n  \"surface.mask.hollow\": surfacemaskhollow,\n  \"surface.position\": surfaceposition,\n  \"surface.position.normal\": surfacepositionnormal,\n  \"ticks.position\": ticksposition,\n  \"transform3.position\": transform3position,\n  \"transform4.position\": transform4position,\n  \"view.position\": viewposition,\n};\n\nexport * from \"./factory.js\";\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport * as Ease from \"../util/ease.js\";\n\nexport class Animator {\n  constructor(context) {\n    this.context = context;\n    this.anims = [];\n  }\n\n  make(type, options) {\n    const anim = new Animation(this, this.context.time, type, options);\n    this.anims.push(anim);\n    return anim;\n  }\n\n  unmake(anim) {\n    return (this.anims = Array.from(this.anims).filter((a) => a !== anim));\n  }\n\n  update() {\n    const { time } = this.context;\n    return (this.anims = (() => {\n      const result = [];\n      for (const anim of Array.from(this.anims)) {\n        if (anim.update(time) !== false) {\n          result.push(anim);\n        }\n      }\n      return result;\n    })());\n  }\n\n  lerp(type, from, to, f, value) {\n    if (value == null) {\n      value = type.make();\n    }\n\n    // Use the most appropriate interpolation method for the type\n\n    // Direct lerp operator\n    if (type.lerp) {\n      value = type.lerp(from, to, value, f);\n\n      // Substitute emitter\n    } else if (type.emitter) {\n      const fromE = from.emitterFrom;\n      const toE = to.emitterTo;\n\n      if (fromE != null && toE != null && fromE === toE) {\n        fromE.lerp(f);\n        return fromE;\n      } else {\n        const emitter = type.emitter(from, to);\n        from.emitterFrom = emitter;\n        to.emitterTo = emitter;\n        emitter.lerp(f);\n        return emitter;\n      }\n\n      // Generic binary operator\n    } else if (type.op) {\n      const lerp = function (a, b) {\n        if (a === +a && b === +b) {\n          // Lerp numbers\n          return a + (b - a) * f;\n        } else {\n          // No lerp\n          if (f > 0.5) {\n            return b;\n          } else {\n            return a;\n          }\n        }\n      };\n\n      value = type.op(from, to, value, lerp);\n\n      // No lerp\n    } else {\n      value = f > 0.5 ? to : from;\n    }\n\n    return value;\n  }\n}\n\nclass Animation {\n  constructor(animator, time, type, options) {\n    this.animator = animator;\n    this.time = time;\n    this.type = type;\n    this.options = options;\n    this.value = this.type.make();\n    this.target = this.type.make();\n\n    this.queue = [];\n  }\n\n  dispose() {\n    return this.animator.unmake(this);\n  }\n\n  set() {\n    let { target } = this;\n    let value = arguments.length > 1 ? [].slice.call(arguments) : arguments[0];\n\n    let invalid = false;\n    value = this.type.validate(value, target, () => (invalid = true));\n    if (!invalid) {\n      target = value;\n    }\n\n    this.cancel();\n    this.target = this.value;\n    this.value = target;\n    return this.notify();\n  }\n\n  getTime() {\n    const { clock } = this.options;\n    const time = clock ? clock.getTime() : this.time;\n    if (this.options.realtime) {\n      return time.time;\n    } else {\n      return time.clock;\n    }\n  }\n\n  cancel(from) {\n    let stage;\n    if (from == null) {\n      from = this.getTime();\n    }\n    const { queue } = this;\n\n    const cancelled = (() => {\n      const result = [];\n      for (stage of Array.from(queue)) {\n        if (stage.end >= from) {\n          result.push(stage);\n        }\n      }\n      return result;\n    })();\n    this.queue = (() => {\n      const result1 = [];\n      for (stage of Array.from(queue)) {\n        if (stage.end < from) {\n          result1.push(stage);\n        }\n      }\n      return result1;\n    })();\n\n    for (stage of Array.from(cancelled)) {\n      if (typeof stage.complete === \"function\") {\n        stage.complete(false);\n      }\n    }\n    if (typeof this.options.complete === \"function\") {\n      this.options.complete(false);\n    }\n  }\n\n  notify() {\n    return typeof this.options.step === \"function\"\n      ? this.options.step(this.value)\n      : undefined;\n  }\n\n  immediate(value, options) {\n    const { duration, delay, ease, step, complete } = options;\n\n    const time = this.getTime();\n\n    const start = time + delay;\n    const end = start + duration;\n\n    let invalid = false;\n    let target = this.type.make();\n    value = this.type.validate(value, target, function () {\n      invalid = true;\n      return null;\n    });\n    if (value !== undefined && !invalid) {\n      target = value;\n    }\n\n    this.cancel(start);\n    return this.queue.push({\n      from: null,\n      to: target,\n      start,\n      end,\n      ease,\n      step,\n      complete,\n    });\n  }\n\n  update(time) {\n    this.time = time;\n    if (this.queue.length === 0) {\n      return true;\n    }\n\n    const clock = this.getTime();\n    let { value } = this;\n    const { queue } = this;\n\n    let active = false;\n    while (!active) {\n      const stage = queue[0];\n\n      let { from } = stage;\n      const { to, start, end, step, complete, ease } = stage;\n\n      if (from == null) {\n        from = stage.from = this.type.clone(this.value);\n      }\n\n      let f = Ease.clamp(\n        (clock - start) / Math.max(0.00001, end - start) || 0,\n        0,\n        1\n      );\n      if (f === 0) {\n        return;\n      } // delayed animation not yet active\n\n      const method = (() => {\n        switch (ease) {\n          case \"linear\":\n          case 0:\n            return null;\n          case \"cosine\":\n          case 1:\n            return Ease.cosine;\n          case \"binary\":\n          case 2:\n            return Ease.binary;\n          case \"hold\":\n          case 3:\n            return Ease.hold;\n          default:\n            return Ease.cosine;\n        }\n      })();\n      if (method != null) {\n        f = method(f);\n      }\n\n      active = f < 1;\n      value = active ? this.animator.lerp(this.type, from, to, f, value) : to;\n\n      //console.log 'animation step', f, from, to, value\n      if (typeof step === \"function\") {\n        step(value);\n      }\n\n      if (!active) {\n        if (typeof complete === \"function\") {\n          complete(true);\n        }\n        if (typeof this.options.complete === \"function\") {\n          this.options.complete(true);\n        }\n        queue.shift();\n        if (queue.length === 0) {\n          break;\n        } // end of queue\n      }\n    }\n\n    this.value = value;\n    return this.notify();\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS202: Simplify dynamic range loops\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport * as Pretty from \"../util/pretty.js\";\nimport * as ShaderGraph from \"shadergraph\";\n\nexport class API {\n  v2() {\n    return this;\n  }\n\n  constructor(_context, _up, _targets) {\n    this._context = _context;\n    this._up = _up;\n    this._targets = _targets;\n    const root = this._context.controller.getRoot();\n\n    if (this._targets == null) {\n      this._targets = [root];\n    }\n    this.isRoot = this._targets.length === 1 && this._targets[0] === root;\n    this.isLeaf =\n      this._targets.length === 1 && this._targets[0].children == null;\n\n    // Look like an array\n    for (let i = 0; i < this._targets.length; i++) {\n      const t = this._targets[i];\n      this[i] = t;\n    }\n    this.length = this._targets.length;\n\n    // Primitive factory. This is where all API methods are assigned.\n    for (const type of Array.from(this._context.controller.getTypes())) {\n      if (![\"root\"].includes(type)) {\n        this[type] = (options, binds) => this.add(type, options, binds);\n      }\n    }\n  }\n\n  select(selector) {\n    const targets = this._context.model.select(\n      selector,\n      !this.isRoot ? this._targets : null\n    );\n    return this._push(targets);\n  }\n\n  eq(index) {\n    if (this._targets.length > index) {\n      return this._push([this._targets[index]]);\n    }\n    return this._push([]);\n  }\n\n  filter(callback) {\n    if (typeof callback === \"string\") {\n      const matcher = this._context.model._matcher(callback);\n      callback = (x) => matcher(x);\n    }\n\n    return this._push(this._targets.filter(callback));\n  }\n\n  map(callback) {\n    return __range__(0, this.length, false).map((i) =>\n      callback(this[i], i, this)\n    );\n  }\n\n  each(callback) {\n    for (\n      let i = 0, end = this.length, asc = 0 <= end;\n      asc ? i < end : i > end;\n      asc ? i++ : i--\n    ) {\n      callback(this[i], i, this);\n    }\n    return this;\n  }\n\n  add(type, options, binds) {\n    // Make node/primitive\n    const { controller } = this._context;\n\n    // Auto-pop if targeting leaf\n    if (this.isLeaf) {\n      return this._pop().add(type, options, binds);\n    }\n\n    // Add to target\n    const nodes = [];\n    for (const target of this._targets) {\n      const node = controller.make(type, options, binds);\n      controller.add(node, target);\n      nodes.push(node);\n    }\n\n    // Return changed selection\n    return this._push(nodes);\n  }\n\n  remove(selector) {\n    if (selector) {\n      return this.select(selector).remove();\n    }\n    for (const target of Array.from(this._targets.slice().reverse())) {\n      this._context.controller.remove(target);\n    }\n    return this._pop();\n  }\n\n  set(key, value) {\n    for (const target of Array.from(this._targets)) {\n      this._context.controller.set(target, key, value);\n    }\n    return this;\n  }\n\n  getAll(key) {\n    return Array.from(this._targets).map((target) =>\n      this._context.controller.get(target, key)\n    );\n  }\n\n  get(key) {\n    return this._targets[0] != null ? this._targets[0].get(key) : undefined;\n  }\n\n  evaluate(key, time) {\n    return this._targets[0] != null\n      ? this._targets[0].evaluate(key, time)\n      : undefined;\n  }\n\n  bind(key, value) {\n    for (const target of Array.from(this._targets)) {\n      this._context.controller.bind(target, key, value);\n    }\n    return this;\n  }\n\n  unbind(key) {\n    for (const target of Array.from(this._targets)) {\n      this._context.controller.unbind(target, key);\n    }\n    return this;\n  }\n\n  end() {\n    return (this.isLeaf ? this._pop() : this)._pop();\n  }\n\n  _push(targets) {\n    return new API(this._context, this, targets);\n  }\n  _pop() {\n    return this._up != null ? this._up : this;\n  }\n  _reset() {\n    let left;\n    return (left = this._up != null ? this._up.reset() : undefined) != null\n      ? left\n      : this;\n  }\n\n  // TODO is this okay??\n  // eslint-disable-next-line no-dupe-class-members\n  map(callback) {\n    return this._targets.map(callback);\n  }\n\n  on() {\n    const args = arguments;\n    this._targets.map((x) => x.on.apply(x, args));\n    return this;\n  }\n\n  off() {\n    const args = arguments;\n    this._targets.map((x) => x.off.apply(x, args));\n    return this;\n  }\n\n  toString() {\n    const tags = this._targets.map((x) => x.toString());\n    if (this._targets.length > 1) {\n      return `[${tags.join(\", \")}]`;\n    } else {\n      return tags[0];\n    }\n  }\n\n  toMarkup() {\n    const tags = this._targets.map((x) => x.toMarkup());\n    return tags.join(\"\\n\\n\");\n  }\n\n  print() {\n    Pretty.print(this._targets.map((x) => x.toMarkup()).join(\"\\n\\n\"));\n    return this;\n  }\n\n  debug() {\n    const info = this.inspect();\n    console.log(\"Renderables: \", info.renderables);\n    console.log(\"Renders: \", info.renders);\n    console.log(\"Shaders: \", info.shaders);\n\n    const getName = (owner) =>\n      owner.constructor.toString().match(\"function +([^(]*)\")[1];\n\n    const shaders = [];\n    for (const shader of Array.from(info.shaders)) {\n      const name = getName(shader.owner);\n      shaders.push(`${name} - Vertex`);\n      shaders.push(shader.vertex);\n      shaders.push(`${name} - Fragment`);\n      shaders.push(shader.fragment);\n    }\n    return ShaderGraph.inspect(shaders);\n  }\n\n  inspect(selector, trait, print) {\n    let self;\n    if (typeof trait === \"boolean\") {\n      print = trait;\n      trait = null;\n    }\n    if (print == null) {\n      print = true;\n    }\n\n    // Recurse tree and extract all inserted renderables\n    const map = (node) =>\n      (node.controller != null ? node.controller.objects : undefined) != null\n        ? node.controller != null\n          ? node.controller.objects\n          : undefined\n        : [];\n    const recurse = (self = function (node, list) {\n      if (list == null) {\n        list = [];\n      }\n      if (!trait || node.traits.hash[trait]) {\n        list.push(map(node));\n      }\n      if (node.children != null) {\n        for (const child of Array.from(node.children)) {\n          self(child, list);\n        }\n      }\n      return list;\n    });\n\n    // Flatten arrays\n    const flatten = function (list) {\n      list = list.reduce((a, b) => a.concat(b), []);\n      return (list = list.filter((x, i) => x != null && list.indexOf(x) === i));\n    };\n\n    // Render descriptor\n    const make = function (renderable, render) {\n      const d = {};\n      d.owner = renderable;\n      d.geometry = render.geometry;\n      d.material = render.material;\n      d.vertex = render.userData.vertexGraph;\n      d.fragment = render.userData.fragmentGraph;\n      return d;\n    };\n\n    const info = {\n      nodes: this._targets.slice(),\n      renderables: [],\n      renders: [],\n      shaders: [],\n    };\n\n    // Inspect all targets\n    for (const target of Array.from(this._targets)) {\n      let renderables;\n      if (print) {\n        target.print(selector, \"info\");\n      }\n\n      const _info = {\n        renderables: (renderables = flatten(recurse(target))),\n        renders: flatten(renderables.map((x) => x.renders)),\n        shaders: flatten(\n          renderables.map((x) =>\n            x.renders != null ? x.renders.map((r) => make(x, r)) : undefined\n          )\n        ),\n      };\n\n      for (const k in _info) {\n        info[k] = info[k].concat(_info[k]);\n      }\n    }\n\n    return info;\n  }\n}\n\nfunction __range__(left, right, inclusive) {\n  const range = [];\n  const ascending = left < right;\n  const end = !inclusive ? right : ascending ? right + 1 : right - 1;\n  for (let i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {\n    range.push(i);\n  }\n  return range;\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nexport class Controller {\n  constructor(model, primitives) {\n    this.model = model;\n    this.primitives = primitives;\n  }\n\n  getRoot() {\n    return this.model.getRoot();\n  }\n\n  getTypes() {\n    return this.primitives.getTypes();\n  }\n\n  make(type, options, binds) {\n    return this.primitives.make(type, options, binds);\n  }\n\n  get(node, key) {\n    return node.get(key);\n  }\n\n  set(node, key, value) {\n    try {\n      return node.set(key, value);\n    } catch (e) {\n      node.print(null, \"warn\");\n      return console.error(e);\n    }\n  }\n\n  bind(node, key, expr) {\n    try {\n      return node.bind(key, expr);\n    } catch (e) {\n      node.print(null, \"warn\");\n      return console.error(e);\n    }\n  }\n\n  unbind(node, key) {\n    try {\n      return node.unbind(key);\n    } catch (e) {\n      node.print(null, \"warn\");\n      return console.error(e);\n    }\n  }\n\n  add(node, target) {\n    if (target == null) {\n      target = this.model.getRoot();\n    }\n    return target.add(node);\n  }\n\n  remove(node) {\n    const target = node.parent;\n    if (target) {\n      return target.remove(node);\n    }\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\nexport * from \"./animator.js\";\nexport * from \"./api.js\";\nexport * from \"./controller.js\";\n","import * as axis from \"./axis.js\";\nimport * as data from \"./data.js\";\nimport * as ease from \"./ease.js\";\nimport * as glsl from \"./glsl.js\";\nimport * as js from \"./js.js\";\nimport * as pretty from \"./pretty.js\";\nimport * as three from \"./three.js\";\nimport * as ticks from \"./ticks.js\";\nimport * as vdom from \"./vdom.js\";\n\nexport const Axis = axis;\nexport const Data = data;\nexport const Ease = ease;\nexport const GLSL = glsl;\nexport const JS = js;\nexport const Pretty = pretty;\nexport const Three = three;\nexport const Ticks = ticks;\nexport const VDOM = vdom;\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as Model from \"./model\";\nimport * as Overlay from \"./overlay\";\nimport * as Primitives from \"./primitives\";\nimport * as Render from \"./render\";\nimport * as Shaders from \"./shaders\";\nimport * as Stage from \"./stage\";\nimport * as Util from \"./util\";\n\nimport { PerspectiveCamera } from \"three/src/cameras/PerspectiveCamera.js\";\n\nexport class Context {\n  static initClass() {\n    // Export for extending. TODO what is the story here, what is this syntax?\n    this.Namespace = {\n      Model,\n      Overlay,\n      Primitives,\n      Render,\n      Shaders,\n      Stage,\n      Util,\n      DOM: Util.VDOM,\n    };\n  }\n\n  //-------------------------------------------------------------------\n\n  // Set up entire environment\n  constructor(renderer, scene = null, camera = null) {\n    // DOM container\n    let canvas;\n    this.canvas = canvas = renderer.domElement;\n    this.element = null;\n\n    // Rendering factory\n    this.shaders = Shaders.Factory(Shaders.Snippets);\n\n    this.renderables = new Render.Factory(\n      Render.Classes,\n      renderer,\n      this.shaders\n    );\n    this.overlays = new Overlay.Factory(Overlay.Classes, canvas);\n\n    this.scene = this.renderables.make(\"scene\", { scene });\n    this.camera = this.defaultCamera =\n      camera != null ? camera : new PerspectiveCamera();\n\n    // Primitives factory\n    this.attributes = new Model.Attributes(Primitives.Types, this);\n    this.primitives = new Primitives.Factory(Primitives.Types, this);\n\n    this.root = this.primitives.make(\"root\");\n\n    // Document model\n    this.model = new Model.Model(this.root);\n    this.guard = new Model.Guard();\n\n    // Scene controllers\n    this.controller = new Stage.Controller(this.model, this.primitives);\n    this.animator = new Stage.Animator(this);\n\n    // Public API\n    this.api = new Stage.API(this);\n\n    // Global clocks, one real-time and one adjustable\n    this.speed = 1;\n    this.time = {\n      now: +new Date() / 1000,\n      time: 0,\n      delta: 0,\n      clock: 0,\n      step: 0,\n    };\n  }\n\n  //-------------------------------------------------------------------\n  // Lifecycle\n\n  init() {\n    this.scene.inject();\n    this.overlays.inject();\n    return this;\n  }\n\n  destroy() {\n    this.scene.unject();\n    this.overlays.unject();\n    return this;\n  }\n\n  resize(size) {\n    /*\n    {\n      viewWidth, viewHeight, renderWidth, renderHeight, aspect, pixelRatio\n    }\n    */\n    if (size == null) {\n      size = {};\n    }\n    if (size.renderWidth == null) {\n      size.renderWidth =\n        size.viewWidth != null ? size.viewWidth : (size.viewWidth = 1280);\n    }\n    if (size.renderHeight == null) {\n      size.renderHeight =\n        size.viewHeight != null ? size.viewHeight : (size.viewHeight = 720);\n    }\n    if (size.pixelRatio == null) {\n      size.pixelRatio = size.renderWidth / Math.max(0.000001, size.viewWidth);\n    }\n    if (size.aspect == null) {\n      size.aspect = size.viewWidth / Math.max(0.000001, size.viewHeight);\n    }\n\n    this.root.controller.resize(size);\n    return this;\n  }\n\n  frame(time) {\n    /*\n    {\n      now, clock, step\n    }\n    */\n    this.pre(time);\n    this.update();\n    this.render();\n    this.post();\n    return this;\n  }\n\n  //-------------------------------------------------------------------\n  // Broken down update/render cycle, for manual scheduling/invocation\n\n  pre(time) {\n    if (!time) {\n      time = {\n        now: +new Date() / 1000,\n        time: 0,\n        delta: 0,\n        clock: 0,\n        step: 0,\n      };\n\n      time.delta = this.time.now != null ? time.now - this.time.now : 0;\n\n      // Check for stopped render loop, assume 1 60fps frame\n      if (time.delta > 1) {\n        time.delta = 1 / 60;\n      }\n\n      time.step = time.delta * this.speed;\n      time.time = this.time.time + time.delta;\n      time.clock = this.time.clock + time.step;\n    }\n\n    this.time = time;\n    if (typeof this.root.controller.pre === \"function\") {\n      this.root.controller.pre();\n    }\n    return this;\n  }\n\n  update() {\n    this.animator.update();\n    this.attributes.compute();\n\n    this.guard.iterate({\n      step: () => {\n        let change = this.attributes.digest();\n        return change || (change = this.model.digest());\n      },\n      last() {\n        return {\n          attribute: this.attributes.getLastTrigger(),\n          model: this.model.getLastTrigger(),\n        };\n      },\n    });\n\n    if (typeof this.root.controller.update === \"function\") {\n      this.root.controller.update();\n    }\n\n    this.camera = this.root.controller.getCamera();\n    this.speed = this.root.controller.getSpeed();\n\n    return this;\n  }\n\n  render() {\n    if (typeof this.root.controller.render === \"function\") {\n      this.root.controller.render();\n    }\n    this.scene.render();\n\n    return this;\n  }\n\n  post() {\n    if (typeof this.root.controller.post === \"function\") {\n      this.root.controller.post();\n    }\n    return this;\n  }\n\n  //-------------------------------------------------------------------\n  // Warmup mode, inserts only n objects into the scene per frame\n  // Will render objects to offscreen 1x1 buffer to ensure shader is compiled even if invisible\n  setWarmup(n) {\n    this.scene.warmup(n);\n    return this;\n  }\n\n  getPending() {\n    return this.scene.pending.length;\n  }\n}\nContext.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport \"./splash.js\";\n\n// NOTE this import triggers the installation of all plugins as a side effect.\nimport \"threestrap\";\n\nimport * as model from \"./model\";\nimport * as overlay from \"./overlay\";\nimport * as primitives from \"./primitives\";\nimport * as render from \"./render\";\nimport * as shaders from \"./shaders\";\nimport * as stage from \"./stage\";\nimport * as util from \"./util\";\n\nimport { Bootstrap } from \"threestrap/src/bootstrap.js\";\nimport { Context as ctx } from \"./context.js\";\n\nexport const version = \"2.1.1\";\n\n// Just because\nexport const π = Math.PI;\nexport const τ = π * 2;\nexport const e = Math.E;\nexport const Context = ctx;\nexport const Model = model;\nexport const Overlay = overlay;\nexport const Primitives = primitives;\nexport const Render = render;\nexport const Shaders = shaders;\nexport const Stage = stage;\nexport const Util = util;\nexport const DOM = util.VDOM;\n\nexport const mathBox = function (options) {\n  const three = new Bootstrap(options);\n\n  if (!three.fallback) {\n    if (!three.Time) {\n      three.install(\"time\");\n    }\n    if (!three.MathBox) {\n      three.install([\"mathbox\", \"splash\"]);\n    }\n  }\n\n  return three.mathbox != null ? three.mathbox : three;\n};\n\n// Load context and export namespace\n// TODO suspicious... how can I export??\n// for (let k in Context.Namespace) {\n//   const v = Context.Namespace[k];\n//   exports[k] = v;\n// }\n\n// Threestrap plugin\nBootstrap.registerPlugin(\"mathbox\", {\n  defaults: {\n    init: true,\n    warmup: 2,\n    inspect: true,\n    splash: true,\n  },\n\n  listen: [\"ready\", \"pre\", \"update\", \"post\", \"resize\"],\n\n  // Install meta-API\n  install(three) {\n    let inited = false;\n    this.first = true;\n\n    return (three.MathBox = {\n      // Init the mathbox context\n      init: (options) => {\n        if (inited) {\n          return;\n        }\n        inited = true;\n\n        const scene =\n          (options != null ? options.scene : undefined) ||\n          this.options.scene ||\n          three.scene;\n        const camera =\n          (options != null ? options.camera : undefined) ||\n          this.options.camera ||\n          three.camera;\n\n        this.context = new Context(three.renderer, scene, camera);\n\n        // Enable handy destructuring\n        this.context.api.three = three.three = three;\n        this.context.api.mathbox = three.mathbox = this.context.api;\n\n        // v1 compatibility\n        this.context.api.start = () => three.Loop.start();\n        this.context.api.stop = () => three.Loop.stop();\n\n        // Initialize and set initial size\n        this.context.init();\n        this.context.resize(three.Size);\n\n        // Set warmup mode and track pending objects\n        this.context.setWarmup(this.options.warmup);\n        this.pending = 0;\n        this.warm = !this.options.warmup;\n\n        console.log(\"MathBox²\", version);\n        three.trigger({\n          type: \"mathbox/init\",\n          version: version,\n          context: this.context,\n        });\n      },\n\n      // Destroy the mathbox context\n      destroy: () => {\n        if (!inited) {\n          return;\n        }\n        inited = false;\n\n        three.trigger({ type: \"mathbox/destroy\", context: this.context });\n\n        this.context.destroy();\n\n        delete three.mathbox;\n        delete this.context.api.three;\n        delete this.context;\n      },\n\n      object: () =>\n        this.context != null ? this.context.scene.root : undefined,\n    });\n  },\n\n  uninstall(three) {\n    three.MathBox.destroy();\n    delete three.MathBox;\n  },\n\n  // Ready event: right before mathbox() / THREE.bootstrap() returns\n  ready(event, three) {\n    if (this.options.init) {\n      three.MathBox.init();\n\n      return setTimeout(() => {\n        if (this.options.inspect) {\n          return this.inspect(three);\n        }\n      });\n    }\n  },\n\n  // Log scene for inspection\n  inspect(three) {\n    this.context.api.inspect();\n    if (!this.options.warmup) {\n      return this.info(three);\n    }\n  },\n\n  info(three) {\n    const fmt = function (x) {\n      const out = [];\n      while (x >= 1000) {\n        out.unshift((\"000\" + (x % 1000)).slice(-3));\n        x = Math.floor(x / 1000);\n      }\n      out.unshift(x);\n      return out.join(\",\");\n    };\n\n    const info = three.renderer.info.render;\n    console.log(\n      \"Geometry  \",\n      fmt(info.triangles) + \" triangles  \",\n      fmt(info.points) + \" points  \",\n      fmt(info.lines) + \" lines  \",\n      fmt(info.calls) + \" draw calls  \"\n    );\n  },\n\n  // Hook up context events\n  resize(event, three) {\n    return this.context != null ? this.context.resize(three.Size) : undefined;\n  },\n\n  pre(event, three) {\n    return this.context != null ? this.context.pre(three.Time) : undefined;\n  },\n\n  update(event, three) {\n    let camera;\n    if (this.context != null) {\n      this.context.update();\n    }\n\n    if (\n      (camera = this.context != null ? this.context.camera : undefined) &&\n      camera !== three.camera\n    ) {\n      three.camera = camera;\n    }\n\n    three.Time.set({ speed: this.context.speed });\n\n    this.progress(this.context.getPending(), three);\n\n    // Call render here instead of on:render because it renders off screen material\n    // that needs to be available for rendering the actual frame.\n    return this.context != null ? this.context.render() : undefined;\n  },\n\n  post(_event, _three) {\n    return this.context != null ? this.context.post() : undefined;\n  },\n\n  // Warmup progress changed\n  progress(remain, three) {\n    if (!remain && !this.pending) {\n      return;\n    }\n\n    // Latch max value until queue is emptied to get a total\n    let pending = Math.max(remain + this.options.warmup, this.pending);\n\n    // Send events for external progress reporting\n    const current = pending - remain;\n    const total = pending;\n    three.trigger({\n      type: \"mathbox/progress\",\n      current: pending - remain,\n      total: pending,\n    });\n\n    if (remain === 0) {\n      pending = 0;\n    }\n    this.pending = pending;\n\n    // Report once when loaded\n    if (current === total && !this.warm) {\n      this.warm = true;\n      if (this.options.inspect) {\n        this.info(three);\n      }\n    }\n  },\n});\n"],"names":[],"sourceRoot":""}
\ No newline at end of file
diff --git a/build/mathbox.css b/build/mathbox.css
new file mode 100644
index 0000000000000000000000000000000000000000..637c27c9d4b0c66000cfe62de907fab667029256
--- /dev/null
+++ b/build/mathbox.css
@@ -0,0 +1,414 @@
+.shadergraph-graph {
+  font: 12px sans-serif;
+  line-height: 25px;
+  position: relative;
+}
+.shadergraph-graph:after {
+  content: " ";
+  display: block;
+  height: 0;
+  font-size: 0;
+  clear: both;
+}
+.shadergraph-graph svg {
+  pointer-events: none;
+}
+.shadergraph-clear {
+  clear: both;
+}
+.shadergraph-graph svg {
+  position: absolute;
+  left: 0;
+  right: 0;
+  top: 0;
+  bottom: 0;
+  width: auto;
+  height: auto;
+}
+.shadergraph-column {
+  float: left;
+}
+.shadergraph-node .shadergraph-graph {
+  float: left;
+  clear: both;
+  overflow: visible;
+}
+.shadergraph-node .shadergraph-graph .shadergraph-node {
+  margin: 5px 15px 15px;
+}
+.shadergraph-node {
+  margin: 5px 15px 25px;
+  background: rgba(0, 0, 0, 0.1);
+  border-radius: 5px;
+  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2), 0 1px 10px rgba(0, 0, 0, 0.2);
+  min-height: 35px;
+  float: left;
+  clear: left;
+  position: relative;
+}
+.shadergraph-type {
+  font-weight: bold;
+}
+.shadergraph-header {
+  font-weight: bold;
+  text-align: center;
+  height: 25px;
+  background: rgba(0, 0, 0, 0.3);
+  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.25);
+  color: #fff;
+  border-top-left-radius: 5px;
+  border-top-right-radius: 5px;
+  margin-bottom: 5px;
+  padding: 0 10px;
+}
+.shadergraph-outlet div {
+}
+.shadergraph-outlet-in .shadergraph-name {
+  margin-right: 7px;
+}
+.shadergraph-outlet-out .shadergraph-name {
+  margin-left: 7px;
+}
+
+.shadergraph-name {
+  margin: 0 4px;
+}
+.shadergraph-point {
+  margin: 6px;
+  width: 11px;
+  height: 11px;
+  border-radius: 7.5px;
+  background: rgba(255, 255, 255, 1);
+}
+.shadergraph-outlet-in {
+  float: left;
+  clear: left;
+}
+.shadergraph-outlet-in div {
+  float: left;
+}
+.shadergraph-outlet-out {
+  float: right;
+  clear: right;
+}
+.shadergraph-outlet-out div {
+  float: right;
+}
+
+.shadergraph-node-callback {
+  background: rgba(205, 209, 221, 0.5);
+  box-shadow: 0 1px 2px rgba(0, 10, 40, 0.2), 0 1px 10px rgba(0, 10, 40, 0.2);
+}
+.shadergraph-node-callback > .shadergraph-header {
+  background: rgba(0, 20, 80, 0.3);
+}
+.shadergraph-graph .shadergraph-graph .shadergraph-node-callback {
+  background: rgba(0, 20, 80, 0.1);
+}
+
+.shadergraph-node-call {
+  background: rgba(209, 221, 205, 0.5);
+  box-shadow: 0 1px 2px rgba(10, 40, 0, 0.2), 0 1px 10px rgba(10, 40, 0, 0.2);
+}
+.shadergraph-node-call > .shadergraph-header {
+  background: rgba(20, 80, 0, 0.3);
+}
+.shadergraph-graph .shadergraph-graph .shadergraph-node-call {
+  background: rgba(20, 80, 0, 0.1);
+}
+
+.shadergraph-node-isolate {
+  background: rgba(221, 205, 209, 0.5);
+  box-shadow: 0 1px 2px rgba(40, 0, 10, 0.2), 0 1px 10px rgba(40, 0, 10, 0.2);
+}
+.shadergraph-node-isolate > .shadergraph-header {
+  background: rgba(80, 0, 20, 0.3);
+}
+.shadergraph-graph .shadergraph-graph .shadergraph-node-isolate {
+  background: rgba(80, 0, 20, 0.1);
+}
+
+.shadergraph-node.shadergraph-has-code {
+  cursor: pointer;
+}
+.shadergraph-node.shadergraph-has-code::before {
+  position: absolute;
+  content: " ";
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  display: none;
+  border: 2px solid rgba(0, 0, 0, 0.25);
+  border-radius: 5px;
+}
+.shadergraph-node.shadergraph-has-code:hover::before {
+  display: block;
+}
+.shadergraph-code {
+  z-index: 10000;
+  display: none;
+  position: absolute;
+  background: #fff;
+  color: #000;
+  white-space: pre;
+  padding: 10px;
+  border-radius: 5px;
+  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2), 0 1px 10px rgba(0, 0, 0, 0.2);
+  font-family: monospace;
+  font-size: 10px;
+  line-height: 12px;
+}
+
+.shadergraph-overlay {
+  position: fixed;
+  top: 50%;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  background: #fff;
+  border-top: 1px solid #ccc;
+}
+.shadergraph-overlay .shadergraph-view {
+  position: absolute;
+  left: 0;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  overflow: auto;
+}
+.shadergraph-overlay .shadergraph-inside {
+  width: 4000px;
+  min-height: 100%;
+  box-sizing: border-box;
+}
+.shadergraph-overlay .shadergraph-close {
+  position: absolute;
+  top: 5px;
+  right: 5px;
+  padding: 4px;
+  border-radius: 16px;
+  background: rgba(255, 255, 255, 0.3);
+  color: rgba(0, 0, 0, 0.3);
+  cursor: pointer;
+  font-size: 24px;
+  line-height: 24px;
+  width: 24px;
+  text-align: center;
+  vertical-align: middle;
+}
+.shadergraph-overlay .shadergraph-close:hover {
+  background: rgba(255, 255, 255, 1);
+  color: rgba(0, 0, 0, 1);
+}
+.shadergraph-overlay .shadergraph-graph {
+  padding-top: 10px;
+  overflow: visible;
+  min-height: 100%;
+}
+.shadergraph-overlay span {
+  display: block;
+  padding: 5px 15px;
+  margin: 0;
+  background: rgba(0, 0, 0, 0.1);
+  font-weight: bold;
+  font-family: sans-serif;
+}
+
+.mathbox-loader {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  -webkit-transform: translate(-50%, -50%);
+  transform: translate(-50%, -50%);
+  padding: 10px;
+  border-radius: 50%;
+  background: #fff;
+}
+
+.mathbox-loader.mathbox-exit {
+  opacity: 0;
+  -webkit-transition: opacity 0.15s ease-in-out;
+  transition: opacity 0.15s ease-in-out;
+}
+
+.mathbox-progress {
+  height: 10px;
+  border-radius: 5px;
+  width: 80px;
+  margin: 0 auto 20px;
+  box-shadow: 1px 1px 1px rgba(255, 255, 255, 0.2),
+    1px -1px 1px rgba(255, 255, 255, 0.2), -1px 1px 1px rgba(255, 255, 255, 0.2),
+    -1px -1px 1px rgba(255, 255, 255, 0.2);
+  background: #ccc;
+  overflow: hidden;
+}
+
+.mathbox-progress > div {
+  display: block;
+  width: 0px;
+  height: 10px;
+  background: #888;
+}
+
+.mathbox-logo {
+  position: relative;
+  width: 140px;
+  height: 100px;
+  margin: 0 auto 10px;
+  -webkit-perspective: 200px;
+  perspective: 200px;
+}
+
+.mathbox-logo > div {
+  position: absolute;
+  left: 0;
+  top: 0;
+  bottom: 0;
+  right: 0;
+  -webkit-transform-style: preserve-3d;
+  transform-style: preserve-3d;
+}
+
+.mathbox-logo > :nth-child(1) {
+  -webkit-transform: rotateZ(22deg) rotateX(24deg) rotateY(30deg);
+  transform: rotateZ(22deg) rotateX(24deg) rotateY(30deg);
+}
+
+.mathbox-logo > :nth-child(2) {
+  -webkit-transform: rotateZ(11deg) rotateX(12deg) rotateY(15deg)
+    scale3d(0.6, 0.6, 0.6);
+  transform: rotateZ(11deg) rotateX(12deg) rotateY(15deg) scale3d(0.6, 0.6, 0.6);
+}
+
+.mathbox-logo > div > div {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  margin-left: -100px;
+  margin-top: -100px;
+  width: 200px;
+  height: 200px;
+  box-sizing: border-box;
+  border-radius: 50%;
+}
+
+.mathbox-logo > div > :nth-child(1) {
+  -webkit-transform: scale(0.5, 0.5);
+  transform: rotateX(30deg) scale(0.5, 0.5);
+}
+
+.mathbox-logo > div > :nth-child(2) {
+  -webkit-transform: rotateX(90deg) scale(0.42, 0.42);
+  transform: rotateX(90deg) scale(0.42, 0.42);
+}
+
+.mathbox-logo > div > :nth-child(3) {
+  -webkit-transform: rotateY(90deg) scale(0.35, 0.35);
+  transform: rotateY(90deg) scale(0.35, 0.35);
+}
+
+.mathbox-logo > :nth-child(1) > :nth-child(1) {
+  border: 16px solid #808080;
+}
+.mathbox-logo > :nth-child(1) > :nth-child(2) {
+  border: 19px solid #a0a0a0;
+}
+.mathbox-logo > :nth-child(1) > :nth-child(3) {
+  border: 23px solid #c0c0c0;
+}
+.mathbox-logo > :nth-child(2) > :nth-child(1) {
+  border: 27px solid #808080;
+}
+.mathbox-logo > :nth-child(2) > :nth-child(2) {
+  border: 32px solid #a0a0a0;
+}
+.mathbox-logo > :nth-child(2) > :nth-child(3) {
+  border: 38px solid #c0c0c0;
+}
+
+.mathbox-splash-blue .mathbox-progress {
+  background: #def;
+}
+.mathbox-splash-blue .mathbox-progress > div {
+  background: #1979e7;
+}
+.mathbox-splash-blue .mathbox-logo > :nth-child(1) > :nth-child(1) {
+  border-color: #1979e7;
+}
+.mathbox-splash-blue .mathbox-logo > :nth-child(1) > :nth-child(2) {
+  border-color: #33b0ff;
+}
+.mathbox-splash-blue .mathbox-logo > :nth-child(1) > :nth-child(3) {
+  border-color: #75eaff;
+}
+.mathbox-splash-blue .mathbox-logo > :nth-child(2) > :nth-child(1) {
+  border-color: #18487f;
+}
+.mathbox-splash-blue .mathbox-logo > :nth-child(2) > :nth-child(2) {
+  border-color: #33b0ff;
+}
+.mathbox-splash-blue .mathbox-logo > :nth-child(2) > :nth-child(3) {
+  border-color: #75eaff;
+}
+
+.mathbox-overlays {
+  position: absolute;
+  left: 0;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  pointer-events: none;
+  transform-style: preserve-3d;
+  overflow: hidden;
+}
+.mathbox-overlays > div {
+  transform-style: preserve-3d;
+}
+.mathbox-overlay > div {
+  position: absolute;
+  will-change: transform, opacity;
+}
+.mathbox-label {
+  font-family: sans-serif;
+}
+.mathbox-outline-1 {
+  text-shadow: -1px -1px 0px rgb(255, 255, 255), 1px 1px 0px rgb(255, 255, 255),
+    -1px 1px 0px rgb(255, 255, 255), 1px -1px 0px rgb(255, 255, 255),
+    1px 0px 1px rgb(255, 255, 255), -1px 0px 1px rgb(255, 255, 255),
+    0px -1px 1px rgb(255, 255, 255), 0px 1px 1px rgb(255, 255, 255);
+}
+.mathbox-outline-2 {
+  text-shadow: 0px -2px 0px rgb(255, 255, 255), 0px 2px 0px rgb(255, 255, 255),
+    -2px 0px 0px rgb(255, 255, 255), 2px 0px 0px rgb(255, 255, 255),
+    -1px -2px 0px rgb(255, 255, 255), -2px -1px 0px rgb(255, 255, 255),
+    -1px 2px 0px rgb(255, 255, 255), -2px 1px 0px rgb(255, 255, 255),
+    1px 2px 0px rgb(255, 255, 255), 2px 1px 0px rgb(255, 255, 255),
+    1px -2px 0px rgb(255, 255, 255), 2px -1px 0px rgb(255, 255, 255);
+}
+.mathbox-outline-3 {
+  text-shadow: 3px 0px 0px rgb(255, 255, 255), -3px 0px 0px rgb(255, 255, 255),
+    0px 3px 0px rgb(255, 255, 255), 0px -3px 0px rgb(255, 255, 255),
+    -2px -2px 0px rgb(255, 255, 255), -2px 2px 0px rgb(255, 255, 255),
+    2px 2px 0px rgb(255, 255, 255), 2px -2px 0px rgb(255, 255, 255),
+    -1px -2px 1px rgb(255, 255, 255), -2px -1px 1px rgb(255, 255, 255),
+    -1px 2px 1px rgb(255, 255, 255), -2px 1px 1px rgb(255, 255, 255),
+    1px 2px 1px rgb(255, 255, 255), 2px 1px 1px rgb(255, 255, 255),
+    1px -2px 1px rgb(255, 255, 255), 2px -1px 1px rgb(255, 255, 255);
+}
+.mathbox-outline-4 {
+  text-shadow: 4px 0px 0px rgb(255, 255, 255), -4px 0px 0px rgb(255, 255, 255),
+    0px 4px 0px rgb(255, 255, 255), 0px -4px 0px rgb(255, 255, 255),
+    -3px -2px 0px rgb(255, 255, 255), -3px 2px 0px rgb(255, 255, 255),
+    3px 2px 0px rgb(255, 255, 255), 3px -2px 0px rgb(255, 255, 255),
+    -2px -3px 0px rgb(255, 255, 255), -2px 3px 0px rgb(255, 255, 255),
+    2px 3px 0px rgb(255, 255, 255), 2px -3px 0px rgb(255, 255, 255),
+    -1px -2px 1px rgb(255, 255, 255), -2px -1px 1px rgb(255, 255, 255),
+    -1px 2px 1px rgb(255, 255, 255), -2px 1px 1px rgb(255, 255, 255),
+    1px 2px 1px rgb(255, 255, 255), 2px 1px 1px rgb(255, 255, 255),
+    1px -2px 1px rgb(255, 255, 255), 2px -1px 1px rgb(255, 255, 255);
+}
+.mathbox-outline-fill,
+.mathbox-outline-fill * {
+  color: #fff !important;
+}
diff --git a/build/mathbox.min.js b/build/mathbox.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..90c8d4a7d3768b8e95a498f76ef7d8c4f5b064cf
--- /dev/null
+++ b/build/mathbox.min.js
@@ -0,0 +1,2 @@
+!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e(require("THREE")):"function"==typeof define&&define.amd?define("MathBox",["THREE"],e):"object"==typeof exports?exports.MathBox=e(require("THREE")):t.MathBox=e(t.THREE)}(self,(function(t){return(()=>{var e={3036:(t,e,n)=>{var i=n(8805);t.exports=function(t){for(var e=i(),n=0;n<t.length;n++)e(t[n]);return e(null)}},3837:t=>{let e,n,i,r;const s={nud:function(){return this.children&&this.children.length?this:g("unexpected")()},led:g("missing operator")},a={};function o(){return this}function l(t,e){let n=a[t];return e=e||0,n?e>n.lbp&&(n.lbp=e):(n=Object.create(s),n.id=t,n.lbp=e,a[t]=n),n}function h(t){let e,i=n;for(m(),e=i.nud();t<n.lbp;)i=n,m(),e=i.led(e);return e}function c(t,e,n){l(t,e).led=n||function(t){return this.children=[t,h(e)],this.type="binary",this}}function u(t,e,n){const i=l(t,e);return i.led=n||function(t){return this.children=[t,h(e-1)],this.type="binary",this},i}function d(t,e){const n=l(t);return n.nud=e||function(){return this.children=[h(70)],this.type="unary",this},n}function p(t){l(t,150).led=function(t){return this.children=[t],this.type="suffix",this}}function f(t){return u(t,10,(function(t){return this.children=[t,h(9)],this.assignment=!0,this.type="assign",this}))}function m(t){let s,l,h,c;if(t&&n.data!==t)return e.unexpected("expected `"+t+"`, got `"+n.data+"`");if(!(r>=i.length)){if(s=i[r++],l=s.data,h=s.type,"ident"===h)c=e.scope.find(l)||e.create_node(),h=c.type;else if("builtin"===h)c=a["(builtin)"];else if("keyword"===h)c=a["(keyword)"];else if("operator"===h){if(c=a[l],!c)return e.unexpected("unknown operator `"+l+"`")}else{if("float"!==h&&"integer"!==h)return e.unexpected("unexpected token.");h="literal",c=a["(literal)"]}return c&&(c.nud||(c.nud=o),c.children||(c.children=[])),c=Object.create(c),c.token=s,c.type=h,c.data||(c.data=l),n=c}n=a["(end)"]}function g(t){return function(){return e.unexpected(t)}}l("(ident)").nud=o,l("(keyword)").nud=o,l("(builtin)").nud=o,l("(literal)").nud=o,l("(end)"),l(":"),l(";"),l(","),l(")"),l("]"),l("}"),u("&&",30),u("||",30),c("|",43),c("^",44),c("&",45),c("==",46),c("!=",46),c("<",47),c("<=",47),c(">",47),c(">=",47),c(">>",48),c("<<",48),c("+",50),c("-",50),c("*",60),c("/",60),c("%",60),c("?",20,(function(t){return this.children=[t,h(0),(m(":"),h(0))],this.type="ternary",this})),c(".",80,(function(t){return n.type="literal",e.fake(n),this.children=[t,n],m(),this})),c("[",80,(function(t){return this.children=[t,h(0)],this.type="binary",m("]"),this})),c("(",80,(function(t){if(this.children=[t],this.type="call",")"!==n.data)for(;this.children.push(h(0)),","===n.data;)m(",");return m(")"),this})),d("-"),d("+"),d("!"),d("~"),d("defined"),d("(",(function(){return this.type="group",this.children=[h(0)],m(")"),this})),d("++"),d("--"),p("++"),p("--"),f("="),f("+="),f("-="),f("*="),f("/="),f("%="),f("&="),f("|="),f("^="),f(">>="),f("<<="),t.exports=function(t,n){let s;if(e=t,i=n,r=0,i.length){if(m(),s=h(0),s.parent=e[0],function t(n){e.unshift(n,!1);for(let e=0,i=n.children.length;e<i;++e)t(n.children[e]);e.shift()}(s),r<i.length)throw new Error("did not use all tokens");s.parent.children=[s]}}},8805:(t,e,n)=>{t.exports=function(){const t=At(h),e=At(l),n=At(f),a=At(_),y=At(o),b=(At(S),At(u)),L=At(d),F=At(m),U=At(v),B=At(g),V=At(M),H=At(C),G=At(D);let j,q,W,X,Y,$,Z,K,J,Q,tt,et,nt,it=arguments.length?[].slice.call(arguments):[],rt=!1,st=!1,at=[],ot=[],lt=[],ht=[],ct=!1;return at.shift=vt,at.unshift=gt,at.fake=mt,at.unexpected=Lt,at.scope=new r(at),at.create_node=function(){const t=z(o,et);return t.parent=ut.program,t},Gt(),nt=t(),nt.expecting="(eof)",nt.mode=h,nt.token={type:"(program)",data:"(program)"},tt=nt,ut.program=tt,ut.scope=function(t){return 1===arguments.length&&(at.scope=t),at.scope},at.unshift(nt),ut;function ut(t){return null===t?(pt(),tt):(ot=[],dt(t),ot)}function dt(t){if("whitespace"!==t.type&&"line-comment"!==t.type&&"block-comment"!==t.type)for(lt.push(t),et=et||lt[0],et&&ht.length&&(et.preceding=et.preceding||[],et.preceding=et.preceding.concat(ht),ht=[]);ft();)switch(at[0].mode){case l:_t();break;case h:xt();break;case p:bt();break;case f:wt();break;case x:Et();break;case c:j(!0,!0);break;case _:q();break;case o:Tt();break;case w:Mt();break;case S:St();break;case u:J();break;case d:Q();break;case m:X();break;case g:Z();break;case C:K();break;case M:$();break;case v:Y();break;case D:W()}else ht.push(t)}function pt(t){arguments.length&&dt(t),at.length>1?Lt("unexpected EOF"):rt=!0}function ft(){return!(ct||!at.length)&&(et=lt[0])}function mt(t){at.unshift(t),at.shift()}function gt(t,e){t.parent=at[0];const n=[].unshift.call(this,t);return(e=void 0===e||e)&&nt!==t&&nt.children.push(t),nt=t,n}function vt(){let t=[].shift.call(this),e=it[this.length],n=!1;return it.length?"function"==typeof it[0]?n=it[0](t):void 0!==e&&(n=e.test?e.test(t.type):e===t.type):n=!0,n&&!ct&&ot.push(t),nt=t.parent,t}function xt(){return It((function(){return at.scope.enter(),s}),(function(){if(et.data===at[0].expecting)return at.scope.exit(),at.shift();if("preprocessor"===et.type)return at.fake(Ct()),void lt.shift();return void at.unshift(e())}))()}function _t(){if(at[0].brace)return"}"!==et.data?Lt("expected `}`, got "+et.data):(at[0].brace=!1,lt.shift(),at.shift());switch(et.type){case"eof":return yt();case"keyword":switch(et.data){case"for":return at.unshift(F());case"if":return at.unshift(U());case"while":return at.unshift(B());case"do":return at.unshift(H());case"break":return at.fake(z(T,et)),lt.shift();case"continue":return at.fake(z(E,et)),lt.shift();case"discard":return at.fake(z(A,et)),lt.shift();case"return":return at.unshift(V());case"precision":return at.unshift(a())}return at.unshift(Rt(k));case"ident":var e;if(e=at.scope.find(et.data))return"struct"===e.parent.type?at.unshift(Rt(k)):at.unshift(kt(";"));case"operator":if("{"===et.data){at[0].brace=!0;const e=t();return e.expecting="}",lt.shift(),at.unshift(e)}if(";"===et.data)return lt.shift(),at.shift();default:return at.unshift(kt(";"))}}function yt(){return st&&(ct=!0),st=!0,at.shift()}function bt(){const t=at[0];return It((function(){return"invariant"===et.data?8&t.flags?(at.unshift(Pt()),s):Lt("`invariant` is not allowed here"):(at.fake(z(R,{data:"",position:et.position})),s)}),(function(){return O(et)?16&t.flags?(at.unshift(Pt()),s):Lt("storage is not allowed here"):(at.fake(z(R,{data:"",position:et.position})),s)}),(function(){return I(et)?32&t.flags?Lt("parameter is not allowed here"):(at.unshift(Pt()),s):(at.fake(z(R,{data:"",position:et.position})),s)}),(function(){return N(et)?(at.unshift(Pt()),s):(at.fake(z(R,{data:"",position:et.position})),s)}),(function(){if("struct"===et.data)return 64&t.flags?(at.unshift(Dt()),s):Lt("cannot nest structs");if("keyword"===et.type)return at.unshift(Pt()),s;const e=at.scope.find(et.data);if(e)return at.fake(Object.create(e)),lt.shift(),s;return Lt("expected user defined type, struct or keyword, got "+et.data)}),(function(){if(","===et.data&&!(2&t.flags))return at.shift();if("["===et.data)return void at.unshift(G());if(")"===et.data)return at.shift();if(";"===et.data)return t.stage+3;if("ident"!==et.type&&"builtin"!==et.type)return Lt("expected identifier, got "+et.data);return t.collected_name=lt.shift(),s}),(function(){if("("===et.data)return lt.unshift(t.collected_name),delete t.collected_name,at.unshift(b()),t.stage+2;return s}),(function(){return lt.unshift(t.collected_name),delete t.collected_name,at.unshift(n()),s}),(function(){return at.shift()}))()}function wt(){if("ident"===et.type||"builtin"===et.type){const t=et.data;return at.unshift(y()),void at.scope.define(t)}if("operator"===et.type){if(","===et.data)return 2&at[1].flags?lt.shift():at.shift();if("="===et.data)return 1&at[1].flags?(lt.shift(),void at.unshift(kt(",",";"))):Lt("`=` is not allowed here.");if("["===et.data)return void at.unshift(G())}return at.shift()}function St(){return"keyword"===et.type?(at[0].type="keyword",void(at[0].mode=w)):"ident"===et.type?(at[0].type="ident",void(at[0].mode=o)):Lt("expected keyword or user-defined name, got "+et.data)}function Mt(){return"keyword"!==et.type?Lt("expected keyword, got "+et.data):(at.shift(),lt.shift())}function Tt(){return"ident"!==et.type&&"builtin"!==et.type?Lt("expected user-defined name, got "+et.data):(at[0].data=et.data,at.shift(),lt.shift())}function Et(){const t=at[0].expecting;if(at[0].tokens=at[0].tokens||[],void 0===at[0].parenlevel&&(at[0].parenlevel=0,at[0].bracelevel=0),at[0].parenlevel<1&&t.indexOf(et.data)>-1)return function(t){try{i(at,t)}catch(t){throw ct=!0,t}return at.shift()}(at[0].tokens);switch("("===et.data?++at[0].parenlevel:")"===et.data&&--at[0].parenlevel,et.data){case"{":++at[0].bracelevel;break;case"}":--at[0].bracelevel;break;case"(":++at[0].parenlevel;break;case")":--at[0].parenlevel}return at[0].parenlevel<0?Lt("unexpected `)`"):at[0].bracelevel<0?Lt("unexpected `}`"):void at[0].tokens.push(lt.shift())}function At(t){return function(){return z(t,et)}}function Ct(){return z(P[et.type],et)}function Rt(t){const e=z(p,et);return e.flags=t,e}function Dt(t,e){const n=z(c,et);return n.allow_assign=void 0===t||t,n.allow_comma=void 0===e||e,n}function kt(){const t=z(x,et);return t.expecting=[].slice.call(arguments),t}function Pt(t){let e=et;return t&&(e={type:"(implied)",data:"(default)",position:e.position}),z(w,e)}function Lt(t){throw ct=!0,new Error((t||"unexpected "+at)+" at line "+at[0].token.line)}function zt(t,e){return Ot(t,et.type)&&Ot(e,et.data)}function Ot(t,e){switch(typeof t){case"string":return e!==t&&Lt("expected `"+t+"`, got "+e+"\n"+et.data),!ct;case"object":return t&&-1===t.indexOf(e)&&Lt("expected one of `"+t.join("`, `")+"`, got "+e),!ct}return!0}function It(){let t,e,n=[].slice.call(arguments);return function(){const i=at[0];return i.stage||(i.stage=0),t=n[i.stage],t?(e=t(),e===s?++i.stage:void(void 0!==e&&(i.stage=e))):Lt("parser in undefined state!")}}function Nt(t,e){return e=e||"operator",function(){if(!zt(e,t))return;const n=lt.shift(),i=at[0].children,r=i[i.length-1];return r&&r.token&&n.preceding&&(r.token.succeeding=r.token.succeeding||[],r.token.succeeding=r.token.succeeding.concat(n.preceding)),s}}function Ft(t){return function(){return at.unshift(kt(t)),s}}function Ut(t){return t?function(){const t=et.data;return zt("ident")&&(at.unshift(y()),at.scope.define(t),s)}:function(){if(!zt("ident"))return;return Object.create(at.scope.find(et.data)).token=et,lt.shift(),s}}function Bt(){return function(){const e=t();return e.expecting="}",at.unshift(e),s}}function Vt(t){return function(){const n=at[0].stage;return"{"!==et.data?(at.unshift(e()),n+t):(lt.shift(),s)}}function Ht(){return function(){return at.shift(),at.shift()}}function Gt(){j=It(Nt("struct","keyword"),(function(){return"{"===et.data?(at.fake(z(o,{data:"",position:et.position,type:"ident"})),s):Ut(!0)()}),(function(){return at.scope.enter(),s}),Nt("{"),(function(){return"preprocessor"===et.type?(at.fake(Ct()),void lt.shift()):"}"===et.data?(at.scope.exit(),lt.shift(),at.shift()):void(";"!==et.data?at.unshift(Rt(166)):lt.shift())})),q=It((function(){return lt.shift(),s}),(function(){return zt("keyword",["lowp","mediump","highp"])&&(at.unshift(Pt()),s)}),(function(){return at.unshift(Pt()),s}),(function(){return at.shift()})),W=It(Nt("["),Ft("]"),Nt("]"),(function(){return at.shift()})),X=It(Nt("for","keyword"),Nt("("),(function(){let t;if("ident"===et.type){if((t=at.scope.find(et.data))||(t=at.create_node()),"struct"===t.parent.type)return at.unshift(Rt(k)),s}else if("builtin"===et.type||"keyword"===et.type)return at.unshift(Rt(k)),s;return Ft(";")()}),Nt(";"),Ft(";"),Nt(";"),Ft(")"),Nt(")"),Vt(3),Bt(),Nt("}"),Ht()),Y=It(Nt("if","keyword"),Nt("("),Ft(")"),Nt(")"),Vt(3),Bt(),Nt("}"),(function(){return"else"===et.data?(lt.shift(),at.unshift(e()),s):Ht()()}),Ht()),$=It(Nt("return","keyword"),(function(){return";"===et.data||at.unshift(kt(";")),s}),(function(){lt.shift(),Ht()()})),Z=It(Nt("while","keyword"),Nt("("),Ft(")"),Nt(")"),Vt(3),Bt(),Nt("}"),Ht()),K=It(Nt("do","keyword"),Vt(3),Bt(),Nt("}"),Nt("while","keyword"),Nt("("),Ft(")"),Nt(")"),Ht()),J=It((function(){for(let t=1,e=at.length;t<e;++t)if(at[t].mode===u)return Lt("function definition is not allowed within another function");return s}),(function(){if(!zt("ident"))return;const t=et.data,e=at.scope.find(t);return at.unshift(y()),at.scope.define(t),at.scope.enter(e?e.scope:null),s}),Nt("("),(function(){return at.unshift(L()),s}),Nt(")"),(function(){return";"===et.data?(at.scope.exit(),at.shift(),at.shift()):s}),Nt("{"),Bt(),Nt("}"),(function(){return at.scope.exit(),s}),(function(){return at.shift(),at.shift(),at.shift()})),Q=It((function(){return"void"===et.data?(at.fake(Pt()),lt.shift(),s):")"!==et.data?"struct"===et.data?(at.unshift(Dt(false,false)),s):(at.unshift(Rt(208)),s):void at.shift()}),(function(){if(","===et.data)return lt.shift(),0;")"!==et.data?Lt("expected one of `,` or `)`, got "+et.data):at.shift()}))}};const i=n(3837),r=n(8816),s=new Object;let a=0,o=a++,l=a++,h=a++,c=a++,u=a++,d=a++,p=a++,f=a++,m=a++,g=a++,v=a++,x=a++,_=a++,y=a++,b=a++,w=a++,S=a++,M=a++,T=a++,E=a++,A=a++,C=a++,R=a++,D=a++;const k=255,P={"block-comment":y,"line-comment":y,preprocessor:b},L=a=["ident","stmt","stmtlist","struct","function","functionargs","decl","decllist","forloop","whileloop","if","expr","precision","comment","preprocessor","keyword","keyword_or_ident","return","break","continue","discard","do-while","placeholder","quantifier"];function z(t,e){return{mode:t,token:e,children:[],type:L[t],id:(4294967295*Math.random()).toString(16)}}function O(t){return"const"===t.data||"attribute"===t.data||"uniform"===t.data||"varying"===t.data}function I(t){return"in"===t.data||"inout"===t.data||"out"===t.data}function N(t){return"highp"===t.data||"mediump"===t.data||"lowp"===t.data}},8816:t=>{function e(t){if(this.constructor!==e)return new e(t);this.state=t,this.scopes=[],this.current=null}t.exports=e;const n=e.prototype;n.enter=function(t){this.scopes.push(this.current=this.state[0].scope=t||{})},n.exit=function(){this.scopes.pop(),this.current=this.scopes[this.scopes.length-1]},n.define=function(t){this.current[t]=this.state[0]},n.find=function(t,e){for(let e=this.scopes.length-1;e>-1;--e)if(this.scopes[e].hasOwnProperty(t))return this.scopes[e][t];return null}},1073:t=>{t.exports={trueFunc:function(){return!0},falseFunc:function(){return!1}}},996:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.attributeRules=void 0;var i=n(1073),r=/[-[\]{}()*+?.,\\^$|#\s]/g;function s(t){return t.replace(r,"\\$&")}e.attributeRules={equals:function(t,e,n){var i=n.adapter,r=e.name,s=e.value;return e.ignoreCase?(s=s.toLowerCase(),function(e){var n=i.getAttributeValue(e,r);return null!=n&&n.length===s.length&&n.toLowerCase()===s&&t(e)}):function(e){return i.getAttributeValue(e,r)===s&&t(e)}},hyphen:function(t,e,n){var i=n.adapter,r=e.name,s=e.value,a=s.length;return e.ignoreCase?(s=s.toLowerCase(),function(e){var n=i.getAttributeValue(e,r);return null!=n&&(n.length===a||"-"===n.charAt(a))&&n.substr(0,a).toLowerCase()===s&&t(e)}):function(e){var n=i.getAttributeValue(e,r);return null!=n&&(n.length===a||"-"===n.charAt(a))&&n.substr(0,a)===s&&t(e)}},element:function(t,e,n){var r=e.name,a=e.value,o=e.ignoreCase,l=n.adapter;if(/\s/.test(a))return i.falseFunc;var h=new RegExp("(?:^|\\s)".concat(s(a),"(?:$|\\s)"),o?"i":"");return function(e){var n=l.getAttributeValue(e,r);return null!=n&&n.length>=a.length&&h.test(n)&&t(e)}},exists:function(t,e,n){var i=e.name,r=n.adapter;return function(e){return r.hasAttrib(e,i)&&t(e)}},start:function(t,e,n){var r=n.adapter,s=e.name,a=e.value,o=a.length;return 0===o?i.falseFunc:e.ignoreCase?(a=a.toLowerCase(),function(e){var n=r.getAttributeValue(e,s);return null!=n&&n.length>=o&&n.substr(0,o).toLowerCase()===a&&t(e)}):function(e){var n;return!!(null===(n=r.getAttributeValue(e,s))||void 0===n?void 0:n.startsWith(a))&&t(e)}},end:function(t,e,n){var r=n.adapter,s=e.name,a=e.value,o=-a.length;return 0===o?i.falseFunc:e.ignoreCase?(a=a.toLowerCase(),function(e){var n;return(null===(n=r.getAttributeValue(e,s))||void 0===n?void 0:n.substr(o).toLowerCase())===a&&t(e)}):function(e){var n;return!!(null===(n=r.getAttributeValue(e,s))||void 0===n?void 0:n.endsWith(a))&&t(e)}},any:function(t,e,n){var r=n.adapter,a=e.name,o=e.value;if(""===o)return i.falseFunc;if(e.ignoreCase){var l=new RegExp(s(o),"i");return function(e){var n=r.getAttributeValue(e,a);return null!=n&&n.length>=o.length&&l.test(n)&&t(e)}}return function(e){var n;return!!(null===(n=r.getAttributeValue(e,a))||void 0===n?void 0:n.includes(o))&&t(e)}},not:function(t,e,n){var i=n.adapter,r=e.name,s=e.value;return""===s?function(e){return!!i.getAttributeValue(e,r)&&t(e)}:e.ignoreCase?(s=s.toLowerCase(),function(e){var n=i.getAttributeValue(e,r);return(null==n||n.length!==s.length||n.toLowerCase()!==s)&&t(e)}):function(e){return i.getAttributeValue(e,r)!==s&&t(e)}}}},8866:function(t,e,n){"use strict";var i=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.compileToken=e.compileUnsafe=e.compile=void 0;var r=n(9751),s=n(1073),a=i(n(7353)),o=n(7177),l=n(3621),h=n(1768);function c(t,e,n){return m("string"==typeof t?(0,r.parse)(t,e):t,e,n)}function u(t){return"pseudo"===t.type&&("scope"===t.name||Array.isArray(t.data)&&t.data.some((function(t){return t.some(u)})))}e.compile=function(t,e,n){var i=c(t,e,n);return(0,h.ensureIsTag)(i,e.adapter)},e.compileUnsafe=c;var d={type:"descendant"},p={type:"_flexibleDescendant"},f={type:"pseudo",name:"scope",data:null};function m(t,e,n){var i;(t=t.filter((function(t){return t.length>0}))).forEach(a.default),n=null!==(i=e.context)&&void 0!==i?i:n;var r=Array.isArray(n),c=n&&(Array.isArray(n)?n:[n]);!function(t,e,n){for(var i=e.adapter,r=!!(null==n?void 0:n.every((function(t){var e=i.isTag(t)&&i.getParent(t);return t===h.PLACEHOLDER_ELEMENT||e&&i.isTag(e)}))),s=0,a=t;s<a.length;s++){var l=a[s];if(l.length>0&&(0,o.isTraversal)(l[0])&&"descendant"!==l[0].type);else{if(!r||l.some(u))continue;l.unshift(d)}l.unshift(f)}}(t,e,c);var v=!1,x=t.map((function(t){if(t.length>=2){var n=t[0],i=t[1];"pseudo"!==n.type||"scope"!==n.name||(r&&"descendant"===i.type?t[1]=p:"adjacent"!==i.type&&"sibling"!==i.type||(v=!0))}return function(t,e,n){var i;return t.reduce((function(t,i){return t===s.falseFunc?s.falseFunc:(0,l.compileGeneralSelector)(t,i,e,n,m)}),null!==(i=e.rootFunc)&&void 0!==i?i:s.trueFunc)}(t,e,c)})).reduce(g,s.falseFunc);return x.shouldTestNextSiblings=v,x}function g(t,e){return e===s.falseFunc||t===s.trueFunc?t:t===s.falseFunc||e===s.trueFunc?e:function(n){return t(n)||e(n)}}e.compileToken=m},3621:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.compileGeneralSelector=void 0;var i=n(996),r=n(8677);e.compileGeneralSelector=function(t,e,n,s,a){var o=n.adapter,l=n.equals;switch(e.type){case"pseudo-element":throw new Error("Pseudo-elements are not supported by css-select");case"attribute":return i.attributeRules[e.action](t,e,n);case"pseudo":return(0,r.compilePseudoSelector)(t,e,n,s,a);case"tag":return function(n){return o.getName(n)===e.name&&t(n)};case"descendant":if(!1===n.cacheResults||"undefined"==typeof WeakSet)return function(e){for(var n=e;n=o.getParent(n);)if(o.isTag(n)&&t(n))return!0;return!1};var h=new WeakSet;return function(e){for(var n=e;n=o.getParent(n);)if(!h.has(n)){if(o.isTag(n)&&t(n))return!0;h.add(n)}return!1};case"_flexibleDescendant":return function(e){var n=e;do{if(o.isTag(n)&&t(n))return!0}while(n=o.getParent(n));return!1};case"parent":return function(e){return o.getChildren(e).some((function(e){return o.isTag(e)&&t(e)}))};case"child":return function(e){var n=o.getParent(e);return null!=n&&o.isTag(n)&&t(n)};case"sibling":return function(e){for(var n=o.getSiblings(e),i=0;i<n.length;i++){var r=n[i];if(l(e,r))break;if(o.isTag(r)&&t(r))return!0}return!1};case"adjacent":return function(e){for(var n,i=o.getSiblings(e),r=0;r<i.length;r++){var s=i[r];if(l(e,s))break;o.isTag(s)&&(n=s)}return!!n&&t(n)};case"universal":return t}}},5366:function(t,e,n){"use strict";var i=this&&this.__createBinding||(Object.create?function(t,e,n,i){void 0===i&&(i=n),Object.defineProperty(t,i,{enumerable:!0,get:function(){return e[n]}})}:function(t,e,n,i){void 0===i&&(i=n),t[i]=e[n]}),r=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),s=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var n in t)"default"!==n&&Object.prototype.hasOwnProperty.call(t,n)&&i(e,t,n);return r(e,t),e};Object.defineProperty(e,"__esModule",{value:!0}),e.aliases=e.pseudos=e.filters=e.is=e.selectOne=e.selectAll=e.prepareContext=e._compileToken=e._compileUnsafe=e.compile=void 0;var a=s(n(9432)),o=n(1073),l=n(8866),h=n(1768),c=function(t,e){return t===e},u={adapter:a,equals:c};function d(t){var e,n,i,r,s=null!=t?t:u;return null!==(e=s.adapter)&&void 0!==e||(s.adapter=a),null!==(n=s.equals)&&void 0!==n||(s.equals=null!==(r=null===(i=s.adapter)||void 0===i?void 0:i.equals)&&void 0!==r?r:c),s}function p(t){return function(e,n,i){var r=d(n);return t(e,r,i)}}function f(t){return function(e,n,i){var r=d(i);"function"!=typeof e&&(e=(0,l.compileUnsafe)(e,r,n));var s=m(n,r.adapter,e.shouldTestNextSiblings);return t(e,s,r)}}function m(t,e,n){return void 0===n&&(n=!1),n&&(t=function(t,e){for(var n=Array.isArray(t)?t.slice(0):[t],i=n.length,r=0;r<i;r++){var s=(0,h.getNextSiblings)(n[r],e);n.push.apply(n,s)}return n}(t,e)),Array.isArray(t)?e.removeSubsets(t):e.getChildren(t)}e.compile=p(l.compile),e._compileUnsafe=p(l.compileUnsafe),e._compileToken=p(l.compileToken),e.prepareContext=m,e.selectAll=f((function(t,e,n){return t!==o.falseFunc&&e&&0!==e.length?n.adapter.findAll(t,e):[]})),e.selectOne=f((function(t,e,n){return t!==o.falseFunc&&e&&0!==e.length?n.adapter.findOne(t,e):null})),e.is=function(t,e,n){var i=d(n);return("function"==typeof e?e:(0,l.compile)(e,i))(t)},e.default=e.selectAll;var g=n(8677);Object.defineProperty(e,"filters",{enumerable:!0,get:function(){return g.filters}}),Object.defineProperty(e,"pseudos",{enumerable:!0,get:function(){return g.pseudos}}),Object.defineProperty(e,"aliases",{enumerable:!0,get:function(){return g.aliases}})},7177:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.isTraversal=e.procedure=void 0,e.procedure={universal:50,tag:30,attribute:1,pseudo:0,"pseudo-element":0,descendant:-1,child:-1,parent:-1,sibling:-1,adjacent:-1,_flexibleDescendant:-1},e.isTraversal=function(t){return e.procedure[t.type]<0}},2968:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.aliases=void 0,e.aliases={"any-link":":is(a, area, link)[href]",link:":any-link:not(:visited)",disabled:":is(\n        :is(button, input, select, textarea, optgroup, option)[disabled],\n        optgroup[disabled] > option,\n        fieldset[disabled]:not(fieldset[disabled] legend:first-of-type *)\n    )",enabled:":not(:disabled)",checked:":is(:is(input[type=radio], input[type=checkbox])[checked], option:selected)",required:":is(input, select, textarea)[required]",optional:":is(input, select, textarea):not([required])",selected:"option:is([selected], select:not([multiple]):not(:has(> option[selected])) > :first-of-type)",checkbox:"[type=checkbox]",file:"[type=file]",password:"[type=password]",radio:"[type=radio]",reset:"[type=reset]",image:"[type=image]",submit:"[type=submit]",parent:":not(:empty)",header:":is(h1, h2, h3, h4, h5, h6)",button:":is(button, input[type=button])",input:":is(input, textarea, select, button)",text:"input:is(:not([type!='']), [type=text])"}},7689:function(t,e,n){"use strict";var i=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.filters=void 0;var r=i(n(7540)),s=n(1073);function a(t,e){return function(n){var i=e.getParent(n);return null!=i&&e.isTag(i)&&t(n)}}function o(t){return function(e,n,i){var r=i.adapter[t];return"function"!=typeof r?s.falseFunc:function(t){return r(t)&&e(t)}}}e.filters={contains:function(t,e,n){var i=n.adapter;return function(n){return t(n)&&i.getText(n).includes(e)}},icontains:function(t,e,n){var i=n.adapter,r=e.toLowerCase();return function(e){return t(e)&&i.getText(e).toLowerCase().includes(r)}},"nth-child":function(t,e,n){var i=n.adapter,o=n.equals,l=(0,r.default)(e);return l===s.falseFunc?s.falseFunc:l===s.trueFunc?a(t,i):function(e){for(var n=i.getSiblings(e),r=0,s=0;s<n.length&&!o(e,n[s]);s++)i.isTag(n[s])&&r++;return l(r)&&t(e)}},"nth-last-child":function(t,e,n){var i=n.adapter,o=n.equals,l=(0,r.default)(e);return l===s.falseFunc?s.falseFunc:l===s.trueFunc?a(t,i):function(e){for(var n=i.getSiblings(e),r=0,s=n.length-1;s>=0&&!o(e,n[s]);s--)i.isTag(n[s])&&r++;return l(r)&&t(e)}},"nth-of-type":function(t,e,n){var i=n.adapter,o=n.equals,l=(0,r.default)(e);return l===s.falseFunc?s.falseFunc:l===s.trueFunc?a(t,i):function(e){for(var n=i.getSiblings(e),r=0,s=0;s<n.length;s++){var a=n[s];if(o(e,a))break;i.isTag(a)&&i.getName(a)===i.getName(e)&&r++}return l(r)&&t(e)}},"nth-last-of-type":function(t,e,n){var i=n.adapter,o=n.equals,l=(0,r.default)(e);return l===s.falseFunc?s.falseFunc:l===s.trueFunc?a(t,i):function(e){for(var n=i.getSiblings(e),r=0,s=n.length-1;s>=0;s--){var a=n[s];if(o(e,a))break;i.isTag(a)&&i.getName(a)===i.getName(e)&&r++}return l(r)&&t(e)}},root:function(t,e,n){var i=n.adapter;return function(e){var n=i.getParent(e);return(null==n||!i.isTag(n))&&t(e)}},scope:function(t,n,i,r){var s=i.equals;return r&&0!==r.length?1===r.length?function(e){return s(r[0],e)&&t(e)}:function(e){return r.includes(e)&&t(e)}:e.filters.root(t,n,i)},hover:o("isHovered"),visited:o("isVisited"),active:o("isActive")}},8677:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.compilePseudoSelector=e.aliases=e.pseudos=e.filters=void 0;var i=n(1073),r=n(9751),s=n(7689);Object.defineProperty(e,"filters",{enumerable:!0,get:function(){return s.filters}});var a=n(7221);Object.defineProperty(e,"pseudos",{enumerable:!0,get:function(){return a.pseudos}});var o=n(2968);Object.defineProperty(e,"aliases",{enumerable:!0,get:function(){return o.aliases}});var l=n(1768);e.compilePseudoSelector=function(t,e,n,h,c){var u=e.name,d=e.data;if(Array.isArray(d))return l.subselects[u](t,d,n,h,c);if(u in o.aliases){if(null!=d)throw new Error("Pseudo ".concat(u," doesn't have any arguments"));var p=(0,r.parse)(o.aliases[u],n);return l.subselects.is(t,p,n,h,c)}if(u in s.filters)return s.filters[u](t,d,n,h);if(u in a.pseudos){var f=a.pseudos[u];return(0,a.verifyPseudoArgs)(f,u,d),f===i.falseFunc?i.falseFunc:t===i.trueFunc?function(t){return f(t,n,d)}:function(e){return f(e,n,d)&&t(e)}}throw new Error("unmatched pseudo-class :".concat(u))}},7221:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.verifyPseudoArgs=e.pseudos=void 0,e.pseudos={empty:function(t,e){var n=e.adapter;return!n.getChildren(t).some((function(t){return n.isTag(t)||""!==n.getText(t)}))},"first-child":function(t,e){var n=e.adapter,i=e.equals,r=n.getSiblings(t).find((function(t){return n.isTag(t)}));return null!=r&&i(t,r)},"last-child":function(t,e){for(var n=e.adapter,i=e.equals,r=n.getSiblings(t),s=r.length-1;s>=0;s--){if(i(t,r[s]))return!0;if(n.isTag(r[s]))break}return!1},"first-of-type":function(t,e){for(var n=e.adapter,i=e.equals,r=n.getSiblings(t),s=n.getName(t),a=0;a<r.length;a++){var o=r[a];if(i(t,o))return!0;if(n.isTag(o)&&n.getName(o)===s)break}return!1},"last-of-type":function(t,e){for(var n=e.adapter,i=e.equals,r=n.getSiblings(t),s=n.getName(t),a=r.length-1;a>=0;a--){var o=r[a];if(i(t,o))return!0;if(n.isTag(o)&&n.getName(o)===s)break}return!1},"only-of-type":function(t,e){var n=e.adapter,i=e.equals,r=n.getName(t);return n.getSiblings(t).every((function(e){return i(t,e)||!n.isTag(e)||n.getName(e)!==r}))},"only-child":function(t,e){var n=e.adapter,i=e.equals;return n.getSiblings(t).every((function(e){return i(t,e)||!n.isTag(e)}))}},e.verifyPseudoArgs=function(t,e,n){if(null===n){if(t.length>2)throw new Error("pseudo-selector :".concat(e," requires an argument"))}else if(2===t.length)throw new Error("pseudo-selector :".concat(e," doesn't have any arguments"))}},1768:function(t,e,n){"use strict";var i=this&&this.__spreadArray||function(t,e,n){if(n||2===arguments.length)for(var i,r=0,s=e.length;r<s;r++)!i&&r in e||(i||(i=Array.prototype.slice.call(e,0,r)),i[r]=e[r]);return t.concat(i||Array.prototype.slice.call(e))};Object.defineProperty(e,"__esModule",{value:!0}),e.subselects=e.getNextSiblings=e.ensureIsTag=e.PLACEHOLDER_ELEMENT=void 0;var r=n(1073),s=n(7177);function a(t,e){return t===r.falseFunc?r.falseFunc:function(n){return e.isTag(n)&&t(n)}}function o(t,e){var n=e.getSiblings(t);if(n.length<=1)return[];var i=n.indexOf(t);return i<0||i===n.length-1?[]:n.slice(i+1).filter(e.isTag)}e.PLACEHOLDER_ELEMENT={},e.ensureIsTag=a,e.getNextSiblings=o;var l=function(t,e,n,i,r){var s=r(e,{xmlMode:!!n.xmlMode,adapter:n.adapter,equals:n.equals},i);return function(e){return s(e)&&t(e)}};e.subselects={is:l,matches:l,where:l,not:function(t,e,n,i,s){var a=s(e,{xmlMode:!!n.xmlMode,adapter:n.adapter,equals:n.equals},i);return a===r.falseFunc?t:a===r.trueFunc?r.falseFunc:function(e){return!a(e)&&t(e)}},has:function(t,n,l,h,c){var u=l.adapter,d={xmlMode:!!l.xmlMode,adapter:u,equals:l.equals},p=n.some((function(t){return t.some(s.isTraversal)}))?[e.PLACEHOLDER_ELEMENT]:void 0,f=c(n,d,p);if(f===r.falseFunc)return r.falseFunc;if(f===r.trueFunc)return function(e){return u.getChildren(e).some(u.isTag)&&t(e)};var m=a(f,u),g=f.shouldTestNextSiblings,v=void 0!==g&&g;return p?function(e){p[0]=e;var n=u.getChildren(e),r=v?i(i([],n,!0),o(e,u),!0):n;return t(e)&&u.existsOne(m,r)}:function(e){return t(e)&&u.existsOne(m,u.getChildren(e))}}}},7353:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0});var i=n(7177),r={exists:10,equals:8,not:7,start:6,end:6,any:5,hyphen:4,element:4};function s(t){var e=i.procedure[t.type];if("attribute"===t.type)(e=r[t.action])===r.equals&&"id"===t.name&&(e=9),t.ignoreCase&&(e>>=1);else if("pseudo"===t.type)if(t.data)if("has"===t.name||"contains"===t.name)e=0;else if(Array.isArray(t.data)){e=0;for(var n=0;n<t.data.length;n++)if(1===t.data[n].length){var a=s(t.data[n][0]);if(0===a){e=0;break}a>e&&(e=a)}t.data.length>1&&e>0&&(e-=1)}else e=1;else e=3;return e}e.default=function(t){for(var e=t.map(s),n=1;n<t.length;n++){var i=e[n];if(!(i<0))for(var r=n-1;r>=0&&i<e[r];r--){var a=t[r+1];t[r+1]=t[r],t[r]=a,e[r+1]=e[r],e[r]=i}}}},9751:function(t,e,n){"use strict";var i=this&&this.__createBinding||(Object.create?function(t,e,n,i){void 0===i&&(i=n),Object.defineProperty(t,i,{enumerable:!0,get:function(){return e[n]}})}:function(t,e,n,i){void 0===i&&(i=n),t[i]=e[n]}),r=this&&this.__exportStar||function(t,e){for(var n in t)"default"===n||Object.prototype.hasOwnProperty.call(e,n)||i(e,t,n)},s=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.stringify=e.parse=void 0,r(n(675),e);var a=n(675);Object.defineProperty(e,"parse",{enumerable:!0,get:function(){return s(a).default}});var o=n(6868);Object.defineProperty(e,"stringify",{enumerable:!0,get:function(){return s(o).default}})},675:function(t,e){"use strict";var n=this&&this.__spreadArray||function(t,e,n){if(n||2===arguments.length)for(var i,r=0,s=e.length;r<s;r++)!i&&r in e||(i||(i=Array.prototype.slice.call(e,0,r)),i[r]=e[r]);return t.concat(i||Array.prototype.slice.call(e))};Object.defineProperty(e,"__esModule",{value:!0}),e.isTraversal=void 0;var i=/^[^\\#]?(?:\\(?:[\da-f]{1,6}\s?|.)|[\w\-\u00b0-\uFFFF])+/,r=/\\([\da-f]{1,6}\s?|(\s)|.)/gi,s=new Map([["~","element"],["^","start"],["$","end"],["*","any"],["!","not"],["|","hyphen"]]),a={">":"child","<":"parent","~":"sibling","+":"adjacent"},o={"#":["id","equals"],".":["class","element"]},l=new Set(["has","not","matches","is","where","host","host-context"]),h=new Set(n(["descendant"],Object.keys(a).map((function(t){return a[t]})),!0)),c=new Set(["accept","accept-charset","align","alink","axis","bgcolor","charset","checked","clear","codetype","color","compact","declare","defer","dir","direction","disabled","enctype","face","frame","hreflang","http-equiv","lang","language","link","media","method","multiple","nohref","noresize","noshade","nowrap","readonly","rel","rev","rules","scope","scrolling","selected","shape","target","text","type","valign","valuetype","vlink"]);function u(t){return h.has(t.type)}e.isTraversal=u;var d=new Set(["contains","icontains"]),p=new Set(['"',"'"]);function f(t,e,n){var i=parseInt(e,16)-65536;return i!=i||n?e:i<0?String.fromCharCode(i+65536):String.fromCharCode(i>>10|55296,1023&i|56320)}function m(t){return t.replace(r,f)}function g(t){return" "===t||"\n"===t||"\t"===t||"\f"===t||"\r"===t}function v(t,e,n,r){var h,f;void 0===n&&(n={});var _=[],y=!1;function b(t){var n=e.slice(r+t).match(i);if(!n)throw new Error("Expected name, found "+e.slice(r));var s=n[0];return r+=t+s.length,m(s)}function w(t){for(;g(e.charAt(r+t));)t++;r+=t}function S(t){for(var n=0;"\\"===e.charAt(--t);)n++;return 1==(1&n)}function M(){if(_.length>0&&u(_[_.length-1]))throw new Error("Did not expect successive traversals.")}for(w(0);""!==e;){var T=e.charAt(r);if(g(T))y=!0,w(1);else if(T in a)M(),_.push({type:a[T]}),y=!1,w(1);else if(","===T){if(0===_.length)throw new Error("Empty sub-selector");t.push(_),_=[],y=!1,w(1)}else if(e.startsWith("/*",r)){var E=e.indexOf("*/",r+2);if(E<0)throw new Error("Comment was not terminated");r=E+2}else if(y&&(M(),_.push({type:"descendant"}),y=!1),T in o){var A=o[T],C=A[0],R=A[1];_.push({type:"attribute",name:C,action:R,value:b(1),namespace:null,ignoreCase:!!n.xmlMode&&null})}else if("["===T){w(1);var D=null;"|"===e.charAt(r)&&(D="",r+=1),e.startsWith("*|",r)&&(D="*",r+=2);var k=b(0);null===D&&"|"===e.charAt(r)&&"="!==e.charAt(r+1)&&(D=k,k=b(1)),(null!==(h=n.lowerCaseAttributeNames)&&void 0!==h?h:!n.xmlMode)&&(k=k.toLowerCase()),w(0);R="exists";var P=s.get(e.charAt(r));if(P){if(R=P,"="!==e.charAt(r+1))throw new Error("Expected `=`");w(2)}else"="===e.charAt(r)&&(R="equals",w(1));var L="",z=null;if("exists"!==R){if(p.has(e.charAt(r))){for(var O=e.charAt(r),I=r+1;I<e.length&&(e.charAt(I)!==O||S(I));)I+=1;if(e.charAt(I)!==O)throw new Error("Attribute value didn't end");L=m(e.slice(r+1,I)),r=I+1}else{for(var N=r;r<e.length&&(!g(e.charAt(r))&&"]"!==e.charAt(r)||S(r));)r+=1;L=m(e.slice(N,r))}w(0);var F=e.charAt(r);"s"===F||"S"===F?(z=!1,w(1)):"i"!==F&&"I"!==F||(z=!0,w(1))}if(n.xmlMode||null!=z||(z=c.has(k)),"]"!==e.charAt(r))throw new Error("Attribute selector didn't terminate");r+=1;var U={type:"attribute",name:k,action:R,value:L,namespace:D,ignoreCase:z};_.push(U)}else if(":"===T){if(":"===e.charAt(r+1)){_.push({type:"pseudo-element",name:b(2).toLowerCase()});continue}var B=b(1).toLowerCase(),V=null;if("("===e.charAt(r))if(l.has(B)){if(p.has(e.charAt(r+1)))throw new Error("Pseudo-selector "+B+" cannot be quoted");if(r=v(V=[],e,n,r+1),")"!==e.charAt(r))throw new Error("Missing closing parenthesis in :"+B+" ("+e+")");r+=1}else{for(var H=r+=1,G=1;G>0&&r<e.length;r++)"("!==e.charAt(r)||S(r)?")"!==e.charAt(r)||S(r)||G--:G++;if(G)throw new Error("Parenthesis not matched");if(V=e.slice(H,r-1),d.has(B)){var j=V.charAt(0);j===V.slice(-1)&&p.has(j)&&(V=V.slice(1,-1)),V=m(V)}}_.push({type:"pseudo",name:B,data:V})}else{D=null;var q=void 0;if("*"===T)r+=1,q="*";else{if(!i.test(e.slice(r)))return _.length&&"descendant"===_[_.length-1].type&&_.pop(),x(t,_),r;"|"===e.charAt(r)&&(D="",r+=1),q=b(0)}"|"===e.charAt(r)&&(D=q,"*"===e.charAt(r+1)?(q="*",r+=2):q=b(1)),"*"===q?_.push({type:"universal",namespace:D}):((null!==(f=n.lowerCaseTags)&&void 0!==f?f:!n.xmlMode)&&(q=q.toLowerCase()),_.push({type:"tag",name:q,namespace:D}))}}return x(t,_),r}function x(t,e){if(t.length>0&&0===e.length)throw new Error("Empty sub-selector");t.push(e)}e.default=function(t,e){var n=[],i=v(n,""+t,e,0);if(i<t.length)throw new Error("Unmatched selector: "+t.slice(i));return n}},6868:function(t,e){"use strict";var n=this&&this.__spreadArray||function(t,e,n){if(n||2===arguments.length)for(var i,r=0,s=e.length;r<s;r++)!i&&r in e||(i||(i=Array.prototype.slice.call(e,0,r)),i[r]=e[r]);return t.concat(i||Array.prototype.slice.call(e))};Object.defineProperty(e,"__esModule",{value:!0});var i={equals:"",element:"~",start:"^",end:"$",any:"*",not:"!",hyphen:"|"},r=new Set(n(n([],Object.keys(i).map((function(t){return i[t]})).filter(Boolean),!0),[":","[","]"," ","\\","(",")","'"],!1));function s(t){return t.map(a).join(", ")}function a(t){return t.map(o).join("")}function o(t){switch(t.type){case"child":return" > ";case"parent":return" < ";case"sibling":return" ~ ";case"adjacent":return" + ";case"descendant":return" ";case"universal":return h(t.namespace)+"*";case"tag":return l(t);case"pseudo-element":return"::"+c(t.name);case"pseudo":return null===t.data?":"+c(t.name):"string"==typeof t.data?":"+c(t.name)+"("+c(t.data)+")":":"+c(t.name)+"("+s(t.data)+")";case"attribute":if("id"===t.name&&"equals"===t.action&&!t.ignoreCase&&!t.namespace)return"#"+c(t.value);if("class"===t.name&&"element"===t.action&&!t.ignoreCase&&!t.namespace)return"."+c(t.value);var e=l(t);return"exists"===t.action?"["+e+"]":"["+e+i[t.action]+"='"+c(t.value)+"'"+(t.ignoreCase?"i":!1===t.ignoreCase?"s":"")+"]"}}function l(t){return""+h(t.namespace)+c(t.name)}function h(t){return null!==t?("*"===t?"*":c(t))+"|":""}function c(t){return t.split("").map((function(t){return r.has(t)?"\\"+t:t})).join("")}e.default=s},7837:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.attributeNames=e.elementNames=void 0,e.elementNames=new Map([["altglyph","altGlyph"],["altglyphdef","altGlyphDef"],["altglyphitem","altGlyphItem"],["animatecolor","animateColor"],["animatemotion","animateMotion"],["animatetransform","animateTransform"],["clippath","clipPath"],["feblend","feBlend"],["fecolormatrix","feColorMatrix"],["fecomponenttransfer","feComponentTransfer"],["fecomposite","feComposite"],["feconvolvematrix","feConvolveMatrix"],["fediffuselighting","feDiffuseLighting"],["fedisplacementmap","feDisplacementMap"],["fedistantlight","feDistantLight"],["fedropshadow","feDropShadow"],["feflood","feFlood"],["fefunca","feFuncA"],["fefuncb","feFuncB"],["fefuncg","feFuncG"],["fefuncr","feFuncR"],["fegaussianblur","feGaussianBlur"],["feimage","feImage"],["femerge","feMerge"],["femergenode","feMergeNode"],["femorphology","feMorphology"],["feoffset","feOffset"],["fepointlight","fePointLight"],["fespecularlighting","feSpecularLighting"],["fespotlight","feSpotLight"],["fetile","feTile"],["feturbulence","feTurbulence"],["foreignobject","foreignObject"],["glyphref","glyphRef"],["lineargradient","linearGradient"],["radialgradient","radialGradient"],["textpath","textPath"]]),e.attributeNames=new Map([["definitionurl","definitionURL"],["attributename","attributeName"],["attributetype","attributeType"],["basefrequency","baseFrequency"],["baseprofile","baseProfile"],["calcmode","calcMode"],["clippathunits","clipPathUnits"],["diffuseconstant","diffuseConstant"],["edgemode","edgeMode"],["filterunits","filterUnits"],["glyphref","glyphRef"],["gradienttransform","gradientTransform"],["gradientunits","gradientUnits"],["kernelmatrix","kernelMatrix"],["kernelunitlength","kernelUnitLength"],["keypoints","keyPoints"],["keysplines","keySplines"],["keytimes","keyTimes"],["lengthadjust","lengthAdjust"],["limitingconeangle","limitingConeAngle"],["markerheight","markerHeight"],["markerunits","markerUnits"],["markerwidth","markerWidth"],["maskcontentunits","maskContentUnits"],["maskunits","maskUnits"],["numoctaves","numOctaves"],["pathlength","pathLength"],["patterncontentunits","patternContentUnits"],["patterntransform","patternTransform"],["patternunits","patternUnits"],["pointsatx","pointsAtX"],["pointsaty","pointsAtY"],["pointsatz","pointsAtZ"],["preservealpha","preserveAlpha"],["preserveaspectratio","preserveAspectRatio"],["primitiveunits","primitiveUnits"],["refx","refX"],["refy","refY"],["repeatcount","repeatCount"],["repeatdur","repeatDur"],["requiredextensions","requiredExtensions"],["requiredfeatures","requiredFeatures"],["specularconstant","specularConstant"],["specularexponent","specularExponent"],["spreadmethod","spreadMethod"],["startoffset","startOffset"],["stddeviation","stdDeviation"],["stitchtiles","stitchTiles"],["surfacescale","surfaceScale"],["systemlanguage","systemLanguage"],["tablevalues","tableValues"],["targetx","targetX"],["targety","targetY"],["textlength","textLength"],["viewbox","viewBox"],["viewtarget","viewTarget"],["xchannelselector","xChannelSelector"],["ychannelselector","yChannelSelector"],["zoomandpan","zoomAndPan"]])},7220:function(t,e,n){"use strict";var i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,n=1,i=arguments.length;n<i;n++)for(var r in e=arguments[n])Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t},i.apply(this,arguments)},r=this&&this.__createBinding||(Object.create?function(t,e,n,i){void 0===i&&(i=n),Object.defineProperty(t,i,{enumerable:!0,get:function(){return e[n]}})}:function(t,e,n,i){void 0===i&&(i=n),t[i]=e[n]}),s=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),a=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var n in t)"default"!==n&&Object.prototype.hasOwnProperty.call(t,n)&&r(e,t,n);return s(e,t),e};Object.defineProperty(e,"__esModule",{value:!0});var o=a(n(9960)),l=n(5863),h=n(7837),c=new Set(["style","script","xmp","iframe","noembed","noframes","plaintext","noscript"]);var u=new Set(["area","base","basefont","br","col","command","embed","frame","hr","img","input","isindex","keygen","link","meta","param","source","track","wbr"]);function d(t,e){void 0===e&&(e={});for(var n=("length"in t?t:[t]),i="",r=0;r<n.length;r++)i+=p(n[r],e);return i}function p(t,e){switch(t.type){case o.Root:return d(t.children,e);case o.Directive:case o.Doctype:return"<"+t.data+">";case o.Comment:return function(t){return"\x3c!--"+t.data+"--\x3e"}(t);case o.CDATA:return function(t){return"<![CDATA["+t.children[0].data+"]]>"}(t);case o.Script:case o.Style:case o.Tag:return function(t,e){var n;"foreign"===e.xmlMode&&(t.name=null!==(n=h.elementNames.get(t.name))&&void 0!==n?n:t.name,t.parent&&f.has(t.parent.name)&&(e=i(i({},e),{xmlMode:!1})));!e.xmlMode&&m.has(t.name)&&(e=i(i({},e),{xmlMode:"foreign"}));var r="<"+t.name,s=function(t,e){if(t)return Object.keys(t).map((function(n){var i,r,s=null!==(i=t[n])&&void 0!==i?i:"";return"foreign"===e.xmlMode&&(n=null!==(r=h.attributeNames.get(n))&&void 0!==r?r:n),e.emptyAttrs||e.xmlMode||""!==s?n+'="'+(!1!==e.decodeEntities?l.encodeXML(s):s.replace(/"/g,"&quot;"))+'"':n})).join(" ")}(t.attribs,e);s&&(r+=" "+s);0===t.children.length&&(e.xmlMode?!1!==e.selfClosingTags:e.selfClosingTags&&u.has(t.name))?(e.xmlMode||(r+=" "),r+="/>"):(r+=">",t.children.length>0&&(r+=d(t.children,e)),!e.xmlMode&&u.has(t.name)||(r+="</"+t.name+">"));return r}(t,e);case o.Text:return function(t,e){var n=t.data||"";!1===e.decodeEntities||!e.xmlMode&&t.parent&&c.has(t.parent.name)||(n=l.encodeXML(n));return n}(t,e)}}e.default=d;var f=new Set(["mi","mo","mn","ms","mtext","annotation-xml","foreignObject","desc","title"]),m=new Set(["svg","math"])},9960:(t,e)=>{"use strict";var n;Object.defineProperty(e,"__esModule",{value:!0}),e.Doctype=e.CDATA=e.Tag=e.Style=e.Script=e.Comment=e.Directive=e.Text=e.Root=e.isTag=e.ElementType=void 0,function(t){t.Root="root",t.Text="text",t.Directive="directive",t.Comment="comment",t.Script="script",t.Style="style",t.Tag="tag",t.CDATA="cdata",t.Doctype="doctype"}(n=e.ElementType||(e.ElementType={})),e.isTag=function(t){return t.type===n.Tag||t.type===n.Script||t.type===n.Style},e.Root=n.Root,e.Text=n.Text,e.Directive=n.Directive,e.Comment=n.Comment,e.Script=n.Script,e.Style=n.Style,e.Tag=n.Tag,e.CDATA=n.CDATA,e.Doctype=n.Doctype},7915:function(t,e,n){"use strict";var i=this&&this.__createBinding||(Object.create?function(t,e,n,i){void 0===i&&(i=n),Object.defineProperty(t,i,{enumerable:!0,get:function(){return e[n]}})}:function(t,e,n,i){void 0===i&&(i=n),t[i]=e[n]}),r=this&&this.__exportStar||function(t,e){for(var n in t)"default"===n||Object.prototype.hasOwnProperty.call(e,n)||i(e,t,n)};Object.defineProperty(e,"__esModule",{value:!0}),e.DomHandler=void 0;var s=n(9960),a=n(7790);r(n(7790),e);var o=/\s+/g,l={normalizeWhitespace:!1,withStartIndices:!1,withEndIndices:!1,xmlMode:!1},h=function(){function t(t,e,n){this.dom=[],this.root=new a.Document(this.dom),this.done=!1,this.tagStack=[this.root],this.lastNode=null,this.parser=null,"function"==typeof e&&(n=e,e=l),"object"==typeof t&&(e=t,t=void 0),this.callback=null!=t?t:null,this.options=null!=e?e:l,this.elementCB=null!=n?n:null}return t.prototype.onparserinit=function(t){this.parser=t},t.prototype.onreset=function(){this.dom=[],this.root=new a.Document(this.dom),this.done=!1,this.tagStack=[this.root],this.lastNode=null,this.parser=null},t.prototype.onend=function(){this.done||(this.done=!0,this.parser=null,this.handleCallback(null))},t.prototype.onerror=function(t){this.handleCallback(t)},t.prototype.onclosetag=function(){this.lastNode=null;var t=this.tagStack.pop();this.options.withEndIndices&&(t.endIndex=this.parser.endIndex),this.elementCB&&this.elementCB(t)},t.prototype.onopentag=function(t,e){var n=this.options.xmlMode?s.ElementType.Tag:void 0,i=new a.Element(t,e,void 0,n);this.addNode(i),this.tagStack.push(i)},t.prototype.ontext=function(t){var e=this.options.normalizeWhitespace,n=this.lastNode;if(n&&n.type===s.ElementType.Text)e?n.data=(n.data+t).replace(o," "):n.data+=t,this.options.withEndIndices&&(n.endIndex=this.parser.endIndex);else{e&&(t=t.replace(o," "));var i=new a.Text(t);this.addNode(i),this.lastNode=i}},t.prototype.oncomment=function(t){if(this.lastNode&&this.lastNode.type===s.ElementType.Comment)this.lastNode.data+=t;else{var e=new a.Comment(t);this.addNode(e),this.lastNode=e}},t.prototype.oncommentend=function(){this.lastNode=null},t.prototype.oncdatastart=function(){var t=new a.Text(""),e=new a.NodeWithChildren(s.ElementType.CDATA,[t]);this.addNode(e),t.parent=e,this.lastNode=t},t.prototype.oncdataend=function(){this.lastNode=null},t.prototype.onprocessinginstruction=function(t,e){var n=new a.ProcessingInstruction(t,e);this.addNode(n)},t.prototype.handleCallback=function(t){if("function"==typeof this.callback)this.callback(t,this.dom);else if(t)throw t},t.prototype.addNode=function(t){var e=this.tagStack[this.tagStack.length-1],n=e.children[e.children.length-1];this.options.withStartIndices&&(t.startIndex=this.parser.startIndex),this.options.withEndIndices&&(t.endIndex=this.parser.endIndex),e.children.push(t),n&&(t.prev=n,n.next=t),t.parent=e,this.lastNode=null},t}();e.DomHandler=h,e.default=h},7790:function(t,e,n){"use strict";var i,r=this&&this.__extends||(i=function(t,e){return i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])},i(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}i(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),s=this&&this.__assign||function(){return s=Object.assign||function(t){for(var e,n=1,i=arguments.length;n<i;n++)for(var r in e=arguments[n])Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t},s.apply(this,arguments)};Object.defineProperty(e,"__esModule",{value:!0}),e.cloneNode=e.hasChildren=e.isDocument=e.isDirective=e.isComment=e.isText=e.isCDATA=e.isTag=e.Element=e.Document=e.NodeWithChildren=e.ProcessingInstruction=e.Comment=e.Text=e.DataNode=e.Node=void 0;var a=n(9960),o=new Map([[a.ElementType.Tag,1],[a.ElementType.Script,1],[a.ElementType.Style,1],[a.ElementType.Directive,1],[a.ElementType.Text,3],[a.ElementType.CDATA,4],[a.ElementType.Comment,8],[a.ElementType.Root,9]]),l=function(){function t(t){this.type=t,this.parent=null,this.prev=null,this.next=null,this.startIndex=null,this.endIndex=null}return Object.defineProperty(t.prototype,"nodeType",{get:function(){var t;return null!==(t=o.get(this.type))&&void 0!==t?t:1},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"parentNode",{get:function(){return this.parent},set:function(t){this.parent=t},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"previousSibling",{get:function(){return this.prev},set:function(t){this.prev=t},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"nextSibling",{get:function(){return this.next},set:function(t){this.next=t},enumerable:!1,configurable:!0}),t.prototype.cloneNode=function(t){return void 0===t&&(t=!1),w(this,t)},t}();e.Node=l;var h=function(t){function e(e,n){var i=t.call(this,e)||this;return i.data=n,i}return r(e,t),Object.defineProperty(e.prototype,"nodeValue",{get:function(){return this.data},set:function(t){this.data=t},enumerable:!1,configurable:!0}),e}(l);e.DataNode=h;var c=function(t){function e(e){return t.call(this,a.ElementType.Text,e)||this}return r(e,t),e}(h);e.Text=c;var u=function(t){function e(e){return t.call(this,a.ElementType.Comment,e)||this}return r(e,t),e}(h);e.Comment=u;var d=function(t){function e(e,n){var i=t.call(this,a.ElementType.Directive,n)||this;return i.name=e,i}return r(e,t),e}(h);e.ProcessingInstruction=d;var p=function(t){function e(e,n){var i=t.call(this,e)||this;return i.children=n,i}return r(e,t),Object.defineProperty(e.prototype,"firstChild",{get:function(){var t;return null!==(t=this.children[0])&&void 0!==t?t:null},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"lastChild",{get:function(){return this.children.length>0?this.children[this.children.length-1]:null},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"childNodes",{get:function(){return this.children},set:function(t){this.children=t},enumerable:!1,configurable:!0}),e}(l);e.NodeWithChildren=p;var f=function(t){function e(e){return t.call(this,a.ElementType.Root,e)||this}return r(e,t),e}(p);e.Document=f;var m=function(t){function e(e,n,i,r){void 0===i&&(i=[]),void 0===r&&(r="script"===e?a.ElementType.Script:"style"===e?a.ElementType.Style:a.ElementType.Tag);var s=t.call(this,r,i)||this;return s.name=e,s.attribs=n,s}return r(e,t),Object.defineProperty(e.prototype,"tagName",{get:function(){return this.name},set:function(t){this.name=t},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"attributes",{get:function(){var t=this;return Object.keys(this.attribs).map((function(e){var n,i;return{name:e,value:t.attribs[e],namespace:null===(n=t["x-attribsNamespace"])||void 0===n?void 0:n[e],prefix:null===(i=t["x-attribsPrefix"])||void 0===i?void 0:i[e]}}))},enumerable:!1,configurable:!0}),e}(p);function g(t){return(0,a.isTag)(t)}function v(t){return t.type===a.ElementType.CDATA}function x(t){return t.type===a.ElementType.Text}function _(t){return t.type===a.ElementType.Comment}function y(t){return t.type===a.ElementType.Directive}function b(t){return t.type===a.ElementType.Root}function w(t,e){var n;if(void 0===e&&(e=!1),x(t))n=new c(t.data);else if(_(t))n=new u(t.data);else if(g(t)){var i=e?S(t.children):[],r=new m(t.name,s({},t.attribs),i);i.forEach((function(t){return t.parent=r})),null!=t.namespace&&(r.namespace=t.namespace),t["x-attribsNamespace"]&&(r["x-attribsNamespace"]=s({},t["x-attribsNamespace"])),t["x-attribsPrefix"]&&(r["x-attribsPrefix"]=s({},t["x-attribsPrefix"])),n=r}else if(v(t)){i=e?S(t.children):[];var o=new p(a.ElementType.CDATA,i);i.forEach((function(t){return t.parent=o})),n=o}else if(b(t)){i=e?S(t.children):[];var l=new f(i);i.forEach((function(t){return t.parent=l})),t["x-mode"]&&(l["x-mode"]=t["x-mode"]),n=l}else{if(!y(t))throw new Error("Not implemented yet: ".concat(t.type));var h=new d(t.name,t.data);null!=t["x-name"]&&(h["x-name"]=t["x-name"],h["x-publicId"]=t["x-publicId"],h["x-systemId"]=t["x-systemId"]),n=h}return n.startIndex=t.startIndex,n.endIndex=t.endIndex,null!=t.sourceCodeLocation&&(n.sourceCodeLocation=t.sourceCodeLocation),n}function S(t){for(var e=t.map((function(t){return w(t,!0)})),n=1;n<e.length;n++)e[n].prev=e[n-1],e[n-1].next=e[n];return e}e.Element=m,e.isTag=g,e.isCDATA=v,e.isText=x,e.isComment=_,e.isDirective=y,e.isDocument=b,e.hasChildren=function(t){return Object.prototype.hasOwnProperty.call(t,"children")},e.cloneNode=w},6996:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getFeed=void 0;var i=n(3346),r=n(3905);e.getFeed=function(t){var e=l(u,t);return e?"feed"===e.name?function(t){var e,n=t.children,i={type:"atom",items:(0,r.getElementsByTagName)("entry",n).map((function(t){var e,n=t.children,i={media:o(n)};c(i,"id","id",n),c(i,"title","title",n);var r=null===(e=l("link",n))||void 0===e?void 0:e.attribs.href;r&&(i.link=r);var s=h("summary",n)||h("content",n);s&&(i.description=s);var a=h("updated",n);return a&&(i.pubDate=new Date(a)),i}))};c(i,"id","id",n),c(i,"title","title",n);var s=null===(e=l("link",n))||void 0===e?void 0:e.attribs.href;s&&(i.link=s);c(i,"description","subtitle",n);var a=h("updated",n);a&&(i.updated=new Date(a));return c(i,"author","email",n,!0),i}(e):function(t){var e,n,i=null!==(n=null===(e=l("channel",t.children))||void 0===e?void 0:e.children)&&void 0!==n?n:[],s={type:t.name.substr(0,3),id:"",items:(0,r.getElementsByTagName)("item",t.children).map((function(t){var e=t.children,n={media:o(e)};c(n,"id","guid",e),c(n,"title","title",e),c(n,"link","link",e),c(n,"description","description",e);var i=h("pubDate",e);return i&&(n.pubDate=new Date(i)),n}))};c(s,"title","title",i),c(s,"link","link",i),c(s,"description","description",i);var a=h("lastBuildDate",i);a&&(s.updated=new Date(a));return c(s,"author","managingEditor",i,!0),s}(e):null};var s=["url","type","lang"],a=["fileSize","bitrate","framerate","samplingrate","channels","duration","height","width"];function o(t){return(0,r.getElementsByTagName)("media:content",t).map((function(t){for(var e=t.attribs,n={medium:e.medium,isDefault:!!e.isDefault},i=0,r=s;i<r.length;i++){e[h=r[i]]&&(n[h]=e[h])}for(var o=0,l=a;o<l.length;o++){var h;e[h=l[o]]&&(n[h]=parseInt(e[h],10))}return e.expression&&(n.expression=e.expression),n}))}function l(t,e){return(0,r.getElementsByTagName)(t,e,!0,1)[0]}function h(t,e,n){return void 0===n&&(n=!1),(0,i.textContent)((0,r.getElementsByTagName)(t,e,n,1)).trim()}function c(t,e,n,i,r){void 0===r&&(r=!1);var s=h(n,i,r);s&&(t[e]=s)}function u(t){return"rss"===t||"feed"===t||"rdf:RDF"===t}},4975:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.uniqueSort=e.compareDocumentPosition=e.removeSubsets=void 0;var i=n(7915);function r(t,e){var n=[],r=[];if(t===e)return 0;for(var s=(0,i.hasChildren)(t)?t:t.parent;s;)n.unshift(s),s=s.parent;for(s=(0,i.hasChildren)(e)?e:e.parent;s;)r.unshift(s),s=s.parent;for(var a=Math.min(n.length,r.length),o=0;o<a&&n[o]===r[o];)o++;if(0===o)return 1;var l=n[o-1],h=l.children,c=n[o],u=r[o];return h.indexOf(c)>h.indexOf(u)?l===e?20:4:l===t?10:2}e.removeSubsets=function(t){for(var e=t.length;--e>=0;){var n=t[e];if(e>0&&t.lastIndexOf(n,e-1)>=0)t.splice(e,1);else for(var i=n.parent;i;i=i.parent)if(t.includes(i)){t.splice(e,1);break}}return t},e.compareDocumentPosition=r,e.uniqueSort=function(t){return(t=t.filter((function(t,e,n){return!n.includes(t,e+1)}))).sort((function(t,e){var n=r(t,e);return 2&n?-1:4&n?1:0})),t}},9432:function(t,e,n){"use strict";var i=this&&this.__createBinding||(Object.create?function(t,e,n,i){void 0===i&&(i=n),Object.defineProperty(t,i,{enumerable:!0,get:function(){return e[n]}})}:function(t,e,n,i){void 0===i&&(i=n),t[i]=e[n]}),r=this&&this.__exportStar||function(t,e){for(var n in t)"default"===n||Object.prototype.hasOwnProperty.call(e,n)||i(e,t,n)};Object.defineProperty(e,"__esModule",{value:!0}),e.hasChildren=e.isDocument=e.isComment=e.isText=e.isCDATA=e.isTag=void 0,r(n(3346),e),r(n(5010),e),r(n(6765),e),r(n(8043),e),r(n(3905),e),r(n(4975),e),r(n(6996),e);var s=n(7915);Object.defineProperty(e,"isTag",{enumerable:!0,get:function(){return s.isTag}}),Object.defineProperty(e,"isCDATA",{enumerable:!0,get:function(){return s.isCDATA}}),Object.defineProperty(e,"isText",{enumerable:!0,get:function(){return s.isText}}),Object.defineProperty(e,"isComment",{enumerable:!0,get:function(){return s.isComment}}),Object.defineProperty(e,"isDocument",{enumerable:!0,get:function(){return s.isDocument}}),Object.defineProperty(e,"hasChildren",{enumerable:!0,get:function(){return s.hasChildren}})},3905:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getElementsByTagType=e.getElementsByTagName=e.getElementById=e.getElements=e.testElement=void 0;var i=n(7915),r=n(8043),s={tag_name:function(t){return"function"==typeof t?function(e){return(0,i.isTag)(e)&&t(e.name)}:"*"===t?i.isTag:function(e){return(0,i.isTag)(e)&&e.name===t}},tag_type:function(t){return"function"==typeof t?function(e){return t(e.type)}:function(e){return e.type===t}},tag_contains:function(t){return"function"==typeof t?function(e){return(0,i.isText)(e)&&t(e.data)}:function(e){return(0,i.isText)(e)&&e.data===t}}};function a(t,e){return"function"==typeof e?function(n){return(0,i.isTag)(n)&&e(n.attribs[t])}:function(n){return(0,i.isTag)(n)&&n.attribs[t]===e}}function o(t,e){return function(n){return t(n)||e(n)}}function l(t){var e=Object.keys(t).map((function(e){var n=t[e];return Object.prototype.hasOwnProperty.call(s,e)?s[e](n):a(e,n)}));return 0===e.length?null:e.reduce(o)}e.testElement=function(t,e){var n=l(t);return!n||n(e)},e.getElements=function(t,e,n,i){void 0===i&&(i=1/0);var s=l(t);return s?(0,r.filter)(s,e,n,i):[]},e.getElementById=function(t,e,n){return void 0===n&&(n=!0),Array.isArray(e)||(e=[e]),(0,r.findOne)(a("id",t),e,n)},e.getElementsByTagName=function(t,e,n,i){return void 0===n&&(n=!0),void 0===i&&(i=1/0),(0,r.filter)(s.tag_name(t),e,n,i)},e.getElementsByTagType=function(t,e,n,i){return void 0===n&&(n=!0),void 0===i&&(i=1/0),(0,r.filter)(s.tag_type(t),e,n,i)}},6765:(t,e)=>{"use strict";function n(t){if(t.prev&&(t.prev.next=t.next),t.next&&(t.next.prev=t.prev),t.parent){var e=t.parent.children;e.splice(e.lastIndexOf(t),1)}}Object.defineProperty(e,"__esModule",{value:!0}),e.prepend=e.prependChild=e.append=e.appendChild=e.replaceElement=e.removeElement=void 0,e.removeElement=n,e.replaceElement=function(t,e){var n=e.prev=t.prev;n&&(n.next=e);var i=e.next=t.next;i&&(i.prev=e);var r=e.parent=t.parent;if(r){var s=r.children;s[s.lastIndexOf(t)]=e}},e.appendChild=function(t,e){if(n(e),e.next=null,e.parent=t,t.children.push(e)>1){var i=t.children[t.children.length-2];i.next=e,e.prev=i}else e.prev=null},e.append=function(t,e){n(e);var i=t.parent,r=t.next;if(e.next=r,e.prev=t,t.next=e,e.parent=i,r){if(r.prev=e,i){var s=i.children;s.splice(s.lastIndexOf(r),0,e)}}else i&&i.children.push(e)},e.prependChild=function(t,e){if(n(e),e.parent=t,e.prev=null,1!==t.children.unshift(e)){var i=t.children[1];i.prev=e,e.next=i}else e.next=null},e.prepend=function(t,e){n(e);var i=t.parent;if(i){var r=i.children;r.splice(r.indexOf(t),0,e)}t.prev&&(t.prev.next=e),e.parent=i,e.prev=t.prev,e.next=t,t.prev=e}},8043:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.findAll=e.existsOne=e.findOne=e.findOneChild=e.find=e.filter=void 0;var i=n(7915);function r(t,e,n,s){for(var a=[],o=0,l=e;o<l.length;o++){var h=l[o];if(t(h)&&(a.push(h),--s<=0))break;if(n&&(0,i.hasChildren)(h)&&h.children.length>0){var c=r(t,h.children,n,s);if(a.push.apply(a,c),(s-=c.length)<=0)break}}return a}e.filter=function(t,e,n,i){return void 0===n&&(n=!0),void 0===i&&(i=1/0),Array.isArray(e)||(e=[e]),r(t,e,n,i)},e.find=r,e.findOneChild=function(t,e){return e.find(t)},e.findOne=function t(e,n,r){void 0===r&&(r=!0);for(var s=null,a=0;a<n.length&&!s;a++){var o=n[a];(0,i.isTag)(o)&&(e(o)?s=o:r&&o.children.length>0&&(s=t(e,o.children)))}return s},e.existsOne=function t(e,n){return n.some((function(n){return(0,i.isTag)(n)&&(e(n)||n.children.length>0&&t(e,n.children))}))},e.findAll=function(t,e){for(var n,r,s=[],a=e.filter(i.isTag);r=a.shift();){var o=null===(n=r.children)||void 0===n?void 0:n.filter(i.isTag);o&&o.length>0&&a.unshift.apply(a,o),t(r)&&s.push(r)}return s}},3346:function(t,e,n){"use strict";var i=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.innerText=e.textContent=e.getText=e.getInnerHTML=e.getOuterHTML=void 0;var r=n(7915),s=i(n(7220)),a=n(9960);function o(t,e){return(0,s.default)(t,e)}e.getOuterHTML=o,e.getInnerHTML=function(t,e){return(0,r.hasChildren)(t)?t.children.map((function(t){return o(t,e)})).join(""):""},e.getText=function t(e){return Array.isArray(e)?e.map(t).join(""):(0,r.isTag)(e)?"br"===e.name?"\n":t(e.children):(0,r.isCDATA)(e)?t(e.children):(0,r.isText)(e)?e.data:""},e.textContent=function t(e){return Array.isArray(e)?e.map(t).join(""):(0,r.hasChildren)(e)&&!(0,r.isComment)(e)?t(e.children):(0,r.isText)(e)?e.data:""},e.innerText=function t(e){return Array.isArray(e)?e.map(t).join(""):(0,r.hasChildren)(e)&&(e.type===a.ElementType.Tag||(0,r.isCDATA)(e))?t(e.children):(0,r.isText)(e)?e.data:""}},5010:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.prevElementSibling=e.nextElementSibling=e.getName=e.hasAttrib=e.getAttributeValue=e.getSiblings=e.getParent=e.getChildren=void 0;var i=n(7915),r=[];function s(t){var e;return null!==(e=t.children)&&void 0!==e?e:r}function a(t){return t.parent||null}e.getChildren=s,e.getParent=a,e.getSiblings=function(t){var e=a(t);if(null!=e)return s(e);for(var n=[t],i=t.prev,r=t.next;null!=i;)n.unshift(i),i=i.prev;for(;null!=r;)n.push(r),r=r.next;return n},e.getAttributeValue=function(t,e){var n;return null===(n=t.attribs)||void 0===n?void 0:n[e]},e.hasAttrib=function(t,e){return null!=t.attribs&&Object.prototype.hasOwnProperty.call(t.attribs,e)&&null!=t.attribs[e]},e.getName=function(t){return t.name},e.nextElementSibling=function(t){for(var e=t.next;null!==e&&!(0,i.isTag)(e);)e=e.next;return e},e.prevElementSibling=function(t){for(var e=t.prev;null!==e&&!(0,i.isTag)(e);)e=e.prev;return e}},4076:function(t,e,n){"use strict";var i=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.decodeHTML=e.decodeHTMLStrict=e.decodeXML=void 0;var r=i(n(9323)),s=i(n(9591)),a=i(n(2586)),o=i(n(26)),l=/&(?:[a-zA-Z0-9]+|#[xX][\da-fA-F]+|#\d+);/g;function h(t){var e=u(t);return function(t){return String(t).replace(l,e)}}e.decodeXML=h(a.default),e.decodeHTMLStrict=h(r.default);var c=function(t,e){return t<e?1:-1};function u(t){return function(e){if("#"===e.charAt(1)){var n=e.charAt(2);return"X"===n||"x"===n?o.default(parseInt(e.substr(3),16)):o.default(parseInt(e.substr(2),10))}return t[e.slice(1,-1)]||e}}e.decodeHTML=function(){for(var t=Object.keys(s.default).sort(c),e=Object.keys(r.default).sort(c),n=0,i=0;n<e.length;n++)t[i]===e[n]?(e[n]+=";?",i++):e[n]+=";";var a=new RegExp("&(?:"+e.join("|")+"|#[xX][\\da-fA-F]+;?|#\\d+;?)","g"),o=u(r.default);function l(t){return";"!==t.substr(-1)&&(t+=";"),o(t)}return function(t){return String(t).replace(a,l)}}()},26:function(t,e,n){"use strict";var i=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0});var r=i(n(3600)),s=String.fromCodePoint||function(t){var e="";return t>65535&&(t-=65536,e+=String.fromCharCode(t>>>10&1023|55296),t=56320|1023&t),e+=String.fromCharCode(t)};e.default=function(t){return t>=55296&&t<=57343||t>1114111?"�":(t in r.default&&(t=r.default[t]),s(t))}},7322:function(t,e,n){"use strict";var i=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.escapeUTF8=e.escape=e.encodeNonAsciiHTML=e.encodeHTML=e.encodeXML=void 0;var r=c(i(n(2586)).default),s=u(r);e.encodeXML=g(r);var a,o,l=c(i(n(9323)).default),h=u(l);function c(t){return Object.keys(t).sort().reduce((function(e,n){return e[t[n]]="&"+n+";",e}),{})}function u(t){for(var e=[],n=[],i=0,r=Object.keys(t);i<r.length;i++){var s=r[i];1===s.length?e.push("\\"+s):n.push(s)}e.sort();for(var a=0;a<e.length-1;a++){for(var o=a;o<e.length-1&&e[o].charCodeAt(1)+1===e[o+1].charCodeAt(1);)o+=1;var l=1+o-a;l<3||e.splice(a,l,e[a]+"-"+e[o])}return n.unshift("["+e.join("")+"]"),new RegExp(n.join("|"),"g")}e.encodeHTML=(a=l,o=h,function(t){return t.replace(o,(function(t){return a[t]})).replace(d,f)}),e.encodeNonAsciiHTML=g(l);var d=/(?:[\x80-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g,p=null!=String.prototype.codePointAt?function(t){return t.codePointAt(0)}:function(t){return 1024*(t.charCodeAt(0)-55296)+t.charCodeAt(1)-56320+65536};function f(t){return"&#x"+(t.length>1?p(t):t.charCodeAt(0)).toString(16).toUpperCase()+";"}var m=new RegExp(s.source+"|"+d.source,"g");function g(t){return function(e){return e.replace(m,(function(e){return t[e]||f(e)}))}}e.escape=function(t){return t.replace(m,f)},e.escapeUTF8=function(t){return t.replace(s,f)}},5863:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.decodeXMLStrict=e.decodeHTML5Strict=e.decodeHTML4Strict=e.decodeHTML5=e.decodeHTML4=e.decodeHTMLStrict=e.decodeHTML=e.decodeXML=e.encodeHTML5=e.encodeHTML4=e.escapeUTF8=e.escape=e.encodeNonAsciiHTML=e.encodeHTML=e.encodeXML=e.encode=e.decodeStrict=e.decode=void 0;var i=n(4076),r=n(7322);e.decode=function(t,e){return(!e||e<=0?i.decodeXML:i.decodeHTML)(t)},e.decodeStrict=function(t,e){return(!e||e<=0?i.decodeXML:i.decodeHTMLStrict)(t)},e.encode=function(t,e){return(!e||e<=0?r.encodeXML:r.encodeHTML)(t)};var s=n(7322);Object.defineProperty(e,"encodeXML",{enumerable:!0,get:function(){return s.encodeXML}}),Object.defineProperty(e,"encodeHTML",{enumerable:!0,get:function(){return s.encodeHTML}}),Object.defineProperty(e,"encodeNonAsciiHTML",{enumerable:!0,get:function(){return s.encodeNonAsciiHTML}}),Object.defineProperty(e,"escape",{enumerable:!0,get:function(){return s.escape}}),Object.defineProperty(e,"escapeUTF8",{enumerable:!0,get:function(){return s.escapeUTF8}}),Object.defineProperty(e,"encodeHTML4",{enumerable:!0,get:function(){return s.encodeHTML}}),Object.defineProperty(e,"encodeHTML5",{enumerable:!0,get:function(){return s.encodeHTML}});var a=n(4076);Object.defineProperty(e,"decodeXML",{enumerable:!0,get:function(){return a.decodeXML}}),Object.defineProperty(e,"decodeHTML",{enumerable:!0,get:function(){return a.decodeHTML}}),Object.defineProperty(e,"decodeHTMLStrict",{enumerable:!0,get:function(){return a.decodeHTMLStrict}}),Object.defineProperty(e,"decodeHTML4",{enumerable:!0,get:function(){return a.decodeHTML}}),Object.defineProperty(e,"decodeHTML5",{enumerable:!0,get:function(){return a.decodeHTML}}),Object.defineProperty(e,"decodeHTML4Strict",{enumerable:!0,get:function(){return a.decodeHTMLStrict}}),Object.defineProperty(e,"decodeHTML5Strict",{enumerable:!0,get:function(){return a.decodeHTMLStrict}}),Object.defineProperty(e,"decodeXMLStrict",{enumerable:!0,get:function(){return a.decodeXML}})},8460:(t,e,n)=>{t.exports=function(t){var e,n,u,d=0,p=0,f=l,m=[],g=[],v=1,x=0,_=0,y=!1,b=!1,w="",S=s,M=i;"300 es"===(t=t||{}).version&&(S=o,M=a);var T={},E={};for(d=0;d<S.length;d++)T[S[d]]=!0;for(d=0;d<M.length;d++)E[M[d]]=!0;return function(t){return g=[],null!==t?function(t){d=0,t.toString&&(t=t.toString());var n;w+=t.replace(/\r\n/g,"\n"),u=w.length;for(;e=w[d],d<u;){switch(n=d,f){case 0:d=P();break;case 1:d=k();break;case 2:d=D();break;case 3:d=L();break;case 4:d=I();break;case 11:d=O();break;case 5:d=N();break;case h:d=F();break;case 9:d=R();break;case l:d=C()}if(n!==d)if("\n"===w[n])x=0,++v;else++x}return p+=d,w=w.slice(d),g}(t):function(t){m.length&&A(m.join(""));return f=10,A("(eof)"),g}()};function A(t){t.length&&g.push({type:c[f],data:t,position:_,line:v,column:x})}function C(){return m=m.length?[]:m,"/"===n&&"*"===e?(_=p+d-1,f=0,n=e,d+1):"/"===n&&"/"===e?(_=p+d-1,f=1,n=e,d+1):"#"===e?(f=2,_=p+d,d):/\s/.test(e)?(f=9,_=p+d,d):(y=/\d/.test(e),b=/[^\w_]/.test(e),_=p+d,f=y?4:b?3:h,d)}function R(){return/[^\s]/g.test(e)?(A(m.join("")),f=l,d):(m.push(e),n=e,d+1)}function D(){return"\r"!==e&&"\n"!==e||"\\"===n?(m.push(e),n=e,d+1):(A(m.join("")),f=l,d)}function k(){return D()}function P(){return"/"===e&&"*"===n?(m.push(e),A(m.join("")),f=l,d+1):(m.push(e),n=e,d+1)}function L(){if("."===n&&/\d/.test(e))return f=5,d;if("/"===n&&"*"===e)return f=0,d;if("/"===n&&"/"===e)return f=1,d;if("."===e&&m.length){for(;z(m););return f=5,d}if(";"===e||")"===e||"("===e){if(m.length)for(;z(m););return A(e),f=l,d+1}var t=2===m.length&&"="!==e;if(/[\w_\d\s]/.test(e)||t){for(;z(m););return f=l,d}return m.push(e),n=e,d+1}function z(t){for(var e,n,i=0;;){if(e=r.indexOf(t.slice(0,t.length+i).join("")),n=r[e],-1===e){if(i--+t.length>0)continue;n=t.slice(0,1).join("")}return A(n),_+=n.length,(m=m.slice(n.length)).length}}function O(){return/[^a-fA-F0-9]/.test(e)?(A(m.join("")),f=l,d):(m.push(e),n=e,d+1)}function I(){return"."===e||/[eE]/.test(e)?(m.push(e),f=5,n=e,d+1):"x"===e&&1===m.length&&"0"===m[0]?(f=11,m.push(e),n=e,d+1):/[^\d]/.test(e)?(A(m.join("")),f=l,d):(m.push(e),n=e,d+1)}function N(){return"f"===e&&(m.push(e),n=e,d+=1),/[eE]/.test(e)?(m.push(e),n=e,d+1):("-"!==e&&"+"!==e||!/[eE]/.test(n))&&/[^\d]/.test(e)?(A(m.join("")),f=l,d):(m.push(e),n=e,d+1)}function F(){if(/[^\d\w_]/.test(e)){var t=m.join("");return f=E[t]?8:T[t]?7:6,A(m.join("")),f=l,d}return m.push(e),n=e,d+1}};var i=n(7529),r=n(7679),s=n(2222),a=n(2914),o=n(9537),l=999,h=9999,c=["block-comment","line-comment","preprocessor","operator","integer","float","ident","builtin","keyword","whitespace","eof","integer"]},9537:(t,e,n)=>{var i=n(2222);i=i.slice().filter((function(t){return!/^(gl\_|texture)/.test(t)})),t.exports=i.concat(["gl_VertexID","gl_InstanceID","gl_Position","gl_PointSize","gl_FragCoord","gl_FrontFacing","gl_FragDepth","gl_PointCoord","gl_MaxVertexAttribs","gl_MaxVertexUniformVectors","gl_MaxVertexOutputVectors","gl_MaxFragmentInputVectors","gl_MaxVertexTextureImageUnits","gl_MaxCombinedTextureImageUnits","gl_MaxTextureImageUnits","gl_MaxFragmentUniformVectors","gl_MaxDrawBuffers","gl_MinProgramTexelOffset","gl_MaxProgramTexelOffset","gl_DepthRangeParameters","gl_DepthRange","trunc","round","roundEven","isnan","isinf","floatBitsToInt","floatBitsToUint","intBitsToFloat","uintBitsToFloat","packSnorm2x16","unpackSnorm2x16","packUnorm2x16","unpackUnorm2x16","packHalf2x16","unpackHalf2x16","outerProduct","transpose","determinant","inverse","texture","textureSize","textureProj","textureLod","textureOffset","texelFetch","texelFetchOffset","textureProjOffset","textureLodOffset","textureProjLod","textureProjLodOffset","textureGrad","textureGradOffset","textureProjGrad","textureProjGradOffset"])},2222:t=>{t.exports=["abs","acos","all","any","asin","atan","ceil","clamp","cos","cross","dFdx","dFdy","degrees","distance","dot","equal","exp","exp2","faceforward","floor","fract","gl_BackColor","gl_BackLightModelProduct","gl_BackLightProduct","gl_BackMaterial","gl_BackSecondaryColor","gl_ClipPlane","gl_ClipVertex","gl_Color","gl_DepthRange","gl_DepthRangeParameters","gl_EyePlaneQ","gl_EyePlaneR","gl_EyePlaneS","gl_EyePlaneT","gl_Fog","gl_FogCoord","gl_FogFragCoord","gl_FogParameters","gl_FragColor","gl_FragCoord","gl_FragData","gl_FragDepth","gl_FragDepthEXT","gl_FrontColor","gl_FrontFacing","gl_FrontLightModelProduct","gl_FrontLightProduct","gl_FrontMaterial","gl_FrontSecondaryColor","gl_LightModel","gl_LightModelParameters","gl_LightModelProducts","gl_LightProducts","gl_LightSource","gl_LightSourceParameters","gl_MaterialParameters","gl_MaxClipPlanes","gl_MaxCombinedTextureImageUnits","gl_MaxDrawBuffers","gl_MaxFragmentUniformComponents","gl_MaxLights","gl_MaxTextureCoords","gl_MaxTextureImageUnits","gl_MaxTextureUnits","gl_MaxVaryingFloats","gl_MaxVertexAttribs","gl_MaxVertexTextureImageUnits","gl_MaxVertexUniformComponents","gl_ModelViewMatrix","gl_ModelViewMatrixInverse","gl_ModelViewMatrixInverseTranspose","gl_ModelViewMatrixTranspose","gl_ModelViewProjectionMatrix","gl_ModelViewProjectionMatrixInverse","gl_ModelViewProjectionMatrixInverseTranspose","gl_ModelViewProjectionMatrixTranspose","gl_MultiTexCoord0","gl_MultiTexCoord1","gl_MultiTexCoord2","gl_MultiTexCoord3","gl_MultiTexCoord4","gl_MultiTexCoord5","gl_MultiTexCoord6","gl_MultiTexCoord7","gl_Normal","gl_NormalMatrix","gl_NormalScale","gl_ObjectPlaneQ","gl_ObjectPlaneR","gl_ObjectPlaneS","gl_ObjectPlaneT","gl_Point","gl_PointCoord","gl_PointParameters","gl_PointSize","gl_Position","gl_ProjectionMatrix","gl_ProjectionMatrixInverse","gl_ProjectionMatrixInverseTranspose","gl_ProjectionMatrixTranspose","gl_SecondaryColor","gl_TexCoord","gl_TextureEnvColor","gl_TextureMatrix","gl_TextureMatrixInverse","gl_TextureMatrixInverseTranspose","gl_TextureMatrixTranspose","gl_Vertex","greaterThan","greaterThanEqual","inversesqrt","length","lessThan","lessThanEqual","log","log2","matrixCompMult","max","min","mix","mod","normalize","not","notEqual","pow","radians","reflect","refract","sign","sin","smoothstep","sqrt","step","tan","texture2D","texture2DLod","texture2DProj","texture2DProjLod","textureCube","textureCubeLod","texture2DLodEXT","texture2DProjLodEXT","textureCubeLodEXT","texture2DGradEXT","texture2DProjGradEXT","textureCubeGradEXT"]},2914:(t,e,n)=>{var i=n(7529);t.exports=i.slice().concat(["layout","centroid","smooth","case","mat2x2","mat2x3","mat2x4","mat3x2","mat3x3","mat3x4","mat4x2","mat4x3","mat4x4","uvec2","uvec3","uvec4","samplerCubeShadow","sampler2DArray","sampler2DArrayShadow","isampler2D","isampler3D","isamplerCube","isampler2DArray","usampler2D","usampler3D","usamplerCube","usampler2DArray","coherent","restrict","readonly","writeonly","resource","atomic_uint","noperspective","patch","sample","subroutine","common","partition","active","filter","image1D","image2D","image3D","imageCube","iimage1D","iimage2D","iimage3D","iimageCube","uimage1D","uimage2D","uimage3D","uimageCube","image1DArray","image2DArray","iimage1DArray","iimage2DArray","uimage1DArray","uimage2DArray","image1DShadow","image2DShadow","image1DArrayShadow","image2DArrayShadow","imageBuffer","iimageBuffer","uimageBuffer","sampler1DArray","sampler1DArrayShadow","isampler1D","isampler1DArray","usampler1D","usampler1DArray","isampler2DRect","usampler2DRect","samplerBuffer","isamplerBuffer","usamplerBuffer","sampler2DMS","isampler2DMS","usampler2DMS","sampler2DMSArray","isampler2DMSArray","usampler2DMSArray"])},7529:t=>{t.exports=["precision","highp","mediump","lowp","attribute","const","uniform","varying","break","continue","do","for","while","if","else","in","out","inout","float","int","uint","void","bool","true","false","discard","return","mat2","mat3","mat4","vec2","vec3","vec4","ivec2","ivec3","ivec4","bvec2","bvec3","bvec4","sampler1D","sampler2D","sampler3D","samplerCube","sampler1DShadow","sampler2DShadow","struct","asm","class","union","enum","typedef","template","this","packed","goto","switch","default","inline","noinline","volatile","public","static","extern","external","interface","long","short","double","half","fixed","unsigned","input","output","hvec2","hvec3","hvec4","dvec2","dvec3","dvec4","fvec2","fvec3","fvec4","sampler2DRect","sampler3DRect","sampler2DRectShadow","sizeof","cast","namespace","using"]},7679:t=>{t.exports=["<<=",">>=","++","--","<<",">>","<=",">=","==","!=","&&","||","+=","-=","*=","/=","%=","&=","^^","^=","|=","(",")","[","]",".","!","~","*","/","%","+","-","<",">","&","^","|","?",":","=",",",";","{","}"]},9932:(t,e,n)=>{var i=n(8460);t.exports=function(t,e){var n=i(e),r=[];return r=(r=r.concat(n(t))).concat(n(null))}},9769:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.compile=void 0;var i=n(1073);e.compile=function(t){var e=t[0],n=t[1]-1;if(n<0&&e<=0)return i.falseFunc;if(-1===e)return function(t){return t<=n};if(0===e)return function(t){return t===n};if(1===e)return n<0?i.trueFunc:function(t){return t>=n};var r=Math.abs(e),s=(n%r+r)%r;return e>1?function(t){return t>=n&&t%r===s}:function(t){return t<=n&&t%r===s}}},7540:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.compile=e.parse=void 0;var i=n(7766);Object.defineProperty(e,"parse",{enumerable:!0,get:function(){return i.parse}});var r=n(9769);Object.defineProperty(e,"compile",{enumerable:!0,get:function(){return r.compile}}),e.default=function(t){return(0,r.compile)((0,i.parse)(t))}},7766:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.parse=void 0;var n=new Set([9,10,12,13,32]),i="0".charCodeAt(0),r="9".charCodeAt(0);e.parse=function(t){if("even"===(t=t.trim().toLowerCase()))return[2,0];if("odd"===t)return[2,1];var e=0,s=0,a=l(),o=h();if(e<t.length&&"n"===t.charAt(e)&&(e++,s=a*(null!=o?o:1),c(),e<t.length?(a=l(),c(),o=h()):a=o=0),null===o||e<t.length)throw new Error("n-th rule couldn't be parsed ('"+t+"')");return[s,a*o];function l(){return"-"===t.charAt(e)?(e++,-1):("+"===t.charAt(e)&&e++,1)}function h(){for(var n=e,s=0;e<t.length&&t.charCodeAt(e)>=i&&t.charCodeAt(e)<=r;)s=10*s+(t.charCodeAt(e)-i),e++;return e===n?null:s}function c(){for(;e<t.length&&n.has(t.charCodeAt(e));)e++}}},3981:(t,e)=>{e.make=function(t){return null==t&&(t=[]),t instanceof Array||(t=[null!=+t?+t:0]),t},e.nest=(t,e)=>t.concat(e),e.compare=function(t,e){for(let n=0,i=Math.min(t.length,e.length),r=0<=i;r?n<i:n>i;r?n++:n--){const i=t[n],r=e[n];if(i>r)return-1;if(i<r)return 1}return(t=t.length)>(e=e.length)?-1:t<e?1:0},e.max=function(t,n){return e.compare(t,n)>0?n:t}},3466:function(t){var e;t.exports=(e=function(){function t(t){return r.appendChild(t.dom),t}function n(t){for(var e=0;e<r.children.length;e++)r.children[e].style.display=e===t?"block":"none";i=t}var i=0,r=document.createElement("div");r.style.cssText="position:fixed;top:0;left:0;cursor:pointer;opacity:0.9;z-index:10000",r.addEventListener("click",(function(t){t.preventDefault(),n(++i%r.children.length)}),!1);var s=(performance||Date).now(),a=s,o=0,l=t(new e.Panel("FPS","#0ff","#002")),h=t(new e.Panel("MS","#0f0","#020"));if(self.performance&&self.performance.memory)var c=t(new e.Panel("MB","#f08","#201"));return n(0),{REVISION:16,dom:r,addPanel:t,showPanel:n,begin:function(){s=(performance||Date).now()},end:function(){o++;var t=(performance||Date).now();if(h.update(t-s,200),t>a+1e3&&(l.update(1e3*o/(t-a),100),a=t,o=0,c)){var e=performance.memory;c.update(e.usedJSHeapSize/1048576,e.jsHeapSizeLimit/1048576)}return t},update:function(){s=this.end()},domElement:r,setMode:n}},e.Panel=function(t,e,n){var i=1/0,r=0,s=Math.round,a=s(window.devicePixelRatio||1),o=80*a,l=48*a,h=3*a,c=2*a,u=3*a,d=15*a,p=74*a,f=30*a,m=document.createElement("canvas");m.width=o,m.height=l,m.style.cssText="width:80px;height:48px";var g=m.getContext("2d");return g.font="bold "+9*a+"px Helvetica,Arial,sans-serif",g.textBaseline="top",g.fillStyle=n,g.fillRect(0,0,o,l),g.fillStyle=e,g.fillText(t,h,c),g.fillRect(u,d,p,f),g.fillStyle=n,g.globalAlpha=.9,g.fillRect(u,d,p,f),{dom:m,update:function(l,v){i=Math.min(i,l),r=Math.max(r,l),g.fillStyle=n,g.globalAlpha=1,g.fillRect(0,0,o,d),g.fillStyle=e,g.fillText(s(l)+" "+t+" ("+s(i)+"-"+s(r)+")",h,c),g.drawImage(m,u+a,d,p-a,f,u,d,p-a,f),g.fillRect(u+p-a,d,a,f),g.fillStyle=n,g.globalAlpha=.9,g.fillRect(u+p-a,d,a,s((1-l/v)*f))}}},e)},824:e=>{"use strict";e.exports=t},3600:t=>{"use strict";t.exports=JSON.parse('{"0":65533,"128":8364,"130":8218,"131":402,"132":8222,"133":8230,"134":8224,"135":8225,"136":710,"137":8240,"138":352,"139":8249,"140":338,"142":381,"145":8216,"146":8217,"147":8220,"148":8221,"149":8226,"150":8211,"151":8212,"152":732,"153":8482,"154":353,"155":8250,"156":339,"158":382,"159":376}')},9323:t=>{"use strict";t.exports=JSON.parse('{"Aacute":"Á","aacute":"á","Abreve":"Ă","abreve":"ă","ac":"∾","acd":"∿","acE":"∾̳","Acirc":"Â","acirc":"â","acute":"´","Acy":"А","acy":"а","AElig":"Æ","aelig":"æ","af":"⁡","Afr":"𝔄","afr":"𝔞","Agrave":"À","agrave":"à","alefsym":"ℵ","aleph":"ℵ","Alpha":"Α","alpha":"α","Amacr":"Ā","amacr":"ā","amalg":"⨿","amp":"&","AMP":"&","andand":"⩕","And":"⩓","and":"∧","andd":"⩜","andslope":"⩘","andv":"⩚","ang":"∠","ange":"⦤","angle":"∠","angmsdaa":"⦨","angmsdab":"⦩","angmsdac":"⦪","angmsdad":"⦫","angmsdae":"⦬","angmsdaf":"⦭","angmsdag":"⦮","angmsdah":"⦯","angmsd":"∡","angrt":"∟","angrtvb":"⊾","angrtvbd":"⦝","angsph":"∢","angst":"Å","angzarr":"⍼","Aogon":"Ą","aogon":"ą","Aopf":"𝔸","aopf":"𝕒","apacir":"⩯","ap":"≈","apE":"⩰","ape":"≊","apid":"≋","apos":"\'","ApplyFunction":"⁡","approx":"≈","approxeq":"≊","Aring":"Å","aring":"å","Ascr":"𝒜","ascr":"𝒶","Assign":"≔","ast":"*","asymp":"≈","asympeq":"≍","Atilde":"Ã","atilde":"ã","Auml":"Ä","auml":"ä","awconint":"∳","awint":"⨑","backcong":"≌","backepsilon":"϶","backprime":"‵","backsim":"∽","backsimeq":"⋍","Backslash":"∖","Barv":"⫧","barvee":"⊽","barwed":"⌅","Barwed":"⌆","barwedge":"⌅","bbrk":"⎵","bbrktbrk":"⎶","bcong":"≌","Bcy":"Б","bcy":"б","bdquo":"„","becaus":"∵","because":"∵","Because":"∵","bemptyv":"⦰","bepsi":"϶","bernou":"ℬ","Bernoullis":"ℬ","Beta":"Β","beta":"β","beth":"ℶ","between":"≬","Bfr":"𝔅","bfr":"𝔟","bigcap":"⋂","bigcirc":"◯","bigcup":"⋃","bigodot":"⨀","bigoplus":"⨁","bigotimes":"⨂","bigsqcup":"⨆","bigstar":"★","bigtriangledown":"▽","bigtriangleup":"△","biguplus":"⨄","bigvee":"⋁","bigwedge":"⋀","bkarow":"⤍","blacklozenge":"⧫","blacksquare":"▪","blacktriangle":"▴","blacktriangledown":"▾","blacktriangleleft":"◂","blacktriangleright":"▸","blank":"␣","blk12":"▒","blk14":"░","blk34":"▓","block":"█","bne":"=⃥","bnequiv":"≡⃥","bNot":"⫭","bnot":"⌐","Bopf":"𝔹","bopf":"𝕓","bot":"⊥","bottom":"⊥","bowtie":"⋈","boxbox":"⧉","boxdl":"┐","boxdL":"╕","boxDl":"╖","boxDL":"╗","boxdr":"┌","boxdR":"╒","boxDr":"╓","boxDR":"╔","boxh":"─","boxH":"═","boxhd":"┬","boxHd":"╤","boxhD":"╥","boxHD":"╦","boxhu":"┴","boxHu":"╧","boxhU":"╨","boxHU":"╩","boxminus":"⊟","boxplus":"⊞","boxtimes":"⊠","boxul":"┘","boxuL":"╛","boxUl":"╜","boxUL":"╝","boxur":"└","boxuR":"╘","boxUr":"╙","boxUR":"╚","boxv":"│","boxV":"║","boxvh":"┼","boxvH":"╪","boxVh":"╫","boxVH":"╬","boxvl":"┤","boxvL":"╡","boxVl":"╢","boxVL":"╣","boxvr":"├","boxvR":"╞","boxVr":"╟","boxVR":"╠","bprime":"‵","breve":"˘","Breve":"˘","brvbar":"¦","bscr":"𝒷","Bscr":"ℬ","bsemi":"⁏","bsim":"∽","bsime":"⋍","bsolb":"⧅","bsol":"\\\\","bsolhsub":"⟈","bull":"•","bullet":"•","bump":"≎","bumpE":"⪮","bumpe":"≏","Bumpeq":"≎","bumpeq":"≏","Cacute":"Ć","cacute":"ć","capand":"⩄","capbrcup":"⩉","capcap":"⩋","cap":"∩","Cap":"⋒","capcup":"⩇","capdot":"⩀","CapitalDifferentialD":"ⅅ","caps":"∩︀","caret":"⁁","caron":"ˇ","Cayleys":"ℭ","ccaps":"⩍","Ccaron":"Č","ccaron":"č","Ccedil":"Ç","ccedil":"ç","Ccirc":"Ĉ","ccirc":"ĉ","Cconint":"∰","ccups":"⩌","ccupssm":"⩐","Cdot":"Ċ","cdot":"ċ","cedil":"¸","Cedilla":"¸","cemptyv":"⦲","cent":"¢","centerdot":"·","CenterDot":"·","cfr":"𝔠","Cfr":"ℭ","CHcy":"Ч","chcy":"ч","check":"✓","checkmark":"✓","Chi":"Χ","chi":"χ","circ":"ˆ","circeq":"≗","circlearrowleft":"↺","circlearrowright":"↻","circledast":"⊛","circledcirc":"⊚","circleddash":"⊝","CircleDot":"⊙","circledR":"®","circledS":"Ⓢ","CircleMinus":"⊖","CirclePlus":"⊕","CircleTimes":"⊗","cir":"○","cirE":"⧃","cire":"≗","cirfnint":"⨐","cirmid":"⫯","cirscir":"⧂","ClockwiseContourIntegral":"∲","CloseCurlyDoubleQuote":"”","CloseCurlyQuote":"’","clubs":"♣","clubsuit":"♣","colon":":","Colon":"∷","Colone":"⩴","colone":"≔","coloneq":"≔","comma":",","commat":"@","comp":"∁","compfn":"∘","complement":"∁","complexes":"ℂ","cong":"≅","congdot":"⩭","Congruent":"≡","conint":"∮","Conint":"∯","ContourIntegral":"∮","copf":"𝕔","Copf":"ℂ","coprod":"∐","Coproduct":"∐","copy":"©","COPY":"©","copysr":"℗","CounterClockwiseContourIntegral":"∳","crarr":"↵","cross":"✗","Cross":"⨯","Cscr":"𝒞","cscr":"𝒸","csub":"⫏","csube":"⫑","csup":"⫐","csupe":"⫒","ctdot":"⋯","cudarrl":"⤸","cudarrr":"⤵","cuepr":"⋞","cuesc":"⋟","cularr":"↶","cularrp":"⤽","cupbrcap":"⩈","cupcap":"⩆","CupCap":"≍","cup":"∪","Cup":"⋓","cupcup":"⩊","cupdot":"⊍","cupor":"⩅","cups":"∪︀","curarr":"↷","curarrm":"⤼","curlyeqprec":"⋞","curlyeqsucc":"⋟","curlyvee":"⋎","curlywedge":"⋏","curren":"¤","curvearrowleft":"↶","curvearrowright":"↷","cuvee":"⋎","cuwed":"⋏","cwconint":"∲","cwint":"∱","cylcty":"⌭","dagger":"†","Dagger":"‡","daleth":"ℸ","darr":"↓","Darr":"↡","dArr":"⇓","dash":"‐","Dashv":"⫤","dashv":"⊣","dbkarow":"⤏","dblac":"˝","Dcaron":"Ď","dcaron":"ď","Dcy":"Д","dcy":"д","ddagger":"‡","ddarr":"⇊","DD":"ⅅ","dd":"ⅆ","DDotrahd":"⤑","ddotseq":"⩷","deg":"°","Del":"∇","Delta":"Δ","delta":"δ","demptyv":"⦱","dfisht":"⥿","Dfr":"𝔇","dfr":"𝔡","dHar":"⥥","dharl":"⇃","dharr":"⇂","DiacriticalAcute":"´","DiacriticalDot":"˙","DiacriticalDoubleAcute":"˝","DiacriticalGrave":"`","DiacriticalTilde":"˜","diam":"⋄","diamond":"⋄","Diamond":"⋄","diamondsuit":"♦","diams":"♦","die":"¨","DifferentialD":"ⅆ","digamma":"ϝ","disin":"⋲","div":"÷","divide":"÷","divideontimes":"⋇","divonx":"⋇","DJcy":"Ђ","djcy":"ђ","dlcorn":"⌞","dlcrop":"⌍","dollar":"$","Dopf":"𝔻","dopf":"𝕕","Dot":"¨","dot":"˙","DotDot":"⃜","doteq":"≐","doteqdot":"≑","DotEqual":"≐","dotminus":"∸","dotplus":"∔","dotsquare":"⊡","doublebarwedge":"⌆","DoubleContourIntegral":"∯","DoubleDot":"¨","DoubleDownArrow":"⇓","DoubleLeftArrow":"⇐","DoubleLeftRightArrow":"⇔","DoubleLeftTee":"⫤","DoubleLongLeftArrow":"⟸","DoubleLongLeftRightArrow":"⟺","DoubleLongRightArrow":"⟹","DoubleRightArrow":"⇒","DoubleRightTee":"⊨","DoubleUpArrow":"⇑","DoubleUpDownArrow":"⇕","DoubleVerticalBar":"∥","DownArrowBar":"⤓","downarrow":"↓","DownArrow":"↓","Downarrow":"⇓","DownArrowUpArrow":"⇵","DownBreve":"̑","downdownarrows":"⇊","downharpoonleft":"⇃","downharpoonright":"⇂","DownLeftRightVector":"⥐","DownLeftTeeVector":"⥞","DownLeftVectorBar":"⥖","DownLeftVector":"↽","DownRightTeeVector":"⥟","DownRightVectorBar":"⥗","DownRightVector":"⇁","DownTeeArrow":"↧","DownTee":"⊤","drbkarow":"⤐","drcorn":"⌟","drcrop":"⌌","Dscr":"𝒟","dscr":"𝒹","DScy":"Ѕ","dscy":"ѕ","dsol":"⧶","Dstrok":"Đ","dstrok":"đ","dtdot":"⋱","dtri":"▿","dtrif":"▾","duarr":"⇵","duhar":"⥯","dwangle":"⦦","DZcy":"Џ","dzcy":"џ","dzigrarr":"⟿","Eacute":"É","eacute":"é","easter":"⩮","Ecaron":"Ě","ecaron":"ě","Ecirc":"Ê","ecirc":"ê","ecir":"≖","ecolon":"≕","Ecy":"Э","ecy":"э","eDDot":"⩷","Edot":"Ė","edot":"ė","eDot":"≑","ee":"ⅇ","efDot":"≒","Efr":"𝔈","efr":"𝔢","eg":"⪚","Egrave":"È","egrave":"è","egs":"⪖","egsdot":"⪘","el":"⪙","Element":"∈","elinters":"⏧","ell":"ℓ","els":"⪕","elsdot":"⪗","Emacr":"Ē","emacr":"ē","empty":"∅","emptyset":"∅","EmptySmallSquare":"◻","emptyv":"∅","EmptyVerySmallSquare":"▫","emsp13":" ","emsp14":" ","emsp":" ","ENG":"Ŋ","eng":"ŋ","ensp":" ","Eogon":"Ę","eogon":"ę","Eopf":"𝔼","eopf":"𝕖","epar":"⋕","eparsl":"⧣","eplus":"⩱","epsi":"ε","Epsilon":"Ε","epsilon":"ε","epsiv":"ϵ","eqcirc":"≖","eqcolon":"≕","eqsim":"≂","eqslantgtr":"⪖","eqslantless":"⪕","Equal":"⩵","equals":"=","EqualTilde":"≂","equest":"≟","Equilibrium":"⇌","equiv":"≡","equivDD":"⩸","eqvparsl":"⧥","erarr":"⥱","erDot":"≓","escr":"ℯ","Escr":"ℰ","esdot":"≐","Esim":"⩳","esim":"≂","Eta":"Η","eta":"η","ETH":"Ð","eth":"ð","Euml":"Ë","euml":"ë","euro":"€","excl":"!","exist":"∃","Exists":"∃","expectation":"ℰ","exponentiale":"ⅇ","ExponentialE":"ⅇ","fallingdotseq":"≒","Fcy":"Ф","fcy":"ф","female":"♀","ffilig":"ffi","fflig":"ff","ffllig":"ffl","Ffr":"𝔉","ffr":"𝔣","filig":"fi","FilledSmallSquare":"◼","FilledVerySmallSquare":"▪","fjlig":"fj","flat":"♭","fllig":"fl","fltns":"▱","fnof":"ƒ","Fopf":"𝔽","fopf":"𝕗","forall":"∀","ForAll":"∀","fork":"⋔","forkv":"⫙","Fouriertrf":"ℱ","fpartint":"⨍","frac12":"½","frac13":"⅓","frac14":"¼","frac15":"⅕","frac16":"⅙","frac18":"⅛","frac23":"⅔","frac25":"⅖","frac34":"¾","frac35":"⅗","frac38":"⅜","frac45":"⅘","frac56":"⅚","frac58":"⅝","frac78":"⅞","frasl":"⁄","frown":"⌢","fscr":"𝒻","Fscr":"ℱ","gacute":"ǵ","Gamma":"Γ","gamma":"γ","Gammad":"Ϝ","gammad":"ϝ","gap":"⪆","Gbreve":"Ğ","gbreve":"ğ","Gcedil":"Ģ","Gcirc":"Ĝ","gcirc":"ĝ","Gcy":"Г","gcy":"г","Gdot":"Ġ","gdot":"ġ","ge":"≥","gE":"≧","gEl":"⪌","gel":"⋛","geq":"≥","geqq":"≧","geqslant":"⩾","gescc":"⪩","ges":"⩾","gesdot":"⪀","gesdoto":"⪂","gesdotol":"⪄","gesl":"⋛︀","gesles":"⪔","Gfr":"𝔊","gfr":"𝔤","gg":"≫","Gg":"⋙","ggg":"⋙","gimel":"ℷ","GJcy":"Ѓ","gjcy":"ѓ","gla":"⪥","gl":"≷","glE":"⪒","glj":"⪤","gnap":"⪊","gnapprox":"⪊","gne":"⪈","gnE":"≩","gneq":"⪈","gneqq":"≩","gnsim":"⋧","Gopf":"𝔾","gopf":"𝕘","grave":"`","GreaterEqual":"≥","GreaterEqualLess":"⋛","GreaterFullEqual":"≧","GreaterGreater":"⪢","GreaterLess":"≷","GreaterSlantEqual":"⩾","GreaterTilde":"≳","Gscr":"𝒢","gscr":"ℊ","gsim":"≳","gsime":"⪎","gsiml":"⪐","gtcc":"⪧","gtcir":"⩺","gt":">","GT":">","Gt":"≫","gtdot":"⋗","gtlPar":"⦕","gtquest":"⩼","gtrapprox":"⪆","gtrarr":"⥸","gtrdot":"⋗","gtreqless":"⋛","gtreqqless":"⪌","gtrless":"≷","gtrsim":"≳","gvertneqq":"≩︀","gvnE":"≩︀","Hacek":"ˇ","hairsp":" ","half":"½","hamilt":"ℋ","HARDcy":"Ъ","hardcy":"ъ","harrcir":"⥈","harr":"↔","hArr":"⇔","harrw":"↭","Hat":"^","hbar":"ℏ","Hcirc":"Ĥ","hcirc":"ĥ","hearts":"♥","heartsuit":"♥","hellip":"…","hercon":"⊹","hfr":"𝔥","Hfr":"ℌ","HilbertSpace":"ℋ","hksearow":"⤥","hkswarow":"⤦","hoarr":"⇿","homtht":"∻","hookleftarrow":"↩","hookrightarrow":"↪","hopf":"𝕙","Hopf":"ℍ","horbar":"―","HorizontalLine":"─","hscr":"𝒽","Hscr":"ℋ","hslash":"ℏ","Hstrok":"Ħ","hstrok":"ħ","HumpDownHump":"≎","HumpEqual":"≏","hybull":"⁃","hyphen":"‐","Iacute":"Í","iacute":"í","ic":"⁣","Icirc":"Î","icirc":"î","Icy":"И","icy":"и","Idot":"İ","IEcy":"Е","iecy":"е","iexcl":"¡","iff":"⇔","ifr":"𝔦","Ifr":"ℑ","Igrave":"Ì","igrave":"ì","ii":"ⅈ","iiiint":"⨌","iiint":"∭","iinfin":"⧜","iiota":"℩","IJlig":"IJ","ijlig":"ij","Imacr":"Ī","imacr":"ī","image":"ℑ","ImaginaryI":"ⅈ","imagline":"ℐ","imagpart":"ℑ","imath":"ı","Im":"ℑ","imof":"⊷","imped":"Ƶ","Implies":"⇒","incare":"℅","in":"∈","infin":"∞","infintie":"⧝","inodot":"ı","intcal":"⊺","int":"∫","Int":"∬","integers":"ℤ","Integral":"∫","intercal":"⊺","Intersection":"⋂","intlarhk":"⨗","intprod":"⨼","InvisibleComma":"⁣","InvisibleTimes":"⁢","IOcy":"Ё","iocy":"ё","Iogon":"Į","iogon":"į","Iopf":"𝕀","iopf":"𝕚","Iota":"Ι","iota":"ι","iprod":"⨼","iquest":"¿","iscr":"𝒾","Iscr":"ℐ","isin":"∈","isindot":"⋵","isinE":"⋹","isins":"⋴","isinsv":"⋳","isinv":"∈","it":"⁢","Itilde":"Ĩ","itilde":"ĩ","Iukcy":"І","iukcy":"і","Iuml":"Ï","iuml":"ï","Jcirc":"Ĵ","jcirc":"ĵ","Jcy":"Й","jcy":"й","Jfr":"𝔍","jfr":"𝔧","jmath":"ȷ","Jopf":"𝕁","jopf":"𝕛","Jscr":"𝒥","jscr":"𝒿","Jsercy":"Ј","jsercy":"ј","Jukcy":"Є","jukcy":"є","Kappa":"Κ","kappa":"κ","kappav":"ϰ","Kcedil":"Ķ","kcedil":"ķ","Kcy":"К","kcy":"к","Kfr":"𝔎","kfr":"𝔨","kgreen":"ĸ","KHcy":"Х","khcy":"х","KJcy":"Ќ","kjcy":"ќ","Kopf":"𝕂","kopf":"𝕜","Kscr":"𝒦","kscr":"𝓀","lAarr":"⇚","Lacute":"Ĺ","lacute":"ĺ","laemptyv":"⦴","lagran":"ℒ","Lambda":"Λ","lambda":"λ","lang":"⟨","Lang":"⟪","langd":"⦑","langle":"⟨","lap":"⪅","Laplacetrf":"ℒ","laquo":"«","larrb":"⇤","larrbfs":"⤟","larr":"←","Larr":"↞","lArr":"⇐","larrfs":"⤝","larrhk":"↩","larrlp":"↫","larrpl":"⤹","larrsim":"⥳","larrtl":"↢","latail":"⤙","lAtail":"⤛","lat":"⪫","late":"⪭","lates":"⪭︀","lbarr":"⤌","lBarr":"⤎","lbbrk":"❲","lbrace":"{","lbrack":"[","lbrke":"⦋","lbrksld":"⦏","lbrkslu":"⦍","Lcaron":"Ľ","lcaron":"ľ","Lcedil":"Ļ","lcedil":"ļ","lceil":"⌈","lcub":"{","Lcy":"Л","lcy":"л","ldca":"⤶","ldquo":"“","ldquor":"„","ldrdhar":"⥧","ldrushar":"⥋","ldsh":"↲","le":"≤","lE":"≦","LeftAngleBracket":"⟨","LeftArrowBar":"⇤","leftarrow":"←","LeftArrow":"←","Leftarrow":"⇐","LeftArrowRightArrow":"⇆","leftarrowtail":"↢","LeftCeiling":"⌈","LeftDoubleBracket":"⟦","LeftDownTeeVector":"⥡","LeftDownVectorBar":"⥙","LeftDownVector":"⇃","LeftFloor":"⌊","leftharpoondown":"↽","leftharpoonup":"↼","leftleftarrows":"⇇","leftrightarrow":"↔","LeftRightArrow":"↔","Leftrightarrow":"⇔","leftrightarrows":"⇆","leftrightharpoons":"⇋","leftrightsquigarrow":"↭","LeftRightVector":"⥎","LeftTeeArrow":"↤","LeftTee":"⊣","LeftTeeVector":"⥚","leftthreetimes":"⋋","LeftTriangleBar":"⧏","LeftTriangle":"⊲","LeftTriangleEqual":"⊴","LeftUpDownVector":"⥑","LeftUpTeeVector":"⥠","LeftUpVectorBar":"⥘","LeftUpVector":"↿","LeftVectorBar":"⥒","LeftVector":"↼","lEg":"⪋","leg":"⋚","leq":"≤","leqq":"≦","leqslant":"⩽","lescc":"⪨","les":"⩽","lesdot":"⩿","lesdoto":"⪁","lesdotor":"⪃","lesg":"⋚︀","lesges":"⪓","lessapprox":"⪅","lessdot":"⋖","lesseqgtr":"⋚","lesseqqgtr":"⪋","LessEqualGreater":"⋚","LessFullEqual":"≦","LessGreater":"≶","lessgtr":"≶","LessLess":"⪡","lesssim":"≲","LessSlantEqual":"⩽","LessTilde":"≲","lfisht":"⥼","lfloor":"⌊","Lfr":"𝔏","lfr":"𝔩","lg":"≶","lgE":"⪑","lHar":"⥢","lhard":"↽","lharu":"↼","lharul":"⥪","lhblk":"▄","LJcy":"Љ","ljcy":"љ","llarr":"⇇","ll":"≪","Ll":"⋘","llcorner":"⌞","Lleftarrow":"⇚","llhard":"⥫","lltri":"◺","Lmidot":"Ŀ","lmidot":"ŀ","lmoustache":"⎰","lmoust":"⎰","lnap":"⪉","lnapprox":"⪉","lne":"⪇","lnE":"≨","lneq":"⪇","lneqq":"≨","lnsim":"⋦","loang":"⟬","loarr":"⇽","lobrk":"⟦","longleftarrow":"⟵","LongLeftArrow":"⟵","Longleftarrow":"⟸","longleftrightarrow":"⟷","LongLeftRightArrow":"⟷","Longleftrightarrow":"⟺","longmapsto":"⟼","longrightarrow":"⟶","LongRightArrow":"⟶","Longrightarrow":"⟹","looparrowleft":"↫","looparrowright":"↬","lopar":"⦅","Lopf":"𝕃","lopf":"𝕝","loplus":"⨭","lotimes":"⨴","lowast":"∗","lowbar":"_","LowerLeftArrow":"↙","LowerRightArrow":"↘","loz":"◊","lozenge":"◊","lozf":"⧫","lpar":"(","lparlt":"⦓","lrarr":"⇆","lrcorner":"⌟","lrhar":"⇋","lrhard":"⥭","lrm":"‎","lrtri":"⊿","lsaquo":"‹","lscr":"𝓁","Lscr":"ℒ","lsh":"↰","Lsh":"↰","lsim":"≲","lsime":"⪍","lsimg":"⪏","lsqb":"[","lsquo":"‘","lsquor":"‚","Lstrok":"Ł","lstrok":"ł","ltcc":"⪦","ltcir":"⩹","lt":"<","LT":"<","Lt":"≪","ltdot":"⋖","lthree":"⋋","ltimes":"⋉","ltlarr":"⥶","ltquest":"⩻","ltri":"◃","ltrie":"⊴","ltrif":"◂","ltrPar":"⦖","lurdshar":"⥊","luruhar":"⥦","lvertneqq":"≨︀","lvnE":"≨︀","macr":"¯","male":"♂","malt":"✠","maltese":"✠","Map":"⤅","map":"↦","mapsto":"↦","mapstodown":"↧","mapstoleft":"↤","mapstoup":"↥","marker":"▮","mcomma":"⨩","Mcy":"М","mcy":"м","mdash":"—","mDDot":"∺","measuredangle":"∡","MediumSpace":" ","Mellintrf":"ℳ","Mfr":"𝔐","mfr":"𝔪","mho":"℧","micro":"µ","midast":"*","midcir":"⫰","mid":"∣","middot":"·","minusb":"⊟","minus":"−","minusd":"∸","minusdu":"⨪","MinusPlus":"∓","mlcp":"⫛","mldr":"…","mnplus":"∓","models":"⊧","Mopf":"𝕄","mopf":"𝕞","mp":"∓","mscr":"𝓂","Mscr":"ℳ","mstpos":"∾","Mu":"Μ","mu":"μ","multimap":"⊸","mumap":"⊸","nabla":"∇","Nacute":"Ń","nacute":"ń","nang":"∠⃒","nap":"≉","napE":"⩰̸","napid":"≋̸","napos":"ʼn","napprox":"≉","natural":"♮","naturals":"ℕ","natur":"♮","nbsp":" ","nbump":"≎̸","nbumpe":"≏̸","ncap":"⩃","Ncaron":"Ň","ncaron":"ň","Ncedil":"Ņ","ncedil":"ņ","ncong":"≇","ncongdot":"⩭̸","ncup":"⩂","Ncy":"Н","ncy":"н","ndash":"–","nearhk":"⤤","nearr":"↗","neArr":"⇗","nearrow":"↗","ne":"≠","nedot":"≐̸","NegativeMediumSpace":"​","NegativeThickSpace":"​","NegativeThinSpace":"​","NegativeVeryThinSpace":"​","nequiv":"≢","nesear":"⤨","nesim":"≂̸","NestedGreaterGreater":"≫","NestedLessLess":"≪","NewLine":"\\n","nexist":"∄","nexists":"∄","Nfr":"𝔑","nfr":"𝔫","ngE":"≧̸","nge":"≱","ngeq":"≱","ngeqq":"≧̸","ngeqslant":"⩾̸","nges":"⩾̸","nGg":"⋙̸","ngsim":"≵","nGt":"≫⃒","ngt":"≯","ngtr":"≯","nGtv":"≫̸","nharr":"↮","nhArr":"⇎","nhpar":"⫲","ni":"∋","nis":"⋼","nisd":"⋺","niv":"∋","NJcy":"Њ","njcy":"њ","nlarr":"↚","nlArr":"⇍","nldr":"‥","nlE":"≦̸","nle":"≰","nleftarrow":"↚","nLeftarrow":"⇍","nleftrightarrow":"↮","nLeftrightarrow":"⇎","nleq":"≰","nleqq":"≦̸","nleqslant":"⩽̸","nles":"⩽̸","nless":"≮","nLl":"⋘̸","nlsim":"≴","nLt":"≪⃒","nlt":"≮","nltri":"⋪","nltrie":"⋬","nLtv":"≪̸","nmid":"∤","NoBreak":"⁠","NonBreakingSpace":" ","nopf":"𝕟","Nopf":"ℕ","Not":"⫬","not":"¬","NotCongruent":"≢","NotCupCap":"≭","NotDoubleVerticalBar":"∦","NotElement":"∉","NotEqual":"≠","NotEqualTilde":"≂̸","NotExists":"∄","NotGreater":"≯","NotGreaterEqual":"≱","NotGreaterFullEqual":"≧̸","NotGreaterGreater":"≫̸","NotGreaterLess":"≹","NotGreaterSlantEqual":"⩾̸","NotGreaterTilde":"≵","NotHumpDownHump":"≎̸","NotHumpEqual":"≏̸","notin":"∉","notindot":"⋵̸","notinE":"⋹̸","notinva":"∉","notinvb":"⋷","notinvc":"⋶","NotLeftTriangleBar":"⧏̸","NotLeftTriangle":"⋪","NotLeftTriangleEqual":"⋬","NotLess":"≮","NotLessEqual":"≰","NotLessGreater":"≸","NotLessLess":"≪̸","NotLessSlantEqual":"⩽̸","NotLessTilde":"≴","NotNestedGreaterGreater":"⪢̸","NotNestedLessLess":"⪡̸","notni":"∌","notniva":"∌","notnivb":"⋾","notnivc":"⋽","NotPrecedes":"⊀","NotPrecedesEqual":"⪯̸","NotPrecedesSlantEqual":"⋠","NotReverseElement":"∌","NotRightTriangleBar":"⧐̸","NotRightTriangle":"⋫","NotRightTriangleEqual":"⋭","NotSquareSubset":"⊏̸","NotSquareSubsetEqual":"⋢","NotSquareSuperset":"⊐̸","NotSquareSupersetEqual":"⋣","NotSubset":"⊂⃒","NotSubsetEqual":"⊈","NotSucceeds":"⊁","NotSucceedsEqual":"⪰̸","NotSucceedsSlantEqual":"⋡","NotSucceedsTilde":"≿̸","NotSuperset":"⊃⃒","NotSupersetEqual":"⊉","NotTilde":"≁","NotTildeEqual":"≄","NotTildeFullEqual":"≇","NotTildeTilde":"≉","NotVerticalBar":"∤","nparallel":"∦","npar":"∦","nparsl":"⫽⃥","npart":"∂̸","npolint":"⨔","npr":"⊀","nprcue":"⋠","nprec":"⊀","npreceq":"⪯̸","npre":"⪯̸","nrarrc":"⤳̸","nrarr":"↛","nrArr":"⇏","nrarrw":"↝̸","nrightarrow":"↛","nRightarrow":"⇏","nrtri":"⋫","nrtrie":"⋭","nsc":"⊁","nsccue":"⋡","nsce":"⪰̸","Nscr":"𝒩","nscr":"𝓃","nshortmid":"∤","nshortparallel":"∦","nsim":"≁","nsime":"≄","nsimeq":"≄","nsmid":"∤","nspar":"∦","nsqsube":"⋢","nsqsupe":"⋣","nsub":"⊄","nsubE":"⫅̸","nsube":"⊈","nsubset":"⊂⃒","nsubseteq":"⊈","nsubseteqq":"⫅̸","nsucc":"⊁","nsucceq":"⪰̸","nsup":"⊅","nsupE":"⫆̸","nsupe":"⊉","nsupset":"⊃⃒","nsupseteq":"⊉","nsupseteqq":"⫆̸","ntgl":"≹","Ntilde":"Ñ","ntilde":"ñ","ntlg":"≸","ntriangleleft":"⋪","ntrianglelefteq":"⋬","ntriangleright":"⋫","ntrianglerighteq":"⋭","Nu":"Ν","nu":"ν","num":"#","numero":"№","numsp":" ","nvap":"≍⃒","nvdash":"⊬","nvDash":"⊭","nVdash":"⊮","nVDash":"⊯","nvge":"≥⃒","nvgt":">⃒","nvHarr":"⤄","nvinfin":"⧞","nvlArr":"⤂","nvle":"≤⃒","nvlt":"<⃒","nvltrie":"⊴⃒","nvrArr":"⤃","nvrtrie":"⊵⃒","nvsim":"∼⃒","nwarhk":"⤣","nwarr":"↖","nwArr":"⇖","nwarrow":"↖","nwnear":"⤧","Oacute":"Ó","oacute":"ó","oast":"⊛","Ocirc":"Ô","ocirc":"ô","ocir":"⊚","Ocy":"О","ocy":"о","odash":"⊝","Odblac":"Ő","odblac":"ő","odiv":"⨸","odot":"⊙","odsold":"⦼","OElig":"Œ","oelig":"œ","ofcir":"⦿","Ofr":"𝔒","ofr":"𝔬","ogon":"˛","Ograve":"Ò","ograve":"ò","ogt":"⧁","ohbar":"⦵","ohm":"Ω","oint":"∮","olarr":"↺","olcir":"⦾","olcross":"⦻","oline":"‾","olt":"⧀","Omacr":"Ō","omacr":"ō","Omega":"Ω","omega":"ω","Omicron":"Ο","omicron":"ο","omid":"⦶","ominus":"⊖","Oopf":"𝕆","oopf":"𝕠","opar":"⦷","OpenCurlyDoubleQuote":"“","OpenCurlyQuote":"‘","operp":"⦹","oplus":"⊕","orarr":"↻","Or":"⩔","or":"∨","ord":"⩝","order":"ℴ","orderof":"ℴ","ordf":"ª","ordm":"º","origof":"⊶","oror":"⩖","orslope":"⩗","orv":"⩛","oS":"Ⓢ","Oscr":"𝒪","oscr":"ℴ","Oslash":"Ø","oslash":"ø","osol":"⊘","Otilde":"Õ","otilde":"õ","otimesas":"⨶","Otimes":"⨷","otimes":"⊗","Ouml":"Ö","ouml":"ö","ovbar":"⌽","OverBar":"‾","OverBrace":"⏞","OverBracket":"⎴","OverParenthesis":"⏜","para":"¶","parallel":"∥","par":"∥","parsim":"⫳","parsl":"⫽","part":"∂","PartialD":"∂","Pcy":"П","pcy":"п","percnt":"%","period":".","permil":"‰","perp":"⊥","pertenk":"‱","Pfr":"𝔓","pfr":"𝔭","Phi":"Φ","phi":"φ","phiv":"ϕ","phmmat":"ℳ","phone":"☎","Pi":"Π","pi":"π","pitchfork":"⋔","piv":"ϖ","planck":"ℏ","planckh":"ℎ","plankv":"ℏ","plusacir":"⨣","plusb":"⊞","pluscir":"⨢","plus":"+","plusdo":"∔","plusdu":"⨥","pluse":"⩲","PlusMinus":"±","plusmn":"±","plussim":"⨦","plustwo":"⨧","pm":"±","Poincareplane":"ℌ","pointint":"⨕","popf":"𝕡","Popf":"ℙ","pound":"£","prap":"⪷","Pr":"⪻","pr":"≺","prcue":"≼","precapprox":"⪷","prec":"≺","preccurlyeq":"≼","Precedes":"≺","PrecedesEqual":"⪯","PrecedesSlantEqual":"≼","PrecedesTilde":"≾","preceq":"⪯","precnapprox":"⪹","precneqq":"⪵","precnsim":"⋨","pre":"⪯","prE":"⪳","precsim":"≾","prime":"′","Prime":"″","primes":"ℙ","prnap":"⪹","prnE":"⪵","prnsim":"⋨","prod":"∏","Product":"∏","profalar":"⌮","profline":"⌒","profsurf":"⌓","prop":"∝","Proportional":"∝","Proportion":"∷","propto":"∝","prsim":"≾","prurel":"⊰","Pscr":"𝒫","pscr":"𝓅","Psi":"Ψ","psi":"ψ","puncsp":" ","Qfr":"𝔔","qfr":"𝔮","qint":"⨌","qopf":"𝕢","Qopf":"ℚ","qprime":"⁗","Qscr":"𝒬","qscr":"𝓆","quaternions":"ℍ","quatint":"⨖","quest":"?","questeq":"≟","quot":"\\"","QUOT":"\\"","rAarr":"⇛","race":"∽̱","Racute":"Ŕ","racute":"ŕ","radic":"√","raemptyv":"⦳","rang":"⟩","Rang":"⟫","rangd":"⦒","range":"⦥","rangle":"⟩","raquo":"»","rarrap":"⥵","rarrb":"⇥","rarrbfs":"⤠","rarrc":"⤳","rarr":"→","Rarr":"↠","rArr":"⇒","rarrfs":"⤞","rarrhk":"↪","rarrlp":"↬","rarrpl":"⥅","rarrsim":"⥴","Rarrtl":"⤖","rarrtl":"↣","rarrw":"↝","ratail":"⤚","rAtail":"⤜","ratio":"∶","rationals":"ℚ","rbarr":"⤍","rBarr":"⤏","RBarr":"⤐","rbbrk":"❳","rbrace":"}","rbrack":"]","rbrke":"⦌","rbrksld":"⦎","rbrkslu":"⦐","Rcaron":"Ř","rcaron":"ř","Rcedil":"Ŗ","rcedil":"ŗ","rceil":"⌉","rcub":"}","Rcy":"Р","rcy":"р","rdca":"⤷","rdldhar":"⥩","rdquo":"”","rdquor":"”","rdsh":"↳","real":"ℜ","realine":"ℛ","realpart":"ℜ","reals":"ℝ","Re":"ℜ","rect":"▭","reg":"®","REG":"®","ReverseElement":"∋","ReverseEquilibrium":"⇋","ReverseUpEquilibrium":"⥯","rfisht":"⥽","rfloor":"⌋","rfr":"𝔯","Rfr":"ℜ","rHar":"⥤","rhard":"⇁","rharu":"⇀","rharul":"⥬","Rho":"Ρ","rho":"ρ","rhov":"ϱ","RightAngleBracket":"⟩","RightArrowBar":"⇥","rightarrow":"→","RightArrow":"→","Rightarrow":"⇒","RightArrowLeftArrow":"⇄","rightarrowtail":"↣","RightCeiling":"⌉","RightDoubleBracket":"⟧","RightDownTeeVector":"⥝","RightDownVectorBar":"⥕","RightDownVector":"⇂","RightFloor":"⌋","rightharpoondown":"⇁","rightharpoonup":"⇀","rightleftarrows":"⇄","rightleftharpoons":"⇌","rightrightarrows":"⇉","rightsquigarrow":"↝","RightTeeArrow":"↦","RightTee":"⊢","RightTeeVector":"⥛","rightthreetimes":"⋌","RightTriangleBar":"⧐","RightTriangle":"⊳","RightTriangleEqual":"⊵","RightUpDownVector":"⥏","RightUpTeeVector":"⥜","RightUpVectorBar":"⥔","RightUpVector":"↾","RightVectorBar":"⥓","RightVector":"⇀","ring":"˚","risingdotseq":"≓","rlarr":"⇄","rlhar":"⇌","rlm":"‏","rmoustache":"⎱","rmoust":"⎱","rnmid":"⫮","roang":"⟭","roarr":"⇾","robrk":"⟧","ropar":"⦆","ropf":"𝕣","Ropf":"ℝ","roplus":"⨮","rotimes":"⨵","RoundImplies":"⥰","rpar":")","rpargt":"⦔","rppolint":"⨒","rrarr":"⇉","Rrightarrow":"⇛","rsaquo":"›","rscr":"𝓇","Rscr":"ℛ","rsh":"↱","Rsh":"↱","rsqb":"]","rsquo":"’","rsquor":"’","rthree":"⋌","rtimes":"⋊","rtri":"▹","rtrie":"⊵","rtrif":"▸","rtriltri":"⧎","RuleDelayed":"⧴","ruluhar":"⥨","rx":"℞","Sacute":"Ś","sacute":"ś","sbquo":"‚","scap":"⪸","Scaron":"Š","scaron":"š","Sc":"⪼","sc":"≻","sccue":"≽","sce":"⪰","scE":"⪴","Scedil":"Ş","scedil":"ş","Scirc":"Ŝ","scirc":"ŝ","scnap":"⪺","scnE":"⪶","scnsim":"⋩","scpolint":"⨓","scsim":"≿","Scy":"С","scy":"с","sdotb":"⊡","sdot":"⋅","sdote":"⩦","searhk":"⤥","searr":"↘","seArr":"⇘","searrow":"↘","sect":"§","semi":";","seswar":"⤩","setminus":"∖","setmn":"∖","sext":"✶","Sfr":"𝔖","sfr":"𝔰","sfrown":"⌢","sharp":"♯","SHCHcy":"Щ","shchcy":"щ","SHcy":"Ш","shcy":"ш","ShortDownArrow":"↓","ShortLeftArrow":"←","shortmid":"∣","shortparallel":"∥","ShortRightArrow":"→","ShortUpArrow":"↑","shy":"­","Sigma":"Σ","sigma":"σ","sigmaf":"ς","sigmav":"ς","sim":"∼","simdot":"⩪","sime":"≃","simeq":"≃","simg":"⪞","simgE":"⪠","siml":"⪝","simlE":"⪟","simne":"≆","simplus":"⨤","simrarr":"⥲","slarr":"←","SmallCircle":"∘","smallsetminus":"∖","smashp":"⨳","smeparsl":"⧤","smid":"∣","smile":"⌣","smt":"⪪","smte":"⪬","smtes":"⪬︀","SOFTcy":"Ь","softcy":"ь","solbar":"⌿","solb":"⧄","sol":"/","Sopf":"𝕊","sopf":"𝕤","spades":"♠","spadesuit":"♠","spar":"∥","sqcap":"⊓","sqcaps":"⊓︀","sqcup":"⊔","sqcups":"⊔︀","Sqrt":"√","sqsub":"⊏","sqsube":"⊑","sqsubset":"⊏","sqsubseteq":"⊑","sqsup":"⊐","sqsupe":"⊒","sqsupset":"⊐","sqsupseteq":"⊒","square":"□","Square":"□","SquareIntersection":"⊓","SquareSubset":"⊏","SquareSubsetEqual":"⊑","SquareSuperset":"⊐","SquareSupersetEqual":"⊒","SquareUnion":"⊔","squarf":"▪","squ":"□","squf":"▪","srarr":"→","Sscr":"𝒮","sscr":"𝓈","ssetmn":"∖","ssmile":"⌣","sstarf":"⋆","Star":"⋆","star":"☆","starf":"★","straightepsilon":"ϵ","straightphi":"ϕ","strns":"¯","sub":"⊂","Sub":"⋐","subdot":"⪽","subE":"⫅","sube":"⊆","subedot":"⫃","submult":"⫁","subnE":"⫋","subne":"⊊","subplus":"⪿","subrarr":"⥹","subset":"⊂","Subset":"⋐","subseteq":"⊆","subseteqq":"⫅","SubsetEqual":"⊆","subsetneq":"⊊","subsetneqq":"⫋","subsim":"⫇","subsub":"⫕","subsup":"⫓","succapprox":"⪸","succ":"≻","succcurlyeq":"≽","Succeeds":"≻","SucceedsEqual":"⪰","SucceedsSlantEqual":"≽","SucceedsTilde":"≿","succeq":"⪰","succnapprox":"⪺","succneqq":"⪶","succnsim":"⋩","succsim":"≿","SuchThat":"∋","sum":"∑","Sum":"∑","sung":"♪","sup1":"¹","sup2":"²","sup3":"³","sup":"⊃","Sup":"⋑","supdot":"⪾","supdsub":"⫘","supE":"⫆","supe":"⊇","supedot":"⫄","Superset":"⊃","SupersetEqual":"⊇","suphsol":"⟉","suphsub":"⫗","suplarr":"⥻","supmult":"⫂","supnE":"⫌","supne":"⊋","supplus":"⫀","supset":"⊃","Supset":"⋑","supseteq":"⊇","supseteqq":"⫆","supsetneq":"⊋","supsetneqq":"⫌","supsim":"⫈","supsub":"⫔","supsup":"⫖","swarhk":"⤦","swarr":"↙","swArr":"⇙","swarrow":"↙","swnwar":"⤪","szlig":"ß","Tab":"\\t","target":"⌖","Tau":"Τ","tau":"τ","tbrk":"⎴","Tcaron":"Ť","tcaron":"ť","Tcedil":"Ţ","tcedil":"ţ","Tcy":"Т","tcy":"т","tdot":"⃛","telrec":"⌕","Tfr":"𝔗","tfr":"𝔱","there4":"∴","therefore":"∴","Therefore":"∴","Theta":"Θ","theta":"θ","thetasym":"ϑ","thetav":"ϑ","thickapprox":"≈","thicksim":"∼","ThickSpace":"  ","ThinSpace":" ","thinsp":" ","thkap":"≈","thksim":"∼","THORN":"Þ","thorn":"þ","tilde":"˜","Tilde":"∼","TildeEqual":"≃","TildeFullEqual":"≅","TildeTilde":"≈","timesbar":"⨱","timesb":"⊠","times":"×","timesd":"⨰","tint":"∭","toea":"⤨","topbot":"⌶","topcir":"⫱","top":"⊤","Topf":"𝕋","topf":"𝕥","topfork":"⫚","tosa":"⤩","tprime":"‴","trade":"™","TRADE":"™","triangle":"▵","triangledown":"▿","triangleleft":"◃","trianglelefteq":"⊴","triangleq":"≜","triangleright":"▹","trianglerighteq":"⊵","tridot":"◬","trie":"≜","triminus":"⨺","TripleDot":"⃛","triplus":"⨹","trisb":"⧍","tritime":"⨻","trpezium":"⏢","Tscr":"𝒯","tscr":"𝓉","TScy":"Ц","tscy":"ц","TSHcy":"Ћ","tshcy":"ћ","Tstrok":"Ŧ","tstrok":"ŧ","twixt":"≬","twoheadleftarrow":"↞","twoheadrightarrow":"↠","Uacute":"Ú","uacute":"ú","uarr":"↑","Uarr":"↟","uArr":"⇑","Uarrocir":"⥉","Ubrcy":"Ў","ubrcy":"ў","Ubreve":"Ŭ","ubreve":"ŭ","Ucirc":"Û","ucirc":"û","Ucy":"У","ucy":"у","udarr":"⇅","Udblac":"Ű","udblac":"ű","udhar":"⥮","ufisht":"⥾","Ufr":"𝔘","ufr":"𝔲","Ugrave":"Ù","ugrave":"ù","uHar":"⥣","uharl":"↿","uharr":"↾","uhblk":"▀","ulcorn":"⌜","ulcorner":"⌜","ulcrop":"⌏","ultri":"◸","Umacr":"Ū","umacr":"ū","uml":"¨","UnderBar":"_","UnderBrace":"⏟","UnderBracket":"⎵","UnderParenthesis":"⏝","Union":"⋃","UnionPlus":"⊎","Uogon":"Ų","uogon":"ų","Uopf":"𝕌","uopf":"𝕦","UpArrowBar":"⤒","uparrow":"↑","UpArrow":"↑","Uparrow":"⇑","UpArrowDownArrow":"⇅","updownarrow":"↕","UpDownArrow":"↕","Updownarrow":"⇕","UpEquilibrium":"⥮","upharpoonleft":"↿","upharpoonright":"↾","uplus":"⊎","UpperLeftArrow":"↖","UpperRightArrow":"↗","upsi":"υ","Upsi":"ϒ","upsih":"ϒ","Upsilon":"Υ","upsilon":"υ","UpTeeArrow":"↥","UpTee":"⊥","upuparrows":"⇈","urcorn":"⌝","urcorner":"⌝","urcrop":"⌎","Uring":"Ů","uring":"ů","urtri":"◹","Uscr":"𝒰","uscr":"𝓊","utdot":"⋰","Utilde":"Ũ","utilde":"ũ","utri":"▵","utrif":"▴","uuarr":"⇈","Uuml":"Ü","uuml":"ü","uwangle":"⦧","vangrt":"⦜","varepsilon":"ϵ","varkappa":"ϰ","varnothing":"∅","varphi":"ϕ","varpi":"ϖ","varpropto":"∝","varr":"↕","vArr":"⇕","varrho":"ϱ","varsigma":"ς","varsubsetneq":"⊊︀","varsubsetneqq":"⫋︀","varsupsetneq":"⊋︀","varsupsetneqq":"⫌︀","vartheta":"ϑ","vartriangleleft":"⊲","vartriangleright":"⊳","vBar":"⫨","Vbar":"⫫","vBarv":"⫩","Vcy":"В","vcy":"в","vdash":"⊢","vDash":"⊨","Vdash":"⊩","VDash":"⊫","Vdashl":"⫦","veebar":"⊻","vee":"∨","Vee":"⋁","veeeq":"≚","vellip":"⋮","verbar":"|","Verbar":"‖","vert":"|","Vert":"‖","VerticalBar":"∣","VerticalLine":"|","VerticalSeparator":"❘","VerticalTilde":"≀","VeryThinSpace":" ","Vfr":"𝔙","vfr":"𝔳","vltri":"⊲","vnsub":"⊂⃒","vnsup":"⊃⃒","Vopf":"𝕍","vopf":"𝕧","vprop":"∝","vrtri":"⊳","Vscr":"𝒱","vscr":"𝓋","vsubnE":"⫋︀","vsubne":"⊊︀","vsupnE":"⫌︀","vsupne":"⊋︀","Vvdash":"⊪","vzigzag":"⦚","Wcirc":"Ŵ","wcirc":"ŵ","wedbar":"⩟","wedge":"∧","Wedge":"⋀","wedgeq":"≙","weierp":"℘","Wfr":"𝔚","wfr":"𝔴","Wopf":"𝕎","wopf":"𝕨","wp":"℘","wr":"≀","wreath":"≀","Wscr":"𝒲","wscr":"𝓌","xcap":"⋂","xcirc":"◯","xcup":"⋃","xdtri":"▽","Xfr":"𝔛","xfr":"𝔵","xharr":"⟷","xhArr":"⟺","Xi":"Ξ","xi":"ξ","xlarr":"⟵","xlArr":"⟸","xmap":"⟼","xnis":"⋻","xodot":"⨀","Xopf":"𝕏","xopf":"𝕩","xoplus":"⨁","xotime":"⨂","xrarr":"⟶","xrArr":"⟹","Xscr":"𝒳","xscr":"𝓍","xsqcup":"⨆","xuplus":"⨄","xutri":"△","xvee":"⋁","xwedge":"⋀","Yacute":"Ý","yacute":"ý","YAcy":"Я","yacy":"я","Ycirc":"Ŷ","ycirc":"ŷ","Ycy":"Ы","ycy":"ы","yen":"¥","Yfr":"𝔜","yfr":"𝔶","YIcy":"Ї","yicy":"ї","Yopf":"𝕐","yopf":"𝕪","Yscr":"𝒴","yscr":"𝓎","YUcy":"Ю","yucy":"ю","yuml":"ÿ","Yuml":"Ÿ","Zacute":"Ź","zacute":"ź","Zcaron":"Ž","zcaron":"ž","Zcy":"З","zcy":"з","Zdot":"Ż","zdot":"ż","zeetrf":"ℨ","ZeroWidthSpace":"​","Zeta":"Ζ","zeta":"ζ","zfr":"𝔷","Zfr":"ℨ","ZHcy":"Ж","zhcy":"ж","zigrarr":"⇝","zopf":"𝕫","Zopf":"ℤ","Zscr":"𝒵","zscr":"𝓏","zwj":"‍","zwnj":"‌"}')},9591:t=>{"use strict";t.exports=JSON.parse('{"Aacute":"Á","aacute":"á","Acirc":"Â","acirc":"â","acute":"´","AElig":"Æ","aelig":"æ","Agrave":"À","agrave":"à","amp":"&","AMP":"&","Aring":"Å","aring":"å","Atilde":"Ã","atilde":"ã","Auml":"Ä","auml":"ä","brvbar":"¦","Ccedil":"Ç","ccedil":"ç","cedil":"¸","cent":"¢","copy":"©","COPY":"©","curren":"¤","deg":"°","divide":"÷","Eacute":"É","eacute":"é","Ecirc":"Ê","ecirc":"ê","Egrave":"È","egrave":"è","ETH":"Ð","eth":"ð","Euml":"Ë","euml":"ë","frac12":"½","frac14":"¼","frac34":"¾","gt":">","GT":">","Iacute":"Í","iacute":"í","Icirc":"Î","icirc":"î","iexcl":"¡","Igrave":"Ì","igrave":"ì","iquest":"¿","Iuml":"Ï","iuml":"ï","laquo":"«","lt":"<","LT":"<","macr":"¯","micro":"µ","middot":"·","nbsp":" ","not":"¬","Ntilde":"Ñ","ntilde":"ñ","Oacute":"Ó","oacute":"ó","Ocirc":"Ô","ocirc":"ô","Ograve":"Ò","ograve":"ò","ordf":"ª","ordm":"º","Oslash":"Ø","oslash":"ø","Otilde":"Õ","otilde":"õ","Ouml":"Ö","ouml":"ö","para":"¶","plusmn":"±","pound":"£","quot":"\\"","QUOT":"\\"","raquo":"»","reg":"®","REG":"®","sect":"§","shy":"­","sup1":"¹","sup2":"²","sup3":"³","szlig":"ß","THORN":"Þ","thorn":"þ","times":"×","Uacute":"Ú","uacute":"ú","Ucirc":"Û","ucirc":"û","Ugrave":"Ù","ugrave":"ù","uml":"¨","Uuml":"Ü","uuml":"ü","Yacute":"Ý","yacute":"ý","yen":"¥","yuml":"ÿ"}')},2586:t=>{"use strict";t.exports=JSON.parse('{"amp":"&","apos":"\'","gt":">","lt":"<","quot":"\\""}')}},n={};function i(t){var r=n[t];if(void 0!==r)return r.exports;var s=n[t]={exports:{}};return e[t].call(s.exports,s,s.exports,i),s.exports}i.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return i.d(e,{a:e}),e},i.d=(t,e)=>{for(var n in e)i.o(e,n)&&!i.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},i.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),i.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})};var r={};return(()=>{"use strict";i.r(r),i.d(r,{Context:()=>Fu,DOM:()=>Wu,Model:()=>Uu,Overlay:()=>Bu,Primitives:()=>Vu,Render:()=>Hu,Shaders:()=>Gu,Stage:()=>ju,Util:()=>qu,e:()=>Nu,mathBox:()=>Xu,version:()=>zu,π:()=>Ou,τ:()=>Iu});var t={};i.r(t),i.d(t,{JSX:()=>ea,format:()=>ta,markup:()=>Ks,number:()=>$s,print:()=>Zs});var e={};i.r(e),i.d(e,{Attributes:()=>Vs,Group:()=>ra,Guard:()=>sa,Model:()=>fa,Node:()=>ia});var n={};i.r(n),i.d(n,{Types:()=>xa,apply:()=>Sa,createClass:()=>Da,element:()=>ba,hint:()=>ya,recycle:()=>wa});var s={};i.r(s),i.d(s,{Classes:()=>La,Factory:()=>ma,Overlay:()=>ka});var a={};i.r(a),i.d(a,{paramToArrayStorage:()=>Va,paramToGL:()=>Ba,swizzleToEulerOrder:()=>Ha,transformComposer:()=>Ga});var o={};i.r(o),i.d(o,{getDimensions:()=>Wa,getLerpEmitter:()=>Ka,getLerpThunk:()=>Ja,getSizes:()=>qa,getStreamer:()=>Za,getThunk:()=>$a,makeEmitter:()=>Ya,repeatCall:()=>Xa});var l={};i.r(l),i.d(l,{binaryOperator:()=>oo,constant:()=>mo,extendVec:()=>lo,identity:()=>fo,injectVec4:()=>co,invertSwizzleVec4:()=>po,mapByte2FloatOffset:()=>so,sample2DArray:()=>ao,swizzleVec4:()=>uo,toType:()=>io,truncateVec:()=>ho});var h={};i.r(h),i.d(h,{addOrigin:()=>Eo,recenterAxis:()=>Ro,setDimension:()=>Ao,setDimensionNormal:()=>Co,setOrigin:()=>To});var c={};i.r(c),i.d(c,{clone:()=>Po,merge:()=>ko,parseQuoted:()=>Lo});var u={};i.r(u),i.d(u,{binary:()=>El,clamp:()=>Ml,cosine:()=>Tl,hold:()=>Al});var d={};i.r(d),i.d(d,{linear:()=>Zl,log:()=>Kl,make:()=>Jl});var p={};i.r(p),i.d(p,{Classes:()=>ql,Helpers:()=>th,Traits:()=>$l,Types:()=>Xl});var f={};i.r(f),i.d(f,{Factory:()=>nh,Primitive:()=>za,Types:()=>ih});var m={};i.r(m),i.d(m,{Classes:()=>Rh,Factory:()=>oh,Scene:()=>ah});var g={};i.r(g),i.d(g,{Graph:()=>Dh,IN:()=>Lh,Node:()=>Ph,OUT:()=>zh,Outlet:()=>kh});var v={};i.r(v),i.d(v,{Layout:()=>Bh,Program:()=>Fh,Snippet:()=>Oh,assemble:()=>Nh,compare:()=>Ih.compare,link:()=>Uh,load:()=>Vh,make:()=>Ih.make,max:()=>Ih.max,nest:()=>Ih.nest});var x={};i.r(x),i.d(x,{merge:()=>cc,overlay:()=>lc,process:()=>ec});var _={};i.r(_),i.d(_,{inspect:()=>vc,markup:()=>dc,serialize:()=>uc,visualize:()=>gc});var y={};i.r(y),i.d(y,{Factory:()=>xc,Material:()=>yc,cache:()=>Sc,hash:()=>Kh,library:()=>bc,queue:()=>wc});var b={};i.r(b),i.d(b,{RETURN_ARG:()=>Fc,SHADOW_ARG:()=>Nc,body:()=>Qc,build:()=>su,call:()=>ru,compile:()=>Mc,dedupe:()=>hu,define:()=>tu,defuse:()=>lu,fn:()=>eu,hoist:()=>cu,invoke:()=>nu,lines:()=>Zc,link:()=>ou,links:()=>au,list:()=>Kc,parse:()=>Bc,same:()=>iu,statements:()=>Jc,unshadow:()=>$c,walk:()=>Xc});var w={};i.r(w),i.d(w,{Factory:()=>xu,Snippets:()=>_u});var S={};i.r(S),i.d(S,{API:()=>wu,Animator:()=>yu,Controller:()=>Su});var M={};i.r(M),i.d(M,{Axis:()=>Mu,Data:()=>Tu,Ease:()=>Eu,GLSL:()=>Au,JS:()=>Cu,Pretty:()=>Ru,Three:()=>Du,Ticks:()=>ku,VDOM:()=>Pu});class T{addEventListener(t,e){void 0===this._listeners&&(this._listeners={});const n=this._listeners;void 0===n[t]&&(n[t]=[]),-1===n[t].indexOf(e)&&n[t].push(e)}hasEventListener(t,e){if(void 0===this._listeners)return!1;const n=this._listeners;return void 0!==n[t]&&-1!==n[t].indexOf(e)}removeEventListener(t,e){if(void 0===this._listeners)return;const n=this._listeners[t];if(void 0!==n){const t=n.indexOf(e);-1!==t&&n.splice(t,1)}}dispatchEvent(t){if(void 0===this._listeners)return;const e=this._listeners[t.type];if(void 0!==e){t.target=this;const n=e.slice(0);for(let e=0,i=n.length;e<i;e++)n[e].call(this,t);t.target=null}}}class E{static bind(t,e){return function(n,i){i.__binds||(i.__binds=[]);var r=t;Array.isArray(n)&&(r=n[0],n=n[1]);for(var s=/^([^.:]*(?:\.[^.:]+)*)?(?::(.*))?$/.exec(n),a=s[1].split(/\./g),o=a.pop(),l=s[2]||o,h=a.shift(),c={this:i}[h]||e[h]||t[h]||r;c&&(n=a.shift());)c=c[n];if(c&&(c.on||c.addEventListener)){var u=function(e){i[l]&&i[l](e,t)};E._polyfill(c,["addEventListener","on"],(function(t){c[t](o,u)}));var d={target:c,name:o,callback:u};return i.__binds.push(d),u}throw"Cannot bind '"+n+"' in "+this.__name}}static unbind(){return function(t){t.__binds&&(t.__binds.forEach(function(t){E._polyfill(t.target,["removeEventListener","off"],(function(e){t.target[e](t.name,t.callback)}))}.bind(this)),t.__binds=[])}}static apply(t){t.trigger=E._trigger,t.triggerOnce=E._triggerOnce,t.hasEventListener=T.prototype.hasEventListener,t.addEventListener=T.prototype.addEventListener,t.removeEventListener=T.prototype.removeEventListener,t.on=t.addEventListener,t.off=t.removeEventListener,t.dispatchEvent=t.trigger}static _triggerOnce(t){this.trigger(t),this._listeners&&delete this._listeners[t.type]}static _trigger(t){if(void 0!==this._listeners){var e=t.type,n=this._listeners[e];if(void 0!==n){var i=(n=n.slice()).length;t.target=this;for(var r=0;r<i;r++)n[r].call(this,t,this)}}}static _polyfill(t,e,n){e.map((function(e){return t.method})),e.length&&n(e[0])}}function A(t){return t&&"string"==typeof t.valueOf()}class C{static initClass(){this.Plugins={},this.Aliases={}}static registerPlugin(t,e){var n=function(e){C.Plugin.call(this,e),this.__name=t};n.prototype=Object.assign(new C.Plugin,e),this.Plugins[t]=n}static unregisterPlugin(t){delete this.Plugins[t]}static registerAlias(t,e){this.Aliases[t]=e}static unregisterAlias(t){delete this.Aliases[t]}constructor(t){if(t){let e=[].slice.apply(arguments);if(t={},e[0]instanceof Node){const n=e[0];e=e.slice(1),t.element=n}A(e[0])?t.plugins=e:Array.isArray(e[0])?t.plugins=e[0]:e[0]&&(t=Object.assign({},e[0],t))}const e={init:!0,element:document.body,plugins:["core"],aliases:{},plugindb:C.Plugins||{},aliasdb:C.Aliases||{}};this.__options=Object.assign({},e,t||{}),this.__inited=!1,this.__destroyed=!1,this.__installed=[];var n=this.__options.element;n===""+n&&(n=document.querySelector(n)),this.plugins={},this.element=n,this.trigger=this.trigger.bind(this),this.frame=this.frame.bind(this),this.events=["pre","update","render","post"].map((function(t){return{type:t}})),this.__options.init&&this.init()}init(){this.__inited||(this.__inited=!0,this.install(this.__options.plugins))}destroy(){this.__inited&&(this.__destroyed||(this.__destroyed=!0,this.trigger({type:"destroy"}),this.uninstall()))}frame(){this.events.map(this.trigger)}resolve(t){t=Array.isArray(t)?t:[t];var e=this.__options,n=Object.assign({},e.aliasdb,e.aliases),i=function(t){var e=t.split(":");return!e[1]||(n[e[0]]=[e[1]],!1)};return t=t.filter(i),Object.entries(n).forEach((function([t,e]){n[t]=Array.isArray(e)?e:[e]})),function t(e,r,s){if(s>=256)throw"Plug-in alias recursion detected.";return(e=e.filter(i)).forEach((function(e){var i=n[e];i?r=r.concat(t(i,[],s+1)):r.push(e)})),r}(t,[],0)}install(t){t=Array.isArray(t)?t:[t],(t=this.resolve(t)).forEach((t=>this.__install(t))),this.__ready()}uninstall(t){t&&(t=Array.isArray(t)?t:[t],t=this.resolve(t)),(t||this.__installed).reverse().forEach((t=>this.__uninstall(t.__name)))}__install(t){var e=this.__options.plugindb[t];if(!e)throw"[three.install] Cannot install. '"+t+"' is not registered.";if(this.plugins[t])return console.warn("[three.install] "+t+" is already installed.");var n=new e(this.__options[t]||{},t);this.plugins[t]=n;const i=n.install(this);return this.__installed.push(n),this.trigger({type:"install",plugin:n}),i}__uninstall(t){const e=A(t)?this.plugins[t]:t;e?(t=e.__name,e.uninstall(this),this.__installed=this.__installed.filter((t=>t!==e)),delete this.plugins[t],this.trigger({type:"uninstall",plugin:e})):console.warn("[three.uninstall] "+t+"' is not installed.")}__ready(){this.triggerOnce({type:"ready"})}}C.initClass(),C.Plugin=function(t){this.options=Object.assign({},this.defaults,t||{})},C.Plugin.prototype={listen:[],defaults:{},install:function(t){},uninstall:function(t){}},E.apply(C.prototype),E.apply(C.Plugin.prototype),class{static apply(t){t.set=function(t){var e=this.options||{},n=Object.entries(t).reduce((function(t,[n,i]){return e[n]!==i&&(t[n]=i),t}),{});this.options=Object.assign(e,n),this.trigger({type:"change",options:t,changes:n})},t.get=function(){return this.options},t.api=function(t,e){return t||(t={}),e&&Object.entries(t).forEach((function([n,i]){"function"==typeof i&&(t[n]=(...t)=>i(...t,e))})),t.set=this.set.bind(this),t.get=this.get.bind(this),t}}}.apply(C.Plugin.prototype),C.registerPlugin("splash",{defaults:{color:"mono",fancy:!0},listen:["ready","mathbox/init:init","mathbox/progress:progress","mathbox/destroy:destroy"],uninstall(){return this.destroy()},ready(t,e){if(e.MathBox&&!this.div)return this.init(t,e)},init(t,e){let n;this.destroy();const{color:i}=this.options,r=`<div class="mathbox-loader mathbox-splash-${i}">\n  <div class="mathbox-logo">\n    <div> <div></div><div></div><div></div> </div>\n    <div> <div></div><div></div><div></div> </div>\n  </div>\n  <div class="mathbox-progress"><div></div></div>\n</div>`;this.div=n=document.createElement("div"),n.innerHTML=r,e.element.appendChild(n);const s=2*Math.random()-1,a=2*Math.random()-1,o=2*Math.random()-1,l=1/Math.sqrt(s*s+a*a+o*o);return this.loader=n.querySelector(".mathbox-loader"),this.bar=n.querySelector(".mathbox-progress > div"),this.gyro=n.querySelectorAll(".mathbox-logo > div"),this.transforms=["rotateZ(22deg) rotateX(24deg) rotateY(30deg)","rotateZ(11deg) rotateX(12deg) rotateY(15deg) scale3d(.6, .6, .6)"],this.random=[s*l,a*l,o*l],this.start=e.Time.now,this.timer=null},progress(t,e){if(!this.div)return;const{current:n,total:i}=t,r=n<i;clearTimeout(this.timer),r?(this.loader.classList.remove("mathbox-exit"),this.loader.style.display="block"):(this.loader.classList.add("mathbox-exit"),this.timer=setTimeout((()=>this.loader.style.display="none"),150));const s=n<i?.1*Math.round(1e3*n/i)+"%":"100%";if(this.bar.style.width=s,this.options.fancy){const t=this.random,n=Math.max(0,Math.min(1,e.Time.now-this.start)),i=function(i,r){return null==r&&(r=0),i.replace(/(-?[0-9.e]+)deg/g,((i,s)=>+s+t[r++]*n*e.Time.step*60+"deg"))};return(()=>{const t=[];for(let e=0;e<this.gyro.length;e++){let n;const r=this.gyro[e];this.transforms[e]=n=i(this.transforms[e]),t.push(r.style.transform=r.style.WebkitTransform=n)}return t})()}},destroy(){return null!=this.div&&this.div.remove(),this.div=null}}),C.registerAlias("empty",["fallback","bind","renderer","size","fill","loop","time"]),C.registerAlias("core",["empty","scene","camera","render","warmup"]),C.registerAlias("VR",["core","cursor","fullscreen","render:vr"]),C.registerPlugin("bind",{install:function(t){const e={three:t,window};t.bind=E.bind(t,e),t.unbind=E.unbind(t),t.bind("install:bind",this),t.bind("uninstall:unbind",this)},uninstall:function(t){t.unbind(this),delete t.bind,delete t.unbind},bind:function(t,e){const n=t.plugin,i=n.listen;i&&i.forEach((function(t){e.bind(t,n)}))},unbind:function(t,e){e.unbind(t.plugin)}});const R=[];for(let t=0;t<256;t++)R[t]=(t<16?"0":"")+t.toString(16);const D=Math.PI/180,k=180/Math.PI;function P(){const t=4294967295*Math.random()|0,e=4294967295*Math.random()|0,n=4294967295*Math.random()|0,i=4294967295*Math.random()|0;return(R[255&t]+R[t>>8&255]+R[t>>16&255]+R[t>>24&255]+"-"+R[255&e]+R[e>>8&255]+"-"+R[e>>16&15|64]+R[e>>24&255]+"-"+R[63&n|128]+R[n>>8&255]+"-"+R[n>>16&255]+R[n>>24&255]+R[255&i]+R[i>>8&255]+R[i>>16&255]+R[i>>24&255]).toUpperCase()}function L(t,e,n){return Math.max(e,Math.min(n,t))}function z(t,e){return(t%e+e)%e}function O(t,e,n){return(1-n)*t+n*e}function I(t){return 0==(t&t-1)&&0!==t}function N(t){return Math.pow(2,Math.floor(Math.log(t)/Math.LN2))}class F{constructor(t=0,e=0,n=0,i=1){this._x=t,this._y=e,this._z=n,this._w=i}static slerp(t,e,n,i){return console.warn("THREE.Quaternion: Static .slerp() has been deprecated. Use qm.slerpQuaternions( qa, qb, t ) instead."),n.slerpQuaternions(t,e,i)}static slerpFlat(t,e,n,i,r,s,a){let o=n[i+0],l=n[i+1],h=n[i+2],c=n[i+3];const u=r[s+0],d=r[s+1],p=r[s+2],f=r[s+3];if(0===a)return t[e+0]=o,t[e+1]=l,t[e+2]=h,void(t[e+3]=c);if(1===a)return t[e+0]=u,t[e+1]=d,t[e+2]=p,void(t[e+3]=f);if(c!==f||o!==u||l!==d||h!==p){let t=1-a;const e=o*u+l*d+h*p+c*f,n=e>=0?1:-1,i=1-e*e;if(i>Number.EPSILON){const r=Math.sqrt(i),s=Math.atan2(r,e*n);t=Math.sin(t*s)/r,a=Math.sin(a*s)/r}const r=a*n;if(o=o*t+u*r,l=l*t+d*r,h=h*t+p*r,c=c*t+f*r,t===1-a){const t=1/Math.sqrt(o*o+l*l+h*h+c*c);o*=t,l*=t,h*=t,c*=t}}t[e]=o,t[e+1]=l,t[e+2]=h,t[e+3]=c}static multiplyQuaternionsFlat(t,e,n,i,r,s){const a=n[i],o=n[i+1],l=n[i+2],h=n[i+3],c=r[s],u=r[s+1],d=r[s+2],p=r[s+3];return t[e]=a*p+h*c+o*d-l*u,t[e+1]=o*p+h*u+l*c-a*d,t[e+2]=l*p+h*d+a*u-o*c,t[e+3]=h*p-a*c-o*u-l*d,t}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get w(){return this._w}set w(t){this._w=t,this._onChangeCallback()}set(t,e,n,i){return this._x=t,this._y=e,this._z=n,this._w=i,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(t){return this._x=t.x,this._y=t.y,this._z=t.z,this._w=t.w,this._onChangeCallback(),this}setFromEuler(t,e){if(!t||!t.isEuler)throw new Error("THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.");const n=t._x,i=t._y,r=t._z,s=t._order,a=Math.cos,o=Math.sin,l=a(n/2),h=a(i/2),c=a(r/2),u=o(n/2),d=o(i/2),p=o(r/2);switch(s){case"XYZ":this._x=u*h*c+l*d*p,this._y=l*d*c-u*h*p,this._z=l*h*p+u*d*c,this._w=l*h*c-u*d*p;break;case"YXZ":this._x=u*h*c+l*d*p,this._y=l*d*c-u*h*p,this._z=l*h*p-u*d*c,this._w=l*h*c+u*d*p;break;case"ZXY":this._x=u*h*c-l*d*p,this._y=l*d*c+u*h*p,this._z=l*h*p+u*d*c,this._w=l*h*c-u*d*p;break;case"ZYX":this._x=u*h*c-l*d*p,this._y=l*d*c+u*h*p,this._z=l*h*p-u*d*c,this._w=l*h*c+u*d*p;break;case"YZX":this._x=u*h*c+l*d*p,this._y=l*d*c+u*h*p,this._z=l*h*p-u*d*c,this._w=l*h*c-u*d*p;break;case"XZY":this._x=u*h*c-l*d*p,this._y=l*d*c-u*h*p,this._z=l*h*p+u*d*c,this._w=l*h*c+u*d*p;break;default:console.warn("THREE.Quaternion: .setFromEuler() encountered an unknown order: "+s)}return!1!==e&&this._onChangeCallback(),this}setFromAxisAngle(t,e){const n=e/2,i=Math.sin(n);return this._x=t.x*i,this._y=t.y*i,this._z=t.z*i,this._w=Math.cos(n),this._onChangeCallback(),this}setFromRotationMatrix(t){const e=t.elements,n=e[0],i=e[4],r=e[8],s=e[1],a=e[5],o=e[9],l=e[2],h=e[6],c=e[10],u=n+a+c;if(u>0){const t=.5/Math.sqrt(u+1);this._w=.25/t,this._x=(h-o)*t,this._y=(r-l)*t,this._z=(s-i)*t}else if(n>a&&n>c){const t=2*Math.sqrt(1+n-a-c);this._w=(h-o)/t,this._x=.25*t,this._y=(i+s)/t,this._z=(r+l)/t}else if(a>c){const t=2*Math.sqrt(1+a-n-c);this._w=(r-l)/t,this._x=(i+s)/t,this._y=.25*t,this._z=(o+h)/t}else{const t=2*Math.sqrt(1+c-n-a);this._w=(s-i)/t,this._x=(r+l)/t,this._y=(o+h)/t,this._z=.25*t}return this._onChangeCallback(),this}setFromUnitVectors(t,e){let n=t.dot(e)+1;return n<Number.EPSILON?(n=0,Math.abs(t.x)>Math.abs(t.z)?(this._x=-t.y,this._y=t.x,this._z=0,this._w=n):(this._x=0,this._y=-t.z,this._z=t.y,this._w=n)):(this._x=t.y*e.z-t.z*e.y,this._y=t.z*e.x-t.x*e.z,this._z=t.x*e.y-t.y*e.x,this._w=n),this.normalize()}angleTo(t){return 2*Math.acos(Math.abs(L(this.dot(t),-1,1)))}rotateTowards(t,e){const n=this.angleTo(t);if(0===n)return this;const i=Math.min(1,e/n);return this.slerp(t,i),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(t){return this._x*t._x+this._y*t._y+this._z*t._z+this._w*t._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let t=this.length();return 0===t?(this._x=0,this._y=0,this._z=0,this._w=1):(t=1/t,this._x=this._x*t,this._y=this._y*t,this._z=this._z*t,this._w=this._w*t),this._onChangeCallback(),this}multiply(t,e){return void 0!==e?(console.warn("THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."),this.multiplyQuaternions(t,e)):this.multiplyQuaternions(this,t)}premultiply(t){return this.multiplyQuaternions(t,this)}multiplyQuaternions(t,e){const n=t._x,i=t._y,r=t._z,s=t._w,a=e._x,o=e._y,l=e._z,h=e._w;return this._x=n*h+s*a+i*l-r*o,this._y=i*h+s*o+r*a-n*l,this._z=r*h+s*l+n*o-i*a,this._w=s*h-n*a-i*o-r*l,this._onChangeCallback(),this}slerp(t,e){if(0===e)return this;if(1===e)return this.copy(t);const n=this._x,i=this._y,r=this._z,s=this._w;let a=s*t._w+n*t._x+i*t._y+r*t._z;if(a<0?(this._w=-t._w,this._x=-t._x,this._y=-t._y,this._z=-t._z,a=-a):this.copy(t),a>=1)return this._w=s,this._x=n,this._y=i,this._z=r,this;const o=1-a*a;if(o<=Number.EPSILON){const t=1-e;return this._w=t*s+e*this._w,this._x=t*n+e*this._x,this._y=t*i+e*this._y,this._z=t*r+e*this._z,this.normalize(),this._onChangeCallback(),this}const l=Math.sqrt(o),h=Math.atan2(l,a),c=Math.sin((1-e)*h)/l,u=Math.sin(e*h)/l;return this._w=s*c+this._w*u,this._x=n*c+this._x*u,this._y=i*c+this._y*u,this._z=r*c+this._z*u,this._onChangeCallback(),this}slerpQuaternions(t,e,n){return this.copy(t).slerp(e,n)}random(){const t=Math.random(),e=Math.sqrt(1-t),n=Math.sqrt(t),i=2*Math.PI*Math.random(),r=2*Math.PI*Math.random();return this.set(e*Math.cos(i),n*Math.sin(r),n*Math.cos(r),e*Math.sin(i))}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._w===this._w}fromArray(t,e=0){return this._x=t[e],this._y=t[e+1],this._z=t[e+2],this._w=t[e+3],this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._w,t}fromBufferAttribute(t,e){return this._x=t.getX(e),this._y=t.getY(e),this._z=t.getZ(e),this._w=t.getW(e),this}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}}F.prototype.isQuaternion=!0;class U{constructor(t=0,e=0,n=0){this.x=t,this.y=e,this.z=n}set(t,e,n){return void 0===n&&(n=this.z),this.x=t,this.y=e,this.z=n,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this}add(t,e){return void 0!==e?(console.warn("THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(t,e)):(this.x+=t.x,this.y+=t.y,this.z+=t.z,this)}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this}sub(t,e){return void 0!==e?(console.warn("THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(t,e)):(this.x-=t.x,this.y-=t.y,this.z-=t.z,this)}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this}multiply(t,e){return void 0!==e?(console.warn("THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."),this.multiplyVectors(t,e)):(this.x*=t.x,this.y*=t.y,this.z*=t.z,this)}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this}multiplyVectors(t,e){return this.x=t.x*e.x,this.y=t.y*e.y,this.z=t.z*e.z,this}applyEuler(t){return t&&t.isEuler||console.error("THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order."),this.applyQuaternion(V.setFromEuler(t))}applyAxisAngle(t,e){return this.applyQuaternion(V.setFromAxisAngle(t,e))}applyMatrix3(t){const e=this.x,n=this.y,i=this.z,r=t.elements;return this.x=r[0]*e+r[3]*n+r[6]*i,this.y=r[1]*e+r[4]*n+r[7]*i,this.z=r[2]*e+r[5]*n+r[8]*i,this}applyNormalMatrix(t){return this.applyMatrix3(t).normalize()}applyMatrix4(t){const e=this.x,n=this.y,i=this.z,r=t.elements,s=1/(r[3]*e+r[7]*n+r[11]*i+r[15]);return this.x=(r[0]*e+r[4]*n+r[8]*i+r[12])*s,this.y=(r[1]*e+r[5]*n+r[9]*i+r[13])*s,this.z=(r[2]*e+r[6]*n+r[10]*i+r[14])*s,this}applyQuaternion(t){const e=this.x,n=this.y,i=this.z,r=t.x,s=t.y,a=t.z,o=t.w,l=o*e+s*i-a*n,h=o*n+a*e-r*i,c=o*i+r*n-s*e,u=-r*e-s*n-a*i;return this.x=l*o+u*-r+h*-a-c*-s,this.y=h*o+u*-s+c*-r-l*-a,this.z=c*o+u*-a+l*-s-h*-r,this}project(t){return this.applyMatrix4(t.matrixWorldInverse).applyMatrix4(t.projectionMatrix)}unproject(t){return this.applyMatrix4(t.projectionMatrixInverse).applyMatrix4(t.matrixWorld)}transformDirection(t){const e=this.x,n=this.y,i=this.z,r=t.elements;return this.x=r[0]*e+r[4]*n+r[8]*i,this.y=r[1]*e+r[5]*n+r[9]*i,this.z=r[2]*e+r[6]*n+r[10]*i,this.normalize()}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this}divideScalar(t){return this.multiplyScalar(1/t)}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this}clamp(t,e){return this.x=Math.max(t.x,Math.min(e.x,this.x)),this.y=Math.max(t.y,Math.min(e.y,this.y)),this.z=Math.max(t.z,Math.min(e.z,this.z)),this}clampScalar(t,e){return this.x=Math.max(t,Math.min(e,this.x)),this.y=Math.max(t,Math.min(e,this.y)),this.z=Math.max(t,Math.min(e,this.z)),this}clampLength(t,e){const n=this.length();return this.divideScalar(n||1).multiplyScalar(Math.max(t,Math.min(e,n)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this.z=this.z<0?Math.ceil(this.z):Math.floor(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this}lerpVectors(t,e,n){return this.x=t.x+(e.x-t.x)*n,this.y=t.y+(e.y-t.y)*n,this.z=t.z+(e.z-t.z)*n,this}cross(t,e){return void 0!==e?(console.warn("THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."),this.crossVectors(t,e)):this.crossVectors(this,t)}crossVectors(t,e){const n=t.x,i=t.y,r=t.z,s=e.x,a=e.y,o=e.z;return this.x=i*o-r*a,this.y=r*s-n*o,this.z=n*a-i*s,this}projectOnVector(t){const e=t.lengthSq();if(0===e)return this.set(0,0,0);const n=t.dot(this)/e;return this.copy(t).multiplyScalar(n)}projectOnPlane(t){return B.copy(this).projectOnVector(t),this.sub(B)}reflect(t){return this.sub(B.copy(t).multiplyScalar(2*this.dot(t)))}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(0===e)return Math.PI/2;const n=this.dot(t)/e;return Math.acos(L(n,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,n=this.y-t.y,i=this.z-t.z;return e*e+n*n+i*i}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)+Math.abs(this.z-t.z)}setFromSpherical(t){return this.setFromSphericalCoords(t.radius,t.phi,t.theta)}setFromSphericalCoords(t,e,n){const i=Math.sin(e)*t;return this.x=i*Math.sin(n),this.y=Math.cos(e)*t,this.z=i*Math.cos(n),this}setFromCylindrical(t){return this.setFromCylindricalCoords(t.radius,t.theta,t.y)}setFromCylindricalCoords(t,e,n){return this.x=t*Math.sin(e),this.y=n,this.z=t*Math.cos(e),this}setFromMatrixPosition(t){const e=t.elements;return this.x=e[12],this.y=e[13],this.z=e[14],this}setFromMatrixScale(t){const e=this.setFromMatrixColumn(t,0).length(),n=this.setFromMatrixColumn(t,1).length(),i=this.setFromMatrixColumn(t,2).length();return this.x=e,this.y=n,this.z=i,this}setFromMatrixColumn(t,e){return this.fromArray(t.elements,4*e)}setFromMatrix3Column(t,e){return this.fromArray(t.elements,3*e)}equals(t){return t.x===this.x&&t.y===this.y&&t.z===this.z}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this.z=t[e+2],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t}fromBufferAttribute(t,e,n){return void 0!==n&&console.warn("THREE.Vector3: offset has been removed from .fromBufferAttribute()."),this.x=t.getX(e),this.y=t.getY(e),this.z=t.getZ(e),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){const t=2*(Math.random()-.5),e=Math.random()*Math.PI*2,n=Math.sqrt(1-t**2);return this.x=n*Math.cos(e),this.y=n*Math.sin(e),this.z=t,this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}}U.prototype.isVector3=!0;const B=new U,V=new F;class H{constructor(){this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],arguments.length>0&&console.error("THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.")}set(t,e,n,i,r,s,a,o,l,h,c,u,d,p,f,m){const g=this.elements;return g[0]=t,g[4]=e,g[8]=n,g[12]=i,g[1]=r,g[5]=s,g[9]=a,g[13]=o,g[2]=l,g[6]=h,g[10]=c,g[14]=u,g[3]=d,g[7]=p,g[11]=f,g[15]=m,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}clone(){return(new H).fromArray(this.elements)}copy(t){const e=this.elements,n=t.elements;return e[0]=n[0],e[1]=n[1],e[2]=n[2],e[3]=n[3],e[4]=n[4],e[5]=n[5],e[6]=n[6],e[7]=n[7],e[8]=n[8],e[9]=n[9],e[10]=n[10],e[11]=n[11],e[12]=n[12],e[13]=n[13],e[14]=n[14],e[15]=n[15],this}copyPosition(t){const e=this.elements,n=t.elements;return e[12]=n[12],e[13]=n[13],e[14]=n[14],this}setFromMatrix3(t){const e=t.elements;return this.set(e[0],e[3],e[6],0,e[1],e[4],e[7],0,e[2],e[5],e[8],0,0,0,0,1),this}extractBasis(t,e,n){return t.setFromMatrixColumn(this,0),e.setFromMatrixColumn(this,1),n.setFromMatrixColumn(this,2),this}makeBasis(t,e,n){return this.set(t.x,e.x,n.x,0,t.y,e.y,n.y,0,t.z,e.z,n.z,0,0,0,0,1),this}extractRotation(t){const e=this.elements,n=t.elements,i=1/G.setFromMatrixColumn(t,0).length(),r=1/G.setFromMatrixColumn(t,1).length(),s=1/G.setFromMatrixColumn(t,2).length();return e[0]=n[0]*i,e[1]=n[1]*i,e[2]=n[2]*i,e[3]=0,e[4]=n[4]*r,e[5]=n[5]*r,e[6]=n[6]*r,e[7]=0,e[8]=n[8]*s,e[9]=n[9]*s,e[10]=n[10]*s,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromEuler(t){t&&t.isEuler||console.error("THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.");const e=this.elements,n=t.x,i=t.y,r=t.z,s=Math.cos(n),a=Math.sin(n),o=Math.cos(i),l=Math.sin(i),h=Math.cos(r),c=Math.sin(r);if("XYZ"===t.order){const t=s*h,n=s*c,i=a*h,r=a*c;e[0]=o*h,e[4]=-o*c,e[8]=l,e[1]=n+i*l,e[5]=t-r*l,e[9]=-a*o,e[2]=r-t*l,e[6]=i+n*l,e[10]=s*o}else if("YXZ"===t.order){const t=o*h,n=o*c,i=l*h,r=l*c;e[0]=t+r*a,e[4]=i*a-n,e[8]=s*l,e[1]=s*c,e[5]=s*h,e[9]=-a,e[2]=n*a-i,e[6]=r+t*a,e[10]=s*o}else if("ZXY"===t.order){const t=o*h,n=o*c,i=l*h,r=l*c;e[0]=t-r*a,e[4]=-s*c,e[8]=i+n*a,e[1]=n+i*a,e[5]=s*h,e[9]=r-t*a,e[2]=-s*l,e[6]=a,e[10]=s*o}else if("ZYX"===t.order){const t=s*h,n=s*c,i=a*h,r=a*c;e[0]=o*h,e[4]=i*l-n,e[8]=t*l+r,e[1]=o*c,e[5]=r*l+t,e[9]=n*l-i,e[2]=-l,e[6]=a*o,e[10]=s*o}else if("YZX"===t.order){const t=s*o,n=s*l,i=a*o,r=a*l;e[0]=o*h,e[4]=r-t*c,e[8]=i*c+n,e[1]=c,e[5]=s*h,e[9]=-a*h,e[2]=-l*h,e[6]=n*c+i,e[10]=t-r*c}else if("XZY"===t.order){const t=s*o,n=s*l,i=a*o,r=a*l;e[0]=o*h,e[4]=-c,e[8]=l*h,e[1]=t*c+r,e[5]=s*h,e[9]=n*c-i,e[2]=i*c-n,e[6]=a*h,e[10]=r*c+t}return e[3]=0,e[7]=0,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromQuaternion(t){return this.compose(q,t,W)}lookAt(t,e,n){const i=this.elements;return $.subVectors(t,e),0===$.lengthSq()&&($.z=1),$.normalize(),X.crossVectors(n,$),0===X.lengthSq()&&(1===Math.abs(n.z)?$.x+=1e-4:$.z+=1e-4,$.normalize(),X.crossVectors(n,$)),X.normalize(),Y.crossVectors($,X),i[0]=X.x,i[4]=Y.x,i[8]=$.x,i[1]=X.y,i[5]=Y.y,i[9]=$.y,i[2]=X.z,i[6]=Y.z,i[10]=$.z,this}multiply(t,e){return void 0!==e?(console.warn("THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."),this.multiplyMatrices(t,e)):this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const n=t.elements,i=e.elements,r=this.elements,s=n[0],a=n[4],o=n[8],l=n[12],h=n[1],c=n[5],u=n[9],d=n[13],p=n[2],f=n[6],m=n[10],g=n[14],v=n[3],x=n[7],_=n[11],y=n[15],b=i[0],w=i[4],S=i[8],M=i[12],T=i[1],E=i[5],A=i[9],C=i[13],R=i[2],D=i[6],k=i[10],P=i[14],L=i[3],z=i[7],O=i[11],I=i[15];return r[0]=s*b+a*T+o*R+l*L,r[4]=s*w+a*E+o*D+l*z,r[8]=s*S+a*A+o*k+l*O,r[12]=s*M+a*C+o*P+l*I,r[1]=h*b+c*T+u*R+d*L,r[5]=h*w+c*E+u*D+d*z,r[9]=h*S+c*A+u*k+d*O,r[13]=h*M+c*C+u*P+d*I,r[2]=p*b+f*T+m*R+g*L,r[6]=p*w+f*E+m*D+g*z,r[10]=p*S+f*A+m*k+g*O,r[14]=p*M+f*C+m*P+g*I,r[3]=v*b+x*T+_*R+y*L,r[7]=v*w+x*E+_*D+y*z,r[11]=v*S+x*A+_*k+y*O,r[15]=v*M+x*C+_*P+y*I,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[4]*=t,e[8]*=t,e[12]*=t,e[1]*=t,e[5]*=t,e[9]*=t,e[13]*=t,e[2]*=t,e[6]*=t,e[10]*=t,e[14]*=t,e[3]*=t,e[7]*=t,e[11]*=t,e[15]*=t,this}determinant(){const t=this.elements,e=t[0],n=t[4],i=t[8],r=t[12],s=t[1],a=t[5],o=t[9],l=t[13],h=t[2],c=t[6],u=t[10],d=t[14];return t[3]*(+r*o*c-i*l*c-r*a*u+n*l*u+i*a*d-n*o*d)+t[7]*(+e*o*d-e*l*u+r*s*u-i*s*d+i*l*h-r*o*h)+t[11]*(+e*l*c-e*a*d-r*s*c+n*s*d+r*a*h-n*l*h)+t[15]*(-i*a*h-e*o*c+e*a*u+i*s*c-n*s*u+n*o*h)}transpose(){const t=this.elements;let e;return e=t[1],t[1]=t[4],t[4]=e,e=t[2],t[2]=t[8],t[8]=e,e=t[6],t[6]=t[9],t[9]=e,e=t[3],t[3]=t[12],t[12]=e,e=t[7],t[7]=t[13],t[13]=e,e=t[11],t[11]=t[14],t[14]=e,this}setPosition(t,e,n){const i=this.elements;return t.isVector3?(i[12]=t.x,i[13]=t.y,i[14]=t.z):(i[12]=t,i[13]=e,i[14]=n),this}invert(){const t=this.elements,e=t[0],n=t[1],i=t[2],r=t[3],s=t[4],a=t[5],o=t[6],l=t[7],h=t[8],c=t[9],u=t[10],d=t[11],p=t[12],f=t[13],m=t[14],g=t[15],v=c*m*l-f*u*l+f*o*d-a*m*d-c*o*g+a*u*g,x=p*u*l-h*m*l-p*o*d+s*m*d+h*o*g-s*u*g,_=h*f*l-p*c*l+p*a*d-s*f*d-h*a*g+s*c*g,y=p*c*o-h*f*o-p*a*u+s*f*u+h*a*m-s*c*m,b=e*v+n*x+i*_+r*y;if(0===b)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);const w=1/b;return t[0]=v*w,t[1]=(f*u*r-c*m*r-f*i*d+n*m*d+c*i*g-n*u*g)*w,t[2]=(a*m*r-f*o*r+f*i*l-n*m*l-a*i*g+n*o*g)*w,t[3]=(c*o*r-a*u*r-c*i*l+n*u*l+a*i*d-n*o*d)*w,t[4]=x*w,t[5]=(h*m*r-p*u*r+p*i*d-e*m*d-h*i*g+e*u*g)*w,t[6]=(p*o*r-s*m*r-p*i*l+e*m*l+s*i*g-e*o*g)*w,t[7]=(s*u*r-h*o*r+h*i*l-e*u*l-s*i*d+e*o*d)*w,t[8]=_*w,t[9]=(p*c*r-h*f*r-p*n*d+e*f*d+h*n*g-e*c*g)*w,t[10]=(s*f*r-p*a*r+p*n*l-e*f*l-s*n*g+e*a*g)*w,t[11]=(h*a*r-s*c*r-h*n*l+e*c*l+s*n*d-e*a*d)*w,t[12]=y*w,t[13]=(h*f*i-p*c*i+p*n*u-e*f*u-h*n*m+e*c*m)*w,t[14]=(p*a*i-s*f*i-p*n*o+e*f*o+s*n*m-e*a*m)*w,t[15]=(s*c*i-h*a*i+h*n*o-e*c*o-s*n*u+e*a*u)*w,this}scale(t){const e=this.elements,n=t.x,i=t.y,r=t.z;return e[0]*=n,e[4]*=i,e[8]*=r,e[1]*=n,e[5]*=i,e[9]*=r,e[2]*=n,e[6]*=i,e[10]*=r,e[3]*=n,e[7]*=i,e[11]*=r,this}getMaxScaleOnAxis(){const t=this.elements,e=t[0]*t[0]+t[1]*t[1]+t[2]*t[2],n=t[4]*t[4]+t[5]*t[5]+t[6]*t[6],i=t[8]*t[8]+t[9]*t[9]+t[10]*t[10];return Math.sqrt(Math.max(e,n,i))}makeTranslation(t,e,n){return this.set(1,0,0,t,0,1,0,e,0,0,1,n,0,0,0,1),this}makeRotationX(t){const e=Math.cos(t),n=Math.sin(t);return this.set(1,0,0,0,0,e,-n,0,0,n,e,0,0,0,0,1),this}makeRotationY(t){const e=Math.cos(t),n=Math.sin(t);return this.set(e,0,n,0,0,1,0,0,-n,0,e,0,0,0,0,1),this}makeRotationZ(t){const e=Math.cos(t),n=Math.sin(t);return this.set(e,-n,0,0,n,e,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(t,e){const n=Math.cos(e),i=Math.sin(e),r=1-n,s=t.x,a=t.y,o=t.z,l=r*s,h=r*a;return this.set(l*s+n,l*a-i*o,l*o+i*a,0,l*a+i*o,h*a+n,h*o-i*s,0,l*o-i*a,h*o+i*s,r*o*o+n,0,0,0,0,1),this}makeScale(t,e,n){return this.set(t,0,0,0,0,e,0,0,0,0,n,0,0,0,0,1),this}makeShear(t,e,n,i,r,s){return this.set(1,n,r,0,t,1,s,0,e,i,1,0,0,0,0,1),this}compose(t,e,n){const i=this.elements,r=e._x,s=e._y,a=e._z,o=e._w,l=r+r,h=s+s,c=a+a,u=r*l,d=r*h,p=r*c,f=s*h,m=s*c,g=a*c,v=o*l,x=o*h,_=o*c,y=n.x,b=n.y,w=n.z;return i[0]=(1-(f+g))*y,i[1]=(d+_)*y,i[2]=(p-x)*y,i[3]=0,i[4]=(d-_)*b,i[5]=(1-(u+g))*b,i[6]=(m+v)*b,i[7]=0,i[8]=(p+x)*w,i[9]=(m-v)*w,i[10]=(1-(u+f))*w,i[11]=0,i[12]=t.x,i[13]=t.y,i[14]=t.z,i[15]=1,this}decompose(t,e,n){const i=this.elements;let r=G.set(i[0],i[1],i[2]).length();const s=G.set(i[4],i[5],i[6]).length(),a=G.set(i[8],i[9],i[10]).length();this.determinant()<0&&(r=-r),t.x=i[12],t.y=i[13],t.z=i[14],j.copy(this);const o=1/r,l=1/s,h=1/a;return j.elements[0]*=o,j.elements[1]*=o,j.elements[2]*=o,j.elements[4]*=l,j.elements[5]*=l,j.elements[6]*=l,j.elements[8]*=h,j.elements[9]*=h,j.elements[10]*=h,e.setFromRotationMatrix(j),n.x=r,n.y=s,n.z=a,this}makePerspective(t,e,n,i,r,s){void 0===s&&console.warn("THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.");const a=this.elements,o=2*r/(e-t),l=2*r/(n-i),h=(e+t)/(e-t),c=(n+i)/(n-i),u=-(s+r)/(s-r),d=-2*s*r/(s-r);return a[0]=o,a[4]=0,a[8]=h,a[12]=0,a[1]=0,a[5]=l,a[9]=c,a[13]=0,a[2]=0,a[6]=0,a[10]=u,a[14]=d,a[3]=0,a[7]=0,a[11]=-1,a[15]=0,this}makeOrthographic(t,e,n,i,r,s){const a=this.elements,o=1/(e-t),l=1/(n-i),h=1/(s-r),c=(e+t)*o,u=(n+i)*l,d=(s+r)*h;return a[0]=2*o,a[4]=0,a[8]=0,a[12]=-c,a[1]=0,a[5]=2*l,a[9]=0,a[13]=-u,a[2]=0,a[6]=0,a[10]=-2*h,a[14]=-d,a[3]=0,a[7]=0,a[11]=0,a[15]=1,this}equals(t){const e=this.elements,n=t.elements;for(let t=0;t<16;t++)if(e[t]!==n[t])return!1;return!0}fromArray(t,e=0){for(let n=0;n<16;n++)this.elements[n]=t[n+e];return this}toArray(t=[],e=0){const n=this.elements;return t[e]=n[0],t[e+1]=n[1],t[e+2]=n[2],t[e+3]=n[3],t[e+4]=n[4],t[e+5]=n[5],t[e+6]=n[6],t[e+7]=n[7],t[e+8]=n[8],t[e+9]=n[9],t[e+10]=n[10],t[e+11]=n[11],t[e+12]=n[12],t[e+13]=n[13],t[e+14]=n[14],t[e+15]=n[15],t}}H.prototype.isMatrix4=!0;const G=new U,j=new H,q=new U(0,0,0),W=new U(1,1,1),X=new U,Y=new U,$=new U,Z=new H,K=new F;class J{constructor(t=0,e=0,n=0,i=J.DefaultOrder){this._x=t,this._y=e,this._z=n,this._order=i}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get order(){return this._order}set order(t){this._order=t,this._onChangeCallback()}set(t,e,n,i=this._order){return this._x=t,this._y=e,this._z=n,this._order=i,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._order)}copy(t){return this._x=t._x,this._y=t._y,this._z=t._z,this._order=t._order,this._onChangeCallback(),this}setFromRotationMatrix(t,e=this._order,n=!0){const i=t.elements,r=i[0],s=i[4],a=i[8],o=i[1],l=i[5],h=i[9],c=i[2],u=i[6],d=i[10];switch(e){case"XYZ":this._y=Math.asin(L(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(-h,d),this._z=Math.atan2(-s,r)):(this._x=Math.atan2(u,l),this._z=0);break;case"YXZ":this._x=Math.asin(-L(h,-1,1)),Math.abs(h)<.9999999?(this._y=Math.atan2(a,d),this._z=Math.atan2(o,l)):(this._y=Math.atan2(-c,r),this._z=0);break;case"ZXY":this._x=Math.asin(L(u,-1,1)),Math.abs(u)<.9999999?(this._y=Math.atan2(-c,d),this._z=Math.atan2(-s,l)):(this._y=0,this._z=Math.atan2(o,r));break;case"ZYX":this._y=Math.asin(-L(c,-1,1)),Math.abs(c)<.9999999?(this._x=Math.atan2(u,d),this._z=Math.atan2(o,r)):(this._x=0,this._z=Math.atan2(-s,l));break;case"YZX":this._z=Math.asin(L(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(-h,l),this._y=Math.atan2(-c,r)):(this._x=0,this._y=Math.atan2(a,d));break;case"XZY":this._z=Math.asin(-L(s,-1,1)),Math.abs(s)<.9999999?(this._x=Math.atan2(u,l),this._y=Math.atan2(a,r)):(this._x=Math.atan2(-h,d),this._y=0);break;default:console.warn("THREE.Euler: .setFromRotationMatrix() encountered an unknown order: "+e)}return this._order=e,!0===n&&this._onChangeCallback(),this}setFromQuaternion(t,e,n){return Z.makeRotationFromQuaternion(t),this.setFromRotationMatrix(Z,e,n)}setFromVector3(t,e=this._order){return this.set(t.x,t.y,t.z,e)}reorder(t){return K.setFromEuler(this),this.setFromQuaternion(K,t)}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._order===this._order}fromArray(t){return this._x=t[0],this._y=t[1],this._z=t[2],void 0!==t[3]&&(this._order=t[3]),this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._order,t}toVector3(t){return t?t.set(this._x,this._y,this._z):new U(this._x,this._y,this._z)}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}}J.prototype.isEuler=!0,J.DefaultOrder="XYZ",J.RotationOrders=["XYZ","YZX","ZXY","XZY","YXZ","ZYX"];class Q{constructor(){this.mask=1}set(t){this.mask=(1<<t|0)>>>0}enable(t){this.mask|=1<<t|0}enableAll(){this.mask=-1}toggle(t){this.mask^=1<<t|0}disable(t){this.mask&=~(1<<t|0)}disableAll(){this.mask=0}test(t){return 0!=(this.mask&t.mask)}isEnabled(t){return 0!=(this.mask&(1<<t|0))}}class tt{constructor(){this.elements=[1,0,0,0,1,0,0,0,1],arguments.length>0&&console.error("THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.")}set(t,e,n,i,r,s,a,o,l){const h=this.elements;return h[0]=t,h[1]=i,h[2]=a,h[3]=e,h[4]=r,h[5]=o,h[6]=n,h[7]=s,h[8]=l,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(t){const e=this.elements,n=t.elements;return e[0]=n[0],e[1]=n[1],e[2]=n[2],e[3]=n[3],e[4]=n[4],e[5]=n[5],e[6]=n[6],e[7]=n[7],e[8]=n[8],this}extractBasis(t,e,n){return t.setFromMatrix3Column(this,0),e.setFromMatrix3Column(this,1),n.setFromMatrix3Column(this,2),this}setFromMatrix4(t){const e=t.elements;return this.set(e[0],e[4],e[8],e[1],e[5],e[9],e[2],e[6],e[10]),this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const n=t.elements,i=e.elements,r=this.elements,s=n[0],a=n[3],o=n[6],l=n[1],h=n[4],c=n[7],u=n[2],d=n[5],p=n[8],f=i[0],m=i[3],g=i[6],v=i[1],x=i[4],_=i[7],y=i[2],b=i[5],w=i[8];return r[0]=s*f+a*v+o*y,r[3]=s*m+a*x+o*b,r[6]=s*g+a*_+o*w,r[1]=l*f+h*v+c*y,r[4]=l*m+h*x+c*b,r[7]=l*g+h*_+c*w,r[2]=u*f+d*v+p*y,r[5]=u*m+d*x+p*b,r[8]=u*g+d*_+p*w,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[3]*=t,e[6]*=t,e[1]*=t,e[4]*=t,e[7]*=t,e[2]*=t,e[5]*=t,e[8]*=t,this}determinant(){const t=this.elements,e=t[0],n=t[1],i=t[2],r=t[3],s=t[4],a=t[5],o=t[6],l=t[7],h=t[8];return e*s*h-e*a*l-n*r*h+n*a*o+i*r*l-i*s*o}invert(){const t=this.elements,e=t[0],n=t[1],i=t[2],r=t[3],s=t[4],a=t[5],o=t[6],l=t[7],h=t[8],c=h*s-a*l,u=a*o-h*r,d=l*r-s*o,p=e*c+n*u+i*d;if(0===p)return this.set(0,0,0,0,0,0,0,0,0);const f=1/p;return t[0]=c*f,t[1]=(i*l-h*n)*f,t[2]=(a*n-i*s)*f,t[3]=u*f,t[4]=(h*e-i*o)*f,t[5]=(i*r-a*e)*f,t[6]=d*f,t[7]=(n*o-l*e)*f,t[8]=(s*e-n*r)*f,this}transpose(){let t;const e=this.elements;return t=e[1],e[1]=e[3],e[3]=t,t=e[2],e[2]=e[6],e[6]=t,t=e[5],e[5]=e[7],e[7]=t,this}getNormalMatrix(t){return this.setFromMatrix4(t).invert().transpose()}transposeIntoArray(t){const e=this.elements;return t[0]=e[0],t[1]=e[3],t[2]=e[6],t[3]=e[1],t[4]=e[4],t[5]=e[7],t[6]=e[2],t[7]=e[5],t[8]=e[8],this}setUvTransform(t,e,n,i,r,s,a){const o=Math.cos(r),l=Math.sin(r);return this.set(n*o,n*l,-n*(o*s+l*a)+s+t,-i*l,i*o,-i*(-l*s+o*a)+a+e,0,0,1),this}scale(t,e){const n=this.elements;return n[0]*=t,n[3]*=t,n[6]*=t,n[1]*=e,n[4]*=e,n[7]*=e,this}rotate(t){const e=Math.cos(t),n=Math.sin(t),i=this.elements,r=i[0],s=i[3],a=i[6],o=i[1],l=i[4],h=i[7];return i[0]=e*r+n*o,i[3]=e*s+n*l,i[6]=e*a+n*h,i[1]=-n*r+e*o,i[4]=-n*s+e*l,i[7]=-n*a+e*h,this}translate(t,e){const n=this.elements;return n[0]+=t*n[2],n[3]+=t*n[5],n[6]+=t*n[8],n[1]+=e*n[2],n[4]+=e*n[5],n[7]+=e*n[8],this}equals(t){const e=this.elements,n=t.elements;for(let t=0;t<9;t++)if(e[t]!==n[t])return!1;return!0}fromArray(t,e=0){for(let n=0;n<9;n++)this.elements[n]=t[n+e];return this}toArray(t=[],e=0){const n=this.elements;return t[e]=n[0],t[e+1]=n[1],t[e+2]=n[2],t[e+3]=n[3],t[e+4]=n[4],t[e+5]=n[5],t[e+6]=n[6],t[e+7]=n[7],t[e+8]=n[8],t}clone(){return(new this.constructor).fromArray(this.elements)}}tt.prototype.isMatrix3=!0;let et=0;const nt=new U,it=new F,rt=new H,st=new U,at=new U,ot=new U,lt=new F,ht=new U(1,0,0),ct=new U(0,1,0),ut=new U(0,0,1),dt={type:"added"},pt={type:"removed"};class ft extends T{constructor(){super(),Object.defineProperty(this,"id",{value:et++}),this.uuid=P(),this.name="",this.type="Object3D",this.parent=null,this.children=[],this.up=ft.DefaultUp.clone();const t=new U,e=new J,n=new F,i=new U(1,1,1);e._onChange((function(){n.setFromEuler(e,!1)})),n._onChange((function(){e.setFromQuaternion(n,void 0,!1)})),Object.defineProperties(this,{position:{configurable:!0,enumerable:!0,value:t},rotation:{configurable:!0,enumerable:!0,value:e},quaternion:{configurable:!0,enumerable:!0,value:n},scale:{configurable:!0,enumerable:!0,value:i},modelViewMatrix:{value:new H},normalMatrix:{value:new tt}}),this.matrix=new H,this.matrixWorld=new H,this.matrixAutoUpdate=ft.DefaultMatrixAutoUpdate,this.matrixWorldNeedsUpdate=!1,this.layers=new Q,this.visible=!0,this.castShadow=!1,this.receiveShadow=!1,this.frustumCulled=!0,this.renderOrder=0,this.animations=[],this.userData={}}onBeforeRender(){}onAfterRender(){}applyMatrix4(t){this.matrixAutoUpdate&&this.updateMatrix(),this.matrix.premultiply(t),this.matrix.decompose(this.position,this.quaternion,this.scale)}applyQuaternion(t){return this.quaternion.premultiply(t),this}setRotationFromAxisAngle(t,e){this.quaternion.setFromAxisAngle(t,e)}setRotationFromEuler(t){this.quaternion.setFromEuler(t,!0)}setRotationFromMatrix(t){this.quaternion.setFromRotationMatrix(t)}setRotationFromQuaternion(t){this.quaternion.copy(t)}rotateOnAxis(t,e){return it.setFromAxisAngle(t,e),this.quaternion.multiply(it),this}rotateOnWorldAxis(t,e){return it.setFromAxisAngle(t,e),this.quaternion.premultiply(it),this}rotateX(t){return this.rotateOnAxis(ht,t)}rotateY(t){return this.rotateOnAxis(ct,t)}rotateZ(t){return this.rotateOnAxis(ut,t)}translateOnAxis(t,e){return nt.copy(t).applyQuaternion(this.quaternion),this.position.add(nt.multiplyScalar(e)),this}translateX(t){return this.translateOnAxis(ht,t)}translateY(t){return this.translateOnAxis(ct,t)}translateZ(t){return this.translateOnAxis(ut,t)}localToWorld(t){return t.applyMatrix4(this.matrixWorld)}worldToLocal(t){return t.applyMatrix4(rt.copy(this.matrixWorld).invert())}lookAt(t,e,n){t.isVector3?st.copy(t):st.set(t,e,n);const i=this.parent;this.updateWorldMatrix(!0,!1),at.setFromMatrixPosition(this.matrixWorld),this.isCamera||this.isLight?rt.lookAt(at,st,this.up):rt.lookAt(st,at,this.up),this.quaternion.setFromRotationMatrix(rt),i&&(rt.extractRotation(i.matrixWorld),it.setFromRotationMatrix(rt),this.quaternion.premultiply(it.invert()))}add(t){if(arguments.length>1){for(let t=0;t<arguments.length;t++)this.add(arguments[t]);return this}return t===this?(console.error("THREE.Object3D.add: object can't be added as a child of itself.",t),this):(t&&t.isObject3D?(null!==t.parent&&t.parent.remove(t),t.parent=this,this.children.push(t),t.dispatchEvent(dt)):console.error("THREE.Object3D.add: object not an instance of THREE.Object3D.",t),this)}remove(t){if(arguments.length>1){for(let t=0;t<arguments.length;t++)this.remove(arguments[t]);return this}const e=this.children.indexOf(t);return-1!==e&&(t.parent=null,this.children.splice(e,1),t.dispatchEvent(pt)),this}removeFromParent(){const t=this.parent;return null!==t&&t.remove(this),this}clear(){for(let t=0;t<this.children.length;t++){const e=this.children[t];e.parent=null,e.dispatchEvent(pt)}return this.children.length=0,this}attach(t){return this.updateWorldMatrix(!0,!1),rt.copy(this.matrixWorld).invert(),null!==t.parent&&(t.parent.updateWorldMatrix(!0,!1),rt.multiply(t.parent.matrixWorld)),t.applyMatrix4(rt),this.add(t),t.updateWorldMatrix(!1,!0),this}getObjectById(t){return this.getObjectByProperty("id",t)}getObjectByName(t){return this.getObjectByProperty("name",t)}getObjectByProperty(t,e){if(this[t]===e)return this;for(let n=0,i=this.children.length;n<i;n++){const i=this.children[n].getObjectByProperty(t,e);if(void 0!==i)return i}}getWorldPosition(t){return this.updateWorldMatrix(!0,!1),t.setFromMatrixPosition(this.matrixWorld)}getWorldQuaternion(t){return this.updateWorldMatrix(!0,!1),this.matrixWorld.decompose(at,t,ot),t}getWorldScale(t){return this.updateWorldMatrix(!0,!1),this.matrixWorld.decompose(at,lt,t),t}getWorldDirection(t){this.updateWorldMatrix(!0,!1);const e=this.matrixWorld.elements;return t.set(e[8],e[9],e[10]).normalize()}raycast(){}traverse(t){t(this);const e=this.children;for(let n=0,i=e.length;n<i;n++)e[n].traverse(t)}traverseVisible(t){if(!1===this.visible)return;t(this);const e=this.children;for(let n=0,i=e.length;n<i;n++)e[n].traverseVisible(t)}traverseAncestors(t){const e=this.parent;null!==e&&(t(e),e.traverseAncestors(t))}updateMatrix(){this.matrix.compose(this.position,this.quaternion,this.scale),this.matrixWorldNeedsUpdate=!0}updateMatrixWorld(t){this.matrixAutoUpdate&&this.updateMatrix(),(this.matrixWorldNeedsUpdate||t)&&(null===this.parent?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix),this.matrixWorldNeedsUpdate=!1,t=!0);const e=this.children;for(let n=0,i=e.length;n<i;n++)e[n].updateMatrixWorld(t)}updateWorldMatrix(t,e){const n=this.parent;if(!0===t&&null!==n&&n.updateWorldMatrix(!0,!1),this.matrixAutoUpdate&&this.updateMatrix(),null===this.parent?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix),!0===e){const t=this.children;for(let e=0,n=t.length;e<n;e++)t[e].updateWorldMatrix(!1,!0)}}toJSON(t){const e=void 0===t||"string"==typeof t,n={};e&&(t={geometries:{},materials:{},textures:{},images:{},shapes:{},skeletons:{},animations:{}},n.metadata={version:4.5,type:"Object",generator:"Object3D.toJSON"});const i={};function r(e,n){return void 0===e[n.uuid]&&(e[n.uuid]=n.toJSON(t)),n.uuid}if(i.uuid=this.uuid,i.type=this.type,""!==this.name&&(i.name=this.name),!0===this.castShadow&&(i.castShadow=!0),!0===this.receiveShadow&&(i.receiveShadow=!0),!1===this.visible&&(i.visible=!1),!1===this.frustumCulled&&(i.frustumCulled=!1),0!==this.renderOrder&&(i.renderOrder=this.renderOrder),"{}"!==JSON.stringify(this.userData)&&(i.userData=this.userData),i.layers=this.layers.mask,i.matrix=this.matrix.toArray(),!1===this.matrixAutoUpdate&&(i.matrixAutoUpdate=!1),this.isInstancedMesh&&(i.type="InstancedMesh",i.count=this.count,i.instanceMatrix=this.instanceMatrix.toJSON(),null!==this.instanceColor&&(i.instanceColor=this.instanceColor.toJSON())),this.isScene)this.background&&(this.background.isColor?i.background=this.background.toJSON():this.background.isTexture&&(i.background=this.background.toJSON(t).uuid)),this.environment&&this.environment.isTexture&&(i.environment=this.environment.toJSON(t).uuid);else if(this.isMesh||this.isLine||this.isPoints){i.geometry=r(t.geometries,this.geometry);const e=this.geometry.parameters;if(void 0!==e&&void 0!==e.shapes){const n=e.shapes;if(Array.isArray(n))for(let e=0,i=n.length;e<i;e++){const i=n[e];r(t.shapes,i)}else r(t.shapes,n)}}if(this.isSkinnedMesh&&(i.bindMode=this.bindMode,i.bindMatrix=this.bindMatrix.toArray(),void 0!==this.skeleton&&(r(t.skeletons,this.skeleton),i.skeleton=this.skeleton.uuid)),void 0!==this.material)if(Array.isArray(this.material)){const e=[];for(let n=0,i=this.material.length;n<i;n++)e.push(r(t.materials,this.material[n]));i.material=e}else i.material=r(t.materials,this.material);if(this.children.length>0){i.children=[];for(let e=0;e<this.children.length;e++)i.children.push(this.children[e].toJSON(t).object)}if(this.animations.length>0){i.animations=[];for(let e=0;e<this.animations.length;e++){const n=this.animations[e];i.animations.push(r(t.animations,n))}}if(e){const e=s(t.geometries),i=s(t.materials),r=s(t.textures),a=s(t.images),o=s(t.shapes),l=s(t.skeletons),h=s(t.animations);e.length>0&&(n.geometries=e),i.length>0&&(n.materials=i),r.length>0&&(n.textures=r),a.length>0&&(n.images=a),o.length>0&&(n.shapes=o),l.length>0&&(n.skeletons=l),h.length>0&&(n.animations=h)}return n.object=i,n;function s(t){const e=[];for(const n in t){const i=t[n];delete i.metadata,e.push(i)}return e}}clone(t){return(new this.constructor).copy(this,t)}copy(t,e=!0){if(this.name=t.name,this.up.copy(t.up),this.position.copy(t.position),this.rotation.order=t.rotation.order,this.quaternion.copy(t.quaternion),this.scale.copy(t.scale),this.matrix.copy(t.matrix),this.matrixWorld.copy(t.matrixWorld),this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrixWorldNeedsUpdate=t.matrixWorldNeedsUpdate,this.layers.mask=t.layers.mask,this.visible=t.visible,this.castShadow=t.castShadow,this.receiveShadow=t.receiveShadow,this.frustumCulled=t.frustumCulled,this.renderOrder=t.renderOrder,this.userData=JSON.parse(JSON.stringify(t.userData)),!0===e)for(let e=0;e<t.children.length;e++){const n=t.children[e];this.add(n.clone())}return this}}ft.DefaultUp=new U(0,1,0),ft.DefaultMatrixAutoUpdate=!0,ft.prototype.isObject3D=!0;class mt extends ft{constructor(){super(),this.type="Camera",this.matrixWorldInverse=new H,this.projectionMatrix=new H,this.projectionMatrixInverse=new H}copy(t,e){return super.copy(t,e),this.matrixWorldInverse.copy(t.matrixWorldInverse),this.projectionMatrix.copy(t.projectionMatrix),this.projectionMatrixInverse.copy(t.projectionMatrixInverse),this}getWorldDirection(t){this.updateWorldMatrix(!0,!1);const e=this.matrixWorld.elements;return t.set(-e[8],-e[9],-e[10]).normalize()}updateMatrixWorld(t){super.updateMatrixWorld(t),this.matrixWorldInverse.copy(this.matrixWorld).invert()}updateWorldMatrix(t,e){super.updateWorldMatrix(t,e),this.matrixWorldInverse.copy(this.matrixWorld).invert()}clone(){return(new this.constructor).copy(this)}}mt.prototype.isCamera=!0;class gt extends mt{constructor(t=-1,e=1,n=1,i=-1,r=.1,s=2e3){super(),this.type="OrthographicCamera",this.zoom=1,this.view=null,this.left=t,this.right=e,this.top=n,this.bottom=i,this.near=r,this.far=s,this.updateProjectionMatrix()}copy(t,e){return super.copy(t,e),this.left=t.left,this.right=t.right,this.top=t.top,this.bottom=t.bottom,this.near=t.near,this.far=t.far,this.zoom=t.zoom,this.view=null===t.view?null:Object.assign({},t.view),this}setViewOffset(t,e,n,i,r,s){null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=t,this.view.fullHeight=e,this.view.offsetX=n,this.view.offsetY=i,this.view.width=r,this.view.height=s,this.updateProjectionMatrix()}clearViewOffset(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const t=(this.right-this.left)/(2*this.zoom),e=(this.top-this.bottom)/(2*this.zoom),n=(this.right+this.left)/2,i=(this.top+this.bottom)/2;let r=n-t,s=n+t,a=i+e,o=i-e;if(null!==this.view&&this.view.enabled){const t=(this.right-this.left)/this.view.fullWidth/this.zoom,e=(this.top-this.bottom)/this.view.fullHeight/this.zoom;r+=t*this.view.offsetX,s=r+t*this.view.width,a-=e*this.view.offsetY,o=a-e*this.view.height}this.projectionMatrix.makeOrthographic(r,s,a,o,this.near,this.far),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(t){const e=super.toJSON(t);return e.object.zoom=this.zoom,e.object.left=this.left,e.object.right=this.right,e.object.top=this.top,e.object.bottom=this.bottom,e.object.near=this.near,e.object.far=this.far,null!==this.view&&(e.object.view=Object.assign({},this.view)),e}}gt.prototype.isOrthographicCamera=!0;var vt=i(824);C.registerPlugin("camera",{defaults:{near:.01,far:1e4,type:"perspective",fov:60,aspect:null,left:-1,right:1,bottom:-1,top:1,klass:null,parameters:null},listen:["resize","this.change"],install:function(t){t.Camera=this.api(),t.camera=null,this.aspect=1,this.change({},t)},uninstall:function(t){delete t.Camera,delete t.camera},change:function(t,e){const n=this.options,i=e.camera;if(!e.camera||t.changes.type||t.changes.klass){const t=n.klass||{perspective:vt.PerspectiveCamera,orthographic:gt}[n.type]||mt;e.camera=n.parameters?new t(n.parameters):new t}Object.entries(n).forEach(function([t]){Object.prototype.hasOwnProperty.call(e.camera,t)&&(e.camera[t]=n[t])}.bind(this)),this.update(e),i===e.camera||e.trigger({type:"camera",camera:e.camera})},resize:function(t,e){this.aspect=t.viewWidth/Math.max(1,t.viewHeight),this.update(e)},update:function(t){t.camera.aspect=this.options.aspect||this.aspect,t.camera.updateProjectionMatrix()}}),C.registerPlugin("fallback",{defaults:{force:!1,fill:!0,begin:'<div class="threestrap-fallback" style="display: table; width: 100%; height: 100%;box-sizing: border-box; border: 1px dashed rgba(0, 0, 0, .25);"><div style="display: table-cell; padding: 10px; vertical-align: middle; text-align: center;">',end:"</div></div>",message:'<big><strong>This example requires WebGL</strong></big><br>Visit <a target="_blank" href="http://get.webgl.org/">get.webgl.org</a> for more info</a>'},install:function(t){let e,n;try{if(e=document.createElement("canvas"),n=e.getContext("webgl")||e.getContext("experimental-webgl"),!n||this.options.force)throw"WebGL unavailable.";t.fallback=!1}catch(e){const n=this.options.message,i=this.options.begin,r=this.options.end,s=this.options.fill,a=document.createElement("div");for(a.innerHTML=i+n+r,this.children=[];a.childNodes.length>0;)this.children.push(a.firstChild),t.element.appendChild(a.firstChild);return s&&t.install("fill"),this.div=a,t.fallback=!0,!1}},uninstall:function(t){this.children&&(this.children.forEach((function(t){t.parentNode.removeChild(t)})),this.children=null),delete t.fallback}}),C.registerPlugin("fill",{defaults:{block:!0,body:!0,layout:!0},install:function(t){if(this.options.body&&t.element==document.body&&(this.applied=[t.element,document.documentElement].filter((function(t){const e=t.style.height;return"auto"==e||""==e})).map((function(t){return t.style.height="100%",t.style.margin=0,t.style.padding=0,t}))),this.options.block&&t.canvas&&(t.canvas.style.display="block",this.block=!0),this.options.layout&&t.element){"static"==window.getComputedStyle(t.element).position&&(t.element.style.position="relative",this.layout=!0)}},uninstall:function(t){if(this.applied){const t=function(t){return t.style.height="",t.style.margin="",t.style.padding="",t};this.applied.map(t),delete this.applied}this.block&&t.canvas&&(t.canvas.style.display="",delete this.block),this.layout&&t.element&&(t.element.style.position="",delete this.layout)},change:function(t){this.uninstall(t),this.install(t)}}),C.registerPlugin("loop",{defaults:{start:!0,each:1},listen:["ready"],install:function(t){this.running=!1,this.lastRequestId=null,t.Loop=this.api({start:this.start.bind(this),stop:this.stop.bind(this),running:!1,window},t),this.events=["pre","update","render","post"].map((function(t){return{type:t}}))},uninstall:function(t){this.stop(t)},ready:function(t,e){this.options.start&&this.start(e)},start:function(t){if(this.running)return;t.Loop.running=this.running=!0;const e=t.trigger.bind(t),n=function(){this.running&&(this.lastRequestId=t.Loop.window.requestAnimationFrame(n),this.events.map(e))}.bind(this);this.lastRequestId=t.Loop.window.requestAnimationFrame(n),t.trigger({type:"start"})},stop:function(t){this.running&&(t.Loop.running=this.running=!1,t.Loop.window.cancelAnimationFrame(this.lastRequestId),this.lastRequestId=null,t.trigger({type:"stop"}))}}),C.registerPlugin("render",{listen:["render"],render:function(t,e){e.scene&&e.camera&&e.renderer.render(e.scene,e.camera)}});const xt=100,_t=301,yt=302,bt=306,wt=1e3,St=1001,Mt=1002,Tt=1003,Et=1006,At=1008,Ct=1009,Rt=1012,Dt=1014,kt=1015,Pt=1016,Lt=1020,zt=1023,Ot=1026,It=1027,Nt=33776,Ft=33777,Ut=33778,Bt=33779,Vt=3e3,Ht=3001,Gt=7680,jt="300 es",qt=1035;class Wt{constructor(t=new U(1/0,1/0,1/0),e=new U(-1/0,-1/0,-1/0)){this.min=t,this.max=e}set(t,e){return this.min.copy(t),this.max.copy(e),this}setFromArray(t){let e=1/0,n=1/0,i=1/0,r=-1/0,s=-1/0,a=-1/0;for(let o=0,l=t.length;o<l;o+=3){const l=t[o],h=t[o+1],c=t[o+2];l<e&&(e=l),h<n&&(n=h),c<i&&(i=c),l>r&&(r=l),h>s&&(s=h),c>a&&(a=c)}return this.min.set(e,n,i),this.max.set(r,s,a),this}setFromBufferAttribute(t){let e=1/0,n=1/0,i=1/0,r=-1/0,s=-1/0,a=-1/0;for(let o=0,l=t.count;o<l;o++){const l=t.getX(o),h=t.getY(o),c=t.getZ(o);l<e&&(e=l),h<n&&(n=h),c<i&&(i=c),l>r&&(r=l),h>s&&(s=h),c>a&&(a=c)}return this.min.set(e,n,i),this.max.set(r,s,a),this}setFromPoints(t){this.makeEmpty();for(let e=0,n=t.length;e<n;e++)this.expandByPoint(t[e]);return this}setFromCenterAndSize(t,e){const n=Yt.copy(e).multiplyScalar(.5);return this.min.copy(t).sub(n),this.max.copy(t).add(n),this}setFromObject(t,e=!1){return this.makeEmpty(),this.expandByObject(t,e)}clone(){return(new this.constructor).copy(this)}copy(t){return this.min.copy(t.min),this.max.copy(t.max),this}makeEmpty(){return this.min.x=this.min.y=this.min.z=1/0,this.max.x=this.max.y=this.max.z=-1/0,this}isEmpty(){return this.max.x<this.min.x||this.max.y<this.min.y||this.max.z<this.min.z}getCenter(t){return this.isEmpty()?t.set(0,0,0):t.addVectors(this.min,this.max).multiplyScalar(.5)}getSize(t){return this.isEmpty()?t.set(0,0,0):t.subVectors(this.max,this.min)}expandByPoint(t){return this.min.min(t),this.max.max(t),this}expandByVector(t){return this.min.sub(t),this.max.add(t),this}expandByScalar(t){return this.min.addScalar(-t),this.max.addScalar(t),this}expandByObject(t,e=!1){t.updateWorldMatrix(!1,!1);const n=t.geometry;if(void 0!==n)if(e&&null!=n.attributes&&void 0!==n.attributes.position){const e=n.attributes.position;for(let n=0,i=e.count;n<i;n++)Yt.fromBufferAttribute(e,n).applyMatrix4(t.matrixWorld),this.expandByPoint(Yt)}else null===n.boundingBox&&n.computeBoundingBox(),$t.copy(n.boundingBox),$t.applyMatrix4(t.matrixWorld),this.union($t);const i=t.children;for(let t=0,n=i.length;t<n;t++)this.expandByObject(i[t],e);return this}containsPoint(t){return!(t.x<this.min.x||t.x>this.max.x||t.y<this.min.y||t.y>this.max.y||t.z<this.min.z||t.z>this.max.z)}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y&&this.min.z<=t.min.z&&t.max.z<=this.max.z}getParameter(t,e){return e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y),(t.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(t){return!(t.max.x<this.min.x||t.min.x>this.max.x||t.max.y<this.min.y||t.min.y>this.max.y||t.max.z<this.min.z||t.min.z>this.max.z)}intersectsSphere(t){return this.clampPoint(t.center,Yt),Yt.distanceToSquared(t.center)<=t.radius*t.radius}intersectsPlane(t){let e,n;return t.normal.x>0?(e=t.normal.x*this.min.x,n=t.normal.x*this.max.x):(e=t.normal.x*this.max.x,n=t.normal.x*this.min.x),t.normal.y>0?(e+=t.normal.y*this.min.y,n+=t.normal.y*this.max.y):(e+=t.normal.y*this.max.y,n+=t.normal.y*this.min.y),t.normal.z>0?(e+=t.normal.z*this.min.z,n+=t.normal.z*this.max.z):(e+=t.normal.z*this.max.z,n+=t.normal.z*this.min.z),e<=-t.constant&&n>=-t.constant}intersectsTriangle(t){if(this.isEmpty())return!1;this.getCenter(ne),ie.subVectors(this.max,ne),Zt.subVectors(t.a,ne),Kt.subVectors(t.b,ne),Jt.subVectors(t.c,ne),Qt.subVectors(Kt,Zt),te.subVectors(Jt,Kt),ee.subVectors(Zt,Jt);let e=[0,-Qt.z,Qt.y,0,-te.z,te.y,0,-ee.z,ee.y,Qt.z,0,-Qt.x,te.z,0,-te.x,ee.z,0,-ee.x,-Qt.y,Qt.x,0,-te.y,te.x,0,-ee.y,ee.x,0];return!!ae(e,Zt,Kt,Jt,ie)&&(e=[1,0,0,0,1,0,0,0,1],!!ae(e,Zt,Kt,Jt,ie)&&(re.crossVectors(Qt,te),e=[re.x,re.y,re.z],ae(e,Zt,Kt,Jt,ie)))}clampPoint(t,e){return e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return Yt.copy(t).clamp(this.min,this.max).sub(t).length()}getBoundingSphere(t){return this.getCenter(t.center),t.radius=.5*this.getSize(Yt).length(),t}intersect(t){return this.min.max(t.min),this.max.min(t.max),this.isEmpty()&&this.makeEmpty(),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}applyMatrix4(t){return this.isEmpty()||(Xt[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(t),Xt[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(t),Xt[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(t),Xt[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(t),Xt[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(t),Xt[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(t),Xt[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(t),Xt[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(t),this.setFromPoints(Xt)),this}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}}Wt.prototype.isBox3=!0;const Xt=[new U,new U,new U,new U,new U,new U,new U,new U],Yt=new U,$t=new Wt,Zt=new U,Kt=new U,Jt=new U,Qt=new U,te=new U,ee=new U,ne=new U,ie=new U,re=new U,se=new U;function ae(t,e,n,i,r){for(let s=0,a=t.length-3;s<=a;s+=3){se.fromArray(t,s);const a=r.x*Math.abs(se.x)+r.y*Math.abs(se.y)+r.z*Math.abs(se.z),o=e.dot(se),l=n.dot(se),h=i.dot(se);if(Math.max(-Math.max(o,l,h),Math.min(o,l,h))>a)return!1}return!0}const oe=new Wt,le=new U,he=new U,ce=new U;class ue{constructor(t=new U,e=-1){this.center=t,this.radius=e}set(t,e){return this.center.copy(t),this.radius=e,this}setFromPoints(t,e){const n=this.center;void 0!==e?n.copy(e):oe.setFromPoints(t).getCenter(n);let i=0;for(let e=0,r=t.length;e<r;e++)i=Math.max(i,n.distanceToSquared(t[e]));return this.radius=Math.sqrt(i),this}copy(t){return this.center.copy(t.center),this.radius=t.radius,this}isEmpty(){return this.radius<0}makeEmpty(){return this.center.set(0,0,0),this.radius=-1,this}containsPoint(t){return t.distanceToSquared(this.center)<=this.radius*this.radius}distanceToPoint(t){return t.distanceTo(this.center)-this.radius}intersectsSphere(t){const e=this.radius+t.radius;return t.center.distanceToSquared(this.center)<=e*e}intersectsBox(t){return t.intersectsSphere(this)}intersectsPlane(t){return Math.abs(t.distanceToPoint(this.center))<=this.radius}clampPoint(t,e){const n=this.center.distanceToSquared(t);return e.copy(t),n>this.radius*this.radius&&(e.sub(this.center).normalize(),e.multiplyScalar(this.radius).add(this.center)),e}getBoundingBox(t){return this.isEmpty()?(t.makeEmpty(),t):(t.set(this.center,this.center),t.expandByScalar(this.radius),t)}applyMatrix4(t){return this.center.applyMatrix4(t),this.radius=this.radius*t.getMaxScaleOnAxis(),this}translate(t){return this.center.add(t),this}expandByPoint(t){ce.subVectors(t,this.center);const e=ce.lengthSq();if(e>this.radius*this.radius){const t=Math.sqrt(e),n=.5*(t-this.radius);this.center.add(ce.multiplyScalar(n/t)),this.radius+=n}return this}union(t){return!0===this.center.equals(t.center)?he.set(0,0,1).multiplyScalar(t.radius):he.subVectors(t.center,this.center).normalize().multiplyScalar(t.radius),this.expandByPoint(le.copy(t.center).add(he)),this.expandByPoint(le.copy(t.center).sub(he)),this}equals(t){return t.center.equals(this.center)&&t.radius===this.radius}clone(){return(new this.constructor).copy(this)}}const de=new U,pe=new U,fe=new tt;class me{constructor(t=new U(1,0,0),e=0){this.normal=t,this.constant=e}set(t,e){return this.normal.copy(t),this.constant=e,this}setComponents(t,e,n,i){return this.normal.set(t,e,n),this.constant=i,this}setFromNormalAndCoplanarPoint(t,e){return this.normal.copy(t),this.constant=-e.dot(this.normal),this}setFromCoplanarPoints(t,e,n){const i=de.subVectors(n,e).cross(pe.subVectors(t,e)).normalize();return this.setFromNormalAndCoplanarPoint(i,t),this}copy(t){return this.normal.copy(t.normal),this.constant=t.constant,this}normalize(){const t=1/this.normal.length();return this.normal.multiplyScalar(t),this.constant*=t,this}negate(){return this.constant*=-1,this.normal.negate(),this}distanceToPoint(t){return this.normal.dot(t)+this.constant}distanceToSphere(t){return this.distanceToPoint(t.center)-t.radius}projectPoint(t,e){return e.copy(this.normal).multiplyScalar(-this.distanceToPoint(t)).add(t)}intersectLine(t,e){const n=t.delta(de),i=this.normal.dot(n);if(0===i)return 0===this.distanceToPoint(t.start)?e.copy(t.start):null;const r=-(t.start.dot(this.normal)+this.constant)/i;return r<0||r>1?null:e.copy(n).multiplyScalar(r).add(t.start)}intersectsLine(t){const e=this.distanceToPoint(t.start),n=this.distanceToPoint(t.end);return e<0&&n>0||n<0&&e>0}intersectsBox(t){return t.intersectsPlane(this)}intersectsSphere(t){return t.intersectsPlane(this)}coplanarPoint(t){return t.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(t,e){const n=e||fe.getNormalMatrix(t),i=this.coplanarPoint(de).applyMatrix4(t),r=this.normal.applyMatrix3(n).normalize();return this.constant=-i.dot(r),this}translate(t){return this.constant-=t.dot(this.normal),this}equals(t){return t.normal.equals(this.normal)&&t.constant===this.constant}clone(){return(new this.constructor).copy(this)}}me.prototype.isPlane=!0;const ge=new ue,ve=new U;class xe{constructor(t=new me,e=new me,n=new me,i=new me,r=new me,s=new me){this.planes=[t,e,n,i,r,s]}set(t,e,n,i,r,s){const a=this.planes;return a[0].copy(t),a[1].copy(e),a[2].copy(n),a[3].copy(i),a[4].copy(r),a[5].copy(s),this}copy(t){const e=this.planes;for(let n=0;n<6;n++)e[n].copy(t.planes[n]);return this}setFromProjectionMatrix(t){const e=this.planes,n=t.elements,i=n[0],r=n[1],s=n[2],a=n[3],o=n[4],l=n[5],h=n[6],c=n[7],u=n[8],d=n[9],p=n[10],f=n[11],m=n[12],g=n[13],v=n[14],x=n[15];return e[0].setComponents(a-i,c-o,f-u,x-m).normalize(),e[1].setComponents(a+i,c+o,f+u,x+m).normalize(),e[2].setComponents(a+r,c+l,f+d,x+g).normalize(),e[3].setComponents(a-r,c-l,f-d,x-g).normalize(),e[4].setComponents(a-s,c-h,f-p,x-v).normalize(),e[5].setComponents(a+s,c+h,f+p,x+v).normalize(),this}intersectsObject(t){const e=t.geometry;return null===e.boundingSphere&&e.computeBoundingSphere(),ge.copy(e.boundingSphere).applyMatrix4(t.matrixWorld),this.intersectsSphere(ge)}intersectsSprite(t){return ge.center.set(0,0,0),ge.radius=.7071067811865476,ge.applyMatrix4(t.matrixWorld),this.intersectsSphere(ge)}intersectsSphere(t){const e=this.planes,n=t.center,i=-t.radius;for(let t=0;t<6;t++){if(e[t].distanceToPoint(n)<i)return!1}return!0}intersectsBox(t){const e=this.planes;for(let n=0;n<6;n++){const i=e[n];if(ve.x=i.normal.x>0?t.max.x:t.min.x,ve.y=i.normal.y>0?t.max.y:t.min.y,ve.z=i.normal.z>0?t.max.z:t.min.z,i.distanceToPoint(ve)<0)return!1}return!0}containsPoint(t){const e=this.planes;for(let n=0;n<6;n++)if(e[n].distanceToPoint(t)<0)return!1;return!0}clone(){return(new this.constructor).copy(this)}}class _e{constructor(t=0,e=0,n=0,i=1){this.x=t,this.y=e,this.z=n,this.w=i}get width(){return this.z}set width(t){this.z=t}get height(){return this.w}set height(t){this.w=t}set(t,e,n,i){return this.x=t,this.y=e,this.z=n,this.w=i,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this.w=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setW(t){return this.w=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;case 3:this.w=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this.w=void 0!==t.w?t.w:1,this}add(t,e){return void 0!==e?(console.warn("THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(t,e)):(this.x+=t.x,this.y+=t.y,this.z+=t.z,this.w+=t.w,this)}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this.w+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this.w=t.w+e.w,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this.w+=t.w*e,this}sub(t,e){return void 0!==e?(console.warn("THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(t,e)):(this.x-=t.x,this.y-=t.y,this.z-=t.z,this.w-=t.w,this)}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this.w-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this.w=t.w-e.w,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this.w*=t.w,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this.w*=t,this}applyMatrix4(t){const e=this.x,n=this.y,i=this.z,r=this.w,s=t.elements;return this.x=s[0]*e+s[4]*n+s[8]*i+s[12]*r,this.y=s[1]*e+s[5]*n+s[9]*i+s[13]*r,this.z=s[2]*e+s[6]*n+s[10]*i+s[14]*r,this.w=s[3]*e+s[7]*n+s[11]*i+s[15]*r,this}divideScalar(t){return this.multiplyScalar(1/t)}setAxisAngleFromQuaternion(t){this.w=2*Math.acos(t.w);const e=Math.sqrt(1-t.w*t.w);return e<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=t.x/e,this.y=t.y/e,this.z=t.z/e),this}setAxisAngleFromRotationMatrix(t){let e,n,i,r;const s=.01,a=.1,o=t.elements,l=o[0],h=o[4],c=o[8],u=o[1],d=o[5],p=o[9],f=o[2],m=o[6],g=o[10];if(Math.abs(h-u)<s&&Math.abs(c-f)<s&&Math.abs(p-m)<s){if(Math.abs(h+u)<a&&Math.abs(c+f)<a&&Math.abs(p+m)<a&&Math.abs(l+d+g-3)<a)return this.set(1,0,0,0),this;e=Math.PI;const t=(l+1)/2,o=(d+1)/2,v=(g+1)/2,x=(h+u)/4,_=(c+f)/4,y=(p+m)/4;return t>o&&t>v?t<s?(n=0,i=.707106781,r=.707106781):(n=Math.sqrt(t),i=x/n,r=_/n):o>v?o<s?(n=.707106781,i=0,r=.707106781):(i=Math.sqrt(o),n=x/i,r=y/i):v<s?(n=.707106781,i=.707106781,r=0):(r=Math.sqrt(v),n=_/r,i=y/r),this.set(n,i,r,e),this}let v=Math.sqrt((m-p)*(m-p)+(c-f)*(c-f)+(u-h)*(u-h));return Math.abs(v)<.001&&(v=1),this.x=(m-p)/v,this.y=(c-f)/v,this.z=(u-h)/v,this.w=Math.acos((l+d+g-1)/2),this}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this.w=Math.min(this.w,t.w),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this.w=Math.max(this.w,t.w),this}clamp(t,e){return this.x=Math.max(t.x,Math.min(e.x,this.x)),this.y=Math.max(t.y,Math.min(e.y,this.y)),this.z=Math.max(t.z,Math.min(e.z,this.z)),this.w=Math.max(t.w,Math.min(e.w,this.w)),this}clampScalar(t,e){return this.x=Math.max(t,Math.min(e,this.x)),this.y=Math.max(t,Math.min(e,this.y)),this.z=Math.max(t,Math.min(e,this.z)),this.w=Math.max(t,Math.min(e,this.w)),this}clampLength(t,e){const n=this.length();return this.divideScalar(n||1).multiplyScalar(Math.max(t,Math.min(e,n)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this.w=Math.floor(this.w),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this.w=Math.ceil(this.w),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this.w=Math.round(this.w),this}roundToZero(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this.z=this.z<0?Math.ceil(this.z):Math.floor(this.z),this.w=this.w<0?Math.ceil(this.w):Math.floor(this.w),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this.w=-this.w,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z+this.w*t.w}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)}normalize(){return this.divideScalar(this.length()||1)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this.w+=(t.w-this.w)*e,this}lerpVectors(t,e,n){return this.x=t.x+(e.x-t.x)*n,this.y=t.y+(e.y-t.y)*n,this.z=t.z+(e.z-t.z)*n,this.w=t.w+(e.w-t.w)*n,this}equals(t){return t.x===this.x&&t.y===this.y&&t.z===this.z&&t.w===this.w}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this.z=t[e+2],this.w=t[e+3],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t[e+3]=this.w,t}fromBufferAttribute(t,e,n){return void 0!==n&&console.warn("THREE.Vector4: offset has been removed from .fromBufferAttribute()."),this.x=t.getX(e),this.y=t.getY(e),this.z=t.getZ(e),this.w=t.getW(e),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this.w=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z,yield this.w}}function ye(){let t=null,e=!1,n=null,i=null;function r(e,s){n(e,s),i=t.requestAnimationFrame(r)}return{start:function(){!0!==e&&null!==n&&(i=t.requestAnimationFrame(r),e=!0)},stop:function(){t.cancelAnimationFrame(i),e=!1},setAnimationLoop:function(t){n=t},setContext:function(e){t=e}}}function be(t,e){const n=e.isWebGL2,i=new WeakMap;return{get:function(t){return t.isInterleavedBufferAttribute&&(t=t.data),i.get(t)},remove:function(e){e.isInterleavedBufferAttribute&&(e=e.data);const n=i.get(e);n&&(t.deleteBuffer(n.buffer),i.delete(e))},update:function(e,r){if(e.isGLBufferAttribute){const t=i.get(e);return void((!t||t.version<e.version)&&i.set(e,{buffer:e.buffer,type:e.type,bytesPerElement:e.elementSize,version:e.version}))}e.isInterleavedBufferAttribute&&(e=e.data);const s=i.get(e);void 0===s?i.set(e,function(e,i){const r=e.array,s=e.usage,a=t.createBuffer();t.bindBuffer(i,a),t.bufferData(i,r,s),e.onUploadCallback();let o=t.FLOAT;return r instanceof Float32Array?o=t.FLOAT:r instanceof Float64Array?console.warn("THREE.WebGLAttributes: Unsupported data buffer format: Float64Array."):r instanceof Uint16Array?e.isFloat16BufferAttribute?n?o=t.HALF_FLOAT:console.warn("THREE.WebGLAttributes: Usage of Float16BufferAttribute requires WebGL2."):o=t.UNSIGNED_SHORT:r instanceof Int16Array?o=t.SHORT:r instanceof Uint32Array?o=t.UNSIGNED_INT:r instanceof Int32Array?o=t.INT:r instanceof Int8Array?o=t.BYTE:(r instanceof Uint8Array||r instanceof Uint8ClampedArray)&&(o=t.UNSIGNED_BYTE),{buffer:a,type:o,bytesPerElement:r.BYTES_PER_ELEMENT,version:e.version}}(e,r)):s.version<e.version&&(!function(e,i,r){const s=i.array,a=i.updateRange;t.bindBuffer(r,e),-1===a.count?t.bufferSubData(r,0,s):(n?t.bufferSubData(r,a.offset*s.BYTES_PER_ELEMENT,s,a.offset,a.count):t.bufferSubData(r,a.offset*s.BYTES_PER_ELEMENT,s.subarray(a.offset,a.offset+a.count)),a.count=-1)}(s.buffer,e,r),s.version=e.version)}}}_e.prototype.isVector4=!0;class we{constructor(t=0,e=0){this.x=t,this.y=e}get width(){return this.x}set width(t){this.x=t}get height(){return this.y}set height(t){this.y=t}set(t,e){return this.x=t,this.y=e,this}setScalar(t){return this.x=t,this.y=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y)}copy(t){return this.x=t.x,this.y=t.y,this}add(t,e){return void 0!==e?(console.warn("THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(t,e)):(this.x+=t.x,this.y+=t.y,this)}addScalar(t){return this.x+=t,this.y+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this}sub(t,e){return void 0!==e?(console.warn("THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(t,e)):(this.x-=t.x,this.y-=t.y,this)}subScalar(t){return this.x-=t,this.y-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this}multiply(t){return this.x*=t.x,this.y*=t.y,this}multiplyScalar(t){return this.x*=t,this.y*=t,this}divide(t){return this.x/=t.x,this.y/=t.y,this}divideScalar(t){return this.multiplyScalar(1/t)}applyMatrix3(t){const e=this.x,n=this.y,i=t.elements;return this.x=i[0]*e+i[3]*n+i[6],this.y=i[1]*e+i[4]*n+i[7],this}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this}clamp(t,e){return this.x=Math.max(t.x,Math.min(e.x,this.x)),this.y=Math.max(t.y,Math.min(e.y,this.y)),this}clampScalar(t,e){return this.x=Math.max(t,Math.min(e,this.x)),this.y=Math.max(t,Math.min(e,this.y)),this}clampLength(t,e){const n=this.length();return this.divideScalar(n||1).multiplyScalar(Math.max(t,Math.min(e,n)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(t){return this.x*t.x+this.y*t.y}cross(t){return this.x*t.y-this.y*t.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,n=this.y-t.y;return e*e+n*n}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this}lerpVectors(t,e,n){return this.x=t.x+(e.x-t.x)*n,this.y=t.y+(e.y-t.y)*n,this}equals(t){return t.x===this.x&&t.y===this.y}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t}fromBufferAttribute(t,e,n){return void 0!==n&&console.warn("THREE.Vector2: offset has been removed from .fromBufferAttribute()."),this.x=t.getX(e),this.y=t.getY(e),this}rotateAround(t,e){const n=Math.cos(e),i=Math.sin(e),r=this.x-t.x,s=this.y-t.y;return this.x=r*n-s*i+t.x,this.y=r*i+s*n+t.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y}}we.prototype.isVector2=!0;const Se={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},Me={h:0,s:0,l:0},Te={h:0,s:0,l:0};function Ee(t,e,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?t+6*(e-t)*n:n<.5?e:n<2/3?t+6*(e-t)*(2/3-n):t}function Ae(t){return t<.04045?.0773993808*t:Math.pow(.9478672986*t+.0521327014,2.4)}function Ce(t){return t<.0031308?12.92*t:1.055*Math.pow(t,.41666)-.055}class Re{constructor(t,e,n){return void 0===e&&void 0===n?this.set(t):this.setRGB(t,e,n)}set(t){return t&&t.isColor?this.copy(t):"number"==typeof t?this.setHex(t):"string"==typeof t&&this.setStyle(t),this}setScalar(t){return this.r=t,this.g=t,this.b=t,this}setHex(t){return t=Math.floor(t),this.r=(t>>16&255)/255,this.g=(t>>8&255)/255,this.b=(255&t)/255,this}setRGB(t,e,n){return this.r=t,this.g=e,this.b=n,this}setHSL(t,e,n){if(t=z(t,1),e=L(e,0,1),n=L(n,0,1),0===e)this.r=this.g=this.b=n;else{const i=n<=.5?n*(1+e):n+e-n*e,r=2*n-i;this.r=Ee(r,i,t+1/3),this.g=Ee(r,i,t),this.b=Ee(r,i,t-1/3)}return this}setStyle(t){function e(e){void 0!==e&&parseFloat(e)<1&&console.warn("THREE.Color: Alpha component of "+t+" will be ignored.")}let n;if(n=/^((?:rgb|hsl)a?)\(([^\)]*)\)/.exec(t)){let t;const i=n[1],r=n[2];switch(i){case"rgb":case"rgba":if(t=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(r))return this.r=Math.min(255,parseInt(t[1],10))/255,this.g=Math.min(255,parseInt(t[2],10))/255,this.b=Math.min(255,parseInt(t[3],10))/255,e(t[4]),this;if(t=/^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(r))return this.r=Math.min(100,parseInt(t[1],10))/100,this.g=Math.min(100,parseInt(t[2],10))/100,this.b=Math.min(100,parseInt(t[3],10))/100,e(t[4]),this;break;case"hsl":case"hsla":if(t=/^\s*(\d*\.?\d+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(r)){const n=parseFloat(t[1])/360,i=parseInt(t[2],10)/100,r=parseInt(t[3],10)/100;return e(t[4]),this.setHSL(n,i,r)}}}else if(n=/^\#([A-Fa-f\d]+)$/.exec(t)){const t=n[1],e=t.length;if(3===e)return this.r=parseInt(t.charAt(0)+t.charAt(0),16)/255,this.g=parseInt(t.charAt(1)+t.charAt(1),16)/255,this.b=parseInt(t.charAt(2)+t.charAt(2),16)/255,this;if(6===e)return this.r=parseInt(t.charAt(0)+t.charAt(1),16)/255,this.g=parseInt(t.charAt(2)+t.charAt(3),16)/255,this.b=parseInt(t.charAt(4)+t.charAt(5),16)/255,this}return t&&t.length>0?this.setColorName(t):this}setColorName(t){const e=Se[t.toLowerCase()];return void 0!==e?this.setHex(e):console.warn("THREE.Color: Unknown color "+t),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(t){return this.r=t.r,this.g=t.g,this.b=t.b,this}copySRGBToLinear(t){return this.r=Ae(t.r),this.g=Ae(t.g),this.b=Ae(t.b),this}copyLinearToSRGB(t){return this.r=Ce(t.r),this.g=Ce(t.g),this.b=Ce(t.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(){return 255*this.r<<16^255*this.g<<8^255*this.b<<0}getHexString(){return("000000"+this.getHex().toString(16)).slice(-6)}getHSL(t){const e=this.r,n=this.g,i=this.b,r=Math.max(e,n,i),s=Math.min(e,n,i);let a,o;const l=(s+r)/2;if(s===r)a=0,o=0;else{const t=r-s;switch(o=l<=.5?t/(r+s):t/(2-r-s),r){case e:a=(n-i)/t+(n<i?6:0);break;case n:a=(i-e)/t+2;break;case i:a=(e-n)/t+4}a/=6}return t.h=a,t.s=o,t.l=l,t}getStyle(){return"rgb("+(255*this.r|0)+","+(255*this.g|0)+","+(255*this.b|0)+")"}offsetHSL(t,e,n){return this.getHSL(Me),Me.h+=t,Me.s+=e,Me.l+=n,this.setHSL(Me.h,Me.s,Me.l),this}add(t){return this.r+=t.r,this.g+=t.g,this.b+=t.b,this}addColors(t,e){return this.r=t.r+e.r,this.g=t.g+e.g,this.b=t.b+e.b,this}addScalar(t){return this.r+=t,this.g+=t,this.b+=t,this}sub(t){return this.r=Math.max(0,this.r-t.r),this.g=Math.max(0,this.g-t.g),this.b=Math.max(0,this.b-t.b),this}multiply(t){return this.r*=t.r,this.g*=t.g,this.b*=t.b,this}multiplyScalar(t){return this.r*=t,this.g*=t,this.b*=t,this}lerp(t,e){return this.r+=(t.r-this.r)*e,this.g+=(t.g-this.g)*e,this.b+=(t.b-this.b)*e,this}lerpColors(t,e,n){return this.r=t.r+(e.r-t.r)*n,this.g=t.g+(e.g-t.g)*n,this.b=t.b+(e.b-t.b)*n,this}lerpHSL(t,e){this.getHSL(Me),t.getHSL(Te);const n=O(Me.h,Te.h,e),i=O(Me.s,Te.s,e),r=O(Me.l,Te.l,e);return this.setHSL(n,i,r),this}equals(t){return t.r===this.r&&t.g===this.g&&t.b===this.b}fromArray(t,e=0){return this.r=t[e],this.g=t[e+1],this.b=t[e+2],this}toArray(t=[],e=0){return t[e]=this.r,t[e+1]=this.g,t[e+2]=this.b,t}fromBufferAttribute(t,e){return this.r=t.getX(e),this.g=t.getY(e),this.b=t.getZ(e),!0===t.normalized&&(this.r/=255,this.g/=255,this.b/=255),this}toJSON(){return this.getHex()}}Re.NAMES=Se,Re.prototype.isColor=!0,Re.prototype.r=1,Re.prototype.g=1,Re.prototype.b=1;const De=new U,ke=new we;class Pe{constructor(t,e,n){if(Array.isArray(t))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.name="",this.array=t,this.itemSize=e,this.count=void 0!==t?t.length/e:0,this.normalized=!0===n,this.usage=35044,this.updateRange={offset:0,count:-1},this.version=0}onUploadCallback(){}set needsUpdate(t){!0===t&&this.version++}setUsage(t){return this.usage=t,this}copy(t){return this.name=t.name,this.array=new t.array.constructor(t.array),this.itemSize=t.itemSize,this.count=t.count,this.normalized=t.normalized,this.usage=t.usage,this}copyAt(t,e,n){t*=this.itemSize,n*=e.itemSize;for(let i=0,r=this.itemSize;i<r;i++)this.array[t+i]=e.array[n+i];return this}copyArray(t){return this.array.set(t),this}copyColorsArray(t){const e=this.array;let n=0;for(let i=0,r=t.length;i<r;i++){let r=t[i];void 0===r&&(console.warn("THREE.BufferAttribute.copyColorsArray(): color is undefined",i),r=new Re),e[n++]=r.r,e[n++]=r.g,e[n++]=r.b}return this}copyVector2sArray(t){const e=this.array;let n=0;for(let i=0,r=t.length;i<r;i++){let r=t[i];void 0===r&&(console.warn("THREE.BufferAttribute.copyVector2sArray(): vector is undefined",i),r=new we),e[n++]=r.x,e[n++]=r.y}return this}copyVector3sArray(t){const e=this.array;let n=0;for(let i=0,r=t.length;i<r;i++){let r=t[i];void 0===r&&(console.warn("THREE.BufferAttribute.copyVector3sArray(): vector is undefined",i),r=new U),e[n++]=r.x,e[n++]=r.y,e[n++]=r.z}return this}copyVector4sArray(t){const e=this.array;let n=0;for(let i=0,r=t.length;i<r;i++){let r=t[i];void 0===r&&(console.warn("THREE.BufferAttribute.copyVector4sArray(): vector is undefined",i),r=new _e),e[n++]=r.x,e[n++]=r.y,e[n++]=r.z,e[n++]=r.w}return this}applyMatrix3(t){if(2===this.itemSize)for(let e=0,n=this.count;e<n;e++)ke.fromBufferAttribute(this,e),ke.applyMatrix3(t),this.setXY(e,ke.x,ke.y);else if(3===this.itemSize)for(let e=0,n=this.count;e<n;e++)De.fromBufferAttribute(this,e),De.applyMatrix3(t),this.setXYZ(e,De.x,De.y,De.z);return this}applyMatrix4(t){for(let e=0,n=this.count;e<n;e++)De.x=this.getX(e),De.y=this.getY(e),De.z=this.getZ(e),De.applyMatrix4(t),this.setXYZ(e,De.x,De.y,De.z);return this}applyNormalMatrix(t){for(let e=0,n=this.count;e<n;e++)De.x=this.getX(e),De.y=this.getY(e),De.z=this.getZ(e),De.applyNormalMatrix(t),this.setXYZ(e,De.x,De.y,De.z);return this}transformDirection(t){for(let e=0,n=this.count;e<n;e++)De.x=this.getX(e),De.y=this.getY(e),De.z=this.getZ(e),De.transformDirection(t),this.setXYZ(e,De.x,De.y,De.z);return this}set(t,e=0){return this.array.set(t,e),this}getX(t){return this.array[t*this.itemSize]}setX(t,e){return this.array[t*this.itemSize]=e,this}getY(t){return this.array[t*this.itemSize+1]}setY(t,e){return this.array[t*this.itemSize+1]=e,this}getZ(t){return this.array[t*this.itemSize+2]}setZ(t,e){return this.array[t*this.itemSize+2]=e,this}getW(t){return this.array[t*this.itemSize+3]}setW(t,e){return this.array[t*this.itemSize+3]=e,this}setXY(t,e,n){return t*=this.itemSize,this.array[t+0]=e,this.array[t+1]=n,this}setXYZ(t,e,n,i){return t*=this.itemSize,this.array[t+0]=e,this.array[t+1]=n,this.array[t+2]=i,this}setXYZW(t,e,n,i,r){return t*=this.itemSize,this.array[t+0]=e,this.array[t+1]=n,this.array[t+2]=i,this.array[t+3]=r,this}onUpload(t){return this.onUploadCallback=t,this}clone(){return new this.constructor(this.array,this.itemSize).copy(this)}toJSON(){const t={itemSize:this.itemSize,type:this.array.constructor.name,array:Array.prototype.slice.call(this.array),normalized:this.normalized};return""!==this.name&&(t.name=this.name),35044!==this.usage&&(t.usage=this.usage),0===this.updateRange.offset&&-1===this.updateRange.count||(t.updateRange=this.updateRange),t}}Pe.prototype.isBufferAttribute=!0;class Le extends Pe{constructor(t,e,n){super(new Uint16Array(t),e,n)}}class ze extends Pe{constructor(t,e,n){super(new Uint32Array(t),e,n)}}(class extends Pe{constructor(t,e,n){super(new Uint16Array(t),e,n)}}).prototype.isFloat16BufferAttribute=!0;class Oe extends Pe{constructor(t,e,n){super(new Float32Array(t),e,n)}}function Ie(t){for(let e=t.length-1;e>=0;--e)if(t[e]>65535)return!0;return!1}Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array;function Ne(t){return document.createElementNS("http://www.w3.org/1999/xhtml",t)}let Fe=0;const Ue=new H,Be=new ft,Ve=new U,He=new Wt,Ge=new Wt,je=new U;class qe extends T{constructor(){super(),Object.defineProperty(this,"id",{value:Fe++}),this.uuid=P(),this.name="",this.type="BufferGeometry",this.index=null,this.attributes={},this.morphAttributes={},this.morphTargetsRelative=!1,this.groups=[],this.boundingBox=null,this.boundingSphere=null,this.drawRange={start:0,count:1/0},this.userData={}}getIndex(){return this.index}setIndex(t){return Array.isArray(t)?this.index=new(Ie(t)?ze:Le)(t,1):this.index=t,this}getAttribute(t){return this.attributes[t]}setAttribute(t,e){return this.attributes[t]=e,this}deleteAttribute(t){return delete this.attributes[t],this}hasAttribute(t){return void 0!==this.attributes[t]}addGroup(t,e,n=0){this.groups.push({start:t,count:e,materialIndex:n})}clearGroups(){this.groups=[]}setDrawRange(t,e){this.drawRange.start=t,this.drawRange.count=e}applyMatrix4(t){const e=this.attributes.position;void 0!==e&&(e.applyMatrix4(t),e.needsUpdate=!0);const n=this.attributes.normal;if(void 0!==n){const e=(new tt).getNormalMatrix(t);n.applyNormalMatrix(e),n.needsUpdate=!0}const i=this.attributes.tangent;return void 0!==i&&(i.transformDirection(t),i.needsUpdate=!0),null!==this.boundingBox&&this.computeBoundingBox(),null!==this.boundingSphere&&this.computeBoundingSphere(),this}applyQuaternion(t){return Ue.makeRotationFromQuaternion(t),this.applyMatrix4(Ue),this}rotateX(t){return Ue.makeRotationX(t),this.applyMatrix4(Ue),this}rotateY(t){return Ue.makeRotationY(t),this.applyMatrix4(Ue),this}rotateZ(t){return Ue.makeRotationZ(t),this.applyMatrix4(Ue),this}translate(t,e,n){return Ue.makeTranslation(t,e,n),this.applyMatrix4(Ue),this}scale(t,e,n){return Ue.makeScale(t,e,n),this.applyMatrix4(Ue),this}lookAt(t){return Be.lookAt(t),Be.updateMatrix(),this.applyMatrix4(Be.matrix),this}center(){return this.computeBoundingBox(),this.boundingBox.getCenter(Ve).negate(),this.translate(Ve.x,Ve.y,Ve.z),this}setFromPoints(t){const e=[];for(let n=0,i=t.length;n<i;n++){const i=t[n];e.push(i.x,i.y,i.z||0)}return this.setAttribute("position",new Oe(e,3)),this}computeBoundingBox(){null===this.boundingBox&&(this.boundingBox=new Wt);const t=this.attributes.position,e=this.morphAttributes.position;if(t&&t.isGLBufferAttribute)return console.error('THREE.BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box. Alternatively set "mesh.frustumCulled" to "false".',this),void this.boundingBox.set(new U(-1/0,-1/0,-1/0),new U(1/0,1/0,1/0));if(void 0!==t){if(this.boundingBox.setFromBufferAttribute(t),e)for(let t=0,n=e.length;t<n;t++){const n=e[t];He.setFromBufferAttribute(n),this.morphTargetsRelative?(je.addVectors(this.boundingBox.min,He.min),this.boundingBox.expandByPoint(je),je.addVectors(this.boundingBox.max,He.max),this.boundingBox.expandByPoint(je)):(this.boundingBox.expandByPoint(He.min),this.boundingBox.expandByPoint(He.max))}}else this.boundingBox.makeEmpty();(isNaN(this.boundingBox.min.x)||isNaN(this.boundingBox.min.y)||isNaN(this.boundingBox.min.z))&&console.error('THREE.BufferGeometry.computeBoundingBox(): Computed min/max have NaN values. The "position" attribute is likely to have NaN values.',this)}computeBoundingSphere(){null===this.boundingSphere&&(this.boundingSphere=new ue);const t=this.attributes.position,e=this.morphAttributes.position;if(t&&t.isGLBufferAttribute)return console.error('THREE.BufferGeometry.computeBoundingSphere(): GLBufferAttribute requires a manual bounding sphere. Alternatively set "mesh.frustumCulled" to "false".',this),void this.boundingSphere.set(new U,1/0);if(t){const n=this.boundingSphere.center;if(He.setFromBufferAttribute(t),e)for(let t=0,n=e.length;t<n;t++){const n=e[t];Ge.setFromBufferAttribute(n),this.morphTargetsRelative?(je.addVectors(He.min,Ge.min),He.expandByPoint(je),je.addVectors(He.max,Ge.max),He.expandByPoint(je)):(He.expandByPoint(Ge.min),He.expandByPoint(Ge.max))}He.getCenter(n);let i=0;for(let e=0,r=t.count;e<r;e++)je.fromBufferAttribute(t,e),i=Math.max(i,n.distanceToSquared(je));if(e)for(let r=0,s=e.length;r<s;r++){const s=e[r],a=this.morphTargetsRelative;for(let e=0,r=s.count;e<r;e++)je.fromBufferAttribute(s,e),a&&(Ve.fromBufferAttribute(t,e),je.add(Ve)),i=Math.max(i,n.distanceToSquared(je))}this.boundingSphere.radius=Math.sqrt(i),isNaN(this.boundingSphere.radius)&&console.error('THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.',this)}}computeTangents(){const t=this.index,e=this.attributes;if(null===t||void 0===e.position||void 0===e.normal||void 0===e.uv)return void console.error("THREE.BufferGeometry: .computeTangents() failed. Missing required attributes (index, position, normal or uv)");const n=t.array,i=e.position.array,r=e.normal.array,s=e.uv.array,a=i.length/3;void 0===e.tangent&&this.setAttribute("tangent",new Pe(new Float32Array(4*a),4));const o=e.tangent.array,l=[],h=[];for(let t=0;t<a;t++)l[t]=new U,h[t]=new U;const c=new U,u=new U,d=new U,p=new we,f=new we,m=new we,g=new U,v=new U;function x(t,e,n){c.fromArray(i,3*t),u.fromArray(i,3*e),d.fromArray(i,3*n),p.fromArray(s,2*t),f.fromArray(s,2*e),m.fromArray(s,2*n),u.sub(c),d.sub(c),f.sub(p),m.sub(p);const r=1/(f.x*m.y-m.x*f.y);isFinite(r)&&(g.copy(u).multiplyScalar(m.y).addScaledVector(d,-f.y).multiplyScalar(r),v.copy(d).multiplyScalar(f.x).addScaledVector(u,-m.x).multiplyScalar(r),l[t].add(g),l[e].add(g),l[n].add(g),h[t].add(v),h[e].add(v),h[n].add(v))}let _=this.groups;0===_.length&&(_=[{start:0,count:n.length}]);for(let t=0,e=_.length;t<e;++t){const e=_[t],i=e.start;for(let t=i,r=i+e.count;t<r;t+=3)x(n[t+0],n[t+1],n[t+2])}const y=new U,b=new U,w=new U,S=new U;function M(t){w.fromArray(r,3*t),S.copy(w);const e=l[t];y.copy(e),y.sub(w.multiplyScalar(w.dot(e))).normalize(),b.crossVectors(S,e);const n=b.dot(h[t])<0?-1:1;o[4*t]=y.x,o[4*t+1]=y.y,o[4*t+2]=y.z,o[4*t+3]=n}for(let t=0,e=_.length;t<e;++t){const e=_[t],i=e.start;for(let t=i,r=i+e.count;t<r;t+=3)M(n[t+0]),M(n[t+1]),M(n[t+2])}}computeVertexNormals(){const t=this.index,e=this.getAttribute("position");if(void 0!==e){let n=this.getAttribute("normal");if(void 0===n)n=new Pe(new Float32Array(3*e.count),3),this.setAttribute("normal",n);else for(let t=0,e=n.count;t<e;t++)n.setXYZ(t,0,0,0);const i=new U,r=new U,s=new U,a=new U,o=new U,l=new U,h=new U,c=new U;if(t)for(let u=0,d=t.count;u<d;u+=3){const d=t.getX(u+0),p=t.getX(u+1),f=t.getX(u+2);i.fromBufferAttribute(e,d),r.fromBufferAttribute(e,p),s.fromBufferAttribute(e,f),h.subVectors(s,r),c.subVectors(i,r),h.cross(c),a.fromBufferAttribute(n,d),o.fromBufferAttribute(n,p),l.fromBufferAttribute(n,f),a.add(h),o.add(h),l.add(h),n.setXYZ(d,a.x,a.y,a.z),n.setXYZ(p,o.x,o.y,o.z),n.setXYZ(f,l.x,l.y,l.z)}else for(let t=0,a=e.count;t<a;t+=3)i.fromBufferAttribute(e,t+0),r.fromBufferAttribute(e,t+1),s.fromBufferAttribute(e,t+2),h.subVectors(s,r),c.subVectors(i,r),h.cross(c),n.setXYZ(t+0,h.x,h.y,h.z),n.setXYZ(t+1,h.x,h.y,h.z),n.setXYZ(t+2,h.x,h.y,h.z);this.normalizeNormals(),n.needsUpdate=!0}}merge(t,e){if(!t||!t.isBufferGeometry)return void console.error("THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.",t);void 0===e&&(e=0,console.warn("THREE.BufferGeometry.merge(): Overwriting original geometry, starting at offset=0. Use BufferGeometryUtils.mergeBufferGeometries() for lossless merge."));const n=this.attributes;for(const i in n){if(void 0===t.attributes[i])continue;const r=n[i].array,s=t.attributes[i],a=s.array,o=s.itemSize*e,l=Math.min(a.length,r.length-o);for(let t=0,e=o;t<l;t++,e++)r[e]=a[t]}return this}normalizeNormals(){const t=this.attributes.normal;for(let e=0,n=t.count;e<n;e++)je.fromBufferAttribute(t,e),je.normalize(),t.setXYZ(e,je.x,je.y,je.z)}toNonIndexed(){function t(t,e){const n=t.array,i=t.itemSize,r=t.normalized,s=new n.constructor(e.length*i);let a=0,o=0;for(let r=0,l=e.length;r<l;r++){a=t.isInterleavedBufferAttribute?e[r]*t.data.stride+t.offset:e[r]*i;for(let t=0;t<i;t++)s[o++]=n[a++]}return new Pe(s,i,r)}if(null===this.index)return console.warn("THREE.BufferGeometry.toNonIndexed(): BufferGeometry is already non-indexed."),this;const e=new qe,n=this.index.array,i=this.attributes;for(const r in i){const s=t(i[r],n);e.setAttribute(r,s)}const r=this.morphAttributes;for(const i in r){const s=[],a=r[i];for(let e=0,i=a.length;e<i;e++){const i=t(a[e],n);s.push(i)}e.morphAttributes[i]=s}e.morphTargetsRelative=this.morphTargetsRelative;const s=this.groups;for(let t=0,n=s.length;t<n;t++){const n=s[t];e.addGroup(n.start,n.count,n.materialIndex)}return e}toJSON(){const t={metadata:{version:4.5,type:"BufferGeometry",generator:"BufferGeometry.toJSON"}};if(t.uuid=this.uuid,t.type=this.type,""!==this.name&&(t.name=this.name),Object.keys(this.userData).length>0&&(t.userData=this.userData),void 0!==this.parameters){const e=this.parameters;for(const n in e)void 0!==e[n]&&(t[n]=e[n]);return t}t.data={attributes:{}};const e=this.index;null!==e&&(t.data.index={type:e.array.constructor.name,array:Array.prototype.slice.call(e.array)});const n=this.attributes;for(const e in n){const i=n[e];t.data.attributes[e]=i.toJSON(t.data)}const i={};let r=!1;for(const e in this.morphAttributes){const n=this.morphAttributes[e],s=[];for(let e=0,i=n.length;e<i;e++){const i=n[e];s.push(i.toJSON(t.data))}s.length>0&&(i[e]=s,r=!0)}r&&(t.data.morphAttributes=i,t.data.morphTargetsRelative=this.morphTargetsRelative);const s=this.groups;s.length>0&&(t.data.groups=JSON.parse(JSON.stringify(s)));const a=this.boundingSphere;return null!==a&&(t.data.boundingSphere={center:a.center.toArray(),radius:a.radius}),t}clone(){return(new this.constructor).copy(this)}copy(t){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;const e={};this.name=t.name;const n=t.index;null!==n&&this.setIndex(n.clone(e));const i=t.attributes;for(const t in i){const n=i[t];this.setAttribute(t,n.clone(e))}const r=t.morphAttributes;for(const t in r){const n=[],i=r[t];for(let t=0,r=i.length;t<r;t++)n.push(i[t].clone(e));this.morphAttributes[t]=n}this.morphTargetsRelative=t.morphTargetsRelative;const s=t.groups;for(let t=0,e=s.length;t<e;t++){const e=s[t];this.addGroup(e.start,e.count,e.materialIndex)}const a=t.boundingBox;null!==a&&(this.boundingBox=a.clone());const o=t.boundingSphere;return null!==o&&(this.boundingSphere=o.clone()),this.drawRange.start=t.drawRange.start,this.drawRange.count=t.drawRange.count,this.userData=t.userData,void 0!==t.parameters&&(this.parameters=Object.assign({},t.parameters)),this}dispose(){this.dispatchEvent({type:"dispose"})}}qe.prototype.isBufferGeometry=!0;class We extends qe{constructor(t=1,e=1,n=1,i=1,r=1,s=1){super(),this.type="BoxGeometry",this.parameters={width:t,height:e,depth:n,widthSegments:i,heightSegments:r,depthSegments:s};const a=this;i=Math.floor(i),r=Math.floor(r),s=Math.floor(s);const o=[],l=[],h=[],c=[];let u=0,d=0;function p(t,e,n,i,r,s,p,f,m,g,v){const x=s/m,_=p/g,y=s/2,b=p/2,w=f/2,S=m+1,M=g+1;let T=0,E=0;const A=new U;for(let s=0;s<M;s++){const a=s*_-b;for(let o=0;o<S;o++){const u=o*x-y;A[t]=u*i,A[e]=a*r,A[n]=w,l.push(A.x,A.y,A.z),A[t]=0,A[e]=0,A[n]=f>0?1:-1,h.push(A.x,A.y,A.z),c.push(o/m),c.push(1-s/g),T+=1}}for(let t=0;t<g;t++)for(let e=0;e<m;e++){const n=u+e+S*t,i=u+e+S*(t+1),r=u+(e+1)+S*(t+1),s=u+(e+1)+S*t;o.push(n,i,s),o.push(i,r,s),E+=6}a.addGroup(d,E,v),d+=E,u+=T}p("z","y","x",-1,-1,n,e,t,s,r,0),p("z","y","x",1,-1,n,e,-t,s,r,1),p("x","z","y",1,1,t,n,e,i,s,2),p("x","z","y",1,-1,t,n,-e,i,s,3),p("x","y","z",1,-1,t,e,n,i,r,4),p("x","y","z",-1,-1,t,e,-n,i,r,5),this.setIndex(o),this.setAttribute("position",new Oe(l,3)),this.setAttribute("normal",new Oe(h,3)),this.setAttribute("uv",new Oe(c,2))}static fromJSON(t){return new We(t.width,t.height,t.depth,t.widthSegments,t.heightSegments,t.depthSegments)}}class Xe extends qe{constructor(t=1,e=1,n=1,i=1){super(),this.type="PlaneGeometry",this.parameters={width:t,height:e,widthSegments:n,heightSegments:i};const r=t/2,s=e/2,a=Math.floor(n),o=Math.floor(i),l=a+1,h=o+1,c=t/a,u=e/o,d=[],p=[],f=[],m=[];for(let t=0;t<h;t++){const e=t*u-s;for(let n=0;n<l;n++){const i=n*c-r;p.push(i,-e,0),f.push(0,0,1),m.push(n/a),m.push(1-t/o)}}for(let t=0;t<o;t++)for(let e=0;e<a;e++){const n=e+l*t,i=e+l*(t+1),r=e+1+l*(t+1),s=e+1+l*t;d.push(n,i,s),d.push(i,r,s)}this.setIndex(d),this.setAttribute("position",new Oe(p,3)),this.setAttribute("normal",new Oe(f,3)),this.setAttribute("uv",new Oe(m,2))}static fromJSON(t){return new Xe(t.width,t.height,t.widthSegments,t.heightSegments)}}let Ye=0;class $e extends T{constructor(){super(),Object.defineProperty(this,"id",{value:Ye++}),this.uuid=P(),this.name="",this.type="Material",this.fog=!0,this.blending=1,this.side=0,this.vertexColors=!1,this.opacity=1,this.transparent=!1,this.blendSrc=204,this.blendDst=205,this.blendEquation=xt,this.blendSrcAlpha=null,this.blendDstAlpha=null,this.blendEquationAlpha=null,this.depthFunc=3,this.depthTest=!0,this.depthWrite=!0,this.stencilWriteMask=255,this.stencilFunc=519,this.stencilRef=0,this.stencilFuncMask=255,this.stencilFail=Gt,this.stencilZFail=Gt,this.stencilZPass=Gt,this.stencilWrite=!1,this.clippingPlanes=null,this.clipIntersection=!1,this.clipShadows=!1,this.shadowSide=null,this.colorWrite=!0,this.precision=null,this.polygonOffset=!1,this.polygonOffsetFactor=0,this.polygonOffsetUnits=0,this.dithering=!1,this.alphaToCoverage=!1,this.premultipliedAlpha=!1,this.visible=!0,this.toneMapped=!0,this.userData={},this.version=0,this._alphaTest=0}get alphaTest(){return this._alphaTest}set alphaTest(t){this._alphaTest>0!=t>0&&this.version++,this._alphaTest=t}onBuild(){}onBeforeRender(){}onBeforeCompile(){}customProgramCacheKey(){return this.onBeforeCompile.toString()}setValues(t){if(void 0!==t)for(const e in t){const n=t[e];if(void 0===n){console.warn("THREE.Material: '"+e+"' parameter is undefined.");continue}if("shading"===e){console.warn("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead."),this.flatShading=1===n;continue}const i=this[e];void 0!==i?i&&i.isColor?i.set(n):i&&i.isVector3&&n&&n.isVector3?i.copy(n):this[e]=n:console.warn("THREE."+this.type+": '"+e+"' is not a property of this material.")}}toJSON(t){const e=void 0===t||"string"==typeof t;e&&(t={textures:{},images:{}});const n={metadata:{version:4.5,type:"Material",generator:"Material.toJSON"}};function i(t){const e=[];for(const n in t){const i=t[n];delete i.metadata,e.push(i)}return e}if(n.uuid=this.uuid,n.type=this.type,""!==this.name&&(n.name=this.name),this.color&&this.color.isColor&&(n.color=this.color.getHex()),void 0!==this.roughness&&(n.roughness=this.roughness),void 0!==this.metalness&&(n.metalness=this.metalness),void 0!==this.sheen&&(n.sheen=this.sheen),this.sheenColor&&this.sheenColor.isColor&&(n.sheenColor=this.sheenColor.getHex()),void 0!==this.sheenRoughness&&(n.sheenRoughness=this.sheenRoughness),this.emissive&&this.emissive.isColor&&(n.emissive=this.emissive.getHex()),this.emissiveIntensity&&1!==this.emissiveIntensity&&(n.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(n.specular=this.specular.getHex()),void 0!==this.specularIntensity&&(n.specularIntensity=this.specularIntensity),this.specularColor&&this.specularColor.isColor&&(n.specularColor=this.specularColor.getHex()),void 0!==this.shininess&&(n.shininess=this.shininess),void 0!==this.clearcoat&&(n.clearcoat=this.clearcoat),void 0!==this.clearcoatRoughness&&(n.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(n.clearcoatMap=this.clearcoatMap.toJSON(t).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(n.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(t).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(n.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(t).uuid,n.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),this.map&&this.map.isTexture&&(n.map=this.map.toJSON(t).uuid),this.matcap&&this.matcap.isTexture&&(n.matcap=this.matcap.toJSON(t).uuid),this.alphaMap&&this.alphaMap.isTexture&&(n.alphaMap=this.alphaMap.toJSON(t).uuid),this.lightMap&&this.lightMap.isTexture&&(n.lightMap=this.lightMap.toJSON(t).uuid,n.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(n.aoMap=this.aoMap.toJSON(t).uuid,n.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(n.bumpMap=this.bumpMap.toJSON(t).uuid,n.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(n.normalMap=this.normalMap.toJSON(t).uuid,n.normalMapType=this.normalMapType,n.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(n.displacementMap=this.displacementMap.toJSON(t).uuid,n.displacementScale=this.displacementScale,n.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(n.roughnessMap=this.roughnessMap.toJSON(t).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(n.metalnessMap=this.metalnessMap.toJSON(t).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(n.emissiveMap=this.emissiveMap.toJSON(t).uuid),this.specularMap&&this.specularMap.isTexture&&(n.specularMap=this.specularMap.toJSON(t).uuid),this.specularIntensityMap&&this.specularIntensityMap.isTexture&&(n.specularIntensityMap=this.specularIntensityMap.toJSON(t).uuid),this.specularColorMap&&this.specularColorMap.isTexture&&(n.specularColorMap=this.specularColorMap.toJSON(t).uuid),this.envMap&&this.envMap.isTexture&&(n.envMap=this.envMap.toJSON(t).uuid,void 0!==this.combine&&(n.combine=this.combine)),void 0!==this.envMapIntensity&&(n.envMapIntensity=this.envMapIntensity),void 0!==this.reflectivity&&(n.reflectivity=this.reflectivity),void 0!==this.refractionRatio&&(n.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(n.gradientMap=this.gradientMap.toJSON(t).uuid),void 0!==this.transmission&&(n.transmission=this.transmission),this.transmissionMap&&this.transmissionMap.isTexture&&(n.transmissionMap=this.transmissionMap.toJSON(t).uuid),void 0!==this.thickness&&(n.thickness=this.thickness),this.thicknessMap&&this.thicknessMap.isTexture&&(n.thicknessMap=this.thicknessMap.toJSON(t).uuid),void 0!==this.attenuationDistance&&(n.attenuationDistance=this.attenuationDistance),void 0!==this.attenuationColor&&(n.attenuationColor=this.attenuationColor.getHex()),void 0!==this.size&&(n.size=this.size),null!==this.shadowSide&&(n.shadowSide=this.shadowSide),void 0!==this.sizeAttenuation&&(n.sizeAttenuation=this.sizeAttenuation),1!==this.blending&&(n.blending=this.blending),0!==this.side&&(n.side=this.side),this.vertexColors&&(n.vertexColors=!0),this.opacity<1&&(n.opacity=this.opacity),!0===this.transparent&&(n.transparent=this.transparent),n.depthFunc=this.depthFunc,n.depthTest=this.depthTest,n.depthWrite=this.depthWrite,n.colorWrite=this.colorWrite,n.stencilWrite=this.stencilWrite,n.stencilWriteMask=this.stencilWriteMask,n.stencilFunc=this.stencilFunc,n.stencilRef=this.stencilRef,n.stencilFuncMask=this.stencilFuncMask,n.stencilFail=this.stencilFail,n.stencilZFail=this.stencilZFail,n.stencilZPass=this.stencilZPass,this.rotation&&0!==this.rotation&&(n.rotation=this.rotation),!0===this.polygonOffset&&(n.polygonOffset=!0),0!==this.polygonOffsetFactor&&(n.polygonOffsetFactor=this.polygonOffsetFactor),0!==this.polygonOffsetUnits&&(n.polygonOffsetUnits=this.polygonOffsetUnits),this.linewidth&&1!==this.linewidth&&(n.linewidth=this.linewidth),void 0!==this.dashSize&&(n.dashSize=this.dashSize),void 0!==this.gapSize&&(n.gapSize=this.gapSize),void 0!==this.scale&&(n.scale=this.scale),!0===this.dithering&&(n.dithering=!0),this.alphaTest>0&&(n.alphaTest=this.alphaTest),!0===this.alphaToCoverage&&(n.alphaToCoverage=this.alphaToCoverage),!0===this.premultipliedAlpha&&(n.premultipliedAlpha=this.premultipliedAlpha),!0===this.wireframe&&(n.wireframe=this.wireframe),this.wireframeLinewidth>1&&(n.wireframeLinewidth=this.wireframeLinewidth),"round"!==this.wireframeLinecap&&(n.wireframeLinecap=this.wireframeLinecap),"round"!==this.wireframeLinejoin&&(n.wireframeLinejoin=this.wireframeLinejoin),!0===this.flatShading&&(n.flatShading=this.flatShading),!1===this.visible&&(n.visible=!1),!1===this.toneMapped&&(n.toneMapped=!1),"{}"!==JSON.stringify(this.userData)&&(n.userData=this.userData),e){const e=i(t.textures),r=i(t.images);e.length>0&&(n.textures=e),r.length>0&&(n.images=r)}return n}clone(){return(new this.constructor).copy(this)}copy(t){this.name=t.name,this.fog=t.fog,this.blending=t.blending,this.side=t.side,this.vertexColors=t.vertexColors,this.opacity=t.opacity,this.transparent=t.transparent,this.blendSrc=t.blendSrc,this.blendDst=t.blendDst,this.blendEquation=t.blendEquation,this.blendSrcAlpha=t.blendSrcAlpha,this.blendDstAlpha=t.blendDstAlpha,this.blendEquationAlpha=t.blendEquationAlpha,this.depthFunc=t.depthFunc,this.depthTest=t.depthTest,this.depthWrite=t.depthWrite,this.stencilWriteMask=t.stencilWriteMask,this.stencilFunc=t.stencilFunc,this.stencilRef=t.stencilRef,this.stencilFuncMask=t.stencilFuncMask,this.stencilFail=t.stencilFail,this.stencilZFail=t.stencilZFail,this.stencilZPass=t.stencilZPass,this.stencilWrite=t.stencilWrite;const e=t.clippingPlanes;let n=null;if(null!==e){const t=e.length;n=new Array(t);for(let i=0;i!==t;++i)n[i]=e[i].clone()}return this.clippingPlanes=n,this.clipIntersection=t.clipIntersection,this.clipShadows=t.clipShadows,this.shadowSide=t.shadowSide,this.colorWrite=t.colorWrite,this.precision=t.precision,this.polygonOffset=t.polygonOffset,this.polygonOffsetFactor=t.polygonOffsetFactor,this.polygonOffsetUnits=t.polygonOffsetUnits,this.dithering=t.dithering,this.alphaTest=t.alphaTest,this.alphaToCoverage=t.alphaToCoverage,this.premultipliedAlpha=t.premultipliedAlpha,this.visible=t.visible,this.toneMapped=t.toneMapped,this.userData=JSON.parse(JSON.stringify(t.userData)),this}dispose(){this.dispatchEvent({type:"dispose"})}set needsUpdate(t){!0===t&&this.version++}}function Ze(t){const e={};for(const n in t){e[n]={};for(const i in t[n]){const r=t[n][i];r&&(r.isColor||r.isMatrix3||r.isMatrix4||r.isVector2||r.isVector3||r.isVector4||r.isTexture||r.isQuaternion)?e[n][i]=r.clone():Array.isArray(r)?e[n][i]=r.slice():e[n][i]=r}}return e}function Ke(t){const e={};for(let n=0;n<t.length;n++){const i=Ze(t[n]);for(const t in i)e[t]=i[t]}return e}$e.prototype.isMaterial=!0;const Je={clone:Ze,merge:Ke};class Qe extends $e{constructor(t){super(),this.type="ShaderMaterial",this.defines={},this.uniforms={},this.vertexShader="\nvoid main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}\n",this.fragmentShader="\nvoid main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}\n",this.linewidth=1,this.wireframe=!1,this.wireframeLinewidth=1,this.fog=!1,this.lights=!1,this.clipping=!1,this.extensions={derivatives:!1,fragDepth:!1,drawBuffers:!1,shaderTextureLOD:!1},this.defaultAttributeValues={color:[1,1,1],uv:[0,0],uv2:[0,0]},this.index0AttributeName=void 0,this.uniformsNeedUpdate=!1,this.glslVersion=null,void 0!==t&&(void 0!==t.attributes&&console.error("THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead."),this.setValues(t))}copy(t){return super.copy(t),this.fragmentShader=t.fragmentShader,this.vertexShader=t.vertexShader,this.uniforms=Ze(t.uniforms),this.defines=Object.assign({},t.defines),this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.lights=t.lights,this.clipping=t.clipping,this.extensions=Object.assign({},t.extensions),this.glslVersion=t.glslVersion,this}toJSON(t){const e=super.toJSON(t);e.glslVersion=this.glslVersion,e.uniforms={};for(const n in this.uniforms){const i=this.uniforms[n].value;i&&i.isTexture?e.uniforms[n]={type:"t",value:i.toJSON(t).uuid}:i&&i.isColor?e.uniforms[n]={type:"c",value:i.getHex()}:i&&i.isVector2?e.uniforms[n]={type:"v2",value:i.toArray()}:i&&i.isVector3?e.uniforms[n]={type:"v3",value:i.toArray()}:i&&i.isVector4?e.uniforms[n]={type:"v4",value:i.toArray()}:i&&i.isMatrix3?e.uniforms[n]={type:"m3",value:i.toArray()}:i&&i.isMatrix4?e.uniforms[n]={type:"m4",value:i.toArray()}:e.uniforms[n]={value:i}}Object.keys(this.defines).length>0&&(e.defines=this.defines),e.vertexShader=this.vertexShader,e.fragmentShader=this.fragmentShader;const n={};for(const t in this.extensions)!0===this.extensions[t]&&(n[t]=!0);return Object.keys(n).length>0&&(e.extensions=n),e}}Qe.prototype.isShaderMaterial=!0;const tn=new U,en=new U,nn=new U,rn=new U,sn=new U,an=new U,on=new U;class ln{constructor(t=new U,e=new U(0,0,-1)){this.origin=t,this.direction=e}set(t,e){return this.origin.copy(t),this.direction.copy(e),this}copy(t){return this.origin.copy(t.origin),this.direction.copy(t.direction),this}at(t,e){return e.copy(this.direction).multiplyScalar(t).add(this.origin)}lookAt(t){return this.direction.copy(t).sub(this.origin).normalize(),this}recast(t){return this.origin.copy(this.at(t,tn)),this}closestPointToPoint(t,e){e.subVectors(t,this.origin);const n=e.dot(this.direction);return n<0?e.copy(this.origin):e.copy(this.direction).multiplyScalar(n).add(this.origin)}distanceToPoint(t){return Math.sqrt(this.distanceSqToPoint(t))}distanceSqToPoint(t){const e=tn.subVectors(t,this.origin).dot(this.direction);return e<0?this.origin.distanceToSquared(t):(tn.copy(this.direction).multiplyScalar(e).add(this.origin),tn.distanceToSquared(t))}distanceSqToSegment(t,e,n,i){en.copy(t).add(e).multiplyScalar(.5),nn.copy(e).sub(t).normalize(),rn.copy(this.origin).sub(en);const r=.5*t.distanceTo(e),s=-this.direction.dot(nn),a=rn.dot(this.direction),o=-rn.dot(nn),l=rn.lengthSq(),h=Math.abs(1-s*s);let c,u,d,p;if(h>0)if(c=s*o-a,u=s*a-o,p=r*h,c>=0)if(u>=-p)if(u<=p){const t=1/h;c*=t,u*=t,d=c*(c+s*u+2*a)+u*(s*c+u+2*o)+l}else u=r,c=Math.max(0,-(s*u+a)),d=-c*c+u*(u+2*o)+l;else u=-r,c=Math.max(0,-(s*u+a)),d=-c*c+u*(u+2*o)+l;else u<=-p?(c=Math.max(0,-(-s*r+a)),u=c>0?-r:Math.min(Math.max(-r,-o),r),d=-c*c+u*(u+2*o)+l):u<=p?(c=0,u=Math.min(Math.max(-r,-o),r),d=u*(u+2*o)+l):(c=Math.max(0,-(s*r+a)),u=c>0?r:Math.min(Math.max(-r,-o),r),d=-c*c+u*(u+2*o)+l);else u=s>0?-r:r,c=Math.max(0,-(s*u+a)),d=-c*c+u*(u+2*o)+l;return n&&n.copy(this.direction).multiplyScalar(c).add(this.origin),i&&i.copy(nn).multiplyScalar(u).add(en),d}intersectSphere(t,e){tn.subVectors(t.center,this.origin);const n=tn.dot(this.direction),i=tn.dot(tn)-n*n,r=t.radius*t.radius;if(i>r)return null;const s=Math.sqrt(r-i),a=n-s,o=n+s;return a<0&&o<0?null:a<0?this.at(o,e):this.at(a,e)}intersectsSphere(t){return this.distanceSqToPoint(t.center)<=t.radius*t.radius}distanceToPlane(t){const e=t.normal.dot(this.direction);if(0===e)return 0===t.distanceToPoint(this.origin)?0:null;const n=-(this.origin.dot(t.normal)+t.constant)/e;return n>=0?n:null}intersectPlane(t,e){const n=this.distanceToPlane(t);return null===n?null:this.at(n,e)}intersectsPlane(t){const e=t.distanceToPoint(this.origin);if(0===e)return!0;return t.normal.dot(this.direction)*e<0}intersectBox(t,e){let n,i,r,s,a,o;const l=1/this.direction.x,h=1/this.direction.y,c=1/this.direction.z,u=this.origin;return l>=0?(n=(t.min.x-u.x)*l,i=(t.max.x-u.x)*l):(n=(t.max.x-u.x)*l,i=(t.min.x-u.x)*l),h>=0?(r=(t.min.y-u.y)*h,s=(t.max.y-u.y)*h):(r=(t.max.y-u.y)*h,s=(t.min.y-u.y)*h),n>s||r>i?null:((r>n||n!=n)&&(n=r),(s<i||i!=i)&&(i=s),c>=0?(a=(t.min.z-u.z)*c,o=(t.max.z-u.z)*c):(a=(t.max.z-u.z)*c,o=(t.min.z-u.z)*c),n>o||a>i?null:((a>n||n!=n)&&(n=a),(o<i||i!=i)&&(i=o),i<0?null:this.at(n>=0?n:i,e)))}intersectsBox(t){return null!==this.intersectBox(t,tn)}intersectTriangle(t,e,n,i,r){sn.subVectors(e,t),an.subVectors(n,t),on.crossVectors(sn,an);let s,a=this.direction.dot(on);if(a>0){if(i)return null;s=1}else{if(!(a<0))return null;s=-1,a=-a}rn.subVectors(this.origin,t);const o=s*this.direction.dot(an.crossVectors(rn,an));if(o<0)return null;const l=s*this.direction.dot(sn.cross(rn));if(l<0)return null;if(o+l>a)return null;const h=-s*rn.dot(on);return h<0?null:this.at(h/a,r)}applyMatrix4(t){return this.origin.applyMatrix4(t),this.direction.transformDirection(t),this}equals(t){return t.origin.equals(this.origin)&&t.direction.equals(this.direction)}clone(){return(new this.constructor).copy(this)}}const hn=new U,cn=new U,un=new U,dn=new U,pn=new U,fn=new U,mn=new U,gn=new U,vn=new U,xn=new U;class _n{constructor(t=new U,e=new U,n=new U){this.a=t,this.b=e,this.c=n}static getNormal(t,e,n,i){i.subVectors(n,e),hn.subVectors(t,e),i.cross(hn);const r=i.lengthSq();return r>0?i.multiplyScalar(1/Math.sqrt(r)):i.set(0,0,0)}static getBarycoord(t,e,n,i,r){hn.subVectors(i,e),cn.subVectors(n,e),un.subVectors(t,e);const s=hn.dot(hn),a=hn.dot(cn),o=hn.dot(un),l=cn.dot(cn),h=cn.dot(un),c=s*l-a*a;if(0===c)return r.set(-2,-1,-1);const u=1/c,d=(l*o-a*h)*u,p=(s*h-a*o)*u;return r.set(1-d-p,p,d)}static containsPoint(t,e,n,i){return this.getBarycoord(t,e,n,i,dn),dn.x>=0&&dn.y>=0&&dn.x+dn.y<=1}static getUV(t,e,n,i,r,s,a,o){return this.getBarycoord(t,e,n,i,dn),o.set(0,0),o.addScaledVector(r,dn.x),o.addScaledVector(s,dn.y),o.addScaledVector(a,dn.z),o}static isFrontFacing(t,e,n,i){return hn.subVectors(n,e),cn.subVectors(t,e),hn.cross(cn).dot(i)<0}set(t,e,n){return this.a.copy(t),this.b.copy(e),this.c.copy(n),this}setFromPointsAndIndices(t,e,n,i){return this.a.copy(t[e]),this.b.copy(t[n]),this.c.copy(t[i]),this}setFromAttributeAndIndices(t,e,n,i){return this.a.fromBufferAttribute(t,e),this.b.fromBufferAttribute(t,n),this.c.fromBufferAttribute(t,i),this}clone(){return(new this.constructor).copy(this)}copy(t){return this.a.copy(t.a),this.b.copy(t.b),this.c.copy(t.c),this}getArea(){return hn.subVectors(this.c,this.b),cn.subVectors(this.a,this.b),.5*hn.cross(cn).length()}getMidpoint(t){return t.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(t){return _n.getNormal(this.a,this.b,this.c,t)}getPlane(t){return t.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(t,e){return _n.getBarycoord(t,this.a,this.b,this.c,e)}getUV(t,e,n,i,r){return _n.getUV(t,this.a,this.b,this.c,e,n,i,r)}containsPoint(t){return _n.containsPoint(t,this.a,this.b,this.c)}isFrontFacing(t){return _n.isFrontFacing(this.a,this.b,this.c,t)}intersectsBox(t){return t.intersectsTriangle(this)}closestPointToPoint(t,e){const n=this.a,i=this.b,r=this.c;let s,a;pn.subVectors(i,n),fn.subVectors(r,n),gn.subVectors(t,n);const o=pn.dot(gn),l=fn.dot(gn);if(o<=0&&l<=0)return e.copy(n);vn.subVectors(t,i);const h=pn.dot(vn),c=fn.dot(vn);if(h>=0&&c<=h)return e.copy(i);const u=o*c-h*l;if(u<=0&&o>=0&&h<=0)return s=o/(o-h),e.copy(n).addScaledVector(pn,s);xn.subVectors(t,r);const d=pn.dot(xn),p=fn.dot(xn);if(p>=0&&d<=p)return e.copy(r);const f=d*l-o*p;if(f<=0&&l>=0&&p<=0)return a=l/(l-p),e.copy(n).addScaledVector(fn,a);const m=h*p-d*c;if(m<=0&&c-h>=0&&d-p>=0)return mn.subVectors(r,i),a=(c-h)/(c-h+(d-p)),e.copy(i).addScaledVector(mn,a);const g=1/(m+f+u);return s=f*g,a=u*g,e.copy(n).addScaledVector(pn,s).addScaledVector(fn,a)}equals(t){return t.a.equals(this.a)&&t.b.equals(this.b)&&t.c.equals(this.c)}}class yn extends $e{constructor(t){super(),this.type="MeshBasicMaterial",this.color=new Re(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this}}yn.prototype.isMeshBasicMaterial=!0;const bn=new H,wn=new ln,Sn=new ue,Mn=new U,Tn=new U,En=new U,An=new U,Cn=new U,Rn=new U,Dn=new U,kn=new U,Pn=new U,Ln=new we,zn=new we,On=new we,In=new U,Nn=new U;class Fn extends ft{constructor(t=new qe,e=new yn){super(),this.type="Mesh",this.geometry=t,this.material=e,this.updateMorphTargets()}copy(t){return super.copy(t),void 0!==t.morphTargetInfluences&&(this.morphTargetInfluences=t.morphTargetInfluences.slice()),void 0!==t.morphTargetDictionary&&(this.morphTargetDictionary=Object.assign({},t.morphTargetDictionary)),this.material=t.material,this.geometry=t.geometry,this}updateMorphTargets(){const t=this.geometry;if(t.isBufferGeometry){const e=t.morphAttributes,n=Object.keys(e);if(n.length>0){const t=e[n[0]];if(void 0!==t){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let e=0,n=t.length;e<n;e++){const n=t[e].name||String(e);this.morphTargetInfluences.push(0),this.morphTargetDictionary[n]=e}}}}else{const e=t.morphTargets;void 0!==e&&e.length>0&&console.error("THREE.Mesh.updateMorphTargets() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.")}}raycast(t,e){const n=this.geometry,i=this.material,r=this.matrixWorld;if(void 0===i)return;if(null===n.boundingSphere&&n.computeBoundingSphere(),Sn.copy(n.boundingSphere),Sn.applyMatrix4(r),!1===t.ray.intersectsSphere(Sn))return;if(bn.copy(r).invert(),wn.copy(t.ray).applyMatrix4(bn),null!==n.boundingBox&&!1===wn.intersectsBox(n.boundingBox))return;let s;if(n.isBufferGeometry){const r=n.index,a=n.attributes.position,o=n.morphAttributes.position,l=n.morphTargetsRelative,h=n.attributes.uv,c=n.attributes.uv2,u=n.groups,d=n.drawRange;if(null!==r)if(Array.isArray(i))for(let n=0,p=u.length;n<p;n++){const p=u[n],f=i[p.materialIndex];for(let n=Math.max(p.start,d.start),i=Math.min(r.count,Math.min(p.start+p.count,d.start+d.count));n<i;n+=3){const i=r.getX(n),u=r.getX(n+1),d=r.getX(n+2);s=Un(this,f,t,wn,a,o,l,h,c,i,u,d),s&&(s.faceIndex=Math.floor(n/3),s.face.materialIndex=p.materialIndex,e.push(s))}}else{for(let n=Math.max(0,d.start),u=Math.min(r.count,d.start+d.count);n<u;n+=3){const u=r.getX(n),d=r.getX(n+1),p=r.getX(n+2);s=Un(this,i,t,wn,a,o,l,h,c,u,d,p),s&&(s.faceIndex=Math.floor(n/3),e.push(s))}}else if(void 0!==a)if(Array.isArray(i))for(let n=0,r=u.length;n<r;n++){const r=u[n],p=i[r.materialIndex];for(let n=Math.max(r.start,d.start),i=Math.min(a.count,Math.min(r.start+r.count,d.start+d.count));n<i;n+=3){s=Un(this,p,t,wn,a,o,l,h,c,n,n+1,n+2),s&&(s.faceIndex=Math.floor(n/3),s.face.materialIndex=r.materialIndex,e.push(s))}}else{for(let n=Math.max(0,d.start),r=Math.min(a.count,d.start+d.count);n<r;n+=3){s=Un(this,i,t,wn,a,o,l,h,c,n,n+1,n+2),s&&(s.faceIndex=Math.floor(n/3),e.push(s))}}}else n.isGeometry&&console.error("THREE.Mesh.raycast() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.")}}function Un(t,e,n,i,r,s,a,o,l,h,c,u){Mn.fromBufferAttribute(r,h),Tn.fromBufferAttribute(r,c),En.fromBufferAttribute(r,u);const d=t.morphTargetInfluences;if(s&&d){Dn.set(0,0,0),kn.set(0,0,0),Pn.set(0,0,0);for(let t=0,e=s.length;t<e;t++){const e=d[t],n=s[t];0!==e&&(An.fromBufferAttribute(n,h),Cn.fromBufferAttribute(n,c),Rn.fromBufferAttribute(n,u),a?(Dn.addScaledVector(An,e),kn.addScaledVector(Cn,e),Pn.addScaledVector(Rn,e)):(Dn.addScaledVector(An.sub(Mn),e),kn.addScaledVector(Cn.sub(Tn),e),Pn.addScaledVector(Rn.sub(En),e)))}Mn.add(Dn),Tn.add(kn),En.add(Pn)}t.isSkinnedMesh&&(t.boneTransform(h,Mn),t.boneTransform(c,Tn),t.boneTransform(u,En));const p=function(t,e,n,i,r,s,a,o){let l;if(l=1===e.side?i.intersectTriangle(a,s,r,!0,o):i.intersectTriangle(r,s,a,2!==e.side,o),null===l)return null;Nn.copy(o),Nn.applyMatrix4(t.matrixWorld);const h=n.ray.origin.distanceTo(Nn);return h<n.near||h>n.far?null:{distance:h,point:Nn.clone(),object:t}}(t,e,n,i,Mn,Tn,En,In);if(p){o&&(Ln.fromBufferAttribute(o,h),zn.fromBufferAttribute(o,c),On.fromBufferAttribute(o,u),p.uv=_n.getUV(In,Mn,Tn,En,Ln,zn,On,new we)),l&&(Ln.fromBufferAttribute(l,h),zn.fromBufferAttribute(l,c),On.fromBufferAttribute(l,u),p.uv2=_n.getUV(In,Mn,Tn,En,Ln,zn,On,new we));const t={a:h,b:c,c:u,normal:new U,materialIndex:0};_n.getNormal(Mn,Tn,En,t.normal),p.face=t}return p}Fn.prototype.isMesh=!0;const Bn={alphamap_fragment:"\n#ifdef USE_ALPHAMAP\n\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n\n#endif\n",alphamap_pars_fragment:"\n#ifdef USE_ALPHAMAP\n\n\tuniform sampler2D alphaMap;\n\n#endif\n",alphatest_fragment:"\n#ifdef USE_ALPHATEST\n\n\tif ( diffuseColor.a < alphaTest ) discard;\n\n#endif\n",alphatest_pars_fragment:"\n#ifdef USE_ALPHATEST\n\tuniform float alphaTest;\n#endif\n",aomap_fragment:"\n#ifdef USE_AOMAP\n\n\t// reads channel R, compatible with a combined OcclusionRoughnessMetallic (RGB) texture\n\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\n\t#if defined( USE_ENVMAP ) && defined( STANDARD )\n\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.roughness );\n\n\t#endif\n\n#endif\n",aomap_pars_fragment:"\n#ifdef USE_AOMAP\n\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n\n#endif\n",begin_vertex:"\nvec3 transformed = vec3( position );\n",beginnormal_vertex:"\nvec3 objectNormal = vec3( normal );\n\n#ifdef USE_TANGENT\n\n\tvec3 objectTangent = vec3( tangent.xyz );\n\n#endif\n",bsdfs:'\n\nvec3 BRDF_Lambert( const in vec3 diffuseColor ) {\n\n\treturn RECIPROCAL_PI * diffuseColor;\n\n} // validated\n\nvec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) {\n\n\t// Original approximation by Christophe Schlick \'94\n\t// float fresnel = pow( 1.0 - dotVH, 5.0 );\n\n\t// Optimized variant (presented by Epic at SIGGRAPH \'13)\n\t// https://cdn2.unrealengine.com/Resources/files/2013SiggraphPresentationsNotes-26915738.pdf\n\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\n\n\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\n\n} // validated\n\n// Moving Frostbite to Physically Based Rendering 3.0 - page 12, listing 2\n// https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf\nfloat V_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\n\tfloat a2 = pow2( alpha );\n\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\n\treturn 0.5 / max( gv + gl, EPSILON );\n\n}\n\n// Microfacet Models for Refraction through Rough Surfaces - equation (33)\n// http://graphicrants.blogspot.com/2013/08/specular-brdf-reference.html\n// alpha is "roughness squared" in Disney’s reparameterization\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\n\tfloat a2 = pow2( alpha );\n\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0; // avoid alpha = 0 with dotNH = 1\n\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n\n}\n\n// GGX Distribution, Schlick Fresnel, GGX_SmithCorrelated Visibility\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in vec3 f0, const in float f90, const in float roughness ) {\n\n\tfloat alpha = pow2( roughness ); // UE4\'s roughness\n\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\n\tvec3 F = F_Schlick( f0, f90, dotVH );\n\n\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\n\tfloat D = D_GGX( alpha, dotNH );\n\n\treturn F * ( V * D );\n\n}\n\n// Rect Area Light\n\n// Real-Time Polygonal-Light Shading with Linearly Transformed Cosines\n// by Eric Heitz, Jonathan Dupuy, Stephen Hill and David Neubelt\n// code: https://github.com/selfshadow/ltc_code/\n\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\n\tfloat dotNV = saturate( dot( N, V ) );\n\n\t// texture parameterized by sqrt( GGX alpha ) and sqrt( 1 - cos( theta ) )\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\n\treturn uv;\n\n}\n\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\n\t// Real-Time Area Lighting: a Journey from Research to Production (p.102)\n\t// An approximation of the form factor of a horizon-clipped rectangle.\n\n\tfloat l = length( f );\n\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n\n}\n\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\n\tfloat x = dot( v1, v2 );\n\n\tfloat y = abs( x );\n\n\t// rational polynomial approximation to theta / sin( theta ) / 2PI\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\n\treturn cross( v1, v2 ) * theta_sintheta;\n\n}\n\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\n\t// bail if point is on back side of plane of light\n\t// assumes ccw winding order of light vertices\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\n\t// construct orthonormal basis around N\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 ); // negated from paper; possibly due to a different handedness of world coordinate system\n\n\t// compute transform\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\n\t// transform rect\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\n\t// project rect onto sphere\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\n\t// calculate vector form factor\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\n\t// adjust for horizon clipping\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\n/*\n\t// alternate method of adjusting for horizon clipping (see referece)\n\t// refactoring required\n\tfloat len = length( vectorFormFactor );\n\tfloat z = vectorFormFactor.z / len;\n\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\n\t// tabulated horizon-clipped sphere, apparently...\n\tvec2 uv = vec2( z * 0.5 + 0.5, len );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\n\tfloat scale = texture2D( ltc_2, uv ).w;\n\n\tfloat result = len * scale;\n*/\n\n\treturn vec3( result );\n\n}\n\n// End Rect Area Light\n\n\nfloat G_BlinnPhong_Implicit( /* const in float dotNL, const in float dotNV */ ) {\n\n\t// geometry term is (n dot l)(n dot v) / 4(n dot l)(n dot v)\n\treturn 0.25;\n\n}\n\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n\n}\n\nvec3 BRDF_BlinnPhong( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float shininess ) {\n\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\n\tvec3 F = F_Schlick( specularColor, 1.0, dotVH );\n\n\tfloat G = G_BlinnPhong_Implicit( /* dotNL, dotNV */ );\n\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\n\treturn F * ( G * D );\n\n} // validated\n\n#if defined( USE_SHEEN )\n\n// https://github.com/google/filament/blob/master/shaders/src/brdf.fs\nfloat D_Charlie( float roughness, float dotNH ) {\n\n\tfloat alpha = pow2( roughness );\n\n\t// Estevez and Kulla 2017, "Production Friendly Microfacet Sheen BRDF"\n\tfloat invAlpha = 1.0 / alpha;\n\tfloat cos2h = dotNH * dotNH;\n\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 ); // 2^(-14/2), so sin2h^2 > 0 in fp16\n\n\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\n\n}\n\n// https://github.com/google/filament/blob/master/shaders/src/brdf.fs\nfloat V_Neubelt( float dotNV, float dotNL ) {\n\n\t// Neubelt and Pettineo 2013, "Crafting a Next-gen Material Pipeline for The Order: 1886"\n\treturn saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\n\n}\n\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\n\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\n\tfloat D = D_Charlie( sheenRoughness, dotNH );\n\tfloat V = V_Neubelt( dotNV, dotNL );\n\n\treturn sheenColor * ( D * V );\n\n}\n\n#endif\n',bumpmap_pars_fragment:"\n#ifdef USE_BUMPMAP\n\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\n\t// Bump Mapping Unparametrized Surfaces on the GPU by Morten S. Mikkelsen\n\t// https://mmikk.github.io/papers3d/mm_sfgrad_bump.pdf\n\n\t// Evaluate the derivative of the height w.r.t. screen-space using forward differencing (listing 2)\n\n\tvec2 dHdxy_fwd() {\n\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\n\t\treturn vec2( dBx, dBy );\n\n\t}\n\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy, float faceDirection ) {\n\n\t\t// Workaround for Adreno 3XX dFd*( vec3 ) bug. See #9988\n\n\t\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\n\t\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\n\t\tvec3 vN = surf_norm;\t\t// normalized\n\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\n\t\tfloat fDet = dot( vSigmaX, R1 ) * faceDirection;\n\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\n\t}\n\n#endif\n",clipping_planes_fragment:"\n#if NUM_CLIPPING_PLANES > 0\n\n\tvec4 plane;\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\n\t\tplane = clippingPlanes[ i ];\n\t\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\n\n\t}\n\t#pragma unroll_loop_end\n\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\n\t\tbool clipped = true;\n\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\n\n\t\t}\n\t\t#pragma unroll_loop_end\n\n\t\tif ( clipped ) discard;\n\n\t#endif\n\n#endif\n",clipping_planes_pars_fragment:"\n#if NUM_CLIPPING_PLANES > 0\n\n\tvarying vec3 vClipPosition;\n\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n\n#endif\n",clipping_planes_pars_vertex:"\n#if NUM_CLIPPING_PLANES > 0\n\n\tvarying vec3 vClipPosition;\n\n#endif\n",clipping_planes_vertex:"\n#if NUM_CLIPPING_PLANES > 0\n\n\tvClipPosition = - mvPosition.xyz;\n\n#endif\n",color_fragment:"\n#if defined( USE_COLOR_ALPHA )\n\n\tdiffuseColor *= vColor;\n\n#elif defined( USE_COLOR )\n\n\tdiffuseColor.rgb *= vColor;\n\n#endif\n",color_pars_fragment:"\n#if defined( USE_COLOR_ALPHA )\n\n\tvarying vec4 vColor;\n\n#elif defined( USE_COLOR )\n\n\tvarying vec3 vColor;\n\n#endif\n",color_pars_vertex:"\n#if defined( USE_COLOR_ALPHA )\n\n\tvarying vec4 vColor;\n\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\n\tvarying vec3 vColor;\n\n#endif\n",color_vertex:"\n#if defined( USE_COLOR_ALPHA )\n\n\tvColor = vec4( 1.0 );\n\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\n\tvColor = vec3( 1.0 );\n\n#endif\n\n#ifdef USE_COLOR\n\n\tvColor *= color;\n\n#endif\n\n#ifdef USE_INSTANCING_COLOR\n\n\tvColor.xyz *= instanceColor.xyz;\n\n#endif\n",common:"\n#define PI 3.141592653589793\n#define PI2 6.283185307179586\n#define PI_HALF 1.5707963267948966\n#define RECIPROCAL_PI 0.3183098861837907\n#define RECIPROCAL_PI2 0.15915494309189535\n#define EPSILON 1e-6\n\n#ifndef saturate\n// <tonemapping_pars_fragment> may have defined saturate() already\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement( a ) ( 1.0 - saturate( a ) )\n\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\n\n// expects values in the range of [0,1]x[0,1], returns values in the [0,1] range.\n// do not collapse into a single function per: http://byteblacksmith.com/improvements-to-the-canonical-one-liner-glsl-rand-for-opengl-es-2-0/\nhighp float rand( const in vec2 uv ) {\n\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\n\treturn fract( sin( sn ) * c );\n\n}\n\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\n\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\n\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\n\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n#ifdef USE_CLEARCOAT\n\tvec3 clearcoatNormal;\n#endif\n};\n\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n}\n\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t// dir can be either a direction vector or a normal vector\n\t// upper-left 3x3 of matrix is assumed to be orthogonal\n\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n\n}\n\nmat3 transposeMat3( const in mat3 m ) {\n\n\tmat3 tmp;\n\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\n\treturn tmp;\n\n}\n\n// https://en.wikipedia.org/wiki/Relative_luminance\nfloat linearToRelativeLuminance( const in vec3 color ) {\n\n\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\n\n\treturn dot( weights, color.rgb );\n\n}\n\nbool isPerspectiveMatrix( mat4 m ) {\n\n\treturn m[ 2 ][ 3 ] == - 1.0;\n\n}\n\nvec2 equirectUv( in vec3 dir ) {\n\n\t// dir is assumed to be unit length\n\n\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n\n\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\n\treturn vec2( u, v );\n\n}\n",cube_uv_reflection_fragment:"\n#ifdef ENVMAP_TYPE_CUBE_UV\n\n\t#define cubeUV_maxMipLevel 8.0\n\t#define cubeUV_minMipLevel 4.0\n\t#define cubeUV_maxTileSize 256.0\n\t#define cubeUV_minTileSize 16.0\n\n\t// These shader functions convert between the UV coordinates of a single face of\n\t// a cubemap, the 0-5 integer index of a cube face, and the direction vector for\n\t// sampling a textureCube (not generally normalized ).\n\n\tfloat getFace( vec3 direction ) {\n\n\t\tvec3 absDirection = abs( direction );\n\n\t\tfloat face = - 1.0;\n\n\t\tif ( absDirection.x > absDirection.z ) {\n\n\t\t\tif ( absDirection.x > absDirection.y )\n\n\t\t\t\tface = direction.x > 0.0 ? 0.0 : 3.0;\n\n\t\t\telse\n\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\n\t\t} else {\n\n\t\t\tif ( absDirection.z > absDirection.y )\n\n\t\t\t\tface = direction.z > 0.0 ? 2.0 : 5.0;\n\n\t\t\telse\n\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\n\t\t}\n\n\t\treturn face;\n\n\t}\n\n\t// RH coordinate system; PMREM face-indexing convention\n\tvec2 getUV( vec3 direction, float face ) {\n\n\t\tvec2 uv;\n\n\t\tif ( face == 0.0 ) {\n\n\t\t\tuv = vec2( direction.z, direction.y ) / abs( direction.x ); // pos x\n\n\t\t} else if ( face == 1.0 ) {\n\n\t\t\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y ); // pos y\n\n\t\t} else if ( face == 2.0 ) {\n\n\t\t\tuv = vec2( - direction.x, direction.y ) / abs( direction.z ); // pos z\n\n\t\t} else if ( face == 3.0 ) {\n\n\t\t\tuv = vec2( - direction.z, direction.y ) / abs( direction.x ); // neg x\n\n\t\t} else if ( face == 4.0 ) {\n\n\t\t\tuv = vec2( - direction.x, direction.z ) / abs( direction.y ); // neg y\n\n\t\t} else {\n\n\t\t\tuv = vec2( direction.x, direction.y ) / abs( direction.z ); // neg z\n\n\t\t}\n\n\t\treturn 0.5 * ( uv + 1.0 );\n\n\t}\n\n\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\n\n\t\tfloat face = getFace( direction );\n\n\t\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\n\n\t\tmipInt = max( mipInt, cubeUV_minMipLevel );\n\n\t\tfloat faceSize = exp2( mipInt );\n\n\t\tfloat texelSize = 1.0 / ( 3.0 * cubeUV_maxTileSize );\n\n\t\tvec2 uv = getUV( direction, face ) * ( faceSize - 1.0 ) + 0.5;\n\n\t\tif ( face > 2.0 ) {\n\n\t\t\tuv.y += faceSize;\n\n\t\t\tface -= 3.0;\n\n\t\t}\n\n\t\tuv.x += face * faceSize;\n\n\t\tif ( mipInt < cubeUV_maxMipLevel ) {\n\n\t\t\tuv.y += 2.0 * cubeUV_maxTileSize;\n\n\t\t}\n\n\t\tuv.y += filterInt * 2.0 * cubeUV_minTileSize;\n\n\t\tuv.x += 3.0 * max( 0.0, cubeUV_maxTileSize - 2.0 * faceSize );\n\n\t\tuv *= texelSize;\n\n\t\treturn texture2D( envMap, uv ).rgb;\n\n\t}\n\n\t// These defines must match with PMREMGenerator\n\n\t#define r0 1.0\n\t#define v0 0.339\n\t#define m0 - 2.0\n\t#define r1 0.8\n\t#define v1 0.276\n\t#define m1 - 1.0\n\t#define r4 0.4\n\t#define v4 0.046\n\t#define m4 2.0\n\t#define r5 0.305\n\t#define v5 0.016\n\t#define m5 3.0\n\t#define r6 0.21\n\t#define v6 0.0038\n\t#define m6 4.0\n\n\tfloat roughnessToMip( float roughness ) {\n\n\t\tfloat mip = 0.0;\n\n\t\tif ( roughness >= r1 ) {\n\n\t\t\tmip = ( r0 - roughness ) * ( m1 - m0 ) / ( r0 - r1 ) + m0;\n\n\t\t} else if ( roughness >= r4 ) {\n\n\t\t\tmip = ( r1 - roughness ) * ( m4 - m1 ) / ( r1 - r4 ) + m1;\n\n\t\t} else if ( roughness >= r5 ) {\n\n\t\t\tmip = ( r4 - roughness ) * ( m5 - m4 ) / ( r4 - r5 ) + m4;\n\n\t\t} else if ( roughness >= r6 ) {\n\n\t\t\tmip = ( r5 - roughness ) * ( m6 - m5 ) / ( r5 - r6 ) + m5;\n\n\t\t} else {\n\n\t\t\tmip = - 2.0 * log2( 1.16 * roughness ); // 1.16 = 1.79^0.25\n\t\t}\n\n\t\treturn mip;\n\n\t}\n\n\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\n\n\t\tfloat mip = clamp( roughnessToMip( roughness ), m0, cubeUV_maxMipLevel );\n\n\t\tfloat mipF = fract( mip );\n\n\t\tfloat mipInt = floor( mip );\n\n\t\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\n\n\t\tif ( mipF == 0.0 ) {\n\n\t\t\treturn vec4( color0, 1.0 );\n\n\t\t} else {\n\n\t\t\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\n\n\t\t\treturn vec4( mix( color0, color1, mipF ), 1.0 );\n\n\t\t}\n\n\t}\n\n#endif\n",defaultnormal_vertex:"\nvec3 transformedNormal = objectNormal;\n\n#ifdef USE_INSTANCING\n\n\t// this is in lieu of a per-instance normal-matrix\n\t// shear transforms in the instance matrix are not supported\n\n\tmat3 m = mat3( instanceMatrix );\n\n\ttransformedNormal /= vec3( dot( m[ 0 ], m[ 0 ] ), dot( m[ 1 ], m[ 1 ] ), dot( m[ 2 ], m[ 2 ] ) );\n\n\ttransformedNormal = m * transformedNormal;\n\n#endif\n\ntransformedNormal = normalMatrix * transformedNormal;\n\n#ifdef FLIP_SIDED\n\n\ttransformedNormal = - transformedNormal;\n\n#endif\n\n#ifdef USE_TANGENT\n\n\tvec3 transformedTangent = ( modelViewMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\n\t#ifdef FLIP_SIDED\n\n\t\ttransformedTangent = - transformedTangent;\n\n\t#endif\n\n#endif\n",displacementmap_pars_vertex:"\n#ifdef USE_DISPLACEMENTMAP\n\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n\n#endif\n",displacementmap_vertex:"\n#ifdef USE_DISPLACEMENTMAP\n\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vUv ).x * displacementScale + displacementBias );\n\n#endif\n",emissivemap_fragment:"\n#ifdef USE_EMISSIVEMAP\n\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n\n#endif\n",emissivemap_pars_fragment:"\n#ifdef USE_EMISSIVEMAP\n\n\tuniform sampler2D emissiveMap;\n\n#endif\n",encodings_fragment:"\ngl_FragColor = linearToOutputTexel( gl_FragColor );\n",encodings_pars_fragment:"\n\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\n\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\n}\n\n",envmap_fragment:"\n#ifdef USE_ENVMAP\n\n\t#ifdef ENV_WORLDPOS\n\n\t\tvec3 cameraToFrag;\n\n\t\tif ( isOrthographic ) {\n\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\n\t\t} else {\n\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\n\t\t}\n\n\t\t// Transforming Normal Vectors with the Inverse Transformation\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\n\t\t#else\n\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\n\t\t#endif\n\n\t#else\n\n\t\tvec3 reflectVec = vReflect;\n\n\t#endif\n\n\t#ifdef ENVMAP_TYPE_CUBE\n\n\t\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\n\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\n\t\tvec4 envColor = textureCubeUV( envMap, reflectVec, 0.0 );\n\n\t#else\n\n\t\tvec4 envColor = vec4( 0.0 );\n\n\t#endif\n\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\n\t#endif\n\n#endif\n",envmap_common_pars_fragment:"\n#ifdef USE_ENVMAP\n\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\t\n#endif\n",envmap_pars_fragment:"\n#ifdef USE_ENVMAP\n\n\tuniform float reflectivity;\n\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\n\t\t#define ENV_WORLDPOS\n\n\t#endif\n\n\t#ifdef ENV_WORLDPOS\n\n\t\tvarying vec3 vWorldPosition;\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n\n#endif\n",envmap_pars_vertex:"\n#ifdef USE_ENVMAP\n\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) ||defined( PHONG )\n\n\t\t#define ENV_WORLDPOS\n\n\t#endif\n\n\t#ifdef ENV_WORLDPOS\n\t\t\n\t\tvarying vec3 vWorldPosition;\n\n\t#else\n\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\n\t#endif\n\n#endif\n",envmap_physical_pars_fragment:"\n#if defined( USE_ENVMAP )\n\n\t#ifdef ENVMAP_MODE_REFRACTION\n\n\t\tuniform float refractionRatio;\n\n\t#endif\n\n\tvec3 getIBLIrradiance( const in vec3 normal ) {\n\n\t\t#if defined( ENVMAP_TYPE_CUBE_UV )\n\n\t\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, worldNormal, 1.0 );\n\n\t\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\n\t\t#else\n\n\t\t\treturn vec3( 0.0 );\n\n\t\t#endif\n\n\t}\n\n\tvec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {\n\n\t\t#if defined( ENVMAP_TYPE_CUBE_UV )\n\n\t\t\tvec3 reflectVec;\n\n\t\t\t#ifdef ENVMAP_MODE_REFLECTION\n\n\t\t\t\treflectVec = reflect( - viewDir, normal );\n\n\t\t\t\t// Mixing the reflection with the normal is more accurate and keeps rough objects from gathering light from behind their tangent plane.\n\t\t\t\treflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\n\n\t\t\t#else\n\n\t\t\t\treflectVec = refract( - viewDir, normal, refractionRatio );\n\n\t\t\t#endif\n\n\t\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, reflectVec, roughness );\n\n\t\t\treturn envMapColor.rgb * envMapIntensity;\n\n\t\t#else\n\n\t\t\treturn vec3( 0.0 );\n\n\t\t#endif\n\n\t}\n\n#endif\n",envmap_vertex:"\n#ifdef USE_ENVMAP\n\n\t#ifdef ENV_WORLDPOS\n\n\t\tvWorldPosition = worldPosition.xyz;\n\n\t#else\n\n\t\tvec3 cameraToVertex;\n\n\t\tif ( isOrthographic ) {\n\n\t\t\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\n\t\t} else {\n\n\t\t\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\n\t\t}\n\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\n\t\t#else\n\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\n\t\t#endif\n\n\t#endif\n\n#endif\n",fog_vertex:"\n#ifdef USE_FOG\n\n\tvFogDepth = - mvPosition.z;\n\n#endif\n",fog_pars_vertex:"\n#ifdef USE_FOG\n\n\tvarying float vFogDepth;\n\n#endif\n",fog_fragment:"\n#ifdef USE_FOG\n\n\t#ifdef FOG_EXP2\n\n\t\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth );\n\n\t#else\n\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, vFogDepth );\n\n\t#endif\n\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n\n#endif\n",fog_pars_fragment:"\n#ifdef USE_FOG\n\n\tuniform vec3 fogColor;\n\tvarying float vFogDepth;\n\n\t#ifdef FOG_EXP2\n\n\t\tuniform float fogDensity;\n\n\t#else\n\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\n\t#endif\n\n#endif\n",gradientmap_pars_fragment:"\n\n#ifdef USE_GRADIENTMAP\n\n\tuniform sampler2D gradientMap;\n\n#endif\n\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\n\t// dotNL will be from -1.0 to 1.0\n\tfloat dotNL = dot( normal, lightDirection );\n\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\n\t#ifdef USE_GRADIENTMAP\n\n\t\treturn vec3( texture2D( gradientMap, coord ).r );\n\n\t#else\n\n\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\n\t#endif\n\n}\n",lightmap_fragment:"\n#ifdef USE_LIGHTMAP\n\n\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\n\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\n\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\n\t\tlightMapIrradiance *= PI;\n\n\t#endif\n\n\treflectedLight.indirectDiffuse += lightMapIrradiance;\n\n#endif\n",lightmap_pars_fragment:"\n#ifdef USE_LIGHTMAP\n\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n\n#endif\n",lights_lambert_vertex:"\nvec3 diffuse = vec3( 1.0 );\n\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( -mvPosition.xyz );\n\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\n\nvLightFront = vec3( 0.0 );\nvIndirectFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n\tvIndirectBack = vec3( 0.0 );\n#endif\n\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\n\nvIndirectFront += getAmbientLightIrradiance( ambientLightColor );\n\nvIndirectFront += getLightProbeIrradiance( lightProbe, geometry.normal );\n\n#ifdef DOUBLE_SIDED\n\n\tvIndirectBack += getAmbientLightIrradiance( ambientLightColor );\n\n\tvIndirectBack += getLightProbeIrradiance( lightProbe, backGeometry.normal );\n\n#endif\n\n#if NUM_POINT_LIGHTS > 0\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\n\t\tgetPointLightInfo( pointLights[ i ], geometry, directLight );\n\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = directLight.color;\n\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\n\t\t#ifdef DOUBLE_SIDED\n\n\t\t\tvLightBack += saturate( - dotNL ) * directLightColor_Diffuse;\n\n\t\t#endif\n\n\t}\n\t#pragma unroll_loop_end\n\n#endif\n\n#if NUM_SPOT_LIGHTS > 0\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\n\t\tgetSpotLightInfo( spotLights[ i ], geometry, directLight );\n\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = directLight.color;\n\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\n\t\t#ifdef DOUBLE_SIDED\n\n\t\t\tvLightBack += saturate( - dotNL ) * directLightColor_Diffuse;\n\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n\n#endif\n\n#if NUM_DIR_LIGHTS > 0\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\n\t\tgetDirectionalLightInfo( directionalLights[ i ], geometry, directLight );\n\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = directLight.color;\n\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\n\t\t#ifdef DOUBLE_SIDED\n\n\t\t\tvLightBack += saturate( - dotNL ) * directLightColor_Diffuse;\n\n\t\t#endif\n\n\t}\n\t#pragma unroll_loop_end\n\n#endif\n\n#if NUM_HEMI_LIGHTS > 0\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\n\t\tvIndirectFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry.normal );\n\n\t\t#ifdef DOUBLE_SIDED\n\n\t\t\tvIndirectBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry.normal );\n\n\t\t#endif\n\n\t}\n\t#pragma unroll_loop_end\n\n#endif\n",lights_pars_begin:"\nuniform bool receiveShadow;\nuniform vec3 ambientLightColor;\nuniform vec3 lightProbe[ 9 ];\n\n// get the irradiance (radiance convolved with cosine lobe) at the point 'normal' on the unit sphere\n// source: https://graphics.stanford.edu/papers/envmap/envmap.pdf\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n\n\t// normal is assumed to have unit length\n\n\tfloat x = normal.x, y = normal.y, z = normal.z;\n\n\t// band 0\n\tvec3 result = shCoefficients[ 0 ] * 0.886227;\n\n\t// band 1\n\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n\n\t// band 2\n\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n\n\treturn result;\n\n}\n\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) {\n\n\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\n\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n\n\treturn irradiance;\n\n}\n\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\n\tvec3 irradiance = ambientLightColor;\n\n\treturn irradiance;\n\n}\n\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\n\t#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\n\t\t// based upon Frostbite 3 Moving to Physically-based Rendering\n\t\t// page 32, equation 26: E[window1]\n\t\t// https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf\n\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\n\t\tif ( cutoffDistance > 0.0 ) {\n\n\t\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\n\t\t}\n\n\t\treturn distanceFalloff;\n\n\t#else\n\n\t\tif ( cutoffDistance > 0.0 && decayExponent > 0.0 ) {\n\n\t\t\treturn pow( saturate( - lightDistance / cutoffDistance + 1.0 ), decayExponent );\n\n\t\t}\n\n\t\treturn 1.0;\n\n\t#endif\n\n}\n\nfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\n\n\treturn smoothstep( coneCosine, penumbraCosine, angleCosine );\n\n}\n\n#if NUM_DIR_LIGHTS > 0\n\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t};\n\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\n\tvoid getDirectionalLightInfo( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight light ) {\n\n\t\tlight.color = directionalLight.color;\n\t\tlight.direction = directionalLight.direction;\n\t\tlight.visible = true;\n\n\t}\n\n#endif\n\n\n#if NUM_POINT_LIGHTS > 0\n\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t};\n\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\n\t// light is an out parameter as having it as a return value caused compiler errors on some devices\n\tvoid getPointLightInfo( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight light ) {\n\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\n\t\tlight.direction = normalize( lVector );\n\n\t\tfloat lightDistance = length( lVector );\n\n\t\tlight.color = pointLight.color;\n\t\tlight.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );\n\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\n\t}\n\n#endif\n\n\n#if NUM_SPOT_LIGHTS > 0\n\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t};\n\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\n\t// light is an out parameter as having it as a return value caused compiler errors on some devices\n\tvoid getSpotLightInfo( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight light ) {\n\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\n\t\tlight.direction = normalize( lVector );\n\n\t\tfloat angleCos = dot( light.direction, spotLight.direction );\n\n\t\tfloat spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\n\t\tif ( spotAttenuation > 0.0 ) {\n\n\t\t\tfloat lightDistance = length( lVector );\n\n\t\t\tlight.color = spotLight.color * spotAttenuation;\n\t\t\tlight.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\n\t\t} else {\n\n\t\t\tlight.color = vec3( 0.0 );\n\t\t\tlight.visible = false;\n\n\t\t}\n\n\t}\n\n#endif\n\n\n#if NUM_RECT_AREA_LIGHTS > 0\n\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\n\t// Pre-computed values of LinearTransformedCosine approximation of BRDF\n\t// BRDF approximation Texture is 64x64\n\tuniform sampler2D ltc_1; // RGBA Float\n\tuniform sampler2D ltc_2; // RGBA Float\n\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n\n#endif\n\n\n#if NUM_HEMI_LIGHTS > 0\n\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in vec3 normal ) {\n\n\t\tfloat dotNL = dot( normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\n\t\treturn irradiance;\n\n\t}\n\n#endif\n",lights_toon_fragment:"\nToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\n",lights_toon_pars_fragment:"\nvarying vec3 vViewPosition;\n\nstruct ToonMaterial {\n\n\tvec3 diffuseColor;\n\n};\n\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\n\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\n}\n\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\n}\n\n#define RE_Direct\t\t\t\tRE_Direct_Toon\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Toon\n\n#define Material_LightProbeLOD( material )\t(0)\n",lights_phong_fragment:"\nBlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;\n",lights_phong_pars_fragment:"\nvarying vec3 vViewPosition;\n\nstruct BlinnPhongMaterial {\n\n\tvec3 diffuseColor;\n\tvec3 specularColor;\n\tfloat specularShininess;\n\tfloat specularStrength;\n\n};\n\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\n\treflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometry.viewDir, geometry.normal, material.specularColor, material.specularShininess ) * material.specularStrength;\n\n}\n\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\n}\n\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n\n#define Material_LightProbeLOD( material )\t(0)\n",lights_physical_fragment:"\nPhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\n\nvec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\n\nmaterial.roughness = max( roughnessFactor, 0.0525 );// 0.0525 corresponds to the base mip of a 256 cubemap.\nmaterial.roughness += geometryRoughness;\nmaterial.roughness = min( material.roughness, 1.0 );\n\n#ifdef IOR\n\n\t#ifdef SPECULAR\n\n\t\tfloat specularIntensityFactor = specularIntensity;\n\t\tvec3 specularColorFactor = specularColor;\n\n\t\t#ifdef USE_SPECULARINTENSITYMAP\n\n\t\t\tspecularIntensityFactor *= texture2D( specularIntensityMap, vUv ).a;\n\n\t\t#endif\n\n\t\t#ifdef USE_SPECULARCOLORMAP\n\n\t\t\tspecularColorFactor *= texture2D( specularColorMap, vUv ).rgb;\n\n\t\t#endif\n\n\t\tmaterial.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\n\n\t#else\n\n\t\tfloat specularIntensityFactor = 1.0;\n\t\tvec3 specularColorFactor = vec3( 1.0 );\n\t\tmaterial.specularF90 = 1.0;\n\n\t#endif\n\n\tmaterial.specularColor = mix( min( pow2( ( ior - 1.0 ) / ( ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor );\n\n#else\n\n\tmaterial.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.specularF90 = 1.0;\n\n#endif\n\n#ifdef USE_CLEARCOAT\n\n\tmaterial.clearcoat = clearcoat;\n\tmaterial.clearcoatRoughness = clearcoatRoughness;\n\tmaterial.clearcoatF0 = vec3( 0.04 );\n\tmaterial.clearcoatF90 = 1.0;\n\n\t#ifdef USE_CLEARCOATMAP\n\n\t\tmaterial.clearcoat *= texture2D( clearcoatMap, vUv ).x;\n\n\t#endif\n\n\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\n\t\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vUv ).y;\n\n\t#endif\n\n\tmaterial.clearcoat = saturate( material.clearcoat ); // Burley clearcoat model\n\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\n\tmaterial.clearcoatRoughness += geometryRoughness;\n\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\n\n#endif\n\n#ifdef USE_SHEEN\n\n\tmaterial.sheenColor = sheenColor;\n\n\t#ifdef USE_SHEENCOLORMAP\n\n\t\tmaterial.sheenColor *= texture2D( sheenColorMap, vUv ).rgb;\n\n\t#endif\n\n\tmaterial.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 );\n\n\t#ifdef USE_SHEENROUGHNESSMAP\n\n\t\tmaterial.sheenRoughness *= texture2D( sheenRoughnessMap, vUv ).a;\n\n\t#endif\n\n#endif\n",lights_physical_pars_fragment:'\nstruct PhysicalMaterial {\n\n\tvec3 diffuseColor;\n\tfloat roughness;\n\tvec3 specularColor;\n\tfloat specularF90;\n\n\t#ifdef USE_CLEARCOAT\n\t\tfloat clearcoat;\n\t\tfloat clearcoatRoughness;\n\t\tvec3 clearcoatF0;\n\t\tfloat clearcoatF90;\n\t#endif\n\n\t#ifdef USE_SHEEN\n\t\tvec3 sheenColor;\n\t\tfloat sheenRoughness;\n\t#endif\n\n};\n\n// temporary\nvec3 clearcoatSpecular = vec3( 0.0 );\nvec3 sheenSpecular = vec3( 0.0 );\n\n// This is a curve-fit approxmation to the "Charlie sheen" BRDF integrated over the hemisphere from \n// Estevez and Kulla 2017, "Production Friendly Microfacet Sheen BRDF". The analysis can be found\n// in the Sheen section of https://drive.google.com/file/d/1T0D1VSyR4AllqIJTQAraEIzjlb5h4FKH/view?usp=sharing\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness) {\n\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\n\tfloat r2 = roughness * roughness;\n\n\tfloat a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95;\n\n\tfloat b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72;\n\n\tfloat DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) );\n\n\treturn saturate( DG * RECIPROCAL_PI );\n\n}\n\n// Analytical approximation of the DFG LUT, one half of the\n// split-sum approximation used in indirect specular lighting.\n// via \'environmentBRDF\' from "Physically Based Shading on Mobile"\n// https://www.unrealengine.com/blog/physically-based-shading-on-mobile\nvec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\n\tvec4 r = roughness * c0 + c1;\n\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\n\tvec2 fab = vec2( - 1.04, 1.04 ) * a004 + r.zw;\n\n\treturn fab;\n\n}\n\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\n\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\n\treturn specularColor * fab.x + specularF90 * fab.y;\n\n}\n\n// Fdez-Agüera\'s "Multiple-Scattering Microfacet Model for Real-Time Image Based Lighting"\n// Approximates multiscattering in order to preserve energy.\n// http://www.jcgt.org/published/0008/01/03/\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\n\tvec3 FssEss = specularColor * fab.x + specularF90 * fab.y;\n\n\tfloat Ess = fab.x + fab.y;\n\tfloat Ems = 1.0 - Ess;\n\n\tvec3 Favg = specularColor + ( 1.0 - specularColor ) * 0.047619; // 1/21\n\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n\n}\n\n#if NUM_RECT_AREA_LIGHTS > 0\n\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.roughness;\n\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight; // counterclockwise; light shines in local neg z direction\n\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3(    0, 1,    0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\n\t\t// LTC Fresnel Approximation by Stephen Hill\n\t\t// http://blog.selfshadow.com/publications/s2016-advances/s2016_ltc_fresnel.pdf\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\n\t}\n\n#endif\n\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\n\tvec3 irradiance = dotNL * directLight.color;\n\n\t#ifdef USE_CLEARCOAT\n\n\t\tfloat dotNLcc = saturate( dot( geometry.clearcoatNormal, directLight.direction ) );\n\n\t\tvec3 ccIrradiance = dotNLcc * directLight.color;\n\n\t\tclearcoatSpecular += ccIrradiance * BRDF_GGX( directLight.direction, geometry.viewDir, geometry.clearcoatNormal, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\n\t#endif\n\n\t#ifdef USE_SHEEN\n\n\t\tsheenSpecular += irradiance * BRDF_Sheen( directLight.direction, geometry.viewDir, geometry.normal, material.sheenColor, material.sheenRoughness );\n\n\t#endif\n\n\treflectedLight.directSpecular += irradiance * BRDF_GGX( directLight.direction, geometry.viewDir, geometry.normal, material.specularColor, material.specularF90, material.roughness );\n\n\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\n}\n\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\n\t#ifdef USE_CLEARCOAT\n\n\t\tclearcoatSpecular += clearcoatRadiance * EnvironmentBRDF( geometry.clearcoatNormal, geometry.viewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\n\t#endif\n\n\t#ifdef USE_SHEEN\n\n\t\tsheenSpecular += irradiance * material.sheenColor * IBLSheenBRDF( geometry.normal, geometry.viewDir, material.sheenRoughness );\n\n\t#endif\n\n\t// Both indirect specular and indirect diffuse light accumulate here\n\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\n\tcomputeMultiscattering( geometry.normal, geometry.viewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );\n\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - ( singleScattering + multiScattering ) );\n\n\treflectedLight.indirectSpecular += radiance * singleScattering;\n\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n\n\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n\n}\n\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\n\n// ref: https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n\n}\n',lights_fragment_begin:"\n/**\n * This is a template that can be used to light a material, it uses pluggable\n * RenderEquations (RE)for specific lighting scenarios.\n *\n * Instructions for use:\n * - Ensure that both RE_Direct, RE_IndirectDiffuse and RE_IndirectSpecular are defined\n * - If you have defined an RE_IndirectSpecular, you need to also provide a Material_LightProbeLOD. <---- ???\n * - Create a material parameter that is to be passed as the third parameter to your lighting functions.\n *\n * TODO:\n * - Add area light support.\n * - Add sphere light support.\n * - Add diffuse light probe (irradiance cubemap) support.\n */\n\nGeometricContext geometry;\n\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\n\n#ifdef USE_CLEARCOAT\n\n\tgeometry.clearcoatNormal = clearcoatNormal;\n\n#endif\n\nIncidentLight directLight;\n\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\n\t\tpointLight = pointLights[ i ];\n\n\t\tgetPointLightInfo( pointLight, geometry, directLight );\n\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\n\t}\n\t#pragma unroll_loop_end\n\n#endif\n\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\n\tSpotLight spotLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\n\t\tspotLight = spotLights[ i ];\n\n\t\tgetSpotLightInfo( spotLight, geometry, directLight );\n\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\n\t}\n\t#pragma unroll_loop_end\n\n#endif\n\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\n\t\tdirectionalLight = directionalLights[ i ];\n\n\t\tgetDirectionalLightInfo( directionalLight, geometry, directLight );\n\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\n\t}\n\t#pragma unroll_loop_end\n\n#endif\n\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\n\tRectAreaLight rectAreaLight;\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\n\t}\n\t#pragma unroll_loop_end\n\n#endif\n\n#if defined( RE_IndirectDiffuse )\n\n\tvec3 iblIrradiance = vec3( 0.0 );\n\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\n\tirradiance += getLightProbeIrradiance( lightProbe, geometry.normal );\n\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry.normal );\n\n\t\t}\n\t\t#pragma unroll_loop_end\n\n\t#endif\n\n#endif\n\n#if defined( RE_IndirectSpecular )\n\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n\n#endif\n",lights_fragment_maps:"\n#if defined( RE_IndirectDiffuse )\n\n\t#ifdef USE_LIGHTMAP\n\n\t\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\n\t\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\n\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\n\t\t\tlightMapIrradiance *= PI;\n\n\t\t#endif\n\n\t\tirradiance += lightMapIrradiance;\n\n\t#endif\n\n\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\n\n\t\tiblIrradiance += getIBLIrradiance( geometry.normal );\n\n\t#endif\n\n#endif\n\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\n\tradiance += getIBLRadiance( geometry.viewDir, geometry.normal, material.roughness );\n\n\t#ifdef USE_CLEARCOAT\n\n\t\tclearcoatRadiance += getIBLRadiance( geometry.viewDir, geometry.clearcoatNormal, material.clearcoatRoughness );\n\n\t#endif\n\n#endif\n",lights_fragment_end:"\n#if defined( RE_IndirectDiffuse )\n\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n\n#endif\n\n#if defined( RE_IndirectSpecular )\n\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometry, material, reflectedLight );\n\n#endif\n",logdepthbuf_fragment:"\n#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\n\t// Doing a strict comparison with == 1.0 can cause noise artifacts\n\t// on some platforms. See issue #17623.\n\tgl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n\n#endif\n",logdepthbuf_pars_fragment:"\n#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n\n#endif\n",logdepthbuf_pars_vertex:"\n#ifdef USE_LOGDEPTHBUF\n\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\n\t\tvarying float vFragDepth;\n\t\tvarying float vIsPerspective;\n\n\t#else\n\n\t\tuniform float logDepthBufFC;\n\n\t#endif\n\n#endif\n",logdepthbuf_vertex:"\n#ifdef USE_LOGDEPTHBUF\n\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\n\n\t#else\n\n\t\tif ( isPerspectiveMatrix( projectionMatrix ) ) {\n\n\t\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\n\t\t\tgl_Position.z *= gl_Position.w;\n\n\t\t}\n\n\t#endif\n\n#endif\n",map_fragment:"\n#ifdef USE_MAP\n\n\tvec4 sampledDiffuseColor = texture2D( map, vUv );\n\n\t#ifdef DECODE_VIDEO_TEXTURE\n\n\t\t// inline sRGB decode (TODO: Remove this code when https://crbug.com/1256340 is solved)\n\n\t\tsampledDiffuseColor = vec4( mix( pow( sampledDiffuseColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), sampledDiffuseColor.rgb * 0.0773993808, vec3( lessThanEqual( sampledDiffuseColor.rgb, vec3( 0.04045 ) ) ) ), sampledDiffuseColor.w );\n\n\t#endif\n\n\tdiffuseColor *= sampledDiffuseColor;\n\n#endif\n",map_pars_fragment:"\n#ifdef USE_MAP\n\n\tuniform sampler2D map;\n\n#endif\n",map_particle_fragment:"\n#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\n\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n\n#endif\n\n#ifdef USE_MAP\n\n\tdiffuseColor *= texture2D( map, uv );\n\n#endif\n\n#ifdef USE_ALPHAMAP\n\n\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\n\n#endif\n",map_particle_pars_fragment:"\n#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\n\tuniform mat3 uvTransform;\n\n#endif\n\n#ifdef USE_MAP\n\n\tuniform sampler2D map;\n\n#endif\n\n#ifdef USE_ALPHAMAP\n\n\tuniform sampler2D alphaMap;\n\n#endif\n",metalnessmap_fragment:"\nfloat metalnessFactor = metalness;\n\n#ifdef USE_METALNESSMAP\n\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\n\t// reads channel B, compatible with a combined OcclusionRoughnessMetallic (RGB) texture\n\tmetalnessFactor *= texelMetalness.b;\n\n#endif\n",metalnessmap_pars_fragment:"\n#ifdef USE_METALNESSMAP\n\n\tuniform sampler2D metalnessMap;\n\n#endif\n",morphnormal_vertex:"\n#ifdef USE_MORPHNORMALS\n\n\t// morphTargetBaseInfluence is set based on BufferGeometry.morphTargetsRelative value:\n\t// When morphTargetsRelative is false, this is set to 1 - sum(influences); this results in normal = sum((target - base) * influence)\n\t// When morphTargetsRelative is true, this is set to 1; as a result, all morph targets are simply added to the base after weighting\n\tobjectNormal *= morphTargetBaseInfluence;\n\n\t#ifdef MORPHTARGETS_TEXTURE\n\n\t\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1, 2 ) * morphTargetInfluences[ i ];\n\n\t\t}\n\n\t#else\n\n\t\tobjectNormal += morphNormal0 * morphTargetInfluences[ 0 ];\n\t\tobjectNormal += morphNormal1 * morphTargetInfluences[ 1 ];\n\t\tobjectNormal += morphNormal2 * morphTargetInfluences[ 2 ];\n\t\tobjectNormal += morphNormal3 * morphTargetInfluences[ 3 ];\n\n\t#endif\n\n#endif\n",morphtarget_pars_vertex:"\n#ifdef USE_MORPHTARGETS\n\n\tuniform float morphTargetBaseInfluence;\n\n\t#ifdef MORPHTARGETS_TEXTURE\n\n\t\tuniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];\n\t\tuniform sampler2DArray morphTargetsTexture;\n\t\tuniform vec2 morphTargetsTextureSize;\n\n\t\tvec3 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset, const in int stride ) {\n\n\t\t\tfloat texelIndex = float( vertexIndex * stride + offset );\n\t\t\tfloat y = floor( texelIndex / morphTargetsTextureSize.x );\n\t\t\tfloat x = texelIndex - y * morphTargetsTextureSize.x;\n\n\t\t\tvec3 morphUV = vec3( ( x + 0.5 ) / morphTargetsTextureSize.x, y / morphTargetsTextureSize.y, morphTargetIndex );\n\t\t\treturn texture( morphTargetsTexture, morphUV ).xyz;\n\n\t\t}\n\n\t#else\n\n\t\t#ifndef USE_MORPHNORMALS\n\n\t\t\tuniform float morphTargetInfluences[ 8 ];\n\n\t\t#else\n\n\t\t\tuniform float morphTargetInfluences[ 4 ];\n\n\t\t#endif\n\n\t#endif\n\n#endif\n",morphtarget_vertex:"\n#ifdef USE_MORPHTARGETS\n\n\t// morphTargetBaseInfluence is set based on BufferGeometry.morphTargetsRelative value:\n\t// When morphTargetsRelative is false, this is set to 1 - sum(influences); this results in position = sum((target - base) * influence)\n\t// When morphTargetsRelative is true, this is set to 1; as a result, all morph targets are simply added to the base after weighting\n\ttransformed *= morphTargetBaseInfluence;\n\n\t#ifdef MORPHTARGETS_TEXTURE\n\n\t\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\n\t\t\t#ifndef USE_MORPHNORMALS\n\n\t\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0, 1 ) * morphTargetInfluences[ i ];\n\n\t\t\t#else\n\n\t\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0, 2 ) * morphTargetInfluences[ i ];\n\n\t\t\t#endif\n\n\t\t}\n\n\t#else\n\n\t\ttransformed += morphTarget0 * morphTargetInfluences[ 0 ];\n\t\ttransformed += morphTarget1 * morphTargetInfluences[ 1 ];\n\t\ttransformed += morphTarget2 * morphTargetInfluences[ 2 ];\n\t\ttransformed += morphTarget3 * morphTargetInfluences[ 3 ];\n\n\t\t#ifndef USE_MORPHNORMALS\n\n\t\t\ttransformed += morphTarget4 * morphTargetInfluences[ 4 ];\n\t\t\ttransformed += morphTarget5 * morphTargetInfluences[ 5 ];\n\t\t\ttransformed += morphTarget6 * morphTargetInfluences[ 6 ];\n\t\t\ttransformed += morphTarget7 * morphTargetInfluences[ 7 ];\n\n\t\t#endif\n\n\t#endif\n\n#endif\n",normal_fragment_begin:"\nfloat faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\n\n#ifdef FLAT_SHADED\n\n\t// Workaround for Adreno GPUs not able to do dFdx( vViewPosition )\n\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n\n#else\n\n\tvec3 normal = normalize( vNormal );\n\n\t#ifdef DOUBLE_SIDED\n\n\t\tnormal = normal * faceDirection;\n\n\t#endif\n\n\t#ifdef USE_TANGENT\n\n\t\tvec3 tangent = normalize( vTangent );\n\t\tvec3 bitangent = normalize( vBitangent );\n\n\t\t#ifdef DOUBLE_SIDED\n\n\t\t\ttangent = tangent * faceDirection;\n\t\t\tbitangent = bitangent * faceDirection;\n\n\t\t#endif\n\n\t\t#if defined( TANGENTSPACE_NORMALMAP ) || defined( USE_CLEARCOAT_NORMALMAP )\n\n\t\t\tmat3 vTBN = mat3( tangent, bitangent, normal );\n\n\t\t#endif\n\n\t#endif\n\n#endif\n\n// non perturbed normal for clearcoat among others\n\nvec3 geometryNormal = normal;\n\n",normal_fragment_maps:"\n\n#ifdef OBJECTSPACE_NORMALMAP\n\n\tnormal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0; // overrides both flatShading and attribute normals\n\n\t#ifdef FLIP_SIDED\n\n\t\tnormal = - normal;\n\n\t#endif\n\n\t#ifdef DOUBLE_SIDED\n\n\t\tnormal = normal * faceDirection;\n\n\t#endif\n\n\tnormal = normalize( normalMatrix * normal );\n\n#elif defined( TANGENTSPACE_NORMALMAP )\n\n\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\tmapN.xy *= normalScale;\n\n\t#ifdef USE_TANGENT\n\n\t\tnormal = normalize( vTBN * mapN );\n\n\t#else\n\n\t\tnormal = perturbNormal2Arb( - vViewPosition, normal, mapN, faceDirection );\n\n\t#endif\n\n#elif defined( USE_BUMPMAP )\n\n\tnormal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\n\n#endif\n",normal_pars_fragment:"\n#ifndef FLAT_SHADED\n\n\tvarying vec3 vNormal;\n\n\t#ifdef USE_TANGENT\n\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\n\t#endif\n\n#endif\n",normal_pars_vertex:"\n#ifndef FLAT_SHADED\n\n\tvarying vec3 vNormal;\n\n\t#ifdef USE_TANGENT\n\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\n\t#endif\n\n#endif\n",normal_vertex:"\n#ifndef FLAT_SHADED // normal is computed with derivatives when FLAT_SHADED\n\n\tvNormal = normalize( transformedNormal );\n\n\t#ifdef USE_TANGENT\n\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\n\t#endif\n\n#endif\n",normalmap_pars_fragment:"\n#ifdef USE_NORMALMAP\n\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n\n#endif\n\n#ifdef OBJECTSPACE_NORMALMAP\n\n\tuniform mat3 normalMatrix;\n\n#endif\n\n#if ! defined ( USE_TANGENT ) && ( defined ( TANGENTSPACE_NORMALMAP ) || defined ( USE_CLEARCOAT_NORMALMAP ) )\n\n\t// Normal Mapping Without Precomputed Tangents\n\t// http://www.thetenthplanet.de/archives/1180\n\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm, vec3 mapN, float faceDirection ) {\n\n\t\t// Workaround for Adreno 3XX dFd*( vec3 ) bug. See #9988\n\n\t\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\n\t\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\n\t\tvec3 N = surf_norm; // normalized\n\n\t\tvec3 q1perp = cross( q1, N );\n\t\tvec3 q0perp = cross( N, q0 );\n\n\t\tvec3 T = q1perp * st0.x + q0perp * st1.x;\n\t\tvec3 B = q1perp * st0.y + q0perp * st1.y;\n\n\t\tfloat det = max( dot( T, T ), dot( B, B ) );\n\t\tfloat scale = ( det == 0.0 ) ? 0.0 : faceDirection * inversesqrt( det );\n\n\t\treturn normalize( T * ( mapN.x * scale ) + B * ( mapN.y * scale ) + N * mapN.z );\n\n\t}\n\n#endif\n",clearcoat_normal_fragment_begin:"\n#ifdef USE_CLEARCOAT\n\n\tvec3 clearcoatNormal = geometryNormal;\n\n#endif\n",clearcoat_normal_fragment_maps:"\n#ifdef USE_CLEARCOAT_NORMALMAP\n\n\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vUv ).xyz * 2.0 - 1.0;\n\tclearcoatMapN.xy *= clearcoatNormalScale;\n\n\t#ifdef USE_TANGENT\n\n\t\tclearcoatNormal = normalize( vTBN * clearcoatMapN );\n\n\t#else\n\n\t\tclearcoatNormal = perturbNormal2Arb( - vViewPosition, clearcoatNormal, clearcoatMapN, faceDirection );\n\n\t#endif\n\n#endif\n",clearcoat_pars_fragment:"\n\n#ifdef USE_CLEARCOATMAP\n\n\tuniform sampler2D clearcoatMap;\n\n#endif\n\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\n\tuniform sampler2D clearcoatRoughnessMap;\n\n#endif\n\n#ifdef USE_CLEARCOAT_NORMALMAP\n\n\tuniform sampler2D clearcoatNormalMap;\n\tuniform vec2 clearcoatNormalScale;\n\n#endif\n",output_fragment:"\n#ifdef OPAQUE\ndiffuseColor.a = 1.0;\n#endif\n\n// https://github.com/mrdoob/three.js/pull/22425\n#ifdef USE_TRANSMISSION\ndiffuseColor.a *= transmissionAlpha + 0.1;\n#endif\n\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );\n",packing:"\nvec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\n\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\n\nconst float PackUpscale = 256. / 255.; // fraction -> 0..1 (including 1)\nconst float UnpackDownscale = 255. / 256.; // 0..1 -> fraction (excluding 1)\n\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\n\nconst float ShiftRight8 = 1. / 256.;\n\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8; // tidy overflow\n\treturn r * PackUpscale;\n}\n\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\n\nvec4 pack2HalfToRGBA( vec2 v ) {\n\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) );\n\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w );\n}\n\nvec2 unpackRGBATo2Half( vec4 v ) {\n\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\n}\n\n// NOTE: viewZ/eyeZ is < 0 when in front of the camera per OpenGL conventions\n\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\n\n// NOTE: https://twitter.com/gonnavis/status/1377183786949959682\n\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}\n",premultiplied_alpha_fragment:"\n#ifdef PREMULTIPLIED_ALPHA\n\n\t// Get get normal blending with premultipled, use with CustomBlending, OneFactor, OneMinusSrcAlphaFactor, AddEquation.\n\tgl_FragColor.rgb *= gl_FragColor.a;\n\n#endif\n",project_vertex:"\nvec4 mvPosition = vec4( transformed, 1.0 );\n\n#ifdef USE_INSTANCING\n\n\tmvPosition = instanceMatrix * mvPosition;\n\n#endif\n\nmvPosition = modelViewMatrix * mvPosition;\n\ngl_Position = projectionMatrix * mvPosition;\n",dithering_fragment:"\n#ifdef DITHERING\n\n\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\n\n#endif\n",dithering_pars_fragment:"\n#ifdef DITHERING\n\n\t// based on https://www.shadertoy.com/view/MslGR8\n\tvec3 dithering( vec3 color ) {\n\t\t//Calculate grid position\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\n\t\t//Shift the individual colors differently, thus making it even harder to see the dithering pattern\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\n\t\t//modify shift acording to grid position.\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\n\t\t//shift the color by dither_shift\n\t\treturn color + dither_shift_RGB;\n\t}\n\n#endif\n",roughnessmap_fragment:"\nfloat roughnessFactor = roughness;\n\n#ifdef USE_ROUGHNESSMAP\n\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\n\t// reads channel G, compatible with a combined OcclusionRoughnessMetallic (RGB) texture\n\troughnessFactor *= texelRoughness.g;\n\n#endif\n",roughnessmap_pars_fragment:"\n#ifdef USE_ROUGHNESSMAP\n\n\tuniform sampler2D roughnessMap;\n\n#endif\n",shadowmap_pars_fragment:"\n#ifdef USE_SHADOWMAP\n\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\n\t#endif\n\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\n\t#endif\n\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\n\t#endif\n\n\t/*\n\t#if NUM_RECT_AREA_LIGHTS > 0\n\n\t\t// TODO (abelnation): create uniforms for area light shadows\n\n\t#endif\n\t*/\n\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\n\t}\n\n\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\n\n\t\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\n\n\t}\n\n\tfloat VSMShadow (sampler2D shadow, vec2 uv, float compare ){\n\n\t\tfloat occlusion = 1.0;\n\n\t\tvec2 distribution = texture2DDistribution( shadow, uv );\n\n\t\tfloat hard_shadow = step( compare , distribution.x ); // Hard Shadow\n\n\t\tif (hard_shadow != 1.0 ) {\n\n\t\t\tfloat distance = compare - distribution.x ;\n\t\t\tfloat variance = max( 0.00000, distribution.y * distribution.y );\n\t\t\tfloat softness_probability = variance / (variance + distance * distance ); // Chebeyshevs inequality\n\t\t\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 ); // 0.3 reduces light bleed\n\t\t\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\n\n\t\t}\n\t\treturn occlusion;\n\n\t}\n\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\n\t\tfloat shadow = 1.0;\n\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\n\t\t// if ( something && something ) breaks ATI OpenGL shader compiler\n\t\t// if ( all( something, something ) ) using this instead\n\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\n\t\tbool frustumTest = all( frustumTestVec );\n\n\t\tif ( frustumTest ) {\n\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tfloat dx2 = dx0 / 2.0;\n\t\t\tfloat dy2 = dy0 / 2.0;\n\t\t\tfloat dx3 = dx1 / 2.0;\n\t\t\tfloat dy3 = dy1 / 2.0;\n\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 17.0 );\n\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx = texelSize.x;\n\t\t\tfloat dy = texelSize.y;\n\n\t\t\tvec2 uv = shadowCoord.xy;\n\t\t\tvec2 f = fract( uv * shadowMapSize + 0.5 );\n\t\t\tuv -= f * texelSize;\n\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ), \n\t\t\t\t\t\t  texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t  f.x ),\n\t\t\t\t\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ), \n\t\t\t\t\t\t  texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t  f.x ),\n\t\t\t\t\t f.y )\n\t\t\t) * ( 1.0 / 9.0 );\n\n\t\t#elif defined( SHADOWMAP_TYPE_VSM )\n\n\t\t\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\n\n\t\t#else // no percentage-closer filtering:\n\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\n\t\t#endif\n\n\t\t}\n\n\t\treturn shadow;\n\n\t}\n\n\t// cubeToUV() maps a 3D direction vector suitable for cube texture mapping to a 2D\n\t// vector suitable for 2D texture mapping. This code uses the following layout for the\n\t// 2D texture:\n\t//\n\t// xzXZ\n\t//  y Y\n\t//\n\t// Y - Positive y direction\n\t// y - Negative y direction\n\t// X - Positive x direction\n\t// x - Negative x direction\n\t// Z - Positive z direction\n\t// z - Negative z direction\n\t//\n\t// Source and test bed:\n\t// https://gist.github.com/tschw/da10c43c467ce8afd0c4\n\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\n\t\t// Number of texels to avoid at the edge of each square\n\n\t\tvec3 absV = abs( v );\n\n\t\t// Intersect unit cube\n\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\n\t\t// Apply scale to avoid seams\n\n\t\t// two texels less per square (one texel will do for NEAREST)\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\n\t\t// Unwrap\n\n\t\t// space: -1 ... 1 range for each square\n\t\t//\n\t\t// #X##\t\tdim    := ( 4 , 2 )\n\t\t//  # #\t\tcenter := ( 1 , 1 )\n\n\t\tvec2 planar = v.xy;\n\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\n\t\tif ( absV.z >= almostOne ) {\n\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\n\t\t} else if ( absV.x >= almostOne ) {\n\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\n\t\t} else if ( absV.y >= almostOne ) {\n\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\n\t\t}\n\n\t\t// Transform to UV space\n\n\t\t// scale := 0.5 / dim\n\t\t// translate := ( center + 0.5 ) / dim\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\n\t}\n\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\n\t\t// for point lights, the uniform @vShadowCoord is re-purposed to hold\n\t\t// the vector from the light to the world-space position of the fragment.\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\n\t\t// dp = normalized distance from light to fragment position\n\t\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear ); // need to clamp?\n\t\tdp += shadowBias;\n\n\t\t// bd3D = base direction 3D\n\t\tvec3 bd3D = normalize( lightToPosition );\n\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\n\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\n\t\t#else // no percentage-closer filtering\n\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\n\t\t#endif\n\n\t}\n\n#endif\n",shadowmap_pars_vertex:"\n#ifdef USE_SHADOWMAP\n\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\n\t#endif\n\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\n\t#endif\n\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\n\t#endif\n\n\t/*\n\t#if NUM_RECT_AREA_LIGHTS > 0\n\n\t\t// TODO (abelnation): uniforms for area light shadows\n\n\t#endif\n\t*/\n\n#endif\n",shadowmap_vertex:"\n#ifdef USE_SHADOWMAP\n\n\t#if NUM_DIR_LIGHT_SHADOWS > 0 || NUM_SPOT_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0\n\n\t\t// Offsetting the position used for querying occlusion along the world normal can be used to reduce shadow acne.\n\t\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\tvec4 shadowWorldPosition;\n\n\t#endif\n\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\n\n\t}\n\t#pragma unroll_loop_end\n\n\t#endif\n\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * shadowWorldPosition;\n\n\t}\n\t#pragma unroll_loop_end\n\n\t#endif\n\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\n\n\t}\n\t#pragma unroll_loop_end\n\n\t#endif\n\n\t/*\n\t#if NUM_RECT_AREA_LIGHTS > 0\n\n\t\t// TODO (abelnation): update vAreaShadowCoord with area light info\n\n\t#endif\n\t*/\n\n#endif\n",shadowmask_pars_fragment:"\nfloat getShadowMask() {\n\n\tfloat shadow = 1.0;\n\n\t#ifdef USE_SHADOWMAP\n\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\n\tDirectionalLightShadow directionalLight;\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\n\t\tdirectionalLight = directionalLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\n\t}\n\t#pragma unroll_loop_end\n\n\t#endif\n\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\n\tSpotLightShadow spotLight;\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\n\t\tspotLight = spotLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\n\t}\n\t#pragma unroll_loop_end\n\n\t#endif\n\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\n\tPointLightShadow pointLight;\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\n\t\tpointLight = pointLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\n\t}\n\t#pragma unroll_loop_end\n\n\t#endif\n\n\t/*\n\t#if NUM_RECT_AREA_LIGHTS > 0\n\n\t\t// TODO (abelnation): update shadow for Area light\n\n\t#endif\n\t*/\n\n\t#endif\n\n\treturn shadow;\n\n}\n",skinbase_vertex:"\n#ifdef USE_SKINNING\n\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n\n#endif\n",skinning_pars_vertex:"\n#ifdef USE_SKINNING\n\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\n\t#ifdef BONE_TEXTURE\n\n\t\tuniform highp sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\n\t\tmat4 getBoneMatrix( const in float i ) {\n\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\t\tfloat y = floor( j / float( boneTextureSize ) );\n\n\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\n\n\t\t\ty = dy * ( y + 0.5 );\n\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\n\t\t\treturn bone;\n\n\t\t}\n\n\t#else\n\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\n\t\tmat4 getBoneMatrix( const in float i ) {\n\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\n\t\t}\n\n\t#endif\n\n#endif\n",skinning_vertex:"\n#ifdef USE_SKINNING\n\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n\n#endif\n",skinnormal_vertex:"\n#ifdef USE_SKINNING\n\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\n\t#ifdef USE_TANGENT\n\n\t\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\n\t#endif\n\n#endif\n",specularmap_fragment:"\nfloat specularStrength;\n\n#ifdef USE_SPECULARMAP\n\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n\n#else\n\n\tspecularStrength = 1.0;\n\n#endif\n",specularmap_pars_fragment:"\n#ifdef USE_SPECULARMAP\n\n\tuniform sampler2D specularMap;\n\n#endif\n",tonemapping_fragment:"\n#if defined( TONE_MAPPING )\n\n\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n\n#endif\n",tonemapping_pars_fragment:"\n#ifndef saturate\n// <common> may have defined saturate() already\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\n\nuniform float toneMappingExposure;\n\n// exposure only\nvec3 LinearToneMapping( vec3 color ) {\n\n\treturn toneMappingExposure * color;\n\n}\n\n// source: https://www.cs.utah.edu/docs/techreports/2002/pdf/UUCS-02-001.pdf\nvec3 ReinhardToneMapping( vec3 color ) {\n\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n\n}\n\n// source: http://filmicworlds.com/blog/filmic-tonemapping-operators/\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\n\t// optimized filmic operator by Jim Hejl and Richard Burgess-Dawson\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n\n}\n\n// source: https://github.com/selfshadow/ltc_code/blob/master/webgl/shaders/ltc/ltc_blit.fs\nvec3 RRTAndODTFit( vec3 v ) {\n\n\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\n\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\n\treturn a / b;\n\n}\n\n// this implementation of ACES is modified to accommodate a brighter viewing environment.\n// the scale factor of 1/0.6 is subjective. see discussion in #19621.\n\nvec3 ACESFilmicToneMapping( vec3 color ) {\n\n\t// sRGB => XYZ => D65_2_D60 => AP1 => RRT_SAT\n\tconst mat3 ACESInputMat = mat3(\n\t\tvec3( 0.59719, 0.07600, 0.02840 ), // transposed from source\n\t\tvec3( 0.35458, 0.90834, 0.13383 ),\n\t\tvec3( 0.04823, 0.01566, 0.83777 )\n\t);\n\n\t// ODT_SAT => XYZ => D60_2_D65 => sRGB\n\tconst mat3 ACESOutputMat = mat3(\n\t\tvec3(  1.60475, -0.10208, -0.00327 ), // transposed from source\n\t\tvec3( -0.53108,  1.10813, -0.07276 ),\n\t\tvec3( -0.07367, -0.00605,  1.07602 )\n\t);\n\n\tcolor *= toneMappingExposure / 0.6;\n\n\tcolor = ACESInputMat * color;\n\n\t// Apply RRT and ODT\n\tcolor = RRTAndODTFit( color );\n\n\tcolor = ACESOutputMat * color;\n\n\t// Clamp to [0, 1]\n\treturn saturate( color );\n\n}\n\nvec3 CustomToneMapping( vec3 color ) { return color; }\n",transmission_fragment:"\n#ifdef USE_TRANSMISSION\n\n\tfloat transmissionAlpha = 1.0;\n\tfloat transmissionFactor = transmission;\n\tfloat thicknessFactor = thickness;\n\n\t#ifdef USE_TRANSMISSIONMAP\n\n\t\ttransmissionFactor *= texture2D( transmissionMap, vUv ).r;\n\n\t#endif\n\n\t#ifdef USE_THICKNESSMAP\n\n\t\tthicknessFactor *= texture2D( thicknessMap, vUv ).g;\n\n\t#endif\n\n\tvec3 pos = vWorldPosition;\n\tvec3 v = normalize( cameraPosition - pos );\n\tvec3 n = inverseTransformDirection( normal, viewMatrix );\n\n\tvec4 transmission = getIBLVolumeRefraction(\n\t\tn, v, roughnessFactor, material.diffuseColor, material.specularColor, material.specularF90,\n\t\tpos, modelMatrix, viewMatrix, projectionMatrix, ior, thicknessFactor,\n\t\tattenuationColor, attenuationDistance );\n\n\ttotalDiffuse = mix( totalDiffuse, transmission.rgb, transmissionFactor );\n\ttransmissionAlpha = mix( transmissionAlpha, transmission.a, transmissionFactor );\n#endif\n",transmission_pars_fragment:"\n#ifdef USE_TRANSMISSION\n\n\t// Transmission code is based on glTF-Sampler-Viewer\n\t// https://github.com/KhronosGroup/glTF-Sample-Viewer\n\n\tuniform float transmission;\n\tuniform float thickness;\n\tuniform float attenuationDistance;\n\tuniform vec3 attenuationColor;\n\n\t#ifdef USE_TRANSMISSIONMAP\n\n\t\tuniform sampler2D transmissionMap;\n\n\t#endif\n\n\t#ifdef USE_THICKNESSMAP\n\n\t\tuniform sampler2D thicknessMap;\n\n\t#endif\n\n\tuniform vec2 transmissionSamplerSize;\n\tuniform sampler2D transmissionSamplerMap;\n\n\tuniform mat4 modelMatrix;\n\tuniform mat4 projectionMatrix;\n\n\tvarying vec3 vWorldPosition;\n\n\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\n\n\t\t// Direction of refracted light.\n\t\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\n\n\t\t// Compute rotation-independant scaling of the model matrix.\n\t\tvec3 modelScale;\n\t\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\n\t\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\n\t\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\n\n\t\t// The thickness is specified in local space.\n\t\treturn normalize( refractionVector ) * thickness * modelScale;\n\n\t}\n\n\tfloat applyIorToRoughness( const in float roughness, const in float ior ) {\n\n\t\t// Scale roughness with IOR so that an IOR of 1.0 results in no microfacet refraction and\n\t\t// an IOR of 1.5 results in the default amount of microfacet refraction.\n\t\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\n\n\t}\n\n\tvec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\n\n\t\tfloat framebufferLod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\n\n\t\t#ifdef TEXTURE_LOD_EXT\n\n\t\t\treturn texture2DLodEXT( transmissionSamplerMap, fragCoord.xy, framebufferLod );\n\n\t\t#else\n\n\t\t\treturn texture2D( transmissionSamplerMap, fragCoord.xy, framebufferLod );\n\n\t\t#endif\n\n\t}\n\n\tvec3 applyVolumeAttenuation( const in vec3 radiance, const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\n\n\t\tif ( attenuationDistance == 0.0 ) {\n\n\t\t\t// Attenuation distance is +∞ (which we indicate by zero), i.e. the transmitted color is not attenuated at all.\n\t\t\treturn radiance;\n\n\t\t} else {\n\n\t\t\t// Compute light attenuation using Beer's law.\n\t\t\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\n\t\t\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance ); // Beer's law\n\t\t\treturn transmittance * radiance;\n\n\t\t}\n\n\t}\n\n\tvec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\n\t\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\n\t\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float ior, const in float thickness,\n\t\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\n\n\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\n\t\tvec3 refractedRayExit = position + transmissionRay;\n\n\t\t// Project refracted vector on the framebuffer, while mapping to normalized device coordinates.\n\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\trefractionCoords += 1.0;\n\t\trefractionCoords /= 2.0;\n\n\t\t// Sample framebuffer to get pixel the refracted ray hits.\n\t\tvec4 transmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\n\n\t\tvec3 attenuatedColor = applyVolumeAttenuation( transmittedLight.rgb, length( transmissionRay ), attenuationColor, attenuationDistance );\n\n\t\t// Get the specular component.\n\t\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\n\n\t\treturn vec4( ( 1.0 - F ) * attenuatedColor * diffuseColor, transmittedLight.a );\n\n\t}\n#endif\n",uv_pars_fragment:"\n#if ( defined( USE_UV ) && ! defined( UVS_VERTEX_ONLY ) )\n\n\tvarying vec2 vUv;\n\n#endif\n",uv_pars_vertex:"\n#ifdef USE_UV\n\n\t#ifdef UVS_VERTEX_ONLY\n\n\t\tvec2 vUv;\n\n\t#else\n\n\t\tvarying vec2 vUv;\n\n\t#endif\n\n\tuniform mat3 uvTransform;\n\n#endif\n",uv_vertex:"\n#ifdef USE_UV\n\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\n#endif\n",uv2_pars_fragment:"\n#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\n\tvarying vec2 vUv2;\n\n#endif\n",uv2_pars_vertex:"\n#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n\n\tuniform mat3 uv2Transform;\n\n#endif\n",uv2_vertex:"\n#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\n\tvUv2 = ( uv2Transform * vec3( uv2, 1 ) ).xy;\n\n#endif\n",worldpos_vertex:"\n#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION )\n\n\tvec4 worldPosition = vec4( transformed, 1.0 );\n\n\t#ifdef USE_INSTANCING\n\n\t\tworldPosition = instanceMatrix * worldPosition;\n\n\t#endif\n\n\tworldPosition = modelMatrix * worldPosition;\n\n#endif\n",background_vert:"\nvarying vec2 vUv;\nuniform mat3 uvTransform;\n\nvoid main() {\n\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\n\tgl_Position = vec4( position.xy, 1.0, 1.0 );\n\n}\n",background_frag:"\nuniform sampler2D t2D;\n\nvarying vec2 vUv;\n\nvoid main() {\n\n\tgl_FragColor = texture2D( t2D, vUv );\n\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\n}\n",cube_vert:"\nvarying vec3 vWorldDirection;\n\n#include <common>\n\nvoid main() {\n\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\n\tgl_Position.z = gl_Position.w; // set z to camera.far\n\n}\n",cube_frag:"\n#include <envmap_common_pars_fragment>\nuniform float opacity;\n\nvarying vec3 vWorldDirection;\n\n#include <cube_uv_reflection_fragment>\n\nvoid main() {\n\n\tvec3 vReflect = vWorldDirection;\n\t#include <envmap_fragment>\n\n\tgl_FragColor = envColor;\n\tgl_FragColor.a *= opacity;\n\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\n}\n",depth_vert:"\n#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\n// This is used for computing an equivalent of gl_FragCoord.z that is as high precision as possible.\n// Some platforms compute gl_FragCoord at a lower precision which makes the manually computed value better for\n// depth-based postprocessing effects. Reproduced on iPad with A10 processor / iPadOS 13.3.1.\nvarying vec2 vHighPrecisionZW;\n\nvoid main() {\n\n\t#include <uv_vertex>\n\n\t#include <skinbase_vertex>\n\n\t#ifdef USE_DISPLACEMENTMAP\n\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\n\t#endif\n\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\n\tvHighPrecisionZW = gl_Position.zw;\n\n}\n",depth_frag:"\n#if DEPTH_PACKING == 3200\n\n\tuniform float opacity;\n\n#endif\n\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvarying vec2 vHighPrecisionZW;\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( 1.0 );\n\n\t#if DEPTH_PACKING == 3200\n\n\t\tdiffuseColor.a = opacity;\n\n\t#endif\n\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\n\t#include <logdepthbuf_fragment>\n\n\t// Higher precision equivalent of gl_FragCoord.z. This assumes depthRange has been left to its default values.\n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\n\t#if DEPTH_PACKING == 3200\n\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\n\n\t#elif DEPTH_PACKING == 3201\n\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\n\t#endif\n\n}\n",distanceRGBA_vert:"\n#define DISTANCE\n\nvarying vec3 vWorldPosition;\n\n#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\nvoid main() {\n\n\t#include <uv_vertex>\n\n\t#include <skinbase_vertex>\n\n\t#ifdef USE_DISPLACEMENTMAP\n\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\n\t#endif\n\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\n\tvWorldPosition = worldPosition.xyz;\n\n}\n",distanceRGBA_frag:"\n#define DISTANCE\n\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvoid main () {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( 1.0 );\n\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist ); // clamp to [ 0, 1 ]\n\n\tgl_FragColor = packDepthToRGBA( dist );\n\n}\n",equirect_vert:"\nvarying vec3 vWorldDirection;\n\n#include <common>\n\nvoid main() {\n\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\n}\n",equirect_frag:"\nuniform sampler2D tEquirect;\n\nvarying vec3 vWorldDirection;\n\n#include <common>\n\nvoid main() {\n\n\tvec3 direction = normalize( vWorldDirection );\n\n\tvec2 sampleUV = equirectUv( direction );\n\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\n}\n",linedashed_vert:"\nuniform float scale;\nattribute float lineDistance;\n\nvarying float vLineDistance;\n\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\nvoid main() {\n\n\tvLineDistance = scale * lineDistance;\n\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n\n}\n",linedashed_frag:"\nuniform vec3 diffuse;\nuniform float opacity;\n\nuniform float dashSize;\nuniform float totalSize;\n\nvarying float vLineDistance;\n\n#include <common>\n#include <color_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\n\t\tdiscard;\n\n\t}\n\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\n\t#include <logdepthbuf_fragment>\n\t#include <color_fragment>\n\n\toutgoingLight = diffuseColor.rgb; // simple shader\n\n\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\n}\n",meshbasic_vert:"\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\nvoid main() {\n\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\n\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\n\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinbase_vertex>\n\t\t#include <skinnormal_vertex>\n\t\t#include <defaultnormal_vertex>\n\n\t#endif\n\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <fog_vertex>\n\n}\n",meshbasic_frag:"\nuniform vec3 diffuse;\nuniform float opacity;\n\n#ifndef FLAT_SHADED\n\n\tvarying vec3 vNormal;\n\n#endif\n\n#include <common>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <cube_uv_reflection_fragment>\n#include <fog_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\n\t// accumulation (baked indirect lighting only)\n\t#ifdef USE_LIGHTMAP\n\n\t\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\t\treflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity;\n\n\t#else\n\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\n\t#endif\n\n\t// modulation\n\t#include <aomap_fragment>\n\n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\n\t#include <envmap_fragment>\n\n\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n\n}\n",meshlambert_vert:"\n#define LAMBERT\n\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\nvoid main() {\n\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <lights_lambert_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n",meshlambert_frag:"\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n\n\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <cube_uv_reflection_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <emissivemap_fragment>\n\n\t// accumulation\n\n\t#ifdef DOUBLE_SIDED\n\n\t\treflectedLight.indirectDiffuse += ( gl_FrontFacing ) ? vIndirectFront : vIndirectBack;\n\n\t#else\n\n\t\treflectedLight.indirectDiffuse += vIndirectFront;\n\n\t#endif\n\n\t#include <lightmap_fragment>\n\n\treflectedLight.indirectDiffuse *= BRDF_Lambert( diffuseColor.rgb );\n\n\t#ifdef DOUBLE_SIDED\n\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\n\t#else\n\n\t\treflectedLight.directDiffuse = vLightFront;\n\n\t#endif\n\n\treflectedLight.directDiffuse *= BRDF_Lambert( diffuseColor.rgb ) * getShadowMask();\n\n\t// modulation\n\n\t#include <aomap_fragment>\n\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\n\t#include <envmap_fragment>\n\n\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n",meshmatcap_vert:"\n#define MATCAP\n\nvarying vec3 vViewPosition;\n\n#include <common>\n#include <uv_pars_vertex>\n#include <color_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <fog_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\nvoid main() {\n\n\t#include <uv_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n\n\tvViewPosition = - mvPosition.xyz;\n\n}\n",meshmatcap_frag:"\n#define MATCAP\n\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\n\nvarying vec3 vViewPosition;\n\n#include <common>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <fog_pars_fragment>\n#include <normal_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\n\tvec3 viewDir = normalize( vViewPosition );\n\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\n\tvec3 y = cross( viewDir, x );\n\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5; // 0.495 to remove artifacts caused by undersized matcap disks\n\n\t#ifdef USE_MATCAP\n\n\t\tvec4 matcapColor = texture2D( matcap, uv );\n\n\t#else\n\n\t\tvec4 matcapColor = vec4( vec3( mix( 0.2, 0.8, uv.y ) ), 1.0 ); // default if matcap is missing\n\n\t#endif\n\n\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\n\n\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n\n}\n",meshnormal_vert:"\n#define NORMAL\n\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\n\tvarying vec3 vViewPosition;\n\n#endif\n\n#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\nvoid main() {\n\n\t#include <uv_vertex>\n\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\n\tvViewPosition = - mvPosition.xyz;\n\n#endif\n\n}\n",meshnormal_frag:"\n#define NORMAL\n\nuniform float opacity;\n\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\n\tvarying vec3 vViewPosition;\n\n#endif\n\n#include <packing>\n#include <uv_pars_fragment>\n#include <normal_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\t#include <logdepthbuf_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n\n\t#ifdef OPAQUE\n\n\t\tgl_FragColor.a = 1.0;\n\n\t#endif\n\n}\n",meshphong_vert:"\n#define PHONG\n\nvarying vec3 vViewPosition;\n\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\nvoid main() {\n\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\n\tvViewPosition = - mvPosition.xyz;\n\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n\n}\n",meshphong_frag:"\n#define PHONG\n\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <cube_uv_reflection_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <normal_pars_fragment>\n#include <lights_phong_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\n\t// accumulation\n\t#include <lights_phong_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\n\t// modulation\n\t#include <aomap_fragment>\n\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\n\t#include <envmap_fragment>\n\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n\n}\n",meshphysical_vert:"\n#define STANDARD\n\nvarying vec3 vViewPosition;\n\n#ifdef USE_TRANSMISSION\n\n\tvarying vec3 vWorldPosition;\n\n#endif\n\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\nvoid main() {\n\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\n\tvViewPosition = - mvPosition.xyz;\n\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n\n#ifdef USE_TRANSMISSION\n\n\tvWorldPosition = worldPosition.xyz;\n\n#endif\n}\n",meshphysical_frag:"\n#define STANDARD\n\n#ifdef PHYSICAL\n\t#define IOR\n\t#define SPECULAR\n#endif\n\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n\n#ifdef IOR\n\tuniform float ior;\n#endif\n\n#ifdef SPECULAR\n\tuniform float specularIntensity;\n\tuniform vec3 specularColor;\n\n\t#ifdef USE_SPECULARINTENSITYMAP\n\t\tuniform sampler2D specularIntensityMap;\n\t#endif\n\n\t#ifdef USE_SPECULARCOLORMAP\n\t\tuniform sampler2D specularColorMap;\n\t#endif\n#endif\n\n#ifdef USE_CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n\n#ifdef USE_SHEEN\n\tuniform vec3 sheenColor;\n\tuniform float sheenRoughness;\n\n\t#ifdef USE_SHEENCOLORMAP\n\t\tuniform sampler2D sheenColorMap;\n\t#endif\n\n\t#ifdef USE_SHEENROUGHNESSMAP\n\t\tuniform sampler2D sheenRoughnessMap;\n\t#endif\n#endif\n\nvarying vec3 vViewPosition;\n\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <bsdfs>\n#include <cube_uv_reflection_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_physical_pars_fragment>\n#include <fog_pars_fragment>\n#include <lights_pars_begin>\n#include <normal_pars_fragment>\n#include <lights_physical_pars_fragment>\n#include <transmission_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <clearcoat_pars_fragment>\n#include <roughnessmap_pars_fragment>\n#include <metalnessmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <roughnessmap_fragment>\n\t#include <metalnessmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <clearcoat_normal_fragment_begin>\n\t#include <clearcoat_normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\n\t// accumulation\n\t#include <lights_physical_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\n\t// modulation\n\t#include <aomap_fragment>\n\n\tvec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\n\tvec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\n\n\t#include <transmission_fragment>\n\n\tvec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\n\n\t#ifdef USE_SHEEN\n\n\t\t// Sheen energy compensation approximation calculation can be found at the end of\n\t\t// https://drive.google.com/file/d/1T0D1VSyR4AllqIJTQAraEIzjlb5h4FKH/view?usp=sharing\n\t\tfloat sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor );\n\n\t\toutgoingLight = outgoingLight * sheenEnergyComp + sheenSpecular;\n\n\t#endif\n\n\t#ifdef USE_CLEARCOAT\n\n\t\tfloat dotNVcc = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) );\n\n\t\tvec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\n\n\t\toutgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + clearcoatSpecular * material.clearcoat;\n\n\t#endif\n\n\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n\n}\n",meshtoon_vert:"\n#define TOON\n\nvarying vec3 vViewPosition;\n\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\nvoid main() {\n\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\n\tvViewPosition = - mvPosition.xyz;\n\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n\n}\n",meshtoon_frag:"\n#define TOON\n\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <gradientmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <normal_pars_fragment>\n#include <lights_toon_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\n\t// accumulation\n\t#include <lights_toon_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\n\t// modulation\n\t#include <aomap_fragment>\n\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\n\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n\n}\n",points_vert:"\nuniform float size;\nuniform float scale;\n\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\nvoid main() {\n\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <project_vertex>\n\n\tgl_PointSize = size;\n\n\t#ifdef USE_SIZEATTENUATION\n\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\n\t#endif\n\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <fog_vertex>\n\n}\n",points_frag:"\nuniform vec3 diffuse;\nuniform float opacity;\n\n#include <common>\n#include <color_pars_fragment>\n#include <map_particle_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\n\t#include <logdepthbuf_fragment>\n\t#include <map_particle_fragment>\n\t#include <color_fragment>\n\t#include <alphatest_fragment>\n\n\toutgoingLight = diffuseColor.rgb;\n\n\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\n}\n",shadow_vert:"\n#include <common>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n\nvoid main() {\n\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n\n}\n",shadow_frag:"\nuniform vec3 color;\nuniform float opacity;\n\n#include <common>\n#include <packing>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\n\nvoid main() {\n\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\n}\n",sprite_vert:"\nuniform float rotation;\nuniform vec2 center;\n\n#include <common>\n#include <uv_pars_vertex>\n#include <fog_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\nvoid main() {\n\n\t#include <uv_vertex>\n\n\tvec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\n\n\tvec2 scale;\n\tscale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );\n\tscale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );\n\n\t#ifndef USE_SIZEATTENUATION\n\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\n\t\tif ( isPerspective ) scale *= - mvPosition.z;\n\n\t#endif\n\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\n\tmvPosition.xy += rotatedPosition;\n\n\tgl_Position = projectionMatrix * mvPosition;\n\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n\n}\n",sprite_frag:"\nuniform vec3 diffuse;\nuniform float opacity;\n\n#include <common>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\n\toutgoingLight = diffuseColor.rgb;\n\n\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\n}\n"},Vn={common:{diffuse:{value:new Re(16777215)},opacity:{value:1},map:{value:null},uvTransform:{value:new tt},uv2Transform:{value:new tt},alphaMap:{value:null},alphaTest:{value:0}},specularmap:{specularMap:{value:null}},envmap:{envMap:{value:null},flipEnvMap:{value:-1},reflectivity:{value:1},ior:{value:1.5},refractionRatio:{value:.98}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1}},emissivemap:{emissiveMap:{value:null}},bumpmap:{bumpMap:{value:null},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalScale:{value:new we(1,1)}},displacementmap:{displacementMap:{value:null},displacementScale:{value:1},displacementBias:{value:0}},roughnessmap:{roughnessMap:{value:null}},metalnessmap:{metalnessMap:{value:null}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new Re(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},spotShadowMap:{value:[]},spotShadowMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}},ltc_1:{value:null},ltc_2:{value:null}},points:{diffuse:{value:new Re(16777215)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},alphaTest:{value:0},uvTransform:{value:new tt}},sprite:{diffuse:{value:new Re(16777215)},opacity:{value:1},center:{value:new we(.5,.5)},rotation:{value:0},map:{value:null},alphaMap:{value:null},alphaTest:{value:0},uvTransform:{value:new tt}}},Hn={basic:{uniforms:Ke([Vn.common,Vn.specularmap,Vn.envmap,Vn.aomap,Vn.lightmap,Vn.fog]),vertexShader:Bn.meshbasic_vert,fragmentShader:Bn.meshbasic_frag},lambert:{uniforms:Ke([Vn.common,Vn.specularmap,Vn.envmap,Vn.aomap,Vn.lightmap,Vn.emissivemap,Vn.fog,Vn.lights,{emissive:{value:new Re(0)}}]),vertexShader:Bn.meshlambert_vert,fragmentShader:Bn.meshlambert_frag},phong:{uniforms:Ke([Vn.common,Vn.specularmap,Vn.envmap,Vn.aomap,Vn.lightmap,Vn.emissivemap,Vn.bumpmap,Vn.normalmap,Vn.displacementmap,Vn.fog,Vn.lights,{emissive:{value:new Re(0)},specular:{value:new Re(1118481)},shininess:{value:30}}]),vertexShader:Bn.meshphong_vert,fragmentShader:Bn.meshphong_frag},standard:{uniforms:Ke([Vn.common,Vn.envmap,Vn.aomap,Vn.lightmap,Vn.emissivemap,Vn.bumpmap,Vn.normalmap,Vn.displacementmap,Vn.roughnessmap,Vn.metalnessmap,Vn.fog,Vn.lights,{emissive:{value:new Re(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:Bn.meshphysical_vert,fragmentShader:Bn.meshphysical_frag},toon:{uniforms:Ke([Vn.common,Vn.aomap,Vn.lightmap,Vn.emissivemap,Vn.bumpmap,Vn.normalmap,Vn.displacementmap,Vn.gradientmap,Vn.fog,Vn.lights,{emissive:{value:new Re(0)}}]),vertexShader:Bn.meshtoon_vert,fragmentShader:Bn.meshtoon_frag},matcap:{uniforms:Ke([Vn.common,Vn.bumpmap,Vn.normalmap,Vn.displacementmap,Vn.fog,{matcap:{value:null}}]),vertexShader:Bn.meshmatcap_vert,fragmentShader:Bn.meshmatcap_frag},points:{uniforms:Ke([Vn.points,Vn.fog]),vertexShader:Bn.points_vert,fragmentShader:Bn.points_frag},dashed:{uniforms:Ke([Vn.common,Vn.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:Bn.linedashed_vert,fragmentShader:Bn.linedashed_frag},depth:{uniforms:Ke([Vn.common,Vn.displacementmap]),vertexShader:Bn.depth_vert,fragmentShader:Bn.depth_frag},normal:{uniforms:Ke([Vn.common,Vn.bumpmap,Vn.normalmap,Vn.displacementmap,{opacity:{value:1}}]),vertexShader:Bn.meshnormal_vert,fragmentShader:Bn.meshnormal_frag},sprite:{uniforms:Ke([Vn.sprite,Vn.fog]),vertexShader:Bn.sprite_vert,fragmentShader:Bn.sprite_frag},background:{uniforms:{uvTransform:{value:new tt},t2D:{value:null}},vertexShader:Bn.background_vert,fragmentShader:Bn.background_frag},cube:{uniforms:Ke([Vn.envmap,{opacity:{value:1}}]),vertexShader:Bn.cube_vert,fragmentShader:Bn.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:Bn.equirect_vert,fragmentShader:Bn.equirect_frag},distanceRGBA:{uniforms:Ke([Vn.common,Vn.displacementmap,{referencePosition:{value:new U},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:Bn.distanceRGBA_vert,fragmentShader:Bn.distanceRGBA_frag},shadow:{uniforms:Ke([Vn.lights,Vn.fog,{color:{value:new Re(0)},opacity:{value:1}}]),vertexShader:Bn.shadow_vert,fragmentShader:Bn.shadow_frag}};function Gn(t,e,n,i,r,s){const a=new Re(0);let o,l,h=!0===r?0:1,c=null,u=0,d=null;function p(t,e){n.buffers.color.setClear(t.r,t.g,t.b,e,s)}return{getClearColor:function(){return a},setClearColor:function(t,e=1){a.set(t),h=e,p(a,h)},getClearAlpha:function(){return h},setClearAlpha:function(t){h=t,p(a,h)},render:function(n,r){let s=!1,f=!0===r.isScene?r.background:null;f&&f.isTexture&&(f=e.get(f));const m=t.xr,g=m.getSession&&m.getSession();g&&"additive"===g.environmentBlendMode&&(f=null),null===f?p(a,h):f&&f.isColor&&(p(f,1),s=!0),(t.autoClear||s)&&t.clear(t.autoClearColor,t.autoClearDepth,t.autoClearStencil),f&&(f.isCubeTexture||f.mapping===bt)?(void 0===l&&(l=new Fn(new We(1,1,1),new Qe({name:"BackgroundCubeMaterial",uniforms:Ze(Hn.cube.uniforms),vertexShader:Hn.cube.vertexShader,fragmentShader:Hn.cube.fragmentShader,side:1,depthTest:!1,depthWrite:!1,fog:!1})),l.geometry.deleteAttribute("normal"),l.geometry.deleteAttribute("uv"),l.onBeforeRender=function(t,e,n){this.matrixWorld.copyPosition(n.matrixWorld)},Object.defineProperty(l.material,"envMap",{get:function(){return this.uniforms.envMap.value}}),i.update(l)),l.material.uniforms.envMap.value=f,l.material.uniforms.flipEnvMap.value=f.isCubeTexture&&!1===f.isRenderTargetTexture?-1:1,c===f&&u===f.version&&d===t.toneMapping||(l.material.needsUpdate=!0,c=f,u=f.version,d=t.toneMapping),n.unshift(l,l.geometry,l.material,0,0,null)):f&&f.isTexture&&(void 0===o&&(o=new Fn(new Xe(2,2),new Qe({name:"BackgroundMaterial",uniforms:Ze(Hn.background.uniforms),vertexShader:Hn.background.vertexShader,fragmentShader:Hn.background.fragmentShader,side:0,depthTest:!1,depthWrite:!1,fog:!1})),o.geometry.deleteAttribute("normal"),Object.defineProperty(o.material,"map",{get:function(){return this.uniforms.t2D.value}}),i.update(o)),o.material.uniforms.t2D.value=f,!0===f.matrixAutoUpdate&&f.updateMatrix(),o.material.uniforms.uvTransform.value.copy(f.matrix),c===f&&u===f.version&&d===t.toneMapping||(o.material.needsUpdate=!0,c=f,u=f.version,d=t.toneMapping),n.unshift(o,o.geometry,o.material,0,0,null))}}}function jn(t,e,n,i){const r=t.getParameter(t.MAX_VERTEX_ATTRIBS),s=i.isWebGL2?null:e.get("OES_vertex_array_object"),a=i.isWebGL2||null!==s,o={},l=d(null);let h=l;function c(e){return i.isWebGL2?t.bindVertexArray(e):s.bindVertexArrayOES(e)}function u(e){return i.isWebGL2?t.deleteVertexArray(e):s.deleteVertexArrayOES(e)}function d(t){const e=[],n=[],i=[];for(let t=0;t<r;t++)e[t]=0,n[t]=0,i[t]=0;return{geometry:null,program:null,wireframe:!1,newAttributes:e,enabledAttributes:n,attributeDivisors:i,object:t,attributes:{},index:null}}function p(){const t=h.newAttributes;for(let e=0,n=t.length;e<n;e++)t[e]=0}function f(t){m(t,0)}function m(n,r){const s=h.newAttributes,a=h.enabledAttributes,o=h.attributeDivisors;if(s[n]=1,0===a[n]&&(t.enableVertexAttribArray(n),a[n]=1),o[n]!==r){(i.isWebGL2?t:e.get("ANGLE_instanced_arrays"))[i.isWebGL2?"vertexAttribDivisor":"vertexAttribDivisorANGLE"](n,r),o[n]=r}}function g(){const e=h.newAttributes,n=h.enabledAttributes;for(let i=0,r=n.length;i<r;i++)n[i]!==e[i]&&(t.disableVertexAttribArray(i),n[i]=0)}function v(e,n,r,s,a,o){!0!==i.isWebGL2||r!==t.INT&&r!==t.UNSIGNED_INT?t.vertexAttribPointer(e,n,r,s,a,o):t.vertexAttribIPointer(e,n,r,a,o)}function x(){_(),h!==l&&(h=l,c(h.object))}function _(){l.geometry=null,l.program=null,l.wireframe=!1}return{setup:function(r,l,u,x,_){let y=!1;if(a){const e=function(e,n,r){const a=!0===r.wireframe;let l=o[e.id];void 0===l&&(l={},o[e.id]=l);let h=l[n.id];void 0===h&&(h={},l[n.id]=h);let c=h[a];void 0===c&&(c=d(i.isWebGL2?t.createVertexArray():s.createVertexArrayOES()),h[a]=c);return c}(x,u,l);h!==e&&(h=e,c(h.object)),y=function(t,e){const n=h.attributes,i=t.attributes;let r=0;for(const t in i){const e=n[t],s=i[t];if(void 0===e)return!0;if(e.attribute!==s)return!0;if(e.data!==s.data)return!0;r++}return h.attributesNum!==r||h.index!==e}(x,_),y&&function(t,e){const n={},i=t.attributes;let r=0;for(const t in i){const e=i[t],s={};s.attribute=e,e.data&&(s.data=e.data),n[t]=s,r++}h.attributes=n,h.attributesNum=r,h.index=e}(x,_)}else{const t=!0===l.wireframe;h.geometry===x.id&&h.program===u.id&&h.wireframe===t||(h.geometry=x.id,h.program=u.id,h.wireframe=t,y=!0)}!0===r.isInstancedMesh&&(y=!0),null!==_&&n.update(_,t.ELEMENT_ARRAY_BUFFER),y&&(!function(r,s,a,o){if(!1===i.isWebGL2&&(r.isInstancedMesh||o.isInstancedBufferGeometry)&&null===e.get("ANGLE_instanced_arrays"))return;p();const l=o.attributes,h=a.getAttributes(),c=s.defaultAttributeValues;for(const e in h){const i=h[e];if(i.location>=0){let s=l[e];if(void 0===s&&("instanceMatrix"===e&&r.instanceMatrix&&(s=r.instanceMatrix),"instanceColor"===e&&r.instanceColor&&(s=r.instanceColor)),void 0!==s){const e=s.normalized,a=s.itemSize,l=n.get(s);if(void 0===l)continue;const h=l.buffer,c=l.type,u=l.bytesPerElement;if(s.isInterleavedBufferAttribute){const n=s.data,l=n.stride,d=s.offset;if(n&&n.isInstancedInterleavedBuffer){for(let t=0;t<i.locationSize;t++)m(i.location+t,n.meshPerAttribute);!0!==r.isInstancedMesh&&void 0===o._maxInstanceCount&&(o._maxInstanceCount=n.meshPerAttribute*n.count)}else for(let t=0;t<i.locationSize;t++)f(i.location+t);t.bindBuffer(t.ARRAY_BUFFER,h);for(let t=0;t<i.locationSize;t++)v(i.location+t,a/i.locationSize,c,e,l*u,(d+a/i.locationSize*t)*u)}else{if(s.isInstancedBufferAttribute){for(let t=0;t<i.locationSize;t++)m(i.location+t,s.meshPerAttribute);!0!==r.isInstancedMesh&&void 0===o._maxInstanceCount&&(o._maxInstanceCount=s.meshPerAttribute*s.count)}else for(let t=0;t<i.locationSize;t++)f(i.location+t);t.bindBuffer(t.ARRAY_BUFFER,h);for(let t=0;t<i.locationSize;t++)v(i.location+t,a/i.locationSize,c,e,a*u,a/i.locationSize*t*u)}}else if(void 0!==c){const n=c[e];if(void 0!==n)switch(n.length){case 2:t.vertexAttrib2fv(i.location,n);break;case 3:t.vertexAttrib3fv(i.location,n);break;case 4:t.vertexAttrib4fv(i.location,n);break;default:t.vertexAttrib1fv(i.location,n)}}}}g()}(r,l,u,x),null!==_&&t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,n.get(_).buffer))},reset:x,resetDefaultState:_,dispose:function(){x();for(const t in o){const e=o[t];for(const t in e){const n=e[t];for(const t in n)u(n[t].object),delete n[t];delete e[t]}delete o[t]}},releaseStatesOfGeometry:function(t){if(void 0===o[t.id])return;const e=o[t.id];for(const t in e){const n=e[t];for(const t in n)u(n[t].object),delete n[t];delete e[t]}delete o[t.id]},releaseStatesOfProgram:function(t){for(const e in o){const n=o[e];if(void 0===n[t.id])continue;const i=n[t.id];for(const t in i)u(i[t].object),delete i[t];delete n[t.id]}},initAttributes:p,enableAttribute:f,disableUnusedAttributes:g}}function qn(t,e,n,i){const r=i.isWebGL2;let s;this.setMode=function(t){s=t},this.render=function(e,i){t.drawArrays(s,e,i),n.update(i,s,1)},this.renderInstances=function(i,a,o){if(0===o)return;let l,h;if(r)l=t,h="drawArraysInstanced";else if(l=e.get("ANGLE_instanced_arrays"),h="drawArraysInstancedANGLE",null===l)return void console.error("THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");l[h](s,i,a,o),n.update(a,s,o)}}function Wn(t,e,n){let i;function r(e){if("highp"===e){if(t.getShaderPrecisionFormat(t.VERTEX_SHADER,t.HIGH_FLOAT).precision>0&&t.getShaderPrecisionFormat(t.FRAGMENT_SHADER,t.HIGH_FLOAT).precision>0)return"highp";e="mediump"}return"mediump"===e&&t.getShaderPrecisionFormat(t.VERTEX_SHADER,t.MEDIUM_FLOAT).precision>0&&t.getShaderPrecisionFormat(t.FRAGMENT_SHADER,t.MEDIUM_FLOAT).precision>0?"mediump":"lowp"}const s="undefined"!=typeof WebGL2RenderingContext&&t instanceof WebGL2RenderingContext||"undefined"!=typeof WebGL2ComputeRenderingContext&&t instanceof WebGL2ComputeRenderingContext;let a=void 0!==n.precision?n.precision:"highp";const o=r(a);o!==a&&(console.warn("THREE.WebGLRenderer:",a,"not supported, using",o,"instead."),a=o);const l=s||e.has("WEBGL_draw_buffers"),h=!0===n.logarithmicDepthBuffer,c=t.getParameter(t.MAX_TEXTURE_IMAGE_UNITS),u=t.getParameter(t.MAX_VERTEX_TEXTURE_IMAGE_UNITS),d=t.getParameter(t.MAX_TEXTURE_SIZE),p=t.getParameter(t.MAX_CUBE_MAP_TEXTURE_SIZE),f=t.getParameter(t.MAX_VERTEX_ATTRIBS),m=t.getParameter(t.MAX_VERTEX_UNIFORM_VECTORS),g=t.getParameter(t.MAX_VARYING_VECTORS),v=t.getParameter(t.MAX_FRAGMENT_UNIFORM_VECTORS),x=u>0,_=s||e.has("OES_texture_float");return{isWebGL2:s,drawBuffers:l,getMaxAnisotropy:function(){if(void 0!==i)return i;if(!0===e.has("EXT_texture_filter_anisotropic")){const n=e.get("EXT_texture_filter_anisotropic");i=t.getParameter(n.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else i=0;return i},getMaxPrecision:r,precision:a,logarithmicDepthBuffer:h,maxTextures:c,maxVertexTextures:u,maxTextureSize:d,maxCubemapSize:p,maxAttributes:f,maxVertexUniforms:m,maxVaryings:g,maxFragmentUniforms:v,vertexTextures:x,floatFragmentTextures:_,floatVertexTextures:x&&_,maxSamples:s?t.getParameter(t.MAX_SAMPLES):0}}function Xn(t){const e=this;let n=null,i=0,r=!1,s=!1;const a=new me,o=new tt,l={value:null,needsUpdate:!1};function h(){l.value!==n&&(l.value=n,l.needsUpdate=i>0),e.numPlanes=i,e.numIntersection=0}function c(t,n,i,r){const s=null!==t?t.length:0;let h=null;if(0!==s){if(h=l.value,!0!==r||null===h){const e=i+4*s,r=n.matrixWorldInverse;o.getNormalMatrix(r),(null===h||h.length<e)&&(h=new Float32Array(e));for(let e=0,n=i;e!==s;++e,n+=4)a.copy(t[e]).applyMatrix4(r,o),a.normal.toArray(h,n),h[n+3]=a.constant}l.value=h,l.needsUpdate=!0}return e.numPlanes=s,e.numIntersection=0,h}this.uniform=l,this.numPlanes=0,this.numIntersection=0,this.init=function(t,e,s){const a=0!==t.length||e||0!==i||r;return r=e,n=c(t,s,0),i=t.length,a},this.beginShadows=function(){s=!0,c(null)},this.endShadows=function(){s=!1,h()},this.setState=function(e,a,o){const u=e.clippingPlanes,d=e.clipIntersection,p=e.clipShadows,f=t.get(e);if(!r||null===u||0===u.length||s&&!p)s?c(null):h();else{const t=s?0:i,e=4*t;let r=f.clippingState||null;l.value=r,r=c(u,a,e,o);for(let t=0;t!==e;++t)r[t]=n[t];f.clippingState=r,this.numIntersection=d?this.numPlanes:0,this.numPlanes+=t}}}let Yn;Hn.physical={uniforms:Ke([Hn.standard.uniforms,{clearcoat:{value:0},clearcoatMap:{value:null},clearcoatRoughness:{value:0},clearcoatRoughnessMap:{value:null},clearcoatNormalScale:{value:new we(1,1)},clearcoatNormalMap:{value:null},sheen:{value:0},sheenColor:{value:new Re(0)},sheenColorMap:{value:null},sheenRoughness:{value:1},sheenRoughnessMap:{value:null},transmission:{value:0},transmissionMap:{value:null},transmissionSamplerSize:{value:new we},transmissionSamplerMap:{value:null},thickness:{value:0},thicknessMap:{value:null},attenuationDistance:{value:0},attenuationColor:{value:new Re(0)},specularIntensity:{value:1},specularIntensityMap:{value:null},specularColor:{value:new Re(1,1,1)},specularColorMap:{value:null}}]),vertexShader:Bn.meshphysical_vert,fragmentShader:Bn.meshphysical_frag};class $n{static getDataURL(t){if(/^data:/i.test(t.src))return t.src;if("undefined"==typeof HTMLCanvasElement)return t.src;let e;if(t instanceof HTMLCanvasElement)e=t;else{void 0===Yn&&(Yn=Ne("canvas")),Yn.width=t.width,Yn.height=t.height;const n=Yn.getContext("2d");t instanceof ImageData?n.putImageData(t,0,0):n.drawImage(t,0,0,t.width,t.height),e=Yn}return e.width>2048||e.height>2048?(console.warn("THREE.ImageUtils.getDataURL: Image converted to jpg for performance reasons",t),e.toDataURL("image/jpeg",.6)):e.toDataURL("image/png")}static sRGBToLinear(t){if("undefined"!=typeof HTMLImageElement&&t instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&t instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&t instanceof ImageBitmap){const e=Ne("canvas");e.width=t.width,e.height=t.height;const n=e.getContext("2d");n.drawImage(t,0,0,t.width,t.height);const i=n.getImageData(0,0,t.width,t.height),r=i.data;for(let t=0;t<r.length;t++)r[t]=255*Ae(r[t]/255);return n.putImageData(i,0,0),e}if(t.data){const e=t.data.slice(0);for(let t=0;t<e.length;t++)e instanceof Uint8Array||e instanceof Uint8ClampedArray?e[t]=Math.floor(255*Ae(e[t]/255)):e[t]=Ae(e[t]);return{data:e,width:t.width,height:t.height}}return console.warn("THREE.ImageUtils.sRGBToLinear(): Unsupported image type. No color space conversion applied."),t}}let Zn=0;class Kn extends T{constructor(t=Kn.DEFAULT_IMAGE,e=Kn.DEFAULT_MAPPING,n=1001,i=1001,r=1006,s=1008,a=1023,o=1009,l=1,h=3e3){super(),Object.defineProperty(this,"id",{value:Zn++}),this.uuid=P(),this.name="",this.image=t,this.mipmaps=[],this.mapping=e,this.wrapS=n,this.wrapT=i,this.magFilter=r,this.minFilter=s,this.anisotropy=l,this.format=a,this.internalFormat=null,this.type=o,this.offset=new we(0,0),this.repeat=new we(1,1),this.center=new we(0,0),this.rotation=0,this.matrixAutoUpdate=!0,this.matrix=new tt,this.generateMipmaps=!0,this.premultiplyAlpha=!1,this.flipY=!0,this.unpackAlignment=4,this.encoding=h,this.userData={},this.version=0,this.onUpdate=null,this.isRenderTargetTexture=!1,this.needsPMREMUpdate=!1}updateMatrix(){this.matrix.setUvTransform(this.offset.x,this.offset.y,this.repeat.x,this.repeat.y,this.rotation,this.center.x,this.center.y)}clone(){return(new this.constructor).copy(this)}copy(t){return this.name=t.name,this.image=t.image,this.mipmaps=t.mipmaps.slice(0),this.mapping=t.mapping,this.wrapS=t.wrapS,this.wrapT=t.wrapT,this.magFilter=t.magFilter,this.minFilter=t.minFilter,this.anisotropy=t.anisotropy,this.format=t.format,this.internalFormat=t.internalFormat,this.type=t.type,this.offset.copy(t.offset),this.repeat.copy(t.repeat),this.center.copy(t.center),this.rotation=t.rotation,this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrix.copy(t.matrix),this.generateMipmaps=t.generateMipmaps,this.premultiplyAlpha=t.premultiplyAlpha,this.flipY=t.flipY,this.unpackAlignment=t.unpackAlignment,this.encoding=t.encoding,this.userData=JSON.parse(JSON.stringify(t.userData)),this}toJSON(t){const e=void 0===t||"string"==typeof t;if(!e&&void 0!==t.textures[this.uuid])return t.textures[this.uuid];const n={metadata:{version:4.5,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,name:this.name,mapping:this.mapping,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],format:this.format,type:this.type,encoding:this.encoding,minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY,premultiplyAlpha:this.premultiplyAlpha,unpackAlignment:this.unpackAlignment};if(void 0!==this.image){const i=this.image;if(void 0===i.uuid&&(i.uuid=P()),!e&&void 0===t.images[i.uuid]){let e;if(Array.isArray(i)){e=[];for(let t=0,n=i.length;t<n;t++)i[t].isDataTexture?e.push(Jn(i[t].image)):e.push(Jn(i[t]))}else e=Jn(i);t.images[i.uuid]={uuid:i.uuid,url:e}}n.image=i.uuid}return"{}"!==JSON.stringify(this.userData)&&(n.userData=this.userData),e||(t.textures[this.uuid]=n),n}dispose(){this.dispatchEvent({type:"dispose"})}transformUv(t){if(300!==this.mapping)return t;if(t.applyMatrix3(this.matrix),t.x<0||t.x>1)switch(this.wrapS){case wt:t.x=t.x-Math.floor(t.x);break;case St:t.x=t.x<0?0:1;break;case Mt:1===Math.abs(Math.floor(t.x)%2)?t.x=Math.ceil(t.x)-t.x:t.x=t.x-Math.floor(t.x)}if(t.y<0||t.y>1)switch(this.wrapT){case wt:t.y=t.y-Math.floor(t.y);break;case St:t.y=t.y<0?0:1;break;case Mt:1===Math.abs(Math.floor(t.y)%2)?t.y=Math.ceil(t.y)-t.y:t.y=t.y-Math.floor(t.y)}return this.flipY&&(t.y=1-t.y),t}set needsUpdate(t){!0===t&&this.version++}}function Jn(t){return"undefined"!=typeof HTMLImageElement&&t instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&t instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&t instanceof ImageBitmap?$n.getDataURL(t):t.data?{data:Array.prototype.slice.call(t.data),width:t.width,height:t.height,type:t.data.constructor.name}:(console.warn("THREE.Texture: Unable to serialize Texture."),{})}Kn.DEFAULT_IMAGE=void 0,Kn.DEFAULT_MAPPING=300,Kn.prototype.isTexture=!0;class Qn extends T{constructor(t,e,n={}){super(),this.width=t,this.height=e,this.depth=1,this.scissor=new _e(0,0,t,e),this.scissorTest=!1,this.viewport=new _e(0,0,t,e),this.texture=new Kn(void 0,n.mapping,n.wrapS,n.wrapT,n.magFilter,n.minFilter,n.format,n.type,n.anisotropy,n.encoding),this.texture.isRenderTargetTexture=!0,this.texture.image={width:t,height:e,depth:1},this.texture.generateMipmaps=void 0!==n.generateMipmaps&&n.generateMipmaps,this.texture.internalFormat=void 0!==n.internalFormat?n.internalFormat:null,this.texture.minFilter=void 0!==n.minFilter?n.minFilter:Et,this.depthBuffer=void 0===n.depthBuffer||n.depthBuffer,this.stencilBuffer=void 0!==n.stencilBuffer&&n.stencilBuffer,this.depthTexture=void 0!==n.depthTexture?n.depthTexture:null}setTexture(t){t.image={width:this.width,height:this.height,depth:this.depth},this.texture=t}setSize(t,e,n=1){this.width===t&&this.height===e&&this.depth===n||(this.width=t,this.height=e,this.depth=n,this.texture.image.width=t,this.texture.image.height=e,this.texture.image.depth=n,this.dispose()),this.viewport.set(0,0,t,e),this.scissor.set(0,0,t,e)}clone(){return(new this.constructor).copy(this)}copy(t){return this.width=t.width,this.height=t.height,this.depth=t.depth,this.viewport.copy(t.viewport),this.texture=t.texture.clone(),this.texture.image=Object.assign({},t.texture.image),this.depthBuffer=t.depthBuffer,this.stencilBuffer=t.stencilBuffer,this.depthTexture=t.depthTexture,this}dispose(){this.dispatchEvent({type:"dispose"})}}Qn.prototype.isWebGLRenderTarget=!0;class ti extends mt{constructor(t=50,e=1,n=.1,i=2e3){super(),this.type="PerspectiveCamera",this.fov=t,this.zoom=1,this.near=n,this.far=i,this.focus=10,this.aspect=e,this.view=null,this.filmGauge=35,this.filmOffset=0,this.updateProjectionMatrix()}copy(t,e){return super.copy(t,e),this.fov=t.fov,this.zoom=t.zoom,this.near=t.near,this.far=t.far,this.focus=t.focus,this.aspect=t.aspect,this.view=null===t.view?null:Object.assign({},t.view),this.filmGauge=t.filmGauge,this.filmOffset=t.filmOffset,this}setFocalLength(t){const e=.5*this.getFilmHeight()/t;this.fov=2*k*Math.atan(e),this.updateProjectionMatrix()}getFocalLength(){const t=Math.tan(.5*D*this.fov);return.5*this.getFilmHeight()/t}getEffectiveFOV(){return 2*k*Math.atan(Math.tan(.5*D*this.fov)/this.zoom)}getFilmWidth(){return this.filmGauge*Math.min(this.aspect,1)}getFilmHeight(){return this.filmGauge/Math.max(this.aspect,1)}setViewOffset(t,e,n,i,r,s){this.aspect=t/e,null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=t,this.view.fullHeight=e,this.view.offsetX=n,this.view.offsetY=i,this.view.width=r,this.view.height=s,this.updateProjectionMatrix()}clearViewOffset(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const t=this.near;let e=t*Math.tan(.5*D*this.fov)/this.zoom,n=2*e,i=this.aspect*n,r=-.5*i;const s=this.view;if(null!==this.view&&this.view.enabled){const t=s.fullWidth,a=s.fullHeight;r+=s.offsetX*i/t,e-=s.offsetY*n/a,i*=s.width/t,n*=s.height/a}const a=this.filmOffset;0!==a&&(r+=t*a/this.getFilmWidth()),this.projectionMatrix.makePerspective(r,r+i,e,e-n,t,this.far),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(t){const e=super.toJSON(t);return e.object.fov=this.fov,e.object.zoom=this.zoom,e.object.near=this.near,e.object.far=this.far,e.object.focus=this.focus,e.object.aspect=this.aspect,null!==this.view&&(e.object.view=Object.assign({},this.view)),e.object.filmGauge=this.filmGauge,e.object.filmOffset=this.filmOffset,e}}ti.prototype.isPerspectiveCamera=!0;const ei=90;class ni extends ft{constructor(t,e,n){if(super(),this.type="CubeCamera",!0!==n.isWebGLCubeRenderTarget)return void console.error("THREE.CubeCamera: The constructor now expects an instance of WebGLCubeRenderTarget as third parameter.");this.renderTarget=n;const i=new ti(ei,1,t,e);i.layers=this.layers,i.up.set(0,-1,0),i.lookAt(new U(1,0,0)),this.add(i);const r=new ti(ei,1,t,e);r.layers=this.layers,r.up.set(0,-1,0),r.lookAt(new U(-1,0,0)),this.add(r);const s=new ti(ei,1,t,e);s.layers=this.layers,s.up.set(0,0,1),s.lookAt(new U(0,1,0)),this.add(s);const a=new ti(ei,1,t,e);a.layers=this.layers,a.up.set(0,0,-1),a.lookAt(new U(0,-1,0)),this.add(a);const o=new ti(ei,1,t,e);o.layers=this.layers,o.up.set(0,-1,0),o.lookAt(new U(0,0,1)),this.add(o);const l=new ti(ei,1,t,e);l.layers=this.layers,l.up.set(0,-1,0),l.lookAt(new U(0,0,-1)),this.add(l)}update(t,e){null===this.parent&&this.updateMatrixWorld();const n=this.renderTarget,[i,r,s,a,o,l]=this.children,h=t.xr.enabled,c=t.getRenderTarget();t.xr.enabled=!1;const u=n.texture.generateMipmaps;n.texture.generateMipmaps=!1,t.setRenderTarget(n,0),t.render(e,i),t.setRenderTarget(n,1),t.render(e,r),t.setRenderTarget(n,2),t.render(e,s),t.setRenderTarget(n,3),t.render(e,a),t.setRenderTarget(n,4),t.render(e,o),n.texture.generateMipmaps=u,t.setRenderTarget(n,5),t.render(e,l),t.setRenderTarget(c),t.xr.enabled=h,n.texture.needsPMREMUpdate=!0}}class ii extends Kn{constructor(t,e,n,i,r,s,a,o,l,h){super(t=void 0!==t?t:[],e=void 0!==e?e:_t,n,i,r,s,a,o,l,h),this.flipY=!1}get images(){return this.image}set images(t){this.image=t}}ii.prototype.isCubeTexture=!0;class ri extends Qn{constructor(t,e,n){Number.isInteger(e)&&(console.warn("THREE.WebGLCubeRenderTarget: constructor signature is now WebGLCubeRenderTarget( size, options )"),e=n),super(t,t,e),e=e||{},this.texture=new ii(void 0,e.mapping,e.wrapS,e.wrapT,e.magFilter,e.minFilter,e.format,e.type,e.anisotropy,e.encoding),this.texture.isRenderTargetTexture=!0,this.texture.generateMipmaps=void 0!==e.generateMipmaps&&e.generateMipmaps,this.texture.minFilter=void 0!==e.minFilter?e.minFilter:Et}fromEquirectangularTexture(t,e){this.texture.type=e.type,this.texture.format=zt,this.texture.encoding=e.encoding,this.texture.generateMipmaps=e.generateMipmaps,this.texture.minFilter=e.minFilter,this.texture.magFilter=e.magFilter;const n={uniforms:{tEquirect:{value:null}},vertexShader:"\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t\t#include <begin_vertex>\n\t\t\t\t\t#include <project_vertex>\n\n\t\t\t\t}\n\t\t\t",fragmentShader:"\n\n\t\t\t\tuniform sampler2D tEquirect;\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\t#include <common>\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t\t}\n\t\t\t"},i=new We(5,5,5),r=new Qe({name:"CubemapFromEquirect",uniforms:Ze(n.uniforms),vertexShader:n.vertexShader,fragmentShader:n.fragmentShader,side:1,blending:0});r.uniforms.tEquirect.value=e;const s=new Fn(i,r),a=e.minFilter;e.minFilter===At&&(e.minFilter=Et);return new ni(1,10,this).update(t,s),e.minFilter=a,s.geometry.dispose(),s.material.dispose(),this}clear(t,e,n,i){const r=t.getRenderTarget();for(let r=0;r<6;r++)t.setRenderTarget(this,r),t.clear(e,n,i);t.setRenderTarget(r)}}function si(t){let e=new WeakMap;function n(t,e){return 303===e?t.mapping=_t:304===e&&(t.mapping=yt),t}function i(t){const n=t.target;n.removeEventListener("dispose",i);const r=e.get(n);void 0!==r&&(e.delete(n),r.dispose())}return{get:function(r){if(r&&r.isTexture&&!1===r.isRenderTargetTexture){const s=r.mapping;if(303===s||304===s){if(e.has(r)){return n(e.get(r).texture,r.mapping)}{const s=r.image;if(s&&s.height>0){const a=new ri(s.height/2);return a.fromEquirectangularTexture(t,r),e.set(r,a),r.addEventListener("dispose",i),n(a.texture,r.mapping)}return null}}}return r},dispose:function(){e=new WeakMap}}}ri.prototype.isWebGLCubeRenderTarget=!0;class ai extends Qe{constructor(t){super(t),this.type="RawShaderMaterial"}}ai.prototype.isRawShaderMaterial=!0;const oi=Math.pow(2,8),li=[.125,.215,.35,.446,.526,.582],hi=5+li.length,ci=20,ui=new gt,{_lodPlanes:di,_sizeLods:pi,_sigmas:fi}=bi(),mi=new Re;let gi=null;const vi=(1+Math.sqrt(5))/2,xi=1/vi,_i=[new U(1,1,1),new U(-1,1,1),new U(1,1,-1),new U(-1,1,-1),new U(0,vi,xi),new U(0,vi,-xi),new U(xi,0,vi),new U(-xi,0,vi),new U(vi,xi,0),new U(-vi,xi,0)];class yi{constructor(t){this._renderer=t,this._pingPongRenderTarget=null,this._blurMaterial=function(t){const e=new Float32Array(t),n=new U(0,1,0);return new ai({name:"SphericalGaussianBlur",defines:{n:t},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:e},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:n}},vertexShader:Ei(),fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform int samples;\n\t\t\tuniform float weights[ n ];\n\t\t\tuniform bool latitudinal;\n\t\t\tuniform float dTheta;\n\t\t\tuniform float mipInt;\n\t\t\tuniform vec3 poleAxis;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include <cube_uv_reflection_fragment>\n\n\t\t\tvec3 getSample( float theta, vec3 axis ) {\n\n\t\t\t\tfloat cosTheta = cos( theta );\n\t\t\t\t// Rodrigues' axis-angle rotation\n\t\t\t\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t\t\t\t+ cross( axis, vOutputDirection ) * sin( theta )\n\t\t\t\t\t+ axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );\n\n\t\t\t\treturn bilinearCubeUV( envMap, sampleDirection, mipInt );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );\n\n\t\t\t\tif ( all( equal( axis, vec3( 0.0 ) ) ) ) {\n\n\t\t\t\t\taxis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );\n\n\t\t\t\t}\n\n\t\t\t\taxis = normalize( axis );\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );\n\n\t\t\t\tfor ( int i = 1; i < n; i++ ) {\n\n\t\t\t\t\tif ( i >= samples ) {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfloat theta = dTheta * float( i );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( theta, axis );\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t",blending:0,depthTest:!1,depthWrite:!1})}(ci),this._equirectShader=null,this._cubemapShader=null,this._compileMaterial(this._blurMaterial)}fromScene(t,e=0,n=.1,i=100){gi=this._renderer.getRenderTarget();const r=this._allocateTargets();return this._sceneToCubeUV(t,n,i,r),e>0&&this._blur(r,0,0,e),this._applyPMREM(r),this._cleanup(r),r}fromEquirectangular(t,e=null){return this._fromTexture(t,e)}fromCubemap(t,e=null){return this._fromTexture(t,e)}compileCubemapShader(){null===this._cubemapShader&&(this._cubemapShader=Ti(),this._compileMaterial(this._cubemapShader))}compileEquirectangularShader(){null===this._equirectShader&&(this._equirectShader=Mi(),this._compileMaterial(this._equirectShader))}dispose(){this._blurMaterial.dispose(),null!==this._pingPongRenderTarget&&this._pingPongRenderTarget.dispose(),null!==this._cubemapShader&&this._cubemapShader.dispose(),null!==this._equirectShader&&this._equirectShader.dispose();for(let t=0;t<di.length;t++)di[t].dispose()}_cleanup(t){this._renderer.setRenderTarget(gi),t.scissorTest=!1,Si(t,0,0,t.width,t.height)}_fromTexture(t,e){gi=this._renderer.getRenderTarget();const n=e||this._allocateTargets(t);return this._textureToCubeUV(t,n),this._applyPMREM(n),this._cleanup(n),n}_allocateTargets(t){const e={magFilter:Et,minFilter:Et,generateMipmaps:!1,type:Pt,format:zt,encoding:Vt,depthBuffer:!1},n=wi(e);return n.depthBuffer=!t,null===this._pingPongRenderTarget&&(this._pingPongRenderTarget=wi(e)),n}_compileMaterial(t){const e=new Fn(di[0],t);this._renderer.compile(e,ui)}_sceneToCubeUV(t,e,n,i){const r=new ti(90,1,e,n),s=[1,-1,1,1,1,1],a=[1,1,1,-1,-1,-1],o=this._renderer,l=o.autoClear,h=o.toneMapping;o.getClearColor(mi),o.toneMapping=0,o.autoClear=!1;const c=new yn({name:"PMREM.Background",side:1,depthWrite:!1,depthTest:!1}),u=new Fn(new We,c);let d=!1;const p=t.background;p?p.isColor&&(c.color.copy(p),t.background=null,d=!0):(c.color.copy(mi),d=!0);for(let e=0;e<6;e++){const n=e%3;0===n?(r.up.set(0,s[e],0),r.lookAt(a[e],0,0)):1===n?(r.up.set(0,0,s[e]),r.lookAt(0,a[e],0)):(r.up.set(0,s[e],0),r.lookAt(0,0,a[e])),Si(i,n*oi,e>2?oi:0,oi,oi),o.setRenderTarget(i),d&&o.render(u,r),o.render(t,r)}u.geometry.dispose(),u.material.dispose(),o.toneMapping=h,o.autoClear=l,t.background=p}_textureToCubeUV(t,e){const n=this._renderer,i=t.mapping===_t||t.mapping===yt;i?(null===this._cubemapShader&&(this._cubemapShader=Ti()),this._cubemapShader.uniforms.flipEnvMap.value=!1===t.isRenderTargetTexture?-1:1):null===this._equirectShader&&(this._equirectShader=Mi());const r=i?this._cubemapShader:this._equirectShader,s=new Fn(di[0],r),a=r.uniforms;a.envMap.value=t,i||a.texelSize.value.set(1/t.image.width,1/t.image.height),Si(e,0,0,3*oi,2*oi),n.setRenderTarget(e),n.render(s,ui)}_applyPMREM(t){const e=this._renderer,n=e.autoClear;e.autoClear=!1;for(let e=1;e<hi;e++){const n=Math.sqrt(fi[e]*fi[e]-fi[e-1]*fi[e-1]),i=_i[(e-1)%_i.length];this._blur(t,e-1,e,n,i)}e.autoClear=n}_blur(t,e,n,i,r){const s=this._pingPongRenderTarget;this._halfBlur(t,s,e,n,i,"latitudinal",r),this._halfBlur(s,t,n,n,i,"longitudinal",r)}_halfBlur(t,e,n,i,r,s,a){const o=this._renderer,l=this._blurMaterial;"latitudinal"!==s&&"longitudinal"!==s&&console.error("blur direction must be either latitudinal or longitudinal!");const h=new Fn(di[i],l),c=l.uniforms,u=pi[n]-1,d=isFinite(r)?Math.PI/(2*u):2*Math.PI/39,p=r/d,f=isFinite(r)?1+Math.floor(3*p):ci;f>ci&&console.warn(`sigmaRadians, ${r}, is too large and will clip, as it requested ${f} samples when the maximum is set to 20`);const m=[];let g=0;for(let t=0;t<ci;++t){const e=t/p,n=Math.exp(-e*e/2);m.push(n),0===t?g+=n:t<f&&(g+=2*n)}for(let t=0;t<m.length;t++)m[t]=m[t]/g;c.envMap.value=t.texture,c.samples.value=f,c.weights.value=m,c.latitudinal.value="latitudinal"===s,a&&(c.poleAxis.value=a),c.dTheta.value=d,c.mipInt.value=8-n;const v=pi[i];Si(e,3*Math.max(0,oi-2*v),(0===i?0:2*oi)+2*v*(i>4?i-8+4:0),3*v,2*v),o.setRenderTarget(e),o.render(h,ui)}}function bi(){const t=[],e=[],n=[];let i=8;for(let r=0;r<hi;r++){const s=Math.pow(2,i);e.push(s);let a=1/s;r>4?a=li[r-8+4-1]:0===r&&(a=0),n.push(a);const o=1/(s-1),l=-o/2,h=1+o/2,c=[l,l,h,l,h,h,l,l,h,h,l,h],u=6,d=6,p=3,f=2,m=1,g=new Float32Array(p*d*u),v=new Float32Array(f*d*u),x=new Float32Array(m*d*u);for(let t=0;t<u;t++){const e=t%3*2/3-1,n=t>2?0:-1,i=[e,n,0,e+2/3,n,0,e+2/3,n+1,0,e,n,0,e+2/3,n+1,0,e,n+1,0];g.set(i,p*d*t),v.set(c,f*d*t);const r=[t,t,t,t,t,t];x.set(r,m*d*t)}const _=new qe;_.setAttribute("position",new Pe(g,p)),_.setAttribute("uv",new Pe(v,f)),_.setAttribute("faceIndex",new Pe(x,m)),t.push(_),i>4&&i--}return{_lodPlanes:t,_sizeLods:e,_sigmas:n}}function wi(t){const e=new Qn(3*oi,3*oi,t);return e.texture.mapping=bt,e.texture.name="PMREM.cubeUv",e.scissorTest=!0,e}function Si(t,e,n,i,r){t.viewport.set(e,n,i,r),t.scissor.set(e,n,i,r)}function Mi(){const t=new we(1,1);return new ai({name:"EquirectangularToCubeUV",uniforms:{envMap:{value:null},texelSize:{value:t}},vertexShader:Ei(),fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform vec2 texelSize;\n\n\t\t\t#include <common>\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\n\t\t\t\tvec3 outputDirection = normalize( vOutputDirection );\n\t\t\t\tvec2 uv = equirectUv( outputDirection );\n\n\t\t\t\tvec2 f = fract( uv / texelSize - 0.5 );\n\t\t\t\tuv -= f * texelSize;\n\t\t\t\tvec3 tl = texture2D ( envMap, uv ).rgb;\n\t\t\t\tuv.x += texelSize.x;\n\t\t\t\tvec3 tr = texture2D ( envMap, uv ).rgb;\n\t\t\t\tuv.y += texelSize.y;\n\t\t\t\tvec3 br = texture2D ( envMap, uv ).rgb;\n\t\t\t\tuv.x -= texelSize.x;\n\t\t\t\tvec3 bl = texture2D ( envMap, uv ).rgb;\n\n\t\t\t\tvec3 tm = mix( tl, tr, f.x );\n\t\t\t\tvec3 bm = mix( bl, br, f.x );\n\t\t\t\tgl_FragColor.rgb = mix( tm, bm, f.y );\n\n\t\t\t}\n\t\t",blending:0,depthTest:!1,depthWrite:!1})}function Ti(){return new ai({name:"CubemapToCubeUV",uniforms:{envMap:{value:null},flipEnvMap:{value:-1}},vertexShader:Ei(),fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tuniform float flipEnvMap;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform samplerCube envMap;\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = textureCube( envMap, vec3( flipEnvMap * vOutputDirection.x, vOutputDirection.yz ) );\n\n\t\t\t}\n\t\t",blending:0,depthTest:!1,depthWrite:!1})}function Ei(){return"\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute vec3 position;\n\t\tattribute vec2 uv;\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t"}function Ai(t){let e=new WeakMap,n=null;function i(t){const n=t.target;n.removeEventListener("dispose",i);const r=e.get(n);void 0!==r&&(e.delete(n),r.dispose())}return{get:function(r){if(r&&r.isTexture){const s=r.mapping,a=303===s||304===s,o=s===_t||s===yt;if(a||o){if(r.isRenderTargetTexture&&!0===r.needsPMREMUpdate){r.needsPMREMUpdate=!1;let i=e.get(r);return null===n&&(n=new yi(t)),i=a?n.fromEquirectangular(r,i):n.fromCubemap(r,i),e.set(r,i),i.texture}if(e.has(r))return e.get(r).texture;{const s=r.image;if(a&&s&&s.height>0||o&&s&&function(t){let e=0;const n=6;for(let i=0;i<n;i++)void 0!==t[i]&&e++;return e===n}(s)){null===n&&(n=new yi(t));const s=a?n.fromEquirectangular(r):n.fromCubemap(r);return e.set(r,s),r.addEventListener("dispose",i),s.texture}return null}}}return r},dispose:function(){e=new WeakMap,null!==n&&(n.dispose(),n=null)}}}function Ci(t){const e={};function n(n){if(void 0!==e[n])return e[n];let i;switch(n){case"WEBGL_depth_texture":i=t.getExtension("WEBGL_depth_texture")||t.getExtension("MOZ_WEBGL_depth_texture")||t.getExtension("WEBKIT_WEBGL_depth_texture");break;case"EXT_texture_filter_anisotropic":i=t.getExtension("EXT_texture_filter_anisotropic")||t.getExtension("MOZ_EXT_texture_filter_anisotropic")||t.getExtension("WEBKIT_EXT_texture_filter_anisotropic");break;case"WEBGL_compressed_texture_s3tc":i=t.getExtension("WEBGL_compressed_texture_s3tc")||t.getExtension("MOZ_WEBGL_compressed_texture_s3tc")||t.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc");break;case"WEBGL_compressed_texture_pvrtc":i=t.getExtension("WEBGL_compressed_texture_pvrtc")||t.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc");break;default:i=t.getExtension(n)}return e[n]=i,i}return{has:function(t){return null!==n(t)},init:function(t){t.isWebGL2?n("EXT_color_buffer_float"):(n("WEBGL_depth_texture"),n("OES_texture_float"),n("OES_texture_half_float"),n("OES_texture_half_float_linear"),n("OES_standard_derivatives"),n("OES_element_index_uint"),n("OES_vertex_array_object"),n("ANGLE_instanced_arrays")),n("OES_texture_float_linear"),n("EXT_color_buffer_half_float"),n("WEBGL_multisampled_render_to_texture")},get:function(t){const e=n(t);return null===e&&console.warn("THREE.WebGLRenderer: "+t+" extension not supported."),e}}}function Ri(t,e,n,i){const r={},s=new WeakMap;function a(t){const o=t.target;null!==o.index&&e.remove(o.index);for(const t in o.attributes)e.remove(o.attributes[t]);o.removeEventListener("dispose",a),delete r[o.id];const l=s.get(o);l&&(e.remove(l),s.delete(o)),i.releaseStatesOfGeometry(o),!0===o.isInstancedBufferGeometry&&delete o._maxInstanceCount,n.memory.geometries--}function o(t){const n=[],i=t.index,r=t.attributes.position;let a=0;if(null!==i){const t=i.array;a=i.version;for(let e=0,i=t.length;e<i;e+=3){const i=t[e+0],r=t[e+1],s=t[e+2];n.push(i,r,r,s,s,i)}}else{const t=r.array;a=r.version;for(let e=0,i=t.length/3-1;e<i;e+=3){const t=e+0,i=e+1,r=e+2;n.push(t,i,i,r,r,t)}}const o=new(Ie(n)?ze:Le)(n,1);o.version=a;const l=s.get(t);l&&e.remove(l),s.set(t,o)}return{get:function(t,e){return!0===r[e.id]||(e.addEventListener("dispose",a),r[e.id]=!0,n.memory.geometries++),e},update:function(n){const i=n.attributes;for(const n in i)e.update(i[n],t.ARRAY_BUFFER);const r=n.morphAttributes;for(const n in r){const i=r[n];for(let n=0,r=i.length;n<r;n++)e.update(i[n],t.ARRAY_BUFFER)}},getWireframeAttribute:function(t){const e=s.get(t);if(e){const n=t.index;null!==n&&e.version<n.version&&o(t)}else o(t);return s.get(t)}}}function Di(t,e,n,i){const r=i.isWebGL2;let s,a,o;this.setMode=function(t){s=t},this.setIndex=function(t){a=t.type,o=t.bytesPerElement},this.render=function(e,i){t.drawElements(s,i,a,e*o),n.update(i,s,1)},this.renderInstances=function(i,l,h){if(0===h)return;let c,u;if(r)c=t,u="drawElementsInstanced";else if(c=e.get("ANGLE_instanced_arrays"),u="drawElementsInstancedANGLE",null===c)return void console.error("THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");c[u](s,l,a,i*o,h),n.update(l,s,h)}}function ki(t){const e={frame:0,calls:0,triangles:0,points:0,lines:0};return{memory:{geometries:0,textures:0},render:e,programs:null,autoReset:!0,reset:function(){e.frame++,e.calls=0,e.triangles=0,e.points=0,e.lines=0},update:function(n,i,r){switch(e.calls++,i){case t.TRIANGLES:e.triangles+=r*(n/3);break;case t.LINES:e.lines+=r*(n/2);break;case t.LINE_STRIP:e.lines+=r*(n-1);break;case t.LINE_LOOP:e.lines+=r*n;break;case t.POINTS:e.points+=r*n;break;default:console.error("THREE.WebGLInfo: Unknown draw mode:",i)}}}}class Pi extends Kn{constructor(t=null,e=1,n=1,i=1){super(null),this.image={data:t,width:e,height:n,depth:i},this.magFilter=Tt,this.minFilter=Tt,this.wrapR=St,this.generateMipmaps=!1,this.flipY=!1,this.unpackAlignment=1}}function Li(t,e){return t[0]-e[0]}function zi(t,e){return Math.abs(e[1])-Math.abs(t[1])}function Oi(t,e){let n=1;const i=e.isInterleavedBufferAttribute?e.data.array:e.array;i instanceof Int8Array?n=127:i instanceof Int16Array?n=32767:i instanceof Int32Array?n=2147483647:console.error("THREE.WebGLMorphtargets: Unsupported morph attribute data type: ",i),t.divideScalar(n)}function Ii(t,e,n){const i={},r=new Float32Array(8),s=new WeakMap,a=new U,o=[];for(let t=0;t<8;t++)o[t]=[t,0];return{update:function(l,h,c,u){const d=l.morphTargetInfluences;if(!0===e.isWebGL2){const i=h.morphAttributes.position.length;let r=s.get(h);if(void 0===r||r.count!==i){void 0!==r&&r.texture.dispose();const t=void 0!==h.morphAttributes.normal,n=h.morphAttributes.position,o=h.morphAttributes.normal||[],l=!0===t?2:1;let c=h.attributes.position.count*l,u=1;c>e.maxTextureSize&&(u=Math.ceil(c/e.maxTextureSize),c=e.maxTextureSize);const d=new Float32Array(c*u*4*i),p=new Pi(d,c,u,i);p.format=zt,p.type=kt,p.needsUpdate=!0;const f=4*l;for(let e=0;e<i;e++){const i=n[e],r=o[e],s=c*u*4*e;for(let e=0;e<i.count;e++){a.fromBufferAttribute(i,e),!0===i.normalized&&Oi(a,i);const n=e*f;d[s+n+0]=a.x,d[s+n+1]=a.y,d[s+n+2]=a.z,d[s+n+3]=0,!0===t&&(a.fromBufferAttribute(r,e),!0===r.normalized&&Oi(a,r),d[s+n+4]=a.x,d[s+n+5]=a.y,d[s+n+6]=a.z,d[s+n+7]=0)}}function m(){p.dispose(),s.delete(h),h.removeEventListener("dispose",m)}r={count:i,texture:p,size:new we(c,u)},s.set(h,r),h.addEventListener("dispose",m)}let o=0;for(let t=0;t<d.length;t++)o+=d[t];const l=h.morphTargetsRelative?1:1-o;u.getUniforms().setValue(t,"morphTargetBaseInfluence",l),u.getUniforms().setValue(t,"morphTargetInfluences",d),u.getUniforms().setValue(t,"morphTargetsTexture",r.texture,n),u.getUniforms().setValue(t,"morphTargetsTextureSize",r.size)}else{const e=void 0===d?0:d.length;let n=i[h.id];if(void 0===n||n.length!==e){n=[];for(let t=0;t<e;t++)n[t]=[t,0];i[h.id]=n}for(let t=0;t<e;t++){const e=n[t];e[0]=t,e[1]=d[t]}n.sort(zi);for(let t=0;t<8;t++)t<e&&n[t][1]?(o[t][0]=n[t][0],o[t][1]=n[t][1]):(o[t][0]=Number.MAX_SAFE_INTEGER,o[t][1]=0);o.sort(Li);const s=h.morphAttributes.position,a=h.morphAttributes.normal;let l=0;for(let t=0;t<8;t++){const e=o[t],n=e[0],i=e[1];n!==Number.MAX_SAFE_INTEGER&&i?(s&&h.getAttribute("morphTarget"+t)!==s[n]&&h.setAttribute("morphTarget"+t,s[n]),a&&h.getAttribute("morphNormal"+t)!==a[n]&&h.setAttribute("morphNormal"+t,a[n]),r[t]=i,l+=i):(s&&!0===h.hasAttribute("morphTarget"+t)&&h.deleteAttribute("morphTarget"+t),a&&!0===h.hasAttribute("morphNormal"+t)&&h.deleteAttribute("morphNormal"+t),r[t]=0)}const c=h.morphTargetsRelative?1:1-l;u.getUniforms().setValue(t,"morphTargetBaseInfluence",c),u.getUniforms().setValue(t,"morphTargetInfluences",r)}}}}Pi.prototype.isDataTexture2DArray=!0;class Ni extends Qn{constructor(t,e,n={}){super(t,e,n),this.samples=4,this.ignoreDepthForMultisampleCopy=void 0===n.ignoreDepth||n.ignoreDepth,this.useRenderToTexture=void 0!==n.useRenderToTexture&&n.useRenderToTexture,this.useRenderbuffer=!1===this.useRenderToTexture}copy(t){return super.copy.call(this,t),this.samples=t.samples,this.useRenderToTexture=t.useRenderToTexture,this.useRenderbuffer=t.useRenderbuffer,this}}function Fi(t,e,n,i){let r=new WeakMap;function s(t){const e=t.target;e.removeEventListener("dispose",s),n.remove(e.instanceMatrix),null!==e.instanceColor&&n.remove(e.instanceColor)}return{update:function(a){const o=i.render.frame,l=a.geometry,h=e.get(a,l);return r.get(h)!==o&&(e.update(h),r.set(h,o)),a.isInstancedMesh&&(!1===a.hasEventListener("dispose",s)&&a.addEventListener("dispose",s),n.update(a.instanceMatrix,t.ARRAY_BUFFER),null!==a.instanceColor&&n.update(a.instanceColor,t.ARRAY_BUFFER)),h},dispose:function(){r=new WeakMap}}}Ni.prototype.isWebGLMultisampleRenderTarget=!0;class Ui extends Kn{constructor(t=null,e=1,n=1,i=1){super(null),this.image={data:t,width:e,height:n,depth:i},this.magFilter=Tt,this.minFilter=Tt,this.wrapR=St,this.generateMipmaps=!1,this.flipY=!1,this.unpackAlignment=1}}Ui.prototype.isDataTexture3D=!0;const Bi=new Kn,Vi=new Pi,Hi=new Ui,Gi=new ii,ji=[],qi=[],Wi=new Float32Array(16),Xi=new Float32Array(9),Yi=new Float32Array(4);function $i(t,e,n){const i=t[0];if(i<=0||i>0)return t;const r=e*n;let s=ji[r];if(void 0===s&&(s=new Float32Array(r),ji[r]=s),0!==e){i.toArray(s,0);for(let i=1,r=0;i!==e;++i)r+=n,t[i].toArray(s,r)}return s}function Zi(t,e){if(t.length!==e.length)return!1;for(let n=0,i=t.length;n<i;n++)if(t[n]!==e[n])return!1;return!0}function Ki(t,e){for(let n=0,i=e.length;n<i;n++)t[n]=e[n]}function Ji(t,e){let n=qi[e];void 0===n&&(n=new Int32Array(e),qi[e]=n);for(let i=0;i!==e;++i)n[i]=t.allocateTextureUnit();return n}function Qi(t,e){const n=this.cache;n[0]!==e&&(t.uniform1f(this.addr,e),n[0]=e)}function tr(t,e){const n=this.cache;if(void 0!==e.x)n[0]===e.x&&n[1]===e.y||(t.uniform2f(this.addr,e.x,e.y),n[0]=e.x,n[1]=e.y);else{if(Zi(n,e))return;t.uniform2fv(this.addr,e),Ki(n,e)}}function er(t,e){const n=this.cache;if(void 0!==e.x)n[0]===e.x&&n[1]===e.y&&n[2]===e.z||(t.uniform3f(this.addr,e.x,e.y,e.z),n[0]=e.x,n[1]=e.y,n[2]=e.z);else if(void 0!==e.r)n[0]===e.r&&n[1]===e.g&&n[2]===e.b||(t.uniform3f(this.addr,e.r,e.g,e.b),n[0]=e.r,n[1]=e.g,n[2]=e.b);else{if(Zi(n,e))return;t.uniform3fv(this.addr,e),Ki(n,e)}}function nr(t,e){const n=this.cache;if(void 0!==e.x)n[0]===e.x&&n[1]===e.y&&n[2]===e.z&&n[3]===e.w||(t.uniform4f(this.addr,e.x,e.y,e.z,e.w),n[0]=e.x,n[1]=e.y,n[2]=e.z,n[3]=e.w);else{if(Zi(n,e))return;t.uniform4fv(this.addr,e),Ki(n,e)}}function ir(t,e){const n=this.cache,i=e.elements;if(void 0===i){if(Zi(n,e))return;t.uniformMatrix2fv(this.addr,!1,e),Ki(n,e)}else{if(Zi(n,i))return;Yi.set(i),t.uniformMatrix2fv(this.addr,!1,Yi),Ki(n,i)}}function rr(t,e){const n=this.cache,i=e.elements;if(void 0===i){if(Zi(n,e))return;t.uniformMatrix3fv(this.addr,!1,e),Ki(n,e)}else{if(Zi(n,i))return;Xi.set(i),t.uniformMatrix3fv(this.addr,!1,Xi),Ki(n,i)}}function sr(t,e){const n=this.cache,i=e.elements;if(void 0===i){if(Zi(n,e))return;t.uniformMatrix4fv(this.addr,!1,e),Ki(n,e)}else{if(Zi(n,i))return;Wi.set(i),t.uniformMatrix4fv(this.addr,!1,Wi),Ki(n,i)}}function ar(t,e){const n=this.cache;n[0]!==e&&(t.uniform1i(this.addr,e),n[0]=e)}function or(t,e){const n=this.cache;Zi(n,e)||(t.uniform2iv(this.addr,e),Ki(n,e))}function lr(t,e){const n=this.cache;Zi(n,e)||(t.uniform3iv(this.addr,e),Ki(n,e))}function hr(t,e){const n=this.cache;Zi(n,e)||(t.uniform4iv(this.addr,e),Ki(n,e))}function cr(t,e){const n=this.cache;n[0]!==e&&(t.uniform1ui(this.addr,e),n[0]=e)}function ur(t,e){const n=this.cache;Zi(n,e)||(t.uniform2uiv(this.addr,e),Ki(n,e))}function dr(t,e){const n=this.cache;Zi(n,e)||(t.uniform3uiv(this.addr,e),Ki(n,e))}function pr(t,e){const n=this.cache;Zi(n,e)||(t.uniform4uiv(this.addr,e),Ki(n,e))}function fr(t,e,n){const i=this.cache,r=n.allocateTextureUnit();i[0]!==r&&(t.uniform1i(this.addr,r),i[0]=r),n.safeSetTexture2D(e||Bi,r)}function mr(t,e,n){const i=this.cache,r=n.allocateTextureUnit();i[0]!==r&&(t.uniform1i(this.addr,r),i[0]=r),n.setTexture3D(e||Hi,r)}function gr(t,e,n){const i=this.cache,r=n.allocateTextureUnit();i[0]!==r&&(t.uniform1i(this.addr,r),i[0]=r),n.safeSetTextureCube(e||Gi,r)}function vr(t,e,n){const i=this.cache,r=n.allocateTextureUnit();i[0]!==r&&(t.uniform1i(this.addr,r),i[0]=r),n.setTexture2DArray(e||Vi,r)}function xr(t,e){t.uniform1fv(this.addr,e)}function _r(t,e){const n=$i(e,this.size,2);t.uniform2fv(this.addr,n)}function yr(t,e){const n=$i(e,this.size,3);t.uniform3fv(this.addr,n)}function br(t,e){const n=$i(e,this.size,4);t.uniform4fv(this.addr,n)}function wr(t,e){const n=$i(e,this.size,4);t.uniformMatrix2fv(this.addr,!1,n)}function Sr(t,e){const n=$i(e,this.size,9);t.uniformMatrix3fv(this.addr,!1,n)}function Mr(t,e){const n=$i(e,this.size,16);t.uniformMatrix4fv(this.addr,!1,n)}function Tr(t,e){t.uniform1iv(this.addr,e)}function Er(t,e){t.uniform2iv(this.addr,e)}function Ar(t,e){t.uniform3iv(this.addr,e)}function Cr(t,e){t.uniform4iv(this.addr,e)}function Rr(t,e){t.uniform1uiv(this.addr,e)}function Dr(t,e){t.uniform2uiv(this.addr,e)}function kr(t,e){t.uniform3uiv(this.addr,e)}function Pr(t,e){t.uniform4uiv(this.addr,e)}function Lr(t,e,n){const i=e.length,r=Ji(n,i);t.uniform1iv(this.addr,r);for(let t=0;t!==i;++t)n.safeSetTexture2D(e[t]||Bi,r[t])}function zr(t,e,n){const i=e.length,r=Ji(n,i);t.uniform1iv(this.addr,r);for(let t=0;t!==i;++t)n.setTexture3D(e[t]||Hi,r[t])}function Or(t,e,n){const i=e.length,r=Ji(n,i);t.uniform1iv(this.addr,r);for(let t=0;t!==i;++t)n.safeSetTextureCube(e[t]||Gi,r[t])}function Ir(t,e,n){const i=e.length,r=Ji(n,i);t.uniform1iv(this.addr,r);for(let t=0;t!==i;++t)n.setTexture2DArray(e[t]||Vi,r[t])}function Nr(t,e,n){this.id=t,this.addr=n,this.cache=[],this.setValue=function(t){switch(t){case 5126:return Qi;case 35664:return tr;case 35665:return er;case 35666:return nr;case 35674:return ir;case 35675:return rr;case 35676:return sr;case 5124:case 35670:return ar;case 35667:case 35671:return or;case 35668:case 35672:return lr;case 35669:case 35673:return hr;case 5125:return cr;case 36294:return ur;case 36295:return dr;case 36296:return pr;case 35678:case 36198:case 36298:case 36306:case 35682:return fr;case 35679:case 36299:case 36307:return mr;case 35680:case 36300:case 36308:case 36293:return gr;case 36289:case 36303:case 36311:case 36292:return vr}}(e.type)}function Fr(t,e,n){this.id=t,this.addr=n,this.cache=[],this.size=e.size,this.setValue=function(t){switch(t){case 5126:return xr;case 35664:return _r;case 35665:return yr;case 35666:return br;case 35674:return wr;case 35675:return Sr;case 35676:return Mr;case 5124:case 35670:return Tr;case 35667:case 35671:return Er;case 35668:case 35672:return Ar;case 35669:case 35673:return Cr;case 5125:return Rr;case 36294:return Dr;case 36295:return kr;case 36296:return Pr;case 35678:case 36198:case 36298:case 36306:case 35682:return Lr;case 35679:case 36299:case 36307:return zr;case 35680:case 36300:case 36308:case 36293:return Or;case 36289:case 36303:case 36311:case 36292:return Ir}}(e.type)}function Ur(t){this.id=t,this.seq=[],this.map={}}Fr.prototype.updateCache=function(t){const e=this.cache;t instanceof Float32Array&&e.length!==t.length&&(this.cache=new Float32Array(t.length)),Ki(e,t)},Ur.prototype.setValue=function(t,e,n){const i=this.seq;for(let r=0,s=i.length;r!==s;++r){const s=i[r];s.setValue(t,e[s.id],n)}};const Br=/(\w+)(\])?(\[|\.)?/g;function Vr(t,e){t.seq.push(e),t.map[e.id]=e}function Hr(t,e,n){const i=t.name,r=i.length;for(Br.lastIndex=0;;){const s=Br.exec(i),a=Br.lastIndex;let o=s[1];const l="]"===s[2],h=s[3];if(l&&(o|=0),void 0===h||"["===h&&a+2===r){Vr(n,void 0===h?new Nr(o,t,e):new Fr(o,t,e));break}{let t=n.map[o];void 0===t&&(t=new Ur(o),Vr(n,t)),n=t}}}function Gr(t,e){this.seq=[],this.map={};const n=t.getProgramParameter(e,t.ACTIVE_UNIFORMS);for(let i=0;i<n;++i){const n=t.getActiveUniform(e,i);Hr(n,t.getUniformLocation(e,n.name),this)}}function jr(t,e,n){const i=t.createShader(e);return t.shaderSource(i,n),t.compileShader(i),i}Gr.prototype.setValue=function(t,e,n,i){const r=this.map[e];void 0!==r&&r.setValue(t,n,i)},Gr.prototype.setOptional=function(t,e,n){const i=e[n];void 0!==i&&this.setValue(t,n,i)},Gr.upload=function(t,e,n,i){for(let r=0,s=e.length;r!==s;++r){const s=e[r],a=n[s.id];!1!==a.needsUpdate&&s.setValue(t,a.value,i)}},Gr.seqWithValue=function(t,e){const n=[];for(let i=0,r=t.length;i!==r;++i){const r=t[i];r.id in e&&n.push(r)}return n};let qr=0;function Wr(t,e,n){const i=t.getShaderParameter(e,t.COMPILE_STATUS),r=t.getShaderInfoLog(e).trim();return i&&""===r?"":n.toUpperCase()+"\n\n"+r+"\n\n"+function(t){const e=t.split("\n");for(let t=0;t<e.length;t++)e[t]=t+1+": "+e[t];return e.join("\n")}(t.getShaderSource(e))}function Xr(t,e){const n=function(t){switch(t){case Vt:return["Linear","( value )"];case Ht:return["sRGB","( value )"];default:return console.warn("THREE.WebGLProgram: Unsupported encoding:",t),["Linear","( value )"]}}(e);return"vec4 "+t+"( vec4 value ) { return LinearTo"+n[0]+n[1]+"; }"}function Yr(t,e){let n;switch(e){case 1:n="Linear";break;case 2:n="Reinhard";break;case 3:n="OptimizedCineon";break;case 4:n="ACESFilmic";break;case 5:n="Custom";break;default:console.warn("THREE.WebGLProgram: Unsupported toneMapping:",e),n="Linear"}return"vec3 "+t+"( vec3 color ) { return "+n+"ToneMapping( color ); }"}function $r(t){return""!==t}function Zr(t,e){return t.replace(/NUM_DIR_LIGHTS/g,e.numDirLights).replace(/NUM_SPOT_LIGHTS/g,e.numSpotLights).replace(/NUM_RECT_AREA_LIGHTS/g,e.numRectAreaLights).replace(/NUM_POINT_LIGHTS/g,e.numPointLights).replace(/NUM_HEMI_LIGHTS/g,e.numHemiLights).replace(/NUM_DIR_LIGHT_SHADOWS/g,e.numDirLightShadows).replace(/NUM_SPOT_LIGHT_SHADOWS/g,e.numSpotLightShadows).replace(/NUM_POINT_LIGHT_SHADOWS/g,e.numPointLightShadows)}function Kr(t,e){return t.replace(/NUM_CLIPPING_PLANES/g,e.numClippingPlanes).replace(/UNION_CLIPPING_PLANES/g,e.numClippingPlanes-e.numClipIntersection)}const Jr=/^[ \t]*#include +<([\w\d./]+)>/gm;function Qr(t){return t.replace(Jr,ts)}function ts(t,e){const n=Bn[e];if(void 0===n)throw new Error("Can not resolve #include <"+e+">");return Qr(n)}const es=/#pragma unroll_loop[\s]+?for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g,ns=/#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g;function is(t){return t.replace(ns,ss).replace(es,rs)}function rs(t,e,n,i){return console.warn("WebGLProgram: #pragma unroll_loop shader syntax is deprecated. Please use #pragma unroll_loop_start syntax instead."),ss(t,e,n,i)}function ss(t,e,n,i){let r="";for(let t=parseInt(e);t<parseInt(n);t++)r+=i.replace(/\[\s*i\s*\]/g,"[ "+t+" ]").replace(/UNROLLED_LOOP_INDEX/g,t);return r}function as(t){let e="precision "+t.precision+" float;\nprecision "+t.precision+" int;";return"highp"===t.precision?e+="\n#define HIGH_PRECISION":"mediump"===t.precision?e+="\n#define MEDIUM_PRECISION":"lowp"===t.precision&&(e+="\n#define LOW_PRECISION"),e}function os(t,e,n,i){const r=t.getContext(),s=n.defines;let a=n.vertexShader,o=n.fragmentShader;const l=function(t){let e="SHADOWMAP_TYPE_BASIC";return 1===t.shadowMapType?e="SHADOWMAP_TYPE_PCF":2===t.shadowMapType?e="SHADOWMAP_TYPE_PCF_SOFT":3===t.shadowMapType&&(e="SHADOWMAP_TYPE_VSM"),e}(n),h=function(t){let e="ENVMAP_TYPE_CUBE";if(t.envMap)switch(t.envMapMode){case _t:case yt:e="ENVMAP_TYPE_CUBE";break;case bt:case 307:e="ENVMAP_TYPE_CUBE_UV"}return e}(n),c=function(t){let e="ENVMAP_MODE_REFLECTION";if(t.envMap)switch(t.envMapMode){case yt:case 307:e="ENVMAP_MODE_REFRACTION"}return e}(n),u=function(t){let e="ENVMAP_BLENDING_NONE";if(t.envMap)switch(t.combine){case 0:e="ENVMAP_BLENDING_MULTIPLY";break;case 1:e="ENVMAP_BLENDING_MIX";break;case 2:e="ENVMAP_BLENDING_ADD"}return e}(n),d=n.isWebGL2?"":function(t){return[t.extensionDerivatives||t.envMapCubeUV||t.bumpMap||t.tangentSpaceNormalMap||t.clearcoatNormalMap||t.flatShading||"physical"===t.shaderID?"#extension GL_OES_standard_derivatives : enable":"",(t.extensionFragDepth||t.logarithmicDepthBuffer)&&t.rendererExtensionFragDepth?"#extension GL_EXT_frag_depth : enable":"",t.extensionDrawBuffers&&t.rendererExtensionDrawBuffers?"#extension GL_EXT_draw_buffers : require":"",(t.extensionShaderTextureLOD||t.envMap||t.transmission)&&t.rendererExtensionShaderTextureLod?"#extension GL_EXT_shader_texture_lod : enable":""].filter($r).join("\n")}(n),p=function(t){const e=[];for(const n in t){const i=t[n];!1!==i&&e.push("#define "+n+" "+i)}return e.join("\n")}(s),f=r.createProgram();let m,g,v=n.glslVersion?"#version "+n.glslVersion+"\n":"";n.isRawShaderMaterial?(m=[p].filter($r).join("\n"),m.length>0&&(m+="\n"),g=[d,p].filter($r).join("\n"),g.length>0&&(g+="\n")):(m=[as(n),"#define SHADER_NAME "+n.shaderName,p,n.instancing?"#define USE_INSTANCING":"",n.instancingColor?"#define USE_INSTANCING_COLOR":"",n.supportsVertexTextures?"#define VERTEX_TEXTURES":"","#define MAX_BONES "+n.maxBones,n.useFog&&n.fog?"#define USE_FOG":"",n.useFog&&n.fogExp2?"#define FOG_EXP2":"",n.map?"#define USE_MAP":"",n.envMap?"#define USE_ENVMAP":"",n.envMap?"#define "+c:"",n.lightMap?"#define USE_LIGHTMAP":"",n.aoMap?"#define USE_AOMAP":"",n.emissiveMap?"#define USE_EMISSIVEMAP":"",n.bumpMap?"#define USE_BUMPMAP":"",n.normalMap?"#define USE_NORMALMAP":"",n.normalMap&&n.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",n.normalMap&&n.tangentSpaceNormalMap?"#define TANGENTSPACE_NORMALMAP":"",n.clearcoatMap?"#define USE_CLEARCOATMAP":"",n.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",n.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",n.displacementMap&&n.supportsVertexTextures?"#define USE_DISPLACEMENTMAP":"",n.specularMap?"#define USE_SPECULARMAP":"",n.specularIntensityMap?"#define USE_SPECULARINTENSITYMAP":"",n.specularColorMap?"#define USE_SPECULARCOLORMAP":"",n.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.transmission?"#define USE_TRANSMISSION":"",n.transmissionMap?"#define USE_TRANSMISSIONMAP":"",n.thicknessMap?"#define USE_THICKNESSMAP":"",n.sheenColorMap?"#define USE_SHEENCOLORMAP":"",n.sheenRoughnessMap?"#define USE_SHEENROUGHNESSMAP":"",n.vertexTangents?"#define USE_TANGENT":"",n.vertexColors?"#define USE_COLOR":"",n.vertexAlphas?"#define USE_COLOR_ALPHA":"",n.vertexUvs?"#define USE_UV":"",n.uvsVertexOnly?"#define UVS_VERTEX_ONLY":"",n.flatShading?"#define FLAT_SHADED":"",n.skinning?"#define USE_SKINNING":"",n.useVertexTexture?"#define BONE_TEXTURE":"",n.morphTargets?"#define USE_MORPHTARGETS":"",n.morphNormals&&!1===n.flatShading?"#define USE_MORPHNORMALS":"",n.morphTargets&&n.isWebGL2?"#define MORPHTARGETS_TEXTURE":"",n.morphTargets&&n.isWebGL2?"#define MORPHTARGETS_COUNT "+n.morphTargetsCount:"",n.doubleSided?"#define DOUBLE_SIDED":"",n.flipSided?"#define FLIP_SIDED":"",n.shadowMapEnabled?"#define USE_SHADOWMAP":"",n.shadowMapEnabled?"#define "+l:"",n.sizeAttenuation?"#define USE_SIZEATTENUATION":"",n.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",n.logarithmicDepthBuffer&&n.rendererExtensionFragDepth?"#define USE_LOGDEPTHBUF_EXT":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;","#ifdef USE_INSTANCING","\tattribute mat4 instanceMatrix;","#endif","#ifdef USE_INSTANCING_COLOR","\tattribute vec3 instanceColor;","#endif","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_TANGENT","\tattribute vec4 tangent;","#endif","#if defined( USE_COLOR_ALPHA )","\tattribute vec4 color;","#elif defined( USE_COLOR )","\tattribute vec3 color;","#endif","#if ( defined( USE_MORPHTARGETS ) && ! defined( MORPHTARGETS_TEXTURE ) )","\tattribute vec3 morphTarget0;","\tattribute vec3 morphTarget1;","\tattribute vec3 morphTarget2;","\tattribute vec3 morphTarget3;","\t#ifdef USE_MORPHNORMALS","\t\tattribute vec3 morphNormal0;","\t\tattribute vec3 morphNormal1;","\t\tattribute vec3 morphNormal2;","\t\tattribute vec3 morphNormal3;","\t#else","\t\tattribute vec3 morphTarget4;","\t\tattribute vec3 morphTarget5;","\t\tattribute vec3 morphTarget6;","\t\tattribute vec3 morphTarget7;","\t#endif","#endif","#ifdef USE_SKINNING","\tattribute vec4 skinIndex;","\tattribute vec4 skinWeight;","#endif","\n"].filter($r).join("\n"),g=[d,as(n),"#define SHADER_NAME "+n.shaderName,p,n.useFog&&n.fog?"#define USE_FOG":"",n.useFog&&n.fogExp2?"#define FOG_EXP2":"",n.map?"#define USE_MAP":"",n.matcap?"#define USE_MATCAP":"",n.envMap?"#define USE_ENVMAP":"",n.envMap?"#define "+h:"",n.envMap?"#define "+c:"",n.envMap?"#define "+u:"",n.lightMap?"#define USE_LIGHTMAP":"",n.aoMap?"#define USE_AOMAP":"",n.emissiveMap?"#define USE_EMISSIVEMAP":"",n.bumpMap?"#define USE_BUMPMAP":"",n.normalMap?"#define USE_NORMALMAP":"",n.normalMap&&n.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",n.normalMap&&n.tangentSpaceNormalMap?"#define TANGENTSPACE_NORMALMAP":"",n.clearcoat?"#define USE_CLEARCOAT":"",n.clearcoatMap?"#define USE_CLEARCOATMAP":"",n.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",n.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",n.specularMap?"#define USE_SPECULARMAP":"",n.specularIntensityMap?"#define USE_SPECULARINTENSITYMAP":"",n.specularColorMap?"#define USE_SPECULARCOLORMAP":"",n.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.alphaTest?"#define USE_ALPHATEST":"",n.sheen?"#define USE_SHEEN":"",n.sheenColorMap?"#define USE_SHEENCOLORMAP":"",n.sheenRoughnessMap?"#define USE_SHEENROUGHNESSMAP":"",n.transmission?"#define USE_TRANSMISSION":"",n.transmissionMap?"#define USE_TRANSMISSIONMAP":"",n.thicknessMap?"#define USE_THICKNESSMAP":"",n.decodeVideoTexture?"#define DECODE_VIDEO_TEXTURE":"",n.vertexTangents?"#define USE_TANGENT":"",n.vertexColors||n.instancingColor?"#define USE_COLOR":"",n.vertexAlphas?"#define USE_COLOR_ALPHA":"",n.vertexUvs?"#define USE_UV":"",n.uvsVertexOnly?"#define UVS_VERTEX_ONLY":"",n.gradientMap?"#define USE_GRADIENTMAP":"",n.flatShading?"#define FLAT_SHADED":"",n.doubleSided?"#define DOUBLE_SIDED":"",n.flipSided?"#define FLIP_SIDED":"",n.shadowMapEnabled?"#define USE_SHADOWMAP":"",n.shadowMapEnabled?"#define "+l:"",n.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",n.physicallyCorrectLights?"#define PHYSICALLY_CORRECT_LIGHTS":"",n.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",n.logarithmicDepthBuffer&&n.rendererExtensionFragDepth?"#define USE_LOGDEPTHBUF_EXT":"",(n.extensionShaderTextureLOD||n.envMap)&&n.rendererExtensionShaderTextureLod?"#define TEXTURE_LOD_EXT":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",0!==n.toneMapping?"#define TONE_MAPPING":"",0!==n.toneMapping?Bn.tonemapping_pars_fragment:"",0!==n.toneMapping?Yr("toneMapping",n.toneMapping):"",n.dithering?"#define DITHERING":"",n.transparent?"":"#define OPAQUE",Bn.encodings_pars_fragment,Xr("linearToOutputTexel",n.outputEncoding),n.depthPacking?"#define DEPTH_PACKING "+n.depthPacking:"","\n"].filter($r).join("\n")),a=Qr(a),a=Zr(a,n),a=Kr(a,n),o=Qr(o),o=Zr(o,n),o=Kr(o,n),a=is(a),o=is(o),n.isWebGL2&&!0!==n.isRawShaderMaterial&&(v="#version 300 es\n",m=["precision mediump sampler2DArray;","#define attribute in","#define varying out","#define texture2D texture"].join("\n")+"\n"+m,g=["#define varying in",n.glslVersion===jt?"":"layout(location = 0) out highp vec4 pc_fragColor;",n.glslVersion===jt?"":"#define gl_FragColor pc_fragColor","#define gl_FragDepthEXT gl_FragDepth","#define texture2D texture","#define textureCube texture","#define texture2DProj textureProj","#define texture2DLodEXT textureLod","#define texture2DProjLodEXT textureProjLod","#define textureCubeLodEXT textureLod","#define texture2DGradEXT textureGrad","#define texture2DProjGradEXT textureProjGrad","#define textureCubeGradEXT textureGrad"].join("\n")+"\n"+g);const x=v+m+a,_=v+g+o,y=jr(r,r.VERTEX_SHADER,x),b=jr(r,r.FRAGMENT_SHADER,_);if(r.attachShader(f,y),r.attachShader(f,b),void 0!==n.index0AttributeName?r.bindAttribLocation(f,0,n.index0AttributeName):!0===n.morphTargets&&r.bindAttribLocation(f,0,"position"),r.linkProgram(f),t.debug.checkShaderErrors){const t=r.getProgramInfoLog(f).trim(),e=r.getShaderInfoLog(y).trim(),n=r.getShaderInfoLog(b).trim();let i=!0,s=!0;if(!1===r.getProgramParameter(f,r.LINK_STATUS)){i=!1;const e=Wr(r,y,"vertex"),n=Wr(r,b,"fragment");console.error("THREE.WebGLProgram: Shader Error "+r.getError()+" - VALIDATE_STATUS "+r.getProgramParameter(f,r.VALIDATE_STATUS)+"\n\nProgram Info Log: "+t+"\n"+e+"\n"+n)}else""!==t?console.warn("THREE.WebGLProgram: Program Info Log:",t):""!==e&&""!==n||(s=!1);s&&(this.diagnostics={runnable:i,programLog:t,vertexShader:{log:e,prefix:m},fragmentShader:{log:n,prefix:g}})}let w,S;return r.deleteShader(y),r.deleteShader(b),this.getUniforms=function(){return void 0===w&&(w=new Gr(r,f)),w},this.getAttributes=function(){return void 0===S&&(S=function(t,e){const n={},i=t.getProgramParameter(e,t.ACTIVE_ATTRIBUTES);for(let r=0;r<i;r++){const i=t.getActiveAttrib(e,r),s=i.name;let a=1;i.type===t.FLOAT_MAT2&&(a=2),i.type===t.FLOAT_MAT3&&(a=3),i.type===t.FLOAT_MAT4&&(a=4),n[s]={type:i.type,location:t.getAttribLocation(e,s),locationSize:a}}return n}(r,f)),S},this.destroy=function(){i.releaseStatesOfProgram(this),r.deleteProgram(f),this.program=void 0},this.name=n.shaderName,this.id=qr++,this.cacheKey=e,this.usedTimes=1,this.program=f,this.vertexShader=y,this.fragmentShader=b,this}let ls=0;class hs{constructor(){this.shaderCache=new Map,this.materialCache=new Map}update(t){const e=t.vertexShader,n=t.fragmentShader,i=this._getShaderStage(e),r=this._getShaderStage(n),s=this._getShaderCacheForMaterial(t);return!1===s.has(i)&&(s.add(i),i.usedTimes++),!1===s.has(r)&&(s.add(r),r.usedTimes++),this}remove(t){const e=this.materialCache.get(t);for(const t of e)t.usedTimes--,0===t.usedTimes&&this.shaderCache.delete(t);return this.materialCache.delete(t),this}getVertexShaderID(t){return this._getShaderStage(t.vertexShader).id}getFragmentShaderID(t){return this._getShaderStage(t.fragmentShader).id}dispose(){this.shaderCache.clear(),this.materialCache.clear()}_getShaderCacheForMaterial(t){const e=this.materialCache;return!1===e.has(t)&&e.set(t,new Set),e.get(t)}_getShaderStage(t){const e=this.shaderCache;if(!1===e.has(t)){const n=new cs;e.set(t,n)}return e.get(t)}}class cs{constructor(){this.id=ls++,this.usedTimes=0}}function us(t,e,n,i,r,s,a){const o=new Q,l=new hs,h=[],c=r.isWebGL2,u=r.logarithmicDepthBuffer,d=r.floatVertexTextures,p=r.maxVertexUniforms,f=r.vertexTextures;let m=r.precision;const g={MeshDepthMaterial:"depth",MeshDistanceMaterial:"distanceRGBA",MeshNormalMaterial:"normal",MeshBasicMaterial:"basic",MeshLambertMaterial:"lambert",MeshPhongMaterial:"phong",MeshToonMaterial:"toon",MeshStandardMaterial:"physical",MeshPhysicalMaterial:"physical",MeshMatcapMaterial:"matcap",LineBasicMaterial:"basic",LineDashedMaterial:"dashed",PointsMaterial:"points",ShadowMaterial:"shadow",SpriteMaterial:"sprite"};return{getParameters:function(s,o,h,v,x){const _=v.fog,y=s.isMeshStandardMaterial?v.environment:null,b=(s.isMeshStandardMaterial?n:e).get(s.envMap||y),w=g[s.type],S=x.isSkinnedMesh?function(t){const e=t.skeleton.bones;if(d)return 1024;{const t=p,n=Math.floor((t-20)/4),i=Math.min(n,e.length);return i<e.length?(console.warn("THREE.WebGLRenderer: Skeleton has "+e.length+" bones. This GPU supports "+i+"."),0):i}}(x):0;let M,T,E,A;if(null!==s.precision&&(m=r.getMaxPrecision(s.precision),m!==s.precision&&console.warn("THREE.WebGLProgram.getParameters:",s.precision,"not supported, using",m,"instead.")),w){const t=Hn[w];M=t.vertexShader,T=t.fragmentShader}else M=s.vertexShader,T=s.fragmentShader,l.update(s),E=l.getVertexShaderID(s),A=l.getFragmentShaderID(s);const C=t.getRenderTarget(),R=s.alphaTest>0,D=s.clearcoat>0;return{isWebGL2:c,shaderID:w,shaderName:s.type,vertexShader:M,fragmentShader:T,defines:s.defines,customVertexShaderID:E,customFragmentShaderID:A,isRawShaderMaterial:!0===s.isRawShaderMaterial,glslVersion:s.glslVersion,precision:m,instancing:!0===x.isInstancedMesh,instancingColor:!0===x.isInstancedMesh&&null!==x.instanceColor,supportsVertexTextures:f,outputEncoding:null===C?t.outputEncoding:!0===C.isXRRenderTarget?C.texture.encoding:Vt,map:!!s.map,matcap:!!s.matcap,envMap:!!b,envMapMode:b&&b.mapping,envMapCubeUV:!!b&&(b.mapping===bt||307===b.mapping),lightMap:!!s.lightMap,aoMap:!!s.aoMap,emissiveMap:!!s.emissiveMap,bumpMap:!!s.bumpMap,normalMap:!!s.normalMap,objectSpaceNormalMap:1===s.normalMapType,tangentSpaceNormalMap:0===s.normalMapType,decodeVideoTexture:!!s.map&&!0===s.map.isVideoTexture&&s.map.encoding===Ht,clearcoat:D,clearcoatMap:D&&!!s.clearcoatMap,clearcoatRoughnessMap:D&&!!s.clearcoatRoughnessMap,clearcoatNormalMap:D&&!!s.clearcoatNormalMap,displacementMap:!!s.displacementMap,roughnessMap:!!s.roughnessMap,metalnessMap:!!s.metalnessMap,specularMap:!!s.specularMap,specularIntensityMap:!!s.specularIntensityMap,specularColorMap:!!s.specularColorMap,transparent:s.transparent,alphaMap:!!s.alphaMap,alphaTest:R,gradientMap:!!s.gradientMap,sheen:s.sheen>0,sheenColorMap:!!s.sheenColorMap,sheenRoughnessMap:!!s.sheenRoughnessMap,transmission:s.transmission>0,transmissionMap:!!s.transmissionMap,thicknessMap:!!s.thicknessMap,combine:s.combine,vertexTangents:!!s.normalMap&&!!x.geometry&&!!x.geometry.attributes.tangent,vertexColors:s.vertexColors,vertexAlphas:!0===s.vertexColors&&!!x.geometry&&!!x.geometry.attributes.color&&4===x.geometry.attributes.color.itemSize,vertexUvs:!!(s.map||s.bumpMap||s.normalMap||s.specularMap||s.alphaMap||s.emissiveMap||s.roughnessMap||s.metalnessMap||s.clearcoatMap||s.clearcoatRoughnessMap||s.clearcoatNormalMap||s.displacementMap||s.transmissionMap||s.thicknessMap||s.specularIntensityMap||s.specularColorMap||s.sheenColorMap||s.sheenRoughnessMap),uvsVertexOnly:!(s.map||s.bumpMap||s.normalMap||s.specularMap||s.alphaMap||s.emissiveMap||s.roughnessMap||s.metalnessMap||s.clearcoatNormalMap||s.transmission>0||s.transmissionMap||s.thicknessMap||s.specularIntensityMap||s.specularColorMap||s.sheen>0||s.sheenColorMap||s.sheenRoughnessMap||!s.displacementMap),fog:!!_,useFog:s.fog,fogExp2:_&&_.isFogExp2,flatShading:!!s.flatShading,sizeAttenuation:s.sizeAttenuation,logarithmicDepthBuffer:u,skinning:!0===x.isSkinnedMesh&&S>0,maxBones:S,useVertexTexture:d,morphTargets:!!x.geometry&&!!x.geometry.morphAttributes.position,morphNormals:!!x.geometry&&!!x.geometry.morphAttributes.normal,morphTargetsCount:x.geometry&&x.geometry.morphAttributes.position?x.geometry.morphAttributes.position.length:0,numDirLights:o.directional.length,numPointLights:o.point.length,numSpotLights:o.spot.length,numRectAreaLights:o.rectArea.length,numHemiLights:o.hemi.length,numDirLightShadows:o.directionalShadowMap.length,numPointLightShadows:o.pointShadowMap.length,numSpotLightShadows:o.spotShadowMap.length,numClippingPlanes:a.numPlanes,numClipIntersection:a.numIntersection,dithering:s.dithering,shadowMapEnabled:t.shadowMap.enabled&&h.length>0,shadowMapType:t.shadowMap.type,toneMapping:s.toneMapped?t.toneMapping:0,physicallyCorrectLights:t.physicallyCorrectLights,premultipliedAlpha:s.premultipliedAlpha,doubleSided:2===s.side,flipSided:1===s.side,depthPacking:void 0!==s.depthPacking&&s.depthPacking,index0AttributeName:s.index0AttributeName,extensionDerivatives:s.extensions&&s.extensions.derivatives,extensionFragDepth:s.extensions&&s.extensions.fragDepth,extensionDrawBuffers:s.extensions&&s.extensions.drawBuffers,extensionShaderTextureLOD:s.extensions&&s.extensions.shaderTextureLOD,rendererExtensionFragDepth:c||i.has("EXT_frag_depth"),rendererExtensionDrawBuffers:c||i.has("WEBGL_draw_buffers"),rendererExtensionShaderTextureLod:c||i.has("EXT_shader_texture_lod"),customProgramCacheKey:s.customProgramCacheKey()}},getProgramCacheKey:function(e){const n=[];if(e.shaderID?n.push(e.shaderID):(n.push(e.customVertexShaderID),n.push(e.customFragmentShaderID)),void 0!==e.defines)for(const t in e.defines)n.push(t),n.push(e.defines[t]);return!1===e.isRawShaderMaterial&&(!function(t,e){t.push(e.precision),t.push(e.outputEncoding),t.push(e.envMapMode),t.push(e.combine),t.push(e.vertexUvs),t.push(e.fogExp2),t.push(e.sizeAttenuation),t.push(e.maxBones),t.push(e.morphTargetsCount),t.push(e.numDirLights),t.push(e.numPointLights),t.push(e.numSpotLights),t.push(e.numHemiLights),t.push(e.numRectAreaLights),t.push(e.numDirLightShadows),t.push(e.numPointLightShadows),t.push(e.numSpotLightShadows),t.push(e.shadowMapType),t.push(e.toneMapping),t.push(e.numClippingPlanes),t.push(e.numClipIntersection)}(n,e),function(t,e){o.disableAll(),e.isWebGL2&&o.enable(0);e.supportsVertexTextures&&o.enable(1);e.instancing&&o.enable(2);e.instancingColor&&o.enable(3);e.map&&o.enable(4);e.matcap&&o.enable(5);e.envMap&&o.enable(6);e.envMapCubeUV&&o.enable(7);e.lightMap&&o.enable(8);e.aoMap&&o.enable(9);e.emissiveMap&&o.enable(10);e.bumpMap&&o.enable(11);e.normalMap&&o.enable(12);e.objectSpaceNormalMap&&o.enable(13);e.tangentSpaceNormalMap&&o.enable(14);e.clearcoat&&o.enable(15);e.clearcoatMap&&o.enable(16);e.clearcoatRoughnessMap&&o.enable(17);e.clearcoatNormalMap&&o.enable(18);e.displacementMap&&o.enable(19);e.specularMap&&o.enable(20);e.roughnessMap&&o.enable(21);e.metalnessMap&&o.enable(22);e.gradientMap&&o.enable(23);e.alphaMap&&o.enable(24);e.alphaTest&&o.enable(25);e.vertexColors&&o.enable(26);e.vertexAlphas&&o.enable(27);e.vertexUvs&&o.enable(28);e.vertexTangents&&o.enable(29);e.uvsVertexOnly&&o.enable(30);e.fog&&o.enable(31);t.push(o.mask),o.disableAll(),e.useFog&&o.enable(0);e.flatShading&&o.enable(1);e.logarithmicDepthBuffer&&o.enable(2);e.skinning&&o.enable(3);e.useVertexTexture&&o.enable(4);e.morphTargets&&o.enable(5);e.morphNormals&&o.enable(6);e.premultipliedAlpha&&o.enable(7);e.shadowMapEnabled&&o.enable(8);e.physicallyCorrectLights&&o.enable(9);e.doubleSided&&o.enable(10);e.flipSided&&o.enable(11);e.depthPacking&&o.enable(12);e.dithering&&o.enable(13);e.specularIntensityMap&&o.enable(14);e.specularColorMap&&o.enable(15);e.transmission&&o.enable(16);e.transmissionMap&&o.enable(17);e.thicknessMap&&o.enable(18);e.sheen&&o.enable(19);e.sheenColorMap&&o.enable(20);e.sheenRoughnessMap&&o.enable(21);e.decodeVideoTexture&&o.enable(22);e.transparent&&o.enable(23);t.push(o.mask)}(n,e),n.push(t.outputEncoding)),n.push(e.customProgramCacheKey),n.join()},getUniforms:function(t){const e=g[t.type];let n;if(e){const t=Hn[e];n=Je.clone(t.uniforms)}else n=t.uniforms;return n},acquireProgram:function(e,n){let i;for(let t=0,e=h.length;t<e;t++){const e=h[t];if(e.cacheKey===n){i=e,++i.usedTimes;break}}return void 0===i&&(i=new os(t,n,e,s),h.push(i)),i},releaseProgram:function(t){if(0==--t.usedTimes){const e=h.indexOf(t);h[e]=h[h.length-1],h.pop(),t.destroy()}},releaseShaderCache:function(t){l.remove(t)},programs:h,dispose:function(){l.dispose()}}}function ds(){let t=new WeakMap;return{get:function(e){let n=t.get(e);return void 0===n&&(n={},t.set(e,n)),n},remove:function(e){t.delete(e)},update:function(e,n,i){t.get(e)[n]=i},dispose:function(){t=new WeakMap}}}function ps(t,e){return t.groupOrder!==e.groupOrder?t.groupOrder-e.groupOrder:t.renderOrder!==e.renderOrder?t.renderOrder-e.renderOrder:t.material.id!==e.material.id?t.material.id-e.material.id:t.z!==e.z?t.z-e.z:t.id-e.id}function fs(t,e){return t.groupOrder!==e.groupOrder?t.groupOrder-e.groupOrder:t.renderOrder!==e.renderOrder?t.renderOrder-e.renderOrder:t.z!==e.z?e.z-t.z:t.id-e.id}function ms(){const t=[];let e=0;const n=[],i=[],r=[];function s(n,i,r,s,a,o){let l=t[e];return void 0===l?(l={id:n.id,object:n,geometry:i,material:r,groupOrder:s,renderOrder:n.renderOrder,z:a,group:o},t[e]=l):(l.id=n.id,l.object=n,l.geometry=i,l.material=r,l.groupOrder=s,l.renderOrder=n.renderOrder,l.z=a,l.group=o),e++,l}return{opaque:n,transmissive:i,transparent:r,init:function(){e=0,n.length=0,i.length=0,r.length=0},push:function(t,e,a,o,l,h){const c=s(t,e,a,o,l,h);a.transmission>0?i.push(c):!0===a.transparent?r.push(c):n.push(c)},unshift:function(t,e,a,o,l,h){const c=s(t,e,a,o,l,h);a.transmission>0?i.unshift(c):!0===a.transparent?r.unshift(c):n.unshift(c)},finish:function(){for(let n=e,i=t.length;n<i;n++){const e=t[n];if(null===e.id)break;e.id=null,e.object=null,e.geometry=null,e.material=null,e.group=null}},sort:function(t,e){n.length>1&&n.sort(t||ps),i.length>1&&i.sort(e||fs),r.length>1&&r.sort(e||fs)}}}function gs(){let t=new WeakMap;return{get:function(e,n){let i;return!1===t.has(e)?(i=new ms,t.set(e,[i])):n>=t.get(e).length?(i=new ms,t.get(e).push(i)):i=t.get(e)[n],i},dispose:function(){t=new WeakMap}}}function vs(){const t={};return{get:function(e){if(void 0!==t[e.id])return t[e.id];let n;switch(e.type){case"DirectionalLight":n={direction:new U,color:new Re};break;case"SpotLight":n={position:new U,direction:new U,color:new Re,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":n={position:new U,color:new Re,distance:0,decay:0};break;case"HemisphereLight":n={direction:new U,skyColor:new Re,groundColor:new Re};break;case"RectAreaLight":n={color:new Re,position:new U,halfWidth:new U,halfHeight:new U}}return t[e.id]=n,n}}}let xs=0;function _s(t,e){return(e.castShadow?1:0)-(t.castShadow?1:0)}function ys(t,e){const n=new vs,i=function(){const t={};return{get:function(e){if(void 0!==t[e.id])return t[e.id];let n;switch(e.type){case"DirectionalLight":case"SpotLight":n={shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new we};break;case"PointLight":n={shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new we,shadowCameraNear:1,shadowCameraFar:1e3}}return t[e.id]=n,n}}}(),r={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotShadow:[],spotShadowMap:[],spotShadowMatrix:[],rectArea:[],rectAreaLTC1:null,rectAreaLTC2:null,point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[]};for(let t=0;t<9;t++)r.probe.push(new U);const s=new U,a=new H,o=new H;return{setup:function(s,a){let o=0,l=0,h=0;for(let t=0;t<9;t++)r.probe[t].set(0,0,0);let c=0,u=0,d=0,p=0,f=0,m=0,g=0,v=0;s.sort(_s);const x=!0!==a?Math.PI:1;for(let t=0,e=s.length;t<e;t++){const e=s[t],a=e.color,_=e.intensity,y=e.distance,b=e.shadow&&e.shadow.map?e.shadow.map.texture:null;if(e.isAmbientLight)o+=a.r*_*x,l+=a.g*_*x,h+=a.b*_*x;else if(e.isLightProbe)for(let t=0;t<9;t++)r.probe[t].addScaledVector(e.sh.coefficients[t],_);else if(e.isDirectionalLight){const t=n.get(e);if(t.color.copy(e.color).multiplyScalar(e.intensity*x),e.castShadow){const t=e.shadow,n=i.get(e);n.shadowBias=t.bias,n.shadowNormalBias=t.normalBias,n.shadowRadius=t.radius,n.shadowMapSize=t.mapSize,r.directionalShadow[c]=n,r.directionalShadowMap[c]=b,r.directionalShadowMatrix[c]=e.shadow.matrix,m++}r.directional[c]=t,c++}else if(e.isSpotLight){const t=n.get(e);if(t.position.setFromMatrixPosition(e.matrixWorld),t.color.copy(a).multiplyScalar(_*x),t.distance=y,t.coneCos=Math.cos(e.angle),t.penumbraCos=Math.cos(e.angle*(1-e.penumbra)),t.decay=e.decay,e.castShadow){const t=e.shadow,n=i.get(e);n.shadowBias=t.bias,n.shadowNormalBias=t.normalBias,n.shadowRadius=t.radius,n.shadowMapSize=t.mapSize,r.spotShadow[d]=n,r.spotShadowMap[d]=b,r.spotShadowMatrix[d]=e.shadow.matrix,v++}r.spot[d]=t,d++}else if(e.isRectAreaLight){const t=n.get(e);t.color.copy(a).multiplyScalar(_),t.halfWidth.set(.5*e.width,0,0),t.halfHeight.set(0,.5*e.height,0),r.rectArea[p]=t,p++}else if(e.isPointLight){const t=n.get(e);if(t.color.copy(e.color).multiplyScalar(e.intensity*x),t.distance=e.distance,t.decay=e.decay,e.castShadow){const t=e.shadow,n=i.get(e);n.shadowBias=t.bias,n.shadowNormalBias=t.normalBias,n.shadowRadius=t.radius,n.shadowMapSize=t.mapSize,n.shadowCameraNear=t.camera.near,n.shadowCameraFar=t.camera.far,r.pointShadow[u]=n,r.pointShadowMap[u]=b,r.pointShadowMatrix[u]=e.shadow.matrix,g++}r.point[u]=t,u++}else if(e.isHemisphereLight){const t=n.get(e);t.skyColor.copy(e.color).multiplyScalar(_*x),t.groundColor.copy(e.groundColor).multiplyScalar(_*x),r.hemi[f]=t,f++}}p>0&&(e.isWebGL2||!0===t.has("OES_texture_float_linear")?(r.rectAreaLTC1=Vn.LTC_FLOAT_1,r.rectAreaLTC2=Vn.LTC_FLOAT_2):!0===t.has("OES_texture_half_float_linear")?(r.rectAreaLTC1=Vn.LTC_HALF_1,r.rectAreaLTC2=Vn.LTC_HALF_2):console.error("THREE.WebGLRenderer: Unable to use RectAreaLight. Missing WebGL extensions.")),r.ambient[0]=o,r.ambient[1]=l,r.ambient[2]=h;const _=r.hash;_.directionalLength===c&&_.pointLength===u&&_.spotLength===d&&_.rectAreaLength===p&&_.hemiLength===f&&_.numDirectionalShadows===m&&_.numPointShadows===g&&_.numSpotShadows===v||(r.directional.length=c,r.spot.length=d,r.rectArea.length=p,r.point.length=u,r.hemi.length=f,r.directionalShadow.length=m,r.directionalShadowMap.length=m,r.pointShadow.length=g,r.pointShadowMap.length=g,r.spotShadow.length=v,r.spotShadowMap.length=v,r.directionalShadowMatrix.length=m,r.pointShadowMatrix.length=g,r.spotShadowMatrix.length=v,_.directionalLength=c,_.pointLength=u,_.spotLength=d,_.rectAreaLength=p,_.hemiLength=f,_.numDirectionalShadows=m,_.numPointShadows=g,_.numSpotShadows=v,r.version=xs++)},setupView:function(t,e){let n=0,i=0,l=0,h=0,c=0;const u=e.matrixWorldInverse;for(let e=0,d=t.length;e<d;e++){const d=t[e];if(d.isDirectionalLight){const t=r.directional[n];t.direction.setFromMatrixPosition(d.matrixWorld),s.setFromMatrixPosition(d.target.matrixWorld),t.direction.sub(s),t.direction.transformDirection(u),n++}else if(d.isSpotLight){const t=r.spot[l];t.position.setFromMatrixPosition(d.matrixWorld),t.position.applyMatrix4(u),t.direction.setFromMatrixPosition(d.matrixWorld),s.setFromMatrixPosition(d.target.matrixWorld),t.direction.sub(s),t.direction.transformDirection(u),l++}else if(d.isRectAreaLight){const t=r.rectArea[h];t.position.setFromMatrixPosition(d.matrixWorld),t.position.applyMatrix4(u),o.identity(),a.copy(d.matrixWorld),a.premultiply(u),o.extractRotation(a),t.halfWidth.set(.5*d.width,0,0),t.halfHeight.set(0,.5*d.height,0),t.halfWidth.applyMatrix4(o),t.halfHeight.applyMatrix4(o),h++}else if(d.isPointLight){const t=r.point[i];t.position.setFromMatrixPosition(d.matrixWorld),t.position.applyMatrix4(u),i++}else if(d.isHemisphereLight){const t=r.hemi[c];t.direction.setFromMatrixPosition(d.matrixWorld),t.direction.transformDirection(u),t.direction.normalize(),c++}}},state:r}}function bs(t,e){const n=new ys(t,e),i=[],r=[];return{init:function(){i.length=0,r.length=0},state:{lightsArray:i,shadowsArray:r,lights:n},setupLights:function(t){n.setup(i,t)},setupLightsView:function(t){n.setupView(i,t)},pushLight:function(t){i.push(t)},pushShadow:function(t){r.push(t)}}}function ws(t,e){let n=new WeakMap;return{get:function(i,r=0){let s;return!1===n.has(i)?(s=new bs(t,e),n.set(i,[s])):r>=n.get(i).length?(s=new bs(t,e),n.get(i).push(s)):s=n.get(i)[r],s},dispose:function(){n=new WeakMap}}}class Ss extends $e{constructor(t){super(),this.type="MeshDepthMaterial",this.depthPacking=3200,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.fog=!1,this.setValues(t)}copy(t){return super.copy(t),this.depthPacking=t.depthPacking,this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this}}Ss.prototype.isMeshDepthMaterial=!0;class Ms extends $e{constructor(t){super(),this.type="MeshDistanceMaterial",this.referencePosition=new U,this.nearDistance=1,this.farDistance=1e3,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.fog=!1,this.setValues(t)}copy(t){return super.copy(t),this.referencePosition.copy(t.referencePosition),this.nearDistance=t.nearDistance,this.farDistance=t.farDistance,this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this}}Ms.prototype.isMeshDistanceMaterial=!0;function Ts(t,e,n){let i=new xe;const r=new we,s=new we,a=new _e,o=new Ss({depthPacking:3201}),l=new Ms,h={},c=n.maxTextureSize,u={0:1,1:0,2:2},d=new Qe({defines:{VSM_SAMPLES:8},uniforms:{shadow_pass:{value:null},resolution:{value:new we},radius:{value:4}},vertexShader:"\nvoid main() {\n\n\tgl_Position = vec4( position, 1.0 );\n\n}\n",fragmentShader:"\nuniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\n\n#include <packing>\n\nvoid main() {\n\n\tconst float samples = float( VSM_SAMPLES );\n\n\tfloat mean = 0.0;\n\tfloat squared_mean = 0.0;\n\n\t// This seems totally useless but it's a crazy work around for a Adreno compiler bug\n\t// float depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy ) / resolution ) );\n\n\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\n\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\n\tfor ( float i = 0.0; i < samples; i ++ ) {\n\n\t\tfloat uvOffset = uvStart + i * uvStride;\n\n\t\t#ifdef HORIZONTAL_PASS\n\n\t\t\tvec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ) );\n\t\t\tmean += distribution.x;\n\t\t\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n\n\t\t#else\n\n\t\t\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ) );\n\t\t\tmean += depth;\n\t\t\tsquared_mean += depth * depth;\n\n\t\t#endif\n\n\t}\n\n\tmean = mean / samples;\n\tsquared_mean = squared_mean / samples;\n\n\tfloat std_dev = sqrt( squared_mean - mean * mean );\n\n\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\n\n}\n"}),p=d.clone();p.defines.HORIZONTAL_PASS=1;const f=new qe;f.setAttribute("position",new Pe(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));const m=new Fn(f,d),g=this;function v(n,i){const r=e.update(m);d.defines.VSM_SAMPLES!==n.blurSamples&&(d.defines.VSM_SAMPLES=n.blurSamples,p.defines.VSM_SAMPLES=n.blurSamples,d.needsUpdate=!0,p.needsUpdate=!0),d.uniforms.shadow_pass.value=n.map.texture,d.uniforms.resolution.value=n.mapSize,d.uniforms.radius.value=n.radius,t.setRenderTarget(n.mapPass),t.clear(),t.renderBufferDirect(i,null,r,d,m,null),p.uniforms.shadow_pass.value=n.mapPass.texture,p.uniforms.resolution.value=n.mapSize,p.uniforms.radius.value=n.radius,t.setRenderTarget(n.map),t.clear(),t.renderBufferDirect(i,null,r,p,m,null)}function x(e,n,i,r,s,a,c){let d=null;const p=!0===r.isPointLight?e.customDistanceMaterial:e.customDepthMaterial;if(d=void 0!==p?p:!0===r.isPointLight?l:o,t.localClippingEnabled&&!0===i.clipShadows&&0!==i.clippingPlanes.length||i.displacementMap&&0!==i.displacementScale||i.alphaMap&&i.alphaTest>0){const t=d.uuid,e=i.uuid;let n=h[t];void 0===n&&(n={},h[t]=n);let r=n[e];void 0===r&&(r=d.clone(),n[e]=r),d=r}return d.visible=i.visible,d.wireframe=i.wireframe,d.side=3===c?null!==i.shadowSide?i.shadowSide:i.side:null!==i.shadowSide?i.shadowSide:u[i.side],d.alphaMap=i.alphaMap,d.alphaTest=i.alphaTest,d.clipShadows=i.clipShadows,d.clippingPlanes=i.clippingPlanes,d.clipIntersection=i.clipIntersection,d.displacementMap=i.displacementMap,d.displacementScale=i.displacementScale,d.displacementBias=i.displacementBias,d.wireframeLinewidth=i.wireframeLinewidth,d.linewidth=i.linewidth,!0===r.isPointLight&&!0===d.isMeshDistanceMaterial&&(d.referencePosition.setFromMatrixPosition(r.matrixWorld),d.nearDistance=s,d.farDistance=a),d}function _(n,r,s,a,o){if(!1===n.visible)return;if(n.layers.test(r.layers)&&(n.isMesh||n.isLine||n.isPoints)&&(n.castShadow||n.receiveShadow&&3===o)&&(!n.frustumCulled||i.intersectsObject(n))){n.modelViewMatrix.multiplyMatrices(s.matrixWorldInverse,n.matrixWorld);const i=e.update(n),r=n.material;if(Array.isArray(r)){const e=i.groups;for(let l=0,h=e.length;l<h;l++){const h=e[l],c=r[h.materialIndex];if(c&&c.visible){const e=x(n,0,c,a,s.near,s.far,o);t.renderBufferDirect(s,null,i,e,n,h)}}}else if(r.visible){const e=x(n,0,r,a,s.near,s.far,o);t.renderBufferDirect(s,null,i,e,n,null)}}const l=n.children;for(let t=0,e=l.length;t<e;t++)_(l[t],r,s,a,o)}this.enabled=!1,this.autoUpdate=!0,this.needsUpdate=!1,this.type=1,this.render=function(e,n,o){if(!1===g.enabled)return;if(!1===g.autoUpdate&&!1===g.needsUpdate)return;if(0===e.length)return;const l=t.getRenderTarget(),h=t.getActiveCubeFace(),u=t.getActiveMipmapLevel(),d=t.state;d.setBlending(0),d.buffers.color.setClear(1,1,1,1),d.buffers.depth.setTest(!0),d.setScissorTest(!1);for(let l=0,h=e.length;l<h;l++){const h=e[l],u=h.shadow;if(void 0===u){console.warn("THREE.WebGLShadowMap:",h,"has no shadow.");continue}if(!1===u.autoUpdate&&!1===u.needsUpdate)continue;r.copy(u.mapSize);const p=u.getFrameExtents();if(r.multiply(p),s.copy(u.mapSize),(r.x>c||r.y>c)&&(r.x>c&&(s.x=Math.floor(c/p.x),r.x=s.x*p.x,u.mapSize.x=s.x),r.y>c&&(s.y=Math.floor(c/p.y),r.y=s.y*p.y,u.mapSize.y=s.y)),null===u.map&&!u.isPointLightShadow&&3===this.type){const t={minFilter:Et,magFilter:Et,format:zt};u.map=new Qn(r.x,r.y,t),u.map.texture.name=h.name+".shadowMap",u.mapPass=new Qn(r.x,r.y,t),u.camera.updateProjectionMatrix()}if(null===u.map){const t={minFilter:Tt,magFilter:Tt,format:zt};u.map=new Qn(r.x,r.y,t),u.map.texture.name=h.name+".shadowMap",u.camera.updateProjectionMatrix()}t.setRenderTarget(u.map),t.clear();const f=u.getViewportCount();for(let t=0;t<f;t++){const e=u.getViewport(t);a.set(s.x*e.x,s.y*e.y,s.x*e.z,s.y*e.w),d.viewport(a),u.updateMatrices(h,t),i=u.getFrustum(),_(n,o,u.camera,h,this.type)}u.isPointLightShadow||3!==this.type||v(u,o),u.needsUpdate=!1}g.needsUpdate=!1,t.setRenderTarget(l,h,u)}}function Es(t,e,n){const i=n.isWebGL2;const r=new function(){let e=!1;const n=new _e;let i=null;const r=new _e(0,0,0,0);return{setMask:function(n){i===n||e||(t.colorMask(n,n,n,n),i=n)},setLocked:function(t){e=t},setClear:function(e,i,s,a,o){!0===o&&(e*=a,i*=a,s*=a),n.set(e,i,s,a),!1===r.equals(n)&&(t.clearColor(e,i,s,a),r.copy(n))},reset:function(){e=!1,i=null,r.set(-1,0,0,0)}}},s=new function(){let e=!1,n=null,i=null,r=null;return{setTest:function(e){e?F(t.DEPTH_TEST):U(t.DEPTH_TEST)},setMask:function(i){n===i||e||(t.depthMask(i),n=i)},setFunc:function(e){if(i!==e){if(e)switch(e){case 0:t.depthFunc(t.NEVER);break;case 1:t.depthFunc(t.ALWAYS);break;case 2:t.depthFunc(t.LESS);break;case 3:default:t.depthFunc(t.LEQUAL);break;case 4:t.depthFunc(t.EQUAL);break;case 5:t.depthFunc(t.GEQUAL);break;case 6:t.depthFunc(t.GREATER);break;case 7:t.depthFunc(t.NOTEQUAL)}else t.depthFunc(t.LEQUAL);i=e}},setLocked:function(t){e=t},setClear:function(e){r!==e&&(t.clearDepth(e),r=e)},reset:function(){e=!1,n=null,i=null,r=null}}},a=new function(){let e=!1,n=null,i=null,r=null,s=null,a=null,o=null,l=null,h=null;return{setTest:function(n){e||(n?F(t.STENCIL_TEST):U(t.STENCIL_TEST))},setMask:function(i){n===i||e||(t.stencilMask(i),n=i)},setFunc:function(e,n,a){i===e&&r===n&&s===a||(t.stencilFunc(e,n,a),i=e,r=n,s=a)},setOp:function(e,n,i){a===e&&o===n&&l===i||(t.stencilOp(e,n,i),a=e,o=n,l=i)},setLocked:function(t){e=t},setClear:function(e){h!==e&&(t.clearStencil(e),h=e)},reset:function(){e=!1,n=null,i=null,r=null,s=null,a=null,o=null,l=null,h=null}}};let o={},l={},h=new WeakMap,c=[],u=null,d=!1,p=null,f=null,m=null,g=null,v=null,x=null,_=null,y=!1,b=null,w=null,S=null,M=null,T=null;const E=t.getParameter(t.MAX_COMBINED_TEXTURE_IMAGE_UNITS);let A=!1,C=0;const R=t.getParameter(t.VERSION);-1!==R.indexOf("WebGL")?(C=parseFloat(/^WebGL (\d)/.exec(R)[1]),A=C>=1):-1!==R.indexOf("OpenGL ES")&&(C=parseFloat(/^OpenGL ES (\d)/.exec(R)[1]),A=C>=2);let D=null,k={};const P=t.getParameter(t.SCISSOR_BOX),L=t.getParameter(t.VIEWPORT),z=(new _e).fromArray(P),O=(new _e).fromArray(L);function I(e,n,i){const r=new Uint8Array(4),s=t.createTexture();t.bindTexture(e,s),t.texParameteri(e,t.TEXTURE_MIN_FILTER,t.NEAREST),t.texParameteri(e,t.TEXTURE_MAG_FILTER,t.NEAREST);for(let e=0;e<i;e++)t.texImage2D(n+e,0,t.RGBA,1,1,0,t.RGBA,t.UNSIGNED_BYTE,r);return s}const N={};function F(e){!0!==o[e]&&(t.enable(e),o[e]=!0)}function U(e){!1!==o[e]&&(t.disable(e),o[e]=!1)}N[t.TEXTURE_2D]=I(t.TEXTURE_2D,t.TEXTURE_2D,1),N[t.TEXTURE_CUBE_MAP]=I(t.TEXTURE_CUBE_MAP,t.TEXTURE_CUBE_MAP_POSITIVE_X,6),r.setClear(0,0,0,1),s.setClear(1),a.setClear(0),F(t.DEPTH_TEST),s.setFunc(3),G(!1),j(1),F(t.CULL_FACE),H(0);const B={[xt]:t.FUNC_ADD,101:t.FUNC_SUBTRACT,102:t.FUNC_REVERSE_SUBTRACT};if(i)B[103]=t.MIN,B[104]=t.MAX;else{const t=e.get("EXT_blend_minmax");null!==t&&(B[103]=t.MIN_EXT,B[104]=t.MAX_EXT)}const V={200:t.ZERO,201:t.ONE,202:t.SRC_COLOR,204:t.SRC_ALPHA,210:t.SRC_ALPHA_SATURATE,208:t.DST_COLOR,206:t.DST_ALPHA,203:t.ONE_MINUS_SRC_COLOR,205:t.ONE_MINUS_SRC_ALPHA,209:t.ONE_MINUS_DST_COLOR,207:t.ONE_MINUS_DST_ALPHA};function H(e,n,i,r,s,a,o,l){if(0!==e){if(!1===d&&(F(t.BLEND),d=!0),5===e)s=s||n,a=a||i,o=o||r,n===f&&s===v||(t.blendEquationSeparate(B[n],B[s]),f=n,v=s),i===m&&r===g&&a===x&&o===_||(t.blendFuncSeparate(V[i],V[r],V[a],V[o]),m=i,g=r,x=a,_=o),p=e,y=null;else if(e!==p||l!==y){if(f===xt&&v===xt||(t.blendEquation(t.FUNC_ADD),f=xt,v=xt),l)switch(e){case 1:t.blendFuncSeparate(t.ONE,t.ONE_MINUS_SRC_ALPHA,t.ONE,t.ONE_MINUS_SRC_ALPHA);break;case 2:t.blendFunc(t.ONE,t.ONE);break;case 3:t.blendFuncSeparate(t.ZERO,t.ONE_MINUS_SRC_COLOR,t.ZERO,t.ONE);break;case 4:t.blendFuncSeparate(t.ZERO,t.SRC_COLOR,t.ZERO,t.SRC_ALPHA);break;default:console.error("THREE.WebGLState: Invalid blending: ",e)}else switch(e){case 1:t.blendFuncSeparate(t.SRC_ALPHA,t.ONE_MINUS_SRC_ALPHA,t.ONE,t.ONE_MINUS_SRC_ALPHA);break;case 2:t.blendFunc(t.SRC_ALPHA,t.ONE);break;case 3:t.blendFuncSeparate(t.ZERO,t.ONE_MINUS_SRC_COLOR,t.ZERO,t.ONE);break;case 4:t.blendFunc(t.ZERO,t.SRC_COLOR);break;default:console.error("THREE.WebGLState: Invalid blending: ",e)}m=null,g=null,x=null,_=null,p=e,y=l}}else!0===d&&(U(t.BLEND),d=!1)}function G(e){b!==e&&(e?t.frontFace(t.CW):t.frontFace(t.CCW),b=e)}function j(e){0!==e?(F(t.CULL_FACE),e!==w&&(1===e?t.cullFace(t.BACK):2===e?t.cullFace(t.FRONT):t.cullFace(t.FRONT_AND_BACK))):U(t.CULL_FACE),w=e}function q(e,n,i){e?(F(t.POLYGON_OFFSET_FILL),M===n&&T===i||(t.polygonOffset(n,i),M=n,T=i)):U(t.POLYGON_OFFSET_FILL)}function W(e){void 0===e&&(e=t.TEXTURE0+E-1),D!==e&&(t.activeTexture(e),D=e)}return{buffers:{color:r,depth:s,stencil:a},enable:F,disable:U,bindFramebuffer:function(e,n){return l[e]!==n&&(t.bindFramebuffer(e,n),l[e]=n,i&&(e===t.DRAW_FRAMEBUFFER&&(l[t.FRAMEBUFFER]=n),e===t.FRAMEBUFFER&&(l[t.DRAW_FRAMEBUFFER]=n)),!0)},drawBuffers:function(i,r){let s=c,a=!1;if(i)if(s=h.get(r),void 0===s&&(s=[],h.set(r,s)),i.isWebGLMultipleRenderTargets){const e=i.texture;if(s.length!==e.length||s[0]!==t.COLOR_ATTACHMENT0){for(let n=0,i=e.length;n<i;n++)s[n]=t.COLOR_ATTACHMENT0+n;s.length=e.length,a=!0}}else s[0]!==t.COLOR_ATTACHMENT0&&(s[0]=t.COLOR_ATTACHMENT0,a=!0);else s[0]!==t.BACK&&(s[0]=t.BACK,a=!0);a&&(n.isWebGL2?t.drawBuffers(s):e.get("WEBGL_draw_buffers").drawBuffersWEBGL(s))},useProgram:function(e){return u!==e&&(t.useProgram(e),u=e,!0)},setBlending:H,setMaterial:function(e,n){2===e.side?U(t.CULL_FACE):F(t.CULL_FACE);let i=1===e.side;n&&(i=!i),G(i),1===e.blending&&!1===e.transparent?H(0):H(e.blending,e.blendEquation,e.blendSrc,e.blendDst,e.blendEquationAlpha,e.blendSrcAlpha,e.blendDstAlpha,e.premultipliedAlpha),s.setFunc(e.depthFunc),s.setTest(e.depthTest),s.setMask(e.depthWrite),r.setMask(e.colorWrite);const o=e.stencilWrite;a.setTest(o),o&&(a.setMask(e.stencilWriteMask),a.setFunc(e.stencilFunc,e.stencilRef,e.stencilFuncMask),a.setOp(e.stencilFail,e.stencilZFail,e.stencilZPass)),q(e.polygonOffset,e.polygonOffsetFactor,e.polygonOffsetUnits),!0===e.alphaToCoverage?F(t.SAMPLE_ALPHA_TO_COVERAGE):U(t.SAMPLE_ALPHA_TO_COVERAGE)},setFlipSided:G,setCullFace:j,setLineWidth:function(e){e!==S&&(A&&t.lineWidth(e),S=e)},setPolygonOffset:q,setScissorTest:function(e){e?F(t.SCISSOR_TEST):U(t.SCISSOR_TEST)},activeTexture:W,bindTexture:function(e,n){null===D&&W();let i=k[D];void 0===i&&(i={type:void 0,texture:void 0},k[D]=i),i.type===e&&i.texture===n||(t.bindTexture(e,n||N[e]),i.type=e,i.texture=n)},unbindTexture:function(){const e=k[D];void 0!==e&&void 0!==e.type&&(t.bindTexture(e.type,null),e.type=void 0,e.texture=void 0)},compressedTexImage2D:function(){try{t.compressedTexImage2D.apply(t,arguments)}catch(t){console.error("THREE.WebGLState:",t)}},texImage2D:function(){try{t.texImage2D.apply(t,arguments)}catch(t){console.error("THREE.WebGLState:",t)}},texImage3D:function(){try{t.texImage3D.apply(t,arguments)}catch(t){console.error("THREE.WebGLState:",t)}},texStorage2D:function(){try{t.texStorage2D.apply(t,arguments)}catch(t){console.error("THREE.WebGLState:",t)}},texStorage3D:function(){try{t.texStorage3D.apply(t,arguments)}catch(t){console.error("THREE.WebGLState:",t)}},texSubImage2D:function(){try{t.texSubImage2D.apply(t,arguments)}catch(t){console.error("THREE.WebGLState:",t)}},texSubImage3D:function(){try{t.texSubImage3D.apply(t,arguments)}catch(t){console.error("THREE.WebGLState:",t)}},compressedTexSubImage2D:function(){try{t.compressedTexSubImage2D.apply(t,arguments)}catch(t){console.error("THREE.WebGLState:",t)}},scissor:function(e){!1===z.equals(e)&&(t.scissor(e.x,e.y,e.z,e.w),z.copy(e))},viewport:function(e){!1===O.equals(e)&&(t.viewport(e.x,e.y,e.z,e.w),O.copy(e))},reset:function(){t.disable(t.BLEND),t.disable(t.CULL_FACE),t.disable(t.DEPTH_TEST),t.disable(t.POLYGON_OFFSET_FILL),t.disable(t.SCISSOR_TEST),t.disable(t.STENCIL_TEST),t.disable(t.SAMPLE_ALPHA_TO_COVERAGE),t.blendEquation(t.FUNC_ADD),t.blendFunc(t.ONE,t.ZERO),t.blendFuncSeparate(t.ONE,t.ZERO,t.ONE,t.ZERO),t.colorMask(!0,!0,!0,!0),t.clearColor(0,0,0,0),t.depthMask(!0),t.depthFunc(t.LESS),t.clearDepth(1),t.stencilMask(4294967295),t.stencilFunc(t.ALWAYS,0,4294967295),t.stencilOp(t.KEEP,t.KEEP,t.KEEP),t.clearStencil(0),t.cullFace(t.BACK),t.frontFace(t.CCW),t.polygonOffset(0,0),t.activeTexture(t.TEXTURE0),t.bindFramebuffer(t.FRAMEBUFFER,null),!0===i&&(t.bindFramebuffer(t.DRAW_FRAMEBUFFER,null),t.bindFramebuffer(t.READ_FRAMEBUFFER,null)),t.useProgram(null),t.lineWidth(1),t.scissor(0,0,t.canvas.width,t.canvas.height),t.viewport(0,0,t.canvas.width,t.canvas.height),o={},D=null,k={},l={},h=new WeakMap,c=[],u=null,d=!1,p=null,f=null,m=null,g=null,v=null,x=null,_=null,y=!1,b=null,w=null,S=null,M=null,T=null,z.set(0,0,t.canvas.width,t.canvas.height),O.set(0,0,t.canvas.width,t.canvas.height),r.reset(),s.reset(),a.reset()}}}function As(t,e,n,i,r,s,a){const o=r.isWebGL2,l=r.maxTextures,h=r.maxCubemapSize,c=r.maxTextureSize,u=r.maxSamples,d=e.has("WEBGL_multisampled_render_to_texture")?e.get("WEBGL_multisampled_render_to_texture"):void 0,p=new WeakMap;let f,m=!1;try{m="undefined"!=typeof OffscreenCanvas&&null!==new OffscreenCanvas(1,1).getContext("2d")}catch(t){}function g(t,e){return m?new OffscreenCanvas(t,e):Ne("canvas")}function v(t,e,n,i){let r=1;if((t.width>i||t.height>i)&&(r=i/Math.max(t.width,t.height)),r<1||!0===e){if("undefined"!=typeof HTMLImageElement&&t instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&t instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&t instanceof ImageBitmap){const i=e?N:Math.floor,s=i(r*t.width),a=i(r*t.height);void 0===f&&(f=g(s,a));const o=n?g(s,a):f;o.width=s,o.height=a;return o.getContext("2d").drawImage(t,0,0,s,a),console.warn("THREE.WebGLRenderer: Texture has been resized from ("+t.width+"x"+t.height+") to ("+s+"x"+a+")."),o}return"data"in t&&console.warn("THREE.WebGLRenderer: Image in DataTexture is too big ("+t.width+"x"+t.height+")."),t}return t}function x(t){return I(t.width)&&I(t.height)}function _(t,e){return t.generateMipmaps&&e&&t.minFilter!==Tt&&t.minFilter!==Et}function y(e){t.generateMipmap(e)}function b(n,i,r,s,a=!1){if(!1===o)return i;if(null!==n){if(void 0!==t[n])return t[n];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+n+"'")}let l=i;return i===t.RED&&(r===t.FLOAT&&(l=t.R32F),r===t.HALF_FLOAT&&(l=t.R16F),r===t.UNSIGNED_BYTE&&(l=t.R8)),i===t.RG&&(r===t.FLOAT&&(l=t.RG32F),r===t.HALF_FLOAT&&(l=t.RG16F),r===t.UNSIGNED_BYTE&&(l=t.RG8)),i===t.RGBA&&(r===t.FLOAT&&(l=t.RGBA32F),r===t.HALF_FLOAT&&(l=t.RGBA16F),r===t.UNSIGNED_BYTE&&(l=s===Ht&&!1===a?t.SRGB8_ALPHA8:t.RGBA8),r===t.UNSIGNED_SHORT_4_4_4_4&&(l=t.RGBA4),r===t.UNSIGNED_SHORT_5_5_5_1&&(l=t.RGB5_A1)),l!==t.R16F&&l!==t.R32F&&l!==t.RG16F&&l!==t.RG32F&&l!==t.RGBA16F&&l!==t.RGBA32F||e.get("EXT_color_buffer_float"),l}function w(t,e,n){return!0===_(t,n)||t.isFramebufferTexture&&t.minFilter!==Tt&&t.minFilter!==Et?Math.log2(Math.max(e.width,e.height))+1:void 0!==t.mipmaps&&t.mipmaps.length>0?t.mipmaps.length:t.isCompressedTexture&&Array.isArray(t.image)?e.mipmaps.length:1}function S(e){return e===Tt||1004===e||1005===e?t.NEAREST:t.LINEAR}function M(e){const n=e.target;n.removeEventListener("dispose",M),function(e){const n=i.get(e);if(void 0===n.__webglInit)return;t.deleteTexture(n.__webglTexture),i.remove(e)}(n),n.isVideoTexture&&p.delete(n),a.memory.textures--}function T(e){const n=e.target;n.removeEventListener("dispose",T),function(e){const n=e.texture,r=i.get(e),s=i.get(n);if(!e)return;void 0!==s.__webglTexture&&(t.deleteTexture(s.__webglTexture),a.memory.textures--);e.depthTexture&&e.depthTexture.dispose();if(e.isWebGLCubeRenderTarget)for(let e=0;e<6;e++)t.deleteFramebuffer(r.__webglFramebuffer[e]),r.__webglDepthbuffer&&t.deleteRenderbuffer(r.__webglDepthbuffer[e]);else t.deleteFramebuffer(r.__webglFramebuffer),r.__webglDepthbuffer&&t.deleteRenderbuffer(r.__webglDepthbuffer),r.__webglMultisampledFramebuffer&&t.deleteFramebuffer(r.__webglMultisampledFramebuffer),r.__webglColorRenderbuffer&&t.deleteRenderbuffer(r.__webglColorRenderbuffer),r.__webglDepthRenderbuffer&&t.deleteRenderbuffer(r.__webglDepthRenderbuffer);if(e.isWebGLMultipleRenderTargets)for(let e=0,r=n.length;e<r;e++){const r=i.get(n[e]);r.__webglTexture&&(t.deleteTexture(r.__webglTexture),a.memory.textures--),i.remove(n[e])}i.remove(n),i.remove(e)}(n)}let E=0;function A(e,r){const s=i.get(e);if(e.isVideoTexture&&function(t){const e=a.render.frame;p.get(t)!==e&&(p.set(t,e),t.update())}(e),e.version>0&&s.__version!==e.version){const t=e.image;if(void 0===t)console.warn("THREE.WebGLRenderer: Texture marked for update but image is undefined");else{if(!1!==t.complete)return void L(s,e,r);console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete")}}n.activeTexture(t.TEXTURE0+r),n.bindTexture(t.TEXTURE_2D,s.__webglTexture)}function C(e,r){const a=i.get(e);e.version>0&&a.__version!==e.version?function(e,i,r){if(6!==i.image.length)return;P(e,i),n.activeTexture(t.TEXTURE0+r),n.bindTexture(t.TEXTURE_CUBE_MAP,e.__webglTexture),t.pixelStorei(t.UNPACK_FLIP_Y_WEBGL,i.flipY),t.pixelStorei(t.UNPACK_PREMULTIPLY_ALPHA_WEBGL,i.premultiplyAlpha),t.pixelStorei(t.UNPACK_ALIGNMENT,i.unpackAlignment),t.pixelStorei(t.UNPACK_COLORSPACE_CONVERSION_WEBGL,t.NONE);const a=i&&(i.isCompressedTexture||i.image[0].isCompressedTexture),l=i.image[0]&&i.image[0].isDataTexture,c=[];for(let t=0;t<6;t++)c[t]=a||l?l?i.image[t].image:i.image[t]:v(i.image[t],!1,!0,h),c[t]=B(i,c[t]);const u=c[0],d=x(u)||o,p=s.convert(i.format,i.encoding),f=s.convert(i.type),m=b(i.internalFormat,p,f,i.encoding),g=o&&!0!==i.isVideoTexture,S=void 0===e.__version;let M,T=w(i,u,d);if(k(t.TEXTURE_CUBE_MAP,i,d),a){g&&S&&n.texStorage2D(t.TEXTURE_CUBE_MAP,T,m,u.width,u.height);for(let e=0;e<6;e++){M=c[e].mipmaps;for(let r=0;r<M.length;r++){const s=M[r];i.format!==zt?null!==p?g?n.compressedTexSubImage2D(t.TEXTURE_CUBE_MAP_POSITIVE_X+e,r,0,0,s.width,s.height,p,s.data):n.compressedTexImage2D(t.TEXTURE_CUBE_MAP_POSITIVE_X+e,r,m,s.width,s.height,0,s.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()"):g?n.texSubImage2D(t.TEXTURE_CUBE_MAP_POSITIVE_X+e,r,0,0,s.width,s.height,p,f,s.data):n.texImage2D(t.TEXTURE_CUBE_MAP_POSITIVE_X+e,r,m,s.width,s.height,0,p,f,s.data)}}}else{M=i.mipmaps,g&&S&&(M.length>0&&T++,n.texStorage2D(t.TEXTURE_CUBE_MAP,T,m,c[0].width,c[0].height));for(let e=0;e<6;e++)if(l){g?n.texSubImage2D(t.TEXTURE_CUBE_MAP_POSITIVE_X+e,0,0,0,c[e].width,c[e].height,p,f,c[e].data):n.texImage2D(t.TEXTURE_CUBE_MAP_POSITIVE_X+e,0,m,c[e].width,c[e].height,0,p,f,c[e].data);for(let i=0;i<M.length;i++){const r=M[i].image[e].image;g?n.texSubImage2D(t.TEXTURE_CUBE_MAP_POSITIVE_X+e,i+1,0,0,r.width,r.height,p,f,r.data):n.texImage2D(t.TEXTURE_CUBE_MAP_POSITIVE_X+e,i+1,m,r.width,r.height,0,p,f,r.data)}}else{g?n.texSubImage2D(t.TEXTURE_CUBE_MAP_POSITIVE_X+e,0,0,0,p,f,c[e]):n.texImage2D(t.TEXTURE_CUBE_MAP_POSITIVE_X+e,0,m,p,f,c[e]);for(let i=0;i<M.length;i++){const r=M[i];g?n.texSubImage2D(t.TEXTURE_CUBE_MAP_POSITIVE_X+e,i+1,0,0,p,f,r.image[e]):n.texImage2D(t.TEXTURE_CUBE_MAP_POSITIVE_X+e,i+1,m,p,f,r.image[e])}}}_(i,d)&&y(t.TEXTURE_CUBE_MAP);e.__version=i.version,i.onUpdate&&i.onUpdate(i)}(a,e,r):(n.activeTexture(t.TEXTURE0+r),n.bindTexture(t.TEXTURE_CUBE_MAP,a.__webglTexture))}const R={[wt]:t.REPEAT,[St]:t.CLAMP_TO_EDGE,[Mt]:t.MIRRORED_REPEAT},D={[Tt]:t.NEAREST,1004:t.NEAREST_MIPMAP_NEAREST,1005:t.NEAREST_MIPMAP_LINEAR,[Et]:t.LINEAR,1007:t.LINEAR_MIPMAP_NEAREST,[At]:t.LINEAR_MIPMAP_LINEAR};function k(n,s,a){if(a?(t.texParameteri(n,t.TEXTURE_WRAP_S,R[s.wrapS]),t.texParameteri(n,t.TEXTURE_WRAP_T,R[s.wrapT]),n!==t.TEXTURE_3D&&n!==t.TEXTURE_2D_ARRAY||t.texParameteri(n,t.TEXTURE_WRAP_R,R[s.wrapR]),t.texParameteri(n,t.TEXTURE_MAG_FILTER,D[s.magFilter]),t.texParameteri(n,t.TEXTURE_MIN_FILTER,D[s.minFilter])):(t.texParameteri(n,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(n,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),n!==t.TEXTURE_3D&&n!==t.TEXTURE_2D_ARRAY||t.texParameteri(n,t.TEXTURE_WRAP_R,t.CLAMP_TO_EDGE),s.wrapS===St&&s.wrapT===St||console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping."),t.texParameteri(n,t.TEXTURE_MAG_FILTER,S(s.magFilter)),t.texParameteri(n,t.TEXTURE_MIN_FILTER,S(s.minFilter)),s.minFilter!==Tt&&s.minFilter!==Et&&console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.")),!0===e.has("EXT_texture_filter_anisotropic")){const a=e.get("EXT_texture_filter_anisotropic");if(s.type===kt&&!1===e.has("OES_texture_float_linear"))return;if(!1===o&&s.type===Pt&&!1===e.has("OES_texture_half_float_linear"))return;(s.anisotropy>1||i.get(s).__currentAnisotropy)&&(t.texParameterf(n,a.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(s.anisotropy,r.getMaxAnisotropy())),i.get(s).__currentAnisotropy=s.anisotropy)}}function P(e,n){void 0===e.__webglInit&&(e.__webglInit=!0,n.addEventListener("dispose",M),e.__webglTexture=t.createTexture(),a.memory.textures++)}function L(e,i,r){let a=t.TEXTURE_2D;i.isDataTexture2DArray&&(a=t.TEXTURE_2D_ARRAY),i.isDataTexture3D&&(a=t.TEXTURE_3D),P(e,i),n.activeTexture(t.TEXTURE0+r),n.bindTexture(a,e.__webglTexture),t.pixelStorei(t.UNPACK_FLIP_Y_WEBGL,i.flipY),t.pixelStorei(t.UNPACK_PREMULTIPLY_ALPHA_WEBGL,i.premultiplyAlpha),t.pixelStorei(t.UNPACK_ALIGNMENT,i.unpackAlignment),t.pixelStorei(t.UNPACK_COLORSPACE_CONVERSION_WEBGL,t.NONE);const l=function(t){return!o&&(t.wrapS!==St||t.wrapT!==St||t.minFilter!==Tt&&t.minFilter!==Et)}(i)&&!1===x(i.image);let h=v(i.image,l,!1,c);h=B(i,h);const u=x(h)||o,d=s.convert(i.format,i.encoding);let p,f=s.convert(i.type),m=b(i.internalFormat,d,f,i.encoding,i.isVideoTexture);k(a,i,u);const g=i.mipmaps,S=o&&!0!==i.isVideoTexture,M=void 0===e.__version,T=w(i,h,u);if(i.isDepthTexture)m=t.DEPTH_COMPONENT,o?m=i.type===kt?t.DEPTH_COMPONENT32F:i.type===Dt?t.DEPTH_COMPONENT24:i.type===Lt?t.DEPTH24_STENCIL8:t.DEPTH_COMPONENT16:i.type===kt&&console.error("WebGLRenderer: Floating point depth texture requires WebGL2."),i.format===Ot&&m===t.DEPTH_COMPONENT&&i.type!==Rt&&i.type!==Dt&&(console.warn("THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture."),i.type=Rt,f=s.convert(i.type)),i.format===It&&m===t.DEPTH_COMPONENT&&(m=t.DEPTH_STENCIL,i.type!==Lt&&(console.warn("THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture."),i.type=Lt,f=s.convert(i.type))),S&&M?n.texStorage2D(t.TEXTURE_2D,1,m,h.width,h.height):n.texImage2D(t.TEXTURE_2D,0,m,h.width,h.height,0,d,f,null);else if(i.isDataTexture)if(g.length>0&&u){S&&M&&n.texStorage2D(t.TEXTURE_2D,T,m,g[0].width,g[0].height);for(let e=0,i=g.length;e<i;e++)p=g[e],S?n.texSubImage2D(t.TEXTURE_2D,0,0,0,p.width,p.height,d,f,p.data):n.texImage2D(t.TEXTURE_2D,e,m,p.width,p.height,0,d,f,p.data);i.generateMipmaps=!1}else S?(M&&n.texStorage2D(t.TEXTURE_2D,T,m,h.width,h.height),n.texSubImage2D(t.TEXTURE_2D,0,0,0,h.width,h.height,d,f,h.data)):n.texImage2D(t.TEXTURE_2D,0,m,h.width,h.height,0,d,f,h.data);else if(i.isCompressedTexture){S&&M&&n.texStorage2D(t.TEXTURE_2D,T,m,g[0].width,g[0].height);for(let e=0,r=g.length;e<r;e++)p=g[e],i.format!==zt?null!==d?S?n.compressedTexSubImage2D(t.TEXTURE_2D,e,0,0,p.width,p.height,d,p.data):n.compressedTexImage2D(t.TEXTURE_2D,e,m,p.width,p.height,0,p.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()"):S?n.texSubImage2D(t.TEXTURE_2D,e,0,0,p.width,p.height,d,f,p.data):n.texImage2D(t.TEXTURE_2D,e,m,p.width,p.height,0,d,f,p.data)}else if(i.isDataTexture2DArray)S?(M&&n.texStorage3D(t.TEXTURE_2D_ARRAY,T,m,h.width,h.height,h.depth),n.texSubImage3D(t.TEXTURE_2D_ARRAY,0,0,0,0,h.width,h.height,h.depth,d,f,h.data)):n.texImage3D(t.TEXTURE_2D_ARRAY,0,m,h.width,h.height,h.depth,0,d,f,h.data);else if(i.isDataTexture3D)S?(M&&n.texStorage3D(t.TEXTURE_3D,T,m,h.width,h.height,h.depth),n.texSubImage3D(t.TEXTURE_3D,0,0,0,0,h.width,h.height,h.depth,d,f,h.data)):n.texImage3D(t.TEXTURE_3D,0,m,h.width,h.height,h.depth,0,d,f,h.data);else if(i.isFramebufferTexture)S&&M?n.texStorage2D(t.TEXTURE_2D,T,m,h.width,h.height):n.texImage2D(t.TEXTURE_2D,0,m,h.width,h.height,0,d,f,null);else if(g.length>0&&u){S&&M&&n.texStorage2D(t.TEXTURE_2D,T,m,g[0].width,g[0].height);for(let e=0,i=g.length;e<i;e++)p=g[e],S?n.texSubImage2D(t.TEXTURE_2D,e,0,0,d,f,p):n.texImage2D(t.TEXTURE_2D,e,m,d,f,p);i.generateMipmaps=!1}else S?(M&&n.texStorage2D(t.TEXTURE_2D,T,m,h.width,h.height),n.texSubImage2D(t.TEXTURE_2D,0,0,0,d,f,h)):n.texImage2D(t.TEXTURE_2D,0,m,d,f,h);_(i,u)&&y(a),e.__version=i.version,i.onUpdate&&i.onUpdate(i)}function z(e,r,a,o,l){const h=s.convert(a.format,a.encoding),c=s.convert(a.type),u=b(a.internalFormat,h,c,a.encoding);i.get(r).__hasExternalTextures||(l===t.TEXTURE_3D||l===t.TEXTURE_2D_ARRAY?n.texImage3D(l,0,u,r.width,r.height,r.depth,0,h,c,null):n.texImage2D(l,0,u,r.width,r.height,0,h,c,null)),n.bindFramebuffer(t.FRAMEBUFFER,e),r.useRenderToTexture?d.framebufferTexture2DMultisampleEXT(t.FRAMEBUFFER,o,l,i.get(a).__webglTexture,0,U(r)):t.framebufferTexture2D(t.FRAMEBUFFER,o,l,i.get(a).__webglTexture,0),n.bindFramebuffer(t.FRAMEBUFFER,null)}function O(e,n,i){if(t.bindRenderbuffer(t.RENDERBUFFER,e),n.depthBuffer&&!n.stencilBuffer){let r=t.DEPTH_COMPONENT16;if(i||n.useRenderToTexture){const e=n.depthTexture;e&&e.isDepthTexture&&(e.type===kt?r=t.DEPTH_COMPONENT32F:e.type===Dt&&(r=t.DEPTH_COMPONENT24));const i=U(n);n.useRenderToTexture?d.renderbufferStorageMultisampleEXT(t.RENDERBUFFER,i,r,n.width,n.height):t.renderbufferStorageMultisample(t.RENDERBUFFER,i,r,n.width,n.height)}else t.renderbufferStorage(t.RENDERBUFFER,r,n.width,n.height);t.framebufferRenderbuffer(t.FRAMEBUFFER,t.DEPTH_ATTACHMENT,t.RENDERBUFFER,e)}else if(n.depthBuffer&&n.stencilBuffer){const r=U(n);i&&n.useRenderbuffer?t.renderbufferStorageMultisample(t.RENDERBUFFER,r,t.DEPTH24_STENCIL8,n.width,n.height):n.useRenderToTexture?d.renderbufferStorageMultisampleEXT(t.RENDERBUFFER,r,t.DEPTH24_STENCIL8,n.width,n.height):t.renderbufferStorage(t.RENDERBUFFER,t.DEPTH_STENCIL,n.width,n.height),t.framebufferRenderbuffer(t.FRAMEBUFFER,t.DEPTH_STENCIL_ATTACHMENT,t.RENDERBUFFER,e)}else{const e=!0===n.isWebGLMultipleRenderTargets?n.texture[0]:n.texture,r=s.convert(e.format,e.encoding),a=s.convert(e.type),o=b(e.internalFormat,r,a,e.encoding),l=U(n);i&&n.useRenderbuffer?t.renderbufferStorageMultisample(t.RENDERBUFFER,l,o,n.width,n.height):n.useRenderToTexture?d.renderbufferStorageMultisampleEXT(t.RENDERBUFFER,l,o,n.width,n.height):t.renderbufferStorage(t.RENDERBUFFER,o,n.width,n.height)}t.bindRenderbuffer(t.RENDERBUFFER,null)}function F(e){const r=i.get(e),s=!0===e.isWebGLCubeRenderTarget;if(e.depthTexture&&!r.__autoAllocateDepthBuffer){if(s)throw new Error("target.depthTexture not supported in Cube render targets");!function(e,r){if(r&&r.isWebGLCubeRenderTarget)throw new Error("Depth Texture with cube render targets is not supported");if(n.bindFramebuffer(t.FRAMEBUFFER,e),!r.depthTexture||!r.depthTexture.isDepthTexture)throw new Error("renderTarget.depthTexture must be an instance of THREE.DepthTexture");i.get(r.depthTexture).__webglTexture&&r.depthTexture.image.width===r.width&&r.depthTexture.image.height===r.height||(r.depthTexture.image.width=r.width,r.depthTexture.image.height=r.height,r.depthTexture.needsUpdate=!0),A(r.depthTexture,0);const s=i.get(r.depthTexture).__webglTexture,a=U(r);if(r.depthTexture.format===Ot)r.useRenderToTexture?d.framebufferTexture2DMultisampleEXT(t.FRAMEBUFFER,t.DEPTH_ATTACHMENT,t.TEXTURE_2D,s,0,a):t.framebufferTexture2D(t.FRAMEBUFFER,t.DEPTH_ATTACHMENT,t.TEXTURE_2D,s,0);else{if(r.depthTexture.format!==It)throw new Error("Unknown depthTexture format");r.useRenderToTexture?d.framebufferTexture2DMultisampleEXT(t.FRAMEBUFFER,t.DEPTH_STENCIL_ATTACHMENT,t.TEXTURE_2D,s,0,a):t.framebufferTexture2D(t.FRAMEBUFFER,t.DEPTH_STENCIL_ATTACHMENT,t.TEXTURE_2D,s,0)}}(r.__webglFramebuffer,e)}else if(s){r.__webglDepthbuffer=[];for(let i=0;i<6;i++)n.bindFramebuffer(t.FRAMEBUFFER,r.__webglFramebuffer[i]),r.__webglDepthbuffer[i]=t.createRenderbuffer(),O(r.__webglDepthbuffer[i],e,!1)}else n.bindFramebuffer(t.FRAMEBUFFER,r.__webglFramebuffer),r.__webglDepthbuffer=t.createRenderbuffer(),O(r.__webglDepthbuffer,e,!1);n.bindFramebuffer(t.FRAMEBUFFER,null)}function U(t){return o&&(t.useRenderbuffer||t.useRenderToTexture)?Math.min(u,t.samples):0}function B(t,n){const i=t.encoding,r=t.format,s=t.type;return!0===t.isCompressedTexture||!0===t.isVideoTexture||t.format===qt||i!==Vt&&(i===Ht?!1===o?!0===e.has("EXT_sRGB")&&r===zt?(t.format=qt,t.minFilter=Et,t.generateMipmaps=!1):n=$n.sRGBToLinear(n):r===zt&&s===Ct||console.warn("THREE.WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType."):console.error("THREE.WebGLTextures: Unsupported texture encoding:",i)),n}let V=!1,H=!1;this.allocateTextureUnit=function(){const t=E;return t>=l&&console.warn("THREE.WebGLTextures: Trying to use "+t+" texture units while this GPU supports only "+l),E+=1,t},this.resetTextureUnits=function(){E=0},this.setTexture2D=A,this.setTexture2DArray=function(e,r){const s=i.get(e);e.version>0&&s.__version!==e.version?L(s,e,r):(n.activeTexture(t.TEXTURE0+r),n.bindTexture(t.TEXTURE_2D_ARRAY,s.__webglTexture))},this.setTexture3D=function(e,r){const s=i.get(e);e.version>0&&s.__version!==e.version?L(s,e,r):(n.activeTexture(t.TEXTURE0+r),n.bindTexture(t.TEXTURE_3D,s.__webglTexture))},this.setTextureCube=C,this.rebindTextures=function(e,n,r){const s=i.get(e);void 0!==n&&z(s.__webglFramebuffer,e,e.texture,t.COLOR_ATTACHMENT0,t.TEXTURE_2D),void 0!==r&&F(e)},this.setupRenderTarget=function(e){const l=e.texture,h=i.get(e),c=i.get(l);e.addEventListener("dispose",T),!0!==e.isWebGLMultipleRenderTargets&&(void 0===c.__webglTexture&&(c.__webglTexture=t.createTexture()),c.__version=l.version,a.memory.textures++);const u=!0===e.isWebGLCubeRenderTarget,d=!0===e.isWebGLMultipleRenderTargets,p=l.isDataTexture3D||l.isDataTexture2DArray,f=x(e)||o;if(u){h.__webglFramebuffer=[];for(let e=0;e<6;e++)h.__webglFramebuffer[e]=t.createFramebuffer()}else if(h.__webglFramebuffer=t.createFramebuffer(),d)if(r.drawBuffers){const n=e.texture;for(let e=0,r=n.length;e<r;e++){const r=i.get(n[e]);void 0===r.__webglTexture&&(r.__webglTexture=t.createTexture(),a.memory.textures++)}}else console.warn("THREE.WebGLRenderer: WebGLMultipleRenderTargets can only be used with WebGL2 or WEBGL_draw_buffers extension.");else if(e.useRenderbuffer)if(o){h.__webglMultisampledFramebuffer=t.createFramebuffer(),h.__webglColorRenderbuffer=t.createRenderbuffer(),t.bindRenderbuffer(t.RENDERBUFFER,h.__webglColorRenderbuffer);const i=s.convert(l.format,l.encoding),r=s.convert(l.type),a=b(l.internalFormat,i,r,l.encoding),o=U(e);t.renderbufferStorageMultisample(t.RENDERBUFFER,o,a,e.width,e.height),n.bindFramebuffer(t.FRAMEBUFFER,h.__webglMultisampledFramebuffer),t.framebufferRenderbuffer(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.RENDERBUFFER,h.__webglColorRenderbuffer),t.bindRenderbuffer(t.RENDERBUFFER,null),e.depthBuffer&&(h.__webglDepthRenderbuffer=t.createRenderbuffer(),O(h.__webglDepthRenderbuffer,e,!0)),n.bindFramebuffer(t.FRAMEBUFFER,null)}else console.warn("THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.");if(u){n.bindTexture(t.TEXTURE_CUBE_MAP,c.__webglTexture),k(t.TEXTURE_CUBE_MAP,l,f);for(let n=0;n<6;n++)z(h.__webglFramebuffer[n],e,l,t.COLOR_ATTACHMENT0,t.TEXTURE_CUBE_MAP_POSITIVE_X+n);_(l,f)&&y(t.TEXTURE_CUBE_MAP),n.unbindTexture()}else if(d){const r=e.texture;for(let s=0,a=r.length;s<a;s++){const a=r[s],o=i.get(a);n.bindTexture(t.TEXTURE_2D,o.__webglTexture),k(t.TEXTURE_2D,a,f),z(h.__webglFramebuffer,e,a,t.COLOR_ATTACHMENT0+s,t.TEXTURE_2D),_(a,f)&&y(t.TEXTURE_2D)}n.unbindTexture()}else{let i=t.TEXTURE_2D;if(p)if(o){i=l.isDataTexture3D?t.TEXTURE_3D:t.TEXTURE_2D_ARRAY}else console.warn("THREE.DataTexture3D and THREE.DataTexture2DArray only supported with WebGL2.");n.bindTexture(i,c.__webglTexture),k(i,l,f),z(h.__webglFramebuffer,e,l,t.COLOR_ATTACHMENT0,i),_(l,f)&&y(i),n.unbindTexture()}e.depthBuffer&&F(e)},this.updateRenderTargetMipmap=function(e){const r=x(e)||o,s=!0===e.isWebGLMultipleRenderTargets?e.texture:[e.texture];for(let a=0,o=s.length;a<o;a++){const o=s[a];if(_(o,r)){const r=e.isWebGLCubeRenderTarget?t.TEXTURE_CUBE_MAP:t.TEXTURE_2D,s=i.get(o).__webglTexture;n.bindTexture(r,s),y(r),n.unbindTexture()}}},this.updateMultisampleRenderTarget=function(e){if(e.useRenderbuffer)if(o){const r=e.width,s=e.height;let a=t.COLOR_BUFFER_BIT;const o=[t.COLOR_ATTACHMENT0],l=e.stencilBuffer?t.DEPTH_STENCIL_ATTACHMENT:t.DEPTH_ATTACHMENT;e.depthBuffer&&o.push(l),e.ignoreDepthForMultisampleCopy||(e.depthBuffer&&(a|=t.DEPTH_BUFFER_BIT),e.stencilBuffer&&(a|=t.STENCIL_BUFFER_BIT));const h=i.get(e);n.bindFramebuffer(t.READ_FRAMEBUFFER,h.__webglMultisampledFramebuffer),n.bindFramebuffer(t.DRAW_FRAMEBUFFER,h.__webglFramebuffer),e.ignoreDepthForMultisampleCopy&&(t.invalidateFramebuffer(t.READ_FRAMEBUFFER,[l]),t.invalidateFramebuffer(t.DRAW_FRAMEBUFFER,[l])),t.blitFramebuffer(0,0,r,s,0,0,r,s,a,t.NEAREST),t.invalidateFramebuffer(t.READ_FRAMEBUFFER,o),n.bindFramebuffer(t.READ_FRAMEBUFFER,null),n.bindFramebuffer(t.DRAW_FRAMEBUFFER,h.__webglMultisampledFramebuffer)}else console.warn("THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.")},this.setupDepthRenderbuffer=F,this.setupFrameBufferTexture=z,this.safeSetTexture2D=function(t,e){t&&t.isWebGLRenderTarget&&(!1===V&&(console.warn("THREE.WebGLTextures.safeSetTexture2D: don't use render targets as textures. Use their .texture property instead."),V=!0),t=t.texture),A(t,e)},this.safeSetTextureCube=function(t,e){t&&t.isWebGLCubeRenderTarget&&(!1===H&&(console.warn("THREE.WebGLTextures.safeSetTextureCube: don't use cube render targets as textures. Use their .texture property instead."),H=!0),t=t.texture),C(t,e)}}function Cs(t,e,n){const i=n.isWebGL2;return{convert:function(n,r=null){let s;if(n===Ct)return t.UNSIGNED_BYTE;if(1017===n)return t.UNSIGNED_SHORT_4_4_4_4;if(1018===n)return t.UNSIGNED_SHORT_5_5_5_1;if(1010===n)return t.BYTE;if(1011===n)return t.SHORT;if(n===Rt)return t.UNSIGNED_SHORT;if(1013===n)return t.INT;if(n===Dt)return t.UNSIGNED_INT;if(n===kt)return t.FLOAT;if(n===Pt)return i?t.HALF_FLOAT:(s=e.get("OES_texture_half_float"),null!==s?s.HALF_FLOAT_OES:null);if(1021===n)return t.ALPHA;if(n===zt)return t.RGBA;if(1024===n)return t.LUMINANCE;if(1025===n)return t.LUMINANCE_ALPHA;if(n===Ot)return t.DEPTH_COMPONENT;if(n===It)return t.DEPTH_STENCIL;if(1028===n)return t.RED;if(1022===n)return console.warn("THREE.WebGLRenderer: THREE.RGBFormat has been removed. Use THREE.RGBAFormat instead. https://github.com/mrdoob/three.js/pull/23228"),t.RGBA;if(n===qt)return s=e.get("EXT_sRGB"),null!==s?s.SRGB_ALPHA_EXT:null;if(1029===n)return t.RED_INTEGER;if(1030===n)return t.RG;if(1031===n)return t.RG_INTEGER;if(1033===n)return t.RGBA_INTEGER;if(n===Nt||n===Ft||n===Ut||n===Bt)if(r===Ht){if(s=e.get("WEBGL_compressed_texture_s3tc_srgb"),null===s)return null;if(n===Nt)return s.COMPRESSED_SRGB_S3TC_DXT1_EXT;if(n===Ft)return s.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;if(n===Ut)return s.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;if(n===Bt)return s.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT}else{if(s=e.get("WEBGL_compressed_texture_s3tc"),null===s)return null;if(n===Nt)return s.COMPRESSED_RGB_S3TC_DXT1_EXT;if(n===Ft)return s.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(n===Ut)return s.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(n===Bt)return s.COMPRESSED_RGBA_S3TC_DXT5_EXT}if(35840===n||35841===n||35842===n||35843===n){if(s=e.get("WEBGL_compressed_texture_pvrtc"),null===s)return null;if(35840===n)return s.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(35841===n)return s.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(35842===n)return s.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(35843===n)return s.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}if(36196===n)return s=e.get("WEBGL_compressed_texture_etc1"),null!==s?s.COMPRESSED_RGB_ETC1_WEBGL:null;if(37492===n||37496===n){if(s=e.get("WEBGL_compressed_texture_etc"),null===s)return null;if(37492===n)return r===Ht?s.COMPRESSED_SRGB8_ETC2:s.COMPRESSED_RGB8_ETC2;if(37496===n)return r===Ht?s.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:s.COMPRESSED_RGBA8_ETC2_EAC}if(37808===n||37809===n||37810===n||37811===n||37812===n||37813===n||37814===n||37815===n||37816===n||37817===n||37818===n||37819===n||37820===n||37821===n){if(s=e.get("WEBGL_compressed_texture_astc"),null===s)return null;if(37808===n)return r===Ht?s.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:s.COMPRESSED_RGBA_ASTC_4x4_KHR;if(37809===n)return r===Ht?s.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:s.COMPRESSED_RGBA_ASTC_5x4_KHR;if(37810===n)return r===Ht?s.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:s.COMPRESSED_RGBA_ASTC_5x5_KHR;if(37811===n)return r===Ht?s.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:s.COMPRESSED_RGBA_ASTC_6x5_KHR;if(37812===n)return r===Ht?s.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:s.COMPRESSED_RGBA_ASTC_6x6_KHR;if(37813===n)return r===Ht?s.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:s.COMPRESSED_RGBA_ASTC_8x5_KHR;if(37814===n)return r===Ht?s.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:s.COMPRESSED_RGBA_ASTC_8x6_KHR;if(37815===n)return r===Ht?s.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:s.COMPRESSED_RGBA_ASTC_8x8_KHR;if(37816===n)return r===Ht?s.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:s.COMPRESSED_RGBA_ASTC_10x5_KHR;if(37817===n)return r===Ht?s.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:s.COMPRESSED_RGBA_ASTC_10x6_KHR;if(37818===n)return r===Ht?s.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:s.COMPRESSED_RGBA_ASTC_10x8_KHR;if(37819===n)return r===Ht?s.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:s.COMPRESSED_RGBA_ASTC_10x10_KHR;if(37820===n)return r===Ht?s.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:s.COMPRESSED_RGBA_ASTC_12x10_KHR;if(37821===n)return r===Ht?s.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:s.COMPRESSED_RGBA_ASTC_12x12_KHR}if(36492===n){if(s=e.get("EXT_texture_compression_bptc"),null===s)return null;if(36492===n)return r===Ht?s.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT:s.COMPRESSED_RGBA_BPTC_UNORM_EXT}return n===Lt?i?t.UNSIGNED_INT_24_8:(s=e.get("WEBGL_depth_texture"),null!==s?s.UNSIGNED_INT_24_8_WEBGL:null):void 0}}}class Rs extends ti{constructor(t=[]){super(),this.cameras=t}}Rs.prototype.isArrayCamera=!0;class Ds extends ft{constructor(){super(),this.type="Group"}}Ds.prototype.isGroup=!0;const ks={type:"move"};class Ps{constructor(){this._targetRay=null,this._grip=null,this._hand=null}getHandSpace(){return null===this._hand&&(this._hand=new Ds,this._hand.matrixAutoUpdate=!1,this._hand.visible=!1,this._hand.joints={},this._hand.inputState={pinching:!1}),this._hand}getTargetRaySpace(){return null===this._targetRay&&(this._targetRay=new Ds,this._targetRay.matrixAutoUpdate=!1,this._targetRay.visible=!1,this._targetRay.hasLinearVelocity=!1,this._targetRay.linearVelocity=new U,this._targetRay.hasAngularVelocity=!1,this._targetRay.angularVelocity=new U),this._targetRay}getGripSpace(){return null===this._grip&&(this._grip=new Ds,this._grip.matrixAutoUpdate=!1,this._grip.visible=!1,this._grip.hasLinearVelocity=!1,this._grip.linearVelocity=new U,this._grip.hasAngularVelocity=!1,this._grip.angularVelocity=new U),this._grip}dispatchEvent(t){return null!==this._targetRay&&this._targetRay.dispatchEvent(t),null!==this._grip&&this._grip.dispatchEvent(t),null!==this._hand&&this._hand.dispatchEvent(t),this}disconnect(t){return this.dispatchEvent({type:"disconnected",data:t}),null!==this._targetRay&&(this._targetRay.visible=!1),null!==this._grip&&(this._grip.visible=!1),null!==this._hand&&(this._hand.visible=!1),this}update(t,e,n){let i=null,r=null,s=null;const a=this._targetRay,o=this._grip,l=this._hand;if(t&&"visible-blurred"!==e.session.visibilityState)if(null!==a&&(i=e.getPose(t.targetRaySpace,n),null!==i&&(a.matrix.fromArray(i.transform.matrix),a.matrix.decompose(a.position,a.rotation,a.scale),i.linearVelocity?(a.hasLinearVelocity=!0,a.linearVelocity.copy(i.linearVelocity)):a.hasLinearVelocity=!1,i.angularVelocity?(a.hasAngularVelocity=!0,a.angularVelocity.copy(i.angularVelocity)):a.hasAngularVelocity=!1,this.dispatchEvent(ks))),l&&t.hand){s=!0;for(const i of t.hand.values()){const t=e.getJointPose(i,n);if(void 0===l.joints[i.jointName]){const t=new Ds;t.matrixAutoUpdate=!1,t.visible=!1,l.joints[i.jointName]=t,l.add(t)}const r=l.joints[i.jointName];null!==t&&(r.matrix.fromArray(t.transform.matrix),r.matrix.decompose(r.position,r.rotation,r.scale),r.jointRadius=t.radius),r.visible=null!==t}const i=l.joints["index-finger-tip"],r=l.joints["thumb-tip"],a=i.position.distanceTo(r.position),o=.02,h=.005;l.inputState.pinching&&a>o+h?(l.inputState.pinching=!1,this.dispatchEvent({type:"pinchend",handedness:t.handedness,target:this})):!l.inputState.pinching&&a<=o-h&&(l.inputState.pinching=!0,this.dispatchEvent({type:"pinchstart",handedness:t.handedness,target:this}))}else null!==o&&t.gripSpace&&(r=e.getPose(t.gripSpace,n),null!==r&&(o.matrix.fromArray(r.transform.matrix),o.matrix.decompose(o.position,o.rotation,o.scale),r.linearVelocity?(o.hasLinearVelocity=!0,o.linearVelocity.copy(r.linearVelocity)):o.hasLinearVelocity=!1,r.angularVelocity?(o.hasAngularVelocity=!0,o.angularVelocity.copy(r.angularVelocity)):o.hasAngularVelocity=!1));return null!==a&&(a.visible=null!==i),null!==o&&(o.visible=null!==r),null!==l&&(l.visible=null!==s),this}}class Ls extends Kn{constructor(t,e,n,i,r,s,a,o,l,h){if((h=void 0!==h?h:Ot)!==Ot&&h!==It)throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");void 0===n&&h===Ot&&(n=Rt),void 0===n&&h===It&&(n=Lt),super(null,i,r,s,a,o,h,n,l),this.image={width:t,height:e},this.magFilter=void 0!==a?a:Tt,this.minFilter=void 0!==o?o:Tt,this.flipY=!1,this.generateMipmaps=!1}}Ls.prototype.isDepthTexture=!0;class zs extends T{constructor(t,e){super();const n=this;let i=null,r=1,s=null,a="local-floor";const o=t.extensions.has("WEBGL_multisampled_render_to_texture");let l=null,h=null,c=null,u=null,d=!1,p=null;const f=e.getContextAttributes();let m=null,g=null;const v=[],x=new Map,_=new ti;_.layers.enable(1),_.viewport=new _e;const y=new ti;y.layers.enable(2),y.viewport=new _e;const b=[_,y],w=new Rs;w.layers.enable(1),w.layers.enable(2);let S=null,M=null;function T(t){const e=x.get(t.inputSource);e&&e.dispatchEvent({type:t.type,data:t.inputSource})}function E(){x.forEach((function(t,e){t.disconnect(e)})),x.clear(),S=null,M=null,t.setRenderTarget(m),u=null,c=null,h=null,i=null,g=null,P.stop(),n.isPresenting=!1,n.dispatchEvent({type:"sessionend"})}function A(t){const e=i.inputSources;for(let t=0;t<v.length;t++)x.set(e[t],v[t]);for(let e=0;e<t.removed.length;e++){const n=t.removed[e],i=x.get(n);i&&(i.dispatchEvent({type:"disconnected",data:n}),x.delete(n))}for(let e=0;e<t.added.length;e++){const n=t.added[e],i=x.get(n);i&&i.dispatchEvent({type:"connected",data:n})}}this.cameraAutoUpdate=!0,this.enabled=!1,this.isPresenting=!1,this.getController=function(t){let e=v[t];return void 0===e&&(e=new Ps,v[t]=e),e.getTargetRaySpace()},this.getControllerGrip=function(t){let e=v[t];return void 0===e&&(e=new Ps,v[t]=e),e.getGripSpace()},this.getHand=function(t){let e=v[t];return void 0===e&&(e=new Ps,v[t]=e),e.getHandSpace()},this.setFramebufferScaleFactor=function(t){r=t,!0===n.isPresenting&&console.warn("THREE.WebXRManager: Cannot change framebuffer scale while presenting.")},this.setReferenceSpaceType=function(t){a=t,!0===n.isPresenting&&console.warn("THREE.WebXRManager: Cannot change reference space type while presenting.")},this.getReferenceSpace=function(){return s},this.getBaseLayer=function(){return null!==c?c:u},this.getBinding=function(){return h},this.getFrame=function(){return p},this.getSession=function(){return i},this.setSession=async function(l){if(i=l,null!==i){if(m=t.getRenderTarget(),i.addEventListener("select",T),i.addEventListener("selectstart",T),i.addEventListener("selectend",T),i.addEventListener("squeeze",T),i.addEventListener("squeezestart",T),i.addEventListener("squeezeend",T),i.addEventListener("end",E),i.addEventListener("inputsourceschange",A),!0!==f.xrCompatible&&await e.makeXRCompatible(),void 0===i.renderState.layers||!1===t.capabilities.isWebGL2){const n={antialias:void 0!==i.renderState.layers||f.antialias,alpha:f.alpha,depth:f.depth,stencil:f.stencil,framebufferScaleFactor:r};u=new XRWebGLLayer(i,e,n),i.updateRenderState({baseLayer:u}),g=new Qn(u.framebufferWidth,u.framebufferHeight,{format:zt,type:Ct,encoding:t.outputEncoding})}else{d=f.antialias;let n=null,s=null,a=null;f.depth&&(a=f.stencil?e.DEPTH24_STENCIL8:e.DEPTH_COMPONENT24,n=f.stencil?It:Ot,s=f.stencil?Lt:Rt);const l={colorFormat:t.outputEncoding===Ht?e.SRGB8_ALPHA8:e.RGBA8,depthFormat:a,scaleFactor:r};h=new XRWebGLBinding(i,e),c=h.createProjectionLayer(l),i.updateRenderState({layers:[c]}),g=d?new Ni(c.textureWidth,c.textureHeight,{format:zt,type:Ct,depthTexture:new Ls(c.textureWidth,c.textureHeight,s,void 0,void 0,void 0,void 0,void 0,void 0,n),stencilBuffer:f.stencil,ignoreDepth:c.ignoreDepthValues,useRenderToTexture:o,encoding:t.outputEncoding}):new Qn(c.textureWidth,c.textureHeight,{format:zt,type:Ct,depthTexture:new Ls(c.textureWidth,c.textureHeight,s,void 0,void 0,void 0,void 0,void 0,void 0,n),stencilBuffer:f.stencil,ignoreDepth:c.ignoreDepthValues,encoding:t.outputEncoding})}g.isXRRenderTarget=!0,this.setFoveation(1),s=await i.requestReferenceSpace(a),P.setContext(i),P.start(),n.isPresenting=!0,n.dispatchEvent({type:"sessionstart"})}};const C=new U,R=new U;function D(t,e){null===e?t.matrixWorld.copy(t.matrix):t.matrixWorld.multiplyMatrices(e.matrixWorld,t.matrix),t.matrixWorldInverse.copy(t.matrixWorld).invert()}this.updateCamera=function(t){if(null===i)return;w.near=y.near=_.near=t.near,w.far=y.far=_.far=t.far,S===w.near&&M===w.far||(i.updateRenderState({depthNear:w.near,depthFar:w.far}),S=w.near,M=w.far);const e=t.parent,n=w.cameras;D(w,e);for(let t=0;t<n.length;t++)D(n[t],e);w.matrixWorld.decompose(w.position,w.quaternion,w.scale),t.position.copy(w.position),t.quaternion.copy(w.quaternion),t.scale.copy(w.scale),t.matrix.copy(w.matrix),t.matrixWorld.copy(w.matrixWorld);const r=t.children;for(let t=0,e=r.length;t<e;t++)r[t].updateMatrixWorld(!0);2===n.length?function(t,e,n){C.setFromMatrixPosition(e.matrixWorld),R.setFromMatrixPosition(n.matrixWorld);const i=C.distanceTo(R),r=e.projectionMatrix.elements,s=n.projectionMatrix.elements,a=r[14]/(r[10]-1),o=r[14]/(r[10]+1),l=(r[9]+1)/r[5],h=(r[9]-1)/r[5],c=(r[8]-1)/r[0],u=(s[8]+1)/s[0],d=a*c,p=a*u,f=i/(-c+u),m=f*-c;e.matrixWorld.decompose(t.position,t.quaternion,t.scale),t.translateX(m),t.translateZ(f),t.matrixWorld.compose(t.position,t.quaternion,t.scale),t.matrixWorldInverse.copy(t.matrixWorld).invert();const g=a+f,v=o+f,x=d-m,_=p+(i-m),y=l*o/v*g,b=h*o/v*g;t.projectionMatrix.makePerspective(x,_,y,b,g,v)}(w,_,y):w.projectionMatrix.copy(_.projectionMatrix)},this.getCamera=function(){return w},this.getFoveation=function(){return null!==c?c.fixedFoveation:null!==u?u.fixedFoveation:void 0},this.setFoveation=function(t){null!==c&&(c.fixedFoveation=t),null!==u&&void 0!==u.fixedFoveation&&(u.fixedFoveation=t)};let k=null;const P=new ye;P.setAnimationLoop((function(e,n){if(l=n.getViewerPose(s),p=n,null!==l){const e=l.views;null!==u&&(t.setRenderTargetFramebuffer(g,u.framebuffer),t.setRenderTarget(g));let n=!1;e.length!==w.cameras.length&&(w.cameras.length=0,n=!0);for(let i=0;i<e.length;i++){const r=e[i];let s=null;if(null!==u)s=u.getViewport(r);else{const e=h.getViewSubImage(c,r);s=e.viewport,0===i&&(t.setRenderTargetTextures(g,e.colorTexture,c.ignoreDepthValues?void 0:e.depthStencilTexture),t.setRenderTarget(g))}const a=b[i];a.matrix.fromArray(r.transform.matrix),a.projectionMatrix.fromArray(r.projectionMatrix),a.viewport.set(s.x,s.y,s.width,s.height),0===i&&w.matrix.copy(a.matrix),!0===n&&w.cameras.push(a)}}const r=i.inputSources;for(let t=0;t<v.length;t++){const e=v[t],i=r[t];e.update(i,n,s)}k&&k(e,n),p=null})),this.setAnimationLoop=function(t){k=t},this.dispose=function(){}}}function Os(t){function e(e,n){e.opacity.value=n.opacity,n.color&&e.diffuse.value.copy(n.color),n.emissive&&e.emissive.value.copy(n.emissive).multiplyScalar(n.emissiveIntensity),n.map&&(e.map.value=n.map),n.alphaMap&&(e.alphaMap.value=n.alphaMap),n.specularMap&&(e.specularMap.value=n.specularMap),n.alphaTest>0&&(e.alphaTest.value=n.alphaTest);const i=t.get(n).envMap;let r,s;i&&(e.envMap.value=i,e.flipEnvMap.value=i.isCubeTexture&&!1===i.isRenderTargetTexture?-1:1,e.reflectivity.value=n.reflectivity,e.ior.value=n.ior,e.refractionRatio.value=n.refractionRatio),n.lightMap&&(e.lightMap.value=n.lightMap,e.lightMapIntensity.value=n.lightMapIntensity),n.aoMap&&(e.aoMap.value=n.aoMap,e.aoMapIntensity.value=n.aoMapIntensity),n.map?r=n.map:n.specularMap?r=n.specularMap:n.displacementMap?r=n.displacementMap:n.normalMap?r=n.normalMap:n.bumpMap?r=n.bumpMap:n.roughnessMap?r=n.roughnessMap:n.metalnessMap?r=n.metalnessMap:n.alphaMap?r=n.alphaMap:n.emissiveMap?r=n.emissiveMap:n.clearcoatMap?r=n.clearcoatMap:n.clearcoatNormalMap?r=n.clearcoatNormalMap:n.clearcoatRoughnessMap?r=n.clearcoatRoughnessMap:n.specularIntensityMap?r=n.specularIntensityMap:n.specularColorMap?r=n.specularColorMap:n.transmissionMap?r=n.transmissionMap:n.thicknessMap?r=n.thicknessMap:n.sheenColorMap?r=n.sheenColorMap:n.sheenRoughnessMap&&(r=n.sheenRoughnessMap),void 0!==r&&(r.isWebGLRenderTarget&&(r=r.texture),!0===r.matrixAutoUpdate&&r.updateMatrix(),e.uvTransform.value.copy(r.matrix)),n.aoMap?s=n.aoMap:n.lightMap&&(s=n.lightMap),void 0!==s&&(s.isWebGLRenderTarget&&(s=s.texture),!0===s.matrixAutoUpdate&&s.updateMatrix(),e.uv2Transform.value.copy(s.matrix))}function n(e,n){e.roughness.value=n.roughness,e.metalness.value=n.metalness,n.roughnessMap&&(e.roughnessMap.value=n.roughnessMap),n.metalnessMap&&(e.metalnessMap.value=n.metalnessMap),n.emissiveMap&&(e.emissiveMap.value=n.emissiveMap),n.bumpMap&&(e.bumpMap.value=n.bumpMap,e.bumpScale.value=n.bumpScale,1===n.side&&(e.bumpScale.value*=-1)),n.normalMap&&(e.normalMap.value=n.normalMap,e.normalScale.value.copy(n.normalScale),1===n.side&&e.normalScale.value.negate()),n.displacementMap&&(e.displacementMap.value=n.displacementMap,e.displacementScale.value=n.displacementScale,e.displacementBias.value=n.displacementBias);t.get(n).envMap&&(e.envMapIntensity.value=n.envMapIntensity)}return{refreshFogUniforms:function(t,e){t.fogColor.value.copy(e.color),e.isFog?(t.fogNear.value=e.near,t.fogFar.value=e.far):e.isFogExp2&&(t.fogDensity.value=e.density)},refreshMaterialUniforms:function(t,i,r,s,a){i.isMeshBasicMaterial?e(t,i):i.isMeshLambertMaterial?(e(t,i),function(t,e){e.emissiveMap&&(t.emissiveMap.value=e.emissiveMap)}(t,i)):i.isMeshToonMaterial?(e(t,i),function(t,e){e.gradientMap&&(t.gradientMap.value=e.gradientMap);e.emissiveMap&&(t.emissiveMap.value=e.emissiveMap);e.bumpMap&&(t.bumpMap.value=e.bumpMap,t.bumpScale.value=e.bumpScale,1===e.side&&(t.bumpScale.value*=-1));e.normalMap&&(t.normalMap.value=e.normalMap,t.normalScale.value.copy(e.normalScale),1===e.side&&t.normalScale.value.negate());e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias)}(t,i)):i.isMeshPhongMaterial?(e(t,i),function(t,e){t.specular.value.copy(e.specular),t.shininess.value=Math.max(e.shininess,1e-4),e.emissiveMap&&(t.emissiveMap.value=e.emissiveMap);e.bumpMap&&(t.bumpMap.value=e.bumpMap,t.bumpScale.value=e.bumpScale,1===e.side&&(t.bumpScale.value*=-1));e.normalMap&&(t.normalMap.value=e.normalMap,t.normalScale.value.copy(e.normalScale),1===e.side&&t.normalScale.value.negate());e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias)}(t,i)):i.isMeshStandardMaterial?(e(t,i),i.isMeshPhysicalMaterial?function(t,e,i){n(t,e),t.ior.value=e.ior,e.sheen>0&&(t.sheenColor.value.copy(e.sheenColor).multiplyScalar(e.sheen),t.sheenRoughness.value=e.sheenRoughness,e.sheenColorMap&&(t.sheenColorMap.value=e.sheenColorMap),e.sheenRoughnessMap&&(t.sheenRoughnessMap.value=e.sheenRoughnessMap));e.clearcoat>0&&(t.clearcoat.value=e.clearcoat,t.clearcoatRoughness.value=e.clearcoatRoughness,e.clearcoatMap&&(t.clearcoatMap.value=e.clearcoatMap),e.clearcoatRoughnessMap&&(t.clearcoatRoughnessMap.value=e.clearcoatRoughnessMap),e.clearcoatNormalMap&&(t.clearcoatNormalScale.value.copy(e.clearcoatNormalScale),t.clearcoatNormalMap.value=e.clearcoatNormalMap,1===e.side&&t.clearcoatNormalScale.value.negate()));e.transmission>0&&(t.transmission.value=e.transmission,t.transmissionSamplerMap.value=i.texture,t.transmissionSamplerSize.value.set(i.width,i.height),e.transmissionMap&&(t.transmissionMap.value=e.transmissionMap),t.thickness.value=e.thickness,e.thicknessMap&&(t.thicknessMap.value=e.thicknessMap),t.attenuationDistance.value=e.attenuationDistance,t.attenuationColor.value.copy(e.attenuationColor));t.specularIntensity.value=e.specularIntensity,t.specularColor.value.copy(e.specularColor),e.specularIntensityMap&&(t.specularIntensityMap.value=e.specularIntensityMap);e.specularColorMap&&(t.specularColorMap.value=e.specularColorMap)}(t,i,a):n(t,i)):i.isMeshMatcapMaterial?(e(t,i),function(t,e){e.matcap&&(t.matcap.value=e.matcap);e.bumpMap&&(t.bumpMap.value=e.bumpMap,t.bumpScale.value=e.bumpScale,1===e.side&&(t.bumpScale.value*=-1));e.normalMap&&(t.normalMap.value=e.normalMap,t.normalScale.value.copy(e.normalScale),1===e.side&&t.normalScale.value.negate());e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias)}(t,i)):i.isMeshDepthMaterial?(e(t,i),function(t,e){e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias)}(t,i)):i.isMeshDistanceMaterial?(e(t,i),function(t,e){e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias);t.referencePosition.value.copy(e.referencePosition),t.nearDistance.value=e.nearDistance,t.farDistance.value=e.farDistance}(t,i)):i.isMeshNormalMaterial?(e(t,i),function(t,e){e.bumpMap&&(t.bumpMap.value=e.bumpMap,t.bumpScale.value=e.bumpScale,1===e.side&&(t.bumpScale.value*=-1));e.normalMap&&(t.normalMap.value=e.normalMap,t.normalScale.value.copy(e.normalScale),1===e.side&&t.normalScale.value.negate());e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias)}(t,i)):i.isLineBasicMaterial?(function(t,e){t.diffuse.value.copy(e.color),t.opacity.value=e.opacity}(t,i),i.isLineDashedMaterial&&function(t,e){t.dashSize.value=e.dashSize,t.totalSize.value=e.dashSize+e.gapSize,t.scale.value=e.scale}(t,i)):i.isPointsMaterial?function(t,e,n,i){t.diffuse.value.copy(e.color),t.opacity.value=e.opacity,t.size.value=e.size*n,t.scale.value=.5*i,e.map&&(t.map.value=e.map);e.alphaMap&&(t.alphaMap.value=e.alphaMap);e.alphaTest>0&&(t.alphaTest.value=e.alphaTest);let r;e.map?r=e.map:e.alphaMap&&(r=e.alphaMap);void 0!==r&&(!0===r.matrixAutoUpdate&&r.updateMatrix(),t.uvTransform.value.copy(r.matrix))}(t,i,r,s):i.isSpriteMaterial?function(t,e){t.diffuse.value.copy(e.color),t.opacity.value=e.opacity,t.rotation.value=e.rotation,e.map&&(t.map.value=e.map);e.alphaMap&&(t.alphaMap.value=e.alphaMap);e.alphaTest>0&&(t.alphaTest.value=e.alphaTest);let n;e.map?n=e.map:e.alphaMap&&(n=e.alphaMap);void 0!==n&&(!0===n.matrixAutoUpdate&&n.updateMatrix(),t.uvTransform.value.copy(n.matrix))}(t,i):i.isShadowMaterial?(t.color.value.copy(i.color),t.opacity.value=i.opacity):i.isShaderMaterial&&(i.uniformsNeedUpdate=!1)}}}function Is(t={}){const e=void 0!==t.canvas?t.canvas:function(){const t=Ne("canvas");return t.style.display="block",t}(),n=void 0!==t.context?t.context:null,i=void 0!==t.alpha&&t.alpha,r=void 0===t.depth||t.depth,s=void 0===t.stencil||t.stencil,a=void 0!==t.antialias&&t.antialias,o=void 0===t.premultipliedAlpha||t.premultipliedAlpha,l=void 0!==t.preserveDrawingBuffer&&t.preserveDrawingBuffer,h=void 0!==t.powerPreference?t.powerPreference:"default",c=void 0!==t.failIfMajorPerformanceCaveat&&t.failIfMajorPerformanceCaveat;let u=null,d=null;const p=[],f=[];this.domElement=e,this.debug={checkShaderErrors:!0},this.autoClear=!0,this.autoClearColor=!0,this.autoClearDepth=!0,this.autoClearStencil=!0,this.sortObjects=!0,this.clippingPlanes=[],this.localClippingEnabled=!1,this.outputEncoding=Vt,this.physicallyCorrectLights=!1,this.toneMapping=0,this.toneMappingExposure=1;const m=this;let g=!1,v=0,x=0,_=null,y=-1,b=null;const w=new _e,S=new _e;let M=null,T=e.width,E=e.height,A=1,C=null,R=null;const D=new _e(0,0,T,E),k=new _e(0,0,T,E);let P=!1;const L=new xe;let z=!1,O=!1,I=null;const N=new H,F=new U,B={background:null,fog:null,environment:null,overrideMaterial:null,isScene:!0};function V(){return null===_?A:1}let G,j,q,W,X,Y,$,Z,K,J,Q,tt,et,nt,it,rt,st,at,ot,lt,ht,ct,ut,dt=n;function pt(t,n){for(let i=0;i<t.length;i++){const r=t[i],s=e.getContext(r,n);if(null!==s)return s}return null}try{const t={alpha:!0,depth:r,stencil:s,antialias:a,premultipliedAlpha:o,preserveDrawingBuffer:l,powerPreference:h,failIfMajorPerformanceCaveat:c};if("setAttribute"in e&&e.setAttribute("data-engine","three.js r137"),e.addEventListener("webglcontextlost",gt,!1),e.addEventListener("webglcontextrestored",vt,!1),null===dt){const e=["webgl2","webgl","experimental-webgl"];if(!0===m.isWebGL1Renderer&&e.shift(),dt=pt(e,t),null===dt)throw pt(e)?new Error("Error creating WebGL context with your selected attributes."):new Error("Error creating WebGL context.")}void 0===dt.getShaderPrecisionFormat&&(dt.getShaderPrecisionFormat=function(){return{rangeMin:1,rangeMax:1,precision:1}})}catch(t){throw console.error("THREE.WebGLRenderer: "+t.message),t}function ft(){G=new Ci(dt),j=new Wn(dt,G,t),G.init(j),ct=new Cs(dt,G,j),q=new Es(dt,G,j),W=new ki(dt),X=new ds,Y=new As(dt,G,q,X,j,ct,W),$=new si(m),Z=new Ai(m),K=new be(dt,j),ut=new jn(dt,G,K,j),J=new Ri(dt,K,W,ut),Q=new Fi(dt,J,K,W),ot=new Ii(dt,j,Y),rt=new Xn(X),tt=new us(m,$,Z,G,j,ut,rt),et=new Os(X),nt=new gs,it=new ws(G,j),at=new Gn(m,$,q,Q,i,o),st=new Ts(m,Q,j),lt=new qn(dt,G,W,j),ht=new Di(dt,G,W,j),W.programs=tt.programs,m.capabilities=j,m.extensions=G,m.properties=X,m.renderLists=nt,m.shadowMap=st,m.state=q,m.info=W}ft();const mt=new zs(m,dt);function gt(t){t.preventDefault(),console.log("THREE.WebGLRenderer: Context Lost."),g=!0}function vt(){console.log("THREE.WebGLRenderer: Context Restored."),g=!1;const t=W.autoReset,e=st.enabled,n=st.autoUpdate,i=st.needsUpdate,r=st.type;ft(),W.autoReset=t,st.enabled=e,st.autoUpdate=n,st.needsUpdate=i,st.type=r}function xt(t){const e=t.target;e.removeEventListener("dispose",xt),function(t){(function(t){const e=X.get(t).programs;void 0!==e&&(e.forEach((function(t){tt.releaseProgram(t)})),t.isShaderMaterial&&tt.releaseShaderCache(t))})(t),X.remove(t)}(e)}this.xr=mt,this.getContext=function(){return dt},this.getContextAttributes=function(){return dt.getContextAttributes()},this.forceContextLoss=function(){const t=G.get("WEBGL_lose_context");t&&t.loseContext()},this.forceContextRestore=function(){const t=G.get("WEBGL_lose_context");t&&t.restoreContext()},this.getPixelRatio=function(){return A},this.setPixelRatio=function(t){void 0!==t&&(A=t,this.setSize(T,E,!1))},this.getSize=function(t){return t.set(T,E)},this.setSize=function(t,n,i){mt.isPresenting?console.warn("THREE.WebGLRenderer: Can't change size while VR device is presenting."):(T=t,E=n,e.width=Math.floor(t*A),e.height=Math.floor(n*A),!1!==i&&(e.style.width=t+"px",e.style.height=n+"px"),this.setViewport(0,0,t,n))},this.getDrawingBufferSize=function(t){return t.set(T*A,E*A).floor()},this.setDrawingBufferSize=function(t,n,i){T=t,E=n,A=i,e.width=Math.floor(t*i),e.height=Math.floor(n*i),this.setViewport(0,0,t,n)},this.getCurrentViewport=function(t){return t.copy(w)},this.getViewport=function(t){return t.copy(D)},this.setViewport=function(t,e,n,i){t.isVector4?D.set(t.x,t.y,t.z,t.w):D.set(t,e,n,i),q.viewport(w.copy(D).multiplyScalar(A).floor())},this.getScissor=function(t){return t.copy(k)},this.setScissor=function(t,e,n,i){t.isVector4?k.set(t.x,t.y,t.z,t.w):k.set(t,e,n,i),q.scissor(S.copy(k).multiplyScalar(A).floor())},this.getScissorTest=function(){return P},this.setScissorTest=function(t){q.setScissorTest(P=t)},this.setOpaqueSort=function(t){C=t},this.setTransparentSort=function(t){R=t},this.getClearColor=function(t){return t.copy(at.getClearColor())},this.setClearColor=function(){at.setClearColor.apply(at,arguments)},this.getClearAlpha=function(){return at.getClearAlpha()},this.setClearAlpha=function(){at.setClearAlpha.apply(at,arguments)},this.clear=function(t,e,n){let i=0;(void 0===t||t)&&(i|=dt.COLOR_BUFFER_BIT),(void 0===e||e)&&(i|=dt.DEPTH_BUFFER_BIT),(void 0===n||n)&&(i|=dt.STENCIL_BUFFER_BIT),dt.clear(i)},this.clearColor=function(){this.clear(!0,!1,!1)},this.clearDepth=function(){this.clear(!1,!0,!1)},this.clearStencil=function(){this.clear(!1,!1,!0)},this.dispose=function(){e.removeEventListener("webglcontextlost",gt,!1),e.removeEventListener("webglcontextrestored",vt,!1),nt.dispose(),it.dispose(),X.dispose(),$.dispose(),Z.dispose(),Q.dispose(),ut.dispose(),tt.dispose(),mt.dispose(),mt.removeEventListener("sessionstart",yt),mt.removeEventListener("sessionend",bt),I&&(I.dispose(),I=null),wt.stop()},this.renderBufferDirect=function(t,e,n,i,r,s){null===e&&(e=B);const a=r.isMesh&&r.matrixWorld.determinant()<0,o=function(t,e,n,i,r){!0!==e.isScene&&(e=B);Y.resetTextureUnits();const s=e.fog,a=i.isMeshStandardMaterial?e.environment:null,o=null===_?m.outputEncoding:!0===_.isXRRenderTarget?_.texture.encoding:Vt,l=(i.isMeshStandardMaterial?Z:$).get(i.envMap||a),h=!0===i.vertexColors&&!!n.attributes.color&&4===n.attributes.color.itemSize,c=!!i.normalMap&&!!n.attributes.tangent,u=!!n.morphAttributes.position,p=!!n.morphAttributes.normal,f=n.morphAttributes.position?n.morphAttributes.position.length:0,g=i.toneMapped?m.toneMapping:0,v=X.get(i),x=d.state.lights;if(!0===z&&(!0===O||t!==b)){const e=t===b&&i.id===y;rt.setState(i,t,e)}let w=!1;i.version===v.__version?v.needsLights&&v.lightsStateVersion!==x.state.version||v.outputEncoding!==o||r.isInstancedMesh&&!1===v.instancing?w=!0:r.isInstancedMesh||!0!==v.instancing?r.isSkinnedMesh&&!1===v.skinning?w=!0:r.isSkinnedMesh||!0!==v.skinning?v.envMap!==l||i.fog&&v.fog!==s?w=!0:void 0===v.numClippingPlanes||v.numClippingPlanes===rt.numPlanes&&v.numIntersection===rt.numIntersection?(v.vertexAlphas!==h||v.vertexTangents!==c||v.morphTargets!==u||v.morphNormals!==p||v.toneMapping!==g||!0===j.isWebGL2&&v.morphTargetsCount!==f)&&(w=!0):w=!0:w=!0:w=!0:(w=!0,v.__version=i.version);let S=v.currentProgram;!0===w&&(S=Lt(i,e,r));let M=!1,T=!1,C=!1;const R=S.getUniforms(),D=v.uniforms;q.useProgram(S.program)&&(M=!0,T=!0,C=!0);i.id!==y&&(y=i.id,T=!0);if(M||b!==t){if(R.setValue(dt,"projectionMatrix",t.projectionMatrix),j.logarithmicDepthBuffer&&R.setValue(dt,"logDepthBufFC",2/(Math.log(t.far+1)/Math.LN2)),b!==t&&(b=t,T=!0,C=!0),i.isShaderMaterial||i.isMeshPhongMaterial||i.isMeshToonMaterial||i.isMeshStandardMaterial||i.envMap){const e=R.map.cameraPosition;void 0!==e&&e.setValue(dt,F.setFromMatrixPosition(t.matrixWorld))}(i.isMeshPhongMaterial||i.isMeshToonMaterial||i.isMeshLambertMaterial||i.isMeshBasicMaterial||i.isMeshStandardMaterial||i.isShaderMaterial)&&R.setValue(dt,"isOrthographic",!0===t.isOrthographicCamera),(i.isMeshPhongMaterial||i.isMeshToonMaterial||i.isMeshLambertMaterial||i.isMeshBasicMaterial||i.isMeshStandardMaterial||i.isShaderMaterial||i.isShadowMaterial||r.isSkinnedMesh)&&R.setValue(dt,"viewMatrix",t.matrixWorldInverse)}if(r.isSkinnedMesh){R.setOptional(dt,r,"bindMatrix"),R.setOptional(dt,r,"bindMatrixInverse");const t=r.skeleton;t&&(j.floatVertexTextures?(null===t.boneTexture&&t.computeBoneTexture(),R.setValue(dt,"boneTexture",t.boneTexture,Y),R.setValue(dt,"boneTextureSize",t.boneTextureSize)):R.setOptional(dt,t,"boneMatrices"))}!n||void 0===n.morphAttributes.position&&void 0===n.morphAttributes.normal||ot.update(r,n,i,S);(T||v.receiveShadow!==r.receiveShadow)&&(v.receiveShadow=r.receiveShadow,R.setValue(dt,"receiveShadow",r.receiveShadow));T&&(R.setValue(dt,"toneMappingExposure",m.toneMappingExposure),v.needsLights&&(P=C,(k=D).ambientLightColor.needsUpdate=P,k.lightProbe.needsUpdate=P,k.directionalLights.needsUpdate=P,k.directionalLightShadows.needsUpdate=P,k.pointLights.needsUpdate=P,k.pointLightShadows.needsUpdate=P,k.spotLights.needsUpdate=P,k.spotLightShadows.needsUpdate=P,k.rectAreaLights.needsUpdate=P,k.hemisphereLights.needsUpdate=P),s&&i.fog&&et.refreshFogUniforms(D,s),et.refreshMaterialUniforms(D,i,A,E,I),Gr.upload(dt,v.uniformsList,D,Y));var k,P;i.isShaderMaterial&&!0===i.uniformsNeedUpdate&&(Gr.upload(dt,v.uniformsList,D,Y),i.uniformsNeedUpdate=!1);i.isSpriteMaterial&&R.setValue(dt,"center",r.center);return R.setValue(dt,"modelViewMatrix",r.modelViewMatrix),R.setValue(dt,"normalMatrix",r.normalMatrix),R.setValue(dt,"modelMatrix",r.matrixWorld),S}(t,e,n,i,r);q.setMaterial(i,a);let l=n.index;const h=n.attributes.position;if(null===l){if(void 0===h||0===h.count)return}else if(0===l.count)return;let c,u=1;!0===i.wireframe&&(l=J.getWireframeAttribute(n),u=2),ut.setup(r,i,o,n,l);let p=lt;null!==l&&(c=K.get(l),p=ht,p.setIndex(c));const f=null!==l?l.count:h.count,g=n.drawRange.start*u,v=n.drawRange.count*u,x=null!==s?s.start*u:0,w=null!==s?s.count*u:1/0,S=Math.max(g,x),M=Math.min(f,g+v,x+w)-1,T=Math.max(0,M-S+1);if(0!==T){if(r.isMesh)!0===i.wireframe?(q.setLineWidth(i.wireframeLinewidth*V()),p.setMode(dt.LINES)):p.setMode(dt.TRIANGLES);else if(r.isLine){let t=i.linewidth;void 0===t&&(t=1),q.setLineWidth(t*V()),r.isLineSegments?p.setMode(dt.LINES):r.isLineLoop?p.setMode(dt.LINE_LOOP):p.setMode(dt.LINE_STRIP)}else r.isPoints?p.setMode(dt.POINTS):r.isSprite&&p.setMode(dt.TRIANGLES);if(r.isInstancedMesh)p.renderInstances(S,T,r.count);else if(n.isInstancedBufferGeometry){const t=Math.min(n.instanceCount,n._maxInstanceCount);p.renderInstances(S,T,t)}else p.render(S,T)}},this.compile=function(t,e){d=it.get(t),d.init(),f.push(d),t.traverseVisible((function(t){t.isLight&&t.layers.test(e.layers)&&(d.pushLight(t),t.castShadow&&d.pushShadow(t))})),d.setupLights(m.physicallyCorrectLights),t.traverse((function(e){const n=e.material;if(n)if(Array.isArray(n))for(let i=0;i<n.length;i++){Lt(n[i],t,e)}else Lt(n,t,e)})),f.pop(),d=null};let _t=null;function yt(){wt.stop()}function bt(){wt.start()}const wt=new ye;function Mt(t,e,n,i){if(!1===t.visible)return;if(t.layers.test(e.layers))if(t.isGroup)n=t.renderOrder;else if(t.isLOD)!0===t.autoUpdate&&t.update(e);else if(t.isLight)d.pushLight(t),t.castShadow&&d.pushShadow(t);else if(t.isSprite){if(!t.frustumCulled||L.intersectsSprite(t)){i&&F.setFromMatrixPosition(t.matrixWorld).applyMatrix4(N);const e=Q.update(t),r=t.material;r.visible&&u.push(t,e,r,n,F.z,null)}}else if((t.isMesh||t.isLine||t.isPoints)&&(t.isSkinnedMesh&&t.skeleton.frame!==W.render.frame&&(t.skeleton.update(),t.skeleton.frame=W.render.frame),!t.frustumCulled||L.intersectsObject(t))){i&&F.setFromMatrixPosition(t.matrixWorld).applyMatrix4(N);const e=Q.update(t),r=t.material;if(Array.isArray(r)){const i=e.groups;for(let s=0,a=i.length;s<a;s++){const a=i[s],o=r[a.materialIndex];o&&o.visible&&u.push(t,e,o,n,F.z,a)}}else r.visible&&u.push(t,e,r,n,F.z,null)}const r=t.children;for(let t=0,s=r.length;t<s;t++)Mt(r[t],e,n,i)}function Et(t,e,n,i){const r=t.opaque,s=t.transmissive,o=t.transparent;d.setupLightsView(n),s.length>0&&function(t,e,n){if(null===I){const t=!0===a&&!0===j.isWebGL2;I=new(t?Ni:Qn)(1024,1024,{generateMipmaps:!0,type:null!==ct.convert(Pt)?Pt:Ct,minFilter:At,magFilter:Tt,wrapS:St,wrapT:St,useRenderToTexture:G.has("WEBGL_multisampled_render_to_texture")})}const i=m.getRenderTarget();m.setRenderTarget(I),m.clear();const r=m.toneMapping;m.toneMapping=0,Rt(t,e,n),m.toneMapping=r,Y.updateMultisampleRenderTarget(I),Y.updateRenderTargetMipmap(I),m.setRenderTarget(i)}(r,e,n),i&&q.viewport(w.copy(i)),r.length>0&&Rt(r,e,n),s.length>0&&Rt(s,e,n),o.length>0&&Rt(o,e,n)}function Rt(t,e,n){const i=!0===e.isScene?e.overrideMaterial:null;for(let r=0,s=t.length;r<s;r++){const s=t[r],a=s.object,o=s.geometry,l=null===i?s.material:i,h=s.group;a.layers.test(n.layers)&&Dt(a,e,n,o,l,h)}}function Dt(t,e,n,i,r,s){t.onBeforeRender(m,e,n,i,r,s),t.modelViewMatrix.multiplyMatrices(n.matrixWorldInverse,t.matrixWorld),t.normalMatrix.getNormalMatrix(t.modelViewMatrix),r.onBeforeRender(m,e,n,i,t,s),!0===r.transparent&&2===r.side?(r.side=1,r.needsUpdate=!0,m.renderBufferDirect(n,e,i,r,t,s),r.side=0,r.needsUpdate=!0,m.renderBufferDirect(n,e,i,r,t,s),r.side=2):m.renderBufferDirect(n,e,i,r,t,s),t.onAfterRender(m,e,n,i,r,s)}function Lt(t,e,n){!0!==e.isScene&&(e=B);const i=X.get(t),r=d.state.lights,s=d.state.shadowsArray,a=r.state.version,o=tt.getParameters(t,r.state,s,e,n),l=tt.getProgramCacheKey(o);let h=i.programs;i.environment=t.isMeshStandardMaterial?e.environment:null,i.fog=e.fog,i.envMap=(t.isMeshStandardMaterial?Z:$).get(t.envMap||i.environment),void 0===h&&(t.addEventListener("dispose",xt),h=new Map,i.programs=h);let c=h.get(l);if(void 0!==c){if(i.currentProgram===c&&i.lightsStateVersion===a)return Ot(t,o),c}else o.uniforms=tt.getUniforms(t),t.onBuild(n,o,m),t.onBeforeCompile(o,m),c=tt.acquireProgram(o,l),h.set(l,c),i.uniforms=o.uniforms;const u=i.uniforms;(t.isShaderMaterial||t.isRawShaderMaterial)&&!0!==t.clipping||(u.clippingPlanes=rt.uniform),Ot(t,o),i.needsLights=function(t){return t.isMeshLambertMaterial||t.isMeshToonMaterial||t.isMeshPhongMaterial||t.isMeshStandardMaterial||t.isShadowMaterial||t.isShaderMaterial&&!0===t.lights}(t),i.lightsStateVersion=a,i.needsLights&&(u.ambientLightColor.value=r.state.ambient,u.lightProbe.value=r.state.probe,u.directionalLights.value=r.state.directional,u.directionalLightShadows.value=r.state.directionalShadow,u.spotLights.value=r.state.spot,u.spotLightShadows.value=r.state.spotShadow,u.rectAreaLights.value=r.state.rectArea,u.ltc_1.value=r.state.rectAreaLTC1,u.ltc_2.value=r.state.rectAreaLTC2,u.pointLights.value=r.state.point,u.pointLightShadows.value=r.state.pointShadow,u.hemisphereLights.value=r.state.hemi,u.directionalShadowMap.value=r.state.directionalShadowMap,u.directionalShadowMatrix.value=r.state.directionalShadowMatrix,u.spotShadowMap.value=r.state.spotShadowMap,u.spotShadowMatrix.value=r.state.spotShadowMatrix,u.pointShadowMap.value=r.state.pointShadowMap,u.pointShadowMatrix.value=r.state.pointShadowMatrix);const p=c.getUniforms(),f=Gr.seqWithValue(p.seq,u);return i.currentProgram=c,i.uniformsList=f,c}function Ot(t,e){const n=X.get(t);n.outputEncoding=e.outputEncoding,n.instancing=e.instancing,n.skinning=e.skinning,n.morphTargets=e.morphTargets,n.morphNormals=e.morphNormals,n.morphTargetsCount=e.morphTargetsCount,n.numClippingPlanes=e.numClippingPlanes,n.numIntersection=e.numClipIntersection,n.vertexAlphas=e.vertexAlphas,n.vertexTangents=e.vertexTangents,n.toneMapping=e.toneMapping}wt.setAnimationLoop((function(t){_t&&_t(t)})),"undefined"!=typeof window&&wt.setContext(window),this.setAnimationLoop=function(t){_t=t,mt.setAnimationLoop(t),null===t?wt.stop():wt.start()},mt.addEventListener("sessionstart",yt),mt.addEventListener("sessionend",bt),this.render=function(t,e){if(void 0!==e&&!0!==e.isCamera)return void console.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.");if(!0===g)return;!0===t.autoUpdate&&t.updateMatrixWorld(),null===e.parent&&e.updateMatrixWorld(),!0===mt.enabled&&!0===mt.isPresenting&&(!0===mt.cameraAutoUpdate&&mt.updateCamera(e),e=mt.getCamera()),!0===t.isScene&&t.onBeforeRender(m,t,e,_),d=it.get(t,f.length),d.init(),f.push(d),N.multiplyMatrices(e.projectionMatrix,e.matrixWorldInverse),L.setFromProjectionMatrix(N),O=this.localClippingEnabled,z=rt.init(this.clippingPlanes,O,e),u=nt.get(t,p.length),u.init(),p.push(u),Mt(t,e,0,m.sortObjects),u.finish(),!0===m.sortObjects&&u.sort(C,R),!0===z&&rt.beginShadows();const n=d.state.shadowsArray;if(st.render(n,t,e),!0===z&&rt.endShadows(),!0===this.info.autoReset&&this.info.reset(),at.render(u,t),d.setupLights(m.physicallyCorrectLights),e.isArrayCamera){const n=e.cameras;for(let e=0,i=n.length;e<i;e++){const i=n[e];Et(u,t,i,i.viewport)}}else Et(u,t,e);null!==_&&(Y.updateMultisampleRenderTarget(_),Y.updateRenderTargetMipmap(_)),!0===t.isScene&&t.onAfterRender(m,t,e),q.buffers.depth.setTest(!0),q.buffers.depth.setMask(!0),q.buffers.color.setMask(!0),q.setPolygonOffset(!1),ut.resetDefaultState(),y=-1,b=null,f.pop(),d=f.length>0?f[f.length-1]:null,p.pop(),u=p.length>0?p[p.length-1]:null},this.getActiveCubeFace=function(){return v},this.getActiveMipmapLevel=function(){return x},this.getRenderTarget=function(){return _},this.setRenderTargetTextures=function(t,e,n){X.get(t.texture).__webglTexture=e,X.get(t.depthTexture).__webglTexture=n;const i=X.get(t);i.__hasExternalTextures=!0,i.__hasExternalTextures&&(i.__autoAllocateDepthBuffer=void 0===n,i.__autoAllocateDepthBuffer||t.useRenderToTexture&&(console.warn("render-to-texture extension was disabled because an external texture was provided"),t.useRenderToTexture=!1,t.useRenderbuffer=!0))},this.setRenderTargetFramebuffer=function(t,e){const n=X.get(t);n.__webglFramebuffer=e,n.__useDefaultFramebuffer=void 0===e},this.setRenderTarget=function(t,e=0,n=0){_=t,v=e,x=n;let i=!0;if(t){const e=X.get(t);void 0!==e.__useDefaultFramebuffer?(q.bindFramebuffer(dt.FRAMEBUFFER,null),i=!1):void 0===e.__webglFramebuffer?Y.setupRenderTarget(t):e.__hasExternalTextures&&Y.rebindTextures(t,X.get(t.texture).__webglTexture,X.get(t.depthTexture).__webglTexture)}let r=null,s=!1,a=!1;if(t){const n=t.texture;(n.isDataTexture3D||n.isDataTexture2DArray)&&(a=!0);const i=X.get(t).__webglFramebuffer;t.isWebGLCubeRenderTarget?(r=i[e],s=!0):r=t.useRenderbuffer?X.get(t).__webglMultisampledFramebuffer:i,w.copy(t.viewport),S.copy(t.scissor),M=t.scissorTest}else w.copy(D).multiplyScalar(A).floor(),S.copy(k).multiplyScalar(A).floor(),M=P;if(q.bindFramebuffer(dt.FRAMEBUFFER,r)&&j.drawBuffers&&i&&q.drawBuffers(t,r),q.viewport(w),q.scissor(S),q.setScissorTest(M),s){const i=X.get(t.texture);dt.framebufferTexture2D(dt.FRAMEBUFFER,dt.COLOR_ATTACHMENT0,dt.TEXTURE_CUBE_MAP_POSITIVE_X+e,i.__webglTexture,n)}else if(a){const i=X.get(t.texture),r=e||0;dt.framebufferTextureLayer(dt.FRAMEBUFFER,dt.COLOR_ATTACHMENT0,i.__webglTexture,n||0,r)}y=-1},this.readRenderTargetPixels=function(t,e,n,i,r,s,a){if(!t||!t.isWebGLRenderTarget)return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");let o=X.get(t).__webglFramebuffer;if(t.isWebGLCubeRenderTarget&&void 0!==a&&(o=o[a]),o){q.bindFramebuffer(dt.FRAMEBUFFER,o);try{const a=t.texture,o=a.format,l=a.type;if(o!==zt&&ct.convert(o)!==dt.getParameter(dt.IMPLEMENTATION_COLOR_READ_FORMAT))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.");const h=l===Pt&&(G.has("EXT_color_buffer_half_float")||j.isWebGL2&&G.has("EXT_color_buffer_float"));if(!(l===Ct||ct.convert(l)===dt.getParameter(dt.IMPLEMENTATION_COLOR_READ_TYPE)||l===kt&&(j.isWebGL2||G.has("OES_texture_float")||G.has("WEBGL_color_buffer_float"))||h))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.");dt.checkFramebufferStatus(dt.FRAMEBUFFER)===dt.FRAMEBUFFER_COMPLETE?e>=0&&e<=t.width-i&&n>=0&&n<=t.height-r&&dt.readPixels(e,n,i,r,ct.convert(o),ct.convert(l),s):console.error("THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.")}finally{const t=null!==_?X.get(_).__webglFramebuffer:null;q.bindFramebuffer(dt.FRAMEBUFFER,t)}}},this.copyFramebufferToTexture=function(t,e,n=0){if(!0!==e.isFramebufferTexture)return void console.error("THREE.WebGLRenderer: copyFramebufferToTexture() can only be used with FramebufferTexture.");const i=Math.pow(2,-n),r=Math.floor(e.image.width*i),s=Math.floor(e.image.height*i);Y.setTexture2D(e,0),dt.copyTexSubImage2D(dt.TEXTURE_2D,n,0,0,t.x,t.y,r,s),q.unbindTexture()},this.copyTextureToTexture=function(t,e,n,i=0){const r=e.image.width,s=e.image.height,a=ct.convert(n.format),o=ct.convert(n.type);Y.setTexture2D(n,0),dt.pixelStorei(dt.UNPACK_FLIP_Y_WEBGL,n.flipY),dt.pixelStorei(dt.UNPACK_PREMULTIPLY_ALPHA_WEBGL,n.premultiplyAlpha),dt.pixelStorei(dt.UNPACK_ALIGNMENT,n.unpackAlignment),e.isDataTexture?dt.texSubImage2D(dt.TEXTURE_2D,i,t.x,t.y,r,s,a,o,e.image.data):e.isCompressedTexture?dt.compressedTexSubImage2D(dt.TEXTURE_2D,i,t.x,t.y,e.mipmaps[0].width,e.mipmaps[0].height,a,e.mipmaps[0].data):dt.texSubImage2D(dt.TEXTURE_2D,i,t.x,t.y,a,o,e.image),0===i&&n.generateMipmaps&&dt.generateMipmap(dt.TEXTURE_2D),q.unbindTexture()},this.copyTextureToTexture3D=function(t,e,n,i,r=0){if(m.isWebGL1Renderer)return void console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: can only be used with WebGL2.");const s=t.max.x-t.min.x+1,a=t.max.y-t.min.y+1,o=t.max.z-t.min.z+1,l=ct.convert(i.format),h=ct.convert(i.type);let c;if(i.isDataTexture3D)Y.setTexture3D(i,0),c=dt.TEXTURE_3D;else{if(!i.isDataTexture2DArray)return void console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: only supports THREE.DataTexture3D and THREE.DataTexture2DArray.");Y.setTexture2DArray(i,0),c=dt.TEXTURE_2D_ARRAY}dt.pixelStorei(dt.UNPACK_FLIP_Y_WEBGL,i.flipY),dt.pixelStorei(dt.UNPACK_PREMULTIPLY_ALPHA_WEBGL,i.premultiplyAlpha),dt.pixelStorei(dt.UNPACK_ALIGNMENT,i.unpackAlignment);const u=dt.getParameter(dt.UNPACK_ROW_LENGTH),d=dt.getParameter(dt.UNPACK_IMAGE_HEIGHT),p=dt.getParameter(dt.UNPACK_SKIP_PIXELS),f=dt.getParameter(dt.UNPACK_SKIP_ROWS),g=dt.getParameter(dt.UNPACK_SKIP_IMAGES),v=n.isCompressedTexture?n.mipmaps[0]:n.image;dt.pixelStorei(dt.UNPACK_ROW_LENGTH,v.width),dt.pixelStorei(dt.UNPACK_IMAGE_HEIGHT,v.height),dt.pixelStorei(dt.UNPACK_SKIP_PIXELS,t.min.x),dt.pixelStorei(dt.UNPACK_SKIP_ROWS,t.min.y),dt.pixelStorei(dt.UNPACK_SKIP_IMAGES,t.min.z),n.isDataTexture||n.isDataTexture3D?dt.texSubImage3D(c,r,e.x,e.y,e.z,s,a,o,l,h,v.data):n.isCompressedTexture?(console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: untested support for compressed srcTexture."),dt.compressedTexSubImage3D(c,r,e.x,e.y,e.z,s,a,o,l,v.data)):dt.texSubImage3D(c,r,e.x,e.y,e.z,s,a,o,l,h,v),dt.pixelStorei(dt.UNPACK_ROW_LENGTH,u),dt.pixelStorei(dt.UNPACK_IMAGE_HEIGHT,d),dt.pixelStorei(dt.UNPACK_SKIP_PIXELS,p),dt.pixelStorei(dt.UNPACK_SKIP_ROWS,f),dt.pixelStorei(dt.UNPACK_SKIP_IMAGES,g),0===r&&i.generateMipmaps&&dt.generateMipmap(c),q.unbindTexture()},this.initTexture=function(t){Y.setTexture2D(t,0),q.unbindTexture()},this.resetState=function(){v=0,x=0,_=null,q.reset(),ut.reset()},"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}Is.prototype.isWebGLRenderer=!0;class Ns extends Is{}Ns.prototype.isWebGL1Renderer=!0,C.registerPlugin("renderer",{defaults:{klass:Ns,parameters:{depth:!0,stencil:!0,preserveDrawingBuffer:!0,antialias:!0}},listen:["resize"],install:function(t){const e=t.renderer=new this.options.klass(this.options.parameters);t.canvas=e.domElement,t.element.appendChild(e.domElement)},uninstall:function(t){t.element.removeChild(t.renderer.domElement),delete t.renderer,delete t.canvas},resize:function(t,e){const n=e.renderer,i=n.domElement;i&&"CANVAS"==i.tagName?n.setSize(t.renderWidth,t.renderHeight,!1):(n.setRenderSize&&n.setRenderSize(t.renderWidth,t.renderHeight),n.setSize(t.viewWidth,t.viewHeight,!1))}}),C.registerPlugin("scene",{install:function(t){t.scene=new vt.Scene},uninstall:function(t){delete t.scene}}),C.registerPlugin("size",{defaults:{width:null,height:null,aspect:null,scale:1,maxRenderWidth:1/0,maxRenderHeight:1/0,devicePixelRatio:!0},listen:["window.resize:queue","element.resize:queue","this.change:queue","ready:resize","pre:pre"],install:function(t){t.Size=this.api({renderWidth:0,renderHeight:0,viewWidth:0,viewHeight:0}),this.resized=!1},uninstall:function(t){delete t.Size},queue:function(t,e){this.resized=!0},pre:function(t,e){this.resized&&(this.resized=!1,this.resize(t,e))},resize:function(t,e){const n=this.options,i=e.element,r=e.renderer;let s,a,o,l,h,c,u,d,p=0,f=0;s=o=void 0===n.width||null==n.width?i.offsetWidth||i.innerWidth||0:n.width,a=l=void 0===n.height||null==n.height?i.offsetHeight||i.innerHeight||0:n.height,u=s/a,n.aspect&&(n.aspect>u?(a=Math.round(s/n.aspect),f=Math.floor((l-a)/2)):(s=Math.round(a*n.aspect),p=Math.floor((o-s)/2)),u=s/a),d=1,n.devicePixelRatio&&"undefined"!=typeof window&&(d=window.devicePixelRatio||1),h=Math.round(Math.min(s*d*n.scale,n.maxRenderWidth)),c=Math.round(Math.min(a*d*n.scale,n.maxRenderHeight));h/c>u?h=Math.round(c*u):c=Math.round(h/u),d=c/a;const m=r.domElement.style;m.width=s+"px",m.height=a+"px",m.marginLeft=p+"px",m.marginTop=f+"px",Object.assign(e.Size,{renderWidth:h,renderHeight:c,viewWidth:s,viewHeight:a,aspect:u,pixelRatio:d}),e.trigger({type:"resize",renderWidth:h,renderHeight:c,viewWidth:s,viewHeight:a,aspect:u,pixelRatio:d})}}),C.registerPlugin("time",{defaults:{speed:1,warmup:0,timeout:1},listen:["pre:tick","this.change"],now:function(){return+new Date/1e3},install:function(t){t.Time=this.api({now:this.now(),clock:0,step:1/60,frames:0,time:0,delta:1/60,average:0,fps:0}),this.last=0,this.time=0,this.clock=0,this.wait=this.options.warmup,this.clockStart=0,this.timeStart=0},tick:function(t,e){const n=this.options.speed,i=this.options.timeout,r=e.Time,s=r.now=this.now(),a=this.last;let o=this.time,l=this.clock;if(a){let t=r.delta=s-a;const e=r.average||t;t>i&&(t=0);const h=t*n;o+=t,l+=h,r.frames>0&&(r.average=e+.1*(t-e),r.fps=1/e),r.step=h,r.clock=l-this.clockStart,r.time=o-this.timeStart,r.frames++,this.wait-- >0&&(this.clockStart=l,this.timeStart=o,r.clock=0,r.step=1e-100)}this.last=s,this.clock=l,this.time=o},uninstall:function(t){delete t.Time}}),C.registerPlugin("warmup",{defaults:{delay:2},listen:["ready","post"],ready:function(t,e){e.renderer.domElement.style.visibility="hidden",this.frame=0,this.hidden=!0},post:function(t,e){this.hidden&&this.frame>=this.options.delay&&(e.renderer.domElement.style.visibility="visible",this.hidden=!1),this.frame++}}),C.registerPlugin("controls",{listen:["update","resize","camera","this.change"],defaults:{klass:null,parameters:{}},install:function(t){if(!this.options.klass)throw"Must provide class for `controls.klass`";t.controls=null,this._camera=t.camera||new vt.PerspectiveCamera,this.change(null,t)},uninstall:function(t){delete t.controls},change:function(t,e){this.options.klass?(t&&!t.changes.klass||(e.controls=new this.options.klass(this._camera,e.renderer.domElement)),Object.assign(e.controls,this.options.parameters)):e.controls=null},update:function(t,e){const n=e.Time&&e.Time.delta||1/60,i=e.VR&&e.VR.state;e.controls.vr&&e.controls.vr(i),e.controls.update(n)},camera:function(t,e){e.controls.object=this._camera=t.camera},resize:function(t,e){e.controls.handleResize&&e.controls.handleResize()}}),C.registerPlugin("cursor",{listen:["update","this.change","install:change","uninstall:change","element.mousemove","vr"],defaults:{cursor:null,hide:!1,timeout:3},install:function(t){this.timeout=this.options.timeout,this.element=t.element,this.change(null,t)},uninstall:function(t){delete t.controls},change:function(t,e){this.applyCursor(e)},mousemove:function(t,e){this.options.hide&&(this.applyCursor(e),this.timeout=+this.options.timeout||0)},update:function(t,e){const n=e.Time&&e.Time.delta||1/60;this.options.hide&&(this.timeout-=n,this.timeout<0&&this.applyCursor(e,"none"))},vr:function(t,e){this.hide=t.active&&!t.hmd.fake,this.applyCursor(e)},applyCursor:function(t,e){const n=t.controls?"move":"";e=e||this.options.cursor||n,this.hide&&(e="none"),this.cursor!=e&&(this.element.style.cursor=e)}}),C.registerPlugin("fullscreen",{defaults:{key:"f"},listen:["ready","update"],install:function(t){t.Fullscreen=this.api({active:!1,toggle:this.toggle.bind(this)},t)},uninstall:function(t){delete t.Fullscreen},ready:function(t,e){document.body.addEventListener("keypress",function(t){this.options.key&&t.charCode==this.options.key.charCodeAt(0)&&this.toggle(e)}.bind(this));const n=function(){const t=!!(document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement);e.Fullscreen.active=this.active=t,e.trigger({type:"fullscreen",active:t})}.bind(this);document.addEventListener("fullscreenchange",n,!1),document.addEventListener("webkitfullscreenchange",n,!1),document.addEventListener("mozfullscreenchange",n,!1)},toggle:function(t){const e=t.canvas,n=t.VR&&t.VR.active?{vrDisplay:t.VR.hmd}:{};this.active?document.exitFullscreen?document.exitFullscreen():document.msExitFullscreen?document.msExitFullscreen():document.webkitExitFullscreen?document.webkitExitFullscreen():document.mozCancelFullScreen&&document.mozCancelFullScreen():e.requestFullScreen?e.requestFullScreen(n):e.msRequestFullScreen?e.msRequestFullscreen(n):e.webkitRequestFullscreen?e.webkitRequestFullscreen(n):e.mozRequestFullScreen&&e.mozRequestFullScreen(n)}});var Fs=i(3466),Us=i.n(Fs);C.registerPlugin("stats",{listen:["pre","post"],install:function(t){const e=this.stats=new(Us()),n=e.domElement.style;n.position="absolute",n.top=n.left=0,t.element.appendChild(e.domElement),t.stats=e},uninstall:function(t){document.body.removeChild(this.stats.domElement),delete t.stats},pre:function(t,e){this.stats.begin()},post:function(t,e){this.stats.end()}}),C.registerPlugin("ui",{defaults:{theme:"white",style:".threestrap-ui { position: absolute; bottom: 5px; right: 5px; float: left; }.threestrap-ui button { border: 0; background: none;  vertical-align: middle; font-weight: bold; } .threestrap-ui .glyphicon { top: 2px; font-weight: bold; } @media (max-width: 640px) { .threestrap-ui button { font-size: 120% } }.threestrap-white button { color: #fff; text-shadow: 0 1px 1px rgba(0, 0, 0, 1), 0 1px 3px rgba(0, 0, 0, 1); }.threestrap-black button { color: #000; text-shadow: 0 0px 1px rgba(255, 255, 255, 1), 0 0px 2px rgba(255, 255, 255, 1), 0 0px 2px rgba(255, 255, 255, 1) }"},listen:["fullscreen"],markup:function(t,e,n){let i="//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap-glyphicons.css";location.href.match(/^file:\/\//)&&(i="http://"+i);const r=[];return t.Fullscreen&&r.push('<button class="fullscreen" title="Full Screen"><span class="glyphicon glyphicon-fullscreen"></span></button>'),t.VR&&r.push('<button class="vr" title="VR Headset">VR</button>'),'<style type="text/css">@import url("'+i+'"); '+n+'</style><div class="threestrap-ui threestrap-'+e+'">'+r.join("\n")+"</div>"},install:function(t){const e=this.ui=document.createElement("div");e.innerHTML=this.markup(t,this.options.theme,this.options.style),document.body.appendChild(e);const n=this.ui.fullscreen=e.querySelector("button.fullscreen");n&&t.bind([n,"click:goFullscreen"],this);const i=this.ui.vr=e.querySelector("button.vr");i&&t.VR&&(t.VR.set({mode:"2d"}),t.bind([i,"click:goVR"],this))},fullscreen:function(t,e){this.ui.style.display=t.active?"none":"block",t.active||e.VR&&e.VR.set({mode:"2d"})},goFullscreen:function(t,e){e.Fullscreen&&e.Fullscreen.toggle()},goVR:function(t,e){e.VR&&(e.VR.set({mode:"auto"}),e.Fullscreen.toggle())},uninstall:function(t){document.body.removeChild(this.ui)}});class Bs{constructor(t,e){this.renderer=t,this.right=new vt.Vector3,this.cameraLeft=new vt.PerspectiveCamera,this.cameraRight=new vt.PerspectiveCamera;const n=e.getEyeTranslation("left");this.halfIPD=new vt.Vector3(n.x,n.y,n.z).length(),this.fovLeft=e.getRecommendedEyeFieldOfView("left"),this.fovRight=e.getRecommendedEyeFieldOfView("right")}FovToNDCScaleOffset(t){const e=2/(t.leftTan+t.rightTan),n=(t.leftTan-t.rightTan)*e*.5,i=2/(t.upTan+t.downTan);return{scale:[e,i],offset:[n,(t.upTan-t.downTan)*i*.5]}}FovPortToProjection(t,e,n,i,r){i=void 0===i?.01:i,r=void 0===r?1e4:r;const s=(n=void 0===n||n)?-1:1,a=t.elements,o=this.FovToNDCScaleOffset(e);a[0]=o.scale[0],a[1]=0,a[2]=o.offset[0]*s,a[3]=0,a[4]=0,a[5]=o.scale[1],a[6]=-o.offset[1]*s,a[7]=0,a[8]=0,a[9]=0,a[10]=r/(i-r)*-s,a[11]=r*i/(i-r),a[12]=0,a[13]=0,a[14]=s,a[15]=0,t.transpose()}FovToProjection(t,e,n,i,r){const s={upTan:Math.tan(e.upDegrees*Math.PI/180),downTan:Math.tan(e.downDegrees*Math.PI/180),leftTan:Math.tan(e.leftDegrees*Math.PI/180),rightTan:Math.tan(e.rightDegrees*Math.PI/180)};return this.FovPortToProjection(t,s,n,i,r)}render(t,e){this.FovToProjection(this.cameraLeft.projectionMatrix,this.fovLeft,!0,e.near,e.far),this.FovToProjection(this.cameraRight.projectionMatrix,this.fovRight,!0,e.near,e.far),this.right.set(this.halfIPD,0,0),this.right.applyQuaternion(e.quaternion),this.cameraLeft.position.copy(e.position).sub(this.right),this.cameraRight.position.copy(e.position).add(this.right),this.cameraLeft.quaternion.copy(e.quaternion),this.cameraRight.quaternion.copy(e.quaternion);const n=this.renderer.devicePixelRatio||1,i=this.renderer.domElement.width/2/n,r=this.renderer.domElement.height/n;this.renderer.enableScissorTest(!0),this.renderer.setViewport(0,0,i,r),this.renderer.setScissor(0,0,i,r),this.renderer.render(t,this.cameraLeft),this.renderer.setViewport(i,0,i,r),this.renderer.setScissor(i,0,i,r),this.renderer.render(t,this.cameraRight)}}C.registerPlugin("vr",{defaults:{mode:"auto",device:null,fov:80},listen:["window.load","pre","render","resize","this.change"],install:function(t){t.VR=this.api({active:!1,devices:[],hmd:null,sensor:null,renderer:null,state:null},t)},uninstall:function(t){delete t.VR},mocks:function(t,e,n){return[{fake:!0,force:1,deviceId:"emu",deviceName:"Emulated",getEyeTranslation:function(t){return{left:{x:-.03,y:0,z:0},right:{x:.03,y:0,z:0}}[t]},getRecommendedEyeFieldOfView:function(i){const r=t.camera,s=r&&r.aspect||16/9,a=(e||r&&r.fov||n)/2,o=180*Math.atan(Math.tan(a*Math.PI/180)*s/2)/Math.PI;return{left:{rightDegrees:o,leftDegrees:o,downDegrees:a,upDegrees:a},right:{rightDegrees:o,leftDegrees:o,downDegrees:a,upDegrees:a}}[i]}},{force:2,getState:function(){return{}}}]},load:function(t,e){const n=function(t){this.callback(t,e)}.bind(this);navigator.getVRDevices?navigator.getVRDevices().then(n):navigator.mozGetVRDevices?navigator.mozGetVRDevices(n):(console.warn("No native VR support detected."),n(this.mocks(e,this.options.fov,this.defaults.fov),e))},callback:function(t,e){let n,i;const r=window.HMDVRDevice||function(){},s=window.PositionSensorVRDevice||function(){};t=e.VR.devices=t||e.VR.devices;const a=this.options.device;let o;for(let e=0;e<t.length;++e)if(o=t[e],1==o.force||o instanceof r){if(a&&a!=o.deviceId)continue;n=o;break}if(n){let r;for(let e=0;e<t.length;++e)if(r=t[e],2==r.force||r instanceof s&&r.hardwareUnitId==n.hardwareUnitId){i=r;break}this.hookup(n,i,e)}},hookup:function(t,e,n){Bs||console.log("VRRenderer not found");const i=Bs||function(){};this.renderer=new i(n.renderer,t),this.hmd=t,this.sensor=e,n.VR.renderer=this.renderer,n.VR.hmd=t,n.VR.sensor=e,console.log("VRRenderer",t.deviceName)},change:function(t,e){t.changes.device&&this.callback(null,e),this.pre(t,e)},pre:function(t,e){const n=this.active,i=this.active=this.renderer&&"2d"!=this.options.mode;if(e.VR.active=i,i&&this.sensor){const t=this.sensor.getState();e.VR.state=t}else e.VR.state=null;n!=this.active&&e.trigger({type:"vr",active:i,hmd:this.hmd,sensor:this.sensor})},resize:function(t,e){this.active&&this.renderer.initialize()},render:function(t,e){if(e.scene&&e.camera){const t=this.active?this.renderer:e.renderer;if(this.last!=t&&t==e.renderer){const e=t.getPixelRatio(),n=t.domElement.width/e,i=t.domElement.height/e;t.setScissorTest(!1),t.setViewport(0,0,n,i)}this.last=t,t.render(e.scene,e.camera)}}});class Vs{constructor(t,e){this.context=e,this.traits=t.Traits,this.types=t.Types,this.pending=[],this.bound=[],this.last=null}make(t){return{enum:"function"==typeof t.enum?t.enum():void 0,type:"function"==typeof t.uniform?t.uniform():void 0,value:t.make()}}apply(t,e){return new Gs(t,e,this)}bind(t){return this.bound.push(t)}unbind(t){return this.bound=Array.from(this.bound).filter((e=>e!==t))}queue(t,e,n,i){return this.lastObject=e,this.lastKey=n,this.lastValue=i,this.pending.push(t)}invoke(t){return t(this.context.time.clock,this.context.time.step)}compute(){if(this.bound.length)for(const t of Array.from(this.bound))this.invoke(t)}digest(){let t;if(!this.pending.length)return!1;[t,this.pending]=Array.from([this.pending,[]]);for(const e of Array.from(t))e();return!0}getTrait(t){return this.traits[t]}getLastTrigger(){return`${this.lastObject.toString()} - ${this.lastKey}=\`${this.lastValue}\``}}const Hs=function(t){const e={};for(const n in t){const i=t[n];e[n]=i}return e};class Gs{constructor(t,e,n){let i,r,s,a,o,l,h,{props:c}=e;const{traits:u,finals:d,freeform:p}=e,f=this;null!=t.props&&null!=t.expr&&null!=t.orig&&null!=t.computed&&null!=t.attributes&&(l=Hs(t.props),a=Hs(t.expr),o=t.orig(),s=t.computed(),null!=t.attributes&&t.attributes.dispose());const m={},g={},v={},x=t=>null!=v[t]?v[t]:t,_=function(e,n){if(v[n])throw new Error(`${t.toString()} - Duplicate property \`${n}\``);return v[n]=e},y=t=>{return null!=(null!=f[t]?f[t].value:void 0)?null!=f[t]?f[t].value:void 0:(e=f[x(t)],n=t=>t.value,null!=e?n(e):void 0);var e,n},b=function(e,n,i,r){let s;if(e=x(e),null==(s=f[e])){if(!p)throw new Error(`${t.toString()} - Setting unknown property \`${e}={${n}}\``);s=f[e]={short:e,type:null,last:null,value:null},L[e]=t=>t}if(!i){if(E[e])throw new Error(`${t.toString()} - Can't set bound property \`${e}={${n}}\``);if(A[e])throw new Error(`${t.toString()} - Can't set computed property \`${e}={${n}}\``);if(C[e])throw new Error(`${t.toString()} - Can't set final property \`${e}={${n}}\``)}let a=!0;const o=I(e,n,s.last,(function(){return a=!1,null}));if(a){[s.value,s.last]=Array.from([o,s.value]);const{short:t}=s;m[t]=o,i||(g[t]=n),r||O(e,s.value,s.last)||H(e,n)}return a},w=function(t,e,n){return t=x(t),b(t,e,!0,n),C[t]=!0},S={},M={},T={},E={},A={},C={},R=function(e,i,r){if(null==r&&(r=!1),e=x(e),"function"!=typeof i)throw new Error(`${t.toString()} - Expression \`${e}=>{${S}}\` is not a function`);if(E[e])throw new Error(`${t.toString()} - Property \`${e}=>{${S}}\` is already bound`);if(A[e])throw new Error(`${t.toString()} - Property \`${e}\` is computed`);if(C[e])throw new Error(`${t.toString()} - Property \`${e}\` is final`);(r?A:E)[e]=i;const s=null!=f[e]?f[e].short:e;return r||(S[s]=i),T[e]=i,i=i.bind(t),M[e]=function(n,r){let s;return(s=null!=t.clock?t.clock.getTime():void 0)&&(n=s.clock,r=s.step),t.set(e,i(n,r),!0)},n.bind(M[e])},D=function(t,e){null==e&&(e=!1),t=x(t);const i=e?A:E;if(i[t])return n.unbind(M[t]),delete M[t],delete i[t],null!=f[t]&&(t=f[t].short),delete S[t]},k=function(t,e){let n;return t=x(t),null!=(n="function"==typeof T[t]?T[t](e,0):void 0)?n:f[t].value};t.expr=S,t.props=m,t.evaluate=function(t,e){if(null!=t)return k(t,e);{const n={};for(t in c)n[t]=k(t,e);return n}},t.get=function(t){return null!=t?y(t):m},t.set=function(t,e,n,i){if("string"==typeof t)b(t,e,n,i);else{i=n,n=e;const r=t;for(t in r)e=r[t],b(t,e,n,i)}},t.bind=function(t,e,n){if("string"==typeof t)R(t,e,n);else{n=e;const i=t;for(t in i)e=i[t],R(t,e,n)}},t.unbind=function(t,e){if("string"==typeof t)D(t,e);else{e=S;const n=t;for(t in n)D(t,e)}},t.attribute=function(t){return null!=t?f[x(t)]:f},t.orig=function(t){return null!=t?g[x(t)]:Hs(g)},t.computed=function(t){return null!=t?A[x(t)]:Hs(A)};const P={},L={},z={},O=(t,e,n)=>z[t](e,n),I=(t,e,n,i)=>L[t](e,n,i);t.validate=function(e,n){let i;e=x(e);const r=P[e];return null!=r&&(i=r()),I(e,n,i,(function(){throw new Error(`${t.toString()} - Invalid value \`${e}={${n}}\``)}))};let N=!1,F={},U={},B={},V={};const H=function(e,i){N||(N=!0,n.queue(j,t,e,i));const r=(t=>t.split(".")[0])(e);return F[e]=!0,U[r]=!0},G={type:"change",changed:null,touched:null},j=function(){let e;for(e in G.changed=F,G.touched=U,F=B,U=V,({changed:B}=G),({touched:V}=G),N=!1,F)F[e]=!1;for(e in U)U[e]=!1;return G.type="change",t.trigger(G),(()=>{const e=[];for(const n in G.touched)G.type=`change:${n}`,e.push(t.trigger(G));return e})()},q=function(t){const e=t.split(/\./g),n=e.pop();return e.pop(),e.unshift(n),e.reduce(((t,e)=>t+e.charAt(0).toUpperCase()+e.substring(1)))},W=(t,e)=>(()=>{const n=[];for(let i in e){let r;const s=e[i];i=[t,i].join(".");const a=q(i);f[i]={T:s,ns:t,short:a,enum:"function"==typeof s.enum?s.enum():void 0,type:"function"==typeof s.uniform?s.uniform():void 0,last:s.make(),value:r=s.make()},_(i,a),m[a]=r,P[i]=s.make,L[i]=null!=s.validate?s.validate:t=>t,n.push(z[i]=null!=s.equals?s.equals:(t,e)=>t===e)}return n})(),X=[];for(let t of Array.from(u)){[t,r]=Array.from(t.split(":"));const e=r?[r,t].join("."):t;h=n.getTrait(t),X.push(t),null!=h&&W(e,h)}if(null!=c)for(r in c)h=c[r],W(r,h);const Y=X.filter(((t,e)=>X.indexOf(t)===e));if(t.traits=Y,null!=l&&t.set(l,!0,!0),null!=d)for(i in d){const t=d[i];w(i,t,!0)}null!=o&&t.set(o,!1,!0),null!=s&&t.bind(s,!0),null!=a&&t.bind(a,!1),this.dispose=function(){for(i in A)D(i,!0);for(i in E)D(i,!1);return c={},delete t.attributes,delete t.get,delete t.set}}}const js=t=>((t,e)=>Math.abs(t/e-Math.round(t/e))<1e-4)(t,1),qs=function(t,e,n,i){const r=Math.round(t/e);return 1===r?`${n}`:-1===r?`-${n}`:"1"===n?`${r}`:i?`${r}${n}`:`${r}*${n}`},Ws=function(t,e,n,i){let r=Math.round(t*e);return 1===Math.abs(r)?(r=r<0?"-":"",r+=n):"1"!==n&&(r+=i?`${n}`:`*${n}`),`${r}/${e}`},Xs=[{1:1},{1:1,τ:2*Math.PI},{1:1,π:Math.PI},{1:1,τ:2*Math.PI,π:Math.PI},{1:1,e:Math.E},{1:1,τ:2*Math.PI,e:Math.E},{1:1,π:Math.PI,e:Math.E},{1:1,τ:2*Math.PI,π:Math.PI,e:Math.E}],Ys=[[420,[2,3,5,7]],[88200,[2,3,5,7]],[60060,[2,3,5,7,11,13]],[861764,[2,17,19,23,29]],[65536,[2]],[1e6,[2,5]]],$s=function(t){let e,n,i,r,s;t&&({cache:e,compact:n,tau:s,pi:r,e:i}=t),n=+!(null!=n&&!n),s=+!(null!=s&&!s),r=+!(null!=r&&!r),i=+!(null!=i&&!i),e=+!(null!=e&&!e);const a=s+2*r+4*i,o=e?{}:null;return function(t){if(null!=o){let e;if(null!=(e=o[t]))return e;if(t===Math.round(t))return o[t]=`${t}`}let e=`${t}`,i=e.length+e.indexOf(".")+2;const r=function(t){const n=t.length;if(n<=i)return e=`${t}`,i=n};for(const e in Xs[a]){const i=Xs[a][e];if(js(t/i))r(`${qs(t/i,1,e,n)}`);else for(let[s,a]of Array.from(Ys)){let o=t/i*s;if(js(o)){for(const t of Array.from(a)){let e,n;for(;js(n=o/t)&&js(e=s/t);)o=n,s=e}r(`${Ws(t/i,s,e,n)}`);break}}}return`${t}`.length>5&&r(`${t.toPrecision(5)}`),null!=o&&(o[t]=e),e}},Zs=function(t,e){return null==e&&(e="info"),t=Ks(t),console[e].apply(console,t)},Ks=function(t){const e="color:rgb(128,0,128)",n="color:rgb(144,64,0)",i="color:rgb(0,70,156)";let r=!1,s=0;const a=[];return[t=t.replace(/(\\[<={}> "'])|(=>|[<={}> "'])/g,(function(t,o,l){return(null!=o?o.length:void 0)?o:r&&!['"',"'"].includes(l)||s&&!['"',"'","{","}"].includes(l)?l:(()=>{switch(l){case"<":return a.push(e),"%c<";case">":return a.push(e),a.push("color:inherit"),"%c>%c";case" ":return a.push(n)," %c";case"=":case"=>":return a.push(e),`%c${l}`;case'"':case"'":return r=!r,r?(a.push(s?n:"color:rgb(0,0,192)"),`${l}%c`):(a.push(s?i:e),`%c${l}`);case"{":return 0==s++?(a.push(i),`%c${l}`):l;case"}":return 0==--s?(a.push(e),`${l}%c`):l;default:return l}})()}))].concat(a)},Js=function(){const t=$s({compact:!1});return function(e,n,i){const r=function(t){return t===""+ +t||t.match(/^[A-Za-z_][A-Za-z0-9]*$/)?t:JSON.stringify(t)},s=function(e){if(e instanceof Array)return`[${e.map(s).join(", ")}]`;switch(typeof e){case"string":return e.match("\n")?`"\n${e}"\n`:`"${e}"`;case"function":return(e=`${e}`).match("\n"),(e=e.replace(/^function (\([^)]+\))/,"$1 =>")).replace(/^(\([^)]+\)) =>\s*{\s*return\s*([^}]+)\s*;\s*}/,"$1 => $2");case"number":return t(e);default:return null!=e&&e!==!!e?null!=e._up?s(e.map((t=>t))):e.toMarkup?e.toString():"{"+(()=>{const t=[];for(const n in e){const i=e[n];Object.prototype.hasOwnProperty.call(e,n)&&t.push(`${r(n)}: ${s(i)}`)}return t})().join(", ")+"}":`${JSON.stringify(e)}`}};return[e,i,function(t){return t.match('\n*"')?t:`{${t}}`}(s(n))].join("")}}(),Qs=function(t){return(t=(t=t.replace(/&/g,"&amp;")).replace(/</g,"&lt;")).replace(/"/g,"&quot;")},ta=function(t){const e=[].slice.call(arguments);e.shift();let n="<span>";t=Qs(t);for(const n of Array.from(e))t=t.replace(/%([a-z])/,(function(t,n){const i=e.shift();return"c"===n?`</span><span style="${Qs(i)}">`:Qs(i)}));return n+=t,n+"</span>"},ea={prop:(t,e)=>Js(t,e,"="),bind:(t,e)=>Js(t,e,"=>")};let na=0;class ia{constructor(t,e,n,i,r,s){this.type=t,this._id=(++na).toString(),this.configure(r,s),this.parent=this.root=this.path=this.index=null,this.set(e,!0,!0),this.set(n,!1,!0),this.bind(i,!1)}configure(t,e){let{traits:n,props:i,finals:r,freeform:s}=t;return null==n&&(n=null!=(null!=this._config?this._config.traits:void 0)?null!=this._config?this._config.traits:void 0:[]),null==i&&(i=null!=(null!=this._config?this._config.props:void 0)?null!=this._config?this._config.props:void 0:{}),null==r&&(r=null!=(null!=this._config?this._config.finals:void 0)?null!=this._config?this._config.finals:void 0:{}),null==s&&(s=null!=(null!=this._config?this._config.freeform:void 0)&&(null!=this._config?this._config.freeform:void 0)),this._config={traits:n,props:i,finals:r,freeform:s},this.attributes=e.apply(this,this._config)}dispose(){return this.attributes.dispose(),this.attributes=null}_added(t){this.parent=t,this.root=t.root;const e={type:"add",node:this,parent:this.parent};return this.root&&this.root.trigger(e),e.type="added",this.trigger(e)}_removed(){const t={type:"remove",node:this};return this.root&&this.root.trigger(t),t.type="removed",this.trigger(t),this.root=this.parent=null}_index(t,e){let n;if(null==e&&({parent:e}=this),this.index=t,this.path=n=null!=t?(null!=(null!=e?e.path:void 0)?null!=e?e.path:void 0:[]).concat([t]):null,this.order=null!=n?this._encode(n):1/0,null!=this.root)return this.trigger({type:"reindex"})}_encode(t){const e=t=>3/(t+3),n=t=>r+(i-r)*t;let i=1+1/3,r=0;for(const s of Array.from(t)){const t=e(s+1),a=e(s+2);[i,r]=Array.from([n(t),n(a)])}return i}toString(){const t=null!=this.id?this.id:this._id,e=null!=this.type?this.type:"node";let n=e;if(n+=`#${t}`,(null!=this.classes?this.classes.length:void 0)&&(n+=`.${this.classes.join(".")}`),null!=this.children){let t;return(t=this.children.length)?`<${n}>…(${t})…</${e}>`:`<${n}></${e}>`}return`<${n} />`}toMarkup(t=null,e){let n,i;if(null==e&&(e=""),t&&"function"!=typeof t){let e;t=null!=(e=null!=this.root?this.root.model._matcher(t):void 0)?e:()=>!0}const r=null!=this.type?this.type:"node";let{expr:s}=this;const a={id:this._id},o="function"==typeof this.orig?this.orig():void 0;for(n in o)i=o[n],a[n]=i;const l=(()=>{const t=[];for(n in a)i=a[n],this.expr[n]||t.push(ea.prop(n,i));return t})();s=(()=>{const t=[];for(n in s)i=s[n],t.push(ea.bind(n,i));return t})();let h=[""];l.length&&(h=h.concat(l)),s.length&&(h=h.concat(s)),h=h.join(" ");let c=e;const u=()=>(null!=this.children?this.children.length:void 0)?this.children.map((e=>e.toMarkup(t,c))).filter((t=>null!=t&&t.length)).join("\n"):"";if(t&&!t(this))return u();if(null!=this.children){const t=`<${r}${h}>`,n=`</${r}>`;c=e+"  ";let i=u();return i.length&&(i="\n"+i+"\n"+e),null==i&&(i=""),e+t+i+n}return`${e}<${r}${h} />`}print(t,e){return Zs(this.toMarkup(t),e)}}E.apply(ia.prototype);class ra extends ia{constructor(t,e,n,i,r,s){super(t,e,n,i,r,s),this.children=[],this.on("reindex",(t=>Array.from(this.children).map((e=>e.trigger(t)))))}add(t){return null!=t.parent&&t.parent.remove(t),t._index(this.children.length,this),this.children.push(t),t._added(this)}remove(t){(null!=t.children?t.children.length:void 0)&&t.empty();const e=this.children.indexOf(t);if(-1!==e){this.children.splice(e,1),t._index(null),t._removed(this);for(let n=0;n<this.children.length;n++)t=this.children[n],n>=e&&t._index(n)}}empty(){const t=this.children.slice().reverse();for(const e of Array.from(t))this.remove(e)}}class sa{constructor(t){null==t&&(t=10),this.limit=t}iterate(t){const{step:e,last:n}=t;let{limit:i}=this;for(;e();)if(!--i)throw console.warn("Last iteration","function"==typeof n?n():void 0),new Error("Exceeded iteration limit.");return null}}var aa=i(5366);function oa(t){return!0}function la(t){return t.children||[]}function ha(t){return t.parent}const ca={isTag:oa,existsOne:(t,e)=>e.some((e=>t(e)||ca.existsOne(t,la(e)))),getSiblings(t){const e=ha(t);return e?la(e):[t]},getChildren:la,getParent:ha,getAttributeValue:(t,e)=>"class"===e?t.props.classes.join(" "):"id"===e?t.id:"",hasAttrib:(t,e)=>"id"===e?!!t.id:"class"===e?t.props.classes.length>0:!!t.traits.hash&&Object.prototype.hasOwnProperty.call(t.traits.hash,e),removeSubsets:function(t){const e=new Set(t);return e.forEach((t=>{let n=t.parent;for(;n;){if(e.has(n))return void e.delete(t);n=n.parent}})),Array.from(e)},getName:t=>t.type??"",findOne:function t(e,n){for(const i of n){if(e(i))return i;{const n=t(e,la(i));if(n)return n}}return null},findAll:function t(e,n){const i=[];for(const r of n)e(r)&&i.push(r),i.push(...t(e,la(r)));return i},getText:function(t){return""}},ua=ca,da=(t,e)=>{try{aa.compile(t)}catch(t){return[]}const n=Array.isArray(e);if(n&&0===e.length)return[];const i=(t=>{let e=t;for(;null!==ua.getParent(e);)e=ua.getParent(e);return e})(n?e[0]:e),r=aa.selectAll(t,i,{adapter:ua});return e?((t,e)=>{const n=[],i=Array.isArray(e)?e:[e],r=new Set(i);for(const e of Array.from(t)){let t=e;for(;null!=t;){if(r.has(t)){n.push(e);break}t=ua.getParent(t)}}return n})(r,e):r},pa=/^<([0-9]+|<*)$/;class fa{constructor(t){this.root=t,this.root.model=this,this.root.root=this.root,this.ids={},this.classes={},this.traits={},this.types={},this.nodes=[],this.watchers=[],this.fire=!1,this.lastNode=null,this.event={type:"update"};this.root.on("add",(t=>e(t.node))),this.root.on("remove",(t=>n(t.node)));const e=t=>(m(t),v(t),_(t),t.on("change:node",a),a(null,t,!0),s(t)),n=t=>(g(t),x(t),y(t),d(t.id,t),f(t.classes,t),t.off("change:node",a),s(t)),i=t=>{for(const e of Array.from(this.watchers))e.match=e.matcher(t);return null},r=t=>{for(const e of Array.from(this.watchers)){const n=e.fire||(e.fire=e.match!==e.matcher(t));n&&(this.lastNode=t),this.fire||(this.fire=n)}return null},s=t=>{for(const e of Array.from(this.watchers)){const n=e.fire||(e.fire=e.matcher(t));n&&(this.lastNode=t),this.fire||(this.fire=n)}return null};this.digest=()=>{if(!this.fire)return!1;for(const t of Array.from(this.watchers.slice()))t.fire&&(t.fire=!1,t.handler());return this.fire=!1,!0};const a=(t,e,n)=>{const s=n||t.changed["node.id"],a=n||t.changed["node.classes"];let o=!1;if(s){const t=e.get("node.id");t!==e.id&&(n||i(e),o=!0,null!=e.id&&d(e.id,e),u(t,e))}if(a){let t,r=null!=(t=e.get("node.classes"))?t:[];const s=r.join(",");s!==(null!=e.classes?e.classes.klass:void 0)&&(r=r.slice(),n||o||i(e),o=!0,null!=e.classes&&f(e.classes,e),p(r,e),e.classes=r,e.classes.klass=s)}return!n&&o&&r(e),null},o=function(t,e,n){if(null!=e){for(const i of Array.from(e)){const e=null!=t[i]?t[i]:[];e.push(n),t[i]=e}return null}},l=function(t,e,n){if(null!=e){for(const i of Array.from(e)){const e=t[i],r=e.indexOf(n);r>=0&&e.splice(r,1),0===e.length&&delete t[i]}return null}},h=function(t){if(!(t.length>0))return;const e=t.hash={};return Array.from(t).map((t=>e[t]=!0))},c=t=>delete t.hash,u=(t,e)=>{if(this.ids[t])throw new Error(`Duplicate node id \`${t}\``);return null!=t&&(this.ids[t]=[e]),e.id=null!=t?t:e._id},d=(t,e)=>(null!=t&&delete this.ids[t],e.id=e._id),p=(t,e)=>{if(o(this.classes,t,e),null!=t)return h(t)},f=(t,e)=>{if(l(this.classes,t,e),null!=t)return c(t)},m=t=>this.nodes.push(t),g=t=>this.nodes.splice(this.nodes.indexOf(t),1),v=t=>o(this.types,[t.type],t),x=t=>l(this.types,[t.type],t),_=t=>(o(this.traits,t.traits,t),h(t.traits)),y=t=>(l(this.traits,t.traits,t),c(t.traits));e(this.root),this.root.trigger({type:"added"})}select(t,e){return da(t,e||this.getRoot())}watch(t,e){let n;return e.unwatch=()=>this.unwatch(e),e.watcher=n={selector:t,handler:e,matcher:this._matcher(t),match:!1,fire:!1},this.watchers.push(n),this.select(t)}unwatch(t){const{watcher:e}=t;if(null!=e)return this.watchers.splice(this.watchers.indexOf(e),1),delete t.unwatch,delete t.watcher}_matcher(t){if(pa.test(t))throw new Error("Auto-link matcher unsupported");return(t=>{try{return aa.compile(t,{adapter:ua})}catch(t){return()=>!1}})(t)}getRoot(){return this.root}getLastTrigger(){return this.lastNode.toString()}}class ma{constructor(t,e){this.classes=t,this.canvas=e;const n=document.createElement("div");n.classList.add("mathbox-overlays"),this.div=n}inject(){const t=this.canvas.parentNode;if(!t)throw new Error("Canvas not inserted into document.");return t.insertBefore(this.div,this.canvas)}unject(){return this.div.parentNode.removeChild(this.div)}getTypes(){return Object.keys(this.classes)}make(t,e){return new this.classes[t](this.div,e)}}const ga=[];let va=0;const xa={},_a=()=>({id:va++,type:null,props:null,children:null,rendered:null,instance:null}),ya=function(t){return t*=2,function(t,e,n){const i=[],r=t<e,s=n?r?e+1:e-1:e;for(let e=t;r?e<s:e>s;r?e++:e--)i.push(e);return i}(0,t=Math.max(0,ga.length-t),!1).map((t=>ga.push(_a())))},ba=function(t,e,n){const i=ga.length?ga.pop():_a();return i.type=null!=t?t:"div",i.props=null!=e?e:null,i.children=null!=n?n:null,i},wa=function(t){if(!t.type)return;const{children:e}=t;if(t.type=t.props=t.children=t.instance=null,ga.push(t),null!=e)for(const t of Array.from(e))wa(t)},Sa=function(t,e,n,i,r){if(null!=t){if(null==e)return Ma(t,i,r);{let s;if(t instanceof Node){if(s=t===e,s)return}else s=typeof t==typeof e&&null!==e&&null!==t&&t.type===e.type;if(s){let s,a,o;t.instance=e.instance;const l=(null!=t.type?t.type.isComponentClass:void 0)?t.type:xa[t.type],h=null!=e?e.props:void 0,c=t.props,u=null!=(null!=e?e.children:void 0)?null!=e?e.children:void 0:null,d=t.children;if(null!=c&&(c.children=d),null!=l){let l=n._COMPONENT_DIRTY;if(null!=h!=(null!=c)&&(l=!0),u!==d&&(l=!0),null!=h&&null!=c){if(!l)for(s in h)Object.prototype.hasOwnProperty.call(c,s)||(l=!0);if(!l)for(s in c)o=c[s],(a=h[s])!==o&&(l=!0)}if(l){let s;const a=e.instance;null==t.props&&(t.props={});for(const e in a.defaultProps){const n=a.defaultProps[e];null==t.props[e]&&(t.props[e]=n)}t.props.children=t.children,"function"==typeof a.willReceiveProps&&a.willReceiveProps(t.props);const o=n._COMPONENT_FORCE||null==(s="function"==typeof a.shouldUpdate?a.shouldUpdate(t.props):void 0)||s;if(o){const e=a.getNextState();"function"==typeof a.willUpdate&&a.willUpdate(t.props,e)}const l=a.props,h=a.applyNextState();a.props=t.props,a.children=t.children,o&&(t=t.rendered="function"==typeof a.render?a.render(ba,t.props,t.children):void 0,Sa(t,e.rendered,n,i,r),"function"==typeof a.didUpdate&&a.didUpdate(l,h))}return}if(null!=h)for(s in h)Object.prototype.hasOwnProperty.call(c,s)||Ra(n,s,h[s]);if(null!=c)for(s in c)o=c[s],(a=h[s])!==o&&"children"!==s&&Ca(n,s,o,a);if(null!=d)if(["string","number"].includes(typeof d))d!==u&&(n.textContent=d);else if(null!=d.type)Sa(d,u,n.childNodes[0],n,0);else{let t,e;const{childNodes:i}=n;if(null!=u)for(e=0;e<d.length;e++)t=d[e],Sa(t,u[e],i[e],n,e);else for(e=0;e<d.length;e++)t=d[e],Sa(t,null,i[e],n,e)}else null!=u&&(Ta(null,n),n.innerHTML="");return}return Ta(e.instance,n),n.remove(),Ma(t,i,r)}}if(null!=e)return Ta(e.instance,n),e.node.remove()},Ma=function(t,e,n){let i;null==n&&(n=0);const r=(null!=t.type?t.type.isComponentClass:void 0)?t.type:xa[t.type];if(t instanceof Node)i=t;else{if(null!=r){let r;const s=(null!=t.type?t.type.isComponentClass:void 0)?t.type:xa[t.type];if(!s)return t=t.rendered=ba("noscript"),i=Ma(t,e,n),i;t.instance=r=new s(e),null==t.props&&(t.props={});for(const e in r.defaultProps){const n=r.defaultProps[e];null==t.props[e]&&(t.props[e]=n)}return t.props.children=t.children,r.props=t.props,r.children=t.children,r.setState("function"==typeof r.getInitialState?r.getInitialState():void 0),"function"==typeof r.willMount&&r.willMount(),t=t.rendered="function"==typeof r.render?r.render(ba,t.props,t.children):void 0,i=Ma(t,e,n),"function"==typeof r.didMount&&r.didMount(t),i._COMPONENT=r,i}if(["string","number"].includes(typeof t))i=document.createTextNode(t);else{i=document.createElement(t.type);for(const e in t.props){const n=t.props[e];Ca(i,e,n)}}const{children:s}=t;if(null!=s)if(["string","number"].includes(typeof s))i.textContent=s;else if(null!=s.type)Ma(s,i,0);else for(let t=0;t<s.length;t++){const e=s[t];Ma(e,i,t)}}return e.insertBefore(i,e.childNodes[n]),i},Ta=function(t,e){if(t){"function"==typeof t.willUnmount&&t.willUnmount();for(const e in t)delete t[e]}return(()=>{const t=[];for(const n of Array.from(e.childNodes))Ta(n._COMPONENT,n),t.push(delete n._COMPONENT);return t})()},Ea=function(t){if("undefined"==typeof document)return!0;if(null!=document.documentElement.style[t])return t;t=t[0].toUpperCase()+t.slice(1);const e=["webkit","moz","ms","o"];for(const n of Array.from(e))if(null!=document.documentElement.style[n+t])return n+t},Aa={};for(const t of["transform"])Aa[t]=Ea(t);const Ca=function(t,e,n,i){if("style"!==e)if(null==t[e])t instanceof Node&&t.setAttribute(e,n);else try{t[e]=n}catch(t){console.log("failed setting "+e)}else for(const e in n){const r=n[e];(null!=i?i[e]:void 0)!==r&&(t.style[null!=Aa[e]?Aa[e]:e]=r)}},Ra=function(t,e,n){if("style"!==e)null!=t[e]&&(t[e]=void 0),t instanceof Node&&t.removeAttribute(e);else for(const e in n)t.style[null!=Aa[e]?Aa[e]:e]=""},Da=function(t){let e;const n={willMount:"componentWillMount",didMount:"componentDidMount",willReceiveProps:"componentWillReceiveProps",shouldUpdate:"shouldComponentUpdate",willUpdate:"componentWillUpdate",didUpdate:"componentDidUpdate",willUnmount:"componentWillUnmount"};for(const e in n){const i=n[e];null==t[e]&&(t[e]=t[i])}class i{constructor(e,n,i=null,r=null){let s,a;null==n&&(n={}),this.props=n,this.state=i,this.children=r;const o=function(t,e){return"function"==typeof t?t.bind(e):t};for(s in t)a=t[s],this[s]=o(a,this);let l=null;this.setState=function(t){for(s in null==l&&(l=t?null!=l?l:{}:null),t)a=t[s],l[s]=a;e._COMPONENT_DIRTY=!0},this.forceUpdate=function(){e._COMPONENT_FORCE=e._COMPONENT_DIRTY=!0;let t=e;return(()=>{const e=[];for(;t=t.parentNode;)t._COMPONENT?e.push(t._COMPONENT_FORCE=!0):e.push(void 0);return e})()},this.getNextState=()=>l,this.applyNextState=function(){e._COMPONENT_FORCE=e._COMPONENT_DIRTY=!1;const t=this.state;return[l,this.state]=Array.from([null,l]),t}}}return i.isComponentClass=!0,i.prototype.defaultProps=null!=(e="function"==typeof t.getDefaultProps?t.getDefaultProps():void 0)?e:{},i};class ka{constructor(t,e){this.element=t,"function"==typeof this.init&&this.init(e)}dispose(){}}class Pa extends ka{static initClass(){this.prototype.el=ba,this.prototype.hint=ya,this.prototype.apply=Sa,this.prototype.recycle=wa}init(t){return this.last=null}dispose(){return this.unmount(),super.dispose()}mount(){const t=document.createElement("div");return t.classList.add("mathbox-overlay"),this.element.appendChild(t),this.overlay=t}unmount(t){return this.overlay&&this.overlay.parentNode&&this.element.removeChild(this.overlay),this.overlay=null}render(t){this.overlay||this.mount(),["string","number"].includes(typeof t)&&(t=this.el("div",null,t)),t instanceof Array&&(t=this.el("div",null,t)),null==t&&(t=this.el("div"));const e="div"===t.type;let{last:n}=this;const{overlay:i}=this,r=e?i:i.childNodes[0],s=e?i.parentNode:i;!n&&r&&(n=this.el("div")),this.apply(t,n,r,s,0),this.last=t,null!=n&&this.recycle(n)}}Pa.initClass();const La={dom:Pa};class za{static initClass(){this.Node=ia,this.Group=ra,this.model=this.Node,this.defaults=null,this.traits=null,this.props=null,this.finals=null,this.freeform=!1}constructor(t,e,n){this.node=t,this._context=e,this._renderables=this._context.renderables,this._attributes=this._context.attributes,this._shaders=this._context.shaders,this._overlays=this._context.overlays,this._animator=this._context.animator,this._types=this._attributes.types,this.node.controller=this,this.node.on("added",(t=>this._added())),this.node.on("removed",(t=>this._removed())),this.node.on("change",(t=>{if(this._root)return this.change(t.changed,t.touched)})),this.reconfigure(),this._get=this.node.get.bind(this.node),this._helpers=n(this,this.node.traits),this._handlers={inherit:{},listen:[],watch:[],compute:[]},this._root=this._parent=null,this.init()}is(t){return this.traits.hash[t]}init(){}make(){}made(){}unmake(t){}unmade(){}change(t,e,n){}refresh(){return this.change({},{},!0)}rebuild(){if(this._root)return this._removed(!0),this._added()}reconfigure(t){return null!=t&&this.node.configure(t,this._attributes),this.traits=this.node.traits,this.props=this.node.props}_added(){let t,e;this._parent=null!=this.node.parent?this.node.parent.controller:void 0,this._root=null!=this.node.root?this.node.root.controller:void 0,this.node.clock=null!=(e=this._inherit("clock"))?e:this._root;try{try{return this.make(),this.refresh(),this.made()}catch(e){throw t=e,this.node.print("warn"),console.error(t),t}}catch(e){t=e;try{return this._removed()}catch(t){}}}_removed(t){return null==t&&(t=!1),this.unmake(t),this._unlisten(),this._unattach(),this._uncompute(),this._root=null,this._parent=null,this.unmade(t)}_listen(t,e,n,i){if(null==i&&(i=this),t instanceof Array)for(const r of Array.from(t))return this.__listen(r,e,n,i);return this.__listen(t,e,n,i)}__listen(t,e,n,i){if(null==i&&(i=this),"string"==typeof t&&(t=this._inherit(t)),null!=t){const r=n.bind(i);r.node=this.node,t.on(e,r),this._handlers.listen.push([t,e,r])}return t}_unlisten(){if(this._handlers.listen.length){for(const[t,e,n]of Array.from(this._handlers.listen))t.off(e,n);return this._handlers.listen=[]}}_inherit(t){const e=this._handlers.inherit[t];return void 0!==e?e:this._handlers.inherit[t]=null!=this._parent?this._parent._find(null!=t?t:null):void 0}_find(t){return this.is(t)?this:null!=this._parent?this._parent._find(t):void 0}_uninherit(){return this._handlers.inherit={}}_attach(t,e,n,i,r,s,a){null==i&&(i=this),null==r&&(r=this),null==s&&(s=!1),null==a&&(a=!1);const o=function(t){if(null!=t&&Array.from(t.traits).includes(e))return t},l=t=>null!=t?t.controller:void 0,h=function(t){if(null==t)return t;let e=[];for(const n of Array.from(t))n instanceof Array?e=e.concat(n):e.push(n);return e},c=t=>{let l,u;if("object"==typeof t){if(l=t,null!=l?l._up:void 0)return t=a?l._targets:[l[0]];if(l instanceof Array)return t=a?h(l.map(c)):c(l[0]);if(l instanceof ia)return[l]}else if("string"==typeof t&&"<"===t[0]){let e,n=0;(e=t.match(/^<([0-9])+$/))&&(n=+e[1]-1),t.match(/^<+$/)&&(n=+t.length-1),u=[];let i=r.node;for(;i;){const{parent:t}=i;if(!t)break;if(i=t.children[i.index-1],i||u.length||(i=t),l=null,o(i)&&(l=i),null!=l&&n--<=0&&u.push(l),!a&&u.length)return u}if(a&&u.length)return u}else if("string"==typeof t){const e=n.bind(i);this._handlers.watch.push(e);const r=this._root.watch(t,e);if(a){if(u=r.filter(o),u.length)return u}else if(o(r[0])&&(l=r[0]),null!=l)return[l]}if(!s)throw console.warn(this.node.toMarkup()),new Error(`${this.node.toString()} - Could not find ${e} \`${t}\``);return a?[]:null},u=h(c(t));return a?null!=u?u.map(l):null:null!=u?l(u[0]):null}_unattach(){if(this._handlers.watch.length){for(const t of Array.from(this._handlers.watch))null!=t&&t.unwatch();return this._handlers.watch=[]}}_compute(t,e){return this._handlers.compute.push(t),this.node.bind(t,e,!0)}_uncompute(){if(this._handlers.compute.length){for(const t of Array.from(this._handlers.compute))this.node.unbind(t,!0);return this._handlers.compute=[]}}}za.initClass(),E.apply(za.prototype);class Oa extends za{static initClass(){this.model=za.Group,this.traits=["node"]}}Oa.initClass();class Ia extends Oa{static initClass(){this.traits=["node","object","entity","visible","active"]}make(){return this._helpers.visible.make(),this._helpers.active.make()}unmake(){return this._helpers.visible.unmake(),this._helpers.active.unmake()}}Ia.initClass();class Na extends Oa{static initClass(){this.traits=["node","bind"]}make(){return this._helpers.bind.make([{to:"inherit.source",trait:"node"}])}unmake(){return this._helpers.bind.unmake()}_find(t){return this.bind.source&&Array.from(this.props.traits).includes(t)?this.bind.source._inherit(t):super._find()}}Na.initClass();class Fa extends Oa{static initClass(){this.traits=["node","root","clock","scene","vertex","unit"]}init(){return this.size=null,this.cameraEvent={type:"root.camera"},this.preEvent={type:"root.pre"},this.updateEvent={type:"root.update"},this.renderEvent={type:"root.render"},this.postEvent={type:"root.post"},this.clockEvent={type:"clock.tick"},this.camera=null}make(){return this._helpers.unit.make()}unmake(){return this._helpers.unit.unmake()}change(t,e,n){if(t["root.camera"]||n)return this._unattach(),this._attach(this.props.camera,"camera",this.setCamera,this,this,!0),this.setCamera()}adopt(t){return Array.from(t.renders).map((t=>this._context.scene.add(t)))}unadopt(t){return Array.from(t.renders).map((t=>this._context.scene.remove(t)))}select(t){return this.node.model.select(t)}watch(t,e){return this.node.model.watch(t,e)}unwatch(t){return this.node.model.unwatch(t)}resize(t){return this.size=t,this.trigger({type:"root.resize",size:t})}getSize(){return this.size}getSpeed(){return this.props.speed}getUnit(){return this._helpers.unit.get()}getUnitUniforms(){return this._helpers.unit.uniforms()}pre(){return this.getCamera().updateProjectionMatrix(),this.trigger(this.clockEvent),this.trigger(this.preEvent)}update(){return this.trigger(this.updateEvent)}render(){return this.trigger(this.renderEvent)}post(){return this.trigger(this.postEvent)}setCamera(){const t=(e=this.select(this.props.camera)[0],n=t=>t.controller,null!=e?n(e):void 0);var e,n;if(this.camera!==t)return this.camera=t,this.trigger({type:"root.camera"})}getCamera(){let t;return null!=(t=null!=this.camera?this.camera.getCamera():void 0)?t:this._context.defaultCamera}getTime(){return this._context.time}vertex(t,e){return 2===e?t.pipe("view.position"):3===e?t.pipe("root.position"):t}}Fa.initClass();class Ua extends Oa{static initClass(){this.traits=["node","unit"]}make(){return this._helpers.unit.make()}unmake(){return this._helpers.unit.unmake()}getUnit(){return this._helpers.unit.get()}getUnitUniforms(){return this._helpers.unit.uniforms()}}Ua.initClass();const Ba=function(t,e){return e===vt.RepeatWrapping?t.REPEAT:e===vt.ClampToEdgeWrapping?t.CLAMP_TO_EDGE:e===vt.MirroredRepeatWrapping?t.MIRRORED_REPEAT:e===vt.NearestFilter?t.NEAREST:e===vt.NearestMipMapNearestFilter?t.NEAREST_MIPMAP_NEAREST:e===vt.NearestMipMapLinearFilter?t.NEAREST_MIPMAP_LINEAR:e===vt.LinearFilter?t.LINEAR:e===vt.LinearMipMapNearestFilter?t.LINEAR_MIPMAP_NEAREST:e===vt.LinearMipMapLinearFilter?t.LINEAR_MIPMAP_LINEAR:e===vt.UnsignedByteType?t.UNSIGNED_BYTE:e===vt.UnsignedShort4444Type?t.UNSIGNED_SHORT_4_4_4_4:e===vt.UnsignedShort5551Type?t.UNSIGNED_SHORT_5_5_5_1:e===vt.ByteType?t.BYTE:e===vt.ShortType?t.SHORT:e===vt.UnsignedShortType?t.UNSIGNED_SHORT:e===vt.IntType?t.INT:e===vt.UnsignedIntType?t.UNSIGNED_INT:e===vt.FloatType?t.FLOAT:e===vt.AlphaFormat?t.ALPHA:e===vt.RGBAFormat?t.RGBA:e===vt.LuminanceFormat?t.LUMINANCE:e===vt.LuminanceAlphaFormat?t.LUMINANCE_ALPHA:e===vt.AddEquation?t.FUNC_ADD:e===vt.SubtractEquation?t.FUNC_SUBTRACT:e===vt.ReverseSubtractEquation?t.FUNC_REVERSE_SUBTRACT:e===vt.ZeroFactor?t.ZERO:e===vt.OneFactor?t.ONE:e===vt.SrcColorFactor?t.SRC_COLOR:e===vt.OneMinusSrcColorFactor?t.ONE_MINUS_SRC_COLOR:e===vt.SrcAlphaFactor?t.SRC_ALPHA:e===vt.OneMinusSrcAlphaFactor?t.ONE_MINUS_SRC_ALPHA:e===vt.DstAlphaFactor?t.DST_ALPHA:e===vt.OneMinusDstAlphaFactor?t.ONE_MINUS_DST_ALPHA:e===vt.DstColorFactor?t.DST_COLOR:e===vt.OneMinusDstColorFactor?t.ONE_MINUS_DST_COLOR:e===vt.SrcAlphaSaturateFactor?t.SRC_ALPHA_SATURATE:0},Va=function(t){switch(t){case vt.UnsignedByteType:return Uint8Array;case vt.ByteType:return Int8Array;case vt.ShortType:return Int16Array;case vt.UnsignedShortType:return Uint16Array;case vt.IntType:return Int32Array;case vt.UnsignedIntType:return Uint32Array;case vt.FloatType:return Float32Array}},Ha=t=>t.map((t=>["","X","Y","Z"][t])).join(""),Ga=function(){const t=new vt.Euler,e=new vt.Quaternion,n=new vt.Vector3,i=new vt.Vector3,r=new vt.Matrix4;return function(s,a,o,l,h,c){return null==c&&(c="XYZ"),null!=a?(c instanceof Array&&(c=Ha(c)),t.setFromVector3(a,c),e.setFromEuler(t)):e.set(0,0,0,1),null!=o&&e.multiply(o),null!=s?n.copy(s):n.set(0,0,0),null!=l?i.copy(l):i.set(1,1,1),r.compose(n,e,i),null!=h&&r.multiplyMatrices(r,h),r}};class ja extends za{static initClass(){this.traits=["node","camera"]}init(){}make(){const t=this._context.defaultCamera;return this.camera=this.props.proxy?t:t.clone(),this.euler=new vt.Euler,this.quat=new vt.Quaternion}unmake(){}getCamera(){return this.camera}change(t,e,n){if(t["camera.position"]||t["camera.quaternion"]||t["camera.rotation"]||t["camera.lookAt"]||t["camera.up"]||t["camera.fov"]||n){const{position:t,quaternion:e,rotation:n,lookAt:i,up:r,fov:s}=this.props;return null!=t&&this.camera.position.copy(t),null==e&&null==n&&null==i||(null!=i?this.camera.lookAt(i):this.camera.quaternion.set(0,0,0,1),null!=n&&(this.euler.setFromVector3(n,Ha(this.props.eulerOrder)),this.quat.setFromEuler(this.euler),this.camera.quaternion.multiply(this.quat)),null!=e&&this.camera.quaternion.multiply(e)),null!=s&&null!=this.camera.fov&&(this.camera.fov=s),null!=r&&this.camera.up.copy(r),this.camera.updateMatrix()}}}ja.initClass();const qa=function(t){const e=[];let n=t;for(;"string"!=typeof n&&null!=(null!=n?n.length:void 0);)e.push(n.length),n=n[0];return e},Wa=function(t,e){let n;null==e&&(e={});const{items:i,channels:r,width:s,height:a,depth:o}=e,l={};if(!t||!t.length)return{items:i,channels:r,width:null!=s?s:0,height:null!=a?a:0,depth:null!=o?o:0};const h=qa(t),c=h.length;l.channels=1!==r&&h.length>1?h.pop():r,l.items=1!==i&&h.length>1?h.pop():i,l.width=1!==s&&h.length>1?h.pop():s,l.height=1!==a&&h.length>1?h.pop():a,l.depth=1!==o&&h.length>1?h.pop():o;let u=c;1===r&&u++,1===i&&u>1&&u++,1===s&&u>2&&u++,1===a&&u>3&&u++;let d=null!=(n=h.pop())?n:1;return u<=1&&(d/=null!=l.channels?l.channels:1),u<=2&&(d/=null!=l.items?l.items:1),u<=3&&(d/=null!=l.width?l.width:1),u<=4&&(d/=null!=l.height?l.height:1),d=Math.floor(d),null==l.width&&(l.width=d,d=1),null==l.height&&(l.height=d,d=1),null==l.depth&&(l.depth=d,d=1),l},Xa=function(t,e){switch(e){case 0:return()=>!0;case 1:return()=>t();case 2:return function(){return t(),t()};case 3:case 4:return function(){return t(),t(),t(),t()};case 6:case 8:return function(){return t(),t(),t(),t(),t(),t()}}},Ya=function(t,e,n){let i;const r=(()=>{switch(n){case 0:return()=>!0;case 1:return e=>e(t());case 2:return e=>e(t(),t());case 3:return e=>e(t(),t(),t());case 4:return e=>e(t(),t(),t(),t());case 6:return e=>e(t(),t(),t(),t(),t(),t());case 8:return e=>e(t(),t(),t(),t(),t(),t(),t(),t())}})();let s=null;for(;e>0;){const t=Math.min(e,8);i=(()=>{switch(t){case 1:return t=>r(t);case 2:return function(t){return r(t),r(t)};case 3:return function(t){return r(t),r(t),r(t)};case 4:return function(t){return r(t),r(t),r(t),r(t)};case 5:return function(t){return r(t),r(t),r(t),r(t),r(t)};case 6:return function(t){return r(t),r(t),r(t),r(t),r(t),r(t)};case 7:return function(t){return r(t),r(t),r(t),r(t),r(t),r(t),r(t)};case 8:return function(t){return r(t),r(t),r(t),r(t),r(t),r(t),r(t),r(t)}}})(),s=null!=s?((t,e)=>function(n){return t(n),e(n)})(i,s):i,e-=t}return i=null!=s?s:()=>!0,i.reset=t.reset,i.rebind=t.rebind,i},$a=function(t){let e,n,i,r,s,a=qa(t);const o=a.length;let l=a.pop(),h=a.pop(),c=a.pop();const u=a.pop();let d,p,f,m,g;switch(o){case 0:e=()=>0,e.reset=function(){};break;case 1:d=0,e=()=>t[d++],e.reset=()=>d=0;break;case 2:d=n=0,p=null!=t[n]?t[n]:[],e=function(){const e=p[d++];return d===l&&(d=0,n++,p=null!=t[n]?t[n]:[]),e},e.reset=function(){d=n=0,p=null!=t[n]?t[n]:[]};break;case 3:d=n=i=0,f=null!=t[i]?t[i]:[],p=null!=f[n]?f[n]:[],e=function(){const e=p[d++];return d===l&&(d=0,n++,n===h&&(n=0,i++,f=null!=t[i]?t[i]:[]),p=null!=f[n]?f[n]:[]),e},e.reset=function(){d=n=i=0,f=null!=t[i]?t[i]:[],p=null!=f[n]?f[n]:[]};break;case 4:d=n=i=r=0,m=null!=t[r]?t[r]:[],f=null!=m[i]?m[i]:[],p=null!=f[n]?f[n]:[],e=function(){const e=p[d++];return d===l&&(d=0,n++,n===h&&(n=0,i++,i===c&&(i=0,r++,m=null!=t[r]?t[r]:[]),f=null!=m[i]?m[i]:[]),p=null!=f[n]?f[n]:[]),e},e.reset=function(){d=n=i=r=0,m=null!=t[r]?t[r]:[],f=null!=m[i]?m[i]:[],p=null!=f[n]?f[n]:[]};break;case 5:d=n=i=r=s=0,g=null!=t[s]?t[s]:[],m=null!=g[r]?g[r]:[],f=null!=m[i]?m[i]:[],p=null!=f[n]?f[n]:[],e=function(){const e=p[d++];return d===l&&(d=0,n++,n===h&&(n=0,i++,i===c&&(i=0,r++,r===u&&(r=0,s++,g=null!=t[s]?t[s]:[]),m=null!=g[r]?g[r]:[]),f=null!=m[i]?m[i]:[]),p=null!=f[n]?f[n]:[]),e},e.reset=function(){d=n=i=r=s=0,g=null!=t[s]?t[s]:[],m=null!=g[r]?g[r]:[],f=null!=m[i]?m[i]:[],p=null!=f[n]?f[n]:[]}}return e.rebind=function(e){if(a=qa(t=e),a.length&&(l=a.pop()),a.length&&(h=a.pop()),a.length&&(c=a.pop()),a.length)return a.pop()},e},Za=function(t,e,n,i){let r,s,a=r=s=0;const o=function(){return a=e*n*i,r=s=0},l=(()=>{switch(n){case 1:return function(t){r+=t,s+=t};case 2:return function(t){r+=2*t,s+=t};case 3:return function(t){r+=3*t,s+=t};case 4:return function(t){r+=4*t,s+=t}}})(),h=(()=>{switch(n){case 1:return function(e){e(t[r++]),++s};case 2:return function(e){e(t[r++],t[r++]),++s};case 3:return function(e){e(t[r++],t[r++],t[r++]),++s};case 4:return function(e){e(t[r++],t[r++],t[r++],t[r++]),++s}}})(),c=(()=>{switch(n){case 1:return function(e){t[r++]=e,++s};case 2:return function(e,n){t[r++]=e,t[r++]=n,++s};case 3:return function(e,n,i){t[r++]=e,t[r++]=n,t[r++]=i,++s};case 4:return function(e,n,i,a){t[r++]=e,t[r++]=n,t[r++]=i,t[r++]=a,++s}}})();return h.reset=o,c.reset=o,o(),{emit:c,consume:h,skip:l,count:()=>s,done:()=>a-r<=0,reset:o}},Ka=function(t,e){let n,i,r,s,a;const o=new Float32Array(4096);let l=i=.5,h=r=s=a=0;const c=function(t,e,n,i){return s++,o[h++]=t*l,o[h++]=e*l,o[h++]=n*l,o[h++]=i*l},u=function(t,e,n,s){return a++,o[r++]+=t*i,o[r++]+=e*i,o[r++]+=n*i,o[r++]+=s*i},d=Math.max(t.length,e.length);return n=d<=3?function(n,i,l){h=r=s=a=0,t(c,i,l),e(u,i,l);const d=Math.min(s,a);let p=0;return Qa(0,d,!1).map((t=>n(o[p++],o[p++],o[p++],o[p++])))}:d<=5?function(n,i,l,d,p){h=r=s=a=0,t(c,i,l,d,p),e(u,i,l,d,p);const f=Math.min(s,a);let m=0;return Qa(0,f,!1).map((t=>n(o[m++],o[m++],o[m++],o[m++])))}:d<=7?function(n,i,l,d,p,f,m){h=r=s=a=0,t(c,i,l,d,p,f,m),e(u,i,l,d,p,f,m);const g=Math.min(s,a);let v=0;return(()=>{let t,e;const i=[];for(m=0,e=g,t=0<=e;t?m<e:m>e;t?m++:m--)i.push(n(o[v++],o[v++],o[v++],o[v++]));return i})()}:d<=9?function(n,i,l,d,p,f,m,g,v){h=r=s=a=0,t(c,i,l,d,p,f,m,g,v),e(u,i,l,d,p,f,m,g,v);const x=Math.min(s,a);return v=0,(()=>{let t,e;const i=[];for(g=0,e=x,t=0<=e;t?g<e:g>e;t?g++:g--)i.push(n(o[v++],o[v++],o[v++],o[v++]));return i})()}:function(n,i,l,d,p,f,m,g,v,x,_){h=r=0,t(c,i,l,d,p,f,m,g,v,x,_),e(u,i,l,d,p,f,m,g,v,x,_);const y=Math.min(s,a);return v=0,(()=>{let t,e;const i=[];for(g=0,e=y,t=0<=e;t?g<e:g>e;t?g++:g--)i.push(n(o[v++],o[v++],o[v++],o[v++]));return i})()},n.lerp=function(t){let e;return[l,i]=Array.from(e=[1-t,t]),e},n},Ja=function(t,e){const n=qa(t).reduce(((t,e)=>t*e)),i=qa(e).reduce(((t,e)=>t*e)),r=Math.min(n,i),s=$a(t),a=$a(e),o=new Float32Array(r);return o.lerp=function(t){s.reset(),a.reset();let e=0;return(()=>{const n=[];for(;e<r;){const i=s(),r=a();n.push(o[e++]=i+(r-i)*t)}return n})()},o};function Qa(t,e,n){const i=[],r=t<e,s=n?r?e+1:e-1:e;for(let e=t;r?e<s:e>s;r?e++:e--)i.push(e);return i}const to="xyzw".split(""),eo={0:-1,x:0,y:1,z:2,w:3},no=function(t){return t===""+t&&(t=t.split("")),t===+t&&(t=[t]),t},io=function(t){return t===+t&&(t="vec"+t),"vec1"===t&&(t="float"),t},ro=function(t){if((t=""+t).indexOf(".")<0)return t+".0"},so=function(t){null==t&&(t=4);const e=ro(t);return`vec4 float2ByteIndex(vec4 xyzw, out float channelIndex) {\n  float relative = xyzw.w / ${e};\n  float w = floor(relative);\n  channelIndex = (relative - w) * ${e};\n  return vec4(xyzw.xyz, w);\n}`},ao=function(t){const e=function(t,n){let i;if(t===n)i=`return texture2D(dataTextures[${t}], uv);`;else{const r=Math.ceil(t+(n-t)/2);i=`if (z < ${r-.5}) {\n  ${e(t,r-1)}\n}\nelse {\n  ${e(r,n)}\n}`}return i.replace(/\n/g,"\n  ")};return`uniform sampler2D dataTextures[${t}];\n\nvec4 sample2DArray(vec2 uv, float z) {\n  ${e(0,t-1)}\n}`},oo=function(t,e,n){return t=io(t),null!=n?`${t} binaryOperator(${t} a) {\n  return a ${e} ${n};\n}`:`${t} binaryOperator(${t} a, ${t} b) {\n  return a ${e} b;\n}`},lo=function(t,e,n){if(null==n&&(n=0),t>e)return ho(t,e);const i=e-t;t=io(t),e=io(e),n=ro(n);return`${e} extendVec(${t} v) { return ${e}(${function(t,e,n){const i=[],r=t<e,s=n?r?e+1:e-1:e;for(let e=t;r?e<s:e>s;r?e++:e--)i.push(e);return i}(0,i,!0).map((function(t){return t?n:"v"})).join(",")}); }`},ho=function(t,e){if(t<e)return lo(t,e);const n="."+"xyzw".substr(0,e);return t=io(t),`${e=io(e)} truncateVec(${t} v) { return v${n}; }`},co=function(t){const e=["0.0","0.0","0.0","0.0"];t=(t=no(t)).map((function(t){return t===""+t?eo[t]:t}));for(let n=0;n<t.length;n++){e[t[n]]=["a","b","c","d"][n]}const n=e.slice(0,4).join(", ");return`vec4 inject(${["float a","float b","float c","float d"].slice(0,t.length)}) {\n  return vec4(${n});\n}`},uo=function(t,e=null){const n=["0.0","xyzw.x","xyzw.y","xyzw.z","xyzw.w"];for(null==e&&(e=t.length),t=(t=no(t)).map((function(t){return Array.from([0,1,2,3,4]).includes(+t)&&(t=+t),t===""+t&&(t=eo[t]+1),n[t]}));t.length<e;)t.push("0.0");return`vec${e} swizzle(vec4 xyzw) {\n  return vec${e}(${t.join(", ")});\n}`.replace(/vec1/g,"float")},po=function(t){const e=["0.0","0.0","0.0","0.0"];t=(t=no(t)).map((function(t){return t===+t?to[t-1]:t}));for(let n=0;n<t.length;n++){const i=t[n],r=to[n];e[eo[i]]=`xyzw.${r}`}return`vec4 invertSwizzle(vec4 xyzw) {\n  return vec4(${e.join(", ")});\n}`},fo=function(t){let e=[].slice.call(arguments);return e.length>1?(e=e.map(((t,e)=>["inout",t,String.fromCharCode(97+e)].join(" "))),e=e.join(", "),`void identity(${e}) { }`):`${t} identity(${t} x) {\n  return x;\n}`},mo=(t,e)=>`${t} constant() {\nreturn ${e};\n}`;class go extends za{static initClass(){this.traits=["node","source","index"]}made(){return this.trigger({type:"source.rebuild"})}indexShader(t){return t.pipe(fo("vec4"))}sourceShader(t){return t.pipe(fo("vec4"))}getDimensions(){return{items:1,width:1,height:1,depth:1}}getActiveDimensions(){return this.getDimensions()}getIndexDimensions(){return this.getActiveDimensions()}getFutureDimensions(){return this.getActiveDimensions()}}go.initClass();class vo extends go{static initClass(){this.traits=["node","data","source","index","entity","active"]}init(){return this.dataEmitter=null,this.dataSizes=null}emitter(t,e){let n,i;const{data:r,bind:s,expr:a}=this.props;if(null!=r){const i=this.dataSizes,s=qa(r);if(!i||i.length!==s.length){const n=$a(r);this.dataEmitter=this.callback(Ya(n,e,t)),this.dataSizes=s}n=this.dataEmitter}else null!=i?(i=this._inherit("resolve"),n=this.callback(i.callback(s))):n=null!=a?this.callback(a):this.callback(this.passthrough);return n}callback(t){return null!=t?t:function(){}}update(){}make(){return this._helpers.active.make(),this.first=!0,this._listen("root","root.update",(()=>((this.isActive||this.first)&&this.update(),this.first=!1)))}unmake(){return this._helpers.active.unmake(),this.dataEmitter=null,this.dataSizes=null}}vo.initClass();class xo extends vo{static initClass(){this.traits=["node","buffer","active","data","source","index","texture"]}init(){this.bufferSlack=0,this.bufferFrames=0,this.bufferTime=0,this.bufferDelta=0,this.bufferClock=0,this.bufferStep=0,super.init()}make(){return super.make(),this.clockParent=this._inherit("clock")}unmake(){return super.unmake()}rawBuffer(){return this.buffer}emitter(){const{channels:t,items:e}=this.props;return super.emitter(t,e)}change(t,e,n){if(t["buffer.fps"]||n){const{fps:t}=this.props;return this.bufferSlack=t?.5/t:0}}syncBuffer(t){let e,n;if(!this.buffer)return;const{live:i,fps:r,hurry:s,limit:a,realtime:o,observe:l}=this.props,h=this.buffer.getFilled();if(h&&!i)return;const c=this.clockParent.getTime();if(null!=r){const i=this.bufferSlack,u=c.step/c.delta;e=o?c.delta:c.step;const d=1/r;n=o&&l?u*d:d,this.bufferSlack=Math.min(a/r,i+e),this.bufferDelta=e,this.bufferStep=n;let p=Math.min(s,Math.floor(i*r));h||(p=Math.max(1,p));let f=!1;const m=()=>f=!0;return(()=>{const i=[];for(let r=0,s=p,a=0<=s;(a?r<s:r>s)&&(this.bufferTime+=e,this.bufferClock+=n,!f);a?r++:r--)t(m,this.bufferFrames++,r,p),i.push(this.bufferSlack-=d);return i})()}return this.bufferTime=c.time,this.bufferDelta=c.delta,this.bufferClock=c.clock,this.bufferStep=c.step,t((function(){}),this.bufferFrames++,0,1)}alignShader(t,e){const{minFilter:n,magFilter:i,aligned:r}=this.props,s=t.items>1&&t.width>1||t.height>1&&t.depth>1;if(r||!s)return;return n===this.node.attributes["texture.minFilter"].enum.nearest&&i===this.node.attributes["texture.magFilter"].enum.nearest||console.warn(`${this.node.toString()} - Cannot use linear min/magFilter with 3D/4D sampling`),e.pipe("map.xyzw.align")}}xo.initClass();class _o extends xo{static initClass(){this.traits=["node","buffer","active","data","source","index","array","texture","raw"]}init(){return this.buffer=this.spec=null,this.space={width:0,history:0},this.used={width:0},this.storage="arrayBuffer",this.passthrough=(t,e)=>t(e,0,0,0),super.init()}sourceShader(t){const e=this.getDimensions();return this.alignShader(e,t),this.buffer.shader(t)}getDimensions(){return{items:this.items,width:this.space.width,height:this.space.history,depth:1}}getActiveDimensions(){return{items:this.items,width:this.used.width,height:this.buffer.getFilled(),depth:1}}getFutureDimensions(){return{items:this.items,width:this.used.width,height:this.space.history,depth:1}}getRawDimensions(){return{items:this.items,width:this.space.width,height:1,depth:1}}make(){super.make();const t=null!=this.minFilter?this.minFilter:this.props.minFilter,e=null!=this.magFilter?this.magFilter:this.props.magFilter,n=null!=this.type?this.type:this.props.type,{width:i}=this.props,{history:r}=this.props,s=this.props.bufferWidth,{channels:a}=this.props,{items:o}=this.props;let l=this.spec={channels:a,items:o,width:i};this.items=l.items,this.channels=l.channels;const{data:h}=this.props;l=Wa(h,l);const{space:c}=this;return c.width=Math.max(s,l.width||1),c.history=r,this.buffer=this._renderables.make(this.storage,{width:c.width,history:c.history,channels:a,items:o,minFilter:t,magFilter:e,type:n})}unmake(){if(super.unmake(),this.buffer)return this.buffer.dispose(),this.buffer=this.spec=null}change(t,e,n){if(e.texture||t["history.history"]||t["buffer.channels"]||t["buffer.items"]||t["array.bufferWidth"])return this.rebuild();if(this.buffer){if(t["array.width"]){const{width:t}=this.props;if(t>this.space.width)return this.rebuild()}return t["data.map"]||t["data.data"]||t["data.resolve"]||t["data.expr"]||n?this.buffer.setCallback(this.emitter()):void 0}}callback(t){return t.length<=2?t:(e,n)=>t(e,n,this.bufferClock,this.bufferStep)}update(){if(!this.buffer)return;const{data:t}=this.props,{space:e,used:n}=this,i=n.width,r=this.buffer.getFilled();return this.syncBuffer((i=>{if(null!=t){const r=Wa(t,this.spec);return r.width>e.width?(i(),this.rebuild()):(n.width=r.width,this.buffer.setActive(n.width),"function"==typeof this.buffer.callback.rebind&&this.buffer.callback.rebind(t),this.buffer.update())}{let t=this.spec.width||1;return this.buffer.setActive(t),t=this.buffer.update(),n.width=t}})),n.width!==i||r!==this.buffer.getFilled()?this.trigger({type:"source.resize"}):void 0}}_o.initClass();class yo extends _o{static initClass(){this.traits=["node","buffer","active","data","source","index","texture","array","span","interval","sampler","raw"]}updateSpan(){let t;const e=this.props.axis;let{width:n}=this.props;const{centered:i}=this.props,r=this.props.padding,s=this._helpers.span.get("",e);n+=2*r,this.a=s.x;const a=s.y-s.x;return i?(t=1/Math.max(1,n),this.a+=a*t/2):t=1/Math.max(1,n-1),this.b=a*t,this.a+=r*this.b}callback(t){return this.updateSpan(),this.last===t?this._callback:(this.last=t,t.length<=3?this._callback=(e,n)=>{const i=this.a+this.b*n;return t(e,i,n)}:this._callback=(e,n)=>{const i=this.a+this.b*n;return t(e,i,n,this.bufferClock,this.bufferStep)})}make(){return super.make(),this._helpers.span.make(),this._listen(this,"span.range",this.updateSpan)}unmake(){return super.unmake(),this._helpers.span.unmake()}}yo.initClass();class bo extends xo{static initClass(){this.traits=["node","buffer","active","data","source","index","texture","matrix","raw"]}init(){return this.buffer=this.spec=null,this.space={width:0,height:0,history:0},this.used={width:0,height:0},this.storage="matrixBuffer",this.passthrough=(t,e,n)=>t(e,n,0,0),super.init()}sourceShader(t){const e=this.getDimensions();return this.alignShader(e,t),this.buffer.shader(t)}getDimensions(){return{items:this.items,width:this.space.width,height:this.space.height,depth:this.space.history}}getActiveDimensions(){return{items:this.items,width:this.used.width,height:this.used.height,depth:this.buffer.getFilled()}}getFutureDimensions(){return{items:this.items,width:this.used.width,height:this.used.height,depth:this.space.history}}getRawDimensions(){return{items:this.items,width:this.space.width,height:this.space.height,depth:1}}make(){super.make();const t=null!=this.minFilter?this.minFilter:this.props.minFilter,e=null!=this.magFilter?this.magFilter:this.props.magFilter,n=null!=this.type?this.type:this.props.type,{width:i}=this.props,{height:r}=this.props,{history:s}=this.props,a=this.props.bufferWidth,o=this.props.bufferHeight,{channels:l}=this.props,{items:h}=this.props;let c=this.spec={channels:l,items:h,width:i,height:r};this.items=c.items,this.channels=c.channels;const{data:u}=this.props;c=Wa(u,c);const{space:d}=this;return d.width=Math.max(a,c.width||1),d.height=Math.max(o,c.height||1),d.history=s,this.buffer=this._renderables.make(this.storage,{width:d.width,height:d.height,history:d.history,channels:l,items:h,minFilter:t,magFilter:e,type:n})}unmake(){if(super.unmake(),this.buffer)return this.buffer.dispose(),this.buffer=this.spec=null}change(t,e,n){if(e.texture||t["matrix.history"]||t["buffer.channels"]||t["buffer.items"]||t["matrix.bufferWidth"]||t["matrix.bufferHeight"])return this.rebuild();if(this.buffer){if(t["matrix.width"]){const{width:t}=this.props;if(t>this.space.width)return this.rebuild()}if(t["matrix.height"]){const{height:t}=this.props;if(t>this.space.height)return this.rebuild()}return t["data.map"]||t["data.data"]||t["data.resolve"]||t["data.expr"]||n?this.buffer.setCallback(this.emitter()):void 0}}callback(t){return t.length<=3?t:(e,n,i)=>t(e,n,i,this.bufferClock,this.bufferStep)}update(){if(!this.buffer)return;const{data:t}=this.props,{space:e,used:n}=this,i=n.width,r=n.height,s=this.buffer.getFilled();return this.syncBuffer((i=>{if(null!=t){const r=Wa(t,this.spec);return r.width>e.width||r.height>e.height?(i(),this.rebuild()):(n.width=r.width,n.height=r.height,this.buffer.setActive(n.width,n.height),"function"==typeof this.buffer.callback.rebind&&this.buffer.callback.rebind(t),this.buffer.update())}{let t;const e=this.spec.width||1,i=this.spec.height||1;this.buffer.setActive(e,i);const r=this.buffer.update();if(n.width=t=e,n.height=Math.ceil(r/t),1===n.height)return n.width=r}})),n.width!==i||n.height!==r||s!==this.buffer.getFilled()?this.trigger({type:"source.resize"}):void 0}}bo.initClass();class wo extends bo{static initClass(){this.traits=["node","buffer","active","data","source","index","matrix","texture","raw","span:x","span:y","area","sampler:x","sampler:y"]}updateSpan(){let t,e;const n=this.props.axes;let{width:i}=this.props,{height:r}=this.props;const{centeredX:s}=this.props,{centeredY:a}=this.props,o=this.props.paddingX,l=this.props.paddingY,h=this._helpers.span.get("x.",n[0]),c=this._helpers.span.get("y.",n[1]);this.aX=h.x,this.aY=c.x;const u=h.y-h.x,d=c.y-c.x;return i+=2*o,r+=2*l,s?(t=1/Math.max(1,i),this.aX+=u*t/2):t=1/Math.max(1,i-1),a?(e=1/Math.max(1,r),this.aY+=d*e/2):e=1/Math.max(1,r-1),this.bX=u*t,this.bY=d*e,this.aX+=o*this.bX,this.aY+=l*this.bY}callback(t){return this.updateSpan(),this.last===t?this._callback:(this.last=t,t.length<=5?this._callback=(e,n,i)=>{const r=this.aX+this.bX*n,s=this.aY+this.bY*i;return t(e,r,s,n,i)}:this._callback=(e,n,i)=>{const r=this.aX+this.bX*n,s=this.aY+this.bY*i;return t(e,r,s,n,i,this.bufferClock,this.bufferStep)})}make(){return super.make(),this._helpers.span.make(),this._listen(this,"span.range",this.updateSpan)}unmake(){return super.unmake(),this._helpers.span.unmake()}}wo.initClass();class So extends xo{constructor(...t){super(...t),this.update=this.update.bind(this)}static initClass(){this.traits=["node","buffer","active","data","source","index","texture","voxel","raw"]}init(){this.buffer=this.spec=null,this.space={width:0,height:0,depth:0},this.used={width:0,height:0,depth:0},this.storage="voxelBuffer",this.passthrough=(t,e,n,i)=>t(e,n,i,0),super.init()}sourceShader(t){const e=this.getDimensions();return this.alignShader(e,t),this.buffer.shader(t)}getDimensions(){return{items:this.items,width:this.space.width,height:this.space.height,depth:this.space.depth}}getActiveDimensions(){return{items:this.items,width:this.used.width,height:this.used.height,depth:this.used.depth*this.buffer.getFilled()}}getRawDimensions(){return this.getDimensions()}make(){super.make();const t=null!=this.minFilter?this.minFilter:this.props.minFilter,e=null!=this.magFilter?this.magFilter:this.props.magFilter,n=null!=this.type?this.type:this.props.type,{width:i}=this.props,{height:r}=this.props,{depth:s}=this.props,a=this.props.bufferWidth,o=this.props.bufferHeight,l=this.props.bufferDepth,{channels:h}=this.props,{items:c}=this.props;let u=this.spec={channels:h,items:c,width:i,height:r,depth:s};this.items=u.items,this.channels=u.channels;const{data:d}=this.props;u=Wa(d,u);const{space:p}=this;return p.width=Math.max(a,u.width||1),p.height=Math.max(o,u.height||1),p.depth=Math.max(l,u.depth||1),this.buffer=this._renderables.make(this.storage,{width:p.width,height:p.height,depth:p.depth,channels:h,items:c,minFilter:t,magFilter:e,type:n})}unmake(){if(super.unmake(),this.buffer)return this.buffer.dispose(),this.buffer=this.spec=null}change(t,e,n){if(e.texture||t["buffer.channels"]||t["buffer.items"]||t["voxel.bufferWidth"]||t["voxel.bufferHeight"]||t["voxel.bufferDepth"])return this.rebuild();if(this.buffer){if(t["voxel.width"]){const{width:t}=this.props;if(t>this.space.width)return this.rebuild()}if(t["voxel.height"]){const{height:t}=this.props;if(t>this.space.height)return this.rebuild()}if(t["voxel.depth"]){const{depth:t}=this.props;if(t>this.space.depth)return this.rebuild()}return t["data.map"]||t["data.data"]||t["data.resolve"]||t["data.expr"]||n?this.buffer.setCallback(this.emitter()):void 0}}callback(t){return t.length<=4?t:(e,n,i,r)=>t(e,n,i,r,this.bufferClock,this.bufferStep)}update(){if(!this.buffer)return;const{data:t}=this.props,{space:e,used:n}=this,i=n.width,r=n.height,s=n.depth,a=this.buffer.getFilled();return this.syncBuffer((i=>{if(null!=t){const r=Wa(t,this.spec);return r.width>e.width||r.height>e.height||r.depth>e.depth?(i(),this.rebuild()):(n.width=r.width,n.height=r.height,n.depth=r.depth,this.buffer.setActive(n.width,n.height,n.depth),"function"==typeof this.buffer.callback.rebind&&this.buffer.callback.rebind(t),this.buffer.update())}{let t,e;const i=this.spec.width||1,r=this.spec.height||1,s=this.spec.depth||1;this.buffer.setActive(i,r,s);const a=this.buffer.update();if(n.width=e=i,n.height=t=r,n.depth=Math.ceil(a/e/t),1===n.depth&&(n.height=Math.ceil(a/e),1===n.height))return n.width=a}})),n.width!==i||n.height!==r||n.depth!==s||a!==this.buffer.getFilled()?this.trigger({type:"source.resize"}):void 0}}So.initClass();class Mo extends So{static initClass(){this.traits=["node","buffer","active","data","source","index","texture","voxel","span:x","span:y","span:z","volume","sampler:x","sampler:y","sampler:z","raw"]}updateSpan(){let t,e,n;const i=this.props.axes;let{width:r}=this.props,{height:s}=this.props,{depth:a}=this.props;const{centeredX:o}=this.props,{centeredY:l}=this.props,{centeredZ:h}=this.props,c=this.props.paddingX,u=this.props.paddingY,d=this.props.paddingZ,p=this._helpers.span.get("x.",i[0]),f=this._helpers.span.get("y.",i[1]),m=this._helpers.span.get("z.",i[2]);this.aX=p.x,this.aY=f.x,this.aZ=m.x;const g=p.y-p.x,v=f.y-f.x,x=m.y-m.x;return r+=2*c,s+=2*u,a+=2*d,o?(t=1/Math.max(1,r),this.aX+=g*t/2):t=1/Math.max(1,r-1),l?(e=1/Math.max(1,s),this.aY+=v*e/2):e=1/Math.max(1,s-1),h?(n=1/Math.max(1,a),this.aZ+=x*n/2):n=1/Math.max(1,a-1),this.bX=g*t,this.bY=v*e,this.bZ=x*n,this.aX+=this.bX*c,this.aY+=this.bY*u,this.aZ+=this.bZ*u}callback(t){return this.updateSpan(),this.last===t?this._callback:(this.last=t,t.length<=7?this._callback=(e,n,i,r)=>{const s=this.aX+this.bX*n,a=this.aY+this.bY*i,o=this.aZ+this.bZ*r;return t(e,s,a,o,n,i,r)}:this._callback=(e,n,i,r)=>{const s=this.aX+this.bX*n,a=this.aY+this.bY*i,o=this.aZ+this.bZ*r;return t(e,s,a,o,n,i,r,this.bufferClock,this.bufferStep)})}make(){return super.make(),this._helpers.span.make(),this._listen(this,"span.range",this.updateSpan)}unmake(){return super.unmake(),this._helpers.span.unmake()}}Mo.initClass();const To=function(t,e,n){+e===e&&(e=[e]);const i=Array.from(e).includes(1)?0:n.x,r=Array.from(e).includes(2)?0:n.y,s=Array.from(e).includes(3)?0:n.z,a=Array.from(e).includes(4)?0:n.w;return t.set(i,r,s,a)},Eo=function(){const t=new vt.Vector4;return function(e,n,i){return To(t,n,i),e.add(t)}}(),Ao=function(t,e){const n=1===e?1:0,i=2===e?1:0,r=3===e?1:0,s=4===e?1:0;return t.set(n,i,r,s)},Co=function(t,e){const n=1===e?1:0,i=2===e?1:0,r=3===e?1:0,s=4===e?1:0;return t.set(i,r+n,s,0)},Ro=function(){const t=[0,0];return function(e,n,i,r){if(null==r&&(r=0),i>0){const t=e,s=e+n,a=Math.max(Math.abs(t),Math.abs(s)),o=a*r,l=Math.min(t,s),h=Math.max(t,s);n=h+(a+o-h)*i-(e=l+(-a+o-l)*i)}return t[0]=e,t[1]=n,t}}();class Do extends go{static initClass(){this.traits=["node","source","index","interval","span","scale","raw","origin"]}init(){return this.used=this.space=this.scaleAxis=this.sampler=null}rawBuffer(){return this.buffer}sourceShader(t){return t.pipe(this.sampler)}getDimensions(){return{items:1,width:this.space,height:1,depth:1}}getActiveDimensions(){return{items:1,width:this.used,height:this.buffer.getFilled(),depth:1}}getRawDimensions(){return this.getDimensions()}make(){let t;this.space=t=this._helpers.scale.divide(""),this.buffer=this._renderables.make("dataBuffer",{width:t,channels:1,items:1});const e={scaleAxis:this._attributes.make(this._types.vec4()),scaleOffset:this._attributes.make(this._types.vec4())};this.scaleAxis=e.scaleAxis.value,this.scaleOffset=e.scaleOffset.value;const n=this.sampler=this._shaders.shader();return n.require(this.buffer.shader(this._shaders.shader(),1)),n.pipe("scale.position",e),this._helpers.span.make(),this._listen(this,"span.range",this.updateRanges)}unmake(){return this.scaleAxis=null,this._helpers.span.unmake()}change(t,e,n){return t["scale.divide"]?this.rebuild():e.view||e.interval||e.span||e.scale||n?this.updateRanges():void 0}updateRanges(){const{used:t}=this,{axis:e,origin:n}=this.props,i=this._helpers.span.get("",e),r=i.x,s=i.y,a=this._helpers.scale.generate("",this.buffer,r,s);if(Ao(this.scaleAxis,e),To(this.scaleOffset,e,n),this.used=a.length,this.used!==t)return this.trigger({type:"source.resize"})}}Do.initClass();const ko=function(){const t={};for(const e of Array.from(arguments))for(const n in e){const i=e[n];t[n]=i}return t},Po=t=>JSON.parse(JSON.serialize(t)),Lo=function(t){let e="";const n=function(t){return e.length&&r.push((t=>t.replace(/\\/g,""))(e)),e=null!=t?t:""};t=t.split(/(?=(?:\\.|["' ,]))/g);let i=!1;const r=[];for(const r of Array.from(t)){const s=r[0],a=r.slice(1);switch(s){case'"':case"'":if(i)i===s?(i=!1,n(a)):e+=r;else{if(""!==e)throw new Error(`ParseError: String \`${t}\` does not contain comma-separated quoted tokens.`);i=s,e+=a}break;case" ":case",":i?e+=r:n(a);break;default:e+=r}}return n(),r};class zo extends za{static initClass(){this.traits=["node","object","visible","style","line","axis","span","interval","arrow","position","origin","shade"],this.defaults={end:!0,zBias:-1}}constructor(t,e,n){super(t,e,n),this.axisPosition=this.axisStep=this.resolution=this.line=this.arrows=null}make(){const t={axisPosition:this._attributes.make(this._types.vec4()),axisStep:this._attributes.make(this._types.vec4())};this.axisPosition=t.axisPosition.value,this.axisStep=t.axisStep.value;let e=this._shaders.shader();e.pipe("axis.position",t),e=this._helpers.position.pipeline(e);const n=this._helpers.style.uniforms(),i=this._helpers.line.uniforms(),r=this._helpers.arrow.uniforms(),s=this._inherit("unit").getUnitUniforms(),{detail:a}=this.props,o=a+1;this.resolution=1/a;const{start:l,end:h}=this.props,{stroke:c,join:u}=this.props;let d=this._helpers.object.mask();const p=this._helpers.shade.pipeline()||!1,{crossed:f,axis:m}=this.props;if(!f&&null!=d&&m>1){const t=["x000","y000","z000","w000"][m];d=this._helpers.position.swizzle(d,t)}const g=ko(r,i,n,s);return this.line=this._renderables.make("line",{uniforms:g,samples:o,position:e,clip:l||h,stroke:c,join:u,mask:d,material:p}),this.arrows=[],l&&this.arrows.push(this._renderables.make("arrow",{uniforms:g,flip:!0,samples:o,position:e,mask:d,material:p})),h&&this.arrows.push(this._renderables.make("arrow",{uniforms:g,samples:o,position:e,mask:d,material:p})),this._helpers.visible.make(),this._helpers.object.make(this.arrows.concat([this.line])),this._helpers.span.make(),this._listen(this,"span.range",this.updateRanges)}unmake(){return this._helpers.visible.unmake(),this._helpers.object.unmake(),this._helpers.span.unmake()}change(t,e,n){return t["axis.detail"]||t["line.stroke"]||t["line.join"]||t["axis.crossed"]||t["interval.axis"]&&this.props.crossed?this.rebuild():e.interval||e.span||e.view||n?this.updateRanges():void 0}updateRanges(){const{axis:t,origin:e}=this.props,n=this._helpers.span.get("",t),i=n.x,r=n.y;return Ao(this.axisPosition,t).multiplyScalar(i),Ao(this.axisStep,t).multiplyScalar((r-i)*this.resolution),Eo(this.axisPosition,t,e)}}zo.initClass();class Oo extends za{static initClass(){this.traits=["node","object","visible","style","line","mesh","face","geometry","position","bind","shade"]}constructor(t,e,n){super(t,e,n),this.face=null}resize(){if(null==this.bind.points)return;const t=this.bind.points.getActiveDimensions(),{items:e,width:n,height:i,depth:r}=t;if(this.face&&this.face.geometry.clip(n,i,r,e),this.line&&this.line.geometry.clip(e,n,i,r),null!=this.bind.map){const t=this.bind.map.getActiveDimensions();if(this.face)return this.face.geometry.map(t.width,t.height,t.depth,t.items)}}make(){let t,e;if(this._helpers.bind.make([{to:"geometry.points",trait:"source"},{to:"geometry.colors",trait:"source"},{to:"mesh.map",trait:"source"}]),null==this.bind.points)return;let n=this.bind.points.sourceShader(this._shaders.shader());n=this._helpers.position.pipeline(n);const i=this._helpers.style.uniforms(),r=this._helpers.line.uniforms(),s=this._inherit("unit").getUnitUniforms(),a={};a.styleZBias=this._attributes.make(this._types.number()),this.wireZBias=a.styleZBias;const o=this.bind.points.getDimensions(),{items:l,width:h,height:c,depth:u}=o,{line:d,shaded:p,fill:f,stroke:m,join:g}=this.props;this.bind.colors&&(t=this._shaders.shader(),this.bind.colors.sourceShader(t));const v=this._helpers.object.mask(),x=this._helpers.shade.map(null!=this.bind.map?this.bind.map.sourceShader(this._shaders.shader()):void 0),_=this._helpers.shade.pipeline(),y=_||p,b=_||!1,w=[];if(d){const o=this._shaders.shader();o.pipe(uo("yzwx")),o.pipe(n),e=ko(s,r,i,a),this.line=this._renderables.make("line",{uniforms:e,samples:l,strips:h,ribbons:c,layers:u,position:o,color:t,stroke:m,join:g,material:b,mask:v,closed:!0}),w.push(this.line)}return f&&(e=ko(s,i,{}),this.face=this._renderables.make("face",{uniforms:e,width:h,height:c,depth:u,items:l,position:n,color:t,material:y,mask:v,map:x}),w.push(this.face)),this._helpers.visible.make(),this._helpers.object.make(w)}made(){return this.resize()}unmake(){return this._helpers.bind.unmake(),this._helpers.visible.unmake(),this._helpers.object.unmake(),this.face=this.line=null}change(t,e,n){if(t["geometry.points"]||e.mesh)return this.rebuild();if(t["style.zBias"]||t["mesh.lineBias"]||n){const{fill:t,zBias:e,lineBias:n}=this.props;return this.wireZBias.value=e+(t?n:0)}}}Oo.initClass();class Io extends za{static initClass(){this.traits=["node","object","visible","style","line","grid","area","position","origin","shade","axis:x","axis:y","scale:x","scale:y","span:x","span:y"],this.defaults={width:1,zBias:-2}}constructor(t,e,n){super(t,e,n),this.axes=null}make(){let t,e=this._helpers.object.mask();const n=this._helpers.shade.pipeline()||!1;t=(t,i,r)=>{let s;const a=this._get(t+"axis.detail"),o=a+1,c=1/a,u=this._helpers.scale.divide(i),d=this._renderables.make("dataBuffer",{width:u,channels:1}),p={gridPosition:this._attributes.make(this._types.vec4()),gridStep:this._attributes.make(this._types.vec4()),gridAxis:this._attributes.make(this._types.vec4())},f={gridPosition:p.gridPosition.value,gridStep:p.gridStep.value,gridAxis:p.gridAxis.value},m=s=this._shaders.shader();null!=r&&null!=e&&(e=this._helpers.position.swizzle(e,r)),m.require(d.shader(this._shaders.shader(),2)),m.pipe("grid.position",p),s=this._helpers.position.pipeline(m);const g=this._helpers.style.uniforms(),v=this._helpers.line.uniforms(),x=this._inherit("unit").getUnitUniforms(),_=ko(v,g,x);return{first:t,second:i,resolution:c,samples:o,line:this._renderables.make("line",{uniforms:_,samples:o,strips:u,position:s,stroke:l,join:h,mask:e,material:n}),buffer:d,values:f}};const{lineX:i,lineY:r,crossed:s,axes:a}=this.props,o=["0000","x000","y000","z000","w000"][a[1]],{stroke:l,join:h}=this.props;this.axes=[],i&&this.axes.push(t("x.","y.",null)),r&&this.axes.push(t("y.","x.",s?null:o));const c=(()=>{const e=[];for(t of this.axes)e.push(t.line);return e})();return this._helpers.visible.make(),this._helpers.object.make(c),this._helpers.span.make(),this._listen(this,"span.range",this.updateRanges)}unmake(){this._helpers.visible.unmake(),this._helpers.object.unmake(),this._helpers.span.unmake();for(const t of this.axes)t.buffer.dispose();this.axes=null}change(t,e,n){return t["x.axis.detail"]||t["y.axis.detail"]||t["x.axis.factor"]||t["y.axis.factor"]||t["grid.lineX"]||t["grid.lineY"]||t["line.stroke"]||t["line.join"]||t["grid.crossed"]||t["grid.axes"]&&this.props.crossed?this.rebuild():e.x||e.y||e.area||e.grid||e.view||n?this.updateRanges():void 0}updateRanges(){const t=(t,i,r,s,a)=>{const{second:o,resolution:l,samples:h,line:c,buffer:u,values:d}=a;let p=r.x,f=r.y;Ao(d.gridPosition,t).multiplyScalar(p),Ao(d.gridStep,t).multiplyScalar((f-p)*l),Eo(d.gridPosition,e,n),p=s.x,f=s.y;const m=this._helpers.scale.generate(o,u,p,f);Ao(d.gridAxis,i);const g=m.length;return c.geometry.clip(h,g,1,1)},{axes:e,origin:n}=this.props,i=this._helpers.span.get("x.",e[0]),r=this._helpers.span.get("y.",e[1]),{lineX:s,lineY:a}=this.props;s&&t(e[0],e[1],i,r,this.axes[0]),a&&t(e[1],e[0],r,i,this.axes[+s]),window.cake1=this.axes[0].buffer,window.cake2=this.axes[1].buffer,window.cake3=this.axes[0]}}Io.initClass();class No extends za{static initClass(){this.traits=["node","object","visible","style","line","arrow","geometry","position","bind","shade"]}constructor(t,e,n){super(t,e,n),this.line=this.arrows=null}resize(){if(null==this.bind.points)return;const t=this.bind.points.getActiveDimensions(),e=t.width,n=t.height,i=t.depth,r=t.items;return this.line.geometry.clip(e,n,i,r),Array.from(this.arrows).map((t=>t.geometry.clip(e,n,i,r)))}make(){let t;if(this._helpers.bind.make([{to:"geometry.points",trait:"source"},{to:"geometry.colors",trait:"source"}]),null==this.bind.points)return;let e=this._shaders.shader();e=this.bind.points.sourceShader(e),e=this._helpers.position.pipeline(e);const n=this._helpers.style.uniforms(),i=this._helpers.line.uniforms(),r=this._helpers.arrow.uniforms(),s=this._inherit("unit").getUnitUniforms(),{start:a,end:o}=this.props,{stroke:l,join:h,proximity:c}=this.props;this.proximity=c;const u=this.bind.points.getDimensions(),d=u.width,p=u.height,f=u.depth,m=u.items;this.bind.colors&&(t=this._shaders.shader(),this.bind.colors.sourceShader(t));const g=this._helpers.object.mask(),v=this._helpers.shade.pipeline()||!1,x=ko(r,i,n,s);return this.line=this._renderables.make("line",{uniforms:x,samples:d,strips:p,ribbons:f,layers:m,position:e,color:t,clip:a||o,stroke:l,join:h,proximity:c,mask:g,material:v}),this.arrows=[],a&&this.arrows.push(this._renderables.make("arrow",{uniforms:x,flip:!0,samples:d,strips:p,ribbons:f,layers:m,position:e,color:t,mask:g,material:v})),o&&this.arrows.push(this._renderables.make("arrow",{uniforms:x,samples:d,strips:p,ribbons:f,layers:m,position:e,color:t,mask:g,material:v})),this._helpers.visible.make(),this._helpers.object.make(this.arrows.concat([this.line]))}made(){return this.resize()}unmake(){return this._helpers.bind.unmake(),this._helpers.visible.unmake(),this._helpers.object.unmake(),this.line=this.arrows=null}change(t,e,n){return t["geometry.points"]||t["line.stroke"]||t["line.join"]||t["arrow.start"]||t["arrow.end"]||t["line.proximity"]&&null!=this.proximity!=(null!=this.props.proximity)?this.rebuild():void 0}}No.initClass();class Fo extends za{static initClass(){this.traits=["node","object","visible","style","point","geometry","position","bind","shade"]}constructor(t,e,n){super(t,e,n),this.point=null}resize(){if(null==this.bind.points)return;const t=this.bind.points.getActiveDimensions(),{items:e,width:n,height:i,depth:r}=t;return this.point.geometry.clip(n,i,r,e)}make(){let t,e;if(this._helpers.bind.make([{to:"geometry.points",trait:"source"},{to:"geometry.colors",trait:"source"},{to:"point.sizes",trait:"source"}]),null==this.bind.points)return;let n=this._shaders.shader();n=this.bind.points.sourceShader(n),n=this._helpers.position.pipeline(n);const i=this.bind.points.getDimensions(),{items:r,width:s,height:a,depth:o}=i,l=this._helpers.style.uniforms(),h=this._helpers.point.uniforms(),c=this._inherit("unit").getUnitUniforms();this.bind.colors&&(t=this._shaders.shader(),this.bind.colors.sourceShader(t)),this.bind.sizes&&(e=this._shaders.shader(),this.bind.sizes.sourceShader(e));const u=this._helpers.object.mask(),d=this._helpers.shade.pipeline()||!1,{shape:p}=this.props,{fill:f}=this.props,{optical:m}=this.props,g=ko(c,h,l);this.point=this._renderables.make("point",{uniforms:g,width:s,height:a,depth:o,items:r,position:n,color:t,size:e,shape:p,optical:m,fill:f,mask:u,material:d}),this._helpers.visible.make(),this._helpers.object.make([this.point])}made(){return this.resize()}unmake(){this._helpers.bind.unmake(),this._helpers.visible.unmake(),this._helpers.object.unmake(),this.point=null}change(t,e,n){if(t["geometry.points"]||t["point.shape"]||t["point.fill"])return this.rebuild()}}Fo.initClass();class Uo extends za{static initClass(){this.traits=["node","object","visible","style","line","mesh","strip","geometry","position","bind","shade"]}constructor(t,e,n){super(t,e,n),this.strip=null}resize(){if(null==this.bind.points)return;const t=this.bind.points.getActiveDimensions(),{items:e,width:n,height:i,depth:r}=t;if(this.strip&&this.strip.geometry.clip(n,i,r,e),this.line&&this.line.geometry.clip(e,n,i,r),null!=this.bind.map){const t=this.bind.map.getActiveDimensions();if(this.strip)return this.strip.geometry.map(t.width,t.height,t.depth,t.items)}}make(){let t,e;if(this._helpers.bind.make([{to:"geometry.points",trait:"source"},{to:"geometry.colors",trait:"source"},{to:"mesh.map",trait:"source"}]),null==this.bind.points)return;let n=this._shaders.shader();n=this.bind.points.sourceShader(n),n=this._helpers.position.pipeline(n);const i=this._helpers.style.uniforms(),r=this._helpers.line.uniforms(),s=this._inherit("unit").getUnitUniforms(),{line:a,shaded:o,fill:l,stroke:h,join:c}=this.props,u={};u.styleZBias=this._attributes.make(this._types.number()),this.wireZBias=u.styleZBias;const d=this.bind.points.getDimensions(),{items:p,width:f,height:m,depth:g}=d;this.bind.colors&&(t=this._shaders.shader(),t=this.bind.colors.sourceShader(t));const v=this._helpers.object.mask();this._helpers.shade.map(null!=this.bind.map?this.bind.map.sourceShader(this._shaders.shader()):void 0);const x=this._helpers.shade.pipeline(),_=x||o,y=x||!1,b=[];if(a){const a=this._shaders.shader();a.pipe(uo("yzwx")),a.pipe(n),e=ko(s,r,i,u),this.line=this._renderables.make("line",{uniforms:e,samples:p,strips:f,ribbons:m,layers:g,position:a,color:t,stroke:h,join:c,mask:v,material:y}),b.push(this.line)}return l&&(e=ko(i,{}),this.strip=this._renderables.make("strip",{uniforms:e,width:f,height:m,depth:g,items:p,position:n,color:t,material:_}),b.push(this.strip)),this._helpers.visible.make(),this._helpers.object.make(b)}made(){return this.resize()}unmake(){return this._helpers.bind.unmake(),this._helpers.visible.unmake(),this._helpers.object.unmake(),this.strip=null}change(t,e,n){if(t["geometry.points"]||e.mesh)return this.rebuild();if(t["style.zBias"]||t["mesh.lineBias"]||n){const{fill:t,zBias:e,lineBias:n}=this.props;return this.wireZBias.value=e+(t?n:0)}}}Uo.initClass();class Bo extends za{static initClass(){this.traits=["node","object","visible","style","line","mesh","geometry","surface","position","grid","bind","shade"],this.defaults={lineX:!1,lineY:!1}}constructor(t,e,n){super(t,e,n),this.lineX=this.lineY=this.surface=null}resize(){if(null==this.bind.points)return;const t=this.bind.points.getActiveDimensions(),{width:e,height:n,depth:i,items:r}=t;if(this.surface&&this.surface.geometry.clip(e,n,i,r),this.lineX&&this.lineX.geometry.clip(e,n,i,r),this.lineY&&this.lineY.geometry.clip(n,e,i,r),null!=this.bind.map){const t=this.bind.map.getActiveDimensions();if(this.surface)return this.surface.geometry.map(t.width,t.height,t.depth,t.items)}}make(){let t;if(this._helpers.bind.make([{to:"geometry.points",trait:"source"},{to:"geometry.colors",trait:"source"},{to:"mesh.map",trait:"source"}]),null==this.bind.points)return;let e=this._shaders.shader();e=this.bind.points.sourceShader(e),e=this._helpers.position.pipeline(e);const n=this._helpers.style.uniforms(),i=this._helpers.style.uniforms(),r=this._helpers.line.uniforms(),s=this._helpers.surface.uniforms(),a=this._inherit("unit").getUnitUniforms();i.styleColor=this._attributes.make(this._types.color()),i.styleZBias=this._attributes.make(this._types.number()),this.wireColor=i.styleColor.value,this.wireZBias=i.styleZBias,this.wireScratch=new vt.Color;const o=this.bind.points.getDimensions(),{width:l,height:h,depth:c,items:u}=o,{shaded:d,fill:p,lineX:f,lineY:m,closedX:g,closedY:v,stroke:x,join:_,proximity:y,crossed:b}=this.props,w=[];this.proximity=y,this.bind.colors&&(t=this._shaders.shader(),this.bind.colors.sourceShader(t));const S=this._helpers.object.mask(),M=this._helpers.shade.map(null!=this.bind.map?this.bind.map.sourceShader(this._shaders.shader()):void 0),T=this._helpers.shade.pipeline(),E=T||d,A=T||!1,{swizzle:C,swizzle2:R}=this._helpers.position;let D=ko(a,r,n,i);const k=f||m?-50:0;return f&&(this.lineX=this._renderables.make("line",{uniforms:D,samples:l,strips:h,ribbons:c,layers:u,position:e,color:t,zUnits:-k,stroke:x,join:_,mask:S,material:A,proximity:y,closed:g||closed}),w.push(this.lineX)),m&&(this.lineY=this._renderables.make("line",{uniforms:D,samples:h,strips:l,ribbons:c,layers:u,position:R(e,"yxzw","yxzw"),color:C(t,"yxzw"),zUnits:-k,stroke:x,join:_,mask:C(S,b?"xyzw":"yxzw"),material:A,proximity:y,closed:v||closed}),w.push(this.lineY)),p&&(D=ko(a,s,n),this.surface=this._renderables.make("surface",{uniforms:D,width:l,height:h,surfaces:c,layers:u,position:e,color:t,zUnits:k,stroke:x,material:E,mask:S,map:M,intUV:!0,closedX:g||closed,closedY:v||closed}),w.push(this.surface)),this._helpers.visible.make(),this._helpers.object.make(w)}made(){return this.resize()}unmake(){return this._helpers.bind.unmake(),this._helpers.visible.unmake(),this._helpers.object.unmake(),this.lineX=this.lineY=this.surface=null}_convertGammaToLinear(t,e=2){return t.r=Math.pow(t.r,e),t.g=Math.pow(t.g,e),t.b=Math.pow(t.b,e),t}_convertLinearToGamma(t,e=2){const n=e>0?1/e:1;return t.r=Math.pow(t.r,n),t.g=Math.pow(t.g,n),t.b=Math.pow(t.b,n),t}change(t,e,n){if(t["geometry.points"]||t["mesh.shaded"]||t["mesh.fill"]||t["line.stroke"]||t["line.join"]||e.grid)return this.rebuild();if(t["style.color"]||t["style.zBias"]||t["mesh.fill"]||t["mesh.lineBias"]||n){const{fill:t,color:e,zBias:n,lineBias:i}=this.props;if(this.wireZBias.value=n+(t?i:0),this.wireColor.copy(e),t){const t=this.wireScratch;t.setRGB(e.x,e.y,e.z),this._convertLinearToGamma(this._convertGammaToLinear(t).multiplyScalar(.75)),this.wireColor.x=t.r,this.wireColor.y=t.g,this.wireColor.z=t.b}}return t["line.proximity"]&&null!=this.proximity!=(null!=this.props.proximity)?this.rebuild():void 0}}Bo.initClass();class Vo extends za{static initClass(){this.traits=["node","object","visible","style","line","ticks","geometry","position","bind","shade"]}init(){return this.tickStrip=this.line=null}resize(){if(null==this.bind.points)return;const t=this.bind.points.getActiveDimensions(),e=+(t.items>0),n=t.width*e,i=t.height*e,r=t.depth*e;return this.line.geometry.clip(2,n,i,r),this.tickStrip.set(0,n-1)}make(){let t,e;if(this._helpers.bind.make([{to:"geometry.points",trait:"source"},{to:"geometry.colors",trait:"source"}]),null==this.bind.points)return;const n=this._helpers.style.uniforms(),i=this._helpers.line.uniforms(),r=this._inherit("unit").getUnitUniforms(),s=ko(i,n,r),a={tickEpsilon:this.node.attributes["ticks.epsilon"],tickSize:this.node.attributes["ticks.size"],tickNormal:this.node.attributes["ticks.normal"],tickStrip:this._attributes.make(this._types.vec2(0,0)),worldUnit:s.worldUnit,focusDepth:s.focusDepth};this.tickStrip=a.tickStrip.value;const o=e=this._shaders.shader();o.require(this.bind.points.sourceShader(this._shaders.shader())),o.require(this._helpers.position.pipeline(this._shaders.shader())),o.pipe("ticks.position",a);const{stroke:l,join:h}=this.props,c=this.bind.points.getDimensions(),u=c.width,d=c.height,p=c.depth;this.bind.colors&&(t=this._shaders.shader(),this.bind.colors.sourceShader(t));const f=this._helpers.object.mask(),m=this._helpers.shade.pipeline()||!1,{swizzle:g}=this._helpers.position;return this.line=this._renderables.make("line",{uniforms:s,samples:2,strips:u,ribbons:d,layers:p,position:e,color:t,stroke:l,join:h,mask:g(f,"yzwx"),material:m}),this._helpers.visible.make(),this._helpers.object.make([this.line])}made(){return this.resize()}unmake(){return this.line=null,this._helpers.visible.unmake(),this._helpers.object.unmake()}change(t,e,n){if(t["geometry.points"]||t["line.stroke"]||t["line.join"])return this.rebuild()}}Vo.initClass();class Ho extends za{static initClass(){this.traits=["node","object","visible","style","line","arrow","geometry","position","bind","shade"]}constructor(t,e,n){super(t,e,n),this.line=this.arrows=null}resize(){if(null==this.bind.points)return;const t=this.bind.points.getActiveDimensions(),e=t.items,n=t.width,i=t.height,r=t.depth;return this.line.geometry.clip(e,n,i,r),Array.from(this.arrows).map((t=>t.geometry.clip(e,n,i,r)))}make(){let t;if(this._helpers.bind.make([{to:"geometry.points",trait:"source"},{to:"geometry.colors",trait:"source"}]),null==this.bind.points)return;let e=this._shaders.shader();this.bind.points.sourceShader(e),this._helpers.position.pipeline(e);const n=this._helpers.style.uniforms(),i=this._helpers.line.uniforms(),r=this._helpers.arrow.uniforms(),s=this._inherit("unit").getUnitUniforms(),{start:a,end:o}=this.props,{stroke:l,join:h,proximity:c}=this.props;this.proximity=c;const u=this.bind.points.getDimensions(),d=u.items,p=u.width,f=u.height,m=u.depth;this.bind.colors&&(t=this._shaders.shader(),this.bind.colors.sourceShader(t));let g=this._helpers.object.mask(),v=this._helpers.shade.pipeline()||!1;const{swizzle:x,swizzle2:_}=this._helpers.position;e=_(e,"yzwx","yzwx"),t=x(t,"yzwx"),g=x(g,"yzwx"),v=x(v,"yzwx");const y=ko(r,i,n,s);return this.line=this._renderables.make("line",{uniforms:y,samples:d,ribbons:f,strips:p,layers:m,position:e,color:t,clip:a||o,stroke:l,join:h,proximity:c,mask:g,material:v}),this.arrows=[],a&&this.arrows.push(this._renderables.make("arrow",{uniforms:y,flip:!0,samples:d,ribbons:f,strips:p,layers:m,position:e,color:t,mask:g,material:v})),o&&this.arrows.push(this._renderables.make("arrow",{uniforms:y,samples:d,ribbons:f,strips:p,layers:m,position:e,color:t,mask:g,material:v})),this._helpers.visible.make(),this._helpers.object.make(this.arrows.concat([this.line]))}made(){return this.resize()}unmake(){return this._helpers.bind.unmake(),this._helpers.visible.unmake(),this._helpers.object.unmake(),this.line=this.arrows=null}change(t,e,n){return t["geometry.points"]||t["line.stroke"]||t["line.join"]||t["arrow.start"]||t["arrow.end"]||t["line.proximity"]&&null!=this.proximity!=(null!=this.props.proximity)?this.rebuild():void 0}}Ho.initClass();class Go extends So{static initClass(){this.traits=["node","buffer","active","data","voxel","html"],this.finals={channels:1}}init(){super.init(),this.storage="pushBuffer"}make(){super.make();const{items:t,width:e,height:n,depth:i}=this.getDimensions();return this.dom=this._overlays.make("dom"),this.dom.hint(t*e*n*i)}unmake(){if(super.unmake(),null!=this.dom)return this.dom.dispose(),this.dom=null}update(){return super.update()}change(t,e,n){return e.html?this.rebuild():super.change(t,e,n)}nodes(){return this.buffer.read()}callback(t){const{el:e}=this.dom;return t.length<=6?(n,i,r,s,a)=>t(n,e,i,r,s,a):(n,i,r,s,a)=>t(n,e,i,r,s,a,this.bufferClock,this.bufferStep)}}Go.initClass();class jo extends za{static initClass(){this.traits=["node","bind","object","visible","overlay","dom","attach","position"]}init(){this.emitter=this.root=null,this.active={}}make(){if(super.make(),this._helpers.bind.make([{to:"dom.html",trait:"html"},{to:"dom.points",trait:"source"}]),null==this.bind.points||null==this.bind.html)return;this.root=this._inherit("root"),this._listen("root","root.update",this.update),this._listen("root","root.post",this.post);const t=this.bind.points.getDimensions(),e=this.bind.html.getDimensions(),n=Math.min(t.items,e.items),i=Math.min(t.width,e.width),r=Math.min(t.height,e.height),s=Math.min(t.depth,e.depth);let a=this.bind.points.sourceShader(this._shaders.shader());a=this._helpers.position.pipeline(a);const o=this._shaders.shader({globals:["projectionMatrix"]});o.pipe("project.readback"),a.pipe(o);const l=this._shaders.shader();this.readback=this._renderables.make("readback",{map:a,indexer:l,items:n,width:i,height:r,depth:s,channels:4,stpq:!0}),this.dom=this._overlays.make("dom"),this.dom.hint(n*i*r*s*2),this.emitter=this.callback(this.bind.html.nodes()),this.readback.setCallback(this.emitter),this._helpers.visible.make()}unmake(){null!=this.readback&&(this.readback.dispose(),this.dom.dispose(),this.readback=this.dom=null,this.root=null,this.emitter=null,this.active={}),this._helpers.bind.unmake(),this._helpers.visible.unmake()}update(){null!=this.readback&&this.props.visible&&(this.readback.update(null!=this.root?this.root.getCamera():void 0),this.readback.post(),this.readback.iterate())}post(){null!=this.readback&&this.dom.render(this.isVisible?this.emitter.nodes():null)}callback(t){let e,n;const i=this._inherit("unit").getUnitUniforms(),r=i.viewWidth,s=i.viewHeight,a=this.node.attributes["dom.attributes"],o=this.node.attributes["dom.size"],l=this.node.attributes["dom.zoom"],h=this.node.attributes["dom.color"],c=this.node.attributes["dom.outline"],u=this.node.attributes["dom.pointerEvents"],d=this.node.attributes["overlay.opacity"],p=this.node.attributes["overlay.zIndex"],f=this.node.attributes["attach.offset"],m=this.node.attributes["attach.depth"],g=this.node.attributes["attach.snap"],{el:v}=this.dom;let x=[],_=null,y=null,b=e=n=0,w="";const S=function(i,o,h,c,u,p,w,S){let M;const T=t[S+b*u+e*p+n*w],E=c<0,A=1+(1/c-1)*m.value,C=E?0:A,R=+f.value.x*C,D=+f.value.y*C;let k=(i+1)*r.value*.5+R,P=(o-1)*s.value*.5+D;k/=l.value,P/=l.value,g.value&&(k=Math.round(k),P=Math.round(P));const L=Math.min(.999,E?0:d.value),z={className:y,style:{transform:`translate3d(${k}px, ${-P}px, ${1-c}px) translate(-50%, -50%) scale(${C},${C})`,opacity:L}};for(w in _)M=_[w],z.style[w]=M;const O=a.value;if(null!=O){const t=O.style;for(w in O)M=O[w],["style","className"].includes(w)||(z[w]=M);if(null!=t)for(w in t)M=t[w],z.style[w]=M}return z.className+=" "+(null!=(null!=O?O.className:void 0)?null!=O?O.className:void 0:"mathbox-label"),x.push(v("div",z,T))};return S.reset=()=>{x=[],[b,e,n]=Array.from([this.strideI,this.strideJ,this.strideK]);const t=h.value,i=t=>Math.floor(255*t);if(w=t?`rgb(${[i(t.x),i(t.y),i(t.z)]})`:"",y=`mathbox-outline-${Math.round(c.value)}`,_={},t&&(_.color=w),_.fontSize=`${o.value}px`,1!==l.value&&(_.zoom=l.value),p.value>0&&(_.zIndex=p.value),u.value)return _.pointerEvents="auto"},S.nodes=()=>x,S}resize(){let t,e;if(null==this.readback)return;const n=this.bind.points.getActiveDimensions(),i=this.bind.html.getActiveDimensions(),r=Math.min(n.items,i.items),s=Math.min(n.width,i.width),a=Math.min(n.height,i.height),o=Math.min(n.depth,i.depth);this.readback.setActive(r,s,a,o),this.strideI=t=i.items,this.strideJ=e=t*i.width,this.strideK=e*i.height}change(t,e,n){if(t["dom.html"]||t["dom.points"])return this.rebuild()}}jo.initClass();class qo extends So{static initClass(){this.traits=["node","buffer","active","data","texture","voxel","text","font"],this.defaults={minFilter:"linear",magFilter:"linear"},this.finals={channels:1}}init(){return super.init(),this.atlas=null}textShader(t){return this.atlas.shader(t)}textIsSDF(){return this.props.sdf>0}textHeight(){return this.props.detail}make(){let{minFilter:t,magFilter:e,type:n}=this.props;const{font:i,style:r,variant:s,weight:a,detail:o,sdf:l}=this.props;this.atlas=this._renderables.make("textAtlas",{font:i,size:o,style:r,variant:s,weight:a,outline:l,minFilter:t,magFilter:e,type:n}),this.minFilter=vt.NearestFilter,this.magFilter=vt.NearestFilter,this.type=vt.FloatType,xo.prototype.make.call(this),t=null!=this.minFilter?this.minFilter:this.props.minFilter,e=null!=this.magFilter?this.magFilter:this.props.magFilter,n=null!=this.type?this.type:this.props.type;const{width:h}=this.props,{height:c}=this.props,{depth:u}=this.props,d=this.props.bufferWidth,p=this.props.bufferHeight,f=this.props.bufferDepth,{channels:m}=this.props,{items:g}=this.props;let v=this.spec={channels:m,items:g,width:h,height:c,depth:u};this.items=v.items,this.channels=v.channels;const{data:x}=this.props;v=Wa(x,v);const{space:_}=this;_.width=Math.max(d,v.width||1),_.height=Math.max(p,v.height||1),_.depth=Math.max(f,v.depth||1),this.buffer=this._renderables.make(this.storage,{width:_.width,height:_.height,depth:_.depth,channels:4,items:g,minFilter:t,magFilter:e,type:n});const{atlas:y}=this,{emit:b}=this.buffer.streamer;return this.buffer.streamer.emit=t=>y.map(t,b)}unmake(){if(super.unmake(),this.atlas)return this.atlas.dispose(),this.atlas=null}update(){return this.atlas.begin(),super.update(),this.atlas.end()}change(t,e,n){return e.font?this.rebuild():super.change(t,e,n)}}qo.initClass();class Wo extends go{static initClass(){this.traits=["node","bind","operator","source","index"]}indexShader(t){return Xo(this.bind.source,"indexShader",(e=>e.indexShader(t)))}sourceShader(t){return Xo(this.bind.source,"sourceShader",(e=>e.sourceShader(t)))}getDimensions(){return this.bind.source.getDimensions()}getFutureDimensions(){return this.bind.source.getFutureDimensions()}getActiveDimensions(){return this.bind.source.getActiveDimensions()}getIndexDimensions(){return this.bind.source.getIndexDimensions()}init(){return this.sourceSpec=[{to:"operator.source",trait:"source"}]}make(){return super.make(),this._helpers.bind.make(this.sourceSpec)}made(){return this.resize(),super.made()}unmake(){return this._helpers.bind.unmake()}resize(t){return this.trigger({type:"source.resize"})}}function Xo(t,e,n){return null!=t&&"function"==typeof t[e]?n(t,e):void 0}Wo.initClass();class Yo extends Wo{static initClass(){this.traits=["node","bind","operator","texture","text","format","font"],this.defaults={minFilter:"linear",magFilter:"linear"}}init(){return super.init(),this.atlas=this.buffer=this.used=this.time=null,this.filled=!1}sourceShader(t){return this.buffer.shader(t)}textShader(t){return this.atlas.shader(t)}textIsSDF(){return this.props.sdf>0}textHeight(){return this.props.detail}make(){this._helpers.bind.make([{to:"operator.source",trait:"raw"}]);let{minFilter:t,magFilter:e,type:n}=this.props;const{font:i,style:r,variant:s,weight:a,detail:o,sdf:l}=this.props;this.atlas=this._renderables.make("textAtlas",{font:i,size:o,style:r,variant:s,weight:a,outline:l,minFilter:t,magFilter:e,type:n}),t=vt.NearestFilter,e=vt.NearestFilter,n=vt.FloatType;const h=this.bind.source.getDimensions(),{items:c,width:u,height:d,depth:p}=h;this.buffer=this._renderables.make("voxelBuffer",{width:u,height:d,depth:p,channels:4,items:c,minFilter:t,magFilter:e,type:n});const{atlas:f}=this,{emit:m}=this.buffer.streamer;return this.buffer.streamer.emit=t=>f.map(t,m),this.clockParent=this._inherit("clock"),this._listen("root","root.update",this.update)}made(){return super.made(),this.resize()}unmake(){if(super.unmake(),this.buffer&&(this.buffer.dispose(),this.buffer=null),this.atlas)return this.atlas.dispose(),this.atlas=null}update(){if(this.filled&&!this.props.live||!this.through)return;this.time=this.clockParent.getTime();const{used:t}=this;return this.atlas.begin(),this.used=this.through(),this.buffer.write(this.used),this.atlas.end(),this.filled=!0,t!==this.used?this.trigger({type:"source.resize"}):void 0}change(t,e,n){if(e.font)return this.rebuild();if(t["format.expr"]||t["format.digits"]||t["format.data"]||n){let t,{expr:e}=this.props;const{digits:n,data:i}=this.props;null==e&&(e=null!=i?(t,e,n,r,s)=>i[s]:t=>t);const{length:r}=e;return null!=n&&(e=(t=>(e,i,r,s,a,o,l,h,c,u)=>+t(e,i,r,s,a,o,l,h,c,u).toPrecision(n))(e)),t=r>8?(t,n,i,r,s,a,o,l,h,c,u)=>t(e(n,i,r,s,a,o,l,h,this.time.clock,this.time.step)):(t,n,i,r,s,a,o,l,h)=>t(e(n,i,r,s,a,o,l,h)),this.through=this.bind.source.rawBuffer().through(t,this.buffer)}}}Yo.initClass();class $o extends za{static initClass(){this.traits=["node","bind","object","visible","style","label","attach","geometry","position"]}make(){let t;if(super.make(),this._helpers.bind.make([{to:"label.text",trait:"text"},{to:"geometry.points",trait:"source"},{to:"geometry.colors",trait:"source"}]),null==this.bind.points)return;if(null==this.bind.text)return;const e=this.bind.points.getDimensions(),n=this.bind.text.getDimensions(),i=this.bind.text.textIsSDF(),r=Math.min(e.items,n.items),s=Math.min(e.width,n.width),a=Math.min(e.height,n.height),o=Math.min(e.depth,n.depth);let l=this.bind.points.sourceShader(this._shaders.shader());l=this._helpers.position.pipeline(l);const h=this.bind.text.sourceShader(this._shaders.shader()),c=this._shaders.shader().pipe("label.map");c.pipe(this.bind.text.textShader(this._shaders.shader()));const u={spriteDepth:this.node.attributes["attach.depth"],spriteOffset:this.node.attributes["attach.offset"],spriteSnap:this.node.attributes["attach.snap"],spriteScale:this._attributes.make(this._types.number()),outlineStep:this._attributes.make(this._types.number()),outlineExpand:this._attributes.make(this._types.number()),outlineColor:this.node.attributes["label.background"]};this.spriteScale=u.spriteScale,this.outlineStep=u.outlineStep,this.outlineExpand=u.outlineExpand;const d=i?"label.outline":"label.alpha",p=this._shaders.shader().pipe(d,u);this.bind.colors&&(t=this._shaders.shader(),this.bind.colors.sourceShader(t));const f=this._helpers.object.mask(),m=this._helpers.style.uniforms(),g=this._inherit("unit").getUnitUniforms(),v=ko(g,m,u);return this.sprite=this._renderables.make("sprite",{uniforms:v,width:s,height:a,depth:o,items:r,position:l,sprite:h,map:c,combine:p,color:t,mask:f,linear:!0}),this._helpers.visible.make(),this._helpers.object.make([this.sprite])}unmake(){return this._helpers.bind.unmake(),this._helpers.visible.unmake(),this._helpers.object.unmake(),this.sprite=null}resize(){const t=this.bind.points.getActiveDimensions(),e=this.bind.text.getActiveDimensions(),n=Math.min(t.items,e.items),i=Math.min(t.width,e.width),r=Math.min(t.height,e.height),s=Math.min(t.depth,e.depth);return this.sprite.geometry.clip(i,r,s,n)}change(t,e,n){if(e.geometry||t["label.text"])return this.rebuild();if(null==this.bind.points)return;const{size:i}=this.props,{outline:r}=this.props,{expand:s}=this.props,a=i/this.bind.text.textHeight();return this.outlineExpand.value=s/a*16/255,this.outlineStep.value=r/a*16/255,this.spriteScale.value=a}}$o.initClass();class Zo extends Wo{static initClass(){this.traits=["node","bind","operator","source","index","resample","sampler:x","sampler:y","sampler:z","sampler:w","include"]}indexShader(t){return t.pipe(this.indexer),super.indexShader(t)}sourceShader(t){return t.pipe(this.operator)}getDimensions(){return this._resample(this.bind.source.getDimensions())}getActiveDimensions(){return this._resample(this.bind.source.getActiveDimensions())}getFutureDimensions(){return this._resample(this.bind.source.getFutureDimensions())}getIndexDimensions(){return this._resample(this.bind.source.getIndexDimensions())}_resample(t){const e=this.resampled,n=this.centered,i=this.padding;return this.relativeSize?(n.items||t.items--,n.width||t.width--,n.height||t.height--,n.depth||t.depth--,null!=e.items&&(t.items*=e.items),null!=e.width&&(t.width*=e.width),null!=e.height&&(t.height*=e.height),null!=e.depth&&(t.depth*=e.depth),n.items||t.items++,n.width||t.width++,n.height||t.height++,n.depth||t.depth++,t.items-=2*i.items,t.width-=2*i.width,t.height-=2*i.height,t.depth-=2*i.depth):(null!=e.items&&(t.items=e.items),null!=e.width&&(t.width=e.width),null!=e.height&&(t.height=e.height),null!=e.depth&&(t.depth=e.depth)),t.items=Math.max(0,Math.floor(t.items)),t.width=Math.max(0,Math.floor(t.width)),t.height=Math.max(0,Math.floor(t.height)),t.depth=Math.max(0,Math.floor(t.depth)),t}make(){if(super.make(),null==this.bind.source)return;this._helpers.bind.make([{to:"include.shader",trait:"shader",optional:!0}]);const{indices:t,channels:e}=this.props,{shader:n}=this.bind,{sample:i,size:r,items:s,width:a,height:o,depth:l}=this.props,h=i===this.node.attributes["resample.sample"].enum.relative,c=r===this.node.attributes["resample.size"].enum.relative;this.resampled={},null!=s&&(this.resampled.items=s),null!=a&&(this.resampled.width=a),null!=o&&(this.resampled.height=o),null!=l&&(this.resampled.depth=l),this.centered={},this.centered.items=this.props.centeredW,this.centered.width=this.props.centeredX,this.centered.height=this.props.centeredY,this.centered.depth=this.props.centeredZ,this.padding={},this.padding.items=this.props.paddingW,this.padding.width=this.props.paddingX,this.padding.height=this.props.paddingY,this.padding.depth=this.props.paddingZ;const u=this._shaders.shader(),d=this._shaders.shader(),p=[null,this._types.number,this._types.vec2,this._types.vec3,this._types.vec4][t],f={dataSize:this._attributes.make(p(0,0,0,0)),dataResolution:this._attributes.make(p(0,0,0,0)),targetSize:this._attributes.make(p(0,0,0,0)),targetResolution:this._attributes.make(p(0,0,0,0)),resampleFactor:this._attributes.make(this._types.vec4(0,0,0,0)),resampleBias:this._attributes.make(this._types.vec4(0,0,0,0))};this.dataResolution=f.dataResolution,this.dataSize=f.dataSize,this.targetResolution=f.targetResolution,this.targetSize=f.targetSize,this.resampleFactor=f.resampleFactor,this.resampleBias=f.resampleBias;const m=null!=s||null!=a||null!=o||null!=l;u.pipe("resample.padding",f);let g=[],v=!1;const x=["width","height","depth","items"];for(let t=0;t<x.length;t++){const e=x[t],n=this.centered[e];v||(v=n),g[t]=n?"0.5":"0.0"}return v&&(g=`vec4(${g})`,u.pipe(oo(4,"+",g)),m&&d.pipe(oo(4,"+",g))),h&&(m?(u.pipe("resample.relative",f),d.pipe("resample.relative",f)):d.pipe(fo("vec4"))),null!=n?(4!==t&&u.pipe(ho(4,t)),u.callback(),4!==t&&u.pipe(lo(t,4)),v&&u.pipe(oo(4,"-",g)),u.pipe(this.bind.source.sourceShader(this._shaders.shader())),4!==e&&u.pipe(ho(4,e)),u.join(),null!=this.bind.shader&&u.pipe(this.bind.shader.shaderBind(f)),4!==e&&u.pipe(lo(e,4))):(v&&u.pipe(oo(4,"-",g)),u.pipe(this.bind.source.sourceShader(this._shaders.shader()))),v&&m&&d.pipe(oo(4,"-",g)),this.operator=u,this.indexer=d,this.indices=t,this.relativeSample=h,this.relativeSize=c}unmake(){return super.unmake(),this.operator=null}resize(){if(null==this.bind.source)return;const t=this.bind.source.getActiveDimensions(),e=this.getActiveDimensions(),n=n=>{const i=this.centered[n],r=this.padding[n];e[n]+=2*r;return[i?t[n]/Math.max(1,e[n]):Math.max(1,t[n]-1)/Math.max(1,e[n]-1),r]},[i,r]=Array.from(n("width")),[s,a]=Array.from(n("height")),[o,l]=Array.from(n("depth")),[h,c]=Array.from(n("items"));return 1===this.indices?(this.dataResolution.value=1/t.width,this.targetResolution.value=1/e.width,this.dataSize.value=t.width,this.targetSize.value=e.width):(this.dataResolution.value.set(1/t.width,1/t.height,1/t.depth,1/t.items),this.targetResolution.value.set(1/e.width,1/e.height,1/e.depth,1/e.items),this.dataSize.value.set(t.width,t.height,t.depth,t.items),this.targetSize.value.set(e.width,e.height,e.depth,e.items)),this.resampleFactor.value.set(i,s,o,h),this.resampleBias.value.set(r,a,l,c),super.resize()}change(t,e,n){if(e.operator||e.resample||e.sampler||e.include)return this.rebuild()}}Zo.initClass();class Ko extends Zo{static initClass(){this.traits=["node","bind","operator","resample","sampler:x","sampler:y","sampler:z","sampler:w","include","text"]}init(){return this.sourceSpec=[{to:"operator.source",trait:"text"}]}textShader(t){return this.bind.source.textShader(t)}textIsSDF(){return(null!=this.bind.source?this.bind.source.props.sdf:void 0)>0}textHeight(){return null!=this.bind.source?this.bind.source.props.detail:void 0}}Ko.initClass();class Jo extends Oa{static initClass(){this.traits=["node","clock","seek","play"]}init(){return this.skew=0,this.last=0,this.time={now:+new Date/1e3,time:0,delta:0,clock:0,step:0}}make(){return this._listen("clock","clock.tick",this.tick)}reset(){return this.skew=0}tick(t){const{from:e,to:n,speed:i,seek:r,pace:s,delay:a,realtime:o}=this.props,l=this._inherit("clock").getTime(),h=o?l.time:l.clock,c=o?l.delta:l.step,u=i/s;this.skew+=c*(u-1),this.last>h&&(this.skew=0),this.time.now=l.now+this.skew,this.time.time=l.time,this.time.delta=l.delta;const d=null!=r?r:l.clock+this.skew;return this.time.clock=Math.min(n,e+Math.max(0,d-a*u)),this.time.step=c*u,this.last=h,this.trigger(t)}getTime(){return this.time}}Jo.initClass();class Qo extends Oa{static initClass(){this.traits=["node","clock","now"]}init(){let t;return this.now=t=+new Date/1e3,this.skew=0,this.time={now:t,time:0,delta:0,clock:0,step:0}}make(){return this.clockParent=this._inherit("clock"),this._listen("clock","clock.tick",this.tick)}unmake(){return this.clockParent=null}change(t,e,n){if(t["date.now"])return this.skew=0}tick(t){const{seek:e,pace:n,speed:i}=this.props,r=this.clockParent.getTime();return this.skew+=r.step*n/i,null!=e&&(this.skew=e),this.time.now=this.time.time=this.time.clock=(null!=this.props.now?this.props.now:this.now)+this.skew,this.time.delta=this.time.step=r.delta,this.trigger(t)}getTime(){return this.time}}Qo.initClass();class tl extends Oa{static initClass(){this.traits=["node","vertex","fragment"]}vertex(t,e){let n;return null!=(n=el(this._inherit("vertex"),(n=>n.vertex(t,e))))?n:t}fragment(t,e){let n;return null!=(n=el(this._inherit("fragment"),(n=>n.fragment(t,e))))?n:t}}function el(t,e){return null!=t?e(t):void 0}tl.initClass();class nl extends tl{static initClass(){this.traits=["node","vertex","transform3"]}make(){return this.uniforms={transformMatrix:this._attributes.make(this._types.mat4())},this.composer=Ga()}unmake(){return delete this.uniforms}change(t,e,n){if(t["transform3.pass"])return this.rebuild();if(!e.transform3&&!n)return;const i=this.props.position,r=this.props.quaternion,s=this.props.rotation,a=this.props.scale,o=this.props.matrix,l=this.props.eulerOrder;return this.uniforms.transformMatrix.value=this.composer(i,s,r,a,o,l)}vertex(t,e){return e===this.props.pass&&t.pipe("transform3.position",this.uniforms),super.vertex(t,e)}}nl.initClass();class il extends tl{static initClass(){this.traits=["node","vertex","transform4"]}make(){return this.uniforms={transformMatrix:this._attributes.make(this._types.mat4()),transformOffset:this.node.attributes["transform4.position"]},this.transformMatrix=this.uniforms.transformMatrix.value}unmake(){return delete this.uniforms}change(t,e,n){if(t["transform4.pass"])return this.rebuild();if(!e.transform4&&!n)return;const i=this.props.scale,r=this.props.matrix,s=this.transformMatrix;return s.copy(r),s.scale(i)}vertex(t,e){return e===this.props.pass&&t.pipe("transform4.position",this.uniforms),super.vertex(t,e)}}il.initClass();class rl extends tl{static initClass(){this.traits=["node","include","vertex","bind"]}make(){return this._helpers.bind.make([{to:"include.shader",trait:"shader",optional:!0}])}unmake(){return this._helpers.bind.unmake()}change(t,e,n){if(e.include)return this.rebuild()}vertex(t,e){return null!=this.bind.shader&&e===this.props.pass&&t.pipe(this.bind.shader.shaderBind()),super.vertex(t,e)}}rl.initClass();class sl extends tl{static initClass(){this.traits=["node","include","fragment","bind"]}make(){return this._helpers.bind.make([{to:"include.shader",trait:"shader",optional:!0}])}unmake(){return this._helpers.bind.unmake()}change(t,e,n){if(e.include||t["fragment.gamma"])return this.rebuild()}fragment(t,e){return null!=this.bind.shader&&e===this.props.pass&&(this.props.gamma&&t.pipe("mesh.gamma.out"),t.pipe(this.bind.shader.shaderBind()),t.split(),this.props.gamma&&t.pipe("mesh.gamma.in"),t.pass()),super.fragment(t,e)}}sl.initClass();class al extends tl{static initClass(){this.traits=["node","vertex","layer"]}make(){return this._listen("root","root.resize",this.update),this.uniforms={layerScale:this._attributes.make(this._types.vec4()),layerBias:this._attributes.make(this._types.vec4())}}update(){const t=this._inherit("root").getCamera(),e=null!=t.aspect?t.aspect:1,n=null!=t.fov?t.fov:1,i=Math.tan(n*Math.PI/360),r=this.node.attributes["layer.fit"].enum;let{fit:s}=this.props;const{depth:a}=this.props;switch(s){case r.contain:s=e>1?r.y:r.x;break;case r.cover:s=e>1?r.x:r.y}switch(s){case r.x:this.uniforms.layerScale.value.set(i*e,i*e);break;case r.y:this.uniforms.layerScale.value.set(i,i)}return this.uniforms.layerBias.value.set(0,0,-a,0)}change(t,e,n){if(t["layer.fit"]||t["layer.depth"]||n)return this.update()}vertex(t,e){return 2===e?t.pipe("layer.position",this.uniforms):3===e?t.pipe("root.position"):t}}al.initClass();class ol extends Oa{static initClass(){this.traits=["node","include","mask","bind"]}make(){return this._helpers.bind.make([{to:"include.shader",trait:"shader",optional:!0}])}unmake(){return this._helpers.bind.unmake()}change(t,e,n){if(e.include)return this.rebuild()}mask(t){let e,n;return null!=this.bind.shader?t?(n=this._shaders.shader(),n.pipe(fo("vec4")),n.fan(),n.pipe(t),n.next(),n.pipe(this.bind.shader.shaderBind()),n.end(),n.pipe("float combine(float a, float b) { return min(a, b); }")):(n=this._shaders.shader(),n.pipe(this.bind.shader.shaderBind())):n=t,null!=(i=this._inherit("mask"),r=t=>t.mask(n),e=null!=i?r(i):void 0)?e:n;var i,r}}ol.initClass();class ll extends Wo{static initClass(){this.traits=["node","bind","operator","source","index","clamp"]}indexShader(t){return t.pipe(this.operator),super.indexShader(t)}sourceShader(t){return t.pipe(this.operator),super.sourceShader(t)}make(){if(super.make(),null==this.bind.source)return;const t={clampLimit:this._attributes.make(this._types.vec4())};this.clampLimit=t.clampLimit;const e=this._shaders.shader();return e.pipe("clamp.position",t),this.operator=e}unmake(){return super.unmake()}resize(){if(null!=this.bind.source){const t=this.bind.source.getActiveDimensions();this.clampLimit.value.set(t.width-1,t.height-1,t.depth-1,t.items-1)}return super.resize()}change(t,e,n){if(e.operator||e.clamp)return this.rebuild()}}ll.initClass();class hl extends Wo{static initClass(){this.traits=["node","bind","operator","source","index","grow"]}sourceShader(t){return t.pipe(this.operator)}make(){if(super.make(),null==this.bind.source)return;const t={growScale:this.node.attributes["grow.scale"],growMask:this._attributes.make(this._types.vec4()),growAnchor:this._attributes.make(this._types.vec4())};this.growMask=t.growMask.value,this.growAnchor=t.growAnchor.value;const e=this._shaders.shader();return e.require(this.bind.source.sourceShader(this._shaders.shader())),e.pipe("grow.position",t),this.operator=e}unmake(){return super.unmake()}resize(){return this.update(),super.resize()}update(){const t=this.bind.source.getFutureDimensions(),e=["width","height","depth","items"],n=(t,e)=>((t||1)-1)*(.5-.5*e);return(()=>{const i=[];for(let r=0;r<e.length;r++){const s=e[r],a=this.props[s];this.growMask.setComponent(r,+(null==a)),i.push(this.growAnchor.setComponent(r,null!=a?n(t[s],a):0))}return i})()}change(t,e,n){return e.operator?this.rebuild():e.grow?this.update():void 0}}hl.initClass();class cl extends Wo{static initClass(){this.traits=["node","bind","operator","source","index","join"]}indexShader(t){return t.pipe(this.operator),super.indexShader(t)}sourceShader(t){return t.pipe(this.operator),super.sourceShader(t)}getDimensions(){return this._resample(this.bind.source.getDimensions())}getActiveDimensions(){return this._resample(this.bind.source.getActiveDimensions())}getFutureDimensions(){return this._resample(this.bind.source.getFutureDimensions())}getIndexDimensions(){return this._resample(this.bind.source.getIndexDimensions())}_resample(t){let e,n;const{order:i,axis:r,stride:s}=this,a=["width","height","depth","items"],o=i.map((t=>a[t-1])),l=i.indexOf(r);let h=(()=>{const e=[];for(n of Array.from(o))e.push(t[n]);return e})();const c=(null!=(e=h[l+1])?e:1)*s;h.splice(l,2,c),h=h.slice(0,3),h.push(1);const u={};for(let t=0;t<o.length;t++)n=o[t],u[n]=h[t];return u}make(){if(super.make(),null==this.bind.source)return;const{order:t}=this.props;let{axis:e}=this.props,{overlap:n}=this.props;const i=t.join("");null==e&&(e=t[0]);const r=i.indexOf(e),s=i.replace(e,"00").substring(0,4),a=[null,"width","height","depth","items"][e],o=this.bind.source.getDimensions()[a];n=Math.min(o-1,n);const l=o-n,h={joinStride:this._attributes.make(this._types.number(l)),joinStrideInv:this._attributes.make(this._types.number(1/l))},c=this._shaders.shader();return c.require(uo(e,1)),c.require(uo(s,4)),c.require(co([r,r+1])),c.pipe("join.position",h),c.pipe(po(t)),this.operator=c,this.order=t,this.axis=e,this.overlap=n,this.length=o,this.stride=l}unmake(){return super.unmake()}change(t,e,n){if(e.join||e.operator)return this.rebuild()}}cl.initClass();class ul extends Wo{static initClass(){this.traits=["node","bind","operator","source","index","lerp","sampler:x","sampler:y","sampler:z","sampler:w"]}indexShader(t){return t.pipe(this.indexer),super.indexShader(t)}sourceShader(t){return t.pipe(this.operator)}getDimensions(){return this._resample(this.bind.source.getDimensions())}getActiveDimensions(){return this._resample(this.bind.source.getActiveDimensions())}getFutureDimensions(){return this._resample(this.bind.source.getFutureDimensions())}getIndexDimensions(){return this._resample(this.bind.source.getIndexDimensions())}_resample(t){const e=this.resampled,n=this.centered,i=this.padding;return this.relativeSize?(n.items||t.items--,n.width||t.width--,n.height||t.height--,n.depth||t.depth--,null!=e.items&&(t.items*=e.items),null!=e.width&&(t.width*=e.width),null!=e.height&&(t.height*=e.height),null!=e.depth&&(t.depth*=e.depth),n.items||t.items++,n.width||t.width++,n.height||t.height++,n.depth||t.depth++,t.items-=2*i.items,t.width-=2*i.width,t.height-=2*i.height,t.depth-=2*i.depth):(null!=e.items&&(t.items=e.items),null!=e.width&&(t.width=e.width),null!=e.height&&(t.height=e.height),null!=e.depth&&(t.depth=e.depth)),t.items=Math.max(0,Math.floor(t.items)),t.width=Math.max(0,Math.floor(t.width)),t.height=Math.max(0,Math.floor(t.height)),t.depth=Math.max(0,Math.floor(t.depth)),t}make(){let t,e;if(super.make(),null==this.bind.source)return;const{size:n,items:i,width:r,height:s,depth:a}=this.props,o=n===this.node.attributes["lerp.size"].enum.relative;this.resampled={},null!=i&&(this.resampled.items=i),null!=r&&(this.resampled.width=r),null!=s&&(this.resampled.height=s),null!=a&&(this.resampled.depth=a),this.centered={},this.centered.items=this.props.centeredW,this.centered.width=this.props.centeredX,this.centered.height=this.props.centeredY,this.centered.depth=this.props.centeredZ,this.padding={},this.padding.items=this.props.paddingW,this.padding.width=this.props.paddingX,this.padding.height=this.props.paddingY,this.padding.depth=this.props.paddingZ;const l=this._shaders.shader(),h=this._shaders.shader(),c={resampleFactor:this._attributes.make(this._types.vec4(0,0,0,0)),resampleBias:this._attributes.make(this._types.vec4(0,0,0,0))};this.resampleFactor=c.resampleFactor,this.resampleBias=c.resampleBias;const u=null!=i||null!=r||null!=s||null!=a;l.pipe("resample.padding",c);const d=[];let p=!1;const f=["width","height","depth","items"];for(t=0;t<f.length;t++){e=f[t];const n=this.centered[e];p||(p=n),d[t]=n?"0.5":"0.0"}let m;p&&u&&(m=`vec4(${d})`,l.pipe(oo(4,"+",m)),h.pipe(oo(4,"+",m))),u?(l.pipe("resample.relative",c),h.pipe("resample.relative",c)):(l.pipe(fo("vec4")),h.pipe(fo("vec4"))),p&&u&&(l.pipe(oo(4,"-",m)),h.pipe(oo(4,"-",m)));let g=this.bind.source.sourceShader(this._shaders.shader());const v=["width","height","depth","items"];for(t=0;t<v.length;t++){e=v[t];const n=`lerp.${e}`;null!=this.props[e]&&(g=this._shaders.shader().require(g),g.pipe(n,c))}return l.pipe(g),this.operator=l,this.indexer=h,this.relativeSize=o}unmake(){return super.unmake(),this.operator=null}resize(){if(null==this.bind.source)return;const t=this.bind.source.getActiveDimensions(),e=this.getActiveDimensions(),n=n=>{const i=this.centered[n],r=this.padding[n];e[n]+=2*r;return[i?t[n]/Math.max(1,e[n]):Math.max(1,t[n]-1)/Math.max(1,e[n]-1),r]},[i,r]=Array.from(n("width")),[s,a]=Array.from(n("height")),[o,l]=Array.from(n("depth")),[h,c]=Array.from(n("items"));return this.resampleFactor.value.set(i,s,o,h),this.resampleBias.value.set(r,a,l,c),super.resize()}change(t,e,n){if(e.operator||e.lerp||e.sampler)return this.rebuild()}}ul.initClass();class dl extends Wo{static initClass(){this.traits=["node","bind","active","operator","source","index","texture","memo"]}sourceShader(t){return this.memo.shaderAbsolute(t,1)}make(){if(super.make(),null==this.bind.source)return;this._helpers.active.make(),this._listen("root","root.update",(()=>{if(this.isActive)return this.update()}));const{minFilter:t,magFilter:e,type:n}=this.props,i=this.bind.source.getDimensions(),{items:r,width:s,height:a,depth:o}=i;this.memo=this._renderables.make("memo",{items:r,width:s,height:a,depth:o,minFilter:t,magFilter:e,type:n});const l=this._shaders.shader();return this.bind.source.sourceShader(l),this.compose=this._renderables.make("memoScreen",{map:l,items:r,width:s,height:a,depth:o}),this.memo.adopt(this.compose),this.objects=[this.compose],this.renders=this.compose.renders}unmake(){if(super.unmake(),null!=this.bind.source)return this._helpers.active.unmake(),this.memo.unadopt(this.compose),this.memo.dispose(),this.memo=this.compose=null}update(){return null!=this.memo?this.memo.render():void 0}resize(){if(null==this.bind.source)return;const t=this.bind.source.getActiveDimensions(),{width:e,height:n,depth:i}=t;return this.compose.cover(e,n,i),super.resize()}change(t,e,n){if(e.texture||e.operator)return this.rebuild()}}dl.initClass();class pl extends za{static initClass(){this.traits=["node","bind","operator","readback","entity","active"],this.finals={channels:4}}init(){return this.emitter=this.root=null,this.active={}}make(){if(super.make(),this._compute("readback.data",(()=>null!=this.readback?this.readback.data:void 0)),this._compute("readback.items",(()=>null!=this.readback?this.readback.items:void 0)),this._compute("readback.width",(()=>null!=this.readback?this.readback.width:void 0)),this._compute("readback.height",(()=>null!=this.readback?this.readback.height:void 0)),this._compute("readback.depth",(()=>null!=this.readback?this.readback.depth:void 0)),this._helpers.bind.make([{to:"operator.source",trait:"source"}]),null==this.bind.source)return;const{type:t,channels:e,expr:n}=this.props;this.root=this._inherit("root"),this._listen("root","root.update",this.update);const{items:i,width:r,height:s,depth:a}=this.bind.source.getDimensions(),o=this.bind.source.sourceShader(this._shaders.shader());this.readback=this._renderables.make("readback",{map:o,items:i,width:r,height:s,depth:a,channels:e,type:t}),null!=n&&this.readback.setCallback(n),this._helpers.active.make()}unmake(){return null!=this.readback&&(this.readback.dispose(),this.readback=null,this.root=null,this.emitter=null,this.active={}),this._helpers.active.unmake(),this._helpers.bind.unmake()}update(){null!=this.readback&&this.isActive&&(this.readback.update(null!=this.root?this.root.getCamera():void 0),this.readback.post(),null!=this.props.expr&&this.readback.iterate())}resize(){let t,e;if(null==this.readback)return;const{items:n,width:i,height:r,depth:s}=this.bind.source.getActiveDimensions();return this.readback.setActive(n,i,r,s),this.strideI=t=n,this.strideJ=e=t*i,this.strideK=e*r}change(t,e,n){return t["readback.type"]?this.rebuild():t["readback.expr"]&&this.readback?this.readback.setCallback(this.props.expr):void 0}}pl.initClass();class fl extends Wo{static initClass(){this.traits=["node","bind","operator","source","index","repeat"]}indexShader(t){return t.pipe(this.operator),super.indexShader(t)}sourceShader(t){return t.pipe(this.operator),super.sourceShader(t)}getDimensions(){return this._resample(this.bind.source.getDimensions())}getActiveDimensions(){return this._resample(this.bind.source.getActiveDimensions())}getFutureDimensions(){return this._resample(this.bind.source.getFutureDimensions())}getIndexDimensions(){return this._resample(this.bind.source.getIndexDimensions())}_resample(t){const e=this.resample;return{items:e.items*t.items,width:e.width*t.width,height:e.height*t.height,depth:e.depth*t.depth}}make(){if(super.make(),null==this.bind.source)return;this.resample={};const t={repeatModulus:this._attributes.make(this._types.vec4())};this.repeatModulus=t.repeatModulus;const e=this._shaders.shader();return e.pipe("repeat.position",t),this.operator=e}unmake(){return super.unmake()}resize(){if(null!=this.bind.source){const t=this.bind.source.getActiveDimensions();this.repeatModulus.value.set(t.width,t.height,t.depth,t.items)}return super.resize()}change(t,e,n){return e.operator||e.repeat?this.rebuild():n?["items","width","height","depth"].map((t=>this.resample[t]=this.props[t])):void 0}}fl.initClass();class ml extends Wo{static initClass(){this.traits=["node","bind","operator","source","index","swizzle"]}sourceShader(t){return t=super.sourceShader(t),this.swizzler&&t.pipe(this.swizzler),t}make(){if(super.make(),null==this.bind.source)return;const{order:t}=this.props;return"1234"!==t.join()?this.swizzler=uo(t,4):void 0}unmake(){return super.unmake(),this.swizzler=null}change(t,e,n){if(e.swizzle||e.operator)return this.rebuild()}}ml.initClass();class gl extends Wo{static initClass(){this.traits=["node","bind","operator","source","index","spread"]}sourceShader(t){return t.pipe(this.operator)}make(){if(super.make(),null==this.bind.source)return;const t={spreadMatrix:this._attributes.make(this._types.mat4()),spreadOffset:this._attributes.make(this._types.vec4())};this.spreadMatrix=t.spreadMatrix,this.spreadOffset=t.spreadOffset;const e=this._shaders.shader();return e.require(this.bind.source.sourceShader(this._shaders.shader())),e.pipe("spread.position",t),this.operator=e}unmake(){return super.unmake()}resize(){return this.update(),super.resize()}update(){let t,e,n,i;const r=this.bind.source.getFutureDimensions(),s=this.spreadMatrix.value.elements,a=["width","height","depth","items"],o=["alignWidth","alignHeight","alignDepth","alignItems"],{unit:l}=this.props,h=this.node.attributes["spread.unit"].enum,c=(()=>{switch(l){case h.relative:return(t,e,n,i)=>s[4*e+n]=i/Math.max(1,r[t]-1);case h.absolute:return(t,e,n,i)=>s[4*e+n]=i}})();return(()=>{const l=[];for(e=0;e<a.length;e++){let h;t=a[e];const u=this.props[t],d=this.props[o[e]];if(null!=u){h=-((null!=r[t]?r[t]:1)-1)*(.5-.5*d)}else h=0;this.spreadOffset.value.setComponent(e,h),l.push((()=>{const r=[];for(n=0;n<=3;n++){let a;i=null!=(a=null!=u?u.getComponent(n):void 0)?a:0,r.push(s[4*e+n]=c(t,e,n,i))}return r})())}return l})()}change(t,e,n){return e.operator?this.rebuild():e.spread?this.update():void 0}}gl.initClass();class vl extends Wo{static initClass(){this.traits=["node","bind","operator","source","index","split"]}indexShader(t){return t.pipe(this.operator),super.indexShader(t)}sourceShader(t){return t.pipe(this.operator),super.sourceShader(t)}getDimensions(){return this._resample(this.bind.source.getDimensions())}getActiveDimensions(){return this._resample(this.bind.source.getActiveDimensions())}getFutureDimensions(){return this._resample(this.bind.source.getFutureDimensions())}getIndexDimensions(){return this._resample(this.bind.source.getIndexDimensions())}_resample(t){let e;const{order:n}=this,{axis:i}=this,{overlap:r}=this,{length:s}=this,{stride:a}=this,o=["width","height","depth","items"],l=n.map((t=>o[t-1])),h=n.indexOf(i);let c=(()=>{const n=[];for(e of Array.from(l))n.push(t[e]);return n})();const u=Math.floor((c[h]-r)/a);c.splice(h,1,s,u),c=c.slice(0,4);const d={};for(let t=0;t<l.length;t++)e=l[t],d[e]=c[t];return d}make(){let t;if(super.make(),null==this.bind.source)return;const{order:e}=this.props;let{axis:n}=this.props,{overlap:i}=this.props;const{length:r}=this.props,s=e.join("");null==n&&(n=e[0]);const a=s.indexOf(n),o=s[a]+(null!=(t=s[a+1])?t:0),l=s.replace(o[1],"").replace(o[0],"0")+"0";i=Math.min(r-1,i);const h=r-i,c={splitStride:this._attributes.make(this._types.number(h))},u=this._shaders.shader();return u.require(uo(o,2)),u.require(uo(l,4)),u.require(co(a)),u.pipe("split.position",c),u.pipe(po(e)),this.operator=u,this.order=e,this.axis=n,this.overlap=i,this.length=r,this.stride=h}unmake(){return super.unmake()}change(t,e,n){if(t["split.axis"]||t["split.order"]||e.operator)return this.rebuild()}}vl.initClass();class xl extends Wo{static initClass(){this.traits=["node","bind","operator","source","index","slice"]}getDimensions(){return this._resample(this.bind.source.getDimensions())}getActiveDimensions(){return this._resample(this.bind.source.getActiveDimensions())}getFutureDimensions(){return this._resample(this.bind.source.getFutureDimensions())}getIndexDimensions(){return this._resample(this.bind.source.getIndexDimensions())}sourceShader(t){return t.pipe("slice.position",this.uniforms),this.bind.source.sourceShader(t)}_resolve(t,e){const n=this.props[t],i=e[t];if(null==n)return[0,i];const r=function(t,e){return t<0?e+t:t},s=r(Math.round(n.x),i);let a=r(Math.round(n.y),i);return a=Math.max(s,a),[s,a-s]}_resample(t){return t.width=this._resolve("width",t)[1],t.height=this._resolve("height",t)[1],t.depth=this._resolve("depth",t)[1],t.items=this._resolve("items",t)[1],t}make(){if(super.make(),null!=this.bind.source)return this.uniforms={sliceOffset:this._attributes.make(this._types.vec4())}}unmake(){return super.unmake()}resize(){if(null==this.bind.source)return;const t=this.bind.source.getActiveDimensions();return this.uniforms.sliceOffset.value.set(this._resolve("width",t)[0],this._resolve("height",t)[0],this._resolve("depth",t)[0],this._resolve("items",t)[0]),super.resize()}change(t,e,n){return e.operator?this.rebuild():e.slice?this.resize():void 0}}xl.initClass();class _l extends Wo{static initClass(){this.traits=["node","bind","operator","source","index","subdivide"]}indexShader(t){return t.pipe(this.indexer),super.indexShader(t)}sourceShader(t){return t.pipe(this.operator)}getDimensions(){return this._resample(this.bind.source.getDimensions())}getActiveDimensions(){return this._resample(this.bind.source.getActiveDimensions())}getFutureDimensions(){return this._resample(this.bind.source.getFutureDimensions())}getIndexDimensions(){return this._resample(this.bind.source.getIndexDimensions())}_resample(t){const e=this.resampled;return t.items--,t.width--,t.height--,t.depth--,null!=e.items&&(t.items*=e.items),null!=e.width&&(t.width*=e.width),null!=e.height&&(t.height*=e.height),null!=e.depth&&(t.depth*=e.depth),t.items++,t.width++,t.height++,t.depth++,t}make(){if(super.make(),null==this.bind.source)return;let{lerp:t}=this.props;const{items:e,width:n,height:i,depth:r}=this.props;this.resampled={},null!=e&&(this.resampled.items=e),null!=n&&(this.resampled.width=n),null!=i&&(this.resampled.height=i),null!=r&&(this.resampled.depth=r);const s=this._shaders.shader(),a=this._shaders.shader(),o={resampleFactor:this._attributes.make(this._types.vec4(0,0,0,0)),subdivideBevel:this.node.attributes["subdivide.bevel"]};this.resampleFactor=o.resampleFactor,this.resampleBias=o.resampleBias;null!=e||null!=n||null!=i||null!=r?(s.pipe("resample.relative",o),a.pipe("resample.relative",o)):(s.pipe(fo("vec4")),a.pipe(fo("vec4")));let l=this.bind.source.sourceShader(this._shaders.shader());t=t?".lerp":"";const h=["width","height","depth","items"];for(let e=0;e<h.length;e++){const n=h[e],i=`subdivide.${n}${t}`;null!=this.props[n]&&(l=this._shaders.shader().require(l),l.pipe(i,o))}return s.pipe(l),this.operator=s,this.indexer=a}unmake(){return super.unmake(),this.operator=null}resize(){if(null==this.bind.source)return;const t=this.bind.source.getActiveDimensions(),e=this.getActiveDimensions(),n=n=>Math.max(1,t[n]-1)/Math.max(1,e[n]-1),i=n("width"),r=n("height"),s=n("depth"),a=n("items");return this.resampleFactor.value.set(i,r,s,a),super.resize()}change(t,e,n){if(e.operator||e.subdivide)return this.rebuild()}}_l.initClass();const yl={1:"width",2:"height",3:"depth",4:"items"};class bl extends Wo{static initClass(){this.traits=["node","bind","operator","source","index","transpose"]}indexShader(t){return this.swizzler&&t.pipe(this.swizzler),super.indexShader(t)}sourceShader(t){return this.swizzler&&t.pipe(this.swizzler),super.sourceShader(t)}getDimensions(){return this._remap(this.transpose,this.bind.source.getDimensions())}getActiveDimensions(){return this._remap(this.transpose,this.bind.source.getActiveDimensions())}getFutureDimensions(){return this._remap(this.transpose,this.bind.source.getFutureDimensions())}getIndexDimensions(){return this._remap(this.transpose,this.bind.source.getIndexDimensions())}_remap(t,e){const n={};for(let i=0;i<=3;i++){const r=yl[i+1],s=yl[t[i]];n[r]=null!=e[s]?e[s]:1}return n}make(){if(super.make(),null==this.bind.source)return;const{order:t}=this.props;return"1234"!==t.join()&&(this.swizzler=po(t)),this.transpose=t,this.trigger({type:"source.rebuild"})}unmake(){return super.unmake(),this.swizzler=null}change(t,e,n){if(e.transpose||e.operator)return this.rebuild()}}bl.initClass();class wl extends Oa{static initClass(){this.traits=["node","transition","transform","mask","visible","active"]}init(){return this.animate=null,this.uniforms=null,this.state={isVisible:!0,isActive:!0,enter:1,exit:1},this.latched=null,this.locked=null}make(){this.uniforms={transitionFrom:this._attributes.make(this._types.vec4()),transitionTo:this._attributes.make(this._types.vec4()),transitionActive:this._attributes.make(this._types.bool()),transitionScale:this._attributes.make(this._types.vec4()),transitionBias:this._attributes.make(this._types.vec4()),transitionEnter:this._attributes.make(this._types.number()),transitionExit:this._attributes.make(this._types.number()),transitionSkew:this._attributes.make(this._types.number())};const t=this._inherit("slide"),e=this._inherit("visible"),n=this._inherit("active");return this._listen(t,"transition.latch",(t=>this.latch(t.step))),this._listen(t,"transition.release",(()=>this.release())),this._listen(e,"visible.change",(()=>this.update(this.state.isVisible=e.isVisible))),this._listen(n,"active.change",(()=>this.update(this.state.isActive=n.isActive))),this.animate=this._animator.make(this._types.vec2(1,1),{step:t=>(this.state.enter=t.x,this.state.exit=t.y,this.update()),complete:t=>this.complete(t)}),this.move=null!=this.props.from||null!=this.props.to}unmake(){return this.animate.dispose()}latch(t){let e;this.locked=null,this.latched=e={isVisible:this.state.isVisible,isActive:this.state.isActive,step:t};if(!this.isVisible){const t=e.step>=0,[n,i]=Array.from(t?[0,1]:[1,0]);return this.animate.set(n,i)}}release(){const{latched:t}=this,{state:e}=this;if(this.latched=null,t.isVisible!==e.isVisible){const n=t.step>=0,i=e.isVisible,[r,s]=Array.from(i?[1,1]:n?[1,0]:[0,1]);let{duration:a,durationEnter:o,durationExit:l}=this.props;null==o&&(o=a),null==l&&(l=a),a=i*o+!i*l;let{delay:h,delayEnter:c,delayExit:u}=this.props;null==c&&(c=h),null==u&&(u=h),h=i*c+!i*u,this.animate.immediate({x:r,y:s},{duration:a,delay:h,ease:"linear"}),this.locked={isVisible:!0,isActive:t.isActive||e.isActive}}return this.update()}complete(t){if(t)return this.locked=null,this.update()}update(){if(null!=this.latched)return;let{enter:t,exit:e}=this.props;null==t&&({enter:t}=this.state),null==e&&({exit:e}=this.state);const n=t*e;let i=n>0;const r=n<1;this.uniforms.transitionEnter.value=t,this.uniforms.transitionExit.value=e,this.uniforms.transitionActive.value=r,i&&(i=!!this.state.isVisible),null!=this.locked&&(i=this.locked.isVisible),this.isVisible!==i&&(this.isVisible=i,this.trigger({type:"visible.change"}));const s=!(!this.state.isActive&&!(null!=this.locked?this.locked.isActive:void 0));return this.isActive!==s?(this.isActive=s,this.trigger({type:"active.change"})):void 0}change(t,e,n){if((t["transition.enter"]||t["transition.exit"]||n)&&this.update(),t["transition.stagger"]||n){const{stagger:t}=this.props,e=t.x<0,n=t.y<0,i=t.z<0,r=t.w<0,s=Math.abs(t.x),a=Math.abs(t.y),o=Math.abs(t.z),l=Math.abs(t.w);return this.uniforms.transitionSkew.value=s+a+o+l,this.uniforms.transitionScale.value.set((1-2*e)*s,(1-2*n)*a,(1-2*i)*o,(1-2*r)*l),this.uniforms.transitionBias.value.set(e*s,n*a,i*o,r*l)}}}wl.initClass();class Sl extends wl{static initClass(){this.traits=["node","transition","vertex","move","visible","active"]}make(){super.make();const t={moveFrom:this.node.attributes["move.from"],moveTo:this.node.attributes["move.to"]};for(const e in t){const n=t[e];this.uniforms[e]=n}}vertex(t,e){let n;return e===this.props.pass&&t.pipe("move.position",this.uniforms),null!=(i=this._inherit("vertex"),r=n=>n.vertex(t,e),n=null!=i?r(i):void 0)?n:t;var i,r}}function Ml(t,e,n){return Math.max(e,Math.min(n,t))}function Tl(t){return.5-.5*Math.cos(Ml(t,0,1)*Math.PI)}function El(t){return+(t>=.5)}function Al(t){return+(t>=1)}Sl.initClass();const Cl=function(t){const e={};for(const n in t){const i=t[n];e[n]=i instanceof Array?i.slice():null!=i&&"object"==typeof i?Cl(i):i}return e};class Rl extends za{static initClass(){this.traits=["node","track","seek","bind"]}init(){return this.handlers={},this.script=null,this.values=null,this.playhead=0,this.velocity=null,this.section=null,this.expr=null}make(){let t;this._helpers.bind.make([{to:"track.target",trait:"node",callback:null}]);const{script:e}=this.props,{node:n}=this.bind.target;return this.targetNode=n,[this.script,this.values,this.start,this.end]=Array.from(t=this._process(n,e)),t}unmake(){return this.unbindExpr(),this._helpers.bind.unmake(),this.script=this.values=this.start=this.end=this.section=this.expr=null,this.playhead=0}bindExpr(t){this.unbindExpr(),this.expr=t,this.targetNode.bind(t,!0);const{clock:e}=this.targetNode,n=this;return this._attributes.bind(this.measure=function(){let t=null;return()=>{const{step:i}=e.getTime();return null!=t&&(n.velocity=(n.playhead-t)/i),t=n.playhead}}())}unbindExpr(){return null!=this.expr&&this.targetNode.unbind(this.expr,!0),null!=this.measure&&this._attributes.unbind(this.measure),this.expr=this.measure=null}_process(t,e){let n,i,r,s,a,o,l;if(e instanceof Array){a={};for(let t=0;t<e.length;t++)o=e[t],a[t]=o;e=a}for(i in a=[],e)o=e[i],null==o&&(o=[]),o instanceof Array?o={key:+i,props:null!=o[0]?Cl(o[0]):{},expr:null!=o[1]?Cl(o[1]):{}}:(o=null!=o.key||o.props||o.expr?Cl(o):{props:Cl(o)},o.key=null!=o.key?+o.key:+i,null==o.props&&(o.props={}),null==o.expr&&(o.expr={})),a.push(o);if(!(e=a).length)return[[],{},0,0];e.sort(((t,e)=>t.key-e.key));const h=e[0].key,c=e[e.length-1].key;for(i in e)o=e[i],null!=r&&(r.next=o),r=o;r.next=r,e=a;const u={},d={};for(i in e)for(n in o=e[i],o.props)l=o.props[n],u[n]=!0;for(i in e)for(n in o=e[i],o.expr)l=o.expr[n],u[n]=!0;for(n in u)u[n]=t.get(n);try{for(n in u)d[n]=[t.attribute(n).T.make(),t.attribute(n).T.make(),t.attribute(n).T.make()]}catch(e){throw console.warn(this.node.toMarkup()),s=`${this.node.toString()} - Target ${t} has no \`${n}\` property`,new Error(s)}const p=[];for(o of Array.from(e)){for(n in u)if(l=u[n],l=t.validate(n,null!=o.props[n]?o.props[n]:l),u[n]=o.props[n]=l,null!=o.expr[n]&&"function"!=typeof o.expr[n])throw console.warn(this.node.toMarkup()),s=`${this.node.toString()} - Expression \`${o.expr[n]}\` on property \`${n}\` is not a function`,new Error(s);p.push(o)}return[p,d,h,c]}update(){let{playhead:t}=this;const{script:e}=this,{ease:n,seek:i}=this.props,r=this.targetNode;if(null!=i&&(t=i),e.length){let i;const s=function(){let n=e[0];for(let i=0;i<e.length;i++){const r=e[i];if(r.key>t)break;n=r}return n};let{section:a}=this;if((!a||t<a.key||t>a.next.key)&&(a=s(e,t)),a===this.section)return;this.section=a;const o=a,l=a.next,h=o.key,c=l.key,u=(()=>{switch(n){case"linear":case 0:return Ml;case"cosine":case 1:default:return Tl;case"binary":case 2:return El;case"hold":case 3:return Al}})(),{clock:d}=r,p=t=>{if(null==this.velocity)return this.playhead;const e=d.getTime();return this.playhead+this.velocity*(t-e.time)},f=function(){const t=1/Math.max(1e-4,c-h);return e=>u((p(e)-h)*t,0,1)}(),m=t=>{const e=o.expr[t],n=l.expr[t],i=o.props[t],s=l.props[t],a=function(){throw console.warn(r.toMarkup()),new Error(`${this.node.toString()} - Invalid expression result on track \`${t}\``)},h=r.attribute(t),c=this.values[t],u=this._animator;return e&&n?((t,i,r)=>function(i,r){let s,o;return t[0]=s=h.T.validate(e(i,r),t[0],a),t[1]=o=h.T.validate(n(i,r),t[1],a),t[2]=u.lerp(h.T,s,o,f(i),t[2])})(c):e?((t,n,i)=>function(n,i){let r;return t[0]=r=h.T.validate(e(n,i),t[0],a),t[1]=u.lerp(h.T,r,s,f(n),t[1])})(c):n?((t,e,r)=>function(e,r){let s;return t[0]=s=h.T.validate(n(e,r),t[0],a),t[1]=u.lerp(h.T,i,s,f(e),t[1])})(c):((t,e,n)=>(e,n)=>t[0]=u.lerp(h.T,i,s,f(e),t[0]))(c)},g={};for(i in o.expr)null==g[i]&&(g[i]=m(i));for(i in l.expr)null==g[i]&&(g[i]=m(i));for(i in o.props)null==g[i]&&(g[i]=m(i));for(i in l.props)null==g[i]&&(g[i]=m(i));return this.bindExpr(g)}}change(t,e,n){return t["track.target"]||t["track.script"]||t["track.mode"]?this.rebuild():t["seek.seek"]||n?this.update():void 0}}Rl.initClass();class Dl extends Rl{static initClass(){this.traits=["node","track","trigger","play","bind"]}init(){return super.init(),this.skew=null,this.start=null}reset(t){return null==t&&(t=!0),this.skew=t?0:null,this.start=null}make(){super.make(),this._listen("slide","slide.step",(t=>{const{trigger:e}=this.props;return null!=e&&t.index===e?this.reset():null!=e&&0===t.index?this.reset(!1):void 0})),this.props.trigger&&null!=this._inherit("slide")||this.reset();const t=this._inherit("clock");return this._listen(t,"clock.tick",(()=>{const{from:e,to:n,speed:i,pace:r,delay:s,realtime:a}=this.props,o=t.getTime();if(null!=this.skew){const t=a?o.time:o.clock,l=a?o.delta:o.step,h=i/r;null==this.start&&(this.start=t),this.skew+=l*(h-1);let c=Math.max(0,t-this.start+this.skew-s*h);this.props.loop&&(c%=n-e),this.playhead=Math.min(n,e+c)}else this.playhead=0;return this.update()}))}update(){return super.update()}change(t,e,n){return t["trigger.trigger"]||t["play.realtime"]?this.rebuild():super.change(t,e,n)}}Dl.initClass();class kl extends Oa{static initClass(){this.traits=["node","present"]}init(){}make(){return this.nodes=[],this.steps=[],this.length=0,this.last=[],this.index=0,this.dirty=[],this._listen("root","root.update",this.update),this._compute("present.length",(()=>this.length))}adopt(t){const{node:e}=t;return this.nodes.indexOf(t)<0&&this.nodes.push(e),this.dirty.push(t)}unadopt(t){return this.nodes=this.nodes.filter((e=>e!==t)),this.dirty.push(t)}update(){if(this.dirty.length){for(const t of Array.from(this.dirty))this.slideReset(t);return[this.steps,this.indices]=Array.from(this.process(this.nodes)),this.length=this.steps.length,this.index=null,this.go(this.props.index),this.dirty=[]}}slideLatch(t,e,n){return t.slideLatch(e,n)}slideStep(t,e,n){return t.slideStep(this.mapIndex(t,e),n)}slideRelease(t,e){return t.slideRelease()}slideReset(t){return t.slideReset()}mapIndex(t,e){return e-this.indices[t.node._id]}process(t){const e=(t=>e=>(()=>{let n,i;const r=[];for(;e&&([e,n]=Array.from(i=[t(e),e]),i);)r.push(n);return r})())((function(t){return t.parent.traits.hash.present?null:t.parent})),n=e=>t.indexOf(e)>=0,i=function(t){return t?(()=>{const e=[];for(let n=0;n<t.length;n++){const i=t[n];t.indexOf(i)===n&&e.push(i)}return e})():[]},r=t=>t.sort(((t,e)=>t.order-e.order)),s=(t=>Array.from(t).map((t=>e(t).filter(n))))(t),a=(t=>t.sort((function(t,e){const n=t.length,i=e.length;let r=Math.min(n,i);for(let s=1,a=r,o=1<=a;o?s<=a:s>=a;o?s++:s--){const a=t[n-s],o=e[i-s],l=a.props.order,h=o.props.order;if(null!=l||null!=h){if(null!=l&&null!=h&&0!=(r=l-h))return r;if(null!=l)return-1;if(null!=h)return 1}if(o.order!==a.order)return o.order-a.order}return r=n-i,0!==r?r:0})))(s);return function(t){let e;const[n,s]=Array.from(t),a={};let o=[];const l=function(t,e){let n;const{props:i}=n=t[0],r=t[1],s=null!=r?a[r._id]:0,l=e;let h=null!=i.from?s+i.from:l-i.early,c=null!=i.to?s+i.to:l+i.steps+i.late;h=Math.max(0,h),c=Math.min(100,c),null==a[n._id]&&(a[n._id]=h);for(let e=h,n=c,i=h<=n;i?e<n:e>n;i?e++:e--)o[e]=(null!=o[e]?o[e]:o[e]=[]).concat(t);return i.steps};let h=0;for(e of Array.from(n))h+=l(e,h);for(e of Array.from(s))l(e,0);return o=(()=>{const t=[];for(e of Array.from(o))t.push(r(i(e)));return t})(),[o,a]}(function(t){const e=[],n=[];for(const i of Array.from(t))(null!=i[0].props.steps?e:n).push(i);return[e,n]}(a))}go(t){let e,n;t=Math.max(0,Math.min(this.length+1,+t||0));const i=null!=(e=this.steps[t-1])?e:[],r=this.props.directed?t-this.index:1;this.index=t;const s=(()=>{const t=[];for(n of Array.from(i))this.last.indexOf(n)<0&&t.push(n);return t})(),a=(()=>{const t=[];for(n of Array.from(this.last))i.indexOf(n)<0&&t.push(n);return t})(),o=(()=>{const t=[];for(n of Array.from(i))s.indexOf(n)<0&&a.indexOf(n)<0&&t.push(n);return t})(),l=t=>t.sort(((t,e)=>t.order-e.order)),h=t=>t.sort(((t,e)=>e.order-t.order));for(n of Array.from(l(s)))this.slideLatch(n.controller,!0,r);for(n of Array.from(l(o)))this.slideLatch(n.controller,null,r);for(n of Array.from(l(a)))this.slideLatch(n.controller,!1,r);for(n of Array.from(s))this.slideStep(n.controller,t,r);for(n of Array.from(o))this.slideStep(n.controller,t,r);for(n of Array.from(a))this.slideStep(n.controller,t,r);for(n of Array.from(h(s)))this.slideRelease(n.controller);for(n of Array.from(h(o)))this.slideRelease(n.controller);for(n of Array.from(h(a)))this.slideRelease(n.controller);this.last=i}change(t,e,n){if(t["present.index"]||n)return this.go(this.props.index)}}kl.initClass();class Pl extends wl{static initClass(){this.traits=["node","transition","mask","visible","active"]}mask(t){let e,n;return t?(n=this._shaders.shader(),n.pipe(fo("vec4")),n.fan(),n.pipe(t,this.uniforms),n.next(),n.pipe("reveal.mask",this.uniforms),n.end(),n.pipe("float combine(float a, float b) { return min(a, b); }")):(n=this._shaders.shader(),n.pipe("reveal.mask",this.uniforms)),null!=(i=this._inherit("mask"),r=t=>t.mask(n),e=null!=i?r(i):void 0)?e:n;var i,r}}Pl.initClass();class Ll extends Oa{static initClass(){this.traits=["node","slide","visible","active"]}make(){if(this._helpers.visible.make(),this._helpers.active.make(),!this._inherit("present"))throw new Error(`${this.node.toString()} must be placed inside <present></present>`);return this._inherit("present").adopt(this)}unmake(){return this._helpers.visible.unmake(),this._helpers.active.unmake(),this._inherit("present").unadopt(this)}change(t,e,n){if(t["slide.early"]||t["slide.late"]||t["slide.steps"]||t["slide.from"]||t["slide.to"])return this.rebuild()}slideLatch(t,e){if(this.trigger({type:"transition.latch",step:e}),null!=t)return this._instant(t)}slideStep(t,e){return this.trigger({type:"slide.step",index:t,step:e})}slideRelease(){return this.trigger({type:"transition.release"})}slideReset(){return this._instant(!1),this.trigger({type:"slide.reset"})}_instant(t){return this.setVisible(t),this.setActive(t)}}Ll.initClass();class zl extends Rl{static initClass(){this.traits=["node","track","step","trigger","bind"]}make(){super.make();const t=this._inherit("clock");return null==this.actualIndex&&(this.actualIndex=null),this.animateIndex=this._animator.make(this._types.number(0),{clock:t,realtime:this.props.realtime,step:t=>this.actualIndex=t}),null==this.lastIndex&&(this.lastIndex=null),this.animateStep=this._animator.make(this._types.number(0),{clock:t,realtime:this.props.realtime,step:t=>(this.playhead=t,this.update())}),this.stops=null!=this.props.stops?this.props.stops:function(t,e,n){const i=[],r=t<e,s=n?r?e+1:e-1:e;for(let e=t;r?e<s:e>s;r?e++:e--)i.push(e);return i}(0,this.script.length,!1),this._listen("slide","slide.reset",(t=>this.lastIndex=null)),this._listen("slide","slide.step",(t=>{let e,{duration:n}=this.props;const{delay:i,pace:r,speed:s,playback:a,rewind:o,skip:l,trigger:h}=this.props,c=Math.max(0,Math.min(this.stops.length-1,t.index-h)),u=this.playhead,d=this.stops[c];if(null==this.lastIndex&&h)return this.lastIndex=c,this.animateStep.set(d),void this.animateIndex.set(c);let p=null!=(e=null!=this.actualIndex?this.actualIndex:this.lastIndex)?e:0;const f=c-p,m=this.stops.slice(Math.min(p,c),Math.max(p,c));let g=0;p=m.shift();for(const t of Array.from(m))p===t&&g++,p=t;this.lastIndex=c;let v=s*(t.step>=0?1:o);return v*=l?Math.max(1,Math.abs(f)-g):1,n+=Math.abs(d-u)*r/v,u!==d?(this.animateIndex.immediate(c,{delay:i,duration:n,ease:a}),this.animateStep.immediate(d,{delay:i,duration:n,ease:a})):void 0}))}made(){return this.update()}unmake(){return this.animateIndex.dispose(),this.animateStep.dispose(),this.animateIndex=this.animateStep=null,super.unmake()}change(t,e,n){return t["step.stops"]||t["step.realtime"]?this.rebuild():super.change(t,e,n)}}zl.initClass();class Ol extends Oa{static initClass(){this.traits=["node","root","scene","vertex","texture","rtt","source","index","image"],this.defaults={minFilter:"linear",magFilter:"linear",type:"unsignedByte"}}init(){return this.rtt=this.scene=this.camera=this.width=this.height=this.history=this.rootSize=this.size=null}indexShader(t){return t}imageShader(t){return this.rtt.shaderRelative(t)}sourceShader(t){return this.rtt.shaderAbsolute(t,this.history)}getDimensions(){return{items:1,width:this.width,height:this.height,depth:this.history}}getActiveDimensions(){return this.getDimensions()}make(){let t;if(this.parentRoot=this._inherit("root"),this.rootSize=this.parentRoot.getSize(),this._listen(this.parentRoot,"root.pre",this.pre),this._listen(this.parentRoot,"root.update",this.update),this._listen(this.parentRoot,"root.render",this.render),this._listen(this.parentRoot,"root.post",this.post),this._listen(this.parentRoot,"root.camera",this.setCamera),this._listen(this.parentRoot,"root.resize",(function(t){return this.resize(t.size)})),null==this.rootSize)return;const{minFilter:e,magFilter:n,type:i}=this.props,{width:r,height:s,history:a,size:o}=this.props,l=o===this.node.attributes["rtt.size"].enum.relative,h=l?this.rootSize.renderWidth:1,c=l?this.rootSize.renderHeight:1;this.width=Math.round(null!=r?r*h:this.rootSize.renderWidth),this.height=Math.round(null!=s?s*c:this.rootSize.renderHeight),this.history=a,this.aspect=t=this.width/this.height,null==this.scene&&(this.scene=this._renderables.make("scene")),this.rtt=this._renderables.make("renderToTexture",{scene:this.scene,camera:this._context.defaultCamera,width:this.width,height:this.height,frames:this.history,minFilter:e,magFilter:n,type:i}),t=r||s?t:this.rootSize.aspect;const u=null!=r?r:this.rootSize.viewWidth,d=null!=s?s:this.rootSize.viewHeight;return this.size={renderWidth:this.width,renderHeight:this.height,aspect:t,viewWidth:u,viewHeight:d,pixelRatio:this.height/d}}made(){if(this.trigger({type:"source.rebuild"}),this.size)return this.trigger({type:"root.resize",size:this.size})}unmake(t){if(null!=this.rtt)return this.rtt.dispose(),t||this.scene.dispose(),this.rtt=this.width=this.height=this.history=null}change(t,e,n){return e.texture||t["rtt.width"]||t["rtt.height"]?this.rebuild():t["root.camera"]||n?(this._unattach(),this._attach(this.props.camera,"camera",this.setCamera,this,this,!0),this.setCamera()):void 0}adopt(t){return Array.from(t.renders).map((t=>this.scene.add(t)))}unadopt(t){return Array.from(t.renders).map((t=>this.scene.remove(t)))}resize(t){let e,n;this.rootSize=t,({width:n,height:e,size:t}=this.props);const i=t===this.node.attributes["rtt.size"].enum.relative;if(!this.rtt||null==n||null==e||i)return this.rebuild()}select(t){return this._root.node.model.select(t,[this.node])}watch(t,e){return this._root.node.model.watch(t,e)}unwatch(t){return this._root.node.model.unwatch(t)}pre(t){return this.trigger(t)}update(t){let e;return null!=(e=this.getOwnCamera())&&(e.aspect=this.aspect||1,e.updateProjectionMatrix()),this.trigger(t)}render(t){return this.trigger(t),null!=this.rtt?this.rtt.render(this.getCamera()):void 0}post(t){return this.trigger(t)}setCamera(){const t=(e=this.select(this.props.camera)[0],n=t=>t.controller,null!=e?n(e):void 0);var e,n;return this.camera!==t?(this.camera=t,this.rtt.camera=this.getCamera(),this.trigger({type:"root.camera"})):this.camera?void 0:this.trigger({type:"root.camera"})}getOwnCamera(){return null!=this.camera?this.camera.getCamera():void 0}getCamera(){let t;return null!=(t=this.getOwnCamera())?t:this._inherit("root").getCamera()}vertex(t,e){return 2===e?t.pipe("view.position"):3===e?t.pipe("root.position"):t}}Ol.initClass();class Il extends za{static initClass(){this.traits=["node","bind","object","visible","operator","style","compose"],this.defaults={zWrite:!1,zTest:!1,color:"#ffffff"}}init(){return this.compose=null}resize(){if(!this.compose||!this.bind.source)return;const t=this.bind.source.getActiveDimensions(),{width:e}=t,{height:n}=t;return this.remapUVScale.set(e,n)}make(){if(this._helpers.bind.make([{to:"operator.source",trait:"source"}]),null==this.bind.source)return;const t={remapUVScale:this._attributes.make(this._types.vec2())};this.remapUVScale=t.remapUVScale.value;let e=this._shaders.shader();const{alpha:n}=this.props;this.bind.source.is("image")?(e.pipe("screen.pass.uv",t),e=this.bind.source.imageShader(e)):(e.pipe("screen.map.xy",t),e=this.bind.source.sourceShader(e)),n||e.pipe("color.opaque");const i=this._helpers.style.uniforms();return this.compose=this._renderables.make("screen",{map:e,uniforms:i,linear:!0}),this._helpers.visible.make(),this._helpers.object.make([this.compose])}made(){return this.resize()}unmake(){return this._helpers.bind.unmake(),this._helpers.visible.unmake(),this._helpers.object.unmake()}change(t,e,n){if(t["operator.source"]||t["compose.alpha"])return this.rebuild()}}Il.initClass();class Nl extends tl{static initClass(){this.traits=["node","object","visible","view","vertex"]}make(){return this._helpers.visible.make()}unmake(){return this._helpers.visible.unmake()}axis(t){return this.props.range[t-1]}}Nl.initClass();class Fl extends Nl{static initClass(){this.traits=["node","object","visible","view","view3","vertex"]}make(){super.make(),this.uniforms={viewMatrix:this._attributes.make(this._types.mat4())},this.viewMatrix=this.uniforms.viewMatrix.value,this.composer=Ga()}unmake(){super.unmake(),delete this.viewMatrix,delete this.objectMatrix,delete this.uniforms}change(t,e,n){if(!e.view&&!e.view3&&!n)return;const i=this.props.position,r=this.props.scale,s=this.props.quaternion,a=this.props.rotation,o=this.props.range,l=this.props.eulerOrder,{x:h}=o[0],c=o[1].x,u=o[2].x,d=o[0].y-h||1,p=o[1].y-c||1,f=o[2].y-u||1;this.viewMatrix.set(2/d,0,0,-(2*h+d)/d,0,2/p,0,-(2*c+p)/p,0,0,2/f,-(2*u+f)/f,0,0,0,1);const m=this.composer(i,a,s,r,null,l);this.viewMatrix.multiplyMatrices(m,this.viewMatrix),t["view.range"]&&this.trigger({type:"view.range"})}vertex(t,e){return 1===e&&t.pipe("cartesian.position",this.uniforms),super.vertex(t,e)}}Fl.initClass();class Ul extends Nl{static initClass(){this.traits=["node","object","visible","view","view4","vertex"]}make(){return super.make(),this.uniforms={basisOffset:this._attributes.make(this._types.vec4()),basisScale:this._attributes.make(this._types.vec4())},this.basisScale=this.uniforms.basisScale.value,this.basisOffset=this.uniforms.basisOffset.value}unmake(){return super.unmake(),delete this.basisScale,delete this.basisOffset,delete this.uniforms}change(t,e,n){if(!e.view&&!e.view4&&!n)return;const i=this.props.position,r=this.props.scale,s=this.props.range,{x:a}=s[0],o=s[1].x,l=s[2].x,h=s[3].x,c=s[0].y-a||1,u=s[1].y-o||1,d=s[2].y-l||1,p=s[3].y-h||1,f=function(t,e){return t.x*=e.x,t.y*=e.y,t.z*=e.z,t.w*=e.w};return this.basisScale.set(2/c,2/u,2/d,2/p),this.basisOffset.set(-(2*a+c)/c,-(2*o+u)/u,-(2*l+d)/d,-(2*h+p)/p),f(this.basisScale,r),f(this.basisOffset,r),this.basisOffset.add(i),t["view.range"]?this.trigger({type:"view.range"}):void 0}vertex(t,e){return 1===e&&t.pipe("cartesian4.position",this.uniforms),super.vertex(t,e)}}Ul.initClass();class Bl extends Nl{static initClass(){this.traits=["node","object","visible","view","view3","polar","vertex"]}make(){super.make();const{types:t}=this._attributes;return this.uniforms={polarBend:this.node.attributes["polar.bend"],polarHelix:this.node.attributes["polar.helix"],polarFocus:this._attributes.make(t.number()),polarAspect:this._attributes.make(t.number()),viewMatrix:this._attributes.make(t.mat4())},this.viewMatrix=this.uniforms.viewMatrix.value,this.composer=Ga(),this.aspect=1}unmake(){return super.unmake(),delete this.viewMatrix,delete this.objectMatrix,delete this.aspect,delete this.uniforms}change(t,e,n){let i,r,s;if(!(e.view||e.view3||e.polar||n))return;this.helix=this.props.helix,this.bend=r=this.props.bend,this.focus=s=r>0?1/r-1:0;const a=this.props.position,o=this.props.scale,l=this.props.quaternion,h=this.props.rotation,c=this.props.range,u=this.props.eulerOrder,{x:d}=c[0];let p=c[1].x;const f=c[2].x,m=c[0].y-d||1;let g=c[1].y-p||1;const v=c[2].y-f||1,x=o.x,_=o.y,y=m>0?1:-1;[p,g]=Array.from(Ro(p,g,r));const b=m+(Math.abs(g)*y-m)*r,w=b/x,S=g/_;this.aspect=i=Math.abs(w/S),this.uniforms.polarFocus.value=s,this.uniforms.polarAspect.value=i,this.viewMatrix.set(2/b,0,0,-(2*d+m)/m,0,2/g,0,-(2*p+g)/g,0,0,2/v,-(2*f+v)/v,0,0,0,1);const M=this.composer(a,h,l,o,null,u);this.viewMatrix.multiplyMatrices(M,this.viewMatrix),(t["view.range"]||e.polar)&&this.trigger({type:"view.range"})}vertex(t,e){return 1===e&&t.pipe("polar.position",this.uniforms),super.vertex(t,e)}axis(t){const e=this.props.range[t-1];let n=e.x,i=e.y;return 2===t&&this.bend>0&&(i=Math.max(Math.abs(i),Math.abs(n)),n=Math.max(-this.focus/this.aspect,n)),new vt.Vector2(n,i)}}Bl.initClass();class Vl extends Nl{static initClass(){this.traits=["node","object","visible","view","view3","spherical","vertex"]}make(){return super.make(),this.uniforms={sphericalBend:this.node.attributes["spherical.bend"],sphericalFocus:this._attributes.make(this._types.number()),sphericalAspectX:this._attributes.make(this._types.number()),sphericalAspectY:this._attributes.make(this._types.number()),sphericalScaleY:this._attributes.make(this._types.number()),viewMatrix:this._attributes.make(this._types.mat4())},this.viewMatrix=this.uniforms.viewMatrix.value,this.composer=Ga(),this.aspectX=1,this.aspectY=1}unmake(){return super.unmake(),delete this.viewMatrix,delete this.objectMatrix,delete this.aspectX,delete this.aspectY,delete this.uniforms}change(t,e,n){let i,r,s,a,o;if(!(e.view||e.view3||e.spherical||n))return;this.bend=s=this.props.bend,this.focus=a=s>0?1/s-1:0;const l=this.props.position,h=this.props.scale,c=this.props.quaternion,u=this.props.rotation,d=this.props.range,p=this.props.eulerOrder,{x:f}=d[0];let m=d[1].x,g=d[2].x;const v=d[0].y-f||1;let x=d[1].y-m||1,_=d[2].y-g||1;const y=h.x,b=h.y,w=h.z;[m,x]=Array.from(Ro(m,x,s)),[g,_]=Array.from(Ro(g,_,s));const S=v>0?1:-1,M=x>0?1:-1,T=Math.abs(_),E=v+(T*S-v)*s,A=x+(T*M-x)*s,C=E/y,R=A/b,D=_/w;this.aspectX=i=Math.abs(C/D),this.aspectY=r=Math.abs(R/D/i);const k=x/v*y/b*2;this.scaleY=o=Math.min(r/s,1+(k-1)*s),this.uniforms.sphericalBend.value=s,this.uniforms.sphericalFocus.value=a,this.uniforms.sphericalAspectX.value=i,this.uniforms.sphericalAspectY.value=r,this.uniforms.sphericalScaleY.value=o,this.viewMatrix.set(2/E,0,0,-(2*f+v)/v,0,2/A,0,-(2*m+x)/x,0,0,2/_,-(2*g+_)/_,0,0,0,1);const P=this.composer(l,u,c,h,null,p);return this.viewMatrix.multiplyMatrices(P,this.viewMatrix),t["view.range"]||e.spherical?this.trigger({type:"view.range"}):void 0}vertex(t,e){return 1===e&&t.pipe("spherical.position",this.uniforms),super.vertex(t,e)}axis(t){const e=this.props.range[t-1];let n=e.x,i=e.y;return 3===t&&this.bend>0&&(i=Math.max(Math.abs(i),Math.abs(n)),n=Math.max(-this.focus/this.aspectX+.001,n)),new vt.Vector2(n,i)}}Vl.initClass();class Hl extends Nl{static initClass(){this.traits=["node","object","visible","view","view3","stereographic","vertex"]}make(){return super.make(),this.uniforms={stereoBend:this.node.attributes["stereographic.bend"],viewMatrix:this._attributes.make(this._types.mat4())},this.viewMatrix=this.uniforms.viewMatrix.value,this.composer=Ga()}unmake(){return super.unmake(),delete this.viewMatrix,delete this.rotationMatrix,delete this.uniforms}change(t,e,n){let i;if(!(e.view||e.view3||e.stereographic||n))return;this.bend=i=this.props.bend;const r=this.props.position,s=this.props.scale,a=this.props.quaternion,o=this.props.rotation,l=this.props.range,h=this.props.eulerOrder,{x:c}=l[0],u=l[1].x;let d=l[2].x;const p=l[0].y-c||1,f=l[1].y-u||1;let m=l[2].y-d||1;[d,m]=Array.from(Ro(d,m,i,1)),this.uniforms.stereoBend.value=i,this.viewMatrix.set(2/p,0,0,-(2*c+p)/p,0,2/f,0,-(2*u+f)/f,0,0,2/m,-(2*d+m)/m,0,0,0,1);const g=this.composer(r,o,a,s,null,h);return this.viewMatrix.multiplyMatrices(g,this.viewMatrix),t["view.range"]||e.stereographic?this.trigger({type:"view.range"}):void 0}vertex(t,e){return 1===e&&t.pipe("stereographic.position",this.uniforms),super.vertex(t,e)}}Hl.initClass();class Gl extends Nl{static initClass(){this.traits=["node","object","visible","view","view4","stereographic","vertex"]}make(){super.make(),this.uniforms={basisOffset:this._attributes.make(this._types.vec4()),basisScale:this._attributes.make(this._types.vec4()),stereoBend:this.node.attributes["stereographic.bend"]},this.basisScale=this.uniforms.basisScale.value,this.basisOffset=this.uniforms.basisOffset.value}unmake(){super.unmake(),delete this.basisScale,delete this.basisOffset,delete this.uniforms}change(t,e,n){let i;if(!(e.view||e.view4||e.stereographic||n))return;this.bend=i=this.props.bend;const r=this.props.position,s=this.props.scale,a=this.props.range,{x:o}=a[0],l=a[1].x,h=a[2].x;let c=a[3].x;const u=a[0].y-o||1,d=a[1].y-l||1,p=a[2].y-h||1;let f=a[3].y-c||1;const m=function(t,e){t.x*=e.x,t.y*=e.y,t.z*=e.z,t.w*=e.w};[c,f]=Array.from(Ro(c,f,i,1)),this.basisScale.set(2/u,2/d,2/p,2/f),this.basisOffset.set(-(2*o+u)/u,-(2*l+d)/d,-(2*h+p)/p,-(2*c+f)/f),m(this.basisScale,s),m(this.basisOffset,s),this.basisOffset.add(r),(t["view.range"]||e.stereographic)&&this.trigger({type:"view.range"})}vertex(t,e){return 1===e&&t.pipe("stereographic4.position",this.uniforms),super.vertex(t,e)}}Gl.initClass();class jl extends za{static initClass(){this.traits=["node","bind","shader"],this.freeform=!0}init(){return this.shader=null}make(){const{language:t,code:e}=this.props;if("glsl"!==t)throw new Error("GLSL required");this._helpers.bind.make([{to:"shader.sources",trait:"source",multiple:!0}]);const n=this._shaders.fetch(e),i=this._types,r={},s=t=>{let e;switch(t){case"i":return i.int();case"f":return i.number();case"v2":return i.vec2();case"v3":return i.vec3();case"v4":return i.vec4();case"m3":return i.mat3();case"m4":return i.mat4();case"t":return i.object();default:return e=t.split(""),"v"===e.pop()?i.array(s(e.join(""))):null}};for(const t of Array.from(n._signatures.uniform)){let e;(e=s(t.type))&&(r[t.name]=e)}return this.reconfigure({props:{uniform:r}})}made(){return this.trigger({type:"source.rebuild"})}unmake(){return this.shader=null}change(t,e,n){if(t["shader.uniforms"]||t["shader.code"]||t["shader.language"])return this.rebuild()}shaderBind(t){let e,n,i;null==t&&(t={});const{code:r}=this.props;for(e in this.node.attributes)i=this.node.attributes[e],null!=i.type&&null!=i.short&&"uniform"===i.ns&&null==t[i.short]&&(t[i.short]=i);if(null!=(n=this.props.uniforms))for(e in n)i=n[e],t[e]=i;const s=this._shaders.shader();if(null!=this.bind.sources)for(const t of Array.from(this.bind.sources))s.require(t.sourceShader(this._shaders.shader()));return s.pipe(r,t)}}jl.initClass();const ql={axis:zo,face:Oo,grid:Io,line:No,point:Fo,strip:Uo,surface:Bo,ticks:Vo,vector:Ho,view:Nl,cartesian:Fl,cartesian4:Ul,polar:Bl,spherical:Vl,stereographic:Hl,stereographic4:Gl,transform:nl,transform4:il,vertex:rl,fragment:sl,layer:al,mask:ol,array:_o,interval:yo,matrix:bo,area:wo,voxel:So,volume:Mo,scale:Do,html:Go,dom:jo,text:qo,format:Yo,label:$o,retext:Ko,clamp:ll,grow:hl,join:cl,lerp:ul,memo:dl,readback:pl,resample:Zo,repeat:fl,swizzle:ml,spread:gl,split:vl,slice:xl,subdivide:_l,transpose:bl,group:Ia,inherit:Na,root:Fa,unit:Ua,shader:jl,camera:ja,rtt:Ol,compose:Il,clock:Jo,now:Qo,move:Sl,play:Dl,present:kl,reveal:Pl,slide:Ll,step:zl},Wl={array(t,e,n=null){const i=t.lerp?function(e,n,i,r){for(let s=0,a=Math.min(e.length,n.length),o=0<=a;o?s<a:s>a;o?s++:s--)i[s]=t.lerp(e[s],n[s],i[s],r);return i}:void 0,r=t.op?function(e,n,i,r){for(let s=0,a=Math.min(e.length,n.length),o=0<=a;o?s<a:s>a;o?s++:s--)i[s]=t.op(e[s],n[s],i[s],r);return i}:void 0;return null==n||n instanceof Array||(n=[n]),{uniform:()=>t.uniform?t.uniform()+"v":void 0,make:()=>null!=n?n.slice():e?function(t,e,n){const i=[],r=t<e,s=n?r?e+1:e-1:e;for(let e=t;r?e<s:e>s;r?e++:e--)i.push(e);return i}(0,e,!1).map((e=>t.make())):[],validate(n,i,r){n instanceof Array||(n=[n]);for(let s=0,a=i.length=e||n.length,o=0<=a;o?s<a:s>a;o?s++:s--){const e=null!=n[s]?n[s]:t.make();i[s]=t.validate(e,i[s],r)}return i},equals(e,n){const i=e.length,r=n.length;if(i!==r)return!1;for(let s=0,a=Math.min(i,r),o=0<=a;o?s<a:s>a;o?s++:s--)if(!("function"==typeof t.equals?t.equals(e[s],n[s]):void 0))return!1;return!0},lerp:i,op:r,clone:e=>Array.from(e).map((e=>t.clone(e)))}},letters(t,e,n=null){if(null!=n){n===""+n&&(n=n.split(""));for(let e=0;e<n.length;e++){const i=n[e];n[e]=t.validate(i,i)}}const i=Xl.array(t,e,n);return{uniform:()=>i.uniform(),make:()=>i.make(),validate:(t,e,n)=>(t===""+t&&(t=t.split("")),i.validate(t,e,n)),equals:(t,e)=>i.equals(t,e),clone:i.clone}},nullable(t,e){null==e&&(e=!1);let n=e?t.make():null;const i=t.emitter?function(e,n){return null==n?e:null==e?n:t.emitter(e,n)}:void 0;return{make:()=>n,validate:(e,n,i)=>null===e?e:(null===n&&(n=t.make()),t.validate(e,n,i)),uniform:()=>"function"==typeof t.uniform?t.uniform():void 0,equals(e,n){let i;const r=null===e,s=null===n;return!(!r||!s)||!(r^s)&&(null!=(i="function"==typeof t.equals?t.equals(e,n):void 0)?i:e===n)},lerp:t.lerp?function(e,i,r,s){return null===e||null===i?s<.5?e:i:(null==r&&(r=t.make()),n=t.lerp(e,i,r,s),r)}:void 0,op:t.op?function(e,i,r,s){return null===e||null===i?null:(null==r&&(r=t.make()),n=t.op(e,i,r,s),n)}:void 0,emitter:i}},enum(t,e,n){let i;null==e&&(e=[]),null==n&&(n={});let r=0;const s={};for(i of Array.from(e))i!==+i&&null==n[i]&&(n[i]=r++);for(i of Array.from(e))i===+i&&(s[i]=i);for(i in n)r=n[i],s[r]=!0;return null==s[t]&&(t=n[t]),{enum:()=>n,make:()=>t,validate(t,e,i){const r=s[t]?t:n[t];return null!=r?r:i()}}},enumber(t,e,n){null==n&&(n={});const i=Xl.enum(t,e,n);return{enum:i.enum,uniform:()=>"f",make(){let e;return null!=(e=i.make())?e:+t},validate:(t,e,n)=>t===+t?t:i.validate(t,e,n),op:(t,e,n,i)=>i(t,e)}},select:t=>(null==t&&(t="<"),{make:()=>t,validate:(t,e,n)=>"string"==typeof t||"object"==typeof t?t:n()}),bool:t=>(t=!!t,{uniform:()=>"f",make:()=>t,validate:(t,e,n)=>!!t}),int:t=>(null==t&&(t=0),t=+Math.round(t),{uniform:()=>"i",make:()=>t,validate(t,e,n){let i;return t!==(i=+t)?n():Math.round(i)||0},op:(t,e,n,i)=>i(t,e)}),round:t=>(null==t&&(t=0),t=+Math.round(t),{uniform:()=>"f",make:()=>t,validate(t,e,n){let i;return t!==(i=+t)?n():Math.round(i)||0},op:(t,e,n,i)=>i(t,e)}),number:t=>(null==t&&(t=0),{uniform:()=>"f",make:()=>+t,validate(t,e,n){let i;return t!==(i=+t)?n():i||0},op:(t,e,n,i)=>i(t,e)}),positive:(t,e)=>(null==e&&(e=!1),{uniform:t.uniform,make:t.make,validate:(n,i,r)=>(n=t.validate(n,i,r))<0||e&&n<=0?r():n,op:(t,e,n,i)=>i(t,e)}),string:t=>(null==t&&(t=""),{make:()=>""+t,validate(t,e,n){let i;return t!==(i=""+t)?n():i}}),func:()=>({make:()=>function(){},validate:(t,e,n)=>"function"==typeof t?t:n()}),emitter:()=>({make:()=>t=>t(1,1,1,1),validate:(t,e,n)=>"function"==typeof t?t:n(),emitter:(t,e)=>Ka(t,e)}),object:t=>({make:()=>null!=t?t:{},validate:(t,e,n)=>"object"==typeof t?t:n(),clone:t=>JSON.parse(JSON.stringify(t))}),timestamp:(t=null)=>("string"==typeof t&&(t=Date.parse(t)),{uniform:()=>"f",make:()=>null!=t?t:+new Date,validate:(t,e,n)=>(t=Date.parse(t))!==+t?n():t,op:(t,e,n,i)=>i(t,e)}),vec2(t,e){null==t&&(t=0),null==e&&(e=0);const n=[t,e];return{uniform:()=>"v2",make:()=>new vt.Vector2(t,e),validate(i,r,s){if(i===+i&&(i=[i]),i instanceof vt.Vector2)r.copy(i);else if(i instanceof Array)i=i.concat(n.slice(i.length)),r.set.apply(r,i);else{if(null==i)return s();{const n=null!=i.x?i.x:t,s=null!=i.y?i.y:e;r.set(n,s)}}return r},equals:(t,e)=>t.x===e.x&&t.y===e.y,op:(t,e,n,i)=>(n.x=i(t.x,e.x),n.y=i(t.y,e.y),n)}},ivec2(t,e){null==t&&(t=0),null==e&&(e=0);const n=Xl.vec2(t,e),{validate:i}=n;return n.validate=function(t,e,n){return i(t,e,n),e.x=Math.round(e.x),e.y=Math.round(e.y),e},n},vec3(t,e,n){null==t&&(t=0),null==e&&(e=0),null==n&&(n=0);const i=[t,e,n];return{uniform:()=>"v3",make:()=>new vt.Vector3(t,e,n),validate(r,s,a){if(r===+r&&(r=[r]),r instanceof vt.Vector3)s.copy(r);else if(r instanceof Array)r=r.concat(i.slice(r.length)),s.set.apply(s,r);else{if(null==r)return a();{const i=null!=r.x?r.x:t,a=null!=r.y?r.y:e,o=null!=r.z?r.z:n;s.set(i,a,o)}}return s},equals:(t,e)=>t.x===e.x&&t.y===e.y&&t.z===e.z,op:(t,e,n,i)=>(n.x=i(t.x,e.x),n.y=i(t.y,e.y),n.z=i(t.z,e.z),n)}},ivec3(t,e,n){null==t&&(t=0),null==e&&(e=0),null==n&&(n=0);const i=Xl.vec3(t,e,n),{validate:r}=i;return i.validate=function(t,e,n){return r(t,e,n),e.x=Math.round(e.x),e.y=Math.round(e.y),e.z=Math.round(e.z),e},i},vec4(t,e,n,i){null==t&&(t=0),null==e&&(e=0),null==n&&(n=0),null==i&&(i=0);const r=[t,e,n,i];return{uniform:()=>"v4",make:()=>new vt.Vector4(t,e,n,i),validate(s,a,o){if(s===+s&&(s=[s]),s instanceof vt.Vector4)a.copy(s);else if(s instanceof Array)s=s.concat(r.slice(s.length)),a.set.apply(a,s);else{if(null==s)return o();{const r=null!=s.x?s.x:t,o=null!=s.y?s.y:e,l=null!=s.z?s.z:n,h=null!=s.w?s.w:i;a.set(r,o,l,h)}}return a},equals:(t,e)=>t.x===e.x&&t.y===e.y&&t.z===e.z&&t.w===e.w,op:(t,e,n,i)=>(n.x=i(t.x,e.x),n.y=i(t.y,e.y),n.z=i(t.z,e.z),n.w=i(t.w,e.w),n)}},ivec4(t,e,n,i){null==t&&(t=0),null==e&&(e=0),null==n&&(n=0),null==i&&(i=0);const r=Xl.vec4(t,e,n,i),{validate:s}=r;return r.validate=function(t,e,n){return s(t,e,n),e.x=Math.round(e.x),e.y=Math.round(e.y),e.z=Math.round(e.z),e.w=Math.round(e.w),e},r},mat3(t,e,n,i,r,s,a,o,l){null==t&&(t=1),null==e&&(e=0),null==n&&(n=0),null==i&&(i=0),null==r&&(r=1),null==s&&(s=0),null==a&&(a=0),null==o&&(o=0),null==l&&(l=1);const h=[t,e,n,i,r,s,a,o,l];return{uniform:()=>"m4",make(){const h=new vt.Matrix3;return h.set(t,e,n,i,r,s,a,o,l),h},validate(t,e,n){if(t instanceof vt.Matrix3)e.copy(t);else{if(!(t instanceof Array))return n();t=t.concat(h.slice(t.length)),e.set.apply(e,t)}return e}}},mat4(t,e,n,i,r,s,a,o,l,h,c,u,d,p,f,m){null==t&&(t=1),null==e&&(e=0),null==n&&(n=0),null==i&&(i=0),null==r&&(r=0),null==s&&(s=1),null==a&&(a=0),null==o&&(o=0),null==l&&(l=0),null==h&&(h=0),null==c&&(c=1),null==u&&(u=0),null==d&&(d=0),null==p&&(p=0),null==f&&(f=0),null==m&&(m=1);const g=[t,e,n,i,r,s,a,o,l,h,c,u,d,p,f,m];return{uniform:()=>"m4",make(){const g=new vt.Matrix4;return g.set(t,e,n,i,r,s,a,o,l,h,c,u,d,p,f,m),g},validate(t,e,n){if(t instanceof vt.Matrix4)e.copy(t);else{if(!(t instanceof Array))return n();t=t.concat(g.slice(t.length)),e.set.apply(e,t)}return e}}},quat(t,e,n,i){null==t&&(t=0),null==e&&(e=0),null==n&&(n=0),null==i&&(i=1);const r=Xl.vec4(t,e,n,i);return{uniform:()=>"v4",make:()=>new vt.Quaternion,validate:(t,e,n)=>(t instanceof vt.Quaternion?e.copy(t):e=r.validate(t,e,n),e.normalize(),e),equals:(t,e)=>t.x===e.x&&t.y===e.y&&t.z===e.z&&t.w===e.w,op:(t,e,n,i)=>(n.x=i(t.x,e.x),n.y=i(t.y,e.y),n.z=i(t.z,e.z),n.w=i(t.w,e.w),n.normalize(),n),lerp:(t,e,n,i)=>(n.slerpQuaternions?n.slerpQuaternions(t,e,i):vt.Quaternion.slerp(t,e,n,i),n)}},color(t,e,n){null==t&&(t=.5),null==e&&(e=.5),null==n&&(n=.5);const i=[t,e,n];return{uniform:()=>"c",make:()=>new vt.Color(t,e,n),validate(r,s,a){if(r===""+r?r=(new vt.Color).setStyle(r):r===+r&&(r=new vt.Color(r)),r instanceof vt.Color)s.copy(r);else if(r instanceof Array)r=r.concat(i.slice(r.length)),s.setRGB.apply(s,r);else{if(null==r)return a();{const i=null!=r.r?r.r:t,a=null!=r.g?r.g:e,o=null!=r.b?r.b:n;s.set(i,a,o)}}return s},equals:(t,e)=>t.r===e.r&&t.g===e.g&&t.b===e.b,op:(t,e,n,i)=>(n.r=i(t.r,e.r),n.g=i(t.g,e.g),n.b=i(t.b,e.b),n)}},axis(t,e){let n;null==t&&(t=1),null==e&&(e=!1);const i={x:1,y:2,z:3,w:4,W:1,H:2,D:3,I:4,zero:0,null:0,width:1,height:2,depth:3,items:4},r=e?[0,1,2,3,4]:[1,2,3,4];return null!=(n=i[t])&&(t=n),{make:()=>t,validate(t,e,s){let a;return null!=(n=i[t])&&(t=n),t=null!=(a=Math.round(t))?a:0,Array.from(r).includes(t)?t:s()}}},transpose(t){null==t&&(t=[1,2,3,4]);const e=Xl.letters(Xl.axis(null,!1),0,t),n=Xl.letters(Xl.axis(null,!1),4,t);return{make:()=>n.make(),validate(t,i,r){let s=[1,2,3,4];if(e.validate(t,s,r),s.length<4){const t=[1,2,3,4].filter((t=>-1===s.indexOf(t)));s=s.concat(t)}return Array.from(s).map(((t,e)=>s.indexOf(t)===e)).indexOf(!1)<0?n.validate(s,i,r):r()},equals:n.equals,clone:n.clone}},swizzle(t,e=null){null==t&&(t=[1,2,3,4]),null==e&&(e=t.length),t=t.slice(0,e);const n=Xl.letters(Xl.axis(null,!1),0,t),i=Xl.letters(Xl.axis(null,!0),e,t);return{make:()=>i.make(),validate(r,s,a){let o=t.slice();return n.validate(r,o,a),o.length<e&&(o=o.concat([0,0,0,0]).slice(0,e)),i.validate(o,s,a)},equals:i.equals,clone:i.clone}},classes(){const t=Xl.array(Xl.string());return{make:()=>t.make(),validate:(e,n,i)=>(e===""+e&&(e=e.split(" ")),e=e.filter((t=>!!t.length)),t.validate(e,n,i)),equals:t.equals,clone:t.clone}},blending(t){null==t&&(t="normal");return Xl.enum(t,["no","normal","add","subtract","multiply","custom"])},filter(t){null==t&&(t="nearest");const e={nearest:vt.NearestFilter,nearestMipMapNearest:vt.NearestMipMapNearestFilter,nearestMipMapLinear:vt.NearestMipMapLinearFilter,linear:vt.LinearFilter,linearMipMapNearest:vt.LinearMipMapNearestFilter,linearMipmapLinear:vt.LinearMipMapLinearFilter};return Xl.enum(t,[],e)},type(t){null==t&&(t="unsignedByte");const e={unsignedByte:vt.UnsignedByteType,byte:vt.ByteType,short:vt.ShortType,unsignedShort:vt.UnsignedShortType,int:vt.IntType,unsignedInt:vt.UnsignedIntType,float:vt.FloatType};return Xl.enum(t,[],e)},scale(t){null==t&&(t="linear");return Xl.enum(t,["linear","log"])},mapping(t){null==t&&(t="relative");return Xl.enum(t,["relative","absolute"])},indexing(t){null==t&&(t="original");return Xl.enum(t,["original","final"])},shape(t){null==t&&(t="circle");return Xl.enum(t,["circle","square","diamond","up","down","left","right"])},join(t){null==t&&(t="miter");return Xl.enum(t,["miter","round","bevel"])},stroke(t){null==t&&(t="solid");return Xl.enum(t,["solid","dotted","dashed"])},vertexPass(t){null==t&&(t="view");return Xl.enum(t,["data","view","world","eye"])},fragmentPass(t){null==t&&(t="light");return Xl.enum(t,["color","light","rgba"])},ease(t){null==t&&(t="linear");return Xl.enum(t,["linear","cosine","binary","hold"])},fit(t){null==t&&(t="contain");return Xl.enum(t,["x","y","contain","cover"])},anchor(t){null==t&&(t="middle");return Xl.enumber(t,[],{first:1,middle:0,last:-1})},transitionState(t){null==t&&(t="enter");return Xl.enumber(t,[],{enter:-1,visible:0,exit:1})},font(t){null==t&&(t="sans-serif");const e=Lo;t instanceof Array||(t=e(t));const n=Xl.array(Xl.string(),0,t);return{make:()=>n.make(),validate(t,i,r){try{t instanceof Array||(t=e(t))}catch(t){return r()}return t=t.filter((t=>!!t.length)),n.validate(t,i,r)},equals:n.equals,clone:n.clone}},data:t=>(null==t&&(t=[]),{make:()=>[],validate:(t,e,n)=>t instanceof Array||null!=(null!=t?t.length:void 0)?t:n(),emitter:(t,e)=>Ja(t,e)})},Xl=function(t){for(const e in t){const n=t[e];t[e]=(t=>function(){const e=t.apply(t,arguments);return null==e.validate&&(e.validate=t=>null!=t),null==e.equals&&(e.equals=(t,e)=>t===e),null==e.clone&&(e.clone=function(t){let e;return null!=(e=Yl(t,"clone",(t=>t.clone())))?e:t}),e})(n)}return t}(Wl);function Yl(t,e,n){return null!=t&&"function"==typeof t[e]?n(t,e):void 0}const $l={node:{id:Xl.nullable(Xl.string()),classes:Xl.classes()},entity:{active:Xl.bool(!0)},object:{visible:Xl.bool(!0)},unit:{scale:Xl.nullable(Xl.number()),fov:Xl.nullable(Xl.number()),focus:Xl.nullable(Xl.number(1),!0)},span:{range:Xl.nullable(Xl.vec2(-1,1))},view:{range:Xl.array(Xl.vec2(-1,1),4)},view3:{position:Xl.vec3(),quaternion:Xl.quat(),rotation:Xl.vec3(),scale:Xl.vec3(1,1,1),eulerOrder:Xl.swizzle("xyz")},view4:{position:Xl.vec4(),scale:Xl.vec4(1,1,1,1)},layer:{depth:Xl.number(1),fit:Xl.fit("y")},vertex:{pass:Xl.vertexPass()},fragment:{pass:Xl.fragmentPass(),gamma:Xl.bool(!1)},transform3:{position:Xl.vec3(),quaternion:Xl.quat(),rotation:Xl.vec3(),eulerOrder:Xl.swizzle("xyz"),scale:Xl.vec3(1,1,1),matrix:Xl.mat4(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)},transform4:{position:Xl.vec4(),scale:Xl.vec4(1,1,1,1),matrix:Xl.mat4(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)},camera:{proxy:Xl.bool(!1),position:Xl.nullable(Xl.vec3()),quaternion:Xl.nullable(Xl.quat()),rotation:Xl.nullable(Xl.vec3()),lookAt:Xl.nullable(Xl.vec3()),up:Xl.nullable(Xl.vec3()),eulerOrder:Xl.swizzle("xyz"),fov:Xl.nullable(Xl.number(1))},polar:{bend:Xl.number(1),helix:Xl.number(0)},spherical:{bend:Xl.number(1)},stereographic:{bend:Xl.number(1)},interval:{axis:Xl.axis()},area:{axes:Xl.swizzle([1,2],2)},volume:{axes:Xl.swizzle([1,2,3],3)},origin:{origin:Xl.vec4()},scale:{divide:Xl.number(10),unit:Xl.number(1),base:Xl.number(10),mode:Xl.scale(),start:Xl.bool(!0),end:Xl.bool(!0),zero:Xl.bool(!0),factor:Xl.positive(Xl.number(1)),nice:Xl.bool(!0)},grid:{lineX:Xl.bool(!0),lineY:Xl.bool(!0),crossed:Xl.bool(!1),closedX:Xl.bool(!1),closedY:Xl.bool(!1)},axis:{detail:Xl.int(1),crossed:Xl.bool(!1)},data:{data:Xl.nullable(Xl.data()),expr:Xl.nullable(Xl.emitter()),bind:Xl.nullable(Xl.func()),live:Xl.bool(!0)},buffer:{channels:Xl.enum(4,[1,2,3,4]),items:Xl.int(1),fps:Xl.nullable(Xl.int(60)),hurry:Xl.int(5),limit:Xl.int(60),realtime:Xl.bool(!1),observe:Xl.bool(!1),aligned:Xl.bool(!1)},sampler:{centered:Xl.bool(!1),padding:Xl.number(0)},array:{width:Xl.nullable(Xl.positive(Xl.int(1),!0)),bufferWidth:Xl.int(1),history:Xl.int(1)},matrix:{width:Xl.nullable(Xl.positive(Xl.int(1),!0)),height:Xl.nullable(Xl.positive(Xl.int(1),!0)),history:Xl.int(1),bufferWidth:Xl.int(1),bufferHeight:Xl.int(1)},voxel:{width:Xl.nullable(Xl.positive(Xl.int(1),!0)),height:Xl.nullable(Xl.positive(Xl.int(1),!0)),depth:Xl.nullable(Xl.positive(Xl.int(1),!0)),bufferWidth:Xl.int(1),bufferHeight:Xl.int(1),bufferDepth:Xl.int(1)},resolve:{expr:Xl.nullable(Xl.func()),items:Xl.int(1)},style:{opacity:Xl.positive(Xl.number(1)),color:Xl.color(),blending:Xl.blending(),zWrite:Xl.bool(!0),zTest:Xl.bool(!0),zIndex:Xl.positive(Xl.round()),zBias:Xl.number(0),zOrder:Xl.nullable(Xl.int())},geometry:{points:Xl.select(),colors:Xl.nullable(Xl.select())},point:{size:Xl.positive(Xl.number(4)),sizes:Xl.nullable(Xl.select()),shape:Xl.shape(),optical:Xl.bool(!0),fill:Xl.bool(!0),depth:Xl.number(1)},line:{width:Xl.positive(Xl.number(2)),depth:Xl.positive(Xl.number(1)),join:Xl.join(),stroke:Xl.stroke(),proximity:Xl.nullable(Xl.number(1/0)),closed:Xl.bool(!1)},mesh:{fill:Xl.bool(!0),shaded:Xl.bool(!1),map:Xl.nullable(Xl.select()),lineBias:Xl.number(5)},strip:{line:Xl.bool(!1)},face:{line:Xl.bool(!1)},arrow:{size:Xl.number(3),start:Xl.bool(!1),end:Xl.bool(!1)},ticks:{normal:Xl.vec3(0,0,1),size:Xl.positive(Xl.number(10)),epsilon:Xl.positive(Xl.number(.001))},attach:{offset:Xl.vec2(0,-20),snap:Xl.bool(!1),depth:Xl.number(0)},format:{digits:Xl.nullable(Xl.positive(Xl.number(3))),data:Xl.nullable(Xl.data()),expr:Xl.nullable(Xl.func()),live:Xl.bool(!0)},font:{font:Xl.font("sans-serif"),style:Xl.string(),variant:Xl.string(),weight:Xl.string(),detail:Xl.number(24),sdf:Xl.number(5)},label:{text:Xl.select(),size:Xl.number(16),outline:Xl.number(2),expand:Xl.number(0),background:Xl.color(1,1,1)},overlay:{opacity:Xl.number(1),zIndex:Xl.positive(Xl.round(0))},dom:{points:Xl.select(),html:Xl.select(),size:Xl.number(16),outline:Xl.number(2),zoom:Xl.number(1),color:Xl.nullable(Xl.color()),attributes:Xl.nullable(Xl.object()),pointerEvents:Xl.bool(!1)},texture:{minFilter:Xl.filter("nearest"),magFilter:Xl.filter("nearest"),type:Xl.type("float")},shader:{sources:Xl.nullable(Xl.select()),language:Xl.string("glsl"),code:Xl.string(),uniforms:Xl.nullable(Xl.object())},include:{shader:Xl.select()},operator:{source:Xl.select()},spread:{unit:Xl.mapping(),items:Xl.nullable(Xl.vec4()),width:Xl.nullable(Xl.vec4()),height:Xl.nullable(Xl.vec4()),depth:Xl.nullable(Xl.vec4()),alignItems:Xl.anchor(),alignWidth:Xl.anchor(),alignHeight:Xl.anchor(),alignDepth:Xl.anchor()},grow:{scale:Xl.number(1),items:Xl.nullable(Xl.anchor()),width:Xl.nullable(Xl.anchor()),height:Xl.nullable(Xl.anchor()),depth:Xl.nullable(Xl.anchor())},split:{order:Xl.transpose("wxyz"),axis:Xl.nullable(Xl.axis()),length:Xl.int(1),overlap:Xl.int(0)},join:{order:Xl.transpose("wxyz"),axis:Xl.nullable(Xl.axis()),overlap:Xl.int(0)},swizzle:{order:Xl.swizzle()},transpose:{order:Xl.transpose()},repeat:{items:Xl.number(1),width:Xl.number(1),height:Xl.number(1),depth:Xl.number(1)},slice:{items:Xl.nullable(Xl.vec2()),width:Xl.nullable(Xl.vec2()),height:Xl.nullable(Xl.vec2()),depth:Xl.nullable(Xl.vec2())},lerp:{size:Xl.mapping("absolute"),items:Xl.nullable(Xl.number()),width:Xl.nullable(Xl.number()),height:Xl.nullable(Xl.number()),depth:Xl.nullable(Xl.number())},subdivide:{items:Xl.nullable(Xl.positive(Xl.int(),!0)),width:Xl.nullable(Xl.positive(Xl.int(),!0)),height:Xl.nullable(Xl.positive(Xl.int(),!0)),depth:Xl.nullable(Xl.positive(Xl.int(),!0)),bevel:Xl.number(1),lerp:Xl.bool(!0)},resample:{indices:Xl.number(4),channels:Xl.number(4),sample:Xl.mapping(),size:Xl.mapping("absolute"),items:Xl.nullable(Xl.number()),width:Xl.nullable(Xl.number()),height:Xl.nullable(Xl.number()),depth:Xl.nullable(Xl.number())},readback:{type:Xl.type("float"),expr:Xl.nullable(Xl.func()),data:Xl.data(),channels:Xl.enum(4,[1,2,3,4]),items:Xl.nullable(Xl.int()),width:Xl.nullable(Xl.int()),height:Xl.nullable(Xl.int()),depth:Xl.nullable(Xl.int())},root:{speed:Xl.number(1),camera:Xl.select("[camera]")},inherit:{source:Xl.select(),traits:Xl.array(Xl.string())},rtt:{size:Xl.mapping("absolute"),width:Xl.nullable(Xl.number()),height:Xl.nullable(Xl.number()),history:Xl.int(1)},compose:{alpha:Xl.bool(!1)},present:{index:Xl.int(1),directed:Xl.bool(!0),length:Xl.number(0)},slide:{order:Xl.nullable(Xl.int(0)),steps:Xl.number(1),early:Xl.int(0),late:Xl.int(0),from:Xl.nullable(Xl.int(0)),to:Xl.nullable(Xl.int(1))},transition:{stagger:Xl.vec4(),enter:Xl.nullable(Xl.number(1)),exit:Xl.nullable(Xl.number(1)),delay:Xl.number(0),delayEnter:Xl.nullable(Xl.number(0)),delayExit:Xl.nullable(Xl.number(0)),duration:Xl.number(.3),durationEnter:Xl.nullable(Xl.number(0)),durationExit:Xl.nullable(Xl.number(0))},move:{from:Xl.vec4(),to:Xl.vec4()},seek:{seek:Xl.nullable(Xl.number(0))},track:{target:Xl.select(),script:Xl.object({}),ease:Xl.ease("cosine")},trigger:{trigger:Xl.nullable(Xl.int(1),!0)},step:{playback:Xl.ease("linear"),stops:Xl.nullable(Xl.array(Xl.number())),delay:Xl.number(0),duration:Xl.number(.3),pace:Xl.number(0),speed:Xl.number(1),rewind:Xl.number(2),skip:Xl.bool(!0),realtime:Xl.bool(!1)},play:{delay:Xl.number(0),pace:Xl.number(1),speed:Xl.number(1),from:Xl.number(0),to:Xl.number(1/0),realtime:Xl.bool(!1),loop:Xl.bool(!1)},now:{now:Xl.nullable(Xl.timestamp()),seek:Xl.nullable(Xl.number(0)),pace:Xl.number(1),speed:Xl.number(1)}},Zl=function(t,e,n,i,r,s,a,o,l,h){let c,u,d;null==h&&(h=!0),n||(n=10),i||(i=1),r||(r=10),s||(s=1);const p=(e-t)/n;if(!h)return c=(()=>{let e,i;const r=[];for(u=0,i=n,e=0<=i;e?u<=i:u>=i;e?u++:u--)r.push(t+u*p);return r})(),a||c.shift(),o||c.pop(),l||(c=c.filter((t=>0!==t))),c;i||(i=1),r||(r=10);const f=i*Math.pow(r,Math.floor(Math.log(p/i)/Math.log(r))),m=r%2==0?[r/2,1,.5]:r%3==0?[r/3,1,1/3]:[1],g=(()=>{const t=[];for(d of Array.from(m))t.push(f*d);return t})();let v=1/0,x=g.reduce((function(t,e){d=e/p;const n=Math.max(d,1/d);return n<v?(v=n,e):t}),f);return x*=s,t=Math.ceil(t/x+ +!a)*x,e=(Math.floor(e/x)-+!o)*x,n=Math.ceil((e-t)/x),c=(()=>{let e,i;const r=[];for(u=0,i=n,e=0<=i;e?u<=i:u>=i;e?u++:u--)r.push(t+u*x);return r})(),l||(c=c.filter((t=>0!==t))),c},Kl=function(t,e,n,i,r,s,a,o,l,h){throw new Error("Log ticks not yet implemented.")},Jl=function(t,e,n,i,r,s,a,o,l,h,c){switch(t){case 0:return Zl(e,n,i,r,s,a,o,l,h,c);case 1:return Kl(e,n,i,r,s,a,o,l,h,c)}},Ql={bind:{make(t){null==this.bind&&(this.bind={}),null==this.bound&&(this.bound=[]);for(const e of Array.from(t)){let{callback:t}=e;const{to:n,trait:i,optional:r,unique:s,multiple:a}=e;null==t&&(t=this.rebuild);const o=n.split(/\./g).pop(),l=this._get(n);let h=null;if(null!=l){let e=this,n=!1;for(;!n;){e=h=this._attach(l,i,t,this,e,r,a);const o=s&&(null==h||this.bound.indexOf(h)<0);n=a||r||!s||o}}if(null!=h)if(null!=this.resize&&this._listen(h,"source.resize",this.resize),t&&this._listen(h,"source.rebuild",t),a)for(const t of Array.from(h))this.bound.push(t);else this.bound.push(h);this.bind[o]=h}return null},unmake(){if(this.bind)return delete this.bind,delete this.bound}},span:{make(){return this.spanView=this._inherit("view"),this._listen("view","view.range",(()=>this.trigger({type:"span.range"})))},unmake(){return delete this.spanView},get:function(){const t=new vt.Vector2(-1,1);return function(e,n){let i;const r=this._get(e+"span.range");return null!=r?r:null!=(i=null!=this.spanView?this.spanView.axis(n):void 0)?i:t}}()},scale:{divide(t){const e=this._get(t+"scale.divide"),n=this._get(t+"scale.factor");return Math.round(2.5*e/n)},generate(t,e,n,i){const r=this._get(t+"scale.mode"),s=this._get(t+"scale.divide"),a=this._get(t+"scale.unit"),o=this._get(t+"scale.base"),l=this._get(t+"scale.factor"),h=this._get(t+"scale.start"),c=this._get(t+"scale.end"),u=this._get(t+"scale.zero"),d=this._get(t+"scale.nice"),p=Jl(r,n,i,s,a,o,l,h,c,u,d);return e.copy(p),p}},style:{uniforms(){return{styleColor:this.node.attributes["style.color"],styleOpacity:this.node.attributes["style.opacity"],styleZBias:this.node.attributes["style.zBias"],styleZIndex:this.node.attributes["style.zIndex"]}}},arrow:{uniforms(){const{start:t}=this.props,{end:e}=this.props,n=this._attributes.make(this._types.number(1.25/(t+e))),i=this._attributes.make(this._types.vec2(+t,+e)),r=this.node.attributes["arrow.size"];return{clipStyle:i,clipRange:r,clipSpace:n,arrowSpace:n,arrowSize:r}}},point:{uniforms(){return{pointSize:this.node.attributes["point.size"],pointDepth:this.node.attributes["point.depth"]}}},line:{uniforms(){return{lineWidth:this.node.attributes["line.width"],lineDepth:this.node.attributes["line.depth"],lineProximity:this.node.attributes["line.proximity"]}}},surface:{uniforms:()=>({})},shade:{pipeline(t){if(!this._inherit("fragment"))return t;null==t&&(t=this._shaders.shader());for(let e=0;e<=2;e++)t=eh(this._inherit("fragment"),(n=>n.fragment(t,e)));return t.pipe("fragment.map.rgba"),t},map(t){return t?this._shaders.shader().pipe("mesh.map.uvwo").pipe(t):t}},position:{pipeline(t){if(!this._inherit("vertex"))return t;null==t&&(t=this._shaders.shader());for(let e=0;e<=3;e++)t=eh(this._inherit("vertex"),(n=>n.vertex(t,e)));return t},swizzle(t,e){if(t)return this._shaders.shader().pipe(uo(e)).pipe(t)},swizzle2(t,e,n){if(t)return this._shaders.shader().split().pipe(uo(e)).next().pipe(uo(n)).join().pipe(t)}},visible:{make(){const t={type:"visible.change"};let e=null;this.setVisible=function(t){return null!=t&&(e=t),n()};const n=()=>{let n;const r=this.isVisible;let s=null==(n=null!=e?e:this._get("object.visible"))||n;if(null!=i&&s&&(s=i.isVisible),this.isVisible=s,r!==this.isVisible)return this.trigger(t)},i=this._inherit("visible");return i&&this._listen(i,"visible.change",n),this.is("object")&&this._listen(this.node,"change:object",n),n()},unmake(){return delete this.isVisible}},active:{make(){const t={type:"active.change"};let e=null;this.setActive=function(t){return null!=t&&(e=t),n()};const n=()=>{let n;const r=this.isActive;let s=null==(n=null!=e?e:this._get("entity.active"))||n;if(null!=i&&s&&(s=i.isActive),this.isActive=s,r!==this.isActive)return this.trigger(t)},i=this._inherit("active");return i&&this._listen(i,"active.change",n),this.is("entity")&&this._listen(this.node,"change:entity",n),n()},unmake(){return delete this.isActive}},object:{make(t){let e,n;null==t&&(t=[]),this.objects=t,this.renders=this.objects.reduce(((t,e)=>t.concat(e.renders)),[]);const i=this._inherit("scene");let r=e=n=null;const s=Array.from(this.traits).includes("style");r=1,e=vt.NormalBlending;let a=!0,o=!0;s&&(({opacity:r}=this.props),({blending:e}=this.props),({zOrder:n}=this.props),({zWrite:a}=this.props),({zTest:o}=this.props));const l=()=>{const t=null!=n?-n:this.node.order;return(null==this.isVisible||this.isVisible)&&r>0?s?(()=>{const n=[];for(const i of Array.from(this.objects))i.show(r<1,e,t),n.push(i.depth(a,o));return n})():(()=>{const n=[];for(const i of Array.from(this.objects))n.push(i.show(!0,e,t));return n})():(()=>{const t=[];for(const e of Array.from(this.objects))t.push(e.hide());return t})()};this._listen(this.node,"change:style",(t=>{const{changed:i}=t;let s=null;if(i["style.opacity"]&&(s=r=this.props.opacity),i["style.blending"]&&(s=e=this.props.blending),i["style.zOrder"]&&(s=n=this.props.zOrder),i["style.zWrite"]&&(s=a=this.props.zWrite),i["style.zTest"]&&(s=o=this.props.zTest),null!=s)return l()})),this._listen(this.node,"reindex",l),this._listen(this,"visible.change",l);for(const t of Array.from(this.objects))i.adopt(t);return l()},unmake(t){let e;if(null==t&&(t=!0),!this.objects)return;const n=this._inherit("scene");for(e of Array.from(this.objects))n.unadopt(e);return t?(()=>{const t=[];for(e of Array.from(this.objects))t.push(e.dispose());return t})():void 0},mask(){let t,e;if(t=this._inherit("mask"))return t.mask(e)}},unit:{make(){let t,e,n,i,r,s,a,o,l,h,c,u,d=Math.PI;this.unitUniforms={renderScaleInv:o=this._attributes.make(this._types.number(1)),renderScale:a=this._attributes.make(this._types.number(1)),renderAspect:i=this._attributes.make(this._types.number(1)),renderWidth:l=this._attributes.make(this._types.number(0)),renderHeight:r=this._attributes.make(this._types.number(0)),viewWidth:c=this._attributes.make(this._types.number(0)),viewHeight:h=this._attributes.make(this._types.number(0)),pixelRatio:e=this._attributes.make(this._types.number(1)),pixelUnit:n=this._attributes.make(this._types.number(1)),worldUnit:u=this._attributes.make(this._types.number(1)),focusDepth:t=this._attributes.make(this._types.number(1)),renderOdd:s=this._attributes.make(this._types.vec2())};const p=new vt.Vector3,f=new vt.Vector3,m=()=>{let m,v;if(null==(v=null!=g?g.getSize():void 0))return;d=Math.PI;const{scale:x}=this.props,{fov:_}=this.props,y=null!=this.props.focus?this.props.focus:this.inherit("unit").props.focus,b=null===x;let w=1;if(m=null!=g?g.getCamera():void 0){const t=m.projectionMatrix;p.set(0,-.5,1).applyMatrix4(t),f.set(0,.5,1).applyMatrix4(t),p.sub(f),w=p.y}const S=v.renderHeight/v.viewHeight,M=null!=_?w*Math.tan(_*d/360):1,T=b?S:v.renderHeight/x*M,E=v.renderHeight*w/2,A=T/E;return c.value=v.viewWidth,h.value=v.viewHeight,l.value=v.renderWidth,r.value=v.renderHeight,i.value=v.aspect,a.value=E,o.value=1/E,e.value=S,n.value=T,u.value=A,t.value=y,s.value.set(v.renderWidth%2,v.renderHeight%2).multiplyScalar(.5)},g=this.is("root")?this:this._inherit("root");return this._listen(g,"root.update",m),m()},unmake(){return delete this.unitUniforms},get(){const t={};for(const e in this.unitUniforms){const n=this.unitUniforms[e];t[e]=n.value}return t},uniforms(){return this.unitUniforms}}},th=function(t,e){const n={};for(const i of Array.from(e)){let e;if(e=Ql[i]){n[i]={};for(const r in e){const s=e[r];n[i][r]=s.bind(t)}}}return n};function eh(t,e){return null!=t?e(t):void 0}class nh{constructor(t,e){this.context=e,this.classes=t.Classes,this.helpers=t.Helpers}getTypes(){return Object.keys(this.classes)}make(t,e,n=null){null==e&&(e={});const i=this.classes[t];if(null==i)throw new Error(`Unknown primitive class \`${t}\``);const r=new i.model(t,i.defaults,e,n,i,this.context.attributes);return new i(r,this.context,this.helpers),r}}const ih=p;class rh{constructor(t,e){this.renderer=t,this.shaders=e,this.gl=this.renderer.getContext(),null==this.uniforms&&(this.uniforms={})}dispose(){this.uniforms=null}_adopt(t){for(const e in t){const n=t[e];this.uniforms[e]=n}}_set(t){for(const e in t){const n=t[e];null!=this.uniforms[e]&&(this.uniforms[e].value=n)}}}class sh extends vt.Object3D{constructor(){super(),this.rotationAutoUpdate=!1,this.frustumCulled=!1,this.matrixAutoUpdate=!1}}class ah extends rh{constructor(t,e,n){super(t,e,n),this.root=new sh,null!=(null!=n?n.scene:void 0)&&(this.scene=n.scene),null==this.scene&&(this.scene=new vt.Scene),this.pending=[],this.async=0,this.scratch=new vt.WebGLRenderTarget(1,1),this.camera=new vt.PerspectiveCamera}inject(t){return null!=t&&(this.scene=t),this.scene.add(this.root)}unject(){return null!=this.scene?this.scene.remove(this.root):void 0}add(t){return this.async?this.pending.push(t):this._add(t)}remove(t){if(this.pending=this.pending.filter((e=>e!==t)),null!=t.parent)return this._remove(t)}_add(t){return this.root.add(t)}_remove(t){return this.root.remove(t)}dispose(){if(null!=this.root.parent)return this.unject()}warmup(t){return this.async=+t||0}render(){if(!this.pending.length)return;const{children:t}=this.root,e=[];for(let t=0,n=this.async,i=0<=n;i?t<n:t>n;i?t++:t--){const t=this.pending.shift();if(!t)break;this._add(t),e.push(e)}const n=t.map((function(t){return t.visible}));t.map((t=>t.visible=!Array.from(e).includes(t)));const i=this.renderer.getRenderTarget();return this.renderer.setRenderTarget(this.scratch),this.renderer.render(this.scene,this.camera),this.renderer.setRenderTarget(i),t.map(((t,e)=>t.visible=n[e]))}toJSON(){return this.root.toJSON()}}class oh{constructor(t,e,n){this.classes=t,this.renderer=e,this.shaders=n}getTypes(){return Object.keys(this.classes)}make(t,e){return new this.classes[t](this.renderer,this.shaders,e)}}class lh extends rh{constructor(t,e,n){super(t,e),null==this.items&&(this.items=n.items||1),null==this.samples&&(this.samples=n.samples||1),null==this.channels&&(this.channels=n.channels||4),null==this.callback&&(this.callback=n.callback||function(){})}dispose(){return super.dispose()}update(){const t=this.fill();return this.write(t),t}setActive(t,e,n,i){}setCallback(t){this.callback=t}write(){}fill(){}generate(t){return Za(t,this.samples,this.channels,this.items)}}class hh{constructor(t,e,n,i,r){this.renderer=t,this.width=e,this.height=n,this.channels=i,this.n=this.width*this.height*this.channels;const s=this.renderer.getContext();this.gl=s;const a=null!=(null!=r?r.minFilter:void 0)?null!=r?r.minFilter:void 0:vt.NearestFilter,o=null!=(null!=r?r.magFilter:void 0)?null!=r?r.magFilter:void 0:vt.NearestFilter,l=null!=(null!=r?r.type:void 0)?null!=r?r.type:void 0:vt.FloatType;this.minFilter=Ba(s,a),this.magFilter=Ba(s,o),this.type=Ba(s,l),this.ctor=Va(l),this.build(r)}build(t){const{gl:e}=this,n=this.renderer.state;this.texture=e.createTexture(),this.format=[null,e.LUMINANCE,e.LUMINANCE_ALPHA,e.RGB,e.RGBA][this.channels],this.format3=[null,vt.LuminanceFormat,vt.LuminanceAlphaFormat,vt.RGBFormat,vt.RGBAFormat][this.channels],n.bindTexture(e.TEXTURE_2D,this.texture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,this.minFilter),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,this.magFilter),this.data=new this.ctor(this.n),e.pixelStorei(e.UNPACK_ALIGNMENT,1),e.texImage2D(e.TEXTURE_2D,0,this.format,this.width,this.height,0,this.format,this.type,this.data),this.textureObject=new vt.Texture(new Image,vt.UVMapping,vt.ClampToEdgeWrapping,vt.ClampToEdgeWrapping,null!=t?t.minFilter:void 0,null!=t?t.magFilter:void 0),this.textureProperties=this.renderer.properties.get(this.textureObject),this.textureProperties.__webglInit=!0,this.textureProperties.__webglTexture=this.texture,this.textureObject.format=this.format3,this.textureObject.type=vt.FloatType,this.textureObject.unpackAlignment=1,this.textureObject.flipY=!1,this.textureObject.generateMipmaps=!1,this.uniforms={dataResolution:{type:"v2",value:new vt.Vector2(1/this.width,1/this.height)},dataTexture:{type:"t",value:this.textureObject}}}write(t,e,n,i,r){const{gl:s}=this;return this.renderer.state.bindTexture(s.TEXTURE_2D,this.texture),s.pixelStorei(s.UNPACK_ALIGNMENT,1),s.pixelStorei(s.UNPACK_FLIP_Y_WEBGL,!1),s.pixelStorei(s.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1),s.texSubImage2D(s.TEXTURE_2D,0,e,n,i,r,this.format,this.type,t)}dispose(){return this.gl.deleteTexture(this.texture),this.textureProperties.__webglInit=!1,this.textureProperties.__webglTexture=null,this.textureProperties=null,this.textureObject=this.texture=null}}class ch extends lh{constructor(t,e,n,i){null==i&&(i=!0);const r=n.width||1,s=n.height||1,a=n.depth||1,o=r*s*a;n.samples||(n.samples=o),super(t,e,n),this.width=r,this.height=s,this.depth=a,null==this.samples&&(this.samples=o),i&&this.build(n)}shader(t,e){null==e&&(e=4),this.items>1||this.depth>1?(4!==e&&t.pipe(lo(e,4)),t.pipe("map.xyzw.texture",this.uniforms)):2!==e&&t.pipe(ho(e,2));const n=this.wrap?".wrap":"";return t.pipe(`map.2d.data${n}`,this.uniforms),t.pipe("sample.2d",this.uniforms),this.channels<4&&t.pipe(uo(["0000","x000","xw00","xyz0"][this.channels])),t}build(t){this.data=new Float32Array(this.samples*this.channels*this.items),this.texture=new hh(this.renderer,this.items*this.width,this.height*this.depth,this.channels,t),this.filled=0,this.used=0,this._adopt(this.texture.uniforms),this._adopt({dataPointer:{type:"v2",value:new vt.Vector2},textureItems:{type:"f",value:this.items},textureHeight:{type:"f",value:this.height}}),this.dataPointer=this.uniforms.dataPointer.value,this.streamer=this.generate(this.data)}dispose(){return this.data=null,this.texture.dispose(),super.dispose()}getFilled(){return this.filled}setCallback(t){return this.callback=t,this.filled=0}copy(t){const e=Math.min(t.length,this.samples*this.channels*this.items),n=this.data;for(let i=0,r=e,s=0<=r;s?i<r:i>r;s?i++:i--)n[i]=t[i];this.write(Math.ceil(e/this.channels/this.items))}write(t){null==t&&(t=this.samples);let e=t/this.width;t*=this.items;const n=e<1?t:this.items*this.width;e=Math.ceil(e),this.texture.write(this.data,0,0,n,e),this.dataPointer.set(.5,.5),this.filled=1,this.used=t}through(t,e){let n,i;const{consume:r,done:s}=i=this.streamer,{emit:a}=n=e.streamer;let o=0,l=()=>r(((e,n,i,r)=>t(a,e,n,i,r,o)));return l=Xa(l,this.items),()=>{i.reset(),n.reset();const t=this.used;for(o=0;!s()&&o<t;)l(),o++;return i.count()}}}class uh extends vt.BufferGeometry{constructor(){super(),new vt.BufferGeometry(this),null==this.uniforms&&(this.uniforms={}),null==this.groups&&(this.groups=[])}_reduce(t,e){let n=!1;for(let i=0;i<t.length;i++){const r=t[i],s=e[i];n&&(t[i]=s),r>1&&(n=!0)}return t.reduce(((t,e)=>t*e))}_emitter(t){const e="index"==t?this.getIndex():this.getAttribute(t),n=e.itemSize,{array:i}=e;let r=0;return[null,function(t){i[r++]=t},function(t,e){i[r++]=t,i[r++]=e},function(t,e,n){i[r++]=t,i[r++]=e,i[r++]=n},function(t,e,n,s){i[r++]=t,i[r++]=e,i[r++]=n,i[r++]=s}][n]}_finalize(){}_offsets(t){this.groups=t}}class dh extends uh{_clipUniforms(){return this.geometryClip=new vt.Vector4(1e10,1e10,1e10,1e10),this.geometryResolution=new vt.Vector4,this.mapSize=new vt.Vector4,null==this.uniforms&&(this.uniforms={}),this.uniforms.geometryClip={type:"v4",value:this.geometryClip},this.uniforms.geometryResolution={type:"v4",value:this.geometryResolution},this.uniforms.mapSize={type:"v4",value:this.mapSize}}_clipGeometry(t,e,n,i){const r=t=>Math.max(0,t-1),s=t=>1/Math.max(1,t-1);return this.geometryClip.set(r(t),r(e),r(n),r(i)),this.geometryResolution.set(s(t),s(e),s(n),s(i))}_clipMap(t,e,n,i){return this.mapSize.set(t,e,n,i)}_clipOffsets(t,e,n,i,r,s,a,o,l){const h=[i,n,e,r],c=[o,a,s,l],u=this._reduce(h,c);return this._offsets([{start:0,count:u*t,materialIndex:0}])}}class ph extends dh{constructor(t){let e,n,i,r,s,a,o,l,h,c;super(t),this._clipUniforms(),this.sides=o=+t.sides||12,this.samples=a=+t.samples||2,this.strips=l=+t.strips||1,this.ribbons=s=+t.ribbons||1,this.layers=r=+t.layers||1,this.flip=n=null!=t.flip&&t.flip,this.anchor=e=null!=t.anchor?t.anchor:n?0:a-1;const u=l*s*r,d=(o+2)*u,p=2*o*u;this.setIndex(new vt.BufferAttribute(new Uint32Array(3*p),1)),this.setAttribute("position4",new vt.BufferAttribute(new Float32Array(4*d),4)),this.setAttribute("arrow",new vt.BufferAttribute(new Float32Array(3*d),3)),this.setAttribute("attach",new vt.BufferAttribute(new Float32Array(2*d),2));const f=this._emitter("index"),m=this._emitter("position4"),g=this._emitter("arrow"),v=this._emitter("attach"),x=[];for(i=0,c=o,h=0<=c;h?i<c:i>c;h?i++:i--){const t=i/o*2*Math.PI;x.push([Math.cos(t),Math.sin(t),1])}let _=0;for(let t=0,e=u,n=0<=e;n?t<e:t>e;n?t++:t--){let t,e;const n=_++,r=n+o+1;for(i=0,e=o,t=0<=e;t?i<e:i>e;t?i++:i--){const t=_+i%o,e=_+(i+1)%o;f(n),f(t),f(e),f(e),f(t),f(r)}_+=o+1}const y=n?a-1:0,b=e+(n?1:-1),w=e;for(let t=0,e=r,n=0<=e;n?t<e:t>e;n?t++:t--)for(let e=0,n=s,r=0<=n;r?e<n:e>n;r?e++:e--)for(let n=0,r=l,s=0<=r;s?n<r:n>r;s?n++:n--){let r,s;for(m(w,n,e,t),g(0,0,0),v(b,y),i=0,s=o,r=0<=s;r?i<s:i>s;r?i++:i--){m(w,n,e,t);const r=x[i];g(r[0],r[1],r[2]),v(b,y)}m(w,n,e,t),g(0,0,1),v(b,y)}this._finalize(),this.clip()}clip(t,e,n,i){let r;if(null==t&&({samples:t}=this),null==e&&({strips:e}=this),null==n&&({ribbons:n}=this),null==i&&({layers:i}=this),this._clipGeometry(t,e,n,i),t>this.anchor){const t=[i,n,e],s=[this.layers,this.ribbons,this.strips];r=this.sides*this._reduce(t,s)}else r=0;return this._offsets([{start:0,count:6*r,materialIndex:0}])}}class fh extends rh{constructor(t,e,n){super(t,e,n),this.zUnits=null!=n.zUnits?n.zUnits:0}raw(){for(const t of Array.from(this.renders))this._raw(t);return null}depth(t,e){for(const n of Array.from(this.renders))this._depth(n,t,e);return null}polygonOffset(t,e){for(const n of Array.from(this.renders))this._polygonOffset(n,t,e);return null}show(t,e,n){return Array.from(this.renders).map((i=>this._show(i,t,e,n)))}hide(){for(const t of Array.from(this.renders))this._hide(t);return null}_material(t){const e=this.renderer.capabilities.precision,n=`    precision ${e} float;\n    precision ${e} int;\nuniform mat4 modelMatrix;\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform mat4 viewMatrix;\nuniform mat3 normalMatrix;\nuniform vec3 cameraPosition;`,i=`    precision ${e} float;\n    precision ${e} int;\nuniform mat4 viewMatrix;\nuniform vec3 cameraPosition;`,r={};Object.assign(r,t),delete r.attributes,delete r.varyings,delete r.inspect,delete r.vertexGraph,delete r.fragmentGraph;const s=new vt.RawShaderMaterial(r);return["vertexGraph","fragmentGraph","inspect"].forEach((e=>s[e]=t[e])),s.vertexShader=[n,s.vertexShader].join("\n"),s.fragmentShader=[i,s.fragmentShader].join("\n"),s}_raw(t){t.rotationAutoUpdate=!1,t.frustumCulled=!1,t.matrixAutoUpdate=!1,t.material.defaultAttributeValues=void 0}_depth(t,e,n){const i=t.material;return i.depthWrite=e,i.depthTest=n}_polygonOffset(t,e,n){const i=0!==(n-=this.zUnits),r=t.material;if(r.polygonOffset=i,i)return r.polygonOffsetFactor=e,r.polygonOffsetUnits=n}_show(t,e,n,i){const r=t.material;return t.renderOrder=-i,t.visible=!0,r.transparent=true,r.blending=n,null}_hide(t){return t.visible=!1}_vertexColor(t,e){if(!t&&!e)return;const n=this.shaders.shader();return t&&(n.require(t),n.pipe("mesh.vertex.color",this.uniforms)),e&&(n.require(e),n.pipe("mesh.vertex.mask",this.uniforms)),n}_vertexPosition(t,e,n,i,r){let s;const a=this.shaders.shader();return(n||e&&!0!==e)&&(s={},(i>0||r)&&(s.POSITION_MAP=""),i>0&&(s[["POSITION_U","POSITION_UV","POSITION_UVW","POSITION_UVWO"][i-1]]=""),r&&(s.POSITION_STPQ="")),a.require(t),a.pipe("mesh.vertex.position",this.uniforms,s)}_fragmentColor(t,e,n,i,r,s,a,o,l){const h=this.shaders.shader();let c=!1,u=!1;const d={};return s>0&&(d[["POSITION_U","POSITION_UV","POSITION_UVW","POSITION_UVWO"][s-1]]=""),a&&(d.POSITION_STPQ=""),t&&(h.pipe("style.color",this.uniforms),c=!0,(n||r||e)&&(l&&!n||h.pipe("mesh.gamma.in"),u=!0)),n&&(h.isolate(),h.pipe("mesh.fragment.color",this.uniforms),l&&!c||h.pipe("mesh.gamma.in"),h.end(),c&&h.pipe(oo("vec4","*")),l&&c&&h.pipe("mesh.gamma.out"),c=!0,u=!0),r&&(!c&&o&&h.pipe(mo("vec4","vec4(1.0)")),h.isolate(),h.require(r),h.pipe("mesh.fragment.map",this.uniforms,d),l||h.pipe("mesh.gamma.in"),h.end(),o?h.pipe(o):c&&h.pipe(oo("vec4","*")),c=!0,u=!0),e&&(c||h.pipe(mo("vec4","vec4(1.0)")),!0===e?h.pipe("mesh.fragment.shaded",this.uniforms):(h.require(e),h.pipe("mesh.fragment.material",this.uniforms,d)),u=!0),u&&!l&&h.pipe("mesh.gamma.out"),i&&(h.pipe("mesh.fragment.mask",this.uniforms),c&&h.pipe(oo("vec4","*"))),h}}class mh extends hh{constructor(t,e,n,i,r){super(t,e,n,i,r),this.data=new this.ctor(this.n)}resize(t,e){const n=this.data,i=this.width,r=this.height;this.width=t,this.height=e,this.n=t*e*this.channels,this.data=new this.ctor(this.n);const{gl:s}=this;return this.renderer.state.bindTexture(s.TEXTURE_2D,this.texture),s.pixelStorei(s.UNPACK_ALIGNMENT,1),s.texImage2D(s.TEXTURE_2D,0,this.format,t,e,0,this.format,this.type,this.data),this.uniforms.dataResolution.value.set(1/t,1/e),this.write(n,0,0,i,r)}write(t,e,n,i,r){let s;const{width:a}=this,o=this.data,{channels:l}=this;let h=0;if(a===i&&0===e){s=n*i*l;const e=i*r*l;for(;h<e;)o[s++]=t[h++]}else{const c=a*l,u=i*l,d=e*l;let p=n;const f=n+r;for(;p<f;){let e=0;for(s=d+p*c;e++<u;)o[s++]=t[h++];p++}}return super.write(t,e,n,i,r)}dispose(){return this.data=null,super.dispose()}}class gh extends rh{constructor(t,e,n,i){null==i&&(i=!0),super(t,e),null==this.width&&(this.width=n.width||512),null==this.height&&(this.height=n.height||512),null==this.channels&&(this.channels=n.channels||4),null==this.backed&&(this.backed=n.backed||!1),this.samples=this.width*this.height,i&&this.build(n)}shader(t){return t.pipe("map.2d.data",this.uniforms),t.pipe("sample.2d",this.uniforms),this.channels<4&&t.pipe(uo(["0000","x000","xw00","xyz0"][this.channels])),t}build(t){let e;return this.klass=e=this.backed?mh:hh,this.texture=new e(this.renderer,this.width,this.height,this.channels,t),this.uniforms={dataPointer:{type:"v2",value:new vt.Vector2(0,0)}},this._adopt(this.texture.uniforms),this.reset()}reset(){return this.rows=[],this.bottom=0}resize(t,e){if(!this.backed)throw new Error("Cannot resize unbacked texture atlas");return t>2048&&e>2048?console.warn(`Giant text atlas ${t}x${e}.`):console.info(`Resizing text atlas ${t}x${e}.`),this.texture.resize(t,e),this.width=t,this.height=e,this.samples=t*e}collapse(t){let e;const{rows:n}=this;var i,r;if(n.splice(n.indexOf(t),1),this.bottom=null!=(i=n[n.length-1],r=t=>t.bottom,e=null!=i?r(i):void 0)?e:0,this.last===t)return this.last=null}allocate(t,e,n,i){const r=this.width,s=this.height,a=2*n;if(e>r)return this.resize(2*r,2*s),this.last=null,this.allocate(t,e,n,i);let o=this.last;if(null!=o&&o.height>=n&&o.height<a&&o.width+e<=r)return void o.append(t,e,n,i);let l=0,h=-1,c=0;for(let s=0;s<this.rows.length;s++){o=this.rows[s];if(o.top-l>=n&&h<0&&(h=s,c=l),({bottom:l}=o),o.height>=n&&o.height<a&&o.width+e<=r)return o.append(t,e,n,i),void(this.last=o)}if(h>=0)o=new vh(c,n),this.rows.splice(h,0,o);else{if(c=l,l+=n,l>=s)return this.resize(2*r,2*s),this.last=null,this.allocate(t,e,n,i);o=new vh(c,n),this.rows.push(o),this.bottom=l}o.append(t,e,n,i),this.last=o}read(){return this.texture.textureObject}write(t,e,n,i,r){return this.texture.write(t,e,n,i,r)}dispose(){return this.texture.dispose(),this.data=null,super.dispose()}}class vh{constructor(t,e){this.top=t,this.bottom=t+e,this.width=0,this.height=e,this.alive=0,this.keys=[]}append(t,e,n,i){const r=this.width,s=this.top;return this.alive++,this.width+=e,this.keys.push(t),i(this,r,s)}}class xh extends dh{constructor(t){let e,n,i,r,s;super(t),this._clipUniforms(),this.items=i=+t.items||2,this.width=s=+t.width||1,this.height=n=+t.height||1,this.depth=e=+t.depth||1,this.sides=r=Math.max(0,i-2);const a=s*n*e,o=i*a,l=r*a;this.setIndex(new vt.BufferAttribute(new Uint32Array(3*l),1)),this.setAttribute("position4",new vt.BufferAttribute(new Float32Array(4*o),4));const h=this._emitter("index"),c=this._emitter("position4");let u=0;for(let t=0,e=a,n=0<=e;n?t<e:t>e;n?t++:t--){for(let t=0,e=r,n=0<=e;n?t<e:t>e;n?t++:t--)h(u),h(u+t+1),h(u+t+2);u+=i}for(let t=0,r=e,a=0<=r;a?t<r:t>r;a?t++:t--)for(let e=0,r=n,a=0<=r;a?e<r:e>r;a?e++:e--)for(let n=0,r=s,a=0<=r;a?n<r:n>r;a?n++:n--)for(let r=0,s=i,a=0<=s;a?r<s:r>s;a?r++:r--)c(n,e,t,r);this._finalize(),this.clip()}clip(t,e,n,i){null==t&&({width:t}=this),null==e&&({height:e}=this),null==n&&({depth:n}=this),null==i&&({items:i}=this);const r=Math.max(0,i-2);return this._clipGeometry(t,e,n,i),this._clipOffsets(3,t,e,n,r,this.width,this.height,this.depth,this.sides)}}class _h extends dh{constructor(t){let e,n,i,r,s,a,o,l,h,c,u,d,p,f,m;super(t),this._clipUniforms(),this.closed=e=t.closed||!1,this.samples=h=(+t.samples||2)+(e?1:0),this.strips=u=+t.strips||1,this.ribbons=l=+t.ribbons||1,this.layers=o=+t.layers||1,this.detail=n=+t.detail||1;const g=h-1;this.joints=s=n-1,this.vertices=d=(g-1)*s+h,this.segments=c=(g-1)*s+g;const v=h-(e?1:0),x=d*u*l*o*2,_=2*(c*u*l*o);this.setIndex(new vt.BufferAttribute(new Uint32Array(3*_),1)),this.setAttribute("position4",new vt.BufferAttribute(new Float32Array(4*x),4)),this.setAttribute("line",new vt.BufferAttribute(new Float32Array(2*x),2)),this.setAttribute("strip",new vt.BufferAttribute(new Float32Array(2*x),2)),n>1&&this.setAttribute("joint",new vt.BufferAttribute(new Float32Array(x),1));const y=this._emitter("index"),b=this._emitter("position4"),w=this._emitter("line"),S=this._emitter("strip");n>1&&(r=this._emitter("joint"));let M=0;for(let t=0,e=l*o,n=0<=e;n?t<e:t>e;n?t++:t--)for(let t=0,e=u,n=0<=e;n?t<e:t>e;n?t++:t--){for(let t=0,e=c,n=0<=e;n?t<e:t>e;n?t++:t--)y(M),y(M+1),y(M+2),y(M+2),y(M+1),y(M+3),M+=2;M+=2}const T=e?()=>0:function(t){return 0===t?-1:t===h-1?1:0};if(n>1){let t,d;for(a=0,d=o,t=0<=d;t?a<d:a>d;t?a++:a--){let t,o;for(m=0,o=l,t=0<=o;t?m<o:m>o;t?m++:m--){let t,o;for(f=0,o=u,t=0<=o;t?f<o:f>o;t?f++:f--){let t,o,l;for(l=0,p=l,o=h,t=0<=o;t?l<o:l>o;t?l++:l--,p=l)if(e&&(p%=v),i=T(p),0!==i)b(p,f,m,a),b(p,f,m,a),w(i,1),w(i,-1),S(0,c),S(0,c),r(.5),r(.5);else for(let t=0,e=n,o=0<=e;o?t<e:t>e;o?t++:t--)b(p,f,m,a),b(p,f,m,a),w(i,1),w(i,-1),S(0,c),S(0,c),r(t/s),r(t/s)}}}}else{let t,n;for(a=0,n=o,t=0<=n;t?a<n:a>n;t?a++:a--){let t,n;for(m=0,n=l,t=0<=n;t?m<n:m>n;t?m++:m--){let t,n;for(f=0,n=u,t=0<=n;t?f<n:f>n;t?f++:f--){let t,n,r;for(r=0,p=r,n=h,t=0<=n;t?r<n:r>n;t?r++:r--,p=r)e&&(p%=v),i=T(p),b(p,f,m,a),b(p,f,m,a),w(i,1),w(i,-1),S(0,c),S(0,c)}}}}this._finalize(),this.clip()}clip(t,e,n,i){null==t&&(t=this.samples-this.closed),null==e&&({strips:e}=this),null==n&&({ribbons:n}=this),null==i&&({layers:i}=this);let r=Math.max(0,t-(this.closed?0:1));const s=t+(t-2)*this.joints;return r=s-1,this._clipGeometry(s,e,n,i),this._clipOffsets(6,r,e,n,i,this.segments,this.strips,this.ribbons,this.layers)}}class yh{constructor(t,e,n,i,r){this.gl=t,null==r&&(r={}),null==r.minFilter&&(r.minFilter=vt.NearestFilter),null==r.magFilter&&(r.magFilter=vt.NearestFilter),null==r.format&&(r.format=vt.RGBAFormat),null==r.type&&(r.type=vt.UnsignedByteType),this.options=r,this.width=e||1,this.height=n||1,this.frames=i||1,this.buffers=this.frames+1,this.build()}build(){let t;const e=()=>new vt.WebGLRenderTarget(this.width,this.height,this.options);this.targets=(()=>{let n,i;const r=[];for(t=0,i=this.buffers,n=0<=i;n?t<i:t>i;n?t++:t--)r.push(e());return r})();const n=[];this.targets.forEach((t=>n.push(t.texture))),this.reads=n,this.write=this.targets[this.buffers-1],this.uniforms={dataResolution:{type:"v2",value:new vt.Vector2(1/this.width,1/this.height)},dataTexture:{type:"t",value:this.reads[0]},dataTextures:{type:"tv",value:this.reads}}}cycle(){this.targets.unshift(this.targets.pop()),this.write=this.targets[this.buffers-1],this.reads.unshift(this.reads.pop()),this.uniforms.dataTexture.value=this.reads[0]}warmup(t){return(()=>{const e=[];for(let n=0,i=this.buffers,r=0<=i;r?n<i:n>i;r?n++:n--)t(this.write),e.push(this.cycle());return e})()}dispose(){for(const t of Array.from(this.targets))t.dispose();return this.targets=this.reads=this.write=null}}class bh extends rh{constructor(t,e,n){super(t,e),this.scene=null!=n.scene?n.scene:new vt.Scene,this.camera=n.camera,this.build(n)}shaderRelative(t){return null==t&&(t=this.shaders.shader()),t.pipe("sample.2d",this.uniforms)}shaderAbsolute(t,e,n){if(null==e&&(e=1),null==n&&(n=4),null==t&&(t=this.shaders.shader()),e<=1)return n>2&&t.pipe(ho(n,2)),t.pipe("map.2d.data",this.uniforms),t.pipe("sample.2d",this.uniforms);{const i=ao(Math.min(e,this.target.frames));return n<4&&t.pipe(lo(n,4)),t.pipe("map.xyzw.2dv"),t.split(),t.pipe("map.2d.data",this.uniforms),t.pass(),t.pipe(i,this.uniforms)}}build(t){return this.camera||(this.camera=new vt.PerspectiveCamera,this.camera.position.set(0,0,3),this.camera.lookAt(new vt.Vector3)),"function"==typeof this.scene.inject&&this.scene.inject(),this.target=new yh(this.gl,t.width,t.height,t.frames,t),this.target.warmup((t=>this.renderer.setRenderTarget(t))),this.renderer.setRenderTarget(null),this._adopt(this.target.uniforms),this._adopt({dataPointer:{type:"v2",value:new vt.Vector2(.5,.5)}}),this.filled=0}adopt(t){return Array.from(t.renders).map((t=>this.scene.add(t)))}unadopt(t){return Array.from(t.renders).map((t=>this.scene.remove(t)))}render(t){null==t&&({camera:t}=this);const e=this.renderer.getRenderTarget();if(this.renderer.setRenderTarget(this.target.write),this.renderer.render(null!=this.scene.scene?this.scene.scene:this.scene,t),this.renderer.setRenderTarget(e),this.target.cycle(),this.filled<this.target.frames)return this.filled++}read(t){return null==t&&(t=0),this.target.reads[Math.abs(t)]}getFrames(){return this.target.frames}getFilled(){return this.filled}dispose(){return"function"==typeof this.scene.unject&&this.scene.unject(),this.scene=this.camera=null,this.target.dispose(),super.dispose()}}class wh extends bh{constructor(t,e,n){let i,r;const s=n.items||1,a=n.channels||4,o=n.width||1,l=n.height||1,h=n.depth||1;n.format=vt.RGBAFormat,n.width=r=s*o,n.height=i=l*h,n.frames=1,delete n.items,delete n.depth,delete n.channels,super(t,e,n),null==this.items&&(this.items=s),null==this.channels&&(this.channels=a),null==this.width&&(this.width=o),this._width=r,null==this.height&&(this.height=l),this._height=i,null==this.depth&&(this.depth=h),this._adopt({textureItems:{type:"f",value:this.items},textureHeight:{type:"f",value:this.height}})}shaderAbsolute(t){return null==t&&(t=this.shaders.shader()),t.pipe("map.xyzw.texture",this.uniforms),super.shaderAbsolute(t,1,2)}}class Sh extends dh{constructor(t,e){null==e&&(e=!0),super(),e&&this.construct(t)}construct(t){let e,n,i,r,s,a,o,l;this._clipUniforms(),this.closedX=e=t.closedX||!1,this.closedY=n=t.closedY||!1,this.width=l=(+t.width||2)+(e?1:0),this.height=i=(+t.height||2)+(n?1:0),this.surfaces=o=+t.surfaces||1,this.layers=r=+t.layers||1;const h=l-(e?1:0),c=i-(n?1:0);this.segmentsX=s=Math.max(0,l-1),this.segmentsY=a=Math.max(0,i-1);const u=l*i*o*r,d=2*(s*a*o*r);this.setIndex(new vt.BufferAttribute(new Uint32Array(3*d),1)),this.setAttribute("position4",new vt.BufferAttribute(new Float32Array(4*u),4)),this.setAttribute("surface",new vt.BufferAttribute(new Float32Array(2*u),2));const p=this._emitter("index"),f=this._emitter("position4"),m=this._emitter("surface");let g=0;for(let t=0,e=o*r,n=0<=e;n?t<e:t>e;n?t++:t--){for(let t=0,e=a,n=0<=e;n?t<e:t>e;n?t++:t--){for(let t=0,e=s,n=0<=e;n?t<e:t>e;n?t++:t--)p(g),p(g+1),p(g+l),p(g+l),p(g+1),p(g+l+1),g++;g++}g+=l}const v=e?()=>0:function(t){return 0===t?-1:t===s?1:0},x=n?()=>0:function(t){return 0===t?-1:t===a?1:0};for(let t=0,s=r,a=0<=s;a?t<s:t>s;a?t++:t--)for(let r=0,s=o,a=0<=s;a?r<s:r>s;a?r++:r--)for(let s=0,a=s,o=i,u=0<=o;u?s<o:s>o;u?s++:s--,a=s){n&&(a%=c);const i=x(a);for(let n=0,s=n,o=l,c=0<=o;c?n<o:n>o;c?n++:n--,s=n){e&&(s%=h);const n=v(s);f(s,a,r,t),m(n,i)}}this._finalize(),this.clip()}clip(t,e,n,i){null==t&&({width:t}=this),null==e&&({height:e}=this),null==n&&({surfaces:n}=this),null==i&&({layers:i}=this);const r=Math.max(0,t-1),s=Math.max(0,e-1);return this._clipGeometry(t,e,n,i),this._clipOffsets(6,r,s,n,i,this.segmentsX,this.segmentsY,this.surfaces,this.layers)}map(t,e,n,i){return null==t&&({width:t}=this),null==e&&({height:e}=this),null==n&&({surfaces:n}=this),null==i&&({layers:i}=this),this._clipMap(t,e,n,i)}}class Mh extends Sh{constructor(t){t.width=Math.max(2,null!=+t.width?+t.width:2),t.height=Math.max(2,null!=+t.height?+t.height:2),super(t,!1),null==this.uniforms&&(this.uniforms={}),this.uniforms.geometryScale={type:"v4",value:new vt.Vector4},this.cover(),this.construct(t)}cover(t,e,n,i){null==t&&(t=1),this.scaleX=t,null==e&&(e=1),this.scaleY=e,null==n&&(n=1),this.scaleZ=n,null==i&&(i=1),this.scaleW=i}clip(t,e,n,i){null==t&&({width:t}=this),null==e&&({height:e}=this),null==n&&({surfaces:n}=this),null==i&&({layers:i}=this),super.clip(t,e,n,i);const r=t=>1/Math.max(1,t-1);return this.uniforms.geometryScale.value.set(r(t)*this.scaleX,r(e)*this.scaleY,r(n)*this.scaleZ,r(i)*this.scaleW)}}class Th extends fh{constructor(t,e,n){let i;super(t,e,n);let{uniforms:r}=n;const{map:s,combine:a,stpq:o,linear:l}=n;null==r&&(r={});const h=null!=r.styleColor;this.geometry=new Mh({width:n.width,height:n.height}),this._adopt(r),this._adopt(this.geometry.uniforms);const c=e.material(),u=c.vertex;u.pipe("raw.position.scale",this.uniforms),u.fan(),u.pipe("stpq.xyzw.2d",this.uniforms),u.next(),u.pipe("screen.position",this.uniforms),u.join(),c.fragment=i=this._fragmentColor(h,!1,null,null,s,2,o,a,l),i.pipe("fragment.color",this.uniforms);const d=c.link({side:vt.DoubleSide});this.material=this._material(d);const p=new vt.Mesh(this.geometry,this.material);p.frustumCulled=!1,p.userData=d,this._raw(p),this.renders=[p]}dispose(){return this.geometry.dispose(),this.material.dispose(),this.renders=this.geometry=this.material=null,super.dispose()}}class Eh extends Th{constructor(t,e,n){const{items:i,width:r,height:s,depth:a,stpq:o}=n,l=t=>1/Math.max(1,t),h=t=>1/Math.max(1,t-1),c={remapUVScale:{type:"v2",value:new vt.Vector2(i*r,s*a)},remapModulus:{type:"v2",value:new vt.Vector2(i,s)},remapModulusInv:{type:"v2",value:new vt.Vector2(l(i),l(s))},remapSTPQScale:{type:"v4",value:new vt.Vector4(h(r),h(s),h(a),h(i))}},u=e.shader();u.pipe("screen.map.xyzw",c),null!=n.map&&(o&&u.pipe("screen.map.stpq",c),u.pipe(n.map)),super(t,e,{map:u,linear:!0}),this.memo=n,this.uniforms=c;for(const t of Array.from(this.renders))t.transparent=!1}cover(t,e,n,i){null==t&&({width:t}=this.memo),null==e&&({height:e}=this.memo),null==n&&({depth:n}=this.memo),null==i&&({items:i}=this.memo);const r=t=>1/Math.max(1,t-1);this.uniforms.remapSTPQScale.value.set(r(t),r(e),r(n),r(i));const s=t/this.memo.width;let a=n/this.memo.depth;return 1===this.memo.depth&&(a=e/this.memo.height),this.geometry.cover(s,a)}}class Ah extends dh{constructor(t){let e,n,i,r;super(t),this._clipUniforms(),this.items=i=+t.items||2,this.width=r=+t.width||1,this.height=n=+t.height||1,this.depth=e=+t.depth||1;const s=i*r*n*e,a=4*s,o=2*s;this.setIndex(new vt.BufferAttribute(new Uint32Array(3*o),1)),this.setAttribute("position4",new vt.BufferAttribute(new Float32Array(4*a),4)),this.setAttribute("sprite",new vt.BufferAttribute(new Float32Array(2*a),2));const l=this._emitter("index"),h=this._emitter("position4"),c=this._emitter("sprite"),u=[[-1,-1],[-1,1],[1,-1],[1,1]];let d=0;for(let t=0,e=s,n=0<=e;n?t<e:t>e;n?t++:t--)l(d),l(d+1),l(d+2),l(d+1),l(d+2),l(d+3),d+=4;for(let t=0,s=e,a=0<=s;a?t<s:t>s;a?t++:t--)for(let e=0,s=n,a=0<=s;a?e<s:e>s;a?e++:e--)for(let n=0,s=r,a=0<=s;a?n<s:n>s;a?n++:n--)for(let r=0,s=i,a=0<=s;a?r<s:r>s;a?r++:r--)for(const i of Array.from(u))h(n,e,t,r),c(i[0],i[1]);this._finalize(),this.clip()}clip(t,e,n,i){return null==t&&({width:t}=this),null==e&&({height:e}=this),null==n&&({depth:n}=this),null==i&&({items:i}=this),this._clipGeometry(t,e,n,i),this._clipOffsets(6,t,e,n,i,this.width,this.height,this.depth,this.items)}}class Ch extends dh{constructor(t){let e,n,i,r,s;super(t),this._clipUniforms(),this.items=i=+t.items||2,this.width=s=+t.width||1,this.height=n=+t.height||1,this.depth=e=+t.depth||1,this.sides=r=Math.max(0,i-2);const a=s*n*e,o=i*a,l=r*a;this.setIndex(new vt.BufferAttribute(new Uint32Array(3*l),1)),this.setAttribute("position4",new vt.BufferAttribute(new Float32Array(4*o),4)),this.setAttribute("strip",new vt.BufferAttribute(new Float32Array(3*o),3));const h=this._emitter("index"),c=this._emitter("position4"),u=this._emitter("strip");let d=0;for(let t=0,e=a,n=0<=e;n?t<e:t>e;n?t++:t--){let t=d;for(let e=0,n=r,i=0<=n;i?e<n:e>n;i?e++:e--)1&e?(h(t+1),h(t),h(t+2)):(h(t),h(t+1),h(t+2)),t++;d+=i}const p=i-1;for(let t=0,i=e,r=0<=i;r?t<i:t>i;r?t++:t--)for(let e=0,i=n,r=0<=i;r?e<i:e>i;r?e++:e--)for(let n=0,i=s,r=0<=i;r?n<i:n>i;r?n++:n--){let i=1;c(n,e,t,0),u(1,2,i);for(let r=1,s=p,a=1<=s;a?r<s:r>s;a?r++:r--)c(n,e,t,r),u(r-1,r+1,i=-i);c(n,e,t,p),u(p-2,p-1,-i)}this._finalize(),this.clip()}clip(t,e,n,i){null==t&&({width:t}=this),null==e&&({height:e}=this),null==n&&({depth:n}=this),null==i&&({items:i}=this);const r=Math.max(0,i-2);return this._clipGeometry(t,e,n,i),this._clipOffsets(3,t,e,n,r,this.width,this.height,this.depth,this.sides)}}const Rh={sprite:class extends fh{constructor(t,e,n){let i;super(t,e,n);let{uniforms:r}=n;const{material:s,position:a,sprite:o,map:l,combine:h,linear:c,color:u,mask:d,stpq:p}=n;null==r&&(r={});const f=null!=r.styleColor;this.geometry=new Ah({items:n.items,width:n.width,height:n.height,depth:n.depth}),this._adopt(r),this._adopt(this.geometry.uniforms);const m=e.material(),g=m.vertex;g.pipe(this._vertexColor(u,d)),g.require(this._vertexPosition(a,s,l,2,p)),g.require(o),g.pipe("sprite.position",this.uniforms),g.pipe("project.position",this.uniforms),m.fragment=i=this._fragmentColor(f,s,u,d,l,2,p,h,c);const v=e.material();v.vertex.pipe(g),v.fragment.pipe(i),v.fragment.pipe("fragment.transparent",this.uniforms);const x=e.material();x.vertex.pipe(g),x.fragment.pipe(i),x.fragment.pipe("fragment.solid",this.uniforms);const _=x.link({side:vt.DoubleSide});this.fillMaterial=this._material(_);const y=v.link({side:vt.DoubleSide});this.edgeMaterial=this._material(y),this.fillObject=new vt.Mesh(this.geometry,this.fillMaterial),this.edgeObject=new vt.Mesh(this.geometry,this.edgeMaterial),this._raw(this.fillObject),this.fillObject.userData=_,this._raw(this.edgeObject),this.edgeObject.userData=y,this.renders=[this.fillObject,this.edgeObject]}show(t,e,n,i){return this._show(this.edgeObject,!0,e,n,i),this._show(this.fillObject,t,e,n,i)}dispose(){return this.geometry.dispose(),this.edgeMaterial.dispose(),this.fillMaterial.dispose(),this.nreders=this.geometry=this.edgeMaterial=this.fillMaterial=this.edgeObject=this.fillObject=null,super.dispose()}},point:class extends fh{constructor(t,e,n){let i,r;super(t,e,n);let{uniforms:s,shape:a,fill:o}=n;const{material:l,position:h,color:c,size:u,mask:d,map:p,combine:f,linear:m,optical:g,stpq:v}=n;null==s&&(s={}),a=null!=+a?+a:0,null==o&&(o=!0);const x=null!=s.styleColor,_=["circle","square","diamond","up","down","left","right"],y=["circle","generic","generic","generic","generic","generic","generic"],b=null!=y[a]?y[a]:y[0],w=null!=_[a]?_[a]:_[0],S=null!=(r=g&&[1.2,1,1.414,1.16,1.16,1.16,1.16][a])?r:1,M=o?b:`${b}.hollow`;this.geometry=new Ah({items:n.items,width:n.width,height:n.height,depth:n.depth}),this._adopt(s),this._adopt(this.geometry.uniforms);const T={POINT_SHAPE_SCALE:+(S+1e-5)},E=e.material(),A=E.vertex;A.pipe(this._vertexColor(c,d)),u?(A.isolate(),A.require(u),A.require("point.size.varying",this.uniforms),A.end()):A.require("point.size.uniform",this.uniforms),A.require(this._vertexPosition(h,l,p,2,v)),A.pipe("point.position",this.uniforms,T),A.pipe("project.position",this.uniforms),E.fragment=i=this._fragmentColor(x,l,c,d,p,2,v,f,m);const C=e.material();C.vertex.pipe(A),i=C.fragment.pipe(E.fragment),i.require(`point.mask.${w}`,this.uniforms),i.require(`point.alpha.${M}`,this.uniforms),i.pipe("point.edge",this.uniforms);const R=e.material();R.vertex.pipe(A),i=R.fragment.pipe(E.fragment),i.require(`point.mask.${w}`,this.uniforms),i.require(`point.alpha.${M}`,this.uniforms),i.pipe("point.fill",this.uniforms);const D=R.link({side:vt.DoubleSide});this.fillMaterial=this._material(D);const k=C.link({side:vt.DoubleSide});this.edgeMaterial=this._material(k),this.fillObject=new vt.Mesh(this.geometry,this.fillMaterial),this.edgeObject=new vt.Mesh(this.geometry,this.edgeMaterial),this._raw(this.fillObject),this.fillObject.userData=D,this._raw(this.edgeObject),this.edgeObject.userData=k,this.renders=[this.fillObject,this.edgeObject]}show(t,e,n,i){return this._show(this.edgeObject,!0,e,n,i),this._show(this.fillObject,t,e,n,i)}dispose(){return this.geometry.dispose(),this.edgeMaterial.dispose(),this.fillMaterial.dispose(),this.renders=this.edgeObject=this.fillObject=this.geometry=this.edgeMaterial=this.fillMaterial=null,super.dispose()}},line:class extends fh{constructor(t,e,n){let i;super(t,e,n);let{uniforms:r,stroke:s,join:a}=n;const{material:o,position:l,color:h,mask:c,map:u,combine:d,stpq:p,linear:f,clip:m,proximity:g}=n;null==r&&(r={}),s=[null,"dotted","dashed"][s];const v=null!=r.styleColor;a=null!=(i=["miter","round","bevel"][a])?i:"miter";const x={miter:1,round:4,bevel:2}[a];this.geometry=new _h({samples:n.samples,strips:n.strips,ribbons:n.ribbons,layers:n.layers,anchor:n.anchor,closed:n.closed,detail:x}),this._adopt(r),this._adopt(this.geometry.uniforms);const _=e.material(),y={};s&&(y.LINE_STROKE=""),m&&(y.LINE_CLIP=""),null!=g&&(y.LINE_PROXIMITY=""),y["LINE_JOIN_"+a.toUpperCase()]="",x>1&&(y.LINE_JOIN_DETAIL=x);const b=_.vertex;b.pipe(this._vertexColor(h,c)),b.require(this._vertexPosition(l,o,u,2,p)),b.pipe("line.position",this.uniforms,y),b.pipe("project.position",this.uniforms);const w=_.fragment;s&&w.pipe(`fragment.clip.${s}`,this.uniforms),m&&w.pipe("fragment.clip.ends",this.uniforms),null!=g&&w.pipe("fragment.clip.proximity",this.uniforms),w.pipe(this._fragmentColor(v,o,h,c,u,2,p,d,f)),w.pipe("fragment.color",this.uniforms);const S=_.link({side:vt.DoubleSide});this.material=this._material(S);const M=new vt.Mesh(this.geometry,this.material);M.userData=S,this._raw(M),this.renders=[M]}dispose(){return this.geometry.dispose(),this.material.dispose(),this.renders=this.geometry=this.material=null,super.dispose()}},surface:class extends fh{constructor(t,e,n){let i,r;super(t,e,n);let{uniforms:s,material:a}=n;const{position:o,color:l,mask:h,map:c,combine:u,linear:d,stpq:p,intUV:f}=n;null==s&&(s={}),null==a&&(a=!0);const m=null!=s.styleColor;this.geometry=new Sh({width:n.width,height:n.height,surfaces:n.surfaces,layers:n.layers,closedX:n.closedX,closedY:n.closedY}),this._adopt(s),this._adopt(this.geometry.uniforms);const g=e.material(),v=g.vertex;f&&(i={POSITION_UV_INT:""}),v.pipe(this._vertexColor(l,h)),v.require(this._vertexPosition(o,a,c,2,p)),a||v.pipe("surface.position",this.uniforms,i),a&&v.pipe("surface.position.normal",this.uniforms,i),v.pipe("project.position",this.uniforms),g.fragment=r=this._fragmentColor(m,a,l,h,c,2,p,u,d),r.pipe("fragment.color",this.uniforms);const x=g.link({side:vt.DoubleSide});this.material=this._material(x);const _=new vt.Mesh(this.geometry,this.material);_.userData=x,this._raw(_),this.renders=[_]}dispose(){return this.geometry.dispose(),this.material.dispose(),this.renders=this.geometry=this.material=null,super.dispose()}},face:class extends fh{constructor(t,e,n){let i;super(t,e,n);let{uniforms:r,material:s}=n;const{position:a,color:o,mask:l,map:h,combine:c,stpq:u,linear:d}=n;null==r&&(r={}),null==s&&(s=!0);const p=null!=r.styleColor;this.geometry=new xh({items:n.items,width:n.width,height:n.height,depth:n.depth}),this._adopt(r),this._adopt(this.geometry.uniforms);const f=e.material(),m=f.vertex;m.pipe(this._vertexColor(o,l)),m.require(this._vertexPosition(a,s,h,2,u)),s||m.pipe("face.position",this.uniforms),s&&m.pipe("face.position.normal",this.uniforms),m.pipe("project.position",this.uniforms),f.fragment=i=this._fragmentColor(p,s,o,l,h,2,u,c,d),i.pipe("fragment.color",this.uniforms);const g=f.link({side:vt.DoubleSide});this.material=this._material(g);const v=new vt.Mesh(this.geometry,this.material);v.userData=g,this._raw(v),this.renders=[v]}dispose(){return this.geometry.dispose(),this.material.dispose(),this.renders=this.geometry=this.material=null,super.dispose()}},strip:class extends fh{constructor(t,e,n){let i;super(t,e,n);let{uniforms:r,material:s}=n;const{position:a,color:o,mask:l,map:h,combine:c,linear:u,stpq:d}=n;null==r&&(r={}),null==s&&(s=!0);const p=null!=r.styleColor;this.geometry=new Ch({items:n.items,width:n.width,height:n.height,depth:n.depth}),this._adopt(r),this._adopt(this.geometry.uniforms);const f=e.material(),m=f.vertex;m.pipe(this._vertexColor(o,l)),m.require(this._vertexPosition(a,s,h,2,d)),s||m.pipe("mesh.position",this.uniforms),s&&m.pipe("strip.position.normal",this.uniforms),m.pipe("project.position",this.uniforms),f.fragment=i=this._fragmentColor(p,s,o,l,h,2,d,c,u),i.pipe("fragment.color",this.uniforms);const g=f.link({side:vt.DoubleSide});this.material=this._material(g);const v=new vt.Mesh(this.geometry,this.material);v.userData=g,this._raw(v),this.renders=[v]}dispose(){return this.geometry.dispose(),this.material.dispose(),this.renders=this.geometry=this.material=null,super.dispose()}},arrow:class extends fh{constructor(t,e,n){let i;super(t,e,n);let{uniforms:r}=n;const{material:s,position:a,color:o,mask:l,map:h,combine:c,stpq:u,linear:d}=n;null==r&&(r={});const p=null!=r.styleColor;this.geometry=new ph({sides:n.sides,samples:n.samples,strips:n.strips,ribbons:n.ribbons,layers:n.layers,anchor:n.anchor,flip:n.flip}),this._adopt(r),this._adopt(this.geometry.uniforms);const f=e.material(),m=f.vertex;m.pipe(this._vertexColor(o,l)),m.require(this._vertexPosition(a,s,h,1,u)),m.pipe("arrow.position",this.uniforms),m.pipe("project.position",this.uniforms),f.fragment=i=this._fragmentColor(p,s,o,l,h,1,u,c,d),i.pipe("fragment.color",this.uniforms);const g=f.link({side:vt.DoubleSide});this.material=this._material(g);const v=new vt.Mesh(this.geometry,this.material);v.frustumCulled=!1,v.matrixAutoUpdate=!1,v.userData=g,this._raw(v),this.renders=[v]}dispose(){return this.geometry.dispose(),this.material.dispose(),this.renders=this.geometry=this.material=null,super.dispose()}},screen:Th,memoScreen:Eh,debug:class extends fh{constructor(t,e,n){super(t,e,n),this.geometry=new vt.PlaneGeometry(1,1),this.material=new vt.MeshBasicMaterial({map:n.map}),this.material.side=vt.DoubleSide;const i=new vt.Mesh(this.geometry,this.material);i.position.x+=n.x||0,i.position.y+=n.y||0,i.frustumCulled=!1,i.scale.set(2,2,2),i.__debug=!0,this.objects=[i]}dispose(){return this.geometry.dispose(),this.material.dispose(),this.objects=this.geometry=this.material=null,super.dispose()}},dataBuffer:ch,arrayBuffer:class extends ch{constructor(t,e,n){const i=n.width||1,r=n.history||1;n.width=i,n.height=r,n.depth=1,super(t,e,n,!1),this.width=i,this.history=r,this.samples=i,this.wrap=r>1,this.build(n)}build(t){return super.build(),this.index=0,this.pad=0,this.streamer=this.generate(this.data)}setActive(t){return this.pad=Math.max(0,this.width-t)}fill(){const{callback:t}=this;"function"==typeof t.reset&&t.reset();const{emit:e,count:n,done:i,reset:r}=this.streamer;r();const s=this.samples-this.pad;let a=0;for(;!i()&&a<s&&!1!==t(e,a++););return Math.floor(n()/this.items)}write(t){return null==t&&(t=this.samples),t*=this.items,this.texture.write(this.data,0,this.index,t,1),this.dataPointer.set(.5,this.index+.5),this.index=(this.index+this.history-1)%this.history,this.filled=Math.min(this.history,this.filled+1)}through(t,e){let n,i;const{consume:r,done:s}=i=this.streamer,{emit:a}=n=e.streamer;let o=0,l=()=>r(((e,n,i,r)=>t(a,e,n,i,r,o)));return l=Xa(l,this.items),()=>{i.reset(),n.reset();const t=this.samples-this.pad;for(o=0;!s()&&o<t;)l(),o++;return i.count()}}},matrixBuffer:class extends ch{constructor(t,e,n){const i=n.width||1,r=n.height||1,s=n.history||1;n.depth=s,super(t,e,n,!1),this.width=i,this.height=r,this.history=s,this.samples=i*r,this.wrap=s>1,this.build(n)}build(t){return super.build(),this.index=0,this.pad={x:0,y:0},this.streamer=this.generate(this.data)}getFilled(){return this.filled}setActive(t,e){let n;return[this.pad.x,this.pad.y]=Array.from(n=[Math.max(0,this.width-t),Math.max(0,this.height-e)]),n}fill(){let t,e,n;const{callback:i}=this;"function"==typeof i.reset&&i.reset();const{emit:r,skip:s,count:a,done:o,reset:l}=this.streamer;l();const h=this.width,c=this.pad.x,u=this.samples-this.pad.y*h;let d=t=e=0;if(c)for(;!o()&&e<u&&(e++,n=i(r,d,t),++d==h-c&&(s(c),d=0,t++),!1!==n););else for(;!o()&&e<u&&(e++,n=i(r,d,t),++d===h&&(d=0,t++),!1!==n););return Math.floor(a()/this.items)}write(t){null==t&&(t=this.samples),t*=this.items;const e=this.width*this.items,n=Math.ceil(t/e);return this.texture.write(this.data,0,this.index*this.height,e,n),this.dataPointer.set(.5,this.index*this.height+.5),this.index=(this.index+this.history-1)%this.history,this.filled=Math.min(this.history,this.filled+1)}through(t,e){let n,i,r;const{consume:s,skip:a,done:o}=r=this.streamer,{emit:l}=n=e.streamer;let h=i=0,c=()=>s(((e,n,r,s)=>t(l,e,n,r,s,h,i)));return c=Xa(c,this.items),()=>{let t;r.reset(),n.reset();const e=this.width,s=this.pad.x,l=this.samples-this.pad.y*e;if(h=i=t=0,s)for(;!o()&&t<l;)t++,c(),++h==e-s&&(a(s),h=0,i++);else for(;!o()&&t<l;)t++,c(),++h===e&&(h=0,i++);return r.count()}}},voxelBuffer:class extends ch{build(t){return super.build(),this.pad={x:0,y:0,z:0},this.streamer=this.generate(this.data)}setActive(t,e,n){let i;return[this.pad.x,this.pad.y,this.pad.z]=Array.from(i=[Math.max(0,this.width-t),Math.max(0,this.height-e),Math.max(0,this.depth-n)]),i}fill(){let t,e,n,i;const{callback:r}=this;"function"==typeof r.reset&&r.reset();const{emit:s,skip:a,count:o,done:l,reset:h}=this.streamer;h();const c=this.width,u=this.height,d=this.pad.x,p=this.pad.y,f=this.samples-this.pad.z*c*u;let m=t=e=n=0;if(d>0||p>0)for(;!l()&&n<f&&(n++,i=r(s,m,t,e),++m==c-d&&(a(d),m=0,++t==u-p&&(a(c*p),t=0,e++)),!1!==i););else for(;!l()&&n<f&&(n++,i=r(s,m,t,e),++m===c&&(m=0,++t===u&&(t=0,e++)),!1!==i););return Math.floor(o()/this.items)}through(t,e){let n,i,r,s;const{consume:a,done:o,skip:l}=s=this.streamer,{emit:h}=n=e.streamer;let c=i=r=0,u=()=>a(((e,n,s,a)=>t(h,e,n,s,a,c,i,r)));return u=Xa(u,this.items),()=>{let t;s.reset(),n.reset();const e=this.width,a=this.height,h=this.pad.x,d=this.pad.y,p=this.samples-this.pad.z*e*a;if(c=i=r=t=0,h>0||d>0)for(;!o()&&t<p;)t++,u(),++c==e-h&&(l(h),c=0,++i==a-d&&(l(e*d),i=0,r++));else for(;!o()&&t<p;)t++,u(),++c===e&&(c=0,++i===a&&(i=0,r++));return s.count()}}},pushBuffer:class extends lh{constructor(t,e,n){const i=n.width||1,r=n.height||1,s=n.depth||1,a=i*r*s;n.samples||(n.samples=a),super(t,e,n),this.width=i,this.height=r,this.depth=s,null==this.samples&&(this.samples=a),this.build(n)}build(t){return this.data=[],this.data.length=this.samples,this.filled=0,this.pad={x:0,y:0,z:0},this.streamer=this.generate(this.data)}dispose(){return this.data=null,super.dispose()}getFilled(){return this.filled}setActive(t,e,n){let i;return[this.pad.x,this.pad.y,this.pad.z]=Array.from(i=[this.width-t,this.height-e,this.depth-n]),i}read(){return this.data}copy(t){const e=Math.min(t.length,this.samples),n=this.data;return function(t,e,n){const i=[],r=t<e,s=n?r?e+1:e-1:e;for(let e=t;r?e<s:e>s;r?e++:e--)i.push(e);return i}(0,e,!1).map((e=>n[e]=t[e]))}fill(){let t,e,n,i;const{callback:r}=this;"function"==typeof r.reset&&r.reset();const{emit:s,skip:a,count:o,done:l,reset:h}=this.streamer;h();const c=this.width,u=this.height,d=this.pad.x,p=this.pad.y,f=this.samples-this.pad.z*c*u;let m=t=e=n=0;if(d>0||p>0)for(;!l()&&n<f&&(n++,i=r(s,m,t,e),++m==c-d&&(a(d),m=0,++t==u-p&&(a(c*p),t=0,e++)),!1!==i););else for(;!l()&&n<f&&(n++,i=r(s,m,t,e),++m===c&&(m=0,++t===u&&(t=0,e++)),!1!==i););return this.filled=1,o()}},renderToTexture:bh,memo:wh,readback:class extends rh{constructor(t,e,n){super(t,e),null==this.items&&(this.items=n.items||1),null==this.channels&&(this.channels=n.channels||4),null==this.width&&(this.width=n.width||1),null==this.height&&(this.height=n.height||1),null==this.depth&&(this.depth=n.depth||1),null==this.type&&(this.type=n.type||vt.FloatType),null==this.stpq&&(this.stpq=n.stpq||!1),this.isFloat=this.type===vt.FloatType,this.active=this.sampled=this.rect=this.pad=null,this.build(n)}build(t){let e,n,i;const{map:r}=t,{indexer:s}=t,a=null!=s&&!s.empty();let{stpq:o}=this;const{items:l,width:h,height:c,depth:u}=this;let d=r;a&&(this._adopt({indexModulus:{type:"v4",value:new vt.Vector4(l,l*h,l*h*c,1)}}),d=this.shaders.shader(),d.require(r),d.require(s),d.pipe("float.index.pack",this.uniforms)),this.isFloat&&this.channels>1&&(this.floatMemo=new wh(this.renderer,this.shaders,{items:l,channels:4,width:h,height:c,depth:u,history:0,type:vt.FloatType}),this.floatCompose=new Eh(this.renderer,this.shaders,{map:d,items:l,width:h,height:c,depth:u,stpq:o}),this.floatMemo.adopt(this.floatCompose),o=!1,d=this.shaders.shader(),this.floatMemo.shaderAbsolute(d)),this.isFloat?(i=this.channels,e=4):(i=1,e=this.channels),i>1?(n=this.shaders.shader(),n.pipe(so(i)),n.require(d),n.pipe("float.stretch"),n.pipe("float.encode"),d=n):this.isFloat&&(n=this.shaders.shader(),n.pipe(d),n.pipe(ho(4,1)),n.pipe("float.encode"),d=n),this.byteMemo=new wh(this.renderer,this.shaders,{items:l*i,channels:e,width:h,height:c,depth:u,history:0,type:vt.UnsignedByteType}),this.byteCompose=new Eh(this.renderer,this.shaders,{map:d,items:l*i,width:h,height:c,depth:u,stpq:o}),this.byteMemo.adopt(this.byteCompose);const p=l*h*i,f=c*u;return this.samples=this.width*this.height*this.depth,this.bytes=new Uint8Array(p*f*4),this.isFloat&&(this.floats=new Float32Array(this.bytes.buffer)),this.data=this.isFloat?this.floats:this.bytes,this.streamer=this.generate(this.data),this.active={items:0,width:0,height:0,depth:0},this.sampled={items:0,width:0,height:0,depth:0},this.rect={w:0,h:0},this.pad={x:0,y:0,z:0,w:0},this.stretch=i,this.isIndexed=a,this.setActive(l,h,c,u)}generate(t){return Za(t,this.samples,4,this.items)}setActive(t,e,n,i){let r;if(t===this.active.items&&e===this.active.width&&n===this.active.height&&i===this.active.depth)return;[this.active.items,this.active.width,this.active.height,this.active.depth]=Array.from([t,e,n,i]),null!=this.floatCompose&&this.floatCompose.cover(e,n,i),null!=this.byteCompose&&this.byteCompose.cover(e*this.stretch,n,i),({items:t}=this),({width:e}=this.active),n=1===this.depth?this.active.height:this.height,({depth:i}=this.active);const s=t*e*this.stretch,a=n*i;return[this.sampled.items,this.sampled.width,this.sampled.height,this.sampled.depth]=Array.from([t,e,n,i]),[this.rect.w,this.rect.h]=Array.from([s,a]),[this.pad.x,this.pad.y,this.pad.z,this.pad.w]=Array.from(r=[this.sampled.width-this.active.width,this.sampled.height-this.active.height,this.sampled.depth-this.active.depth,this.sampled.items-this.active.items]),r}update(t){return null!=this.floatMemo&&this.floatMemo.render(t),null!=this.byteMemo?this.byteMemo.render(t):void 0}post(){const t=this.renderer.getRenderTarget();this.renderer.setRenderTarget(this.byteMemo.target.targets[0]),this.gl.readPixels(0,0,this.rect.w,this.rect.h,this.gl.RGBA,this.gl.UNSIGNED_BYTE,this.bytes),this.renderer.setRenderTarget(t)}readFloat(t){return null!=this.floatMemo?this.floatMemo.read(t):void 0}readByte(t){return null!=this.byteMemo?this.byteMemo.read(t):void 0}setCallback(t){this.emitter=this.callback(t)}callback(t){if(!this.isIndexed)return t;const e=this.width,n=this.height,i=this.items,r=function(r,s,a,o){let l=o;const h=l%i;l=(l-h)/i;const c=l%e;l=(l-c)/e;const u=l%n;l=(l-u)/n;return t(r,s,a,o,c,u,l,h)};return r.reset=()=>"function"==typeof t.reset?t.reset():void 0,r}iterate(){let t,e,n,i=this.emitter;"function"==typeof i.reset&&i.reset();const{consume:r,skip:s,count:a,done:o,reset:l}=this.streamer;l();const h=0|this.sampled.width;let c=0|this.sampled.height;const u=0|this.sampled.depth,d=0|this.sampled.items,p=0|this.pad.x,f=0|this.pad.y,m=0|this.pad.z,g=0|this.pad.w,v=h*c*d*(u-m);if(!this.isIndexed){const r=i;i=(i,s,a,o)=>r(i,s,a,o,x,t,e,n)}let x=t=e=n=c=0;for(;!o()&&c<v;){c++;const a=r(i);if(++n==d-g&&(s(p),n=0,++x==h-p&&(s(d*p),x=0,++t==c-f&&(s(d*h*f),t=0,e++))),!1===a)break}return Math.floor(a()/d)}dispose(){return null!=this.floatMemo&&this.floatMemo.unadopt(this.floatCompose),null!=this.floatMemo&&this.floatMemo.dispose(),null!=this.floatCompose&&this.floatCompose.dispose(),null!=this.byteMemo&&this.byteMemo.unadopt(this.byteCompose),null!=this.byteMemo&&this.byteMemo.dispose(),null!=this.byteCompose&&this.byteCompose.dispose(),this.floatMemo=this.byteMemo=this.floatCompose=this.byteCompose=null}},atlas:gh,textAtlas:class extends gh{constructor(t,e,n){let i;if(n.width||(n.width=256),n.height||(n.height=256),n.type=vt.UnsignedByteType,n.channels=1,n.backed=!0,super(t,e,n,!1),this.font=null!=n.font?n.font:["sans-serif"],this.size=n.size||24,this.style=null!=n.style?n.style:"normal",this.variant=null!=n.variant?n.variant:"normal",this.weight=null!=n.weight?n.weight:"normal",this.outline=null!=(i=+(null!=n.outline?n.outline:5))?i:0,this.gamma=1,"undefined"!=typeof navigator){const t=navigator.userAgent;t.match(/Chrome/)&&t.match(/OS X/)&&(this.gamma=.5)}this.scratchW=this.scratchH=0,this.build(n)}build(t){super.build(t);let e=16;e=this.size,e+=4+2*Math.min(1,this.outline);const n=32*e,i=document.createElement("canvas");i.width=n,i.height=e;const r=this.font.map((t=>`${t.replace(/(['"\\])/g,"\\$1")}`)).join(", "),s=i.getContext("2d");s.font=`${this.style} ${this.variant} ${this.weight} ${this.size}px ${r}`,s.fillStyle="#FF0000",s.textAlign="left",s.textBaseline="bottom",s.lineJoin="round";const a=[];for(let t=0,e=3*this.outline,n=0<=e;n?t<e:t>e;n?t++:t--){const e=("00"+Math.max(0,8*-t+128-8*!t).toString(16)).slice(-2);a.push("#"+e+e+e)}const o=new Uint8Array(n*e*2);return this.canvas=i,this.context=s,this.lineHeight=e,this.maxWidth=n,this.colors=a,this.scratch=o,this._allocate=this.allocate.bind(this),this._write=this.write.bind(this)}reset(){return super.reset(),this.mapped={}}begin(){return Array.from(this.rows).map((t=>t.alive=0))}end(){const{mapped:t}=this;for(const e of Array.from(this.rows.slice()))if(0===e.alive){for(const n of Array.from(e.keys))delete t[n];this.collapse(e)}}map(t,e){const{mapped:n}=this,i=n[t];if(null!=i)return i.row.alive++,e(i.x,i.y,i.w,i.h);this.draw(t);const r=this.scratch,s=this.scratchW,a=this.scratchH,o=this._allocate,l=this._write;return o(t,s,a,(function(i,o,h){return n[t]={x:o,y:h,w:s,h:a,row:i},l(r,o,h,s,a),e(o,h,s,a)}))}draw(t){let e,n,i,r=this.width;const s=this.lineHeight,a=this.outline,o=this.context,l=this.scratch,h=this.maxWidth,{colors:c}=this,u=a+1,d=Math.round(1.05*s-1),p=o.measureText(t);if(r=Math.min(h,Math.ceil(p.width+2*u+1)),o.clearRect(0,0,r,s),0===this.outline){let a,h;for(o.fillText(t,u,d),({data:e}=o.getImageData(0,0,r,s)),i=3,n=0,h=e.length/4,a=0<=h;a?n<h:n>h;a?n++:n--)l[n]=e[i],i+=4;return this.scratchW=r,this.scratchH=s}{let h,p,f,m;for(o.globalCompositeOperation="source-over",p=a+1,n=p,h=p<=1;h?n<=1:n>=1;h?n++:n--)i=n>1?2*n-2:n,o.strokeStyle=c[i-1],o.lineWidth=i,o.strokeText(t,u,d);o.globalCompositeOperation="multiply",o.fillText(t,u,d),({data:e}=o.getImageData(0,0,r,s)),i=0;const{gamma:g}=this;for(n=0,m=e.length/4,f=0<=m;f?n<m:n>m;f?n++:n--){const t=e[i];let r=t?e[i+1]/t:1;.5===g&&(r=Math.sqrt(r)),r=Math.min(1,Math.max(0,r));const s=256-t,a=s+(t-s)*r;l[n]=Math.max(0,Math.min(255,a+2)),i+=4}return this.scratchW=r,this.scratchH=s}}},scene:ah};class Dh{static initClass(){this.index=0,this.IN=0,this.OUT=1}static id(t){return++Dh.index}constructor(t,e=null){this.parent=e,this.id=Dh.id(),this.nodes=[],t&&this.add(t)}inputs(){const t=[];for(const e of Array.from(this.nodes))for(const n of Array.from(e.inputs))null===n.input&&t.push(n);return t}outputs(){const t=[];for(const e of Array.from(this.nodes))for(const n of Array.from(e.outputs))0===n.output.length&&t.push(n);return t}getIn(t){return Array.from(this.inputs()).filter((e=>e.name===t))[0]}getOut(t){return Array.from(this.outputs()).filter((e=>e.name===t))[0]}add(t,e){if(t.length)for(const e of Array.from(t))this.add(e);else{if(t.graph&&!e)throw new Error("Adding node to two graphs at once");t.graph=this,this.nodes.push(t)}}remove(t,e){if(t.length)for(const e of Array.from(t))this.remove(e);else{if(t.graph!==this)throw new Error("Removing node from wrong graph.");e||t.disconnect(),this.nodes.splice(this.nodes.indexOf(t),1),t.graph=null}}adopt(t){if(t.length)for(const e of Array.from(t))this.adopt(e);else t.graph.remove(t,!0),this.add(t,!0)}}Dh.initClass();class kh{static initClass(){this.index=0}static make(t,e){null==e&&(e={});const n=e;if(null!=t.meta)for(const e in t.meta){const i=t.meta[e];n[e]=i}return new kh(t.inout,t.name,t.hint,t.type,n)}static id(t){return`_io_${++kh.index}_${t}`}static hint(t){return(t=(t=t.replace(/^_io_[0-9]+_/,"")).replace(/_i_o$/,"")).replace(/(In|Out|Inout|InOut)$/,"")}constructor(t,e,n,i,r,s){this.inout=t,this.name=e,this.hint=n,this.type=i,null==r&&(r={}),this.meta=r,this.id=s,null==this.hint&&(this.hint=kh.hint(this.name)),this.node=null,this.input=null,this.output=[],null==this.id&&(this.id=kh.id(this.hint))}morph(t){return this.inout=t.inout,this.name=t.name,this.hint=t.hint,this.type=t.type,this.meta=t.meta}dupe(t){null==t&&(t=this.id);const e=kh.make(this);return e.name=t,e}connect(t){if(this.inout===Dh.IN&&t.inout===Dh.OUT)return t.connect(this);if(this.inout!==Dh.OUT||t.inout!==Dh.IN)throw new Error("Can only connect out to in.");return t.input!==this?(t.disconnect(),t.input=this,this.output.push(t)):void 0}disconnect(t){if(this.input&&this.input.disconnect(this),this.output.length){if(!t){for(t of Array.from(this.output))t.input=null;return this.output=[]}{const e=this.output.indexOf(t);if(e>=0)return this.output.splice(e,1),t.input=null}}}}kh.initClass();class Ph{static initClass(){this.index=0}static id(t){return++Ph.index}constructor(t,e){this.owner=t,this.graph=null,this.inputs=[],this.outputs=[],this.all=[],this.outlets=null,this.id=Ph.id(),this.setOutlets(e)}getIn(t){return Array.from(this.inputs).filter((e=>e.name===t))[0]}getOut(t){return Array.from(this.outputs).filter((e=>e.name===t))[0]}get(t){return this.getIn(t)||this.getOut(t)}setOutlets(t){if(null!=t){let e;if(null==this.outlets){for(e of(this.outlets={},Array.from(t)))e instanceof kh||(e=kh.make(e)),this._add(e);return}const n=t=>[t.name,t.inout,t.type].join("-"),i={};for(e of Array.from(t))i[n(e)]=!0;for(let t in this.outlets)e=this.outlets[t],t=n(e),i[t]?i[t]=e:this._remove(e);for(e of Array.from(t)){const t=i[n(e)];t instanceof kh?this._morph(t,e):(e instanceof kh||(e=kh.make(e)),this._add(e))}}return this.outlets}connect(t,e,n){let i,r,s,a,o;const l={},h={},c=t=>o+"/"+t.hint;for(i of Array.from(t.inputs)){let t;!n&&i.input||(({type:o}=i),s=c(i),h[s]||(h[s]=i),l[o]=t=l[o]||[],t.push(i))}let u=this.outputs;for(a of(u=u.filter((t=>!(e&&t.output.length))),Array.from(u.slice())))({type:o}=a),s=c(a),r=l[o],(i=h[s])&&(a.connect(i),delete h[s],r.splice(r.indexOf(i),1),u.splice(u.indexOf(a),1));if(!u.length)return this;for(a of Array.from(u.slice()))({type:o}=a),r=l[o],r&&r.length&&a.connect(r.shift());return this}disconnect(t){let e;for(e of Array.from(this.inputs))e.disconnect();for(e of Array.from(this.outputs))e.disconnect();return this}_key(t){return[t.name,t.inout].join("-")}_add(t){const e=this._key(t);if(t.node)throw new Error("Adding outlet to two nodes at once.");if(this.outlets[e])throw new Error(`Adding two identical outlets to same node. (${e})`);return t.node=this,t.inout===Dh.IN&&this.inputs.push(t),t.inout===Dh.OUT&&this.outputs.push(t),this.all.push(t),this.outlets[e]=t}_morph(t,e){let n=this._key(e);return delete this.outlets[n],t.morph(e),n=this._key(e),this.outlets[n]=e}_remove(t){const e=this._key(t);if(t.node!==this)throw new Error("Removing outlet from wrong node.");return t.disconnect(),t.node=null,delete this.outlets[e],t.inout===Dh.IN&&this.inputs.splice(this.inputs.indexOf(t),1),t.inout===Dh.OUT&&this.outputs.splice(this.outputs.indexOf(t),1),this.all.splice(this.all.indexOf(t),1),this}}Ph.initClass();const{IN:Lh,OUT:zh}=Dh;class Oh{static initClass(){this.index=0}static namespace(){return`_sn_${++Oh.index}_`}static load(t,e,n){const i=t.parse(e,n),[r,s]=Array.from(t.compile(i));return new Oh(t,r,s,e,n)}constructor(t,e,n,i,r){this.language=t,this._signatures=e,this._compiler=n,this._name=i,this._original=r,this.namespace=null,this.code=null,this.main=null,this.entry=null,this.uniforms=null,this.externals=null,this.symbols=null,this.attributes=null,this.varyings=null,this.language||delete this.language,this._signatures||delete this._signatures,this._compiler||delete this._compiler,this._original||delete this._original,this._name||(this._name=null!=this._signatures?this._signatures.main.name:void 0)}clone(){return new Oh(this.language,this._signatures,this._compiler,this._name,this._original)}bind(t,e,n,i){let r,s,a;e===""+e?[n,e,i]=Array.from([e,null!=n?n:{},null!=i?i:{}]):n!==""+n&&([i,n]=Array.from([null!=n?n:{},void 0])),this.main=this._signatures.main,this.namespace=null!=(s=null!=n?n:this.namespace)?s:Oh.namespace(),this.entry=this.namespace+this.main.name,this.uniforms={},this.varyings={},this.attributes={},this.externals={},this.symbols=[];const o={},l={},h=function(t){return l[t]=!0,t},c=t=>this.namespace+t;if(t.globals)for(const e of Array.from(t.globals))h(e);const u=t.globalUniforms?h:c,d=t.globalVaryings?h:c,p=t.globalAttributes?h:c,f=c,m=t=>o[t.name]=!0,g=(t,e)=>this.uniforms[u(null!=e?e:t.name)]=t;a=t=>this.varyings[d(t.name)]=t;const v=t=>this.attributes[p(t.name)]=t,x=t=>{const e=f(t.name);return this.externals[e]=t,this.symbols.push(e)},_=t=>({type:t.type,name:t.name,value:t.value});for(r of Array.from(this._signatures.uniform))m(r);for(r of Array.from(this._signatures.uniform))g(_(r));for(r of Array.from(this._signatures.varying))a(_(r));for(r of Array.from(this._signatures.external))x(r);for(r of Array.from(this._signatures.attribute))v(_(r));for(const t in e)r=e[t],o[t]&&g(r,t);if(this.body=this.code=this._compiler(this.namespace,l,i),i){const t=(()=>{const t=[];for(const e in i)a=i[e],t.push(`#define ${e} ${a}`);return t})().join("\n");t.length&&(this._original=[t,"//----------------------------------------",this._original].join("\n"))}return null}}Oh.initClass();var Ih=i(3981);const Nh=function(t,e,n,i){const r=t,s={},a=[],o={},l={},h={},c={},u=t=>{let e;(t=(()=>{const n=[];for(const i in t)e=t[i],n.push(e);return n})()).sort(((t,e)=>e.priority-t.priority));const n=(t,e,n)=>{p(t,e,n);const{main:s}=e,{entry:a}=e;return r.call((e=>g(t,e)),(e=>m(t,e)),a,s.signature,i)},i=r.body();for(e of Array.from(t))n(e.node,e.module,e.priority);return[i,t]},d=function(t,e,n){const i=c[t];return null!=i?i.priority=Ih.max(i.priority,n):c[t]={code:e,priority:n}},p=function(t,e,n){let i,r;n=Ih.make(n);for(const t in e.library){const i=e.library[t];d(t,i.code,Ih.nest(n,i.priority))}for(r in d(e.namespace,e.body,n),e.uniforms)i=e.uniforms[r],o[r]=i;for(r in e.varyings)i=e.varyings[r],l[r]=i;for(r in e.attributes)i=e.attributes[r],h[r]=i;return f(t,e)},f=(t,e)=>(()=>{const n=[];for(const i of Array.from(e.symbols)){const r=e.externals[i];if(m(t,r.name)){const e={};for(const t in r){const n=r[t];e[t]=n}e.name=g(t,r.name),s[i]=e,n.push(a.push(i))}else n.push(void 0)}return n})(),m=function(t,e){const n=t.get(e);return n.inout===Lh?null===n.input:n.inout===zh?0===n.output.length:void 0},g=function(t,e){let n=t.get(e);return n?(n.input&&(n=n.input),({name:e}=n),n.id):null};return function(){let t,d;for(d in i){const t=i[d];f(t.node,t.module)}[t,n]=Array.from(u(n)),null!=e&&(t.entry=e);const p=r.build(t,n),m=(()=>{const t=[];for(d in c){const e=c[d];t.push(e)}return t})().sort(((t,e)=>Ih.compare(t.priority,e.priority))),g=m.map((t=>t.code));g.push(p.code);const v=r.lines(g);return{namespace:p.name,library:c,body:p.code,code:v,main:p,entry:p.name,symbols:a,externals:s,uniforms:o,varyings:l,attributes:h}}()};class Fh{static initClass(){this.index=0}static entry(){return`_pg_${++Fh.index}_`}constructor(t,e,n){this.language=t,this.namespace=e,this.graph=n,this.calls={},this.requires={}}call(t,e,n){let i;const r=e.namespace;return(i=this.calls[r])?i.priority=Math.max(i.priority,n):this.calls[r]={node:t,module:e,priority:n},this}require(t,e){const n=e.namespace;return this.requires[n]={node:t,module:e}}assemble(){const t=Nh(this.language,null!=this.namespace?this.namespace:Fh.entry,this.calls,this.requires),e=new Oh;for(const n in t)e[n]=t[n];return e.graph=this.graph,e}}Fh.initClass();const Uh=function(t,e,n,i){const r=t;let s=[];const a=[],o={},l={},h={},c={},u={},d=function(t,e,n){const i=u[t];return null!=i?i.priority=Ih.max(i.priority,n):u[t]={code:e,priority:n}},p=function(t,e,n){let i,r;n=Ih.make(n);for(const t in e.library){const i=e.library[t];d(t,i.code,Ih.nest(n,i.priority))}for(r in d(e.namespace,e.body,n),e.uniforms)i=e.uniforms[r],l[r]=i;for(r in e.varyings)i=e.varyings[r],c[r]=i;for(r in e.attributes)i=e.attributes[r],h[r]=i;return(()=>{const n=[];for(r of Array.from(e.symbols)){const i=e.externals[r];f(t,i.name)?(o[r]=i,n.push(a.push(r))):n.push(void 0)}return n})()},f=function(t,e){const n=t.get(e);if(!n){const n=null!=(null!=t.owner.snippet?t.owner.snippet._name:void 0)?null!=t.owner.snippet?t.owner.snippet._name:void 0:t.owner.namespace;throw new Error(`Unable to link program. Unlinked callback \`${e}\` on \`${n}\``)}return n.inout===Lh?null===n.input:n.inout===zh?0===n.output.length:void 0};return function(){const t=r.links(e),a=[];null!=t.defs&&a.push(t.defs),null!=t.bodies&&a.push(t.bodies);for(const t of Array.from(n))p(t.node,t.module,t.priority);const d=(()=>{const t=[];for(const e in u){const n=u[e];t.push(n)}return t})().sort(((t,e)=>Ih.compare(t.priority,e.priority)));s=d.map((t=>t.code));let f=r.lines(s);f=r.defuse(f),a.length&&(f=[r.lines(a),f].join("\n")),f=r.hoist(f),f=r.dedupe(f);const m=i;return{namespace:m.main.name,code:f,main:m.main,entry:m.main.name,externals:o,uniforms:l,attributes:h,varyings:c}}()};class Bh{constructor(t,e){this.language=t,this.graph=e,this.links=[],this.includes=[],this.modules={},this.visits={}}callback(t,e,n,i,r){return this.links.push({node:t,module:e,priority:n,name:i,external:r})}include(t,e,n){let i;return null!=(i=this.modules[e.namespace])?i.priority=Math.max(n,i.priority):(this.modules[e.namespace]=!0,this.includes.push({node:t,module:e,priority:n}))}visit(t){return!this.visits[t]&&(this.visits[t]=!0)}link(t){const e=Uh(this.language,this.links,this.includes,t),n=new Oh;for(const t in e)n[t]=e[t];return n.graph=this.graph,n}}const{load:Vh}=Oh;class Hh{static previous(t){return null!=t.input?t.input.node.owner:void 0}constructor(t){null==t&&(t=!1),t||this.construct()}construct(){let t;return null==this.namespace&&(this.namespace=Fh.entry()),this.node=new Ph(this,null!=(t="function"==typeof this.makeOutlets?this.makeOutlets():void 0)?t:{})}refresh(){let t;return this.node.setOutlets(null!=(t="function"==typeof this.makeOutlets?this.makeOutlets():void 0)?t:{})}clone(){return new Hh}compile(t,e){const n=new Fh(t,null!=e?e:Fh.entry(),this.node.graph);return this.call(n,0),n.assemble()}link(t,e){const n=this.compile(t,e),i=new Bh(t,this.node.graph);return this._include(n,i,0),this.export(i,0),i.link(n)}call(t,e){}callback(t,e,n,i,r){}export(t,e){}_info(t){let e=null!=(null!=this.node.owner.snippet?this.node.owner.snippet._name:void 0)?null!=this.node.owner.snippet?this.node.owner.snippet._name:void 0:this.node.owner.namespace;if(null!=t)return e+"."+t}_outlet(t,e){const n=kh.make(t,e);return n.meta.def=t,n}_call(t,e,n){return e.call(this.node,t,n)}_require(t,e){return e.require(this.node,t)}_inputs(t,e,n){return(()=>{const i=[];for(const r of Array.from(t.main.signature)){const t=this.node.get(r.name);i.push(jh(Hh.previous(t),(t=>t.call(e,n+1))))}return i})()}_callback(t,e,n,i,r,s){return e.callback(this.node,t,n,i,r,s)}_include(t,e,n){return e.include(this.node,t,n)}_link(t,e,n){return(()=>{const i=[];for(const r of Array.from(t.symbols)){const s=t.externals[r];let a=this.node.get(s.name);if(!a)throw new Gh(`External not found on ${this._info(s.name)}`);if(null!=a.meta.child)continue;let o,l=a;for(;!o&&l;)[l,a]=Array.from([a.meta.parent,l]);if(o=Hh.previous(a),!o)throw new Gh(`Missing connection on ${this._info(s.name)}`);o.callback(e,n+1,r,s,a.input),i.push(null!=o?o.export(e,n+1):void 0)}return i})()}_trace(t,e,n){return(()=>{const i=[];for(const r of Array.from(t.main.signature)){const t=this.node.get(r.name);i.push(jh(Hh.previous(t),(t=>t.export(e,n+1))))}return i})()}}const Gh=function(t){const e=new Error(t);return e.name="OutletError",e};function jh(t,e){return null!=t?e(t):void 0}Gh.prototype=new Error;class qh extends Hh{constructor(t){super(!0),this.snippet=t,this.namespace=t.namespace,this.construct()}clone(){return new qh(this.snippet)}makeOutlets(){const t=this.snippet.main.signature,{externals:e}=this.snippet,{symbols:n}=this.snippet,i=Array.from(t).map((t=>this._outlet(t,{callback:!1}))),r=Array.from(n).map((t=>this._outlet(e[t],{callback:!0})));return i.concat(r)}call(t,e){return this._call(this.snippet,t,e),this._inputs(this.snippet,t,e)}export(t,e){if(t.visit(this.namespace,e))return this._link(this.snippet,t,e),this._trace(this.snippet,t,e)}}class Wh extends Hh{constructor(t){super(!0),this.graph=t,this.construct()}refresh(){return super.refresh(),delete this.subroutine}clone(){return new Wh(this.graph)}makeOutlets(){let t;this.make();const e=[];let n=[],i=[];const r=(t,n)=>{if(!t.meta.callback)return n.push(t.type);if(t.inout===Dh.IN){const n=t.dupe();return null==n.meta.child&&(n.meta.child=t),t.meta.parent=n,e.push(n)}};for(t of Array.from(this.graph.inputs()))r(t,n);for(t of Array.from(this.graph.outputs()))r(t,i);n=n.join(","),i=i.join(",");const s=`(${n})(${i})`;return e.push({name:"callback",type:s,inout:Dh.OUT,meta:{callback:!0,def:this.subroutine.main}}),e}make(){return this.subroutine=this.graph.compile(this.namespace)}export(t,e){if(t.visit(this.namespace,e))return this._link(this.subroutine,t,e),this.graph.export(t,e)}call(t,e){return this._require(this.subroutine,t,e)}callback(t,e,n,i,r){return this._include(this.subroutine,t,e),this._callback(this.subroutine,t,e,n,i,r)}}class Xh extends Hh{constructor(t){super(!0),this.graph=t,this.construct()}refresh(){return super.refresh(),delete this.subroutine}clone(){return new Xh(this.graph)}makeOutlets(){this.make();const t=[],e={},n={};for(const i of["inputs","outputs"])for(const r of Array.from(this.graph[i]())){let i;["return","callback"].includes(r.hint)&&r.inout===Dh.OUT&&(i=r.hint),null!=e[i]&&(i=void 0);const s=r.dupe(i);null==s.meta.child&&(s.meta.child=r),r.meta.parent=s,null!=i&&(e[i]=!0),n[r.name]=s,t.push(s)}return t}make(){return this.subroutine=this.graph.compile(this.namespace)}call(t,e){return this._call(this.subroutine,t,e),this._inputs(this.subroutine,t,e)}export(t,e){if(t.visit(this.namespace,e))return this._link(this.subroutine,t,e),this._trace(this.subroutine,t,e),this.graph.export(t,e)}callback(t,e,n,i,r){return(r=r.meta.child).node.owner.callback(t,e,n,i,r)}}class Yh extends Hh{constructor(t){super(!0),this.nodes=t,this.construct()}clone(){return new Yh(this.nodes)}makeOutlets(){return[]}call(t,e){return(()=>{const n=[];for(const i of Array.from(this.nodes)){const r=i.owner;n.push(r.call(t,e))}return n})()}export(t,e){return(()=>{const n=[];for(const i of Array.from(this.nodes)){const r=i.owner;n.push(r.export(t,e))}return n})()}}const $h=function(t){const e=[],n=[];for(const i of Array.from(t.nodes)){let t;const r={id:i.id,name:null,type:null,depth:null,graph:null,inputs:[],outputs:[]};e.push(r);const{inputs:s}=r,{outputs:a}=r,o=i.owner;o instanceof qh?(r.name=o.snippet._name,r.type="call",r.code=o.snippet._original):o instanceof Wh?(r.name="Callback",r.type="callback",r.graph=$h(o.graph)):o instanceof Xh?(r.name="Isolate",r.type="isolate",r.graph=$h(o.graph)):o instanceof Yh?(r.name="Join",r.type="join"):null!=o&&(null==r.name&&(r.name=null!=o.name?o.name:o.type),null==r.type&&(r.type=o.type),null==r.code&&(r.code=o.code),null!=o.graph&&(r.graph=$h(o.graph)));const l=function(t){return(t=t.replace(")(",")→(")).replace("()","")};for(t of Array.from(i.inputs))s.push({id:t.id,name:t.name,type:l(t.type),open:null==t.input});for(t of Array.from(i.outputs)){a.push({id:t.id,name:t.name,type:l(t.type),open:!t.output.length});for(const e of Array.from(t.output))n.push({from:i.id,out:t.id,to:e.node.id,in:e.id,type:l(t.type)})}}return{nodes:e,links:n}};let Zh=function(t,e){const n=65535&t,i=65535&e;return n*i+((t>>>16&65535)*i+n*(e>>>16&65535)<<16>>>0)|0};if(null!=Math.imul){-5===Math.imul(4294967295,5)&&({imul:Zh}=Math)}const Kh=function(t){let e;const n=t.length;let i=Math.floor(n/2),r=e=0;const s=()=>t.charCodeAt(r++),a=function(t,n){let i=t|n<<16;return i^=i<<9,i=Zh(i,3432918353),i=i<<15|i>>>17,i=Zh(i,461845907),e^=i,e=e<<13|e>>>19,e=Zh(e,5),e=e+3864292196|0};for(;i--;)a(s(),s());return 1&n&&a(s(),0),e^=n,e^=e>>>16,e=Zh(e,2246822507),e^=e>>>13,e=Zh(e,3266489909),e^=e>>>16},Jh=t=>(""+t).replace(/^\s+|\s+$/g,""),Qh=function(t,e){null==e&&(e=1);const n=1193046^Kh(t);let i=255&n,r=n>>>8&255,s=n>>>16&255;const a=Math.max(i,r,s),o=140/a,l=Math.round(a/3);return i=Math.min(255,Math.round(o*Math.max(i,l))),r=Math.min(255,Math.round(o*Math.max(r,l))),s=Math.min(255,Math.round(o*Math.max(s,l))),((t,e,n,i)=>"rgba("+[t,e,n,i].join(", ")+")")(i,r,s,e)},tc=function(t){return(t=null!=t?t:"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/'/g,"&#39;").replace(/"/g,"&quot;")},ec=function(t){const e=[],n=ic(t,e);return n.update=()=>oc(n,e),nc(n),n},nc=function(t){const e=t.querySelectorAll(".shadergraph-code");return Array.from(e).map((t=>function(){const e=t;return e.parentNode.classList.add("shadergraph-has-code"),e.parentNode.addEventListener("click",(t=>e.style.display={block:"none",none:"block"}[e.style.display||"none"]))}()))},ic=function(t,e){let n;!function(t){let e,n;const i={},r={};for(n of Array.from(t.nodes))i[n.id]=n;for(e of Array.from(t.links))null==r[e.from]&&(r[e.from]=[]),r[e.from].push(e);const s=function(t,n){let a;if(null==n&&(n=0),t.depth=Math.max(null!=t.depth?t.depth:0,n),a=r[t.id])for(e of Array.from(a))s(i[e.to],n+1);return null};for(n of Array.from(t.nodes))null==n.depth&&s(n)}(t);const i=document.createElement("div");i.classList.add("shadergraph-graph");const r=[],s={};for(const i of Array.from(t.nodes)){let t;const a=document.createElement("div");a.classList.add("shadergraph-node"),a.classList.add(`shadergraph-node-${i.type}`),a.innerHTML=`<div class="shadergraph-header">${tc(i.name)}</div>`;const o=function(t,e){const n=Qh(t.type),i=document.createElement("div");return i.classList.add("shadergraph-outlet"),i.classList.add(`shadergraph-outlet-${e}`),i.innerHTML=`<div class="shadergraph-point" style="background: ${n}"></div>\n<div class="shadergraph-type" style="color: ${n}">${tc(t.type)}</div>\n<div class="shadergraph-name">${tc(t.name)}</div>`,a.appendChild(i),s[t.id]=i.querySelector(".shadergraph-point")};for(t of Array.from(i.inputs))o(t,"in");for(t of Array.from(i.outputs))o(t,"out");if(null!=i.graph)a.appendChild(ic(i.graph,e));else{const t=document.createElement("div");t.classList.add("shadergraph-clear"),a.appendChild(t)}if(null!=i.code){const t=document.createElement("div");t.classList.add("shadergraph-code"),t.innerHTML=tc(Jh(i.code)),a.appendChild(t)}n=r[i.depth],null==n&&(n=document.createElement("div"),n.classList.add("shadergraph-column"),r[i.depth]=n),n.appendChild(a)}for(n of Array.from(r))null!=n&&i.appendChild(n);for(const n of Array.from(t.links)){const t=Qh(n.type);e.push({color:t,out:s[n.out],in:s[n.in]})}return i},rc=t=>t*t,sc=function(t,e,n,i){let r;const s=n-t,a=i-e,o=Math.sqrt(rc(s)+rc(a));if(Math.abs(a)>Math.abs(s)){const l=(t+n)/2,h=(e+i)/2,c=a>0?.3:-.3;return r=Math.min(Math.abs(s)/2,20+o/8),["M",t,e,"C",t+r,e+",",l,h-o*c,l,h,"C",l,h+o*c,n-r,i+",",n,i].join(" ")}return r=Math.min(Math.abs(s)/2.5,20+o/4),["M",t,e,"C",t+r,e+",",n-r,i+",",n,i].join(" ")},ac=function(t){return null==t&&(t="svg"),document.createElementNS("http://www.w3.org/2000/svg",t)},oc=function(t,e){let n;if(null==t.parentNode)return;const i=t.getBoundingClientRect();for(n of Array.from(e)){const t=n.out.getBoundingClientRect(),e=n.in.getBoundingClientRect();n.coords={x1:(t.left+t.right)/2-i.left,y1:(t.top+t.bottom)/2-i.top,x2:(e.left+e.right)/2-i.left,y2:(e.top+e.bottom)/2-i.top}}let r=t.querySelector("svg");null!=r&&t.removeChild(r);let s=t;for(;s.parentNode&&0===s.offsetHeight;)s=s.parentNode;for(n of(r=ac(),r.setAttribute("width",s.offsetWidth),r.setAttribute("height",s.offsetHeight),Array.from(e))){const t=n.coords,e=ac("path");e.setAttribute("d",sc(t.x1,t.y1,t.x2,t.y2)),e.setAttribute("stroke",n.color),e.setAttribute("stroke-width",3),e.setAttribute("fill","transparent"),r.appendChild(e)}return t.appendChild(r)},lc=function(t){const e=document.createElement("div");e.setAttribute("class","shadergraph-overlay");const n=document.createElement("div");n.setAttribute("class","shadergraph-close"),n.innerHTML="&times;";const i=document.createElement("div");i.setAttribute("class","shadergraph-view");const r=document.createElement("div");return r.setAttribute("class","shadergraph-inside"),r.appendChild(t),i.appendChild(r),e.appendChild(i),e.appendChild(n),n.addEventListener("click",(()=>e.parentNode.removeChild(e))),e},hc=function(t){if(t instanceof Node)return t;const e=document.createElement("span");return e.innerText=null!=t?t:"",e},cc=function(t){if(1!==t.length){let e;const n=document.createElement("div");for(e of Array.from(t))n.appendChild(hc(e));return n.update=()=>(()=>{const n=[];for(e of Array.from(t))n.push("function"==typeof e.update?e.update():void 0);return n})(),n}return hc(t[0])},uc=$h,dc=x,pc=function(t){if(!t)return;if(!t.nodes)return t;const e=uc(t);return dc.process(e)},fc=function(t){return null==t?t:t instanceof Array?t.map(fc):null!=t.vertex&&null!=t.fragment?[fc(t.vertex,fc(t.fragment))]:null!=t._graph?t._graph:null!=t.graph?t.graph:t},mc=function(t){let e=[];for(const n of Array.from(t))n instanceof Array?e=e.concat(mc(n)):null!=n&&e.push(n);return e},gc=function(){const t=mc(fc([].slice.call(arguments)));return dc.merge(Array.from(t).filter((t=>t)).map((t=>pc(t))))},vc=function(){const t=gc.apply(null,arguments),e=dc.overlay(t);for(const t of Array.from(document.querySelectorAll(".shadergraph-overlay")))t.remove();return document.body.appendChild(e),t.update(),e};class xc{constructor(t,e,n){this.language=t,this.fetch=e,this.config=n,this.graph()}pipe(t,e,n,i){return t instanceof xc?this._concat(t):null!=t&&this._call(t,e,n,i),this}call(t,e,n,i){return this.pipe(t,e,n,i)}require(t,e,n,i){return t instanceof xc?this._import(t):null!=t&&(this.callback(),this._call(t,e,n,i),this.end()),this}import(t,e,n,i){return this.require(t,e,n,i)}split(){return this._group("_combine",!0),this}fan(){return this._group("_combine",!1),this}isolate(){return this._group("_isolate"),this}callback(){return this._group("_callback"),this}next(){return this._next(),this}pass(){const t=this._stack[2].end;return this.end(),this._state.end=this._state.end.concat(t),this}end(){const[t,e]=Array.from(this._exit()),{op:n}=t;return this[n]&&this[n](t,e),this}join(){return this.end()}graph(){for(;(null!=this._stack?this._stack.length:void 0)>1;)this.end();this._graph&&this._tail(this._state,this._graph);const t=this._graph;return this._graph=new Dh,this._state=new _c,this._stack=[this._state],t}compile(t){return null==t&&(t="main"),this.graph().compile(t)}link(t){return null==t&&(t="main"),this.graph().link(t)}serialize(){return uc(this._graph)}empty(){return 0===this._graph.nodes.length}_concat(t){let e;if(0===t._state.nodes.length)return this;this._tail(t._state,t._graph);try{e=new Xh(t._graph)}catch(e){throw this.config.autoInspect&&vc(e,this._graph,t),e}return this._auto(e),this}_import(t){let e;if(0===t._state.nodes.length)throw"Can't import empty callback";this._tail(t._state,t._graph);try{e=new Wh(t._graph)}catch(e){throw this.config.autoInspect&&vc(e,this._graph,t),e}return this._auto(e),this}_combine(t,e){for(const n of Array.from(t.start))for(const i of Array.from(e.end))i.connect(n,t.multi);return e.end=t.end,e.nodes=e.nodes.concat(t.nodes)}_isolate(t,e){if(t.nodes.length){let e;const n=this._subgraph(t);this._tail(t,n);try{e=new Xh(n)}catch(t){throw this.config.autoInspect&&vc(t,this._graph,n),t}return this._auto(e)}}_callback(t,e){if(t.nodes.length){let e;const n=this._subgraph(t);this._tail(t,n);try{e=new Wh(n)}catch(t){throw this.config.autoInspect&&vc(t,this._graph,n),t}return this._auto(e)}}_call(t,e,n,i){const r=this.fetch(t);r.bind(this.config,e,n,i);const s=new qh(r);return this._auto(s)}_subgraph(t){const e=new Dh(null,this._graph);return e.adopt(t.nodes),e}_tail(t,e){let n=t.end.concat(t.tail);if(n=n.filter(((t,e)=>n.indexOf(t)===e)),n.length>1&&(n=new Yh(n),n=[n.node],this._graph.add(n)),e.tail=n[0],t.end=n,t.tail=[],!e.tail)throw new Error("Cannot finalize empty graph");return e.compile=t=>{null==t&&(t="main");try{return e.tail.owner.compile(this.language,t)}catch(t){throw this.config.autoInspect&&e.inspect(t),t}},e.link=t=>{null==t&&(t="main");try{return e.tail.owner.link(this.language,t)}catch(t){throw this.config.autoInspect&&e.inspect(t),t}},e.export=(t,n)=>e.tail.owner.export(t,n),e.inspect=(t=null)=>vc(t,e)}_group(t,e){return this._push(t,e),this._push(),this}_next(){const t=this._pop();return this._state.start=this._state.start.concat(t.start),this._state.end=this._state.end.concat(t.end),this._state.nodes=this._state.nodes.concat(t.nodes),this._state.tail=this._state.tail.concat(t.tail),this._push()}_exit(){return this._next(),this._pop(),[this._pop(),this._state]}_push(t,e){return this._stack.unshift(new _c(t,e)),this._state=this._stack[0]}_pop(){let t;return this._state=this._stack[1],null==this._state&&(this._state=new _c),null!=(t=this._stack.shift())?t:new _c}_auto(t){return t.node.inputs.length?this._append(t):this._insert(t)}_append(t){let e;const{node:n}=t;for(e of(this._graph.add(n),Array.from(this._state.end)))e.connect(n);this._state.start.length||(this._state.start=[n]),this._state.end=[n],this._state.nodes.push(n),n.outputs.length||this._state.tail.push(n)}_prepend(t){let e;const{node:n}=t;for(e of(this._graph.add(n),Array.from(this._state.start)))n.connect(e);this._state.end.length||(this._state.end=[n]),this._state.start=[n],this._state.nodes.push(n),n.outputs.length||this._state.tail.push(n)}_insert(t){const{node:e}=t;if(this._graph.add(e),this._state.start.push(e),this._state.end.push(e),this._state.nodes.push(e),!e.outputs.length)return this._state.tail.push(e)}}class _c{constructor(t=null,e,n,i,r,s){this.op=t,null==e&&(e=!1),this.multi=e,null==n&&(n=[]),this.start=n,null==i&&(i=[]),this.end=i,null==r&&(r=[]),this.nodes=r,null==s&&(s=[]),this.tail=s}}class yc{constructor(t,e){this.vertex=t,this.fragment=e}build(t){return this.link(t)}link(t){null==t&&(t={});const e={},n={},i={},r=this.vertex.link("main"),s=this.fragment.link("main");for(const t of[r,s]){for(const n in t.uniforms){const i=t.uniforms[n];e[n]=i}for(const e in t.varyings){const i=t.varyings[e];n[e]=i}for(const e in t.attributes){const n=t.attributes[e];i[e]=n}}return t.vertexShader=r.code,t.vertexGraph=r.graph,t.fragmentShader=s.code,t.fragmentGraph=s.graph,t.attributes=i,t.uniforms=e,t.varyings=n,t.inspect=()=>vc("Vertex Shader",r,"Fragment Shader",s.graph),t}inspect(){return vc("Vertex Shader",this.vertex,"Fragment Shader",this.fragment.graph)}}const bc=function(t,e,n){let i=null,r={};null!=e&&("function"==typeof e?i=i=>n(t,i,e(i)):"object"==typeof e&&(i=function(i){if(null==e[i])throw new Error(`Unknown snippet \`${i}\``);return n(t,i,e[i])}));const s=e=>n(t,"",e);if(null==i)return s;const a=function(t){return t.match(/[{;]/)?s(t):(r[t]=!0,i(t))};return a.used=function(t){return null==t&&(t=r),r=t},a},wc=function(t){null==t&&(t=100);const e={};let n=null,i=null,r=0;const s=function(t){if(t.prev=null,t.next=n,null!=n&&(n.prev=t),n=t,null==i)return i=t},a=function(t){const{prev:e}=t,{next:r}=t;if(null!=e&&(e.next=r),null!=r&&(r.prev=e),n===t&&(n=r),i===t)return i=e};return function(o){let l,h;return(h=e[o])&&h!==n?(a(h),s(h)):(r===t?(l=i.key,a(i),delete e[l]):r++,h={next:n,prev:null,key:o},s(h),e[o]=h),l}},Sc=function(t){const e={},n=wc(100);return function(i){const r=i.length>32?"##"+Kh(i).toString(16):i,s=n(r);return null!=s&&delete e[s],null==e[r]&&(e[r]=t(i)),e[r].clone()}},Mc=function(t){const{code:e,signatures:n}=t,i=Tc(n);return[n,Ec(e,i)]},Tc=function(t){const e={},n=t=>e[t.name]=!0;n(t.main);for(const e of["external","internal","varying","uniform","attribute"])for(const i of t[e])n(i);return e},Ec=function(t,e){let n;const i=new RegExp("\\b("+(()=>{const t=[];for(n in e)t.push(n);return t})().join("|")+")\\b","g");return t=(t=t.replace(/\/\/[^\n]*/g,"")).replace(/\/\*([^*]|\*[^/])*\*\//g,""),function(n,r,s){let a;null==n&&(n=""),null==r&&(r={}),null==s&&(s={});const o={};for(a in e)o[a]=null!=r[a]?a:n+a;const l=t.replace(i,(t=>o[t])),h=(()=>{const t=[];for(a in s){const e=s[a];t.push(`#define ${a} ${e}`)}return t})();return h.length&&h.push(""),h.join("\n")+l}};var Ac=i(9932),Cc=i.n(Ac),Rc=i(3036),Dc=i.n(Rc);const kc={in:0,out:1,inout:2},Pc=t=>t.token.data;kc.node=function(t){return"function"===(null!=t.children[5]?t.children[5].type:void 0)?kc.function(t):"keyword"===(null!=t.token?t.token.type:void 0)?kc.external(t):void 0},kc.external=function(t){let e=t.children,n=Pc(e[1]);const i=Pc(e[4]),r=e[5];["attribute","uniform","varying"].includes(n)||(n="global");const s=[];for(let t=0;t<r.children.length;t++)if(e=r.children[t],"ident"===e.type){const a=Pc(e),o=r.children[t+1],l="quantifier"===(null!=o?o.type:void 0);s.push({decl:"external",storage:n,type:i,ident:a,quant:!!l,count:l})}return s},kc.function=function(t){const e=t.children,n=Pc(e[1]),i=Pc(e[4]),r=e[5],s=Pc(r.children[0]),a=r.children[1];return[{decl:"function",storage:n,type:i,ident:s,body:!!r.children[2],args:Array.from(a.children).map((t=>kc.argument(t)))}]},kc.argument=function(t){const e=t.children,n=Pc(e[1]),i=Pc(e[2]),r=Pc(e[4]),s=e[5],a=Pc(s.children[0]),o=s.children[1];return{decl:"argument",storage:n,inout:i,type:r,ident:a,quant:!!o,count:o?o.children[0].token.data:void 0}},kc.param=function(t,e,n,i,r){let s=[];null!=e&&s.push(e),null!=n&&s.push(n),s.push(""),s=s.join(" ");const a=i?"["+r+"]":"";""!==t&&(t+=" ");const o=(e,n)=>(n?t:"")+`${s}${e}${a}`;return o.split=t=>kc.param(t,e,n,i,r),o};const Lc="undefined"!=typeof window&&!!window.THREE,zc={int:0,float:0,vec2:Lc?vt.Vector2:null,vec3:Lc?vt.Vector3:null,vec4:Lc?vt.Vector4:null,mat2:null,mat3:Lc?vt.Matrix3:null,mat4:Lc?vt.Matrix4:null,sampler2D:0,samplerCube:0},Oc={int:"i",float:"f",vec2:"v2",vec3:"v3",vec4:"v4",mat2:"m2",mat3:"m3",mat4:"m4",sampler2D:"t",samplerCube:"t"};kc.type=function(t,e,n,i,r,s){const a={in:kc.in,out:kc.out,inout:kc.inout};let o=Oc[e];n&&(o+="v");let l=zc[e];(null!=l?l.call:void 0)&&(l=new l),n&&(l=[l]);const h=null!=a[r]?a[r]:a.in;s={const:"const"}[s];const c=kc.param(r,s,e,n,i);return new Ic(t,o,e,c,l,h)};class Ic{constructor(t,e,n,i,r,s,a){this.name=t,this.type=e,this.spec=n,this.param=i,this.value=r,this.inout=s,this.meta=a}split(){const t=null!=this.meta.shadowed,e=t?"in":"out",n=t?kc.in:kc.out,i=this.param.split(e);return new Ic(this.name,this.type,this.spec,i,this.value,n)}copy(t,e){return new Ic(null!=t?t:this.name,this.type,this.spec,this.param,this.value,this.inout,e)}}const Nc="_i_o",Fc="return";let Uc=!1;const Bc=function(t,e){const n=Vc(t,e);return Hc(n,e)},Vc=function(t,e){let n,i,r=[];Uc&&(i=Yc());try{const t=Cc()(e);n=Dc()(t)}catch(t){r=[{message:t}]}Uc&&i("GLSL Tokenize & Parse");const s=function(t){const e=(""+(t=t.split("\n")).length).length;return t.map(((t,n)=>{return`${i=n+1,(i=""+i).length<e?("       "+i).slice(-e):i}: ${t}`;var i})).join("\n")};if(!n||r.length){t||(t="(inline code)"),console.warn(s(e));for(const e of r)console.error(`${t} -`,e.message);throw new Error("GLSL parse error")}return n},Hc=function(t,e){let n;Uc&&(n=Yc());const i=[];Xc(Gc,jc(i),t,"");const[r,s,a]=Array.from(qc(i)),o=Wc(r,s,a);return Uc&&n("GLSL AST"),{ast:t,code:e,signatures:o}},Gc=function(t,e){return"decl"!==t.type||(e(kc.node(t)),!1)},jc=t=>function(e){null!=e&&Array.from(e).map((e=>t.push(e)))},qc=function(t){let e=null;const n=[];let i=[];const r={};let s=!1;for(const a of Array.from(t))a.body?(r[a.ident]&&(i=Array.from(i).filter((t=>t.ident!==a.ident)),delete r[a.ident]),n.push(a),"main"===a.ident?(e=a,s=!0):s||(e=a)):"global"===a.storage?n.push(a):(i.push(a),r[a.ident]=!0);return[e,n,i]},Wc=function(t,e,n){let i;const r={uniform:[],attribute:[],varying:[],external:[],internal:[],global:[],main:null},s=t=>kc.type(t.ident,t.type,t.quant,t.count,t.inout,t.storage),a=function(t,e){let n;const i=Array.from(t.args).map((t=>s(t)));for(n of Array.from(i))if(n.inout===kc.inout){const t=n,e=n.copy();t.inout=kc.in,e.inout=kc.out,e.meta={shadow:t.name},e.name+=Nc,t.meta={shadowed:e.name},i.push(e)}"void"!==t.type&&i.unshift(kc.type(Fc,t.type,!1,"","out"));const r=`(${(()=>{const t=[];for(n of Array.from(i))n.inout===kc.in&&t.push(n.type);return t})().join(",")})(${(()=>{const t=[];for(n of Array.from(i))n.inout===kc.out&&t.push(n.type);return t})().join(",")})`;return{name:t.ident,type:r,signature:i,inout:e,spec:t.type}};for(i of(r.main=a(t,kc.out),Array.from(e)))r.internal.push({name:i.ident});for(i of Array.from(n)){let t;switch(i.decl){case"external":t=s(i),r[i.storage].push(t);break;case"function":t=a(i,kc.in),r.external.push(t)}}return r};Uc=!1;const Xc=function(t,e,n,i){Uc&&console.log(i,n.type,null!=n.token?n.token.data:void 0,null!=n.token?n.token.type:void 0);if(t(n,e))for(let r=0;r<n.children.length;r++){const s=n.children[r];Xc(t,e,s,i+"  ",Uc)}return null},Yc=function(){const t=+new Date;return function(e){const n=+new Date-t;return console.log(e,n+" ms"),n}};function $c(t){const e=t.replace(Nc,"");return e!==t?e:null}function Zc(t){return t.join("\n")}function Kc(t){return t.join(", ")}function Jc(t){return t.join(";\n")}function Qc(t){return{entry:t,type:"void",params:[],signature:[],return:"",vars:{},calls:[],post:[],chain:{}}}function tu(t,e){return`#define ${t} ${e}`}function eu(t,e,n,i,r){return`${t} ${e}(${n}) {\n${i}${r}}`}function nu(t,e,n){return`  ${t=t?`${t} = `:""}${e}(${n=Kc(n)})`}function iu(t,e){for(let n=0;n<t.length;n++){const i=t[n],r=e[n];if(!r)return!1;if(i.type!==r.type)return!1;if(i.name===Fc!=(r.name===Fc))return!1}return!0}function ru(t,e,n,i,r){const s=[];let a="";for(let n of Array.from(i)){let i,o;const{name:l}=n;let h=i=t(l),c=null,u=null,d=!1;const p=l===Fc;if((o=null!=n.meta?n.meta.shadowed:void 0)&&(c=t(o),c&&(r.vars[c]="  "+n.param(c),r.calls.push(`  ${c} = ${i}`),e(o)?u={shadowed:c}:n=n.split())),(o=null!=n.meta?n.meta.shadow:void 0)&&(c=t(o),c)){if(e(o)){u={shadow:c};continue}n=n.split(),d=!0}if(p?a=i:d||s.push(null!=c?c:i),e(l)){let t="push";p?""===r.return?(t="unshift",h=l,r.type=n.spec,r.return=`  return ${i}`,r.vars[i]="  "+n.param(i)):(r.vars[i]="  "+n.param(i),r.params.push(n.param(i,!0))):r.params.push(n.param(i,!0)),n=n.copy(h,u),r.signature[t](n)}else r.vars[i]="  "+n.param(i)}return r.calls.push(nu(a,n,s))}function su(t,e){const{entry:n}=t;let i=null;if(e&&1===e.length&&"main"!==n){const r=e[0].module;iu(t.signature,r.main.signature)&&(i=tu(n,r.entry))}if(null==i){let r=(()=>{const e=[];for(const n in t.vars){const i=t.vars[n];e.push(i)}return e})();({calls:e}=t);const{post:s}=t;let{params:a}=t;const{type:o}=t,l=t.return;e=e.concat(s),""!==l&&e.push(l),e.push(""),r.length?(r.push(""),r=Jc(r)+"\n"):r="",e=Jc(e),a=Kc(a),i=eu(o,n,a,r,e)}return{signature:t.signature,code:i,name:n}}function au(t){const e={defs:[],bodies:[]};for(const n of Array.from(t))ou(n,e);return e.defs=Zc(e.defs),e.bodies=Jc(e.bodies),""===e.defs&&delete e.defs,""===e.bodies&&delete e.bodies,e}const ou=(t,e)=>{let n,i;const{module:r,name:s,external:a}=t,{main:o}=r,{entry:l}=r;if(iu(o.signature,a.signature))return e.defs.push(tu(s,l));const h=[],c=[];let u={};const d=[r.namespace,Fc].join("");for(n of Array.from(a.signature))i=n.inout===Lh?h:c,i.push(n);for(n of Array.from(o.signature)){i=n.inout===Lh?h:c;let t=i.shift().name;t===Fc&&(t=d),u[n.name]=t}let p=t=>u[t];const f=()=>!0,m=Qc();ru(p,f,l,o.signature,m),m.entry=l,u={return:d},p=t=>null!=u[t]?u[t]:t;const g=Qc();return ru(p,f,l,a.signature,g),g.calls=m.calls,g.entry=s,e.bodies.push(su(m).code.split(" {")[0]),e.bodies.push(su(g).code)};function lu(t){const e=/([A-Za-z0-9_]+\s+)?[A-Za-z0-9_]+\s+[A-Za-z0-9_]+\s*\([^)]*\)\s*;\s*/gm,n=t=>t.replace(e,(t=>"")),i=t.split(/(?=[{}])/g);let r=0;for(let t=0;t<i.length;t++){const e=i[t];switch(e[0]){case"{":r++;break;case"}":r--}if(0===r){const r=e.split(/^[ \t]*#/m);for(let t=0;t<r.length;t++){let e=r[t];if(t>0){e=e.split(/\n/);const i=e.shift(),s=e.join("\n");r[t]=[i,n(s)].join("\n")}else r[t]=n(e)}i[t]=r.join("#")}}return i.join("")}function hu(t){const e={};return t.replace(/((attribute|uniform|varying)\s+)[A-Za-z0-9_]+\s+([A-Za-z0-9_]+)\s*(\[[^\]]*\]\s*)?;\s*/gm,(function(t,n,i,r,s){return e[r]?"":(e[r]=!0,t)}))}function cu(t){const e=function(t,e){const n=[],i=[];for(const r of Array.from(t)){(r.match(e)?n:i).push(r)}return n.concat(i)};let n=t.split("\n");return n=e(n,/^#define ([^ ]+ _pg_[0-9]+_|_pg_[0-9]+_ [^ ]+)$/),n=e(n,/^#extension/),n.join("\n")}const{library:uu,cache:du}=y,{visualize:pu,inspect:fu}=_,{Snippet:mu}=v,gu=function(t,e={}){const n={};for(let i in t)n[i]=e[i]||t[i];return n};class vu{constructor(t,e){this.config=gu({globalUniforms:!1,globalVaryings:!0,globalAttributes:!0,globals:[],autoInspect:!1},e),this.fetch=du(uu(b,t,mu.load))}shader(t){null==t&&(t={});const e=gu(this.config,t);return new xc(b,this.fetch,e)}material(t){return new yc(this.shader(t),this.shader(t))}inspect(t){return vu.inspect(t)}visualize(t){return vu.visualize(t)}static inspect(t){return fu(t)}static visualize(t){return pu(t)}}vu.Block=Hh,vu.Factory=y,vu.GLSL=b,vu.Graph=g,vu.Linker=v,vu.Visualize=_;const xu=function(t){return function(t,e={}){return new vu(t,e)}((function(e){const n=t[e];if(null!=n)return n;const i=["#",".",":","["].includes(e[0])?e:`#${e}`,r=document.querySelector(i);if(null!=r&&"SCRIPT"===r.tagName)return r.textContent||r.innerText;throw new Error(`Unknown shader \`${e}\``)}),{autoInspect:!0})},_u={"arrow.position":"uniform float worldUnit;\nuniform float lineDepth;\nuniform float lineWidth;\nuniform float focusDepth;\n\nuniform vec4 geometryClip;\nuniform float arrowSize;\nuniform float arrowSpace;\n\nattribute vec4 position4;\nattribute vec3 arrow;\nattribute vec2 attach;\n\n// External\nvec3 getPosition(vec4 xyzw, float canonical);\n\nvoid getArrowGeometry(vec4 xyzw, float near, float far, out vec3 left, out vec3 right, out vec3 start) {\n  right = getPosition(xyzw, 1.0);\n  left  = getPosition(vec4(near, xyzw.yzw), 0.0);\n  start = getPosition(vec4(far, xyzw.yzw), 0.0);\n}\n\nmat4 getArrowMatrix(vec3 left, vec3 right, vec3 start) {\n\n  float depth = focusDepth;\n  if (lineDepth < 1.0) {\n    // Depth blending\n    float z = max(0.00001, -right.z);\n    depth = mix(z, focusDepth, lineDepth);\n  }\n    \n  vec3 diff = left - right;\n  float l = length(diff);\n  if (l == 0.0) {\n    return mat4(1.0, 0.0, 0.0, 0.0,\n                0.0, 1.0, 0.0, 0.0,\n                0.0, 0.0, 1.0, 0.0,\n                0.0, 0.0, 0.0, 1.0);\n  }\n\n  // Construct TBN matrix around shaft\n  vec3 t = normalize(diff);\n  vec3 n = normalize(cross(t, t.yzx + vec3(.1, .2, .3)));\n  vec3 b = cross(n, t);\n  \n  // Shrink arrows when vector gets too small\n  // Approach linear scaling with cubic ease the smaller we get\n  float size = arrowSize * lineWidth * worldUnit * depth * 1.25;\n  diff = right - start;\n  l = length(diff) * arrowSpace;\n  float mini = clamp(1.0 - l / size * .333, 0.0, 1.0);\n  float scale = 1.0 - mini * mini * mini;\n  float range = size * scale;\n  \n  // Size to 2.5:1 ratio\n  float rangeNB = range / 2.5;\n\n  // Anchor at end position\n  return mat4(vec4(n * rangeNB,  0),\n              vec4(b * rangeNB,  0),\n              vec4(t * range, 0),\n              vec4(right,  1.0));\n}\n\nvec3 getArrowPosition() {\n  vec3 left, right, start;\n  \n  vec4 p = min(geometryClip, position4);\n  \n  getArrowGeometry(p, attach.x, attach.y, left, right, start);\n  mat4 matrix = getArrowMatrix(left, right, start);\n  return (matrix * vec4(arrow.xyz, 1.0)).xyz;\n\n}\n","axis.position":"uniform vec4 axisStep;\nuniform vec4 axisPosition;\n\nvec4 getAxisPosition(vec4 xyzw, inout vec4 stpq) {\n  return axisStep * xyzw.x + axisPosition;\n}\n","cartesian.position":"uniform mat4 viewMatrix;\n\nvec4 getCartesianPosition(vec4 position, inout vec4 stpq) {\n  return viewMatrix * vec4(position.xyz, 1.0);\n}\n","cartesian4.position":"uniform vec4 basisScale;\nuniform vec4 basisOffset;\nuniform vec4 viewScale;\nuniform vec4 viewOffset;\n\nvec4 getCartesian4Position(vec4 position, inout vec4 stpq) {\n  return position * basisScale + basisOffset;\n}\n","clamp.position":"uniform vec4 clampLimit;\n\nvec4 getClampXYZW(vec4 xyzw) {\n  return clamp(xyzw, vec4(0.0), clampLimit);\n}\n","color.opaque":"vec4 opaqueColor(vec4 color) {\n  return vec4(color.rgb, 1.0);\n}\n","face.position":"uniform vec4 geometryClip;\nattribute vec4 position4;\n\n// External\nvec3 getPosition(vec4 xyzw, float canonical);\n\nvec3 getFacePosition() {\n  vec4 p = min(geometryClip, position4);\n  return getPosition(p, 1.0);\n}\n","face.position.normal":"attribute vec4 position4;\n\n// External\nvec3 getPosition(vec4 xyzw, float canonical);\n\nvarying vec3 vNormal;\nvarying vec3 vLight;\nvarying vec3 vPosition;\n\nvoid getFaceGeometry(vec4 xyzw, out vec3 pos, out vec3 normal) {\n  vec3 a, b, c;\n\n  a   = getPosition(vec4(xyzw.xyz, 0.0), 0.0);\n  b   = getPosition(vec4(xyzw.xyz, 1.0), 0.0);\n  c   = getPosition(vec4(xyzw.xyz, 2.0), 0.0);\n\n  pos = getPosition(xyzw, 1.0);\n  normal = normalize(cross(c - a, b - a));\n}\n\nvec3 getFacePositionNormal() {\n  vec3 center, normal;\n\n  getFaceGeometry(position4, center, normal);\n  vNormal   = normal;\n  vLight    = normalize((viewMatrix * vec4(1.0, 2.0, 2.0, 0.0)).xyz);\n  vPosition = -center;\n\n  return center;\n}\n","float.encode":"/*\nFloat encoding technique by\nCarlos Scheidegger\nhttps://github.com/cscheid/lux/blob/master/src/shade/bits/encode_float.js\n\nConversion to GLSL by:\nhttp://concord-consortium.github.io/lab/experiments/webgl-gpgpu/script.js\n*/\n\nfloat shift_right(float v, float amt) { \n  v = floor(v) + 0.5; \n  return floor(v / exp2(amt)); \n}\n\nfloat shift_left(float v, float amt) { \n  return floor(v * exp2(amt) + 0.5); \n}\n\nfloat mask_last(float v, float bits) { \n  return mod(v, shift_left(1.0, bits)); \n}\n\nfloat extract_bits(float num, float from, float to) { \n  from = floor(from + 0.5); to = floor(to + 0.5); \n  return mask_last(shift_right(num, from), to - from); \n}\n\nvec4 encode_float(float val) { \n  if (val == 0.0) return vec4(0, 0, 0, 0); \n  float valuesign = val > 0.0 ? 0.0 : 1.0; \n  val = abs(val); \n  float exponent = floor(log2(val)); \n  float biased_exponent = exponent + 127.0; \n  float fraction = ((val / exp2(exponent)) - 1.0) * 8388608.0; \n  float t = biased_exponent / 2.0; \n  float last_bit_of_biased_exponent = fract(t) * 2.0; \n  float remaining_bits_of_biased_exponent = floor(t); \n  float byte4 = extract_bits(fraction, 0.0, 8.0) / 255.0; \n  float byte3 = extract_bits(fraction, 8.0, 16.0) / 255.0; \n  float byte2 = (last_bit_of_biased_exponent * 128.0 + extract_bits(fraction, 16.0, 23.0)) / 255.0; \n  float byte1 = (valuesign * 128.0 + remaining_bits_of_biased_exponent) / 255.0; \n  return vec4(byte4, byte3, byte2, byte1); \n}\n","float.index.pack":"uniform vec4 indexModulus;\n\nvec4 getSample(vec4 xyzw);\nvec4 getIndex(vec4 xyzw);\n\nvec4 floatPackIndex(vec4 xyzw) {\n  vec4 value = getSample(xyzw);\n  vec4 index = getIndex(xyzw);\n\n  vec4 offset = floor(index + .5) * indexModulus;\n  vec2 sum2 = offset.xy + offset.zw;\n  float sum = sum2.x + sum2.y;\n  return vec4(value.xyz, sum);\n}","float.stretch":"vec4 getSample(vec4 xyzw);\n\nfloat floatStretch(vec4 xyzw, float channelIndex) {\n  vec4 sample = getSample(xyzw);\n  vec2 xy = channelIndex > 1.5 ? sample.zw : sample.xy;\n  return mod(channelIndex, 2.0) > .5 ? xy.y : xy.x;\n}","fragment.clip.dashed":"varying float vClipStrokeWidth;\nvarying float vClipStrokeIndex;\nvarying vec3  vClipStrokeEven;\nvarying vec3  vClipStrokeOdd;\nvarying vec3  vClipStrokePosition;\n\nvoid clipStrokeFragment() {\n  bool odd = mod(vClipStrokeIndex, 2.0) >= 1.0;\n\n  vec3 tangent;\n  if (odd) {\n    tangent = vClipStrokeOdd;\n  }\n  else {\n    tangent = vClipStrokeEven;\n  }\n\n  float travel = dot(vClipStrokePosition, normalize(tangent)) / vClipStrokeWidth;\n  if (mod(travel, 16.0) > 8.0) {\n    discard;\n  }\n}\n","fragment.clip.dotted":"varying float vClipStrokeWidth;\nvarying float vClipStrokeIndex;\nvarying vec3  vClipStrokeEven;\nvarying vec3  vClipStrokeOdd;\nvarying vec3  vClipStrokePosition;\n\nvoid clipStrokeFragment() {\n  bool odd = mod(vClipStrokeIndex, 2.0) >= 1.0;\n\n  vec3 tangent;\n  if (odd) {\n    tangent = vClipStrokeOdd;\n  }\n  else {\n    tangent = vClipStrokeEven;\n  }\n\n  float travel = dot(vClipStrokePosition, normalize(tangent)) / vClipStrokeWidth;\n  if (mod(travel, 4.0) > 2.0) {\n    discard;\n  }\n}\n","fragment.clip.ends":"varying vec2 vClipEnds;\n\nvoid clipEndsFragment() {\n  if (vClipEnds.x < 0.0 || vClipEnds.y < 0.0) discard;\n}\n","fragment.clip.proximity":"varying float vClipProximity;\n\nvoid clipProximityFragment() {\n  if (vClipProximity >= 0.5) discard;\n}","fragment.color":"void setFragmentColor(vec4 color) {\n  gl_FragColor = color;\n}","fragment.map.rgba":"vec4 fragmentRGBA(vec4 rgba, vec4 stpq) {\n  return rgba;\n}","fragment.solid":"void setFragmentColor(vec4 color) {\n  if (color.a < 1.0) discard;\n  gl_FragColor = color;\n}","fragment.transparent":"void setFragmentColor(vec4 color) {\n  if (color.a >= 1.0) discard;\n  gl_FragColor = color;\n}","grid.position":"uniform vec4 gridPosition;\nuniform vec4 gridStep;\nuniform vec4 gridAxis;\n\nvec4 sampleData(vec2 xy);\n\nvec4 getGridPosition(vec4 xyzw) {\n  vec4 onAxis  = gridAxis * sampleData(vec2(xyzw.y, 0.0)).x;\n  vec4 offAxis = gridStep * xyzw.x + gridPosition;\n  return onAxis + offAxis;\n}\n","grow.position":"uniform float growScale;\nuniform vec4  growMask;\nuniform vec4  growAnchor;\n\nvec4 getSample(vec4 xyzw);\n\nvec4 getGrowSample(vec4 xyzw) {\n  vec4 anchor = xyzw * growMask + growAnchor;\n\n  vec4 position = getSample(xyzw);\n  vec4 center = getSample(anchor);\n\n  return mix(center, position, growScale);\n}","join.position":"uniform float joinStride;\nuniform float joinStrideInv;\n\nfloat getIndex(vec4 xyzw);\nvec4 getRest(vec4 xyzw);\nvec4 injectIndices(float a, float b);\n\nvec4 getJoinXYZW(vec4 xyzw) {\n\n  float a = getIndex(xyzw);\n  float b = a * joinStrideInv;\n\n  float integer  = floor(b);\n  float fraction = b - integer;\n  \n  return injectIndices(fraction * joinStride, integer) + getRest(xyzw);\n}\n","label.alpha":"varying float vPixelSize;\n\nvec4 getLabelAlphaColor(vec4 color, vec4 sample) {\n  float mask = clamp(sample.r * 1000.0, 0.0, 1.0);\n  float alpha = (sample.r - .5) * vPixelSize + .5;\n  float a = mask * alpha * color.a;\n  if (a <= 0.0) discard;\n  return vec4(color.xyz, a);\n}\n","label.map":"vec2 mapUV(vec4 uvwo, vec4 stpq) {\n  return uvwo.xy;\n}\n","label.outline":"uniform float outlineExpand;\nuniform float outlineStep;\nuniform vec3  outlineColor;\n\nvarying float vPixelSize;\n\nconst float PIXEL_STEP = 255.0 / 16.0;\n\nvec4 getLabelOutlineColor(vec4 color, vec4 sample) {\n  float ps = vPixelSize * PIXEL_STEP;\n  float os = outlineStep;\n\n  float sdf = sample.r - .5 + outlineExpand;\n  vec2  sdfs = vec2(sdf, sdf + os);\n  vec2  alpha = clamp(sdfs * ps + .5, 0.0, 1.0);\n\n  if (alpha.y <= 0.0) {\n    discard;\n  }\n\n  vec3 blend = color.xyz;\n  if (alpha.y > alpha.x) {\n    blend = sqrt(mix(outlineColor * outlineColor, blend * blend, alpha.x));\n  }\n  \n  return vec4(blend, alpha.y * color.a);\n}\n","layer.position":"uniform vec4 layerScale;\nuniform vec4 layerBias;\n\nvec4 layerPosition(vec4 position, inout vec4 stpq) {\n  return layerScale * position + layerBias;\n}\n","lerp.depth":"// External\nvec4 sampleData(vec4 xyzw);\n\nvec4 lerpDepth(vec4 xyzw) {\n  float x = xyzw.z;\n  float i = floor(x);\n  float f = x - i;\n    \n  vec4 xyzw1 = vec4(xyzw.xy, i, xyzw.w);\n  vec4 xyzw2 = vec4(xyzw.xy, i + 1.0, xyzw.w);\n  \n  vec4 a = sampleData(xyzw1);\n  vec4 b = sampleData(xyzw2);\n\n  return mix(a, b, f);\n}\n","lerp.height":"// External\nvec4 sampleData(vec4 xyzw);\n\nvec4 lerpHeight(vec4 xyzw) {\n  float x = xyzw.y;\n  float i = floor(x);\n  float f = x - i;\n    \n  vec4 xyzw1 = vec4(xyzw.x, i, xyzw.zw);\n  vec4 xyzw2 = vec4(xyzw.x, i + 1.0, xyzw.zw);\n  \n  vec4 a = sampleData(xyzw1);\n  vec4 b = sampleData(xyzw2);\n\n  return mix(a, b, f);\n}\n","lerp.items":"// External\nvec4 sampleData(vec4 xyzw);\n\nvec4 lerpItems(vec4 xyzw) {\n  float x = xyzw.w;\n  float i = floor(x);\n  float f = x - i;\n    \n  vec4 xyzw1 = vec4(xyzw.xyz, i);\n  vec4 xyzw2 = vec4(xyzw.xyz, i + 1.0);\n  \n  vec4 a = sampleData(xyzw1);\n  vec4 b = sampleData(xyzw2);\n\n  return mix(a, b, f);\n}\n","lerp.width":"// External\nvec4 sampleData(vec4 xyzw);\n\nvec4 lerpWidth(vec4 xyzw) {\n  float x = xyzw.x;\n  float i = floor(x);\n  float f = x - i;\n    \n  vec4 xyzw1 = vec4(i, xyzw.yzw);\n  vec4 xyzw2 = vec4(i + 1.0, xyzw.yzw);\n  \n  vec4 a = sampleData(xyzw1);\n  vec4 b = sampleData(xyzw2);\n\n  return mix(a, b, f);\n}\n","line.position":"// Units and calibration\nuniform float worldUnit;\nuniform float lineWidth;\nuniform float lineDepth;\nuniform float focusDepth;\n\n// General data index\nuniform vec4 geometryClip;\nattribute vec4 position4;\n\n// (Start/mid/end -1/0/1, top/bottom -1,1)\nattribute vec2 line;\n\n// 0...1 for round or bevel joins\n#ifdef LINE_JOIN_DETAIL\nattribute float joint;\n#else\nconst float joint = 0.0;\n#endif\n\n// Knock out excessively long line segments (e.g. for asymtpotes)\n#ifdef LINE_PROXIMITY\nuniform float lineProximity;\nvarying float vClipProximity;\n#endif\n\n// Ghetto line stroking (local only, not global)\n#ifdef LINE_STROKE\nvarying float vClipStrokeWidth;\nvarying float vClipStrokeIndex;\nvarying vec3  vClipStrokeEven;\nvarying vec3  vClipStrokeOdd;\nvarying vec3  vClipStrokePosition;\n#endif\n\n// External\nvec3 getPosition(vec4 xyzw, float canonical);\n\n// Clip line ends for arrows / decoration\n#ifdef LINE_CLIP\nuniform float clipRange;\nuniform vec2  clipStyle;\nuniform float clipSpace;\n\nattribute vec2 strip;\n\nvarying vec2 vClipEnds;\n\nvoid clipEnds(vec4 xyzw, vec3 center, vec3 pos) {\n\n  // Sample end of line strip\n  vec4 xyzwE = vec4(strip.y, xyzw.yzw);\n  vec3 end   = getPosition(xyzwE, 0.0);\n\n  // Sample start of line strip\n  vec4 xyzwS = vec4(strip.x, xyzw.yzw);\n  vec3 start = getPosition(xyzwS, 0.0);\n\n  // Measure length\n  vec3 diff = end - start;\n  float l = length(diff) * clipSpace;\n\n  // Arrow length (=2.5x radius)\n  float arrowSize = 1.25 * clipRange * lineWidth * worldUnit;\n\n  vClipEnds = vec2(1.0);\n\n  if (clipStyle.y > 0.0) {\n    // Depth blend end\n    float depth = focusDepth;\n    if (lineDepth < 1.0) {\n      float z = max(0.00001, -end.z);\n      depth = mix(z, focusDepth, lineDepth);\n    }\n\n    // Absolute arrow length\n    float size = arrowSize * depth;\n\n    // Adjust clip range\n    // Approach linear scaling with cubic ease the smaller we get\n    float mini = clamp(1.0 - l / size * .333, 0.0, 1.0);\n    float scale = 1.0 - mini * mini * mini;\n    float invrange = 1.0 / (size * scale);\n\n    // Clip end\n    diff = end - center;\n    if(diff == vec3(0.0))\n      vClipEnds.x = -1.0;\n    else {\n      diff = normalize(end - center);\n      float d = dot(end - pos, diff);\n      vClipEnds.x = d * invrange - 1.0;\n    }\n  }\n\n  if (clipStyle.x > 0.0) {\n    // Depth blend start\n    float depth = focusDepth;\n    if (lineDepth < 1.0) {\n      float z = max(0.00001, -start.z);\n      depth = mix(z, focusDepth, lineDepth);\n    }\n\n    // Absolute arrow length\n    float size = arrowSize * depth;\n\n    // Adjust clip range\n    // Approach linear scaling with cubic ease the smaller we get\n    float mini = clamp(1.0 - l / size * .333, 0.0, 1.0);\n    float scale = 1.0 - mini * mini * mini;\n    float invrange = 1.0 / (size * scale);\n\n    // Clip start\n    diff = center - start;\n    if(diff == vec3(0.0))\n      vClipEnds.y = -1.0;\n    else {\n      diff = normalize(center - start);\n      float d = dot(pos - start, diff);\n      vClipEnds.y = d * invrange - 1.0;\n    }\n  }\n\n\n}\n#endif\n\n// Adjust left/center/right to be inside near/far z range\nconst float epsilon = 1e-5;\nvoid fixCenter(inout vec3 left, inout vec3 center, inout vec3 right) {\n  if (center.z >= 0.0) {\n    if (left.z < 0.0) {\n      float d = (center.z + epsilon) / (center.z - left.z);\n      center = mix(center, left, d);\n    }\n    else if (right.z < 0.0) {\n      float d = (center.z + epsilon) / (center.z - right.z);\n      center = mix(center, right, d);\n    }\n  }\n\n  if (left.z >= 0.0) {\n    if (center.z < 0.0) {\n      float d = (left.z + epsilon) / (left.z - center.z);\n      left = mix(left, center, d);\n    }\n  }\n\n  if (right.z >= 0.0) {\n    if (center.z < 0.0) {\n      float d = (right.z + epsilon) / (right.z - center.z);\n      right = mix(right, center, d);\n    }\n  }\n}\n\n// Sample the source data in an edge-aware manner\nvoid getLineGeometry(vec4 xyzw, float edge, out vec3 left, out vec3 center, out vec3 right) {\n  vec4 delta = vec4(1.0, 0.0, 0.0, 0.0);\n\n  center =                 getPosition(xyzw, 1.0);\n  left   = (edge > -0.5) ? getPosition(xyzw - delta, 0.0) : center;\n  right  = (edge < 0.5)  ? getPosition(xyzw + delta, 0.0) : center;\n}\n\n// Calculate the position for a vertex along the line, including joins\nvec3 getLineJoin(float edge, bool odd, vec3 left, vec3 center, vec3 right, float width, float offset, float joint) {\n  vec2 join = vec2(1.0, 0.0);\n\n  fixCenter(left, center, right);\n\n  vec4 a = vec4(left.xy, right.xy);\n  vec4 b = a / vec4(left.zz, right.zz);\n\n  vec2 l = b.xy;\n  vec2 r = b.zw;\n  vec2 c = center.xy / center.z;\n\n  vec4 d = vec4(l, c) - vec4(c, r);\n  float l1 = dot(d.xy, d.xy);\n  float l2 = dot(d.zw, d.zw);\n\n  if (l1 + l2 > 0.0) {\n\n    if (edge > 0.5 || l2 == 0.0) {\n      vec2 nl = normalize(d.xy);\n      vec2 tl = vec2(nl.y, -nl.x);\n\n#ifdef LINE_PROXIMITY\n      vClipProximity = 1.0;\n#endif\n\n#ifdef LINE_STROKE\n      vClipStrokeEven = vClipStrokeOdd = normalize(left - center);\n#endif\n      join = tl;\n    }\n    else if (edge < -0.5 || l1 == 0.0) {\n      vec2 nr = normalize(d.zw);\n      vec2 tr = vec2(nr.y, -nr.x);\n\n#ifdef LINE_PROXIMITY\n      vClipProximity = 1.0;\n#endif\n\n#ifdef LINE_STROKE\n      vClipStrokeEven = vClipStrokeOdd = normalize(center - right);\n#endif\n      join = tr;\n    }\n    else {\n      // Limit join stretch for tiny segments\n      float lmin2 = min(l1, l2) / (width * width);\n\n      // Hide line segment if ratio of leg lengths exceeds promixity threshold\n#ifdef LINE_PROXIMITY\n      float lr     = l1 / l2;\n      float rl     = l2 / l1;\n      float ratio  = max(lr, rl);\n      float thresh = lineProximity + 1.0;\n      vClipProximity = (ratio > thresh * thresh) ? 1.0 : 0.0;\n#endif\n\n      // Calculate normals/tangents\n      vec2 nl = normalize(d.xy);\n      vec2 nr = normalize(d.zw);\n\n      // Calculate tangents\n      vec2 tl = vec2(nl.y, -nl.x);\n      vec2 tr = vec2(nr.y, -nr.x);\n\n#ifdef LINE_PROXIMITY\n      // Mix tangents according to leg lengths\n      vec2 tc = normalize(mix(tl, tr, l1/(l1+l2)));\n#else\n      // Average tangent\n      vec2 tc = normalize(tl + tr);\n#endif\n\n      // Miter join\n      float cosA   = dot(nl, tc);\n      float sinA   = max(0.1, abs(dot(tl, tc)));\n      float factor = cosA / sinA;\n      float scale  = sqrt(1.0 + min(lmin2, factor * factor));\n\n      // Stroke normals\n#ifdef LINE_STROKE\n      vec3 stroke1 = normalize(left - center);\n      vec3 stroke2 = normalize(center - right);\n\n      if (odd) {\n        vClipStrokeEven = stroke1;\n        vClipStrokeOdd  = stroke2;\n      }\n      else {\n        vClipStrokeEven = stroke2;\n        vClipStrokeOdd  = stroke1;\n      }\n#endif\n\n#ifdef LINE_JOIN_MITER\n      // Apply straight up miter\n      join = tc * scale;\n#endif\n\n#ifdef LINE_JOIN_ROUND\n      // Slerp bevel join into circular arc\n      float dotProduct = dot(nl, nr);\n      float angle = acos(dotProduct);\n      float sinT  = sin(angle);\n      join = (sin((1.0 - joint) * angle) * tl + sin(joint * angle) * tr) / sinT;\n#endif\n\n#ifdef LINE_JOIN_BEVEL\n      // Direct bevel join between two flat ends\n      float dotProduct = dot(nl, nr);\n      join = mix(tl, tr, joint);\n#endif\n\n#ifdef LINE_JOIN_DETAIL\n      // Check if on inside or outside of joint\n      float crossProduct = nl.x * nr.y - nl.y * nr.x;\n      if (offset * crossProduct < 0.0) {\n        // For near-180-degree bends, correct back to a miter to avoid discontinuities\n        float ratio = clamp(-dotProduct * 2.0 - 1.0, 0.0, 1.0);\n        // Otherwise collapse the inside vertices into one.\n        join = mix(tc * scale, join, ratio * ratio * ratio);\n      }\n#endif\n\n    }\n    return vec3(join, 0.0);\n  }\n  else {\n    return vec3(0.0);\n  }\n\n}\n\n// Calculate final line position\nvec3 getLinePosition() {\n  vec3 left, center, right, join;\n\n  // left/center/right\n  float edge = line.x;\n  // up/down\n  float offset = line.y;\n\n  // Clip data\n  vec4 p = min(geometryClip, position4);\n  edge += max(0.0, position4.x - geometryClip.x);\n\n  // Get position + adjacent neighbours\n  getLineGeometry(p, edge, left, center, right);\n\n#ifdef LINE_STROKE\n  // Set parameters for line stroke fragment shader\n  vClipStrokePosition = center;\n  vClipStrokeIndex = p.x;\n  bool odd = mod(p.x, 2.0) >= 1.0;\n#else\n  bool odd = true;\n#endif\n\n  // Divide line width up/down\n  float width = lineWidth * 0.5;\n\n  float depth = focusDepth;\n  if (lineDepth < 1.0) {\n    // Depth blending\n    float z = max(0.00001, -center.z);\n    depth = mix(z, focusDepth, lineDepth);\n  }\n  width *= depth;\n\n  // Convert to world units\n  width *= worldUnit;\n\n  // Calculate line join\n  join = getLineJoin(edge, odd, left, center, right, width, offset, joint);\n  vec3 pos = center + join * offset * width;\n\n#ifdef LINE_STROKE\n  vClipStrokeWidth = width;\n#endif\n\n#ifdef LINE_CLIP\n  clipEnds(p, center, pos);\n#endif\n\n  return pos;\n}\n","map.2d.data":"uniform vec2 dataResolution;\nuniform vec2 dataPointer;\n\nvec2 map2DData(vec2 xy) {\n  return (xy + dataPointer) * dataResolution;\n}\n","map.2d.data.wrap":"uniform vec2 dataResolution;\nuniform vec2 dataPointer;\n\nvec2 map2DData(vec2 xy) {\n  return fract((xy + dataPointer) * dataResolution);\n}\n","map.xyzw.2dv":"void mapXyzw2DV(vec4 xyzw, out vec2 xy, out float z) {\n  xy = xyzw.xy;\n  z  = xyzw.z;\n}\n\n","map.xyzw.align":"vec4 alignXYZW(vec4 xyzw) {\n  return floor(xyzw + .5);\n}\n\n","map.xyzw.texture":"uniform float textureItems;\nuniform float textureHeight;\n\nvec2 mapXyzwTexture(vec4 xyzw) {\n  \n  float x = xyzw.x;\n  float y = xyzw.y;\n  float z = xyzw.z;\n  float i = xyzw.w;\n  \n  return vec2(i, y) + vec2(x, z) * vec2(textureItems, textureHeight);\n}\n\n","mesh.fragment.color":"varying vec4 vColor;\n\nvec4 getColor() {\n  return vColor;\n}\n","mesh.fragment.map":"#ifdef POSITION_STPQ\nvarying vec4 vSTPQ;\n#endif\n#ifdef POSITION_U\nvarying float vU;\n#endif\n#ifdef POSITION_UV\nvarying vec2 vUV;\n#endif\n#ifdef POSITION_UVW\nvarying vec3 vUVW;\n#endif\n#ifdef POSITION_UVWO\nvarying vec4 vUVWO;\n#endif\n\nvec4 getSample(vec4 uvwo, vec4 stpq);\n\nvec4 getMapColor() {\n  #ifdef POSITION_STPQ\n  vec4 stpq = vSTPQ;\n  #else\n  vec4 stpq = vec4(0.0);\n  #endif\n\n  #ifdef POSITION_U\n  vec4 uvwo = vec4(vU, 0.0, 0.0, 0.0);\n  #endif\n  #ifdef POSITION_UV\n  vec4 uvwo = vec4(vUV, 0.0, 0.0);\n  #endif\n  #ifdef POSITION_UVW\n  vec4 uvwo = vec4(vUVW, 0.0);\n  #endif\n  #ifdef POSITION_UVWO\n  vec4 uvwo = vec4(vUVWO);\n  #endif\n\n  return getSample(uvwo, stpq);\n}\n","mesh.fragment.mask":"varying float vMask;\n\nfloat ease(float t) {\n  t = clamp(t, 0.0, 1.0);\n  return t * t * (3.0 - 2.0 * t);\n}\n\nvec4 maskColor() {\n  if (vMask <= 0.0) discard;\n  return vec4(vec3(1.0), ease(vMask));\n}\n","mesh.fragment.material":"#ifdef POSITION_STPQ\nvarying vec4 vSTPQ;\n#endif\n#ifdef POSITION_U\nvarying float vU;\n#endif\n#ifdef POSITION_UV\nvarying vec2 vUV;\n#endif\n#ifdef POSITION_UVW\nvarying vec3 vUVW;\n#endif\n#ifdef POSITION_UVWO\nvarying vec4 vUVWO;\n#endif\n\nvec4 getSample(vec4 rgba, vec4 stpq);\n\nvec4 getMaterialColor(vec4 rgba) {\n  vec4 stpq = vec4(0.0);\n\n  #ifdef POSITION_U\n  stpq.x = vU;\n  #endif\n  #ifdef POSITION_UV\n  stpq.xy = vUV;\n  #endif\n  #ifdef POSITION_UVW\n  stpq.xyz = vUVW;\n  #endif\n  #ifdef POSITION_UVWO\n  stpq = vUVWO;\n  #endif\n\n  #ifdef POSITION_STPQ\n  stpq = vSTPQ;\n  #endif\n\n  return getSample(rgba, stpq);\n}\n","mesh.fragment.shaded":"varying vec3 vNormal;\nvarying vec3 vLight;\nvarying vec3 vPosition;\n\nvec3 offSpecular(vec3 color) {\n  vec3 c = 1.0 - color;\n  return 1.0 - c * c;\n}\n\nvec4 getShadedColor(vec4 rgba) {\n  \n  vec3 color = rgba.xyz;\n  vec3 color2 = offSpecular(rgba.xyz);\n\n  vec3 normal = normalize(vNormal);\n  vec3 light = normalize(vLight);\n  vec3 position = normalize(vPosition);\n  \n  float side    = gl_FrontFacing ? -1.0 : 1.0;\n  float cosine  = side * dot(normal, light);\n  float diffuse = mix(max(0.0, cosine), .5 + .5 * cosine, .1);\n  \n  vec3  halfLight = normalize(light + position);\n\tfloat cosineHalf = max(0.0, side * dot(normal, halfLight));\n\tfloat specular = pow(cosineHalf, 16.0);\n\t\n\treturn vec4(color * (diffuse * .9 + .05) + .25 * color2 * specular, rgba.a);\n}\n","mesh.fragment.texture":"","mesh.gamma.in":"vec4 getGammaInColor(vec4 rgba) {\n  return vec4(rgba.rgb * rgba.rgb, rgba.a);\n}\n","mesh.gamma.out":"vec4 getGammaOutColor(vec4 rgba) {\n  return vec4(sqrt(rgba.rgb), rgba.a);\n}\n","mesh.map.uvwo":"vec4 mapUVWO(vec4 uvwo, vec4 stpq) {\n  return uvwo;\n}\n","mesh.position":"uniform vec4 geometryClip;\nattribute vec4 position4;\n\n// External\nvec3 getPosition(vec4 xyzw, float canonical);\n\nvec3 getMeshPosition() {\n  vec4 p = min(geometryClip, position4);\n  return getPosition(p, 1.0);\n}\n","mesh.vertex.color":"attribute vec4 position4;\nuniform vec4 geometryClip;\nvarying vec4 vColor;\n\n// External\nvec4 getSample(vec4 xyzw);\n\nvoid vertexColor() {\n  vec4 p = min(geometryClip, position4);\n  vColor = getSample(p);\n}\n","mesh.vertex.mask":"attribute vec4 position4;\nuniform vec4 geometryResolution;\nuniform vec4 geometryClip;\nvarying float vMask;\n\n// External\nfloat getSample(vec4 xyzw);\n\nvoid maskLevel() {\n  vec4 p = min(geometryClip, position4);\n  vMask = getSample(p * geometryResolution);\n}\n","mesh.vertex.position":"uniform vec4 geometryResolution;\n\n#ifdef POSITION_STPQ\nvarying vec4 vSTPQ;\n#endif\n#ifdef POSITION_U\nvarying float vU;\n#endif\n#ifdef POSITION_UV\nvarying vec2 vUV;\n#endif\n#ifdef POSITION_UVW\nvarying vec3 vUVW;\n#endif\n#ifdef POSITION_UVWO\nvarying vec4 vUVWO;\n#endif\n\n// External\nvec3 getPosition(vec4 xyzw, in vec4 stpqIn, out vec4 stpqOut);\n\nvec3 getMeshPosition(vec4 xyzw, float canonical) {\n  vec4 stpqOut, stpqIn = xyzw * geometryResolution;\n  vec3 xyz = getPosition(xyzw, stpqIn, stpqOut);\n\n  #ifdef POSITION_MAP\n  if (canonical > 0.5) {\n    #ifdef POSITION_STPQ\n    vSTPQ = stpqOut;\n    #endif\n    #ifdef POSITION_U\n    vU = stpqOut.x;\n    #endif\n    #ifdef POSITION_UV\n    vUV = stpqOut.xy;\n    #endif\n    #ifdef POSITION_UVW\n    vUVW = stpqOut.xyz;\n    #endif\n    #ifdef POSITION_UVWO\n    vUVWO = stpqOut;\n    #endif\n  }\n  #endif\n  return xyz;\n}\n","move.position":"uniform float transitionEnter;\nuniform float transitionExit;\nuniform vec4  transitionScale;\nuniform vec4  transitionBias;\nuniform float transitionSkew;\nuniform float transitionActive;\n\nuniform vec4  moveFrom;\nuniform vec4  moveTo;\n\nfloat ease(float t) {\n  t = clamp(t, 0.0, 1.0);\n  return 1.0 - (2.0 - t) * t;\n}\n\nvec4 getTransitionPosition(vec4 xyzw, inout vec4 stpq) {\n  if (transitionActive < 0.5) return xyzw;\n\n  float enter   = transitionEnter;\n  float exit    = transitionExit;\n  float skew    = transitionSkew;\n  vec4  scale   = transitionScale;\n  vec4  bias    = transitionBias;\n\n  float factor  = 1.0 + skew;\n  float offset  = dot(vec4(1.0), stpq * scale + bias);\n\n  float a1 = ease(enter * factor - offset);\n  float a2 = ease(exit  * factor + offset - skew);\n\n  return xyzw + a1 * moveFrom + a2 * moveTo;\n}","object.mask.default":"vec4 getMask(vec4 xyzw) {\n  return vec4(1.0);\n}","point.alpha.circle":"varying float vPixelSize;\n\nfloat getDiscAlpha(float mask) {\n  // Approximation: 1 - x*x is approximately linear around x = 1 with slope 2\n  return vPixelSize * (1.0 - mask);\n  //  return vPixelSize * 2.0 * (1.0 - sqrt(mask));\n}\n","point.alpha.circle.hollow":"varying float vPixelSize;\n\nfloat getDiscHollowAlpha(float mask) {\n  return vPixelSize * (0.5 - 2.0 * abs(sqrt(mask) - .75));\n}\n","point.alpha.generic":"varying float vPixelSize;\n\nfloat getGenericAlpha(float mask) {\n  return vPixelSize * 2.0 * (1.0 - mask);\n}\n","point.alpha.generic.hollow":"varying float vPixelSize;\n\nfloat getGenericHollowAlpha(float mask) {\n  return vPixelSize * (0.5 - 2.0 * abs(mask - .75));\n}\n","point.edge":"varying vec2 vSprite;\n\nfloat getSpriteMask(vec2 xy);\nfloat getSpriteAlpha(float mask);\n\nvoid setFragmentColorFill(vec4 color) {\n  float mask = getSpriteMask(vSprite);\n  if (mask > 1.0) {\n    discard;\n  }\n  float alpha = getSpriteAlpha(mask);\n  if (alpha >= 1.0) {\n    discard;\n  }\n  gl_FragColor = vec4(color.rgb, alpha * color.a);\n}\n","point.fill":"varying vec2 vSprite;\n\nfloat getSpriteMask(vec2 xy);\nfloat getSpriteAlpha(float mask);\n\nvoid setFragmentColorFill(vec4 color) {\n  float mask = getSpriteMask(vSprite);\n  if (mask > 1.0) {\n    discard;\n  }\n  float alpha = getSpriteAlpha(mask);\n  if (alpha < 1.0) {\n    discard;\n  }\n  gl_FragColor = color;\n}\n\n","point.mask.circle":"varying float vPixelSize;\n\nfloat getCircleMask(vec2 uv) {\n  return dot(uv, uv);\n}\n","point.mask.diamond":"varying float vPixelSize;\n\nfloat getDiamondMask(vec2 uv) {\n  vec2 a = abs(uv);\n  return a.x + a.y;\n}\n","point.mask.down":"varying float vPixelSize;\n\nfloat getTriangleDownMask(vec2 uv) {\n  uv.y += .25;\n  return max(uv.y, abs(uv.x) * .866 - uv.y * .5 + .6);\n}\n","point.mask.left":"varying float vPixelSize;\n\nfloat getTriangleLeftMask(vec2 uv) {\n  uv.x += .25;\n  return max(uv.x, abs(uv.y) * .866 - uv.x * .5 + .6);\n}\n","point.mask.right":"varying float vPixelSize;\n\nfloat getTriangleRightMask(vec2 uv) {\n  uv.x -= .25;\n  return max(-uv.x, abs(uv.y) * .866 + uv.x * .5 + .6);\n}\n","point.mask.square":"varying float vPixelSize;\n\nfloat getSquareMask(vec2 uv) {\n  vec2 a = abs(uv);\n  return max(a.x, a.y);\n}\n","point.mask.up":"varying float vPixelSize;\n\nfloat getTriangleUpMask(vec2 uv) {\n  uv.y -= .25;\n  return max(-uv.y, abs(uv.x) * .866 + uv.y * .5 + .6);\n}\n","point.position":"uniform float pointDepth;\n\nuniform float pixelUnit;\nuniform float renderScale;\nuniform float renderScaleInv;\nuniform float focusDepth;\n\nuniform vec4 geometryClip;\nattribute vec4 position4;\nattribute vec2 sprite;\n\nvarying vec2 vSprite;\nvarying float vPixelSize;\n\nconst float pointScale = POINT_SHAPE_SCALE;\n\n// External\nfloat getPointSize(vec4 xyzw);\nvec3 getPosition(vec4 xyzw, float canonical);\n\nvec3 getPointPosition() {\n  vec4 p = min(geometryClip, position4);\n  vec3 center = getPosition(p, 1.0);\n\n  // Depth blending\n  // TODO: orthographic camera\n  // Workaround: set depth = 0\n  float z = -center.z;\n  float depth = mix(z, focusDepth, pointDepth);\n  \n  // Match device/unit mapping \n  // Sprite goes from -1..1, width = 2.\n  float pointSize = getPointSize(p);\n  float size = pointScale * pointSize * pixelUnit * .5;\n  float depthSize = depth * size;\n  \n  // Pad sprite by half a pixel to make the anti-aliasing straddle the pixel edge\n  // Note: pixelsize measures radius\n  float pixelSize = .5 * (pointDepth > 0.0 ? depthSize / z : size);\n  float paddedSize = pixelSize + 0.5;\n  float padFactor = paddedSize / pixelSize;\n\n  vPixelSize = paddedSize;\n  vSprite    = sprite;\n\n  return center + vec3(sprite * depthSize * renderScaleInv * padFactor, 0.0);\n}\n","point.size.uniform":"uniform float pointSize;\n\nfloat getPointSize(vec4 xyzw) {\n  return pointSize;\n}","point.size.varying":"uniform float pointSize;\n\nvec4 getSample(vec4 xyzw);\n\nfloat getPointSize(vec4 xyzw) {\n  return pointSize * getSample(xyzw).x;\n}","polar.position":"uniform float polarBend;\nuniform float polarFocus;\nuniform float polarAspect;\nuniform float polarHelix;\n\nuniform mat4 viewMatrix;\n\nvec4 getPolarPosition(vec4 position, inout vec4 stpq) {\n  if (polarBend > 0.0) {\n\n    if (polarBend < 0.001) {\n      // Factor out large addition/subtraction of polarFocus\n      // to avoid numerical error\n      // sin(x) ~ x\n      // cos(x) ~ 1 - x * x / 2\n      vec2 pb = position.xy * polarBend;\n      float ppbbx = pb.x * pb.x;\n      return viewMatrix * vec4(\n        position.x * (1.0 - polarBend + (pb.y * polarAspect)),\n        position.y * (1.0 - .5 * ppbbx) - (.5 * ppbbx) * polarFocus / polarAspect,\n        position.z + position.x * polarHelix * polarBend,\n        1.0\n      );\n    }\n    else {\n      vec2 xy = position.xy * vec2(polarBend, polarAspect);\n      float radius = polarFocus + xy.y;\n      return viewMatrix * vec4(\n        sin(xy.x) * radius,\n        (cos(xy.x) * radius - polarFocus) / polarAspect,\n        position.z + position.x * polarHelix * polarBend,\n        1.0\n      );\n    }\n  }\n  else {\n    return viewMatrix * vec4(position.xyz, 1.0);\n  }\n}","project.position":"uniform float styleZBias;\nuniform float styleZIndex;\n\nvoid setPosition(vec3 position) {\n  vec4 pos = projectionMatrix * vec4(position, 1.0);\n\n  // Apply relative Z bias\n  float bias  = (1.0 - styleZBias / 32768.0);\n  pos.z *= bias;\n  \n  // Apply large scale Z index changes\n  if (styleZIndex > 0.0) {\n    float z = pos.z / pos.w;\n    pos.z = ((z + 1.0) / (styleZIndex + 1.0) - 1.0) * pos.w;\n  }\n  \n  gl_Position = pos;\n}","project.readback":"// This is three.js' global uniform, missing from fragment shaders.\nuniform mat4 projectionMatrix;\n\nvec4 readbackPosition(vec3 position, vec4 stpq) {\n  vec4 pos = projectionMatrix * vec4(position, 1.0);\n  vec3 final = pos.xyz / pos.w;\n  if (final.z < -1.0) {\n    return vec4(0.0, 0.0, 0.0, -1.0);\n  }\n  else {\n    return vec4(final, -position.z);\n  }\n}\n","raw.position.scale":"uniform vec4 geometryScale;\nattribute vec4 position4;\n\nvec4 getRawPositionScale() {\n  return geometryScale * position4;\n}\n","repeat.position":"uniform vec4 repeatModulus;\n\nvec4 getRepeatXYZW(vec4 xyzw) {\n  return mod(xyzw + .5, repeatModulus) - .5;\n}\n","resample.padding":"uniform vec4 resampleBias;\n\nvec4 resamplePadding(vec4 xyzw) {\n  return xyzw + resampleBias;\n}","resample.relative":"uniform vec4 resampleFactor;\n\nvec4 resampleRelative(vec4 xyzw) {\n  return xyzw * resampleFactor;\n}","reveal.mask":"uniform float transitionEnter;\nuniform float transitionExit;\nuniform vec4  transitionScale;\nuniform vec4  transitionBias;\nuniform float transitionSkew;\nuniform float transitionActive;\n\nfloat getTransitionSDFMask(vec4 stpq) {\n  if (transitionActive < 0.5) return 1.0;\n\n  float enter   = transitionEnter;\n  float exit    = transitionExit;\n  float skew    = transitionSkew;\n  vec4  scale   = transitionScale;\n  vec4  bias    = transitionBias;\n\n  float factor  = 1.0 + skew;\n  float offset  = dot(vec4(1.0), stpq * scale + bias);\n\n  vec2 d = vec2(enter, exit) * factor + vec2(-offset, offset - skew);\n  if (exit  == 1.0) return d.x;\n  if (enter == 1.0) return d.y;\n  return min(d.x, d.y);\n}","root.position":"vec3 getRootPosition(vec4 position, in vec4 stpqIn, out vec4 stpqOut) {\n  stpqOut = stpqIn; // avoid inout confusion\n  return position.xyz;\n}","sample.2d":"uniform sampler2D dataTexture;\n\nvec4 sample2D(vec2 uv) {\n  return texture2D(dataTexture, uv);\n}\n","scale.position":"uniform vec4 scaleAxis;\nuniform vec4 scaleOffset;\n\nvec4 sampleData(float x);\n\nvec4 getScalePosition(vec4 xyzw) {\n  return scaleAxis * sampleData(xyzw.x).x + scaleOffset;\n}\n","screen.map.stpq":"uniform vec4 remapSTPQScale;\n\nvec4 screenMapSTPQ(vec4 xyzw, out vec4 stpq) {\n  stpq = xyzw * remapSTPQScale;\n  return xyzw;\n}\n","screen.map.xy":"uniform vec2 remapUVScale;\n\nvec4 screenMapXY(vec4 uvwo, vec4 stpq) {\n  return vec4(floor(remapUVScale * uvwo.xy), 0.0, 0.0);\n}\n","screen.map.xyzw":"uniform vec2 remapUVScale;\nuniform vec2 remapModulus;\nuniform vec2 remapModulusInv;\n\nvec4 screenMapXYZW(vec4 uvwo, vec4 stpq) {\n  vec2 st = floor(remapUVScale * uvwo.xy);\n  vec2 xy = st * remapModulusInv;\n  vec2 ixy = floor(xy);\n  vec2 fxy = xy - ixy;\n  vec2 zw = fxy * remapModulus;\n  return vec4(ixy.x, zw.y, ixy.y, zw.x);\n}\n","screen.pass.uv":"vec2 screenPassUV(vec4 uvwo, vec4 stpq) {\n  return uvwo.xy;\n}\n","screen.position":"void setScreenPosition(vec4 position) {\n  gl_Position = vec4(position.xy * 2.0 - 1.0, 0.5, 1.0);\n}\n","slice.position":"uniform vec4 sliceOffset;\n\nvec4 getSliceOffset(vec4 xyzw) {\n  return xyzw + sliceOffset;\n}\n","spherical.position":"uniform float sphericalBend;\nuniform float sphericalFocus;\nuniform float sphericalAspectX;\nuniform float sphericalAspectY;\nuniform float sphericalScaleY;\n\nuniform mat4 viewMatrix;\n\nvec4 getSphericalPosition(vec4 position, inout vec4 stpq) {\n  if (sphericalBend > 0.0001) {\n\n    vec3 xyz = position.xyz * vec3(sphericalBend, sphericalBend / sphericalAspectY * sphericalScaleY, sphericalAspectX);\n    float radius = sphericalFocus + xyz.z;\n    float cosine = cos(xyz.y) * radius;\n\n    return viewMatrix * vec4(\n      sin(xyz.x) * cosine,\n      sin(xyz.y) * radius * sphericalAspectY,\n      (cos(xyz.x) * cosine - sphericalFocus) / sphericalAspectX,\n      1.0\n    );\n  }\n  else {\n    return viewMatrix * vec4(position.xyz, 1.0);\n  }\n}","split.position":"uniform float splitStride;\n\nvec2 getIndices(vec4 xyzw);\nvec4 getRest(vec4 xyzw);\nvec4 injectIndex(float v);\n\nvec4 getSplitXYZW(vec4 xyzw) {\n  vec2 uv = getIndices(xyzw);\n  float offset = uv.x + uv.y * splitStride;\n  return injectIndex(offset) + getRest(xyzw);\n}\n","spread.position":"uniform vec4 spreadOffset;\nuniform mat4 spreadMatrix;\n\n// External\nvec4 getSample(vec4 xyzw);\n\nvec4 getSpreadSample(vec4 xyzw) {\n  vec4 sample = getSample(xyzw);\n  return sample + spreadMatrix * (spreadOffset + xyzw);\n}\n","sprite.fragment":"varying vec2 vSprite;\n\nvec4 getSample(vec2 xy);\n\nvec4 getSpriteColor() {\n  return getSample(vSprite);\n}","sprite.position":"uniform vec2 spriteOffset;\nuniform float spriteScale;\nuniform float spriteDepth;\nuniform float spriteSnap;\n\nuniform vec2 renderOdd;\nuniform float renderScale;\nuniform float renderScaleInv;\nuniform float pixelUnit;\nuniform float focusDepth;\n\nuniform vec4 geometryClip;\nattribute vec4 position4;\nattribute vec2 sprite;\n\nvarying float vPixelSize;\n\n// External\nvec3 getPosition(vec4 xyzw, float canonical);\nvec4 getSprite(vec4 xyzw);\n\nvec3 getSpritePosition() {\n  // Clip points\n  vec4 p = min(geometryClip, position4);\n  float diff = length(position4 - p);\n  if (diff > 0.0) {\n    return vec3(0.0, 0.0, 1000.0);\n  }\n\n  // Make sprites\n  vec3 center = getPosition(p, 1.0);\n  vec4 atlas = getSprite(p);\n\n  // Sprite goes from -1..1, width = 2.\n  // -1..1 -> -0.5..0.5\n  vec2 halfSprite = sprite * .5;\n  vec2 halfFlipSprite = vec2(halfSprite.x, -halfSprite.y);\n\n#ifdef POSITION_UV\n  // Assign UVs\n  vUV = atlas.xy + atlas.zw * (halfFlipSprite + .5);\n#endif\n\n  // Depth blending\n  // TODO: orthographic camera\n  // Workaround: set depth = 0\n  float depth = focusDepth, z;\n  z = -center.z;\n  if (spriteDepth < 1.0) {\n    depth = mix(z, focusDepth, spriteDepth);\n  }\n  \n  // Match device/unit mapping \n  float size = pixelUnit * spriteScale;\n  float depthSize = depth * size;\n\n  // Calculate pixelSize for anti-aliasing\n  float pixelSize = (spriteDepth > 0.0 ? depthSize / z : size);\n  vPixelSize = pixelSize;\n\n  // Position sprite\n  vec2 atlasOdd = fract(atlas.zw / 2.0);\n  vec2 offset = (spriteOffset + halfSprite * atlas.zw) * depthSize;\n  if (spriteSnap > 0.5) {\n    // Snap to pixel (w/ epsilon shift to avoid jitter)\n    return vec3(((floor(center.xy / center.z * renderScale + 0.001) + renderOdd + atlasOdd) * center.z + offset) * renderScaleInv, center.z);\n  }\n  else {\n    // Place directly\n    return center + vec3(offset * renderScaleInv, 0.0);\n  }\n\n}\n","stereographic.position":"uniform float stereoBend;\n\nuniform mat4 viewMatrix;\n\nvec4 getStereoPosition(vec4 position, inout vec4 stpq) {\n  if (stereoBend > 0.0001) {\n\n    vec3 pos = position.xyz;\n    float r = length(pos);\n    float z = r + pos.z;\n    vec3 project = vec3(pos.xy / z, r);\n    \n    vec3 lerped = mix(pos, project, stereoBend);\n\n    return viewMatrix * vec4(lerped, 1.0);\n  }\n  else {\n    return viewMatrix * vec4(position.xyz, 1.0);\n  }\n}","stereographic4.position":"uniform float stereoBend;\nuniform vec4 basisScale;\nuniform vec4 basisOffset;\nuniform mat4 viewMatrix;\nuniform vec2 view4D;\n\nvec4 getStereographic4Position(vec4 position, inout vec4 stpq) {\n  \n  vec4 transformed;\n  if (stereoBend > 0.0001) {\n\n    float r = length(position);\n    float w = r + position.w;\n    vec4 project = vec4(position.xyz / w, r);\n    \n    transformed = mix(position, project, stereoBend);\n  }\n  else {\n    transformed = position;\n  }\n\n  vec4 pos4 = transformed * basisScale - basisOffset;\n  vec3 xyz = (viewMatrix * vec4(pos4.xyz, 1.0)).xyz;\n  return vec4(xyz, pos4.w * view4D.y + view4D.x);\n}\n","stpq.sample.2d":"varying vec2 vST;\n\nvec4 getSample(vec2 st);\n\nvec4 getSTSample() {\n  return getSample(vST);\n}\n","stpq.xyzw.2d":"varying vec2 vUV;\n\nvoid setRawUV(vec4 xyzw) {\n  vUV = xyzw.xy;\n}\n","strip.position.normal":"uniform vec4 geometryClip;\nattribute vec4 position4;\nattribute vec3 strip;\n\n// External\nvec3 getPosition(vec4 xyzw, float canonical);\n\nvarying vec3 vNormal;\nvarying vec3 vLight;\nvarying vec3 vPosition;\n\nvoid getStripGeometry(vec4 xyzw, vec3 strip, out vec3 pos, out vec3 normal) {\n  vec3 a, b, c;\n\n  a   = getPosition(xyzw, 1.0);\n  b   = getPosition(vec4(xyzw.xyz, strip.x), 0.0);\n  c   = getPosition(vec4(xyzw.xyz, strip.y), 0.0);\n\n  normal = normalize(cross(c - a, b - a)) * strip.z;\n  \n  pos = a;\n}\n\nvec3 getStripPositionNormal() {\n  vec3 center, normal;\n\n  vec4 p = min(geometryClip, position4);\n\n  getStripGeometry(p, strip, center, normal);\n  vNormal   = normal;\n  vLight    = normalize((viewMatrix * vec4(1.0, 2.0, 2.0, 0.0)).xyz);\n  vPosition = -center;\n\n  return center;\n}\n","style.color":"uniform vec3 styleColor;\nuniform float styleOpacity;\n\nvec4 getStyleColor() {\n  return vec4(styleColor, styleOpacity);\n}\n","subdivide.depth":"uniform float subdivideBevel;\n\n// External\nvec4 sampleData(vec4 xyzw);\n\nvec4 subdivideDepth(vec4 xyzw) {\n  float x = xyzw.z;\n  float i = floor(x);\n  float f = x - i;\n\n  float minf = subdivideBevel * min(f, 1.0 - f);\n  float g = (f > 0.5) ? 1.0 - minf : (f < 0.5) ? minf : 0.5;\n\n  return sampleData(vec4(xyzw.xy, i + g, xyzw.w));\n}\n","subdivide.depth.lerp":"uniform float subdivideBevel;\n\n// External\nvec4 sampleData(vec4 xyzw);\n\nvec4 subdivideDepthLerp(vec4 xyzw) {\n  float x = xyzw.z;\n  float i = floor(x);\n  float f = x - i;\n\n  float minf = subdivideBevel * min(f, 1.0 - f);\n  float g = (f > 0.5) ? 1.0 - minf : (f < 0.5) ? minf : 0.5;\n\n  vec4 xyzw1 = vec4(xyzw.xy, i, xyzw.w);\n  vec4 xyzw2 = vec4(xyzw.xy, i + 1.0, xyzw.w);\n  \n  vec4 a = sampleData(xyzw1);\n  vec4 b = sampleData(xyzw2);\n\n  return mix(a, b, g);\n}\n","subdivide.height":"uniform float subdivideBevel;\n\n// External\nvec4 sampleData(vec4 xyzw);\n\nvec4 subdivideHeight(vec4 xyzw) {\n  float x = xyzw.y;\n  float i = floor(x);\n  float f = x - i;\n\n  float minf = subdivideBevel * min(f, 1.0 - f);\n  float g = (f > 0.5) ? 1.0 - minf : (f < 0.5) ? minf : 0.5;\n\n  return sampleData(vec4(xyzw.x, i + g, xyzw.zw));\n}\n","subdivide.height.lerp":"uniform float subdivideBevel;\n\n// External\nvec4 sampleData(vec4 xyzw);\n\nvec4 subdivideHeightLerp(vec4 xyzw) {\n  float x = xyzw.y;\n  float i = floor(x);\n  float f = x - i;\n\n  float minf = subdivideBevel * min(f, 1.0 - f);\n  float g = (f > 0.5) ? 1.0 - minf : (f < 0.5) ? minf : 0.5;\n\n  vec4 xyzw1 = vec4(xyzw.x, i, xyzw.zw);\n  vec4 xyzw2 = vec4(xyzw.x, i + 1.0, xyzw.zw);\n  \n  vec4 a = sampleData(xyzw1);\n  vec4 b = sampleData(xyzw2);\n\n  return mix(a, b, g);\n}\n","subdivide.items":"uniform float subdivideBevel;\n\n// External\nvec4 sampleData(vec4 xyzw);\n\nvec4 subdivideItems(vec4 xyzw) {\n  float x = xyzw.w;\n  float i = floor(x);\n  float f = x - i;\n\n  float minf = subdivideBevel * min(f, 1.0 - f);\n  float g = (f > 0.5) ? 1.0 - minf : (f < 0.5) ? minf : 0.5;\n\n  return sampleData(vec4(xyzw.xyz, i + g));\n}\n","subdivide.items.lerp":"uniform float subdivideBevel;\n\n// External\nvec4 sampleData(vec4 xyzw);\n\nvec4 subdivideItemsLerp(vec4 xyzw) {\n  float x = xyzw.w;\n  float i = floor(x);\n  float f = x - i;\n\n  float minf = subdivideBevel * min(f, 1.0 - f);\n  float g = (f > 0.5) ? 1.0 - minf : (f < 0.5) ? minf : 0.5;\n\n  vec4 xyzw1 = vec4(xyzw.xyz, i);\n  vec4 xyzw2 = vec4(xyzw.xyz, i + 1.0);\n  \n  vec4 a = sampleData(xyzw1);\n  vec4 b = sampleData(xyzw2);\n\n  return mix(a, b, g);\n}\n","subdivide.width":"uniform float subdivideBevel;\n\n// External\nvec4 sampleData(vec4 xyzw);\n\nvec4 subdivideWidth(vec4 xyzw) {\n  float x = xyzw.x;\n  float i = floor(x);\n  float f = x - i;\n\n  float minf = subdivideBevel * min(f, 1.0 - f);\n  float g = (f > 0.5) ? 1.0 - minf : (f < 0.5) ? minf : 0.5;\n\n  return sampleData(vec4(i + g, xyzw.yzw));\n}\n","subdivide.width.lerp":"uniform float subdivideBevel;\n\n// External\nvec4 sampleData(vec4 xyzw);\n\nvec4 subdivideWidthLerp(vec4 xyzw) {\n  float x = xyzw.x;\n  float i = floor(x);\n  float f = x - i;\n\n  float minf = subdivideBevel * min(f, 1.0 - f);\n  float g = (f > 0.5) ? 1.0 - minf : (f < 0.5) ? minf : 0.5;\n\n  vec4 xyzw1 = vec4(i, xyzw.yzw);\n  vec4 xyzw2 = vec4(i + 1.0, xyzw.yzw);\n  \n  vec4 a = sampleData(xyzw1);\n  vec4 b = sampleData(xyzw2);\n\n  return mix(a, b, g);\n}\n","surface.mask.hollow":"attribute vec4 position4;\n\nfloat getSurfaceHollowMask(vec4 xyzw) {\n  vec4 df = abs(fract(position4) - .5);\n  vec2 df2 = min(df.xy, df.zw);\n  float df3 = min(df2.x, df2.y);\n  return df3;\n}","surface.position":"uniform vec4 geometryClip;\nuniform vec4 geometryResolution;\nuniform vec4 mapSize;\n\nattribute vec4 position4;\n\n// External\nvec3 getPosition(vec4 xyzw, float canonical);\n\nvec3 getSurfacePosition() {\n  vec4 p = min(geometryClip, position4);\n  vec3 xyz = getPosition(p, 1.0);\n\n  // Overwrite UVs\n#ifdef POSITION_UV\n#ifdef POSITION_UV_INT\n  vUV = -.5 + (position4.xy * geometryResolution.xy) * mapSize.xy;\n#else\n  vUV = position4.xy * geometryResolution.xy;\n#endif\n#endif\n\n  return xyz;\n}\n","surface.position.normal":"uniform vec4 mapSize;\nuniform vec4 geometryResolution;\nuniform vec4 geometryClip;\nattribute vec4 position4;\nattribute vec2 surface;\n\n// External\nvec3 getPosition(vec4 xyzw, float canonical);\n\nvoid getSurfaceGeometry(vec4 xyzw, float edgeX, float edgeY, out vec3 left, out vec3 center, out vec3 right, out vec3 up, out vec3 down) {\n  vec4 deltaX = vec4(1.0, 0.0, 0.0, 0.0);\n  vec4 deltaY = vec4(0.0, 1.0, 0.0, 0.0);\n\n  /*\n  // high quality, 5 tap\n  center =                  getPosition(xyzw, 1.0);\n  left   = (edgeX > -0.5) ? getPosition(xyzw - deltaX, 0.0) : center;\n  right  = (edgeX < 0.5)  ? getPosition(xyzw + deltaX, 0.0) : center;\n  down   = (edgeY > -0.5) ? getPosition(xyzw - deltaY, 0.0) : center;\n  up     = (edgeY < 0.5)  ? getPosition(xyzw + deltaY, 0.0) : center;\n  */\n  \n  // low quality, 3 tap\n  center =                  getPosition(xyzw, 1.0);\n  left   =                  center;\n  down   =                  center;\n  right  = (edgeX < 0.5)  ? getPosition(xyzw + deltaX, 0.0) : (2.0 * center - getPosition(xyzw - deltaX, 0.0));\n  up     = (edgeY < 0.5)  ? getPosition(xyzw + deltaY, 0.0) : (2.0 * center - getPosition(xyzw - deltaY, 0.0));\n}\n\nvec3 getSurfaceNormal(vec3 left, vec3 center, vec3 right, vec3 up, vec3 down) {\n  vec3 dx = right - left;\n  vec3 dy = up    - down;\n  vec3 n = cross(dy, dx);\n  if (length(n) > 0.0) {\n    return normalize(n);\n  }\n  return vec3(0.0, 1.0, 0.0);\n}\n\nvarying vec3 vNormal;\nvarying vec3 vLight;\nvarying vec3 vPosition;\n\nvec3 getSurfacePositionNormal() {\n  vec3 left, center, right, up, down;\n\n  vec4 p = min(geometryClip, position4);\n\n  getSurfaceGeometry(p, surface.x, surface.y, left, center, right, up, down);\n  vNormal   = getSurfaceNormal(left, center, right, up, down);\n  vLight    = normalize((viewMatrix * vec4(1.0, 2.0, 2.0, 0.0)).xyz); // hardcoded directional light\n  vPosition = -center;\n\n#ifdef POSITION_UV\n#ifdef POSITION_UV_INT\n  vUV = -.5 + (position4.xy * geometryResolution.xy) * mapSize.xy;\n#else\n  vUV = position4.xy * geometryResolution.xy;\n#endif\n#endif\n  \n  return center;\n}\n","ticks.position":"uniform float worldUnit;\nuniform float focusDepth;\nuniform float tickSize;\nuniform float tickEpsilon;\nuniform vec3  tickNormal;\nuniform vec2  tickStrip;\n\nvec4 getSample(vec4 xyzw);\n\nvec3 transformPosition(vec4 position, in vec4 stpqIn, out vec4 stpqOut);\n\nvec3 getTickPosition(vec4 xyzw, in vec4 stpqIn, out vec4 stpqOut) {\n  float epsilon = tickEpsilon;\n\n  // determine tick direction\n  float leftX  = max(tickStrip.x, xyzw.y - 1.0);\n  float rightX = min(tickStrip.y, xyzw.y + 1.0);\n  \n  vec4 left    = getSample(vec4(leftX,  xyzw.zw, 0.0));\n  vec4 right   = getSample(vec4(rightX, xyzw.zw, 0.0));\n  vec4 diff    = right - left;\n\n  vec3 normal  = cross(normalize(diff.xyz + vec3(diff.w)), tickNormal);\n  float bias   = max(0.0, 1.0 - length(normal) * 2.0);\n       normal  = mix(normal, tickNormal.yzx, bias * bias);\n  \n  // transform (point) and (point + delta)\n  vec4 center  = getSample(vec4(xyzw.yzw, 0.0));\n  vec4 delta   = vec4(normal, 0.0) * epsilon;\n\n  vec4 a = center;\n  vec4 b = center + delta;\n\n  vec4 _;\n  vec3 c = transformPosition(a, stpqIn, stpqOut);\n  vec3 d = transformPosition(b, stpqIn, _);\n  \n  // sample on either side to create line\n  float line = xyzw.x - .5;\n  vec3  mid  = c;\n  vec3  side = normalize(d - c);\n\n  return mid + side * line * tickSize * worldUnit * focusDepth;\n}\n","transform3.position":"uniform mat4 transformMatrix;\n\nvec4 transformPosition(vec4 position, inout vec4 stpq) {\n  return transformMatrix * vec4(position.xyz, 1.0);\n}\n","transform4.position":"uniform mat4 transformMatrix;\nuniform vec4 transformOffset;\n\nvec4 transformPosition(vec4 position, inout vec4 stpq) {\n  return transformMatrix * position + transformOffset;\n}\n","view.position":"// Implicit three.js uniform\n// uniform mat4 viewMatrix;\n\nvec4 getViewPosition(vec4 position, inout vec4 stpq) {\n  return (viewMatrix * vec4(position.xyz, 1.0));\n}\n"};class yu{constructor(t){this.context=t,this.anims=[]}make(t,e){const n=new bu(this,this.context.time,t,e);return this.anims.push(n),n}unmake(t){return this.anims=Array.from(this.anims).filter((e=>e!==t))}update(){const{time:t}=this.context;return this.anims=(()=>{const e=[];for(const n of Array.from(this.anims))!1!==n.update(t)&&e.push(n);return e})()}lerp(t,e,n,i,r){if(null==r&&(r=t.make()),t.lerp)r=t.lerp(e,n,r,i);else{if(t.emitter){const r=e.emitterFrom,s=n.emitterTo;if(null!=r&&null!=s&&r===s)return r.lerp(i),r;{const r=t.emitter(e,n);return e.emitterFrom=r,n.emitterTo=r,r.lerp(i),r}}if(t.op){const s=function(t,e){return t===+t&&e===+e?t+(e-t)*i:i>.5?e:t};r=t.op(e,n,r,s)}else r=i>.5?n:e}return r}}class bu{constructor(t,e,n,i){this.animator=t,this.time=e,this.type=n,this.options=i,this.value=this.type.make(),this.target=this.type.make(),this.queue=[]}dispose(){return this.animator.unmake(this)}set(){let{target:t}=this,e=arguments.length>1?[].slice.call(arguments):arguments[0],n=!1;return e=this.type.validate(e,t,(()=>n=!0)),n||(t=e),this.cancel(),this.target=this.value,this.value=t,this.notify()}getTime(){const{clock:t}=this.options,e=t?t.getTime():this.time;return this.options.realtime?e.time:e.clock}cancel(t){let e;null==t&&(t=this.getTime());const{queue:n}=this,i=(()=>{const i=[];for(e of Array.from(n))e.end>=t&&i.push(e);return i})();for(e of(this.queue=(()=>{const i=[];for(e of Array.from(n))e.end<t&&i.push(e);return i})(),Array.from(i)))"function"==typeof e.complete&&e.complete(!1);"function"==typeof this.options.complete&&this.options.complete(!1)}notify(){return"function"==typeof this.options.step?this.options.step(this.value):void 0}immediate(t,e){const{duration:n,delay:i,ease:r,step:s,complete:a}=e,o=this.getTime()+i,l=o+n;let h=!1,c=this.type.make();return void 0===(t=this.type.validate(t,c,(function(){return h=!0,null})))||h||(c=t),this.cancel(o),this.queue.push({from:null,to:c,start:o,end:l,ease:r,step:s,complete:a})}update(t){if(this.time=t,0===this.queue.length)return!0;const e=this.getTime();let{value:n}=this;const{queue:i}=this;let r=!1;for(;!r;){const t=i[0];let{from:s}=t;const{to:a,start:o,end:l,step:h,complete:c,ease:u}=t;null==s&&(s=t.from=this.type.clone(this.value));let d=Ml((e-o)/Math.max(1e-5,l-o)||0,0,1);if(0===d)return;const p=(()=>{switch(u){case"linear":case 0:return null;case"cosine":case 1:default:return Tl;case"binary":case 2:return El;case"hold":case 3:return Al}})();if(null!=p&&(d=p(d)),r=d<1,n=r?this.animator.lerp(this.type,s,a,d,n):a,"function"==typeof h&&h(n),!r&&("function"==typeof c&&c(!0),"function"==typeof this.options.complete&&this.options.complete(!0),i.shift(),0===i.length))break}return this.value=n,this.notify()}}class wu{v2(){return this}constructor(t,e,n){this._context=t,this._up=e,this._targets=n;const i=this._context.controller.getRoot();null==this._targets&&(this._targets=[i]),this.isRoot=1===this._targets.length&&this._targets[0]===i,this.isLeaf=1===this._targets.length&&null==this._targets[0].children;for(let t=0;t<this._targets.length;t++){const e=this._targets[t];this[t]=e}this.length=this._targets.length;for(const t of Array.from(this._context.controller.getTypes()))["root"].includes(t)||(this[t]=(e,n)=>this.add(t,e,n))}select(t){const e=this._context.model.select(t,this.isRoot?null:this._targets);return this._push(e)}eq(t){return this._targets.length>t?this._push([this._targets[t]]):this._push([])}filter(t){if("string"==typeof t){const e=this._context.model._matcher(t);t=t=>e(t)}return this._push(this._targets.filter(t))}map(t){return function(t,e,n){const i=[],r=t<e,s=n?r?e+1:e-1:e;for(let e=t;r?e<s:e>s;r?e++:e--)i.push(e);return i}(0,this.length,!1).map((e=>t(this[e],e,this)))}each(t){for(let e=0,n=this.length,i=0<=n;i?e<n:e>n;i?e++:e--)t(this[e],e,this);return this}add(t,e,n){const{controller:i}=this._context;if(this.isLeaf)return this._pop().add(t,e,n);const r=[];for(const s of this._targets){const a=i.make(t,e,n);i.add(a,s),r.push(a)}return this._push(r)}remove(t){if(t)return this.select(t).remove();for(const t of Array.from(this._targets.slice().reverse()))this._context.controller.remove(t);return this._pop()}set(t,e){for(const n of Array.from(this._targets))this._context.controller.set(n,t,e);return this}getAll(t){return Array.from(this._targets).map((e=>this._context.controller.get(e,t)))}get(t){return null!=this._targets[0]?this._targets[0].get(t):void 0}evaluate(t,e){return null!=this._targets[0]?this._targets[0].evaluate(t,e):void 0}bind(t,e){for(const n of Array.from(this._targets))this._context.controller.bind(n,t,e);return this}unbind(t){for(const e of Array.from(this._targets))this._context.controller.unbind(e,t);return this}end(){return(this.isLeaf?this._pop():this)._pop()}_push(t){return new wu(this._context,this,t)}_pop(){return null!=this._up?this._up:this}_reset(){let t;return null!=(t=null!=this._up?this._up.reset():void 0)?t:this}map(t){return this._targets.map(t)}on(){const t=arguments;return this._targets.map((e=>e.on.apply(e,t))),this}off(){const t=arguments;return this._targets.map((e=>e.off.apply(e,t))),this}toString(){const t=this._targets.map((t=>t.toString()));return this._targets.length>1?`[${t.join(", ")}]`:t[0]}toMarkup(){return this._targets.map((t=>t.toMarkup())).join("\n\n")}print(){return Zs(this._targets.map((t=>t.toMarkup())).join("\n\n")),this}debug(){const t=this.inspect();console.log("Renderables: ",t.renderables),console.log("Renders: ",t.renders),console.log("Shaders: ",t.shaders);const e=[];for(const n of Array.from(t.shaders)){const t=n.owner.constructor.toString().match("function +([^(]*)")[1];e.push(`${t} - Vertex`),e.push(n.vertex),e.push(`${t} - Fragment`),e.push(n.fragment)}return fu(e)}inspect(t,e,n){let i;"boolean"==typeof e&&(n=e,e=null),null==n&&(n=!0);const r=i=function(t,n){if(null==n&&(n=[]),e&&!t.traits.hash[e]||n.push((t=>null!=(null!=t.controller?t.controller.objects:void 0)?null!=t.controller?t.controller.objects:void 0:[])(t)),null!=t.children)for(const e of Array.from(t.children))i(e,n);return n},s=function(t){return t=(t=t.reduce(((t,e)=>t.concat(e)),[])).filter(((e,n)=>null!=e&&t.indexOf(e)===n))},a=function(t,e){const n={};return n.owner=t,n.geometry=e.geometry,n.material=e.material,n.vertex=e.userData.vertexGraph,n.fragment=e.userData.fragmentGraph,n},o={nodes:this._targets.slice(),renderables:[],renders:[],shaders:[]};for(const e of Array.from(this._targets)){let i;n&&e.print(t,"info");const l={renderables:i=s(r(e)),renders:s(i.map((t=>t.renders))),shaders:s(i.map((t=>null!=t.renders?t.renders.map((e=>a(t,e))):void 0)))};for(const t in l)o[t]=o[t].concat(l[t])}return o}}class Su{constructor(t,e){this.model=t,this.primitives=e}getRoot(){return this.model.getRoot()}getTypes(){return this.primitives.getTypes()}make(t,e,n){return this.primitives.make(t,e,n)}get(t,e){return t.get(e)}set(t,e,n){try{return t.set(e,n)}catch(e){return t.print(null,"warn"),console.error(e)}}bind(t,e,n){try{return t.bind(e,n)}catch(e){return t.print(null,"warn"),console.error(e)}}unbind(t,e){try{return t.unbind(e)}catch(e){return t.print(null,"warn"),console.error(e)}}add(t,e){return null==e&&(e=this.model.getRoot()),e.add(t)}remove(t){const e=t.parent;if(e)return e.remove(t)}}const Mu=h,Tu=o,Eu=u,Au=l,Cu=c,Ru=t,Du=a,ku=d,Pu=n;class Lu{static initClass(){this.Namespace={Model:e,Overlay:s,Primitives:f,Render:m,Shaders:w,Stage:S,Util:M,DOM:Pu}}constructor(t,e=null,n=null){let i;this.canvas=i=t.domElement,this.element=null,this.shaders=xu(_u),this.renderables=new oh(Rh,t,this.shaders),this.overlays=new ma(La,i),this.scene=this.renderables.make("scene",{scene:e}),this.camera=this.defaultCamera=null!=n?n:new vt.PerspectiveCamera,this.attributes=new Vs(ih,this),this.primitives=new nh(ih,this),this.root=this.primitives.make("root"),this.model=new fa(this.root),this.guard=new sa,this.controller=new Su(this.model,this.primitives),this.animator=new yu(this),this.api=new wu(this),this.speed=1,this.time={now:+new Date/1e3,time:0,delta:0,clock:0,step:0}}init(){return this.scene.inject(),this.overlays.inject(),this}destroy(){return this.scene.unject(),this.overlays.unject(),this}resize(t){return null==t&&(t={}),null==t.renderWidth&&(t.renderWidth=null!=t.viewWidth?t.viewWidth:t.viewWidth=1280),null==t.renderHeight&&(t.renderHeight=null!=t.viewHeight?t.viewHeight:t.viewHeight=720),null==t.pixelRatio&&(t.pixelRatio=t.renderWidth/Math.max(1e-6,t.viewWidth)),null==t.aspect&&(t.aspect=t.viewWidth/Math.max(1e-6,t.viewHeight)),this.root.controller.resize(t),this}frame(t){return this.pre(t),this.update(),this.render(),this.post(),this}pre(t){return t||((t={now:+new Date/1e3,time:0,delta:0,clock:0,step:0}).delta=null!=this.time.now?t.now-this.time.now:0,t.delta>1&&(t.delta=1/60),t.step=t.delta*this.speed,t.time=this.time.time+t.delta,t.clock=this.time.clock+t.step),this.time=t,"function"==typeof this.root.controller.pre&&this.root.controller.pre(),this}update(){return this.animator.update(),this.attributes.compute(),this.guard.iterate({step:()=>{let t=this.attributes.digest();return t||this.model.digest()},last(){return{attribute:this.attributes.getLastTrigger(),model:this.model.getLastTrigger()}}}),"function"==typeof this.root.controller.update&&this.root.controller.update(),this.camera=this.root.controller.getCamera(),this.speed=this.root.controller.getSpeed(),this}render(){return"function"==typeof this.root.controller.render&&this.root.controller.render(),this.scene.render(),this}post(){return"function"==typeof this.root.controller.post&&this.root.controller.post(),this}setWarmup(t){return this.scene.warmup(t),this}getPending(){return this.scene.pending.length}}Lu.initClass();const zu="2.1.1",Ou=Math.PI,Iu=2*Ou,Nu=Math.E,Fu=Lu,Uu=e,Bu=s,Vu=f,Hu=m,Gu=w,ju=S,qu=M,Wu=Pu,Xu=function(t){const e=new C(t);return e.fallback||(e.Time||e.install("time"),e.MathBox||e.install(["mathbox","splash"])),null!=e.mathbox?e.mathbox:e};C.registerPlugin("mathbox",{defaults:{init:!0,warmup:2,inspect:!0,splash:!0},listen:["ready","pre","update","post","resize"],install(t){let e=!1;return this.first=!0,t.MathBox={init:n=>{if(e)return;e=!0;const i=(null!=n?n.scene:void 0)||this.options.scene||t.scene,r=(null!=n?n.camera:void 0)||this.options.camera||t.camera;this.context=new Fu(t.renderer,i,r),this.context.api.three=t.three=t,this.context.api.mathbox=t.mathbox=this.context.api,this.context.api.start=()=>t.Loop.start(),this.context.api.stop=()=>t.Loop.stop(),this.context.init(),this.context.resize(t.Size),this.context.setWarmup(this.options.warmup),this.pending=0,this.warm=!this.options.warmup,console.log("MathBox²",zu),t.trigger({type:"mathbox/init",version:zu,context:this.context})},destroy:()=>{e&&(e=!1,t.trigger({type:"mathbox/destroy",context:this.context}),this.context.destroy(),delete t.mathbox,delete this.context.api.three,delete this.context)},object:()=>null!=this.context?this.context.scene.root:void 0}},uninstall(t){t.MathBox.destroy(),delete t.MathBox},ready(t,e){if(this.options.init)return e.MathBox.init(),setTimeout((()=>{if(this.options.inspect)return this.inspect(e)}))},inspect(t){if(this.context.api.inspect(),!this.options.warmup)return this.info(t)},info(t){const e=function(t){const e=[];for(;t>=1e3;)e.unshift(("000"+t%1e3).slice(-3)),t=Math.floor(t/1e3);return e.unshift(t),e.join(",")},n=t.renderer.info.render;console.log("Geometry  ",e(n.triangles)+" triangles  ",e(n.points)+" points  ",e(n.lines)+" lines  ",e(n.calls)+" draw calls  ")},resize(t,e){return null!=this.context?this.context.resize(e.Size):void 0},pre(t,e){return null!=this.context?this.context.pre(e.Time):void 0},update(t,e){let n;return null!=this.context&&this.context.update(),(n=null!=this.context?this.context.camera:void 0)&&n!==e.camera&&(e.camera=n),e.Time.set({speed:this.context.speed}),this.progress(this.context.getPending(),e),null!=this.context?this.context.render():void 0},post(t,e){return null!=this.context?this.context.post():void 0},progress(t,e){if(!t&&!this.pending)return;let n=Math.max(t+this.options.warmup,this.pending);const i=n-t,r=n;e.trigger({type:"mathbox/progress",current:n-t,total:n}),0===t&&(n=0),this.pending=n,i!==r||this.warm||(this.warm=!0,this.options.inspect&&this.info(e))}})})(),r})()}));
+//# sourceMappingURL=mathbox.min.js.map
\ No newline at end of file
diff --git a/build/mathbox.min.js.LICENSE.txt b/build/mathbox.min.js.LICENSE.txt
new file mode 100644
index 0000000000000000000000000000000000000000..671b5036452f7a97533deb0a8f7c835b50f72981
--- /dev/null
+++ b/build/mathbox.min.js.LICENSE.txt
@@ -0,0 +1,8 @@
+/*!
+ * The buffer module from node.js, for the browser.
+ *
+ * @author   Feross Aboukhadijeh <http://feross.org>
+ * @license  MIT
+ */
+
+/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */
diff --git a/build/mathbox.min.js.map b/build/mathbox.min.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..51ad7d0f16deefcee50838b5920667666f98a68b
--- /dev/null
+++ b/build/mathbox.min.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"mathbox.min.js","mappings":"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,eACA,SACA,cACA,kBACA,mBACA,eACA,eACA,cACA,eACA,kBACA,gBACA,iBACA,4BACA,uBACA,mBACA,yBACA,gBACA,0BACA,wBACA,mBACA,iBACA,2BACA,wBACA,mBACA,kCACA,oBACA,kCACA,eACA,sBACA,0BACA,qBACA,sBACA,sBACA,gCACA,gCACA,qBACA,4BACA,qCACA,8BACA,+BACA,sCACA,+CACA,wCACA,oBACA,oBACA,oBACA,oBACA,oBACA,oBACA,oBACA,oBACA,YACA,kBACA,iBACA,kBACA,kBACA,kBACA,kBACA,WACA,gBACA,qBACA,eACA,cACA,sBACA,6BACA,sCACA,+BACA,oBACA,cACA,qBACA,mBACA,0BACA,mCACA,4BACA,YACA,cACA,mBACA,cACA,SACA,WACA,gBACA,MACA,OACA,iBACA,MACA,MACA,MACA,MACA,YACA,MACA,WACA,MACA,UACA,UACA,UACA,OACA,MACA,aACA,OACA,OACA,MACA,YACA,eACA,gBACA,mBACA,cACA,iBACA,kBACA,sBACA,oBACA,mBACA,uBACA,uB,eCpJJ,IAAIgwB,EAAO,EAAQ,MAEnB/vB,EAAOD,QAAUgwB,EAAKxpB,QAAQoB,OAAO,CAClC,SACC,WACA,SACA,OACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,QACA,QACA,QACA,oBACA,iBACA,uBACA,aACA,aACA,eACA,kBACA,aACA,aACA,eACA,kBACA,WACA,WACA,WACA,YACA,WACA,cACA,gBACA,QACA,SACA,aACA,SACA,YACA,SACA,SACA,UACA,UACA,UACA,YACA,WACA,WACA,WACA,aACA,WACA,WACA,WACA,aACA,eACA,eACA,gBACA,gBACA,gBACA,gBACA,gBACA,gBACA,qBACA,qBACA,cACA,eACA,eACA,iBACA,uBACA,aACA,kBACA,aACA,kBACA,iBACA,iBACA,gBACA,iBACA,iBACA,cACA,eACA,eACA,mBACA,oBACA,uB,SCrFJ3H,EAAOD,QAAU,CAEb,YACA,QACA,UACA,OACA,YACA,QACA,UACA,UACA,QACA,WACA,KACA,MACA,QACA,KACA,OACA,KACA,MACA,QACA,QACA,MACA,OACA,OACA,OACA,OACA,QACA,UACA,SACA,OACA,OACA,OACA,OACA,OACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,YACA,YACA,YACA,cACA,kBACA,kBACA,SAGA,MACA,QACA,QACA,OACA,UACA,WACA,OACA,SACA,OACA,SACA,UACA,SACA,WACA,WACA,SACA,SACA,SACA,WACA,YACA,OACA,QACA,SACA,OACA,QACA,WACA,QACA,SACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,gBACA,gBACA,sBACA,SACA,OACA,YACA,U,SC5FJC,EAAOD,QAAU,CACb,MACA,MACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,M,eC7CJ,IAAIiwB,EAAW,EAAQ,MAEvBhwB,EAAOD,QAEP,SAAwBqL,EAAK0iB,GAC3B,IAAImC,EAAYD,EAASlC,GACrBvtB,EAAS,GAKb,OAFAA,GADAA,EAASA,EAAOoH,OAAOsoB,EAAU7kB,KACjBzD,OAAOsoB,EAAU,S,4BCRnCtuB,OAAO+L,eAAe3N,EAAS,aAAc,CAAE2C,OAAO,IACtD3C,EAAQ8P,aAAU,EAClB,IAAIjC,EAAa,EAAQ,MAmDzB7N,EAAQ8P,QAjCR,SAAiBqgB,GACb,IAAIxd,EAAIwd,EAAO,GAEXvd,EAAIud,EAAO,GAAK,EAQpB,GAAIvd,EAAI,GAAKD,GAAK,EACd,OAAO9E,EAAWH,UAEtB,IAAW,IAAPiF,EACA,OAAO,SAAUyd,GAAS,OAAOA,GAASxd,GAC9C,GAAU,IAAND,EACA,OAAO,SAAUyd,GAAS,OAAOA,IAAUxd,GAE/C,GAAU,IAAND,EACA,OAAOC,EAAI,EAAI/E,EAAWJ,SA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GAAc,CAC1BC,kBDzHwB,yFC0HxBC,uBC1HwB,qED2HxBC,mBE3HwB,qFF4HxBC,wBG5HwB,+DH6HxBC,eI7HwB,ghBJ8HxBC,oBK9HwB,gGL+HxBC,aM/HwB,2CNgIxBC,mBOhIwB,yHPiIxBC,MQjIwB,k7PRkIxBC,sBSlIwB,iyCTmIxBC,yBUnIwB,ypBVoIxBC,8BWpIwB,sIXqIxBC,4BYrIwB,6EZsIxBC,uBatIwB,mFbuIxBC,ecvIwB,2IdwIxBC,oBexIwB,iIfyIxBC,kBgBzIwB,oKhB0IxBC,aiB1IwB,ySjB2IxBC,OkB3IwB,w1FlB4IxBC,4BmB5IwB,y+HnB6IxBC,qBoB7IwB,qtBpB8IxBC,4BqB9IwB,0JrB+IxBC,uBsB/IwB,2KtBgJxBC,qBuBhJwB,iJvBiJxBC,0BwBjJwB,2ExBkJxBC,mByBlJwB,0DzBmJxBC,wB0BnJwB,uR1BoJxBC,gB2BpJwB,45C3BqJxBC,4B4BrJwB,qN5BsJxBC,qB6BtJwB,2U7BuJxBC,mB8BvJwB,mT9BwJxBC,8B+BxJwB,o0C/ByJxBC,cgCzJwB,krBhC0JxBC,WiC1JwB,gEjC2JxBC,gBkC3JwB,6DlC4JxBC,amC5JwB,6SnC6JxBC,kBoC7JwB,6NpC8JxBC,0BqC9JwB,scrC+JxBC,kBsC/JwB,8StCgKxBC,uBuChKwB,yGvCiKxBC,sBwCjKwB,s1FxCkKxBC,kByClKwB,2tLzCmKxBC,qB0CnKwB,wE1CoKxBC,0B2CpKwB,u2B3CqKxBC,sB4CrKwB,0M5CsKxBC,2B6CtKwB,isC7CuKxBC,yB8CvKwB,46E9CwKxBC,8B+CxKwB,04P/CyKxBC,sBgDzKwB,+iJhD0KxBC,qBiD1KwB,0zBjD2KxBC,oBkD3KwB,yRlD4KxBC,qBmD5KwB,4SnD6KxBC,0BoD7KwB,iLpD8KxBC,wBqD9KwB,sMrD+KxBC,mBsD/KwB,qZtDgLxBC,auDhLwB,6gBvDiLxBC,kBwDjLwB,2DxDkLxBC,sByDlLwB,qTzDmLxBC,2B0DnLwB,2N1DoLxBC,sB2DpLwB,8Q3DqLxBC,2B4DrLwB,6E5DsLxBC,mB6DtLwB,67B7DuLxBC,wB8DvLwB,y8B9DwLxBC,mB+DxLwB,k7C/DyLxBC,sBgEzLwB,4gChE0LxBC,qBiE1LwB,iwBjE2LxBC,qBkE3LwB,+JlE4LxBC,mBmE5LwB,+JnE6LxBC,coE7LwB,ySpE8LxBC,wBqE9LwB,ksCrE+LxBC,gCsE/LwB,iFtEgMxBC,+BuEhMwB,qYvEiMxBC,wBwEjMwB,ySxEkMxBC,gByElMwB,6OzEmMxBC,Q0EnMwB,k0D1EoMxBC,6B2EpMwB,8M3EqMxBC,e4ErMwB,kO5EsMxBC,mB6EtMwB,wF7EuMxBC,wB8EvMwB,2mB9EwMxBC,sB+ExMwB,8Q/EyMxBC,2BgFzMwB,6EhF0MxBC,wBiF1MwB,yqVjF2MxBC,sBkF3MwB,86ClF4MxBC,iBmF5MwB,slDnF6MxBC,yBoF7MwB,wjDpF8MxBC,gBqF9MwB,0OrF+MxBC,qBsF/MwB,wjCtFgNxBC,gBuFhNwB,2YvFiNxBC,kBwFjNwB,qexFkNxBC,qByFlNwB,wMzFmNxBC,0B0FnNwB,2E1FoNxBC,qB2FpNwB,qG3FqNxBC,0B4FrNwB,ujE5FsNxBC,sB6FtNwB,06B7FuNxBC,2B8FvNwB,8/H9FwNxBC,iB+FxNwB,iG/FyNxBC,egGzNwB,0JhG0NxBC,UiG1NwB,6EjG2NxBC,kBkG3NwB,4FlG4NxBC,gBmG5NwB,mJnG6NxBC,WoG7NwB,sHpG8NxBC,gBqG9NwB,kUrGgOxBC,gBsGhO+B,0KtGiO/BC,gBsGpNiC,yLtGqNjCC,UuGlO+B,wQvGmO/BC,UuGlNiC,4WvGmNjCC,WwGpO+B,qjCxGqO/BC,WwG5LiC,0hCxG6LjCC,kByGtO+B,4uBzGuO/BC,kByGhMiC,4wBzGiMjCC,c0GxO+B,6M1GyO/BC,c0G1NiC,6U1G2NjCC,gB2G1O+B,+iB3G2O/BC,gB2G/MiC,uzB3GgNjCC,e4G5O+B,w6B5G6O/BC,e4GnMiC,2vD5GoMjCC,iB6G9O+B,ipC7G+O/BC,iB6G3LiC,o6E7G4LjCC,gB8GhP+B,w6B9GiP/BC,gB8GtMiC,4mD9GuMjCC,gB+GlP+B,wgC/GmP/BC,gB+GrMiC,ssB/GsMjCC,egHpP+B,snChHqP/BC,egHnMiC,0oEhHoMjCC,kBiHtP+B,itCjHuP/BC,kBiH5LiC,u4HjH6LjCC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B,MAAM,GAAU,SAAUhE,GAmB/B,OD6CK,SAAcA,EAAU1vC,EAAS,IACtC,OAAO,IAAIuzC,GAAY7D,EAAU1vC,GC9C1B,EAlBP,SAAehuH,GAEb,MAAM6C,EAAI66J,EAAS19J,GACnB,GAAS,MAAL6C,EACF,OAAOA,EAIT,MACM8+J,EADM,CAAC,IAAK,IAAK,IAAK,KAAK78J,SAAS9E,EAAK,IAC7BA,EAAO,IAAIA,IACvBmE,EAAU8iB,SAAS8F,cAAc40I,GACvC,GAAe,MAAXx9J,GAAuC,WAApBA,EAAQkY,QAC7B,OAAOlY,EAAQoY,aAAepY,EAAQob,UAGxC,MAAM,IAAIlmB,MAAM,oBAAoB2G,SAGP,CAAE48J,aAAa,KCiFnCgF,GAAW,CACtB,iBChHwB,miEDiHxB,gBEjHwB,4JFkHxB,qBGlHwB,+IHmHxB,sBInHwB,6NJoHxB,iBKpHwB,gHLqHxB,eMrHwB,sENsHxB,gBOtHwB,gOPuHxB,uBQvHwB,qtBRwHxB,eSxHwB,y8CTyHxB,mBUzHwB,yVV0HxB,gBW1HwB,uOX2HxB,uBY3HwB,yfZ4HxB,uBa5HwB,wfb6HxB,qBc7HwB,oHd8HxB,0Be9HwB,4Gf+HxB,iBgB/HwB,kEhBgIxB,oBiBhIwB,+DjBiIxB,iBkBjIwB,iGlBkIxB,uBmBlIwB,kGnBmIxB,gBoBnIwB,kSpBoIxB,gBqBpIwB,0TrBqIxB,gBsBrIwB,4YtBsIxB,cuBtIwB,4RvBuIxB,YwBvIwB,6DxBwIxB,gByBxIwB,4oBzByIxB,iB0BzIwB,8J1B0IxB,a2B1IwB,2U3B2IxB,c4B3IwB,4U5B4IxB,a6B5IwB,6T7B6IxB,a8B7IwB,6T9B8IxB,gB+B9IwB,63R/B+IxB,cgC/IwB,2IhCgJxB,mBiChJwB,kJjCiJxB,ekCjJwB,iGlCkJxB,iBmClJwB,iEnCmJxB,mBoCnJwB,0QpCoJxB,sBqCpJwB,mErCqJxB,oBsCrJwB,qsBtCsJxB,qBuCtJwB,kNvCuJxB,yBwCvJwB,soBxCwJxB,uByCxJwB,oxBzCyJxB,wB0CzJwB,G1C0JxB,gB2C1JwB,sF3C2JxB,iB4C3JwB,kF5C4JxB,gB6C5JwB,4D7C6JxB,gB8C7JwB,gO9C8JxB,oB+C9JwB,0N/C+JxB,mBgD/JwB,+QhDgKxB,uBiDhKwB,o4BjDiKxB,gBkDjKwB,i1BlDkKxB,sBmDlKwB,oDnDmKxB,qBoDnKwB,8OpDoKxB,4BqDpKwB,uIrDqKxB,sBsDrKwB,mHtDsKxB,6BuDtKwB,oIvDuKxB,awDvKwB,iWxDwKxB,ayDxKwB,uUzDyKxB,oB0DzKwB,0F1D0KxB,qB2D1KwB,8G3D2KxB,kB4D3KwB,iJ5D4KxB,kB6D5KwB,iJ7D6KxB,mB8D7KwB,mJ9D8KxB,oB+D9KwB,iH/D+KxB,gBgE/KwB,gJhEgLxB,iBiEhLwB,+xCjEiLxB,qBkEjLwB,sFlEkLxB,qBmElLwB,wInEmLxB,iBoEnLwB,2nCpEoLxB,mBqEpLwB,wbrEqLxB,mBsErLwB,iXtEsLxB,qBuEtLwB,mIvEuLxB,kBwEvLwB,oHxEwLxB,mByExLwB,oGzEyLxB,oB0EzLwB,yG1E0LxB,c2E1LwB,wsB3E2LxB,gB4E3LwB,mJ5E4LxB,Y6E5LwB,wG7E6LxB,iB8E7LwB,uL9E8LxB,kB+E9LwB,uI/E+LxB,gBgF/LwB,uIhFgMxB,kBiFhMwB,sVjFiMxB,iBkFjMwB,oElFkMxB,kBmFlMwB,yGnFmMxB,iBoFnMwB,mGpFoMxB,qBqFpMwB,uvBrFqMxB,iBsFrMwB,oRtFsMxB,kBuFtMwB,yOvFuMxB,kBwFvMwB,gHxFwMxB,kByFxMwB,04DzFyMxB,yB0FzMwB,gc1F0MxB,0B2F1MwB,koB3F2MxB,iB4F3MwB,uG5F4MxB,e6F5MwB,yE7F6MxB,wB8F7MwB,ozB9F8MxB,c+F9MwB,iI/F+MxB,kBgG/MwB,6VhGgNxB,uBiGhNwB,mejGiNxB,mBkGjNwB,8VlGkNxB,wBmGlNwB,oenGmNxB,kBoGnNwB,sVpGoNxB,uBqGpNwB,qdrGqNxB,kBsGrNwB,sVtGsNxB,uBuGtNwB,qdvGuNxB,sBwGvNwB,qMxGwNxB,mByGxNwB,+fzGyNxB,0B0GzNwB,ukE1G0NxB,iB2G1NwB,o0C3G2NxB,sB4G3NwB,sJ5G4NxB,sB6G5NwB,wL7G6NxB,gB8G7NwB,8KCYnB,MAAMC,GACXp/J,YAAYoD,GACVrP,KAAKqP,Q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","sources":["webpack://MathBox/webpack/universalModuleDefinition","webpack://MathBox/./node_modules/@sicmutils/glsl-parser/direct.js","webpack://MathBox/./node_modules/@sicmutils/glsl-parser/lib/expr.js","webpack://MathBox/./node_modules/@sicmutils/glsl-parser/lib/index.js","webpack://MathBox/./node_modules/@sicmutils/glsl-parser/lib/scope.js","webpack://MathBox/./node_modules/boolbase/index.js","webpack://MathBox/./node_modules/css-select/lib/attributes.js","webpack://MathBox/./node_modules/css-select/lib/compile.js","webpack://MathBox/./node_modules/css-select/lib/general.js","webpack://MathBox/./node_modules/css-select/lib/index.js","webpack://MathBox/./node_modules/css-select/lib/procedure.js","webpack://MathBox/./node_modules/css-select/lib/pseudo-selectors/aliases.js","webpack://MathBox/./node_modules/css-select/lib/pseudo-selectors/filters.js","webpack://MathBox/./node_modules/css-select/lib/pseudo-selectors/index.js","webpack://MathBox/./node_modules/css-select/lib/pseudo-selectors/pseudos.js","webpack://MathBox/./node_modules/css-select/lib/pseudo-selectors/subselects.js","webpack://MathBox/./node_modules/css-select/lib/sort.js","webpack://MathBox/./node_modules/css-what/lib/index.js","webpack://MathBox/./node_modules/css-what/lib/parse.js","webpack://MathBox/./node_modules/css-what/lib/stringify.js","webpack://MathBox/./node_modules/dom-serializer/lib/foreignNames.js","webpack://MathBox/./node_modules/dom-serializer/lib/index.js","webpack://MathBox/./node_modules/domelementtype/lib/index.js","webpack://MathBox/./node_modules/domhandler/lib/index.js","webpack://MathBox/./node_modules/domhandler/lib/node.js","webpack://MathBox/./node_modules/domutils/lib/feeds.js","webpack://MathBox/./node_modules/domutils/lib/helpers.js","webpack://MathBox/./node_modules/domutils/lib/index.js","webpack://MathBox/./node_modules/domutils/lib/legacy.js","webpack://MathBox/./node_modules/domutils/lib/manipulation.js","webpack://MathBox/./node_modules/domutils/lib/querying.js","webpack://MathBox/./node_modules/domutils/lib/stringify.js","webpack://MathBox/./node_modules/domutils/lib/traversal.js","webpack://MathBox/./node_modules/entities/lib/decode.js","webpack://MathBox/./node_modules/entities/lib/decode_codepoint.js","webpack://MathBox/./node_modules/entities/lib/encode.js","webpack://MathBox/./node_modules/entities/lib/index.js","webpack://MathBox/./node_modules/glsl-tokenizer/index.js","webpack://MathBox/./node_modules/glsl-tokenizer/lib/builtins-300es.js","webpack://MathBox/./node_modules/glsl-tokenizer/lib/builtins.js","webpack://MathBox/./node_modules/glsl-tokenizer/lib/literals-300es.js","webpack://MathBox/./node_modules/glsl-tokenizer/lib/literals.js","webpack://MathBox/./node_modules/glsl-tokenizer/lib/operators.js","webpack://MathBox/./node_modules/glsl-tokenizer/string.js","webpack://MathBox/./node_modules/nth-check/lib/compile.js","webpack://MathBox/./node_modules/nth-check/lib/index.js","webpack://MathBox/./node_modules/nth-check/lib/parse.js","webpack://MathBox/./node_modules/shadergraph/src/linker/priority.js","webpack://MathBox/./node_modules/stats.js/build/stats.min.js","webpack://MathBox/external umd \"THREE\"","webpack://MathBox/webpack/bootstrap","webpack://MathBox/webpack/runtime/compat get default export","webpack://MathBox/webpack/runtime/define property getters","webpack://MathBox/webpack/runtime/hasOwnProperty shorthand","webpack://MathBox/webpack/runtime/make namespace object","webpack://MathBox/./node_modules/three/src/core/EventDispatcher.js","webpack://MathBox/./node_modules/threestrap/src/binder.js","webpack://MathBox/./node_modules/threestrap/src/bootstrap.js","webpack://MathBox/./node_modules/threestrap/src/api.js","webpack://MathBox/./src/splash.js","webpack://MathBox/./node_modules/threestrap/src/aliases.js","webpack://MathBox/./node_modules/threestrap/src/core/bind.js","webpack://MathBox/./node_modules/three/src/math/MathUtils.js","webpack://MathBox/./node_modules/three/src/math/Quaternion.js","webpack://MathBox/./node_modules/three/src/math/Vector3.js","webpack://MathBox/./node_modules/three/src/math/Matrix4.js","webpack://MathBox/./node_modules/three/src/math/Euler.js","webpack://MathBox/./node_modules/three/src/core/Layers.js","webpack://MathBox/./node_modules/three/src/math/Matrix3.js","webpack://MathBox/./node_modules/three/src/core/Object3D.js","webpack://MathBox/./node_modules/three/src/cameras/Camera.js","webpack://MathBox/./node_modules/three/src/cameras/OrthographicCamera.js","webpack://MathBox/./node_modules/threestrap/src/core/camera.js","webpack://MathBox/./node_modules/threestrap/src/core/fallback.js","webpack://MathBox/./node_modules/threestrap/src/core/fill.js","webpack://MathBox/./node_modules/threestrap/src/core/loop.js","webpack://MathBox/./node_modules/threestrap/src/core/render.js","webpack://MathBox/./node_modules/three/src/constants.js","webpack://MathBox/./node_modules/three/src/math/Box3.js","webpack://MathBox/./node_modules/three/src/math/Sphere.js","webpack://MathBox/./node_modules/three/src/math/Plane.js","webpack://MathBox/./node_modules/three/src/math/Frustum.js","webpack://MathBox/./node_modules/three/src/math/Vector4.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLAnimation.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLAttributes.js","webpack://MathBox/./node_modules/three/src/math/Vector2.js","webpack://MathBox/./node_modules/three/src/math/Color.js","webpack://MathBox/./node_modules/three/src/core/BufferAttribute.js","webpack://MathBox/./node_modules/three/src/utils.js","webpack://MathBox/./node_modules/three/src/core/BufferGeometry.js","webpack://MathBox/./node_modules/three/src/geometries/BoxGeometry.js","webpack://MathBox/./node_modules/three/src/geometries/PlaneGeometry.js","webpack://MathBox/./node_modules/three/src/materials/Material.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/UniformsUtils.js","webpack://MathBox/./node_modules/three/src/materials/ShaderMaterial.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/default_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/default_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/math/Ray.js","webpack://MathBox/./node_modules/three/src/math/Triangle.js","webpack://MathBox/./node_modules/three/src/materials/MeshBasicMaterial.js","webpack://MathBox/./node_modules/three/src/objects/Mesh.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/alphamap_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/alphamap_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/alphatest_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/alphatest_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/aomap_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/aomap_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/begin_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/beginnormal_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/bsdfs.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/bumpmap_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/clipping_planes_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/clipping_planes_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/clipping_planes_pars_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/clipping_planes_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/common.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/displacementmap_pars_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/displacementmap_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/emissivemap_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/emissivemap_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/encodings_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/encodings_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/envmap_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/envmap_pars_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/envmap_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/fog_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/fog_pars_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/fog_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/fog_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/gradientmap_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/lightmap_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/lightmap_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/lights_lambert_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/lights_toon_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/lights_toon_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/lights_phong_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/lights_phong_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/map_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/map_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/map_particle_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/map_particle_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/metalnessmap_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/metalnessmap_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/morphnormal_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/morphtarget_pars_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/morphtarget_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/normal_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/normal_pars_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/normal_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/normalmap_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/clearcoat_normal_fragment_begin.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/clearcoat_normal_fragment_maps.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/clearcoat_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/output_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/packing.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/project_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/dithering_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/dithering_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/roughnessmap_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/roughnessmap_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/skinbase_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/skinning_pars_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/skinning_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/skinnormal_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/specularmap_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/specularmap_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/tonemapping_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/uv_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/uv2_pars_fragment.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/uv2_pars_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/uv2_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderChunk/worldpos_vertex.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib/background.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib/cube.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib/depth.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib/distanceRGBA.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib/equirect.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib/linedashed.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib/meshbasic.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib/meshlambert.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib/meshmatcap.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib/meshnormal.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib/meshphong.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib/meshphysical.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib/meshtoon.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib/points.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib/shadow.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib/sprite.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/UniformsLib.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLBackground.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLBindingStates.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLBufferRenderer.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLCapabilities.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLClipping.js","webpack://MathBox/./node_modules/three/src/extras/ImageUtils.js","webpack://MathBox/./node_modules/three/src/textures/Texture.js","webpack://MathBox/./node_modules/three/src/renderers/WebGLRenderTarget.js","webpack://MathBox/./node_modules/three/src/cameras/PerspectiveCamera.js","webpack://MathBox/./node_modules/three/src/cameras/CubeCamera.js","webpack://MathBox/./node_modules/three/src/textures/CubeTexture.js","webpack://MathBox/./node_modules/three/src/renderers/WebGLCubeRenderTarget.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLCubeMaps.js","webpack://MathBox/./node_modules/three/src/materials/RawShaderMaterial.js","webpack://MathBox/./node_modules/three/src/extras/PMREMGenerator.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLCubeUVMaps.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLExtensions.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLGeometries.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLIndexedBufferRenderer.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLInfo.js","webpack://MathBox/./node_modules/three/src/textures/DataTexture2DArray.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLMorphtargets.js","webpack://MathBox/./node_modules/three/src/renderers/WebGLMultisampleRenderTarget.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLObjects.js","webpack://MathBox/./node_modules/three/src/textures/DataTexture3D.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLUniforms.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLShader.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLProgram.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLShaderCache.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLPrograms.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLProperties.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLRenderLists.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLLights.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLRenderStates.js","webpack://MathBox/./node_modules/three/src/materials/MeshDepthMaterial.js","webpack://MathBox/./node_modules/three/src/materials/MeshDistanceMaterial.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLShadowMap.js","webpack://MathBox/./node_modules/three/src/renderers/shaders/ShaderLib/vsm.glsl.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLState.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLTextures.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLUtils.js","webpack://MathBox/./node_modules/three/src/cameras/ArrayCamera.js","webpack://MathBox/./node_modules/three/src/objects/Group.js","webpack://MathBox/./node_modules/three/src/renderers/webxr/WebXRController.js","webpack://MathBox/./node_modules/three/src/textures/DepthTexture.js","webpack://MathBox/./node_modules/three/src/renderers/webxr/WebXRManager.js","webpack://MathBox/./node_modules/three/src/renderers/webgl/WebGLMaterials.js","webpack://MathBox/./node_modules/three/src/renderers/WebGLRenderer.js","webpack://MathBox/./node_modules/three/src/renderers/WebGL1Renderer.js","webpack://MathBox/./node_modules/threestrap/src/core/renderer.js","webpack://MathBox/./node_modules/threestrap/src/core/scene.js","webpack://MathBox/./node_modules/threestrap/src/core/size.js","webpack://MathBox/./node_modules/threestrap/src/core/time.js","webpack://MathBox/./node_modules/threestrap/src/core/warmup.js","webpack://MathBox/./node_modules/threestrap/src/extra/controls.js","webpack://MathBox/./node_modules/threestrap/src/extra/cursor.js","webpack://MathBox/./node_modules/threestrap/src/extra/fullscreen.js","webpack://MathBox/./node_modules/threestrap/src/extra/stats.js","webpack://MathBox/./node_modules/threestrap/src/extra/ui.js","webpack://MathBox/./node_modules/threestrap/src/renderers/VRRenderer.js","webpack://MathBox/./node_modules/threestrap/src/extra/vr.js","webpack://MathBox/./src/model/attributes.js","webpack://MathBox/./src/util/pretty.js","webpack://MathBox/./src/model/node.js","webpack://MathBox/./src/model/group.js","webpack://MathBox/./src/model/guard.js","webpack://MathBox/./src/model/css-select-adapter.js","webpack://MathBox/./src/model/css-select-adapted.js","webpack://MathBox/./src/model/model.js","webpack://MathBox/./src/overlay/factory.js","webpack://MathBox/./src/util/vdom.js","webpack://MathBox/./src/overlay/overlay.js","webpack://MathBox/./src/overlay/dom.js","webpack://MathBox/./src/overlay/classes.js","webpack://MathBox/./src/primitives/primitive.js","webpack://MathBox/./src/primitives/types/base/parent.js","webpack://MathBox/./src/primitives/types/base/group.js","webpack://MathBox/./src/primitives/types/base/inherit.js","webpack://MathBox/./src/primitives/types/base/root.js","webpack://MathBox/./src/primitives/types/base/unit.js","webpack://MathBox/./src/util/three.js","webpack://MathBox/./src/primitives/types/camera/camera.js","webpack://MathBox/./src/util/data.js","webpack://MathBox/./src/util/glsl.js","webpack://MathBox/./src/primitives/types/base/source.js","webpack://MathBox/./src/primitives/types/data/data.js","webpack://MathBox/./src/primitives/types/data/buffer.js","webpack://MathBox/./src/primitives/types/data/array.js","webpack://MathBox/./src/primitives/types/data/interval.js","webpack://MathBox/./src/primitives/types/data/matrix.js","webpack://MathBox/./src/primitives/types/data/area.js","webpack://MathBox/./src/primitives/types/data/voxel.js","webpack://MathBox/./src/primitives/types/data/volume.js","webpack://MathBox/./src/util/axis.js","webpack://MathBox/./src/primitives/types/data/scale.js","webpack://MathBox/./src/util/js.js","webpack://MathBox/./src/primitives/types/draw/axis.js","webpack://MathBox/./src/primitives/types/draw/face.js","webpack://MathBox/./src/primitives/types/draw/grid.js","webpack://MathBox/./src/primitives/types/draw/line.js","webpack://MathBox/./src/primitives/types/draw/point.js","webpack://MathBox/./src/primitives/types/draw/strip.js","webpack://MathBox/./src/primitives/types/draw/surface.js","webpack://MathBox/./src/primitives/types/draw/ticks.js","webpack://MathBox/./src/primitives/types/draw/vector.js","webpack://MathBox/./src/primitives/types/overlay/html.js","webpack://MathBox/./src/primitives/types/overlay/dom.js","webpack://MathBox/./src/primitives/types/text/text.js","webpack://MathBox/./src/primitives/types/operator/operator.js","webpack://MathBox/./src/primitives/types/text/format.js","webpack://MathBox/./src/primitives/types/text/label.js","webpack://MathBox/./src/primitives/types/operator/resample.js","webpack://MathBox/./src/primitives/types/text/retext.js","webpack://MathBox/./src/primitives/types/time/clock.js","webpack://MathBox/./src/primitives/types/time/now.js","webpack://MathBox/./src/primitives/types/transform/transform.js","webpack://MathBox/./src/primitives/types/transform/transform3.js","webpack://MathBox/./src/primitives/types/transform/transform4.js","webpack://MathBox/./src/primitives/types/transform/vertex.js","webpack://MathBox/./src/primitives/types/transform/fragment.js","webpack://MathBox/./src/primitives/types/transform/layer.js","webpack://MathBox/./src/primitives/types/transform/mask.js","webpack://MathBox/./src/primitives/types/operator/clamp.js","webpack://MathBox/./src/primitives/types/operator/grow.js","webpack://MathBox/./src/primitives/types/operator/join.js","webpack://MathBox/./src/primitives/types/operator/lerp.js","webpack://MathBox/./src/primitives/types/operator/memo.js","webpack://MathBox/./src/primitives/types/operator/readback.js","webpack://MathBox/./src/primitives/types/operator/repeat.js","webpack://MathBox/./src/primitives/types/operator/swizzle.js","webpack://MathBox/./src/primitives/types/operator/spread.js","webpack://MathBox/./src/primitives/types/operator/split.js","webpack://MathBox/./src/primitives/types/operator/slice.js","webpack://MathBox/./src/primitives/types/operator/subdivide.js","webpack://MathBox/./src/primitives/types/operator/transpose.js","webpack://MathBox/./src/primitives/types/present/transition.js","webpack://MathBox/./src/primitives/types/present/move.js","webpack://MathBox/./src/util/ease.js","webpack://MathBox/./src/primitives/types/present/track.js","webpack://MathBox/./src/primitives/types/present/play.js","webpack://MathBox/./src/primitives/types/present/present.js","webpack://MathBox/./src/primitives/types/present/reveal.js","webpack://MathBox/./src/primitives/types/present/slide.js","webpack://MathBox/./src/primitives/types/present/step.js","webpack://MathBox/./src/primitives/types/rtt/rtt.js","webpack://MathBox/./src/primitives/types/rtt/compose.js","webpack://MathBox/./src/primitives/types/view/view.js","webpack://MathBox/./src/primitives/types/view/cartesian.js","webpack://MathBox/./src/primitives/types/view/cartesian4.js","webpack://MathBox/./src/primitives/types/view/polar.js","webpack://MathBox/./src/primitives/types/view/spherical.js","webpack://MathBox/./src/primitives/types/view/stereographic.js","webpack://MathBox/./src/primitives/types/view/stereographic4.js","webpack://MathBox/./src/primitives/types/shader/shader.js","webpack://MathBox/./src/primitives/types/classes.js","webpack://MathBox/./src/primitives/types/types.js","webpack://MathBox/./src/primitives/types/traits.js","webpack://MathBox/./src/util/ticks.js","webpack://MathBox/./src/primitives/types/helpers.js","webpack://MathBox/./src/primitives/factory.js","webpack://MathBox/./src/primitives/index.js","webpack://MathBox/./src/render/renderable.js","webpack://MathBox/./src/render/scene.js","webpack://MathBox/./src/render/factory.js","webpack://MathBox/./src/render/buffer/buffer.js","webpack://MathBox/./src/render/buffer/texture/datatexture.js","webpack://MathBox/./src/render/buffer/databuffer.js","webpack://MathBox/./src/render/geometry/geometry.js","webpack://MathBox/./src/render/geometry/clipgeometry.js","webpack://MathBox/./src/render/geometry/arrowgeometry.js","webpack://MathBox/./src/render/meshes/base.js","webpack://MathBox/./src/render/buffer/texture/backedtexture.js","webpack://MathBox/./src/render/buffer/atlas.js","webpack://MathBox/./src/render/geometry/facegeometry.js","webpack://MathBox/./src/render/geometry/linegeometry.js","webpack://MathBox/./src/render/buffer/texture/rendertarget.js","webpack://MathBox/./src/render/buffer/rendertotexture.js","webpack://MathBox/./src/render/buffer/memo.js","webpack://MathBox/./src/render/geometry/surfacegeometry.js","webpack://MathBox/./src/render/geometry/screengeometry.js","webpack://MathBox/./src/render/meshes/screen.js","webpack://MathBox/./src/render/meshes/memoscreen.js","webpack://MathBox/./src/render/geometry/spritegeometry.js","webpack://MathBox/./src/render/geometry/stripgeometry.js","webpack://MathBox/./src/render/classes.js","webpack://MathBox/./src/render/meshes/sprite.js","webpack://MathBox/./src/render/meshes/point.js","webpack://MathBox/./src/render/meshes/line.js","webpack://MathBox/./src/render/meshes/surface.js","webpack://MathBox/./src/render/meshes/face.js","webpack://MathBox/./src/render/meshes/strip.js","webpack://MathBox/./src/render/meshes/arrow.js","webpack://MathBox/./src/render/meshes/debug.js","webpack://MathBox/./src/render/buffer/arraybuffer.js","webpack://MathBox/./src/render/buffer/matrixbuffer.js","webpack://MathBox/./src/render/buffer/voxelbuffer.js","webpack://MathBox/./src/render/buffer/pushbuffer.js","webpack://MathBox/./src/render/buffer/readback.js","webpack://MathBox/./src/render/buffer/textatlas.js","webpack://MathBox/./node_modules/shadergraph/src/graph/graph.js","webpack://MathBox/./node_modules/shadergraph/src/graph/outlet.js","webpack://MathBox/./node_modules/shadergraph/src/graph/node.js","webpack://MathBox/./node_modules/shadergraph/src/graph/index.js","webpack://MathBox/./node_modules/shadergraph/src/linker/snippet.js","webpack://MathBox/./node_modules/shadergraph/src/linker/assemble.js","webpack://MathBox/./node_modules/shadergraph/src/linker/program.js","webpack://MathBox/./node_modules/shadergraph/src/linker/link.js","webpack://MathBox/./node_modules/shadergraph/src/linker/layout.js","webpack://MathBox/./node_modules/shadergraph/src/linker/index.js","webpack://MathBox/./node_modules/shadergraph/src/block/block.js","webpack://MathBox/./node_modules/shadergraph/src/block/call.js","webpack://MathBox/./node_modules/shadergraph/src/block/callback.js","webpack://MathBox/./node_modules/shadergraph/src/block/isolate.js","webpack://MathBox/./node_modules/shadergraph/src/block/join.js","webpack://MathBox/./node_modules/shadergraph/src/visualize/serialize.js","webpack://MathBox/./node_modules/shadergraph/src/factory/hash.js","webpack://MathBox/./node_modules/shadergraph/src/visualize/markup.js","webpack://MathBox/./node_modules/shadergraph/src/visualize/index.js","webpack://MathBox/./node_modules/shadergraph/src/factory/factory.js","webpack://MathBox/./node_modules/shadergraph/src/factory/material.js","webpack://MathBox/./node_modules/shadergraph/src/factory/library.js","webpack://MathBox/./node_modules/shadergraph/src/factory/queue.js","webpack://MathBox/./node_modules/shadergraph/src/factory/cache.js","webpack://MathBox/./node_modules/shadergraph/src/glsl/compile.js","webpack://MathBox/./node_modules/shadergraph/src/glsl/decl.js","webpack://MathBox/./node_modules/shadergraph/src/glsl/constants.js","webpack://MathBox/./node_modules/shadergraph/src/glsl/parse.js","webpack://MathBox/./node_modules/shadergraph/src/glsl/generate.js","webpack://MathBox/./node_modules/shadergraph/src/index.js","webpack://MathBox/./src/shaders/factory.js","webpack://MathBox/./src/shaders/index.js","webpack://MathBox/./src/shaders/glsl/arrow.position.js","webpack://MathBox/./src/shaders/glsl/axis.position.js","webpack://MathBox/./src/shaders/glsl/cartesian.position.js","webpack://MathBox/./src/shaders/glsl/cartesian4.position.js","webpack://MathBox/./src/shaders/glsl/clamp.position.js","webpack://MathBox/./src/shaders/glsl/color.opaque.js","webpack://MathBox/./src/shaders/glsl/face.position.js","webpack://MathBox/./src/shaders/glsl/face.position.normal.js","webpack://MathBox/./src/shaders/glsl/float.encode.js","webpack://MathBox/./src/shaders/glsl/float.index.pack.js","webpack://MathBox/./src/shaders/glsl/float.stretch.js","webpack://MathBox/./src/shaders/glsl/fragment.clip.dashed.js","webpack://MathBox/./src/shaders/glsl/fragment.clip.dotted.js","webpack://MathBox/./src/shaders/glsl/fragment.clip.ends.js","webpack://MathBox/./src/shaders/glsl/fragment.clip.proximity.js","webpack://MathBox/./src/shaders/glsl/fragment.color.js","webpack://MathBox/./src/shaders/glsl/fragment.map.rgba.js","webpack://MathBox/./src/shaders/glsl/fragment.solid.js","webpack://MathBox/./src/shaders/glsl/fragment.transparent.js","webpack://MathBox/./src/shaders/glsl/grid.position.js","webpack://MathBox/./src/shaders/glsl/grow.position.js","webpack://MathBox/./src/shaders/glsl/join.position.js","webpack://MathBox/./src/shaders/glsl/label.alpha.js","webpack://MathBox/./src/shaders/glsl/label.map.js","webpack://MathBox/./src/shaders/glsl/label.outline.js","webpack://MathBox/./src/shaders/glsl/layer.position.js","webpack://MathBox/./src/shaders/glsl/lerp.depth.js","webpack://MathBox/./src/shaders/glsl/lerp.height.js","webpack://MathBox/./src/shaders/glsl/lerp.items.js","webpack://MathBox/./src/shaders/glsl/lerp.width.js","webpack://MathBox/./src/shaders/glsl/line.position.js","webpack://MathBox/./src/shaders/glsl/map.2d.data.js","webpack://MathBox/./src/shaders/glsl/map.2d.data.wrap.js","webpack://MathBox/./src/shaders/glsl/map.xyzw.2dv.js","webpack://MathBox/./src/shaders/glsl/map.xyzw.align.js","webpack://MathBox/./src/shaders/glsl/map.xyzw.texture.js","webpack://MathBox/./src/shaders/glsl/mesh.fragment.color.js","webpack://MathBox/./src/shaders/glsl/mesh.fragment.map.js","webpack://MathBox/./src/shaders/glsl/mesh.fragment.mask.js","webpack://MathBox/./src/shaders/glsl/mesh.fragment.material.js","webpack://MathBox/./src/shaders/glsl/mesh.fragment.shaded.js","webpack://MathBox/./src/shaders/glsl/mesh.fragment.texture.js","webpack://MathBox/./src/shaders/glsl/mesh.gamma.in.js","webpack://MathBox/./src/shaders/glsl/mesh.gamma.out.js","webpack://MathBox/./src/shaders/glsl/mesh.map.uvwo.js","webpack://MathBox/./src/shaders/glsl/mesh.position.js","webpack://MathBox/./src/shaders/glsl/mesh.vertex.color.js","webpack://MathBox/./src/shaders/glsl/mesh.vertex.mask.js","webpack://MathBox/./src/shaders/glsl/mesh.vertex.position.js","webpack://MathBox/./src/shaders/glsl/move.position.js","webpack://MathBox/./src/shaders/glsl/object.mask.default.js","webpack://MathBox/./src/shaders/glsl/point.alpha.circle.js","webpack://MathBox/./src/shaders/glsl/point.alpha.circle.hollow.js","webpack://MathBox/./src/shaders/glsl/point.alpha.generic.js","webpack://MathBox/./src/shaders/glsl/point.alpha.generic.hollow.js","webpack://MathBox/./src/shaders/glsl/point.edge.js","webpack://MathBox/./src/shaders/glsl/point.fill.js","webpack://MathBox/./src/shaders/glsl/point.mask.circle.js","webpack://MathBox/./src/shaders/glsl/point.mask.diamond.js","webpack://MathBox/./src/shaders/glsl/point.mask.down.js","webpack://MathBox/./src/shaders/glsl/point.mask.left.js","webpack://MathBox/./src/shaders/glsl/point.mask.right.js","webpack://MathBox/./src/shaders/glsl/point.mask.square.js","webpack://MathBox/./src/shaders/glsl/point.mask.up.js","webpack://MathBox/./src/shaders/glsl/point.position.js","webpack://MathBox/./src/shaders/glsl/point.size.uniform.js","webpack://MathBox/./src/shaders/glsl/point.size.varying.js","webpack://MathBox/./src/shaders/glsl/polar.position.js","webpack://MathBox/./src/shaders/glsl/project.position.js","webpack://MathBox/./src/shaders/glsl/project.readback.js","webpack://MathBox/./src/shaders/glsl/raw.position.scale.js","webpack://MathBox/./src/shaders/glsl/repeat.position.js","webpack://MathBox/./src/shaders/glsl/resample.padding.js","webpack://MathBox/./src/shaders/glsl/resample.relative.js","webpack://MathBox/./src/shaders/glsl/reveal.mask.js","webpack://MathBox/./src/shaders/glsl/root.position.js","webpack://MathBox/./src/shaders/glsl/sample.2d.js","webpack://MathBox/./src/shaders/glsl/scale.position.js","webpack://MathBox/./src/shaders/glsl/screen.map.stpq.js","webpack://MathBox/./src/shaders/glsl/screen.map.xy.js","webpack://MathBox/./src/shaders/glsl/screen.map.xyzw.js","webpack://MathBox/./src/shaders/glsl/screen.pass.uv.js","webpack://MathBox/./src/shaders/glsl/screen.position.js","webpack://MathBox/./src/shaders/glsl/slice.position.js","webpack://MathBox/./src/shaders/glsl/spherical.position.js","webpack://MathBox/./src/shaders/glsl/split.position.js","webpack://MathBox/./src/shaders/glsl/spread.position.js","webpack://MathBox/./src/shaders/glsl/sprite.fragment.js","webpack://MathBox/./src/shaders/glsl/sprite.position.js","webpack://MathBox/./src/shaders/glsl/stereographic.position.js","webpack://MathBox/./src/shaders/glsl/stereographic4.position.js","webpack://MathBox/./src/shaders/glsl/stpq.sample.2d.js","webpack://MathBox/./src/shaders/glsl/stpq.xyzw.2d.js","webpack://MathBox/./src/shaders/glsl/strip.position.normal.js","webpack://MathBox/./src/shaders/glsl/style.color.js","webpack://MathBox/./src/shaders/glsl/subdivide.depth.js","webpack://MathBox/./src/shaders/glsl/subdivide.depth.lerp.js","webpack://MathBox/./src/shaders/glsl/subdivide.height.js","webpack://MathBox/./src/shaders/glsl/subdivide.height.lerp.js","webpack://MathBox/./src/shaders/glsl/subdivide.items.js","webpack://MathBox/./src/shaders/glsl/subdivide.items.lerp.js","webpack://MathBox/./src/shaders/glsl/subdivide.width.js","webpack://MathBox/./src/shaders/glsl/subdivide.width.lerp.js","webpack://MathBox/./src/shaders/glsl/surface.mask.hollow.js","webpack://MathBox/./src/shaders/glsl/surface.position.js","webpack://MathBox/./src/shaders/glsl/surface.position.normal.js","webpack://MathBox/./src/shaders/glsl/ticks.position.js","webpack://MathBox/./src/shaders/glsl/transform3.position.js","webpack://MathBox/./src/shaders/glsl/transform4.position.js","webpack://MathBox/./src/shaders/glsl/view.position.js","webpack://MathBox/./src/stage/animator.js","webpack://MathBox/./src/stage/api.js","webpack://MathBox/./src/stage/controller.js","webpack://MathBox/./src/util/index.js","webpack://MathBox/./src/context.js","webpack://MathBox/./src/index.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"THREE\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"MathBox\", [\"THREE\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"MathBox\"] = factory(require(\"THREE\"));\n\telse\n\t\troot[\"MathBox\"] = factory(root[\"THREE\"]);\n})(self, function(__WEBPACK_EXTERNAL_MODULE__824__) {\nreturn ","var parse = require(\"./lib/index\");\n\nmodule.exports = parseArray;\n\nfunction parseArray(tokens) {\n  var parser = parse();\n\n  for (var i = 0; i < tokens.length; i++) {\n    parser(tokens[i]);\n  }\n\n  return parser(null);\n}\n","let state, token, tokens, idx;\n\nconst original_symbol = {\n  nud: function () {\n    return this.children && this.children.length ? this : fail(\"unexpected\")();\n  },\n  led: fail(\"missing operator\"),\n};\n\nconst symbol_table = {};\n\nfunction itself() {\n  return this;\n}\n\nsymbol(\"(ident)\").nud = itself;\nsymbol(\"(keyword)\").nud = itself;\nsymbol(\"(builtin)\").nud = itself;\nsymbol(\"(literal)\").nud = itself;\nsymbol(\"(end)\");\n\nsymbol(\":\");\nsymbol(\";\");\nsymbol(\",\");\nsymbol(\")\");\nsymbol(\"]\");\nsymbol(\"}\");\n\ninfixr(\"&&\", 30);\ninfixr(\"||\", 30);\ninfix(\"|\", 43);\ninfix(\"^\", 44);\ninfix(\"&\", 45);\ninfix(\"==\", 46);\ninfix(\"!=\", 46);\ninfix(\"<\", 47);\ninfix(\"<=\", 47);\ninfix(\">\", 47);\ninfix(\">=\", 47);\ninfix(\">>\", 48);\ninfix(\"<<\", 48);\ninfix(\"+\", 50);\ninfix(\"-\", 50);\ninfix(\"*\", 60);\ninfix(\"/\", 60);\ninfix(\"%\", 60);\ninfix(\"?\", 20, function (left) {\n  this.children = [left, expression(0), (advance(\":\"), expression(0))];\n  this.type = \"ternary\";\n  return this;\n});\ninfix(\".\", 80, function (left) {\n  token.type = \"literal\";\n  state.fake(token);\n  this.children = [left, token];\n  advance();\n  return this;\n});\ninfix(\"[\", 80, function (left) {\n  this.children = [left, expression(0)];\n  this.type = \"binary\";\n  advance(\"]\");\n  return this;\n});\ninfix(\"(\", 80, function (left) {\n  this.children = [left];\n  this.type = \"call\";\n\n  if (token.data !== \")\")\n    while (1) {\n      this.children.push(expression(0));\n      if (token.data !== \",\") break;\n      advance(\",\");\n    }\n  advance(\")\");\n  return this;\n});\n\nprefix(\"-\");\nprefix(\"+\");\nprefix(\"!\");\nprefix(\"~\");\nprefix(\"defined\");\nprefix(\"(\", function () {\n  this.type = \"group\";\n  this.children = [expression(0)];\n  advance(\")\");\n  return this;\n});\nprefix(\"++\");\nprefix(\"--\");\nsuffix(\"++\");\nsuffix(\"--\");\n\nassignment(\"=\");\nassignment(\"+=\");\nassignment(\"-=\");\nassignment(\"*=\");\nassignment(\"/=\");\nassignment(\"%=\");\nassignment(\"&=\");\nassignment(\"|=\");\nassignment(\"^=\");\nassignment(\">>=\");\nassignment(\"<<=\");\n\nmodule.exports = function (incoming_state, incoming_tokens) {\n  state = incoming_state;\n  tokens = incoming_tokens;\n  idx = 0;\n  let result;\n\n  if (!tokens.length) return;\n\n  advance();\n  result = expression(0);\n  result.parent = state[0];\n  emit(result);\n\n  if (idx < tokens.length) {\n    throw new Error(\"did not use all tokens\");\n  }\n\n  result.parent.children = [result];\n\n  function emit(node) {\n    state.unshift(node, false);\n    for (let i = 0, len = node.children.length; i < len; ++i) {\n      emit(node.children[i]);\n    }\n    state.shift();\n  }\n};\n\nfunction symbol(id, binding_power) {\n  let sym = symbol_table[id];\n  binding_power = binding_power || 0;\n  if (sym) {\n    if (binding_power > sym.lbp) {\n      sym.lbp = binding_power;\n    }\n  } else {\n    sym = Object.create(original_symbol);\n    sym.id = id;\n    sym.lbp = binding_power;\n    symbol_table[id] = sym;\n  }\n  return sym;\n}\n\nfunction expression(rbp) {\n  let left,\n    t = token;\n  advance();\n\n  left = t.nud();\n  while (rbp < token.lbp) {\n    t = token;\n    advance();\n    left = t.led(left);\n  }\n  return left;\n}\n\nfunction infix(id, bp, led) {\n  const sym = symbol(id, bp);\n  sym.led =\n    led ||\n    function (left) {\n      this.children = [left, expression(bp)];\n      this.type = \"binary\";\n      return this;\n    };\n}\n\nfunction infixr(id, bp, led) {\n  const sym = symbol(id, bp);\n  sym.led =\n    led ||\n    function (left) {\n      this.children = [left, expression(bp - 1)];\n      this.type = \"binary\";\n      return this;\n    };\n  return sym;\n}\n\nfunction prefix(id, nud) {\n  const sym = symbol(id);\n  sym.nud =\n    nud ||\n    function () {\n      this.children = [expression(70)];\n      this.type = \"unary\";\n      return this;\n    };\n  return sym;\n}\n\nfunction suffix(id) {\n  const sym = symbol(id, 150);\n  sym.led = function (left) {\n    this.children = [left];\n    this.type = \"suffix\";\n    return this;\n  };\n}\n\nfunction assignment(id) {\n  return infixr(id, 10, function (left) {\n    this.children = [left, expression(9)];\n    this.assignment = true;\n    this.type = \"assign\";\n    return this;\n  });\n}\n\nfunction advance(id) {\n  let next, value, type, output;\n\n  if (id && token.data !== id) {\n    return state.unexpected(\"expected `\" + id + \"`, got `\" + token.data + \"`\");\n  }\n\n  if (idx >= tokens.length) {\n    token = symbol_table[\"(end)\"];\n    return;\n  }\n\n  next = tokens[idx++];\n  value = next.data;\n  type = next.type;\n\n  if (type === \"ident\") {\n    output = state.scope.find(value) || state.create_node();\n    type = output.type;\n  } else if (type === \"builtin\") {\n    output = symbol_table[\"(builtin)\"];\n  } else if (type === \"keyword\") {\n    output = symbol_table[\"(keyword)\"];\n  } else if (type === \"operator\") {\n    output = symbol_table[value];\n    if (!output) {\n      return state.unexpected(\"unknown operator `\" + value + \"`\");\n    }\n  } else if (type === \"float\" || type === \"integer\") {\n    type = \"literal\";\n    output = symbol_table[\"(literal)\"];\n  } else {\n    return state.unexpected(\"unexpected token.\");\n  }\n\n  if (output) {\n    if (!output.nud) {\n      output.nud = itself;\n    }\n    if (!output.children) {\n      output.children = [];\n    }\n  }\n\n  output = Object.create(output);\n  output.token = next;\n  output.type = type;\n  if (!output.data) output.data = value;\n\n  return (token = output);\n}\n\nfunction fail(message) {\n  return function () {\n    return state.unexpected(message);\n  };\n}\n","module.exports = parser;\n\nconst full_parse_expr = require(\"./expr\"),\n  Scope = require(\"./scope\");\n\n// singleton!\nconst Advance = new Object();\n\nconst DEBUG = false;\n\nlet _ = 0,\n  IDENT = _++,\n  STMT = _++,\n  STMTLIST = _++,\n  STRUCT = _++,\n  FUNCTION = _++,\n  FUNCTIONARGS = _++,\n  DECL = _++,\n  DECLLIST = _++,\n  FORLOOP = _++,\n  WHILELOOP = _++,\n  IF = _++,\n  EXPR = _++,\n  PRECISION = _++,\n  COMMENT = _++,\n  PREPROCESSOR = _++,\n  KEYWORD = _++,\n  KEYWORD_OR_IDENT = _++,\n  RETURN = _++,\n  BREAK = _++,\n  CONTINUE = _++,\n  DISCARD = _++,\n  DOWHILELOOP = _++,\n  PLACEHOLDER = _++,\n  QUANTIFIER = _++;\n\nconst DECL_ALLOW_ASSIGN = 0x1,\n  DECL_ALLOW_COMMA = 0x2,\n  DECL_REQUIRE_NAME = 0x4,\n  DECL_ALLOW_INVARIANT = 0x8,\n  DECL_ALLOW_STORAGE = 0x10,\n  DECL_NO_INOUT = 0x20,\n  DECL_ALLOW_STRUCT = 0x40,\n  DECL_STATEMENT = 0xff,\n  DECL_FUNCTION =\n    DECL_STATEMENT &\n    ~(\n      DECL_ALLOW_ASSIGN |\n      DECL_ALLOW_COMMA |\n      DECL_NO_INOUT |\n      DECL_ALLOW_INVARIANT |\n      DECL_REQUIRE_NAME\n    ),\n  DECL_STRUCT =\n    DECL_STATEMENT &\n    ~(\n      DECL_ALLOW_ASSIGN |\n      DECL_ALLOW_INVARIANT |\n      DECL_ALLOW_STORAGE |\n      DECL_ALLOW_STRUCT\n    );\n\nconst QUALIFIERS = [\"const\", \"attribute\", \"uniform\", \"varying\"];\n\nconst NO_ASSIGN_ALLOWED = false,\n  NO_COMMA_ALLOWED = false;\n\n// map of tokens to stmt types\nconst token_map = {\n  \"block-comment\": COMMENT,\n  \"line-comment\": COMMENT,\n  preprocessor: PREPROCESSOR,\n};\n\n// map of stmt types to human\nconst stmt_type = (_ = [\n  \"ident\",\n  \"stmt\",\n  \"stmtlist\",\n  \"struct\",\n  \"function\",\n  \"functionargs\",\n  \"decl\",\n  \"decllist\",\n  \"forloop\",\n  \"whileloop\",\n  \"if\",\n  \"expr\",\n  \"precision\",\n  \"comment\",\n  \"preprocessor\",\n  \"keyword\",\n  \"keyword_or_ident\",\n  \"return\",\n  \"break\",\n  \"continue\",\n  \"discard\",\n  \"do-while\",\n  \"placeholder\",\n  \"quantifier\",\n]);\n\nfunction parser() {\n  const stmtlist = n(STMTLIST),\n    stmt = n(STMT),\n    decllist = n(DECLLIST),\n    precision = n(PRECISION),\n    ident = n(IDENT),\n    keyword_or_ident = n(KEYWORD_OR_IDENT),\n    fn = n(FUNCTION),\n    fnargs = n(FUNCTIONARGS),\n    forstmt = n(FORLOOP),\n    ifstmt = n(IF),\n    whilestmt = n(WHILELOOP),\n    returnstmt = n(RETURN),\n    dowhilestmt = n(DOWHILELOOP),\n    quantifier = n(QUANTIFIER);\n\n  let parse_struct,\n    parse_precision,\n    parse_quantifier,\n    parse_forloop,\n    parse_if,\n    parse_return,\n    parse_whileloop,\n    parse_dowhileloop,\n    parse_function,\n    parse_function_args;\n\n  let check = arguments.length ? [].slice.call(arguments) : [],\n    complete = false,\n    ended = false,\n    depth = 0,\n    state = [],\n    nodes = [],\n    tokens = [],\n    whitespace = [],\n    errored = false,\n    program,\n    token,\n    node;\n\n  // setup state\n  state.shift = special_shift;\n  state.unshift = special_unshift;\n  state.fake = special_fake;\n  state.unexpected = unexpected;\n  state.scope = new Scope(state);\n  state.create_node = function () {\n    const n = mknode(IDENT, token);\n    n.parent = reader.program;\n    return n;\n  };\n\n  setup_stative_parsers();\n\n  // setup root node\n  node = stmtlist();\n  node.expecting = \"(eof)\";\n  node.mode = STMTLIST;\n  node.token = { type: \"(program)\", data: \"(program)\" };\n  program = node;\n\n  reader.program = program;\n  reader.scope = function (scope) {\n    if (arguments.length === 1) {\n      state.scope = scope;\n    }\n    return state.scope;\n  };\n\n  state.unshift(node);\n  return reader;\n\n  function reader(data) {\n    if (data === null) {\n      return end(), program;\n    }\n\n    nodes = [];\n    write(data);\n    return nodes;\n  }\n\n  // stream functions ---------------------------------------------\n\n  function write(input) {\n    if (\n      input.type === \"whitespace\" ||\n      input.type === \"line-comment\" ||\n      input.type === \"block-comment\"\n    ) {\n      whitespace.push(input);\n      return;\n    }\n    tokens.push(input);\n    token = token || tokens[0];\n\n    if (token && whitespace.length) {\n      token.preceding = token.preceding || [];\n      token.preceding = token.preceding.concat(whitespace);\n      whitespace = [];\n    }\n\n    while (take())\n      switch (state[0].mode) {\n        case STMT:\n          parse_stmt();\n          break;\n        case STMTLIST:\n          parse_stmtlist();\n          break;\n        case DECL:\n          parse_decl();\n          break;\n        case DECLLIST:\n          parse_decllist();\n          break;\n        case EXPR:\n          parse_expr();\n          break;\n        case STRUCT:\n          parse_struct(true, true);\n          break;\n        case PRECISION:\n          parse_precision();\n          break;\n        case IDENT:\n          parse_ident();\n          break;\n        case KEYWORD:\n          parse_keyword();\n          break;\n        case KEYWORD_OR_IDENT:\n          parse_keyword_or_ident();\n          break;\n        case FUNCTION:\n          parse_function();\n          break;\n        case FUNCTIONARGS:\n          parse_function_args();\n          break;\n        case FORLOOP:\n          parse_forloop();\n          break;\n        case WHILELOOP:\n          parse_whileloop();\n          break;\n        case DOWHILELOOP:\n          parse_dowhileloop();\n          break;\n        case RETURN:\n          parse_return();\n          break;\n        case IF:\n          parse_if();\n          break;\n        case QUANTIFIER:\n          parse_quantifier();\n          break;\n      }\n  }\n\n  function end(tokens) {\n    if (arguments.length) {\n      write(tokens);\n    }\n\n    if (state.length > 1) {\n      unexpected(\"unexpected EOF\");\n      return;\n    }\n\n    complete = true;\n  }\n\n  function take() {\n    if (errored || !state.length) return false;\n\n    return (token = tokens[0]);\n  }\n\n  // ----- state manipulation --------\n\n  function special_fake(x) {\n    state.unshift(x);\n    state.shift();\n  }\n\n  function special_unshift(_node, add_child) {\n    _node.parent = state[0];\n\n    const ret = [].unshift.call(this, _node);\n\n    add_child = add_child === undefined ? true : add_child;\n\n    if (DEBUG) {\n      let pad = \"\";\n      for (let i = 0, len = this.length - 1; i < len; ++i) {\n        pad += \" |\";\n      }\n      console.log(pad, \"\\\\\" + _node.type, _node.token.data);\n    }\n\n    if (add_child && node !== _node) node.children.push(_node);\n    node = _node;\n\n    return ret;\n  }\n\n  function special_shift() {\n    let _node = [].shift.call(this),\n      okay = check[this.length],\n      emit = false;\n\n    if (DEBUG) {\n      let pad = \"\";\n      for (let i = 0, len = this.length; i < len; ++i) {\n        pad += \" |\";\n      }\n      console.log(pad, \"/\" + _node.type);\n    }\n\n    if (check.length) {\n      if (typeof check[0] === \"function\") {\n        emit = check[0](_node);\n      } else if (okay !== undefined) {\n        emit = okay.test ? okay.test(_node.type) : okay === _node.type;\n      }\n    } else {\n      emit = true;\n    }\n\n    if (emit && !errored) nodes.push(_node);\n\n    node = _node.parent;\n    return _node;\n  }\n\n  // parse states ---------------\n\n  function parse_stmtlist() {\n    // determine the type of the statement\n    // and then start parsing\n    return stative(function () {\n      state.scope.enter();\n      return Advance;\n    }, normal_mode)();\n\n    function normal_mode() {\n      if (token.data === state[0].expecting) {\n        return state.scope.exit(), state.shift();\n      }\n      switch (token.type) {\n        case \"preprocessor\":\n          state.fake(adhoc());\n          tokens.shift();\n          return;\n        default:\n          state.unshift(stmt());\n          return;\n      }\n    }\n  }\n\n  function parse_stmt() {\n    if (state[0].brace) {\n      if (token.data !== \"}\") {\n        return unexpected(\"expected `}`, got \" + token.data);\n      }\n      state[0].brace = false;\n      return tokens.shift(), state.shift();\n    }\n    switch (token.type) {\n      case \"eof\":\n        return got_eof();\n      case \"keyword\":\n        switch (token.data) {\n          case \"for\":\n            return state.unshift(forstmt());\n          case \"if\":\n            return state.unshift(ifstmt());\n          case \"while\":\n            return state.unshift(whilestmt());\n          case \"do\":\n            return state.unshift(dowhilestmt());\n          case \"break\":\n            return state.fake(mknode(BREAK, token)), tokens.shift();\n          case \"continue\":\n            return state.fake(mknode(CONTINUE, token)), tokens.shift();\n          case \"discard\":\n            return state.fake(mknode(DISCARD, token)), tokens.shift();\n          case \"return\":\n            return state.unshift(returnstmt());\n          case \"precision\":\n            return state.unshift(precision());\n        }\n        return state.unshift(decl(DECL_STATEMENT));\n      case \"ident\":\n        var lookup;\n        if ((lookup = state.scope.find(token.data))) {\n          if (lookup.parent.type === \"struct\") {\n            // this is strictly untrue, you could have an\n            // expr that starts with a struct constructor.\n            //      ... sigh\n            return state.unshift(decl(DECL_STATEMENT));\n          }\n          return state.unshift(expr(\";\"));\n        }\n      case \"operator\":\n        if (token.data === \"{\") {\n          state[0].brace = true;\n          const n = stmtlist();\n          n.expecting = \"}\";\n          return tokens.shift(), state.unshift(n);\n        }\n        if (token.data === \";\") {\n          return tokens.shift(), state.shift();\n        }\n      default:\n        return state.unshift(expr(\";\"));\n    }\n  }\n\n  function got_eof() {\n    if (ended) errored = true;\n    ended = true;\n    return state.shift();\n  }\n\n  function parse_decl() {\n    const stmt = state[0];\n\n    return stative(\n      invariant_or_not,\n      storage_or_not,\n      parameter_or_not,\n      precision_or_not,\n      struct_or_type,\n      maybe_name,\n      maybe_lparen, // lparen means we're a function\n      is_decllist,\n      done\n    )();\n\n    function invariant_or_not() {\n      if (token.data === \"invariant\") {\n        if (stmt.flags & DECL_ALLOW_INVARIANT) {\n          state.unshift(keyword());\n          return Advance;\n        } else {\n          return unexpected(\"`invariant` is not allowed here\");\n        }\n      } else {\n        state.fake(mknode(PLACEHOLDER, { data: \"\", position: token.position }));\n        return Advance;\n      }\n    }\n\n    function storage_or_not() {\n      if (is_storage(token)) {\n        if (stmt.flags & DECL_ALLOW_STORAGE) {\n          state.unshift(keyword());\n          return Advance;\n        } else {\n          return unexpected(\"storage is not allowed here\");\n        }\n      } else {\n        state.fake(mknode(PLACEHOLDER, { data: \"\", position: token.position }));\n        return Advance;\n      }\n    }\n\n    function parameter_or_not() {\n      if (is_parameter(token)) {\n        if (!(stmt.flags & DECL_NO_INOUT)) {\n          state.unshift(keyword());\n          return Advance;\n        } else {\n          return unexpected(\"parameter is not allowed here\");\n        }\n      } else {\n        state.fake(mknode(PLACEHOLDER, { data: \"\", position: token.position }));\n        return Advance;\n      }\n    }\n\n    function precision_or_not() {\n      if (is_precision(token)) {\n        state.unshift(keyword());\n        return Advance;\n      } else {\n        state.fake(mknode(PLACEHOLDER, { data: \"\", position: token.position }));\n        return Advance;\n      }\n    }\n\n    function struct_or_type() {\n      if (token.data === \"struct\") {\n        if (!(stmt.flags & DECL_ALLOW_STRUCT)) {\n          return unexpected(\"cannot nest structs\");\n        }\n        state.unshift(struct());\n        return Advance;\n      }\n\n      if (token.type === \"keyword\") {\n        state.unshift(keyword());\n        return Advance;\n      }\n\n      const lookup = state.scope.find(token.data);\n\n      if (lookup) {\n        state.fake(Object.create(lookup));\n        tokens.shift();\n        return Advance;\n      }\n      return unexpected(\n        \"expected user defined type, struct or keyword, got \" + token.data\n      );\n    }\n\n    function maybe_name() {\n      if (token.data === \",\" && !(stmt.flags & DECL_ALLOW_COMMA)) {\n        return state.shift();\n      }\n\n      if (token.data === \"[\") {\n        // oh lord.\n        state.unshift(quantifier());\n        return;\n      }\n\n      if (token.data === \")\") return state.shift();\n\n      if (token.data === \";\") {\n        return stmt.stage + 3;\n      }\n\n      if (token.type !== \"ident\" && token.type !== \"builtin\") {\n        return unexpected(\"expected identifier, got \" + token.data);\n      }\n\n      stmt.collected_name = tokens.shift();\n      return Advance;\n    }\n\n    function maybe_lparen() {\n      if (token.data === \"(\") {\n        tokens.unshift(stmt.collected_name);\n        delete stmt.collected_name;\n        state.unshift(fn());\n        return stmt.stage + 2;\n      }\n      return Advance;\n    }\n\n    function is_decllist() {\n      tokens.unshift(stmt.collected_name);\n      delete stmt.collected_name;\n      state.unshift(decllist());\n      return Advance;\n    }\n\n    function done() {\n      return state.shift();\n    }\n  }\n\n  function parse_decllist() {\n    // grab ident\n\n    if (token.type === \"ident\" || token.type === \"builtin\") {\n      const name = token.data;\n      state.unshift(ident());\n      state.scope.define(name);\n      return;\n    }\n\n    if (token.type === \"operator\") {\n      if (token.data === \",\") {\n        // multi-decl!\n        if (!(state[1].flags & DECL_ALLOW_COMMA)) {\n          return state.shift();\n        }\n\n        return tokens.shift();\n      } else if (token.data === \"=\") {\n        if (!(state[1].flags & DECL_ALLOW_ASSIGN))\n          return unexpected(\"`=` is not allowed here.\");\n\n        tokens.shift();\n\n        state.unshift(expr(\",\", \";\"));\n        return;\n      } else if (token.data === \"[\") {\n        state.unshift(quantifier());\n        return;\n      }\n    }\n    return state.shift();\n  }\n\n  function parse_keyword_or_ident() {\n    if (token.type === \"keyword\") {\n      state[0].type = \"keyword\";\n      state[0].mode = KEYWORD;\n      return;\n    }\n\n    if (token.type === \"ident\") {\n      state[0].type = \"ident\";\n      state[0].mode = IDENT;\n      return;\n    }\n\n    return unexpected(\n      \"expected keyword or user-defined name, got \" + token.data\n    );\n  }\n\n  function parse_keyword() {\n    if (token.type !== \"keyword\") {\n      return unexpected(\"expected keyword, got \" + token.data);\n    }\n\n    return state.shift(), tokens.shift();\n  }\n\n  function parse_ident() {\n    if (token.type !== \"ident\" && token.type !== \"builtin\") {\n      return unexpected(\"expected user-defined name, got \" + token.data);\n    }\n\n    state[0].data = token.data;\n    return state.shift(), tokens.shift();\n  }\n\n  function parse_expr() {\n    const expecting = state[0].expecting;\n\n    state[0].tokens = state[0].tokens || [];\n\n    if (state[0].parenlevel === undefined) {\n      state[0].parenlevel = 0;\n      state[0].bracelevel = 0;\n    }\n    if (state[0].parenlevel < 1 && expecting.indexOf(token.data) > -1) {\n      return parseexpr(state[0].tokens);\n    }\n    if (token.data === \"(\") {\n      ++state[0].parenlevel;\n    } else if (token.data === \")\") {\n      --state[0].parenlevel;\n    }\n\n    switch (token.data) {\n      case \"{\":\n        ++state[0].bracelevel;\n        break;\n      case \"}\":\n        --state[0].bracelevel;\n        break;\n      case \"(\":\n        ++state[0].parenlevel;\n        break;\n      case \")\":\n        --state[0].parenlevel;\n        break;\n    }\n\n    if (state[0].parenlevel < 0) return unexpected(\"unexpected `)`\");\n    if (state[0].bracelevel < 0) return unexpected(\"unexpected `}`\");\n\n    state[0].tokens.push(tokens.shift());\n    return;\n\n    function parseexpr(tokens) {\n      try {\n        full_parse_expr(state, tokens);\n      } catch (err) {\n        errored = true;\n        throw err;\n      }\n\n      return state.shift();\n    }\n  }\n\n  // node types ---------------\n\n  function n(type) {\n    // this is a function factory that suffices for most kinds of expressions and statements\n    return function () {\n      return mknode(type, token);\n    };\n  }\n\n  function adhoc() {\n    return mknode(token_map[token.type], token, node);\n  }\n\n  function decl(flags) {\n    const _ = mknode(DECL, token, node);\n    _.flags = flags;\n\n    return _;\n  }\n\n  function struct(allow_assign, allow_comma) {\n    const _ = mknode(STRUCT, token, node);\n    _.allow_assign = allow_assign === undefined ? true : allow_assign;\n    _.allow_comma = allow_comma === undefined ? true : allow_comma;\n    return _;\n  }\n\n  function expr() {\n    const n = mknode(EXPR, token, node);\n\n    n.expecting = [].slice.call(arguments);\n    return n;\n  }\n\n  function keyword(default_value) {\n    let t = token;\n    if (default_value) {\n      t = { type: \"(implied)\", data: \"(default)\", position: t.position };\n    }\n    return mknode(KEYWORD, t, node);\n  }\n\n  // utils ----------------------------\n\n  function unexpected(str) {\n    errored = true;\n    throw new Error(\n      (str || \"unexpected \" + state) + \" at line \" + state[0].token.line\n    );\n  }\n\n  function assert(type, data) {\n    return (\n      1,\n      assert_null_string_or_array(type, token.type) &&\n        assert_null_string_or_array(data, token.data)\n    );\n  }\n\n  function assert_null_string_or_array(x, y) {\n    switch (typeof x) {\n      case \"string\":\n        if (y !== x) {\n          unexpected(\"expected `\" + x + \"`, got \" + y + \"\\n\" + token.data);\n        }\n        return !errored;\n\n      case \"object\":\n        if (x && x.indexOf(y) === -1) {\n          unexpected(\"expected one of `\" + x.join(\"`, `\") + \"`, got \" + y);\n        }\n        return !errored;\n    }\n    return true;\n  }\n\n  // stative ----------------------------\n\n  function stative() {\n    let steps = [].slice.call(arguments),\n      step,\n      result;\n\n    return function () {\n      const current = state[0];\n\n      current.stage || (current.stage = 0);\n\n      step = steps[current.stage];\n      if (!step) return unexpected(\"parser in undefined state!\");\n\n      result = step();\n\n      if (result === Advance) return ++current.stage;\n      if (result === undefined) return;\n      current.stage = result;\n    };\n  }\n\n  function advance(op, t) {\n    t = t || \"operator\";\n    return function () {\n      if (!assert(t, op)) return;\n\n      const last = tokens.shift(),\n        children = state[0].children,\n        last_node = children[children.length - 1];\n\n      if (last_node && last_node.token && last.preceding) {\n        last_node.token.succeeding = last_node.token.succeeding || [];\n        last_node.token.succeeding = last_node.token.succeeding.concat(\n          last.preceding\n        );\n      }\n      return Advance;\n    };\n  }\n\n  function advance_expr(until) {\n    return function () {\n      state.unshift(expr(until));\n      return Advance;\n    };\n  }\n\n  function advance_ident(declare) {\n    return declare\n      ? function () {\n          const name = token.data;\n          return (\n            assert(\"ident\") &&\n            (state.unshift(ident()), state.scope.define(name), Advance)\n          );\n        }\n      : function () {\n          if (!assert(\"ident\")) return;\n\n          const s = Object.create(state.scope.find(token.data));\n          s.token = token;\n\n          return tokens.shift(), Advance;\n        };\n  }\n\n  function advance_stmtlist() {\n    return function () {\n      const n = stmtlist();\n      n.expecting = \"}\";\n      return state.unshift(n), Advance;\n    };\n  }\n\n  function maybe_stmtlist(skip) {\n    return function () {\n      const current = state[0].stage;\n      if (token.data !== \"{\") {\n        return state.unshift(stmt()), current + skip;\n      }\n      return tokens.shift(), Advance;\n    };\n  }\n\n  function popstmt() {\n    return function () {\n      return state.shift(), state.shift();\n    };\n  }\n\n  function setup_stative_parsers() {\n    // could also be\n    // struct { } decllist\n    parse_struct = stative(\n      advance(\"struct\", \"keyword\"),\n      function () {\n        if (token.data === \"{\") {\n          state.fake(\n            mknode(IDENT, { data: \"\", position: token.position, type: \"ident\" })\n          );\n          return Advance;\n        }\n\n        return advance_ident(true)();\n      },\n      function () {\n        state.scope.enter();\n        return Advance;\n      },\n      advance(\"{\"),\n      function () {\n        if (token.type === \"preprocessor\") {\n          state.fake(adhoc());\n          tokens.shift();\n          return;\n        }\n        if (token.data === \"}\") {\n          state.scope.exit();\n          tokens.shift();\n          return state.shift();\n        }\n        if (token.data === \";\") {\n          tokens.shift();\n          return;\n        }\n        state.unshift(decl(DECL_STRUCT));\n      }\n    );\n\n    parse_precision = stative(\n      function () {\n        return tokens.shift(), Advance;\n      },\n      function () {\n        return (\n          assert(\"keyword\", [\"lowp\", \"mediump\", \"highp\"]) &&\n          (state.unshift(keyword()), Advance)\n        );\n      },\n      function () {\n        return state.unshift(keyword()), Advance;\n      },\n      function () {\n        return state.shift();\n      }\n    );\n\n    parse_quantifier = stative(\n      advance(\"[\"),\n      advance_expr(\"]\"),\n      advance(\"]\"),\n      function () {\n        return state.shift();\n      }\n    );\n\n    parse_forloop = stative(\n      advance(\"for\", \"keyword\"),\n      advance(\"(\"),\n      function () {\n        let lookup;\n        if (token.type === \"ident\") {\n          if (!(lookup = state.scope.find(token.data))) {\n            lookup = state.create_node();\n          }\n\n          if (lookup.parent.type === \"struct\") {\n            return state.unshift(decl(DECL_STATEMENT)), Advance;\n          }\n        } else if (token.type === \"builtin\" || token.type === \"keyword\") {\n          return state.unshift(decl(DECL_STATEMENT)), Advance;\n        }\n        return advance_expr(\";\")();\n      },\n      advance(\";\"),\n      advance_expr(\";\"),\n      advance(\";\"),\n      advance_expr(\")\"),\n      advance(\")\"),\n      maybe_stmtlist(3),\n      advance_stmtlist(),\n      advance(\"}\"),\n      popstmt()\n    );\n\n    parse_if = stative(\n      advance(\"if\", \"keyword\"),\n      advance(\"(\"),\n      advance_expr(\")\"),\n      advance(\")\"),\n      maybe_stmtlist(3),\n      advance_stmtlist(),\n      advance(\"}\"),\n      function () {\n        if (token.data === \"else\") {\n          return tokens.shift(), state.unshift(stmt()), Advance;\n        }\n        return popstmt()();\n      },\n      popstmt()\n    );\n\n    parse_return = stative(\n      advance(\"return\", \"keyword\"),\n      function () {\n        if (token.data === \";\") return Advance;\n        return state.unshift(expr(\";\")), Advance;\n      },\n      function () {\n        tokens.shift(), popstmt()();\n      }\n    );\n\n    parse_whileloop = stative(\n      advance(\"while\", \"keyword\"),\n      advance(\"(\"),\n      advance_expr(\")\"),\n      advance(\")\"),\n      maybe_stmtlist(3),\n      advance_stmtlist(),\n      advance(\"}\"),\n      popstmt()\n    );\n\n    parse_dowhileloop = stative(\n      advance(\"do\", \"keyword\"),\n      maybe_stmtlist(3),\n      advance_stmtlist(),\n      advance(\"}\"),\n      advance(\"while\", \"keyword\"),\n      advance(\"(\"),\n      advance_expr(\")\"),\n      advance(\")\"),\n      popstmt()\n    );\n\n    parse_function = stative(\n      function () {\n        for (let i = 1, len = state.length; i < len; ++i)\n          if (state[i].mode === FUNCTION) {\n            return unexpected(\n              \"function definition is not allowed within another function\"\n            );\n          }\n\n        return Advance;\n      },\n      function () {\n        if (!assert(\"ident\")) return;\n\n        const name = token.data,\n          lookup = state.scope.find(name);\n\n        state.unshift(ident());\n        state.scope.define(name);\n\n        state.scope.enter(lookup ? lookup.scope : null);\n        return Advance;\n      },\n      advance(\"(\"),\n      function () {\n        return state.unshift(fnargs()), Advance;\n      },\n      advance(\")\"),\n      function () {\n        // forward decl\n        if (token.data === \";\") {\n          return state.scope.exit(), state.shift(), state.shift();\n        }\n        return Advance;\n      },\n      advance(\"{\"),\n      advance_stmtlist(),\n      advance(\"}\"),\n      function () {\n        state.scope.exit();\n        return Advance;\n      },\n      function () {\n        return state.shift(), state.shift(), state.shift();\n      }\n    );\n\n    parse_function_args = stative(\n      function () {\n        if (token.data === \"void\") {\n          state.fake(keyword());\n          tokens.shift();\n          return Advance;\n        }\n        if (token.data === \")\") {\n          state.shift();\n          return;\n        }\n        if (token.data === \"struct\") {\n          state.unshift(struct(NO_ASSIGN_ALLOWED, NO_COMMA_ALLOWED));\n          return Advance;\n        }\n        state.unshift(decl(DECL_FUNCTION));\n        return Advance;\n      },\n      function () {\n        if (token.data === \",\") {\n          tokens.shift();\n          return 0;\n        }\n        if (token.data === \")\") {\n          state.shift();\n          return;\n        }\n        unexpected(\"expected one of `,` or `)`, got \" + token.data);\n      }\n    );\n  }\n}\n\nfunction mknode(mode, sourcetoken) {\n  return {\n    mode: mode,\n    token: sourcetoken,\n    children: [],\n    type: stmt_type[mode],\n    id: (Math.random() * 0xffffffff).toString(16),\n  };\n}\n\nfunction is_storage(token) {\n  return (\n    token.data === \"const\" ||\n    token.data === \"attribute\" ||\n    token.data === \"uniform\" ||\n    token.data === \"varying\"\n  );\n}\n\nfunction is_parameter(token) {\n  return token.data === \"in\" || token.data === \"inout\" || token.data === \"out\";\n}\n\nfunction is_precision(token) {\n  return (\n    token.data === \"highp\" || token.data === \"mediump\" || token.data === \"lowp\"\n  );\n}\n","module.exports = scope;\n\nfunction scope(state) {\n  if (this.constructor !== scope) return new scope(state);\n\n  this.state = state;\n  this.scopes = [];\n  this.current = null;\n}\n\nconst cons = scope,\n  proto = cons.prototype;\n\nproto.enter = function (s) {\n  this.scopes.push((this.current = this.state[0].scope = s || {}));\n};\n\nproto.exit = function () {\n  this.scopes.pop();\n  this.current = this.scopes[this.scopes.length - 1];\n};\n\nproto.define = function (str) {\n  this.current[str] = this.state[0];\n};\n\nproto.find = function (name, fail) {\n  for (let i = this.scopes.length - 1; i > -1; --i) {\n    if (this.scopes[i].hasOwnProperty(name)) {\n      return this.scopes[i][name];\n    }\n  }\n\n  return null;\n};\n","module.exports = {\n\ttrueFunc: function trueFunc(){\n\t\treturn true;\n\t},\n\tfalseFunc: function falseFunc(){\n\t\treturn false;\n\t}\n};","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.attributeRules = void 0;\nvar boolbase_1 = require(\"boolbase\");\n/**\n * All reserved characters in a regex, used for escaping.\n *\n * Taken from XRegExp, (c) 2007-2020 Steven Levithan under the MIT license\n * https://github.com/slevithan/xregexp/blob/95eeebeb8fac8754d54eafe2b4743661ac1cf028/src/xregexp.js#L794\n */\nvar reChars = /[-[\\]{}()*+?.,\\\\^$|#\\s]/g;\nfunction escapeRegex(value) {\n    return value.replace(reChars, \"\\\\$&\");\n}\n/**\n * Attribute selectors\n */\nexports.attributeRules = {\n    equals: function (next, data, _a) {\n        var adapter = _a.adapter;\n        var name = data.name;\n        var value = data.value;\n        if (data.ignoreCase) {\n            value = value.toLowerCase();\n            return function (elem) {\n                var attr = adapter.getAttributeValue(elem, name);\n                return (attr != null &&\n                    attr.length === value.length &&\n                    attr.toLowerCase() === value &&\n                    next(elem));\n            };\n        }\n        return function (elem) {\n            return adapter.getAttributeValue(elem, name) === value && next(elem);\n        };\n    },\n    hyphen: function (next, data, _a) {\n        var adapter = _a.adapter;\n        var name = data.name;\n        var value = data.value;\n        var len = value.length;\n        if (data.ignoreCase) {\n            value = value.toLowerCase();\n            return function hyphenIC(elem) {\n                var attr = adapter.getAttributeValue(elem, name);\n                return (attr != null &&\n                    (attr.length === len || attr.charAt(len) === \"-\") &&\n                    attr.substr(0, len).toLowerCase() === value &&\n                    next(elem));\n            };\n        }\n        return function hyphen(elem) {\n            var attr = adapter.getAttributeValue(elem, name);\n            return (attr != null &&\n                (attr.length === len || attr.charAt(len) === \"-\") &&\n                attr.substr(0, len) === value &&\n                next(elem));\n        };\n    },\n    element: function (next, _a, _b) {\n        var name = _a.name, value = _a.value, ignoreCase = _a.ignoreCase;\n        var adapter = _b.adapter;\n        if (/\\s/.test(value)) {\n            return boolbase_1.falseFunc;\n        }\n        var regex = new RegExp(\"(?:^|\\\\s)\".concat(escapeRegex(value), \"(?:$|\\\\s)\"), ignoreCase ? \"i\" : \"\");\n        return function element(elem) {\n            var attr = adapter.getAttributeValue(elem, name);\n            return (attr != null &&\n                attr.length >= value.length &&\n                regex.test(attr) &&\n                next(elem));\n        };\n    },\n    exists: function (next, _a, _b) {\n        var name = _a.name;\n        var adapter = _b.adapter;\n        return function (elem) { return adapter.hasAttrib(elem, name) && next(elem); };\n    },\n    start: function (next, data, _a) {\n        var adapter = _a.adapter;\n        var name = data.name;\n        var value = data.value;\n        var len = value.length;\n        if (len === 0) {\n            return boolbase_1.falseFunc;\n        }\n        if (data.ignoreCase) {\n            value = value.toLowerCase();\n            return function (elem) {\n                var attr = adapter.getAttributeValue(elem, name);\n                return (attr != null &&\n                    attr.length >= len &&\n                    attr.substr(0, len).toLowerCase() === value &&\n                    next(elem));\n            };\n        }\n        return function (elem) {\n            var _a;\n            return !!((_a = adapter.getAttributeValue(elem, name)) === null || _a === void 0 ? void 0 : _a.startsWith(value)) &&\n                next(elem);\n        };\n    },\n    end: function (next, data, _a) {\n        var adapter = _a.adapter;\n        var name = data.name;\n        var value = data.value;\n        var len = -value.length;\n        if (len === 0) {\n            return boolbase_1.falseFunc;\n        }\n        if (data.ignoreCase) {\n            value = value.toLowerCase();\n            return function (elem) {\n                var _a;\n                return ((_a = adapter\n                    .getAttributeValue(elem, name)) === null || _a === void 0 ? void 0 : _a.substr(len).toLowerCase()) === value && next(elem);\n            };\n        }\n        return function (elem) {\n            var _a;\n            return !!((_a = adapter.getAttributeValue(elem, name)) === null || _a === void 0 ? void 0 : _a.endsWith(value)) &&\n                next(elem);\n        };\n    },\n    any: function (next, data, _a) {\n        var adapter = _a.adapter;\n        var name = data.name, value = data.value;\n        if (value === \"\") {\n            return boolbase_1.falseFunc;\n        }\n        if (data.ignoreCase) {\n            var regex_1 = new RegExp(escapeRegex(value), \"i\");\n            return function anyIC(elem) {\n                var attr = adapter.getAttributeValue(elem, name);\n                return (attr != null &&\n                    attr.length >= value.length &&\n                    regex_1.test(attr) &&\n                    next(elem));\n            };\n        }\n        return function (elem) {\n            var _a;\n            return !!((_a = adapter.getAttributeValue(elem, name)) === null || _a === void 0 ? void 0 : _a.includes(value)) &&\n                next(elem);\n        };\n    },\n    not: function (next, data, _a) {\n        var adapter = _a.adapter;\n        var name = data.name;\n        var value = data.value;\n        if (value === \"\") {\n            return function (elem) {\n                return !!adapter.getAttributeValue(elem, name) && next(elem);\n            };\n        }\n        else if (data.ignoreCase) {\n            value = value.toLowerCase();\n            return function (elem) {\n                var attr = adapter.getAttributeValue(elem, name);\n                return ((attr == null ||\n                    attr.length !== value.length ||\n                    attr.toLowerCase() !== value) &&\n                    next(elem));\n            };\n        }\n        return function (elem) {\n            return adapter.getAttributeValue(elem, name) !== value && next(elem);\n        };\n    },\n};\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.compileToken = exports.compileUnsafe = exports.compile = void 0;\nvar css_what_1 = require(\"css-what\");\nvar boolbase_1 = require(\"boolbase\");\nvar sort_1 = __importDefault(require(\"./sort\"));\nvar procedure_1 = require(\"./procedure\");\nvar general_1 = require(\"./general\");\nvar subselects_1 = require(\"./pseudo-selectors/subselects\");\n/**\n * Compiles a selector to an executable function.\n *\n * @param selector Selector to compile.\n * @param options Compilation options.\n * @param context Optional context for the selector.\n */\nfunction compile(selector, options, context) {\n    var next = compileUnsafe(selector, options, context);\n    return (0, subselects_1.ensureIsTag)(next, options.adapter);\n}\nexports.compile = compile;\nfunction compileUnsafe(selector, options, context) {\n    var token = typeof selector === \"string\" ? (0, css_what_1.parse)(selector, options) : selector;\n    return compileToken(token, options, context);\n}\nexports.compileUnsafe = compileUnsafe;\nfunction includesScopePseudo(t) {\n    return (t.type === \"pseudo\" &&\n        (t.name === \"scope\" ||\n            (Array.isArray(t.data) &&\n                t.data.some(function (data) { return data.some(includesScopePseudo); }))));\n}\nvar DESCENDANT_TOKEN = { type: \"descendant\" };\nvar FLEXIBLE_DESCENDANT_TOKEN = {\n    type: \"_flexibleDescendant\",\n};\nvar SCOPE_TOKEN = { type: \"pseudo\", name: \"scope\", data: null };\n/*\n * CSS 4 Spec (Draft): 3.3.1. Absolutizing a Scope-relative Selector\n * http://www.w3.org/TR/selectors4/#absolutizing\n */\nfunction absolutize(token, _a, context) {\n    var adapter = _a.adapter;\n    // TODO Use better check if the context is a document\n    var hasContext = !!(context === null || context === void 0 ? void 0 : context.every(function (e) {\n        var parent = adapter.isTag(e) && adapter.getParent(e);\n        return e === subselects_1.PLACEHOLDER_ELEMENT || (parent && adapter.isTag(parent));\n    }));\n    for (var _i = 0, token_1 = token; _i < token_1.length; _i++) {\n        var t = token_1[_i];\n        if (t.length > 0 && (0, procedure_1.isTraversal)(t[0]) && t[0].type !== \"descendant\") {\n            // Don't continue in else branch\n        }\n        else if (hasContext && !t.some(includesScopePseudo)) {\n            t.unshift(DESCENDANT_TOKEN);\n        }\n        else {\n            continue;\n        }\n        t.unshift(SCOPE_TOKEN);\n    }\n}\nfunction compileToken(token, options, context) {\n    var _a;\n    token = token.filter(function (t) { return t.length > 0; });\n    token.forEach(sort_1.default);\n    context = (_a = options.context) !== null && _a !== void 0 ? _a : context;\n    var isArrayContext = Array.isArray(context);\n    var finalContext = context && (Array.isArray(context) ? context : [context]);\n    absolutize(token, options, finalContext);\n    var shouldTestNextSiblings = false;\n    var query = token\n        .map(function (rules) {\n        if (rules.length >= 2) {\n            var first = rules[0], second = rules[1];\n            if (first.type !== \"pseudo\" || first.name !== \"scope\") {\n                // Ignore\n            }\n            else if (isArrayContext && second.type === \"descendant\") {\n                rules[1] = FLEXIBLE_DESCENDANT_TOKEN;\n            }\n            else if (second.type === \"adjacent\" ||\n                second.type === \"sibling\") {\n                shouldTestNextSiblings = true;\n            }\n        }\n        return compileRules(rules, options, finalContext);\n    })\n        .reduce(reduceRules, boolbase_1.falseFunc);\n    query.shouldTestNextSiblings = shouldTestNextSiblings;\n    return query;\n}\nexports.compileToken = compileToken;\nfunction compileRules(rules, options, context) {\n    var _a;\n    return rules.reduce(function (previous, rule) {\n        return previous === boolbase_1.falseFunc\n            ? boolbase_1.falseFunc\n            : (0, general_1.compileGeneralSelector)(previous, rule, options, context, compileToken);\n    }, (_a = options.rootFunc) !== null && _a !== void 0 ? _a : boolbase_1.trueFunc);\n}\nfunction reduceRules(a, b) {\n    if (b === boolbase_1.falseFunc || a === boolbase_1.trueFunc) {\n        return a;\n    }\n    if (a === boolbase_1.falseFunc || b === boolbase_1.trueFunc) {\n        return b;\n    }\n    return function combine(elem) {\n        return a(elem) || b(elem);\n    };\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.compileGeneralSelector = void 0;\nvar attributes_1 = require(\"./attributes\");\nvar pseudo_selectors_1 = require(\"./pseudo-selectors\");\n/*\n * All available rules\n */\nfunction compileGeneralSelector(next, selector, options, context, compileToken) {\n    var adapter = options.adapter, equals = options.equals;\n    switch (selector.type) {\n        case \"pseudo-element\":\n            throw new Error(\"Pseudo-elements are not supported by css-select\");\n        case \"attribute\":\n            return attributes_1.attributeRules[selector.action](next, selector, options);\n        case \"pseudo\":\n            return (0, pseudo_selectors_1.compilePseudoSelector)(next, selector, options, context, compileToken);\n        // Tags\n        case \"tag\":\n            return function tag(elem) {\n                return adapter.getName(elem) === selector.name && next(elem);\n            };\n        // Traversal\n        case \"descendant\":\n            if (options.cacheResults === false ||\n                typeof WeakSet === \"undefined\") {\n                return function descendant(elem) {\n                    var current = elem;\n                    while ((current = adapter.getParent(current))) {\n                        if (adapter.isTag(current) && next(current)) {\n                            return true;\n                        }\n                    }\n                    return false;\n                };\n            }\n            // @ts-expect-error `ElementNode` is not extending object\n            // eslint-disable-next-line no-case-declarations\n            var isFalseCache_1 = new WeakSet();\n            return function cachedDescendant(elem) {\n                var current = elem;\n                while ((current = adapter.getParent(current))) {\n                    if (!isFalseCache_1.has(current)) {\n                        if (adapter.isTag(current) && next(current)) {\n                            return true;\n                        }\n                        isFalseCache_1.add(current);\n                    }\n                }\n                return false;\n            };\n        case \"_flexibleDescendant\":\n            // Include element itself, only used while querying an array\n            return function flexibleDescendant(elem) {\n                var current = elem;\n                do {\n                    if (adapter.isTag(current) && next(current))\n                        return true;\n                } while ((current = adapter.getParent(current)));\n                return false;\n            };\n        case \"parent\":\n            return function parent(elem) {\n                return adapter\n                    .getChildren(elem)\n                    .some(function (elem) { return adapter.isTag(elem) && next(elem); });\n            };\n        case \"child\":\n            return function child(elem) {\n                var parent = adapter.getParent(elem);\n                return parent != null && adapter.isTag(parent) && next(parent);\n            };\n        case \"sibling\":\n            return function sibling(elem) {\n                var siblings = adapter.getSiblings(elem);\n                for (var i = 0; i < siblings.length; i++) {\n                    var currentSibling = siblings[i];\n                    if (equals(elem, currentSibling))\n                        break;\n                    if (adapter.isTag(currentSibling) && next(currentSibling)) {\n                        return true;\n                    }\n                }\n                return false;\n            };\n        case \"adjacent\":\n            return function adjacent(elem) {\n                var siblings = adapter.getSiblings(elem);\n                var lastElement;\n                for (var i = 0; i < siblings.length; i++) {\n                    var currentSibling = siblings[i];\n                    if (equals(elem, currentSibling))\n                        break;\n                    if (adapter.isTag(currentSibling)) {\n                        lastElement = currentSibling;\n                    }\n                }\n                return !!lastElement && next(lastElement);\n            };\n        case \"universal\":\n            return next;\n    }\n}\nexports.compileGeneralSelector = compileGeneralSelector;\n","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n    if (k2 === undefined) k2 = k;\n    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n    if (k2 === undefined) k2 = k;\n    o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n    Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n    o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n    if (mod && mod.__esModule) return mod;\n    var result = {};\n    if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n    __setModuleDefault(result, mod);\n    return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.aliases = exports.pseudos = exports.filters = exports.is = exports.selectOne = exports.selectAll = exports.prepareContext = exports._compileToken = exports._compileUnsafe = exports.compile = void 0;\nvar DomUtils = __importStar(require(\"domutils\"));\nvar boolbase_1 = require(\"boolbase\");\nvar compile_1 = require(\"./compile\");\nvar subselects_1 = require(\"./pseudo-selectors/subselects\");\nvar defaultEquals = function (a, b) { return a === b; };\nvar defaultOptions = {\n    adapter: DomUtils,\n    equals: defaultEquals,\n};\nfunction convertOptionFormats(options) {\n    var _a, _b, _c, _d;\n    /*\n     * We force one format of options to the other one.\n     */\n    // @ts-expect-error Default options may have incompatible `Node` / `ElementNode`.\n    var opts = options !== null && options !== void 0 ? options : defaultOptions;\n    // @ts-expect-error Same as above.\n    (_a = opts.adapter) !== null && _a !== void 0 ? _a : (opts.adapter = DomUtils);\n    // @ts-expect-error `equals` does not exist on `Options`\n    (_b = opts.equals) !== null && _b !== void 0 ? _b : (opts.equals = (_d = (_c = opts.adapter) === null || _c === void 0 ? void 0 : _c.equals) !== null && _d !== void 0 ? _d : defaultEquals);\n    return opts;\n}\nfunction wrapCompile(func) {\n    return function addAdapter(selector, options, context) {\n        var opts = convertOptionFormats(options);\n        return func(selector, opts, context);\n    };\n}\n/**\n * Compiles the query, returns a function.\n */\nexports.compile = wrapCompile(compile_1.compile);\nexports._compileUnsafe = wrapCompile(compile_1.compileUnsafe);\nexports._compileToken = wrapCompile(compile_1.compileToken);\nfunction getSelectorFunc(searchFunc) {\n    return function select(query, elements, options) {\n        var opts = convertOptionFormats(options);\n        if (typeof query !== \"function\") {\n            query = (0, compile_1.compileUnsafe)(query, opts, elements);\n        }\n        var filteredElements = prepareContext(elements, opts.adapter, query.shouldTestNextSiblings);\n        return searchFunc(query, filteredElements, opts);\n    };\n}\nfunction prepareContext(elems, adapter, shouldTestNextSiblings) {\n    if (shouldTestNextSiblings === void 0) { shouldTestNextSiblings = false; }\n    /*\n     * Add siblings if the query requires them.\n     * See https://github.com/fb55/css-select/pull/43#issuecomment-225414692\n     */\n    if (shouldTestNextSiblings) {\n        elems = appendNextSiblings(elems, adapter);\n    }\n    return Array.isArray(elems)\n        ? adapter.removeSubsets(elems)\n        : adapter.getChildren(elems);\n}\nexports.prepareContext = prepareContext;\nfunction appendNextSiblings(elem, adapter) {\n    // Order matters because jQuery seems to check the children before the siblings\n    var elems = Array.isArray(elem) ? elem.slice(0) : [elem];\n    var elemsLength = elems.length;\n    for (var i = 0; i < elemsLength; i++) {\n        var nextSiblings = (0, subselects_1.getNextSiblings)(elems[i], adapter);\n        elems.push.apply(elems, nextSiblings);\n    }\n    return elems;\n}\n/**\n * @template Node The generic Node type for the DOM adapter being used.\n * @template ElementNode The Node type for elements for the DOM adapter being used.\n * @param elems Elements to query. If it is an element, its children will be queried..\n * @param query can be either a CSS selector string or a compiled query function.\n * @param [options] options for querying the document.\n * @see compile for supported selector queries.\n * @returns All matching elements.\n *\n */\nexports.selectAll = getSelectorFunc(function (query, elems, options) {\n    return query === boolbase_1.falseFunc || !elems || elems.length === 0\n        ? []\n        : options.adapter.findAll(query, elems);\n});\n/**\n * @template Node The generic Node type for the DOM adapter being used.\n * @template ElementNode The Node type for elements for the DOM adapter being used.\n * @param elems Elements to query. If it is an element, its children will be queried..\n * @param query can be either a CSS selector string or a compiled query function.\n * @param [options] options for querying the document.\n * @see compile for supported selector queries.\n * @returns the first match, or null if there was no match.\n */\nexports.selectOne = getSelectorFunc(function (query, elems, options) {\n    return query === boolbase_1.falseFunc || !elems || elems.length === 0\n        ? null\n        : options.adapter.findOne(query, elems);\n});\n/**\n * Tests whether or not an element is matched by query.\n *\n * @template Node The generic Node type for the DOM adapter being used.\n * @template ElementNode The Node type for elements for the DOM adapter being used.\n * @param elem The element to test if it matches the query.\n * @param query can be either a CSS selector string or a compiled query function.\n * @param [options] options for querying the document.\n * @see compile for supported selector queries.\n * @returns\n */\nfunction is(elem, query, options) {\n    var opts = convertOptionFormats(options);\n    return (typeof query === \"function\" ? query : (0, compile_1.compile)(query, opts))(elem);\n}\nexports.is = is;\n/**\n * Alias for selectAll(query, elems, options).\n * @see [compile] for supported selector queries.\n */\nexports.default = exports.selectAll;\n// Export filters, pseudos and aliases to allow users to supply their own.\nvar pseudo_selectors_1 = require(\"./pseudo-selectors\");\nObject.defineProperty(exports, \"filters\", { enumerable: true, get: function () { return pseudo_selectors_1.filters; } });\nObject.defineProperty(exports, \"pseudos\", { enumerable: true, get: function () { return pseudo_selectors_1.pseudos; } });\nObject.defineProperty(exports, \"aliases\", { enumerable: true, get: function () { return pseudo_selectors_1.aliases; } });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isTraversal = exports.procedure = void 0;\nexports.procedure = {\n    universal: 50,\n    tag: 30,\n    attribute: 1,\n    pseudo: 0,\n    \"pseudo-element\": 0,\n    descendant: -1,\n    child: -1,\n    parent: -1,\n    sibling: -1,\n    adjacent: -1,\n    _flexibleDescendant: -1,\n};\nfunction isTraversal(t) {\n    return exports.procedure[t.type] < 0;\n}\nexports.isTraversal = isTraversal;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.aliases = void 0;\n/**\n * Aliases are pseudos that are expressed as selectors.\n */\nexports.aliases = {\n    // Links\n    \"any-link\": \":is(a, area, link)[href]\",\n    link: \":any-link:not(:visited)\",\n    // Forms\n    // https://html.spec.whatwg.org/multipage/scripting.html#disabled-elements\n    disabled: \":is(\\n        :is(button, input, select, textarea, optgroup, option)[disabled],\\n        optgroup[disabled] > option,\\n        fieldset[disabled]:not(fieldset[disabled] legend:first-of-type *)\\n    )\",\n    enabled: \":not(:disabled)\",\n    checked: \":is(:is(input[type=radio], input[type=checkbox])[checked], option:selected)\",\n    required: \":is(input, select, textarea)[required]\",\n    optional: \":is(input, select, textarea):not([required])\",\n    // JQuery extensions\n    // https://html.spec.whatwg.org/multipage/form-elements.html#concept-option-selectedness\n    selected: \"option:is([selected], select:not([multiple]):not(:has(> option[selected])) > :first-of-type)\",\n    checkbox: \"[type=checkbox]\",\n    file: \"[type=file]\",\n    password: \"[type=password]\",\n    radio: \"[type=radio]\",\n    reset: \"[type=reset]\",\n    image: \"[type=image]\",\n    submit: \"[type=submit]\",\n    parent: \":not(:empty)\",\n    header: \":is(h1, h2, h3, h4, h5, h6)\",\n    button: \":is(button, input[type=button])\",\n    input: \":is(input, textarea, select, button)\",\n    text: \"input:is(:not([type!='']), [type=text])\",\n};\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.filters = void 0;\nvar nth_check_1 = __importDefault(require(\"nth-check\"));\nvar boolbase_1 = require(\"boolbase\");\nfunction getChildFunc(next, adapter) {\n    return function (elem) {\n        var parent = adapter.getParent(elem);\n        return parent != null && adapter.isTag(parent) && next(elem);\n    };\n}\nexports.filters = {\n    contains: function (next, text, _a) {\n        var adapter = _a.adapter;\n        return function contains(elem) {\n            return next(elem) && adapter.getText(elem).includes(text);\n        };\n    },\n    icontains: function (next, text, _a) {\n        var adapter = _a.adapter;\n        var itext = text.toLowerCase();\n        return function icontains(elem) {\n            return (next(elem) &&\n                adapter.getText(elem).toLowerCase().includes(itext));\n        };\n    },\n    // Location specific methods\n    \"nth-child\": function (next, rule, _a) {\n        var adapter = _a.adapter, equals = _a.equals;\n        var func = (0, nth_check_1.default)(rule);\n        if (func === boolbase_1.falseFunc)\n            return boolbase_1.falseFunc;\n        if (func === boolbase_1.trueFunc)\n            return getChildFunc(next, adapter);\n        return function nthChild(elem) {\n            var siblings = adapter.getSiblings(elem);\n            var pos = 0;\n            for (var i = 0; i < siblings.length; i++) {\n                if (equals(elem, siblings[i]))\n                    break;\n                if (adapter.isTag(siblings[i])) {\n                    pos++;\n                }\n            }\n            return func(pos) && next(elem);\n        };\n    },\n    \"nth-last-child\": function (next, rule, _a) {\n        var adapter = _a.adapter, equals = _a.equals;\n        var func = (0, nth_check_1.default)(rule);\n        if (func === boolbase_1.falseFunc)\n            return boolbase_1.falseFunc;\n        if (func === boolbase_1.trueFunc)\n            return getChildFunc(next, adapter);\n        return function nthLastChild(elem) {\n            var siblings = adapter.getSiblings(elem);\n            var pos = 0;\n            for (var i = siblings.length - 1; i >= 0; i--) {\n                if (equals(elem, siblings[i]))\n                    break;\n                if (adapter.isTag(siblings[i])) {\n                    pos++;\n                }\n            }\n            return func(pos) && next(elem);\n        };\n    },\n    \"nth-of-type\": function (next, rule, _a) {\n        var adapter = _a.adapter, equals = _a.equals;\n        var func = (0, nth_check_1.default)(rule);\n        if (func === boolbase_1.falseFunc)\n            return boolbase_1.falseFunc;\n        if (func === boolbase_1.trueFunc)\n            return getChildFunc(next, adapter);\n        return function nthOfType(elem) {\n            var siblings = adapter.getSiblings(elem);\n            var pos = 0;\n            for (var i = 0; i < siblings.length; i++) {\n                var currentSibling = siblings[i];\n                if (equals(elem, currentSibling))\n                    break;\n                if (adapter.isTag(currentSibling) &&\n                    adapter.getName(currentSibling) === adapter.getName(elem)) {\n                    pos++;\n                }\n            }\n            return func(pos) && next(elem);\n        };\n    },\n    \"nth-last-of-type\": function (next, rule, _a) {\n        var adapter = _a.adapter, equals = _a.equals;\n        var func = (0, nth_check_1.default)(rule);\n        if (func === boolbase_1.falseFunc)\n            return boolbase_1.falseFunc;\n        if (func === boolbase_1.trueFunc)\n            return getChildFunc(next, adapter);\n        return function nthLastOfType(elem) {\n            var siblings = adapter.getSiblings(elem);\n            var pos = 0;\n            for (var i = siblings.length - 1; i >= 0; i--) {\n                var currentSibling = siblings[i];\n                if (equals(elem, currentSibling))\n                    break;\n                if (adapter.isTag(currentSibling) &&\n                    adapter.getName(currentSibling) === adapter.getName(elem)) {\n                    pos++;\n                }\n            }\n            return func(pos) && next(elem);\n        };\n    },\n    // TODO determine the actual root element\n    root: function (next, _rule, _a) {\n        var adapter = _a.adapter;\n        return function (elem) {\n            var parent = adapter.getParent(elem);\n            return (parent == null || !adapter.isTag(parent)) && next(elem);\n        };\n    },\n    scope: function (next, rule, options, context) {\n        var equals = options.equals;\n        if (!context || context.length === 0) {\n            // Equivalent to :root\n            return exports.filters.root(next, rule, options);\n        }\n        if (context.length === 1) {\n            // NOTE: can't be unpacked, as :has uses this for side-effects\n            return function (elem) { return equals(context[0], elem) && next(elem); };\n        }\n        return function (elem) { return context.includes(elem) && next(elem); };\n    },\n    hover: dynamicStatePseudo(\"isHovered\"),\n    visited: dynamicStatePseudo(\"isVisited\"),\n    active: dynamicStatePseudo(\"isActive\"),\n};\n/**\n * Dynamic state pseudos. These depend on optional Adapter methods.\n *\n * @param name The name of the adapter method to call.\n * @returns Pseudo for the `filters` object.\n */\nfunction dynamicStatePseudo(name) {\n    return function dynamicPseudo(next, _rule, _a) {\n        var adapter = _a.adapter;\n        var func = adapter[name];\n        if (typeof func !== \"function\") {\n            return boolbase_1.falseFunc;\n        }\n        return function active(elem) {\n            return func(elem) && next(elem);\n        };\n    };\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.compilePseudoSelector = exports.aliases = exports.pseudos = exports.filters = void 0;\n/*\n * Pseudo selectors\n *\n * Pseudo selectors are available in three forms:\n *\n * 1. Filters are called when the selector is compiled and return a function\n *  that has to return either false, or the results of `next()`.\n * 2. Pseudos are called on execution. They have to return a boolean.\n * 3. Subselects work like filters, but have an embedded selector that will be run separately.\n *\n * Filters are great if you want to do some pre-processing, or change the call order\n * of `next()` and your code.\n * Pseudos should be used to implement simple checks.\n */\nvar boolbase_1 = require(\"boolbase\");\nvar css_what_1 = require(\"css-what\");\nvar filters_1 = require(\"./filters\");\nObject.defineProperty(exports, \"filters\", { enumerable: true, get: function () { return filters_1.filters; } });\nvar pseudos_1 = require(\"./pseudos\");\nObject.defineProperty(exports, \"pseudos\", { enumerable: true, get: function () { return pseudos_1.pseudos; } });\nvar aliases_1 = require(\"./aliases\");\nObject.defineProperty(exports, \"aliases\", { enumerable: true, get: function () { return aliases_1.aliases; } });\nvar subselects_1 = require(\"./subselects\");\nfunction compilePseudoSelector(next, selector, options, context, compileToken) {\n    var name = selector.name, data = selector.data;\n    if (Array.isArray(data)) {\n        return subselects_1.subselects[name](next, data, options, context, compileToken);\n    }\n    if (name in aliases_1.aliases) {\n        if (data != null) {\n            throw new Error(\"Pseudo \".concat(name, \" doesn't have any arguments\"));\n        }\n        // The alias has to be parsed here, to make sure options are respected.\n        var alias = (0, css_what_1.parse)(aliases_1.aliases[name], options);\n        return subselects_1.subselects.is(next, alias, options, context, compileToken);\n    }\n    if (name in filters_1.filters) {\n        return filters_1.filters[name](next, data, options, context);\n    }\n    if (name in pseudos_1.pseudos) {\n        var pseudo_1 = pseudos_1.pseudos[name];\n        (0, pseudos_1.verifyPseudoArgs)(pseudo_1, name, data);\n        return pseudo_1 === boolbase_1.falseFunc\n            ? boolbase_1.falseFunc\n            : next === boolbase_1.trueFunc\n                ? function (elem) { return pseudo_1(elem, options, data); }\n                : function (elem) { return pseudo_1(elem, options, data) && next(elem); };\n    }\n    throw new Error(\"unmatched pseudo-class :\".concat(name));\n}\nexports.compilePseudoSelector = compilePseudoSelector;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.verifyPseudoArgs = exports.pseudos = void 0;\n// While filters are precompiled, pseudos get called when they are needed\nexports.pseudos = {\n    empty: function (elem, _a) {\n        var adapter = _a.adapter;\n        return !adapter.getChildren(elem).some(function (elem) {\n            // FIXME: `getText` call is potentially expensive.\n            return adapter.isTag(elem) || adapter.getText(elem) !== \"\";\n        });\n    },\n    \"first-child\": function (elem, _a) {\n        var adapter = _a.adapter, equals = _a.equals;\n        var firstChild = adapter\n            .getSiblings(elem)\n            .find(function (elem) { return adapter.isTag(elem); });\n        return firstChild != null && equals(elem, firstChild);\n    },\n    \"last-child\": function (elem, _a) {\n        var adapter = _a.adapter, equals = _a.equals;\n        var siblings = adapter.getSiblings(elem);\n        for (var i = siblings.length - 1; i >= 0; i--) {\n            if (equals(elem, siblings[i]))\n                return true;\n            if (adapter.isTag(siblings[i]))\n                break;\n        }\n        return false;\n    },\n    \"first-of-type\": function (elem, _a) {\n        var adapter = _a.adapter, equals = _a.equals;\n        var siblings = adapter.getSiblings(elem);\n        var elemName = adapter.getName(elem);\n        for (var i = 0; i < siblings.length; i++) {\n            var currentSibling = siblings[i];\n            if (equals(elem, currentSibling))\n                return true;\n            if (adapter.isTag(currentSibling) &&\n                adapter.getName(currentSibling) === elemName) {\n                break;\n            }\n        }\n        return false;\n    },\n    \"last-of-type\": function (elem, _a) {\n        var adapter = _a.adapter, equals = _a.equals;\n        var siblings = adapter.getSiblings(elem);\n        var elemName = adapter.getName(elem);\n        for (var i = siblings.length - 1; i >= 0; i--) {\n            var currentSibling = siblings[i];\n            if (equals(elem, currentSibling))\n                return true;\n            if (adapter.isTag(currentSibling) &&\n                adapter.getName(currentSibling) === elemName) {\n                break;\n            }\n        }\n        return false;\n    },\n    \"only-of-type\": function (elem, _a) {\n        var adapter = _a.adapter, equals = _a.equals;\n        var elemName = adapter.getName(elem);\n        return adapter\n            .getSiblings(elem)\n            .every(function (sibling) {\n            return equals(elem, sibling) ||\n                !adapter.isTag(sibling) ||\n                adapter.getName(sibling) !== elemName;\n        });\n    },\n    \"only-child\": function (elem, _a) {\n        var adapter = _a.adapter, equals = _a.equals;\n        return adapter\n            .getSiblings(elem)\n            .every(function (sibling) { return equals(elem, sibling) || !adapter.isTag(sibling); });\n    },\n};\nfunction verifyPseudoArgs(func, name, subselect) {\n    if (subselect === null) {\n        if (func.length > 2) {\n            throw new Error(\"pseudo-selector :\".concat(name, \" requires an argument\"));\n        }\n    }\n    else if (func.length === 2) {\n        throw new Error(\"pseudo-selector :\".concat(name, \" doesn't have any arguments\"));\n    }\n}\nexports.verifyPseudoArgs = verifyPseudoArgs;\n","\"use strict\";\nvar __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {\n    if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n        if (ar || !(i in from)) {\n            if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n            ar[i] = from[i];\n        }\n    }\n    return to.concat(ar || Array.prototype.slice.call(from));\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.subselects = exports.getNextSiblings = exports.ensureIsTag = exports.PLACEHOLDER_ELEMENT = void 0;\nvar boolbase_1 = require(\"boolbase\");\nvar procedure_1 = require(\"../procedure\");\n/** Used as a placeholder for :has. Will be replaced with the actual element. */\nexports.PLACEHOLDER_ELEMENT = {};\nfunction ensureIsTag(next, adapter) {\n    if (next === boolbase_1.falseFunc)\n        return boolbase_1.falseFunc;\n    return function (elem) { return adapter.isTag(elem) && next(elem); };\n}\nexports.ensureIsTag = ensureIsTag;\nfunction getNextSiblings(elem, adapter) {\n    var siblings = adapter.getSiblings(elem);\n    if (siblings.length <= 1)\n        return [];\n    var elemIndex = siblings.indexOf(elem);\n    if (elemIndex < 0 || elemIndex === siblings.length - 1)\n        return [];\n    return siblings.slice(elemIndex + 1).filter(adapter.isTag);\n}\nexports.getNextSiblings = getNextSiblings;\nvar is = function (next, token, options, context, compileToken) {\n    var opts = {\n        xmlMode: !!options.xmlMode,\n        adapter: options.adapter,\n        equals: options.equals,\n    };\n    var func = compileToken(token, opts, context);\n    return function (elem) { return func(elem) && next(elem); };\n};\n/*\n * :not, :has, :is, :matches and :where have to compile selectors\n * doing this in src/pseudos.ts would lead to circular dependencies,\n * so we add them here\n */\nexports.subselects = {\n    is: is,\n    /**\n     * `:matches` and `:where` are aliases for `:is`.\n     */\n    matches: is,\n    where: is,\n    not: function (next, token, options, context, compileToken) {\n        var opts = {\n            xmlMode: !!options.xmlMode,\n            adapter: options.adapter,\n            equals: options.equals,\n        };\n        var func = compileToken(token, opts, context);\n        if (func === boolbase_1.falseFunc)\n            return next;\n        if (func === boolbase_1.trueFunc)\n            return boolbase_1.falseFunc;\n        return function not(elem) {\n            return !func(elem) && next(elem);\n        };\n    },\n    has: function (next, subselect, options, _context, compileToken) {\n        var adapter = options.adapter;\n        var opts = {\n            xmlMode: !!options.xmlMode,\n            adapter: adapter,\n            equals: options.equals,\n        };\n        // @ts-expect-error Uses an array as a pointer to the current element (side effects)\n        var context = subselect.some(function (s) {\n            return s.some(procedure_1.isTraversal);\n        })\n            ? [exports.PLACEHOLDER_ELEMENT]\n            : undefined;\n        var compiled = compileToken(subselect, opts, context);\n        if (compiled === boolbase_1.falseFunc)\n            return boolbase_1.falseFunc;\n        if (compiled === boolbase_1.trueFunc) {\n            return function (elem) {\n                return adapter.getChildren(elem).some(adapter.isTag) && next(elem);\n            };\n        }\n        var hasElement = ensureIsTag(compiled, adapter);\n        var _a = compiled.shouldTestNextSiblings, shouldTestNextSiblings = _a === void 0 ? false : _a;\n        /*\n         * `shouldTestNextSiblings` will only be true if the query starts with\n         * a traversal (sibling or adjacent). That means we will always have a context.\n         */\n        if (context) {\n            return function (elem) {\n                context[0] = elem;\n                var childs = adapter.getChildren(elem);\n                var nextElements = shouldTestNextSiblings\n                    ? __spreadArray(__spreadArray([], childs, true), getNextSiblings(elem, adapter), true) : childs;\n                return (next(elem) && adapter.existsOne(hasElement, nextElements));\n            };\n        }\n        return function (elem) {\n            return next(elem) &&\n                adapter.existsOne(hasElement, adapter.getChildren(elem));\n        };\n    },\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar procedure_1 = require(\"./procedure\");\nvar attributes = {\n    exists: 10,\n    equals: 8,\n    not: 7,\n    start: 6,\n    end: 6,\n    any: 5,\n    hyphen: 4,\n    element: 4,\n};\n/**\n * Sort the parts of the passed selector,\n * as there is potential for optimization\n * (some types of selectors are faster than others)\n *\n * @param arr Selector to sort\n */\nfunction sortByProcedure(arr) {\n    var procs = arr.map(getProcedure);\n    for (var i = 1; i < arr.length; i++) {\n        var procNew = procs[i];\n        if (procNew < 0)\n            continue;\n        for (var j = i - 1; j >= 0 && procNew < procs[j]; j--) {\n            var token = arr[j + 1];\n            arr[j + 1] = arr[j];\n            arr[j] = token;\n            procs[j + 1] = procs[j];\n            procs[j] = procNew;\n        }\n    }\n}\nexports.default = sortByProcedure;\nfunction getProcedure(token) {\n    var proc = procedure_1.procedure[token.type];\n    if (token.type === \"attribute\") {\n        proc = attributes[token.action];\n        if (proc === attributes.equals && token.name === \"id\") {\n            // Prefer ID selectors (eg. #ID)\n            proc = 9;\n        }\n        if (token.ignoreCase) {\n            /*\n             * IgnoreCase adds some overhead, prefer \"normal\" token\n             * this is a binary operation, to ensure it's still an int\n             */\n            proc >>= 1;\n        }\n    }\n    else if (token.type === \"pseudo\") {\n        if (!token.data) {\n            proc = 3;\n        }\n        else if (token.name === \"has\" || token.name === \"contains\") {\n            proc = 0; // Expensive in any case\n        }\n        else if (Array.isArray(token.data)) {\n            // \"matches\" and \"not\"\n            proc = 0;\n            for (var i = 0; i < token.data.length; i++) {\n                // TODO better handling of complex selectors\n                if (token.data[i].length !== 1)\n                    continue;\n                var cur = getProcedure(token.data[i][0]);\n                // Avoid executing :has or :contains\n                if (cur === 0) {\n                    proc = 0;\n                    break;\n                }\n                if (cur > proc)\n                    proc = cur;\n            }\n            if (token.data.length > 1 && proc > 0)\n                proc -= 1;\n        }\n        else {\n            proc = 1;\n        }\n    }\n    return proc;\n}\n","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n    if (k2 === undefined) k2 = k;\n    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n    if (k2 === undefined) k2 = k;\n    o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n    for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.stringify = exports.parse = void 0;\n__exportStar(require(\"./parse\"), exports);\nvar parse_1 = require(\"./parse\");\nObject.defineProperty(exports, \"parse\", { enumerable: true, get: function () { return __importDefault(parse_1).default; } });\nvar stringify_1 = require(\"./stringify\");\nObject.defineProperty(exports, \"stringify\", { enumerable: true, get: function () { return __importDefault(stringify_1).default; } });\n","\"use strict\";\nvar __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {\n    if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n        if (ar || !(i in from)) {\n            if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n            ar[i] = from[i];\n        }\n    }\n    return to.concat(ar || Array.prototype.slice.call(from));\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isTraversal = void 0;\nvar reName = /^[^\\\\#]?(?:\\\\(?:[\\da-f]{1,6}\\s?|.)|[\\w\\-\\u00b0-\\uFFFF])+/;\nvar reEscape = /\\\\([\\da-f]{1,6}\\s?|(\\s)|.)/gi;\nvar actionTypes = new Map([\n    [\"~\", \"element\"],\n    [\"^\", \"start\"],\n    [\"$\", \"end\"],\n    [\"*\", \"any\"],\n    [\"!\", \"not\"],\n    [\"|\", \"hyphen\"],\n]);\nvar Traversals = {\n    \">\": \"child\",\n    \"<\": \"parent\",\n    \"~\": \"sibling\",\n    \"+\": \"adjacent\",\n};\nvar attribSelectors = {\n    \"#\": [\"id\", \"equals\"],\n    \".\": [\"class\", \"element\"],\n};\n// Pseudos, whose data property is parsed as well.\nvar unpackPseudos = new Set([\n    \"has\",\n    \"not\",\n    \"matches\",\n    \"is\",\n    \"where\",\n    \"host\",\n    \"host-context\",\n]);\nvar traversalNames = new Set(__spreadArray([\n    \"descendant\"\n], Object.keys(Traversals).map(function (k) { return Traversals[k]; }), true));\n/**\n * Attributes that are case-insensitive in HTML.\n *\n * @private\n * @see https://html.spec.whatwg.org/multipage/semantics-other.html#case-sensitivity-of-selectors\n */\nvar caseInsensitiveAttributes = new Set([\n    \"accept\",\n    \"accept-charset\",\n    \"align\",\n    \"alink\",\n    \"axis\",\n    \"bgcolor\",\n    \"charset\",\n    \"checked\",\n    \"clear\",\n    \"codetype\",\n    \"color\",\n    \"compact\",\n    \"declare\",\n    \"defer\",\n    \"dir\",\n    \"direction\",\n    \"disabled\",\n    \"enctype\",\n    \"face\",\n    \"frame\",\n    \"hreflang\",\n    \"http-equiv\",\n    \"lang\",\n    \"language\",\n    \"link\",\n    \"media\",\n    \"method\",\n    \"multiple\",\n    \"nohref\",\n    \"noresize\",\n    \"noshade\",\n    \"nowrap\",\n    \"readonly\",\n    \"rel\",\n    \"rev\",\n    \"rules\",\n    \"scope\",\n    \"scrolling\",\n    \"selected\",\n    \"shape\",\n    \"target\",\n    \"text\",\n    \"type\",\n    \"valign\",\n    \"valuetype\",\n    \"vlink\",\n]);\n/**\n * Checks whether a specific selector is a traversal.\n * This is useful eg. in swapping the order of elements that\n * are not traversals.\n *\n * @param selector Selector to check.\n */\nfunction isTraversal(selector) {\n    return traversalNames.has(selector.type);\n}\nexports.isTraversal = isTraversal;\nvar stripQuotesFromPseudos = new Set([\"contains\", \"icontains\"]);\nvar quotes = new Set(['\"', \"'\"]);\n// Unescape function taken from https://github.com/jquery/sizzle/blob/master/src/sizzle.js#L152\nfunction funescape(_, escaped, escapedWhitespace) {\n    var high = parseInt(escaped, 16) - 0x10000;\n    // NaN means non-codepoint\n    return high !== high || escapedWhitespace\n        ? escaped\n        : high < 0\n            ? // BMP codepoint\n                String.fromCharCode(high + 0x10000)\n            : // Supplemental Plane codepoint (surrogate pair)\n                String.fromCharCode((high >> 10) | 0xd800, (high & 0x3ff) | 0xdc00);\n}\nfunction unescapeCSS(str) {\n    return str.replace(reEscape, funescape);\n}\nfunction isWhitespace(c) {\n    return c === \" \" || c === \"\\n\" || c === \"\\t\" || c === \"\\f\" || c === \"\\r\";\n}\n/**\n * Parses `selector`, optionally with the passed `options`.\n *\n * @param selector Selector to parse.\n * @param options Options for parsing.\n * @returns Returns a two-dimensional array.\n * The first dimension represents selectors separated by commas (eg. `sub1, sub2`),\n * the second contains the relevant tokens for that selector.\n */\nfunction parse(selector, options) {\n    var subselects = [];\n    var endIndex = parseSelector(subselects, \"\" + selector, options, 0);\n    if (endIndex < selector.length) {\n        throw new Error(\"Unmatched selector: \" + selector.slice(endIndex));\n    }\n    return subselects;\n}\nexports.default = parse;\nfunction parseSelector(subselects, selector, options, selectorIndex) {\n    var _a, _b;\n    if (options === void 0) { options = {}; }\n    var tokens = [];\n    var sawWS = false;\n    function getName(offset) {\n        var match = selector.slice(selectorIndex + offset).match(reName);\n        if (!match) {\n            throw new Error(\"Expected name, found \" + selector.slice(selectorIndex));\n        }\n        var name = match[0];\n        selectorIndex += offset + name.length;\n        return unescapeCSS(name);\n    }\n    function stripWhitespace(offset) {\n        while (isWhitespace(selector.charAt(selectorIndex + offset)))\n            offset++;\n        selectorIndex += offset;\n    }\n    function isEscaped(pos) {\n        var slashCount = 0;\n        while (selector.charAt(--pos) === \"\\\\\")\n            slashCount++;\n        return (slashCount & 1) === 1;\n    }\n    function ensureNotTraversal() {\n        if (tokens.length > 0 && isTraversal(tokens[tokens.length - 1])) {\n            throw new Error(\"Did not expect successive traversals.\");\n        }\n    }\n    stripWhitespace(0);\n    while (selector !== \"\") {\n        var firstChar = selector.charAt(selectorIndex);\n        if (isWhitespace(firstChar)) {\n            sawWS = true;\n            stripWhitespace(1);\n        }\n        else if (firstChar in Traversals) {\n            ensureNotTraversal();\n            tokens.push({ type: Traversals[firstChar] });\n            sawWS = false;\n            stripWhitespace(1);\n        }\n        else if (firstChar === \",\") {\n            if (tokens.length === 0) {\n                throw new Error(\"Empty sub-selector\");\n            }\n            subselects.push(tokens);\n            tokens = [];\n            sawWS = false;\n            stripWhitespace(1);\n        }\n        else if (selector.startsWith(\"/*\", selectorIndex)) {\n            var endIndex = selector.indexOf(\"*/\", selectorIndex + 2);\n            if (endIndex < 0) {\n                throw new Error(\"Comment was not terminated\");\n            }\n            selectorIndex = endIndex + 2;\n        }\n        else {\n            if (sawWS) {\n                ensureNotTraversal();\n                tokens.push({ type: \"descendant\" });\n                sawWS = false;\n            }\n            if (firstChar in attribSelectors) {\n                var _c = attribSelectors[firstChar], name_1 = _c[0], action = _c[1];\n                tokens.push({\n                    type: \"attribute\",\n                    name: name_1,\n                    action: action,\n                    value: getName(1),\n                    namespace: null,\n                    // TODO: Add quirksMode option, which makes `ignoreCase` `true` for HTML.\n                    ignoreCase: options.xmlMode ? null : false,\n                });\n            }\n            else if (firstChar === \"[\") {\n                stripWhitespace(1);\n                // Determine attribute name and namespace\n                var namespace = null;\n                if (selector.charAt(selectorIndex) === \"|\") {\n                    namespace = \"\";\n                    selectorIndex += 1;\n                }\n                if (selector.startsWith(\"*|\", selectorIndex)) {\n                    namespace = \"*\";\n                    selectorIndex += 2;\n                }\n                var name_2 = getName(0);\n                if (namespace === null &&\n                    selector.charAt(selectorIndex) === \"|\" &&\n                    selector.charAt(selectorIndex + 1) !== \"=\") {\n                    namespace = name_2;\n                    name_2 = getName(1);\n                }\n                if ((_a = options.lowerCaseAttributeNames) !== null && _a !== void 0 ? _a : !options.xmlMode) {\n                    name_2 = name_2.toLowerCase();\n                }\n                stripWhitespace(0);\n                // Determine comparison operation\n                var action = \"exists\";\n                var possibleAction = actionTypes.get(selector.charAt(selectorIndex));\n                if (possibleAction) {\n                    action = possibleAction;\n                    if (selector.charAt(selectorIndex + 1) !== \"=\") {\n                        throw new Error(\"Expected `=`\");\n                    }\n                    stripWhitespace(2);\n                }\n                else if (selector.charAt(selectorIndex) === \"=\") {\n                    action = \"equals\";\n                    stripWhitespace(1);\n                }\n                // Determine value\n                var value = \"\";\n                var ignoreCase = null;\n                if (action !== \"exists\") {\n                    if (quotes.has(selector.charAt(selectorIndex))) {\n                        var quote = selector.charAt(selectorIndex);\n                        var sectionEnd = selectorIndex + 1;\n                        while (sectionEnd < selector.length &&\n                            (selector.charAt(sectionEnd) !== quote ||\n                                isEscaped(sectionEnd))) {\n                            sectionEnd += 1;\n                        }\n                        if (selector.charAt(sectionEnd) !== quote) {\n                            throw new Error(\"Attribute value didn't end\");\n                        }\n                        value = unescapeCSS(selector.slice(selectorIndex + 1, sectionEnd));\n                        selectorIndex = sectionEnd + 1;\n                    }\n                    else {\n                        var valueStart = selectorIndex;\n                        while (selectorIndex < selector.length &&\n                            ((!isWhitespace(selector.charAt(selectorIndex)) &&\n                                selector.charAt(selectorIndex) !== \"]\") ||\n                                isEscaped(selectorIndex))) {\n                            selectorIndex += 1;\n                        }\n                        value = unescapeCSS(selector.slice(valueStart, selectorIndex));\n                    }\n                    stripWhitespace(0);\n                    // See if we have a force ignore flag\n                    var forceIgnore = selector.charAt(selectorIndex);\n                    // If the forceIgnore flag is set (either `i` or `s`), use that value\n                    if (forceIgnore === \"s\" || forceIgnore === \"S\") {\n                        ignoreCase = false;\n                        stripWhitespace(1);\n                    }\n                    else if (forceIgnore === \"i\" || forceIgnore === \"I\") {\n                        ignoreCase = true;\n                        stripWhitespace(1);\n                    }\n                }\n                // If `xmlMode` is set, there are no rules; otherwise, use the `caseInsensitiveAttributes` list.\n                if (!options.xmlMode) {\n                    // TODO: Skip this for `exists`, as there is no value to compare to.\n                    ignoreCase !== null && ignoreCase !== void 0 ? ignoreCase : (ignoreCase = caseInsensitiveAttributes.has(name_2));\n                }\n                if (selector.charAt(selectorIndex) !== \"]\") {\n                    throw new Error(\"Attribute selector didn't terminate\");\n                }\n                selectorIndex += 1;\n                var attributeSelector = {\n                    type: \"attribute\",\n                    name: name_2,\n                    action: action,\n                    value: value,\n                    namespace: namespace,\n                    ignoreCase: ignoreCase,\n                };\n                tokens.push(attributeSelector);\n            }\n            else if (firstChar === \":\") {\n                if (selector.charAt(selectorIndex + 1) === \":\") {\n                    tokens.push({\n                        type: \"pseudo-element\",\n                        name: getName(2).toLowerCase(),\n                    });\n                    continue;\n                }\n                var name_3 = getName(1).toLowerCase();\n                var data = null;\n                if (selector.charAt(selectorIndex) === \"(\") {\n                    if (unpackPseudos.has(name_3)) {\n                        if (quotes.has(selector.charAt(selectorIndex + 1))) {\n                            throw new Error(\"Pseudo-selector \" + name_3 + \" cannot be quoted\");\n                        }\n                        data = [];\n                        selectorIndex = parseSelector(data, selector, options, selectorIndex + 1);\n                        if (selector.charAt(selectorIndex) !== \")\") {\n                            throw new Error(\"Missing closing parenthesis in :\" + name_3 + \" (\" + selector + \")\");\n                        }\n                        selectorIndex += 1;\n                    }\n                    else {\n                        selectorIndex += 1;\n                        var start = selectorIndex;\n                        var counter = 1;\n                        for (; counter > 0 && selectorIndex < selector.length; selectorIndex++) {\n                            if (selector.charAt(selectorIndex) === \"(\" &&\n                                !isEscaped(selectorIndex)) {\n                                counter++;\n                            }\n                            else if (selector.charAt(selectorIndex) === \")\" &&\n                                !isEscaped(selectorIndex)) {\n                                counter--;\n                            }\n                        }\n                        if (counter) {\n                            throw new Error(\"Parenthesis not matched\");\n                        }\n                        data = selector.slice(start, selectorIndex - 1);\n                        if (stripQuotesFromPseudos.has(name_3)) {\n                            var quot = data.charAt(0);\n                            if (quot === data.slice(-1) && quotes.has(quot)) {\n                                data = data.slice(1, -1);\n                            }\n                            data = unescapeCSS(data);\n                        }\n                    }\n                }\n                tokens.push({ type: \"pseudo\", name: name_3, data: data });\n            }\n            else {\n                var namespace = null;\n                var name_4 = void 0;\n                if (firstChar === \"*\") {\n                    selectorIndex += 1;\n                    name_4 = \"*\";\n                }\n                else if (reName.test(selector.slice(selectorIndex))) {\n                    if (selector.charAt(selectorIndex) === \"|\") {\n                        namespace = \"\";\n                        selectorIndex += 1;\n                    }\n                    name_4 = getName(0);\n                }\n                else {\n                    /*\n                     * We have finished parsing the selector.\n                     * Remove descendant tokens at the end if they exist,\n                     * and return the last index, so that parsing can be\n                     * picked up from here.\n                     */\n                    if (tokens.length &&\n                        tokens[tokens.length - 1].type === \"descendant\") {\n                        tokens.pop();\n                    }\n                    addToken(subselects, tokens);\n                    return selectorIndex;\n                }\n                if (selector.charAt(selectorIndex) === \"|\") {\n                    namespace = name_4;\n                    if (selector.charAt(selectorIndex + 1) === \"*\") {\n                        name_4 = \"*\";\n                        selectorIndex += 2;\n                    }\n                    else {\n                        name_4 = getName(1);\n                    }\n                }\n                if (name_4 === \"*\") {\n                    tokens.push({ type: \"universal\", namespace: namespace });\n                }\n                else {\n                    if ((_b = options.lowerCaseTags) !== null && _b !== void 0 ? _b : !options.xmlMode) {\n                        name_4 = name_4.toLowerCase();\n                    }\n                    tokens.push({ type: \"tag\", name: name_4, namespace: namespace });\n                }\n            }\n        }\n    }\n    addToken(subselects, tokens);\n    return selectorIndex;\n}\nfunction addToken(subselects, tokens) {\n    if (subselects.length > 0 && tokens.length === 0) {\n        throw new Error(\"Empty sub-selector\");\n    }\n    subselects.push(tokens);\n}\n","\"use strict\";\nvar __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {\n    if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n        if (ar || !(i in from)) {\n            if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n            ar[i] = from[i];\n        }\n    }\n    return to.concat(ar || Array.prototype.slice.call(from));\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar actionTypes = {\n    equals: \"\",\n    element: \"~\",\n    start: \"^\",\n    end: \"$\",\n    any: \"*\",\n    not: \"!\",\n    hyphen: \"|\",\n};\nvar charsToEscape = new Set(__spreadArray(__spreadArray([], Object.keys(actionTypes)\n    .map(function (typeKey) { return actionTypes[typeKey]; })\n    .filter(Boolean), true), [\n    \":\",\n    \"[\",\n    \"]\",\n    \" \",\n    \"\\\\\",\n    \"(\",\n    \")\",\n    \"'\",\n], false));\n/**\n * Turns `selector` back into a string.\n *\n * @param selector Selector to stringify.\n */\nfunction stringify(selector) {\n    return selector.map(stringifySubselector).join(\", \");\n}\nexports.default = stringify;\nfunction stringifySubselector(token) {\n    return token.map(stringifyToken).join(\"\");\n}\nfunction stringifyToken(token) {\n    switch (token.type) {\n        // Simple types\n        case \"child\":\n            return \" > \";\n        case \"parent\":\n            return \" < \";\n        case \"sibling\":\n            return \" ~ \";\n        case \"adjacent\":\n            return \" + \";\n        case \"descendant\":\n            return \" \";\n        case \"universal\":\n            return getNamespace(token.namespace) + \"*\";\n        case \"tag\":\n            return getNamespacedName(token);\n        case \"pseudo-element\":\n            return \"::\" + escapeName(token.name);\n        case \"pseudo\":\n            if (token.data === null)\n                return \":\" + escapeName(token.name);\n            if (typeof token.data === \"string\") {\n                return \":\" + escapeName(token.name) + \"(\" + escapeName(token.data) + \")\";\n            }\n            return \":\" + escapeName(token.name) + \"(\" + stringify(token.data) + \")\";\n        case \"attribute\": {\n            if (token.name === \"id\" &&\n                token.action === \"equals\" &&\n                !token.ignoreCase &&\n                !token.namespace) {\n                return \"#\" + escapeName(token.value);\n            }\n            if (token.name === \"class\" &&\n                token.action === \"element\" &&\n                !token.ignoreCase &&\n                !token.namespace) {\n                return \".\" + escapeName(token.value);\n            }\n            var name_1 = getNamespacedName(token);\n            if (token.action === \"exists\") {\n                return \"[\" + name_1 + \"]\";\n            }\n            return \"[\" + name_1 + actionTypes[token.action] + \"='\" + escapeName(token.value) + \"'\" + (token.ignoreCase ? \"i\" : token.ignoreCase === false ? \"s\" : \"\") + \"]\";\n        }\n    }\n}\nfunction getNamespacedName(token) {\n    return \"\" + getNamespace(token.namespace) + escapeName(token.name);\n}\nfunction getNamespace(namespace) {\n    return namespace !== null\n        ? (namespace === \"*\" ? \"*\" : escapeName(namespace)) + \"|\"\n        : \"\";\n}\nfunction escapeName(str) {\n    return str\n        .split(\"\")\n        .map(function (c) { return (charsToEscape.has(c) ? \"\\\\\" + c : c); })\n        .join(\"\");\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.attributeNames = exports.elementNames = void 0;\nexports.elementNames = new Map([\n    [\"altglyph\", \"altGlyph\"],\n    [\"altglyphdef\", \"altGlyphDef\"],\n    [\"altglyphitem\", \"altGlyphItem\"],\n    [\"animatecolor\", \"animateColor\"],\n    [\"animatemotion\", \"animateMotion\"],\n    [\"animatetransform\", \"animateTransform\"],\n    [\"clippath\", \"clipPath\"],\n    [\"feblend\", \"feBlend\"],\n    [\"fecolormatrix\", \"feColorMatrix\"],\n    [\"fecomponenttransfer\", \"feComponentTransfer\"],\n    [\"fecomposite\", \"feComposite\"],\n    [\"feconvolvematrix\", \"feConvolveMatrix\"],\n    [\"fediffuselighting\", \"feDiffuseLighting\"],\n    [\"fedisplacementmap\", \"feDisplacementMap\"],\n    [\"fedistantlight\", \"feDistantLight\"],\n    [\"fedropshadow\", \"feDropShadow\"],\n    [\"feflood\", \"feFlood\"],\n    [\"fefunca\", \"feFuncA\"],\n    [\"fefuncb\", \"feFuncB\"],\n    [\"fefuncg\", \"feFuncG\"],\n    [\"fefuncr\", \"feFuncR\"],\n    [\"fegaussianblur\", \"feGaussianBlur\"],\n    [\"feimage\", \"feImage\"],\n    [\"femerge\", \"feMerge\"],\n    [\"femergenode\", \"feMergeNode\"],\n    [\"femorphology\", \"feMorphology\"],\n    [\"feoffset\", \"feOffset\"],\n    [\"fepointlight\", \"fePointLight\"],\n    [\"fespecularlighting\", \"feSpecularLighting\"],\n    [\"fespotlight\", \"feSpotLight\"],\n    [\"fetile\", \"feTile\"],\n    [\"feturbulence\", \"feTurbulence\"],\n    [\"foreignobject\", \"foreignObject\"],\n    [\"glyphref\", \"glyphRef\"],\n    [\"lineargradient\", \"linearGradient\"],\n    [\"radialgradient\", \"radialGradient\"],\n    [\"textpath\", \"textPath\"],\n]);\nexports.attributeNames = new Map([\n    [\"definitionurl\", \"definitionURL\"],\n    [\"attributename\", \"attributeName\"],\n    [\"attributetype\", \"attributeType\"],\n    [\"basefrequency\", \"baseFrequency\"],\n    [\"baseprofile\", \"baseProfile\"],\n    [\"calcmode\", \"calcMode\"],\n    [\"clippathunits\", \"clipPathUnits\"],\n    [\"diffuseconstant\", \"diffuseConstant\"],\n    [\"edgemode\", \"edgeMode\"],\n    [\"filterunits\", \"filterUnits\"],\n    [\"glyphref\", \"glyphRef\"],\n    [\"gradienttransform\", \"gradientTransform\"],\n    [\"gradientunits\", \"gradientUnits\"],\n    [\"kernelmatrix\", \"kernelMatrix\"],\n    [\"kernelunitlength\", \"kernelUnitLength\"],\n    [\"keypoints\", \"keyPoints\"],\n    [\"keysplines\", \"keySplines\"],\n    [\"keytimes\", \"keyTimes\"],\n    [\"lengthadjust\", \"lengthAdjust\"],\n    [\"limitingconeangle\", \"limitingConeAngle\"],\n    [\"markerheight\", \"markerHeight\"],\n    [\"markerunits\", \"markerUnits\"],\n    [\"markerwidth\", \"markerWidth\"],\n    [\"maskcontentunits\", \"maskContentUnits\"],\n    [\"maskunits\", \"maskUnits\"],\n    [\"numoctaves\", \"numOctaves\"],\n    [\"pathlength\", \"pathLength\"],\n    [\"patterncontentunits\", \"patternContentUnits\"],\n    [\"patterntransform\", \"patternTransform\"],\n    [\"patternunits\", \"patternUnits\"],\n    [\"pointsatx\", \"pointsAtX\"],\n    [\"pointsaty\", \"pointsAtY\"],\n    [\"pointsatz\", \"pointsAtZ\"],\n    [\"preservealpha\", \"preserveAlpha\"],\n    [\"preserveaspectratio\", \"preserveAspectRatio\"],\n    [\"primitiveunits\", \"primitiveUnits\"],\n    [\"refx\", \"refX\"],\n    [\"refy\", \"refY\"],\n    [\"repeatcount\", \"repeatCount\"],\n    [\"repeatdur\", \"repeatDur\"],\n    [\"requiredextensions\", \"requiredExtensions\"],\n    [\"requiredfeatures\", \"requiredFeatures\"],\n    [\"specularconstant\", \"specularConstant\"],\n    [\"specularexponent\", \"specularExponent\"],\n    [\"spreadmethod\", \"spreadMethod\"],\n    [\"startoffset\", \"startOffset\"],\n    [\"stddeviation\", \"stdDeviation\"],\n    [\"stitchtiles\", \"stitchTiles\"],\n    [\"surfacescale\", \"surfaceScale\"],\n    [\"systemlanguage\", \"systemLanguage\"],\n    [\"tablevalues\", \"tableValues\"],\n    [\"targetx\", \"targetX\"],\n    [\"targety\", \"targetY\"],\n    [\"textlength\", \"textLength\"],\n    [\"viewbox\", \"viewBox\"],\n    [\"viewtarget\", \"viewTarget\"],\n    [\"xchannelselector\", \"xChannelSelector\"],\n    [\"ychannelselector\", \"yChannelSelector\"],\n    [\"zoomandpan\", \"zoomAndPan\"],\n]);\n","\"use strict\";\nvar __assign = (this && this.__assign) || function () {\n    __assign = Object.assign || function(t) {\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n                t[p] = s[p];\n        }\n        return t;\n    };\n    return __assign.apply(this, arguments);\n};\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n    if (k2 === undefined) k2 = k;\n    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n    if (k2 === undefined) k2 = k;\n    o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n    Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n    o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n    if (mod && mod.__esModule) return mod;\n    var result = {};\n    if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n    __setModuleDefault(result, mod);\n    return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/*\n * Module dependencies\n */\nvar ElementType = __importStar(require(\"domelementtype\"));\nvar entities_1 = require(\"entities\");\n/**\n * Mixed-case SVG and MathML tags & attributes\n * recognized by the HTML parser.\n *\n * @see https://html.spec.whatwg.org/multipage/parsing.html#parsing-main-inforeign\n */\nvar foreignNames_1 = require(\"./foreignNames\");\nvar unencodedElements = new Set([\n    \"style\",\n    \"script\",\n    \"xmp\",\n    \"iframe\",\n    \"noembed\",\n    \"noframes\",\n    \"plaintext\",\n    \"noscript\",\n]);\n/**\n * Format attributes\n */\nfunction formatAttributes(attributes, opts) {\n    if (!attributes)\n        return;\n    return Object.keys(attributes)\n        .map(function (key) {\n        var _a, _b;\n        var value = (_a = attributes[key]) !== null && _a !== void 0 ? _a : \"\";\n        if (opts.xmlMode === \"foreign\") {\n            /* Fix up mixed-case attribute names */\n            key = (_b = foreignNames_1.attributeNames.get(key)) !== null && _b !== void 0 ? _b : key;\n        }\n        if (!opts.emptyAttrs && !opts.xmlMode && value === \"\") {\n            return key;\n        }\n        return key + \"=\\\"\" + (opts.decodeEntities !== false\n            ? entities_1.encodeXML(value)\n            : value.replace(/\"/g, \"&quot;\")) + \"\\\"\";\n    })\n        .join(\" \");\n}\n/**\n * Self-enclosing tags\n */\nvar singleTag = new Set([\n    \"area\",\n    \"base\",\n    \"basefont\",\n    \"br\",\n    \"col\",\n    \"command\",\n    \"embed\",\n    \"frame\",\n    \"hr\",\n    \"img\",\n    \"input\",\n    \"isindex\",\n    \"keygen\",\n    \"link\",\n    \"meta\",\n    \"param\",\n    \"source\",\n    \"track\",\n    \"wbr\",\n]);\n/**\n * Renders a DOM node or an array of DOM nodes to a string.\n *\n * Can be thought of as the equivalent of the `outerHTML` of the passed node(s).\n *\n * @param node Node to be rendered.\n * @param options Changes serialization behavior\n */\nfunction render(node, options) {\n    if (options === void 0) { options = {}; }\n    var nodes = \"length\" in node ? node : [node];\n    var output = \"\";\n    for (var i = 0; i < nodes.length; i++) {\n        output += renderNode(nodes[i], options);\n    }\n    return output;\n}\nexports.default = render;\nfunction renderNode(node, options) {\n    switch (node.type) {\n        case ElementType.Root:\n            return render(node.children, options);\n        case ElementType.Directive:\n        case ElementType.Doctype:\n            return renderDirective(node);\n        case ElementType.Comment:\n            return renderComment(node);\n        case ElementType.CDATA:\n            return renderCdata(node);\n        case ElementType.Script:\n        case ElementType.Style:\n        case ElementType.Tag:\n            return renderTag(node, options);\n        case ElementType.Text:\n            return renderText(node, options);\n    }\n}\nvar foreignModeIntegrationPoints = new Set([\n    \"mi\",\n    \"mo\",\n    \"mn\",\n    \"ms\",\n    \"mtext\",\n    \"annotation-xml\",\n    \"foreignObject\",\n    \"desc\",\n    \"title\",\n]);\nvar foreignElements = new Set([\"svg\", \"math\"]);\nfunction renderTag(elem, opts) {\n    var _a;\n    // Handle SVG / MathML in HTML\n    if (opts.xmlMode === \"foreign\") {\n        /* Fix up mixed-case element names */\n        elem.name = (_a = foreignNames_1.elementNames.get(elem.name)) !== null && _a !== void 0 ? _a : elem.name;\n        /* Exit foreign mode at integration points */\n        if (elem.parent &&\n            foreignModeIntegrationPoints.has(elem.parent.name)) {\n            opts = __assign(__assign({}, opts), { xmlMode: false });\n        }\n    }\n    if (!opts.xmlMode && foreignElements.has(elem.name)) {\n        opts = __assign(__assign({}, opts), { xmlMode: \"foreign\" });\n    }\n    var tag = \"<\" + elem.name;\n    var attribs = formatAttributes(elem.attribs, opts);\n    if (attribs) {\n        tag += \" \" + attribs;\n    }\n    if (elem.children.length === 0 &&\n        (opts.xmlMode\n            ? // In XML mode or foreign mode, and user hasn't explicitly turned off self-closing tags\n                opts.selfClosingTags !== false\n            : // User explicitly asked for self-closing tags, even in HTML mode\n                opts.selfClosingTags && singleTag.has(elem.name))) {\n        if (!opts.xmlMode)\n            tag += \" \";\n        tag += \"/>\";\n    }\n    else {\n        tag += \">\";\n        if (elem.children.length > 0) {\n            tag += render(elem.children, opts);\n        }\n        if (opts.xmlMode || !singleTag.has(elem.name)) {\n            tag += \"</\" + elem.name + \">\";\n        }\n    }\n    return tag;\n}\nfunction renderDirective(elem) {\n    return \"<\" + elem.data + \">\";\n}\nfunction renderText(elem, opts) {\n    var data = elem.data || \"\";\n    // If entities weren't decoded, no need to encode them back\n    if (opts.decodeEntities !== false &&\n        !(!opts.xmlMode &&\n            elem.parent &&\n            unencodedElements.has(elem.parent.name))) {\n        data = entities_1.encodeXML(data);\n    }\n    return data;\n}\nfunction renderCdata(elem) {\n    return \"<![CDATA[\" + elem.children[0].data + \"]]>\";\n}\nfunction renderComment(elem) {\n    return \"<!--\" + elem.data + \"-->\";\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Doctype = exports.CDATA = exports.Tag = exports.Style = exports.Script = exports.Comment = exports.Directive = exports.Text = exports.Root = exports.isTag = exports.ElementType = void 0;\n/** Types of elements found in htmlparser2's DOM */\nvar ElementType;\n(function (ElementType) {\n    /** Type for the root element of a document */\n    ElementType[\"Root\"] = \"root\";\n    /** Type for Text */\n    ElementType[\"Text\"] = \"text\";\n    /** Type for <? ... ?> */\n    ElementType[\"Directive\"] = \"directive\";\n    /** Type for <!-- ... --> */\n    ElementType[\"Comment\"] = \"comment\";\n    /** Type for <script> tags */\n    ElementType[\"Script\"] = \"script\";\n    /** Type for <style> tags */\n    ElementType[\"Style\"] = \"style\";\n    /** Type for Any tag */\n    ElementType[\"Tag\"] = \"tag\";\n    /** Type for <![CDATA[ ... ]]> */\n    ElementType[\"CDATA\"] = \"cdata\";\n    /** Type for <!doctype ...> */\n    ElementType[\"Doctype\"] = \"doctype\";\n})(ElementType = exports.ElementType || (exports.ElementType = {}));\n/**\n * Tests whether an element is a tag or not.\n *\n * @param elem Element to test\n */\nfunction isTag(elem) {\n    return (elem.type === ElementType.Tag ||\n        elem.type === ElementType.Script ||\n        elem.type === ElementType.Style);\n}\nexports.isTag = isTag;\n// Exports for backwards compatibility\n/** Type for the root element of a document */\nexports.Root = ElementType.Root;\n/** Type for Text */\nexports.Text = ElementType.Text;\n/** Type for <? ... ?> */\nexports.Directive = ElementType.Directive;\n/** Type for <!-- ... --> */\nexports.Comment = ElementType.Comment;\n/** Type for <script> tags */\nexports.Script = ElementType.Script;\n/** Type for <style> tags */\nexports.Style = ElementType.Style;\n/** Type for Any tag */\nexports.Tag = ElementType.Tag;\n/** Type for <![CDATA[ ... ]]> */\nexports.CDATA = ElementType.CDATA;\n/** Type for <!doctype ...> */\nexports.Doctype = ElementType.Doctype;\n","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n    if (k2 === undefined) k2 = k;\n    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n    if (k2 === undefined) k2 = k;\n    o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n    for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DomHandler = void 0;\nvar domelementtype_1 = require(\"domelementtype\");\nvar node_1 = require(\"./node\");\n__exportStar(require(\"./node\"), exports);\nvar reWhitespace = /\\s+/g;\n// Default options\nvar defaultOpts = {\n    normalizeWhitespace: false,\n    withStartIndices: false,\n    withEndIndices: false,\n    xmlMode: false,\n};\nvar DomHandler = /** @class */ (function () {\n    /**\n     * @param callback Called once parsing has completed.\n     * @param options Settings for the handler.\n     * @param elementCB Callback whenever a tag is closed.\n     */\n    function DomHandler(callback, options, elementCB) {\n        /** The elements of the DOM */\n        this.dom = [];\n        /** The root element for the DOM */\n        this.root = new node_1.Document(this.dom);\n        /** Indicated whether parsing has been completed. */\n        this.done = false;\n        /** Stack of open tags. */\n        this.tagStack = [this.root];\n        /** A data node that is still being written to. */\n        this.lastNode = null;\n        /** Reference to the parser instance. Used for location information. */\n        this.parser = null;\n        // Make it possible to skip arguments, for backwards-compatibility\n        if (typeof options === \"function\") {\n            elementCB = options;\n            options = defaultOpts;\n        }\n        if (typeof callback === \"object\") {\n            options = callback;\n            callback = undefined;\n        }\n        this.callback = callback !== null && callback !== void 0 ? callback : null;\n        this.options = options !== null && options !== void 0 ? options : defaultOpts;\n        this.elementCB = elementCB !== null && elementCB !== void 0 ? elementCB : null;\n    }\n    DomHandler.prototype.onparserinit = function (parser) {\n        this.parser = parser;\n    };\n    // Resets the handler back to starting state\n    DomHandler.prototype.onreset = function () {\n        this.dom = [];\n        this.root = new node_1.Document(this.dom);\n        this.done = false;\n        this.tagStack = [this.root];\n        this.lastNode = null;\n        this.parser = null;\n    };\n    // Signals the handler that parsing is done\n    DomHandler.prototype.onend = function () {\n        if (this.done)\n            return;\n        this.done = true;\n        this.parser = null;\n        this.handleCallback(null);\n    };\n    DomHandler.prototype.onerror = function (error) {\n        this.handleCallback(error);\n    };\n    DomHandler.prototype.onclosetag = function () {\n        this.lastNode = null;\n        var elem = this.tagStack.pop();\n        if (this.options.withEndIndices) {\n            elem.endIndex = this.parser.endIndex;\n        }\n        if (this.elementCB)\n            this.elementCB(elem);\n    };\n    DomHandler.prototype.onopentag = function (name, attribs) {\n        var type = this.options.xmlMode ? domelementtype_1.ElementType.Tag : undefined;\n        var element = new node_1.Element(name, attribs, undefined, type);\n        this.addNode(element);\n        this.tagStack.push(element);\n    };\n    DomHandler.prototype.ontext = function (data) {\n        var normalizeWhitespace = this.options.normalizeWhitespace;\n        var lastNode = this.lastNode;\n        if (lastNode && lastNode.type === domelementtype_1.ElementType.Text) {\n            if (normalizeWhitespace) {\n                lastNode.data = (lastNode.data + data).replace(reWhitespace, \" \");\n            }\n            else {\n                lastNode.data += data;\n            }\n            if (this.options.withEndIndices) {\n                lastNode.endIndex = this.parser.endIndex;\n            }\n        }\n        else {\n            if (normalizeWhitespace) {\n                data = data.replace(reWhitespace, \" \");\n            }\n            var node = new node_1.Text(data);\n            this.addNode(node);\n            this.lastNode = node;\n        }\n    };\n    DomHandler.prototype.oncomment = function (data) {\n        if (this.lastNode && this.lastNode.type === domelementtype_1.ElementType.Comment) {\n            this.lastNode.data += data;\n            return;\n        }\n        var node = new node_1.Comment(data);\n        this.addNode(node);\n        this.lastNode = node;\n    };\n    DomHandler.prototype.oncommentend = function () {\n        this.lastNode = null;\n    };\n    DomHandler.prototype.oncdatastart = function () {\n        var text = new node_1.Text(\"\");\n        var node = new node_1.NodeWithChildren(domelementtype_1.ElementType.CDATA, [text]);\n        this.addNode(node);\n        text.parent = node;\n        this.lastNode = text;\n    };\n    DomHandler.prototype.oncdataend = function () {\n        this.lastNode = null;\n    };\n    DomHandler.prototype.onprocessinginstruction = function (name, data) {\n        var node = new node_1.ProcessingInstruction(name, data);\n        this.addNode(node);\n    };\n    DomHandler.prototype.handleCallback = function (error) {\n        if (typeof this.callback === \"function\") {\n            this.callback(error, this.dom);\n        }\n        else if (error) {\n            throw error;\n        }\n    };\n    DomHandler.prototype.addNode = function (node) {\n        var parent = this.tagStack[this.tagStack.length - 1];\n        var previousSibling = parent.children[parent.children.length - 1];\n        if (this.options.withStartIndices) {\n            node.startIndex = this.parser.startIndex;\n        }\n        if (this.options.withEndIndices) {\n            node.endIndex = this.parser.endIndex;\n        }\n        parent.children.push(node);\n        if (previousSibling) {\n            node.prev = previousSibling;\n            previousSibling.next = node;\n        }\n        node.parent = parent;\n        this.lastNode = null;\n    };\n    return DomHandler;\n}());\nexports.DomHandler = DomHandler;\nexports.default = DomHandler;\n","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    return function (d, b) {\n        if (typeof b !== \"function\" && b !== null)\n            throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nvar __assign = (this && this.__assign) || function () {\n    __assign = Object.assign || function(t) {\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n                t[p] = s[p];\n        }\n        return t;\n    };\n    return __assign.apply(this, arguments);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.cloneNode = exports.hasChildren = exports.isDocument = exports.isDirective = exports.isComment = exports.isText = exports.isCDATA = exports.isTag = exports.Element = exports.Document = exports.NodeWithChildren = exports.ProcessingInstruction = exports.Comment = exports.Text = exports.DataNode = exports.Node = void 0;\nvar domelementtype_1 = require(\"domelementtype\");\nvar nodeTypes = new Map([\n    [domelementtype_1.ElementType.Tag, 1],\n    [domelementtype_1.ElementType.Script, 1],\n    [domelementtype_1.ElementType.Style, 1],\n    [domelementtype_1.ElementType.Directive, 1],\n    [domelementtype_1.ElementType.Text, 3],\n    [domelementtype_1.ElementType.CDATA, 4],\n    [domelementtype_1.ElementType.Comment, 8],\n    [domelementtype_1.ElementType.Root, 9],\n]);\n/**\n * This object will be used as the prototype for Nodes when creating a\n * DOM-Level-1-compliant structure.\n */\nvar Node = /** @class */ (function () {\n    /**\n     *\n     * @param type The type of the node.\n     */\n    function Node(type) {\n        this.type = type;\n        /** Parent of the node */\n        this.parent = null;\n        /** Previous sibling */\n        this.prev = null;\n        /** Next sibling */\n        this.next = null;\n        /** The start index of the node. Requires `withStartIndices` on the handler to be `true. */\n        this.startIndex = null;\n        /** The end index of the node. Requires `withEndIndices` on the handler to be `true. */\n        this.endIndex = null;\n    }\n    Object.defineProperty(Node.prototype, \"nodeType\", {\n        // Read-only aliases\n        /**\n         * [DOM spec](https://dom.spec.whatwg.org/#dom-node-nodetype)-compatible\n         * node {@link type}.\n         */\n        get: function () {\n            var _a;\n            return (_a = nodeTypes.get(this.type)) !== null && _a !== void 0 ? _a : 1;\n        },\n        enumerable: false,\n        configurable: true\n    });\n    Object.defineProperty(Node.prototype, \"parentNode\", {\n        // Read-write aliases for properties\n        /**\n         * Same as {@link parent}.\n         * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n         */\n        get: function () {\n            return this.parent;\n        },\n        set: function (parent) {\n            this.parent = parent;\n        },\n        enumerable: false,\n        configurable: true\n    });\n    Object.defineProperty(Node.prototype, \"previousSibling\", {\n        /**\n         * Same as {@link prev}.\n         * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n         */\n        get: function () {\n            return this.prev;\n        },\n        set: function (prev) {\n            this.prev = prev;\n        },\n        enumerable: false,\n        configurable: true\n    });\n    Object.defineProperty(Node.prototype, \"nextSibling\", {\n        /**\n         * Same as {@link next}.\n         * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n         */\n        get: function () {\n            return this.next;\n        },\n        set: function (next) {\n            this.next = next;\n        },\n        enumerable: false,\n        configurable: true\n    });\n    /**\n     * Clone this node, and optionally its children.\n     *\n     * @param recursive Clone child nodes as well.\n     * @returns A clone of the node.\n     */\n    Node.prototype.cloneNode = function (recursive) {\n        if (recursive === void 0) { recursive = false; }\n        return cloneNode(this, recursive);\n    };\n    return Node;\n}());\nexports.Node = Node;\n/**\n * A node that contains some data.\n */\nvar DataNode = /** @class */ (function (_super) {\n    __extends(DataNode, _super);\n    /**\n     * @param type The type of the node\n     * @param data The content of the data node\n     */\n    function DataNode(type, data) {\n        var _this = _super.call(this, type) || this;\n        _this.data = data;\n        return _this;\n    }\n    Object.defineProperty(DataNode.prototype, \"nodeValue\", {\n        /**\n         * Same as {@link data}.\n         * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n         */\n        get: function () {\n            return this.data;\n        },\n        set: function (data) {\n            this.data = data;\n        },\n        enumerable: false,\n        configurable: true\n    });\n    return DataNode;\n}(Node));\nexports.DataNode = DataNode;\n/**\n * Text within the document.\n */\nvar Text = /** @class */ (function (_super) {\n    __extends(Text, _super);\n    function Text(data) {\n        return _super.call(this, domelementtype_1.ElementType.Text, data) || this;\n    }\n    return Text;\n}(DataNode));\nexports.Text = Text;\n/**\n * Comments within the document.\n */\nvar Comment = /** @class */ (function (_super) {\n    __extends(Comment, _super);\n    function Comment(data) {\n        return _super.call(this, domelementtype_1.ElementType.Comment, data) || this;\n    }\n    return Comment;\n}(DataNode));\nexports.Comment = Comment;\n/**\n * Processing instructions, including doc types.\n */\nvar ProcessingInstruction = /** @class */ (function (_super) {\n    __extends(ProcessingInstruction, _super);\n    function ProcessingInstruction(name, data) {\n        var _this = _super.call(this, domelementtype_1.ElementType.Directive, data) || this;\n        _this.name = name;\n        return _this;\n    }\n    return ProcessingInstruction;\n}(DataNode));\nexports.ProcessingInstruction = ProcessingInstruction;\n/**\n * A `Node` that can have children.\n */\nvar NodeWithChildren = /** @class */ (function (_super) {\n    __extends(NodeWithChildren, _super);\n    /**\n     * @param type Type of the node.\n     * @param children Children of the node. Only certain node types can have children.\n     */\n    function NodeWithChildren(type, children) {\n        var _this = _super.call(this, type) || this;\n        _this.children = children;\n        return _this;\n    }\n    Object.defineProperty(NodeWithChildren.prototype, \"firstChild\", {\n        // Aliases\n        /** First child of the node. */\n        get: function () {\n            var _a;\n            return (_a = this.children[0]) !== null && _a !== void 0 ? _a : null;\n        },\n        enumerable: false,\n        configurable: true\n    });\n    Object.defineProperty(NodeWithChildren.prototype, \"lastChild\", {\n        /** Last child of the node. */\n        get: function () {\n            return this.children.length > 0\n                ? this.children[this.children.length - 1]\n                : null;\n        },\n        enumerable: false,\n        configurable: true\n    });\n    Object.defineProperty(NodeWithChildren.prototype, \"childNodes\", {\n        /**\n         * Same as {@link children}.\n         * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n         */\n        get: function () {\n            return this.children;\n        },\n        set: function (children) {\n            this.children = children;\n        },\n        enumerable: false,\n        configurable: true\n    });\n    return NodeWithChildren;\n}(Node));\nexports.NodeWithChildren = NodeWithChildren;\n/**\n * The root node of the document.\n */\nvar Document = /** @class */ (function (_super) {\n    __extends(Document, _super);\n    function Document(children) {\n        return _super.call(this, domelementtype_1.ElementType.Root, children) || this;\n    }\n    return Document;\n}(NodeWithChildren));\nexports.Document = Document;\n/**\n * An element within the DOM.\n */\nvar Element = /** @class */ (function (_super) {\n    __extends(Element, _super);\n    /**\n     * @param name Name of the tag, eg. `div`, `span`.\n     * @param attribs Object mapping attribute names to attribute values.\n     * @param children Children of the node.\n     */\n    function Element(name, attribs, children, type) {\n        if (children === void 0) { children = []; }\n        if (type === void 0) { type = name === \"script\"\n            ? domelementtype_1.ElementType.Script\n            : name === \"style\"\n                ? domelementtype_1.ElementType.Style\n                : domelementtype_1.ElementType.Tag; }\n        var _this = _super.call(this, type, children) || this;\n        _this.name = name;\n        _this.attribs = attribs;\n        return _this;\n    }\n    Object.defineProperty(Element.prototype, \"tagName\", {\n        // DOM Level 1 aliases\n        /**\n         * Same as {@link name}.\n         * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n         */\n        get: function () {\n            return this.name;\n        },\n        set: function (name) {\n            this.name = name;\n        },\n        enumerable: false,\n        configurable: true\n    });\n    Object.defineProperty(Element.prototype, \"attributes\", {\n        get: function () {\n            var _this = this;\n            return Object.keys(this.attribs).map(function (name) {\n                var _a, _b;\n                return ({\n                    name: name,\n                    value: _this.attribs[name],\n                    namespace: (_a = _this[\"x-attribsNamespace\"]) === null || _a === void 0 ? void 0 : _a[name],\n                    prefix: (_b = _this[\"x-attribsPrefix\"]) === null || _b === void 0 ? void 0 : _b[name],\n                });\n            });\n        },\n        enumerable: false,\n        configurable: true\n    });\n    return Element;\n}(NodeWithChildren));\nexports.Element = Element;\n/**\n * @param node Node to check.\n * @returns `true` if the node is a `Element`, `false` otherwise.\n */\nfunction isTag(node) {\n    return (0, domelementtype_1.isTag)(node);\n}\nexports.isTag = isTag;\n/**\n * @param node Node to check.\n * @returns `true` if the node has the type `CDATA`, `false` otherwise.\n */\nfunction isCDATA(node) {\n    return node.type === domelementtype_1.ElementType.CDATA;\n}\nexports.isCDATA = isCDATA;\n/**\n * @param node Node to check.\n * @returns `true` if the node has the type `Text`, `false` otherwise.\n */\nfunction isText(node) {\n    return node.type === domelementtype_1.ElementType.Text;\n}\nexports.isText = isText;\n/**\n * @param node Node to check.\n * @returns `true` if the node has the type `Comment`, `false` otherwise.\n */\nfunction isComment(node) {\n    return node.type === domelementtype_1.ElementType.Comment;\n}\nexports.isComment = isComment;\n/**\n * @param node Node to check.\n * @returns `true` if the node has the type `ProcessingInstruction`, `false` otherwise.\n */\nfunction isDirective(node) {\n    return node.type === domelementtype_1.ElementType.Directive;\n}\nexports.isDirective = isDirective;\n/**\n * @param node Node to check.\n * @returns `true` if the node has the type `ProcessingInstruction`, `false` otherwise.\n */\nfunction isDocument(node) {\n    return node.type === domelementtype_1.ElementType.Root;\n}\nexports.isDocument = isDocument;\n/**\n * @param node Node to check.\n * @returns `true` if the node is a `NodeWithChildren` (has children), `false` otherwise.\n */\nfunction hasChildren(node) {\n    return Object.prototype.hasOwnProperty.call(node, \"children\");\n}\nexports.hasChildren = hasChildren;\n/**\n * Clone a node, and optionally its children.\n *\n * @param recursive Clone child nodes as well.\n * @returns A clone of the node.\n */\nfunction cloneNode(node, recursive) {\n    if (recursive === void 0) { recursive = false; }\n    var result;\n    if (isText(node)) {\n        result = new Text(node.data);\n    }\n    else if (isComment(node)) {\n        result = new Comment(node.data);\n    }\n    else if (isTag(node)) {\n        var children = recursive ? cloneChildren(node.children) : [];\n        var clone_1 = new Element(node.name, __assign({}, node.attribs), children);\n        children.forEach(function (child) { return (child.parent = clone_1); });\n        if (node.namespace != null) {\n            clone_1.namespace = node.namespace;\n        }\n        if (node[\"x-attribsNamespace\"]) {\n            clone_1[\"x-attribsNamespace\"] = __assign({}, node[\"x-attribsNamespace\"]);\n        }\n        if (node[\"x-attribsPrefix\"]) {\n            clone_1[\"x-attribsPrefix\"] = __assign({}, node[\"x-attribsPrefix\"]);\n        }\n        result = clone_1;\n    }\n    else if (isCDATA(node)) {\n        var children = recursive ? cloneChildren(node.children) : [];\n        var clone_2 = new NodeWithChildren(domelementtype_1.ElementType.CDATA, children);\n        children.forEach(function (child) { return (child.parent = clone_2); });\n        result = clone_2;\n    }\n    else if (isDocument(node)) {\n        var children = recursive ? cloneChildren(node.children) : [];\n        var clone_3 = new Document(children);\n        children.forEach(function (child) { return (child.parent = clone_3); });\n        if (node[\"x-mode\"]) {\n            clone_3[\"x-mode\"] = node[\"x-mode\"];\n        }\n        result = clone_3;\n    }\n    else if (isDirective(node)) {\n        var instruction = new ProcessingInstruction(node.name, node.data);\n        if (node[\"x-name\"] != null) {\n            instruction[\"x-name\"] = node[\"x-name\"];\n            instruction[\"x-publicId\"] = node[\"x-publicId\"];\n            instruction[\"x-systemId\"] = node[\"x-systemId\"];\n        }\n        result = instruction;\n    }\n    else {\n        throw new Error(\"Not implemented yet: \".concat(node.type));\n    }\n    result.startIndex = node.startIndex;\n    result.endIndex = node.endIndex;\n    if (node.sourceCodeLocation != null) {\n        result.sourceCodeLocation = node.sourceCodeLocation;\n    }\n    return result;\n}\nexports.cloneNode = cloneNode;\nfunction cloneChildren(childs) {\n    var children = childs.map(function (child) { return cloneNode(child, true); });\n    for (var i = 1; i < children.length; i++) {\n        children[i].prev = children[i - 1];\n        children[i - 1].next = children[i];\n    }\n    return children;\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getFeed = void 0;\nvar stringify_1 = require(\"./stringify\");\nvar legacy_1 = require(\"./legacy\");\n/**\n * Get the feed object from the root of a DOM tree.\n *\n * @param doc - The DOM to to extract the feed from.\n * @returns The feed.\n */\nfunction getFeed(doc) {\n    var feedRoot = getOneElement(isValidFeed, doc);\n    return !feedRoot\n        ? null\n        : feedRoot.name === \"feed\"\n            ? getAtomFeed(feedRoot)\n            : getRssFeed(feedRoot);\n}\nexports.getFeed = getFeed;\n/**\n * Parse an Atom feed.\n *\n * @param feedRoot The root of the feed.\n * @returns The parsed feed.\n */\nfunction getAtomFeed(feedRoot) {\n    var _a;\n    var childs = feedRoot.children;\n    var feed = {\n        type: \"atom\",\n        items: (0, legacy_1.getElementsByTagName)(\"entry\", childs).map(function (item) {\n            var _a;\n            var children = item.children;\n            var entry = { media: getMediaElements(children) };\n            addConditionally(entry, \"id\", \"id\", children);\n            addConditionally(entry, \"title\", \"title\", children);\n            var href = (_a = getOneElement(\"link\", children)) === null || _a === void 0 ? void 0 : _a.attribs.href;\n            if (href) {\n                entry.link = href;\n            }\n            var description = fetch(\"summary\", children) || fetch(\"content\", children);\n            if (description) {\n                entry.description = description;\n            }\n            var pubDate = fetch(\"updated\", children);\n            if (pubDate) {\n                entry.pubDate = new Date(pubDate);\n            }\n            return entry;\n        }),\n    };\n    addConditionally(feed, \"id\", \"id\", childs);\n    addConditionally(feed, \"title\", \"title\", childs);\n    var href = (_a = getOneElement(\"link\", childs)) === null || _a === void 0 ? void 0 : _a.attribs.href;\n    if (href) {\n        feed.link = href;\n    }\n    addConditionally(feed, \"description\", \"subtitle\", childs);\n    var updated = fetch(\"updated\", childs);\n    if (updated) {\n        feed.updated = new Date(updated);\n    }\n    addConditionally(feed, \"author\", \"email\", childs, true);\n    return feed;\n}\n/**\n * Parse a RSS feed.\n *\n * @param feedRoot The root of the feed.\n * @returns The parsed feed.\n */\nfunction getRssFeed(feedRoot) {\n    var _a, _b;\n    var childs = (_b = (_a = getOneElement(\"channel\", feedRoot.children)) === null || _a === void 0 ? void 0 : _a.children) !== null && _b !== void 0 ? _b : [];\n    var feed = {\n        type: feedRoot.name.substr(0, 3),\n        id: \"\",\n        items: (0, legacy_1.getElementsByTagName)(\"item\", feedRoot.children).map(function (item) {\n            var children = item.children;\n            var entry = { media: getMediaElements(children) };\n            addConditionally(entry, \"id\", \"guid\", children);\n            addConditionally(entry, \"title\", \"title\", children);\n            addConditionally(entry, \"link\", \"link\", children);\n            addConditionally(entry, \"description\", \"description\", children);\n            var pubDate = fetch(\"pubDate\", children);\n            if (pubDate)\n                entry.pubDate = new Date(pubDate);\n            return entry;\n        }),\n    };\n    addConditionally(feed, \"title\", \"title\", childs);\n    addConditionally(feed, \"link\", \"link\", childs);\n    addConditionally(feed, \"description\", \"description\", childs);\n    var updated = fetch(\"lastBuildDate\", childs);\n    if (updated) {\n        feed.updated = new Date(updated);\n    }\n    addConditionally(feed, \"author\", \"managingEditor\", childs, true);\n    return feed;\n}\nvar MEDIA_KEYS_STRING = [\"url\", \"type\", \"lang\"];\nvar MEDIA_KEYS_INT = [\n    \"fileSize\",\n    \"bitrate\",\n    \"framerate\",\n    \"samplingrate\",\n    \"channels\",\n    \"duration\",\n    \"height\",\n    \"width\",\n];\n/**\n * Get all media elements of a feed item.\n *\n * @param where Nodes to search in.\n * @returns Media elements.\n */\nfunction getMediaElements(where) {\n    return (0, legacy_1.getElementsByTagName)(\"media:content\", where).map(function (elem) {\n        var attribs = elem.attribs;\n        var media = {\n            medium: attribs.medium,\n            isDefault: !!attribs.isDefault,\n        };\n        for (var _i = 0, MEDIA_KEYS_STRING_1 = MEDIA_KEYS_STRING; _i < MEDIA_KEYS_STRING_1.length; _i++) {\n            var attrib = MEDIA_KEYS_STRING_1[_i];\n            if (attribs[attrib]) {\n                media[attrib] = attribs[attrib];\n            }\n        }\n        for (var _a = 0, MEDIA_KEYS_INT_1 = MEDIA_KEYS_INT; _a < MEDIA_KEYS_INT_1.length; _a++) {\n            var attrib = MEDIA_KEYS_INT_1[_a];\n            if (attribs[attrib]) {\n                media[attrib] = parseInt(attribs[attrib], 10);\n            }\n        }\n        if (attribs.expression) {\n            media.expression =\n                attribs.expression;\n        }\n        return media;\n    });\n}\n/**\n * Get one element by tag name.\n *\n * @param tagName Tag name to look for\n * @param node Node to search in\n * @returns The element or null\n */\nfunction getOneElement(tagName, node) {\n    return (0, legacy_1.getElementsByTagName)(tagName, node, true, 1)[0];\n}\n/**\n * Get the text content of an element with a certain tag name.\n *\n * @param tagName Tag name to look for.\n * @param where  Node to search in.\n * @param recurse Whether to recurse into child nodes.\n * @returns The text content of the element.\n */\nfunction fetch(tagName, where, recurse) {\n    if (recurse === void 0) { recurse = false; }\n    return (0, stringify_1.textContent)((0, legacy_1.getElementsByTagName)(tagName, where, recurse, 1)).trim();\n}\n/**\n * Adds a property to an object if it has a value.\n *\n * @param obj Object to be extended\n * @param prop Property name\n * @param tagName Tag name that contains the conditionally added property\n * @param where Element to search for the property\n * @param recurse Whether to recurse into child nodes.\n */\nfunction addConditionally(obj, prop, tagName, where, recurse) {\n    if (recurse === void 0) { recurse = false; }\n    var val = fetch(tagName, where, recurse);\n    if (val)\n        obj[prop] = val;\n}\n/**\n * Checks if an element is a feed root node.\n *\n * @param value The name of the element to check.\n * @returns Whether an element is a feed root node.\n */\nfunction isValidFeed(value) {\n    return value === \"rss\" || value === \"feed\" || value === \"rdf:RDF\";\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.uniqueSort = exports.compareDocumentPosition = exports.removeSubsets = void 0;\nvar domhandler_1 = require(\"domhandler\");\n/**\n * Given an array of nodes, remove any member that is contained by another.\n *\n * @param nodes Nodes to filter.\n * @returns Remaining nodes that aren't subtrees of each other.\n */\nfunction removeSubsets(nodes) {\n    var idx = nodes.length;\n    /*\n     * Check if each node (or one of its ancestors) is already contained in the\n     * array.\n     */\n    while (--idx >= 0) {\n        var node = nodes[idx];\n        /*\n         * Remove the node if it is not unique.\n         * We are going through the array from the end, so we only\n         * have to check nodes that preceed the node under consideration in the array.\n         */\n        if (idx > 0 && nodes.lastIndexOf(node, idx - 1) >= 0) {\n            nodes.splice(idx, 1);\n            continue;\n        }\n        for (var ancestor = node.parent; ancestor; ancestor = ancestor.parent) {\n            if (nodes.includes(ancestor)) {\n                nodes.splice(idx, 1);\n                break;\n            }\n        }\n    }\n    return nodes;\n}\nexports.removeSubsets = removeSubsets;\n/**\n * Compare the position of one node against another node in any other document.\n * The return value is a bitmask with the following values:\n *\n * Document order:\n * > There is an ordering, document order, defined on all the nodes in the\n * > document corresponding to the order in which the first character of the\n * > XML representation of each node occurs in the XML representation of the\n * > document after expansion of general entities. Thus, the document element\n * > node will be the first node. Element nodes occur before their children.\n * > Thus, document order orders element nodes in order of the occurrence of\n * > their start-tag in the XML (after expansion of entities). The attribute\n * > nodes of an element occur after the element and before its children. The\n * > relative order of attribute nodes is implementation-dependent./\n *\n * Source:\n * http://www.w3.org/TR/DOM-Level-3-Core/glossary.html#dt-document-order\n *\n * @param nodeA The first node to use in the comparison\n * @param nodeB The second node to use in the comparison\n * @returns A bitmask describing the input nodes' relative position.\n *\n * See http://dom.spec.whatwg.org/#dom-node-comparedocumentposition for\n * a description of these values.\n */\nfunction compareDocumentPosition(nodeA, nodeB) {\n    var aParents = [];\n    var bParents = [];\n    if (nodeA === nodeB) {\n        return 0;\n    }\n    var current = (0, domhandler_1.hasChildren)(nodeA) ? nodeA : nodeA.parent;\n    while (current) {\n        aParents.unshift(current);\n        current = current.parent;\n    }\n    current = (0, domhandler_1.hasChildren)(nodeB) ? nodeB : nodeB.parent;\n    while (current) {\n        bParents.unshift(current);\n        current = current.parent;\n    }\n    var maxIdx = Math.min(aParents.length, bParents.length);\n    var idx = 0;\n    while (idx < maxIdx && aParents[idx] === bParents[idx]) {\n        idx++;\n    }\n    if (idx === 0) {\n        return 1 /* DISCONNECTED */;\n    }\n    var sharedParent = aParents[idx - 1];\n    var siblings = sharedParent.children;\n    var aSibling = aParents[idx];\n    var bSibling = bParents[idx];\n    if (siblings.indexOf(aSibling) > siblings.indexOf(bSibling)) {\n        if (sharedParent === nodeB) {\n            return 4 /* FOLLOWING */ | 16 /* CONTAINED_BY */;\n        }\n        return 4 /* FOLLOWING */;\n    }\n    if (sharedParent === nodeA) {\n        return 2 /* PRECEDING */ | 8 /* CONTAINS */;\n    }\n    return 2 /* PRECEDING */;\n}\nexports.compareDocumentPosition = compareDocumentPosition;\n/**\n * Sort an array of nodes based on their relative position in the document and\n * remove any duplicate nodes. If the array contains nodes that do not belong\n * to the same document, sort order is unspecified.\n *\n * @param nodes Array of DOM nodes.\n * @returns Collection of unique nodes, sorted in document order.\n */\nfunction uniqueSort(nodes) {\n    nodes = nodes.filter(function (node, i, arr) { return !arr.includes(node, i + 1); });\n    nodes.sort(function (a, b) {\n        var relative = compareDocumentPosition(a, b);\n        if (relative & 2 /* PRECEDING */) {\n            return -1;\n        }\n        else if (relative & 4 /* FOLLOWING */) {\n            return 1;\n        }\n        return 0;\n    });\n    return nodes;\n}\nexports.uniqueSort = uniqueSort;\n","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n    if (k2 === undefined) k2 = k;\n    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n    if (k2 === undefined) k2 = k;\n    o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n    for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.hasChildren = exports.isDocument = exports.isComment = exports.isText = exports.isCDATA = exports.isTag = void 0;\n__exportStar(require(\"./stringify\"), exports);\n__exportStar(require(\"./traversal\"), exports);\n__exportStar(require(\"./manipulation\"), exports);\n__exportStar(require(\"./querying\"), exports);\n__exportStar(require(\"./legacy\"), exports);\n__exportStar(require(\"./helpers\"), exports);\n__exportStar(require(\"./feeds\"), exports);\n/** @deprecated Use these methods from `domhandler` directly. */\nvar domhandler_1 = require(\"domhandler\");\nObject.defineProperty(exports, \"isTag\", { enumerable: true, get: function () { return domhandler_1.isTag; } });\nObject.defineProperty(exports, \"isCDATA\", { enumerable: true, get: function () { return domhandler_1.isCDATA; } });\nObject.defineProperty(exports, \"isText\", { enumerable: true, get: function () { return domhandler_1.isText; } });\nObject.defineProperty(exports, \"isComment\", { enumerable: true, get: function () { return domhandler_1.isComment; } });\nObject.defineProperty(exports, \"isDocument\", { enumerable: true, get: function () { return domhandler_1.isDocument; } });\nObject.defineProperty(exports, \"hasChildren\", { enumerable: true, get: function () { return domhandler_1.hasChildren; } });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getElementsByTagType = exports.getElementsByTagName = exports.getElementById = exports.getElements = exports.testElement = void 0;\nvar domhandler_1 = require(\"domhandler\");\nvar querying_1 = require(\"./querying\");\nvar Checks = {\n    tag_name: function (name) {\n        if (typeof name === \"function\") {\n            return function (elem) { return (0, domhandler_1.isTag)(elem) && name(elem.name); };\n        }\n        else if (name === \"*\") {\n            return domhandler_1.isTag;\n        }\n        return function (elem) { return (0, domhandler_1.isTag)(elem) && elem.name === name; };\n    },\n    tag_type: function (type) {\n        if (typeof type === \"function\") {\n            return function (elem) { return type(elem.type); };\n        }\n        return function (elem) { return elem.type === type; };\n    },\n    tag_contains: function (data) {\n        if (typeof data === \"function\") {\n            return function (elem) { return (0, domhandler_1.isText)(elem) && data(elem.data); };\n        }\n        return function (elem) { return (0, domhandler_1.isText)(elem) && elem.data === data; };\n    },\n};\n/**\n * @param attrib Attribute to check.\n * @param value Attribute value to look for.\n * @returns A function to check whether the a node has an attribute with a particular value.\n */\nfunction getAttribCheck(attrib, value) {\n    if (typeof value === \"function\") {\n        return function (elem) { return (0, domhandler_1.isTag)(elem) && value(elem.attribs[attrib]); };\n    }\n    return function (elem) { return (0, domhandler_1.isTag)(elem) && elem.attribs[attrib] === value; };\n}\n/**\n * @param a First function to combine.\n * @param b Second function to combine.\n * @returns A function taking a node and returning `true` if either\n * of the input functions returns `true` for the node.\n */\nfunction combineFuncs(a, b) {\n    return function (elem) { return a(elem) || b(elem); };\n}\n/**\n * @param options An object describing nodes to look for.\n * @returns A function executing all checks in `options` and returning `true`\n * if any of them match a node.\n */\nfunction compileTest(options) {\n    var funcs = Object.keys(options).map(function (key) {\n        var value = options[key];\n        return Object.prototype.hasOwnProperty.call(Checks, key)\n            ? Checks[key](value)\n            : getAttribCheck(key, value);\n    });\n    return funcs.length === 0 ? null : funcs.reduce(combineFuncs);\n}\n/**\n * @param options An object describing nodes to look for.\n * @param node The element to test.\n * @returns Whether the element matches the description in `options`.\n */\nfunction testElement(options, node) {\n    var test = compileTest(options);\n    return test ? test(node) : true;\n}\nexports.testElement = testElement;\n/**\n * @param options An object describing nodes to look for.\n * @param nodes Nodes to search through.\n * @param recurse Also consider child nodes.\n * @param limit Maximum number of nodes to return.\n * @returns All nodes that match `options`.\n */\nfunction getElements(options, nodes, recurse, limit) {\n    if (limit === void 0) { limit = Infinity; }\n    var test = compileTest(options);\n    return test ? (0, querying_1.filter)(test, nodes, recurse, limit) : [];\n}\nexports.getElements = getElements;\n/**\n * @param id The unique ID attribute value to look for.\n * @param nodes Nodes to search through.\n * @param recurse Also consider child nodes.\n * @returns The node with the supplied ID.\n */\nfunction getElementById(id, nodes, recurse) {\n    if (recurse === void 0) { recurse = true; }\n    if (!Array.isArray(nodes))\n        nodes = [nodes];\n    return (0, querying_1.findOne)(getAttribCheck(\"id\", id), nodes, recurse);\n}\nexports.getElementById = getElementById;\n/**\n * @param tagName Tag name to search for.\n * @param nodes Nodes to search through.\n * @param recurse Also consider child nodes.\n * @param limit Maximum number of nodes to return.\n * @returns All nodes with the supplied `tagName`.\n */\nfunction getElementsByTagName(tagName, nodes, recurse, limit) {\n    if (recurse === void 0) { recurse = true; }\n    if (limit === void 0) { limit = Infinity; }\n    return (0, querying_1.filter)(Checks.tag_name(tagName), nodes, recurse, limit);\n}\nexports.getElementsByTagName = getElementsByTagName;\n/**\n * @param type Element type to look for.\n * @param nodes Nodes to search through.\n * @param recurse Also consider child nodes.\n * @param limit Maximum number of nodes to return.\n * @returns All nodes with the supplied `type`.\n */\nfunction getElementsByTagType(type, nodes, recurse, limit) {\n    if (recurse === void 0) { recurse = true; }\n    if (limit === void 0) { limit = Infinity; }\n    return (0, querying_1.filter)(Checks.tag_type(type), nodes, recurse, limit);\n}\nexports.getElementsByTagType = getElementsByTagType;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.prepend = exports.prependChild = exports.append = exports.appendChild = exports.replaceElement = exports.removeElement = void 0;\n/**\n * Remove an element from the dom\n *\n * @param elem The element to be removed\n */\nfunction removeElement(elem) {\n    if (elem.prev)\n        elem.prev.next = elem.next;\n    if (elem.next)\n        elem.next.prev = elem.prev;\n    if (elem.parent) {\n        var childs = elem.parent.children;\n        childs.splice(childs.lastIndexOf(elem), 1);\n    }\n}\nexports.removeElement = removeElement;\n/**\n * Replace an element in the dom\n *\n * @param elem The element to be replaced\n * @param replacement The element to be added\n */\nfunction replaceElement(elem, replacement) {\n    var prev = (replacement.prev = elem.prev);\n    if (prev) {\n        prev.next = replacement;\n    }\n    var next = (replacement.next = elem.next);\n    if (next) {\n        next.prev = replacement;\n    }\n    var parent = (replacement.parent = elem.parent);\n    if (parent) {\n        var childs = parent.children;\n        childs[childs.lastIndexOf(elem)] = replacement;\n    }\n}\nexports.replaceElement = replaceElement;\n/**\n * Append a child to an element.\n *\n * @param elem The element to append to.\n * @param child The element to be added as a child.\n */\nfunction appendChild(elem, child) {\n    removeElement(child);\n    child.next = null;\n    child.parent = elem;\n    if (elem.children.push(child) > 1) {\n        var sibling = elem.children[elem.children.length - 2];\n        sibling.next = child;\n        child.prev = sibling;\n    }\n    else {\n        child.prev = null;\n    }\n}\nexports.appendChild = appendChild;\n/**\n * Append an element after another.\n *\n * @param elem The element to append after.\n * @param next The element be added.\n */\nfunction append(elem, next) {\n    removeElement(next);\n    var parent = elem.parent;\n    var currNext = elem.next;\n    next.next = currNext;\n    next.prev = elem;\n    elem.next = next;\n    next.parent = parent;\n    if (currNext) {\n        currNext.prev = next;\n        if (parent) {\n            var childs = parent.children;\n            childs.splice(childs.lastIndexOf(currNext), 0, next);\n        }\n    }\n    else if (parent) {\n        parent.children.push(next);\n    }\n}\nexports.append = append;\n/**\n * Prepend a child to an element.\n *\n * @param elem The element to prepend before.\n * @param child The element to be added as a child.\n */\nfunction prependChild(elem, child) {\n    removeElement(child);\n    child.parent = elem;\n    child.prev = null;\n    if (elem.children.unshift(child) !== 1) {\n        var sibling = elem.children[1];\n        sibling.prev = child;\n        child.next = sibling;\n    }\n    else {\n        child.next = null;\n    }\n}\nexports.prependChild = prependChild;\n/**\n * Prepend an element before another.\n *\n * @param elem The element to prepend before.\n * @param prev The element be added.\n */\nfunction prepend(elem, prev) {\n    removeElement(prev);\n    var parent = elem.parent;\n    if (parent) {\n        var childs = parent.children;\n        childs.splice(childs.indexOf(elem), 0, prev);\n    }\n    if (elem.prev) {\n        elem.prev.next = prev;\n    }\n    prev.parent = parent;\n    prev.prev = elem.prev;\n    prev.next = elem;\n    elem.prev = prev;\n}\nexports.prepend = prepend;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.findAll = exports.existsOne = exports.findOne = exports.findOneChild = exports.find = exports.filter = void 0;\nvar domhandler_1 = require(\"domhandler\");\n/**\n * Search a node and its children for nodes passing a test function.\n *\n * @param test Function to test nodes on.\n * @param node Node to search. Will be included in the result set if it matches.\n * @param recurse Also consider child nodes.\n * @param limit Maximum number of nodes to return.\n * @returns All nodes passing `test`.\n */\nfunction filter(test, node, recurse, limit) {\n    if (recurse === void 0) { recurse = true; }\n    if (limit === void 0) { limit = Infinity; }\n    if (!Array.isArray(node))\n        node = [node];\n    return find(test, node, recurse, limit);\n}\nexports.filter = filter;\n/**\n * Search an array of node and its children for nodes passing a test function.\n *\n * @param test Function to test nodes on.\n * @param nodes Array of nodes to search.\n * @param recurse Also consider child nodes.\n * @param limit Maximum number of nodes to return.\n * @returns All nodes passing `test`.\n */\nfunction find(test, nodes, recurse, limit) {\n    var result = [];\n    for (var _i = 0, nodes_1 = nodes; _i < nodes_1.length; _i++) {\n        var elem = nodes_1[_i];\n        if (test(elem)) {\n            result.push(elem);\n            if (--limit <= 0)\n                break;\n        }\n        if (recurse && (0, domhandler_1.hasChildren)(elem) && elem.children.length > 0) {\n            var children = find(test, elem.children, recurse, limit);\n            result.push.apply(result, children);\n            limit -= children.length;\n            if (limit <= 0)\n                break;\n        }\n    }\n    return result;\n}\nexports.find = find;\n/**\n * Finds the first element inside of an array that matches a test function.\n *\n * @param test Function to test nodes on.\n * @param nodes Array of nodes to search.\n * @returns The first node in the array that passes `test`.\n */\nfunction findOneChild(test, nodes) {\n    return nodes.find(test);\n}\nexports.findOneChild = findOneChild;\n/**\n * Finds one element in a tree that passes a test.\n *\n * @param test Function to test nodes on.\n * @param nodes Array of nodes to search.\n * @param recurse Also consider child nodes.\n * @returns The first child node that passes `test`.\n */\nfunction findOne(test, nodes, recurse) {\n    if (recurse === void 0) { recurse = true; }\n    var elem = null;\n    for (var i = 0; i < nodes.length && !elem; i++) {\n        var checked = nodes[i];\n        if (!(0, domhandler_1.isTag)(checked)) {\n            continue;\n        }\n        else if (test(checked)) {\n            elem = checked;\n        }\n        else if (recurse && checked.children.length > 0) {\n            elem = findOne(test, checked.children);\n        }\n    }\n    return elem;\n}\nexports.findOne = findOne;\n/**\n * @param test Function to test nodes on.\n * @param nodes Array of nodes to search.\n * @returns Whether a tree of nodes contains at least one node passing a test.\n */\nfunction existsOne(test, nodes) {\n    return nodes.some(function (checked) {\n        return (0, domhandler_1.isTag)(checked) &&\n            (test(checked) ||\n                (checked.children.length > 0 &&\n                    existsOne(test, checked.children)));\n    });\n}\nexports.existsOne = existsOne;\n/**\n * Search and array of nodes and its children for nodes passing a test function.\n *\n * Same as `find`, only with less options, leading to reduced complexity.\n *\n * @param test Function to test nodes on.\n * @param nodes Array of nodes to search.\n * @returns All nodes passing `test`.\n */\nfunction findAll(test, nodes) {\n    var _a;\n    var result = [];\n    var stack = nodes.filter(domhandler_1.isTag);\n    var elem;\n    while ((elem = stack.shift())) {\n        var children = (_a = elem.children) === null || _a === void 0 ? void 0 : _a.filter(domhandler_1.isTag);\n        if (children && children.length > 0) {\n            stack.unshift.apply(stack, children);\n        }\n        if (test(elem))\n            result.push(elem);\n    }\n    return result;\n}\nexports.findAll = findAll;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.innerText = exports.textContent = exports.getText = exports.getInnerHTML = exports.getOuterHTML = void 0;\nvar domhandler_1 = require(\"domhandler\");\nvar dom_serializer_1 = __importDefault(require(\"dom-serializer\"));\nvar domelementtype_1 = require(\"domelementtype\");\n/**\n * @param node Node to get the outer HTML of.\n * @param options Options for serialization.\n * @deprecated Use the `dom-serializer` module directly.\n * @returns `node`'s outer HTML.\n */\nfunction getOuterHTML(node, options) {\n    return (0, dom_serializer_1.default)(node, options);\n}\nexports.getOuterHTML = getOuterHTML;\n/**\n * @param node Node to get the inner HTML of.\n * @param options Options for serialization.\n * @deprecated Use the `dom-serializer` module directly.\n * @returns `node`'s inner HTML.\n */\nfunction getInnerHTML(node, options) {\n    return (0, domhandler_1.hasChildren)(node)\n        ? node.children.map(function (node) { return getOuterHTML(node, options); }).join(\"\")\n        : \"\";\n}\nexports.getInnerHTML = getInnerHTML;\n/**\n * Get a node's inner text. Same as `textContent`, but inserts newlines for `<br>` tags.\n *\n * @deprecated Use `textContent` instead.\n * @param node Node to get the inner text of.\n * @returns `node`'s inner text.\n */\nfunction getText(node) {\n    if (Array.isArray(node))\n        return node.map(getText).join(\"\");\n    if ((0, domhandler_1.isTag)(node))\n        return node.name === \"br\" ? \"\\n\" : getText(node.children);\n    if ((0, domhandler_1.isCDATA)(node))\n        return getText(node.children);\n    if ((0, domhandler_1.isText)(node))\n        return node.data;\n    return \"\";\n}\nexports.getText = getText;\n/**\n * Get a node's text content.\n *\n * @param node Node to get the text content of.\n * @returns `node`'s text content.\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent}\n */\nfunction textContent(node) {\n    if (Array.isArray(node))\n        return node.map(textContent).join(\"\");\n    if ((0, domhandler_1.hasChildren)(node) && !(0, domhandler_1.isComment)(node)) {\n        return textContent(node.children);\n    }\n    if ((0, domhandler_1.isText)(node))\n        return node.data;\n    return \"\";\n}\nexports.textContent = textContent;\n/**\n * Get a node's inner text.\n *\n * @param node Node to get the inner text of.\n * @returns `node`'s inner text.\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Node/innerText}\n */\nfunction innerText(node) {\n    if (Array.isArray(node))\n        return node.map(innerText).join(\"\");\n    if ((0, domhandler_1.hasChildren)(node) && (node.type === domelementtype_1.ElementType.Tag || (0, domhandler_1.isCDATA)(node))) {\n        return innerText(node.children);\n    }\n    if ((0, domhandler_1.isText)(node))\n        return node.data;\n    return \"\";\n}\nexports.innerText = innerText;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.prevElementSibling = exports.nextElementSibling = exports.getName = exports.hasAttrib = exports.getAttributeValue = exports.getSiblings = exports.getParent = exports.getChildren = void 0;\nvar domhandler_1 = require(\"domhandler\");\nvar emptyArray = [];\n/**\n * Get a node's children.\n *\n * @param elem Node to get the children of.\n * @returns `elem`'s children, or an empty array.\n */\nfunction getChildren(elem) {\n    var _a;\n    return (_a = elem.children) !== null && _a !== void 0 ? _a : emptyArray;\n}\nexports.getChildren = getChildren;\n/**\n * Get a node's parent.\n *\n * @param elem Node to get the parent of.\n * @returns `elem`'s parent node.\n */\nfunction getParent(elem) {\n    return elem.parent || null;\n}\nexports.getParent = getParent;\n/**\n * Gets an elements siblings, including the element itself.\n *\n * Attempts to get the children through the element's parent first.\n * If we don't have a parent (the element is a root node),\n * we walk the element's `prev` & `next` to get all remaining nodes.\n *\n * @param elem Element to get the siblings of.\n * @returns `elem`'s siblings.\n */\nfunction getSiblings(elem) {\n    var _a, _b;\n    var parent = getParent(elem);\n    if (parent != null)\n        return getChildren(parent);\n    var siblings = [elem];\n    var prev = elem.prev, next = elem.next;\n    while (prev != null) {\n        siblings.unshift(prev);\n        (_a = prev, prev = _a.prev);\n    }\n    while (next != null) {\n        siblings.push(next);\n        (_b = next, next = _b.next);\n    }\n    return siblings;\n}\nexports.getSiblings = getSiblings;\n/**\n * Gets an attribute from an element.\n *\n * @param elem Element to check.\n * @param name Attribute name to retrieve.\n * @returns The element's attribute value, or `undefined`.\n */\nfunction getAttributeValue(elem, name) {\n    var _a;\n    return (_a = elem.attribs) === null || _a === void 0 ? void 0 : _a[name];\n}\nexports.getAttributeValue = getAttributeValue;\n/**\n * Checks whether an element has an attribute.\n *\n * @param elem Element to check.\n * @param name Attribute name to look for.\n * @returns Returns whether `elem` has the attribute `name`.\n */\nfunction hasAttrib(elem, name) {\n    return (elem.attribs != null &&\n        Object.prototype.hasOwnProperty.call(elem.attribs, name) &&\n        elem.attribs[name] != null);\n}\nexports.hasAttrib = hasAttrib;\n/**\n * Get the tag name of an element.\n *\n * @param elem The element to get the name for.\n * @returns The tag name of `elem`.\n */\nfunction getName(elem) {\n    return elem.name;\n}\nexports.getName = getName;\n/**\n * Returns the next element sibling of a node.\n *\n * @param elem The element to get the next sibling of.\n * @returns `elem`'s next sibling that is a tag.\n */\nfunction nextElementSibling(elem) {\n    var _a;\n    var next = elem.next;\n    while (next !== null && !(0, domhandler_1.isTag)(next))\n        (_a = next, next = _a.next);\n    return next;\n}\nexports.nextElementSibling = nextElementSibling;\n/**\n * Returns the previous element sibling of a node.\n *\n * @param elem The element to get the previous sibling of.\n * @returns `elem`'s previous sibling that is a tag.\n */\nfunction prevElementSibling(elem) {\n    var _a;\n    var prev = elem.prev;\n    while (prev !== null && !(0, domhandler_1.isTag)(prev))\n        (_a = prev, prev = _a.prev);\n    return prev;\n}\nexports.prevElementSibling = prevElementSibling;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.decodeHTML = exports.decodeHTMLStrict = exports.decodeXML = void 0;\nvar entities_json_1 = __importDefault(require(\"./maps/entities.json\"));\nvar legacy_json_1 = __importDefault(require(\"./maps/legacy.json\"));\nvar xml_json_1 = __importDefault(require(\"./maps/xml.json\"));\nvar decode_codepoint_1 = __importDefault(require(\"./decode_codepoint\"));\nvar strictEntityRe = /&(?:[a-zA-Z0-9]+|#[xX][\\da-fA-F]+|#\\d+);/g;\nexports.decodeXML = getStrictDecoder(xml_json_1.default);\nexports.decodeHTMLStrict = getStrictDecoder(entities_json_1.default);\nfunction getStrictDecoder(map) {\n    var replace = getReplacer(map);\n    return function (str) { return String(str).replace(strictEntityRe, replace); };\n}\nvar sorter = function (a, b) { return (a < b ? 1 : -1); };\nexports.decodeHTML = (function () {\n    var legacy = Object.keys(legacy_json_1.default).sort(sorter);\n    var keys = Object.keys(entities_json_1.default).sort(sorter);\n    for (var i = 0, j = 0; i < keys.length; i++) {\n        if (legacy[j] === keys[i]) {\n            keys[i] += \";?\";\n            j++;\n        }\n        else {\n            keys[i] += \";\";\n        }\n    }\n    var re = new RegExp(\"&(?:\" + keys.join(\"|\") + \"|#[xX][\\\\da-fA-F]+;?|#\\\\d+;?)\", \"g\");\n    var replace = getReplacer(entities_json_1.default);\n    function replacer(str) {\n        if (str.substr(-1) !== \";\")\n            str += \";\";\n        return replace(str);\n    }\n    // TODO consider creating a merged map\n    return function (str) { return String(str).replace(re, replacer); };\n})();\nfunction getReplacer(map) {\n    return function replace(str) {\n        if (str.charAt(1) === \"#\") {\n            var secondChar = str.charAt(2);\n            if (secondChar === \"X\" || secondChar === \"x\") {\n                return decode_codepoint_1.default(parseInt(str.substr(3), 16));\n            }\n            return decode_codepoint_1.default(parseInt(str.substr(2), 10));\n        }\n        // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n        return map[str.slice(1, -1)] || str;\n    };\n}\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar decode_json_1 = __importDefault(require(\"./maps/decode.json\"));\n// Adapted from https://github.com/mathiasbynens/he/blob/master/src/he.js#L94-L119\nvar fromCodePoint = \n// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\nString.fromCodePoint ||\n    function (codePoint) {\n        var output = \"\";\n        if (codePoint > 0xffff) {\n            codePoint -= 0x10000;\n            output += String.fromCharCode(((codePoint >>> 10) & 0x3ff) | 0xd800);\n            codePoint = 0xdc00 | (codePoint & 0x3ff);\n        }\n        output += String.fromCharCode(codePoint);\n        return output;\n    };\nfunction decodeCodePoint(codePoint) {\n    if ((codePoint >= 0xd800 && codePoint <= 0xdfff) || codePoint > 0x10ffff) {\n        return \"\\uFFFD\";\n    }\n    if (codePoint in decode_json_1.default) {\n        codePoint = decode_json_1.default[codePoint];\n    }\n    return fromCodePoint(codePoint);\n}\nexports.default = decodeCodePoint;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.escapeUTF8 = exports.escape = exports.encodeNonAsciiHTML = exports.encodeHTML = exports.encodeXML = void 0;\nvar xml_json_1 = __importDefault(require(\"./maps/xml.json\"));\nvar inverseXML = getInverseObj(xml_json_1.default);\nvar xmlReplacer = getInverseReplacer(inverseXML);\n/**\n * Encodes all non-ASCII characters, as well as characters not valid in XML\n * documents using XML entities.\n *\n * If a character has no equivalent entity, a\n * numeric hexadecimal reference (eg. `&#xfc;`) will be used.\n */\nexports.encodeXML = getASCIIEncoder(inverseXML);\nvar entities_json_1 = __importDefault(require(\"./maps/entities.json\"));\nvar inverseHTML = getInverseObj(entities_json_1.default);\nvar htmlReplacer = getInverseReplacer(inverseHTML);\n/**\n * Encodes all entities and non-ASCII characters in the input.\n *\n * This includes characters that are valid ASCII characters in HTML documents.\n * For example `#` will be encoded as `&num;`. To get a more compact output,\n * consider using the `encodeNonAsciiHTML` function.\n *\n * If a character has no equivalent entity, a\n * numeric hexadecimal reference (eg. `&#xfc;`) will be used.\n */\nexports.encodeHTML = getInverse(inverseHTML, htmlReplacer);\n/**\n * Encodes all non-ASCII characters, as well as characters not valid in HTML\n * documents using HTML entities.\n *\n * If a character has no equivalent entity, a\n * numeric hexadecimal reference (eg. `&#xfc;`) will be used.\n */\nexports.encodeNonAsciiHTML = getASCIIEncoder(inverseHTML);\nfunction getInverseObj(obj) {\n    return Object.keys(obj)\n        .sort()\n        .reduce(function (inverse, name) {\n        inverse[obj[name]] = \"&\" + name + \";\";\n        return inverse;\n    }, {});\n}\nfunction getInverseReplacer(inverse) {\n    var single = [];\n    var multiple = [];\n    for (var _i = 0, _a = Object.keys(inverse); _i < _a.length; _i++) {\n        var k = _a[_i];\n        if (k.length === 1) {\n            // Add value to single array\n            single.push(\"\\\\\" + k);\n        }\n        else {\n            // Add value to multiple array\n            multiple.push(k);\n        }\n    }\n    // Add ranges to single characters.\n    single.sort();\n    for (var start = 0; start < single.length - 1; start++) {\n        // Find the end of a run of characters\n        var end = start;\n        while (end < single.length - 1 &&\n            single[end].charCodeAt(1) + 1 === single[end + 1].charCodeAt(1)) {\n            end += 1;\n        }\n        var count = 1 + end - start;\n        // We want to replace at least three characters\n        if (count < 3)\n            continue;\n        single.splice(start, count, single[start] + \"-\" + single[end]);\n    }\n    multiple.unshift(\"[\" + single.join(\"\") + \"]\");\n    return new RegExp(multiple.join(\"|\"), \"g\");\n}\n// /[^\\0-\\x7F]/gu\nvar reNonASCII = /(?:[\\x80-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF])/g;\nvar getCodePoint = \n// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\nString.prototype.codePointAt != null\n    ? // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n        function (str) { return str.codePointAt(0); }\n    : // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n        function (c) {\n            return (c.charCodeAt(0) - 0xd800) * 0x400 +\n                c.charCodeAt(1) -\n                0xdc00 +\n                0x10000;\n        };\nfunction singleCharReplacer(c) {\n    return \"&#x\" + (c.length > 1 ? getCodePoint(c) : c.charCodeAt(0))\n        .toString(16)\n        .toUpperCase() + \";\";\n}\nfunction getInverse(inverse, re) {\n    return function (data) {\n        return data\n            .replace(re, function (name) { return inverse[name]; })\n            .replace(reNonASCII, singleCharReplacer);\n    };\n}\nvar reEscapeChars = new RegExp(xmlReplacer.source + \"|\" + reNonASCII.source, \"g\");\n/**\n * Encodes all non-ASCII characters, as well as characters not valid in XML\n * documents using numeric hexadecimal reference (eg. `&#xfc;`).\n *\n * Have a look at `escapeUTF8` if you want a more concise output at the expense\n * of reduced transportability.\n *\n * @param data String to escape.\n */\nfunction escape(data) {\n    return data.replace(reEscapeChars, singleCharReplacer);\n}\nexports.escape = escape;\n/**\n * Encodes all characters not valid in XML documents using numeric hexadecimal\n * reference (eg. `&#xfc;`).\n *\n * Note that the output will be character-set dependent.\n *\n * @param data String to escape.\n */\nfunction escapeUTF8(data) {\n    return data.replace(xmlReplacer, singleCharReplacer);\n}\nexports.escapeUTF8 = escapeUTF8;\nfunction getASCIIEncoder(obj) {\n    return function (data) {\n        return data.replace(reEscapeChars, function (c) { return obj[c] || singleCharReplacer(c); });\n    };\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.decodeXMLStrict = exports.decodeHTML5Strict = exports.decodeHTML4Strict = exports.decodeHTML5 = exports.decodeHTML4 = exports.decodeHTMLStrict = exports.decodeHTML = exports.decodeXML = exports.encodeHTML5 = exports.encodeHTML4 = exports.escapeUTF8 = exports.escape = exports.encodeNonAsciiHTML = exports.encodeHTML = exports.encodeXML = exports.encode = exports.decodeStrict = exports.decode = void 0;\nvar decode_1 = require(\"./decode\");\nvar encode_1 = require(\"./encode\");\n/**\n * Decodes a string with entities.\n *\n * @param data String to decode.\n * @param level Optional level to decode at. 0 = XML, 1 = HTML. Default is 0.\n * @deprecated Use `decodeXML` or `decodeHTML` directly.\n */\nfunction decode(data, level) {\n    return (!level || level <= 0 ? decode_1.decodeXML : decode_1.decodeHTML)(data);\n}\nexports.decode = decode;\n/**\n * Decodes a string with entities. Does not allow missing trailing semicolons for entities.\n *\n * @param data String to decode.\n * @param level Optional level to decode at. 0 = XML, 1 = HTML. Default is 0.\n * @deprecated Use `decodeHTMLStrict` or `decodeXML` directly.\n */\nfunction decodeStrict(data, level) {\n    return (!level || level <= 0 ? decode_1.decodeXML : decode_1.decodeHTMLStrict)(data);\n}\nexports.decodeStrict = decodeStrict;\n/**\n * Encodes a string with entities.\n *\n * @param data String to encode.\n * @param level Optional level to encode at. 0 = XML, 1 = HTML. Default is 0.\n * @deprecated Use `encodeHTML`, `encodeXML` or `encodeNonAsciiHTML` directly.\n */\nfunction encode(data, level) {\n    return (!level || level <= 0 ? encode_1.encodeXML : encode_1.encodeHTML)(data);\n}\nexports.encode = encode;\nvar encode_2 = require(\"./encode\");\nObject.defineProperty(exports, \"encodeXML\", { enumerable: true, get: function () { return encode_2.encodeXML; } });\nObject.defineProperty(exports, \"encodeHTML\", { enumerable: true, get: function () { return encode_2.encodeHTML; } });\nObject.defineProperty(exports, \"encodeNonAsciiHTML\", { enumerable: true, get: function () { return encode_2.encodeNonAsciiHTML; } });\nObject.defineProperty(exports, \"escape\", { enumerable: true, get: function () { return encode_2.escape; } });\nObject.defineProperty(exports, \"escapeUTF8\", { enumerable: true, get: function () { return encode_2.escapeUTF8; } });\n// Legacy aliases (deprecated)\nObject.defineProperty(exports, \"encodeHTML4\", { enumerable: true, get: function () { return encode_2.encodeHTML; } });\nObject.defineProperty(exports, \"encodeHTML5\", { enumerable: true, get: function () { return encode_2.encodeHTML; } });\nvar decode_2 = require(\"./decode\");\nObject.defineProperty(exports, \"decodeXML\", { enumerable: true, get: function () { return decode_2.decodeXML; } });\nObject.defineProperty(exports, \"decodeHTML\", { enumerable: true, get: function () { return decode_2.decodeHTML; } });\nObject.defineProperty(exports, \"decodeHTMLStrict\", { enumerable: true, get: function () { return decode_2.decodeHTMLStrict; } });\n// Legacy aliases (deprecated)\nObject.defineProperty(exports, \"decodeHTML4\", { enumerable: true, get: function () { return decode_2.decodeHTML; } });\nObject.defineProperty(exports, \"decodeHTML5\", { enumerable: true, get: function () { return decode_2.decodeHTML; } });\nObject.defineProperty(exports, \"decodeHTML4Strict\", { enumerable: true, get: function () { return decode_2.decodeHTMLStrict; } });\nObject.defineProperty(exports, \"decodeHTML5Strict\", { enumerable: true, get: function () { return decode_2.decodeHTMLStrict; } });\nObject.defineProperty(exports, \"decodeXMLStrict\", { enumerable: true, get: function () { return decode_2.decodeXML; } });\n","module.exports = tokenize\r\n\r\nvar literals100 = require('./lib/literals')\r\n  , operators = require('./lib/operators')\r\n  , builtins100 = require('./lib/builtins')\r\n  , literals300es = require('./lib/literals-300es')\r\n  , builtins300es = require('./lib/builtins-300es')\r\n\r\nvar NORMAL = 999          // <-- never emitted\r\n  , TOKEN = 9999          // <-- never emitted\r\n  , BLOCK_COMMENT = 0\r\n  , LINE_COMMENT = 1\r\n  , PREPROCESSOR = 2\r\n  , OPERATOR = 3\r\n  , INTEGER = 4\r\n  , FLOAT = 5\r\n  , IDENT = 6\r\n  , BUILTIN = 7\r\n  , KEYWORD = 8\r\n  , WHITESPACE = 9\r\n  , EOF = 10\r\n  , HEX = 11\r\n\r\nvar map = [\r\n    'block-comment'\r\n  , 'line-comment'\r\n  , 'preprocessor'\r\n  , 'operator'\r\n  , 'integer'\r\n  , 'float'\r\n  , 'ident'\r\n  , 'builtin'\r\n  , 'keyword'\r\n  , 'whitespace'\r\n  , 'eof'\r\n  , 'integer'\r\n]\r\n\r\nfunction tokenize(opt) {\r\n  var i = 0\r\n    , total = 0\r\n    , mode = NORMAL\r\n    , c\r\n    , last\r\n    , content = []\r\n    , tokens = []\r\n    , token_idx = 0\r\n    , token_offs = 0\r\n    , line = 1\r\n    , col = 0\r\n    , start = 0\r\n    , isnum = false\r\n    , isoperator = false\r\n    , input = ''\r\n    , len\r\n\r\n  opt = opt || {}\r\n  var allBuiltins = builtins100\r\n  var allLiterals = literals100\r\n  if (opt.version === '300 es') {\r\n    allBuiltins = builtins300es\r\n    allLiterals = literals300es\r\n  }\r\n\r\n  // cache by name\r\n  var builtinsDict = {}, literalsDict = {}\r\n  for (var i = 0; i < allBuiltins.length; i++) {\r\n    builtinsDict[allBuiltins[i]] = true\r\n  }\r\n  for (var i = 0; i < allLiterals.length; i++) {\r\n    literalsDict[allLiterals[i]] = true\r\n  }\r\n\r\n  return function(data) {\r\n    tokens = []\r\n    if (data !== null) return write(data)\r\n    return end()\r\n  }\r\n\r\n  function token(data) {\r\n    if (data.length) {\r\n      tokens.push({\r\n        type: map[mode]\r\n      , data: data\r\n      , position: start\r\n      , line: line\r\n      , column: col\r\n      })\r\n    }\r\n  }\r\n\r\n  function write(chunk) {\r\n    i = 0\r\n\r\n    if (chunk.toString) chunk = chunk.toString()\r\n\r\n    input += chunk.replace(/\\r\\n/g, '\\n')\r\n    len = input.length\r\n\r\n\r\n    var last\r\n\r\n    while(c = input[i], i < len) {\r\n      last = i\r\n\r\n      switch(mode) {\r\n        case BLOCK_COMMENT: i = block_comment(); break\r\n        case LINE_COMMENT: i = line_comment(); break\r\n        case PREPROCESSOR: i = preprocessor(); break\r\n        case OPERATOR: i = operator(); break\r\n        case INTEGER: i = integer(); break\r\n        case HEX: i = hex(); break\r\n        case FLOAT: i = decimal(); break\r\n        case TOKEN: i = readtoken(); break\r\n        case WHITESPACE: i = whitespace(); break\r\n        case NORMAL: i = normal(); break\r\n      }\r\n\r\n      if(last !== i) {\r\n        switch(input[last]) {\r\n          case '\\n': col = 0; ++line; break\r\n          default: ++col; break\r\n        }\r\n      }\r\n    }\r\n\r\n    total += i\r\n    input = input.slice(i)\r\n    return tokens\r\n  }\r\n\r\n  function end(chunk) {\r\n    if(content.length) {\r\n      token(content.join(''))\r\n    }\r\n\r\n    mode = EOF\r\n    token('(eof)')\r\n    return tokens\r\n  }\r\n\r\n  function normal() {\r\n    content = content.length ? [] : content\r\n\r\n    if(last === '/' && c === '*') {\r\n      start = total + i - 1\r\n      mode = BLOCK_COMMENT\r\n      last = c\r\n      return i + 1\r\n    }\r\n\r\n    if(last === '/' && c === '/') {\r\n      start = total + i - 1\r\n      mode = LINE_COMMENT\r\n      last = c\r\n      return i + 1\r\n    }\r\n\r\n    if(c === '#') {\r\n      mode = PREPROCESSOR\r\n      start = total + i\r\n      return i\r\n    }\r\n\r\n    if(/\\s/.test(c)) {\r\n      mode = WHITESPACE\r\n      start = total + i\r\n      return i\r\n    }\r\n\r\n    isnum = /\\d/.test(c)\r\n    isoperator = /[^\\w_]/.test(c)\r\n\r\n    start = total + i\r\n    mode = isnum ? INTEGER : isoperator ? OPERATOR : TOKEN\r\n    return i\r\n  }\r\n\r\n  function whitespace() {\r\n    if(/[^\\s]/g.test(c)) {\r\n      token(content.join(''))\r\n      mode = NORMAL\r\n      return i\r\n    }\r\n    content.push(c)\r\n    last = c\r\n    return i + 1\r\n  }\r\n\r\n  function preprocessor() {\r\n    if((c === '\\r' || c === '\\n') && last !== '\\\\') {\r\n      token(content.join(''))\r\n      mode = NORMAL\r\n      return i\r\n    }\r\n    content.push(c)\r\n    last = c\r\n    return i + 1\r\n  }\r\n\r\n  function line_comment() {\r\n    return preprocessor()\r\n  }\r\n\r\n  function block_comment() {\r\n    if(c === '/' && last === '*') {\r\n      content.push(c)\r\n      token(content.join(''))\r\n      mode = NORMAL\r\n      return i + 1\r\n    }\r\n\r\n    content.push(c)\r\n    last = c\r\n    return i + 1\r\n  }\r\n\r\n  function operator() {\r\n    if(last === '.' && /\\d/.test(c)) {\r\n      mode = FLOAT\r\n      return i\r\n    }\r\n\r\n    if(last === '/' && c === '*') {\r\n      mode = BLOCK_COMMENT\r\n      return i\r\n    }\r\n\r\n    if(last === '/' && c === '/') {\r\n      mode = LINE_COMMENT\r\n      return i\r\n    }\r\n\r\n    if(c === '.' && content.length) {\r\n      while(determine_operator(content));\r\n\r\n      mode = FLOAT\r\n      return i\r\n    }\r\n\r\n    if(c === ';' || c === ')' || c === '(') {\r\n      if(content.length) while(determine_operator(content));\r\n      token(c)\r\n      mode = NORMAL\r\n      return i + 1\r\n    }\r\n\r\n    var is_composite_operator = content.length === 2 && c !== '='\r\n    if(/[\\w_\\d\\s]/.test(c) || is_composite_operator) {\r\n      while(determine_operator(content));\r\n      mode = NORMAL\r\n      return i\r\n    }\r\n\r\n    content.push(c)\r\n    last = c\r\n    return i + 1\r\n  }\r\n\r\n  function determine_operator(buf) {\r\n    var j = 0\r\n      , idx\r\n      , res\r\n\r\n    do {\r\n      idx = operators.indexOf(buf.slice(0, buf.length + j).join(''))\r\n      res = operators[idx]\r\n\r\n      if(idx === -1) {\r\n        if(j-- + buf.length > 0) continue\r\n        res = buf.slice(0, 1).join('')\r\n      }\r\n\r\n      token(res)\r\n\r\n      start += res.length\r\n      content = content.slice(res.length)\r\n      return content.length\r\n    } while(1)\r\n  }\r\n\r\n  function hex() {\r\n    if(/[^a-fA-F0-9]/.test(c)) {\r\n      token(content.join(''))\r\n      mode = NORMAL\r\n      return i\r\n    }\r\n\r\n    content.push(c)\r\n    last = c\r\n    return i + 1\r\n  }\r\n\r\n  function integer() {\r\n    if(c === '.') {\r\n      content.push(c)\r\n      mode = FLOAT\r\n      last = c\r\n      return i + 1\r\n    }\r\n\r\n    if(/[eE]/.test(c)) {\r\n      content.push(c)\r\n      mode = FLOAT\r\n      last = c\r\n      return i + 1\r\n    }\r\n\r\n    if(c === 'x' && content.length === 1 && content[0] === '0') {\r\n      mode = HEX\r\n      content.push(c)\r\n      last = c\r\n      return i + 1\r\n    }\r\n\r\n    if(/[^\\d]/.test(c)) {\r\n      token(content.join(''))\r\n      mode = NORMAL\r\n      return i\r\n    }\r\n\r\n    content.push(c)\r\n    last = c\r\n    return i + 1\r\n  }\r\n\r\n  function decimal() {\r\n    if(c === 'f') {\r\n      content.push(c)\r\n      last = c\r\n      i += 1\r\n    }\r\n\r\n    if(/[eE]/.test(c)) {\r\n      content.push(c)\r\n      last = c\r\n      return i + 1\r\n    }\r\n\r\n    if ((c === '-' || c === '+') && /[eE]/.test(last)) {\r\n      content.push(c)\r\n      last = c\r\n      return i + 1\r\n    }\r\n\r\n    if(/[^\\d]/.test(c)) {\r\n      token(content.join(''))\r\n      mode = NORMAL\r\n      return i\r\n    }\r\n\r\n    content.push(c)\r\n    last = c\r\n    return i + 1\r\n  }\r\n\r\n  function readtoken() {\r\n    if(/[^\\d\\w_]/.test(c)) {\r\n      var contentstr = content.join('')\r\n      if(literalsDict[contentstr]) {\r\n        mode = KEYWORD\r\n      } else if(builtinsDict[contentstr]) {\r\n        mode = BUILTIN\r\n      } else {\r\n        mode = IDENT\r\n      }\r\n      token(content.join(''))\r\n      mode = NORMAL\r\n      return i\r\n    }\r\n    content.push(c)\r\n    last = c\r\n    return i + 1\r\n  }\r\n}\r\n","// 300es builtins/reserved words that were previously valid in v100\r\nvar v100 = require('./builtins')\r\n\r\n// The texture2D|Cube functions have been removed\r\n// And the gl_ features are updated\r\nv100 = v100.slice().filter(function (b) {\r\n  return !/^(gl\\_|texture)/.test(b)\r\n})\r\n\r\nmodule.exports = v100.concat([\r\n  // the updated gl_ constants\r\n    'gl_VertexID'\r\n  , 'gl_InstanceID'\r\n  , 'gl_Position'\r\n  , 'gl_PointSize'\r\n  , 'gl_FragCoord'\r\n  , 'gl_FrontFacing'\r\n  , 'gl_FragDepth'\r\n  , 'gl_PointCoord'\r\n  , 'gl_MaxVertexAttribs'\r\n  , 'gl_MaxVertexUniformVectors'\r\n  , 'gl_MaxVertexOutputVectors'\r\n  , 'gl_MaxFragmentInputVectors'\r\n  , 'gl_MaxVertexTextureImageUnits'\r\n  , 'gl_MaxCombinedTextureImageUnits'\r\n  , 'gl_MaxTextureImageUnits'\r\n  , 'gl_MaxFragmentUniformVectors'\r\n  , 'gl_MaxDrawBuffers'\r\n  , 'gl_MinProgramTexelOffset'\r\n  , 'gl_MaxProgramTexelOffset'\r\n  , 'gl_DepthRangeParameters'\r\n  , 'gl_DepthRange'\r\n\r\n  // other builtins\r\n  , 'trunc'\r\n  , 'round'\r\n  , 'roundEven'\r\n  , 'isnan'\r\n  , 'isinf'\r\n  , 'floatBitsToInt'\r\n  , 'floatBitsToUint'\r\n  , 'intBitsToFloat'\r\n  , 'uintBitsToFloat'\r\n  , 'packSnorm2x16'\r\n  , 'unpackSnorm2x16'\r\n  , 'packUnorm2x16'\r\n  , 'unpackUnorm2x16'\r\n  , 'packHalf2x16'\r\n  , 'unpackHalf2x16'\r\n  , 'outerProduct'\r\n  , 'transpose'\r\n  , 'determinant'\r\n  , 'inverse'\r\n  , 'texture'\r\n  , 'textureSize'\r\n  , 'textureProj'\r\n  , 'textureLod'\r\n  , 'textureOffset'\r\n  , 'texelFetch'\r\n  , 'texelFetchOffset'\r\n  , 'textureProjOffset'\r\n  , 'textureLodOffset'\r\n  , 'textureProjLod'\r\n  , 'textureProjLodOffset'\r\n  , 'textureGrad'\r\n  , 'textureGradOffset'\r\n  , 'textureProjGrad'\r\n  , 'textureProjGradOffset'\r\n])\r\n","module.exports = [\r\n  // Keep this list sorted\r\n  'abs'\r\n  , 'acos'\r\n  , 'all'\r\n  , 'any'\r\n  , 'asin'\r\n  , 'atan'\r\n  , 'ceil'\r\n  , 'clamp'\r\n  , 'cos'\r\n  , 'cross'\r\n  , 'dFdx'\r\n  , 'dFdy'\r\n  , 'degrees'\r\n  , 'distance'\r\n  , 'dot'\r\n  , 'equal'\r\n  , 'exp'\r\n  , 'exp2'\r\n  , 'faceforward'\r\n  , 'floor'\r\n  , 'fract'\r\n  , 'gl_BackColor'\r\n  , 'gl_BackLightModelProduct'\r\n  , 'gl_BackLightProduct'\r\n  , 'gl_BackMaterial'\r\n  , 'gl_BackSecondaryColor'\r\n  , 'gl_ClipPlane'\r\n  , 'gl_ClipVertex'\r\n  , 'gl_Color'\r\n  , 'gl_DepthRange'\r\n  , 'gl_DepthRangeParameters'\r\n  , 'gl_EyePlaneQ'\r\n  , 'gl_EyePlaneR'\r\n  , 'gl_EyePlaneS'\r\n  , 'gl_EyePlaneT'\r\n  , 'gl_Fog'\r\n  , 'gl_FogCoord'\r\n  , 'gl_FogFragCoord'\r\n  , 'gl_FogParameters'\r\n  , 'gl_FragColor'\r\n  , 'gl_FragCoord'\r\n  , 'gl_FragData'\r\n  , 'gl_FragDepth'\r\n  , 'gl_FragDepthEXT'\r\n  , 'gl_FrontColor'\r\n  , 'gl_FrontFacing'\r\n  , 'gl_FrontLightModelProduct'\r\n  , 'gl_FrontLightProduct'\r\n  , 'gl_FrontMaterial'\r\n  , 'gl_FrontSecondaryColor'\r\n  , 'gl_LightModel'\r\n  , 'gl_LightModelParameters'\r\n  , 'gl_LightModelProducts'\r\n  , 'gl_LightProducts'\r\n  , 'gl_LightSource'\r\n  , 'gl_LightSourceParameters'\r\n  , 'gl_MaterialParameters'\r\n  , 'gl_MaxClipPlanes'\r\n  , 'gl_MaxCombinedTextureImageUnits'\r\n  , 'gl_MaxDrawBuffers'\r\n  , 'gl_MaxFragmentUniformComponents'\r\n  , 'gl_MaxLights'\r\n  , 'gl_MaxTextureCoords'\r\n  , 'gl_MaxTextureImageUnits'\r\n  , 'gl_MaxTextureUnits'\r\n  , 'gl_MaxVaryingFloats'\r\n  , 'gl_MaxVertexAttribs'\r\n  , 'gl_MaxVertexTextureImageUnits'\r\n  , 'gl_MaxVertexUniformComponents'\r\n  , 'gl_ModelViewMatrix'\r\n  , 'gl_ModelViewMatrixInverse'\r\n  , 'gl_ModelViewMatrixInverseTranspose'\r\n  , 'gl_ModelViewMatrixTranspose'\r\n  , 'gl_ModelViewProjectionMatrix'\r\n  , 'gl_ModelViewProjectionMatrixInverse'\r\n  , 'gl_ModelViewProjectionMatrixInverseTranspose'\r\n  , 'gl_ModelViewProjectionMatrixTranspose'\r\n  , 'gl_MultiTexCoord0'\r\n  , 'gl_MultiTexCoord1'\r\n  , 'gl_MultiTexCoord2'\r\n  , 'gl_MultiTexCoord3'\r\n  , 'gl_MultiTexCoord4'\r\n  , 'gl_MultiTexCoord5'\r\n  , 'gl_MultiTexCoord6'\r\n  , 'gl_MultiTexCoord7'\r\n  , 'gl_Normal'\r\n  , 'gl_NormalMatrix'\r\n  , 'gl_NormalScale'\r\n  , 'gl_ObjectPlaneQ'\r\n  , 'gl_ObjectPlaneR'\r\n  , 'gl_ObjectPlaneS'\r\n  , 'gl_ObjectPlaneT'\r\n  , 'gl_Point'\r\n  , 'gl_PointCoord'\r\n  , 'gl_PointParameters'\r\n  , 'gl_PointSize'\r\n  , 'gl_Position'\r\n  , 'gl_ProjectionMatrix'\r\n  , 'gl_ProjectionMatrixInverse'\r\n  , 'gl_ProjectionMatrixInverseTranspose'\r\n  , 'gl_ProjectionMatrixTranspose'\r\n  , 'gl_SecondaryColor'\r\n  , 'gl_TexCoord'\r\n  , 'gl_TextureEnvColor'\r\n  , 'gl_TextureMatrix'\r\n  , 'gl_TextureMatrixInverse'\r\n  , 'gl_TextureMatrixInverseTranspose'\r\n  , 'gl_TextureMatrixTranspose'\r\n  , 'gl_Vertex'\r\n  , 'greaterThan'\r\n  , 'greaterThanEqual'\r\n  , 'inversesqrt'\r\n  , 'length'\r\n  , 'lessThan'\r\n  , 'lessThanEqual'\r\n  , 'log'\r\n  , 'log2'\r\n  , 'matrixCompMult'\r\n  , 'max'\r\n  , 'min'\r\n  , 'mix'\r\n  , 'mod'\r\n  , 'normalize'\r\n  , 'not'\r\n  , 'notEqual'\r\n  , 'pow'\r\n  , 'radians'\r\n  , 'reflect'\r\n  , 'refract'\r\n  , 'sign'\r\n  , 'sin'\r\n  , 'smoothstep'\r\n  , 'sqrt'\r\n  , 'step'\r\n  , 'tan'\r\n  , 'texture2D'\r\n  , 'texture2DLod'\r\n  , 'texture2DProj'\r\n  , 'texture2DProjLod'\r\n  , 'textureCube'\r\n  , 'textureCubeLod'\r\n  , 'texture2DLodEXT'\r\n  , 'texture2DProjLodEXT'\r\n  , 'textureCubeLodEXT'\r\n  , 'texture2DGradEXT'\r\n  , 'texture2DProjGradEXT'\r\n  , 'textureCubeGradEXT'\r\n]\r\n","var v100 = require('./literals')\r\n\r\nmodule.exports = v100.slice().concat([\r\n   'layout'\r\n  , 'centroid'\r\n  , 'smooth'\r\n  , 'case'\r\n  , 'mat2x2'\r\n  , 'mat2x3'\r\n  , 'mat2x4'\r\n  , 'mat3x2'\r\n  , 'mat3x3'\r\n  , 'mat3x4'\r\n  , 'mat4x2'\r\n  , 'mat4x3'\r\n  , 'mat4x4'\r\n  , 'uvec2'\r\n  , 'uvec3'\r\n  , 'uvec4'\r\n  , 'samplerCubeShadow'\r\n  , 'sampler2DArray'\r\n  , 'sampler2DArrayShadow'\r\n  , 'isampler2D'\r\n  , 'isampler3D'\r\n  , 'isamplerCube'\r\n  , 'isampler2DArray'\r\n  , 'usampler2D'\r\n  , 'usampler3D'\r\n  , 'usamplerCube'\r\n  , 'usampler2DArray'\r\n  , 'coherent'\r\n  , 'restrict'\r\n  , 'readonly'\r\n  , 'writeonly'\r\n  , 'resource'\r\n  , 'atomic_uint'\r\n  , 'noperspective'\r\n  , 'patch'\r\n  , 'sample'\r\n  , 'subroutine'\r\n  , 'common'\r\n  , 'partition'\r\n  , 'active'\r\n  , 'filter'\r\n  , 'image1D'\r\n  , 'image2D'\r\n  , 'image3D'\r\n  , 'imageCube'\r\n  , 'iimage1D'\r\n  , 'iimage2D'\r\n  , 'iimage3D'\r\n  , 'iimageCube'\r\n  , 'uimage1D'\r\n  , 'uimage2D'\r\n  , 'uimage3D'\r\n  , 'uimageCube'\r\n  , 'image1DArray'\r\n  , 'image2DArray'\r\n  , 'iimage1DArray'\r\n  , 'iimage2DArray'\r\n  , 'uimage1DArray'\r\n  , 'uimage2DArray'\r\n  , 'image1DShadow'\r\n  , 'image2DShadow'\r\n  , 'image1DArrayShadow'\r\n  , 'image2DArrayShadow'\r\n  , 'imageBuffer'\r\n  , 'iimageBuffer'\r\n  , 'uimageBuffer'\r\n  , 'sampler1DArray'\r\n  , 'sampler1DArrayShadow'\r\n  , 'isampler1D'\r\n  , 'isampler1DArray'\r\n  , 'usampler1D'\r\n  , 'usampler1DArray'\r\n  , 'isampler2DRect'\r\n  , 'usampler2DRect'\r\n  , 'samplerBuffer'\r\n  , 'isamplerBuffer'\r\n  , 'usamplerBuffer'\r\n  , 'sampler2DMS'\r\n  , 'isampler2DMS'\r\n  , 'usampler2DMS'\r\n  , 'sampler2DMSArray'\r\n  , 'isampler2DMSArray'\r\n  , 'usampler2DMSArray'\r\n])\r\n","module.exports = [\r\n  // current\r\n    'precision'\r\n  , 'highp'\r\n  , 'mediump'\r\n  , 'lowp'\r\n  , 'attribute'\r\n  , 'const'\r\n  , 'uniform'\r\n  , 'varying'\r\n  , 'break'\r\n  , 'continue'\r\n  , 'do'\r\n  , 'for'\r\n  , 'while'\r\n  , 'if'\r\n  , 'else'\r\n  , 'in'\r\n  , 'out'\r\n  , 'inout'\r\n  , 'float'\r\n  , 'int'\r\n  , 'uint'\r\n  , 'void'\r\n  , 'bool'\r\n  , 'true'\r\n  , 'false'\r\n  , 'discard'\r\n  , 'return'\r\n  , 'mat2'\r\n  , 'mat3'\r\n  , 'mat4'\r\n  , 'vec2'\r\n  , 'vec3'\r\n  , 'vec4'\r\n  , 'ivec2'\r\n  , 'ivec3'\r\n  , 'ivec4'\r\n  , 'bvec2'\r\n  , 'bvec3'\r\n  , 'bvec4'\r\n  , 'sampler1D'\r\n  , 'sampler2D'\r\n  , 'sampler3D'\r\n  , 'samplerCube'\r\n  , 'sampler1DShadow'\r\n  , 'sampler2DShadow'\r\n  , 'struct'\r\n\r\n  // future\r\n  , 'asm'\r\n  , 'class'\r\n  , 'union'\r\n  , 'enum'\r\n  , 'typedef'\r\n  , 'template'\r\n  , 'this'\r\n  , 'packed'\r\n  , 'goto'\r\n  , 'switch'\r\n  , 'default'\r\n  , 'inline'\r\n  , 'noinline'\r\n  , 'volatile'\r\n  , 'public'\r\n  , 'static'\r\n  , 'extern'\r\n  , 'external'\r\n  , 'interface'\r\n  , 'long'\r\n  , 'short'\r\n  , 'double'\r\n  , 'half'\r\n  , 'fixed'\r\n  , 'unsigned'\r\n  , 'input'\r\n  , 'output'\r\n  , 'hvec2'\r\n  , 'hvec3'\r\n  , 'hvec4'\r\n  , 'dvec2'\r\n  , 'dvec3'\r\n  , 'dvec4'\r\n  , 'fvec2'\r\n  , 'fvec3'\r\n  , 'fvec4'\r\n  , 'sampler2DRect'\r\n  , 'sampler3DRect'\r\n  , 'sampler2DRectShadow'\r\n  , 'sizeof'\r\n  , 'cast'\r\n  , 'namespace'\r\n  , 'using'\r\n]\r\n","module.exports = [\r\n    '<<='\r\n  , '>>='\r\n  , '++'\r\n  , '--'\r\n  , '<<'\r\n  , '>>'\r\n  , '<='\r\n  , '>='\r\n  , '=='\r\n  , '!='\r\n  , '&&'\r\n  , '||'\r\n  , '+='\r\n  , '-='\r\n  , '*='\r\n  , '/='\r\n  , '%='\r\n  , '&='\r\n  , '^^'\r\n  , '^='\r\n  , '|='\r\n  , '('\r\n  , ')'\r\n  , '['\r\n  , ']'\r\n  , '.'\r\n  , '!'\r\n  , '~'\r\n  , '*'\r\n  , '/'\r\n  , '%'\r\n  , '+'\r\n  , '-'\r\n  , '<'\r\n  , '>'\r\n  , '&'\r\n  , '^'\r\n  , '|'\r\n  , '?'\r\n  , ':'\r\n  , '='\r\n  , ','\r\n  , ';'\r\n  , '{'\r\n  , '}'\r\n]\r\n","var tokenize = require('./index')\r\n\r\nmodule.exports = tokenizeString\r\n\r\nfunction tokenizeString(str, opt) {\r\n  var generator = tokenize(opt)\r\n  var tokens = []\r\n\r\n  tokens = tokens.concat(generator(str))\r\n  tokens = tokens.concat(generator(null))\r\n\r\n  return tokens\r\n}\r\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.compile = void 0;\nvar boolbase_1 = require(\"boolbase\");\n/**\n * Returns a function that checks if an elements index matches the given rule\n * highly optimized to return the fastest solution.\n *\n * @param parsed A tuple [a, b], as returned by `parse`.\n * @returns A highly optimized function that returns whether an index matches the nth-check.\n * @example\n * const check = nthCheck.compile([2, 3]);\n *\n * check(0); // `false`\n * check(1); // `false`\n * check(2); // `true`\n * check(3); // `false`\n * check(4); // `true`\n * check(5); // `false`\n * check(6); // `true`\n */\nfunction compile(parsed) {\n    var a = parsed[0];\n    // Subtract 1 from `b`, to convert from one- to zero-indexed.\n    var b = parsed[1] - 1;\n    /*\n     * When `b <= 0`, `a * n` won't be lead to any matches for `a < 0`.\n     * Besides, the specification states that no elements are\n     * matched when `a` and `b` are 0.\n     *\n     * `b < 0` here as we subtracted 1 from `b` above.\n     */\n    if (b < 0 && a <= 0)\n        return boolbase_1.falseFunc;\n    // When `a` is in the range -1..1, it matches any element (so only `b` is checked).\n    if (a === -1)\n        return function (index) { return index <= b; };\n    if (a === 0)\n        return function (index) { return index === b; };\n    // When `b <= 0` and `a === 1`, they match any element.\n    if (a === 1)\n        return b < 0 ? boolbase_1.trueFunc : function (index) { return index >= b; };\n    /*\n     * Otherwise, modulo can be used to check if there is a match.\n     *\n     * Modulo doesn't care about the sign, so let's use `a`s absolute value.\n     */\n    var absA = Math.abs(a);\n    // Get `b mod a`, + a if this is negative.\n    var bMod = ((b % absA) + absA) % absA;\n    return a > 1\n        ? function (index) { return index >= b && index % absA === bMod; }\n        : function (index) { return index <= b && index % absA === bMod; };\n}\nexports.compile = compile;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.compile = exports.parse = void 0;\nvar parse_1 = require(\"./parse\");\nObject.defineProperty(exports, \"parse\", { enumerable: true, get: function () { return parse_1.parse; } });\nvar compile_1 = require(\"./compile\");\nObject.defineProperty(exports, \"compile\", { enumerable: true, get: function () { return compile_1.compile; } });\n/**\n * Parses and compiles a formula to a highly optimized function.\n * Combination of `parse` and `compile`.\n *\n * If the formula doesn't match any elements,\n * it returns [`boolbase`](https://github.com/fb55/boolbase)'s `falseFunc`.\n * Otherwise, a function accepting an _index_ is returned, which returns\n * whether or not the passed _index_ matches the formula.\n *\n * Note: The nth-rule starts counting at `1`, the returned function at `0`.\n *\n * @param formula The formula to compile.\n * @example\n * const check = nthCheck(\"2n+3\");\n *\n * check(0); // `false`\n * check(1); // `false`\n * check(2); // `true`\n * check(3); // `false`\n * check(4); // `true`\n * check(5); // `false`\n * check(6); // `true`\n */\nfunction nthCheck(formula) {\n    return (0, compile_1.compile)((0, parse_1.parse)(formula));\n}\nexports.default = nthCheck;\n","\"use strict\";\n// Following http://www.w3.org/TR/css3-selectors/#nth-child-pseudo\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.parse = void 0;\n// Whitespace as per https://www.w3.org/TR/selectors-3/#lex is \" \\t\\r\\n\\f\"\nvar whitespace = new Set([9, 10, 12, 13, 32]);\nvar ZERO = \"0\".charCodeAt(0);\nvar NINE = \"9\".charCodeAt(0);\n/**\n * Parses an expression.\n *\n * @throws An `Error` if parsing fails.\n * @returns An array containing the integer step size and the integer offset of the nth rule.\n * @example nthCheck.parse(\"2n+3\"); // returns [2, 3]\n */\nfunction parse(formula) {\n    formula = formula.trim().toLowerCase();\n    if (formula === \"even\") {\n        return [2, 0];\n    }\n    else if (formula === \"odd\") {\n        return [2, 1];\n    }\n    // Parse [ ['-'|'+']? INTEGER? {N} [ S* ['-'|'+'] S* INTEGER ]?\n    var idx = 0;\n    var a = 0;\n    var sign = readSign();\n    var number = readNumber();\n    if (idx < formula.length && formula.charAt(idx) === \"n\") {\n        idx++;\n        a = sign * (number !== null && number !== void 0 ? number : 1);\n        skipWhitespace();\n        if (idx < formula.length) {\n            sign = readSign();\n            skipWhitespace();\n            number = readNumber();\n        }\n        else {\n            sign = number = 0;\n        }\n    }\n    // Throw if there is anything else\n    if (number === null || idx < formula.length) {\n        throw new Error(\"n-th rule couldn't be parsed ('\" + formula + \"')\");\n    }\n    return [a, sign * number];\n    function readSign() {\n        if (formula.charAt(idx) === \"-\") {\n            idx++;\n            return -1;\n        }\n        if (formula.charAt(idx) === \"+\") {\n            idx++;\n        }\n        return 1;\n    }\n    function readNumber() {\n        var start = idx;\n        var value = 0;\n        while (idx < formula.length &&\n            formula.charCodeAt(idx) >= ZERO &&\n            formula.charCodeAt(idx) <= NINE) {\n            value = value * 10 + (formula.charCodeAt(idx) - ZERO);\n            idx++;\n        }\n        // Return `null` if we didn't read anything.\n        return idx === start ? null : value;\n    }\n    function skipWhitespace() {\n        while (idx < formula.length &&\n            whitespace.has(formula.charCodeAt(idx))) {\n            idx++;\n        }\n    }\n}\nexports.parse = parse;\n","/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS202: Simplify dynamic range loops\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nexports.make = function (x) {\n  if (x == null) {\n    x = [];\n  }\n  if (!(x instanceof Array)) {\n    x = [+x != null ? +x : 0];\n  }\n  return x;\n};\n\nexports.nest = (a, b) => a.concat(b);\n\nexports.compare = function (a, b) {\n  const n = Math.min(a.length, b.length);\n  for (\n    let i = 0, end = n, asc = 0 <= end;\n    asc ? i < end : i > end;\n    asc ? i++ : i--\n  ) {\n    const p = a[i];\n    const q = b[i];\n    if (p > q) {\n      return -1;\n    }\n    if (p < q) {\n      return 1;\n    }\n  }\n  a = a.length;\n  b = b.length;\n  if (a > b) {\n    return -1;\n  } else if (a < b) {\n    return 1;\n  } else {\n    return 0;\n  }\n};\n\nexports.max = function (a, b) {\n  if (exports.compare(a, b) > 0) {\n    return b;\n  } else {\n    return a;\n  }\n};\n","// stats.js - http://github.com/mrdoob/stats.js\n(function(f,e){\"object\"===typeof exports&&\"undefined\"!==typeof module?module.exports=e():\"function\"===typeof define&&define.amd?define(e):f.Stats=e()})(this,function(){var f=function(){function e(a){c.appendChild(a.dom);return a}function u(a){for(var d=0;d<c.children.length;d++)c.children[d].style.display=d===a?\"block\":\"none\";l=a}var l=0,c=document.createElement(\"div\");c.style.cssText=\"position:fixed;top:0;left:0;cursor:pointer;opacity:0.9;z-index:10000\";c.addEventListener(\"click\",function(a){a.preventDefault();\nu(++l%c.children.length)},!1);var k=(performance||Date).now(),g=k,a=0,r=e(new f.Panel(\"FPS\",\"#0ff\",\"#002\")),h=e(new f.Panel(\"MS\",\"#0f0\",\"#020\"));if(self.performance&&self.performance.memory)var t=e(new f.Panel(\"MB\",\"#f08\",\"#201\"));u(0);return{REVISION:16,dom:c,addPanel:e,showPanel:u,begin:function(){k=(performance||Date).now()},end:function(){a++;var c=(performance||Date).now();h.update(c-k,200);if(c>g+1E3&&(r.update(1E3*a/(c-g),100),g=c,a=0,t)){var d=performance.memory;t.update(d.usedJSHeapSize/\n1048576,d.jsHeapSizeLimit/1048576)}return c},update:function(){k=this.end()},domElement:c,setMode:u}};f.Panel=function(e,f,l){var c=Infinity,k=0,g=Math.round,a=g(window.devicePixelRatio||1),r=80*a,h=48*a,t=3*a,v=2*a,d=3*a,m=15*a,n=74*a,p=30*a,q=document.createElement(\"canvas\");q.width=r;q.height=h;q.style.cssText=\"width:80px;height:48px\";var b=q.getContext(\"2d\");b.font=\"bold \"+9*a+\"px Helvetica,Arial,sans-serif\";b.textBaseline=\"top\";b.fillStyle=l;b.fillRect(0,0,r,h);b.fillStyle=f;b.fillText(e,t,v);\nb.fillRect(d,m,n,p);b.fillStyle=l;b.globalAlpha=.9;b.fillRect(d,m,n,p);return{dom:q,update:function(h,w){c=Math.min(c,h);k=Math.max(k,h);b.fillStyle=l;b.globalAlpha=1;b.fillRect(0,0,r,m);b.fillStyle=f;b.fillText(g(h)+\" \"+e+\" (\"+g(c)+\"-\"+g(k)+\")\",t,v);b.drawImage(q,d+a,m,n-a,p,d,m,n-a,p);b.fillRect(d+n-a,m,a,p);b.fillStyle=l;b.globalAlpha=.9;b.fillRect(d+n-a,m,a,g((1-h/w)*p))}}};return f});\n","module.exports = __WEBPACK_EXTERNAL_MODULE__824__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","/**\n * https://github.com/mrdoob/eventdispatcher.js/\n */\n\nclass EventDispatcher {\n\n\taddEventListener( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) this._listeners = {};\n\n\t\tconst listeners = this._listeners;\n\n\t\tif ( listeners[ type ] === undefined ) {\n\n\t\t\tlisteners[ type ] = [];\n\n\t\t}\n\n\t\tif ( listeners[ type ].indexOf( listener ) === - 1 ) {\n\n\t\t\tlisteners[ type ].push( listener );\n\n\t\t}\n\n\t}\n\n\thasEventListener( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) return false;\n\n\t\tconst listeners = this._listeners;\n\n\t\treturn listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1;\n\n\t}\n\n\tremoveEventListener( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) return;\n\n\t\tconst listeners = this._listeners;\n\t\tconst listenerArray = listeners[ type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tconst index = listenerArray.indexOf( listener );\n\n\t\t\tif ( index !== - 1 ) {\n\n\t\t\t\tlistenerArray.splice( index, 1 );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tdispatchEvent( event ) {\n\n\t\tif ( this._listeners === undefined ) return;\n\n\t\tconst listeners = this._listeners;\n\t\tconst listenerArray = listeners[ event.type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tevent.target = this;\n\n\t\t\t// Make a copy, in case listeners are removed while iterating.\n\t\t\tconst array = listenerArray.slice( 0 );\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\tarray[ i ].call( this, event );\n\n\t\t\t}\n\n\t\t\tevent.target = null;\n\n\t\t}\n\n\t}\n\n}\n\n\nexport { EventDispatcher };\n","import { EventDispatcher } from \"three/src/core/EventDispatcher.js\";\n\nexport class Binder {\n  static bind(context, globals) {\n    return function (key, object) {\n      // Prepare object\n      if (!object.__binds) {\n        object.__binds = [];\n      }\n\n      // Set base target\n      var fallback = context;\n\n      if (Array.isArray(key)) {\n        fallback = key[0];\n        key = key[1];\n      }\n\n      // Match key\n      var match = /^([^.:]*(?:\\.[^.:]+)*)?(?::(.*))?$/.exec(key);\n      var path = match[1].split(/\\./g);\n\n      var name = path.pop();\n      var dest = match[2] || name;\n\n      // Whitelisted objects\n      var selector = path.shift();\n\n      var target =\n        {\n          this: object,\n        }[selector] ||\n        globals[selector] ||\n        context[selector] ||\n        fallback;\n\n      // Look up keys\n      while (target && (key = path.shift())) {\n        target = target[key];\n      }\n\n      // Attach event handler at last level\n      if (target && (target.on || target.addEventListener)) {\n        var callback = function (event) {\n          object[dest] && object[dest](event, context);\n        };\n\n        // Polyfill for both styles of event listener adders\n        Binder._polyfill(target, [\"addEventListener\", \"on\"], function (method) {\n          target[method](name, callback);\n        });\n\n        // Store bind for removal later\n        var bind = { target: target, name: name, callback: callback };\n        object.__binds.push(bind);\n\n        // Return callback\n        return callback;\n      } else {\n        throw \"Cannot bind '\" + key + \"' in \" + this.__name;\n      }\n    };\n  }\n\n  static unbind() {\n    return function (object) {\n      // Remove all binds belonging to object\n      if (object.__binds) {\n        object.__binds.forEach(\n          function (bind) {\n            // Polyfill for both styles of event listener removers\n            Binder._polyfill(\n              bind.target,\n              [\"removeEventListener\", \"off\"],\n              function (method) {\n                bind.target[method](bind.name, bind.callback);\n              }\n            );\n          }.bind(this)\n        );\n\n        object.__binds = [];\n      }\n    };\n  }\n\n  static apply(object) {\n    object.trigger = Binder._trigger;\n    object.triggerOnce = Binder._triggerOnce;\n\n    object.hasEventListener = EventDispatcher.prototype.hasEventListener;\n    object.addEventListener = EventDispatcher.prototype.addEventListener;\n    object.removeEventListener = EventDispatcher.prototype.removeEventListener;\n\n    object.on = object.addEventListener;\n    object.off = object.removeEventListener;\n    object.dispatchEvent = object.trigger;\n  }\n\n  static _triggerOnce(event) {\n    this.trigger(event);\n    if (this._listeners) {\n      delete this._listeners[event.type];\n    }\n  }\n\n  static _trigger(event) {\n    if (this._listeners === undefined) return;\n\n    var type = event.type;\n    var listeners = this._listeners[type];\n    if (listeners !== undefined) {\n      listeners = listeners.slice();\n      var length = listeners.length;\n\n      event.target = this;\n      for (var i = 0; i < length; i++) {\n        // add original target as parameter for convenience\n        listeners[i].call(this, event, this);\n      }\n    }\n  }\n\n  static _polyfill(object, methods, callback) {\n    methods.map(function (_method) {\n      return object.method;\n    });\n    if (methods.length) callback(methods[0]);\n  }\n}\n","import { Api } from \"./api\";\nimport { Binder } from \"./binder\";\n\nfunction isString(str) {\n  return str && typeof str.valueOf() === \"string\";\n}\n\nexport class Bootstrap {\n  static initClass() {\n    this.Plugins = {};\n    this.Aliases = {};\n  }\n\n  static registerPlugin(name, spec) {\n    var ctor = function (options) {\n      Bootstrap.Plugin.call(this, options);\n      this.__name = name;\n    };\n    ctor.prototype = Object.assign(new Bootstrap.Plugin(), spec);\n\n    this.Plugins[name] = ctor;\n  }\n\n  static unregisterPlugin(name) {\n    delete this.Plugins[name];\n  }\n\n  static registerAlias(name, plugins) {\n    this.Aliases[name] = plugins;\n  }\n\n  static unregisterAlias(name) {\n    delete this.Aliases[name];\n  }\n\n  constructor(options) {\n    if (options) {\n      let args = [].slice.apply(arguments);\n      options = {};\n\n      // (element, ...)\n      if (args[0] instanceof Node) {\n        const node = args[0];\n        args = args.slice(1);\n        options.element = node;\n      }\n\n      // (..., plugin, plugin, plugin)\n      if (isString(args[0])) {\n        options.plugins = args;\n      } else if (Array.isArray(args[0])) {\n        // (..., [plugin, plugin, plugin])\n        options.plugins = args[0];\n      } else if (args[0]) {\n        // (..., options)\n\n        // else, merge any arguments on the right that have NOT been set into the\n        // options dict on the left.\n        options = Object.assign({}, args[0], options);\n      }\n    }\n\n    // Apply defaults\n    const defaultOpts = {\n      init: true,\n      element: document.body,\n      plugins: [\"core\"],\n      aliases: {},\n      plugindb: Bootstrap.Plugins || {},\n      aliasdb: Bootstrap.Aliases || {},\n    };\n\n    this.__options = Object.assign({}, defaultOpts, options || {});\n\n    // Hidden state\n    this.__inited = false;\n    this.__destroyed = false;\n    this.__installed = [];\n\n    // Query element\n    var element = this.__options.element;\n    if (element === \"\" + element) {\n      element = document.querySelector(element);\n    }\n\n    // Global context\n    this.plugins = {};\n    this.element = element;\n\n    // Update cycle\n    this.trigger = this.trigger.bind(this);\n    this.frame = this.frame.bind(this);\n    this.events = [\"pre\", \"update\", \"render\", \"post\"].map(function (type) {\n      return { type: type };\n    });\n\n    // Auto-init\n    if (this.__options.init) {\n      this.init();\n    }\n  }\n\n  init() {\n    if (this.__inited) return;\n    this.__inited = true;\n\n    // Install plugins\n    this.install(this.__options.plugins);\n  }\n\n  destroy() {\n    if (!this.__inited) return;\n    if (this.__destroyed) return;\n    this.__destroyed = true;\n\n    // Notify of imminent destruction\n    this.trigger({ type: \"destroy\" });\n\n    // Then uninstall plugins\n    this.uninstall();\n  }\n\n  frame() {\n    this.events.map(this.trigger);\n  }\n\n  resolve(plugins) {\n    plugins = Array.isArray(plugins) ? plugins : [plugins];\n\n    // Resolve alias database\n    var o = this.__options;\n    var aliases = Object.assign({}, o.aliasdb, o.aliases);\n\n    // Remove inline alias defs from plugins\n    var pred = function (name) {\n      var key = name.split(\":\");\n      if (!key[1]) return true;\n      aliases[key[0]] = [key[1]];\n      return false;\n    };\n    plugins = plugins.filter(pred);\n\n    // Unify arrays\n    Object.entries(aliases).forEach(function ([key, alias]) {\n      aliases[key] = Array.isArray(alias) ? alias : [alias];\n    });\n\n    // Look up aliases recursively\n    function recurse(list, out, level) {\n      if (level >= 256) throw \"Plug-in alias recursion detected.\";\n      list = list.filter(pred);\n      list.forEach(function (name) {\n        var alias = aliases[name];\n        if (!alias) {\n          out.push(name);\n        } else {\n          out = out.concat(recurse(alias, [], level + 1));\n        }\n      });\n      return out;\n    }\n\n    return recurse(plugins, [], 0);\n  }\n\n  install(plugins) {\n    plugins = Array.isArray(plugins) ? plugins : [plugins];\n\n    // Resolve aliases\n    plugins = this.resolve(plugins);\n\n    // Install in order\n    plugins.forEach((name) => this.__install(name));\n\n    // Fire off ready event\n    this.__ready();\n  }\n\n  uninstall(plugins) {\n    if (plugins) {\n      plugins = Array.isArray(plugins) ? plugins : [plugins];\n\n      // Resolve aliases\n      plugins = this.resolve(plugins);\n    }\n\n    // Uninstall in reverse order\n    (plugins || this.__installed)\n      .reverse()\n      .forEach((p) => this.__uninstall(p.__name));\n  }\n\n  __install(name) {\n    // Sanity check\n    var ctor = this.__options.plugindb[name];\n    if (!ctor)\n      throw \"[three.install] Cannot install. '\" + name + \"' is not registered.\";\n\n    if (this.plugins[name])\n      return console.warn(\"[three.install] \" + name + \" is already installed.\");\n\n    // Construct\n    var Plugin = ctor;\n    var plugin = new Plugin(this.__options[name] || {}, name);\n    this.plugins[name] = plugin;\n\n    // Install\n    const flag = plugin.install(this);\n    this.__installed.push(plugin);\n\n    // Then notify\n    this.trigger({ type: \"install\", plugin: plugin });\n\n    // Allow early abort\n    return flag;\n  }\n\n  __uninstall(name) {\n    // Sanity check\n    const plugin = isString(name) ? this.plugins[name] : name;\n    if (!plugin) {\n      console.warn(\"[three.uninstall] \" + name + \"' is not installed.\");\n      return;\n    }\n\n    name = plugin.__name;\n\n    // Uninstall\n    plugin.uninstall(this);\n    this.__installed = this.__installed.filter((p) => p !== plugin);\n    delete this.plugins[name];\n\n    // Then notify\n    this.trigger({ type: \"uninstall\", plugin: plugin });\n  }\n\n  __ready() {\n    // Notify and remove event handlers\n    this.triggerOnce({ type: \"ready\" });\n  }\n}\nBootstrap.initClass();\n\n// Plugin Creation\n\nBootstrap.Plugin = function (options) {\n  this.options = Object.assign({}, this.defaults, options || {});\n};\n\nBootstrap.Plugin.prototype = {\n  listen: [],\n  defaults: {},\n  install: function (_three) {},\n  uninstall: function (_three) {},\n};\n\nBinder.apply(Bootstrap.prototype);\nBinder.apply(Bootstrap.Plugin.prototype);\nApi.apply(Bootstrap.Plugin.prototype);\n","export class Api {\n  static apply(object) {\n    object.set = function (options) {\n      var o = this.options || {};\n\n      // Diff out changes\n      var changes = Object.entries(options).reduce(function (\n        result,\n        [key, value]\n      ) {\n        if (o[key] !== value) result[key] = value;\n        return result;\n      },\n      {});\n\n      this.options = Object.assign(o, changes);\n\n      // Notify\n      this.trigger({ type: \"change\", options: options, changes: changes });\n    };\n\n    object.get = function () {\n      return this.options;\n    };\n\n    object.api = function (object, context) {\n      if (!object) {\n        object = {};\n      }\n\n      // Append context argument to API methods\n      context &&\n        Object.entries(object).forEach(function ([key, callback]) {\n          if (typeof callback === \"function\") {\n            object[key] = (...args) => callback(...args, context);\n          }\n        });\n\n      object.set = this.set.bind(this);\n      object.get = this.get.bind(this);\n\n      return object;\n    };\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\n// Threestrap plugin\n\nimport { Bootstrap } from \"threestrap/src/bootstrap.js\";\n\nBootstrap.registerPlugin(\"splash\", {\n  defaults: {\n    color: \"mono\",\n    fancy: true,\n  },\n\n  listen: [\n    \"ready\",\n    \"mathbox/init:init\",\n    \"mathbox/progress:progress\",\n    \"mathbox/destroy:destroy\",\n  ],\n\n  uninstall() {\n    return this.destroy();\n  },\n\n  ready(event, three) {\n    if (three.MathBox && !this.div) {\n      // TODO woah seems wrong!!!\n      return this.init(event, three);\n    }\n  },\n\n  init(event, three) {\n    let div;\n    this.destroy();\n\n    const { color } = this.options;\n    const html = `\\\n<div class=\"mathbox-loader mathbox-splash-${color}\">\n  <div class=\"mathbox-logo\">\n    <div> <div></div><div></div><div></div> </div>\n    <div> <div></div><div></div><div></div> </div>\n  </div>\n  <div class=\"mathbox-progress\"><div></div></div>\n</div>\\\n`;\n\n    this.div = div = document.createElement(\"div\");\n    div.innerHTML = html;\n    three.element.appendChild(div);\n\n    const x = Math.random() * 2 - 1;\n    const y = Math.random() * 2 - 1;\n    const z = Math.random() * 2 - 1;\n    const l = 1 / Math.sqrt(x * x + y * y + z * z);\n\n    this.loader = div.querySelector(\".mathbox-loader\");\n    this.bar = div.querySelector(\".mathbox-progress > div\");\n    this.gyro = div.querySelectorAll(\".mathbox-logo > div\");\n    this.transforms = [\n      \"rotateZ(22deg) rotateX(24deg) rotateY(30deg)\",\n      \"rotateZ(11deg) rotateX(12deg) rotateY(15deg) scale3d(.6, .6, .6)\",\n    ];\n    this.random = [x * l, y * l, z * l];\n    this.start = three.Time.now;\n    return (this.timer = null);\n  },\n\n  // Update splash screen state and animation\n  progress(event, three) {\n    if (!this.div) {\n      return;\n    }\n\n    const { current, total } = event;\n\n    // Display splash screen\n    const visible = current < total;\n    clearTimeout(this.timer);\n    if (visible) {\n      this.loader.classList.remove(\"mathbox-exit\");\n      this.loader.style.display = \"block\";\n    } else {\n      this.loader.classList.add(\"mathbox-exit\");\n      this.timer = setTimeout(() => {\n        return (this.loader.style.display = \"none\");\n      }, 150);\n    }\n\n    // Update splash progress\n    const width =\n      current < total\n        ? Math.round((1000 * current) / total) * 0.1 + \"%\"\n        : \"100%\";\n    this.bar.style.width = width;\n\n    if (this.options.fancy) {\n      // Spinny gyros\n      const weights = this.random;\n\n      // Lerp clock speed\n      const f = Math.max(0, Math.min(1, three.Time.now - this.start));\n      const increment = function (transform, j) {\n        if (j == null) {\n          j = 0;\n        }\n        return transform.replace(\n          /(-?[0-9.e]+)deg/g,\n          (_, n) => +n + weights[j++] * f * three.Time.step * 60 + \"deg\"\n        );\n      };\n\n      return (() => {\n        const result = [];\n        for (let i = 0; i < this.gyro.length; i++) {\n          let t;\n          const el = this.gyro[i];\n          this.transforms[i] = t = increment(this.transforms[i]);\n          result.push((el.style.transform = el.style.WebkitTransform = t));\n        }\n        return result;\n      })();\n    }\n  },\n\n  destroy() {\n    if (this.div != null) {\n      this.div.remove();\n    }\n    return (this.div = null);\n  },\n});\n","import { Bootstrap } from \"./bootstrap\";\n\nBootstrap.registerAlias(\"empty\", [\n  \"fallback\",\n  \"bind\",\n  \"renderer\",\n  \"size\",\n  \"fill\",\n  \"loop\",\n  \"time\",\n]);\n\nBootstrap.registerAlias(\"core\", [\n  \"empty\",\n  \"scene\",\n  \"camera\",\n  \"render\",\n  \"warmup\",\n]);\n\nBootstrap.registerAlias(\"VR\", [\"core\", \"cursor\", \"fullscreen\", \"render:vr\"]);\n","import { Bootstrap } from \"../bootstrap\";\nimport { Binder } from \"../binder\";\n\nBootstrap.registerPlugin(\"bind\", {\n  install: function (three) {\n    const globals = {\n      three: three,\n      window: window,\n    };\n\n    three.bind = Binder.bind(three, globals);\n    three.unbind = Binder.unbind(three);\n\n    three.bind(\"install:bind\", this);\n    three.bind(\"uninstall:unbind\", this);\n  },\n\n  uninstall: function (three) {\n    three.unbind(this);\n\n    delete three.bind;\n    delete three.unbind;\n  },\n\n  bind: function (event, three) {\n    const plugin = event.plugin;\n    const listen = plugin.listen;\n\n    listen &&\n      listen.forEach(function (key) {\n        three.bind(key, plugin);\n      });\n  },\n\n  unbind: function (event, three) {\n    three.unbind(event.plugin);\n  },\n});\n","const _lut = [];\n\nfor ( let i = 0; i < 256; i ++ ) {\n\n\t_lut[ i ] = ( i < 16 ? '0' : '' ) + ( i ).toString( 16 );\n\n}\n\nlet _seed = 1234567;\n\n\nconst DEG2RAD = Math.PI / 180;\nconst RAD2DEG = 180 / Math.PI;\n\n// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136\nfunction generateUUID() {\n\n\tconst d0 = Math.random() * 0xffffffff | 0;\n\tconst d1 = Math.random() * 0xffffffff | 0;\n\tconst d2 = Math.random() * 0xffffffff | 0;\n\tconst d3 = Math.random() * 0xffffffff | 0;\n\tconst uuid = _lut[ d0 & 0xff ] + _lut[ d0 >> 8 & 0xff ] + _lut[ d0 >> 16 & 0xff ] + _lut[ d0 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d1 & 0xff ] + _lut[ d1 >> 8 & 0xff ] + '-' + _lut[ d1 >> 16 & 0x0f | 0x40 ] + _lut[ d1 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d2 & 0x3f | 0x80 ] + _lut[ d2 >> 8 & 0xff ] + '-' + _lut[ d2 >> 16 & 0xff ] + _lut[ d2 >> 24 & 0xff ] +\n\t\t\t_lut[ d3 & 0xff ] + _lut[ d3 >> 8 & 0xff ] + _lut[ d3 >> 16 & 0xff ] + _lut[ d3 >> 24 & 0xff ];\n\n\t// .toUpperCase() here flattens concatenated strings to save heap memory space.\n\treturn uuid.toUpperCase();\n\n}\n\nfunction clamp( value, min, max ) {\n\n\treturn Math.max( min, Math.min( max, value ) );\n\n}\n\n// compute euclidian modulo of m % n\n// https://en.wikipedia.org/wiki/Modulo_operation\nfunction euclideanModulo( n, m ) {\n\n\treturn ( ( n % m ) + m ) % m;\n\n}\n\n// Linear mapping from range <a1, a2> to range <b1, b2>\nfunction mapLinear( x, a1, a2, b1, b2 ) {\n\n\treturn b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );\n\n}\n\n// https://www.gamedev.net/tutorials/programming/general-and-gameplay-programming/inverse-lerp-a-super-useful-yet-often-overlooked-function-r5230/\nfunction inverseLerp( x, y, value ) {\n\n\tif ( x !== y ) {\n\n\t\treturn ( value - x ) / ( y - x );\n\n\t} else {\n\n\t\treturn 0;\n\n\t}\n\n}\n\n// https://en.wikipedia.org/wiki/Linear_interpolation\nfunction lerp( x, y, t ) {\n\n\treturn ( 1 - t ) * x + t * y;\n\n}\n\n// http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/\nfunction damp( x, y, lambda, dt ) {\n\n\treturn lerp( x, y, 1 - Math.exp( - lambda * dt ) );\n\n}\n\n// https://www.desmos.com/calculator/vcsjnyz7x4\nfunction pingpong( x, length = 1 ) {\n\n\treturn length - Math.abs( euclideanModulo( x, length * 2 ) - length );\n\n}\n\n// http://en.wikipedia.org/wiki/Smoothstep\nfunction smoothstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * ( 3 - 2 * x );\n\n}\n\nfunction smootherstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * x * ( x * ( x * 6 - 15 ) + 10 );\n\n}\n\n// Random integer from <low, high> interval\nfunction randInt( low, high ) {\n\n\treturn low + Math.floor( Math.random() * ( high - low + 1 ) );\n\n}\n\n// Random float from <low, high> interval\nfunction randFloat( low, high ) {\n\n\treturn low + Math.random() * ( high - low );\n\n}\n\n// Random float from <-range/2, range/2> interval\nfunction randFloatSpread( range ) {\n\n\treturn range * ( 0.5 - Math.random() );\n\n}\n\n// Deterministic pseudo-random float in the interval [ 0, 1 ]\nfunction seededRandom( s ) {\n\n\tif ( s !== undefined ) _seed = s % 2147483647;\n\n\t// Park-Miller algorithm\n\n\t_seed = _seed * 16807 % 2147483647;\n\n\treturn ( _seed - 1 ) / 2147483646;\n\n}\n\nfunction degToRad( degrees ) {\n\n\treturn degrees * DEG2RAD;\n\n}\n\nfunction radToDeg( radians ) {\n\n\treturn radians * RAD2DEG;\n\n}\n\nfunction isPowerOfTwo( value ) {\n\n\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n}\n\nfunction ceilPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.ceil( Math.log( value ) / Math.LN2 ) );\n\n}\n\nfunction floorPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.floor( Math.log( value ) / Math.LN2 ) );\n\n}\n\nfunction setQuaternionFromProperEuler( q, a, b, c, order ) {\n\n\t// Intrinsic Proper Euler Angles - see https://en.wikipedia.org/wiki/Euler_angles\n\n\t// rotations are applied to the axes in the order specified by 'order'\n\t// rotation by angle 'a' is applied first, then by angle 'b', then by angle 'c'\n\t// angles are in radians\n\n\tconst cos = Math.cos;\n\tconst sin = Math.sin;\n\n\tconst c2 = cos( b / 2 );\n\tconst s2 = sin( b / 2 );\n\n\tconst c13 = cos( ( a + c ) / 2 );\n\tconst s13 = sin( ( a + c ) / 2 );\n\n\tconst c1_3 = cos( ( a - c ) / 2 );\n\tconst s1_3 = sin( ( a - c ) / 2 );\n\n\tconst c3_1 = cos( ( c - a ) / 2 );\n\tconst s3_1 = sin( ( c - a ) / 2 );\n\n\tswitch ( order ) {\n\n\t\tcase 'XYX':\n\t\t\tq.set( c2 * s13, s2 * c1_3, s2 * s1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YZY':\n\t\t\tq.set( s2 * s1_3, c2 * s13, s2 * c1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZXZ':\n\t\t\tq.set( s2 * c1_3, s2 * s1_3, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'XZX':\n\t\t\tq.set( c2 * s13, s2 * s3_1, s2 * c3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YXY':\n\t\t\tq.set( s2 * c3_1, c2 * s13, s2 * s3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZYZ':\n\t\t\tq.set( s2 * s3_1, s2 * c3_1, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tconsole.warn( 'THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: ' + order );\n\n\t}\n\n}\n\n\n\n\nexport {\n\tDEG2RAD,\n\tRAD2DEG,\n\tgenerateUUID,\n\tclamp,\n\teuclideanModulo,\n\tmapLinear,\n\tinverseLerp,\n\tlerp,\n\tdamp,\n\tpingpong,\n\tsmoothstep,\n\tsmootherstep,\n\trandInt,\n\trandFloat,\n\trandFloatSpread,\n\tseededRandom,\n\tdegToRad,\n\tradToDeg,\n\tisPowerOfTwo,\n\tceilPowerOfTwo,\n\tfloorPowerOfTwo,\n\tsetQuaternionFromProperEuler,\n};\n","import * as MathUtils from './MathUtils.js';\n\nclass Quaternion {\n\n\tconstructor( x = 0, y = 0, z = 0, w = 1 ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\n\t}\n\n\tstatic slerp( qa, qb, qm, t ) {\n\n\t\tconsole.warn( 'THREE.Quaternion: Static .slerp() has been deprecated. Use qm.slerpQuaternions( qa, qb, t ) instead.' );\n\t\treturn qm.slerpQuaternions( qa, qb, t );\n\n\t}\n\n\tstatic slerpFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) {\n\n\t\t// fuzz-free, array-based Quaternion SLERP operation\n\n\t\tlet x0 = src0[ srcOffset0 + 0 ],\n\t\t\ty0 = src0[ srcOffset0 + 1 ],\n\t\t\tz0 = src0[ srcOffset0 + 2 ],\n\t\t\tw0 = src0[ srcOffset0 + 3 ];\n\n\t\tconst x1 = src1[ srcOffset1 + 0 ],\n\t\t\ty1 = src1[ srcOffset1 + 1 ],\n\t\t\tz1 = src1[ srcOffset1 + 2 ],\n\t\t\tw1 = src1[ srcOffset1 + 3 ];\n\n\t\tif ( t === 0 ) {\n\n\t\t\tdst[ dstOffset + 0 ] = x0;\n\t\t\tdst[ dstOffset + 1 ] = y0;\n\t\t\tdst[ dstOffset + 2 ] = z0;\n\t\t\tdst[ dstOffset + 3 ] = w0;\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( t === 1 ) {\n\n\t\t\tdst[ dstOffset + 0 ] = x1;\n\t\t\tdst[ dstOffset + 1 ] = y1;\n\t\t\tdst[ dstOffset + 2 ] = z1;\n\t\t\tdst[ dstOffset + 3 ] = w1;\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) {\n\n\t\t\tlet s = 1 - t;\n\t\t\tconst cos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1,\n\t\t\t\tdir = ( cos >= 0 ? 1 : - 1 ),\n\t\t\t\tsqrSin = 1 - cos * cos;\n\n\t\t\t// Skip the Slerp for tiny steps to avoid numeric problems:\n\t\t\tif ( sqrSin > Number.EPSILON ) {\n\n\t\t\t\tconst sin = Math.sqrt( sqrSin ),\n\t\t\t\t\tlen = Math.atan2( sin, cos * dir );\n\n\t\t\t\ts = Math.sin( s * len ) / sin;\n\t\t\t\tt = Math.sin( t * len ) / sin;\n\n\t\t\t}\n\n\t\t\tconst tDir = t * dir;\n\n\t\t\tx0 = x0 * s + x1 * tDir;\n\t\t\ty0 = y0 * s + y1 * tDir;\n\t\t\tz0 = z0 * s + z1 * tDir;\n\t\t\tw0 = w0 * s + w1 * tDir;\n\n\t\t\t// Normalize in case we just did a lerp:\n\t\t\tif ( s === 1 - t ) {\n\n\t\t\t\tconst f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 );\n\n\t\t\t\tx0 *= f;\n\t\t\t\ty0 *= f;\n\t\t\t\tz0 *= f;\n\t\t\t\tw0 *= f;\n\n\t\t\t}\n\n\t\t}\n\n\t\tdst[ dstOffset ] = x0;\n\t\tdst[ dstOffset + 1 ] = y0;\n\t\tdst[ dstOffset + 2 ] = z0;\n\t\tdst[ dstOffset + 3 ] = w0;\n\n\t}\n\n\tstatic multiplyQuaternionsFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1 ) {\n\n\t\tconst x0 = src0[ srcOffset0 ];\n\t\tconst y0 = src0[ srcOffset0 + 1 ];\n\t\tconst z0 = src0[ srcOffset0 + 2 ];\n\t\tconst w0 = src0[ srcOffset0 + 3 ];\n\n\t\tconst x1 = src1[ srcOffset1 ];\n\t\tconst y1 = src1[ srcOffset1 + 1 ];\n\t\tconst z1 = src1[ srcOffset1 + 2 ];\n\t\tconst w1 = src1[ srcOffset1 + 3 ];\n\n\t\tdst[ dstOffset ] = x0 * w1 + w0 * x1 + y0 * z1 - z0 * y1;\n\t\tdst[ dstOffset + 1 ] = y0 * w1 + w0 * y1 + z0 * x1 - x0 * z1;\n\t\tdst[ dstOffset + 2 ] = z0 * w1 + w0 * z1 + x0 * y1 - y0 * x1;\n\t\tdst[ dstOffset + 3 ] = w0 * w1 - x0 * x1 - y0 * y1 - z0 * z1;\n\n\t\treturn dst;\n\n\t}\n\n\tget x() {\n\n\t\treturn this._x;\n\n\t}\n\n\tset x( value ) {\n\n\t\tthis._x = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget y() {\n\n\t\treturn this._y;\n\n\t}\n\n\tset y( value ) {\n\n\t\tthis._y = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget z() {\n\n\t\treturn this._z;\n\n\t}\n\n\tset z( value ) {\n\n\t\tthis._z = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget w() {\n\n\t\treturn this._w;\n\n\t}\n\n\tset w( value ) {\n\n\t\tthis._w = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tset( x, y, z, w ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._w );\n\n\t}\n\n\tcopy( quaternion ) {\n\n\t\tthis._x = quaternion.x;\n\t\tthis._y = quaternion.y;\n\t\tthis._z = quaternion.z;\n\t\tthis._w = quaternion.w;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromEuler( euler, update ) {\n\n\t\tif ( ! ( euler && euler.isEuler ) ) {\n\n\t\t\tthrow new Error( 'THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.' );\n\n\t\t}\n\n\t\tconst x = euler._x, y = euler._y, z = euler._z, order = euler._order;\n\n\t\t// http://www.mathworks.com/matlabcentral/fileexchange/\n\t\t// \t20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/\n\t\t//\tcontent/SpinCalc.m\n\n\t\tconst cos = Math.cos;\n\t\tconst sin = Math.sin;\n\n\t\tconst c1 = cos( x / 2 );\n\t\tconst c2 = cos( y / 2 );\n\t\tconst c3 = cos( z / 2 );\n\n\t\tconst s1 = sin( x / 2 );\n\t\tconst s2 = sin( y / 2 );\n\t\tconst s3 = sin( z / 2 );\n\n\t\tswitch ( order ) {\n\n\t\t\tcase 'XYZ':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'YXZ':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZXY':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZYX':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'YZX':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'XZY':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tconsole.warn( 'THREE.Quaternion: .setFromEuler() encountered an unknown order: ' + order );\n\n\t\t}\n\n\t\tif ( update !== false ) this._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromAxisAngle( axis, angle ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n\n\t\t// assumes axis is normalized\n\n\t\tconst halfAngle = angle / 2, s = Math.sin( halfAngle );\n\n\t\tthis._x = axis.x * s;\n\t\tthis._y = axis.y * s;\n\t\tthis._z = axis.z * s;\n\t\tthis._w = Math.cos( halfAngle );\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromRotationMatrix( m ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tconst te = m.elements,\n\n\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ],\n\n\t\t\ttrace = m11 + m22 + m33;\n\n\t\tif ( trace > 0 ) {\n\n\t\t\tconst s = 0.5 / Math.sqrt( trace + 1.0 );\n\n\t\t\tthis._w = 0.25 / s;\n\t\t\tthis._x = ( m32 - m23 ) * s;\n\t\t\tthis._y = ( m13 - m31 ) * s;\n\t\t\tthis._z = ( m21 - m12 ) * s;\n\n\t\t} else if ( m11 > m22 && m11 > m33 ) {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );\n\n\t\t\tthis._w = ( m32 - m23 ) / s;\n\t\t\tthis._x = 0.25 * s;\n\t\t\tthis._y = ( m12 + m21 ) / s;\n\t\t\tthis._z = ( m13 + m31 ) / s;\n\n\t\t} else if ( m22 > m33 ) {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );\n\n\t\t\tthis._w = ( m13 - m31 ) / s;\n\t\t\tthis._x = ( m12 + m21 ) / s;\n\t\t\tthis._y = 0.25 * s;\n\t\t\tthis._z = ( m23 + m32 ) / s;\n\n\t\t} else {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );\n\n\t\t\tthis._w = ( m21 - m12 ) / s;\n\t\t\tthis._x = ( m13 + m31 ) / s;\n\t\t\tthis._y = ( m23 + m32 ) / s;\n\t\t\tthis._z = 0.25 * s;\n\n\t\t}\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromUnitVectors( vFrom, vTo ) {\n\n\t\t// assumes direction vectors vFrom and vTo are normalized\n\n\t\tlet r = vFrom.dot( vTo ) + 1;\n\n\t\tif ( r < Number.EPSILON ) {\n\n\t\t\t// vFrom and vTo point in opposite directions\n\n\t\t\tr = 0;\n\n\t\t\tif ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {\n\n\t\t\t\tthis._x = - vFrom.y;\n\t\t\t\tthis._y = vFrom.x;\n\t\t\t\tthis._z = 0;\n\t\t\t\tthis._w = r;\n\n\t\t\t} else {\n\n\t\t\t\tthis._x = 0;\n\t\t\t\tthis._y = - vFrom.z;\n\t\t\t\tthis._z = vFrom.y;\n\t\t\t\tthis._w = r;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// crossVectors( vFrom, vTo ); // inlined to avoid cyclic dependency on Vector3\n\n\t\t\tthis._x = vFrom.y * vTo.z - vFrom.z * vTo.y;\n\t\t\tthis._y = vFrom.z * vTo.x - vFrom.x * vTo.z;\n\t\t\tthis._z = vFrom.x * vTo.y - vFrom.y * vTo.x;\n\t\t\tthis._w = r;\n\n\t\t}\n\n\t\treturn this.normalize();\n\n\t}\n\n\tangleTo( q ) {\n\n\t\treturn 2 * Math.acos( Math.abs( MathUtils.clamp( this.dot( q ), - 1, 1 ) ) );\n\n\t}\n\n\trotateTowards( q, step ) {\n\n\t\tconst angle = this.angleTo( q );\n\n\t\tif ( angle === 0 ) return this;\n\n\t\tconst t = Math.min( 1, step / angle );\n\n\t\tthis.slerp( q, t );\n\n\t\treturn this;\n\n\t}\n\n\tidentity() {\n\n\t\treturn this.set( 0, 0, 0, 1 );\n\n\t}\n\n\tinvert() {\n\n\t\t// quaternion is assumed to have unit length\n\n\t\treturn this.conjugate();\n\n\t}\n\n\tconjugate() {\n\n\t\tthis._x *= - 1;\n\t\tthis._y *= - 1;\n\t\tthis._z *= - 1;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tdot( v ) {\n\n\t\treturn this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;\n\n\t}\n\n\tlengthSq() {\n\n\t\treturn this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;\n\n\t}\n\n\tlength() {\n\n\t\treturn Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w );\n\n\t}\n\n\tnormalize() {\n\n\t\tlet l = this.length();\n\n\t\tif ( l === 0 ) {\n\n\t\t\tthis._x = 0;\n\t\t\tthis._y = 0;\n\t\t\tthis._z = 0;\n\t\t\tthis._w = 1;\n\n\t\t} else {\n\n\t\t\tl = 1 / l;\n\n\t\t\tthis._x = this._x * l;\n\t\t\tthis._y = this._y * l;\n\t\t\tthis._z = this._z * l;\n\t\t\tthis._w = this._w * l;\n\n\t\t}\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( q, p ) {\n\n\t\tif ( p !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' );\n\t\t\treturn this.multiplyQuaternions( q, p );\n\n\t\t}\n\n\t\treturn this.multiplyQuaternions( this, q );\n\n\t}\n\n\tpremultiply( q ) {\n\n\t\treturn this.multiplyQuaternions( q, this );\n\n\t}\n\n\tmultiplyQuaternions( a, b ) {\n\n\t\t// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n\t\tconst qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;\n\t\tconst qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;\n\n\t\tthis._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n\t\tthis._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n\t\tthis._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n\t\tthis._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tslerp( qb, t ) {\n\n\t\tif ( t === 0 ) return this;\n\t\tif ( t === 1 ) return this.copy( qb );\n\n\t\tconst x = this._x, y = this._y, z = this._z, w = this._w;\n\n\t\t// http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/\n\n\t\tlet cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z;\n\n\t\tif ( cosHalfTheta < 0 ) {\n\n\t\t\tthis._w = - qb._w;\n\t\t\tthis._x = - qb._x;\n\t\t\tthis._y = - qb._y;\n\t\t\tthis._z = - qb._z;\n\n\t\t\tcosHalfTheta = - cosHalfTheta;\n\n\t\t} else {\n\n\t\t\tthis.copy( qb );\n\n\t\t}\n\n\t\tif ( cosHalfTheta >= 1.0 ) {\n\n\t\t\tthis._w = w;\n\t\t\tthis._x = x;\n\t\t\tthis._y = y;\n\t\t\tthis._z = z;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst sqrSinHalfTheta = 1.0 - cosHalfTheta * cosHalfTheta;\n\n\t\tif ( sqrSinHalfTheta <= Number.EPSILON ) {\n\n\t\t\tconst s = 1 - t;\n\t\t\tthis._w = s * w + t * this._w;\n\t\t\tthis._x = s * x + t * this._x;\n\t\t\tthis._y = s * y + t * this._y;\n\t\t\tthis._z = s * z + t * this._z;\n\n\t\t\tthis.normalize();\n\t\t\tthis._onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst sinHalfTheta = Math.sqrt( sqrSinHalfTheta );\n\t\tconst halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta );\n\t\tconst ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,\n\t\t\tratioB = Math.sin( t * halfTheta ) / sinHalfTheta;\n\n\t\tthis._w = ( w * ratioA + this._w * ratioB );\n\t\tthis._x = ( x * ratioA + this._x * ratioB );\n\t\tthis._y = ( y * ratioA + this._y * ratioB );\n\t\tthis._z = ( z * ratioA + this._z * ratioB );\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tslerpQuaternions( qa, qb, t ) {\n\n\t\treturn this.copy( qa ).slerp( qb, t );\n\n\t}\n\n\trandom() {\n\n\t\t// Derived from http://planning.cs.uiuc.edu/node198.html\n\t\t// Note, this source uses w, x, y, z ordering,\n\t\t// so we swap the order below.\n\n\t\tconst u1 = Math.random();\n\t\tconst sqrt1u1 = Math.sqrt( 1 - u1 );\n\t\tconst sqrtu1 = Math.sqrt( u1 );\n\n\t\tconst u2 = 2 * Math.PI * Math.random();\n\n\t\tconst u3 = 2 * Math.PI * Math.random();\n\n\t\treturn this.set(\n\t\t\tsqrt1u1 * Math.cos( u2 ),\n\t\t\tsqrtu1 * Math.sin( u3 ),\n\t\t\tsqrtu1 * Math.cos( u3 ),\n\t\t\tsqrt1u1 * Math.sin( u2 ),\n\t\t);\n\n\t}\n\n\tequals( quaternion ) {\n\n\t\treturn ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis._x = array[ offset ];\n\t\tthis._y = array[ offset + 1 ];\n\t\tthis._z = array[ offset + 2 ];\n\t\tthis._w = array[ offset + 3 ];\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this._x;\n\t\tarray[ offset + 1 ] = this._y;\n\t\tarray[ offset + 2 ] = this._z;\n\t\tarray[ offset + 3 ] = this._w;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis._x = attribute.getX( index );\n\t\tthis._y = attribute.getY( index );\n\t\tthis._z = attribute.getZ( index );\n\t\tthis._w = attribute.getW( index );\n\n\t\treturn this;\n\n\t}\n\n\t_onChange( callback ) {\n\n\t\tthis._onChangeCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t_onChangeCallback() {}\n\n}\n\nQuaternion.prototype.isQuaternion = true;\n\nexport { Quaternion };\n","import * as MathUtils from './MathUtils.js';\nimport { Quaternion } from './Quaternion.js';\n\nclass Vector3 {\n\n\tconstructor( x = 0, y = 0, z = 0 ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\n\t}\n\n\tset( x, y, z ) {\n\n\t\tif ( z === undefined ) z = this.z; // sprite.scale.set(x,y)\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\n\t\treturn this;\n\n\t}\n\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetZ( z ) {\n\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tcase 2: this.z = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tcase 2: return this.z;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y, this.z );\n\n\t}\n\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\n\t\treturn this;\n\n\t}\n\n\tadd( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\treturn this.addVectors( v, w );\n\n\t\t}\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\n\t\treturn this;\n\n\t}\n\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\n\t\treturn this;\n\n\t}\n\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\n\t\treturn this;\n\n\t}\n\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\n\t\treturn this;\n\n\t}\n\n\tsub( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\treturn this.subVectors( v, w );\n\n\t\t}\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\n\t\treturn this;\n\n\t}\n\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\t\tthis.z -= s;\n\n\t\treturn this;\n\n\t}\n\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' );\n\t\t\treturn this.multiplyVectors( v, w );\n\n\t\t}\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\t\tthis.z *= v.z;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyVectors( a, b ) {\n\n\t\tthis.x = a.x * b.x;\n\t\tthis.y = a.y * b.y;\n\t\tthis.z = a.z * b.z;\n\n\t\treturn this;\n\n\t}\n\n\tapplyEuler( euler ) {\n\n\t\tif ( ! ( euler && euler.isEuler ) ) {\n\n\t\t\tconsole.error( 'THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.' );\n\n\t\t}\n\n\t\treturn this.applyQuaternion( _quaternion.setFromEuler( euler ) );\n\n\t}\n\n\tapplyAxisAngle( axis, angle ) {\n\n\t\treturn this.applyQuaternion( _quaternion.setFromAxisAngle( axis, angle ) );\n\n\t}\n\n\tapplyMatrix3( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z;\n\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z;\n\t\tthis.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z;\n\n\t\treturn this;\n\n\t}\n\n\tapplyNormalMatrix( m ) {\n\n\t\treturn this.applyMatrix3( m ).normalize();\n\n\t}\n\n\tapplyMatrix4( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tconst w = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] );\n\n\t\tthis.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * w;\n\t\tthis.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * w;\n\t\tthis.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * w;\n\n\t\treturn this;\n\n\t}\n\n\tapplyQuaternion( q ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst qx = q.x, qy = q.y, qz = q.z, qw = q.w;\n\n\t\t// calculate quat * vector\n\n\t\tconst ix = qw * x + qy * z - qz * y;\n\t\tconst iy = qw * y + qz * x - qx * z;\n\t\tconst iz = qw * z + qx * y - qy * x;\n\t\tconst iw = - qx * x - qy * y - qz * z;\n\n\t\t// calculate result * inverse quat\n\n\t\tthis.x = ix * qw + iw * - qx + iy * - qz - iz * - qy;\n\t\tthis.y = iy * qw + iw * - qy + iz * - qx - ix * - qz;\n\t\tthis.z = iz * qw + iw * - qz + ix * - qy - iy * - qx;\n\n\t\treturn this;\n\n\t}\n\n\tproject( camera ) {\n\n\t\treturn this.applyMatrix4( camera.matrixWorldInverse ).applyMatrix4( camera.projectionMatrix );\n\n\t}\n\n\tunproject( camera ) {\n\n\t\treturn this.applyMatrix4( camera.projectionMatrixInverse ).applyMatrix4( camera.matrixWorld );\n\n\t}\n\n\ttransformDirection( m ) {\n\n\t\t// input: THREE.Matrix4 affine matrix\n\t\t// vector interpreted as a direction\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z;\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z;\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z;\n\n\t\treturn this.normalize();\n\n\t}\n\n\tdivide( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\t\tthis.z /= v.z;\n\n\t\treturn this;\n\n\t}\n\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\t\tthis.z = Math.min( this.z, v.z );\n\n\t\treturn this;\n\n\t}\n\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\t\tthis.z = Math.max( this.z, v.z );\n\n\t\treturn this;\n\n\t}\n\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = Math.max( minVal, Math.min( maxVal, this.x ) );\n\t\tthis.y = Math.max( minVal, Math.min( maxVal, this.y ) );\n\t\tthis.z = Math.max( minVal, Math.min( maxVal, this.z ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );\n\n\t}\n\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\t\tthis.z = Math.floor( this.z );\n\n\t\treturn this;\n\n\t}\n\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\t\tthis.z = Math.ceil( this.z );\n\n\t\treturn this;\n\n\t}\n\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\t\tthis.z = Math.round( this.z );\n\n\t\treturn this;\n\n\t}\n\n\troundToZero() {\n\n\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\n\t\treturn this;\n\n\t}\n\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\t\tthis.z = - this.z;\n\n\t\treturn this;\n\n\t}\n\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z;\n\n\t}\n\n\t// TODO lengthSquared?\n\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z;\n\n\t}\n\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\n\n\t}\n\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z );\n\n\t}\n\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\tthis.z += ( v.z - this.z ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\t\tthis.z = v1.z + ( v2.z - v1.z ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tcross( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' );\n\t\t\treturn this.crossVectors( v, w );\n\n\t\t}\n\n\t\treturn this.crossVectors( this, v );\n\n\t}\n\n\tcrossVectors( a, b ) {\n\n\t\tconst ax = a.x, ay = a.y, az = a.z;\n\t\tconst bx = b.x, by = b.y, bz = b.z;\n\n\t\tthis.x = ay * bz - az * by;\n\t\tthis.y = az * bx - ax * bz;\n\t\tthis.z = ax * by - ay * bx;\n\n\t\treturn this;\n\n\t}\n\n\tprojectOnVector( v ) {\n\n\t\tconst denominator = v.lengthSq();\n\n\t\tif ( denominator === 0 ) return this.set( 0, 0, 0 );\n\n\t\tconst scalar = v.dot( this ) / denominator;\n\n\t\treturn this.copy( v ).multiplyScalar( scalar );\n\n\t}\n\n\tprojectOnPlane( planeNormal ) {\n\n\t\t_vector.copy( this ).projectOnVector( planeNormal );\n\n\t\treturn this.sub( _vector );\n\n\t}\n\n\treflect( normal ) {\n\n\t\t// reflect incident vector off plane orthogonal to normal\n\t\t// normal is assumed to have unit length\n\n\t\treturn this.sub( _vector.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) );\n\n\t}\n\n\tangleTo( v ) {\n\n\t\tconst denominator = Math.sqrt( this.lengthSq() * v.lengthSq() );\n\n\t\tif ( denominator === 0 ) return Math.PI / 2;\n\n\t\tconst theta = this.dot( v ) / denominator;\n\n\t\t// clamp, to handle numerical problems\n\n\t\treturn Math.acos( MathUtils.clamp( theta, - 1, 1 ) );\n\n\t}\n\n\tdistanceTo( v ) {\n\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t}\n\n\tdistanceToSquared( v ) {\n\n\t\tconst dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z;\n\n\t\treturn dx * dx + dy * dy + dz * dz;\n\n\t}\n\n\tmanhattanDistanceTo( v ) {\n\n\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z );\n\n\t}\n\n\tsetFromSpherical( s ) {\n\n\t\treturn this.setFromSphericalCoords( s.radius, s.phi, s.theta );\n\n\t}\n\n\tsetFromSphericalCoords( radius, phi, theta ) {\n\n\t\tconst sinPhiRadius = Math.sin( phi ) * radius;\n\n\t\tthis.x = sinPhiRadius * Math.sin( theta );\n\t\tthis.y = Math.cos( phi ) * radius;\n\t\tthis.z = sinPhiRadius * Math.cos( theta );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromCylindrical( c ) {\n\n\t\treturn this.setFromCylindricalCoords( c.radius, c.theta, c.y );\n\n\t}\n\n\tsetFromCylindricalCoords( radius, theta, y ) {\n\n\t\tthis.x = radius * Math.sin( theta );\n\t\tthis.y = y;\n\t\tthis.z = radius * Math.cos( theta );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrixPosition( m ) {\n\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 12 ];\n\t\tthis.y = e[ 13 ];\n\t\tthis.z = e[ 14 ];\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrixScale( m ) {\n\n\t\tconst sx = this.setFromMatrixColumn( m, 0 ).length();\n\t\tconst sy = this.setFromMatrixColumn( m, 1 ).length();\n\t\tconst sz = this.setFromMatrixColumn( m, 2 ).length();\n\n\t\tthis.x = sx;\n\t\tthis.y = sy;\n\t\tthis.z = sz;\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrixColumn( m, index ) {\n\n\t\treturn this.fromArray( m.elements, index * 4 );\n\n\t}\n\n\tsetFromMatrix3Column( m, index ) {\n\n\t\treturn this.fromArray( m.elements, index * 3 );\n\n\t}\n\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\t\tthis.z = array[ offset + 2 ];\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\t\tarray[ offset + 2 ] = this.z;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index, offset ) {\n\n\t\tif ( offset !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: offset has been removed from .fromBufferAttribute().' );\n\n\t\t}\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\t\tthis.z = attribute.getZ( index );\n\n\t\treturn this;\n\n\t}\n\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\t\tthis.z = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\trandomDirection() {\n\n\t\t// Derived from https://mathworld.wolfram.com/SpherePointPicking.html\n\n\t\tconst u = ( Math.random() - 0.5 ) * 2;\n\t\tconst t = Math.random() * Math.PI * 2;\n\t\tconst f = Math.sqrt( 1 - u ** 2 );\n\n\t\tthis.x = f * Math.cos( t );\n\t\tthis.y = f * Math.sin( t );\n\t\tthis.z = u;\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\t\tyield this.z;\n\n\t}\n\n}\n\nVector3.prototype.isVector3 = true;\n\nconst _vector = /*@__PURE__*/ new Vector3();\nconst _quaternion = /*@__PURE__*/ new Quaternion();\n\nexport { Vector3 };\n","import { Vector3 } from './Vector3.js';\n\nclass Matrix4 {\n\n\tconstructor() {\n\n\t\tthis.elements = [\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t];\n\n\t\tif ( arguments.length > 0 ) {\n\n\t\t\tconsole.error( 'THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.' );\n\n\t\t}\n\n\t}\n\n\tset( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14;\n\t\tte[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24;\n\t\tte[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34;\n\t\tte[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44;\n\n\t\treturn this;\n\n\t}\n\n\tidentity() {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new Matrix4().fromArray( this.elements );\n\n\t}\n\n\tcopy( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tte[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; te[ 3 ] = me[ 3 ];\n\t\tte[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ];\n\t\tte[ 8 ] = me[ 8 ]; te[ 9 ] = me[ 9 ]; te[ 10 ] = me[ 10 ]; te[ 11 ] = me[ 11 ];\n\t\tte[ 12 ] = me[ 12 ]; te[ 13 ] = me[ 13 ]; te[ 14 ] = me[ 14 ]; te[ 15 ] = me[ 15 ];\n\n\t\treturn this;\n\n\t}\n\n\tcopyPosition( m ) {\n\n\t\tconst te = this.elements, me = m.elements;\n\n\t\tte[ 12 ] = me[ 12 ];\n\t\tte[ 13 ] = me[ 13 ];\n\t\tte[ 14 ] = me[ 14 ];\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrix3( m ) {\n\n\t\tconst me = m.elements;\n\n\t\tthis.set(\n\n\t\t\tme[ 0 ], me[ 3 ], me[ 6 ], 0,\n\t\t\tme[ 1 ], me[ 4 ], me[ 7 ], 0,\n\t\t\tme[ 2 ], me[ 5 ], me[ 8 ], 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\textractBasis( xAxis, yAxis, zAxis ) {\n\n\t\txAxis.setFromMatrixColumn( this, 0 );\n\t\tyAxis.setFromMatrixColumn( this, 1 );\n\t\tzAxis.setFromMatrixColumn( this, 2 );\n\n\t\treturn this;\n\n\t}\n\n\tmakeBasis( xAxis, yAxis, zAxis ) {\n\n\t\tthis.set(\n\t\t\txAxis.x, yAxis.x, zAxis.x, 0,\n\t\t\txAxis.y, yAxis.y, zAxis.y, 0,\n\t\t\txAxis.z, yAxis.z, zAxis.z, 0,\n\t\t\t0, 0, 0, 1\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\textractRotation( m ) {\n\n\t\t// this method does not support reflection matrices\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tconst scaleX = 1 / _v1.setFromMatrixColumn( m, 0 ).length();\n\t\tconst scaleY = 1 / _v1.setFromMatrixColumn( m, 1 ).length();\n\t\tconst scaleZ = 1 / _v1.setFromMatrixColumn( m, 2 ).length();\n\n\t\tte[ 0 ] = me[ 0 ] * scaleX;\n\t\tte[ 1 ] = me[ 1 ] * scaleX;\n\t\tte[ 2 ] = me[ 2 ] * scaleX;\n\t\tte[ 3 ] = 0;\n\n\t\tte[ 4 ] = me[ 4 ] * scaleY;\n\t\tte[ 5 ] = me[ 5 ] * scaleY;\n\t\tte[ 6 ] = me[ 6 ] * scaleY;\n\t\tte[ 7 ] = 0;\n\n\t\tte[ 8 ] = me[ 8 ] * scaleZ;\n\t\tte[ 9 ] = me[ 9 ] * scaleZ;\n\t\tte[ 10 ] = me[ 10 ] * scaleZ;\n\t\tte[ 11 ] = 0;\n\n\t\tte[ 12 ] = 0;\n\t\tte[ 13 ] = 0;\n\t\tte[ 14 ] = 0;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationFromEuler( euler ) {\n\n\t\tif ( ! ( euler && euler.isEuler ) ) {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.' );\n\n\t\t}\n\n\t\tconst te = this.elements;\n\n\t\tconst x = euler.x, y = euler.y, z = euler.z;\n\t\tconst a = Math.cos( x ), b = Math.sin( x );\n\t\tconst c = Math.cos( y ), d = Math.sin( y );\n\t\tconst e = Math.cos( z ), f = Math.sin( z );\n\n\t\tif ( euler.order === 'XYZ' ) {\n\n\t\t\tconst ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = - c * f;\n\t\t\tte[ 8 ] = d;\n\n\t\t\tte[ 1 ] = af + be * d;\n\t\t\tte[ 5 ] = ae - bf * d;\n\t\t\tte[ 9 ] = - b * c;\n\n\t\t\tte[ 2 ] = bf - ae * d;\n\t\t\tte[ 6 ] = be + af * d;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'YXZ' ) {\n\n\t\t\tconst ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[ 0 ] = ce + df * b;\n\t\t\tte[ 4 ] = de * b - cf;\n\t\t\tte[ 8 ] = a * d;\n\n\t\t\tte[ 1 ] = a * f;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = - b;\n\n\t\t\tte[ 2 ] = cf * b - de;\n\t\t\tte[ 6 ] = df + ce * b;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'ZXY' ) {\n\n\t\t\tconst ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[ 0 ] = ce - df * b;\n\t\t\tte[ 4 ] = - a * f;\n\t\t\tte[ 8 ] = de + cf * b;\n\n\t\t\tte[ 1 ] = cf + de * b;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = df - ce * b;\n\n\t\t\tte[ 2 ] = - a * d;\n\t\t\tte[ 6 ] = b;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'ZYX' ) {\n\n\t\t\tconst ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = be * d - af;\n\t\t\tte[ 8 ] = ae * d + bf;\n\n\t\t\tte[ 1 ] = c * f;\n\t\t\tte[ 5 ] = bf * d + ae;\n\t\t\tte[ 9 ] = af * d - be;\n\n\t\t\tte[ 2 ] = - d;\n\t\t\tte[ 6 ] = b * c;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'YZX' ) {\n\n\t\t\tconst ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = bd - ac * f;\n\t\t\tte[ 8 ] = bc * f + ad;\n\n\t\t\tte[ 1 ] = f;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = - b * e;\n\n\t\t\tte[ 2 ] = - d * e;\n\t\t\tte[ 6 ] = ad * f + bc;\n\t\t\tte[ 10 ] = ac - bd * f;\n\n\t\t} else if ( euler.order === 'XZY' ) {\n\n\t\t\tconst ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = - f;\n\t\t\tte[ 8 ] = d * e;\n\n\t\t\tte[ 1 ] = ac * f + bd;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = ad * f - bc;\n\n\t\t\tte[ 2 ] = bc * f - ad;\n\t\t\tte[ 6 ] = b * e;\n\t\t\tte[ 10 ] = bd * f + ac;\n\n\t\t}\n\n\t\t// bottom row\n\t\tte[ 3 ] = 0;\n\t\tte[ 7 ] = 0;\n\t\tte[ 11 ] = 0;\n\n\t\t// last column\n\t\tte[ 12 ] = 0;\n\t\tte[ 13 ] = 0;\n\t\tte[ 14 ] = 0;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationFromQuaternion( q ) {\n\n\t\treturn this.compose( _zero, q, _one );\n\n\t}\n\n\tlookAt( eye, target, up ) {\n\n\t\tconst te = this.elements;\n\n\t\t_z.subVectors( eye, target );\n\n\t\tif ( _z.lengthSq() === 0 ) {\n\n\t\t\t// eye and target are in the same position\n\n\t\t\t_z.z = 1;\n\n\t\t}\n\n\t\t_z.normalize();\n\t\t_x.crossVectors( up, _z );\n\n\t\tif ( _x.lengthSq() === 0 ) {\n\n\t\t\t// up and z are parallel\n\n\t\t\tif ( Math.abs( up.z ) === 1 ) {\n\n\t\t\t\t_z.x += 0.0001;\n\n\t\t\t} else {\n\n\t\t\t\t_z.z += 0.0001;\n\n\t\t\t}\n\n\t\t\t_z.normalize();\n\t\t\t_x.crossVectors( up, _z );\n\n\t\t}\n\n\t\t_x.normalize();\n\t\t_y.crossVectors( _z, _x );\n\n\t\tte[ 0 ] = _x.x; te[ 4 ] = _y.x; te[ 8 ] = _z.x;\n\t\tte[ 1 ] = _x.y; te[ 5 ] = _y.y; te[ 9 ] = _z.y;\n\t\tte[ 2 ] = _x.z; te[ 6 ] = _y.z; te[ 10 ] = _z.z;\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( m, n ) {\n\n\t\tif ( n !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.' );\n\t\t\treturn this.multiplyMatrices( m, n );\n\n\t\t}\n\n\t\treturn this.multiplyMatrices( this, m );\n\n\t}\n\n\tpremultiply( m ) {\n\n\t\treturn this.multiplyMatrices( m, this );\n\n\t}\n\n\tmultiplyMatrices( a, b ) {\n\n\t\tconst ae = a.elements;\n\t\tconst be = b.elements;\n\t\tconst te = this.elements;\n\n\t\tconst a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ];\n\t\tconst a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ];\n\t\tconst a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ];\n\t\tconst a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ];\n\n\t\tconst b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ];\n\t\tconst b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ];\n\t\tconst b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ];\n\t\tconst b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ];\n\n\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n\t\tte[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n\t\tte[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n\t\tte[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n\n\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n\t\tte[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n\t\tte[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n\t\tte[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n\n\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n\t\tte[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n\t\tte[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n\t\tte[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n\n\t\tte[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n\t\tte[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n\t\tte[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n\t\tte[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( s ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s;\n\t\tte[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s;\n\t\tte[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s;\n\t\tte[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s;\n\n\t\treturn this;\n\n\t}\n\n\tdeterminant() {\n\n\t\tconst te = this.elements;\n\n\t\tconst n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ];\n\t\tconst n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ];\n\t\tconst n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ];\n\t\tconst n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ];\n\n\t\t//TODO: make this more efficient\n\t\t//( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )\n\n\t\treturn (\n\t\t\tn41 * (\n\t\t\t\t+ n14 * n23 * n32\n\t\t\t\t - n13 * n24 * n32\n\t\t\t\t - n14 * n22 * n33\n\t\t\t\t + n12 * n24 * n33\n\t\t\t\t + n13 * n22 * n34\n\t\t\t\t - n12 * n23 * n34\n\t\t\t) +\n\t\t\tn42 * (\n\t\t\t\t+ n11 * n23 * n34\n\t\t\t\t - n11 * n24 * n33\n\t\t\t\t + n14 * n21 * n33\n\t\t\t\t - n13 * n21 * n34\n\t\t\t\t + n13 * n24 * n31\n\t\t\t\t - n14 * n23 * n31\n\t\t\t) +\n\t\t\tn43 * (\n\t\t\t\t+ n11 * n24 * n32\n\t\t\t\t - n11 * n22 * n34\n\t\t\t\t - n14 * n21 * n32\n\t\t\t\t + n12 * n21 * n34\n\t\t\t\t + n14 * n22 * n31\n\t\t\t\t - n12 * n24 * n31\n\t\t\t) +\n\t\t\tn44 * (\n\t\t\t\t- n13 * n22 * n31\n\t\t\t\t - n11 * n23 * n32\n\t\t\t\t + n11 * n22 * n33\n\t\t\t\t + n13 * n21 * n32\n\t\t\t\t - n12 * n21 * n33\n\t\t\t\t + n12 * n23 * n31\n\t\t\t)\n\n\t\t);\n\n\t}\n\n\ttranspose() {\n\n\t\tconst te = this.elements;\n\t\tlet tmp;\n\n\t\ttmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp;\n\t\ttmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp;\n\t\ttmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp;\n\n\t\ttmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp;\n\t\ttmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp;\n\t\ttmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp;\n\n\t\treturn this;\n\n\t}\n\n\tsetPosition( x, y, z ) {\n\n\t\tconst te = this.elements;\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\tte[ 12 ] = x.x;\n\t\t\tte[ 13 ] = x.y;\n\t\t\tte[ 14 ] = x.z;\n\n\t\t} else {\n\n\t\t\tte[ 12 ] = x;\n\t\t\tte[ 13 ] = y;\n\t\t\tte[ 14 ] = z;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tinvert() {\n\n\t\t// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n\t\tconst te = this.elements,\n\n\t\t\tn11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ], n41 = te[ 3 ],\n\t\t\tn12 = te[ 4 ], n22 = te[ 5 ], n32 = te[ 6 ], n42 = te[ 7 ],\n\t\t\tn13 = te[ 8 ], n23 = te[ 9 ], n33 = te[ 10 ], n43 = te[ 11 ],\n\t\t\tn14 = te[ 12 ], n24 = te[ 13 ], n34 = te[ 14 ], n44 = te[ 15 ],\n\n\t\t\tt11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,\n\t\t\tt12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,\n\t\t\tt13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,\n\t\t\tt14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;\n\n\t\tconst det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;\n\n\t\tif ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );\n\n\t\tconst detInv = 1 / det;\n\n\t\tte[ 0 ] = t11 * detInv;\n\t\tte[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv;\n\t\tte[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv;\n\t\tte[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv;\n\n\t\tte[ 4 ] = t12 * detInv;\n\t\tte[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv;\n\t\tte[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv;\n\t\tte[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv;\n\n\t\tte[ 8 ] = t13 * detInv;\n\t\tte[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv;\n\t\tte[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv;\n\t\tte[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv;\n\n\t\tte[ 12 ] = t14 * detInv;\n\t\tte[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv;\n\t\tte[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv;\n\t\tte[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv;\n\n\t\treturn this;\n\n\t}\n\n\tscale( v ) {\n\n\t\tconst te = this.elements;\n\t\tconst x = v.x, y = v.y, z = v.z;\n\n\t\tte[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z;\n\t\tte[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z;\n\t\tte[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z;\n\t\tte[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z;\n\n\t\treturn this;\n\n\t}\n\n\tgetMaxScaleOnAxis() {\n\n\t\tconst te = this.elements;\n\n\t\tconst scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ];\n\t\tconst scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ];\n\t\tconst scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ];\n\n\t\treturn Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) );\n\n\t}\n\n\tmakeTranslation( x, y, z ) {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, x,\n\t\t\t0, 1, 0, y,\n\t\t\t0, 0, 1, z,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationX( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, c, - s, 0,\n\t\t\t0, s, c, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationY( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\t c, 0, s, 0,\n\t\t\t 0, 1, 0, 0,\n\t\t\t- s, 0, c, 0,\n\t\t\t 0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationZ( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\tc, - s, 0, 0,\n\t\t\ts, c, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationAxis( axis, angle ) {\n\n\t\t// Based on http://www.gamedev.net/reference/articles/article1199.asp\n\n\t\tconst c = Math.cos( angle );\n\t\tconst s = Math.sin( angle );\n\t\tconst t = 1 - c;\n\t\tconst x = axis.x, y = axis.y, z = axis.z;\n\t\tconst tx = t * x, ty = t * y;\n\n\t\tthis.set(\n\n\t\t\ttx * x + c, tx * y - s * z, tx * z + s * y, 0,\n\t\t\ttx * y + s * z, ty * y + c, ty * z - s * x, 0,\n\t\t\ttx * z - s * y, ty * z + s * x, t * z * z + c, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeScale( x, y, z ) {\n\n\t\tthis.set(\n\n\t\t\tx, 0, 0, 0,\n\t\t\t0, y, 0, 0,\n\t\t\t0, 0, z, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeShear( xy, xz, yx, yz, zx, zy ) {\n\n\t\tthis.set(\n\n\t\t\t1, yx, zx, 0,\n\t\t\txy, 1, zy, 0,\n\t\t\txz, yz, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tcompose( position, quaternion, scale ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = quaternion._x, y = quaternion._y, z = quaternion._z, w = quaternion._w;\n\t\tconst x2 = x + x,\ty2 = y + y, z2 = z + z;\n\t\tconst xx = x * x2, xy = x * y2, xz = x * z2;\n\t\tconst yy = y * y2, yz = y * z2, zz = z * z2;\n\t\tconst wx = w * x2, wy = w * y2, wz = w * z2;\n\n\t\tconst sx = scale.x, sy = scale.y, sz = scale.z;\n\n\t\tte[ 0 ] = ( 1 - ( yy + zz ) ) * sx;\n\t\tte[ 1 ] = ( xy + wz ) * sx;\n\t\tte[ 2 ] = ( xz - wy ) * sx;\n\t\tte[ 3 ] = 0;\n\n\t\tte[ 4 ] = ( xy - wz ) * sy;\n\t\tte[ 5 ] = ( 1 - ( xx + zz ) ) * sy;\n\t\tte[ 6 ] = ( yz + wx ) * sy;\n\t\tte[ 7 ] = 0;\n\n\t\tte[ 8 ] = ( xz + wy ) * sz;\n\t\tte[ 9 ] = ( yz - wx ) * sz;\n\t\tte[ 10 ] = ( 1 - ( xx + yy ) ) * sz;\n\t\tte[ 11 ] = 0;\n\n\t\tte[ 12 ] = position.x;\n\t\tte[ 13 ] = position.y;\n\t\tte[ 14 ] = position.z;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\tdecompose( position, quaternion, scale ) {\n\n\t\tconst te = this.elements;\n\n\t\tlet sx = _v1.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length();\n\t\tconst sy = _v1.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length();\n\t\tconst sz = _v1.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length();\n\n\t\t// if determine is negative, we need to invert one scale\n\t\tconst det = this.determinant();\n\t\tif ( det < 0 ) sx = - sx;\n\n\t\tposition.x = te[ 12 ];\n\t\tposition.y = te[ 13 ];\n\t\tposition.z = te[ 14 ];\n\n\t\t// scale the rotation part\n\t\t_m1.copy( this );\n\n\t\tconst invSX = 1 / sx;\n\t\tconst invSY = 1 / sy;\n\t\tconst invSZ = 1 / sz;\n\n\t\t_m1.elements[ 0 ] *= invSX;\n\t\t_m1.elements[ 1 ] *= invSX;\n\t\t_m1.elements[ 2 ] *= invSX;\n\n\t\t_m1.elements[ 4 ] *= invSY;\n\t\t_m1.elements[ 5 ] *= invSY;\n\t\t_m1.elements[ 6 ] *= invSY;\n\n\t\t_m1.elements[ 8 ] *= invSZ;\n\t\t_m1.elements[ 9 ] *= invSZ;\n\t\t_m1.elements[ 10 ] *= invSZ;\n\n\t\tquaternion.setFromRotationMatrix( _m1 );\n\n\t\tscale.x = sx;\n\t\tscale.y = sy;\n\t\tscale.z = sz;\n\n\t\treturn this;\n\n\t}\n\n\tmakePerspective( left, right, top, bottom, near, far ) {\n\n\t\tif ( far === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.' );\n\n\t\t}\n\n\t\tconst te = this.elements;\n\t\tconst x = 2 * near / ( right - left );\n\t\tconst y = 2 * near / ( top - bottom );\n\n\t\tconst a = ( right + left ) / ( right - left );\n\t\tconst b = ( top + bottom ) / ( top - bottom );\n\t\tconst c = - ( far + near ) / ( far - near );\n\t\tconst d = - 2 * far * near / ( far - near );\n\n\t\tte[ 0 ] = x;\tte[ 4 ] = 0;\tte[ 8 ] = a;\tte[ 12 ] = 0;\n\t\tte[ 1 ] = 0;\tte[ 5 ] = y;\tte[ 9 ] = b;\tte[ 13 ] = 0;\n\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = c;\tte[ 14 ] = d;\n\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = - 1;\tte[ 15 ] = 0;\n\n\t\treturn this;\n\n\t}\n\n\tmakeOrthographic( left, right, top, bottom, near, far ) {\n\n\t\tconst te = this.elements;\n\t\tconst w = 1.0 / ( right - left );\n\t\tconst h = 1.0 / ( top - bottom );\n\t\tconst p = 1.0 / ( far - near );\n\n\t\tconst x = ( right + left ) * w;\n\t\tconst y = ( top + bottom ) * h;\n\t\tconst z = ( far + near ) * p;\n\n\t\tte[ 0 ] = 2 * w;\tte[ 4 ] = 0;\tte[ 8 ] = 0;\tte[ 12 ] = - x;\n\t\tte[ 1 ] = 0;\tte[ 5 ] = 2 * h;\tte[ 9 ] = 0;\tte[ 13 ] = - y;\n\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = - 2 * p;\tte[ 14 ] = - z;\n\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = 0;\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\tequals( matrix ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = matrix.elements;\n\n\t\tfor ( let i = 0; i < 16; i ++ ) {\n\n\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 16; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst te = this.elements;\n\n\t\tarray[ offset ] = te[ 0 ];\n\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\tarray[ offset + 2 ] = te[ 2 ];\n\t\tarray[ offset + 3 ] = te[ 3 ];\n\n\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\tarray[ offset + 5 ] = te[ 5 ];\n\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\tarray[ offset + 7 ] = te[ 7 ];\n\n\t\tarray[ offset + 8 ] = te[ 8 ];\n\t\tarray[ offset + 9 ] = te[ 9 ];\n\t\tarray[ offset + 10 ] = te[ 10 ];\n\t\tarray[ offset + 11 ] = te[ 11 ];\n\n\t\tarray[ offset + 12 ] = te[ 12 ];\n\t\tarray[ offset + 13 ] = te[ 13 ];\n\t\tarray[ offset + 14 ] = te[ 14 ];\n\t\tarray[ offset + 15 ] = te[ 15 ];\n\n\t\treturn array;\n\n\t}\n\n}\n\nMatrix4.prototype.isMatrix4 = true;\n\nconst _v1 = /*@__PURE__*/ new Vector3();\nconst _m1 = /*@__PURE__*/ new Matrix4();\nconst _zero = /*@__PURE__*/ new Vector3( 0, 0, 0 );\nconst _one = /*@__PURE__*/ new Vector3( 1, 1, 1 );\nconst _x = /*@__PURE__*/ new Vector3();\nconst _y = /*@__PURE__*/ new Vector3();\nconst _z = /*@__PURE__*/ new Vector3();\n\nexport { Matrix4 };\n","import { Quaternion } from './Quaternion.js';\nimport { Vector3 } from './Vector3.js';\nimport { Matrix4 } from './Matrix4.js';\nimport { clamp } from './MathUtils.js';\n\nconst _matrix = /*@__PURE__*/ new Matrix4();\nconst _quaternion = /*@__PURE__*/ new Quaternion();\n\nclass Euler {\n\n\tconstructor( x = 0, y = 0, z = 0, order = Euler.DefaultOrder ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order;\n\n\t}\n\n\tget x() {\n\n\t\treturn this._x;\n\n\t}\n\n\tset x( value ) {\n\n\t\tthis._x = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget y() {\n\n\t\treturn this._y;\n\n\t}\n\n\tset y( value ) {\n\n\t\tthis._y = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget z() {\n\n\t\treturn this._z;\n\n\t}\n\n\tset z( value ) {\n\n\t\tthis._z = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget order() {\n\n\t\treturn this._order;\n\n\t}\n\n\tset order( value ) {\n\n\t\tthis._order = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tset( x, y, z, order = this._order ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._order );\n\n\t}\n\n\tcopy( euler ) {\n\n\t\tthis._x = euler._x;\n\t\tthis._y = euler._y;\n\t\tthis._z = euler._z;\n\t\tthis._order = euler._order;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromRotationMatrix( m, order = this._order, update = true ) {\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tconst te = m.elements;\n\t\tconst m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ];\n\t\tconst m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ];\n\t\tconst m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\tswitch ( order ) {\n\n\t\t\tcase 'XYZ':\n\n\t\t\t\tthis._y = Math.asin( clamp( m13, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m13 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'YXZ':\n\n\t\t\t\tthis._x = Math.asin( - clamp( m23, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m23 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZXY':\n\n\t\t\t\tthis._x = Math.asin( clamp( m32, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m32 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = 0;\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZYX':\n\n\t\t\t\tthis._y = Math.asin( - clamp( m31, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m31 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'YZX':\n\n\t\t\t\tthis._z = Math.asin( clamp( m21, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m21 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m22 );\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'XZY':\n\n\t\t\t\tthis._z = Math.asin( - clamp( m12, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m12 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._y = Math.atan2( m13, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._y = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tconsole.warn( 'THREE.Euler: .setFromRotationMatrix() encountered an unknown order: ' + order );\n\n\t\t}\n\n\t\tthis._order = order;\n\n\t\tif ( update === true ) this._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromQuaternion( q, order, update ) {\n\n\t\t_matrix.makeRotationFromQuaternion( q );\n\n\t\treturn this.setFromRotationMatrix( _matrix, order, update );\n\n\t}\n\n\tsetFromVector3( v, order = this._order ) {\n\n\t\treturn this.set( v.x, v.y, v.z, order );\n\n\t}\n\n\treorder( newOrder ) {\n\n\t\t// WARNING: this discards revolution information -bhouston\n\n\t\t_quaternion.setFromEuler( this );\n\n\t\treturn this.setFromQuaternion( _quaternion, newOrder );\n\n\t}\n\n\tequals( euler ) {\n\n\t\treturn ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order );\n\n\t}\n\n\tfromArray( array ) {\n\n\t\tthis._x = array[ 0 ];\n\t\tthis._y = array[ 1 ];\n\t\tthis._z = array[ 2 ];\n\t\tif ( array[ 3 ] !== undefined ) this._order = array[ 3 ];\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this._x;\n\t\tarray[ offset + 1 ] = this._y;\n\t\tarray[ offset + 2 ] = this._z;\n\t\tarray[ offset + 3 ] = this._order;\n\n\t\treturn array;\n\n\t}\n\n\ttoVector3( optionalResult ) {\n\n\t\tif ( optionalResult ) {\n\n\t\t\treturn optionalResult.set( this._x, this._y, this._z );\n\n\t\t} else {\n\n\t\t\treturn new Vector3( this._x, this._y, this._z );\n\n\t\t}\n\n\t}\n\n\t_onChange( callback ) {\n\n\t\tthis._onChangeCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t_onChangeCallback() {}\n\n}\n\nEuler.prototype.isEuler = true;\n\nEuler.DefaultOrder = 'XYZ';\nEuler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ];\n\nexport { Euler };\n","class Layers {\n\n\tconstructor() {\n\n\t\tthis.mask = 1 | 0;\n\n\t}\n\n\tset( channel ) {\n\n\t\tthis.mask = ( 1 << channel | 0 ) >>> 0;\n\n\t}\n\n\tenable( channel ) {\n\n\t\tthis.mask |= 1 << channel | 0;\n\n\t}\n\n\tenableAll() {\n\n\t\tthis.mask = 0xffffffff | 0;\n\n\t}\n\n\ttoggle( channel ) {\n\n\t\tthis.mask ^= 1 << channel | 0;\n\n\t}\n\n\tdisable( channel ) {\n\n\t\tthis.mask &= ~ ( 1 << channel | 0 );\n\n\t}\n\n\tdisableAll() {\n\n\t\tthis.mask = 0;\n\n\t}\n\n\ttest( layers ) {\n\n\t\treturn ( this.mask & layers.mask ) !== 0;\n\n\t}\n\n\tisEnabled( channel ) {\n\n\t\treturn ( this.mask & ( 1 << channel | 0 ) ) !== 0;\n\n\t}\n\n}\n\n\nexport { Layers };\n","class Matrix3 {\n\n\tconstructor() {\n\n\t\tthis.elements = [\n\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\n\t\t];\n\n\t\tif ( arguments.length > 0 ) {\n\n\t\t\tconsole.error( 'THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.' );\n\n\t\t}\n\n\t}\n\n\tset( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31;\n\t\tte[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32;\n\t\tte[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33;\n\n\t\treturn this;\n\n\t}\n\n\tidentity() {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tcopy( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tte[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ];\n\t\tte[ 3 ] = me[ 3 ]; te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ];\n\t\tte[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; te[ 8 ] = me[ 8 ];\n\n\t\treturn this;\n\n\t}\n\n\textractBasis( xAxis, yAxis, zAxis ) {\n\n\t\txAxis.setFromMatrix3Column( this, 0 );\n\t\tyAxis.setFromMatrix3Column( this, 1 );\n\t\tzAxis.setFromMatrix3Column( this, 2 );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrix4( m ) {\n\n\t\tconst me = m.elements;\n\n\t\tthis.set(\n\n\t\t\tme[ 0 ], me[ 4 ], me[ 8 ],\n\t\t\tme[ 1 ], me[ 5 ], me[ 9 ],\n\t\t\tme[ 2 ], me[ 6 ], me[ 10 ]\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( m ) {\n\n\t\treturn this.multiplyMatrices( this, m );\n\n\t}\n\n\tpremultiply( m ) {\n\n\t\treturn this.multiplyMatrices( m, this );\n\n\t}\n\n\tmultiplyMatrices( a, b ) {\n\n\t\tconst ae = a.elements;\n\t\tconst be = b.elements;\n\t\tconst te = this.elements;\n\n\t\tconst a11 = ae[ 0 ], a12 = ae[ 3 ], a13 = ae[ 6 ];\n\t\tconst a21 = ae[ 1 ], a22 = ae[ 4 ], a23 = ae[ 7 ];\n\t\tconst a31 = ae[ 2 ], a32 = ae[ 5 ], a33 = ae[ 8 ];\n\n\t\tconst b11 = be[ 0 ], b12 = be[ 3 ], b13 = be[ 6 ];\n\t\tconst b21 = be[ 1 ], b22 = be[ 4 ], b23 = be[ 7 ];\n\t\tconst b31 = be[ 2 ], b32 = be[ 5 ], b33 = be[ 8 ];\n\n\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31;\n\t\tte[ 3 ] = a11 * b12 + a12 * b22 + a13 * b32;\n\t\tte[ 6 ] = a11 * b13 + a12 * b23 + a13 * b33;\n\n\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31;\n\t\tte[ 4 ] = a21 * b12 + a22 * b22 + a23 * b32;\n\t\tte[ 7 ] = a21 * b13 + a22 * b23 + a23 * b33;\n\n\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31;\n\t\tte[ 5 ] = a31 * b12 + a32 * b22 + a33 * b32;\n\t\tte[ 8 ] = a31 * b13 + a32 * b23 + a33 * b33;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( s ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s;\n\t\tte[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s;\n\t\tte[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s;\n\n\t\treturn this;\n\n\t}\n\n\tdeterminant() {\n\n\t\tconst te = this.elements;\n\n\t\tconst a = te[ 0 ], b = te[ 1 ], c = te[ 2 ],\n\t\t\td = te[ 3 ], e = te[ 4 ], f = te[ 5 ],\n\t\t\tg = te[ 6 ], h = te[ 7 ], i = te[ 8 ];\n\n\t\treturn a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;\n\n\t}\n\n\tinvert() {\n\n\t\tconst te = this.elements,\n\n\t\t\tn11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ],\n\t\t\tn12 = te[ 3 ], n22 = te[ 4 ], n32 = te[ 5 ],\n\t\t\tn13 = te[ 6 ], n23 = te[ 7 ], n33 = te[ 8 ],\n\n\t\t\tt11 = n33 * n22 - n32 * n23,\n\t\t\tt12 = n32 * n13 - n33 * n12,\n\t\t\tt13 = n23 * n12 - n22 * n13,\n\n\t\t\tdet = n11 * t11 + n21 * t12 + n31 * t13;\n\n\t\tif ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0 );\n\n\t\tconst detInv = 1 / det;\n\n\t\tte[ 0 ] = t11 * detInv;\n\t\tte[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv;\n\t\tte[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv;\n\n\t\tte[ 3 ] = t12 * detInv;\n\t\tte[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv;\n\t\tte[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv;\n\n\t\tte[ 6 ] = t13 * detInv;\n\t\tte[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv;\n\t\tte[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv;\n\n\t\treturn this;\n\n\t}\n\n\ttranspose() {\n\n\t\tlet tmp;\n\t\tconst m = this.elements;\n\n\t\ttmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp;\n\t\ttmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp;\n\t\ttmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp;\n\n\t\treturn this;\n\n\t}\n\n\tgetNormalMatrix( matrix4 ) {\n\n\t\treturn this.setFromMatrix4( matrix4 ).invert().transpose();\n\n\t}\n\n\ttransposeIntoArray( r ) {\n\n\t\tconst m = this.elements;\n\n\t\tr[ 0 ] = m[ 0 ];\n\t\tr[ 1 ] = m[ 3 ];\n\t\tr[ 2 ] = m[ 6 ];\n\t\tr[ 3 ] = m[ 1 ];\n\t\tr[ 4 ] = m[ 4 ];\n\t\tr[ 5 ] = m[ 7 ];\n\t\tr[ 6 ] = m[ 2 ];\n\t\tr[ 7 ] = m[ 5 ];\n\t\tr[ 8 ] = m[ 8 ];\n\n\t\treturn this;\n\n\t}\n\n\tsetUvTransform( tx, ty, sx, sy, rotation, cx, cy ) {\n\n\t\tconst c = Math.cos( rotation );\n\t\tconst s = Math.sin( rotation );\n\n\t\tthis.set(\n\t\t\tsx * c, sx * s, - sx * ( c * cx + s * cy ) + cx + tx,\n\t\t\t- sy * s, sy * c, - sy * ( - s * cx + c * cy ) + cy + ty,\n\t\t\t0, 0, 1\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tscale( sx, sy ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] *= sx; te[ 3 ] *= sx; te[ 6 ] *= sx;\n\t\tte[ 1 ] *= sy; te[ 4 ] *= sy; te[ 7 ] *= sy;\n\n\t\treturn this;\n\n\t}\n\n\trotate( theta ) {\n\n\t\tconst c = Math.cos( theta );\n\t\tconst s = Math.sin( theta );\n\n\t\tconst te = this.elements;\n\n\t\tconst a11 = te[ 0 ], a12 = te[ 3 ], a13 = te[ 6 ];\n\t\tconst a21 = te[ 1 ], a22 = te[ 4 ], a23 = te[ 7 ];\n\n\t\tte[ 0 ] = c * a11 + s * a21;\n\t\tte[ 3 ] = c * a12 + s * a22;\n\t\tte[ 6 ] = c * a13 + s * a23;\n\n\t\tte[ 1 ] = - s * a11 + c * a21;\n\t\tte[ 4 ] = - s * a12 + c * a22;\n\t\tte[ 7 ] = - s * a13 + c * a23;\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( tx, ty ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] += tx * te[ 2 ]; te[ 3 ] += tx * te[ 5 ]; te[ 6 ] += tx * te[ 8 ];\n\t\tte[ 1 ] += ty * te[ 2 ]; te[ 4 ] += ty * te[ 5 ]; te[ 7 ] += ty * te[ 8 ];\n\n\t\treturn this;\n\n\t}\n\n\tequals( matrix ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = matrix.elements;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst te = this.elements;\n\n\t\tarray[ offset ] = te[ 0 ];\n\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\tarray[ offset + 2 ] = te[ 2 ];\n\n\t\tarray[ offset + 3 ] = te[ 3 ];\n\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\tarray[ offset + 5 ] = te[ 5 ];\n\n\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\tarray[ offset + 7 ] = te[ 7 ];\n\t\tarray[ offset + 8 ] = te[ 8 ];\n\n\t\treturn array;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().fromArray( this.elements );\n\n\t}\n\n}\n\nMatrix3.prototype.isMatrix3 = true;\n\nexport { Matrix3 };\n","import { Quaternion } from '../math/Quaternion.js';\nimport { Vector3 } from '../math/Vector3.js';\nimport { Matrix4 } from '../math/Matrix4.js';\nimport { EventDispatcher } from './EventDispatcher.js';\nimport { Euler } from '../math/Euler.js';\nimport { Layers } from './Layers.js';\nimport { Matrix3 } from '../math/Matrix3.js';\nimport * as MathUtils from '../math/MathUtils.js';\n\nlet _object3DId = 0;\n\nconst _v1 = /*@__PURE__*/ new Vector3();\nconst _q1 = /*@__PURE__*/ new Quaternion();\nconst _m1 = /*@__PURE__*/ new Matrix4();\nconst _target = /*@__PURE__*/ new Vector3();\n\nconst _position = /*@__PURE__*/ new Vector3();\nconst _scale = /*@__PURE__*/ new Vector3();\nconst _quaternion = /*@__PURE__*/ new Quaternion();\n\nconst _xAxis = /*@__PURE__*/ new Vector3( 1, 0, 0 );\nconst _yAxis = /*@__PURE__*/ new Vector3( 0, 1, 0 );\nconst _zAxis = /*@__PURE__*/ new Vector3( 0, 0, 1 );\n\nconst _addedEvent = { type: 'added' };\nconst _removedEvent = { type: 'removed' };\n\nclass Object3D extends EventDispatcher {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tObject.defineProperty( this, 'id', { value: _object3DId ++ } );\n\n\t\tthis.uuid = MathUtils.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Object3D';\n\n\t\tthis.parent = null;\n\t\tthis.children = [];\n\n\t\tthis.up = Object3D.DefaultUp.clone();\n\n\t\tconst position = new Vector3();\n\t\tconst rotation = new Euler();\n\t\tconst quaternion = new Quaternion();\n\t\tconst scale = new Vector3( 1, 1, 1 );\n\n\t\tfunction onRotationChange() {\n\n\t\t\tquaternion.setFromEuler( rotation, false );\n\n\t\t}\n\n\t\tfunction onQuaternionChange() {\n\n\t\t\trotation.setFromQuaternion( quaternion, undefined, false );\n\n\t\t}\n\n\t\trotation._onChange( onRotationChange );\n\t\tquaternion._onChange( onQuaternionChange );\n\n\t\tObject.defineProperties( this, {\n\t\t\tposition: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: position\n\t\t\t},\n\t\t\trotation: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: rotation\n\t\t\t},\n\t\t\tquaternion: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: quaternion\n\t\t\t},\n\t\t\tscale: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: scale\n\t\t\t},\n\t\t\tmodelViewMatrix: {\n\t\t\t\tvalue: new Matrix4()\n\t\t\t},\n\t\t\tnormalMatrix: {\n\t\t\t\tvalue: new Matrix3()\n\t\t\t}\n\t\t} );\n\n\t\tthis.matrix = new Matrix4();\n\t\tthis.matrixWorld = new Matrix4();\n\n\t\tthis.matrixAutoUpdate = Object3D.DefaultMatrixAutoUpdate;\n\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\tthis.layers = new Layers();\n\t\tthis.visible = true;\n\n\t\tthis.castShadow = false;\n\t\tthis.receiveShadow = false;\n\n\t\tthis.frustumCulled = true;\n\t\tthis.renderOrder = 0;\n\n\t\tthis.animations = [];\n\n\t\tthis.userData = {};\n\n\t}\n\n\tonBeforeRender( /* renderer, scene, camera, geometry, material, group */ ) {}\n\n\tonAfterRender( /* renderer, scene, camera, geometry, material, group */ ) {}\n\n\tapplyMatrix4( matrix ) {\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tthis.matrix.premultiply( matrix );\n\n\t\tthis.matrix.decompose( this.position, this.quaternion, this.scale );\n\n\t}\n\n\tapplyQuaternion( q ) {\n\n\t\tthis.quaternion.premultiply( q );\n\n\t\treturn this;\n\n\t}\n\n\tsetRotationFromAxisAngle( axis, angle ) {\n\n\t\t// assumes axis is normalized\n\n\t\tthis.quaternion.setFromAxisAngle( axis, angle );\n\n\t}\n\n\tsetRotationFromEuler( euler ) {\n\n\t\tthis.quaternion.setFromEuler( euler, true );\n\n\t}\n\n\tsetRotationFromMatrix( m ) {\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tthis.quaternion.setFromRotationMatrix( m );\n\n\t}\n\n\tsetRotationFromQuaternion( q ) {\n\n\t\t// assumes q is normalized\n\n\t\tthis.quaternion.copy( q );\n\n\t}\n\n\trotateOnAxis( axis, angle ) {\n\n\t\t// rotate object on axis in object space\n\t\t// axis is assumed to be normalized\n\n\t\t_q1.setFromAxisAngle( axis, angle );\n\n\t\tthis.quaternion.multiply( _q1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateOnWorldAxis( axis, angle ) {\n\n\t\t// rotate object on axis in world space\n\t\t// axis is assumed to be normalized\n\t\t// method assumes no rotated parent\n\n\t\t_q1.setFromAxisAngle( axis, angle );\n\n\t\tthis.quaternion.premultiply( _q1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateX( angle ) {\n\n\t\treturn this.rotateOnAxis( _xAxis, angle );\n\n\t}\n\n\trotateY( angle ) {\n\n\t\treturn this.rotateOnAxis( _yAxis, angle );\n\n\t}\n\n\trotateZ( angle ) {\n\n\t\treturn this.rotateOnAxis( _zAxis, angle );\n\n\t}\n\n\ttranslateOnAxis( axis, distance ) {\n\n\t\t// translate object by distance along axis in object space\n\t\t// axis is assumed to be normalized\n\n\t\t_v1.copy( axis ).applyQuaternion( this.quaternion );\n\n\t\tthis.position.add( _v1.multiplyScalar( distance ) );\n\n\t\treturn this;\n\n\t}\n\n\ttranslateX( distance ) {\n\n\t\treturn this.translateOnAxis( _xAxis, distance );\n\n\t}\n\n\ttranslateY( distance ) {\n\n\t\treturn this.translateOnAxis( _yAxis, distance );\n\n\t}\n\n\ttranslateZ( distance ) {\n\n\t\treturn this.translateOnAxis( _zAxis, distance );\n\n\t}\n\n\tlocalToWorld( vector ) {\n\n\t\treturn vector.applyMatrix4( this.matrixWorld );\n\n\t}\n\n\tworldToLocal( vector ) {\n\n\t\treturn vector.applyMatrix4( _m1.copy( this.matrixWorld ).invert() );\n\n\t}\n\n\tlookAt( x, y, z ) {\n\n\t\t// This method does not support objects having non-uniformly-scaled parent(s)\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\t_target.copy( x );\n\n\t\t} else {\n\n\t\t\t_target.set( x, y, z );\n\n\t\t}\n\n\t\tconst parent = this.parent;\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\t_position.setFromMatrixPosition( this.matrixWorld );\n\n\t\tif ( this.isCamera || this.isLight ) {\n\n\t\t\t_m1.lookAt( _position, _target, this.up );\n\n\t\t} else {\n\n\t\t\t_m1.lookAt( _target, _position, this.up );\n\n\t\t}\n\n\t\tthis.quaternion.setFromRotationMatrix( _m1 );\n\n\t\tif ( parent ) {\n\n\t\t\t_m1.extractRotation( parent.matrixWorld );\n\t\t\t_q1.setFromRotationMatrix( _m1 );\n\t\t\tthis.quaternion.premultiply( _q1.invert() );\n\n\t\t}\n\n\t}\n\n\tadd( object ) {\n\n\t\tif ( arguments.length > 1 ) {\n\n\t\t\tfor ( let i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\tthis.add( arguments[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( object === this ) {\n\n\t\t\tconsole.error( 'THREE.Object3D.add: object can\\'t be added as a child of itself.', object );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( object && object.isObject3D ) {\n\n\t\t\tif ( object.parent !== null ) {\n\n\t\t\t\tobject.parent.remove( object );\n\n\t\t\t}\n\n\t\t\tobject.parent = this;\n\t\t\tthis.children.push( object );\n\n\t\t\tobject.dispatchEvent( _addedEvent );\n\n\t\t} else {\n\n\t\t\tconsole.error( 'THREE.Object3D.add: object not an instance of THREE.Object3D.', object );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tremove( object ) {\n\n\t\tif ( arguments.length > 1 ) {\n\n\t\t\tfor ( let i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\tthis.remove( arguments[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst index = this.children.indexOf( object );\n\n\t\tif ( index !== - 1 ) {\n\n\t\t\tobject.parent = null;\n\t\t\tthis.children.splice( index, 1 );\n\n\t\t\tobject.dispatchEvent( _removedEvent );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tremoveFromParent() {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( parent !== null ) {\n\n\t\t\tparent.remove( this );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tclear() {\n\n\t\tfor ( let i = 0; i < this.children.length; i ++ ) {\n\n\t\t\tconst object = this.children[ i ];\n\n\t\t\tobject.parent = null;\n\n\t\t\tobject.dispatchEvent( _removedEvent );\n\n\t\t}\n\n\t\tthis.children.length = 0;\n\n\t\treturn this;\n\n\n\t}\n\n\tattach( object ) {\n\n\t\t// adds object as a child of this, while maintaining the object's world transform\n\n\t\t// Note: This method does not support scene graphs having non-uniformly-scaled nodes(s)\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\t_m1.copy( this.matrixWorld ).invert();\n\n\t\tif ( object.parent !== null ) {\n\n\t\t\tobject.parent.updateWorldMatrix( true, false );\n\n\t\t\t_m1.multiply( object.parent.matrixWorld );\n\n\t\t}\n\n\t\tobject.applyMatrix4( _m1 );\n\n\t\tthis.add( object );\n\n\t\tobject.updateWorldMatrix( false, true );\n\n\t\treturn this;\n\n\t}\n\n\tgetObjectById( id ) {\n\n\t\treturn this.getObjectByProperty( 'id', id );\n\n\t}\n\n\tgetObjectByName( name ) {\n\n\t\treturn this.getObjectByProperty( 'name', name );\n\n\t}\n\n\tgetObjectByProperty( name, value ) {\n\n\t\tif ( this[ name ] === value ) return this;\n\n\t\tfor ( let i = 0, l = this.children.length; i < l; i ++ ) {\n\n\t\t\tconst child = this.children[ i ];\n\t\t\tconst object = child.getObjectByProperty( name, value );\n\n\t\t\tif ( object !== undefined ) {\n\n\t\t\t\treturn object;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn undefined;\n\n\t}\n\n\tgetWorldPosition( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\treturn target.setFromMatrixPosition( this.matrixWorld );\n\n\t}\n\n\tgetWorldQuaternion( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tthis.matrixWorld.decompose( _position, target, _scale );\n\n\t\treturn target;\n\n\t}\n\n\tgetWorldScale( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tthis.matrixWorld.decompose( _position, _quaternion, target );\n\n\t\treturn target;\n\n\t}\n\n\tgetWorldDirection( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tconst e = this.matrixWorld.elements;\n\n\t\treturn target.set( e[ 8 ], e[ 9 ], e[ 10 ] ).normalize();\n\n\t}\n\n\traycast( /* raycaster, intersects */ ) {}\n\n\ttraverse( callback ) {\n\n\t\tcallback( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].traverse( callback );\n\n\t\t}\n\n\t}\n\n\ttraverseVisible( callback ) {\n\n\t\tif ( this.visible === false ) return;\n\n\t\tcallback( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].traverseVisible( callback );\n\n\t\t}\n\n\t}\n\n\ttraverseAncestors( callback ) {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( parent !== null ) {\n\n\t\t\tcallback( parent );\n\n\t\t\tparent.traverseAncestors( callback );\n\n\t\t}\n\n\t}\n\n\tupdateMatrix() {\n\n\t\tthis.matrix.compose( this.position, this.quaternion, this.scale );\n\n\t\tthis.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tif ( this.matrixWorldNeedsUpdate || force ) {\n\n\t\t\tif ( this.parent === null ) {\n\n\t\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t\t} else {\n\n\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t\t}\n\n\t\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t\tforce = true;\n\n\t\t}\n\n\t\t// update children\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].updateMatrixWorld( force );\n\n\t\t}\n\n\t}\n\n\tupdateWorldMatrix( updateParents, updateChildren ) {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( updateParents === true && parent !== null ) {\n\n\t\t\tparent.updateWorldMatrix( true, false );\n\n\t\t}\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tif ( this.parent === null ) {\n\n\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t} else {\n\n\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t}\n\n\t\t// update children\n\n\t\tif ( updateChildren === true ) {\n\n\t\t\tconst children = this.children;\n\n\t\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].updateWorldMatrix( false, true );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\t// meta is a string when called from JSON.stringify\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tconst output = {};\n\n\t\t// meta is a hash used to collect geometries, materials.\n\t\t// not providing it implies that this is the root object\n\t\t// being serialized.\n\t\tif ( isRootObject ) {\n\n\t\t\t// initialize meta obj\n\t\t\tmeta = {\n\t\t\t\tgeometries: {},\n\t\t\t\tmaterials: {},\n\t\t\t\ttextures: {},\n\t\t\t\timages: {},\n\t\t\t\tshapes: {},\n\t\t\t\tskeletons: {},\n\t\t\t\tanimations: {}\n\t\t\t};\n\n\t\t\toutput.metadata = {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Object',\n\t\t\t\tgenerator: 'Object3D.toJSON'\n\t\t\t};\n\n\t\t}\n\n\t\t// standard Object3D serialization\n\n\t\tconst object = {};\n\n\t\tobject.uuid = this.uuid;\n\t\tobject.type = this.type;\n\n\t\tif ( this.name !== '' ) object.name = this.name;\n\t\tif ( this.castShadow === true ) object.castShadow = true;\n\t\tif ( this.receiveShadow === true ) object.receiveShadow = true;\n\t\tif ( this.visible === false ) object.visible = false;\n\t\tif ( this.frustumCulled === false ) object.frustumCulled = false;\n\t\tif ( this.renderOrder !== 0 ) object.renderOrder = this.renderOrder;\n\t\tif ( JSON.stringify( this.userData ) !== '{}' ) object.userData = this.userData;\n\n\t\tobject.layers = this.layers.mask;\n\t\tobject.matrix = this.matrix.toArray();\n\n\t\tif ( this.matrixAutoUpdate === false ) object.matrixAutoUpdate = false;\n\n\t\t// object specific properties\n\n\t\tif ( this.isInstancedMesh ) {\n\n\t\t\tobject.type = 'InstancedMesh';\n\t\t\tobject.count = this.count;\n\t\t\tobject.instanceMatrix = this.instanceMatrix.toJSON();\n\t\t\tif ( this.instanceColor !== null ) object.instanceColor = this.instanceColor.toJSON();\n\n\t\t}\n\n\t\t//\n\n\t\tfunction serialize( library, element ) {\n\n\t\t\tif ( library[ element.uuid ] === undefined ) {\n\n\t\t\t\tlibrary[ element.uuid ] = element.toJSON( meta );\n\n\t\t\t}\n\n\t\t\treturn element.uuid;\n\n\t\t}\n\n\t\tif ( this.isScene ) {\n\n\t\t\tif ( this.background ) {\n\n\t\t\t\tif ( this.background.isColor ) {\n\n\t\t\t\t\tobject.background = this.background.toJSON();\n\n\t\t\t\t} else if ( this.background.isTexture ) {\n\n\t\t\t\t\tobject.background = this.background.toJSON( meta ).uuid;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.environment && this.environment.isTexture ) {\n\n\t\t\t\tobject.environment = this.environment.toJSON( meta ).uuid;\n\n\t\t\t}\n\n\t\t} else if ( this.isMesh || this.isLine || this.isPoints ) {\n\n\t\t\tobject.geometry = serialize( meta.geometries, this.geometry );\n\n\t\t\tconst parameters = this.geometry.parameters;\n\n\t\t\tif ( parameters !== undefined && parameters.shapes !== undefined ) {\n\n\t\t\t\tconst shapes = parameters.shapes;\n\n\t\t\t\tif ( Array.isArray( shapes ) ) {\n\n\t\t\t\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tconst shape = shapes[ i ];\n\n\t\t\t\t\t\tserialize( meta.shapes, shape );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tserialize( meta.shapes, shapes );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.isSkinnedMesh ) {\n\n\t\t\tobject.bindMode = this.bindMode;\n\t\t\tobject.bindMatrix = this.bindMatrix.toArray();\n\n\t\t\tif ( this.skeleton !== undefined ) {\n\n\t\t\t\tserialize( meta.skeletons, this.skeleton );\n\n\t\t\t\tobject.skeleton = this.skeleton.uuid;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.material !== undefined ) {\n\n\t\t\tif ( Array.isArray( this.material ) ) {\n\n\t\t\t\tconst uuids = [];\n\n\t\t\t\tfor ( let i = 0, l = this.material.length; i < l; i ++ ) {\n\n\t\t\t\t\tuuids.push( serialize( meta.materials, this.material[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tobject.material = uuids;\n\n\t\t\t} else {\n\n\t\t\t\tobject.material = serialize( meta.materials, this.material );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.children.length > 0 ) {\n\n\t\t\tobject.children = [];\n\n\t\t\tfor ( let i = 0; i < this.children.length; i ++ ) {\n\n\t\t\t\tobject.children.push( this.children[ i ].toJSON( meta ).object );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.animations.length > 0 ) {\n\n\t\t\tobject.animations = [];\n\n\t\t\tfor ( let i = 0; i < this.animations.length; i ++ ) {\n\n\t\t\t\tconst animation = this.animations[ i ];\n\n\t\t\t\tobject.animations.push( serialize( meta.animations, animation ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( isRootObject ) {\n\n\t\t\tconst geometries = extractFromCache( meta.geometries );\n\t\t\tconst materials = extractFromCache( meta.materials );\n\t\t\tconst textures = extractFromCache( meta.textures );\n\t\t\tconst images = extractFromCache( meta.images );\n\t\t\tconst shapes = extractFromCache( meta.shapes );\n\t\t\tconst skeletons = extractFromCache( meta.skeletons );\n\t\t\tconst animations = extractFromCache( meta.animations );\n\n\t\t\tif ( geometries.length > 0 ) output.geometries = geometries;\n\t\t\tif ( materials.length > 0 ) output.materials = materials;\n\t\t\tif ( textures.length > 0 ) output.textures = textures;\n\t\t\tif ( images.length > 0 ) output.images = images;\n\t\t\tif ( shapes.length > 0 ) output.shapes = shapes;\n\t\t\tif ( skeletons.length > 0 ) output.skeletons = skeletons;\n\t\t\tif ( animations.length > 0 ) output.animations = animations;\n\n\t\t}\n\n\t\toutput.object = object;\n\n\t\treturn output;\n\n\t\t// extract data from the cache hash\n\t\t// remove metadata on each item\n\t\t// and return as array\n\t\tfunction extractFromCache( cache ) {\n\n\t\t\tconst values = [];\n\t\t\tfor ( const key in cache ) {\n\n\t\t\t\tconst data = cache[ key ];\n\t\t\t\tdelete data.metadata;\n\t\t\t\tvalues.push( data );\n\n\t\t\t}\n\n\t\t\treturn values;\n\n\t\t}\n\n\t}\n\n\tclone( recursive ) {\n\n\t\treturn new this.constructor().copy( this, recursive );\n\n\t}\n\n\tcopy( source, recursive = true ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.up.copy( source.up );\n\n\t\tthis.position.copy( source.position );\n\t\tthis.rotation.order = source.rotation.order;\n\t\tthis.quaternion.copy( source.quaternion );\n\t\tthis.scale.copy( source.scale );\n\n\t\tthis.matrix.copy( source.matrix );\n\t\tthis.matrixWorld.copy( source.matrixWorld );\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\t\tthis.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate;\n\n\t\tthis.layers.mask = source.layers.mask;\n\t\tthis.visible = source.visible;\n\n\t\tthis.castShadow = source.castShadow;\n\t\tthis.receiveShadow = source.receiveShadow;\n\n\t\tthis.frustumCulled = source.frustumCulled;\n\t\tthis.renderOrder = source.renderOrder;\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\tif ( recursive === true ) {\n\n\t\t\tfor ( let i = 0; i < source.children.length; i ++ ) {\n\n\t\t\t\tconst child = source.children[ i ];\n\t\t\t\tthis.add( child.clone() );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nObject3D.DefaultUp = new Vector3( 0, 1, 0 );\nObject3D.DefaultMatrixAutoUpdate = true;\n\nObject3D.prototype.isObject3D = true;\n\nexport { Object3D };\n","import { Matrix4 } from '../math/Matrix4.js';\nimport { Object3D } from '../core/Object3D.js';\n\nclass Camera extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'Camera';\n\n\t\tthis.matrixWorldInverse = new Matrix4();\n\n\t\tthis.projectionMatrix = new Matrix4();\n\t\tthis.projectionMatrixInverse = new Matrix4();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.matrixWorldInverse.copy( source.matrixWorldInverse );\n\n\t\tthis.projectionMatrix.copy( source.projectionMatrix );\n\t\tthis.projectionMatrixInverse.copy( source.projectionMatrixInverse );\n\n\t\treturn this;\n\n\t}\n\n\tgetWorldDirection( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tconst e = this.matrixWorld.elements;\n\n\t\treturn target.set( - e[ 8 ], - e[ 9 ], - e[ 10 ] ).normalize();\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tthis.matrixWorldInverse.copy( this.matrixWorld ).invert();\n\n\t}\n\n\tupdateWorldMatrix( updateParents, updateChildren ) {\n\n\t\tsuper.updateWorldMatrix( updateParents, updateChildren );\n\n\t\tthis.matrixWorldInverse.copy( this.matrixWorld ).invert();\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nCamera.prototype.isCamera = true;\n\nexport { Camera };\n","import { Camera } from './Camera.js';\n\nclass OrthographicCamera extends Camera {\n\n\tconstructor( left = - 1, right = 1, top = 1, bottom = - 1, near = 0.1, far = 2000 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'OrthographicCamera';\n\n\t\tthis.zoom = 1;\n\t\tthis.view = null;\n\n\t\tthis.left = left;\n\t\tthis.right = right;\n\t\tthis.top = top;\n\t\tthis.bottom = bottom;\n\n\t\tthis.near = near;\n\t\tthis.far = far;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.left = source.left;\n\t\tthis.right = source.right;\n\t\tthis.top = source.top;\n\t\tthis.bottom = source.bottom;\n\t\tthis.near = source.near;\n\t\tthis.far = source.far;\n\n\t\tthis.zoom = source.zoom;\n\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\treturn this;\n\n\t}\n\n\tsetViewOffset( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\tif ( this.view === null ) {\n\n\t\t\tthis.view = {\n\t\t\t\tenabled: true,\n\t\t\t\tfullWidth: 1,\n\t\t\t\tfullHeight: 1,\n\t\t\t\toffsetX: 0,\n\t\t\t\toffsetY: 0,\n\t\t\t\twidth: 1,\n\t\t\t\theight: 1\n\t\t\t};\n\n\t\t}\n\n\t\tthis.view.enabled = true;\n\t\tthis.view.fullWidth = fullWidth;\n\t\tthis.view.fullHeight = fullHeight;\n\t\tthis.view.offsetX = x;\n\t\tthis.view.offsetY = y;\n\t\tthis.view.width = width;\n\t\tthis.view.height = height;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tclearViewOffset() {\n\n\t\tif ( this.view !== null ) {\n\n\t\t\tthis.view.enabled = false;\n\n\t\t}\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tupdateProjectionMatrix() {\n\n\t\tconst dx = ( this.right - this.left ) / ( 2 * this.zoom );\n\t\tconst dy = ( this.top - this.bottom ) / ( 2 * this.zoom );\n\t\tconst cx = ( this.right + this.left ) / 2;\n\t\tconst cy = ( this.top + this.bottom ) / 2;\n\n\t\tlet left = cx - dx;\n\t\tlet right = cx + dx;\n\t\tlet top = cy + dy;\n\t\tlet bottom = cy - dy;\n\n\t\tif ( this.view !== null && this.view.enabled ) {\n\n\t\t\tconst scaleW = ( this.right - this.left ) / this.view.fullWidth / this.zoom;\n\t\t\tconst scaleH = ( this.top - this.bottom ) / this.view.fullHeight / this.zoom;\n\n\t\t\tleft += scaleW * this.view.offsetX;\n\t\t\tright = left + scaleW * this.view.width;\n\t\t\ttop -= scaleH * this.view.offsetY;\n\t\t\tbottom = top - scaleH * this.view.height;\n\n\t\t}\n\n\t\tthis.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far );\n\n\t\tthis.projectionMatrixInverse.copy( this.projectionMatrix ).invert();\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.zoom = this.zoom;\n\t\tdata.object.left = this.left;\n\t\tdata.object.right = this.right;\n\t\tdata.object.top = this.top;\n\t\tdata.object.bottom = this.bottom;\n\t\tdata.object.near = this.near;\n\t\tdata.object.far = this.far;\n\n\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\treturn data;\n\n\t}\n\n}\n\nOrthographicCamera.prototype.isOrthographicCamera = true;\n\nexport { OrthographicCamera };\n","import { Camera } from \"three/src/cameras/Camera.js\";\nimport { OrthographicCamera } from \"three/src/cameras/OrthographicCamera.js\";\nimport { PerspectiveCamera } from \"three/src/cameras/PerspectiveCamera.js\";\nimport { Bootstrap } from \"../bootstrap\";\n\nBootstrap.registerPlugin(\"camera\", {\n  defaults: {\n    near: 0.01,\n    far: 10000,\n\n    type: \"perspective\",\n    fov: 60,\n    aspect: null,\n\n    // type: 'orthographic',\n    left: -1,\n    right: 1,\n    bottom: -1,\n    top: 1,\n\n    klass: null,\n    parameters: null,\n  },\n\n  listen: [\"resize\", \"this.change\"],\n\n  install: function (three) {\n    three.Camera = this.api();\n    three.camera = null;\n\n    this.aspect = 1;\n    this.change({}, three);\n  },\n\n  uninstall: function (three) {\n    delete three.Camera;\n    delete three.camera;\n  },\n\n  change: function (event, three) {\n    const o = this.options;\n    const old = three.camera;\n\n    if (!three.camera || event.changes.type || event.changes.klass) {\n      const klass =\n        o.klass ||\n        {\n          perspective: PerspectiveCamera,\n          orthographic: OrthographicCamera,\n        }[o.type] ||\n        Camera;\n\n      three.camera = o.parameters ? new klass(o.parameters) : new klass();\n    }\n\n    Object.entries(o).forEach(\n      function ([key]) {\n        if (Object.prototype.hasOwnProperty.call(three.camera, key))\n          three.camera[key] = o[key];\n      }.bind(this)\n    );\n\n    this.update(three);\n\n    old === three.camera ||\n      three.trigger({\n        type: \"camera\",\n        camera: three.camera,\n      });\n  },\n\n  resize: function (event, three) {\n    this.aspect = event.viewWidth / Math.max(1, event.viewHeight);\n\n    this.update(three);\n  },\n\n  update: function (three) {\n    three.camera.aspect = this.options.aspect || this.aspect;\n    three.camera.updateProjectionMatrix();\n  },\n});\n","import { Bootstrap } from \"../bootstrap\";\n\nBootstrap.registerPlugin(\"fallback\", {\n  defaults: {\n    force: false,\n    fill: true,\n    begin:\n      '<div class=\"threestrap-fallback\" style=\"display: table; width: 100%; height: 100%;' +\n      'box-sizing: border-box; border: 1px dashed rgba(0, 0, 0, .25);\">' +\n      '<div style=\"display: table-cell; padding: 10px; vertical-align: middle; text-align: center;\">',\n    end: \"</div></div>\",\n    message:\n      \"<big><strong>This example requires WebGL</strong></big><br>\" +\n      'Visit <a target=\"_blank\" href=\"http://get.webgl.org/\">get.webgl.org</a> for more info</a>',\n  },\n\n  install: function (three) {\n    let cnv, gl;\n    try {\n      cnv = document.createElement(\"canvas\");\n      gl = cnv.getContext(\"webgl\") || cnv.getContext(\"experimental-webgl\");\n      if (!gl || this.options.force) {\n        throw \"WebGL unavailable.\";\n      }\n      three.fallback = false;\n    } catch (e) {\n      const message = this.options.message;\n      const begin = this.options.begin;\n      const end = this.options.end;\n      const fill = this.options.fill;\n\n      const div = document.createElement(\"div\");\n      div.innerHTML = begin + message + end;\n\n      this.children = [];\n\n      while (div.childNodes.length > 0) {\n        this.children.push(div.firstChild);\n        three.element.appendChild(div.firstChild);\n      }\n\n      if (fill) {\n        three.install(\"fill\");\n      }\n\n      this.div = div;\n      three.fallback = true;\n      return false; // Abort install\n    }\n  },\n\n  uninstall: function (three) {\n    if (this.children) {\n      this.children.forEach(function (child) {\n        child.parentNode.removeChild(child);\n      });\n      this.children = null;\n    }\n\n    delete three.fallback;\n  },\n});\n","import { Bootstrap } from \"../bootstrap\";\n\nBootstrap.registerPlugin(\"fill\", {\n  defaults: {\n    block: true,\n    body: true,\n    layout: true,\n  },\n\n  install: function (three) {\n    function is(element) {\n      const h = element.style.height;\n      return h == \"auto\" || h == \"\";\n    }\n\n    function set(element) {\n      element.style.height = \"100%\";\n      element.style.margin = 0;\n      element.style.padding = 0;\n      return element;\n    }\n\n    if (this.options.body && three.element == document.body) {\n      // Fix body height if we're naked\n      this.applied = [three.element, document.documentElement]\n        .filter(is)\n        .map(set);\n    }\n\n    if (this.options.block && three.canvas) {\n      three.canvas.style.display = \"block\";\n      this.block = true;\n    }\n\n    if (this.options.layout && three.element) {\n      const style = window.getComputedStyle(three.element);\n      if (style.position == \"static\") {\n        three.element.style.position = \"relative\";\n        this.layout = true;\n      }\n    }\n  },\n\n  uninstall: function (three) {\n    if (this.applied) {\n      const set = function (element) {\n        element.style.height = \"\";\n        element.style.margin = \"\";\n        element.style.padding = \"\";\n        return element;\n      };\n\n      this.applied.map(set);\n      delete this.applied;\n    }\n\n    if (this.block && three.canvas) {\n      three.canvas.style.display = \"\";\n      delete this.block;\n    }\n\n    if (this.layout && three.element) {\n      three.element.style.position = \"\";\n      delete this.layout;\n    }\n  },\n\n  change: function (three) {\n    this.uninstall(three);\n    this.install(three);\n  },\n});\n","import { Bootstrap } from \"../bootstrap\";\n\nBootstrap.registerPlugin(\"loop\", {\n  defaults: {\n    start: true,\n    each: 1,\n  },\n\n  listen: [\"ready\"],\n\n  install: function (three) {\n    this.running = false;\n    this.lastRequestId = null;\n\n    three.Loop = this.api(\n      {\n        start: this.start.bind(this),\n        stop: this.stop.bind(this),\n        running: false,\n        window: window,\n      },\n      three\n    );\n\n    this.events = [\"pre\", \"update\", \"render\", \"post\"].map(function (type) {\n      return { type: type };\n    });\n  },\n\n  uninstall: function (three) {\n    this.stop(three);\n  },\n\n  ready: function (event, three) {\n    if (this.options.start) this.start(three);\n  },\n\n  start: function (three) {\n    if (this.running) return;\n\n    three.Loop.running = this.running = true;\n\n    const trigger = three.trigger.bind(three);\n    const loop = function () {\n      if (!this.running) return;\n      this.lastRequestId = three.Loop.window.requestAnimationFrame(loop);\n      this.events.map(trigger);\n    }.bind(this);\n\n    this.lastRequestId = three.Loop.window.requestAnimationFrame(loop);\n\n    three.trigger({ type: \"start\" });\n  },\n\n  stop: function (three) {\n    if (!this.running) return;\n    three.Loop.running = this.running = false;\n\n    three.Loop.window.cancelAnimationFrame(this.lastRequestId);\n    this.lastRequestId = null;\n\n    three.trigger({ type: \"stop\" });\n  },\n});\n","import { Bootstrap } from \"../bootstrap\";\n\nBootstrap.registerPlugin(\"render\", {\n  listen: [\"render\"],\n\n  render: function (event, three) {\n    if (three.scene && three.camera) {\n      three.renderer.render(three.scene, three.camera);\n    }\n  },\n});\n","export const REVISION = '137';\nexport const MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2, ROTATE: 0, DOLLY: 1, PAN: 2 };\nexport const TOUCH = { ROTATE: 0, PAN: 1, DOLLY_PAN: 2, DOLLY_ROTATE: 3 };\nexport const CullFaceNone = 0;\nexport const CullFaceBack = 1;\nexport const CullFaceFront = 2;\nexport const CullFaceFrontBack = 3;\nexport const BasicShadowMap = 0;\nexport const PCFShadowMap = 1;\nexport const PCFSoftShadowMap = 2;\nexport const VSMShadowMap = 3;\nexport const FrontSide = 0;\nexport const BackSide = 1;\nexport const DoubleSide = 2;\nexport const FlatShading = 1;\nexport const SmoothShading = 2;\nexport const NoBlending = 0;\nexport const NormalBlending = 1;\nexport const AdditiveBlending = 2;\nexport const SubtractiveBlending = 3;\nexport const MultiplyBlending = 4;\nexport const CustomBlending = 5;\nexport const AddEquation = 100;\nexport const SubtractEquation = 101;\nexport const ReverseSubtractEquation = 102;\nexport const MinEquation = 103;\nexport const MaxEquation = 104;\nexport const ZeroFactor = 200;\nexport const OneFactor = 201;\nexport const SrcColorFactor = 202;\nexport const OneMinusSrcColorFactor = 203;\nexport const SrcAlphaFactor = 204;\nexport const OneMinusSrcAlphaFactor = 205;\nexport const DstAlphaFactor = 206;\nexport const OneMinusDstAlphaFactor = 207;\nexport const DstColorFactor = 208;\nexport const OneMinusDstColorFactor = 209;\nexport const SrcAlphaSaturateFactor = 210;\nexport const NeverDepth = 0;\nexport const AlwaysDepth = 1;\nexport const LessDepth = 2;\nexport const LessEqualDepth = 3;\nexport const EqualDepth = 4;\nexport const GreaterEqualDepth = 5;\nexport const GreaterDepth = 6;\nexport const NotEqualDepth = 7;\nexport const MultiplyOperation = 0;\nexport const MixOperation = 1;\nexport const AddOperation = 2;\nexport const NoToneMapping = 0;\nexport const LinearToneMapping = 1;\nexport const ReinhardToneMapping = 2;\nexport const CineonToneMapping = 3;\nexport const ACESFilmicToneMapping = 4;\nexport const CustomToneMapping = 5;\n\nexport const UVMapping = 300;\nexport const CubeReflectionMapping = 301;\nexport const CubeRefractionMapping = 302;\nexport const EquirectangularReflectionMapping = 303;\nexport const EquirectangularRefractionMapping = 304;\nexport const CubeUVReflectionMapping = 306;\nexport const CubeUVRefractionMapping = 307;\nexport const RepeatWrapping = 1000;\nexport const ClampToEdgeWrapping = 1001;\nexport const MirroredRepeatWrapping = 1002;\nexport const NearestFilter = 1003;\nexport const NearestMipmapNearestFilter = 1004;\nexport const NearestMipMapNearestFilter = 1004;\nexport const NearestMipmapLinearFilter = 1005;\nexport const NearestMipMapLinearFilter = 1005;\nexport const LinearFilter = 1006;\nexport const LinearMipmapNearestFilter = 1007;\nexport const LinearMipMapNearestFilter = 1007;\nexport const LinearMipmapLinearFilter = 1008;\nexport const LinearMipMapLinearFilter = 1008;\nexport const UnsignedByteType = 1009;\nexport const ByteType = 1010;\nexport const ShortType = 1011;\nexport const UnsignedShortType = 1012;\nexport const IntType = 1013;\nexport const UnsignedIntType = 1014;\nexport const FloatType = 1015;\nexport const HalfFloatType = 1016;\nexport const UnsignedShort4444Type = 1017;\nexport const UnsignedShort5551Type = 1018;\nexport const UnsignedInt248Type = 1020;\nexport const AlphaFormat = 1021;\nexport const RGBFormat = 1022;\nexport const RGBAFormat = 1023;\nexport const LuminanceFormat = 1024;\nexport const LuminanceAlphaFormat = 1025;\nexport const DepthFormat = 1026;\nexport const DepthStencilFormat = 1027;\nexport const RedFormat = 1028;\nexport const RedIntegerFormat = 1029;\nexport const RGFormat = 1030;\nexport const RGIntegerFormat = 1031;\nexport const RGBAIntegerFormat = 1033;\n\nexport const RGB_S3TC_DXT1_Format = 33776;\nexport const RGBA_S3TC_DXT1_Format = 33777;\nexport const RGBA_S3TC_DXT3_Format = 33778;\nexport const RGBA_S3TC_DXT5_Format = 33779;\nexport const RGB_PVRTC_4BPPV1_Format = 35840;\nexport const RGB_PVRTC_2BPPV1_Format = 35841;\nexport const RGBA_PVRTC_4BPPV1_Format = 35842;\nexport const RGBA_PVRTC_2BPPV1_Format = 35843;\nexport const RGB_ETC1_Format = 36196;\nexport const RGB_ETC2_Format = 37492;\nexport const RGBA_ETC2_EAC_Format = 37496;\nexport const RGBA_ASTC_4x4_Format = 37808;\nexport const RGBA_ASTC_5x4_Format = 37809;\nexport const RGBA_ASTC_5x5_Format = 37810;\nexport const RGBA_ASTC_6x5_Format = 37811;\nexport const RGBA_ASTC_6x6_Format = 37812;\nexport const RGBA_ASTC_8x5_Format = 37813;\nexport const RGBA_ASTC_8x6_Format = 37814;\nexport const RGBA_ASTC_8x8_Format = 37815;\nexport const RGBA_ASTC_10x5_Format = 37816;\nexport const RGBA_ASTC_10x6_Format = 37817;\nexport const RGBA_ASTC_10x8_Format = 37818;\nexport const RGBA_ASTC_10x10_Format = 37819;\nexport const RGBA_ASTC_12x10_Format = 37820;\nexport const RGBA_ASTC_12x12_Format = 37821;\nexport const RGBA_BPTC_Format = 36492;\nexport const LoopOnce = 2200;\nexport const LoopRepeat = 2201;\nexport const LoopPingPong = 2202;\nexport const InterpolateDiscrete = 2300;\nexport const InterpolateLinear = 2301;\nexport const InterpolateSmooth = 2302;\nexport const ZeroCurvatureEnding = 2400;\nexport const ZeroSlopeEnding = 2401;\nexport const WrapAroundEnding = 2402;\nexport const NormalAnimationBlendMode = 2500;\nexport const AdditiveAnimationBlendMode = 2501;\nexport const TrianglesDrawMode = 0;\nexport const TriangleStripDrawMode = 1;\nexport const TriangleFanDrawMode = 2;\nexport const LinearEncoding = 3000;\nexport const sRGBEncoding = 3001;\nexport const BasicDepthPacking = 3200;\nexport const RGBADepthPacking = 3201;\nexport const TangentSpaceNormalMap = 0;\nexport const ObjectSpaceNormalMap = 1;\n\nexport const ZeroStencilOp = 0;\nexport const KeepStencilOp = 7680;\nexport const ReplaceStencilOp = 7681;\nexport const IncrementStencilOp = 7682;\nexport const DecrementStencilOp = 7683;\nexport const IncrementWrapStencilOp = 34055;\nexport const DecrementWrapStencilOp = 34056;\nexport const InvertStencilOp = 5386;\n\nexport const NeverStencilFunc = 512;\nexport const LessStencilFunc = 513;\nexport const EqualStencilFunc = 514;\nexport const LessEqualStencilFunc = 515;\nexport const GreaterStencilFunc = 516;\nexport const NotEqualStencilFunc = 517;\nexport const GreaterEqualStencilFunc = 518;\nexport const AlwaysStencilFunc = 519;\n\nexport const StaticDrawUsage = 35044;\nexport const DynamicDrawUsage = 35048;\nexport const StreamDrawUsage = 35040;\nexport const StaticReadUsage = 35045;\nexport const DynamicReadUsage = 35049;\nexport const StreamReadUsage = 35041;\nexport const StaticCopyUsage = 35046;\nexport const DynamicCopyUsage = 35050;\nexport const StreamCopyUsage = 35042;\n\nexport const GLSL1 = '100';\nexport const GLSL3 = '300 es';\n\nexport const _SRGBAFormat = 1035; // fallback for WebGL 1\n","import { Vector3 } from './Vector3.js';\n\nclass Box3 {\n\n\tconstructor( min = new Vector3( + Infinity, + Infinity, + Infinity ), max = new Vector3( - Infinity, - Infinity, - Infinity ) ) {\n\n\t\tthis.min = min;\n\t\tthis.max = max;\n\n\t}\n\n\tset( min, max ) {\n\n\t\tthis.min.copy( min );\n\t\tthis.max.copy( max );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromArray( array ) {\n\n\t\tlet minX = + Infinity;\n\t\tlet minY = + Infinity;\n\t\tlet minZ = + Infinity;\n\n\t\tlet maxX = - Infinity;\n\t\tlet maxY = - Infinity;\n\t\tlet maxZ = - Infinity;\n\n\t\tfor ( let i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\tconst x = array[ i ];\n\t\t\tconst y = array[ i + 1 ];\n\t\t\tconst z = array[ i + 2 ];\n\n\t\t\tif ( x < minX ) minX = x;\n\t\t\tif ( y < minY ) minY = y;\n\t\t\tif ( z < minZ ) minZ = z;\n\n\t\t\tif ( x > maxX ) maxX = x;\n\t\t\tif ( y > maxY ) maxY = y;\n\t\t\tif ( z > maxZ ) maxZ = z;\n\n\t\t}\n\n\t\tthis.min.set( minX, minY, minZ );\n\t\tthis.max.set( maxX, maxY, maxZ );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromBufferAttribute( attribute ) {\n\n\t\tlet minX = + Infinity;\n\t\tlet minY = + Infinity;\n\t\tlet minZ = + Infinity;\n\n\t\tlet maxX = - Infinity;\n\t\tlet maxY = - Infinity;\n\t\tlet maxZ = - Infinity;\n\n\t\tfor ( let i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\tconst x = attribute.getX( i );\n\t\t\tconst y = attribute.getY( i );\n\t\t\tconst z = attribute.getZ( i );\n\n\t\t\tif ( x < minX ) minX = x;\n\t\t\tif ( y < minY ) minY = y;\n\t\t\tif ( z < minZ ) minZ = z;\n\n\t\t\tif ( x > maxX ) maxX = x;\n\t\t\tif ( y > maxY ) maxY = y;\n\t\t\tif ( z > maxZ ) maxZ = z;\n\n\t\t}\n\n\t\tthis.min.set( minX, minY, minZ );\n\t\tthis.max.set( maxX, maxY, maxZ );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPoints( points ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetFromCenterAndSize( center, size ) {\n\n\t\tconst halfSize = _vector.copy( size ).multiplyScalar( 0.5 );\n\n\t\tthis.min.copy( center ).sub( halfSize );\n\t\tthis.max.copy( center ).add( halfSize );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromObject( object, precise = false ) {\n\n\t\tthis.makeEmpty();\n\n\t\treturn this.expandByObject( object, precise );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( box ) {\n\n\t\tthis.min.copy( box.min );\n\t\tthis.max.copy( box.max );\n\n\t\treturn this;\n\n\t}\n\n\tmakeEmpty() {\n\n\t\tthis.min.x = this.min.y = this.min.z = + Infinity;\n\t\tthis.max.x = this.max.y = this.max.z = - Infinity;\n\n\t\treturn this;\n\n\t}\n\n\tisEmpty() {\n\n\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z );\n\n\t}\n\n\tgetCenter( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t}\n\n\tgetSize( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0, 0 ) : target.subVectors( this.max, this.min );\n\n\t}\n\n\texpandByPoint( point ) {\n\n\t\tthis.min.min( point );\n\t\tthis.max.max( point );\n\n\t\treturn this;\n\n\t}\n\n\texpandByVector( vector ) {\n\n\t\tthis.min.sub( vector );\n\t\tthis.max.add( vector );\n\n\t\treturn this;\n\n\t}\n\n\texpandByScalar( scalar ) {\n\n\t\tthis.min.addScalar( - scalar );\n\t\tthis.max.addScalar( scalar );\n\n\t\treturn this;\n\n\t}\n\n\texpandByObject( object, precise = false ) {\n\n\t\t// Computes the world-axis-aligned bounding box of an object (including its children),\n\t\t// accounting for both the object's, and children's, world transforms\n\n\t\tobject.updateWorldMatrix( false, false );\n\n\t\tconst geometry = object.geometry;\n\n\t\tif ( geometry !== undefined ) {\n\n\t\t\tif ( precise && geometry.attributes != undefined && geometry.attributes.position !== undefined ) {\n\n\t\t\t\tconst position = geometry.attributes.position;\n\t\t\t\tfor ( let i = 0, l = position.count; i < l; i ++ ) {\n\n\t\t\t\t\t_vector.fromBufferAttribute( position, i ).applyMatrix4( object.matrixWorld );\n\t\t\t\t\tthis.expandByPoint( _vector );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( geometry.boundingBox === null ) {\n\n\t\t\t\t\tgeometry.computeBoundingBox();\n\n\t\t\t\t}\n\n\t\t\t\t_box.copy( geometry.boundingBox );\n\t\t\t\t_box.applyMatrix4( object.matrixWorld );\n\n\t\t\t\tthis.union( _box );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tthis.expandByObject( children[ i ], precise );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\treturn point.x < this.min.x || point.x > this.max.x ||\n\t\t\tpoint.y < this.min.y || point.y > this.max.y ||\n\t\t\tpoint.z < this.min.z || point.z > this.max.z ? false : true;\n\n\t}\n\n\tcontainsBox( box ) {\n\n\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y &&\n\t\t\tthis.min.z <= box.min.z && box.max.z <= this.max.z;\n\n\t}\n\n\tgetParameter( point, target ) {\n\n\t\t// This can potentially have a divide by zero if the box\n\t\t// has a size dimension of 0.\n\n\t\treturn target.set(\n\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y ),\n\t\t\t( point.z - this.min.z ) / ( this.max.z - this.min.z )\n\t\t);\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\t// using 6 splitting planes to rule out intersections.\n\t\treturn box.max.x < this.min.x || box.min.x > this.max.x ||\n\t\t\tbox.max.y < this.min.y || box.min.y > this.max.y ||\n\t\t\tbox.max.z < this.min.z || box.min.z > this.max.z ? false : true;\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\t// Find the point on the AABB closest to the sphere center.\n\t\tthis.clampPoint( sphere.center, _vector );\n\n\t\t// If that point is inside the sphere, the AABB and sphere intersect.\n\t\treturn _vector.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t}\n\n\tintersectsPlane( plane ) {\n\n\t\t// We compute the minimum and maximum dot product values. If those values\n\t\t// are on the same side (back or front) of the plane, then there is no intersection.\n\n\t\tlet min, max;\n\n\t\tif ( plane.normal.x > 0 ) {\n\n\t\t\tmin = plane.normal.x * this.min.x;\n\t\t\tmax = plane.normal.x * this.max.x;\n\n\t\t} else {\n\n\t\t\tmin = plane.normal.x * this.max.x;\n\t\t\tmax = plane.normal.x * this.min.x;\n\n\t\t}\n\n\t\tif ( plane.normal.y > 0 ) {\n\n\t\t\tmin += plane.normal.y * this.min.y;\n\t\t\tmax += plane.normal.y * this.max.y;\n\n\t\t} else {\n\n\t\t\tmin += plane.normal.y * this.max.y;\n\t\t\tmax += plane.normal.y * this.min.y;\n\n\t\t}\n\n\t\tif ( plane.normal.z > 0 ) {\n\n\t\t\tmin += plane.normal.z * this.min.z;\n\t\t\tmax += plane.normal.z * this.max.z;\n\n\t\t} else {\n\n\t\t\tmin += plane.normal.z * this.max.z;\n\t\t\tmax += plane.normal.z * this.min.z;\n\n\t\t}\n\n\t\treturn ( min <= - plane.constant && max >= - plane.constant );\n\n\t}\n\n\tintersectsTriangle( triangle ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// compute box center and extents\n\t\tthis.getCenter( _center );\n\t\t_extents.subVectors( this.max, _center );\n\n\t\t// translate triangle to aabb origin\n\t\t_v0.subVectors( triangle.a, _center );\n\t\t_v1.subVectors( triangle.b, _center );\n\t\t_v2.subVectors( triangle.c, _center );\n\n\t\t// compute edge vectors for triangle\n\t\t_f0.subVectors( _v1, _v0 );\n\t\t_f1.subVectors( _v2, _v1 );\n\t\t_f2.subVectors( _v0, _v2 );\n\n\t\t// test against axes that are given by cross product combinations of the edges of the triangle and the edges of the aabb\n\t\t// make an axis testing of each of the 3 sides of the aabb against each of the 3 sides of the triangle = 9 axis of separation\n\t\t// axis_ij = u_i x f_j (u0, u1, u2 = face normals of aabb = x,y,z axes vectors since aabb is axis aligned)\n\t\tlet axes = [\n\t\t\t0, - _f0.z, _f0.y, 0, - _f1.z, _f1.y, 0, - _f2.z, _f2.y,\n\t\t\t_f0.z, 0, - _f0.x, _f1.z, 0, - _f1.x, _f2.z, 0, - _f2.x,\n\t\t\t- _f0.y, _f0.x, 0, - _f1.y, _f1.x, 0, - _f2.y, _f2.x, 0\n\t\t];\n\t\tif ( ! satForAxes( axes, _v0, _v1, _v2, _extents ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// test 3 face normals from the aabb\n\t\taxes = [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ];\n\t\tif ( ! satForAxes( axes, _v0, _v1, _v2, _extents ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// finally testing the face normal of the triangle\n\t\t// use already existing triangle edge vectors here\n\t\t_triangleNormal.crossVectors( _f0, _f1 );\n\t\taxes = [ _triangleNormal.x, _triangleNormal.y, _triangleNormal.z ];\n\n\t\treturn satForAxes( axes, _v0, _v1, _v2, _extents );\n\n\t}\n\n\tclampPoint( point, target ) {\n\n\t\treturn target.copy( point ).clamp( this.min, this.max );\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\tconst clampedPoint = _vector.copy( point ).clamp( this.min, this.max );\n\n\t\treturn clampedPoint.sub( point ).length();\n\n\t}\n\n\tgetBoundingSphere( target ) {\n\n\t\tthis.getCenter( target.center );\n\n\t\ttarget.radius = this.getSize( _vector ).length() * 0.5;\n\n\t\treturn target;\n\n\t}\n\n\tintersect( box ) {\n\n\t\tthis.min.max( box.min );\n\t\tthis.max.min( box.max );\n\n\t\t// ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values.\n\t\tif ( this.isEmpty() ) this.makeEmpty();\n\n\t\treturn this;\n\n\t}\n\n\tunion( box ) {\n\n\t\tthis.min.min( box.min );\n\t\tthis.max.max( box.max );\n\n\t\treturn this;\n\n\t}\n\n\tapplyMatrix4( matrix ) {\n\n\t\t// transform of empty box is an empty box.\n\t\tif ( this.isEmpty() ) return this;\n\n\t\t// NOTE: I am using a binary pattern to specify all 2^3 combinations below\n\t\t_points[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000\n\t\t_points[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001\n\t\t_points[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010\n\t\t_points[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011\n\t\t_points[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100\n\t\t_points[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101\n\t\t_points[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110\n\t\t_points[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 111\n\n\t\tthis.setFromPoints( _points );\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( offset ) {\n\n\t\tthis.min.add( offset );\n\t\tthis.max.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\tequals( box ) {\n\n\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t}\n\n}\n\nBox3.prototype.isBox3 = true;\n\nconst _points = [\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3()\n];\n\nconst _vector = /*@__PURE__*/ new Vector3();\n\nconst _box = /*@__PURE__*/ new Box3();\n\n// triangle centered vertices\n\nconst _v0 = /*@__PURE__*/ new Vector3();\nconst _v1 = /*@__PURE__*/ new Vector3();\nconst _v2 = /*@__PURE__*/ new Vector3();\n\n// triangle edge vectors\n\nconst _f0 = /*@__PURE__*/ new Vector3();\nconst _f1 = /*@__PURE__*/ new Vector3();\nconst _f2 = /*@__PURE__*/ new Vector3();\n\nconst _center = /*@__PURE__*/ new Vector3();\nconst _extents = /*@__PURE__*/ new Vector3();\nconst _triangleNormal = /*@__PURE__*/ new Vector3();\nconst _testAxis = /*@__PURE__*/ new Vector3();\n\nfunction satForAxes( axes, v0, v1, v2, extents ) {\n\n\tfor ( let i = 0, j = axes.length - 3; i <= j; i += 3 ) {\n\n\t\t_testAxis.fromArray( axes, i );\n\t\t// project the aabb onto the seperating axis\n\t\tconst r = extents.x * Math.abs( _testAxis.x ) + extents.y * Math.abs( _testAxis.y ) + extents.z * Math.abs( _testAxis.z );\n\t\t// project all 3 vertices of the triangle onto the seperating axis\n\t\tconst p0 = v0.dot( _testAxis );\n\t\tconst p1 = v1.dot( _testAxis );\n\t\tconst p2 = v2.dot( _testAxis );\n\t\t// actual test, basically see if either of the most extreme of the triangle points intersects r\n\t\tif ( Math.max( - Math.max( p0, p1, p2 ), Math.min( p0, p1, p2 ) ) > r ) {\n\n\t\t\t// points of the projected triangle are outside the projected half-length of the aabb\n\t\t\t// the axis is seperating and we can exit\n\t\t\treturn false;\n\n\t\t}\n\n\t}\n\n\treturn true;\n\n}\n\nexport { Box3 };\n","import { Box3 } from './Box3.js';\nimport { Vector3 } from './Vector3.js';\n\nconst _box = /*@__PURE__*/ new Box3();\nconst _v1 = /*@__PURE__*/ new Vector3();\nconst _toFarthestPoint = /*@__PURE__*/ new Vector3();\nconst _toPoint = /*@__PURE__*/ new Vector3();\n\nclass Sphere {\n\n\tconstructor( center = new Vector3(), radius = - 1 ) {\n\n\t\tthis.center = center;\n\t\tthis.radius = radius;\n\n\t}\n\n\tset( center, radius ) {\n\n\t\tthis.center.copy( center );\n\t\tthis.radius = radius;\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPoints( points, optionalCenter ) {\n\n\t\tconst center = this.center;\n\n\t\tif ( optionalCenter !== undefined ) {\n\n\t\t\tcenter.copy( optionalCenter );\n\n\t\t} else {\n\n\t\t\t_box.setFromPoints( points ).getCenter( center );\n\n\t\t}\n\n\t\tlet maxRadiusSq = 0;\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) );\n\n\t\t}\n\n\t\tthis.radius = Math.sqrt( maxRadiusSq );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( sphere ) {\n\n\t\tthis.center.copy( sphere.center );\n\t\tthis.radius = sphere.radius;\n\n\t\treturn this;\n\n\t}\n\n\tisEmpty() {\n\n\t\treturn ( this.radius < 0 );\n\n\t}\n\n\tmakeEmpty() {\n\n\t\tthis.center.set( 0, 0, 0 );\n\t\tthis.radius = - 1;\n\n\t\treturn this;\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\treturn ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) );\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\treturn ( point.distanceTo( this.center ) - this.radius );\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\tconst radiusSum = this.radius + sphere.radius;\n\n\t\treturn sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum );\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsSphere( this );\n\n\t}\n\n\tintersectsPlane( plane ) {\n\n\t\treturn Math.abs( plane.distanceToPoint( this.center ) ) <= this.radius;\n\n\t}\n\n\tclampPoint( point, target ) {\n\n\t\tconst deltaLengthSq = this.center.distanceToSquared( point );\n\n\t\ttarget.copy( point );\n\n\t\tif ( deltaLengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\ttarget.sub( this.center ).normalize();\n\t\t\ttarget.multiplyScalar( this.radius ).add( this.center );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\tgetBoundingBox( target ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\t// Empty sphere produces empty bounding box\n\t\t\ttarget.makeEmpty();\n\t\t\treturn target;\n\n\t\t}\n\n\t\ttarget.set( this.center, this.center );\n\t\ttarget.expandByScalar( this.radius );\n\n\t\treturn target;\n\n\t}\n\n\tapplyMatrix4( matrix ) {\n\n\t\tthis.center.applyMatrix4( matrix );\n\t\tthis.radius = this.radius * matrix.getMaxScaleOnAxis();\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( offset ) {\n\n\t\tthis.center.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\texpandByPoint( point ) {\n\n\t\t// from https://github.com/juj/MathGeoLib/blob/2940b99b99cfe575dd45103ef20f4019dee15b54/src/Geometry/Sphere.cpp#L649-L671\n\n\t\t_toPoint.subVectors( point, this.center );\n\n\t\tconst lengthSq = _toPoint.lengthSq();\n\n\t\tif ( lengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\tconst length = Math.sqrt( lengthSq );\n\t\t\tconst missingRadiusHalf = ( length - this.radius ) * 0.5;\n\n\t\t\t// Nudge this sphere towards the target point. Add half the missing distance to radius,\n\t\t\t// and the other half to position. This gives a tighter enclosure, instead of if\n\t\t\t// the whole missing distance were just added to radius.\n\n\t\t\tthis.center.add( _toPoint.multiplyScalar( missingRadiusHalf / length ) );\n\t\t\tthis.radius += missingRadiusHalf;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tunion( sphere ) {\n\n\t\t// from https://github.com/juj/MathGeoLib/blob/2940b99b99cfe575dd45103ef20f4019dee15b54/src/Geometry/Sphere.cpp#L759-L769\n\n\t\t// To enclose another sphere into this sphere, we only need to enclose two points:\n\t\t// 1) Enclose the farthest point on the other sphere into this sphere.\n\t\t// 2) Enclose the opposite point of the farthest point into this sphere.\n\n\t\t if ( this.center.equals( sphere.center ) === true ) {\n\n\t\t\t _toFarthestPoint.set( 0, 0, 1 ).multiplyScalar( sphere.radius );\n\n\n\t\t} else {\n\n\t\t\t_toFarthestPoint.subVectors( sphere.center, this.center ).normalize().multiplyScalar( sphere.radius );\n\n\t\t}\n\n\t\tthis.expandByPoint( _v1.copy( sphere.center ).add( _toFarthestPoint ) );\n\t\tthis.expandByPoint( _v1.copy( sphere.center ).sub( _toFarthestPoint ) );\n\n\t\treturn this;\n\n\t}\n\n\tequals( sphere ) {\n\n\t\treturn sphere.center.equals( this.center ) && ( sphere.radius === this.radius );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nexport { Sphere };\n","import { Matrix3 } from './Matrix3.js';\nimport { Vector3 } from './Vector3.js';\n\nconst _vector1 = /*@__PURE__*/ new Vector3();\nconst _vector2 = /*@__PURE__*/ new Vector3();\nconst _normalMatrix = /*@__PURE__*/ new Matrix3();\n\nclass Plane {\n\n\tconstructor( normal = new Vector3( 1, 0, 0 ), constant = 0 ) {\n\n\t\t// normal is assumed to be normalized\n\n\t\tthis.normal = normal;\n\t\tthis.constant = constant;\n\n\t}\n\n\tset( normal, constant ) {\n\n\t\tthis.normal.copy( normal );\n\t\tthis.constant = constant;\n\n\t\treturn this;\n\n\t}\n\n\tsetComponents( x, y, z, w ) {\n\n\t\tthis.normal.set( x, y, z );\n\t\tthis.constant = w;\n\n\t\treturn this;\n\n\t}\n\n\tsetFromNormalAndCoplanarPoint( normal, point ) {\n\n\t\tthis.normal.copy( normal );\n\t\tthis.constant = - point.dot( this.normal );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromCoplanarPoints( a, b, c ) {\n\n\t\tconst normal = _vector1.subVectors( c, b ).cross( _vector2.subVectors( a, b ) ).normalize();\n\n\t\t// Q: should an error be thrown if normal is zero (e.g. degenerate plane)?\n\n\t\tthis.setFromNormalAndCoplanarPoint( normal, a );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( plane ) {\n\n\t\tthis.normal.copy( plane.normal );\n\t\tthis.constant = plane.constant;\n\n\t\treturn this;\n\n\t}\n\n\tnormalize() {\n\n\t\t// Note: will lead to a divide by zero if the plane is invalid.\n\n\t\tconst inverseNormalLength = 1.0 / this.normal.length();\n\t\tthis.normal.multiplyScalar( inverseNormalLength );\n\t\tthis.constant *= inverseNormalLength;\n\n\t\treturn this;\n\n\t}\n\n\tnegate() {\n\n\t\tthis.constant *= - 1;\n\t\tthis.normal.negate();\n\n\t\treturn this;\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\treturn this.normal.dot( point ) + this.constant;\n\n\t}\n\n\tdistanceToSphere( sphere ) {\n\n\t\treturn this.distanceToPoint( sphere.center ) - sphere.radius;\n\n\t}\n\n\tprojectPoint( point, target ) {\n\n\t\treturn target.copy( this.normal ).multiplyScalar( - this.distanceToPoint( point ) ).add( point );\n\n\t}\n\n\tintersectLine( line, target ) {\n\n\t\tconst direction = line.delta( _vector1 );\n\n\t\tconst denominator = this.normal.dot( direction );\n\n\t\tif ( denominator === 0 ) {\n\n\t\t\t// line is coplanar, return origin\n\t\t\tif ( this.distanceToPoint( line.start ) === 0 ) {\n\n\t\t\t\treturn target.copy( line.start );\n\n\t\t\t}\n\n\t\t\t// Unsure if this is the correct method to handle this case.\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst t = - ( line.start.dot( this.normal ) + this.constant ) / denominator;\n\n\t\tif ( t < 0 || t > 1 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\treturn target.copy( direction ).multiplyScalar( t ).add( line.start );\n\n\t}\n\n\tintersectsLine( line ) {\n\n\t\t// Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it.\n\n\t\tconst startSign = this.distanceToPoint( line.start );\n\t\tconst endSign = this.distanceToPoint( line.end );\n\n\t\treturn ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 );\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsPlane( this );\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\treturn sphere.intersectsPlane( this );\n\n\t}\n\n\tcoplanarPoint( target ) {\n\n\t\treturn target.copy( this.normal ).multiplyScalar( - this.constant );\n\n\t}\n\n\tapplyMatrix4( matrix, optionalNormalMatrix ) {\n\n\t\tconst normalMatrix = optionalNormalMatrix || _normalMatrix.getNormalMatrix( matrix );\n\n\t\tconst referencePoint = this.coplanarPoint( _vector1 ).applyMatrix4( matrix );\n\n\t\tconst normal = this.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\tthis.constant = - referencePoint.dot( normal );\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( offset ) {\n\n\t\tthis.constant -= offset.dot( this.normal );\n\n\t\treturn this;\n\n\t}\n\n\tequals( plane ) {\n\n\t\treturn plane.normal.equals( this.normal ) && ( plane.constant === this.constant );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nPlane.prototype.isPlane = true;\n\nexport { Plane };\n","import { Vector3 } from './Vector3.js';\nimport { Sphere } from './Sphere.js';\nimport { Plane } from './Plane.js';\n\nconst _sphere = /*@__PURE__*/ new Sphere();\nconst _vector = /*@__PURE__*/ new Vector3();\n\nclass Frustum {\n\n\tconstructor( p0 = new Plane(), p1 = new Plane(), p2 = new Plane(), p3 = new Plane(), p4 = new Plane(), p5 = new Plane() ) {\n\n\t\tthis.planes = [ p0, p1, p2, p3, p4, p5 ];\n\n\t}\n\n\tset( p0, p1, p2, p3, p4, p5 ) {\n\n\t\tconst planes = this.planes;\n\n\t\tplanes[ 0 ].copy( p0 );\n\t\tplanes[ 1 ].copy( p1 );\n\t\tplanes[ 2 ].copy( p2 );\n\t\tplanes[ 3 ].copy( p3 );\n\t\tplanes[ 4 ].copy( p4 );\n\t\tplanes[ 5 ].copy( p5 );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( frustum ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tplanes[ i ].copy( frustum.planes[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetFromProjectionMatrix( m ) {\n\n\t\tconst planes = this.planes;\n\t\tconst me = m.elements;\n\t\tconst me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ];\n\t\tconst me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ];\n\t\tconst me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ];\n\t\tconst me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ];\n\n\t\tplanes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize();\n\t\tplanes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();\n\t\tplanes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();\n\t\tplanes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();\n\t\tplanes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize();\n\t\tplanes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize();\n\n\t\treturn this;\n\n\t}\n\n\tintersectsObject( object ) {\n\n\t\tconst geometry = object.geometry;\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere.copy( geometry.boundingSphere ).applyMatrix4( object.matrixWorld );\n\n\t\treturn this.intersectsSphere( _sphere );\n\n\t}\n\n\tintersectsSprite( sprite ) {\n\n\t\t_sphere.center.set( 0, 0, 0 );\n\t\t_sphere.radius = 0.7071067811865476;\n\t\t_sphere.applyMatrix4( sprite.matrixWorld );\n\n\t\treturn this.intersectsSphere( _sphere );\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\tconst planes = this.planes;\n\t\tconst center = sphere.center;\n\t\tconst negRadius = - sphere.radius;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst distance = planes[ i ].distanceToPoint( center );\n\n\t\t\tif ( distance < negRadius ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst plane = planes[ i ];\n\n\t\t\t// corner at max distance\n\n\t\t\t_vector.x = plane.normal.x > 0 ? box.max.x : box.min.x;\n\t\t\t_vector.y = plane.normal.y > 0 ? box.max.y : box.min.y;\n\t\t\t_vector.z = plane.normal.z > 0 ? box.max.z : box.min.z;\n\n\t\t\tif ( plane.distanceToPoint( _vector ) < 0 ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tif ( planes[ i ].distanceToPoint( point ) < 0 ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\n\nexport { Frustum };\n","class Vector4 {\n\n\tconstructor( x = 0, y = 0, z = 0, w = 1 ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\tthis.w = w;\n\n\t}\n\n\tget width() {\n\n\t\treturn this.z;\n\n\t}\n\n\tset width( value ) {\n\n\t\tthis.z = value;\n\n\t}\n\n\tget height() {\n\n\t\treturn this.w;\n\n\t}\n\n\tset height( value ) {\n\n\t\tthis.w = value;\n\n\t}\n\n\tset( x, y, z, w ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\tthis.w = w;\n\n\t\treturn this;\n\n\t}\n\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\t\tthis.w = scalar;\n\n\t\treturn this;\n\n\t}\n\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetZ( z ) {\n\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetW( w ) {\n\n\t\tthis.w = w;\n\n\t\treturn this;\n\n\t}\n\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tcase 2: this.z = value; break;\n\t\t\tcase 3: this.w = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tcase 2: return this.z;\n\t\t\tcase 3: return this.w;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y, this.z, this.w );\n\n\t}\n\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\t\tthis.w = ( v.w !== undefined ) ? v.w : 1;\n\n\t\treturn this;\n\n\t}\n\n\tadd( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\treturn this.addVectors( v, w );\n\n\t\t}\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\t\tthis.w += v.w;\n\n\t\treturn this;\n\n\t}\n\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\t\tthis.w += s;\n\n\t\treturn this;\n\n\t}\n\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\t\tthis.w = a.w + b.w;\n\n\t\treturn this;\n\n\t}\n\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\t\tthis.w += v.w * s;\n\n\t\treturn this;\n\n\t}\n\n\tsub( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\treturn this.subVectors( v, w );\n\n\t\t}\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\t\tthis.w -= v.w;\n\n\t\treturn this;\n\n\t}\n\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\t\tthis.z -= s;\n\t\tthis.w -= s;\n\n\t\treturn this;\n\n\t}\n\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\t\tthis.w = a.w - b.w;\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\t\tthis.z *= v.z;\n\t\tthis.w *= v.w;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\t\tthis.w *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\tapplyMatrix4( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z, w = this.w;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w;\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w;\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w;\n\t\tthis.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w;\n\n\t\treturn this;\n\n\t}\n\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\tsetAxisAngleFromQuaternion( q ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\n\n\t\t// q is assumed to be normalized\n\n\t\tthis.w = 2 * Math.acos( q.w );\n\n\t\tconst s = Math.sqrt( 1 - q.w * q.w );\n\n\t\tif ( s < 0.0001 ) {\n\n\t\t\tthis.x = 1;\n\t\t\tthis.y = 0;\n\t\t\tthis.z = 0;\n\n\t\t} else {\n\n\t\t\tthis.x = q.x / s;\n\t\t\tthis.y = q.y / s;\n\t\t\tthis.z = q.z / s;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetAxisAngleFromRotationMatrix( m ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tlet angle, x, y, z; // variables for result\n\t\tconst epsilon = 0.01,\t\t// margin to allow for rounding errors\n\t\t\tepsilon2 = 0.1,\t\t// margin to distinguish between 0 and 180 degrees\n\n\t\t\tte = m.elements,\n\n\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\tif ( ( Math.abs( m12 - m21 ) < epsilon ) &&\n\t\t     ( Math.abs( m13 - m31 ) < epsilon ) &&\n\t\t     ( Math.abs( m23 - m32 ) < epsilon ) ) {\n\n\t\t\t// singularity found\n\t\t\t// first check for identity matrix which must have +1 for all terms\n\t\t\t// in leading diagonal and zero in other terms\n\n\t\t\tif ( ( Math.abs( m12 + m21 ) < epsilon2 ) &&\n\t\t\t     ( Math.abs( m13 + m31 ) < epsilon2 ) &&\n\t\t\t     ( Math.abs( m23 + m32 ) < epsilon2 ) &&\n\t\t\t     ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) {\n\n\t\t\t\t// this singularity is identity matrix so angle = 0\n\n\t\t\t\tthis.set( 1, 0, 0, 0 );\n\n\t\t\t\treturn this; // zero angle, arbitrary axis\n\n\t\t\t}\n\n\t\t\t// otherwise this singularity is angle = 180\n\n\t\t\tangle = Math.PI;\n\n\t\t\tconst xx = ( m11 + 1 ) / 2;\n\t\t\tconst yy = ( m22 + 1 ) / 2;\n\t\t\tconst zz = ( m33 + 1 ) / 2;\n\t\t\tconst xy = ( m12 + m21 ) / 4;\n\t\t\tconst xz = ( m13 + m31 ) / 4;\n\t\t\tconst yz = ( m23 + m32 ) / 4;\n\n\t\t\tif ( ( xx > yy ) && ( xx > zz ) ) {\n\n\t\t\t\t// m11 is the largest diagonal term\n\n\t\t\t\tif ( xx < epsilon ) {\n\n\t\t\t\t\tx = 0;\n\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tx = Math.sqrt( xx );\n\t\t\t\t\ty = xy / x;\n\t\t\t\t\tz = xz / x;\n\n\t\t\t\t}\n\n\t\t\t} else if ( yy > zz ) {\n\n\t\t\t\t// m22 is the largest diagonal term\n\n\t\t\t\tif ( yy < epsilon ) {\n\n\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\ty = 0;\n\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t} else {\n\n\t\t\t\t\ty = Math.sqrt( yy );\n\t\t\t\t\tx = xy / y;\n\t\t\t\t\tz = yz / y;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// m33 is the largest diagonal term so base result on this\n\n\t\t\t\tif ( zz < epsilon ) {\n\n\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\tz = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tz = Math.sqrt( zz );\n\t\t\t\t\tx = xz / z;\n\t\t\t\t\ty = yz / z;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.set( x, y, z, angle );\n\n\t\t\treturn this; // return 180 deg rotation\n\n\t\t}\n\n\t\t// as we have reached here there are no singularities so we can handle normally\n\n\t\tlet s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) +\n\t\t\t( m13 - m31 ) * ( m13 - m31 ) +\n\t\t\t( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize\n\n\t\tif ( Math.abs( s ) < 0.001 ) s = 1;\n\n\t\t// prevent divide by zero, should not happen if matrix is orthogonal and should be\n\t\t// caught by singularity test above, but I've left it in just in case\n\n\t\tthis.x = ( m32 - m23 ) / s;\n\t\tthis.y = ( m13 - m31 ) / s;\n\t\tthis.z = ( m21 - m12 ) / s;\n\t\tthis.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 );\n\n\t\treturn this;\n\n\t}\n\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\t\tthis.z = Math.min( this.z, v.z );\n\t\tthis.w = Math.min( this.w, v.w );\n\n\t\treturn this;\n\n\t}\n\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\t\tthis.z = Math.max( this.z, v.z );\n\t\tthis.w = Math.max( this.w, v.w );\n\n\t\treturn this;\n\n\t}\n\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\t\tthis.w = Math.max( min.w, Math.min( max.w, this.w ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = Math.max( minVal, Math.min( maxVal, this.x ) );\n\t\tthis.y = Math.max( minVal, Math.min( maxVal, this.y ) );\n\t\tthis.z = Math.max( minVal, Math.min( maxVal, this.z ) );\n\t\tthis.w = Math.max( minVal, Math.min( maxVal, this.w ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );\n\n\t}\n\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\t\tthis.z = Math.floor( this.z );\n\t\tthis.w = Math.floor( this.w );\n\n\t\treturn this;\n\n\t}\n\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\t\tthis.z = Math.ceil( this.z );\n\t\tthis.w = Math.ceil( this.w );\n\n\t\treturn this;\n\n\t}\n\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\t\tthis.z = Math.round( this.z );\n\t\tthis.w = Math.round( this.w );\n\n\t\treturn this;\n\n\t}\n\n\troundToZero() {\n\n\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\t\tthis.w = ( this.w < 0 ) ? Math.ceil( this.w ) : Math.floor( this.w );\n\n\t\treturn this;\n\n\t}\n\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\t\tthis.z = - this.z;\n\t\tthis.w = - this.w;\n\n\t\treturn this;\n\n\t}\n\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n\n\t}\n\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\n\n\t}\n\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );\n\n\t}\n\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w );\n\n\t}\n\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\tthis.z += ( v.z - this.z ) * alpha;\n\t\tthis.w += ( v.w - this.w ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\t\tthis.z = v1.z + ( v2.z - v1.z ) * alpha;\n\t\tthis.w = v1.w + ( v2.w - v1.w ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\t\tthis.z = array[ offset + 2 ];\n\t\tthis.w = array[ offset + 3 ];\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\t\tarray[ offset + 2 ] = this.z;\n\t\tarray[ offset + 3 ] = this.w;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index, offset ) {\n\n\t\tif ( offset !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector4: offset has been removed from .fromBufferAttribute().' );\n\n\t\t}\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\t\tthis.z = attribute.getZ( index );\n\t\tthis.w = attribute.getW( index );\n\n\t\treturn this;\n\n\t}\n\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\t\tthis.z = Math.random();\n\t\tthis.w = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\t\tyield this.z;\n\t\tyield this.w;\n\n\t}\n\n}\n\nVector4.prototype.isVector4 = true;\n\nexport { Vector4 };\n","function WebGLAnimation() {\n\n\tlet context = null;\n\tlet isAnimating = false;\n\tlet animationLoop = null;\n\tlet requestId = null;\n\n\tfunction onAnimationFrame( time, frame ) {\n\n\t\tanimationLoop( time, frame );\n\n\t\trequestId = context.requestAnimationFrame( onAnimationFrame );\n\n\t}\n\n\treturn {\n\n\t\tstart: function () {\n\n\t\t\tif ( isAnimating === true ) return;\n\t\t\tif ( animationLoop === null ) return;\n\n\t\t\trequestId = context.requestAnimationFrame( onAnimationFrame );\n\n\t\t\tisAnimating = true;\n\n\t\t},\n\n\t\tstop: function () {\n\n\t\t\tcontext.cancelAnimationFrame( requestId );\n\n\t\t\tisAnimating = false;\n\n\t\t},\n\n\t\tsetAnimationLoop: function ( callback ) {\n\n\t\t\tanimationLoop = callback;\n\n\t\t},\n\n\t\tsetContext: function ( value ) {\n\n\t\t\tcontext = value;\n\n\t\t}\n\n\t};\n\n}\n\nexport { WebGLAnimation };\n","function WebGLAttributes( gl, capabilities ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\n\tconst buffers = new WeakMap();\n\n\tfunction createBuffer( attribute, bufferType ) {\n\n\t\tconst array = attribute.array;\n\t\tconst usage = attribute.usage;\n\n\t\tconst buffer = gl.createBuffer();\n\n\t\tgl.bindBuffer( bufferType, buffer );\n\t\tgl.bufferData( bufferType, array, usage );\n\n\t\tattribute.onUploadCallback();\n\n\t\tlet type = gl.FLOAT;\n\n\t\tif ( array instanceof Float32Array ) {\n\n\t\t\ttype = gl.FLOAT;\n\n\t\t} else if ( array instanceof Float64Array ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLAttributes: Unsupported data buffer format: Float64Array.' );\n\n\t\t} else if ( array instanceof Uint16Array ) {\n\n\t\t\tif ( attribute.isFloat16BufferAttribute ) {\n\n\t\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\t\ttype = gl.HALF_FLOAT;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLAttributes: Usage of Float16BufferAttribute requires WebGL2.' );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\ttype = gl.UNSIGNED_SHORT;\n\n\t\t\t}\n\n\t\t} else if ( array instanceof Int16Array ) {\n\n\t\t\ttype = gl.SHORT;\n\n\t\t} else if ( array instanceof Uint32Array ) {\n\n\t\t\ttype = gl.UNSIGNED_INT;\n\n\t\t} else if ( array instanceof Int32Array ) {\n\n\t\t\ttype = gl.INT;\n\n\t\t} else if ( array instanceof Int8Array ) {\n\n\t\t\ttype = gl.BYTE;\n\n\t\t} else if ( array instanceof Uint8Array ) {\n\n\t\t\ttype = gl.UNSIGNED_BYTE;\n\n\t\t} else if ( array instanceof Uint8ClampedArray ) {\n\n\t\t\ttype = gl.UNSIGNED_BYTE;\n\n\t\t}\n\n\t\treturn {\n\t\t\tbuffer: buffer,\n\t\t\ttype: type,\n\t\t\tbytesPerElement: array.BYTES_PER_ELEMENT,\n\t\t\tversion: attribute.version\n\t\t};\n\n\t}\n\n\tfunction updateBuffer( buffer, attribute, bufferType ) {\n\n\t\tconst array = attribute.array;\n\t\tconst updateRange = attribute.updateRange;\n\n\t\tgl.bindBuffer( bufferType, buffer );\n\n\t\tif ( updateRange.count === - 1 ) {\n\n\t\t\t// Not using update ranges\n\n\t\t\tgl.bufferSubData( bufferType, 0, array );\n\n\t\t} else {\n\n\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\tgl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT,\n\t\t\t\t\tarray, updateRange.offset, updateRange.count );\n\n\t\t\t} else {\n\n\t\t\t\tgl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT,\n\t\t\t\t\tarray.subarray( updateRange.offset, updateRange.offset + updateRange.count ) );\n\n\t\t\t}\n\n\t\t\tupdateRange.count = - 1; // reset range\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction get( attribute ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\treturn buffers.get( attribute );\n\n\t}\n\n\tfunction remove( attribute ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\tconst data = buffers.get( attribute );\n\n\t\tif ( data ) {\n\n\t\t\tgl.deleteBuffer( data.buffer );\n\n\t\t\tbuffers.delete( attribute );\n\n\t\t}\n\n\t}\n\n\tfunction update( attribute, bufferType ) {\n\n\t\tif ( attribute.isGLBufferAttribute ) {\n\n\t\t\tconst cached = buffers.get( attribute );\n\n\t\t\tif ( ! cached || cached.version < attribute.version ) {\n\n\t\t\t\tbuffers.set( attribute, {\n\t\t\t\t\tbuffer: attribute.buffer,\n\t\t\t\t\ttype: attribute.type,\n\t\t\t\t\tbytesPerElement: attribute.elementSize,\n\t\t\t\t\tversion: attribute.version\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\tconst data = buffers.get( attribute );\n\n\t\tif ( data === undefined ) {\n\n\t\t\tbuffers.set( attribute, createBuffer( attribute, bufferType ) );\n\n\t\t} else if ( data.version < attribute.version ) {\n\n\t\t\tupdateBuffer( data.buffer, attribute, bufferType );\n\n\t\t\tdata.version = attribute.version;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\tget: get,\n\t\tremove: remove,\n\t\tupdate: update\n\n\t};\n\n}\n\n\nexport { WebGLAttributes };\n","class Vector2 {\n\n\tconstructor( x = 0, y = 0 ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\n\t}\n\n\tget width() {\n\n\t\treturn this.x;\n\n\t}\n\n\tset width( value ) {\n\n\t\tthis.x = value;\n\n\t}\n\n\tget height() {\n\n\t\treturn this.y;\n\n\t}\n\n\tset height( value ) {\n\n\t\tthis.y = value;\n\n\t}\n\n\tset( x, y ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\n\t\treturn this;\n\n\t}\n\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y );\n\n\t}\n\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\n\t\treturn this;\n\n\t}\n\n\tadd( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\treturn this.addVectors( v, w );\n\n\t\t}\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\n\t\treturn this;\n\n\t}\n\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\n\t\treturn this;\n\n\t}\n\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\n\t\treturn this;\n\n\t}\n\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\n\t\treturn this;\n\n\t}\n\n\tsub( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\treturn this.subVectors( v, w );\n\n\t\t}\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\n\t\treturn this;\n\n\t}\n\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\n\t\treturn this;\n\n\t}\n\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\tdivide( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\n\t\treturn this;\n\n\t}\n\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\tapplyMatrix3( m ) {\n\n\t\tconst x = this.x, y = this.y;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ];\n\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ];\n\n\t\treturn this;\n\n\t}\n\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\n\t\treturn this;\n\n\t}\n\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\n\t\treturn this;\n\n\t}\n\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = Math.max( minVal, Math.min( maxVal, this.x ) );\n\t\tthis.y = Math.max( minVal, Math.min( maxVal, this.y ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );\n\n\t}\n\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\n\t\treturn this;\n\n\t}\n\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\n\t\treturn this;\n\n\t}\n\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\n\t\treturn this;\n\n\t}\n\n\troundToZero() {\n\n\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\n\t\treturn this;\n\n\t}\n\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\n\t\treturn this;\n\n\t}\n\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y;\n\n\t}\n\n\tcross( v ) {\n\n\t\treturn this.x * v.y - this.y * v.x;\n\n\t}\n\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y;\n\n\t}\n\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y );\n\n\t}\n\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y );\n\n\t}\n\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\tangle() {\n\n\t\t// computes the angle in radians with respect to the positive x-axis\n\n\t\tconst angle = Math.atan2( - this.y, - this.x ) + Math.PI;\n\n\t\treturn angle;\n\n\t}\n\n\tdistanceTo( v ) {\n\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t}\n\n\tdistanceToSquared( v ) {\n\n\t\tconst dx = this.x - v.x, dy = this.y - v.y;\n\t\treturn dx * dx + dy * dy;\n\n\t}\n\n\tmanhattanDistanceTo( v ) {\n\n\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y );\n\n\t}\n\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index, offset ) {\n\n\t\tif ( offset !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector2: offset has been removed from .fromBufferAttribute().' );\n\n\t\t}\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\n\t\treturn this;\n\n\t}\n\n\trotateAround( center, angle ) {\n\n\t\tconst c = Math.cos( angle ), s = Math.sin( angle );\n\n\t\tconst x = this.x - center.x;\n\t\tconst y = this.y - center.y;\n\n\t\tthis.x = x * c - y * s + center.x;\n\t\tthis.y = x * s + y * c + center.y;\n\n\t\treturn this;\n\n\t}\n\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\n\t}\n\n}\n\nVector2.prototype.isVector2 = true;\n\nexport { Vector2 };\n","import * as MathUtils from './MathUtils.js';\n\nconst _colorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF,\n\t'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2,\n\t'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50,\n\t'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B,\n\t'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B,\n\t'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F,\n\t'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3,\n\t'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222,\n\t'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700,\n\t'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4,\n\t'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00,\n\t'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3,\n\t'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA,\n\t'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32,\n\t'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3,\n\t'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC,\n\t'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD,\n\t'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6,\n\t'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9,\n\t'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'rebeccapurple': 0x663399, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F,\n\t'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE,\n\t'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA,\n\t'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0,\n\t'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 };\n\nconst _hslA = { h: 0, s: 0, l: 0 };\nconst _hslB = { h: 0, s: 0, l: 0 };\n\nfunction hue2rgb( p, q, t ) {\n\n\tif ( t < 0 ) t += 1;\n\tif ( t > 1 ) t -= 1;\n\tif ( t < 1 / 6 ) return p + ( q - p ) * 6 * t;\n\tif ( t < 1 / 2 ) return q;\n\tif ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t );\n\treturn p;\n\n}\n\nfunction SRGBToLinear( c ) {\n\n\treturn ( c < 0.04045 ) ? c * 0.0773993808 : Math.pow( c * 0.9478672986 + 0.0521327014, 2.4 );\n\n}\n\nfunction LinearToSRGB( c ) {\n\n\treturn ( c < 0.0031308 ) ? c * 12.92 : 1.055 * ( Math.pow( c, 0.41666 ) ) - 0.055;\n\n}\n\nclass Color {\n\n\tconstructor( r, g, b ) {\n\n\t\tif ( g === undefined && b === undefined ) {\n\n\t\t\t// r is THREE.Color, hex or string\n\t\t\treturn this.set( r );\n\n\t\t}\n\n\t\treturn this.setRGB( r, g, b );\n\n\t}\n\n\tset( value ) {\n\n\t\tif ( value && value.isColor ) {\n\n\t\t\tthis.copy( value );\n\n\t\t} else if ( typeof value === 'number' ) {\n\n\t\t\tthis.setHex( value );\n\n\t\t} else if ( typeof value === 'string' ) {\n\n\t\t\tthis.setStyle( value );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetScalar( scalar ) {\n\n\t\tthis.r = scalar;\n\t\tthis.g = scalar;\n\t\tthis.b = scalar;\n\n\t\treturn this;\n\n\t}\n\n\tsetHex( hex ) {\n\n\t\thex = Math.floor( hex );\n\n\t\tthis.r = ( hex >> 16 & 255 ) / 255;\n\t\tthis.g = ( hex >> 8 & 255 ) / 255;\n\t\tthis.b = ( hex & 255 ) / 255;\n\n\t\treturn this;\n\n\t}\n\n\tsetRGB( r, g, b ) {\n\n\t\tthis.r = r;\n\t\tthis.g = g;\n\t\tthis.b = b;\n\n\t\treturn this;\n\n\t}\n\n\tsetHSL( h, s, l ) {\n\n\t\t// h,s,l ranges are in 0.0 - 1.0\n\t\th = MathUtils.euclideanModulo( h, 1 );\n\t\ts = MathUtils.clamp( s, 0, 1 );\n\t\tl = MathUtils.clamp( l, 0, 1 );\n\n\t\tif ( s === 0 ) {\n\n\t\t\tthis.r = this.g = this.b = l;\n\n\t\t} else {\n\n\t\t\tconst p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s );\n\t\t\tconst q = ( 2 * l ) - p;\n\n\t\t\tthis.r = hue2rgb( q, p, h + 1 / 3 );\n\t\t\tthis.g = hue2rgb( q, p, h );\n\t\t\tthis.b = hue2rgb( q, p, h - 1 / 3 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetStyle( style ) {\n\n\t\tfunction handleAlpha( string ) {\n\n\t\t\tif ( string === undefined ) return;\n\n\t\t\tif ( parseFloat( string ) < 1 ) {\n\n\t\t\t\tconsole.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' );\n\n\t\t\t}\n\n\t\t}\n\n\n\t\tlet m;\n\n\t\tif ( m = /^((?:rgb|hsl)a?)\\(([^\\)]*)\\)/.exec( style ) ) {\n\n\t\t\t// rgb / hsl\n\n\t\t\tlet color;\n\t\t\tconst name = m[ 1 ];\n\t\t\tconst components = m[ 2 ];\n\n\t\t\tswitch ( name ) {\n\n\t\t\t\tcase 'rgb':\n\t\t\t\tcase 'rgba':\n\n\t\t\t\t\tif ( color = /^\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// rgb(255,0,0) rgba(255,0,0,0.5)\n\t\t\t\t\t\tthis.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255;\n\t\t\t\t\t\tthis.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255;\n\t\t\t\t\t\tthis.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255;\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( color = /^\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// rgb(100%,0%,0%) rgba(100%,0%,0%,0.5)\n\t\t\t\t\t\tthis.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100;\n\t\t\t\t\t\tthis.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100;\n\t\t\t\t\t\tthis.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100;\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'hsl':\n\t\t\t\tcase 'hsla':\n\n\t\t\t\t\tif ( color = /^\\s*(\\d*\\.?\\d+)\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// hsl(120,50%,50%) hsla(120,50%,50%,0.5)\n\t\t\t\t\t\tconst h = parseFloat( color[ 1 ] ) / 360;\n\t\t\t\t\t\tconst s = parseInt( color[ 2 ], 10 ) / 100;\n\t\t\t\t\t\tconst l = parseInt( color[ 3 ], 10 ) / 100;\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this.setHSL( h, s, l );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t} else if ( m = /^\\#([A-Fa-f\\d]+)$/.exec( style ) ) {\n\n\t\t\t// hex color\n\n\t\t\tconst hex = m[ 1 ];\n\t\t\tconst size = hex.length;\n\n\t\t\tif ( size === 3 ) {\n\n\t\t\t\t// #ff0\n\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 0 ), 16 ) / 255;\n\t\t\t\tthis.g = parseInt( hex.charAt( 1 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\tthis.b = parseInt( hex.charAt( 2 ) + hex.charAt( 2 ), 16 ) / 255;\n\n\t\t\t\treturn this;\n\n\t\t\t} else if ( size === 6 ) {\n\n\t\t\t\t// #ff0000\n\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\tthis.g = parseInt( hex.charAt( 2 ) + hex.charAt( 3 ), 16 ) / 255;\n\t\t\t\tthis.b = parseInt( hex.charAt( 4 ) + hex.charAt( 5 ), 16 ) / 255;\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( style && style.length > 0 ) {\n\n\t\t\treturn this.setColorName( style );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetColorName( style ) {\n\n\t\t// color keywords\n\t\tconst hex = _colorKeywords[ style.toLowerCase() ];\n\n\t\tif ( hex !== undefined ) {\n\n\t\t\t// red\n\t\t\tthis.setHex( hex );\n\n\t\t} else {\n\n\t\t\t// unknown color\n\t\t\tconsole.warn( 'THREE.Color: Unknown color ' + style );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.r, this.g, this.b );\n\n\t}\n\n\tcopy( color ) {\n\n\t\tthis.r = color.r;\n\t\tthis.g = color.g;\n\t\tthis.b = color.b;\n\n\t\treturn this;\n\n\t}\n\n\tcopySRGBToLinear( color ) {\n\n\t\tthis.r = SRGBToLinear( color.r );\n\t\tthis.g = SRGBToLinear( color.g );\n\t\tthis.b = SRGBToLinear( color.b );\n\n\t\treturn this;\n\n\t}\n\n\tcopyLinearToSRGB( color ) {\n\n\t\tthis.r = LinearToSRGB( color.r );\n\t\tthis.g = LinearToSRGB( color.g );\n\t\tthis.b = LinearToSRGB( color.b );\n\n\t\treturn this;\n\n\t}\n\n\tconvertSRGBToLinear() {\n\n\t\tthis.copySRGBToLinear( this );\n\n\t\treturn this;\n\n\t}\n\n\tconvertLinearToSRGB() {\n\n\t\tthis.copyLinearToSRGB( this );\n\n\t\treturn this;\n\n\t}\n\n\tgetHex() {\n\n\t\treturn ( this.r * 255 ) << 16 ^ ( this.g * 255 ) << 8 ^ ( this.b * 255 ) << 0;\n\n\t}\n\n\tgetHexString() {\n\n\t\treturn ( '000000' + this.getHex().toString( 16 ) ).slice( - 6 );\n\n\t}\n\n\tgetHSL( target ) {\n\n\t\t// h,s,l ranges are in 0.0 - 1.0\n\n\t\tconst r = this.r, g = this.g, b = this.b;\n\n\t\tconst max = Math.max( r, g, b );\n\t\tconst min = Math.min( r, g, b );\n\n\t\tlet hue, saturation;\n\t\tconst lightness = ( min + max ) / 2.0;\n\n\t\tif ( min === max ) {\n\n\t\t\thue = 0;\n\t\t\tsaturation = 0;\n\n\t\t} else {\n\n\t\t\tconst delta = max - min;\n\n\t\t\tsaturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min );\n\n\t\t\tswitch ( max ) {\n\n\t\t\t\tcase r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break;\n\t\t\t\tcase g: hue = ( b - r ) / delta + 2; break;\n\t\t\t\tcase b: hue = ( r - g ) / delta + 4; break;\n\n\t\t\t}\n\n\t\t\thue /= 6;\n\n\t\t}\n\n\t\ttarget.h = hue;\n\t\ttarget.s = saturation;\n\t\ttarget.l = lightness;\n\n\t\treturn target;\n\n\t}\n\n\tgetStyle() {\n\n\t\treturn 'rgb(' + ( ( this.r * 255 ) | 0 ) + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')';\n\n\t}\n\n\toffsetHSL( h, s, l ) {\n\n\t\tthis.getHSL( _hslA );\n\n\t\t_hslA.h += h; _hslA.s += s; _hslA.l += l;\n\n\t\tthis.setHSL( _hslA.h, _hslA.s, _hslA.l );\n\n\t\treturn this;\n\n\t}\n\n\tadd( color ) {\n\n\t\tthis.r += color.r;\n\t\tthis.g += color.g;\n\t\tthis.b += color.b;\n\n\t\treturn this;\n\n\t}\n\n\taddColors( color1, color2 ) {\n\n\t\tthis.r = color1.r + color2.r;\n\t\tthis.g = color1.g + color2.g;\n\t\tthis.b = color1.b + color2.b;\n\n\t\treturn this;\n\n\t}\n\n\taddScalar( s ) {\n\n\t\tthis.r += s;\n\t\tthis.g += s;\n\t\tthis.b += s;\n\n\t\treturn this;\n\n\t}\n\n\tsub( color ) {\n\n\t\tthis.r = Math.max( 0, this.r - color.r );\n\t\tthis.g = Math.max( 0, this.g - color.g );\n\t\tthis.b = Math.max( 0, this.b - color.b );\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( color ) {\n\n\t\tthis.r *= color.r;\n\t\tthis.g *= color.g;\n\t\tthis.b *= color.b;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( s ) {\n\n\t\tthis.r *= s;\n\t\tthis.g *= s;\n\t\tthis.b *= s;\n\n\t\treturn this;\n\n\t}\n\n\tlerp( color, alpha ) {\n\n\t\tthis.r += ( color.r - this.r ) * alpha;\n\t\tthis.g += ( color.g - this.g ) * alpha;\n\t\tthis.b += ( color.b - this.b ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpColors( color1, color2, alpha ) {\n\n\t\tthis.r = color1.r + ( color2.r - color1.r ) * alpha;\n\t\tthis.g = color1.g + ( color2.g - color1.g ) * alpha;\n\t\tthis.b = color1.b + ( color2.b - color1.b ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpHSL( color, alpha ) {\n\n\t\tthis.getHSL( _hslA );\n\t\tcolor.getHSL( _hslB );\n\n\t\tconst h = MathUtils.lerp( _hslA.h, _hslB.h, alpha );\n\t\tconst s = MathUtils.lerp( _hslA.s, _hslB.s, alpha );\n\t\tconst l = MathUtils.lerp( _hslA.l, _hslB.l, alpha );\n\n\t\tthis.setHSL( h, s, l );\n\n\t\treturn this;\n\n\t}\n\n\tequals( c ) {\n\n\t\treturn ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.r = array[ offset ];\n\t\tthis.g = array[ offset + 1 ];\n\t\tthis.b = array[ offset + 2 ];\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.r;\n\t\tarray[ offset + 1 ] = this.g;\n\t\tarray[ offset + 2 ] = this.b;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.r = attribute.getX( index );\n\t\tthis.g = attribute.getY( index );\n\t\tthis.b = attribute.getZ( index );\n\n\t\tif ( attribute.normalized === true ) {\n\n\t\t\t// assuming Uint8Array\n\n\t\t\tthis.r /= 255;\n\t\t\tthis.g /= 255;\n\t\t\tthis.b /= 255;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\treturn this.getHex();\n\n\t}\n\n}\n\nColor.NAMES = _colorKeywords;\n\nColor.prototype.isColor = true;\nColor.prototype.r = 1;\nColor.prototype.g = 1;\nColor.prototype.b = 1;\n\nexport { Color, SRGBToLinear };\n","import { Vector4 } from '../math/Vector4.js';\nimport { Vector3 } from '../math/Vector3.js';\nimport { Vector2 } from '../math/Vector2.js';\nimport { Color } from '../math/Color.js';\nimport { StaticDrawUsage } from '../constants.js';\n\nconst _vector = /*@__PURE__*/ new Vector3();\nconst _vector2 = /*@__PURE__*/ new Vector2();\n\nclass BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tif ( Array.isArray( array ) ) {\n\n\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t}\n\n\t\tthis.name = '';\n\n\t\tthis.array = array;\n\t\tthis.itemSize = itemSize;\n\t\tthis.count = array !== undefined ? array.length / itemSize : 0;\n\t\tthis.normalized = normalized === true;\n\n\t\tthis.usage = StaticDrawUsage;\n\t\tthis.updateRange = { offset: 0, count: - 1 };\n\n\t\tthis.version = 0;\n\n\t}\n\n\tonUploadCallback() {}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\tsetUsage( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\t\tthis.array = new source.array.constructor( source.array );\n\t\tthis.itemSize = source.itemSize;\n\t\tthis.count = source.count;\n\t\tthis.normalized = source.normalized;\n\n\t\tthis.usage = source.usage;\n\n\t\treturn this;\n\n\t}\n\n\tcopyAt( index1, attribute, index2 ) {\n\n\t\tindex1 *= this.itemSize;\n\t\tindex2 *= attribute.itemSize;\n\n\t\tfor ( let i = 0, l = this.itemSize; i < l; i ++ ) {\n\n\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tcopyArray( array ) {\n\n\t\tthis.array.set( array );\n\n\t\treturn this;\n\n\t}\n\n\tcopyColorsArray( colors ) {\n\n\t\tconst array = this.array;\n\t\tlet offset = 0;\n\n\t\tfor ( let i = 0, l = colors.length; i < l; i ++ ) {\n\n\t\t\tlet color = colors[ i ];\n\n\t\t\tif ( color === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyColorsArray(): color is undefined', i );\n\t\t\t\tcolor = new Color();\n\n\t\t\t}\n\n\t\t\tarray[ offset ++ ] = color.r;\n\t\t\tarray[ offset ++ ] = color.g;\n\t\t\tarray[ offset ++ ] = color.b;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tcopyVector2sArray( vectors ) {\n\n\t\tconst array = this.array;\n\t\tlet offset = 0;\n\n\t\tfor ( let i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\tlet vector = vectors[ i ];\n\n\t\t\tif ( vector === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i );\n\t\t\t\tvector = new Vector2();\n\n\t\t\t}\n\n\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\tarray[ offset ++ ] = vector.y;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tcopyVector3sArray( vectors ) {\n\n\t\tconst array = this.array;\n\t\tlet offset = 0;\n\n\t\tfor ( let i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\tlet vector = vectors[ i ];\n\n\t\t\tif ( vector === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i );\n\t\t\t\tvector = new Vector3();\n\n\t\t\t}\n\n\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\tarray[ offset ++ ] = vector.y;\n\t\t\tarray[ offset ++ ] = vector.z;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tcopyVector4sArray( vectors ) {\n\n\t\tconst array = this.array;\n\t\tlet offset = 0;\n\n\t\tfor ( let i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\tlet vector = vectors[ i ];\n\n\t\t\tif ( vector === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i );\n\t\t\t\tvector = new Vector4();\n\n\t\t\t}\n\n\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\tarray[ offset ++ ] = vector.y;\n\t\t\tarray[ offset ++ ] = vector.z;\n\t\t\tarray[ offset ++ ] = vector.w;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tapplyMatrix3( m ) {\n\n\t\tif ( this.itemSize === 2 ) {\n\n\t\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t\t_vector2.fromBufferAttribute( this, i );\n\t\t\t\t_vector2.applyMatrix3( m );\n\n\t\t\t\tthis.setXY( i, _vector2.x, _vector2.y );\n\n\t\t\t}\n\n\t\t} else if ( this.itemSize === 3 ) {\n\n\t\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t\t_vector.fromBufferAttribute( this, i );\n\t\t\t\t_vector.applyMatrix3( m );\n\n\t\t\t\tthis.setXYZ( i, _vector.x, _vector.y, _vector.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tapplyMatrix4( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector.x = this.getX( i );\n\t\t\t_vector.y = this.getY( i );\n\t\t\t_vector.z = this.getZ( i );\n\n\t\t\t_vector.applyMatrix4( m );\n\n\t\t\tthis.setXYZ( i, _vector.x, _vector.y, _vector.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tapplyNormalMatrix( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector.x = this.getX( i );\n\t\t\t_vector.y = this.getY( i );\n\t\t\t_vector.z = this.getZ( i );\n\n\t\t\t_vector.applyNormalMatrix( m );\n\n\t\t\tthis.setXYZ( i, _vector.x, _vector.y, _vector.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttransformDirection( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector.x = this.getX( i );\n\t\t\t_vector.y = this.getY( i );\n\t\t\t_vector.z = this.getZ( i );\n\n\t\t\t_vector.transformDirection( m );\n\n\t\t\tthis.setXYZ( i, _vector.x, _vector.y, _vector.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tset( value, offset = 0 ) {\n\n\t\tthis.array.set( value, offset );\n\n\t\treturn this;\n\n\t}\n\n\tgetX( index ) {\n\n\t\treturn this.array[ index * this.itemSize ];\n\n\t}\n\n\tsetX( index, x ) {\n\n\t\tthis.array[ index * this.itemSize ] = x;\n\n\t\treturn this;\n\n\t}\n\n\tgetY( index ) {\n\n\t\treturn this.array[ index * this.itemSize + 1 ];\n\n\t}\n\n\tsetY( index, y ) {\n\n\t\tthis.array[ index * this.itemSize + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\tgetZ( index ) {\n\n\t\treturn this.array[ index * this.itemSize + 2 ];\n\n\t}\n\n\tsetZ( index, z ) {\n\n\t\tthis.array[ index * this.itemSize + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\tgetW( index ) {\n\n\t\treturn this.array[ index * this.itemSize + 3 ];\n\n\t}\n\n\tsetW( index, w ) {\n\n\t\tthis.array[ index * this.itemSize + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\tsetXY( index, x, y ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZ( index, x, y, z ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\t\tthis.array[ index + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZW( index, x, y, z, w ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\t\tthis.array[ index + 2 ] = z;\n\t\tthis.array[ index + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\tonUpload( callback ) {\n\n\t\tthis.onUploadCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.array, this.itemSize ).copy( this );\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\titemSize: this.itemSize,\n\t\t\ttype: this.array.constructor.name,\n\t\t\tarray: Array.prototype.slice.call( this.array ),\n\t\t\tnormalized: this.normalized\n\t\t};\n\n\t\tif ( this.name !== '' ) data.name = this.name;\n\t\tif ( this.usage !== StaticDrawUsage ) data.usage = this.usage;\n\t\tif ( this.updateRange.offset !== 0 || this.updateRange.count !== - 1 ) data.updateRange = this.updateRange;\n\n\t\treturn data;\n\n\t}\n\n}\n\nBufferAttribute.prototype.isBufferAttribute = true;\n\n//\n\nclass Int8BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int8Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Uint8BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint8Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Uint8ClampedBufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint8ClampedArray( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Int16BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int16Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Uint16BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint16Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Int32BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Uint32BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Float16BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint16Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nFloat16BufferAttribute.prototype.isFloat16BufferAttribute = true;\n\nclass Float32BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Float32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Float64BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Float64Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n//\n\nexport {\n\tFloat64BufferAttribute,\n\tFloat32BufferAttribute,\n\tFloat16BufferAttribute,\n\tUint32BufferAttribute,\n\tInt32BufferAttribute,\n\tUint16BufferAttribute,\n\tInt16BufferAttribute,\n\tUint8ClampedBufferAttribute,\n\tUint8BufferAttribute,\n\tInt8BufferAttribute,\n\tBufferAttribute\n};\n","function arrayMin( array ) {\n\n\tif ( array.length === 0 ) return Infinity;\n\n\tlet min = array[ 0 ];\n\n\tfor ( let i = 1, l = array.length; i < l; ++ i ) {\n\n\t\tif ( array[ i ] < min ) min = array[ i ];\n\n\t}\n\n\treturn min;\n\n}\n\nfunction arrayMax( array ) {\n\n\tif ( array.length === 0 ) return - Infinity;\n\n\tlet max = array[ 0 ];\n\n\tfor ( let i = 1, l = array.length; i < l; ++ i ) {\n\n\t\tif ( array[ i ] > max ) max = array[ i ];\n\n\t}\n\n\treturn max;\n\n}\n\nfunction arrayNeedsUint32( array ) {\n\n\t// assumes larger values usually on last\n\n\tfor ( let i = array.length - 1; i >= 0; -- i ) {\n\n\t\tif ( array[ i ] > 65535 ) return true;\n\n\t}\n\n\treturn false;\n\n}\n\nconst TYPED_ARRAYS = {\n\tInt8Array: Int8Array,\n\tUint8Array: Uint8Array,\n\tUint8ClampedArray: Uint8ClampedArray,\n\tInt16Array: Int16Array,\n\tUint16Array: Uint16Array,\n\tInt32Array: Int32Array,\n\tUint32Array: Uint32Array,\n\tFloat32Array: Float32Array,\n\tFloat64Array: Float64Array\n};\n\nfunction getTypedArray( type, buffer ) {\n\n\treturn new TYPED_ARRAYS[ type ]( buffer );\n\n}\n\nfunction createElementNS( name ) {\n\n\treturn document.createElementNS( 'http://www.w3.org/1999/xhtml', name );\n\n}\n\nexport { arrayMin, arrayMax, arrayNeedsUint32, getTypedArray, createElementNS };\n","import { Vector3 } from '../math/Vector3.js';\nimport { Vector2 } from '../math/Vector2.js';\nimport { Box3 } from '../math/Box3.js';\nimport { EventDispatcher } from './EventDispatcher.js';\nimport { BufferAttribute, Float32BufferAttribute, Uint16BufferAttribute, Uint32BufferAttribute } from './BufferAttribute.js';\nimport { Sphere } from '../math/Sphere.js';\nimport { Object3D } from './Object3D.js';\nimport { Matrix4 } from '../math/Matrix4.js';\nimport { Matrix3 } from '../math/Matrix3.js';\nimport * as MathUtils from '../math/MathUtils.js';\nimport { arrayNeedsUint32 } from '../utils.js';\n\nlet _id = 0;\n\nconst _m1 = /*@__PURE__*/ new Matrix4();\nconst _obj = /*@__PURE__*/ new Object3D();\nconst _offset = /*@__PURE__*/ new Vector3();\nconst _box = /*@__PURE__*/ new Box3();\nconst _boxMorphTargets = /*@__PURE__*/ new Box3();\nconst _vector = /*@__PURE__*/ new Vector3();\n\nclass BufferGeometry extends EventDispatcher {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tObject.defineProperty( this, 'id', { value: _id ++ } );\n\n\t\tthis.uuid = MathUtils.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'BufferGeometry';\n\n\t\tthis.index = null;\n\t\tthis.attributes = {};\n\n\t\tthis.morphAttributes = {};\n\t\tthis.morphTargetsRelative = false;\n\n\t\tthis.groups = [];\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\tthis.drawRange = { start: 0, count: Infinity };\n\n\t\tthis.userData = {};\n\n\t}\n\n\tgetIndex() {\n\n\t\treturn this.index;\n\n\t}\n\n\tsetIndex( index ) {\n\n\t\tif ( Array.isArray( index ) ) {\n\n\t\t\tthis.index = new ( arrayNeedsUint32( index ) ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 );\n\n\t\t} else {\n\n\t\t\tthis.index = index;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetAttribute( name ) {\n\n\t\treturn this.attributes[ name ];\n\n\t}\n\n\tsetAttribute( name, attribute ) {\n\n\t\tthis.attributes[ name ] = attribute;\n\n\t\treturn this;\n\n\t}\n\n\tdeleteAttribute( name ) {\n\n\t\tdelete this.attributes[ name ];\n\n\t\treturn this;\n\n\t}\n\n\thasAttribute( name ) {\n\n\t\treturn this.attributes[ name ] !== undefined;\n\n\t}\n\n\taddGroup( start, count, materialIndex = 0 ) {\n\n\t\tthis.groups.push( {\n\n\t\t\tstart: start,\n\t\t\tcount: count,\n\t\t\tmaterialIndex: materialIndex\n\n\t\t} );\n\n\t}\n\n\tclearGroups() {\n\n\t\tthis.groups = [];\n\n\t}\n\n\tsetDrawRange( start, count ) {\n\n\t\tthis.drawRange.start = start;\n\t\tthis.drawRange.count = count;\n\n\t}\n\n\tapplyMatrix4( matrix ) {\n\n\t\tconst position = this.attributes.position;\n\n\t\tif ( position !== undefined ) {\n\n\t\t\tposition.applyMatrix4( matrix );\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t}\n\n\t\tconst normal = this.attributes.normal;\n\n\t\tif ( normal !== undefined ) {\n\n\t\t\tconst normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\tnormal.applyNormalMatrix( normalMatrix );\n\n\t\t\tnormal.needsUpdate = true;\n\n\t\t}\n\n\t\tconst tangent = this.attributes.tangent;\n\n\t\tif ( tangent !== undefined ) {\n\n\t\t\ttangent.transformDirection( matrix );\n\n\t\t\ttangent.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( this.boundingBox !== null ) {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t}\n\n\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\tthis.computeBoundingSphere();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tapplyQuaternion( q ) {\n\n\t\t_m1.makeRotationFromQuaternion( q );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateX( angle ) {\n\n\t\t// rotate geometry around world x-axis\n\n\t\t_m1.makeRotationX( angle );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateY( angle ) {\n\n\t\t// rotate geometry around world y-axis\n\n\t\t_m1.makeRotationY( angle );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateZ( angle ) {\n\n\t\t// rotate geometry around world z-axis\n\n\t\t_m1.makeRotationZ( angle );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( x, y, z ) {\n\n\t\t// translate geometry\n\n\t\t_m1.makeTranslation( x, y, z );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\tscale( x, y, z ) {\n\n\t\t// scale geometry\n\n\t\t_m1.makeScale( x, y, z );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\tlookAt( vector ) {\n\n\t\t_obj.lookAt( vector );\n\n\t\t_obj.updateMatrix();\n\n\t\tthis.applyMatrix4( _obj.matrix );\n\n\t\treturn this;\n\n\t}\n\n\tcenter() {\n\n\t\tthis.computeBoundingBox();\n\n\t\tthis.boundingBox.getCenter( _offset ).negate();\n\n\t\tthis.translate( _offset.x, _offset.y, _offset.z );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPoints( points ) {\n\n\t\tconst position = [];\n\n\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\tconst point = points[ i ];\n\t\t\tposition.push( point.x, point.y, point.z || 0 );\n\n\t\t}\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( position, 3 ) );\n\n\t\treturn this;\n\n\t}\n\n\tcomputeBoundingBox() {\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tconst position = this.attributes.position;\n\t\tconst morphAttributesPosition = this.morphAttributes.position;\n\n\t\tif ( position && position.isGLBufferAttribute ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box. Alternatively set \"mesh.frustumCulled\" to \"false\".', this );\n\n\t\t\tthis.boundingBox.set(\n\t\t\t\tnew Vector3( - Infinity, - Infinity, - Infinity ),\n\t\t\t\tnew Vector3( + Infinity, + Infinity, + Infinity )\n\t\t\t);\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( position !== undefined ) {\n\n\t\t\tthis.boundingBox.setFromBufferAttribute( position );\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\t_box.setFromBufferAttribute( morphAttribute );\n\n\t\t\t\t\tif ( this.morphTargetsRelative ) {\n\n\t\t\t\t\t\t_vector.addVectors( this.boundingBox.min, _box.min );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _vector );\n\n\t\t\t\t\t\t_vector.addVectors( this.boundingBox.max, _box.max );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _vector );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _box.min );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _box.max );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthis.boundingBox.makeEmpty();\n\n\t\t}\n\n\t\tif ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingBox(): Computed min/max have NaN values. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t}\n\n\t}\n\n\tcomputeBoundingSphere() {\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tconst position = this.attributes.position;\n\t\tconst morphAttributesPosition = this.morphAttributes.position;\n\n\t\tif ( position && position.isGLBufferAttribute ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingSphere(): GLBufferAttribute requires a manual bounding sphere. Alternatively set \"mesh.frustumCulled\" to \"false\".', this );\n\n\t\t\tthis.boundingSphere.set( new Vector3(), Infinity );\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( position ) {\n\n\t\t\t// first, find the center of the bounding sphere\n\n\t\t\tconst center = this.boundingSphere.center;\n\n\t\t\t_box.setFromBufferAttribute( position );\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\t_boxMorphTargets.setFromBufferAttribute( morphAttribute );\n\n\t\t\t\t\tif ( this.morphTargetsRelative ) {\n\n\t\t\t\t\t\t_vector.addVectors( _box.min, _boxMorphTargets.min );\n\t\t\t\t\t\t_box.expandByPoint( _vector );\n\n\t\t\t\t\t\t_vector.addVectors( _box.max, _boxMorphTargets.max );\n\t\t\t\t\t\t_box.expandByPoint( _vector );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_box.expandByPoint( _boxMorphTargets.min );\n\t\t\t\t\t\t_box.expandByPoint( _boxMorphTargets.max );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_box.getCenter( center );\n\n\t\t\t// second, try to find a boundingSphere with a radius smaller than the\n\t\t\t// boundingSphere of the boundingBox: sqrt(3) smaller in the best case\n\n\t\t\tlet maxRadiusSq = 0;\n\n\t\t\tfor ( let i = 0, il = position.count; i < il; i ++ ) {\n\n\t\t\t\t_vector.fromBufferAttribute( position, i );\n\n\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector ) );\n\n\t\t\t}\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\tconst morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t\t\t\tfor ( let j = 0, jl = morphAttribute.count; j < jl; j ++ ) {\n\n\t\t\t\t\t\t_vector.fromBufferAttribute( morphAttribute, j );\n\n\t\t\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t\t\t_offset.fromBufferAttribute( position, j );\n\t\t\t\t\t\t\t_vector.add( _offset );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.boundingSphere.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\tif ( isNaN( this.boundingSphere.radius ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcomputeTangents() {\n\n\t\tconst index = this.index;\n\t\tconst attributes = this.attributes;\n\n\t\t// based on http://www.terathon.com/code/tangent.html\n\t\t// (per vertex tangents)\n\n\t\tif ( index === null ||\n\t\t\t attributes.position === undefined ||\n\t\t\t attributes.normal === undefined ||\n\t\t\t attributes.uv === undefined ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry: .computeTangents() failed. Missing required attributes (index, position, normal or uv)' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst indices = index.array;\n\t\tconst positions = attributes.position.array;\n\t\tconst normals = attributes.normal.array;\n\t\tconst uvs = attributes.uv.array;\n\n\t\tconst nVertices = positions.length / 3;\n\n\t\tif ( attributes.tangent === undefined ) {\n\n\t\t\tthis.setAttribute( 'tangent', new BufferAttribute( new Float32Array( 4 * nVertices ), 4 ) );\n\n\t\t}\n\n\t\tconst tangents = attributes.tangent.array;\n\n\t\tconst tan1 = [], tan2 = [];\n\n\t\tfor ( let i = 0; i < nVertices; i ++ ) {\n\n\t\t\ttan1[ i ] = new Vector3();\n\t\t\ttan2[ i ] = new Vector3();\n\n\t\t}\n\n\t\tconst vA = new Vector3(),\n\t\t\tvB = new Vector3(),\n\t\t\tvC = new Vector3(),\n\n\t\t\tuvA = new Vector2(),\n\t\t\tuvB = new Vector2(),\n\t\t\tuvC = new Vector2(),\n\n\t\t\tsdir = new Vector3(),\n\t\t\ttdir = new Vector3();\n\n\t\tfunction handleTriangle( a, b, c ) {\n\n\t\t\tvA.fromArray( positions, a * 3 );\n\t\t\tvB.fromArray( positions, b * 3 );\n\t\t\tvC.fromArray( positions, c * 3 );\n\n\t\t\tuvA.fromArray( uvs, a * 2 );\n\t\t\tuvB.fromArray( uvs, b * 2 );\n\t\t\tuvC.fromArray( uvs, c * 2 );\n\n\t\t\tvB.sub( vA );\n\t\t\tvC.sub( vA );\n\n\t\t\tuvB.sub( uvA );\n\t\t\tuvC.sub( uvA );\n\n\t\t\tconst r = 1.0 / ( uvB.x * uvC.y - uvC.x * uvB.y );\n\n\t\t\t// silently ignore degenerate uv triangles having coincident or colinear vertices\n\n\t\t\tif ( ! isFinite( r ) ) return;\n\n\t\t\tsdir.copy( vB ).multiplyScalar( uvC.y ).addScaledVector( vC, - uvB.y ).multiplyScalar( r );\n\t\t\ttdir.copy( vC ).multiplyScalar( uvB.x ).addScaledVector( vB, - uvC.x ).multiplyScalar( r );\n\n\t\t\ttan1[ a ].add( sdir );\n\t\t\ttan1[ b ].add( sdir );\n\t\t\ttan1[ c ].add( sdir );\n\n\t\t\ttan2[ a ].add( tdir );\n\t\t\ttan2[ b ].add( tdir );\n\t\t\ttan2[ c ].add( tdir );\n\n\t\t}\n\n\t\tlet groups = this.groups;\n\n\t\tif ( groups.length === 0 ) {\n\n\t\t\tgroups = [ {\n\t\t\t\tstart: 0,\n\t\t\t\tcount: indices.length\n\t\t\t} ];\n\n\t\t}\n\n\t\tfor ( let i = 0, il = groups.length; i < il; ++ i ) {\n\n\t\t\tconst group = groups[ i ];\n\n\t\t\tconst start = group.start;\n\t\t\tconst count = group.count;\n\n\t\t\tfor ( let j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\thandleTriangle(\n\t\t\t\t\tindices[ j + 0 ],\n\t\t\t\t\tindices[ j + 1 ],\n\t\t\t\t\tindices[ j + 2 ]\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst tmp = new Vector3(), tmp2 = new Vector3();\n\t\tconst n = new Vector3(), n2 = new Vector3();\n\n\t\tfunction handleVertex( v ) {\n\n\t\t\tn.fromArray( normals, v * 3 );\n\t\t\tn2.copy( n );\n\n\t\t\tconst t = tan1[ v ];\n\n\t\t\t// Gram-Schmidt orthogonalize\n\n\t\t\ttmp.copy( t );\n\t\t\ttmp.sub( n.multiplyScalar( n.dot( t ) ) ).normalize();\n\n\t\t\t// Calculate handedness\n\n\t\t\ttmp2.crossVectors( n2, t );\n\t\t\tconst test = tmp2.dot( tan2[ v ] );\n\t\t\tconst w = ( test < 0.0 ) ? - 1.0 : 1.0;\n\n\t\t\ttangents[ v * 4 ] = tmp.x;\n\t\t\ttangents[ v * 4 + 1 ] = tmp.y;\n\t\t\ttangents[ v * 4 + 2 ] = tmp.z;\n\t\t\ttangents[ v * 4 + 3 ] = w;\n\n\t\t}\n\n\t\tfor ( let i = 0, il = groups.length; i < il; ++ i ) {\n\n\t\t\tconst group = groups[ i ];\n\n\t\t\tconst start = group.start;\n\t\t\tconst count = group.count;\n\n\t\t\tfor ( let j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\thandleVertex( indices[ j + 0 ] );\n\t\t\t\thandleVertex( indices[ j + 1 ] );\n\t\t\t\thandleVertex( indices[ j + 2 ] );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcomputeVertexNormals() {\n\n\t\tconst index = this.index;\n\t\tconst positionAttribute = this.getAttribute( 'position' );\n\n\t\tif ( positionAttribute !== undefined ) {\n\n\t\t\tlet normalAttribute = this.getAttribute( 'normal' );\n\n\t\t\tif ( normalAttribute === undefined ) {\n\n\t\t\t\tnormalAttribute = new BufferAttribute( new Float32Array( positionAttribute.count * 3 ), 3 );\n\t\t\t\tthis.setAttribute( 'normal', normalAttribute );\n\n\t\t\t} else {\n\n\t\t\t\t// reset existing normals to zero\n\n\t\t\t\tfor ( let i = 0, il = normalAttribute.count; i < il; i ++ ) {\n\n\t\t\t\t\tnormalAttribute.setXYZ( i, 0, 0, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst pA = new Vector3(), pB = new Vector3(), pC = new Vector3();\n\t\t\tconst nA = new Vector3(), nB = new Vector3(), nC = new Vector3();\n\t\t\tconst cb = new Vector3(), ab = new Vector3();\n\n\t\t\t// indexed elements\n\n\t\t\tif ( index ) {\n\n\t\t\t\tfor ( let i = 0, il = index.count; i < il; i += 3 ) {\n\n\t\t\t\t\tconst vA = index.getX( i + 0 );\n\t\t\t\t\tconst vB = index.getX( i + 1 );\n\t\t\t\t\tconst vC = index.getX( i + 2 );\n\n\t\t\t\t\tpA.fromBufferAttribute( positionAttribute, vA );\n\t\t\t\t\tpB.fromBufferAttribute( positionAttribute, vB );\n\t\t\t\t\tpC.fromBufferAttribute( positionAttribute, vC );\n\n\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tnA.fromBufferAttribute( normalAttribute, vA );\n\t\t\t\t\tnB.fromBufferAttribute( normalAttribute, vB );\n\t\t\t\t\tnC.fromBufferAttribute( normalAttribute, vC );\n\n\t\t\t\t\tnA.add( cb );\n\t\t\t\t\tnB.add( cb );\n\t\t\t\t\tnC.add( cb );\n\n\t\t\t\t\tnormalAttribute.setXYZ( vA, nA.x, nA.y, nA.z );\n\t\t\t\t\tnormalAttribute.setXYZ( vB, nB.x, nB.y, nB.z );\n\t\t\t\t\tnormalAttribute.setXYZ( vC, nC.x, nC.y, nC.z );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed elements (unconnected triangle soup)\n\n\t\t\t\tfor ( let i = 0, il = positionAttribute.count; i < il; i += 3 ) {\n\n\t\t\t\t\tpA.fromBufferAttribute( positionAttribute, i + 0 );\n\t\t\t\t\tpB.fromBufferAttribute( positionAttribute, i + 1 );\n\t\t\t\t\tpC.fromBufferAttribute( positionAttribute, i + 2 );\n\n\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tnormalAttribute.setXYZ( i + 0, cb.x, cb.y, cb.z );\n\t\t\t\t\tnormalAttribute.setXYZ( i + 1, cb.x, cb.y, cb.z );\n\t\t\t\t\tnormalAttribute.setXYZ( i + 2, cb.x, cb.y, cb.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.normalizeNormals();\n\n\t\t\tnormalAttribute.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\tmerge( geometry, offset ) {\n\n\t\tif ( ! ( geometry && geometry.isBufferGeometry ) ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', geometry );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( offset === undefined ) {\n\n\t\t\toffset = 0;\n\n\t\t\tconsole.warn(\n\t\t\t\t'THREE.BufferGeometry.merge(): Overwriting original geometry, starting at offset=0. '\n\t\t\t\t+ 'Use BufferGeometryUtils.mergeBufferGeometries() for lossless merge.'\n\t\t\t);\n\n\t\t}\n\n\t\tconst attributes = this.attributes;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tif ( geometry.attributes[ key ] === undefined ) continue;\n\n\t\t\tconst attribute1 = attributes[ key ];\n\t\t\tconst attributeArray1 = attribute1.array;\n\n\t\t\tconst attribute2 = geometry.attributes[ key ];\n\t\t\tconst attributeArray2 = attribute2.array;\n\n\t\t\tconst attributeOffset = attribute2.itemSize * offset;\n\t\t\tconst length = Math.min( attributeArray2.length, attributeArray1.length - attributeOffset );\n\n\t\t\tfor ( let i = 0, j = attributeOffset; i < length; i ++, j ++ ) {\n\n\t\t\t\tattributeArray1[ j ] = attributeArray2[ i ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tnormalizeNormals() {\n\n\t\tconst normals = this.attributes.normal;\n\n\t\tfor ( let i = 0, il = normals.count; i < il; i ++ ) {\n\n\t\t\t_vector.fromBufferAttribute( normals, i );\n\n\t\t\t_vector.normalize();\n\n\t\t\tnormals.setXYZ( i, _vector.x, _vector.y, _vector.z );\n\n\t\t}\n\n\t}\n\n\ttoNonIndexed() {\n\n\t\tfunction convertBufferAttribute( attribute, indices ) {\n\n\t\t\tconst array = attribute.array;\n\t\t\tconst itemSize = attribute.itemSize;\n\t\t\tconst normalized = attribute.normalized;\n\n\t\t\tconst array2 = new array.constructor( indices.length * itemSize );\n\n\t\t\tlet index = 0, index2 = 0;\n\n\t\t\tfor ( let i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\tindex = indices[ i ] * attribute.data.stride + attribute.offset;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tindex = indices[ i ] * itemSize;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let j = 0; j < itemSize; j ++ ) {\n\n\t\t\t\t\tarray2[ index2 ++ ] = array[ index ++ ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new BufferAttribute( array2, itemSize, normalized );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.index === null ) {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry.toNonIndexed(): BufferGeometry is already non-indexed.' );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst geometry2 = new BufferGeometry();\n\n\t\tconst indices = this.index.array;\n\t\tconst attributes = this.attributes;\n\n\t\t// attributes\n\n\t\tfor ( const name in attributes ) {\n\n\t\t\tconst attribute = attributes[ name ];\n\n\t\t\tconst newAttribute = convertBufferAttribute( attribute, indices );\n\n\t\t\tgeometry2.setAttribute( name, newAttribute );\n\n\t\t}\n\n\t\t// morph attributes\n\n\t\tconst morphAttributes = this.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst morphArray = [];\n\t\t\tconst morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\tfor ( let i = 0, il = morphAttribute.length; i < il; i ++ ) {\n\n\t\t\t\tconst attribute = morphAttribute[ i ];\n\n\t\t\t\tconst newAttribute = convertBufferAttribute( attribute, indices );\n\n\t\t\t\tmorphArray.push( newAttribute );\n\n\t\t\t}\n\n\t\t\tgeometry2.morphAttributes[ name ] = morphArray;\n\n\t\t}\n\n\t\tgeometry2.morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t// groups\n\n\t\tconst groups = this.groups;\n\n\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tconst group = groups[ i ];\n\t\t\tgeometry2.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\treturn geometry2;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'BufferGeometry',\n\t\t\t\tgenerator: 'BufferGeometry.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard BufferGeometry serialization\n\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\t\tif ( this.name !== '' ) data.name = this.name;\n\t\tif ( Object.keys( this.userData ).length > 0 ) data.userData = this.userData;\n\n\t\tif ( this.parameters !== undefined ) {\n\n\t\t\tconst parameters = this.parameters;\n\n\t\t\tfor ( const key in parameters ) {\n\n\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\t// for simplicity the code assumes attributes are not shared across geometries, see #15811\n\n\t\tdata.data = { attributes: {} };\n\n\t\tconst index = this.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tdata.data.index = {\n\t\t\t\ttype: index.array.constructor.name,\n\t\t\t\tarray: Array.prototype.slice.call( index.array )\n\t\t\t};\n\n\t\t}\n\n\t\tconst attributes = this.attributes;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tconst attribute = attributes[ key ];\n\n\t\t\tdata.data.attributes[ key ] = attribute.toJSON( data.data );\n\n\t\t}\n\n\t\tconst morphAttributes = {};\n\t\tlet hasMorphAttributes = false;\n\n\t\tfor ( const key in this.morphAttributes ) {\n\n\t\t\tconst attributeArray = this.morphAttributes[ key ];\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0, il = attributeArray.length; i < il; i ++ ) {\n\n\t\t\t\tconst attribute = attributeArray[ i ];\n\n\t\t\t\tarray.push( attribute.toJSON( data.data ) );\n\n\t\t\t}\n\n\t\t\tif ( array.length > 0 ) {\n\n\t\t\t\tmorphAttributes[ key ] = array;\n\n\t\t\t\thasMorphAttributes = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( hasMorphAttributes ) {\n\n\t\t\tdata.data.morphAttributes = morphAttributes;\n\t\t\tdata.data.morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t}\n\n\t\tconst groups = this.groups;\n\n\t\tif ( groups.length > 0 ) {\n\n\t\t\tdata.data.groups = JSON.parse( JSON.stringify( groups ) );\n\n\t\t}\n\n\t\tconst boundingSphere = this.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tdata.data.boundingSphere = {\n\t\t\t\tcenter: boundingSphere.center.toArray(),\n\t\t\t\tradius: boundingSphere.radius\n\t\t\t};\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tclone() {\n\n\t\t return new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\n\n\t\t// reset\n\n\t\tthis.index = null;\n\t\tthis.attributes = {};\n\t\tthis.morphAttributes = {};\n\t\tthis.groups = [];\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// used for storing cloned, shared data\n\n\t\tconst data = {};\n\n\t\t// name\n\n\t\tthis.name = source.name;\n\n\t\t// index\n\n\t\tconst index = source.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tthis.setIndex( index.clone( data ) );\n\n\t\t}\n\n\t\t// attributes\n\n\t\tconst attributes = source.attributes;\n\n\t\tfor ( const name in attributes ) {\n\n\t\t\tconst attribute = attributes[ name ];\n\t\t\tthis.setAttribute( name, attribute.clone( data ) );\n\n\t\t}\n\n\t\t// morph attributes\n\n\t\tconst morphAttributes = source.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst array = [];\n\t\t\tconst morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\tfor ( let i = 0, l = morphAttribute.length; i < l; i ++ ) {\n\n\t\t\t\tarray.push( morphAttribute[ i ].clone( data ) );\n\n\t\t\t}\n\n\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t}\n\n\t\tthis.morphTargetsRelative = source.morphTargetsRelative;\n\n\t\t// groups\n\n\t\tconst groups = source.groups;\n\n\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tconst group = groups[ i ];\n\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\t// bounding box\n\n\t\tconst boundingBox = source.boundingBox;\n\n\t\tif ( boundingBox !== null ) {\n\n\t\t\tthis.boundingBox = boundingBox.clone();\n\n\t\t}\n\n\t\t// bounding sphere\n\n\t\tconst boundingSphere = source.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tthis.boundingSphere = boundingSphere.clone();\n\n\t\t}\n\n\t\t// draw range\n\n\t\tthis.drawRange.start = source.drawRange.start;\n\t\tthis.drawRange.count = source.drawRange.count;\n\n\t\t// user data\n\n\t\tthis.userData = source.userData;\n\n\t\t// geometry generator parameters\n\n\t\tif ( source.parameters !== undefined ) this.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n}\n\nBufferGeometry.prototype.isBufferGeometry = true;\n\nexport { BufferGeometry };\n","import { BufferGeometry } from '../core/BufferGeometry.js';\nimport { Float32BufferAttribute } from '../core/BufferAttribute.js';\nimport { Vector3 } from '../math/Vector3.js';\n\nclass BoxGeometry extends BufferGeometry {\n\n\tconstructor( width = 1, height = 1, depth = 1, widthSegments = 1, heightSegments = 1, depthSegments = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'BoxGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\tdepth: depth,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tdepthSegments: depthSegments\n\t\t};\n\n\t\tconst scope = this;\n\n\t\t// segments\n\n\t\twidthSegments = Math.floor( widthSegments );\n\t\theightSegments = Math.floor( heightSegments );\n\t\tdepthSegments = Math.floor( depthSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet numberOfVertices = 0;\n\t\tlet groupStart = 0;\n\n\t\t// build each side of the box geometry\n\n\t\tbuildPlane( 'z', 'y', 'x', - 1, - 1, depth, height, width, depthSegments, heightSegments, 0 ); // px\n\t\tbuildPlane( 'z', 'y', 'x', 1, - 1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx\n\t\tbuildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py\n\t\tbuildPlane( 'x', 'z', 'y', 1, - 1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny\n\t\tbuildPlane( 'x', 'y', 'z', 1, - 1, width, height, depth, widthSegments, heightSegments, 4 ); // pz\n\t\tbuildPlane( 'x', 'y', 'z', - 1, - 1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) {\n\n\t\t\tconst segmentWidth = width / gridX;\n\t\t\tconst segmentHeight = height / gridY;\n\n\t\t\tconst widthHalf = width / 2;\n\t\t\tconst heightHalf = height / 2;\n\t\t\tconst depthHalf = depth / 2;\n\n\t\t\tconst gridX1 = gridX + 1;\n\t\t\tconst gridY1 = gridY + 1;\n\n\t\t\tlet vertexCounter = 0;\n\t\t\tlet groupCount = 0;\n\n\t\t\tconst vector = new Vector3();\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( let iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\t\tconst y = iy * segmentHeight - heightHalf;\n\n\t\t\t\tfor ( let ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\t\tconst x = ix * segmentWidth - widthHalf;\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = x * udir;\n\t\t\t\t\tvector[ v ] = y * vdir;\n\t\t\t\t\tvector[ w ] = depthHalf;\n\n\t\t\t\t\t// now apply vector to vertex buffer\n\n\t\t\t\t\tvertices.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = 0;\n\t\t\t\t\tvector[ v ] = 0;\n\t\t\t\t\tvector[ w ] = depth > 0 ? 1 : - 1;\n\n\t\t\t\t\t// now apply vector to normal buffer\n\n\t\t\t\t\tnormals.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// uvs\n\n\t\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t\t\t// counters\n\n\t\t\t\t\tvertexCounter += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// indices\n\n\t\t\t// 1. you need three indices to draw a single face\n\t\t\t// 2. a single segment consists of two faces\n\t\t\t// 3. so we need to generate six (2*3) indices per segment\n\n\t\t\tfor ( let iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\t\tfor ( let ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\t\tconst a = numberOfVertices + ix + gridX1 * iy;\n\t\t\t\t\tconst b = numberOfVertices + ix + gridX1 * ( iy + 1 );\n\t\t\t\t\tconst c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\t\tconst d = numberOfVertices + ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t\t// increase counter\n\n\t\t\t\t\tgroupCount += 6;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, materialIndex );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t\t// update total number of vertices\n\n\t\t\tnumberOfVertices += vertexCounter;\n\n\t\t}\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new BoxGeometry( data.width, data.height, data.depth, data.widthSegments, data.heightSegments, data.depthSegments );\n\n\t}\n\n}\n\nexport { BoxGeometry, BoxGeometry as BoxBufferGeometry };\n","import { BufferGeometry } from '../core/BufferGeometry.js';\nimport { Float32BufferAttribute } from '../core/BufferAttribute.js';\n\nclass PlaneGeometry extends BufferGeometry {\n\n\tconstructor( width = 1, height = 1, widthSegments = 1, heightSegments = 1 ) {\n\n\t\tsuper();\n\t\tthis.type = 'PlaneGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments\n\t\t};\n\n\t\tconst width_half = width / 2;\n\t\tconst height_half = height / 2;\n\n\t\tconst gridX = Math.floor( widthSegments );\n\t\tconst gridY = Math.floor( heightSegments );\n\n\t\tconst gridX1 = gridX + 1;\n\t\tconst gridY1 = gridY + 1;\n\n\t\tconst segment_width = width / gridX;\n\t\tconst segment_height = height / gridY;\n\n\t\t//\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\tfor ( let iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\tconst y = iy * segment_height - height_half;\n\n\t\t\tfor ( let ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\tconst x = ix * segment_width - width_half;\n\n\t\t\t\tvertices.push( x, - y, 0 );\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\tfor ( let ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\tconst a = ix + gridX1 * iy;\n\t\t\t\tconst b = ix + gridX1 * ( iy + 1 );\n\t\t\t\tconst c = ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\tconst d = ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new PlaneGeometry( data.width, data.height, data.widthSegments, data.heightSegments );\n\n\t}\n\n}\n\nexport { PlaneGeometry, PlaneGeometry as PlaneBufferGeometry };\n","import { EventDispatcher } from '../core/EventDispatcher.js';\nimport { FrontSide, FlatShading, NormalBlending, LessEqualDepth, AddEquation, OneMinusSrcAlphaFactor, SrcAlphaFactor, AlwaysStencilFunc, KeepStencilOp } from '../constants.js';\nimport * as MathUtils from '../math/MathUtils.js';\n\nlet materialId = 0;\n\nclass Material extends EventDispatcher {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tObject.defineProperty( this, 'id', { value: materialId ++ } );\n\n\t\tthis.uuid = MathUtils.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Material';\n\n\t\tthis.fog = true;\n\n\t\tthis.blending = NormalBlending;\n\t\tthis.side = FrontSide;\n\t\tthis.vertexColors = false;\n\n\t\tthis.opacity = 1;\n\t\tthis.transparent = false;\n\n\t\tthis.blendSrc = SrcAlphaFactor;\n\t\tthis.blendDst = OneMinusSrcAlphaFactor;\n\t\tthis.blendEquation = AddEquation;\n\t\tthis.blendSrcAlpha = null;\n\t\tthis.blendDstAlpha = null;\n\t\tthis.blendEquationAlpha = null;\n\n\t\tthis.depthFunc = LessEqualDepth;\n\t\tthis.depthTest = true;\n\t\tthis.depthWrite = true;\n\n\t\tthis.stencilWriteMask = 0xff;\n\t\tthis.stencilFunc = AlwaysStencilFunc;\n\t\tthis.stencilRef = 0;\n\t\tthis.stencilFuncMask = 0xff;\n\t\tthis.stencilFail = KeepStencilOp;\n\t\tthis.stencilZFail = KeepStencilOp;\n\t\tthis.stencilZPass = KeepStencilOp;\n\t\tthis.stencilWrite = false;\n\n\t\tthis.clippingPlanes = null;\n\t\tthis.clipIntersection = false;\n\t\tthis.clipShadows = false;\n\n\t\tthis.shadowSide = null;\n\n\t\tthis.colorWrite = true;\n\n\t\tthis.precision = null; // override the renderer's default precision for this material\n\n\t\tthis.polygonOffset = false;\n\t\tthis.polygonOffsetFactor = 0;\n\t\tthis.polygonOffsetUnits = 0;\n\n\t\tthis.dithering = false;\n\n\t\tthis.alphaToCoverage = false;\n\t\tthis.premultipliedAlpha = false;\n\n\t\tthis.visible = true;\n\n\t\tthis.toneMapped = true;\n\n\t\tthis.userData = {};\n\n\t\tthis.version = 0;\n\n\t\tthis._alphaTest = 0;\n\n\t}\n\n\tget alphaTest() {\n\n\t\treturn this._alphaTest;\n\n\t}\n\n\tset alphaTest( value ) {\n\n\t\tif ( this._alphaTest > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._alphaTest = value;\n\n\t}\n\n\tonBuild( /* shaderobject, renderer */ ) {}\n\n\tonBeforeRender( /* renderer, scene, camera, geometry, object, group */ ) {}\n\n\tonBeforeCompile( /* shaderobject, renderer */ ) {}\n\n\tcustomProgramCacheKey() {\n\n\t\treturn this.onBeforeCompile.toString();\n\n\t}\n\n\tsetValues( values ) {\n\n\t\tif ( values === undefined ) return;\n\n\t\tfor ( const key in values ) {\n\n\t\t\tconst newValue = values[ key ];\n\n\t\t\tif ( newValue === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Material: \\'' + key + '\\' parameter is undefined.' );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\t// for backward compatability if shading is set in the constructor\n\t\t\tif ( key === 'shading' ) {\n\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' );\n\t\t\t\tthis.flatShading = ( newValue === FlatShading ) ? true : false;\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst currentValue = this[ key ];\n\n\t\t\tif ( currentValue === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': \\'' + key + '\\' is not a property of this material.' );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( currentValue && currentValue.isColor ) {\n\n\t\t\t\tcurrentValue.set( newValue );\n\n\t\t\t} else if ( ( currentValue && currentValue.isVector3 ) && ( newValue && newValue.isVector3 ) ) {\n\n\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t} else {\n\n\t\t\t\tthis[ key ] = newValue;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst isRoot = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( isRoot ) {\n\n\t\t\tmeta = {\n\t\t\t\ttextures: {},\n\t\t\t\timages: {}\n\t\t\t};\n\n\t\t}\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Material',\n\t\t\t\tgenerator: 'Material.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard Material serialization\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\n\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\tif ( this.color && this.color.isColor ) data.color = this.color.getHex();\n\n\t\tif ( this.roughness !== undefined ) data.roughness = this.roughness;\n\t\tif ( this.metalness !== undefined ) data.metalness = this.metalness;\n\n\t\tif ( this.sheen !== undefined ) data.sheen = this.sheen;\n\t\tif ( this.sheenColor && this.sheenColor.isColor ) data.sheenColor = this.sheenColor.getHex();\n\t\tif ( this.sheenRoughness !== undefined ) data.sheenRoughness = this.sheenRoughness;\n\t\tif ( this.emissive && this.emissive.isColor ) data.emissive = this.emissive.getHex();\n\t\tif ( this.emissiveIntensity && this.emissiveIntensity !== 1 ) data.emissiveIntensity = this.emissiveIntensity;\n\n\t\tif ( this.specular && this.specular.isColor ) data.specular = this.specular.getHex();\n\t\tif ( this.specularIntensity !== undefined ) data.specularIntensity = this.specularIntensity;\n\t\tif ( this.specularColor && this.specularColor.isColor ) data.specularColor = this.specularColor.getHex();\n\t\tif ( this.shininess !== undefined ) data.shininess = this.shininess;\n\t\tif ( this.clearcoat !== undefined ) data.clearcoat = this.clearcoat;\n\t\tif ( this.clearcoatRoughness !== undefined ) data.clearcoatRoughness = this.clearcoatRoughness;\n\n\t\tif ( this.clearcoatMap && this.clearcoatMap.isTexture ) {\n\n\t\t\tdata.clearcoatMap = this.clearcoatMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.clearcoatRoughnessMap && this.clearcoatRoughnessMap.isTexture ) {\n\n\t\t\tdata.clearcoatRoughnessMap = this.clearcoatRoughnessMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.clearcoatNormalMap && this.clearcoatNormalMap.isTexture ) {\n\n\t\t\tdata.clearcoatNormalMap = this.clearcoatNormalMap.toJSON( meta ).uuid;\n\t\t\tdata.clearcoatNormalScale = this.clearcoatNormalScale.toArray();\n\n\t\t}\n\n\t\tif ( this.map && this.map.isTexture ) data.map = this.map.toJSON( meta ).uuid;\n\t\tif ( this.matcap && this.matcap.isTexture ) data.matcap = this.matcap.toJSON( meta ).uuid;\n\t\tif ( this.alphaMap && this.alphaMap.isTexture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid;\n\n\t\tif ( this.lightMap && this.lightMap.isTexture ) {\n\n\t\t\tdata.lightMap = this.lightMap.toJSON( meta ).uuid;\n\t\t\tdata.lightMapIntensity = this.lightMapIntensity;\n\n\t\t}\n\n\t\tif ( this.aoMap && this.aoMap.isTexture ) {\n\n\t\t\tdata.aoMap = this.aoMap.toJSON( meta ).uuid;\n\t\t\tdata.aoMapIntensity = this.aoMapIntensity;\n\n\t\t}\n\n\t\tif ( this.bumpMap && this.bumpMap.isTexture ) {\n\n\t\t\tdata.bumpMap = this.bumpMap.toJSON( meta ).uuid;\n\t\t\tdata.bumpScale = this.bumpScale;\n\n\t\t}\n\n\t\tif ( this.normalMap && this.normalMap.isTexture ) {\n\n\t\t\tdata.normalMap = this.normalMap.toJSON( meta ).uuid;\n\t\t\tdata.normalMapType = this.normalMapType;\n\t\t\tdata.normalScale = this.normalScale.toArray();\n\n\t\t}\n\n\t\tif ( this.displacementMap && this.displacementMap.isTexture ) {\n\n\t\t\tdata.displacementMap = this.displacementMap.toJSON( meta ).uuid;\n\t\t\tdata.displacementScale = this.displacementScale;\n\t\t\tdata.displacementBias = this.displacementBias;\n\n\t\t}\n\n\t\tif ( this.roughnessMap && this.roughnessMap.isTexture ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid;\n\t\tif ( this.metalnessMap && this.metalnessMap.isTexture ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid;\n\n\t\tif ( this.emissiveMap && this.emissiveMap.isTexture ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid;\n\t\tif ( this.specularMap && this.specularMap.isTexture ) data.specularMap = this.specularMap.toJSON( meta ).uuid;\n\t\tif ( this.specularIntensityMap && this.specularIntensityMap.isTexture ) data.specularIntensityMap = this.specularIntensityMap.toJSON( meta ).uuid;\n\t\tif ( this.specularColorMap && this.specularColorMap.isTexture ) data.specularColorMap = this.specularColorMap.toJSON( meta ).uuid;\n\n\t\tif ( this.envMap && this.envMap.isTexture ) {\n\n\t\t\tdata.envMap = this.envMap.toJSON( meta ).uuid;\n\n\t\t\tif ( this.combine !== undefined ) data.combine = this.combine;\n\n\t\t}\n\n\t\tif ( this.envMapIntensity !== undefined ) data.envMapIntensity = this.envMapIntensity;\n\t\tif ( this.reflectivity !== undefined ) data.reflectivity = this.reflectivity;\n\t\tif ( this.refractionRatio !== undefined ) data.refractionRatio = this.refractionRatio;\n\n\t\tif ( this.gradientMap && this.gradientMap.isTexture ) {\n\n\t\t\tdata.gradientMap = this.gradientMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.transmission !== undefined ) data.transmission = this.transmission;\n\t\tif ( this.transmissionMap && this.transmissionMap.isTexture ) data.transmissionMap = this.transmissionMap.toJSON( meta ).uuid;\n\t\tif ( this.thickness !== undefined ) data.thickness = this.thickness;\n\t\tif ( this.thicknessMap && this.thicknessMap.isTexture ) data.thicknessMap = this.thicknessMap.toJSON( meta ).uuid;\n\t\tif ( this.attenuationDistance !== undefined ) data.attenuationDistance = this.attenuationDistance;\n\t\tif ( this.attenuationColor !== undefined ) data.attenuationColor = this.attenuationColor.getHex();\n\n\t\tif ( this.size !== undefined ) data.size = this.size;\n\t\tif ( this.shadowSide !== null ) data.shadowSide = this.shadowSide;\n\t\tif ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation;\n\n\t\tif ( this.blending !== NormalBlending ) data.blending = this.blending;\n\t\tif ( this.side !== FrontSide ) data.side = this.side;\n\t\tif ( this.vertexColors ) data.vertexColors = true;\n\n\t\tif ( this.opacity < 1 ) data.opacity = this.opacity;\n\t\tif ( this.transparent === true ) data.transparent = this.transparent;\n\n\t\tdata.depthFunc = this.depthFunc;\n\t\tdata.depthTest = this.depthTest;\n\t\tdata.depthWrite = this.depthWrite;\n\t\tdata.colorWrite = this.colorWrite;\n\n\t\tdata.stencilWrite = this.stencilWrite;\n\t\tdata.stencilWriteMask = this.stencilWriteMask;\n\t\tdata.stencilFunc = this.stencilFunc;\n\t\tdata.stencilRef = this.stencilRef;\n\t\tdata.stencilFuncMask = this.stencilFuncMask;\n\t\tdata.stencilFail = this.stencilFail;\n\t\tdata.stencilZFail = this.stencilZFail;\n\t\tdata.stencilZPass = this.stencilZPass;\n\n\t\t// rotation (SpriteMaterial)\n\t\tif ( this.rotation && this.rotation !== 0 ) data.rotation = this.rotation;\n\n\t\tif ( this.polygonOffset === true ) data.polygonOffset = true;\n\t\tif ( this.polygonOffsetFactor !== 0 ) data.polygonOffsetFactor = this.polygonOffsetFactor;\n\t\tif ( this.polygonOffsetUnits !== 0 ) data.polygonOffsetUnits = this.polygonOffsetUnits;\n\n\t\tif ( this.linewidth && this.linewidth !== 1 ) data.linewidth = this.linewidth;\n\t\tif ( this.dashSize !== undefined ) data.dashSize = this.dashSize;\n\t\tif ( this.gapSize !== undefined ) data.gapSize = this.gapSize;\n\t\tif ( this.scale !== undefined ) data.scale = this.scale;\n\n\t\tif ( this.dithering === true ) data.dithering = true;\n\n\t\tif ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest;\n\t\tif ( this.alphaToCoverage === true ) data.alphaToCoverage = this.alphaToCoverage;\n\t\tif ( this.premultipliedAlpha === true ) data.premultipliedAlpha = this.premultipliedAlpha;\n\n\t\tif ( this.wireframe === true ) data.wireframe = this.wireframe;\n\t\tif ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth;\n\t\tif ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap;\n\t\tif ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin;\n\n\t\tif ( this.flatShading === true ) data.flatShading = this.flatShading;\n\n\t\tif ( this.visible === false ) data.visible = false;\n\n\t\tif ( this.toneMapped === false ) data.toneMapped = false;\n\n\t\tif ( JSON.stringify( this.userData ) !== '{}' ) data.userData = this.userData;\n\n\t\t// TODO: Copied from Object3D.toJSON\n\n\t\tfunction extractFromCache( cache ) {\n\n\t\t\tconst values = [];\n\n\t\t\tfor ( const key in cache ) {\n\n\t\t\t\tconst data = cache[ key ];\n\t\t\t\tdelete data.metadata;\n\t\t\t\tvalues.push( data );\n\n\t\t\t}\n\n\t\t\treturn values;\n\n\t\t}\n\n\t\tif ( isRoot ) {\n\n\t\t\tconst textures = extractFromCache( meta.textures );\n\t\t\tconst images = extractFromCache( meta.images );\n\n\t\t\tif ( textures.length > 0 ) data.textures = textures;\n\t\t\tif ( images.length > 0 ) data.images = images;\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.fog = source.fog;\n\n\t\tthis.blending = source.blending;\n\t\tthis.side = source.side;\n\t\tthis.vertexColors = source.vertexColors;\n\n\t\tthis.opacity = source.opacity;\n\t\tthis.transparent = source.transparent;\n\n\t\tthis.blendSrc = source.blendSrc;\n\t\tthis.blendDst = source.blendDst;\n\t\tthis.blendEquation = source.blendEquation;\n\t\tthis.blendSrcAlpha = source.blendSrcAlpha;\n\t\tthis.blendDstAlpha = source.blendDstAlpha;\n\t\tthis.blendEquationAlpha = source.blendEquationAlpha;\n\n\t\tthis.depthFunc = source.depthFunc;\n\t\tthis.depthTest = source.depthTest;\n\t\tthis.depthWrite = source.depthWrite;\n\n\t\tthis.stencilWriteMask = source.stencilWriteMask;\n\t\tthis.stencilFunc = source.stencilFunc;\n\t\tthis.stencilRef = source.stencilRef;\n\t\tthis.stencilFuncMask = source.stencilFuncMask;\n\t\tthis.stencilFail = source.stencilFail;\n\t\tthis.stencilZFail = source.stencilZFail;\n\t\tthis.stencilZPass = source.stencilZPass;\n\t\tthis.stencilWrite = source.stencilWrite;\n\n\t\tconst srcPlanes = source.clippingPlanes;\n\t\tlet dstPlanes = null;\n\n\t\tif ( srcPlanes !== null ) {\n\n\t\t\tconst n = srcPlanes.length;\n\t\t\tdstPlanes = new Array( n );\n\n\t\t\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\t\t\tdstPlanes[ i ] = srcPlanes[ i ].clone();\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.clippingPlanes = dstPlanes;\n\t\tthis.clipIntersection = source.clipIntersection;\n\t\tthis.clipShadows = source.clipShadows;\n\n\t\tthis.shadowSide = source.shadowSide;\n\n\t\tthis.colorWrite = source.colorWrite;\n\n\t\tthis.precision = source.precision;\n\n\t\tthis.polygonOffset = source.polygonOffset;\n\t\tthis.polygonOffsetFactor = source.polygonOffsetFactor;\n\t\tthis.polygonOffsetUnits = source.polygonOffsetUnits;\n\n\t\tthis.dithering = source.dithering;\n\n\t\tthis.alphaTest = source.alphaTest;\n\t\tthis.alphaToCoverage = source.alphaToCoverage;\n\t\tthis.premultipliedAlpha = source.premultipliedAlpha;\n\n\t\tthis.visible = source.visible;\n\n\t\tthis.toneMapped = source.toneMapped;\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n}\n\nMaterial.prototype.isMaterial = true;\n\nexport { Material };\n","/**\n * Uniform Utilities\n */\n\nexport function cloneUniforms( src ) {\n\n\tconst dst = {};\n\n\tfor ( const u in src ) {\n\n\t\tdst[ u ] = {};\n\n\t\tfor ( const p in src[ u ] ) {\n\n\t\t\tconst property = src[ u ][ p ];\n\n\t\t\tif ( property && ( property.isColor ||\n\t\t\t\tproperty.isMatrix3 || property.isMatrix4 ||\n\t\t\t\tproperty.isVector2 || property.isVector3 || property.isVector4 ||\n\t\t\t\tproperty.isTexture || property.isQuaternion ) ) {\n\n\t\t\t\tdst[ u ][ p ] = property.clone();\n\n\t\t\t} else if ( Array.isArray( property ) ) {\n\n\t\t\t\tdst[ u ][ p ] = property.slice();\n\n\t\t\t} else {\n\n\t\t\t\tdst[ u ][ p ] = property;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn dst;\n\n}\n\nexport function mergeUniforms( uniforms ) {\n\n\tconst merged = {};\n\n\tfor ( let u = 0; u < uniforms.length; u ++ ) {\n\n\t\tconst tmp = cloneUniforms( uniforms[ u ] );\n\n\t\tfor ( const p in tmp ) {\n\n\t\t\tmerged[ p ] = tmp[ p ];\n\n\t\t}\n\n\t}\n\n\treturn merged;\n\n}\n\n// Legacy\n\nconst UniformsUtils = { clone: cloneUniforms, merge: mergeUniforms };\n\nexport { UniformsUtils };\n","import { Material } from './Material.js';\nimport { cloneUniforms } from '../renderers/shaders/UniformsUtils.js';\n\nimport default_vertex from '../renderers/shaders/ShaderChunk/default_vertex.glsl.js';\nimport default_fragment from '../renderers/shaders/ShaderChunk/default_fragment.glsl.js';\n\n/**\n * parameters = {\n *  defines: { \"label\" : \"value\" },\n *  uniforms: { \"parameter1\": { value: 1.0 }, \"parameter2\": { value2: 2 } },\n *\n *  fragmentShader: <string>,\n *  vertexShader: <string>,\n *\n *  wireframe: <boolean>,\n *  wireframeLinewidth: <float>,\n *\n *  lights: <bool>\n * }\n */\n\nclass ShaderMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ShaderMaterial';\n\n\t\tthis.defines = {};\n\t\tthis.uniforms = {};\n\n\t\tthis.vertexShader = default_vertex;\n\t\tthis.fragmentShader = default_fragment;\n\n\t\tthis.linewidth = 1;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.fog = false; // set to use scene fog\n\t\tthis.lights = false; // set to use scene lights\n\t\tthis.clipping = false; // set to use user-defined clipping planes\n\n\t\tthis.extensions = {\n\t\t\tderivatives: false, // set to use derivatives\n\t\t\tfragDepth: false, // set to use fragment depth values\n\t\t\tdrawBuffers: false, // set to use draw buffers\n\t\t\tshaderTextureLOD: false // set to use shader texture LOD\n\t\t};\n\n\t\t// When rendered geometry doesn't include these attributes but the material does,\n\t\t// use these default values in WebGL. This avoids errors when buffer data is missing.\n\t\tthis.defaultAttributeValues = {\n\t\t\t'color': [ 1, 1, 1 ],\n\t\t\t'uv': [ 0, 0 ],\n\t\t\t'uv2': [ 0, 0 ]\n\t\t};\n\n\t\tthis.index0AttributeName = undefined;\n\t\tthis.uniformsNeedUpdate = false;\n\n\t\tthis.glslVersion = null;\n\n\t\tif ( parameters !== undefined ) {\n\n\t\t\tif ( parameters.attributes !== undefined ) {\n\n\t\t\t\tconsole.error( 'THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.' );\n\n\t\t\t}\n\n\t\t\tthis.setValues( parameters );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.fragmentShader = source.fragmentShader;\n\t\tthis.vertexShader = source.vertexShader;\n\n\t\tthis.uniforms = cloneUniforms( source.uniforms );\n\n\t\tthis.defines = Object.assign( {}, source.defines );\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.lights = source.lights;\n\t\tthis.clipping = source.clipping;\n\n\t\tthis.extensions = Object.assign( {}, source.extensions );\n\n\t\tthis.glslVersion = source.glslVersion;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.glslVersion = this.glslVersion;\n\t\tdata.uniforms = {};\n\n\t\tfor ( const name in this.uniforms ) {\n\n\t\t\tconst uniform = this.uniforms[ name ];\n\t\t\tconst value = uniform.value;\n\n\t\t\tif ( value && value.isTexture ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 't',\n\t\t\t\t\tvalue: value.toJSON( meta ).uuid\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isColor ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'c',\n\t\t\t\t\tvalue: value.getHex()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector2 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v2',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector3 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v3',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector4 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v4',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isMatrix3 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'm3',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isMatrix4 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'm4',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\tvalue: value\n\t\t\t\t};\n\n\t\t\t\t// note: the array variants v2v, v3v, v4v, m4v and tv are not supported so far\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( Object.keys( this.defines ).length > 0 ) data.defines = this.defines;\n\n\t\tdata.vertexShader = this.vertexShader;\n\t\tdata.fragmentShader = this.fragmentShader;\n\n\t\tconst extensions = {};\n\n\t\tfor ( const key in this.extensions ) {\n\n\t\t\tif ( this.extensions[ key ] === true ) extensions[ key ] = true;\n\n\t\t}\n\n\t\tif ( Object.keys( extensions ).length > 0 ) data.extensions = extensions;\n\n\t\treturn data;\n\n\t}\n\n}\n\nShaderMaterial.prototype.isShaderMaterial = true;\n\nexport { ShaderMaterial };\n","export default /* glsl */`\nvoid main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}\n`;\n","export default /* glsl */`\nvoid main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}\n`;\n","import { Vector3 } from './Vector3.js';\n\nconst _vector = /*@__PURE__*/ new Vector3();\nconst _segCenter = /*@__PURE__*/ new Vector3();\nconst _segDir = /*@__PURE__*/ new Vector3();\nconst _diff = /*@__PURE__*/ new Vector3();\n\nconst _edge1 = /*@__PURE__*/ new Vector3();\nconst _edge2 = /*@__PURE__*/ new Vector3();\nconst _normal = /*@__PURE__*/ new Vector3();\n\nclass Ray {\n\n\tconstructor( origin = new Vector3(), direction = new Vector3( 0, 0, - 1 ) ) {\n\n\t\tthis.origin = origin;\n\t\tthis.direction = direction;\n\n\t}\n\n\tset( origin, direction ) {\n\n\t\tthis.origin.copy( origin );\n\t\tthis.direction.copy( direction );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( ray ) {\n\n\t\tthis.origin.copy( ray.origin );\n\t\tthis.direction.copy( ray.direction );\n\n\t\treturn this;\n\n\t}\n\n\tat( t, target ) {\n\n\t\treturn target.copy( this.direction ).multiplyScalar( t ).add( this.origin );\n\n\t}\n\n\tlookAt( v ) {\n\n\t\tthis.direction.copy( v ).sub( this.origin ).normalize();\n\n\t\treturn this;\n\n\t}\n\n\trecast( t ) {\n\n\t\tthis.origin.copy( this.at( t, _vector ) );\n\n\t\treturn this;\n\n\t}\n\n\tclosestPointToPoint( point, target ) {\n\n\t\ttarget.subVectors( point, this.origin );\n\n\t\tconst directionDistance = target.dot( this.direction );\n\n\t\tif ( directionDistance < 0 ) {\n\n\t\t\treturn target.copy( this.origin );\n\n\t\t}\n\n\t\treturn target.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\treturn Math.sqrt( this.distanceSqToPoint( point ) );\n\n\t}\n\n\tdistanceSqToPoint( point ) {\n\n\t\tconst directionDistance = _vector.subVectors( point, this.origin ).dot( this.direction );\n\n\t\t// point behind the ray\n\n\t\tif ( directionDistance < 0 ) {\n\n\t\t\treturn this.origin.distanceToSquared( point );\n\n\t\t}\n\n\t\t_vector.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t\treturn _vector.distanceToSquared( point );\n\n\t}\n\n\tdistanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) {\n\n\t\t// from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteDistRaySegment.h\n\t\t// It returns the min distance between the ray and the segment\n\t\t// defined by v0 and v1\n\t\t// It can also set two optional targets :\n\t\t// - The closest point on the ray\n\t\t// - The closest point on the segment\n\n\t\t_segCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 );\n\t\t_segDir.copy( v1 ).sub( v0 ).normalize();\n\t\t_diff.copy( this.origin ).sub( _segCenter );\n\n\t\tconst segExtent = v0.distanceTo( v1 ) * 0.5;\n\t\tconst a01 = - this.direction.dot( _segDir );\n\t\tconst b0 = _diff.dot( this.direction );\n\t\tconst b1 = - _diff.dot( _segDir );\n\t\tconst c = _diff.lengthSq();\n\t\tconst det = Math.abs( 1 - a01 * a01 );\n\t\tlet s0, s1, sqrDist, extDet;\n\n\t\tif ( det > 0 ) {\n\n\t\t\t// The ray and segment are not parallel.\n\n\t\t\ts0 = a01 * b1 - b0;\n\t\t\ts1 = a01 * b0 - b1;\n\t\t\textDet = segExtent * det;\n\n\t\t\tif ( s0 >= 0 ) {\n\n\t\t\t\tif ( s1 >= - extDet ) {\n\n\t\t\t\t\tif ( s1 <= extDet ) {\n\n\t\t\t\t\t\t// region 0\n\t\t\t\t\t\t// Minimum at interior points of ray and segment.\n\n\t\t\t\t\t\tconst invDet = 1 / det;\n\t\t\t\t\t\ts0 *= invDet;\n\t\t\t\t\t\ts1 *= invDet;\n\t\t\t\t\t\tsqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// region 1\n\n\t\t\t\t\t\ts1 = segExtent;\n\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// region 5\n\n\t\t\t\t\ts1 = - segExtent;\n\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( s1 <= - extDet ) {\n\n\t\t\t\t\t// region 4\n\n\t\t\t\t\ts0 = Math.max( 0, - ( - a01 * segExtent + b0 ) );\n\t\t\t\t\ts1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t} else if ( s1 <= extDet ) {\n\n\t\t\t\t\t// region 3\n\n\t\t\t\t\ts0 = 0;\n\t\t\t\t\ts1 = Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// region 2\n\n\t\t\t\t\ts0 = Math.max( 0, - ( a01 * segExtent + b0 ) );\n\t\t\t\t\ts1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// Ray and segment are parallel.\n\n\t\t\ts1 = ( a01 > 0 ) ? - segExtent : segExtent;\n\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t}\n\n\t\tif ( optionalPointOnRay ) {\n\n\t\t\toptionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin );\n\n\t\t}\n\n\t\tif ( optionalPointOnSegment ) {\n\n\t\t\toptionalPointOnSegment.copy( _segDir ).multiplyScalar( s1 ).add( _segCenter );\n\n\t\t}\n\n\t\treturn sqrDist;\n\n\t}\n\n\tintersectSphere( sphere, target ) {\n\n\t\t_vector.subVectors( sphere.center, this.origin );\n\t\tconst tca = _vector.dot( this.direction );\n\t\tconst d2 = _vector.dot( _vector ) - tca * tca;\n\t\tconst radius2 = sphere.radius * sphere.radius;\n\n\t\tif ( d2 > radius2 ) return null;\n\n\t\tconst thc = Math.sqrt( radius2 - d2 );\n\n\t\t// t0 = first intersect point - entrance on front of sphere\n\t\tconst t0 = tca - thc;\n\n\t\t// t1 = second intersect point - exit point on back of sphere\n\t\tconst t1 = tca + thc;\n\n\t\t// test to see if both t0 and t1 are behind the ray - if so, return null\n\t\tif ( t0 < 0 && t1 < 0 ) return null;\n\n\t\t// test to see if t0 is behind the ray:\n\t\t// if it is, the ray is inside the sphere, so return the second exit point scaled by t1,\n\t\t// in order to always return an intersect point that is in front of the ray.\n\t\tif ( t0 < 0 ) return this.at( t1, target );\n\n\t\t// else t0 is in front of the ray, so return the first collision point scaled by t0\n\t\treturn this.at( t0, target );\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\treturn this.distanceSqToPoint( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t}\n\n\tdistanceToPlane( plane ) {\n\n\t\tconst denominator = plane.normal.dot( this.direction );\n\n\t\tif ( denominator === 0 ) {\n\n\t\t\t// line is coplanar, return origin\n\t\t\tif ( plane.distanceToPoint( this.origin ) === 0 ) {\n\n\t\t\t\treturn 0;\n\n\t\t\t}\n\n\t\t\t// Null is preferable to undefined since undefined means.... it is undefined\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator;\n\n\t\t// Return if the ray never intersects the plane\n\n\t\treturn t >= 0 ? t : null;\n\n\t}\n\n\tintersectPlane( plane, target ) {\n\n\t\tconst t = this.distanceToPlane( plane );\n\n\t\tif ( t === null ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\treturn this.at( t, target );\n\n\t}\n\n\tintersectsPlane( plane ) {\n\n\t\t// check if the ray lies on the plane first\n\n\t\tconst distToPoint = plane.distanceToPoint( this.origin );\n\n\t\tif ( distToPoint === 0 ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tconst denominator = plane.normal.dot( this.direction );\n\n\t\tif ( denominator * distToPoint < 0 ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\t// ray origin is behind the plane (and is pointing behind it)\n\n\t\treturn false;\n\n\t}\n\n\tintersectBox( box, target ) {\n\n\t\tlet tmin, tmax, tymin, tymax, tzmin, tzmax;\n\n\t\tconst invdirx = 1 / this.direction.x,\n\t\t\tinvdiry = 1 / this.direction.y,\n\t\t\tinvdirz = 1 / this.direction.z;\n\n\t\tconst origin = this.origin;\n\n\t\tif ( invdirx >= 0 ) {\n\n\t\t\ttmin = ( box.min.x - origin.x ) * invdirx;\n\t\t\ttmax = ( box.max.x - origin.x ) * invdirx;\n\n\t\t} else {\n\n\t\t\ttmin = ( box.max.x - origin.x ) * invdirx;\n\t\t\ttmax = ( box.min.x - origin.x ) * invdirx;\n\n\t\t}\n\n\t\tif ( invdiry >= 0 ) {\n\n\t\t\ttymin = ( box.min.y - origin.y ) * invdiry;\n\t\t\ttymax = ( box.max.y - origin.y ) * invdiry;\n\n\t\t} else {\n\n\t\t\ttymin = ( box.max.y - origin.y ) * invdiry;\n\t\t\ttymax = ( box.min.y - origin.y ) * invdiry;\n\n\t\t}\n\n\t\tif ( ( tmin > tymax ) || ( tymin > tmax ) ) return null;\n\n\t\t// These lines also handle the case where tmin or tmax is NaN\n\t\t// (result of 0 * Infinity). x !== x returns true if x is NaN\n\n\t\tif ( tymin > tmin || tmin !== tmin ) tmin = tymin;\n\n\t\tif ( tymax < tmax || tmax !== tmax ) tmax = tymax;\n\n\t\tif ( invdirz >= 0 ) {\n\n\t\t\ttzmin = ( box.min.z - origin.z ) * invdirz;\n\t\t\ttzmax = ( box.max.z - origin.z ) * invdirz;\n\n\t\t} else {\n\n\t\t\ttzmin = ( box.max.z - origin.z ) * invdirz;\n\t\t\ttzmax = ( box.min.z - origin.z ) * invdirz;\n\n\t\t}\n\n\t\tif ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null;\n\n\t\tif ( tzmin > tmin || tmin !== tmin ) tmin = tzmin;\n\n\t\tif ( tzmax < tmax || tmax !== tmax ) tmax = tzmax;\n\n\t\t//return point closest to the ray (positive side)\n\n\t\tif ( tmax < 0 ) return null;\n\n\t\treturn this.at( tmin >= 0 ? tmin : tmax, target );\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\treturn this.intersectBox( box, _vector ) !== null;\n\n\t}\n\n\tintersectTriangle( a, b, c, backfaceCulling, target ) {\n\n\t\t// Compute the offset origin, edges, and normal.\n\n\t\t// from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h\n\n\t\t_edge1.subVectors( b, a );\n\t\t_edge2.subVectors( c, a );\n\t\t_normal.crossVectors( _edge1, _edge2 );\n\n\t\t// Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,\n\t\t// E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by\n\t\t//   |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))\n\t\t//   |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))\n\t\t//   |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)\n\t\tlet DdN = this.direction.dot( _normal );\n\t\tlet sign;\n\n\t\tif ( DdN > 0 ) {\n\n\t\t\tif ( backfaceCulling ) return null;\n\t\t\tsign = 1;\n\n\t\t} else if ( DdN < 0 ) {\n\n\t\t\tsign = - 1;\n\t\t\tDdN = - DdN;\n\n\t\t} else {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t_diff.subVectors( this.origin, a );\n\t\tconst DdQxE2 = sign * this.direction.dot( _edge2.crossVectors( _diff, _edge2 ) );\n\n\t\t// b1 < 0, no intersection\n\t\tif ( DdQxE2 < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst DdE1xQ = sign * this.direction.dot( _edge1.cross( _diff ) );\n\n\t\t// b2 < 0, no intersection\n\t\tif ( DdE1xQ < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// b1+b2 > 1, no intersection\n\t\tif ( DdQxE2 + DdE1xQ > DdN ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// Line intersects triangle, check if ray does.\n\t\tconst QdN = - sign * _diff.dot( _normal );\n\n\t\t// t < 0, no intersection\n\t\tif ( QdN < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// Ray intersects triangle.\n\t\treturn this.at( QdN / DdN, target );\n\n\t}\n\n\tapplyMatrix4( matrix4 ) {\n\n\t\tthis.origin.applyMatrix4( matrix4 );\n\t\tthis.direction.transformDirection( matrix4 );\n\n\t\treturn this;\n\n\t}\n\n\tequals( ray ) {\n\n\t\treturn ray.origin.equals( this.origin ) && ray.direction.equals( this.direction );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nexport { Ray };\n","import { Vector3 } from './Vector3.js';\n\nconst _v0 = /*@__PURE__*/ new Vector3();\nconst _v1 = /*@__PURE__*/ new Vector3();\nconst _v2 = /*@__PURE__*/ new Vector3();\nconst _v3 = /*@__PURE__*/ new Vector3();\n\nconst _vab = /*@__PURE__*/ new Vector3();\nconst _vac = /*@__PURE__*/ new Vector3();\nconst _vbc = /*@__PURE__*/ new Vector3();\nconst _vap = /*@__PURE__*/ new Vector3();\nconst _vbp = /*@__PURE__*/ new Vector3();\nconst _vcp = /*@__PURE__*/ new Vector3();\n\nclass Triangle {\n\n\tconstructor( a = new Vector3(), b = new Vector3(), c = new Vector3() ) {\n\n\t\tthis.a = a;\n\t\tthis.b = b;\n\t\tthis.c = c;\n\n\t}\n\n\tstatic getNormal( a, b, c, target ) {\n\n\t\ttarget.subVectors( c, b );\n\t\t_v0.subVectors( a, b );\n\t\ttarget.cross( _v0 );\n\n\t\tconst targetLengthSq = target.lengthSq();\n\t\tif ( targetLengthSq > 0 ) {\n\n\t\t\treturn target.multiplyScalar( 1 / Math.sqrt( targetLengthSq ) );\n\n\t\t}\n\n\t\treturn target.set( 0, 0, 0 );\n\n\t}\n\n\t// static/instance method to calculate barycentric coordinates\n\t// based on: http://www.blackpawn.com/texts/pointinpoly/default.html\n\tstatic getBarycoord( point, a, b, c, target ) {\n\n\t\t_v0.subVectors( c, a );\n\t\t_v1.subVectors( b, a );\n\t\t_v2.subVectors( point, a );\n\n\t\tconst dot00 = _v0.dot( _v0 );\n\t\tconst dot01 = _v0.dot( _v1 );\n\t\tconst dot02 = _v0.dot( _v2 );\n\t\tconst dot11 = _v1.dot( _v1 );\n\t\tconst dot12 = _v1.dot( _v2 );\n\n\t\tconst denom = ( dot00 * dot11 - dot01 * dot01 );\n\n\t\t// collinear or singular triangle\n\t\tif ( denom === 0 ) {\n\n\t\t\t// arbitrary location outside of triangle?\n\t\t\t// not sure if this is the best idea, maybe should be returning undefined\n\t\t\treturn target.set( - 2, - 1, - 1 );\n\n\t\t}\n\n\t\tconst invDenom = 1 / denom;\n\t\tconst u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;\n\t\tconst v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;\n\n\t\t// barycentric coordinates must always sum to 1\n\t\treturn target.set( 1 - u - v, v, u );\n\n\t}\n\n\tstatic containsPoint( point, a, b, c ) {\n\n\t\tthis.getBarycoord( point, a, b, c, _v3 );\n\n\t\treturn ( _v3.x >= 0 ) && ( _v3.y >= 0 ) && ( ( _v3.x + _v3.y ) <= 1 );\n\n\t}\n\n\tstatic getUV( point, p1, p2, p3, uv1, uv2, uv3, target ) {\n\n\t\tthis.getBarycoord( point, p1, p2, p3, _v3 );\n\n\t\ttarget.set( 0, 0 );\n\t\ttarget.addScaledVector( uv1, _v3.x );\n\t\ttarget.addScaledVector( uv2, _v3.y );\n\t\ttarget.addScaledVector( uv3, _v3.z );\n\n\t\treturn target;\n\n\t}\n\n\tstatic isFrontFacing( a, b, c, direction ) {\n\n\t\t_v0.subVectors( c, b );\n\t\t_v1.subVectors( a, b );\n\n\t\t// strictly front facing\n\t\treturn ( _v0.cross( _v1 ).dot( direction ) < 0 ) ? true : false;\n\n\t}\n\n\tset( a, b, c ) {\n\n\t\tthis.a.copy( a );\n\t\tthis.b.copy( b );\n\t\tthis.c.copy( c );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPointsAndIndices( points, i0, i1, i2 ) {\n\n\t\tthis.a.copy( points[ i0 ] );\n\t\tthis.b.copy( points[ i1 ] );\n\t\tthis.c.copy( points[ i2 ] );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromAttributeAndIndices( attribute, i0, i1, i2 ) {\n\n\t\tthis.a.fromBufferAttribute( attribute, i0 );\n\t\tthis.b.fromBufferAttribute( attribute, i1 );\n\t\tthis.c.fromBufferAttribute( attribute, i2 );\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( triangle ) {\n\n\t\tthis.a.copy( triangle.a );\n\t\tthis.b.copy( triangle.b );\n\t\tthis.c.copy( triangle.c );\n\n\t\treturn this;\n\n\t}\n\n\tgetArea() {\n\n\t\t_v0.subVectors( this.c, this.b );\n\t\t_v1.subVectors( this.a, this.b );\n\n\t\treturn _v0.cross( _v1 ).length() * 0.5;\n\n\t}\n\n\tgetMidpoint( target ) {\n\n\t\treturn target.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 );\n\n\t}\n\n\tgetNormal( target ) {\n\n\t\treturn Triangle.getNormal( this.a, this.b, this.c, target );\n\n\t}\n\n\tgetPlane( target ) {\n\n\t\treturn target.setFromCoplanarPoints( this.a, this.b, this.c );\n\n\t}\n\n\tgetBarycoord( point, target ) {\n\n\t\treturn Triangle.getBarycoord( point, this.a, this.b, this.c, target );\n\n\t}\n\n\tgetUV( point, uv1, uv2, uv3, target ) {\n\n\t\treturn Triangle.getUV( point, this.a, this.b, this.c, uv1, uv2, uv3, target );\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\treturn Triangle.containsPoint( point, this.a, this.b, this.c );\n\n\t}\n\n\tisFrontFacing( direction ) {\n\n\t\treturn Triangle.isFrontFacing( this.a, this.b, this.c, direction );\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsTriangle( this );\n\n\t}\n\n\tclosestPointToPoint( p, target ) {\n\n\t\tconst a = this.a, b = this.b, c = this.c;\n\t\tlet v, w;\n\n\t\t// algorithm thanks to Real-Time Collision Detection by Christer Ericson,\n\t\t// published by Morgan Kaufmann Publishers, (c) 2005 Elsevier Inc.,\n\t\t// under the accompanying license; see chapter 5.1.5 for detailed explanation.\n\t\t// basically, we're distinguishing which of the voronoi regions of the triangle\n\t\t// the point lies in with the minimum amount of redundant computation.\n\n\t\t_vab.subVectors( b, a );\n\t\t_vac.subVectors( c, a );\n\t\t_vap.subVectors( p, a );\n\t\tconst d1 = _vab.dot( _vap );\n\t\tconst d2 = _vac.dot( _vap );\n\t\tif ( d1 <= 0 && d2 <= 0 ) {\n\n\t\t\t// vertex region of A; barycentric coords (1, 0, 0)\n\t\t\treturn target.copy( a );\n\n\t\t}\n\n\t\t_vbp.subVectors( p, b );\n\t\tconst d3 = _vab.dot( _vbp );\n\t\tconst d4 = _vac.dot( _vbp );\n\t\tif ( d3 >= 0 && d4 <= d3 ) {\n\n\t\t\t// vertex region of B; barycentric coords (0, 1, 0)\n\t\t\treturn target.copy( b );\n\n\t\t}\n\n\t\tconst vc = d1 * d4 - d3 * d2;\n\t\tif ( vc <= 0 && d1 >= 0 && d3 <= 0 ) {\n\n\t\t\tv = d1 / ( d1 - d3 );\n\t\t\t// edge region of AB; barycentric coords (1-v, v, 0)\n\t\t\treturn target.copy( a ).addScaledVector( _vab, v );\n\n\t\t}\n\n\t\t_vcp.subVectors( p, c );\n\t\tconst d5 = _vab.dot( _vcp );\n\t\tconst d6 = _vac.dot( _vcp );\n\t\tif ( d6 >= 0 && d5 <= d6 ) {\n\n\t\t\t// vertex region of C; barycentric coords (0, 0, 1)\n\t\t\treturn target.copy( c );\n\n\t\t}\n\n\t\tconst vb = d5 * d2 - d1 * d6;\n\t\tif ( vb <= 0 && d2 >= 0 && d6 <= 0 ) {\n\n\t\t\tw = d2 / ( d2 - d6 );\n\t\t\t// edge region of AC; barycentric coords (1-w, 0, w)\n\t\t\treturn target.copy( a ).addScaledVector( _vac, w );\n\n\t\t}\n\n\t\tconst va = d3 * d6 - d5 * d4;\n\t\tif ( va <= 0 && ( d4 - d3 ) >= 0 && ( d5 - d6 ) >= 0 ) {\n\n\t\t\t_vbc.subVectors( c, b );\n\t\t\tw = ( d4 - d3 ) / ( ( d4 - d3 ) + ( d5 - d6 ) );\n\t\t\t// edge region of BC; barycentric coords (0, 1-w, w)\n\t\t\treturn target.copy( b ).addScaledVector( _vbc, w ); // edge region of BC\n\n\t\t}\n\n\t\t// face region\n\t\tconst denom = 1 / ( va + vb + vc );\n\t\t// u = va * denom\n\t\tv = vb * denom;\n\t\tw = vc * denom;\n\n\t\treturn target.copy( a ).addScaledVector( _vab, v ).addScaledVector( _vac, w );\n\n\t}\n\n\tequals( triangle ) {\n\n\t\treturn triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c );\n\n\t}\n\n}\n\nexport { Triangle };\n","import { Material } from './Material.js';\nimport { MultiplyOperation } from '../constants.js';\nimport { Color } from '../math/Color.js';\n\n/**\n * parameters = {\n *  color: <hex>,\n *  opacity: <float>,\n *  map: new THREE.Texture( <Image> ),\n *\n *  lightMap: new THREE.Texture( <Image> ),\n *  lightMapIntensity: <float>\n *\n *  aoMap: new THREE.Texture( <Image> ),\n *  aoMapIntensity: <float>\n *\n *  specularMap: new THREE.Texture( <Image> ),\n *\n *  alphaMap: new THREE.Texture( <Image> ),\n *\n *  envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),\n *  combine: THREE.Multiply,\n *  reflectivity: <float>,\n *  refractionRatio: <float>,\n *\n *  depthTest: <bool>,\n *  depthWrite: <bool>,\n *\n *  wireframe: <boolean>,\n *  wireframeLinewidth: <float>,\n * }\n */\n\nclass MeshBasicMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'MeshBasicMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // emissive\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.specularMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.combine = MultiplyOperation;\n\t\tthis.reflectivity = 1;\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\treturn this;\n\n\t}\n\n}\n\nMeshBasicMaterial.prototype.isMeshBasicMaterial = true;\n\nexport { MeshBasicMaterial };\n","import { Vector3 } from '../math/Vector3.js';\nimport { Vector2 } from '../math/Vector2.js';\nimport { Sphere } from '../math/Sphere.js';\nimport { Ray } from '../math/Ray.js';\nimport { Matrix4 } from '../math/Matrix4.js';\nimport { Object3D } from '../core/Object3D.js';\nimport { Triangle } from '../math/Triangle.js';\nimport { DoubleSide, BackSide } from '../constants.js';\nimport { MeshBasicMaterial } from '../materials/MeshBasicMaterial.js';\nimport { BufferGeometry } from '../core/BufferGeometry.js';\n\nconst _inverseMatrix = /*@__PURE__*/ new Matrix4();\nconst _ray = /*@__PURE__*/ new Ray();\nconst _sphere = /*@__PURE__*/ new Sphere();\n\nconst _vA = /*@__PURE__*/ new Vector3();\nconst _vB = /*@__PURE__*/ new Vector3();\nconst _vC = /*@__PURE__*/ new Vector3();\n\nconst _tempA = /*@__PURE__*/ new Vector3();\nconst _tempB = /*@__PURE__*/ new Vector3();\nconst _tempC = /*@__PURE__*/ new Vector3();\n\nconst _morphA = /*@__PURE__*/ new Vector3();\nconst _morphB = /*@__PURE__*/ new Vector3();\nconst _morphC = /*@__PURE__*/ new Vector3();\n\nconst _uvA = /*@__PURE__*/ new Vector2();\nconst _uvB = /*@__PURE__*/ new Vector2();\nconst _uvC = /*@__PURE__*/ new Vector2();\n\nconst _intersectionPoint = /*@__PURE__*/ new Vector3();\nconst _intersectionPointWorld = /*@__PURE__*/ new Vector3();\n\nclass Mesh extends Object3D {\n\n\tconstructor( geometry = new BufferGeometry(), material = new MeshBasicMaterial() ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'Mesh';\n\n\t\tthis.geometry = geometry;\n\t\tthis.material = material;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tif ( source.morphTargetInfluences !== undefined ) {\n\n\t\t\tthis.morphTargetInfluences = source.morphTargetInfluences.slice();\n\n\t\t}\n\n\t\tif ( source.morphTargetDictionary !== undefined ) {\n\n\t\t\tthis.morphTargetDictionary = Object.assign( {}, source.morphTargetDictionary );\n\n\t\t}\n\n\t\tthis.material = source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t}\n\n\tupdateMorphTargets() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\tconst morphAttributes = geometry.morphAttributes;\n\t\t\tconst keys = Object.keys( morphAttributes );\n\n\t\t\tif ( keys.length > 0 ) {\n\n\t\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst morphTargets = geometry.morphTargets;\n\n\t\t\tif ( morphTargets !== undefined && morphTargets.length > 0 ) {\n\n\t\t\t\tconsole.error( 'THREE.Mesh.updateMorphTargets() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst material = this.material;\n\t\tconst matrixWorld = this.matrixWorld;\n\n\t\tif ( material === undefined ) return;\n\n\t\t// Checking boundingSphere distance to ray\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere.copy( geometry.boundingSphere );\n\t\t_sphere.applyMatrix4( matrixWorld );\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere ) === false ) return;\n\n\t\t//\n\n\t\t_inverseMatrix.copy( matrixWorld ).invert();\n\t\t_ray.copy( raycaster.ray ).applyMatrix4( _inverseMatrix );\n\n\t\t// Check boundingBox before continuing\n\n\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\tif ( _ray.intersectsBox( geometry.boundingBox ) === false ) return;\n\n\t\t}\n\n\t\tlet intersection;\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\tconst index = geometry.index;\n\t\t\tconst position = geometry.attributes.position;\n\t\t\tconst morphPosition = geometry.morphAttributes.position;\n\t\t\tconst morphTargetsRelative = geometry.morphTargetsRelative;\n\t\t\tconst uv = geometry.attributes.uv;\n\t\t\tconst uv2 = geometry.attributes.uv2;\n\t\t\tconst groups = geometry.groups;\n\t\t\tconst drawRange = geometry.drawRange;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\t// indexed buffer geometry\n\n\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\tfor ( let i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\tconst start = Math.max( group.start, drawRange.start );\n\t\t\t\t\t\tconst end = Math.min( index.count, Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ) );\n\n\t\t\t\t\t\tfor ( let j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\t\t\tconst a = index.getX( j );\n\t\t\t\t\t\t\tconst b = index.getX( j + 1 );\n\t\t\t\t\t\t\tconst c = index.getX( j + 2 );\n\n\t\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, groupMaterial, raycaster, _ray, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c );\n\n\t\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( j / 3 ); // triangle number in indexed buffer semantics\n\t\t\t\t\t\t\t\tintersection.face.materialIndex = group.materialIndex;\n\t\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\t\tfor ( let i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\t\t\tconst a = index.getX( i );\n\t\t\t\t\t\tconst b = index.getX( i + 1 );\n\t\t\t\t\t\tconst c = index.getX( i + 2 );\n\n\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, material, raycaster, _ray, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in indexed buffer semantics\n\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( position !== undefined ) {\n\n\t\t\t\t// non-indexed buffer geometry\n\n\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\tfor ( let i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\tconst start = Math.max( group.start, drawRange.start );\n\t\t\t\t\t\tconst end = Math.min( position.count, Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ) );\n\n\t\t\t\t\t\tfor ( let j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\t\t\tconst a = j;\n\t\t\t\t\t\t\tconst b = j + 1;\n\t\t\t\t\t\t\tconst c = j + 2;\n\n\t\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, groupMaterial, raycaster, _ray, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c );\n\n\t\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( j / 3 ); // triangle number in non-indexed buffer semantics\n\t\t\t\t\t\t\t\tintersection.face.materialIndex = group.materialIndex;\n\t\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\t\tconst end = Math.min( position.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\t\tfor ( let i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\t\t\tconst a = i;\n\t\t\t\t\t\tconst b = i + 1;\n\t\t\t\t\t\tconst c = i + 2;\n\n\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, material, raycaster, _ray, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in non-indexed buffer semantics\n\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\tconsole.error( 'THREE.Mesh.raycast() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' );\n\n\t\t}\n\n\t}\n\n}\n\nMesh.prototype.isMesh = true;\n\nfunction checkIntersection( object, material, raycaster, ray, pA, pB, pC, point ) {\n\n\tlet intersect;\n\n\tif ( material.side === BackSide ) {\n\n\t\tintersect = ray.intersectTriangle( pC, pB, pA, true, point );\n\n\t} else {\n\n\t\tintersect = ray.intersectTriangle( pA, pB, pC, material.side !== DoubleSide, point );\n\n\t}\n\n\tif ( intersect === null ) return null;\n\n\t_intersectionPointWorld.copy( point );\n\t_intersectionPointWorld.applyMatrix4( object.matrixWorld );\n\n\tconst distance = raycaster.ray.origin.distanceTo( _intersectionPointWorld );\n\n\tif ( distance < raycaster.near || distance > raycaster.far ) return null;\n\n\treturn {\n\t\tdistance: distance,\n\t\tpoint: _intersectionPointWorld.clone(),\n\t\tobject: object\n\t};\n\n}\n\nfunction checkBufferGeometryIntersection( object, material, raycaster, ray, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c ) {\n\n\t_vA.fromBufferAttribute( position, a );\n\t_vB.fromBufferAttribute( position, b );\n\t_vC.fromBufferAttribute( position, c );\n\n\tconst morphInfluences = object.morphTargetInfluences;\n\n\tif ( morphPosition && morphInfluences ) {\n\n\t\t_morphA.set( 0, 0, 0 );\n\t\t_morphB.set( 0, 0, 0 );\n\t\t_morphC.set( 0, 0, 0 );\n\n\t\tfor ( let i = 0, il = morphPosition.length; i < il; i ++ ) {\n\n\t\t\tconst influence = morphInfluences[ i ];\n\t\t\tconst morphAttribute = morphPosition[ i ];\n\n\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t_tempA.fromBufferAttribute( morphAttribute, a );\n\t\t\t_tempB.fromBufferAttribute( morphAttribute, b );\n\t\t\t_tempC.fromBufferAttribute( morphAttribute, c );\n\n\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t_morphA.addScaledVector( _tempA, influence );\n\t\t\t\t_morphB.addScaledVector( _tempB, influence );\n\t\t\t\t_morphC.addScaledVector( _tempC, influence );\n\n\t\t\t} else {\n\n\t\t\t\t_morphA.addScaledVector( _tempA.sub( _vA ), influence );\n\t\t\t\t_morphB.addScaledVector( _tempB.sub( _vB ), influence );\n\t\t\t\t_morphC.addScaledVector( _tempC.sub( _vC ), influence );\n\n\t\t\t}\n\n\t\t}\n\n\t\t_vA.add( _morphA );\n\t\t_vB.add( _morphB );\n\t\t_vC.add( _morphC );\n\n\t}\n\n\tif ( object.isSkinnedMesh ) {\n\n\t\tobject.boneTransform( a, _vA );\n\t\tobject.boneTransform( b, _vB );\n\t\tobject.boneTransform( c, _vC );\n\n\t}\n\n\tconst intersection = checkIntersection( object, material, raycaster, ray, _vA, _vB, _vC, _intersectionPoint );\n\n\tif ( intersection ) {\n\n\t\tif ( uv ) {\n\n\t\t\t_uvA.fromBufferAttribute( uv, a );\n\t\t\t_uvB.fromBufferAttribute( uv, b );\n\t\t\t_uvC.fromBufferAttribute( uv, c );\n\n\t\t\tintersection.uv = Triangle.getUV( _intersectionPoint, _vA, _vB, _vC, _uvA, _uvB, _uvC, new Vector2() );\n\n\t\t}\n\n\t\tif ( uv2 ) {\n\n\t\t\t_uvA.fromBufferAttribute( uv2, a );\n\t\t\t_uvB.fromBufferAttribute( uv2, b );\n\t\t\t_uvC.fromBufferAttribute( uv2, c );\n\n\t\t\tintersection.uv2 = Triangle.getUV( _intersectionPoint, _vA, _vB, _vC, _uvA, _uvB, _uvC, new Vector2() );\n\n\t\t}\n\n\t\tconst face = {\n\t\t\ta: a,\n\t\t\tb: b,\n\t\t\tc: c,\n\t\t\tnormal: new Vector3(),\n\t\t\tmaterialIndex: 0\n\t\t};\n\n\t\tTriangle.getNormal( _vA, _vB, _vC, face.normal );\n\n\t\tintersection.face = face;\n\n\t}\n\n\treturn intersection;\n\n}\n\nexport { Mesh };\n","export default /* glsl */`\n#ifdef USE_ALPHAMAP\n\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n\n#endif\n`;\n","import alphamap_fragment from './ShaderChunk/alphamap_fragment.glsl.js';\nimport alphamap_pars_fragment from './ShaderChunk/alphamap_pars_fragment.glsl.js';\nimport alphatest_fragment from './ShaderChunk/alphatest_fragment.glsl.js';\nimport alphatest_pars_fragment from './ShaderChunk/alphatest_pars_fragment.glsl.js';\nimport aomap_fragment from './ShaderChunk/aomap_fragment.glsl.js';\nimport aomap_pars_fragment from './ShaderChunk/aomap_pars_fragment.glsl.js';\nimport begin_vertex from './ShaderChunk/begin_vertex.glsl.js';\nimport beginnormal_vertex from './ShaderChunk/beginnormal_vertex.glsl.js';\nimport bsdfs from './ShaderChunk/bsdfs.glsl.js';\nimport bumpmap_pars_fragment from './ShaderChunk/bumpmap_pars_fragment.glsl.js';\nimport clipping_planes_fragment from './ShaderChunk/clipping_planes_fragment.glsl.js';\nimport clipping_planes_pars_fragment from './ShaderChunk/clipping_planes_pars_fragment.glsl.js';\nimport clipping_planes_pars_vertex from './ShaderChunk/clipping_planes_pars_vertex.glsl.js';\nimport clipping_planes_vertex from './ShaderChunk/clipping_planes_vertex.glsl.js';\nimport color_fragment from './ShaderChunk/color_fragment.glsl.js';\nimport color_pars_fragment from './ShaderChunk/color_pars_fragment.glsl.js';\nimport color_pars_vertex from './ShaderChunk/color_pars_vertex.glsl.js';\nimport color_vertex from './ShaderChunk/color_vertex.glsl.js';\nimport common from './ShaderChunk/common.glsl.js';\nimport cube_uv_reflection_fragment from './ShaderChunk/cube_uv_reflection_fragment.glsl.js';\nimport defaultnormal_vertex from './ShaderChunk/defaultnormal_vertex.glsl.js';\nimport displacementmap_pars_vertex from './ShaderChunk/displacementmap_pars_vertex.glsl.js';\nimport displacementmap_vertex from './ShaderChunk/displacementmap_vertex.glsl.js';\nimport emissivemap_fragment from './ShaderChunk/emissivemap_fragment.glsl.js';\nimport emissivemap_pars_fragment from './ShaderChunk/emissivemap_pars_fragment.glsl.js';\nimport encodings_fragment from './ShaderChunk/encodings_fragment.glsl.js';\nimport encodings_pars_fragment from './ShaderChunk/encodings_pars_fragment.glsl.js';\nimport envmap_fragment from './ShaderChunk/envmap_fragment.glsl.js';\nimport envmap_common_pars_fragment from './ShaderChunk/envmap_common_pars_fragment.glsl.js';\nimport envmap_pars_fragment from './ShaderChunk/envmap_pars_fragment.glsl.js';\nimport envmap_pars_vertex from './ShaderChunk/envmap_pars_vertex.glsl.js';\nimport envmap_vertex from './ShaderChunk/envmap_vertex.glsl.js';\nimport fog_vertex from './ShaderChunk/fog_vertex.glsl.js';\nimport fog_pars_vertex from './ShaderChunk/fog_pars_vertex.glsl.js';\nimport fog_fragment from './ShaderChunk/fog_fragment.glsl.js';\nimport fog_pars_fragment from './ShaderChunk/fog_pars_fragment.glsl.js';\nimport gradientmap_pars_fragment from './ShaderChunk/gradientmap_pars_fragment.glsl.js';\nimport lightmap_fragment from './ShaderChunk/lightmap_fragment.glsl.js';\nimport lightmap_pars_fragment from './ShaderChunk/lightmap_pars_fragment.glsl.js';\nimport lights_lambert_vertex from './ShaderChunk/lights_lambert_vertex.glsl.js';\nimport lights_pars_begin from './ShaderChunk/lights_pars_begin.glsl.js';\nimport envmap_physical_pars_fragment from './ShaderChunk/envmap_physical_pars_fragment.glsl.js';\nimport lights_toon_fragment from './ShaderChunk/lights_toon_fragment.glsl.js';\nimport lights_toon_pars_fragment from './ShaderChunk/lights_toon_pars_fragment.glsl.js';\nimport lights_phong_fragment from './ShaderChunk/lights_phong_fragment.glsl.js';\nimport lights_phong_pars_fragment from './ShaderChunk/lights_phong_pars_fragment.glsl.js';\nimport lights_physical_fragment from './ShaderChunk/lights_physical_fragment.glsl.js';\nimport lights_physical_pars_fragment from './ShaderChunk/lights_physical_pars_fragment.glsl.js';\nimport lights_fragment_begin from './ShaderChunk/lights_fragment_begin.glsl.js';\nimport lights_fragment_maps from './ShaderChunk/lights_fragment_maps.glsl.js';\nimport lights_fragment_end from './ShaderChunk/lights_fragment_end.glsl.js';\nimport logdepthbuf_fragment from './ShaderChunk/logdepthbuf_fragment.glsl.js';\nimport logdepthbuf_pars_fragment from './ShaderChunk/logdepthbuf_pars_fragment.glsl.js';\nimport logdepthbuf_pars_vertex from './ShaderChunk/logdepthbuf_pars_vertex.glsl.js';\nimport logdepthbuf_vertex from './ShaderChunk/logdepthbuf_vertex.glsl.js';\nimport map_fragment from './ShaderChunk/map_fragment.glsl.js';\nimport map_pars_fragment from './ShaderChunk/map_pars_fragment.glsl.js';\nimport map_particle_fragment from './ShaderChunk/map_particle_fragment.glsl.js';\nimport map_particle_pars_fragment from './ShaderChunk/map_particle_pars_fragment.glsl.js';\nimport metalnessmap_fragment from './ShaderChunk/metalnessmap_fragment.glsl.js';\nimport metalnessmap_pars_fragment from './ShaderChunk/metalnessmap_pars_fragment.glsl.js';\nimport morphnormal_vertex from './ShaderChunk/morphnormal_vertex.glsl.js';\nimport morphtarget_pars_vertex from './ShaderChunk/morphtarget_pars_vertex.glsl.js';\nimport morphtarget_vertex from './ShaderChunk/morphtarget_vertex.glsl.js';\nimport normal_fragment_begin from './ShaderChunk/normal_fragment_begin.glsl.js';\nimport normal_fragment_maps from './ShaderChunk/normal_fragment_maps.glsl.js';\nimport normal_pars_fragment from './ShaderChunk/normal_pars_fragment.glsl.js';\nimport normal_pars_vertex from './ShaderChunk/normal_pars_vertex.glsl.js';\nimport normal_vertex from './ShaderChunk/normal_vertex.glsl.js';\nimport normalmap_pars_fragment from './ShaderChunk/normalmap_pars_fragment.glsl.js';\nimport clearcoat_normal_fragment_begin from './ShaderChunk/clearcoat_normal_fragment_begin.glsl.js';\nimport clearcoat_normal_fragment_maps from './ShaderChunk/clearcoat_normal_fragment_maps.glsl.js';\nimport clearcoat_pars_fragment from './ShaderChunk/clearcoat_pars_fragment.glsl.js';\nimport output_fragment from './ShaderChunk/output_fragment.glsl.js';\nimport packing from './ShaderChunk/packing.glsl.js';\nimport premultiplied_alpha_fragment from './ShaderChunk/premultiplied_alpha_fragment.glsl.js';\nimport project_vertex from './ShaderChunk/project_vertex.glsl.js';\nimport dithering_fragment from './ShaderChunk/dithering_fragment.glsl.js';\nimport dithering_pars_fragment from './ShaderChunk/dithering_pars_fragment.glsl.js';\nimport roughnessmap_fragment from './ShaderChunk/roughnessmap_fragment.glsl.js';\nimport roughnessmap_pars_fragment from './ShaderChunk/roughnessmap_pars_fragment.glsl.js';\nimport shadowmap_pars_fragment from './ShaderChunk/shadowmap_pars_fragment.glsl.js';\nimport shadowmap_pars_vertex from './ShaderChunk/shadowmap_pars_vertex.glsl.js';\nimport shadowmap_vertex from './ShaderChunk/shadowmap_vertex.glsl.js';\nimport shadowmask_pars_fragment from './ShaderChunk/shadowmask_pars_fragment.glsl.js';\nimport skinbase_vertex from './ShaderChunk/skinbase_vertex.glsl.js';\nimport skinning_pars_vertex from './ShaderChunk/skinning_pars_vertex.glsl.js';\nimport skinning_vertex from './ShaderChunk/skinning_vertex.glsl.js';\nimport skinnormal_vertex from './ShaderChunk/skinnormal_vertex.glsl.js';\nimport specularmap_fragment from './ShaderChunk/specularmap_fragment.glsl.js';\nimport specularmap_pars_fragment from './ShaderChunk/specularmap_pars_fragment.glsl.js';\nimport tonemapping_fragment from './ShaderChunk/tonemapping_fragment.glsl.js';\nimport tonemapping_pars_fragment from './ShaderChunk/tonemapping_pars_fragment.glsl.js';\nimport transmission_fragment from './ShaderChunk/transmission_fragment.glsl.js';\nimport transmission_pars_fragment from './ShaderChunk/transmission_pars_fragment.glsl.js';\nimport uv_pars_fragment from './ShaderChunk/uv_pars_fragment.glsl.js';\nimport uv_pars_vertex from './ShaderChunk/uv_pars_vertex.glsl.js';\nimport uv_vertex from './ShaderChunk/uv_vertex.glsl.js';\nimport uv2_pars_fragment from './ShaderChunk/uv2_pars_fragment.glsl.js';\nimport uv2_pars_vertex from './ShaderChunk/uv2_pars_vertex.glsl.js';\nimport uv2_vertex from './ShaderChunk/uv2_vertex.glsl.js';\nimport worldpos_vertex from './ShaderChunk/worldpos_vertex.glsl.js';\n\nimport * as background from './ShaderLib/background.glsl.js';\nimport * as cube from './ShaderLib/cube.glsl.js';\nimport * as depth from './ShaderLib/depth.glsl.js';\nimport * as distanceRGBA from './ShaderLib/distanceRGBA.glsl.js';\nimport * as equirect from './ShaderLib/equirect.glsl.js';\nimport * as linedashed from './ShaderLib/linedashed.glsl.js';\nimport * as meshbasic from './ShaderLib/meshbasic.glsl.js';\nimport * as meshlambert from './ShaderLib/meshlambert.glsl.js';\nimport * as meshmatcap from './ShaderLib/meshmatcap.glsl.js';\nimport * as meshnormal from './ShaderLib/meshnormal.glsl.js';\nimport * as meshphong from './ShaderLib/meshphong.glsl.js';\nimport * as meshphysical from './ShaderLib/meshphysical.glsl.js';\nimport * as meshtoon from './ShaderLib/meshtoon.glsl.js';\nimport * as points from './ShaderLib/points.glsl.js';\nimport * as shadow from './ShaderLib/shadow.glsl.js';\nimport * as sprite from './ShaderLib/sprite.glsl.js';\n\nexport const ShaderChunk = {\n\talphamap_fragment: alphamap_fragment,\n\talphamap_pars_fragment: alphamap_pars_fragment,\n\talphatest_fragment: alphatest_fragment,\n\talphatest_pars_fragment: alphatest_pars_fragment,\n\taomap_fragment: aomap_fragment,\n\taomap_pars_fragment: aomap_pars_fragment,\n\tbegin_vertex: begin_vertex,\n\tbeginnormal_vertex: beginnormal_vertex,\n\tbsdfs: bsdfs,\n\tbumpmap_pars_fragment: bumpmap_pars_fragment,\n\tclipping_planes_fragment: clipping_planes_fragment,\n\tclipping_planes_pars_fragment: clipping_planes_pars_fragment,\n\tclipping_planes_pars_vertex: clipping_planes_pars_vertex,\n\tclipping_planes_vertex: clipping_planes_vertex,\n\tcolor_fragment: color_fragment,\n\tcolor_pars_fragment: color_pars_fragment,\n\tcolor_pars_vertex: color_pars_vertex,\n\tcolor_vertex: color_vertex,\n\tcommon: common,\n\tcube_uv_reflection_fragment: cube_uv_reflection_fragment,\n\tdefaultnormal_vertex: defaultnormal_vertex,\n\tdisplacementmap_pars_vertex: displacementmap_pars_vertex,\n\tdisplacementmap_vertex: displacementmap_vertex,\n\temissivemap_fragment: emissivemap_fragment,\n\temissivemap_pars_fragment: emissivemap_pars_fragment,\n\tencodings_fragment: encodings_fragment,\n\tencodings_pars_fragment: encodings_pars_fragment,\n\tenvmap_fragment: envmap_fragment,\n\tenvmap_common_pars_fragment: envmap_common_pars_fragment,\n\tenvmap_pars_fragment: envmap_pars_fragment,\n\tenvmap_pars_vertex: envmap_pars_vertex,\n\tenvmap_physical_pars_fragment: envmap_physical_pars_fragment,\n\tenvmap_vertex: envmap_vertex,\n\tfog_vertex: fog_vertex,\n\tfog_pars_vertex: fog_pars_vertex,\n\tfog_fragment: fog_fragment,\n\tfog_pars_fragment: fog_pars_fragment,\n\tgradientmap_pars_fragment: gradientmap_pars_fragment,\n\tlightmap_fragment: lightmap_fragment,\n\tlightmap_pars_fragment: lightmap_pars_fragment,\n\tlights_lambert_vertex: lights_lambert_vertex,\n\tlights_pars_begin: lights_pars_begin,\n\tlights_toon_fragment: lights_toon_fragment,\n\tlights_toon_pars_fragment: lights_toon_pars_fragment,\n\tlights_phong_fragment: lights_phong_fragment,\n\tlights_phong_pars_fragment: lights_phong_pars_fragment,\n\tlights_physical_fragment: lights_physical_fragment,\n\tlights_physical_pars_fragment: lights_physical_pars_fragment,\n\tlights_fragment_begin: lights_fragment_begin,\n\tlights_fragment_maps: lights_fragment_maps,\n\tlights_fragment_end: lights_fragment_end,\n\tlogdepthbuf_fragment: logdepthbuf_fragment,\n\tlogdepthbuf_pars_fragment: logdepthbuf_pars_fragment,\n\tlogdepthbuf_pars_vertex: logdepthbuf_pars_vertex,\n\tlogdepthbuf_vertex: logdepthbuf_vertex,\n\tmap_fragment: map_fragment,\n\tmap_pars_fragment: map_pars_fragment,\n\tmap_particle_fragment: map_particle_fragment,\n\tmap_particle_pars_fragment: map_particle_pars_fragment,\n\tmetalnessmap_fragment: metalnessmap_fragment,\n\tmetalnessmap_pars_fragment: metalnessmap_pars_fragment,\n\tmorphnormal_vertex: morphnormal_vertex,\n\tmorphtarget_pars_vertex: morphtarget_pars_vertex,\n\tmorphtarget_vertex: morphtarget_vertex,\n\tnormal_fragment_begin: normal_fragment_begin,\n\tnormal_fragment_maps: normal_fragment_maps,\n\tnormal_pars_fragment: normal_pars_fragment,\n\tnormal_pars_vertex: normal_pars_vertex,\n\tnormal_vertex: normal_vertex,\n\tnormalmap_pars_fragment: normalmap_pars_fragment,\n\tclearcoat_normal_fragment_begin: clearcoat_normal_fragment_begin,\n\tclearcoat_normal_fragment_maps: clearcoat_normal_fragment_maps,\n\tclearcoat_pars_fragment: clearcoat_pars_fragment,\n\toutput_fragment: output_fragment,\n\tpacking: packing,\n\tpremultiplied_alpha_fragment: premultiplied_alpha_fragment,\n\tproject_vertex: project_vertex,\n\tdithering_fragment: dithering_fragment,\n\tdithering_pars_fragment: dithering_pars_fragment,\n\troughnessmap_fragment: roughnessmap_fragment,\n\troughnessmap_pars_fragment: roughnessmap_pars_fragment,\n\tshadowmap_pars_fragment: shadowmap_pars_fragment,\n\tshadowmap_pars_vertex: shadowmap_pars_vertex,\n\tshadowmap_vertex: shadowmap_vertex,\n\tshadowmask_pars_fragment: shadowmask_pars_fragment,\n\tskinbase_vertex: skinbase_vertex,\n\tskinning_pars_vertex: skinning_pars_vertex,\n\tskinning_vertex: skinning_vertex,\n\tskinnormal_vertex: skinnormal_vertex,\n\tspecularmap_fragment: specularmap_fragment,\n\tspecularmap_pars_fragment: specularmap_pars_fragment,\n\ttonemapping_fragment: tonemapping_fragment,\n\ttonemapping_pars_fragment: tonemapping_pars_fragment,\n\ttransmission_fragment: transmission_fragment,\n\ttransmission_pars_fragment: transmission_pars_fragment,\n\tuv_pars_fragment: uv_pars_fragment,\n\tuv_pars_vertex: uv_pars_vertex,\n\tuv_vertex: uv_vertex,\n\tuv2_pars_fragment: uv2_pars_fragment,\n\tuv2_pars_vertex: uv2_pars_vertex,\n\tuv2_vertex: uv2_vertex,\n\tworldpos_vertex: worldpos_vertex,\n\n\tbackground_vert: background.vertex,\n\tbackground_frag: background.fragment,\n\tcube_vert: cube.vertex,\n\tcube_frag: cube.fragment,\n\tdepth_vert: depth.vertex,\n\tdepth_frag: depth.fragment,\n\tdistanceRGBA_vert: distanceRGBA.vertex,\n\tdistanceRGBA_frag: distanceRGBA.fragment,\n\tequirect_vert: equirect.vertex,\n\tequirect_frag: equirect.fragment,\n\tlinedashed_vert: linedashed.vertex,\n\tlinedashed_frag: linedashed.fragment,\n\tmeshbasic_vert: meshbasic.vertex,\n\tmeshbasic_frag: meshbasic.fragment,\n\tmeshlambert_vert: meshlambert.vertex,\n\tmeshlambert_frag: meshlambert.fragment,\n\tmeshmatcap_vert: meshmatcap.vertex,\n\tmeshmatcap_frag: meshmatcap.fragment,\n\tmeshnormal_vert: meshnormal.vertex,\n\tmeshnormal_frag: meshnormal.fragment,\n\tmeshphong_vert: meshphong.vertex,\n\tmeshphong_frag: meshphong.fragment,\n\tmeshphysical_vert: meshphysical.vertex,\n\tmeshphysical_frag: meshphysical.fragment,\n\tmeshtoon_vert: meshtoon.vertex,\n\tmeshtoon_frag: meshtoon.fragment,\n\tpoints_vert: points.vertex,\n\tpoints_frag: points.fragment,\n\tshadow_vert: shadow.vertex,\n\tshadow_frag: shadow.fragment,\n\tsprite_vert: sprite.vertex,\n\tsprite_frag: sprite.fragment\n};\n","export default /* glsl */`\n#ifdef USE_ALPHAMAP\n\n\tuniform sampler2D alphaMap;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_ALPHATEST\n\n\tif ( diffuseColor.a < alphaTest ) discard;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_ALPHATEST\n\tuniform float alphaTest;\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_AOMAP\n\n\t// reads channel R, compatible with a combined OcclusionRoughnessMetallic (RGB) texture\n\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\n\t#if defined( USE_ENVMAP ) && defined( STANDARD )\n\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.roughness );\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_AOMAP\n\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n\n#endif\n`;\n","export default /* glsl */`\nvec3 transformed = vec3( position );\n`;\n","export default /* glsl */`\nvec3 objectNormal = vec3( normal );\n\n#ifdef USE_TANGENT\n\n\tvec3 objectTangent = vec3( tangent.xyz );\n\n#endif\n`;\n","export default /* glsl */`\n\nvec3 BRDF_Lambert( const in vec3 diffuseColor ) {\n\n\treturn RECIPROCAL_PI * diffuseColor;\n\n} // validated\n\nvec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) {\n\n\t// Original approximation by Christophe Schlick '94\n\t// float fresnel = pow( 1.0 - dotVH, 5.0 );\n\n\t// Optimized variant (presented by Epic at SIGGRAPH '13)\n\t// https://cdn2.unrealengine.com/Resources/files/2013SiggraphPresentationsNotes-26915738.pdf\n\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\n\n\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\n\n} // validated\n\n// Moving Frostbite to Physically Based Rendering 3.0 - page 12, listing 2\n// https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf\nfloat V_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\n\tfloat a2 = pow2( alpha );\n\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\n\treturn 0.5 / max( gv + gl, EPSILON );\n\n}\n\n// Microfacet Models for Refraction through Rough Surfaces - equation (33)\n// http://graphicrants.blogspot.com/2013/08/specular-brdf-reference.html\n// alpha is \"roughness squared\" in Disney’s reparameterization\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\n\tfloat a2 = pow2( alpha );\n\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0; // avoid alpha = 0 with dotNH = 1\n\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n\n}\n\n// GGX Distribution, Schlick Fresnel, GGX_SmithCorrelated Visibility\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in vec3 f0, const in float f90, const in float roughness ) {\n\n\tfloat alpha = pow2( roughness ); // UE4's roughness\n\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\n\tvec3 F = F_Schlick( f0, f90, dotVH );\n\n\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\n\tfloat D = D_GGX( alpha, dotNH );\n\n\treturn F * ( V * D );\n\n}\n\n// Rect Area Light\n\n// Real-Time Polygonal-Light Shading with Linearly Transformed Cosines\n// by Eric Heitz, Jonathan Dupuy, Stephen Hill and David Neubelt\n// code: https://github.com/selfshadow/ltc_code/\n\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\n\tfloat dotNV = saturate( dot( N, V ) );\n\n\t// texture parameterized by sqrt( GGX alpha ) and sqrt( 1 - cos( theta ) )\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\n\treturn uv;\n\n}\n\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\n\t// Real-Time Area Lighting: a Journey from Research to Production (p.102)\n\t// An approximation of the form factor of a horizon-clipped rectangle.\n\n\tfloat l = length( f );\n\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n\n}\n\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\n\tfloat x = dot( v1, v2 );\n\n\tfloat y = abs( x );\n\n\t// rational polynomial approximation to theta / sin( theta ) / 2PI\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\n\treturn cross( v1, v2 ) * theta_sintheta;\n\n}\n\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\n\t// bail if point is on back side of plane of light\n\t// assumes ccw winding order of light vertices\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\n\t// construct orthonormal basis around N\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 ); // negated from paper; possibly due to a different handedness of world coordinate system\n\n\t// compute transform\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\n\t// transform rect\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\n\t// project rect onto sphere\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\n\t// calculate vector form factor\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\n\t// adjust for horizon clipping\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\n/*\n\t// alternate method of adjusting for horizon clipping (see referece)\n\t// refactoring required\n\tfloat len = length( vectorFormFactor );\n\tfloat z = vectorFormFactor.z / len;\n\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\n\t// tabulated horizon-clipped sphere, apparently...\n\tvec2 uv = vec2( z * 0.5 + 0.5, len );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\n\tfloat scale = texture2D( ltc_2, uv ).w;\n\n\tfloat result = len * scale;\n*/\n\n\treturn vec3( result );\n\n}\n\n// End Rect Area Light\n\n\nfloat G_BlinnPhong_Implicit( /* const in float dotNL, const in float dotNV */ ) {\n\n\t// geometry term is (n dot l)(n dot v) / 4(n dot l)(n dot v)\n\treturn 0.25;\n\n}\n\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n\n}\n\nvec3 BRDF_BlinnPhong( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float shininess ) {\n\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\n\tvec3 F = F_Schlick( specularColor, 1.0, dotVH );\n\n\tfloat G = G_BlinnPhong_Implicit( /* dotNL, dotNV */ );\n\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\n\treturn F * ( G * D );\n\n} // validated\n\n#if defined( USE_SHEEN )\n\n// https://github.com/google/filament/blob/master/shaders/src/brdf.fs\nfloat D_Charlie( float roughness, float dotNH ) {\n\n\tfloat alpha = pow2( roughness );\n\n\t// Estevez and Kulla 2017, \"Production Friendly Microfacet Sheen BRDF\"\n\tfloat invAlpha = 1.0 / alpha;\n\tfloat cos2h = dotNH * dotNH;\n\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 ); // 2^(-14/2), so sin2h^2 > 0 in fp16\n\n\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\n\n}\n\n// https://github.com/google/filament/blob/master/shaders/src/brdf.fs\nfloat V_Neubelt( float dotNV, float dotNL ) {\n\n\t// Neubelt and Pettineo 2013, \"Crafting a Next-gen Material Pipeline for The Order: 1886\"\n\treturn saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\n\n}\n\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\n\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\n\tfloat D = D_Charlie( sheenRoughness, dotNH );\n\tfloat V = V_Neubelt( dotNV, dotNL );\n\n\treturn sheenColor * ( D * V );\n\n}\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_BUMPMAP\n\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\n\t// Bump Mapping Unparametrized Surfaces on the GPU by Morten S. Mikkelsen\n\t// https://mmikk.github.io/papers3d/mm_sfgrad_bump.pdf\n\n\t// Evaluate the derivative of the height w.r.t. screen-space using forward differencing (listing 2)\n\n\tvec2 dHdxy_fwd() {\n\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\n\t\treturn vec2( dBx, dBy );\n\n\t}\n\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy, float faceDirection ) {\n\n\t\t// Workaround for Adreno 3XX dFd*( vec3 ) bug. See #9988\n\n\t\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\n\t\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\n\t\tvec3 vN = surf_norm;\t\t// normalized\n\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\n\t\tfloat fDet = dot( vSigmaX, R1 ) * faceDirection;\n\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\n\t}\n\n#endif\n`;\n","export default /* glsl */`\n#if NUM_CLIPPING_PLANES > 0\n\n\tvec4 plane;\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\n\t\tplane = clippingPlanes[ i ];\n\t\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\n\n\t}\n\t#pragma unroll_loop_end\n\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\n\t\tbool clipped = true;\n\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\n\n\t\t}\n\t\t#pragma unroll_loop_end\n\n\t\tif ( clipped ) discard;\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n#if NUM_CLIPPING_PLANES > 0\n\n\tvarying vec3 vClipPosition;\n\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n\n#endif\n`;\n","export default /* glsl */`\n#if NUM_CLIPPING_PLANES > 0\n\n\tvarying vec3 vClipPosition;\n\n#endif\n`;\n","export default /* glsl */`\n#if NUM_CLIPPING_PLANES > 0\n\n\tvClipPosition = - mvPosition.xyz;\n\n#endif\n`;\n","export default /* glsl */`\n#if defined( USE_COLOR_ALPHA )\n\n\tdiffuseColor *= vColor;\n\n#elif defined( USE_COLOR )\n\n\tdiffuseColor.rgb *= vColor;\n\n#endif\n`;\n","export default /* glsl */`\n#if defined( USE_COLOR_ALPHA )\n\n\tvarying vec4 vColor;\n\n#elif defined( USE_COLOR )\n\n\tvarying vec3 vColor;\n\n#endif\n`;\n","export default /* glsl */`\n#if defined( USE_COLOR_ALPHA )\n\n\tvarying vec4 vColor;\n\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\n\tvarying vec3 vColor;\n\n#endif\n`;\n","export default /* glsl */`\n#if defined( USE_COLOR_ALPHA )\n\n\tvColor = vec4( 1.0 );\n\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\n\tvColor = vec3( 1.0 );\n\n#endif\n\n#ifdef USE_COLOR\n\n\tvColor *= color;\n\n#endif\n\n#ifdef USE_INSTANCING_COLOR\n\n\tvColor.xyz *= instanceColor.xyz;\n\n#endif\n`;\n","export default /* glsl */`\n#define PI 3.141592653589793\n#define PI2 6.283185307179586\n#define PI_HALF 1.5707963267948966\n#define RECIPROCAL_PI 0.3183098861837907\n#define RECIPROCAL_PI2 0.15915494309189535\n#define EPSILON 1e-6\n\n#ifndef saturate\n// <tonemapping_pars_fragment> may have defined saturate() already\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement( a ) ( 1.0 - saturate( a ) )\n\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\n\n// expects values in the range of [0,1]x[0,1], returns values in the [0,1] range.\n// do not collapse into a single function per: http://byteblacksmith.com/improvements-to-the-canonical-one-liner-glsl-rand-for-opengl-es-2-0/\nhighp float rand( const in vec2 uv ) {\n\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\n\treturn fract( sin( sn ) * c );\n\n}\n\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\n\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\n\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\n\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n#ifdef USE_CLEARCOAT\n\tvec3 clearcoatNormal;\n#endif\n};\n\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n}\n\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t// dir can be either a direction vector or a normal vector\n\t// upper-left 3x3 of matrix is assumed to be orthogonal\n\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n\n}\n\nmat3 transposeMat3( const in mat3 m ) {\n\n\tmat3 tmp;\n\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\n\treturn tmp;\n\n}\n\n// https://en.wikipedia.org/wiki/Relative_luminance\nfloat linearToRelativeLuminance( const in vec3 color ) {\n\n\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\n\n\treturn dot( weights, color.rgb );\n\n}\n\nbool isPerspectiveMatrix( mat4 m ) {\n\n\treturn m[ 2 ][ 3 ] == - 1.0;\n\n}\n\nvec2 equirectUv( in vec3 dir ) {\n\n\t// dir is assumed to be unit length\n\n\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n\n\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\n\treturn vec2( u, v );\n\n}\n`;\n","export default /* glsl */`\n#ifdef ENVMAP_TYPE_CUBE_UV\n\n\t#define cubeUV_maxMipLevel 8.0\n\t#define cubeUV_minMipLevel 4.0\n\t#define cubeUV_maxTileSize 256.0\n\t#define cubeUV_minTileSize 16.0\n\n\t// These shader functions convert between the UV coordinates of a single face of\n\t// a cubemap, the 0-5 integer index of a cube face, and the direction vector for\n\t// sampling a textureCube (not generally normalized ).\n\n\tfloat getFace( vec3 direction ) {\n\n\t\tvec3 absDirection = abs( direction );\n\n\t\tfloat face = - 1.0;\n\n\t\tif ( absDirection.x > absDirection.z ) {\n\n\t\t\tif ( absDirection.x > absDirection.y )\n\n\t\t\t\tface = direction.x > 0.0 ? 0.0 : 3.0;\n\n\t\t\telse\n\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\n\t\t} else {\n\n\t\t\tif ( absDirection.z > absDirection.y )\n\n\t\t\t\tface = direction.z > 0.0 ? 2.0 : 5.0;\n\n\t\t\telse\n\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\n\t\t}\n\n\t\treturn face;\n\n\t}\n\n\t// RH coordinate system; PMREM face-indexing convention\n\tvec2 getUV( vec3 direction, float face ) {\n\n\t\tvec2 uv;\n\n\t\tif ( face == 0.0 ) {\n\n\t\t\tuv = vec2( direction.z, direction.y ) / abs( direction.x ); // pos x\n\n\t\t} else if ( face == 1.0 ) {\n\n\t\t\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y ); // pos y\n\n\t\t} else if ( face == 2.0 ) {\n\n\t\t\tuv = vec2( - direction.x, direction.y ) / abs( direction.z ); // pos z\n\n\t\t} else if ( face == 3.0 ) {\n\n\t\t\tuv = vec2( - direction.z, direction.y ) / abs( direction.x ); // neg x\n\n\t\t} else if ( face == 4.0 ) {\n\n\t\t\tuv = vec2( - direction.x, direction.z ) / abs( direction.y ); // neg y\n\n\t\t} else {\n\n\t\t\tuv = vec2( direction.x, direction.y ) / abs( direction.z ); // neg z\n\n\t\t}\n\n\t\treturn 0.5 * ( uv + 1.0 );\n\n\t}\n\n\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\n\n\t\tfloat face = getFace( direction );\n\n\t\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\n\n\t\tmipInt = max( mipInt, cubeUV_minMipLevel );\n\n\t\tfloat faceSize = exp2( mipInt );\n\n\t\tfloat texelSize = 1.0 / ( 3.0 * cubeUV_maxTileSize );\n\n\t\tvec2 uv = getUV( direction, face ) * ( faceSize - 1.0 ) + 0.5;\n\n\t\tif ( face > 2.0 ) {\n\n\t\t\tuv.y += faceSize;\n\n\t\t\tface -= 3.0;\n\n\t\t}\n\n\t\tuv.x += face * faceSize;\n\n\t\tif ( mipInt < cubeUV_maxMipLevel ) {\n\n\t\t\tuv.y += 2.0 * cubeUV_maxTileSize;\n\n\t\t}\n\n\t\tuv.y += filterInt * 2.0 * cubeUV_minTileSize;\n\n\t\tuv.x += 3.0 * max( 0.0, cubeUV_maxTileSize - 2.0 * faceSize );\n\n\t\tuv *= texelSize;\n\n\t\treturn texture2D( envMap, uv ).rgb;\n\n\t}\n\n\t// These defines must match with PMREMGenerator\n\n\t#define r0 1.0\n\t#define v0 0.339\n\t#define m0 - 2.0\n\t#define r1 0.8\n\t#define v1 0.276\n\t#define m1 - 1.0\n\t#define r4 0.4\n\t#define v4 0.046\n\t#define m4 2.0\n\t#define r5 0.305\n\t#define v5 0.016\n\t#define m5 3.0\n\t#define r6 0.21\n\t#define v6 0.0038\n\t#define m6 4.0\n\n\tfloat roughnessToMip( float roughness ) {\n\n\t\tfloat mip = 0.0;\n\n\t\tif ( roughness >= r1 ) {\n\n\t\t\tmip = ( r0 - roughness ) * ( m1 - m0 ) / ( r0 - r1 ) + m0;\n\n\t\t} else if ( roughness >= r4 ) {\n\n\t\t\tmip = ( r1 - roughness ) * ( m4 - m1 ) / ( r1 - r4 ) + m1;\n\n\t\t} else if ( roughness >= r5 ) {\n\n\t\t\tmip = ( r4 - roughness ) * ( m5 - m4 ) / ( r4 - r5 ) + m4;\n\n\t\t} else if ( roughness >= r6 ) {\n\n\t\t\tmip = ( r5 - roughness ) * ( m6 - m5 ) / ( r5 - r6 ) + m5;\n\n\t\t} else {\n\n\t\t\tmip = - 2.0 * log2( 1.16 * roughness ); // 1.16 = 1.79^0.25\n\t\t}\n\n\t\treturn mip;\n\n\t}\n\n\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\n\n\t\tfloat mip = clamp( roughnessToMip( roughness ), m0, cubeUV_maxMipLevel );\n\n\t\tfloat mipF = fract( mip );\n\n\t\tfloat mipInt = floor( mip );\n\n\t\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\n\n\t\tif ( mipF == 0.0 ) {\n\n\t\t\treturn vec4( color0, 1.0 );\n\n\t\t} else {\n\n\t\t\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\n\n\t\t\treturn vec4( mix( color0, color1, mipF ), 1.0 );\n\n\t\t}\n\n\t}\n\n#endif\n`;\n","export default /* glsl */`\nvec3 transformedNormal = objectNormal;\n\n#ifdef USE_INSTANCING\n\n\t// this is in lieu of a per-instance normal-matrix\n\t// shear transforms in the instance matrix are not supported\n\n\tmat3 m = mat3( instanceMatrix );\n\n\ttransformedNormal /= vec3( dot( m[ 0 ], m[ 0 ] ), dot( m[ 1 ], m[ 1 ] ), dot( m[ 2 ], m[ 2 ] ) );\n\n\ttransformedNormal = m * transformedNormal;\n\n#endif\n\ntransformedNormal = normalMatrix * transformedNormal;\n\n#ifdef FLIP_SIDED\n\n\ttransformedNormal = - transformedNormal;\n\n#endif\n\n#ifdef USE_TANGENT\n\n\tvec3 transformedTangent = ( modelViewMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\n\t#ifdef FLIP_SIDED\n\n\t\ttransformedTangent = - transformedTangent;\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_DISPLACEMENTMAP\n\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_DISPLACEMENTMAP\n\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vUv ).x * displacementScale + displacementBias );\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_EMISSIVEMAP\n\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_EMISSIVEMAP\n\n\tuniform sampler2D emissiveMap;\n\n#endif\n`;\n","export default /* glsl */`\ngl_FragColor = linearToOutputTexel( gl_FragColor );\n`;\n","export default /* glsl */`\n\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\n\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\n}\n\n`;\n","export default /* glsl */`\n#ifdef USE_ENVMAP\n\n\t#ifdef ENV_WORLDPOS\n\n\t\tvec3 cameraToFrag;\n\n\t\tif ( isOrthographic ) {\n\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\n\t\t} else {\n\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\n\t\t}\n\n\t\t// Transforming Normal Vectors with the Inverse Transformation\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\n\t\t#else\n\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\n\t\t#endif\n\n\t#else\n\n\t\tvec3 reflectVec = vReflect;\n\n\t#endif\n\n\t#ifdef ENVMAP_TYPE_CUBE\n\n\t\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\n\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\n\t\tvec4 envColor = textureCubeUV( envMap, reflectVec, 0.0 );\n\n\t#else\n\n\t\tvec4 envColor = vec4( 0.0 );\n\n\t#endif\n\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_ENVMAP\n\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\t\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_ENVMAP\n\n\tuniform float reflectivity;\n\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\n\t\t#define ENV_WORLDPOS\n\n\t#endif\n\n\t#ifdef ENV_WORLDPOS\n\n\t\tvarying vec3 vWorldPosition;\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_ENVMAP\n\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) ||defined( PHONG )\n\n\t\t#define ENV_WORLDPOS\n\n\t#endif\n\n\t#ifdef ENV_WORLDPOS\n\t\t\n\t\tvarying vec3 vWorldPosition;\n\n\t#else\n\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n#if defined( USE_ENVMAP )\n\n\t#ifdef ENVMAP_MODE_REFRACTION\n\n\t\tuniform float refractionRatio;\n\n\t#endif\n\n\tvec3 getIBLIrradiance( const in vec3 normal ) {\n\n\t\t#if defined( ENVMAP_TYPE_CUBE_UV )\n\n\t\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, worldNormal, 1.0 );\n\n\t\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\n\t\t#else\n\n\t\t\treturn vec3( 0.0 );\n\n\t\t#endif\n\n\t}\n\n\tvec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {\n\n\t\t#if defined( ENVMAP_TYPE_CUBE_UV )\n\n\t\t\tvec3 reflectVec;\n\n\t\t\t#ifdef ENVMAP_MODE_REFLECTION\n\n\t\t\t\treflectVec = reflect( - viewDir, normal );\n\n\t\t\t\t// Mixing the reflection with the normal is more accurate and keeps rough objects from gathering light from behind their tangent plane.\n\t\t\t\treflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\n\n\t\t\t#else\n\n\t\t\t\treflectVec = refract( - viewDir, normal, refractionRatio );\n\n\t\t\t#endif\n\n\t\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, reflectVec, roughness );\n\n\t\t\treturn envMapColor.rgb * envMapIntensity;\n\n\t\t#else\n\n\t\t\treturn vec3( 0.0 );\n\n\t\t#endif\n\n\t}\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_ENVMAP\n\n\t#ifdef ENV_WORLDPOS\n\n\t\tvWorldPosition = worldPosition.xyz;\n\n\t#else\n\n\t\tvec3 cameraToVertex;\n\n\t\tif ( isOrthographic ) {\n\n\t\t\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\n\t\t} else {\n\n\t\t\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\n\t\t}\n\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\n\t\t#else\n\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\n\t\t#endif\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_FOG\n\n\tvFogDepth = - mvPosition.z;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_FOG\n\n\tvarying float vFogDepth;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_FOG\n\n\t#ifdef FOG_EXP2\n\n\t\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth );\n\n\t#else\n\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, vFogDepth );\n\n\t#endif\n\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_FOG\n\n\tuniform vec3 fogColor;\n\tvarying float vFogDepth;\n\n\t#ifdef FOG_EXP2\n\n\t\tuniform float fogDensity;\n\n\t#else\n\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n\n#ifdef USE_GRADIENTMAP\n\n\tuniform sampler2D gradientMap;\n\n#endif\n\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\n\t// dotNL will be from -1.0 to 1.0\n\tfloat dotNL = dot( normal, lightDirection );\n\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\n\t#ifdef USE_GRADIENTMAP\n\n\t\treturn vec3( texture2D( gradientMap, coord ).r );\n\n\t#else\n\n\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\n\t#endif\n\n}\n`;\n","export default /* glsl */`\n#ifdef USE_LIGHTMAP\n\n\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\n\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\n\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\n\t\tlightMapIrradiance *= PI;\n\n\t#endif\n\n\treflectedLight.indirectDiffuse += lightMapIrradiance;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_LIGHTMAP\n\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n\n#endif\n`;\n","export default /* glsl */`\nvec3 diffuse = vec3( 1.0 );\n\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( -mvPosition.xyz );\n\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\n\nvLightFront = vec3( 0.0 );\nvIndirectFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n\tvIndirectBack = vec3( 0.0 );\n#endif\n\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\n\nvIndirectFront += getAmbientLightIrradiance( ambientLightColor );\n\nvIndirectFront += getLightProbeIrradiance( lightProbe, geometry.normal );\n\n#ifdef DOUBLE_SIDED\n\n\tvIndirectBack += getAmbientLightIrradiance( ambientLightColor );\n\n\tvIndirectBack += getLightProbeIrradiance( lightProbe, backGeometry.normal );\n\n#endif\n\n#if NUM_POINT_LIGHTS > 0\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\n\t\tgetPointLightInfo( pointLights[ i ], geometry, directLight );\n\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = directLight.color;\n\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\n\t\t#ifdef DOUBLE_SIDED\n\n\t\t\tvLightBack += saturate( - dotNL ) * directLightColor_Diffuse;\n\n\t\t#endif\n\n\t}\n\t#pragma unroll_loop_end\n\n#endif\n\n#if NUM_SPOT_LIGHTS > 0\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\n\t\tgetSpotLightInfo( spotLights[ i ], geometry, directLight );\n\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = directLight.color;\n\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\n\t\t#ifdef DOUBLE_SIDED\n\n\t\t\tvLightBack += saturate( - dotNL ) * directLightColor_Diffuse;\n\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n\n#endif\n\n#if NUM_DIR_LIGHTS > 0\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\n\t\tgetDirectionalLightInfo( directionalLights[ i ], geometry, directLight );\n\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = directLight.color;\n\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\n\t\t#ifdef DOUBLE_SIDED\n\n\t\t\tvLightBack += saturate( - dotNL ) * directLightColor_Diffuse;\n\n\t\t#endif\n\n\t}\n\t#pragma unroll_loop_end\n\n#endif\n\n#if NUM_HEMI_LIGHTS > 0\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\n\t\tvIndirectFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry.normal );\n\n\t\t#ifdef DOUBLE_SIDED\n\n\t\t\tvIndirectBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry.normal );\n\n\t\t#endif\n\n\t}\n\t#pragma unroll_loop_end\n\n#endif\n`;\n","export default /* glsl */`\nuniform bool receiveShadow;\nuniform vec3 ambientLightColor;\nuniform vec3 lightProbe[ 9 ];\n\n// get the irradiance (radiance convolved with cosine lobe) at the point 'normal' on the unit sphere\n// source: https://graphics.stanford.edu/papers/envmap/envmap.pdf\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n\n\t// normal is assumed to have unit length\n\n\tfloat x = normal.x, y = normal.y, z = normal.z;\n\n\t// band 0\n\tvec3 result = shCoefficients[ 0 ] * 0.886227;\n\n\t// band 1\n\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n\n\t// band 2\n\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n\n\treturn result;\n\n}\n\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) {\n\n\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\n\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n\n\treturn irradiance;\n\n}\n\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\n\tvec3 irradiance = ambientLightColor;\n\n\treturn irradiance;\n\n}\n\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\n\t#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\n\t\t// based upon Frostbite 3 Moving to Physically-based Rendering\n\t\t// page 32, equation 26: E[window1]\n\t\t// https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf\n\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\n\t\tif ( cutoffDistance > 0.0 ) {\n\n\t\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\n\t\t}\n\n\t\treturn distanceFalloff;\n\n\t#else\n\n\t\tif ( cutoffDistance > 0.0 && decayExponent > 0.0 ) {\n\n\t\t\treturn pow( saturate( - lightDistance / cutoffDistance + 1.0 ), decayExponent );\n\n\t\t}\n\n\t\treturn 1.0;\n\n\t#endif\n\n}\n\nfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\n\n\treturn smoothstep( coneCosine, penumbraCosine, angleCosine );\n\n}\n\n#if NUM_DIR_LIGHTS > 0\n\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t};\n\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\n\tvoid getDirectionalLightInfo( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight light ) {\n\n\t\tlight.color = directionalLight.color;\n\t\tlight.direction = directionalLight.direction;\n\t\tlight.visible = true;\n\n\t}\n\n#endif\n\n\n#if NUM_POINT_LIGHTS > 0\n\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t};\n\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\n\t// light is an out parameter as having it as a return value caused compiler errors on some devices\n\tvoid getPointLightInfo( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight light ) {\n\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\n\t\tlight.direction = normalize( lVector );\n\n\t\tfloat lightDistance = length( lVector );\n\n\t\tlight.color = pointLight.color;\n\t\tlight.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );\n\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\n\t}\n\n#endif\n\n\n#if NUM_SPOT_LIGHTS > 0\n\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t};\n\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\n\t// light is an out parameter as having it as a return value caused compiler errors on some devices\n\tvoid getSpotLightInfo( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight light ) {\n\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\n\t\tlight.direction = normalize( lVector );\n\n\t\tfloat angleCos = dot( light.direction, spotLight.direction );\n\n\t\tfloat spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\n\t\tif ( spotAttenuation > 0.0 ) {\n\n\t\t\tfloat lightDistance = length( lVector );\n\n\t\t\tlight.color = spotLight.color * spotAttenuation;\n\t\t\tlight.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\n\t\t} else {\n\n\t\t\tlight.color = vec3( 0.0 );\n\t\t\tlight.visible = false;\n\n\t\t}\n\n\t}\n\n#endif\n\n\n#if NUM_RECT_AREA_LIGHTS > 0\n\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\n\t// Pre-computed values of LinearTransformedCosine approximation of BRDF\n\t// BRDF approximation Texture is 64x64\n\tuniform sampler2D ltc_1; // RGBA Float\n\tuniform sampler2D ltc_2; // RGBA Float\n\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n\n#endif\n\n\n#if NUM_HEMI_LIGHTS > 0\n\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in vec3 normal ) {\n\n\t\tfloat dotNL = dot( normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\n\t\treturn irradiance;\n\n\t}\n\n#endif\n`;\n","export default /* glsl */`\nToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\n`;\n","export default /* glsl */`\nvarying vec3 vViewPosition;\n\nstruct ToonMaterial {\n\n\tvec3 diffuseColor;\n\n};\n\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\n\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\n}\n\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\n}\n\n#define RE_Direct\t\t\t\tRE_Direct_Toon\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Toon\n\n#define Material_LightProbeLOD( material )\t(0)\n`;\n","export default /* glsl */`\nBlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;\n`;\n","export default /* glsl */`\nvarying vec3 vViewPosition;\n\nstruct BlinnPhongMaterial {\n\n\tvec3 diffuseColor;\n\tvec3 specularColor;\n\tfloat specularShininess;\n\tfloat specularStrength;\n\n};\n\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\n\treflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometry.viewDir, geometry.normal, material.specularColor, material.specularShininess ) * material.specularStrength;\n\n}\n\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\n}\n\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n\n#define Material_LightProbeLOD( material )\t(0)\n`;\n","export default /* glsl */`\nPhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\n\nvec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\n\nmaterial.roughness = max( roughnessFactor, 0.0525 );// 0.0525 corresponds to the base mip of a 256 cubemap.\nmaterial.roughness += geometryRoughness;\nmaterial.roughness = min( material.roughness, 1.0 );\n\n#ifdef IOR\n\n\t#ifdef SPECULAR\n\n\t\tfloat specularIntensityFactor = specularIntensity;\n\t\tvec3 specularColorFactor = specularColor;\n\n\t\t#ifdef USE_SPECULARINTENSITYMAP\n\n\t\t\tspecularIntensityFactor *= texture2D( specularIntensityMap, vUv ).a;\n\n\t\t#endif\n\n\t\t#ifdef USE_SPECULARCOLORMAP\n\n\t\t\tspecularColorFactor *= texture2D( specularColorMap, vUv ).rgb;\n\n\t\t#endif\n\n\t\tmaterial.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\n\n\t#else\n\n\t\tfloat specularIntensityFactor = 1.0;\n\t\tvec3 specularColorFactor = vec3( 1.0 );\n\t\tmaterial.specularF90 = 1.0;\n\n\t#endif\n\n\tmaterial.specularColor = mix( min( pow2( ( ior - 1.0 ) / ( ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor );\n\n#else\n\n\tmaterial.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.specularF90 = 1.0;\n\n#endif\n\n#ifdef USE_CLEARCOAT\n\n\tmaterial.clearcoat = clearcoat;\n\tmaterial.clearcoatRoughness = clearcoatRoughness;\n\tmaterial.clearcoatF0 = vec3( 0.04 );\n\tmaterial.clearcoatF90 = 1.0;\n\n\t#ifdef USE_CLEARCOATMAP\n\n\t\tmaterial.clearcoat *= texture2D( clearcoatMap, vUv ).x;\n\n\t#endif\n\n\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\n\t\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vUv ).y;\n\n\t#endif\n\n\tmaterial.clearcoat = saturate( material.clearcoat ); // Burley clearcoat model\n\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\n\tmaterial.clearcoatRoughness += geometryRoughness;\n\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\n\n#endif\n\n#ifdef USE_SHEEN\n\n\tmaterial.sheenColor = sheenColor;\n\n\t#ifdef USE_SHEENCOLORMAP\n\n\t\tmaterial.sheenColor *= texture2D( sheenColorMap, vUv ).rgb;\n\n\t#endif\n\n\tmaterial.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 );\n\n\t#ifdef USE_SHEENROUGHNESSMAP\n\n\t\tmaterial.sheenRoughness *= texture2D( sheenRoughnessMap, vUv ).a;\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\nstruct PhysicalMaterial {\n\n\tvec3 diffuseColor;\n\tfloat roughness;\n\tvec3 specularColor;\n\tfloat specularF90;\n\n\t#ifdef USE_CLEARCOAT\n\t\tfloat clearcoat;\n\t\tfloat clearcoatRoughness;\n\t\tvec3 clearcoatF0;\n\t\tfloat clearcoatF90;\n\t#endif\n\n\t#ifdef USE_SHEEN\n\t\tvec3 sheenColor;\n\t\tfloat sheenRoughness;\n\t#endif\n\n};\n\n// temporary\nvec3 clearcoatSpecular = vec3( 0.0 );\nvec3 sheenSpecular = vec3( 0.0 );\n\n// This is a curve-fit approxmation to the \"Charlie sheen\" BRDF integrated over the hemisphere from \n// Estevez and Kulla 2017, \"Production Friendly Microfacet Sheen BRDF\". The analysis can be found\n// in the Sheen section of https://drive.google.com/file/d/1T0D1VSyR4AllqIJTQAraEIzjlb5h4FKH/view?usp=sharing\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness) {\n\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\n\tfloat r2 = roughness * roughness;\n\n\tfloat a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95;\n\n\tfloat b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72;\n\n\tfloat DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) );\n\n\treturn saturate( DG * RECIPROCAL_PI );\n\n}\n\n// Analytical approximation of the DFG LUT, one half of the\n// split-sum approximation used in indirect specular lighting.\n// via 'environmentBRDF' from \"Physically Based Shading on Mobile\"\n// https://www.unrealengine.com/blog/physically-based-shading-on-mobile\nvec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\n\tvec4 r = roughness * c0 + c1;\n\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\n\tvec2 fab = vec2( - 1.04, 1.04 ) * a004 + r.zw;\n\n\treturn fab;\n\n}\n\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\n\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\n\treturn specularColor * fab.x + specularF90 * fab.y;\n\n}\n\n// Fdez-Agüera's \"Multiple-Scattering Microfacet Model for Real-Time Image Based Lighting\"\n// Approximates multiscattering in order to preserve energy.\n// http://www.jcgt.org/published/0008/01/03/\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\n\tvec3 FssEss = specularColor * fab.x + specularF90 * fab.y;\n\n\tfloat Ess = fab.x + fab.y;\n\tfloat Ems = 1.0 - Ess;\n\n\tvec3 Favg = specularColor + ( 1.0 - specularColor ) * 0.047619; // 1/21\n\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n\n}\n\n#if NUM_RECT_AREA_LIGHTS > 0\n\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.roughness;\n\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight; // counterclockwise; light shines in local neg z direction\n\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3(    0, 1,    0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\n\t\t// LTC Fresnel Approximation by Stephen Hill\n\t\t// http://blog.selfshadow.com/publications/s2016-advances/s2016_ltc_fresnel.pdf\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\n\t}\n\n#endif\n\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\n\tvec3 irradiance = dotNL * directLight.color;\n\n\t#ifdef USE_CLEARCOAT\n\n\t\tfloat dotNLcc = saturate( dot( geometry.clearcoatNormal, directLight.direction ) );\n\n\t\tvec3 ccIrradiance = dotNLcc * directLight.color;\n\n\t\tclearcoatSpecular += ccIrradiance * BRDF_GGX( directLight.direction, geometry.viewDir, geometry.clearcoatNormal, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\n\t#endif\n\n\t#ifdef USE_SHEEN\n\n\t\tsheenSpecular += irradiance * BRDF_Sheen( directLight.direction, geometry.viewDir, geometry.normal, material.sheenColor, material.sheenRoughness );\n\n\t#endif\n\n\treflectedLight.directSpecular += irradiance * BRDF_GGX( directLight.direction, geometry.viewDir, geometry.normal, material.specularColor, material.specularF90, material.roughness );\n\n\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\n}\n\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\n\t#ifdef USE_CLEARCOAT\n\n\t\tclearcoatSpecular += clearcoatRadiance * EnvironmentBRDF( geometry.clearcoatNormal, geometry.viewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\n\t#endif\n\n\t#ifdef USE_SHEEN\n\n\t\tsheenSpecular += irradiance * material.sheenColor * IBLSheenBRDF( geometry.normal, geometry.viewDir, material.sheenRoughness );\n\n\t#endif\n\n\t// Both indirect specular and indirect diffuse light accumulate here\n\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\n\tcomputeMultiscattering( geometry.normal, geometry.viewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );\n\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - ( singleScattering + multiScattering ) );\n\n\treflectedLight.indirectSpecular += radiance * singleScattering;\n\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n\n\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n\n}\n\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\n\n// ref: https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n\n}\n`;\n","export default /* glsl */`\n/**\n * This is a template that can be used to light a material, it uses pluggable\n * RenderEquations (RE)for specific lighting scenarios.\n *\n * Instructions for use:\n * - Ensure that both RE_Direct, RE_IndirectDiffuse and RE_IndirectSpecular are defined\n * - If you have defined an RE_IndirectSpecular, you need to also provide a Material_LightProbeLOD. <---- ???\n * - Create a material parameter that is to be passed as the third parameter to your lighting functions.\n *\n * TODO:\n * - Add area light support.\n * - Add sphere light support.\n * - Add diffuse light probe (irradiance cubemap) support.\n */\n\nGeometricContext geometry;\n\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\n\n#ifdef USE_CLEARCOAT\n\n\tgeometry.clearcoatNormal = clearcoatNormal;\n\n#endif\n\nIncidentLight directLight;\n\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\n\t\tpointLight = pointLights[ i ];\n\n\t\tgetPointLightInfo( pointLight, geometry, directLight );\n\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\n\t}\n\t#pragma unroll_loop_end\n\n#endif\n\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\n\tSpotLight spotLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\n\t\tspotLight = spotLights[ i ];\n\n\t\tgetSpotLightInfo( spotLight, geometry, directLight );\n\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\n\t}\n\t#pragma unroll_loop_end\n\n#endif\n\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\n\t\tdirectionalLight = directionalLights[ i ];\n\n\t\tgetDirectionalLightInfo( directionalLight, geometry, directLight );\n\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\n\t}\n\t#pragma unroll_loop_end\n\n#endif\n\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\n\tRectAreaLight rectAreaLight;\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\n\t}\n\t#pragma unroll_loop_end\n\n#endif\n\n#if defined( RE_IndirectDiffuse )\n\n\tvec3 iblIrradiance = vec3( 0.0 );\n\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\n\tirradiance += getLightProbeIrradiance( lightProbe, geometry.normal );\n\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry.normal );\n\n\t\t}\n\t\t#pragma unroll_loop_end\n\n\t#endif\n\n#endif\n\n#if defined( RE_IndirectSpecular )\n\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n\n#endif\n`;\n","export default /* glsl */`\n#if defined( RE_IndirectDiffuse )\n\n\t#ifdef USE_LIGHTMAP\n\n\t\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\n\t\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\n\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\n\t\t\tlightMapIrradiance *= PI;\n\n\t\t#endif\n\n\t\tirradiance += lightMapIrradiance;\n\n\t#endif\n\n\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\n\n\t\tiblIrradiance += getIBLIrradiance( geometry.normal );\n\n\t#endif\n\n#endif\n\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\n\tradiance += getIBLRadiance( geometry.viewDir, geometry.normal, material.roughness );\n\n\t#ifdef USE_CLEARCOAT\n\n\t\tclearcoatRadiance += getIBLRadiance( geometry.viewDir, geometry.clearcoatNormal, material.clearcoatRoughness );\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n#if defined( RE_IndirectDiffuse )\n\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n\n#endif\n\n#if defined( RE_IndirectSpecular )\n\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometry, material, reflectedLight );\n\n#endif\n`;\n","export default /* glsl */`\n#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\n\t// Doing a strict comparison with == 1.0 can cause noise artifacts\n\t// on some platforms. See issue #17623.\n\tgl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n\n#endif\n`;\n","export default /* glsl */`\n#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_LOGDEPTHBUF\n\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\n\t\tvarying float vFragDepth;\n\t\tvarying float vIsPerspective;\n\n\t#else\n\n\t\tuniform float logDepthBufFC;\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_LOGDEPTHBUF\n\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\n\n\t#else\n\n\t\tif ( isPerspectiveMatrix( projectionMatrix ) ) {\n\n\t\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\n\t\t\tgl_Position.z *= gl_Position.w;\n\n\t\t}\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_MAP\n\n\tvec4 sampledDiffuseColor = texture2D( map, vUv );\n\n\t#ifdef DECODE_VIDEO_TEXTURE\n\n\t\t// inline sRGB decode (TODO: Remove this code when https://crbug.com/1256340 is solved)\n\n\t\tsampledDiffuseColor = vec4( mix( pow( sampledDiffuseColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), sampledDiffuseColor.rgb * 0.0773993808, vec3( lessThanEqual( sampledDiffuseColor.rgb, vec3( 0.04045 ) ) ) ), sampledDiffuseColor.w );\n\n\t#endif\n\n\tdiffuseColor *= sampledDiffuseColor;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_MAP\n\n\tuniform sampler2D map;\n\n#endif\n`;\n","export default /* glsl */`\n#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\n\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n\n#endif\n\n#ifdef USE_MAP\n\n\tdiffuseColor *= texture2D( map, uv );\n\n#endif\n\n#ifdef USE_ALPHAMAP\n\n\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\n\n#endif\n`;\n","export default /* glsl */`\n#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\n\tuniform mat3 uvTransform;\n\n#endif\n\n#ifdef USE_MAP\n\n\tuniform sampler2D map;\n\n#endif\n\n#ifdef USE_ALPHAMAP\n\n\tuniform sampler2D alphaMap;\n\n#endif\n`;\n","export default /* glsl */`\nfloat metalnessFactor = metalness;\n\n#ifdef USE_METALNESSMAP\n\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\n\t// reads channel B, compatible with a combined OcclusionRoughnessMetallic (RGB) texture\n\tmetalnessFactor *= texelMetalness.b;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_METALNESSMAP\n\n\tuniform sampler2D metalnessMap;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_MORPHNORMALS\n\n\t// morphTargetBaseInfluence is set based on BufferGeometry.morphTargetsRelative value:\n\t// When morphTargetsRelative is false, this is set to 1 - sum(influences); this results in normal = sum((target - base) * influence)\n\t// When morphTargetsRelative is true, this is set to 1; as a result, all morph targets are simply added to the base after weighting\n\tobjectNormal *= morphTargetBaseInfluence;\n\n\t#ifdef MORPHTARGETS_TEXTURE\n\n\t\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1, 2 ) * morphTargetInfluences[ i ];\n\n\t\t}\n\n\t#else\n\n\t\tobjectNormal += morphNormal0 * morphTargetInfluences[ 0 ];\n\t\tobjectNormal += morphNormal1 * morphTargetInfluences[ 1 ];\n\t\tobjectNormal += morphNormal2 * morphTargetInfluences[ 2 ];\n\t\tobjectNormal += morphNormal3 * morphTargetInfluences[ 3 ];\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_MORPHTARGETS\n\n\tuniform float morphTargetBaseInfluence;\n\n\t#ifdef MORPHTARGETS_TEXTURE\n\n\t\tuniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];\n\t\tuniform sampler2DArray morphTargetsTexture;\n\t\tuniform vec2 morphTargetsTextureSize;\n\n\t\tvec3 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset, const in int stride ) {\n\n\t\t\tfloat texelIndex = float( vertexIndex * stride + offset );\n\t\t\tfloat y = floor( texelIndex / morphTargetsTextureSize.x );\n\t\t\tfloat x = texelIndex - y * morphTargetsTextureSize.x;\n\n\t\t\tvec3 morphUV = vec3( ( x + 0.5 ) / morphTargetsTextureSize.x, y / morphTargetsTextureSize.y, morphTargetIndex );\n\t\t\treturn texture( morphTargetsTexture, morphUV ).xyz;\n\n\t\t}\n\n\t#else\n\n\t\t#ifndef USE_MORPHNORMALS\n\n\t\t\tuniform float morphTargetInfluences[ 8 ];\n\n\t\t#else\n\n\t\t\tuniform float morphTargetInfluences[ 4 ];\n\n\t\t#endif\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_MORPHTARGETS\n\n\t// morphTargetBaseInfluence is set based on BufferGeometry.morphTargetsRelative value:\n\t// When morphTargetsRelative is false, this is set to 1 - sum(influences); this results in position = sum((target - base) * influence)\n\t// When morphTargetsRelative is true, this is set to 1; as a result, all morph targets are simply added to the base after weighting\n\ttransformed *= morphTargetBaseInfluence;\n\n\t#ifdef MORPHTARGETS_TEXTURE\n\n\t\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\n\t\t\t#ifndef USE_MORPHNORMALS\n\n\t\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0, 1 ) * morphTargetInfluences[ i ];\n\n\t\t\t#else\n\n\t\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0, 2 ) * morphTargetInfluences[ i ];\n\n\t\t\t#endif\n\n\t\t}\n\n\t#else\n\n\t\ttransformed += morphTarget0 * morphTargetInfluences[ 0 ];\n\t\ttransformed += morphTarget1 * morphTargetInfluences[ 1 ];\n\t\ttransformed += morphTarget2 * morphTargetInfluences[ 2 ];\n\t\ttransformed += morphTarget3 * morphTargetInfluences[ 3 ];\n\n\t\t#ifndef USE_MORPHNORMALS\n\n\t\t\ttransformed += morphTarget4 * morphTargetInfluences[ 4 ];\n\t\t\ttransformed += morphTarget5 * morphTargetInfluences[ 5 ];\n\t\t\ttransformed += morphTarget6 * morphTargetInfluences[ 6 ];\n\t\t\ttransformed += morphTarget7 * morphTargetInfluences[ 7 ];\n\n\t\t#endif\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\nfloat faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\n\n#ifdef FLAT_SHADED\n\n\t// Workaround for Adreno GPUs not able to do dFdx( vViewPosition )\n\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n\n#else\n\n\tvec3 normal = normalize( vNormal );\n\n\t#ifdef DOUBLE_SIDED\n\n\t\tnormal = normal * faceDirection;\n\n\t#endif\n\n\t#ifdef USE_TANGENT\n\n\t\tvec3 tangent = normalize( vTangent );\n\t\tvec3 bitangent = normalize( vBitangent );\n\n\t\t#ifdef DOUBLE_SIDED\n\n\t\t\ttangent = tangent * faceDirection;\n\t\t\tbitangent = bitangent * faceDirection;\n\n\t\t#endif\n\n\t\t#if defined( TANGENTSPACE_NORMALMAP ) || defined( USE_CLEARCOAT_NORMALMAP )\n\n\t\t\tmat3 vTBN = mat3( tangent, bitangent, normal );\n\n\t\t#endif\n\n\t#endif\n\n#endif\n\n// non perturbed normal for clearcoat among others\n\nvec3 geometryNormal = normal;\n\n`;\n","export default /* glsl */`\n\n#ifdef OBJECTSPACE_NORMALMAP\n\n\tnormal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0; // overrides both flatShading and attribute normals\n\n\t#ifdef FLIP_SIDED\n\n\t\tnormal = - normal;\n\n\t#endif\n\n\t#ifdef DOUBLE_SIDED\n\n\t\tnormal = normal * faceDirection;\n\n\t#endif\n\n\tnormal = normalize( normalMatrix * normal );\n\n#elif defined( TANGENTSPACE_NORMALMAP )\n\n\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\tmapN.xy *= normalScale;\n\n\t#ifdef USE_TANGENT\n\n\t\tnormal = normalize( vTBN * mapN );\n\n\t#else\n\n\t\tnormal = perturbNormal2Arb( - vViewPosition, normal, mapN, faceDirection );\n\n\t#endif\n\n#elif defined( USE_BUMPMAP )\n\n\tnormal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\n\n#endif\n`;\n","export default /* glsl */`\n#ifndef FLAT_SHADED\n\n\tvarying vec3 vNormal;\n\n\t#ifdef USE_TANGENT\n\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n#ifndef FLAT_SHADED\n\n\tvarying vec3 vNormal;\n\n\t#ifdef USE_TANGENT\n\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n#ifndef FLAT_SHADED // normal is computed with derivatives when FLAT_SHADED\n\n\tvNormal = normalize( transformedNormal );\n\n\t#ifdef USE_TANGENT\n\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_NORMALMAP\n\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n\n#endif\n\n#ifdef OBJECTSPACE_NORMALMAP\n\n\tuniform mat3 normalMatrix;\n\n#endif\n\n#if ! defined ( USE_TANGENT ) && ( defined ( TANGENTSPACE_NORMALMAP ) || defined ( USE_CLEARCOAT_NORMALMAP ) )\n\n\t// Normal Mapping Without Precomputed Tangents\n\t// http://www.thetenthplanet.de/archives/1180\n\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm, vec3 mapN, float faceDirection ) {\n\n\t\t// Workaround for Adreno 3XX dFd*( vec3 ) bug. See #9988\n\n\t\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\n\t\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\n\t\tvec3 N = surf_norm; // normalized\n\n\t\tvec3 q1perp = cross( q1, N );\n\t\tvec3 q0perp = cross( N, q0 );\n\n\t\tvec3 T = q1perp * st0.x + q0perp * st1.x;\n\t\tvec3 B = q1perp * st0.y + q0perp * st1.y;\n\n\t\tfloat det = max( dot( T, T ), dot( B, B ) );\n\t\tfloat scale = ( det == 0.0 ) ? 0.0 : faceDirection * inversesqrt( det );\n\n\t\treturn normalize( T * ( mapN.x * scale ) + B * ( mapN.y * scale ) + N * mapN.z );\n\n\t}\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_CLEARCOAT\n\n\tvec3 clearcoatNormal = geometryNormal;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_CLEARCOAT_NORMALMAP\n\n\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vUv ).xyz * 2.0 - 1.0;\n\tclearcoatMapN.xy *= clearcoatNormalScale;\n\n\t#ifdef USE_TANGENT\n\n\t\tclearcoatNormal = normalize( vTBN * clearcoatMapN );\n\n\t#else\n\n\t\tclearcoatNormal = perturbNormal2Arb( - vViewPosition, clearcoatNormal, clearcoatMapN, faceDirection );\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n\n#ifdef USE_CLEARCOATMAP\n\n\tuniform sampler2D clearcoatMap;\n\n#endif\n\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\n\tuniform sampler2D clearcoatRoughnessMap;\n\n#endif\n\n#ifdef USE_CLEARCOAT_NORMALMAP\n\n\tuniform sampler2D clearcoatNormalMap;\n\tuniform vec2 clearcoatNormalScale;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef OPAQUE\ndiffuseColor.a = 1.0;\n#endif\n\n// https://github.com/mrdoob/three.js/pull/22425\n#ifdef USE_TRANSMISSION\ndiffuseColor.a *= transmissionAlpha + 0.1;\n#endif\n\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );\n`;\n","export default /* glsl */`\nvec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\n\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\n\nconst float PackUpscale = 256. / 255.; // fraction -> 0..1 (including 1)\nconst float UnpackDownscale = 255. / 256.; // 0..1 -> fraction (excluding 1)\n\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\n\nconst float ShiftRight8 = 1. / 256.;\n\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8; // tidy overflow\n\treturn r * PackUpscale;\n}\n\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\n\nvec4 pack2HalfToRGBA( vec2 v ) {\n\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) );\n\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w );\n}\n\nvec2 unpackRGBATo2Half( vec4 v ) {\n\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\n}\n\n// NOTE: viewZ/eyeZ is < 0 when in front of the camera per OpenGL conventions\n\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\n\n// NOTE: https://twitter.com/gonnavis/status/1377183786949959682\n\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}\n`;\n","export default /* glsl */`\n#ifdef PREMULTIPLIED_ALPHA\n\n\t// Get get normal blending with premultipled, use with CustomBlending, OneFactor, OneMinusSrcAlphaFactor, AddEquation.\n\tgl_FragColor.rgb *= gl_FragColor.a;\n\n#endif\n`;\n","export default /* glsl */`\nvec4 mvPosition = vec4( transformed, 1.0 );\n\n#ifdef USE_INSTANCING\n\n\tmvPosition = instanceMatrix * mvPosition;\n\n#endif\n\nmvPosition = modelViewMatrix * mvPosition;\n\ngl_Position = projectionMatrix * mvPosition;\n`;\n","export default /* glsl */`\n#ifdef DITHERING\n\n\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef DITHERING\n\n\t// based on https://www.shadertoy.com/view/MslGR8\n\tvec3 dithering( vec3 color ) {\n\t\t//Calculate grid position\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\n\t\t//Shift the individual colors differently, thus making it even harder to see the dithering pattern\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\n\t\t//modify shift acording to grid position.\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\n\t\t//shift the color by dither_shift\n\t\treturn color + dither_shift_RGB;\n\t}\n\n#endif\n`;\n","export default /* glsl */`\nfloat roughnessFactor = roughness;\n\n#ifdef USE_ROUGHNESSMAP\n\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\n\t// reads channel G, compatible with a combined OcclusionRoughnessMetallic (RGB) texture\n\troughnessFactor *= texelRoughness.g;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_ROUGHNESSMAP\n\n\tuniform sampler2D roughnessMap;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_SHADOWMAP\n\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\n\t#endif\n\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\n\t#endif\n\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\n\t#endif\n\n\t/*\n\t#if NUM_RECT_AREA_LIGHTS > 0\n\n\t\t// TODO (abelnation): create uniforms for area light shadows\n\n\t#endif\n\t*/\n\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\n\t}\n\n\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\n\n\t\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\n\n\t}\n\n\tfloat VSMShadow (sampler2D shadow, vec2 uv, float compare ){\n\n\t\tfloat occlusion = 1.0;\n\n\t\tvec2 distribution = texture2DDistribution( shadow, uv );\n\n\t\tfloat hard_shadow = step( compare , distribution.x ); // Hard Shadow\n\n\t\tif (hard_shadow != 1.0 ) {\n\n\t\t\tfloat distance = compare - distribution.x ;\n\t\t\tfloat variance = max( 0.00000, distribution.y * distribution.y );\n\t\t\tfloat softness_probability = variance / (variance + distance * distance ); // Chebeyshevs inequality\n\t\t\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 ); // 0.3 reduces light bleed\n\t\t\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\n\n\t\t}\n\t\treturn occlusion;\n\n\t}\n\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\n\t\tfloat shadow = 1.0;\n\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\n\t\t// if ( something && something ) breaks ATI OpenGL shader compiler\n\t\t// if ( all( something, something ) ) using this instead\n\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\n\t\tbool frustumTest = all( frustumTestVec );\n\n\t\tif ( frustumTest ) {\n\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tfloat dx2 = dx0 / 2.0;\n\t\t\tfloat dy2 = dy0 / 2.0;\n\t\t\tfloat dx3 = dx1 / 2.0;\n\t\t\tfloat dy3 = dy1 / 2.0;\n\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 17.0 );\n\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx = texelSize.x;\n\t\t\tfloat dy = texelSize.y;\n\n\t\t\tvec2 uv = shadowCoord.xy;\n\t\t\tvec2 f = fract( uv * shadowMapSize + 0.5 );\n\t\t\tuv -= f * texelSize;\n\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ), \n\t\t\t\t\t\t  texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t  f.x ),\n\t\t\t\t\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ), \n\t\t\t\t\t\t  texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t  f.x ),\n\t\t\t\t\t f.y )\n\t\t\t) * ( 1.0 / 9.0 );\n\n\t\t#elif defined( SHADOWMAP_TYPE_VSM )\n\n\t\t\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\n\n\t\t#else // no percentage-closer filtering:\n\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\n\t\t#endif\n\n\t\t}\n\n\t\treturn shadow;\n\n\t}\n\n\t// cubeToUV() maps a 3D direction vector suitable for cube texture mapping to a 2D\n\t// vector suitable for 2D texture mapping. This code uses the following layout for the\n\t// 2D texture:\n\t//\n\t// xzXZ\n\t//  y Y\n\t//\n\t// Y - Positive y direction\n\t// y - Negative y direction\n\t// X - Positive x direction\n\t// x - Negative x direction\n\t// Z - Positive z direction\n\t// z - Negative z direction\n\t//\n\t// Source and test bed:\n\t// https://gist.github.com/tschw/da10c43c467ce8afd0c4\n\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\n\t\t// Number of texels to avoid at the edge of each square\n\n\t\tvec3 absV = abs( v );\n\n\t\t// Intersect unit cube\n\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\n\t\t// Apply scale to avoid seams\n\n\t\t// two texels less per square (one texel will do for NEAREST)\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\n\t\t// Unwrap\n\n\t\t// space: -1 ... 1 range for each square\n\t\t//\n\t\t// #X##\t\tdim    := ( 4 , 2 )\n\t\t//  # #\t\tcenter := ( 1 , 1 )\n\n\t\tvec2 planar = v.xy;\n\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\n\t\tif ( absV.z >= almostOne ) {\n\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\n\t\t} else if ( absV.x >= almostOne ) {\n\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\n\t\t} else if ( absV.y >= almostOne ) {\n\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\n\t\t}\n\n\t\t// Transform to UV space\n\n\t\t// scale := 0.5 / dim\n\t\t// translate := ( center + 0.5 ) / dim\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\n\t}\n\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\n\t\t// for point lights, the uniform @vShadowCoord is re-purposed to hold\n\t\t// the vector from the light to the world-space position of the fragment.\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\n\t\t// dp = normalized distance from light to fragment position\n\t\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear ); // need to clamp?\n\t\tdp += shadowBias;\n\n\t\t// bd3D = base direction 3D\n\t\tvec3 bd3D = normalize( lightToPosition );\n\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\n\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\n\t\t#else // no percentage-closer filtering\n\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\n\t\t#endif\n\n\t}\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_SHADOWMAP\n\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\n\t#endif\n\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\n\t#endif\n\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\n\t#endif\n\n\t/*\n\t#if NUM_RECT_AREA_LIGHTS > 0\n\n\t\t// TODO (abelnation): uniforms for area light shadows\n\n\t#endif\n\t*/\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_SHADOWMAP\n\n\t#if NUM_DIR_LIGHT_SHADOWS > 0 || NUM_SPOT_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0\n\n\t\t// Offsetting the position used for querying occlusion along the world normal can be used to reduce shadow acne.\n\t\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\tvec4 shadowWorldPosition;\n\n\t#endif\n\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\n\n\t}\n\t#pragma unroll_loop_end\n\n\t#endif\n\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * shadowWorldPosition;\n\n\t}\n\t#pragma unroll_loop_end\n\n\t#endif\n\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\n\n\t}\n\t#pragma unroll_loop_end\n\n\t#endif\n\n\t/*\n\t#if NUM_RECT_AREA_LIGHTS > 0\n\n\t\t// TODO (abelnation): update vAreaShadowCoord with area light info\n\n\t#endif\n\t*/\n\n#endif\n`;\n","export default /* glsl */`\nfloat getShadowMask() {\n\n\tfloat shadow = 1.0;\n\n\t#ifdef USE_SHADOWMAP\n\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\n\tDirectionalLightShadow directionalLight;\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\n\t\tdirectionalLight = directionalLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\n\t}\n\t#pragma unroll_loop_end\n\n\t#endif\n\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\n\tSpotLightShadow spotLight;\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\n\t\tspotLight = spotLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\n\t}\n\t#pragma unroll_loop_end\n\n\t#endif\n\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\n\tPointLightShadow pointLight;\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\n\t\tpointLight = pointLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\n\t}\n\t#pragma unroll_loop_end\n\n\t#endif\n\n\t/*\n\t#if NUM_RECT_AREA_LIGHTS > 0\n\n\t\t// TODO (abelnation): update shadow for Area light\n\n\t#endif\n\t*/\n\n\t#endif\n\n\treturn shadow;\n\n}\n`;\n","export default /* glsl */`\n#ifdef USE_SKINNING\n\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_SKINNING\n\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\n\t#ifdef BONE_TEXTURE\n\n\t\tuniform highp sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\n\t\tmat4 getBoneMatrix( const in float i ) {\n\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\t\tfloat y = floor( j / float( boneTextureSize ) );\n\n\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\n\n\t\t\ty = dy * ( y + 0.5 );\n\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\n\t\t\treturn bone;\n\n\t\t}\n\n\t#else\n\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\n\t\tmat4 getBoneMatrix( const in float i ) {\n\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\n\t\t}\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_SKINNING\n\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_SKINNING\n\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\n\t#ifdef USE_TANGENT\n\n\t\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\n\t#endif\n\n#endif\n`;\n","export default /* glsl */`\nfloat specularStrength;\n\n#ifdef USE_SPECULARMAP\n\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n\n#else\n\n\tspecularStrength = 1.0;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_SPECULARMAP\n\n\tuniform sampler2D specularMap;\n\n#endif\n`;\n","export default /* glsl */`\n#if defined( TONE_MAPPING )\n\n\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n\n#endif\n`;\n","export default /* glsl */`\n#ifndef saturate\n// <common> may have defined saturate() already\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\n\nuniform float toneMappingExposure;\n\n// exposure only\nvec3 LinearToneMapping( vec3 color ) {\n\n\treturn toneMappingExposure * color;\n\n}\n\n// source: https://www.cs.utah.edu/docs/techreports/2002/pdf/UUCS-02-001.pdf\nvec3 ReinhardToneMapping( vec3 color ) {\n\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n\n}\n\n// source: http://filmicworlds.com/blog/filmic-tonemapping-operators/\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\n\t// optimized filmic operator by Jim Hejl and Richard Burgess-Dawson\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n\n}\n\n// source: https://github.com/selfshadow/ltc_code/blob/master/webgl/shaders/ltc/ltc_blit.fs\nvec3 RRTAndODTFit( vec3 v ) {\n\n\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\n\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\n\treturn a / b;\n\n}\n\n// this implementation of ACES is modified to accommodate a brighter viewing environment.\n// the scale factor of 1/0.6 is subjective. see discussion in #19621.\n\nvec3 ACESFilmicToneMapping( vec3 color ) {\n\n\t// sRGB => XYZ => D65_2_D60 => AP1 => RRT_SAT\n\tconst mat3 ACESInputMat = mat3(\n\t\tvec3( 0.59719, 0.07600, 0.02840 ), // transposed from source\n\t\tvec3( 0.35458, 0.90834, 0.13383 ),\n\t\tvec3( 0.04823, 0.01566, 0.83777 )\n\t);\n\n\t// ODT_SAT => XYZ => D60_2_D65 => sRGB\n\tconst mat3 ACESOutputMat = mat3(\n\t\tvec3(  1.60475, -0.10208, -0.00327 ), // transposed from source\n\t\tvec3( -0.53108,  1.10813, -0.07276 ),\n\t\tvec3( -0.07367, -0.00605,  1.07602 )\n\t);\n\n\tcolor *= toneMappingExposure / 0.6;\n\n\tcolor = ACESInputMat * color;\n\n\t// Apply RRT and ODT\n\tcolor = RRTAndODTFit( color );\n\n\tcolor = ACESOutputMat * color;\n\n\t// Clamp to [0, 1]\n\treturn saturate( color );\n\n}\n\nvec3 CustomToneMapping( vec3 color ) { return color; }\n`;\n","export default /* glsl */`\n#ifdef USE_TRANSMISSION\n\n\tfloat transmissionAlpha = 1.0;\n\tfloat transmissionFactor = transmission;\n\tfloat thicknessFactor = thickness;\n\n\t#ifdef USE_TRANSMISSIONMAP\n\n\t\ttransmissionFactor *= texture2D( transmissionMap, vUv ).r;\n\n\t#endif\n\n\t#ifdef USE_THICKNESSMAP\n\n\t\tthicknessFactor *= texture2D( thicknessMap, vUv ).g;\n\n\t#endif\n\n\tvec3 pos = vWorldPosition;\n\tvec3 v = normalize( cameraPosition - pos );\n\tvec3 n = inverseTransformDirection( normal, viewMatrix );\n\n\tvec4 transmission = getIBLVolumeRefraction(\n\t\tn, v, roughnessFactor, material.diffuseColor, material.specularColor, material.specularF90,\n\t\tpos, modelMatrix, viewMatrix, projectionMatrix, ior, thicknessFactor,\n\t\tattenuationColor, attenuationDistance );\n\n\ttotalDiffuse = mix( totalDiffuse, transmission.rgb, transmissionFactor );\n\ttransmissionAlpha = mix( transmissionAlpha, transmission.a, transmissionFactor );\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_TRANSMISSION\n\n\t// Transmission code is based on glTF-Sampler-Viewer\n\t// https://github.com/KhronosGroup/glTF-Sample-Viewer\n\n\tuniform float transmission;\n\tuniform float thickness;\n\tuniform float attenuationDistance;\n\tuniform vec3 attenuationColor;\n\n\t#ifdef USE_TRANSMISSIONMAP\n\n\t\tuniform sampler2D transmissionMap;\n\n\t#endif\n\n\t#ifdef USE_THICKNESSMAP\n\n\t\tuniform sampler2D thicknessMap;\n\n\t#endif\n\n\tuniform vec2 transmissionSamplerSize;\n\tuniform sampler2D transmissionSamplerMap;\n\n\tuniform mat4 modelMatrix;\n\tuniform mat4 projectionMatrix;\n\n\tvarying vec3 vWorldPosition;\n\n\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\n\n\t\t// Direction of refracted light.\n\t\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\n\n\t\t// Compute rotation-independant scaling of the model matrix.\n\t\tvec3 modelScale;\n\t\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\n\t\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\n\t\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\n\n\t\t// The thickness is specified in local space.\n\t\treturn normalize( refractionVector ) * thickness * modelScale;\n\n\t}\n\n\tfloat applyIorToRoughness( const in float roughness, const in float ior ) {\n\n\t\t// Scale roughness with IOR so that an IOR of 1.0 results in no microfacet refraction and\n\t\t// an IOR of 1.5 results in the default amount of microfacet refraction.\n\t\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\n\n\t}\n\n\tvec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\n\n\t\tfloat framebufferLod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\n\n\t\t#ifdef TEXTURE_LOD_EXT\n\n\t\t\treturn texture2DLodEXT( transmissionSamplerMap, fragCoord.xy, framebufferLod );\n\n\t\t#else\n\n\t\t\treturn texture2D( transmissionSamplerMap, fragCoord.xy, framebufferLod );\n\n\t\t#endif\n\n\t}\n\n\tvec3 applyVolumeAttenuation( const in vec3 radiance, const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\n\n\t\tif ( attenuationDistance == 0.0 ) {\n\n\t\t\t// Attenuation distance is +∞ (which we indicate by zero), i.e. the transmitted color is not attenuated at all.\n\t\t\treturn radiance;\n\n\t\t} else {\n\n\t\t\t// Compute light attenuation using Beer's law.\n\t\t\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\n\t\t\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance ); // Beer's law\n\t\t\treturn transmittance * radiance;\n\n\t\t}\n\n\t}\n\n\tvec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\n\t\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\n\t\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float ior, const in float thickness,\n\t\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\n\n\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\n\t\tvec3 refractedRayExit = position + transmissionRay;\n\n\t\t// Project refracted vector on the framebuffer, while mapping to normalized device coordinates.\n\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\trefractionCoords += 1.0;\n\t\trefractionCoords /= 2.0;\n\n\t\t// Sample framebuffer to get pixel the refracted ray hits.\n\t\tvec4 transmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\n\n\t\tvec3 attenuatedColor = applyVolumeAttenuation( transmittedLight.rgb, length( transmissionRay ), attenuationColor, attenuationDistance );\n\n\t\t// Get the specular component.\n\t\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\n\n\t\treturn vec4( ( 1.0 - F ) * attenuatedColor * diffuseColor, transmittedLight.a );\n\n\t}\n#endif\n`;\n","export default /* glsl */`\n#if ( defined( USE_UV ) && ! defined( UVS_VERTEX_ONLY ) )\n\n\tvarying vec2 vUv;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_UV\n\n\t#ifdef UVS_VERTEX_ONLY\n\n\t\tvec2 vUv;\n\n\t#else\n\n\t\tvarying vec2 vUv;\n\n\t#endif\n\n\tuniform mat3 uvTransform;\n\n#endif\n`;\n","export default /* glsl */`\n#ifdef USE_UV\n\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\n#endif\n`;\n","export default /* glsl */`\n#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\n\tvarying vec2 vUv2;\n\n#endif\n`;\n","export default /* glsl */`\n#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n\n\tuniform mat3 uv2Transform;\n\n#endif\n`;\n","export default /* glsl */`\n#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\n\tvUv2 = ( uv2Transform * vec3( uv2, 1 ) ).xy;\n\n#endif\n`;\n","export default /* glsl */`\n#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION )\n\n\tvec4 worldPosition = vec4( transformed, 1.0 );\n\n\t#ifdef USE_INSTANCING\n\n\t\tworldPosition = instanceMatrix * worldPosition;\n\n\t#endif\n\n\tworldPosition = modelMatrix * worldPosition;\n\n#endif\n`;\n","export const vertex = /* glsl */`\nvarying vec2 vUv;\nuniform mat3 uvTransform;\n\nvoid main() {\n\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\n\tgl_Position = vec4( position.xy, 1.0, 1.0 );\n\n}\n`;\n\nexport const fragment = /* glsl */`\nuniform sampler2D t2D;\n\nvarying vec2 vUv;\n\nvoid main() {\n\n\tgl_FragColor = texture2D( t2D, vUv );\n\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\n}\n`;\n","export const vertex = /* glsl */`\nvarying vec3 vWorldDirection;\n\n#include <common>\n\nvoid main() {\n\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\n\tgl_Position.z = gl_Position.w; // set z to camera.far\n\n}\n`;\n\nexport const fragment = /* glsl */`\n#include <envmap_common_pars_fragment>\nuniform float opacity;\n\nvarying vec3 vWorldDirection;\n\n#include <cube_uv_reflection_fragment>\n\nvoid main() {\n\n\tvec3 vReflect = vWorldDirection;\n\t#include <envmap_fragment>\n\n\tgl_FragColor = envColor;\n\tgl_FragColor.a *= opacity;\n\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\n}\n`;\n","export const vertex = /* glsl */`\n#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\n// This is used for computing an equivalent of gl_FragCoord.z that is as high precision as possible.\n// Some platforms compute gl_FragCoord at a lower precision which makes the manually computed value better for\n// depth-based postprocessing effects. Reproduced on iPad with A10 processor / iPadOS 13.3.1.\nvarying vec2 vHighPrecisionZW;\n\nvoid main() {\n\n\t#include <uv_vertex>\n\n\t#include <skinbase_vertex>\n\n\t#ifdef USE_DISPLACEMENTMAP\n\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\n\t#endif\n\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\n\tvHighPrecisionZW = gl_Position.zw;\n\n}\n`;\n\nexport const fragment = /* glsl */`\n#if DEPTH_PACKING == 3200\n\n\tuniform float opacity;\n\n#endif\n\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvarying vec2 vHighPrecisionZW;\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( 1.0 );\n\n\t#if DEPTH_PACKING == 3200\n\n\t\tdiffuseColor.a = opacity;\n\n\t#endif\n\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\n\t#include <logdepthbuf_fragment>\n\n\t// Higher precision equivalent of gl_FragCoord.z. This assumes depthRange has been left to its default values.\n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\n\t#if DEPTH_PACKING == 3200\n\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\n\n\t#elif DEPTH_PACKING == 3201\n\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\n\t#endif\n\n}\n`;\n","export const vertex = /* glsl */`\n#define DISTANCE\n\nvarying vec3 vWorldPosition;\n\n#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\nvoid main() {\n\n\t#include <uv_vertex>\n\n\t#include <skinbase_vertex>\n\n\t#ifdef USE_DISPLACEMENTMAP\n\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\n\t#endif\n\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\n\tvWorldPosition = worldPosition.xyz;\n\n}\n`;\n\nexport const fragment = /* glsl */`\n#define DISTANCE\n\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvoid main () {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( 1.0 );\n\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist ); // clamp to [ 0, 1 ]\n\n\tgl_FragColor = packDepthToRGBA( dist );\n\n}\n`;\n","export const vertex = /* glsl */`\nvarying vec3 vWorldDirection;\n\n#include <common>\n\nvoid main() {\n\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\n}\n`;\n\nexport const fragment = /* glsl */`\nuniform sampler2D tEquirect;\n\nvarying vec3 vWorldDirection;\n\n#include <common>\n\nvoid main() {\n\n\tvec3 direction = normalize( vWorldDirection );\n\n\tvec2 sampleUV = equirectUv( direction );\n\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\n}\n`;\n","export const vertex = /* glsl */`\nuniform float scale;\nattribute float lineDistance;\n\nvarying float vLineDistance;\n\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\nvoid main() {\n\n\tvLineDistance = scale * lineDistance;\n\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n\n}\n`;\n\nexport const fragment = /* glsl */`\nuniform vec3 diffuse;\nuniform float opacity;\n\nuniform float dashSize;\nuniform float totalSize;\n\nvarying float vLineDistance;\n\n#include <common>\n#include <color_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\n\t\tdiscard;\n\n\t}\n\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\n\t#include <logdepthbuf_fragment>\n\t#include <color_fragment>\n\n\toutgoingLight = diffuseColor.rgb; // simple shader\n\n\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\n}\n`;\n","export const vertex = /* glsl */`\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\nvoid main() {\n\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\n\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\n\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinbase_vertex>\n\t\t#include <skinnormal_vertex>\n\t\t#include <defaultnormal_vertex>\n\n\t#endif\n\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <fog_vertex>\n\n}\n`;\n\nexport const fragment = /* glsl */`\nuniform vec3 diffuse;\nuniform float opacity;\n\n#ifndef FLAT_SHADED\n\n\tvarying vec3 vNormal;\n\n#endif\n\n#include <common>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <cube_uv_reflection_fragment>\n#include <fog_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\n\t// accumulation (baked indirect lighting only)\n\t#ifdef USE_LIGHTMAP\n\n\t\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\t\treflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity;\n\n\t#else\n\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\n\t#endif\n\n\t// modulation\n\t#include <aomap_fragment>\n\n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\n\t#include <envmap_fragment>\n\n\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n\n}\n`;\n","export const vertex = /* glsl */`\n#define LAMBERT\n\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\nvoid main() {\n\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <lights_lambert_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n`;\n\nexport const fragment = /* glsl */`\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n\n\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <cube_uv_reflection_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <emissivemap_fragment>\n\n\t// accumulation\n\n\t#ifdef DOUBLE_SIDED\n\n\t\treflectedLight.indirectDiffuse += ( gl_FrontFacing ) ? vIndirectFront : vIndirectBack;\n\n\t#else\n\n\t\treflectedLight.indirectDiffuse += vIndirectFront;\n\n\t#endif\n\n\t#include <lightmap_fragment>\n\n\treflectedLight.indirectDiffuse *= BRDF_Lambert( diffuseColor.rgb );\n\n\t#ifdef DOUBLE_SIDED\n\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\n\t#else\n\n\t\treflectedLight.directDiffuse = vLightFront;\n\n\t#endif\n\n\treflectedLight.directDiffuse *= BRDF_Lambert( diffuseColor.rgb ) * getShadowMask();\n\n\t// modulation\n\n\t#include <aomap_fragment>\n\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\n\t#include <envmap_fragment>\n\n\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n`;\n","export const vertex = /* glsl */`\n#define MATCAP\n\nvarying vec3 vViewPosition;\n\n#include <common>\n#include <uv_pars_vertex>\n#include <color_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <fog_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\nvoid main() {\n\n\t#include <uv_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n\n\tvViewPosition = - mvPosition.xyz;\n\n}\n`;\n\nexport const fragment = /* glsl */`\n#define MATCAP\n\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\n\nvarying vec3 vViewPosition;\n\n#include <common>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <fog_pars_fragment>\n#include <normal_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\n\tvec3 viewDir = normalize( vViewPosition );\n\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\n\tvec3 y = cross( viewDir, x );\n\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5; // 0.495 to remove artifacts caused by undersized matcap disks\n\n\t#ifdef USE_MATCAP\n\n\t\tvec4 matcapColor = texture2D( matcap, uv );\n\n\t#else\n\n\t\tvec4 matcapColor = vec4( vec3( mix( 0.2, 0.8, uv.y ) ), 1.0 ); // default if matcap is missing\n\n\t#endif\n\n\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\n\n\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n\n}\n`;\n","export const vertex = /* glsl */`\n#define NORMAL\n\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\n\tvarying vec3 vViewPosition;\n\n#endif\n\n#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\nvoid main() {\n\n\t#include <uv_vertex>\n\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\n\tvViewPosition = - mvPosition.xyz;\n\n#endif\n\n}\n`;\n\nexport const fragment = /* glsl */`\n#define NORMAL\n\nuniform float opacity;\n\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\n\tvarying vec3 vViewPosition;\n\n#endif\n\n#include <packing>\n#include <uv_pars_fragment>\n#include <normal_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\t#include <logdepthbuf_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n\n\t#ifdef OPAQUE\n\n\t\tgl_FragColor.a = 1.0;\n\n\t#endif\n\n}\n`;\n","export const vertex = /* glsl */`\n#define PHONG\n\nvarying vec3 vViewPosition;\n\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\nvoid main() {\n\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\n\tvViewPosition = - mvPosition.xyz;\n\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n\n}\n`;\n\nexport const fragment = /* glsl */`\n#define PHONG\n\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <cube_uv_reflection_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <normal_pars_fragment>\n#include <lights_phong_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\n\t// accumulation\n\t#include <lights_phong_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\n\t// modulation\n\t#include <aomap_fragment>\n\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\n\t#include <envmap_fragment>\n\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n\n}\n`;\n","export const vertex = /* glsl */`\n#define STANDARD\n\nvarying vec3 vViewPosition;\n\n#ifdef USE_TRANSMISSION\n\n\tvarying vec3 vWorldPosition;\n\n#endif\n\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\nvoid main() {\n\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\n\tvViewPosition = - mvPosition.xyz;\n\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n\n#ifdef USE_TRANSMISSION\n\n\tvWorldPosition = worldPosition.xyz;\n\n#endif\n}\n`;\n\nexport const fragment = /* glsl */`\n#define STANDARD\n\n#ifdef PHYSICAL\n\t#define IOR\n\t#define SPECULAR\n#endif\n\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n\n#ifdef IOR\n\tuniform float ior;\n#endif\n\n#ifdef SPECULAR\n\tuniform float specularIntensity;\n\tuniform vec3 specularColor;\n\n\t#ifdef USE_SPECULARINTENSITYMAP\n\t\tuniform sampler2D specularIntensityMap;\n\t#endif\n\n\t#ifdef USE_SPECULARCOLORMAP\n\t\tuniform sampler2D specularColorMap;\n\t#endif\n#endif\n\n#ifdef USE_CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n\n#ifdef USE_SHEEN\n\tuniform vec3 sheenColor;\n\tuniform float sheenRoughness;\n\n\t#ifdef USE_SHEENCOLORMAP\n\t\tuniform sampler2D sheenColorMap;\n\t#endif\n\n\t#ifdef USE_SHEENROUGHNESSMAP\n\t\tuniform sampler2D sheenRoughnessMap;\n\t#endif\n#endif\n\nvarying vec3 vViewPosition;\n\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <bsdfs>\n#include <cube_uv_reflection_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_physical_pars_fragment>\n#include <fog_pars_fragment>\n#include <lights_pars_begin>\n#include <normal_pars_fragment>\n#include <lights_physical_pars_fragment>\n#include <transmission_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <clearcoat_pars_fragment>\n#include <roughnessmap_pars_fragment>\n#include <metalnessmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <roughnessmap_fragment>\n\t#include <metalnessmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <clearcoat_normal_fragment_begin>\n\t#include <clearcoat_normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\n\t// accumulation\n\t#include <lights_physical_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\n\t// modulation\n\t#include <aomap_fragment>\n\n\tvec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\n\tvec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\n\n\t#include <transmission_fragment>\n\n\tvec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\n\n\t#ifdef USE_SHEEN\n\n\t\t// Sheen energy compensation approximation calculation can be found at the end of\n\t\t// https://drive.google.com/file/d/1T0D1VSyR4AllqIJTQAraEIzjlb5h4FKH/view?usp=sharing\n\t\tfloat sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor );\n\n\t\toutgoingLight = outgoingLight * sheenEnergyComp + sheenSpecular;\n\n\t#endif\n\n\t#ifdef USE_CLEARCOAT\n\n\t\tfloat dotNVcc = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) );\n\n\t\tvec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\n\n\t\toutgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + clearcoatSpecular * material.clearcoat;\n\n\t#endif\n\n\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n\n}\n`;\n","export const vertex = /* glsl */`\n#define TOON\n\nvarying vec3 vViewPosition;\n\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\nvoid main() {\n\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\n\tvViewPosition = - mvPosition.xyz;\n\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n\n}\n`;\n\nexport const fragment = /* glsl */`\n#define TOON\n\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <gradientmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <normal_pars_fragment>\n#include <lights_toon_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\n\t// accumulation\n\t#include <lights_toon_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\n\t// modulation\n\t#include <aomap_fragment>\n\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\n\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n\n}\n`;\n","export const vertex = /* glsl */`\nuniform float size;\nuniform float scale;\n\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\nvoid main() {\n\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <project_vertex>\n\n\tgl_PointSize = size;\n\n\t#ifdef USE_SIZEATTENUATION\n\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\n\t#endif\n\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <fog_vertex>\n\n}\n`;\n\nexport const fragment = /* glsl */`\nuniform vec3 diffuse;\nuniform float opacity;\n\n#include <common>\n#include <color_pars_fragment>\n#include <map_particle_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\n\t#include <logdepthbuf_fragment>\n\t#include <map_particle_fragment>\n\t#include <color_fragment>\n\t#include <alphatest_fragment>\n\n\toutgoingLight = diffuseColor.rgb;\n\n\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\n}\n`;\n","export const vertex = /* glsl */`\n#include <common>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n\nvoid main() {\n\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n\n}\n`;\n\nexport const fragment = /* glsl */`\nuniform vec3 color;\nuniform float opacity;\n\n#include <common>\n#include <packing>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\n\nvoid main() {\n\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\n}\n`;\n","export const vertex = /* glsl */`\nuniform float rotation;\nuniform vec2 center;\n\n#include <common>\n#include <uv_pars_vertex>\n#include <fog_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\nvoid main() {\n\n\t#include <uv_vertex>\n\n\tvec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\n\n\tvec2 scale;\n\tscale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );\n\tscale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );\n\n\t#ifndef USE_SIZEATTENUATION\n\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\n\t\tif ( isPerspective ) scale *= - mvPosition.z;\n\n\t#endif\n\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\n\tmvPosition.xy += rotatedPosition;\n\n\tgl_Position = projectionMatrix * mvPosition;\n\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n\n}\n`;\n\nexport const fragment = /* glsl */`\nuniform vec3 diffuse;\nuniform float opacity;\n\n#include <common>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\n\toutgoingLight = diffuseColor.rgb;\n\n\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\n}\n`;\n","import { Color } from '../../math/Color.js';\nimport { Vector2 } from '../../math/Vector2.js';\nimport { Matrix3 } from '../../math/Matrix3.js';\n\n/**\n * Uniforms library for shared webgl shaders\n */\n\nconst UniformsLib = {\n\n\tcommon: {\n\n\t\tdiffuse: { value: new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\n\t\tmap: { value: null },\n\t\tuvTransform: { value: new Matrix3() },\n\t\tuv2Transform: { value: new Matrix3() },\n\n\t\talphaMap: { value: null },\n\t\talphaTest: { value: 0 }\n\n\t},\n\n\tspecularmap: {\n\n\t\tspecularMap: { value: null },\n\n\t},\n\n\tenvmap: {\n\n\t\tenvMap: { value: null },\n\t\tflipEnvMap: { value: - 1 },\n\t\treflectivity: { value: 1.0 }, // basic, lambert, phong\n\t\tior: { value: 1.5 }, // standard, physical\n\t\trefractionRatio: { value: 0.98 }\n\n\t},\n\n\taomap: {\n\n\t\taoMap: { value: null },\n\t\taoMapIntensity: { value: 1 }\n\n\t},\n\n\tlightmap: {\n\n\t\tlightMap: { value: null },\n\t\tlightMapIntensity: { value: 1 }\n\n\t},\n\n\temissivemap: {\n\n\t\temissiveMap: { value: null }\n\n\t},\n\n\tbumpmap: {\n\n\t\tbumpMap: { value: null },\n\t\tbumpScale: { value: 1 }\n\n\t},\n\n\tnormalmap: {\n\n\t\tnormalMap: { value: null },\n\t\tnormalScale: { value: new Vector2( 1, 1 ) }\n\n\t},\n\n\tdisplacementmap: {\n\n\t\tdisplacementMap: { value: null },\n\t\tdisplacementScale: { value: 1 },\n\t\tdisplacementBias: { value: 0 }\n\n\t},\n\n\troughnessmap: {\n\n\t\troughnessMap: { value: null }\n\n\t},\n\n\tmetalnessmap: {\n\n\t\tmetalnessMap: { value: null }\n\n\t},\n\n\tgradientmap: {\n\n\t\tgradientMap: { value: null }\n\n\t},\n\n\tfog: {\n\n\t\tfogDensity: { value: 0.00025 },\n\t\tfogNear: { value: 1 },\n\t\tfogFar: { value: 2000 },\n\t\tfogColor: { value: new Color( 0xffffff ) }\n\n\t},\n\n\tlights: {\n\n\t\tambientLightColor: { value: [] },\n\n\t\tlightProbe: { value: [] },\n\n\t\tdirectionalLights: { value: [], properties: {\n\t\t\tdirection: {},\n\t\t\tcolor: {}\n\t\t} },\n\n\t\tdirectionalLightShadows: { value: [], properties: {\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {}\n\t\t} },\n\n\t\tdirectionalShadowMap: { value: [] },\n\t\tdirectionalShadowMatrix: { value: [] },\n\n\t\tspotLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\tdirection: {},\n\t\t\tdistance: {},\n\t\t\tconeCos: {},\n\t\t\tpenumbraCos: {},\n\t\t\tdecay: {}\n\t\t} },\n\n\t\tspotLightShadows: { value: [], properties: {\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {}\n\t\t} },\n\n\t\tspotShadowMap: { value: [] },\n\t\tspotShadowMatrix: { value: [] },\n\n\t\tpointLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\tdecay: {},\n\t\t\tdistance: {}\n\t\t} },\n\n\t\tpointLightShadows: { value: [], properties: {\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {},\n\t\t\tshadowCameraNear: {},\n\t\t\tshadowCameraFar: {}\n\t\t} },\n\n\t\tpointShadowMap: { value: [] },\n\t\tpointShadowMatrix: { value: [] },\n\n\t\themisphereLights: { value: [], properties: {\n\t\t\tdirection: {},\n\t\t\tskyColor: {},\n\t\t\tgroundColor: {}\n\t\t} },\n\n\t\t// TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src\n\t\trectAreaLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\twidth: {},\n\t\t\theight: {}\n\t\t} },\n\n\t\tltc_1: { value: null },\n\t\tltc_2: { value: null }\n\n\t},\n\n\tpoints: {\n\n\t\tdiffuse: { value: new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\t\tsize: { value: 1.0 },\n\t\tscale: { value: 1.0 },\n\t\tmap: { value: null },\n\t\talphaMap: { value: null },\n\t\talphaTest: { value: 0 },\n\t\tuvTransform: { value: new Matrix3() }\n\n\t},\n\n\tsprite: {\n\n\t\tdiffuse: { value: new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\t\tcenter: { value: new Vector2( 0.5, 0.5 ) },\n\t\trotation: { value: 0.0 },\n\t\tmap: { value: null },\n\t\talphaMap: { value: null },\n\t\talphaTest: { value: 0 },\n\t\tuvTransform: { value: new Matrix3() }\n\n\t}\n\n};\n\nexport { UniformsLib };\n","import { ShaderChunk } from './ShaderChunk.js';\nimport { mergeUniforms } from './UniformsUtils.js';\nimport { Vector2 } from '../../math/Vector2.js';\nimport { Vector3 } from '../../math/Vector3.js';\nimport { UniformsLib } from './UniformsLib.js';\nimport { Color } from '../../math/Color.js';\nimport { Matrix3 } from '../../math/Matrix3.js';\n\nconst ShaderLib = {\n\n\tbasic: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshbasic_vert,\n\t\tfragmentShader: ShaderChunk.meshbasic_frag\n\n\t},\n\n\tlambert: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: new Color( 0x000000 ) }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshlambert_vert,\n\t\tfragmentShader: ShaderChunk.meshlambert_frag\n\n\t},\n\n\tphong: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: new Color( 0x000000 ) },\n\t\t\t\tspecular: { value: new Color( 0x111111 ) },\n\t\t\t\tshininess: { value: 30 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphong_vert,\n\t\tfragmentShader: ShaderChunk.meshphong_frag\n\n\t},\n\n\tstandard: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.roughnessmap,\n\t\t\tUniformsLib.metalnessmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: new Color( 0x000000 ) },\n\t\t\t\troughness: { value: 1.0 },\n\t\t\t\tmetalness: { value: 0.0 },\n\t\t\t\tenvMapIntensity: { value: 1 } // temporary\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphysical_vert,\n\t\tfragmentShader: ShaderChunk.meshphysical_frag\n\n\t},\n\n\ttoon: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.gradientmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: new Color( 0x000000 ) }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshtoon_vert,\n\t\tfragmentShader: ShaderChunk.meshtoon_frag\n\n\t},\n\n\tmatcap: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tmatcap: { value: null }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshmatcap_vert,\n\t\tfragmentShader: ShaderChunk.meshmatcap_frag\n\n\t},\n\n\tpoints: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.points,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.points_vert,\n\t\tfragmentShader: ShaderChunk.points_frag\n\n\t},\n\n\tdashed: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tscale: { value: 1 },\n\t\t\t\tdashSize: { value: 1 },\n\t\t\t\ttotalSize: { value: 2 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.linedashed_vert,\n\t\tfragmentShader: ShaderChunk.linedashed_frag\n\n\t},\n\n\tdepth: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.displacementmap\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.depth_vert,\n\t\tfragmentShader: ShaderChunk.depth_frag\n\n\t},\n\n\tnormal: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\t{\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshnormal_vert,\n\t\tfragmentShader: ShaderChunk.meshnormal_frag\n\n\t},\n\n\tsprite: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.sprite,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.sprite_vert,\n\t\tfragmentShader: ShaderChunk.sprite_frag\n\n\t},\n\n\tbackground: {\n\n\t\tuniforms: {\n\t\t\tuvTransform: { value: new Matrix3() },\n\t\t\tt2D: { value: null },\n\t\t},\n\n\t\tvertexShader: ShaderChunk.background_vert,\n\t\tfragmentShader: ShaderChunk.background_frag\n\n\t},\n\t/* -------------------------------------------------------------------------\n\t//\tCube map shader\n\t ------------------------------------------------------------------------- */\n\n\tcube: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.envmap,\n\t\t\t{\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.cube_vert,\n\t\tfragmentShader: ShaderChunk.cube_frag\n\n\t},\n\n\tequirect: {\n\n\t\tuniforms: {\n\t\t\ttEquirect: { value: null },\n\t\t},\n\n\t\tvertexShader: ShaderChunk.equirect_vert,\n\t\tfragmentShader: ShaderChunk.equirect_frag\n\n\t},\n\n\tdistanceRGBA: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.displacementmap,\n\t\t\t{\n\t\t\t\treferencePosition: { value: new Vector3() },\n\t\t\t\tnearDistance: { value: 1 },\n\t\t\t\tfarDistance: { value: 1000 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.distanceRGBA_vert,\n\t\tfragmentShader: ShaderChunk.distanceRGBA_frag\n\n\t},\n\n\tshadow: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.lights,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tcolor: { value: new Color( 0x00000 ) },\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t},\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.shadow_vert,\n\t\tfragmentShader: ShaderChunk.shadow_frag\n\n\t}\n\n};\n\nShaderLib.physical = {\n\n\tuniforms: mergeUniforms( [\n\t\tShaderLib.standard.uniforms,\n\t\t{\n\t\t\tclearcoat: { value: 0 },\n\t\t\tclearcoatMap: { value: null },\n\t\t\tclearcoatRoughness: { value: 0 },\n\t\t\tclearcoatRoughnessMap: { value: null },\n\t\t\tclearcoatNormalScale: { value: new Vector2( 1, 1 ) },\n\t\t\tclearcoatNormalMap: { value: null },\n\t\t\tsheen: { value: 0 },\n\t\t\tsheenColor: { value: new Color( 0x000000 ) },\n\t\t\tsheenColorMap: { value: null },\n\t\t\tsheenRoughness: { value: 1 },\n\t\t\tsheenRoughnessMap: { value: null },\n\t\t\ttransmission: { value: 0 },\n\t\t\ttransmissionMap: { value: null },\n\t\t\ttransmissionSamplerSize: { value: new Vector2() },\n\t\t\ttransmissionSamplerMap: { value: null },\n\t\t\tthickness: { value: 0 },\n\t\t\tthicknessMap: { value: null },\n\t\t\tattenuationDistance: { value: 0 },\n\t\t\tattenuationColor: { value: new Color( 0x000000 ) },\n\t\t\tspecularIntensity: { value: 1 },\n\t\t\tspecularIntensityMap: { value: null },\n\t\t\tspecularColor: { value: new Color( 1, 1, 1 ) },\n\t\t\tspecularColorMap: { value: null },\n\t\t}\n\t] ),\n\n\tvertexShader: ShaderChunk.meshphysical_vert,\n\tfragmentShader: ShaderChunk.meshphysical_frag\n\n};\n\n\nexport { ShaderLib };\n","import { BackSide, FrontSide, CubeUVReflectionMapping } from '../../constants.js';\nimport { BoxGeometry } from '../../geometries/BoxGeometry.js';\nimport { PlaneGeometry } from '../../geometries/PlaneGeometry.js';\nimport { ShaderMaterial } from '../../materials/ShaderMaterial.js';\nimport { Color } from '../../math/Color.js';\nimport { Mesh } from '../../objects/Mesh.js';\nimport { ShaderLib } from '../shaders/ShaderLib.js';\nimport { cloneUniforms } from '../shaders/UniformsUtils.js';\n\nfunction WebGLBackground( renderer, cubemaps, state, objects, alpha, premultipliedAlpha ) {\n\n\tconst clearColor = new Color( 0x000000 );\n\tlet clearAlpha = alpha === true ? 0 : 1;\n\n\tlet planeMesh;\n\tlet boxMesh;\n\n\tlet currentBackground = null;\n\tlet currentBackgroundVersion = 0;\n\tlet currentTonemapping = null;\n\n\tfunction render( renderList, scene ) {\n\n\t\tlet forceClear = false;\n\t\tlet background = scene.isScene === true ? scene.background : null;\n\n\t\tif ( background && background.isTexture ) {\n\n\t\t\tbackground = cubemaps.get( background );\n\n\t\t}\n\n\t\t// Ignore background in AR\n\t\t// TODO: Reconsider this.\n\n\t\tconst xr = renderer.xr;\n\t\tconst session = xr.getSession && xr.getSession();\n\n\t\tif ( session && session.environmentBlendMode === 'additive' ) {\n\n\t\t\tbackground = null;\n\n\t\t}\n\n\t\tif ( background === null ) {\n\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t} else if ( background && background.isColor ) {\n\n\t\t\tsetClear( background, 1 );\n\t\t\tforceClear = true;\n\n\t\t}\n\n\t\tif ( renderer.autoClear || forceClear ) {\n\n\t\t\trenderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );\n\n\t\t}\n\n\t\tif ( background && ( background.isCubeTexture || background.mapping === CubeUVReflectionMapping ) ) {\n\n\t\t\tif ( boxMesh === undefined ) {\n\n\t\t\t\tboxMesh = new Mesh(\n\t\t\t\t\tnew BoxGeometry( 1, 1, 1 ),\n\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\tname: 'BackgroundCubeMaterial',\n\t\t\t\t\t\tuniforms: cloneUniforms( ShaderLib.cube.uniforms ),\n\t\t\t\t\t\tvertexShader: ShaderLib.cube.vertexShader,\n\t\t\t\t\t\tfragmentShader: ShaderLib.cube.fragmentShader,\n\t\t\t\t\t\tside: BackSide,\n\t\t\t\t\t\tdepthTest: false,\n\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\tfog: false\n\t\t\t\t\t} )\n\t\t\t\t);\n\n\t\t\t\tboxMesh.geometry.deleteAttribute( 'normal' );\n\t\t\t\tboxMesh.geometry.deleteAttribute( 'uv' );\n\n\t\t\t\tboxMesh.onBeforeRender = function ( renderer, scene, camera ) {\n\n\t\t\t\t\tthis.matrixWorld.copyPosition( camera.matrixWorld );\n\n\t\t\t\t};\n\n\t\t\t\t// enable code injection for non-built-in material\n\t\t\t\tObject.defineProperty( boxMesh.material, 'envMap', {\n\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn this.uniforms.envMap.value;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tobjects.update( boxMesh );\n\n\t\t\t}\n\n\t\t\tboxMesh.material.uniforms.envMap.value = background;\n\t\t\tboxMesh.material.uniforms.flipEnvMap.value = ( background.isCubeTexture && background.isRenderTargetTexture === false ) ? - 1 : 1;\n\n\t\t\tif ( currentBackground !== background ||\n\t\t\t\tcurrentBackgroundVersion !== background.version ||\n\t\t\t\tcurrentTonemapping !== renderer.toneMapping ) {\n\n\t\t\t\tboxMesh.material.needsUpdate = true;\n\n\t\t\t\tcurrentBackground = background;\n\t\t\t\tcurrentBackgroundVersion = background.version;\n\t\t\t\tcurrentTonemapping = renderer.toneMapping;\n\n\t\t\t}\n\n\t\t\t// push to the pre-sorted opaque render list\n\t\t\trenderList.unshift( boxMesh, boxMesh.geometry, boxMesh.material, 0, 0, null );\n\n\t\t} else if ( background && background.isTexture ) {\n\n\t\t\tif ( planeMesh === undefined ) {\n\n\t\t\t\tplaneMesh = new Mesh(\n\t\t\t\t\tnew PlaneGeometry( 2, 2 ),\n\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\tname: 'BackgroundMaterial',\n\t\t\t\t\t\tuniforms: cloneUniforms( ShaderLib.background.uniforms ),\n\t\t\t\t\t\tvertexShader: ShaderLib.background.vertexShader,\n\t\t\t\t\t\tfragmentShader: ShaderLib.background.fragmentShader,\n\t\t\t\t\t\tside: FrontSide,\n\t\t\t\t\t\tdepthTest: false,\n\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\tfog: false\n\t\t\t\t\t} )\n\t\t\t\t);\n\n\t\t\t\tplaneMesh.geometry.deleteAttribute( 'normal' );\n\n\t\t\t\t// enable code injection for non-built-in material\n\t\t\t\tObject.defineProperty( planeMesh.material, 'map', {\n\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn this.uniforms.t2D.value;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tobjects.update( planeMesh );\n\n\t\t\t}\n\n\t\t\tplaneMesh.material.uniforms.t2D.value = background;\n\n\t\t\tif ( background.matrixAutoUpdate === true ) {\n\n\t\t\t\tbackground.updateMatrix();\n\n\t\t\t}\n\n\t\t\tplaneMesh.material.uniforms.uvTransform.value.copy( background.matrix );\n\n\t\t\tif ( currentBackground !== background ||\n\t\t\t\tcurrentBackgroundVersion !== background.version ||\n\t\t\t\tcurrentTonemapping !== renderer.toneMapping ) {\n\n\t\t\t\tplaneMesh.material.needsUpdate = true;\n\n\t\t\t\tcurrentBackground = background;\n\t\t\t\tcurrentBackgroundVersion = background.version;\n\t\t\t\tcurrentTonemapping = renderer.toneMapping;\n\n\t\t\t}\n\n\n\t\t\t// push to the pre-sorted opaque render list\n\t\t\trenderList.unshift( planeMesh, planeMesh.geometry, planeMesh.material, 0, 0, null );\n\n\t\t}\n\n\t}\n\n\tfunction setClear( color, alpha ) {\n\n\t\tstate.buffers.color.setClear( color.r, color.g, color.b, alpha, premultipliedAlpha );\n\n\t}\n\n\treturn {\n\n\t\tgetClearColor: function () {\n\n\t\t\treturn clearColor;\n\n\t\t},\n\t\tsetClearColor: function ( color, alpha = 1 ) {\n\n\t\t\tclearColor.set( color );\n\t\t\tclearAlpha = alpha;\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t},\n\t\tgetClearAlpha: function () {\n\n\t\t\treturn clearAlpha;\n\n\t\t},\n\t\tsetClearAlpha: function ( alpha ) {\n\n\t\t\tclearAlpha = alpha;\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t},\n\t\trender: render\n\n\t};\n\n}\n\n\nexport { WebGLBackground };\n","function WebGLBindingStates( gl, extensions, attributes, capabilities ) {\n\n\tconst maxVertexAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\n\tconst extension = capabilities.isWebGL2 ? null : extensions.get( 'OES_vertex_array_object' );\n\tconst vaoAvailable = capabilities.isWebGL2 || extension !== null;\n\n\tconst bindingStates = {};\n\n\tconst defaultState = createBindingState( null );\n\tlet currentState = defaultState;\n\n\tfunction setup( object, material, program, geometry, index ) {\n\n\t\tlet updateBuffers = false;\n\n\t\tif ( vaoAvailable ) {\n\n\t\t\tconst state = getBindingState( geometry, program, material );\n\n\t\t\tif ( currentState !== state ) {\n\n\t\t\t\tcurrentState = state;\n\t\t\t\tbindVertexArrayObject( currentState.object );\n\n\t\t\t}\n\n\t\t\tupdateBuffers = needsUpdate( geometry, index );\n\n\t\t\tif ( updateBuffers ) saveCache( geometry, index );\n\n\t\t} else {\n\n\t\t\tconst wireframe = ( material.wireframe === true );\n\n\t\t\tif ( currentState.geometry !== geometry.id ||\n\t\t\t\tcurrentState.program !== program.id ||\n\t\t\t\tcurrentState.wireframe !== wireframe ) {\n\n\t\t\t\tcurrentState.geometry = geometry.id;\n\t\t\t\tcurrentState.program = program.id;\n\t\t\t\tcurrentState.wireframe = wireframe;\n\n\t\t\t\tupdateBuffers = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( object.isInstancedMesh === true ) {\n\n\t\t\tupdateBuffers = true;\n\n\t\t}\n\n\t\tif ( index !== null ) {\n\n\t\t\tattributes.update( index, gl.ELEMENT_ARRAY_BUFFER );\n\n\t\t}\n\n\t\tif ( updateBuffers ) {\n\n\t\t\tsetupVertexAttributes( object, material, program, geometry );\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, attributes.get( index ).buffer );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction createVertexArrayObject() {\n\n\t\tif ( capabilities.isWebGL2 ) return gl.createVertexArray();\n\n\t\treturn extension.createVertexArrayOES();\n\n\t}\n\n\tfunction bindVertexArrayObject( vao ) {\n\n\t\tif ( capabilities.isWebGL2 ) return gl.bindVertexArray( vao );\n\n\t\treturn extension.bindVertexArrayOES( vao );\n\n\t}\n\n\tfunction deleteVertexArrayObject( vao ) {\n\n\t\tif ( capabilities.isWebGL2 ) return gl.deleteVertexArray( vao );\n\n\t\treturn extension.deleteVertexArrayOES( vao );\n\n\t}\n\n\tfunction getBindingState( geometry, program, material ) {\n\n\t\tconst wireframe = ( material.wireframe === true );\n\n\t\tlet programMap = bindingStates[ geometry.id ];\n\n\t\tif ( programMap === undefined ) {\n\n\t\t\tprogramMap = {};\n\t\t\tbindingStates[ geometry.id ] = programMap;\n\n\t\t}\n\n\t\tlet stateMap = programMap[ program.id ];\n\n\t\tif ( stateMap === undefined ) {\n\n\t\t\tstateMap = {};\n\t\t\tprogramMap[ program.id ] = stateMap;\n\n\t\t}\n\n\t\tlet state = stateMap[ wireframe ];\n\n\t\tif ( state === undefined ) {\n\n\t\t\tstate = createBindingState( createVertexArrayObject() );\n\t\t\tstateMap[ wireframe ] = state;\n\n\t\t}\n\n\t\treturn state;\n\n\t}\n\n\tfunction createBindingState( vao ) {\n\n\t\tconst newAttributes = [];\n\t\tconst enabledAttributes = [];\n\t\tconst attributeDivisors = [];\n\n\t\tfor ( let i = 0; i < maxVertexAttributes; i ++ ) {\n\n\t\t\tnewAttributes[ i ] = 0;\n\t\t\tenabledAttributes[ i ] = 0;\n\t\t\tattributeDivisors[ i ] = 0;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\t// for backward compatibility on non-VAO support browser\n\t\t\tgeometry: null,\n\t\t\tprogram: null,\n\t\t\twireframe: false,\n\n\t\t\tnewAttributes: newAttributes,\n\t\t\tenabledAttributes: enabledAttributes,\n\t\t\tattributeDivisors: attributeDivisors,\n\t\t\tobject: vao,\n\t\t\tattributes: {},\n\t\t\tindex: null\n\n\t\t};\n\n\t}\n\n\tfunction needsUpdate( geometry, index ) {\n\n\t\tconst cachedAttributes = currentState.attributes;\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\tlet attributesNum = 0;\n\n\t\tfor ( const key in geometryAttributes ) {\n\n\t\t\tconst cachedAttribute = cachedAttributes[ key ];\n\t\t\tconst geometryAttribute = geometryAttributes[ key ];\n\n\t\t\tif ( cachedAttribute === undefined ) return true;\n\n\t\t\tif ( cachedAttribute.attribute !== geometryAttribute ) return true;\n\n\t\t\tif ( cachedAttribute.data !== geometryAttribute.data ) return true;\n\n\t\t\tattributesNum ++;\n\n\t\t}\n\n\t\tif ( currentState.attributesNum !== attributesNum ) return true;\n\n\t\tif ( currentState.index !== index ) return true;\n\n\t\treturn false;\n\n\t}\n\n\tfunction saveCache( geometry, index ) {\n\n\t\tconst cache = {};\n\t\tconst attributes = geometry.attributes;\n\t\tlet attributesNum = 0;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tconst attribute = attributes[ key ];\n\n\t\t\tconst data = {};\n\t\t\tdata.attribute = attribute;\n\n\t\t\tif ( attribute.data ) {\n\n\t\t\t\tdata.data = attribute.data;\n\n\t\t\t}\n\n\t\t\tcache[ key ] = data;\n\n\t\t\tattributesNum ++;\n\n\t\t}\n\n\t\tcurrentState.attributes = cache;\n\t\tcurrentState.attributesNum = attributesNum;\n\n\t\tcurrentState.index = index;\n\n\t}\n\n\tfunction initAttributes() {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\n\t\tfor ( let i = 0, il = newAttributes.length; i < il; i ++ ) {\n\n\t\t\tnewAttributes[ i ] = 0;\n\n\t\t}\n\n\t}\n\n\tfunction enableAttribute( attribute ) {\n\n\t\tenableAttributeAndDivisor( attribute, 0 );\n\n\t}\n\n\tfunction enableAttributeAndDivisor( attribute, meshPerAttribute ) {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\t\tconst enabledAttributes = currentState.enabledAttributes;\n\t\tconst attributeDivisors = currentState.attributeDivisors;\n\n\t\tnewAttributes[ attribute ] = 1;\n\n\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t}\n\n\t\tif ( attributeDivisors[ attribute ] !== meshPerAttribute ) {\n\n\t\t\tconst extension = capabilities.isWebGL2 ? gl : extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\textension[ capabilities.isWebGL2 ? 'vertexAttribDivisor' : 'vertexAttribDivisorANGLE' ]( attribute, meshPerAttribute );\n\t\t\tattributeDivisors[ attribute ] = meshPerAttribute;\n\n\t\t}\n\n\t}\n\n\tfunction disableUnusedAttributes() {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\t\tconst enabledAttributes = currentState.enabledAttributes;\n\n\t\tfor ( let i = 0, il = enabledAttributes.length; i < il; i ++ ) {\n\n\t\t\tif ( enabledAttributes[ i ] !== newAttributes[ i ] ) {\n\n\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction vertexAttribPointer( index, size, type, normalized, stride, offset ) {\n\n\t\tif ( capabilities.isWebGL2 === true && ( type === gl.INT || type === gl.UNSIGNED_INT ) ) {\n\n\t\t\tgl.vertexAttribIPointer( index, size, type, stride, offset );\n\n\t\t} else {\n\n\t\t\tgl.vertexAttribPointer( index, size, type, normalized, stride, offset );\n\n\t\t}\n\n\t}\n\n\tfunction setupVertexAttributes( object, material, program, geometry ) {\n\n\t\tif ( capabilities.isWebGL2 === false && ( object.isInstancedMesh || geometry.isInstancedBufferGeometry ) ) {\n\n\t\t\tif ( extensions.get( 'ANGLE_instanced_arrays' ) === null ) return;\n\n\t\t}\n\n\t\tinitAttributes();\n\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tconst materialDefaultAttributeValues = material.defaultAttributeValues;\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute.location >= 0 ) {\n\n\t\t\t\tlet geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\tif ( geometryAttribute === undefined ) {\n\n\t\t\t\t\tif ( name === 'instanceMatrix' && object.instanceMatrix ) geometryAttribute = object.instanceMatrix;\n\t\t\t\t\tif ( name === 'instanceColor' && object.instanceColor ) geometryAttribute = object.instanceColor;\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometryAttribute !== undefined ) {\n\n\t\t\t\t\tconst normalized = geometryAttribute.normalized;\n\t\t\t\t\tconst size = geometryAttribute.itemSize;\n\n\t\t\t\t\tconst attribute = attributes.get( geometryAttribute );\n\n\t\t\t\t\t// TODO Attribute may not be available on context restore\n\n\t\t\t\t\tif ( attribute === undefined ) continue;\n\n\t\t\t\t\tconst buffer = attribute.buffer;\n\t\t\t\t\tconst type = attribute.type;\n\t\t\t\t\tconst bytesPerElement = attribute.bytesPerElement;\n\n\t\t\t\t\tif ( geometryAttribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\tconst data = geometryAttribute.data;\n\t\t\t\t\t\tconst stride = data.stride;\n\t\t\t\t\t\tconst offset = geometryAttribute.offset;\n\n\t\t\t\t\t\tif ( data && data.isInstancedInterleavedBuffer ) {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttributeAndDivisor( programAttribute.location + i, data.meshPerAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( object.isInstancedMesh !== true && geometry._maxInstanceCount === undefined ) {\n\n\t\t\t\t\t\t\t\tgeometry._maxInstanceCount = data.meshPerAttribute * data.count;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttribute( programAttribute.location + i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, buffer );\n\n\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\tvertexAttribPointer(\n\t\t\t\t\t\t\t\tprogramAttribute.location + i,\n\t\t\t\t\t\t\t\tsize / programAttribute.locationSize,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\tnormalized,\n\t\t\t\t\t\t\t\tstride * bytesPerElement,\n\t\t\t\t\t\t\t\t( offset + ( size / programAttribute.locationSize ) * i ) * bytesPerElement\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( geometryAttribute.isInstancedBufferAttribute ) {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttributeAndDivisor( programAttribute.location + i, geometryAttribute.meshPerAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( object.isInstancedMesh !== true && geometry._maxInstanceCount === undefined ) {\n\n\t\t\t\t\t\t\t\tgeometry._maxInstanceCount = geometryAttribute.meshPerAttribute * geometryAttribute.count;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttribute( programAttribute.location + i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, buffer );\n\n\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\tvertexAttribPointer(\n\t\t\t\t\t\t\t\tprogramAttribute.location + i,\n\t\t\t\t\t\t\t\tsize / programAttribute.locationSize,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\tnormalized,\n\t\t\t\t\t\t\t\tsize * bytesPerElement,\n\t\t\t\t\t\t\t\t( size / programAttribute.locationSize ) * i * bytesPerElement\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( materialDefaultAttributeValues !== undefined ) {\n\n\t\t\t\t\tconst value = materialDefaultAttributeValues[ name ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\tswitch ( value.length ) {\n\n\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\tgl.vertexAttrib2fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\tgl.vertexAttrib3fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\tgl.vertexAttrib4fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tgl.vertexAttrib1fv( programAttribute.location, value );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tdisableUnusedAttributes();\n\n\t}\n\n\tfunction dispose() {\n\n\t\treset();\n\n\t\tfor ( const geometryId in bindingStates ) {\n\n\t\t\tconst programMap = bindingStates[ geometryId ];\n\n\t\t\tfor ( const programId in programMap ) {\n\n\t\t\t\tconst stateMap = programMap[ programId ];\n\n\t\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t\t}\n\n\t\t\t\tdelete programMap[ programId ];\n\n\t\t\t}\n\n\t\t\tdelete bindingStates[ geometryId ];\n\n\t\t}\n\n\t}\n\n\tfunction releaseStatesOfGeometry( geometry ) {\n\n\t\tif ( bindingStates[ geometry.id ] === undefined ) return;\n\n\t\tconst programMap = bindingStates[ geometry.id ];\n\n\t\tfor ( const programId in programMap ) {\n\n\t\t\tconst stateMap = programMap[ programId ];\n\n\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t}\n\n\t\t\tdelete programMap[ programId ];\n\n\t\t}\n\n\t\tdelete bindingStates[ geometry.id ];\n\n\t}\n\n\tfunction releaseStatesOfProgram( program ) {\n\n\t\tfor ( const geometryId in bindingStates ) {\n\n\t\t\tconst programMap = bindingStates[ geometryId ];\n\n\t\t\tif ( programMap[ program.id ] === undefined ) continue;\n\n\t\t\tconst stateMap = programMap[ program.id ];\n\n\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t}\n\n\t\t\tdelete programMap[ program.id ];\n\n\t\t}\n\n\t}\n\n\tfunction reset() {\n\n\t\tresetDefaultState();\n\n\t\tif ( currentState === defaultState ) return;\n\n\t\tcurrentState = defaultState;\n\t\tbindVertexArrayObject( currentState.object );\n\n\t}\n\n\t// for backward-compatilibity\n\n\tfunction resetDefaultState() {\n\n\t\tdefaultState.geometry = null;\n\t\tdefaultState.program = null;\n\t\tdefaultState.wireframe = false;\n\n\t}\n\n\treturn {\n\n\t\tsetup: setup,\n\t\treset: reset,\n\t\tresetDefaultState: resetDefaultState,\n\t\tdispose: dispose,\n\t\treleaseStatesOfGeometry: releaseStatesOfGeometry,\n\t\treleaseStatesOfProgram: releaseStatesOfProgram,\n\n\t\tinitAttributes: initAttributes,\n\t\tenableAttribute: enableAttribute,\n\t\tdisableUnusedAttributes: disableUnusedAttributes\n\n\t};\n\n}\n\n\nexport { WebGLBindingStates };\n","function WebGLBufferRenderer( gl, extensions, info, capabilities ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\n\tlet mode;\n\n\tfunction setMode( value ) {\n\n\t\tmode = value;\n\n\t}\n\n\tfunction render( start, count ) {\n\n\t\tgl.drawArrays( mode, start, count );\n\n\t\tinfo.update( count, mode, 1 );\n\n\t}\n\n\tfunction renderInstances( start, count, primcount ) {\n\n\t\tif ( primcount === 0 ) return;\n\n\t\tlet extension, methodName;\n\n\t\tif ( isWebGL2 ) {\n\n\t\t\textension = gl;\n\t\t\tmethodName = 'drawArraysInstanced';\n\n\t\t} else {\n\n\t\t\textension = extensions.get( 'ANGLE_instanced_arrays' );\n\t\t\tmethodName = 'drawArraysInstancedANGLE';\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\textension[ methodName ]( mode, start, count, primcount );\n\n\t\tinfo.update( count, mode, primcount );\n\n\t}\n\n\t//\n\n\tthis.setMode = setMode;\n\tthis.render = render;\n\tthis.renderInstances = renderInstances;\n\n}\n\n\nexport { WebGLBufferRenderer };\n","function WebGLCapabilities( gl, extensions, parameters ) {\n\n\tlet maxAnisotropy;\n\n\tfunction getMaxAnisotropy() {\n\n\t\tif ( maxAnisotropy !== undefined ) return maxAnisotropy;\n\n\t\tif ( extensions.has( 'EXT_texture_filter_anisotropic' ) === true ) {\n\n\t\t\tconst extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tmaxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT );\n\n\t\t} else {\n\n\t\t\tmaxAnisotropy = 0;\n\n\t\t}\n\n\t\treturn maxAnisotropy;\n\n\t}\n\n\tfunction getMaxPrecision( precision ) {\n\n\t\tif ( precision === 'highp' ) {\n\n\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.HIGH_FLOAT ).precision > 0 &&\n\t\t\t\tgl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision > 0 ) {\n\n\t\t\t\treturn 'highp';\n\n\t\t\t}\n\n\t\t\tprecision = 'mediump';\n\n\t\t}\n\n\t\tif ( precision === 'mediump' ) {\n\n\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.MEDIUM_FLOAT ).precision > 0 &&\n\t\t\t\tgl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision > 0 ) {\n\n\t\t\t\treturn 'mediump';\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn 'lowp';\n\n\t}\n\n\tconst isWebGL2 = ( typeof WebGL2RenderingContext !== 'undefined' && gl instanceof WebGL2RenderingContext ) ||\n\t\t( typeof WebGL2ComputeRenderingContext !== 'undefined' && gl instanceof WebGL2ComputeRenderingContext );\n\n\tlet precision = parameters.precision !== undefined ? parameters.precision : 'highp';\n\tconst maxPrecision = getMaxPrecision( precision );\n\n\tif ( maxPrecision !== precision ) {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' );\n\t\tprecision = maxPrecision;\n\n\t}\n\n\tconst drawBuffers = isWebGL2 || extensions.has( 'WEBGL_draw_buffers' );\n\n\tconst logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true;\n\n\tconst maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );\n\tconst maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );\n\tconst maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE );\n\tconst maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE );\n\n\tconst maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\tconst maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS );\n\tconst maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS );\n\tconst maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS );\n\n\tconst vertexTextures = maxVertexTextures > 0;\n\tconst floatFragmentTextures = isWebGL2 || extensions.has( 'OES_texture_float' );\n\tconst floatVertexTextures = vertexTextures && floatFragmentTextures;\n\n\tconst maxSamples = isWebGL2 ? gl.getParameter( gl.MAX_SAMPLES ) : 0;\n\n\treturn {\n\n\t\tisWebGL2: isWebGL2,\n\n\t\tdrawBuffers: drawBuffers,\n\n\t\tgetMaxAnisotropy: getMaxAnisotropy,\n\t\tgetMaxPrecision: getMaxPrecision,\n\n\t\tprecision: precision,\n\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\n\t\tmaxTextures: maxTextures,\n\t\tmaxVertexTextures: maxVertexTextures,\n\t\tmaxTextureSize: maxTextureSize,\n\t\tmaxCubemapSize: maxCubemapSize,\n\n\t\tmaxAttributes: maxAttributes,\n\t\tmaxVertexUniforms: maxVertexUniforms,\n\t\tmaxVaryings: maxVaryings,\n\t\tmaxFragmentUniforms: maxFragmentUniforms,\n\n\t\tvertexTextures: vertexTextures,\n\t\tfloatFragmentTextures: floatFragmentTextures,\n\t\tfloatVertexTextures: floatVertexTextures,\n\n\t\tmaxSamples: maxSamples\n\n\t};\n\n}\n\n\nexport { WebGLCapabilities };\n","import { Matrix3 } from '../../math/Matrix3.js';\nimport { Plane } from '../../math/Plane.js';\n\nfunction WebGLClipping( properties ) {\n\n\tconst scope = this;\n\n\tlet globalState = null,\n\t\tnumGlobalPlanes = 0,\n\t\tlocalClippingEnabled = false,\n\t\trenderingShadows = false;\n\n\tconst plane = new Plane(),\n\t\tviewNormalMatrix = new Matrix3(),\n\n\t\tuniform = { value: null, needsUpdate: false };\n\n\tthis.uniform = uniform;\n\tthis.numPlanes = 0;\n\tthis.numIntersection = 0;\n\n\tthis.init = function ( planes, enableLocalClipping, camera ) {\n\n\t\tconst enabled =\n\t\t\tplanes.length !== 0 ||\n\t\t\tenableLocalClipping ||\n\t\t\t// enable state of previous frame - the clipping code has to\n\t\t\t// run another frame in order to reset the state:\n\t\t\tnumGlobalPlanes !== 0 ||\n\t\t\tlocalClippingEnabled;\n\n\t\tlocalClippingEnabled = enableLocalClipping;\n\n\t\tglobalState = projectPlanes( planes, camera, 0 );\n\t\tnumGlobalPlanes = planes.length;\n\n\t\treturn enabled;\n\n\t};\n\n\tthis.beginShadows = function () {\n\n\t\trenderingShadows = true;\n\t\tprojectPlanes( null );\n\n\t};\n\n\tthis.endShadows = function () {\n\n\t\trenderingShadows = false;\n\t\tresetGlobalState();\n\n\t};\n\n\tthis.setState = function ( material, camera, useCache ) {\n\n\t\tconst planes = material.clippingPlanes,\n\t\t\tclipIntersection = material.clipIntersection,\n\t\t\tclipShadows = material.clipShadows;\n\n\t\tconst materialProperties = properties.get( material );\n\n\t\tif ( ! localClippingEnabled || planes === null || planes.length === 0 || renderingShadows && ! clipShadows ) {\n\n\t\t\t// there's no local clipping\n\n\t\t\tif ( renderingShadows ) {\n\n\t\t\t\t// there's no global clipping\n\n\t\t\t\tprojectPlanes( null );\n\n\t\t\t} else {\n\n\t\t\t\tresetGlobalState();\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst nGlobal = renderingShadows ? 0 : numGlobalPlanes,\n\t\t\t\tlGlobal = nGlobal * 4;\n\n\t\t\tlet dstArray = materialProperties.clippingState || null;\n\n\t\t\tuniform.value = dstArray; // ensure unique state\n\n\t\t\tdstArray = projectPlanes( planes, camera, lGlobal, useCache );\n\n\t\t\tfor ( let i = 0; i !== lGlobal; ++ i ) {\n\n\t\t\t\tdstArray[ i ] = globalState[ i ];\n\n\t\t\t}\n\n\t\t\tmaterialProperties.clippingState = dstArray;\n\t\t\tthis.numIntersection = clipIntersection ? this.numPlanes : 0;\n\t\t\tthis.numPlanes += nGlobal;\n\n\t\t}\n\n\n\t};\n\n\tfunction resetGlobalState() {\n\n\t\tif ( uniform.value !== globalState ) {\n\n\t\t\tuniform.value = globalState;\n\t\t\tuniform.needsUpdate = numGlobalPlanes > 0;\n\n\t\t}\n\n\t\tscope.numPlanes = numGlobalPlanes;\n\t\tscope.numIntersection = 0;\n\n\t}\n\n\tfunction projectPlanes( planes, camera, dstOffset, skipTransform ) {\n\n\t\tconst nPlanes = planes !== null ? planes.length : 0;\n\t\tlet dstArray = null;\n\n\t\tif ( nPlanes !== 0 ) {\n\n\t\t\tdstArray = uniform.value;\n\n\t\t\tif ( skipTransform !== true || dstArray === null ) {\n\n\t\t\t\tconst flatSize = dstOffset + nPlanes * 4,\n\t\t\t\t\tviewMatrix = camera.matrixWorldInverse;\n\n\t\t\t\tviewNormalMatrix.getNormalMatrix( viewMatrix );\n\n\t\t\t\tif ( dstArray === null || dstArray.length < flatSize ) {\n\n\t\t\t\t\tdstArray = new Float32Array( flatSize );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0, i4 = dstOffset; i !== nPlanes; ++ i, i4 += 4 ) {\n\n\t\t\t\t\tplane.copy( planes[ i ] ).applyMatrix4( viewMatrix, viewNormalMatrix );\n\n\t\t\t\t\tplane.normal.toArray( dstArray, i4 );\n\t\t\t\t\tdstArray[ i4 + 3 ] = plane.constant;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tuniform.value = dstArray;\n\t\t\tuniform.needsUpdate = true;\n\n\t\t}\n\n\t\tscope.numPlanes = nPlanes;\n\t\tscope.numIntersection = 0;\n\n\t\treturn dstArray;\n\n\t}\n\n}\n\n\nexport { WebGLClipping };\n","import { createElementNS } from '../utils.js';\nimport { SRGBToLinear } from '../math/Color.js';\n\nlet _canvas;\n\nclass ImageUtils {\n\n\tstatic getDataURL( image ) {\n\n\t\tif ( /^data:/i.test( image.src ) ) {\n\n\t\t\treturn image.src;\n\n\t\t}\n\n\t\tif ( typeof HTMLCanvasElement == 'undefined' ) {\n\n\t\t\treturn image.src;\n\n\t\t}\n\n\t\tlet canvas;\n\n\t\tif ( image instanceof HTMLCanvasElement ) {\n\n\t\t\tcanvas = image;\n\n\t\t} else {\n\n\t\t\tif ( _canvas === undefined ) _canvas = createElementNS( 'canvas' );\n\n\t\t\t_canvas.width = image.width;\n\t\t\t_canvas.height = image.height;\n\n\t\t\tconst context = _canvas.getContext( '2d' );\n\n\t\t\tif ( image instanceof ImageData ) {\n\n\t\t\t\tcontext.putImageData( image, 0, 0 );\n\n\t\t\t} else {\n\n\t\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\t}\n\n\t\t\tcanvas = _canvas;\n\n\t\t}\n\n\t\tif ( canvas.width > 2048 || canvas.height > 2048 ) {\n\n\t\t\tconsole.warn( 'THREE.ImageUtils.getDataURL: Image converted to jpg for performance reasons', image );\n\n\t\t\treturn canvas.toDataURL( 'image/jpeg', 0.6 );\n\n\t\t} else {\n\n\t\t\treturn canvas.toDataURL( 'image/png' );\n\n\t\t}\n\n\t}\n\n\tstatic sRGBToLinear( image ) {\n\n\t\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t\tconst canvas = createElementNS( 'canvas' );\n\n\t\t\tcanvas.width = image.width;\n\t\t\tcanvas.height = image.height;\n\n\t\t\tconst context = canvas.getContext( '2d' );\n\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\tconst imageData = context.getImageData( 0, 0, image.width, image.height );\n\t\t\tconst data = imageData.data;\n\n\t\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tdata[ i ] = SRGBToLinear( data[ i ] / 255 ) * 255;\n\n\t\t\t}\n\n\t\t\tcontext.putImageData( imageData, 0, 0 );\n\n\t\t\treturn canvas;\n\n\t\t} else if ( image.data ) {\n\n\t\t\tconst data = image.data.slice( 0 );\n\n\t\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tif ( data instanceof Uint8Array || data instanceof Uint8ClampedArray ) {\n\n\t\t\t\t\tdata[ i ] = Math.floor( SRGBToLinear( data[ i ] / 255 ) * 255 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// assuming float\n\n\t\t\t\t\tdata[ i ] = SRGBToLinear( data[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tdata: data,\n\t\t\t\twidth: image.width,\n\t\t\t\theight: image.height\n\t\t\t};\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.ImageUtils.sRGBToLinear(): Unsupported image type. No color space conversion applied.' );\n\t\t\treturn image;\n\n\t\t}\n\n\t}\n\n}\n\nexport { ImageUtils };\n","import { EventDispatcher } from '../core/EventDispatcher.js';\nimport {\n\tMirroredRepeatWrapping,\n\tClampToEdgeWrapping,\n\tRepeatWrapping,\n\tLinearEncoding,\n\tUnsignedByteType,\n\tRGBAFormat,\n\tLinearMipmapLinearFilter,\n\tLinearFilter,\n\tUVMapping\n} from '../constants.js';\nimport * as MathUtils from '../math/MathUtils.js';\nimport { Vector2 } from '../math/Vector2.js';\nimport { Matrix3 } from '../math/Matrix3.js';\nimport { ImageUtils } from '../extras/ImageUtils.js';\n\nlet textureId = 0;\n\nclass Texture extends EventDispatcher {\n\n\tconstructor( image = Texture.DEFAULT_IMAGE, mapping = Texture.DEFAULT_MAPPING, wrapS = ClampToEdgeWrapping, wrapT = ClampToEdgeWrapping, magFilter = LinearFilter, minFilter = LinearMipmapLinearFilter, format = RGBAFormat, type = UnsignedByteType, anisotropy = 1, encoding = LinearEncoding ) {\n\n\t\tsuper();\n\n\t\tObject.defineProperty( this, 'id', { value: textureId ++ } );\n\n\t\tthis.uuid = MathUtils.generateUUID();\n\n\t\tthis.name = '';\n\n\t\tthis.image = image;\n\t\tthis.mipmaps = [];\n\n\t\tthis.mapping = mapping;\n\n\t\tthis.wrapS = wrapS;\n\t\tthis.wrapT = wrapT;\n\n\t\tthis.magFilter = magFilter;\n\t\tthis.minFilter = minFilter;\n\n\t\tthis.anisotropy = anisotropy;\n\n\t\tthis.format = format;\n\t\tthis.internalFormat = null;\n\t\tthis.type = type;\n\n\t\tthis.offset = new Vector2( 0, 0 );\n\t\tthis.repeat = new Vector2( 1, 1 );\n\t\tthis.center = new Vector2( 0, 0 );\n\t\tthis.rotation = 0;\n\n\t\tthis.matrixAutoUpdate = true;\n\t\tthis.matrix = new Matrix3();\n\n\t\tthis.generateMipmaps = true;\n\t\tthis.premultiplyAlpha = false;\n\t\tthis.flipY = true;\n\t\tthis.unpackAlignment = 4;\t// valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml)\n\n\t\t// Values of encoding !== THREE.LinearEncoding only supported on map, envMap and emissiveMap.\n\t\t//\n\t\t// Also changing the encoding after already used by a Material will not automatically make the Material\n\t\t// update. You need to explicitly call Material.needsUpdate to trigger it to recompile.\n\t\tthis.encoding = encoding;\n\n\t\tthis.userData = {};\n\n\t\tthis.version = 0;\n\t\tthis.onUpdate = null;\n\n\t\tthis.isRenderTargetTexture = false; // indicates whether a texture belongs to a render target or not\n\t\tthis.needsPMREMUpdate = false; // indicates whether this texture should be processed by PMREMGenerator or not (only relevant for render target textures)\n\n\t}\n\n\tupdateMatrix() {\n\n\t\tthis.matrix.setUvTransform( this.offset.x, this.offset.y, this.repeat.x, this.repeat.y, this.rotation, this.center.x, this.center.y );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.image = source.image;\n\t\tthis.mipmaps = source.mipmaps.slice( 0 );\n\n\t\tthis.mapping = source.mapping;\n\n\t\tthis.wrapS = source.wrapS;\n\t\tthis.wrapT = source.wrapT;\n\n\t\tthis.magFilter = source.magFilter;\n\t\tthis.minFilter = source.minFilter;\n\n\t\tthis.anisotropy = source.anisotropy;\n\n\t\tthis.format = source.format;\n\t\tthis.internalFormat = source.internalFormat;\n\t\tthis.type = source.type;\n\n\t\tthis.offset.copy( source.offset );\n\t\tthis.repeat.copy( source.repeat );\n\t\tthis.center.copy( source.center );\n\t\tthis.rotation = source.rotation;\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\t\tthis.matrix.copy( source.matrix );\n\n\t\tthis.generateMipmaps = source.generateMipmaps;\n\t\tthis.premultiplyAlpha = source.premultiplyAlpha;\n\t\tthis.flipY = source.flipY;\n\t\tthis.unpackAlignment = source.unpackAlignment;\n\t\tthis.encoding = source.encoding;\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( ! isRootObject && meta.textures[ this.uuid ] !== undefined ) {\n\n\t\t\treturn meta.textures[ this.uuid ];\n\n\t\t}\n\n\t\tconst output = {\n\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Texture',\n\t\t\t\tgenerator: 'Texture.toJSON'\n\t\t\t},\n\n\t\t\tuuid: this.uuid,\n\t\t\tname: this.name,\n\n\t\t\tmapping: this.mapping,\n\n\t\t\trepeat: [ this.repeat.x, this.repeat.y ],\n\t\t\toffset: [ this.offset.x, this.offset.y ],\n\t\t\tcenter: [ this.center.x, this.center.y ],\n\t\t\trotation: this.rotation,\n\n\t\t\twrap: [ this.wrapS, this.wrapT ],\n\n\t\t\tformat: this.format,\n\t\t\ttype: this.type,\n\t\t\tencoding: this.encoding,\n\n\t\t\tminFilter: this.minFilter,\n\t\t\tmagFilter: this.magFilter,\n\t\t\tanisotropy: this.anisotropy,\n\n\t\t\tflipY: this.flipY,\n\n\t\t\tpremultiplyAlpha: this.premultiplyAlpha,\n\t\t\tunpackAlignment: this.unpackAlignment\n\n\t\t};\n\n\t\tif ( this.image !== undefined ) {\n\n\t\t\t// TODO: Move to THREE.Image\n\n\t\t\tconst image = this.image;\n\n\t\t\tif ( image.uuid === undefined ) {\n\n\t\t\t\timage.uuid = MathUtils.generateUUID(); // UGH\n\n\t\t\t}\n\n\t\t\tif ( ! isRootObject && meta.images[ image.uuid ] === undefined ) {\n\n\t\t\t\tlet url;\n\n\t\t\t\tif ( Array.isArray( image ) ) {\n\n\t\t\t\t\t// process array of images e.g. CubeTexture\n\n\t\t\t\t\turl = [];\n\n\t\t\t\t\tfor ( let i = 0, l = image.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t// check cube texture with data textures\n\n\t\t\t\t\t\tif ( image[ i ].isDataTexture ) {\n\n\t\t\t\t\t\t\turl.push( serializeImage( image[ i ].image ) );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\turl.push( serializeImage( image[ i ] ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// process single image\n\n\t\t\t\t\turl = serializeImage( image );\n\n\t\t\t\t}\n\n\t\t\t\tmeta.images[ image.uuid ] = {\n\t\t\t\t\tuuid: image.uuid,\n\t\t\t\t\turl: url\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\toutput.image = image.uuid;\n\n\t\t}\n\n\t\tif ( JSON.stringify( this.userData ) !== '{}' ) output.userData = this.userData;\n\n\t\tif ( ! isRootObject ) {\n\n\t\t\tmeta.textures[ this.uuid ] = output;\n\n\t\t}\n\n\t\treturn output;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n\ttransformUv( uv ) {\n\n\t\tif ( this.mapping !== UVMapping ) return uv;\n\n\t\tuv.applyMatrix3( this.matrix );\n\n\t\tif ( uv.x < 0 || uv.x > 1 ) {\n\n\t\t\tswitch ( this.wrapS ) {\n\n\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\tuv.x = uv.x < 0 ? 0 : 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\tif ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\tuv.x = Math.ceil( uv.x ) - uv.x;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( uv.y < 0 || uv.y > 1 ) {\n\n\t\t\tswitch ( this.wrapT ) {\n\n\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\tuv.y = uv.y < 0 ? 0 : 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\tif ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\tuv.y = Math.ceil( uv.y ) - uv.y;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.flipY ) {\n\n\t\t\tuv.y = 1 - uv.y;\n\n\t\t}\n\n\t\treturn uv;\n\n\t}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n}\n\nTexture.DEFAULT_IMAGE = undefined;\nTexture.DEFAULT_MAPPING = UVMapping;\n\nTexture.prototype.isTexture = true;\n\nfunction serializeImage( image ) {\n\n\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t// default images\n\n\t\treturn ImageUtils.getDataURL( image );\n\n\t} else {\n\n\t\tif ( image.data ) {\n\n\t\t\t// images of DataTexture\n\n\t\t\treturn {\n\t\t\t\tdata: Array.prototype.slice.call( image.data ),\n\t\t\t\twidth: image.width,\n\t\t\t\theight: image.height,\n\t\t\t\ttype: image.data.constructor.name\n\t\t\t};\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.Texture: Unable to serialize Texture.' );\n\t\t\treturn {};\n\n\t\t}\n\n\t}\n\n}\n\nexport { Texture };\n","import { EventDispatcher } from '../core/EventDispatcher.js';\nimport { Texture } from '../textures/Texture.js';\nimport { LinearFilter } from '../constants.js';\nimport { Vector4 } from '../math/Vector4.js';\n\n/*\n In options, we can specify:\n * Texture parameters for an auto-generated target texture\n * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers\n*/\nclass WebGLRenderTarget extends EventDispatcher {\n\n\tconstructor( width, height, options = {} ) {\n\n\t\tsuper();\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\t\tthis.depth = 1;\n\n\t\tthis.scissor = new Vector4( 0, 0, width, height );\n\t\tthis.scissorTest = false;\n\n\t\tthis.viewport = new Vector4( 0, 0, width, height );\n\n\t\tthis.texture = new Texture( undefined, options.mapping, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding );\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t\tthis.texture.image = { width: width, height: height, depth: 1 };\n\n\t\tthis.texture.generateMipmaps = options.generateMipmaps !== undefined ? options.generateMipmaps : false;\n\t\tthis.texture.internalFormat = options.internalFormat !== undefined ? options.internalFormat : null;\n\t\tthis.texture.minFilter = options.minFilter !== undefined ? options.minFilter : LinearFilter;\n\n\t\tthis.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true;\n\t\tthis.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : false;\n\t\tthis.depthTexture = options.depthTexture !== undefined ? options.depthTexture : null;\n\n\t}\n\n\tsetTexture( texture ) {\n\n\t\ttexture.image = {\n\t\t\twidth: this.width,\n\t\t\theight: this.height,\n\t\t\tdepth: this.depth\n\t\t};\n\n\t\tthis.texture = texture;\n\n\t}\n\n\tsetSize( width, height, depth = 1 ) {\n\n\t\tif ( this.width !== width || this.height !== height || this.depth !== depth ) {\n\n\t\t\tthis.width = width;\n\t\t\tthis.height = height;\n\t\t\tthis.depth = depth;\n\n\t\t\tthis.texture.image.width = width;\n\t\t\tthis.texture.image.height = height;\n\t\t\tthis.texture.image.depth = depth;\n\n\t\t\tthis.dispose();\n\n\t\t}\n\n\t\tthis.viewport.set( 0, 0, width, height );\n\t\tthis.scissor.set( 0, 0, width, height );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.width = source.width;\n\t\tthis.height = source.height;\n\t\tthis.depth = source.depth;\n\n\t\tthis.viewport.copy( source.viewport );\n\n\t\tthis.texture = source.texture.clone();\n\n\t\t// ensure image object is not shared, see #20328\n\n\t\tthis.texture.image = Object.assign( {}, source.texture.image );\n\n\t\tthis.depthBuffer = source.depthBuffer;\n\t\tthis.stencilBuffer = source.stencilBuffer;\n\t\tthis.depthTexture = source.depthTexture;\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n}\n\nWebGLRenderTarget.prototype.isWebGLRenderTarget = true;\n\nexport { WebGLRenderTarget };\n","import { Camera } from './Camera.js';\nimport * as MathUtils from '../math/MathUtils.js';\n\nclass PerspectiveCamera extends Camera {\n\n\tconstructor( fov = 50, aspect = 1, near = 0.1, far = 2000 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'PerspectiveCamera';\n\n\t\tthis.fov = fov;\n\t\tthis.zoom = 1;\n\n\t\tthis.near = near;\n\t\tthis.far = far;\n\t\tthis.focus = 10;\n\n\t\tthis.aspect = aspect;\n\t\tthis.view = null;\n\n\t\tthis.filmGauge = 35;\t// width of the film (default in millimeters)\n\t\tthis.filmOffset = 0;\t// horizontal film offset (same unit as gauge)\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.fov = source.fov;\n\t\tthis.zoom = source.zoom;\n\n\t\tthis.near = source.near;\n\t\tthis.far = source.far;\n\t\tthis.focus = source.focus;\n\n\t\tthis.aspect = source.aspect;\n\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\tthis.filmGauge = source.filmGauge;\n\t\tthis.filmOffset = source.filmOffset;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the FOV by focal length in respect to the current .filmGauge.\n\t *\n\t * The default film gauge is 35, so that the focal length can be specified for\n\t * a 35mm (full frame) camera.\n\t *\n\t * Values for focal length and film gauge must have the same unit.\n\t */\n\tsetFocalLength( focalLength ) {\n\n\t\t/** see {@link http://www.bobatkins.com/photography/technical/field_of_view.html} */\n\t\tconst vExtentSlope = 0.5 * this.getFilmHeight() / focalLength;\n\n\t\tthis.fov = MathUtils.RAD2DEG * 2 * Math.atan( vExtentSlope );\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Calculates the focal length from the current .fov and .filmGauge.\n\t */\n\tgetFocalLength() {\n\n\t\tconst vExtentSlope = Math.tan( MathUtils.DEG2RAD * 0.5 * this.fov );\n\n\t\treturn 0.5 * this.getFilmHeight() / vExtentSlope;\n\n\t}\n\n\tgetEffectiveFOV() {\n\n\t\treturn MathUtils.RAD2DEG * 2 * Math.atan(\n\t\t\tMath.tan( MathUtils.DEG2RAD * 0.5 * this.fov ) / this.zoom );\n\n\t}\n\n\tgetFilmWidth() {\n\n\t\t// film not completely covered in portrait format (aspect < 1)\n\t\treturn this.filmGauge * Math.min( this.aspect, 1 );\n\n\t}\n\n\tgetFilmHeight() {\n\n\t\t// film not completely covered in landscape format (aspect > 1)\n\t\treturn this.filmGauge / Math.max( this.aspect, 1 );\n\n\t}\n\n\t/**\n\t * Sets an offset in a larger frustum. This is useful for multi-window or\n\t * multi-monitor/multi-machine setups.\n\t *\n\t * For example, if you have 3x2 monitors and each monitor is 1920x1080 and\n\t * the monitors are in grid like this\n\t *\n\t *   +---+---+---+\n\t *   | A | B | C |\n\t *   +---+---+---+\n\t *   | D | E | F |\n\t *   +---+---+---+\n\t *\n\t * then for each monitor you would call it like this\n\t *\n\t *   const w = 1920;\n\t *   const h = 1080;\n\t *   const fullWidth = w * 3;\n\t *   const fullHeight = h * 2;\n\t *\n\t *   --A--\n\t *   camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 0, w, h );\n\t *   --B--\n\t *   camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 0, w, h );\n\t *   --C--\n\t *   camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 0, w, h );\n\t *   --D--\n\t *   camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 1, w, h );\n\t *   --E--\n\t *   camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 1, w, h );\n\t *   --F--\n\t *   camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 1, w, h );\n\t *\n\t *   Note there is no reason monitors have to be the same size or in a grid.\n\t */\n\tsetViewOffset( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\tthis.aspect = fullWidth / fullHeight;\n\n\t\tif ( this.view === null ) {\n\n\t\t\tthis.view = {\n\t\t\t\tenabled: true,\n\t\t\t\tfullWidth: 1,\n\t\t\t\tfullHeight: 1,\n\t\t\t\toffsetX: 0,\n\t\t\t\toffsetY: 0,\n\t\t\t\twidth: 1,\n\t\t\t\theight: 1\n\t\t\t};\n\n\t\t}\n\n\t\tthis.view.enabled = true;\n\t\tthis.view.fullWidth = fullWidth;\n\t\tthis.view.fullHeight = fullHeight;\n\t\tthis.view.offsetX = x;\n\t\tthis.view.offsetY = y;\n\t\tthis.view.width = width;\n\t\tthis.view.height = height;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tclearViewOffset() {\n\n\t\tif ( this.view !== null ) {\n\n\t\t\tthis.view.enabled = false;\n\n\t\t}\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tupdateProjectionMatrix() {\n\n\t\tconst near = this.near;\n\t\tlet top = near * Math.tan( MathUtils.DEG2RAD * 0.5 * this.fov ) / this.zoom;\n\t\tlet height = 2 * top;\n\t\tlet width = this.aspect * height;\n\t\tlet left = - 0.5 * width;\n\t\tconst view = this.view;\n\n\t\tif ( this.view !== null && this.view.enabled ) {\n\n\t\t\tconst fullWidth = view.fullWidth,\n\t\t\t\tfullHeight = view.fullHeight;\n\n\t\t\tleft += view.offsetX * width / fullWidth;\n\t\t\ttop -= view.offsetY * height / fullHeight;\n\t\t\twidth *= view.width / fullWidth;\n\t\t\theight *= view.height / fullHeight;\n\n\t\t}\n\n\t\tconst skew = this.filmOffset;\n\t\tif ( skew !== 0 ) left += near * skew / this.getFilmWidth();\n\n\t\tthis.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far );\n\n\t\tthis.projectionMatrixInverse.copy( this.projectionMatrix ).invert();\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.fov = this.fov;\n\t\tdata.object.zoom = this.zoom;\n\n\t\tdata.object.near = this.near;\n\t\tdata.object.far = this.far;\n\t\tdata.object.focus = this.focus;\n\n\t\tdata.object.aspect = this.aspect;\n\n\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\tdata.object.filmGauge = this.filmGauge;\n\t\tdata.object.filmOffset = this.filmOffset;\n\n\t\treturn data;\n\n\t}\n\n}\n\nPerspectiveCamera.prototype.isPerspectiveCamera = true;\n\nexport { PerspectiveCamera };\n","import { Object3D } from '../core/Object3D.js';\nimport { Vector3 } from '../math/Vector3.js';\nimport { PerspectiveCamera } from './PerspectiveCamera.js';\n\nconst fov = 90, aspect = 1;\n\nclass CubeCamera extends Object3D {\n\n\tconstructor( near, far, renderTarget ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CubeCamera';\n\n\t\tif ( renderTarget.isWebGLCubeRenderTarget !== true ) {\n\n\t\t\tconsole.error( 'THREE.CubeCamera: The constructor now expects an instance of WebGLCubeRenderTarget as third parameter.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.renderTarget = renderTarget;\n\n\t\tconst cameraPX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPX.layers = this.layers;\n\t\tcameraPX.up.set( 0, - 1, 0 );\n\t\tcameraPX.lookAt( new Vector3( 1, 0, 0 ) );\n\t\tthis.add( cameraPX );\n\n\t\tconst cameraNX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNX.layers = this.layers;\n\t\tcameraNX.up.set( 0, - 1, 0 );\n\t\tcameraNX.lookAt( new Vector3( - 1, 0, 0 ) );\n\t\tthis.add( cameraNX );\n\n\t\tconst cameraPY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPY.layers = this.layers;\n\t\tcameraPY.up.set( 0, 0, 1 );\n\t\tcameraPY.lookAt( new Vector3( 0, 1, 0 ) );\n\t\tthis.add( cameraPY );\n\n\t\tconst cameraNY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNY.layers = this.layers;\n\t\tcameraNY.up.set( 0, 0, - 1 );\n\t\tcameraNY.lookAt( new Vector3( 0, - 1, 0 ) );\n\t\tthis.add( cameraNY );\n\n\t\tconst cameraPZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPZ.layers = this.layers;\n\t\tcameraPZ.up.set( 0, - 1, 0 );\n\t\tcameraPZ.lookAt( new Vector3( 0, 0, 1 ) );\n\t\tthis.add( cameraPZ );\n\n\t\tconst cameraNZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNZ.layers = this.layers;\n\t\tcameraNZ.up.set( 0, - 1, 0 );\n\t\tcameraNZ.lookAt( new Vector3( 0, 0, - 1 ) );\n\t\tthis.add( cameraNZ );\n\n\t}\n\n\tupdate( renderer, scene ) {\n\n\t\tif ( this.parent === null ) this.updateMatrixWorld();\n\n\t\tconst renderTarget = this.renderTarget;\n\n\t\tconst [ cameraPX, cameraNX, cameraPY, cameraNY, cameraPZ, cameraNZ ] = this.children;\n\n\t\tconst currentXrEnabled = renderer.xr.enabled;\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\t\trenderer.xr.enabled = false;\n\n\t\tconst generateMipmaps = renderTarget.texture.generateMipmaps;\n\n\t\trenderTarget.texture.generateMipmaps = false;\n\n\t\trenderer.setRenderTarget( renderTarget, 0 );\n\t\trenderer.render( scene, cameraPX );\n\n\t\trenderer.setRenderTarget( renderTarget, 1 );\n\t\trenderer.render( scene, cameraNX );\n\n\t\trenderer.setRenderTarget( renderTarget, 2 );\n\t\trenderer.render( scene, cameraPY );\n\n\t\trenderer.setRenderTarget( renderTarget, 3 );\n\t\trenderer.render( scene, cameraNY );\n\n\t\trenderer.setRenderTarget( renderTarget, 4 );\n\t\trenderer.render( scene, cameraPZ );\n\n\t\trenderTarget.texture.generateMipmaps = generateMipmaps;\n\n\t\trenderer.setRenderTarget( renderTarget, 5 );\n\t\trenderer.render( scene, cameraNZ );\n\n\t\trenderer.setRenderTarget( currentRenderTarget );\n\n\t\trenderer.xr.enabled = currentXrEnabled;\n\n\t\trenderTarget.texture.needsPMREMUpdate = true;\n\n\t}\n\n}\n\nexport { CubeCamera };\n","import { Texture } from './Texture.js';\nimport { CubeReflectionMapping } from '../constants.js';\n\nclass CubeTexture extends Texture {\n\n\tconstructor( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {\n\n\t\timages = images !== undefined ? images : [];\n\t\tmapping = mapping !== undefined ? mapping : CubeReflectionMapping;\n\n\t\tsuper( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.flipY = false;\n\n\t}\n\n\tget images() {\n\n\t\treturn this.image;\n\n\t}\n\n\tset images( value ) {\n\n\t\tthis.image = value;\n\n\t}\n\n}\n\nCubeTexture.prototype.isCubeTexture = true;\n\nexport { CubeTexture };\n","import { BackSide, LinearFilter, LinearMipmapLinearFilter, NoBlending, RGBAFormat } from '../constants.js';\nimport { Mesh } from '../objects/Mesh.js';\nimport { BoxGeometry } from '../geometries/BoxGeometry.js';\nimport { ShaderMaterial } from '../materials/ShaderMaterial.js';\nimport { cloneUniforms } from './shaders/UniformsUtils.js';\nimport { WebGLRenderTarget } from './WebGLRenderTarget.js';\nimport { CubeCamera } from '../cameras/CubeCamera.js';\nimport { CubeTexture } from '../textures/CubeTexture.js';\n\nclass WebGLCubeRenderTarget extends WebGLRenderTarget {\n\n\tconstructor( size, options, dummy ) {\n\n\t\tif ( Number.isInteger( options ) ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLCubeRenderTarget: constructor signature is now WebGLCubeRenderTarget( size, options )' );\n\n\t\t\toptions = dummy;\n\n\t\t}\n\n\t\tsuper( size, size, options );\n\n\t\toptions = options || {};\n\n\t\t// By convention -- likely based on the RenderMan spec from the 1990's -- cube maps are specified by WebGL (and three.js)\n\t\t// in a coordinate system in which positive-x is to the right when looking up the positive-z axis -- in other words,\n\t\t// in a left-handed coordinate system. By continuing this convention, preexisting cube maps continued to render correctly.\n\n\t\t// three.js uses a right-handed coordinate system. So environment maps used in three.js appear to have px and nx swapped\n\t\t// and the flag isRenderTargetTexture controls this conversion. The flip is not required when using WebGLCubeRenderTarget.texture\n\t\t// as a cube texture (this is detected when isRenderTargetTexture is set to true for cube textures).\n\n\t\tthis.texture = new CubeTexture( undefined, options.mapping, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding );\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t\tthis.texture.generateMipmaps = options.generateMipmaps !== undefined ? options.generateMipmaps : false;\n\t\tthis.texture.minFilter = options.minFilter !== undefined ? options.minFilter : LinearFilter;\n\n\t}\n\n\tfromEquirectangularTexture( renderer, texture ) {\n\n\t\tthis.texture.type = texture.type;\n\t\tthis.texture.format = RGBAFormat; // see #18859\n\t\tthis.texture.encoding = texture.encoding;\n\n\t\tthis.texture.generateMipmaps = texture.generateMipmaps;\n\t\tthis.texture.minFilter = texture.minFilter;\n\t\tthis.texture.magFilter = texture.magFilter;\n\n\t\tconst shader = {\n\n\t\t\tuniforms: {\n\t\t\t\ttEquirect: { value: null },\n\t\t\t},\n\n\t\t\tvertexShader: /* glsl */`\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t\t#include <begin_vertex>\n\t\t\t\t\t#include <project_vertex>\n\n\t\t\t\t}\n\t\t\t`,\n\n\t\t\tfragmentShader: /* glsl */`\n\n\t\t\t\tuniform sampler2D tEquirect;\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\t#include <common>\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t\t}\n\t\t\t`\n\t\t};\n\n\t\tconst geometry = new BoxGeometry( 5, 5, 5 );\n\n\t\tconst material = new ShaderMaterial( {\n\n\t\t\tname: 'CubemapFromEquirect',\n\n\t\t\tuniforms: cloneUniforms( shader.uniforms ),\n\t\t\tvertexShader: shader.vertexShader,\n\t\t\tfragmentShader: shader.fragmentShader,\n\t\t\tside: BackSide,\n\t\t\tblending: NoBlending\n\n\t\t} );\n\n\t\tmaterial.uniforms.tEquirect.value = texture;\n\n\t\tconst mesh = new Mesh( geometry, material );\n\n\t\tconst currentMinFilter = texture.minFilter;\n\n\t\t// Avoid blurred poles\n\t\tif ( texture.minFilter === LinearMipmapLinearFilter ) texture.minFilter = LinearFilter;\n\n\t\tconst camera = new CubeCamera( 1, 10, this );\n\t\tcamera.update( renderer, mesh );\n\n\t\ttexture.minFilter = currentMinFilter;\n\n\t\tmesh.geometry.dispose();\n\t\tmesh.material.dispose();\n\n\t\treturn this;\n\n\t}\n\n\tclear( renderer, color, depth, stencil ) {\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\trenderer.setRenderTarget( this, i );\n\n\t\t\trenderer.clear( color, depth, stencil );\n\n\t\t}\n\n\t\trenderer.setRenderTarget( currentRenderTarget );\n\n\t}\n\n}\n\nWebGLCubeRenderTarget.prototype.isWebGLCubeRenderTarget = true;\n\nexport { WebGLCubeRenderTarget };\n","import { CubeReflectionMapping, CubeRefractionMapping, EquirectangularReflectionMapping, EquirectangularRefractionMapping } from '../../constants.js';\nimport { WebGLCubeRenderTarget } from '../WebGLCubeRenderTarget.js';\n\nfunction WebGLCubeMaps( renderer ) {\n\n\tlet cubemaps = new WeakMap();\n\n\tfunction mapTextureMapping( texture, mapping ) {\n\n\t\tif ( mapping === EquirectangularReflectionMapping ) {\n\n\t\t\ttexture.mapping = CubeReflectionMapping;\n\n\t\t} else if ( mapping === EquirectangularRefractionMapping ) {\n\n\t\t\ttexture.mapping = CubeRefractionMapping;\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction get( texture ) {\n\n\t\tif ( texture && texture.isTexture && texture.isRenderTargetTexture === false ) {\n\n\t\t\tconst mapping = texture.mapping;\n\n\t\t\tif ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping ) {\n\n\t\t\t\tif ( cubemaps.has( texture ) ) {\n\n\t\t\t\t\tconst cubemap = cubemaps.get( texture ).texture;\n\t\t\t\t\treturn mapTextureMapping( cubemap, texture.mapping );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst image = texture.image;\n\n\t\t\t\t\tif ( image && image.height > 0 ) {\n\n\t\t\t\t\t\tconst renderTarget = new WebGLCubeRenderTarget( image.height / 2 );\n\t\t\t\t\t\trenderTarget.fromEquirectangularTexture( renderer, texture );\n\t\t\t\t\t\tcubemaps.set( texture, renderTarget );\n\n\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\treturn mapTextureMapping( renderTarget.texture, texture.mapping );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// image not yet ready. try the conversion next frame\n\n\t\t\t\t\t\treturn null;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tconst cubemap = cubemaps.get( texture );\n\n\t\tif ( cubemap !== undefined ) {\n\n\t\t\tcubemaps.delete( texture );\n\t\t\tcubemap.dispose();\n\n\t\t}\n\n\t}\n\n\tfunction dispose() {\n\n\t\tcubemaps = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nexport { WebGLCubeMaps };\n","import { ShaderMaterial } from './ShaderMaterial.js';\n\nclass RawShaderMaterial extends ShaderMaterial {\n\n\tconstructor( parameters ) {\n\n\t\tsuper( parameters );\n\n\t\tthis.type = 'RawShaderMaterial';\n\n\t}\n\n}\n\nRawShaderMaterial.prototype.isRawShaderMaterial = true;\n\nexport { RawShaderMaterial };\n","import {\n\tCubeReflectionMapping,\n\tCubeRefractionMapping,\n\tCubeUVReflectionMapping,\n\tLinearEncoding,\n\tLinearFilter,\n\tNoToneMapping,\n\tNoBlending,\n\tRGBAFormat,\n\tHalfFloatType\n} from '../constants.js';\n\nimport { BufferAttribute } from '../core/BufferAttribute.js';\nimport { BufferGeometry } from '../core/BufferGeometry.js';\nimport { Mesh } from '../objects/Mesh.js';\nimport { OrthographicCamera } from '../cameras/OrthographicCamera.js';\nimport { PerspectiveCamera } from '../cameras/PerspectiveCamera.js';\nimport { RawShaderMaterial } from '../materials/RawShaderMaterial.js';\nimport { Vector2 } from '../math/Vector2.js';\nimport { Vector3 } from '../math/Vector3.js';\nimport { Color } from '../math/Color.js';\nimport { WebGLRenderTarget } from '../renderers/WebGLRenderTarget.js';\nimport { MeshBasicMaterial } from '../materials/MeshBasicMaterial.js';\nimport { BoxGeometry } from '../geometries/BoxGeometry.js';\nimport { BackSide } from '../constants.js';\n\nconst LOD_MIN = 4;\nconst LOD_MAX = 8;\nconst SIZE_MAX = Math.pow( 2, LOD_MAX );\n\n// The standard deviations (radians) associated with the extra mips. These are\n// chosen to approximate a Trowbridge-Reitz distribution function times the\n// geometric shadowing function. These sigma values squared must match the\n// variance #defines in cube_uv_reflection_fragment.glsl.js.\nconst EXTRA_LOD_SIGMA = [ 0.125, 0.215, 0.35, 0.446, 0.526, 0.582 ];\n\nconst TOTAL_LODS = LOD_MAX - LOD_MIN + 1 + EXTRA_LOD_SIGMA.length;\n\n// The maximum length of the blur for loop. Smaller sigmas will use fewer\n// samples and exit early, but not recompile the shader.\nconst MAX_SAMPLES = 20;\n\nconst _flatCamera = /*@__PURE__*/ new OrthographicCamera();\nconst { _lodPlanes, _sizeLods, _sigmas } = /*@__PURE__*/ _createPlanes();\nconst _clearColor = /*@__PURE__*/ new Color();\nlet _oldTarget = null;\n\n// Golden Ratio\nconst PHI = ( 1 + Math.sqrt( 5 ) ) / 2;\nconst INV_PHI = 1 / PHI;\n\n// Vertices of a dodecahedron (except the opposites, which represent the\n// same axis), used as axis directions evenly spread on a sphere.\nconst _axisDirections = [\n\t/*@__PURE__*/ new Vector3( 1, 1, 1 ),\n\t/*@__PURE__*/ new Vector3( - 1, 1, 1 ),\n\t/*@__PURE__*/ new Vector3( 1, 1, - 1 ),\n\t/*@__PURE__*/ new Vector3( - 1, 1, - 1 ),\n\t/*@__PURE__*/ new Vector3( 0, PHI, INV_PHI ),\n\t/*@__PURE__*/ new Vector3( 0, PHI, - INV_PHI ),\n\t/*@__PURE__*/ new Vector3( INV_PHI, 0, PHI ),\n\t/*@__PURE__*/ new Vector3( - INV_PHI, 0, PHI ),\n\t/*@__PURE__*/ new Vector3( PHI, INV_PHI, 0 ),\n\t/*@__PURE__*/ new Vector3( - PHI, INV_PHI, 0 ) ];\n\n/**\n * This class generates a Prefiltered, Mipmapped Radiance Environment Map\n * (PMREM) from a cubeMap environment texture. This allows different levels of\n * blur to be quickly accessed based on material roughness. It is packed into a\n * special CubeUV format that allows us to perform custom interpolation so that\n * we can support nonlinear formats such as RGBE. Unlike a traditional mipmap\n * chain, it only goes down to the LOD_MIN level (above), and then creates extra\n * even more filtered 'mips' at the same LOD_MIN resolution, associated with\n * higher roughness levels. In this way we maintain resolution to smoothly\n * interpolate diffuse lighting while limiting sampling computation.\n *\n * Paper: Fast, Accurate Image-Based Lighting\n * https://drive.google.com/file/d/15y8r_UpKlU9SvV4ILb0C3qCPecS8pvLz/view\n*/\n\nclass PMREMGenerator {\n\n\tconstructor( renderer ) {\n\n\t\tthis._renderer = renderer;\n\t\tthis._pingPongRenderTarget = null;\n\n\t\tthis._blurMaterial = _getBlurShader( MAX_SAMPLES );\n\t\tthis._equirectShader = null;\n\t\tthis._cubemapShader = null;\n\n\t\tthis._compileMaterial( this._blurMaterial );\n\n\t}\n\n\t/**\n\t * Generates a PMREM from a supplied Scene, which can be faster than using an\n\t * image if networking bandwidth is low. Optional sigma specifies a blur radius\n\t * in radians to be applied to the scene before PMREM generation. Optional near\n\t * and far planes ensure the scene is rendered in its entirety (the cubeCamera\n\t * is placed at the origin).\n\t */\n\tfromScene( scene, sigma = 0, near = 0.1, far = 100 ) {\n\n\t\t_oldTarget = this._renderer.getRenderTarget();\n\t\tconst cubeUVRenderTarget = this._allocateTargets();\n\n\t\tthis._sceneToCubeUV( scene, near, far, cubeUVRenderTarget );\n\t\tif ( sigma > 0 ) {\n\n\t\t\tthis._blur( cubeUVRenderTarget, 0, 0, sigma );\n\n\t\t}\n\n\t\tthis._applyPMREM( cubeUVRenderTarget );\n\t\tthis._cleanup( cubeUVRenderTarget );\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t/**\n\t * Generates a PMREM from an equirectangular texture, which can be either LDR\n\t * or HDR. The ideal input image size is 1k (1024 x 512),\n\t * as this matches best with the 256 x 256 cubemap output.\n\t */\n\tfromEquirectangular( equirectangular, renderTarget = null ) {\n\n\t\treturn this._fromTexture( equirectangular, renderTarget );\n\n\t}\n\n\t/**\n\t * Generates a PMREM from an cubemap texture, which can be either LDR\n\t * or HDR. The ideal input cube size is 256 x 256,\n\t * as this matches best with the 256 x 256 cubemap output.\n\t */\n\tfromCubemap( cubemap, renderTarget = null ) {\n\n\t\treturn this._fromTexture( cubemap, renderTarget );\n\n\t}\n\n\t/**\n\t * Pre-compiles the cubemap shader. You can get faster start-up by invoking this method during\n\t * your texture's network fetch for increased concurrency.\n\t */\n\tcompileCubemapShader() {\n\n\t\tif ( this._cubemapShader === null ) {\n\n\t\t\tthis._cubemapShader = _getCubemapShader();\n\t\t\tthis._compileMaterial( this._cubemapShader );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Pre-compiles the equirectangular shader. You can get faster start-up by invoking this method during\n\t * your texture's network fetch for increased concurrency.\n\t */\n\tcompileEquirectangularShader() {\n\n\t\tif ( this._equirectShader === null ) {\n\n\t\t\tthis._equirectShader = _getEquirectShader();\n\t\t\tthis._compileMaterial( this._equirectShader );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Disposes of the PMREMGenerator's internal memory. Note that PMREMGenerator is a static class,\n\t * so you should not need more than one PMREMGenerator object. If you do, calling dispose() on\n\t * one of them will cause any others to also become unusable.\n\t */\n\tdispose() {\n\n\t\tthis._blurMaterial.dispose();\n\n\t\tif ( this._pingPongRenderTarget !== null ) this._pingPongRenderTarget.dispose();\n\n\t\tif ( this._cubemapShader !== null ) this._cubemapShader.dispose();\n\t\tif ( this._equirectShader !== null ) this._equirectShader.dispose();\n\n\t\tfor ( let i = 0; i < _lodPlanes.length; i ++ ) {\n\n\t\t\t_lodPlanes[ i ].dispose();\n\n\t\t}\n\n\t}\n\n\t// private interface\n\n\t_cleanup( outputTarget ) {\n\n\t\tthis._renderer.setRenderTarget( _oldTarget );\n\t\toutputTarget.scissorTest = false;\n\t\t_setViewport( outputTarget, 0, 0, outputTarget.width, outputTarget.height );\n\n\t}\n\n\t_fromTexture( texture, renderTarget ) {\n\n\t\t_oldTarget = this._renderer.getRenderTarget();\n\t\tconst cubeUVRenderTarget = renderTarget || this._allocateTargets( texture );\n\t\tthis._textureToCubeUV( texture, cubeUVRenderTarget );\n\t\tthis._applyPMREM( cubeUVRenderTarget );\n\t\tthis._cleanup( cubeUVRenderTarget );\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t_allocateTargets( texture ) { // warning: null texture is valid\n\n\t\tconst params = {\n\t\t\tmagFilter: LinearFilter,\n\t\t\tminFilter: LinearFilter,\n\t\t\tgenerateMipmaps: false,\n\t\t\ttype: HalfFloatType,\n\t\t\tformat: RGBAFormat,\n\t\t\tencoding: LinearEncoding,\n\t\t\tdepthBuffer: false\n\t\t};\n\n\t\tconst cubeUVRenderTarget = _createRenderTarget( params );\n\t\tcubeUVRenderTarget.depthBuffer = texture ? false : true;\n\n\t\tif ( this._pingPongRenderTarget === null ) {\n\n\t\t\tthis._pingPongRenderTarget = _createRenderTarget( params );\n\n\t\t}\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t_compileMaterial( material ) {\n\n\t\tconst tmpMesh = new Mesh( _lodPlanes[ 0 ], material );\n\t\tthis._renderer.compile( tmpMesh, _flatCamera );\n\n\t}\n\n\t_sceneToCubeUV( scene, near, far, cubeUVRenderTarget ) {\n\n\t\tconst fov = 90;\n\t\tconst aspect = 1;\n\t\tconst cubeCamera = new PerspectiveCamera( fov, aspect, near, far );\n\t\tconst upSign = [ 1, - 1, 1, 1, 1, 1 ];\n\t\tconst forwardSign = [ 1, 1, 1, - 1, - 1, - 1 ];\n\t\tconst renderer = this._renderer;\n\n\t\tconst originalAutoClear = renderer.autoClear;\n\t\tconst toneMapping = renderer.toneMapping;\n\t\trenderer.getClearColor( _clearColor );\n\n\t\trenderer.toneMapping = NoToneMapping;\n\t\trenderer.autoClear = false;\n\n\t\tconst backgroundMaterial = new MeshBasicMaterial( {\n\t\t\tname: 'PMREM.Background',\n\t\t\tside: BackSide,\n\t\t\tdepthWrite: false,\n\t\t\tdepthTest: false,\n\t\t} );\n\n\t\tconst backgroundBox = new Mesh( new BoxGeometry(), backgroundMaterial );\n\n\t\tlet useSolidColor = false;\n\t\tconst background = scene.background;\n\n\t\tif ( background ) {\n\n\t\t\tif ( background.isColor ) {\n\n\t\t\t\tbackgroundMaterial.color.copy( background );\n\t\t\t\tscene.background = null;\n\t\t\t\tuseSolidColor = true;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tbackgroundMaterial.color.copy( _clearColor );\n\t\t\tuseSolidColor = true;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst col = i % 3;\n\t\t\tif ( col === 0 ) {\n\n\t\t\t\tcubeCamera.up.set( 0, upSign[ i ], 0 );\n\t\t\t\tcubeCamera.lookAt( forwardSign[ i ], 0, 0 );\n\n\t\t\t} else if ( col === 1 ) {\n\n\t\t\t\tcubeCamera.up.set( 0, 0, upSign[ i ] );\n\t\t\t\tcubeCamera.lookAt( 0, forwardSign[ i ], 0 );\n\n\t\t\t} else {\n\n\t\t\t\tcubeCamera.up.set( 0, upSign[ i ], 0 );\n\t\t\t\tcubeCamera.lookAt( 0, 0, forwardSign[ i ] );\n\n\t\t\t}\n\n\t\t\t_setViewport( cubeUVRenderTarget,\n\t\t\t\tcol * SIZE_MAX, i > 2 ? SIZE_MAX : 0, SIZE_MAX, SIZE_MAX );\n\t\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\n\t\t\tif ( useSolidColor ) {\n\n\t\t\t\trenderer.render( backgroundBox, cubeCamera );\n\n\t\t\t}\n\n\t\t\trenderer.render( scene, cubeCamera );\n\n\t\t}\n\n\t\tbackgroundBox.geometry.dispose();\n\t\tbackgroundBox.material.dispose();\n\n\t\trenderer.toneMapping = toneMapping;\n\t\trenderer.autoClear = originalAutoClear;\n\t\tscene.background = background;\n\n\t}\n\n\t_textureToCubeUV( texture, cubeUVRenderTarget ) {\n\n\t\tconst renderer = this._renderer;\n\n\t\tconst isCubeTexture = ( texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping );\n\n\t\tif ( isCubeTexture ) {\n\n\t\t\tif ( this._cubemapShader === null ) {\n\n\t\t\t\tthis._cubemapShader = _getCubemapShader();\n\n\t\t\t}\n\n\t\t\tthis._cubemapShader.uniforms.flipEnvMap.value = ( texture.isRenderTargetTexture === false ) ? - 1 : 1;\n\n\t\t} else {\n\n\t\t\tif ( this._equirectShader === null ) {\n\n\t\t\t\tthis._equirectShader = _getEquirectShader();\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst material = isCubeTexture ? this._cubemapShader : this._equirectShader;\n\t\tconst mesh = new Mesh( _lodPlanes[ 0 ], material );\n\n\t\tconst uniforms = material.uniforms;\n\n\t\tuniforms[ 'envMap' ].value = texture;\n\n\t\tif ( ! isCubeTexture ) {\n\n\t\t\tuniforms[ 'texelSize' ].value.set( 1.0 / texture.image.width, 1.0 / texture.image.height );\n\n\t\t}\n\n\t\t_setViewport( cubeUVRenderTarget, 0, 0, 3 * SIZE_MAX, 2 * SIZE_MAX );\n\n\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\t\trenderer.render( mesh, _flatCamera );\n\n\t}\n\n\t_applyPMREM( cubeUVRenderTarget ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst autoClear = renderer.autoClear;\n\t\trenderer.autoClear = false;\n\n\t\tfor ( let i = 1; i < TOTAL_LODS; i ++ ) {\n\n\t\t\tconst sigma = Math.sqrt( _sigmas[ i ] * _sigmas[ i ] - _sigmas[ i - 1 ] * _sigmas[ i - 1 ] );\n\n\t\t\tconst poleAxis = _axisDirections[ ( i - 1 ) % _axisDirections.length ];\n\n\t\t\tthis._blur( cubeUVRenderTarget, i - 1, i, sigma, poleAxis );\n\n\t\t}\n\n\t\trenderer.autoClear = autoClear;\n\n\t}\n\n\t/**\n\t * This is a two-pass Gaussian blur for a cubemap. Normally this is done\n\t * vertically and horizontally, but this breaks down on a cube. Here we apply\n\t * the blur latitudinally (around the poles), and then longitudinally (towards\n\t * the poles) to approximate the orthogonally-separable blur. It is least\n\t * accurate at the poles, but still does a decent job.\n\t */\n\t_blur( cubeUVRenderTarget, lodIn, lodOut, sigma, poleAxis ) {\n\n\t\tconst pingPongRenderTarget = this._pingPongRenderTarget;\n\n\t\tthis._halfBlur(\n\t\t\tcubeUVRenderTarget,\n\t\t\tpingPongRenderTarget,\n\t\t\tlodIn,\n\t\t\tlodOut,\n\t\t\tsigma,\n\t\t\t'latitudinal',\n\t\t\tpoleAxis );\n\n\t\tthis._halfBlur(\n\t\t\tpingPongRenderTarget,\n\t\t\tcubeUVRenderTarget,\n\t\t\tlodOut,\n\t\t\tlodOut,\n\t\t\tsigma,\n\t\t\t'longitudinal',\n\t\t\tpoleAxis );\n\n\t}\n\n\t_halfBlur( targetIn, targetOut, lodIn, lodOut, sigmaRadians, direction, poleAxis ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst blurMaterial = this._blurMaterial;\n\n\t\tif ( direction !== 'latitudinal' && direction !== 'longitudinal' ) {\n\n\t\t\tconsole.error(\n\t\t\t\t'blur direction must be either latitudinal or longitudinal!' );\n\n\t\t}\n\n\t\t// Number of standard deviations at which to cut off the discrete approximation.\n\t\tconst STANDARD_DEVIATIONS = 3;\n\n\t\tconst blurMesh = new Mesh( _lodPlanes[ lodOut ], blurMaterial );\n\t\tconst blurUniforms = blurMaterial.uniforms;\n\n\t\tconst pixels = _sizeLods[ lodIn ] - 1;\n\t\tconst radiansPerPixel = isFinite( sigmaRadians ) ? Math.PI / ( 2 * pixels ) : 2 * Math.PI / ( 2 * MAX_SAMPLES - 1 );\n\t\tconst sigmaPixels = sigmaRadians / radiansPerPixel;\n\t\tconst samples = isFinite( sigmaRadians ) ? 1 + Math.floor( STANDARD_DEVIATIONS * sigmaPixels ) : MAX_SAMPLES;\n\n\t\tif ( samples > MAX_SAMPLES ) {\n\n\t\t\tconsole.warn( `sigmaRadians, ${\n\t\t\t\tsigmaRadians}, is too large and will clip, as it requested ${\n\t\t\t\tsamples} samples when the maximum is set to ${MAX_SAMPLES}` );\n\n\t\t}\n\n\t\tconst weights = [];\n\t\tlet sum = 0;\n\n\t\tfor ( let i = 0; i < MAX_SAMPLES; ++ i ) {\n\n\t\t\tconst x = i / sigmaPixels;\n\t\t\tconst weight = Math.exp( - x * x / 2 );\n\t\t\tweights.push( weight );\n\n\t\t\tif ( i === 0 ) {\n\n\t\t\t\tsum += weight;\n\n\t\t\t} else if ( i < samples ) {\n\n\t\t\t\tsum += 2 * weight;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let i = 0; i < weights.length; i ++ ) {\n\n\t\t\tweights[ i ] = weights[ i ] / sum;\n\n\t\t}\n\n\t\tblurUniforms[ 'envMap' ].value = targetIn.texture;\n\t\tblurUniforms[ 'samples' ].value = samples;\n\t\tblurUniforms[ 'weights' ].value = weights;\n\t\tblurUniforms[ 'latitudinal' ].value = direction === 'latitudinal';\n\n\t\tif ( poleAxis ) {\n\n\t\t\tblurUniforms[ 'poleAxis' ].value = poleAxis;\n\n\t\t}\n\n\t\tblurUniforms[ 'dTheta' ].value = radiansPerPixel;\n\t\tblurUniforms[ 'mipInt' ].value = LOD_MAX - lodIn;\n\n\t\tconst outputSize = _sizeLods[ lodOut ];\n\t\tconst x = 3 * Math.max( 0, SIZE_MAX - 2 * outputSize );\n\t\tconst y = ( lodOut === 0 ? 0 : 2 * SIZE_MAX ) + 2 * outputSize * ( lodOut > LOD_MAX - LOD_MIN ? lodOut - LOD_MAX + LOD_MIN : 0 );\n\n\t\t_setViewport( targetOut, x, y, 3 * outputSize, 2 * outputSize );\n\t\trenderer.setRenderTarget( targetOut );\n\t\trenderer.render( blurMesh, _flatCamera );\n\n\t}\n\n}\n\nfunction _createPlanes() {\n\n\tconst _lodPlanes = [];\n\tconst _sizeLods = [];\n\tconst _sigmas = [];\n\n\tlet lod = LOD_MAX;\n\n\tfor ( let i = 0; i < TOTAL_LODS; i ++ ) {\n\n\t\tconst sizeLod = Math.pow( 2, lod );\n\t\t_sizeLods.push( sizeLod );\n\t\tlet sigma = 1.0 / sizeLod;\n\n\t\tif ( i > LOD_MAX - LOD_MIN ) {\n\n\t\t\tsigma = EXTRA_LOD_SIGMA[ i - LOD_MAX + LOD_MIN - 1 ];\n\n\t\t} else if ( i === 0 ) {\n\n\t\t\tsigma = 0;\n\n\t\t}\n\n\t\t_sigmas.push( sigma );\n\n\t\tconst texelSize = 1.0 / ( sizeLod - 1 );\n\t\tconst min = - texelSize / 2;\n\t\tconst max = 1 + texelSize / 2;\n\t\tconst uv1 = [ min, min, max, min, max, max, min, min, max, max, min, max ];\n\n\t\tconst cubeFaces = 6;\n\t\tconst vertices = 6;\n\t\tconst positionSize = 3;\n\t\tconst uvSize = 2;\n\t\tconst faceIndexSize = 1;\n\n\t\tconst position = new Float32Array( positionSize * vertices * cubeFaces );\n\t\tconst uv = new Float32Array( uvSize * vertices * cubeFaces );\n\t\tconst faceIndex = new Float32Array( faceIndexSize * vertices * cubeFaces );\n\n\t\tfor ( let face = 0; face < cubeFaces; face ++ ) {\n\n\t\t\tconst x = ( face % 3 ) * 2 / 3 - 1;\n\t\t\tconst y = face > 2 ? 0 : - 1;\n\t\t\tconst coordinates = [\n\t\t\t\tx, y, 0,\n\t\t\t\tx + 2 / 3, y, 0,\n\t\t\t\tx + 2 / 3, y + 1, 0,\n\t\t\t\tx, y, 0,\n\t\t\t\tx + 2 / 3, y + 1, 0,\n\t\t\t\tx, y + 1, 0\n\t\t\t];\n\t\t\tposition.set( coordinates, positionSize * vertices * face );\n\t\t\tuv.set( uv1, uvSize * vertices * face );\n\t\t\tconst fill = [ face, face, face, face, face, face ];\n\t\t\tfaceIndex.set( fill, faceIndexSize * vertices * face );\n\n\t\t}\n\n\t\tconst planes = new BufferGeometry();\n\t\tplanes.setAttribute( 'position', new BufferAttribute( position, positionSize ) );\n\t\tplanes.setAttribute( 'uv', new BufferAttribute( uv, uvSize ) );\n\t\tplanes.setAttribute( 'faceIndex', new BufferAttribute( faceIndex, faceIndexSize ) );\n\t\t_lodPlanes.push( planes );\n\n\t\tif ( lod > LOD_MIN ) {\n\n\t\t\tlod --;\n\n\t\t}\n\n\t}\n\n\treturn { _lodPlanes, _sizeLods, _sigmas };\n\n}\n\nfunction _createRenderTarget( params ) {\n\n\tconst cubeUVRenderTarget = new WebGLRenderTarget( 3 * SIZE_MAX, 3 * SIZE_MAX, params );\n\tcubeUVRenderTarget.texture.mapping = CubeUVReflectionMapping;\n\tcubeUVRenderTarget.texture.name = 'PMREM.cubeUv';\n\tcubeUVRenderTarget.scissorTest = true;\n\treturn cubeUVRenderTarget;\n\n}\n\nfunction _setViewport( target, x, y, width, height ) {\n\n\ttarget.viewport.set( x, y, width, height );\n\ttarget.scissor.set( x, y, width, height );\n\n}\n\nfunction _getBlurShader( maxSamples ) {\n\n\tconst weights = new Float32Array( maxSamples );\n\tconst poleAxis = new Vector3( 0, 1, 0 );\n\tconst shaderMaterial = new RawShaderMaterial( {\n\n\t\tname: 'SphericalGaussianBlur',\n\n\t\tdefines: { 'n': maxSamples },\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'samples': { value: 1 },\n\t\t\t'weights': { value: weights },\n\t\t\t'latitudinal': { value: false },\n\t\t\t'dTheta': { value: 0 },\n\t\t\t'mipInt': { value: 0 },\n\t\t\t'poleAxis': { value: poleAxis }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform int samples;\n\t\t\tuniform float weights[ n ];\n\t\t\tuniform bool latitudinal;\n\t\t\tuniform float dTheta;\n\t\t\tuniform float mipInt;\n\t\t\tuniform vec3 poleAxis;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include <cube_uv_reflection_fragment>\n\n\t\t\tvec3 getSample( float theta, vec3 axis ) {\n\n\t\t\t\tfloat cosTheta = cos( theta );\n\t\t\t\t// Rodrigues' axis-angle rotation\n\t\t\t\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t\t\t\t+ cross( axis, vOutputDirection ) * sin( theta )\n\t\t\t\t\t+ axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );\n\n\t\t\t\treturn bilinearCubeUV( envMap, sampleDirection, mipInt );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );\n\n\t\t\t\tif ( all( equal( axis, vec3( 0.0 ) ) ) ) {\n\n\t\t\t\t\taxis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );\n\n\t\t\t\t}\n\n\t\t\t\taxis = normalize( axis );\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );\n\n\t\t\t\tfor ( int i = 1; i < n; i++ ) {\n\n\t\t\t\t\tif ( i >= samples ) {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfloat theta = dTheta * float( i );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( theta, axis );\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n\treturn shaderMaterial;\n\n}\n\nfunction _getEquirectShader() {\n\n\tconst texelSize = new Vector2( 1, 1 );\n\tconst shaderMaterial = new RawShaderMaterial( {\n\n\t\tname: 'EquirectangularToCubeUV',\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'texelSize': { value: texelSize }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform vec2 texelSize;\n\n\t\t\t#include <common>\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\n\t\t\t\tvec3 outputDirection = normalize( vOutputDirection );\n\t\t\t\tvec2 uv = equirectUv( outputDirection );\n\n\t\t\t\tvec2 f = fract( uv / texelSize - 0.5 );\n\t\t\t\tuv -= f * texelSize;\n\t\t\t\tvec3 tl = texture2D ( envMap, uv ).rgb;\n\t\t\t\tuv.x += texelSize.x;\n\t\t\t\tvec3 tr = texture2D ( envMap, uv ).rgb;\n\t\t\t\tuv.y += texelSize.y;\n\t\t\t\tvec3 br = texture2D ( envMap, uv ).rgb;\n\t\t\t\tuv.x -= texelSize.x;\n\t\t\t\tvec3 bl = texture2D ( envMap, uv ).rgb;\n\n\t\t\t\tvec3 tm = mix( tl, tr, f.x );\n\t\t\t\tvec3 bm = mix( bl, br, f.x );\n\t\t\t\tgl_FragColor.rgb = mix( tm, bm, f.y );\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n\treturn shaderMaterial;\n\n}\n\nfunction _getCubemapShader() {\n\n\tconst shaderMaterial = new RawShaderMaterial( {\n\n\t\tname: 'CubemapToCubeUV',\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'flipEnvMap': { value: - 1 }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tuniform float flipEnvMap;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform samplerCube envMap;\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = textureCube( envMap, vec3( flipEnvMap * vOutputDirection.x, vOutputDirection.yz ) );\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n\treturn shaderMaterial;\n\n}\n\nfunction _getCommonVertexShader() {\n\n\treturn /* glsl */`\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute vec3 position;\n\t\tattribute vec2 uv;\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t`;\n\n}\n\nexport { PMREMGenerator };\n","import { CubeReflectionMapping, CubeRefractionMapping, EquirectangularReflectionMapping, EquirectangularRefractionMapping } from '../../constants.js';\nimport { PMREMGenerator } from '../../extras/PMREMGenerator.js';\n\nfunction WebGLCubeUVMaps( renderer ) {\n\n\tlet cubeUVmaps = new WeakMap();\n\n\tlet pmremGenerator = null;\n\n\tfunction get( texture ) {\n\n\t\tif ( texture && texture.isTexture ) {\n\n\t\t\tconst mapping = texture.mapping;\n\n\t\t\tconst isEquirectMap = ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping );\n\t\t\tconst isCubeMap = ( mapping === CubeReflectionMapping || mapping === CubeRefractionMapping );\n\n\t\t\t// equirect/cube map to cubeUV conversion\n\n\t\t\tif ( isEquirectMap || isCubeMap ) {\n\n\t\t\t\tif ( texture.isRenderTargetTexture && texture.needsPMREMUpdate === true ) {\n\n\t\t\t\t\ttexture.needsPMREMUpdate = false;\n\n\t\t\t\t\tlet renderTarget = cubeUVmaps.get( texture );\n\n\t\t\t\t\tif ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer );\n\n\t\t\t\t\trenderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture, renderTarget ) : pmremGenerator.fromCubemap( texture, renderTarget );\n\t\t\t\t\tcubeUVmaps.set( texture, renderTarget );\n\n\t\t\t\t\treturn renderTarget.texture;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( cubeUVmaps.has( texture ) ) {\n\n\t\t\t\t\t\treturn cubeUVmaps.get( texture ).texture;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst image = texture.image;\n\n\t\t\t\t\t\tif ( ( isEquirectMap && image && image.height > 0 ) || ( isCubeMap && image && isCubeTextureComplete( image ) ) ) {\n\n\t\t\t\t\t\t\tif ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer );\n\n\t\t\t\t\t\t\tconst renderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture ) : pmremGenerator.fromCubemap( texture );\n\t\t\t\t\t\t\tcubeUVmaps.set( texture, renderTarget );\n\n\t\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\t\treturn renderTarget.texture;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// image not yet ready. try the conversion next frame\n\n\t\t\t\t\t\t\treturn null;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction isCubeTextureComplete( image ) {\n\n\t\tlet count = 0;\n\t\tconst length = 6;\n\n\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\tif ( image[ i ] !== undefined ) count ++;\n\n\t\t}\n\n\t\treturn count === length;\n\n\n\t}\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tconst cubemapUV = cubeUVmaps.get( texture );\n\n\t\tif ( cubemapUV !== undefined ) {\n\n\t\t\tcubeUVmaps.delete( texture );\n\t\t\tcubemapUV.dispose();\n\n\t\t}\n\n\t}\n\n\tfunction dispose() {\n\n\t\tcubeUVmaps = new WeakMap();\n\n\t\tif ( pmremGenerator !== null ) {\n\n\t\t\tpmremGenerator.dispose();\n\t\t\tpmremGenerator = null;\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nexport { WebGLCubeUVMaps };\n","function WebGLExtensions( gl ) {\n\n\tconst extensions = {};\n\n\tfunction getExtension( name ) {\n\n\t\tif ( extensions[ name ] !== undefined ) {\n\n\t\t\treturn extensions[ name ];\n\n\t\t}\n\n\t\tlet extension;\n\n\t\tswitch ( name ) {\n\n\t\t\tcase 'WEBGL_depth_texture':\n\t\t\t\textension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' );\n\t\t\t\tbreak;\n\n\t\t\tcase 'EXT_texture_filter_anisotropic':\n\t\t\t\textension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' );\n\t\t\t\tbreak;\n\n\t\t\tcase 'WEBGL_compressed_texture_s3tc':\n\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' );\n\t\t\t\tbreak;\n\n\t\t\tcase 'WEBGL_compressed_texture_pvrtc':\n\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\textension = gl.getExtension( name );\n\n\t\t}\n\n\t\textensions[ name ] = extension;\n\n\t\treturn extension;\n\n\t}\n\n\treturn {\n\n\t\thas: function ( name ) {\n\n\t\t\treturn getExtension( name ) !== null;\n\n\t\t},\n\n\t\tinit: function ( capabilities ) {\n\n\t\t\tif ( capabilities.isWebGL2 ) {\n\n\t\t\t\tgetExtension( 'EXT_color_buffer_float' );\n\n\t\t\t} else {\n\n\t\t\t\tgetExtension( 'WEBGL_depth_texture' );\n\t\t\t\tgetExtension( 'OES_texture_float' );\n\t\t\t\tgetExtension( 'OES_texture_half_float' );\n\t\t\t\tgetExtension( 'OES_texture_half_float_linear' );\n\t\t\t\tgetExtension( 'OES_standard_derivatives' );\n\t\t\t\tgetExtension( 'OES_element_index_uint' );\n\t\t\t\tgetExtension( 'OES_vertex_array_object' );\n\t\t\t\tgetExtension( 'ANGLE_instanced_arrays' );\n\n\t\t\t}\n\n\t\t\tgetExtension( 'OES_texture_float_linear' );\n\t\t\tgetExtension( 'EXT_color_buffer_half_float' );\n\t\t\tgetExtension( 'WEBGL_multisampled_render_to_texture' );\n\n\t\t},\n\n\t\tget: function ( name ) {\n\n\t\t\tconst extension = getExtension( name );\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' );\n\n\t\t\t}\n\n\t\t\treturn extension;\n\n\t\t}\n\n\t};\n\n}\n\n\nexport { WebGLExtensions };\n","import { Uint16BufferAttribute, Uint32BufferAttribute } from '../../core/BufferAttribute.js';\nimport { arrayNeedsUint32 } from '../../utils.js';\n\nfunction WebGLGeometries( gl, attributes, info, bindingStates ) {\n\n\tconst geometries = {};\n\tconst wireframeAttributes = new WeakMap();\n\n\tfunction onGeometryDispose( event ) {\n\n\t\tconst geometry = event.target;\n\n\t\tif ( geometry.index !== null ) {\n\n\t\t\tattributes.remove( geometry.index );\n\n\t\t}\n\n\t\tfor ( const name in geometry.attributes ) {\n\n\t\t\tattributes.remove( geometry.attributes[ name ] );\n\n\t\t}\n\n\t\tgeometry.removeEventListener( 'dispose', onGeometryDispose );\n\n\t\tdelete geometries[ geometry.id ];\n\n\t\tconst attribute = wireframeAttributes.get( geometry );\n\n\t\tif ( attribute ) {\n\n\t\t\tattributes.remove( attribute );\n\t\t\twireframeAttributes.delete( geometry );\n\n\t\t}\n\n\t\tbindingStates.releaseStatesOfGeometry( geometry );\n\n\t\tif ( geometry.isInstancedBufferGeometry === true ) {\n\n\t\t\tdelete geometry._maxInstanceCount;\n\n\t\t}\n\n\t\t//\n\n\t\tinfo.memory.geometries --;\n\n\t}\n\n\tfunction get( object, geometry ) {\n\n\t\tif ( geometries[ geometry.id ] === true ) return geometry;\n\n\t\tgeometry.addEventListener( 'dispose', onGeometryDispose );\n\n\t\tgeometries[ geometry.id ] = true;\n\n\t\tinfo.memory.geometries ++;\n\n\t\treturn geometry;\n\n\t}\n\n\tfunction update( geometry ) {\n\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\t// Updating index buffer in VAO now. See WebGLBindingStates.\n\n\t\tfor ( const name in geometryAttributes ) {\n\n\t\t\tattributes.update( geometryAttributes[ name ], gl.ARRAY_BUFFER );\n\n\t\t}\n\n\t\t// morph targets\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst array = morphAttributes[ name ];\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\tattributes.update( array[ i ], gl.ARRAY_BUFFER );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction updateWireframeAttribute( geometry ) {\n\n\t\tconst indices = [];\n\n\t\tconst geometryIndex = geometry.index;\n\t\tconst geometryPosition = geometry.attributes.position;\n\t\tlet version = 0;\n\n\t\tif ( geometryIndex !== null ) {\n\n\t\t\tconst array = geometryIndex.array;\n\t\t\tversion = geometryIndex.version;\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\tconst a = array[ i + 0 ];\n\t\t\t\tconst b = array[ i + 1 ];\n\t\t\t\tconst c = array[ i + 2 ];\n\n\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst array = geometryPosition.array;\n\t\t\tversion = geometryPosition.version;\n\n\t\t\tfor ( let i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) {\n\n\t\t\t\tconst a = i + 0;\n\t\t\t\tconst b = i + 1;\n\t\t\t\tconst c = i + 2;\n\n\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst attribute = new ( arrayNeedsUint32( indices ) ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 );\n\t\tattribute.version = version;\n\n\t\t// Updating index buffer in VAO now. See WebGLBindingStates\n\n\t\t//\n\n\t\tconst previousAttribute = wireframeAttributes.get( geometry );\n\n\t\tif ( previousAttribute ) attributes.remove( previousAttribute );\n\n\t\t//\n\n\t\twireframeAttributes.set( geometry, attribute );\n\n\t}\n\n\tfunction getWireframeAttribute( geometry ) {\n\n\t\tconst currentAttribute = wireframeAttributes.get( geometry );\n\n\t\tif ( currentAttribute ) {\n\n\t\t\tconst geometryIndex = geometry.index;\n\n\t\t\tif ( geometryIndex !== null ) {\n\n\t\t\t\t// if the attribute is obsolete, create a new one\n\n\t\t\t\tif ( currentAttribute.version < geometryIndex.version ) {\n\n\t\t\t\t\tupdateWireframeAttribute( geometry );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tupdateWireframeAttribute( geometry );\n\n\t\t}\n\n\t\treturn wireframeAttributes.get( geometry );\n\n\t}\n\n\treturn {\n\n\t\tget: get,\n\t\tupdate: update,\n\n\t\tgetWireframeAttribute: getWireframeAttribute\n\n\t};\n\n}\n\n\nexport { WebGLGeometries };\n","function WebGLIndexedBufferRenderer( gl, extensions, info, capabilities ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\n\tlet mode;\n\n\tfunction setMode( value ) {\n\n\t\tmode = value;\n\n\t}\n\n\tlet type, bytesPerElement;\n\n\tfunction setIndex( value ) {\n\n\t\ttype = value.type;\n\t\tbytesPerElement = value.bytesPerElement;\n\n\t}\n\n\tfunction render( start, count ) {\n\n\t\tgl.drawElements( mode, count, type, start * bytesPerElement );\n\n\t\tinfo.update( count, mode, 1 );\n\n\t}\n\n\tfunction renderInstances( start, count, primcount ) {\n\n\t\tif ( primcount === 0 ) return;\n\n\t\tlet extension, methodName;\n\n\t\tif ( isWebGL2 ) {\n\n\t\t\textension = gl;\n\t\t\tmethodName = 'drawElementsInstanced';\n\n\t\t} else {\n\n\t\t\textension = extensions.get( 'ANGLE_instanced_arrays' );\n\t\t\tmethodName = 'drawElementsInstancedANGLE';\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\textension[ methodName ]( mode, count, type, start * bytesPerElement, primcount );\n\n\t\tinfo.update( count, mode, primcount );\n\n\t}\n\n\t//\n\n\tthis.setMode = setMode;\n\tthis.setIndex = setIndex;\n\tthis.render = render;\n\tthis.renderInstances = renderInstances;\n\n}\n\n\nexport { WebGLIndexedBufferRenderer };\n","function WebGLInfo( gl ) {\n\n\tconst memory = {\n\t\tgeometries: 0,\n\t\ttextures: 0\n\t};\n\n\tconst render = {\n\t\tframe: 0,\n\t\tcalls: 0,\n\t\ttriangles: 0,\n\t\tpoints: 0,\n\t\tlines: 0\n\t};\n\n\tfunction update( count, mode, instanceCount ) {\n\n\t\trender.calls ++;\n\n\t\tswitch ( mode ) {\n\n\t\t\tcase gl.TRIANGLES:\n\t\t\t\trender.triangles += instanceCount * ( count / 3 );\n\t\t\t\tbreak;\n\n\t\t\tcase gl.LINES:\n\t\t\t\trender.lines += instanceCount * ( count / 2 );\n\t\t\t\tbreak;\n\n\t\t\tcase gl.LINE_STRIP:\n\t\t\t\trender.lines += instanceCount * ( count - 1 );\n\t\t\t\tbreak;\n\n\t\t\tcase gl.LINE_LOOP:\n\t\t\t\trender.lines += instanceCount * count;\n\t\t\t\tbreak;\n\n\t\t\tcase gl.POINTS:\n\t\t\t\trender.points += instanceCount * count;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tconsole.error( 'THREE.WebGLInfo: Unknown draw mode:', mode );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\tfunction reset() {\n\n\t\trender.frame ++;\n\t\trender.calls = 0;\n\t\trender.triangles = 0;\n\t\trender.points = 0;\n\t\trender.lines = 0;\n\n\t}\n\n\treturn {\n\t\tmemory: memory,\n\t\trender: render,\n\t\tprograms: null,\n\t\tautoReset: true,\n\t\treset: reset,\n\t\tupdate: update\n\t};\n\n}\n\n\nexport { WebGLInfo };\n","import { Texture } from './Texture.js';\nimport { ClampToEdgeWrapping, NearestFilter } from '../constants.js';\n\nclass DataTexture2DArray extends Texture {\n\n\tconstructor( data = null, width = 1, height = 1, depth = 1 ) {\n\n\t\tsuper( null );\n\n\t\tthis.image = { data, width, height, depth };\n\n\t\tthis.magFilter = NearestFilter;\n\t\tthis.minFilter = NearestFilter;\n\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t\tthis.generateMipmaps = false;\n\t\tthis.flipY = false;\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n}\n\nDataTexture2DArray.prototype.isDataTexture2DArray = true;\n\nexport { DataTexture2DArray };\n","import { FloatType, RGBAFormat } from '../../constants.js';\nimport { DataTexture2DArray } from '../../textures/DataTexture2DArray.js';\nimport { Vector3 } from '../../math/Vector3.js';\nimport { Vector2 } from '../../math/Vector2.js';\n\nfunction numericalSort( a, b ) {\n\n\treturn a[ 0 ] - b[ 0 ];\n\n}\n\nfunction absNumericalSort( a, b ) {\n\n\treturn Math.abs( b[ 1 ] ) - Math.abs( a[ 1 ] );\n\n}\n\nfunction denormalize( morph, attribute ) {\n\n\tlet denominator = 1;\n\tconst array = attribute.isInterleavedBufferAttribute ? attribute.data.array : attribute.array;\n\n\tif ( array instanceof Int8Array ) denominator = 127;\n\telse if ( array instanceof Int16Array ) denominator = 32767;\n\telse if ( array instanceof Int32Array ) denominator = 2147483647;\n\telse console.error( 'THREE.WebGLMorphtargets: Unsupported morph attribute data type: ', array );\n\n\tmorph.divideScalar( denominator );\n\n}\n\nfunction WebGLMorphtargets( gl, capabilities, textures ) {\n\n\tconst influencesList = {};\n\tconst morphInfluences = new Float32Array( 8 );\n\tconst morphTextures = new WeakMap();\n\tconst morph = new Vector3();\n\n\tconst workInfluences = [];\n\n\tfor ( let i = 0; i < 8; i ++ ) {\n\n\t\tworkInfluences[ i ] = [ i, 0 ];\n\n\t}\n\n\tfunction update( object, geometry, material, program ) {\n\n\t\tconst objectInfluences = object.morphTargetInfluences;\n\n\t\tif ( capabilities.isWebGL2 === true ) {\n\n\t\t\t// instead of using attributes, the WebGL 2 code path encodes morph targets\n\t\t\t// into an array of data textures. Each layer represents a single morph target.\n\n\t\t\tconst numberOfMorphTargets = geometry.morphAttributes.position.length;\n\n\t\t\tlet entry = morphTextures.get( geometry );\n\n\t\t\tif ( entry === undefined || entry.count !== numberOfMorphTargets ) {\n\n\t\t\t\tif ( entry !== undefined ) entry.texture.dispose();\n\n\t\t\t\tconst hasMorphNormals = geometry.morphAttributes.normal !== undefined;\n\n\t\t\t\tconst morphTargets = geometry.morphAttributes.position;\n\t\t\t\tconst morphNormals = geometry.morphAttributes.normal || [];\n\n\t\t\t\tconst numberOfVertices = geometry.attributes.position.count;\n\t\t\t\tconst numberOfVertexData = ( hasMorphNormals === true ) ? 2 : 1; // (v,n) vs. (v)\n\n\t\t\t\tlet width = numberOfVertices * numberOfVertexData;\n\t\t\t\tlet height = 1;\n\n\t\t\t\tif ( width > capabilities.maxTextureSize ) {\n\n\t\t\t\t\theight = Math.ceil( width / capabilities.maxTextureSize );\n\t\t\t\t\twidth = capabilities.maxTextureSize;\n\n\t\t\t\t}\n\n\t\t\t\tconst buffer = new Float32Array( width * height * 4 * numberOfMorphTargets );\n\n\t\t\t\tconst texture = new DataTexture2DArray( buffer, width, height, numberOfMorphTargets );\n\t\t\t\ttexture.format = RGBAFormat; // using RGBA since RGB might be emulated (and is thus slower)\n\t\t\t\ttexture.type = FloatType;\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t// fill buffer\n\n\t\t\t\tconst vertexDataStride = numberOfVertexData * 4;\n\n\t\t\t\tfor ( let i = 0; i < numberOfMorphTargets; i ++ ) {\n\n\t\t\t\t\tconst morphTarget = morphTargets[ i ];\n\t\t\t\t\tconst morphNormal = morphNormals[ i ];\n\n\t\t\t\t\tconst offset = width * height * 4 * i;\n\n\t\t\t\t\tfor ( let j = 0; j < morphTarget.count; j ++ ) {\n\n\t\t\t\t\t\tmorph.fromBufferAttribute( morphTarget, j );\n\n\t\t\t\t\t\tif ( morphTarget.normalized === true ) denormalize( morph, morphTarget );\n\n\t\t\t\t\t\tconst stride = j * vertexDataStride;\n\n\t\t\t\t\t\tbuffer[ offset + stride + 0 ] = morph.x;\n\t\t\t\t\t\tbuffer[ offset + stride + 1 ] = morph.y;\n\t\t\t\t\t\tbuffer[ offset + stride + 2 ] = morph.z;\n\t\t\t\t\t\tbuffer[ offset + stride + 3 ] = 0;\n\n\t\t\t\t\t\tif ( hasMorphNormals === true ) {\n\n\t\t\t\t\t\t\tmorph.fromBufferAttribute( morphNormal, j );\n\n\t\t\t\t\t\t\tif ( morphNormal.normalized === true ) denormalize( morph, morphNormal );\n\n\t\t\t\t\t\t\tbuffer[ offset + stride + 4 ] = morph.x;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 5 ] = morph.y;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 6 ] = morph.z;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 7 ] = 0;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tentry = {\n\t\t\t\t\tcount: numberOfMorphTargets,\n\t\t\t\t\ttexture: texture,\n\t\t\t\t\tsize: new Vector2( width, height )\n\t\t\t\t};\n\n\t\t\t\tmorphTextures.set( geometry, entry );\n\n\t\t\t\tfunction disposeTexture() {\n\n\t\t\t\t\ttexture.dispose();\n\n\t\t\t\t\tmorphTextures.delete( geometry );\n\n\t\t\t\t\tgeometry.removeEventListener( 'dispose', disposeTexture );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.addEventListener( 'dispose', disposeTexture );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tlet morphInfluencesSum = 0;\n\n\t\t\tfor ( let i = 0; i < objectInfluences.length; i ++ ) {\n\n\t\t\t\tmorphInfluencesSum += objectInfluences[ i ];\n\n\t\t\t}\n\n\t\t\tconst morphBaseInfluence = geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum;\n\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetBaseInfluence', morphBaseInfluence );\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetInfluences', objectInfluences );\n\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetsTexture', entry.texture, textures );\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetsTextureSize', entry.size );\n\n\n\t\t} else {\n\n\t\t\t// When object doesn't have morph target influences defined, we treat it as a 0-length array\n\t\t\t// This is important to make sure we set up morphTargetBaseInfluence / morphTargetInfluences\n\n\t\t\tconst length = objectInfluences === undefined ? 0 : objectInfluences.length;\n\n\t\t\tlet influences = influencesList[ geometry.id ];\n\n\t\t\tif ( influences === undefined || influences.length !== length ) {\n\n\t\t\t\t// initialise list\n\n\t\t\t\tinfluences = [];\n\n\t\t\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\t\t\tinfluences[ i ] = [ i, 0 ];\n\n\t\t\t\t}\n\n\t\t\t\tinfluencesList[ geometry.id ] = influences;\n\n\t\t\t}\n\n\t\t\t// Collect influences\n\n\t\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\t\tconst influence = influences[ i ];\n\n\t\t\t\tinfluence[ 0 ] = i;\n\t\t\t\tinfluence[ 1 ] = objectInfluences[ i ];\n\n\t\t\t}\n\n\t\t\tinfluences.sort( absNumericalSort );\n\n\t\t\tfor ( let i = 0; i < 8; i ++ ) {\n\n\t\t\t\tif ( i < length && influences[ i ][ 1 ] ) {\n\n\t\t\t\t\tworkInfluences[ i ][ 0 ] = influences[ i ][ 0 ];\n\t\t\t\t\tworkInfluences[ i ][ 1 ] = influences[ i ][ 1 ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\tworkInfluences[ i ][ 0 ] = Number.MAX_SAFE_INTEGER;\n\t\t\t\t\tworkInfluences[ i ][ 1 ] = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tworkInfluences.sort( numericalSort );\n\n\t\t\tconst morphTargets = geometry.morphAttributes.position;\n\t\t\tconst morphNormals = geometry.morphAttributes.normal;\n\n\t\t\tlet morphInfluencesSum = 0;\n\n\t\t\tfor ( let i = 0; i < 8; i ++ ) {\n\n\t\t\t\tconst influence = workInfluences[ i ];\n\t\t\t\tconst index = influence[ 0 ];\n\t\t\t\tconst value = influence[ 1 ];\n\n\t\t\t\tif ( index !== Number.MAX_SAFE_INTEGER && value ) {\n\n\t\t\t\t\tif ( morphTargets && geometry.getAttribute( 'morphTarget' + i ) !== morphTargets[ index ] ) {\n\n\t\t\t\t\t\tgeometry.setAttribute( 'morphTarget' + i, morphTargets[ index ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( morphNormals && geometry.getAttribute( 'morphNormal' + i ) !== morphNormals[ index ] ) {\n\n\t\t\t\t\t\tgeometry.setAttribute( 'morphNormal' + i, morphNormals[ index ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tmorphInfluences[ i ] = value;\n\t\t\t\t\tmorphInfluencesSum += value;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( morphTargets && geometry.hasAttribute( 'morphTarget' + i ) === true ) {\n\n\t\t\t\t\t\tgeometry.deleteAttribute( 'morphTarget' + i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( morphNormals && geometry.hasAttribute( 'morphNormal' + i ) === true ) {\n\n\t\t\t\t\t\tgeometry.deleteAttribute( 'morphNormal' + i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tmorphInfluences[ i ] = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// GLSL shader uses formula baseinfluence * base + sum(target * influence)\n\t\t\t// This allows us to switch between absolute morphs and relative morphs without changing shader code\n\t\t\t// When baseinfluence = 1 - sum(influence), the above is equivalent to sum((target - base) * influence)\n\t\t\tconst morphBaseInfluence = geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum;\n\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetBaseInfluence', morphBaseInfluence );\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetInfluences', morphInfluences );\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\tupdate: update\n\n\t};\n\n}\n\n\nexport { WebGLMorphtargets };\n","import { WebGLRenderTarget } from './WebGLRenderTarget.js';\n\nclass WebGLMultisampleRenderTarget extends WebGLRenderTarget {\n\n\tconstructor( width, height, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\tthis.samples = 4;\n\n\t\tthis.ignoreDepthForMultisampleCopy = options.ignoreDepth !== undefined ? options.ignoreDepth : true;\n\t\tthis.useRenderToTexture = ( options.useRenderToTexture !== undefined ) ? options.useRenderToTexture : false;\n\t\tthis.useRenderbuffer = this.useRenderToTexture === false;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy.call( this, source );\n\n\t\tthis.samples = source.samples;\n\t\tthis.useRenderToTexture = source.useRenderToTexture;\n\t\tthis.useRenderbuffer = source.useRenderbuffer;\n\n\t\treturn this;\n\n\t}\n\n}\n\nWebGLMultisampleRenderTarget.prototype.isWebGLMultisampleRenderTarget = true;\n\nexport { WebGLMultisampleRenderTarget };\n","function WebGLObjects( gl, geometries, attributes, info ) {\n\n\tlet updateMap = new WeakMap();\n\n\tfunction update( object ) {\n\n\t\tconst frame = info.render.frame;\n\n\t\tconst geometry = object.geometry;\n\t\tconst buffergeometry = geometries.get( object, geometry );\n\n\t\t// Update once per frame\n\n\t\tif ( updateMap.get( buffergeometry ) !== frame ) {\n\n\t\t\tgeometries.update( buffergeometry );\n\n\t\t\tupdateMap.set( buffergeometry, frame );\n\n\t\t}\n\n\t\tif ( object.isInstancedMesh ) {\n\n\t\t\tif ( object.hasEventListener( 'dispose', onInstancedMeshDispose ) === false ) {\n\n\t\t\t\tobject.addEventListener( 'dispose', onInstancedMeshDispose );\n\n\t\t\t}\n\n\t\t\tattributes.update( object.instanceMatrix, gl.ARRAY_BUFFER );\n\n\t\t\tif ( object.instanceColor !== null ) {\n\n\t\t\t\tattributes.update( object.instanceColor, gl.ARRAY_BUFFER );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn buffergeometry;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tupdateMap = new WeakMap();\n\n\t}\n\n\tfunction onInstancedMeshDispose( event ) {\n\n\t\tconst instancedMesh = event.target;\n\n\t\tinstancedMesh.removeEventListener( 'dispose', onInstancedMeshDispose );\n\n\t\tattributes.remove( instancedMesh.instanceMatrix );\n\n\t\tif ( instancedMesh.instanceColor !== null ) attributes.remove( instancedMesh.instanceColor );\n\n\t}\n\n\treturn {\n\n\t\tupdate: update,\n\t\tdispose: dispose\n\n\t};\n\n}\n\n\nexport { WebGLObjects };\n","import { Texture } from './Texture.js';\nimport { ClampToEdgeWrapping, NearestFilter } from '../constants.js';\n\nclass DataTexture3D extends Texture {\n\n\tconstructor( data = null, width = 1, height = 1, depth = 1 ) {\n\n\t\t// We're going to add .setXXX() methods for setting properties later.\n\t\t// Users can still set in DataTexture3D directly.\n\t\t//\n\t\t//\tconst texture = new THREE.DataTexture3D( data, width, height, depth );\n\t\t// \ttexture.anisotropy = 16;\n\t\t//\n\t\t// See #14839\n\n\t\tsuper( null );\n\n\t\tthis.image = { data, width, height, depth };\n\n\t\tthis.magFilter = NearestFilter;\n\t\tthis.minFilter = NearestFilter;\n\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t\tthis.generateMipmaps = false;\n\t\tthis.flipY = false;\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n}\n\nDataTexture3D.prototype.isDataTexture3D = true;\n\nexport { DataTexture3D };\n","/**\n * Uniforms of a program.\n * Those form a tree structure with a special top-level container for the root,\n * which you get by calling 'new WebGLUniforms( gl, program )'.\n *\n *\n * Properties of inner nodes including the top-level container:\n *\n * .seq - array of nested uniforms\n * .map - nested uniforms by name\n *\n *\n * Methods of all nodes except the top-level container:\n *\n * .setValue( gl, value, [textures] )\n *\n * \t\tuploads a uniform value(s)\n *  \tthe 'textures' parameter is needed for sampler uniforms\n *\n *\n * Static methods of the top-level container (textures factorizations):\n *\n * .upload( gl, seq, values, textures )\n *\n * \t\tsets uniforms in 'seq' to 'values[id].value'\n *\n * .seqWithValue( seq, values ) : filteredSeq\n *\n * \t\tfilters 'seq' entries with corresponding entry in values\n *\n *\n * Methods of the top-level container (textures factorizations):\n *\n * .setValue( gl, name, value, textures )\n *\n * \t\tsets uniform with  name 'name' to 'value'\n *\n * .setOptional( gl, obj, prop )\n *\n * \t\tlike .set for an optional property of the object\n *\n */\n\nimport { CubeTexture } from '../../textures/CubeTexture.js';\nimport { Texture } from '../../textures/Texture.js';\nimport { DataTexture2DArray } from '../../textures/DataTexture2DArray.js';\nimport { DataTexture3D } from '../../textures/DataTexture3D.js';\n\nconst emptyTexture = new Texture();\nconst emptyTexture2dArray = new DataTexture2DArray();\nconst emptyTexture3d = new DataTexture3D();\nconst emptyCubeTexture = new CubeTexture();\n\n// --- Utilities ---\n\n// Array Caches (provide typed arrays for temporary by size)\n\nconst arrayCacheF32 = [];\nconst arrayCacheI32 = [];\n\n// Float32Array caches used for uploading Matrix uniforms\n\nconst mat4array = new Float32Array( 16 );\nconst mat3array = new Float32Array( 9 );\nconst mat2array = new Float32Array( 4 );\n\n// Flattening for arrays of vectors and matrices\n\nfunction flatten( array, nBlocks, blockSize ) {\n\n\tconst firstElem = array[ 0 ];\n\n\tif ( firstElem <= 0 || firstElem > 0 ) return array;\n\t// unoptimized: ! isNaN( firstElem )\n\t// see http://jacksondunstan.com/articles/983\n\n\tconst n = nBlocks * blockSize;\n\tlet r = arrayCacheF32[ n ];\n\n\tif ( r === undefined ) {\n\n\t\tr = new Float32Array( n );\n\t\tarrayCacheF32[ n ] = r;\n\n\t}\n\n\tif ( nBlocks !== 0 ) {\n\n\t\tfirstElem.toArray( r, 0 );\n\n\t\tfor ( let i = 1, offset = 0; i !== nBlocks; ++ i ) {\n\n\t\t\toffset += blockSize;\n\t\t\tarray[ i ].toArray( r, offset );\n\n\t\t}\n\n\t}\n\n\treturn r;\n\n}\n\nfunction arraysEqual( a, b ) {\n\n\tif ( a.length !== b.length ) return false;\n\n\tfor ( let i = 0, l = a.length; i < l; i ++ ) {\n\n\t\tif ( a[ i ] !== b[ i ] ) return false;\n\n\t}\n\n\treturn true;\n\n}\n\nfunction copyArray( a, b ) {\n\n\tfor ( let i = 0, l = b.length; i < l; i ++ ) {\n\n\t\ta[ i ] = b[ i ];\n\n\t}\n\n}\n\n// Texture unit allocation\n\nfunction allocTexUnits( textures, n ) {\n\n\tlet r = arrayCacheI32[ n ];\n\n\tif ( r === undefined ) {\n\n\t\tr = new Int32Array( n );\n\t\tarrayCacheI32[ n ] = r;\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\tr[ i ] = textures.allocateTextureUnit();\n\n\t}\n\n\treturn r;\n\n}\n\n// --- Setters ---\n\n// Note: Defining these methods externally, because they come in a bunch\n// and this way their names minify.\n\n// Single scalar\n\nfunction setValueV1f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1f( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single float vector (from flat array or THREE.VectorN)\n\nfunction setValueV2f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {\n\n\t\t\tgl.uniform2f( this.addr, v.x, v.y );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform2fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV3f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {\n\n\t\t\tgl.uniform3f( this.addr, v.x, v.y, v.z );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\n\t\t}\n\n\t} else if ( v.r !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.r || cache[ 1 ] !== v.g || cache[ 2 ] !== v.b ) {\n\n\t\t\tgl.uniform3f( this.addr, v.r, v.g, v.b );\n\n\t\t\tcache[ 0 ] = v.r;\n\t\t\tcache[ 1 ] = v.g;\n\t\t\tcache[ 2 ] = v.b;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform3fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV4f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {\n\n\t\t\tgl.uniform4f( this.addr, v.x, v.y, v.z, v.w );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\t\t\tcache[ 3 ] = v.w;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform4fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\n// Single matrix (from flat array or THREE.MatrixN)\n\nfunction setValueM2( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix2fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat2array.set( elements );\n\n\t\tgl.uniformMatrix2fv( this.addr, false, mat2array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\nfunction setValueM3( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix3fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat3array.set( elements );\n\n\t\tgl.uniformMatrix3fv( this.addr, false, mat3array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\nfunction setValueM4( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix4fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat4array.set( elements );\n\n\t\tgl.uniformMatrix4fv( this.addr, false, mat4array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\n// Single integer / boolean\n\nfunction setValueV1i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1i( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single integer / boolean vector (from flat array)\n\nfunction setValueV2i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( arraysEqual( cache, v ) ) return;\n\n\tgl.uniform2iv( this.addr, v );\n\n\tcopyArray( cache, v );\n\n}\n\nfunction setValueV3i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( arraysEqual( cache, v ) ) return;\n\n\tgl.uniform3iv( this.addr, v );\n\n\tcopyArray( cache, v );\n\n}\n\nfunction setValueV4i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( arraysEqual( cache, v ) ) return;\n\n\tgl.uniform4iv( this.addr, v );\n\n\tcopyArray( cache, v );\n\n}\n\n// Single unsigned integer\n\nfunction setValueV1ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1ui( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single unsigned integer vector (from flat array)\n\nfunction setValueV2ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( arraysEqual( cache, v ) ) return;\n\n\tgl.uniform2uiv( this.addr, v );\n\n\tcopyArray( cache, v );\n\n}\n\nfunction setValueV3ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( arraysEqual( cache, v ) ) return;\n\n\tgl.uniform3uiv( this.addr, v );\n\n\tcopyArray( cache, v );\n\n}\n\nfunction setValueV4ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( arraysEqual( cache, v ) ) return;\n\n\tgl.uniform4uiv( this.addr, v );\n\n\tcopyArray( cache, v );\n\n}\n\n\n// Single texture (2D / Cube)\n\nfunction setValueT1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.safeSetTexture2D( v || emptyTexture, unit );\n\n}\n\nfunction setValueT3D1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTexture3D( v || emptyTexture3d, unit );\n\n}\n\nfunction setValueT6( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.safeSetTextureCube( v || emptyCubeTexture, unit );\n\n}\n\nfunction setValueT2DArray1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTexture2DArray( v || emptyTexture2dArray, unit );\n\n}\n\n// Helper to pick the right setter for the singular case\n\nfunction getSingularSetter( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase 0x1406: return setValueV1f; // FLOAT\n\t\tcase 0x8b50: return setValueV2f; // _VEC2\n\t\tcase 0x8b51: return setValueV3f; // _VEC3\n\t\tcase 0x8b52: return setValueV4f; // _VEC4\n\n\t\tcase 0x8b5a: return setValueM2; // _MAT2\n\t\tcase 0x8b5b: return setValueM3; // _MAT3\n\t\tcase 0x8b5c: return setValueM4; // _MAT4\n\n\t\tcase 0x1404: case 0x8b56: return setValueV1i; // INT, BOOL\n\t\tcase 0x8b53: case 0x8b57: return setValueV2i; // _VEC2\n\t\tcase 0x8b54: case 0x8b58: return setValueV3i; // _VEC3\n\t\tcase 0x8b55: case 0x8b59: return setValueV4i; // _VEC4\n\n\t\tcase 0x1405: return setValueV1ui; // UINT\n\t\tcase 0x8dc6: return setValueV2ui; // _VEC2\n\t\tcase 0x8dc7: return setValueV3ui; // _VEC3\n\t\tcase 0x8dc8: return setValueV4ui; // _VEC4\n\n\t\tcase 0x8b5e: // SAMPLER_2D\n\t\tcase 0x8d66: // SAMPLER_EXTERNAL_OES\n\t\tcase 0x8dca: // INT_SAMPLER_2D\n\t\tcase 0x8dd2: // UNSIGNED_INT_SAMPLER_2D\n\t\tcase 0x8b62: // SAMPLER_2D_SHADOW\n\t\t\treturn setValueT1;\n\n\t\tcase 0x8b5f: // SAMPLER_3D\n\t\tcase 0x8dcb: // INT_SAMPLER_3D\n\t\tcase 0x8dd3: // UNSIGNED_INT_SAMPLER_3D\n\t\t\treturn setValueT3D1;\n\n\t\tcase 0x8b60: // SAMPLER_CUBE\n\t\tcase 0x8dcc: // INT_SAMPLER_CUBE\n\t\tcase 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE\n\t\tcase 0x8dc5: // SAMPLER_CUBE_SHADOW\n\t\t\treturn setValueT6;\n\n\t\tcase 0x8dc1: // SAMPLER_2D_ARRAY\n\t\tcase 0x8dcf: // INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dd7: // UNSIGNED_INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dc4: // SAMPLER_2D_ARRAY_SHADOW\n\t\t\treturn setValueT2DArray1;\n\n\t}\n\n}\n\n\n// Array of scalars\n\nfunction setValueV1fArray( gl, v ) {\n\n\tgl.uniform1fv( this.addr, v );\n\n}\n\n// Array of vectors (from flat array or array of THREE.VectorN)\n\nfunction setValueV2fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 2 );\n\n\tgl.uniform2fv( this.addr, data );\n\n}\n\nfunction setValueV3fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 3 );\n\n\tgl.uniform3fv( this.addr, data );\n\n}\n\nfunction setValueV4fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 4 );\n\n\tgl.uniform4fv( this.addr, data );\n\n}\n\n// Array of matrices (from flat array or array of THREE.MatrixN)\n\nfunction setValueM2Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 4 );\n\n\tgl.uniformMatrix2fv( this.addr, false, data );\n\n}\n\nfunction setValueM3Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 9 );\n\n\tgl.uniformMatrix3fv( this.addr, false, data );\n\n}\n\nfunction setValueM4Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 16 );\n\n\tgl.uniformMatrix4fv( this.addr, false, data );\n\n}\n\n// Array of integer / boolean\n\nfunction setValueV1iArray( gl, v ) {\n\n\tgl.uniform1iv( this.addr, v );\n\n}\n\n// Array of integer / boolean vectors (from flat array)\n\nfunction setValueV2iArray( gl, v ) {\n\n\tgl.uniform2iv( this.addr, v );\n\n}\n\nfunction setValueV3iArray( gl, v ) {\n\n\tgl.uniform3iv( this.addr, v );\n\n}\n\nfunction setValueV4iArray( gl, v ) {\n\n\tgl.uniform4iv( this.addr, v );\n\n}\n\n// Array of unsigned integer\n\nfunction setValueV1uiArray( gl, v ) {\n\n\tgl.uniform1uiv( this.addr, v );\n\n}\n\n// Array of unsigned integer vectors (from flat array)\n\nfunction setValueV2uiArray( gl, v ) {\n\n\tgl.uniform2uiv( this.addr, v );\n\n}\n\nfunction setValueV3uiArray( gl, v ) {\n\n\tgl.uniform3uiv( this.addr, v );\n\n}\n\nfunction setValueV4uiArray( gl, v ) {\n\n\tgl.uniform4uiv( this.addr, v );\n\n}\n\n\n// Array of textures (2D / 3D / Cube / 2DArray)\n\nfunction setValueT1Array( gl, v, textures ) {\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tgl.uniform1iv( this.addr, units );\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.safeSetTexture2D( v[ i ] || emptyTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT3DArray( gl, v, textures ) {\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tgl.uniform1iv( this.addr, units );\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture3D( v[ i ] || emptyTexture3d, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT6Array( gl, v, textures ) {\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tgl.uniform1iv( this.addr, units );\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.safeSetTextureCube( v[ i ] || emptyCubeTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT2DArrayArray( gl, v, textures ) {\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tgl.uniform1iv( this.addr, units );\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture2DArray( v[ i ] || emptyTexture2dArray, units[ i ] );\n\n\t}\n\n}\n\n\n// Helper to pick the right setter for a pure (bottom-level) array\n\nfunction getPureArraySetter( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase 0x1406: return setValueV1fArray; // FLOAT\n\t\tcase 0x8b50: return setValueV2fArray; // _VEC2\n\t\tcase 0x8b51: return setValueV3fArray; // _VEC3\n\t\tcase 0x8b52: return setValueV4fArray; // _VEC4\n\n\t\tcase 0x8b5a: return setValueM2Array; // _MAT2\n\t\tcase 0x8b5b: return setValueM3Array; // _MAT3\n\t\tcase 0x8b5c: return setValueM4Array; // _MAT4\n\n\t\tcase 0x1404: case 0x8b56: return setValueV1iArray; // INT, BOOL\n\t\tcase 0x8b53: case 0x8b57: return setValueV2iArray; // _VEC2\n\t\tcase 0x8b54: case 0x8b58: return setValueV3iArray; // _VEC3\n\t\tcase 0x8b55: case 0x8b59: return setValueV4iArray; // _VEC4\n\n\t\tcase 0x1405: return setValueV1uiArray; // UINT\n\t\tcase 0x8dc6: return setValueV2uiArray; // _VEC2\n\t\tcase 0x8dc7: return setValueV3uiArray; // _VEC3\n\t\tcase 0x8dc8: return setValueV4uiArray; // _VEC4\n\n\t\tcase 0x8b5e: // SAMPLER_2D\n\t\tcase 0x8d66: // SAMPLER_EXTERNAL_OES\n\t\tcase 0x8dca: // INT_SAMPLER_2D\n\t\tcase 0x8dd2: // UNSIGNED_INT_SAMPLER_2D\n\t\tcase 0x8b62: // SAMPLER_2D_SHADOW\n\t\t\treturn setValueT1Array;\n\n\t\tcase 0x8b5f: // SAMPLER_3D\n\t\tcase 0x8dcb: // INT_SAMPLER_3D\n\t\tcase 0x8dd3: // UNSIGNED_INT_SAMPLER_3D\n\t\t\treturn setValueT3DArray;\n\n\t\tcase 0x8b60: // SAMPLER_CUBE\n\t\tcase 0x8dcc: // INT_SAMPLER_CUBE\n\t\tcase 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE\n\t\tcase 0x8dc5: // SAMPLER_CUBE_SHADOW\n\t\t\treturn setValueT6Array;\n\n\t\tcase 0x8dc1: // SAMPLER_2D_ARRAY\n\t\tcase 0x8dcf: // INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dd7: // UNSIGNED_INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dc4: // SAMPLER_2D_ARRAY_SHADOW\n\t\t\treturn setValueT2DArrayArray;\n\n\t}\n\n}\n\n// --- Uniform Classes ---\n\nfunction SingleUniform( id, activeInfo, addr ) {\n\n\tthis.id = id;\n\tthis.addr = addr;\n\tthis.cache = [];\n\tthis.setValue = getSingularSetter( activeInfo.type );\n\n\t// this.path = activeInfo.name; // DEBUG\n\n}\n\nfunction PureArrayUniform( id, activeInfo, addr ) {\n\n\tthis.id = id;\n\tthis.addr = addr;\n\tthis.cache = [];\n\tthis.size = activeInfo.size;\n\tthis.setValue = getPureArraySetter( activeInfo.type );\n\n\t// this.path = activeInfo.name; // DEBUG\n\n}\n\nPureArrayUniform.prototype.updateCache = function ( data ) {\n\n\tconst cache = this.cache;\n\n\tif ( data instanceof Float32Array && cache.length !== data.length ) {\n\n\t\tthis.cache = new Float32Array( data.length );\n\n\t}\n\n\tcopyArray( cache, data );\n\n};\n\nfunction StructuredUniform( id ) {\n\n\tthis.id = id;\n\n\tthis.seq = [];\n\tthis.map = {};\n\n}\n\nStructuredUniform.prototype.setValue = function ( gl, value, textures ) {\n\n\tconst seq = this.seq;\n\n\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\tconst u = seq[ i ];\n\t\tu.setValue( gl, value[ u.id ], textures );\n\n\t}\n\n};\n\n// --- Top-level ---\n\n// Parser - builds up the property tree from the path strings\n\nconst RePathPart = /(\\w+)(\\])?(\\[|\\.)?/g;\n\n// extracts\n// \t- the identifier (member name or array index)\n//  - followed by an optional right bracket (found when array index)\n//  - followed by an optional left bracket or dot (type of subscript)\n//\n// Note: These portions can be read in a non-overlapping fashion and\n// allow straightforward parsing of the hierarchy that WebGL encodes\n// in the uniform names.\n\nfunction addUniform( container, uniformObject ) {\n\n\tcontainer.seq.push( uniformObject );\n\tcontainer.map[ uniformObject.id ] = uniformObject;\n\n}\n\nfunction parseUniform( activeInfo, addr, container ) {\n\n\tconst path = activeInfo.name,\n\t\tpathLength = path.length;\n\n\t// reset RegExp object, because of the early exit of a previous run\n\tRePathPart.lastIndex = 0;\n\n\twhile ( true ) {\n\n\t\tconst match = RePathPart.exec( path ),\n\t\t\tmatchEnd = RePathPart.lastIndex;\n\n\t\tlet id = match[ 1 ];\n\t\tconst idIsIndex = match[ 2 ] === ']',\n\t\t\tsubscript = match[ 3 ];\n\n\t\tif ( idIsIndex ) id = id | 0; // convert to integer\n\n\t\tif ( subscript === undefined || subscript === '[' && matchEnd + 2 === pathLength ) {\n\n\t\t\t// bare name or \"pure\" bottom-level array \"[0]\" suffix\n\n\t\t\taddUniform( container, subscript === undefined ?\n\t\t\t\tnew SingleUniform( id, activeInfo, addr ) :\n\t\t\t\tnew PureArrayUniform( id, activeInfo, addr ) );\n\n\t\t\tbreak;\n\n\t\t} else {\n\n\t\t\t// step into inner node / create it in case it doesn't exist\n\n\t\t\tconst map = container.map;\n\t\t\tlet next = map[ id ];\n\n\t\t\tif ( next === undefined ) {\n\n\t\t\t\tnext = new StructuredUniform( id );\n\t\t\t\taddUniform( container, next );\n\n\t\t\t}\n\n\t\t\tcontainer = next;\n\n\t\t}\n\n\t}\n\n}\n\n// Root Container\n\nfunction WebGLUniforms( gl, program ) {\n\n\tthis.seq = [];\n\tthis.map = {};\n\n\tconst n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS );\n\n\tfor ( let i = 0; i < n; ++ i ) {\n\n\t\tconst info = gl.getActiveUniform( program, i ),\n\t\t\taddr = gl.getUniformLocation( program, info.name );\n\n\t\tparseUniform( info, addr, this );\n\n\t}\n\n}\n\nWebGLUniforms.prototype.setValue = function ( gl, name, value, textures ) {\n\n\tconst u = this.map[ name ];\n\n\tif ( u !== undefined ) u.setValue( gl, value, textures );\n\n};\n\nWebGLUniforms.prototype.setOptional = function ( gl, object, name ) {\n\n\tconst v = object[ name ];\n\n\tif ( v !== undefined ) this.setValue( gl, name, v );\n\n};\n\n\n// Static interface\n\nWebGLUniforms.upload = function ( gl, seq, values, textures ) {\n\n\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\tconst u = seq[ i ],\n\t\t\tv = values[ u.id ];\n\n\t\tif ( v.needsUpdate !== false ) {\n\n\t\t\t// note: always updating when .needsUpdate is undefined\n\t\t\tu.setValue( gl, v.value, textures );\n\n\t\t}\n\n\t}\n\n};\n\nWebGLUniforms.seqWithValue = function ( seq, values ) {\n\n\tconst r = [];\n\n\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\tconst u = seq[ i ];\n\t\tif ( u.id in values ) r.push( u );\n\n\t}\n\n\treturn r;\n\n};\n\nexport { WebGLUniforms };\n","function WebGLShader( gl, type, string ) {\n\n\tconst shader = gl.createShader( type );\n\n\tgl.shaderSource( shader, string );\n\tgl.compileShader( shader );\n\n\treturn shader;\n\n}\n\nexport { WebGLShader };\n","import { WebGLUniforms } from './WebGLUniforms.js';\nimport { WebGLShader } from './WebGLShader.js';\nimport { ShaderChunk } from '../shaders/ShaderChunk.js';\nimport { NoToneMapping, AddOperation, MixOperation, MultiplyOperation, CubeRefractionMapping, CubeUVRefractionMapping, CubeUVReflectionMapping, CubeReflectionMapping, PCFSoftShadowMap, PCFShadowMap, VSMShadowMap, ACESFilmicToneMapping, CineonToneMapping, CustomToneMapping, ReinhardToneMapping, LinearToneMapping, sRGBEncoding, LinearEncoding, GLSL3 } from '../../constants.js';\n\nlet programIdCount = 0;\n\nfunction addLineNumbers( string ) {\n\n\tconst lines = string.split( '\\n' );\n\n\tfor ( let i = 0; i < lines.length; i ++ ) {\n\n\t\tlines[ i ] = ( i + 1 ) + ': ' + lines[ i ];\n\n\t}\n\n\treturn lines.join( '\\n' );\n\n}\n\nfunction getEncodingComponents( encoding ) {\n\n\tswitch ( encoding ) {\n\n\t\tcase LinearEncoding:\n\t\t\treturn [ 'Linear', '( value )' ];\n\t\tcase sRGBEncoding:\n\t\t\treturn [ 'sRGB', '( value )' ];\n\t\tdefault:\n\t\t\tconsole.warn( 'THREE.WebGLProgram: Unsupported encoding:', encoding );\n\t\t\treturn [ 'Linear', '( value )' ];\n\n\t}\n\n}\n\nfunction getShaderErrors( gl, shader, type ) {\n\n\tconst status = gl.getShaderParameter( shader, gl.COMPILE_STATUS );\n\tconst errors = gl.getShaderInfoLog( shader ).trim();\n\n\tif ( status && errors === '' ) return '';\n\n\t// --enable-privileged-webgl-extension\n\t// console.log( '**' + type + '**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) );\n\n\treturn type.toUpperCase() + '\\n\\n' + errors + '\\n\\n' + addLineNumbers( gl.getShaderSource( shader ) );\n\n}\n\nfunction getTexelEncodingFunction( functionName, encoding ) {\n\n\tconst components = getEncodingComponents( encoding );\n\treturn 'vec4 ' + functionName + '( vec4 value ) { return LinearTo' + components[ 0 ] + components[ 1 ] + '; }';\n\n}\n\nfunction getToneMappingFunction( functionName, toneMapping ) {\n\n\tlet toneMappingName;\n\n\tswitch ( toneMapping ) {\n\n\t\tcase LinearToneMapping:\n\t\t\ttoneMappingName = 'Linear';\n\t\t\tbreak;\n\n\t\tcase ReinhardToneMapping:\n\t\t\ttoneMappingName = 'Reinhard';\n\t\t\tbreak;\n\n\t\tcase CineonToneMapping:\n\t\t\ttoneMappingName = 'OptimizedCineon';\n\t\t\tbreak;\n\n\t\tcase ACESFilmicToneMapping:\n\t\t\ttoneMappingName = 'ACESFilmic';\n\t\t\tbreak;\n\n\t\tcase CustomToneMapping:\n\t\t\ttoneMappingName = 'Custom';\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tconsole.warn( 'THREE.WebGLProgram: Unsupported toneMapping:', toneMapping );\n\t\t\ttoneMappingName = 'Linear';\n\n\t}\n\n\treturn 'vec3 ' + functionName + '( vec3 color ) { return ' + toneMappingName + 'ToneMapping( color ); }';\n\n}\n\nfunction generateExtensions( parameters ) {\n\n\tconst chunks = [\n\t\t( parameters.extensionDerivatives || parameters.envMapCubeUV || parameters.bumpMap || parameters.tangentSpaceNormalMap || parameters.clearcoatNormalMap || parameters.flatShading || parameters.shaderID === 'physical' ) ? '#extension GL_OES_standard_derivatives : enable' : '',\n\t\t( parameters.extensionFragDepth || parameters.logarithmicDepthBuffer ) && parameters.rendererExtensionFragDepth ? '#extension GL_EXT_frag_depth : enable' : '',\n\t\t( parameters.extensionDrawBuffers && parameters.rendererExtensionDrawBuffers ) ? '#extension GL_EXT_draw_buffers : require' : '',\n\t\t( parameters.extensionShaderTextureLOD || parameters.envMap || parameters.transmission ) && parameters.rendererExtensionShaderTextureLod ? '#extension GL_EXT_shader_texture_lod : enable' : ''\n\t];\n\n\treturn chunks.filter( filterEmptyLine ).join( '\\n' );\n\n}\n\nfunction generateDefines( defines ) {\n\n\tconst chunks = [];\n\n\tfor ( const name in defines ) {\n\n\t\tconst value = defines[ name ];\n\n\t\tif ( value === false ) continue;\n\n\t\tchunks.push( '#define ' + name + ' ' + value );\n\n\t}\n\n\treturn chunks.join( '\\n' );\n\n}\n\nfunction fetchAttributeLocations( gl, program ) {\n\n\tconst attributes = {};\n\n\tconst n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES );\n\n\tfor ( let i = 0; i < n; i ++ ) {\n\n\t\tconst info = gl.getActiveAttrib( program, i );\n\t\tconst name = info.name;\n\n\t\tlet locationSize = 1;\n\t\tif ( info.type === gl.FLOAT_MAT2 ) locationSize = 2;\n\t\tif ( info.type === gl.FLOAT_MAT3 ) locationSize = 3;\n\t\tif ( info.type === gl.FLOAT_MAT4 ) locationSize = 4;\n\n\t\t// console.log( 'THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:', name, i );\n\n\t\tattributes[ name ] = {\n\t\t\ttype: info.type,\n\t\t\tlocation: gl.getAttribLocation( program, name ),\n\t\t\tlocationSize: locationSize\n\t\t};\n\n\t}\n\n\treturn attributes;\n\n}\n\nfunction filterEmptyLine( string ) {\n\n\treturn string !== '';\n\n}\n\nfunction replaceLightNums( string, parameters ) {\n\n\treturn string\n\t\t.replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights )\n\t\t.replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights )\n\t\t.replace( /NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights )\n\t\t.replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights )\n\t\t.replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights )\n\t\t.replace( /NUM_DIR_LIGHT_SHADOWS/g, parameters.numDirLightShadows )\n\t\t.replace( /NUM_SPOT_LIGHT_SHADOWS/g, parameters.numSpotLightShadows )\n\t\t.replace( /NUM_POINT_LIGHT_SHADOWS/g, parameters.numPointLightShadows );\n\n}\n\nfunction replaceClippingPlaneNums( string, parameters ) {\n\n\treturn string\n\t\t.replace( /NUM_CLIPPING_PLANES/g, parameters.numClippingPlanes )\n\t\t.replace( /UNION_CLIPPING_PLANES/g, ( parameters.numClippingPlanes - parameters.numClipIntersection ) );\n\n}\n\n// Resolve Includes\n\nconst includePattern = /^[ \\t]*#include +<([\\w\\d./]+)>/gm;\n\nfunction resolveIncludes( string ) {\n\n\treturn string.replace( includePattern, includeReplacer );\n\n}\n\nfunction includeReplacer( match, include ) {\n\n\tconst string = ShaderChunk[ include ];\n\n\tif ( string === undefined ) {\n\n\t\tthrow new Error( 'Can not resolve #include <' + include + '>' );\n\n\t}\n\n\treturn resolveIncludes( string );\n\n}\n\n// Unroll Loops\n\nconst deprecatedUnrollLoopPattern = /#pragma unroll_loop[\\s]+?for \\( int i \\= (\\d+)\\; i < (\\d+)\\; i \\+\\+ \\) \\{([\\s\\S]+?)(?=\\})\\}/g;\nconst unrollLoopPattern = /#pragma unroll_loop_start\\s+for\\s*\\(\\s*int\\s+i\\s*=\\s*(\\d+)\\s*;\\s*i\\s*<\\s*(\\d+)\\s*;\\s*i\\s*\\+\\+\\s*\\)\\s*{([\\s\\S]+?)}\\s+#pragma unroll_loop_end/g;\n\nfunction unrollLoops( string ) {\n\n\treturn string\n\t\t.replace( unrollLoopPattern, loopReplacer )\n\t\t.replace( deprecatedUnrollLoopPattern, deprecatedLoopReplacer );\n\n}\n\nfunction deprecatedLoopReplacer( match, start, end, snippet ) {\n\n\tconsole.warn( 'WebGLProgram: #pragma unroll_loop shader syntax is deprecated. Please use #pragma unroll_loop_start syntax instead.' );\n\treturn loopReplacer( match, start, end, snippet );\n\n}\n\nfunction loopReplacer( match, start, end, snippet ) {\n\n\tlet string = '';\n\n\tfor ( let i = parseInt( start ); i < parseInt( end ); i ++ ) {\n\n\t\tstring += snippet\n\t\t\t.replace( /\\[\\s*i\\s*\\]/g, '[ ' + i + ' ]' )\n\t\t\t.replace( /UNROLLED_LOOP_INDEX/g, i );\n\n\t}\n\n\treturn string;\n\n}\n\n//\n\nfunction generatePrecision( parameters ) {\n\n\tlet precisionstring = 'precision ' + parameters.precision + ' float;\\nprecision ' + parameters.precision + ' int;';\n\n\tif ( parameters.precision === 'highp' ) {\n\n\t\tprecisionstring += '\\n#define HIGH_PRECISION';\n\n\t} else if ( parameters.precision === 'mediump' ) {\n\n\t\tprecisionstring += '\\n#define MEDIUM_PRECISION';\n\n\t} else if ( parameters.precision === 'lowp' ) {\n\n\t\tprecisionstring += '\\n#define LOW_PRECISION';\n\n\t}\n\n\treturn precisionstring;\n\n}\n\nfunction generateShadowMapTypeDefine( parameters ) {\n\n\tlet shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC';\n\n\tif ( parameters.shadowMapType === PCFShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF';\n\n\t} else if ( parameters.shadowMapType === PCFSoftShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT';\n\n\t} else if ( parameters.shadowMapType === VSMShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_VSM';\n\n\t}\n\n\treturn shadowMapTypeDefine;\n\n}\n\nfunction generateEnvMapTypeDefine( parameters ) {\n\n\tlet envMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.envMapMode ) {\n\n\t\t\tcase CubeReflectionMapping:\n\t\t\tcase CubeRefractionMapping:\n\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\t\t\t\tbreak;\n\n\t\t\tcase CubeUVReflectionMapping:\n\t\t\tcase CubeUVRefractionMapping:\n\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapTypeDefine;\n\n}\n\nfunction generateEnvMapModeDefine( parameters ) {\n\n\tlet envMapModeDefine = 'ENVMAP_MODE_REFLECTION';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.envMapMode ) {\n\n\t\t\tcase CubeRefractionMapping:\n\t\t\tcase CubeUVRefractionMapping:\n\n\t\t\t\tenvMapModeDefine = 'ENVMAP_MODE_REFRACTION';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapModeDefine;\n\n}\n\nfunction generateEnvMapBlendingDefine( parameters ) {\n\n\tlet envMapBlendingDefine = 'ENVMAP_BLENDING_NONE';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.combine ) {\n\n\t\t\tcase MultiplyOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\t\t\t\tbreak;\n\n\t\t\tcase MixOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MIX';\n\t\t\t\tbreak;\n\n\t\t\tcase AddOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_ADD';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapBlendingDefine;\n\n}\n\nfunction WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {\n\n\t// TODO Send this event to Three.js DevTools\n\t// console.log( 'WebGLProgram', cacheKey );\n\n\tconst gl = renderer.getContext();\n\n\tconst defines = parameters.defines;\n\n\tlet vertexShader = parameters.vertexShader;\n\tlet fragmentShader = parameters.fragmentShader;\n\n\tconst shadowMapTypeDefine = generateShadowMapTypeDefine( parameters );\n\tconst envMapTypeDefine = generateEnvMapTypeDefine( parameters );\n\tconst envMapModeDefine = generateEnvMapModeDefine( parameters );\n\tconst envMapBlendingDefine = generateEnvMapBlendingDefine( parameters );\n\n\tconst customExtensions = parameters.isWebGL2 ? '' : generateExtensions( parameters );\n\n\tconst customDefines = generateDefines( defines );\n\n\tconst program = gl.createProgram();\n\n\tlet prefixVertex, prefixFragment;\n\tlet versionString = parameters.glslVersion ? '#version ' + parameters.glslVersion + '\\n' : '';\n\n\tif ( parameters.isRawShaderMaterial ) {\n\n\t\tprefixVertex = [\n\n\t\t\tcustomDefines\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tif ( prefixVertex.length > 0 ) {\n\n\t\t\tprefixVertex += '\\n';\n\n\t\t}\n\n\t\tprefixFragment = [\n\n\t\t\tcustomExtensions,\n\t\t\tcustomDefines\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tif ( prefixFragment.length > 0 ) {\n\n\t\t\tprefixFragment += '\\n';\n\n\t\t}\n\n\t} else {\n\n\t\tprefixVertex = [\n\n\t\t\tgeneratePrecision( parameters ),\n\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines,\n\n\t\t\tparameters.instancing ? '#define USE_INSTANCING' : '',\n\t\t\tparameters.instancingColor ? '#define USE_INSTANCING_COLOR' : '',\n\n\t\t\tparameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '',\n\n\t\t\t'#define MAX_BONES ' + parameters.maxBones,\n\t\t\t( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',\n\t\t\t( parameters.useFog && parameters.fogExp2 ) ? '#define FOG_EXP2' : '',\n\n\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\t( parameters.normalMap && parameters.objectSpaceNormalMap ) ? '#define OBJECTSPACE_NORMALMAP' : '',\n\t\t\t( parameters.normalMap && parameters.tangentSpaceNormalMap ) ? '#define TANGENTSPACE_NORMALMAP' : '',\n\n\t\t\tparameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',\n\t\t\tparameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',\n\t\t\tparameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',\n\n\t\t\tparameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '',\n\n\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\tparameters.specularIntensityMap ? '#define USE_SPECULARINTENSITYMAP' : '',\n\t\t\tparameters.specularColorMap ? '#define USE_SPECULARCOLORMAP' : '',\n\n\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\n\t\t\tparameters.transmission ? '#define USE_TRANSMISSION' : '',\n\t\t\tparameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '',\n\t\t\tparameters.thicknessMap ? '#define USE_THICKNESSMAP' : '',\n\n\t\t\tparameters.sheenColorMap ? '#define USE_SHEENCOLORMAP' : '',\n\t\t\tparameters.sheenRoughnessMap ? '#define USE_SHEENROUGHNESSMAP' : '',\n\n\t\t\tparameters.vertexTangents ? '#define USE_TANGENT' : '',\n\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\t\t\tparameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '',\n\t\t\tparameters.vertexUvs ? '#define USE_UV' : '',\n\t\t\tparameters.uvsVertexOnly ? '#define UVS_VERTEX_ONLY' : '',\n\n\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\tparameters.skinning ? '#define USE_SKINNING' : '',\n\t\t\tparameters.useVertexTexture ? '#define BONE_TEXTURE' : '',\n\n\t\t\tparameters.morphTargets ? '#define USE_MORPHTARGETS' : '',\n\t\t\tparameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '',\n\t\t\t( parameters.morphTargets && parameters.isWebGL2 ) ? '#define MORPHTARGETS_TEXTURE' : '',\n\t\t\t( parameters.morphTargets && parameters.isWebGL2 ) ? '#define MORPHTARGETS_COUNT ' + parameters.morphTargetsCount : '',\n\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\tparameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '',\n\n\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\t( parameters.logarithmicDepthBuffer && parameters.rendererExtensionFragDepth ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\t'uniform mat4 modelMatrix;',\n\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t'uniform mat3 normalMatrix;',\n\t\t\t'uniform vec3 cameraPosition;',\n\t\t\t'uniform bool isOrthographic;',\n\n\t\t\t'#ifdef USE_INSTANCING',\n\n\t\t\t'\tattribute mat4 instanceMatrix;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_INSTANCING_COLOR',\n\n\t\t\t'\tattribute vec3 instanceColor;',\n\n\t\t\t'#endif',\n\n\t\t\t'attribute vec3 position;',\n\t\t\t'attribute vec3 normal;',\n\t\t\t'attribute vec2 uv;',\n\n\t\t\t'#ifdef USE_TANGENT',\n\n\t\t\t'\tattribute vec4 tangent;',\n\n\t\t\t'#endif',\n\n\t\t\t'#if defined( USE_COLOR_ALPHA )',\n\n\t\t\t'\tattribute vec4 color;',\n\n\t\t\t'#elif defined( USE_COLOR )',\n\n\t\t\t'\tattribute vec3 color;',\n\n\t\t\t'#endif',\n\n\t\t\t'#if ( defined( USE_MORPHTARGETS ) && ! defined( MORPHTARGETS_TEXTURE ) )',\n\n\t\t\t'\tattribute vec3 morphTarget0;',\n\t\t\t'\tattribute vec3 morphTarget1;',\n\t\t\t'\tattribute vec3 morphTarget2;',\n\t\t\t'\tattribute vec3 morphTarget3;',\n\n\t\t\t'\t#ifdef USE_MORPHNORMALS',\n\n\t\t\t'\t\tattribute vec3 morphNormal0;',\n\t\t\t'\t\tattribute vec3 morphNormal1;',\n\t\t\t'\t\tattribute vec3 morphNormal2;',\n\t\t\t'\t\tattribute vec3 morphNormal3;',\n\n\t\t\t'\t#else',\n\n\t\t\t'\t\tattribute vec3 morphTarget4;',\n\t\t\t'\t\tattribute vec3 morphTarget5;',\n\t\t\t'\t\tattribute vec3 morphTarget6;',\n\t\t\t'\t\tattribute vec3 morphTarget7;',\n\n\t\t\t'\t#endif',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_SKINNING',\n\n\t\t\t'\tattribute vec4 skinIndex;',\n\t\t\t'\tattribute vec4 skinWeight;',\n\n\t\t\t'#endif',\n\n\t\t\t'\\n'\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tprefixFragment = [\n\n\t\t\tcustomExtensions,\n\n\t\t\tgeneratePrecision( parameters ),\n\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines,\n\n\t\t\t( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',\n\t\t\t( parameters.useFog && parameters.fogExp2 ) ? '#define FOG_EXP2' : '',\n\n\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\tparameters.matcap ? '#define USE_MATCAP' : '',\n\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\tparameters.envMap ? '#define ' + envMapTypeDefine : '',\n\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\tparameters.envMap ? '#define ' + envMapBlendingDefine : '',\n\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\t( parameters.normalMap && parameters.objectSpaceNormalMap ) ? '#define OBJECTSPACE_NORMALMAP' : '',\n\t\t\t( parameters.normalMap && parameters.tangentSpaceNormalMap ) ? '#define TANGENTSPACE_NORMALMAP' : '',\n\n\t\t\tparameters.clearcoat ? '#define USE_CLEARCOAT' : '',\n\t\t\tparameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',\n\t\t\tparameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',\n\t\t\tparameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',\n\n\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\tparameters.specularIntensityMap ? '#define USE_SPECULARINTENSITYMAP' : '',\n\t\t\tparameters.specularColorMap ? '#define USE_SPECULARCOLORMAP' : '',\n\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\n\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\tparameters.alphaTest ? '#define USE_ALPHATEST' : '',\n\n\t\t\tparameters.sheen ? '#define USE_SHEEN' : '',\n\t\t\tparameters.sheenColorMap ? '#define USE_SHEENCOLORMAP' : '',\n\t\t\tparameters.sheenRoughnessMap ? '#define USE_SHEENROUGHNESSMAP' : '',\n\n\t\t\tparameters.transmission ? '#define USE_TRANSMISSION' : '',\n\t\t\tparameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '',\n\t\t\tparameters.thicknessMap ? '#define USE_THICKNESSMAP' : '',\n\n\t\t\tparameters.decodeVideoTexture ? '#define DECODE_VIDEO_TEXTURE' : '',\n\n\t\t\tparameters.vertexTangents ? '#define USE_TANGENT' : '',\n\t\t\tparameters.vertexColors || parameters.instancingColor ? '#define USE_COLOR' : '',\n\t\t\tparameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '',\n\t\t\tparameters.vertexUvs ? '#define USE_UV' : '',\n\t\t\tparameters.uvsVertexOnly ? '#define UVS_VERTEX_ONLY' : '',\n\n\t\t\tparameters.gradientMap ? '#define USE_GRADIENTMAP' : '',\n\n\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\tparameters.premultipliedAlpha ? '#define PREMULTIPLIED_ALPHA' : '',\n\n\t\t\tparameters.physicallyCorrectLights ? '#define PHYSICALLY_CORRECT_LIGHTS' : '',\n\n\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\t( parameters.logarithmicDepthBuffer && parameters.rendererExtensionFragDepth ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\t( ( parameters.extensionShaderTextureLOD || parameters.envMap ) && parameters.rendererExtensionShaderTextureLod ) ? '#define TEXTURE_LOD_EXT' : '',\n\n\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t'uniform vec3 cameraPosition;',\n\t\t\t'uniform bool isOrthographic;',\n\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? '#define TONE_MAPPING' : '',\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( 'toneMapping', parameters.toneMapping ) : '',\n\n\t\t\tparameters.dithering ? '#define DITHERING' : '',\n\t\t\tparameters.transparent ? '' : '#define OPAQUE',\n\n\t\t\tShaderChunk[ 'encodings_pars_fragment' ], // this code is required here because it is used by the various encoding/decoding function defined below\n\t\t\tgetTexelEncodingFunction( 'linearToOutputTexel', parameters.outputEncoding ),\n\n\t\t\tparameters.depthPacking ? '#define DEPTH_PACKING ' + parameters.depthPacking : '',\n\n\t\t\t'\\n'\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t}\n\n\tvertexShader = resolveIncludes( vertexShader );\n\tvertexShader = replaceLightNums( vertexShader, parameters );\n\tvertexShader = replaceClippingPlaneNums( vertexShader, parameters );\n\n\tfragmentShader = resolveIncludes( fragmentShader );\n\tfragmentShader = replaceLightNums( fragmentShader, parameters );\n\tfragmentShader = replaceClippingPlaneNums( fragmentShader, parameters );\n\n\tvertexShader = unrollLoops( vertexShader );\n\tfragmentShader = unrollLoops( fragmentShader );\n\n\tif ( parameters.isWebGL2 && parameters.isRawShaderMaterial !== true ) {\n\n\t\t// GLSL 3.0 conversion for built-in materials and ShaderMaterial\n\n\t\tversionString = '#version 300 es\\n';\n\n\t\tprefixVertex = [\n\t\t\t'precision mediump sampler2DArray;',\n\t\t\t'#define attribute in',\n\t\t\t'#define varying out',\n\t\t\t'#define texture2D texture'\n\t\t].join( '\\n' ) + '\\n' + prefixVertex;\n\n\t\tprefixFragment = [\n\t\t\t'#define varying in',\n\t\t\t( parameters.glslVersion === GLSL3 ) ? '' : 'layout(location = 0) out highp vec4 pc_fragColor;',\n\t\t\t( parameters.glslVersion === GLSL3 ) ? '' : '#define gl_FragColor pc_fragColor',\n\t\t\t'#define gl_FragDepthEXT gl_FragDepth',\n\t\t\t'#define texture2D texture',\n\t\t\t'#define textureCube texture',\n\t\t\t'#define texture2DProj textureProj',\n\t\t\t'#define texture2DLodEXT textureLod',\n\t\t\t'#define texture2DProjLodEXT textureProjLod',\n\t\t\t'#define textureCubeLodEXT textureLod',\n\t\t\t'#define texture2DGradEXT textureGrad',\n\t\t\t'#define texture2DProjGradEXT textureProjGrad',\n\t\t\t'#define textureCubeGradEXT textureGrad'\n\t\t].join( '\\n' ) + '\\n' + prefixFragment;\n\n\t}\n\n\tconst vertexGlsl = versionString + prefixVertex + vertexShader;\n\tconst fragmentGlsl = versionString + prefixFragment + fragmentShader;\n\n\t// console.log( '*VERTEX*', vertexGlsl );\n\t// console.log( '*FRAGMENT*', fragmentGlsl );\n\n\tconst glVertexShader = WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl );\n\tconst glFragmentShader = WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl );\n\n\tgl.attachShader( program, glVertexShader );\n\tgl.attachShader( program, glFragmentShader );\n\n\t// Force a particular attribute to index 0.\n\n\tif ( parameters.index0AttributeName !== undefined ) {\n\n\t\tgl.bindAttribLocation( program, 0, parameters.index0AttributeName );\n\n\t} else if ( parameters.morphTargets === true ) {\n\n\t\t// programs with morphTargets displace position out of attribute 0\n\t\tgl.bindAttribLocation( program, 0, 'position' );\n\n\t}\n\n\tgl.linkProgram( program );\n\n\t// check for link errors\n\tif ( renderer.debug.checkShaderErrors ) {\n\n\t\tconst programLog = gl.getProgramInfoLog( program ).trim();\n\t\tconst vertexLog = gl.getShaderInfoLog( glVertexShader ).trim();\n\t\tconst fragmentLog = gl.getShaderInfoLog( glFragmentShader ).trim();\n\n\t\tlet runnable = true;\n\t\tlet haveDiagnostics = true;\n\n\t\tif ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) {\n\n\t\t\trunnable = false;\n\n\t\t\tconst vertexErrors = getShaderErrors( gl, glVertexShader, 'vertex' );\n\t\t\tconst fragmentErrors = getShaderErrors( gl, glFragmentShader, 'fragment' );\n\n\t\t\tconsole.error(\n\t\t\t\t'THREE.WebGLProgram: Shader Error ' + gl.getError() + ' - ' +\n\t\t\t\t'VALIDATE_STATUS ' + gl.getProgramParameter( program, gl.VALIDATE_STATUS ) + '\\n\\n' +\n\t\t\t\t'Program Info Log: ' + programLog + '\\n' +\n\t\t\t\tvertexErrors + '\\n' +\n\t\t\t\tfragmentErrors\n\t\t\t);\n\n\t\t} else if ( programLog !== '' ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLProgram: Program Info Log:', programLog );\n\n\t\t} else if ( vertexLog === '' || fragmentLog === '' ) {\n\n\t\t\thaveDiagnostics = false;\n\n\t\t}\n\n\t\tif ( haveDiagnostics ) {\n\n\t\t\tthis.diagnostics = {\n\n\t\t\t\trunnable: runnable,\n\n\t\t\t\tprogramLog: programLog,\n\n\t\t\t\tvertexShader: {\n\n\t\t\t\t\tlog: vertexLog,\n\t\t\t\t\tprefix: prefixVertex\n\n\t\t\t\t},\n\n\t\t\t\tfragmentShader: {\n\n\t\t\t\t\tlog: fragmentLog,\n\t\t\t\t\tprefix: prefixFragment\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t}\n\n\t// Clean up\n\n\t// Crashes in iOS9 and iOS10. #18402\n\t// gl.detachShader( program, glVertexShader );\n\t// gl.detachShader( program, glFragmentShader );\n\n\tgl.deleteShader( glVertexShader );\n\tgl.deleteShader( glFragmentShader );\n\n\t// set up caching for uniform locations\n\n\tlet cachedUniforms;\n\n\tthis.getUniforms = function () {\n\n\t\tif ( cachedUniforms === undefined ) {\n\n\t\t\tcachedUniforms = new WebGLUniforms( gl, program );\n\n\t\t}\n\n\t\treturn cachedUniforms;\n\n\t};\n\n\t// set up caching for attribute locations\n\n\tlet cachedAttributes;\n\n\tthis.getAttributes = function () {\n\n\t\tif ( cachedAttributes === undefined ) {\n\n\t\t\tcachedAttributes = fetchAttributeLocations( gl, program );\n\n\t\t}\n\n\t\treturn cachedAttributes;\n\n\t};\n\n\t// free resource\n\n\tthis.destroy = function () {\n\n\t\tbindingStates.releaseStatesOfProgram( this );\n\n\t\tgl.deleteProgram( program );\n\t\tthis.program = undefined;\n\n\t};\n\n\t//\n\n\tthis.name = parameters.shaderName;\n\tthis.id = programIdCount ++;\n\tthis.cacheKey = cacheKey;\n\tthis.usedTimes = 1;\n\tthis.program = program;\n\tthis.vertexShader = glVertexShader;\n\tthis.fragmentShader = glFragmentShader;\n\n\treturn this;\n\n}\n\nexport { WebGLProgram };\n","let _id = 0;\n\nclass WebGLShaderCache {\n\n\tconstructor() {\n\n\t\tthis.shaderCache = new Map();\n\t\tthis.materialCache = new Map();\n\n\t}\n\n\tupdate( material ) {\n\n\t\tconst vertexShader = material.vertexShader;\n\t\tconst fragmentShader = material.fragmentShader;\n\n\t\tconst vertexShaderStage = this._getShaderStage( vertexShader );\n\t\tconst fragmentShaderStage = this._getShaderStage( fragmentShader );\n\n\t\tconst materialShaders = this._getShaderCacheForMaterial( material );\n\n\t\tif ( materialShaders.has( vertexShaderStage ) === false ) {\n\n\t\t\tmaterialShaders.add( vertexShaderStage );\n\t\t\tvertexShaderStage.usedTimes ++;\n\n\t\t}\n\n\t\tif ( materialShaders.has( fragmentShaderStage ) === false ) {\n\n\t\t\tmaterialShaders.add( fragmentShaderStage );\n\t\t\tfragmentShaderStage.usedTimes ++;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tremove( material ) {\n\n\t\tconst materialShaders = this.materialCache.get( material );\n\n\t\tfor ( const shaderStage of materialShaders ) {\n\n\t\t\tshaderStage.usedTimes --;\n\n\t\t\tif ( shaderStage.usedTimes === 0 ) this.shaderCache.delete( shaderStage );\n\n\t\t}\n\n\t\tthis.materialCache.delete( material );\n\n\t\treturn this;\n\n\t}\n\n\tgetVertexShaderID( material ) {\n\n\t\treturn this._getShaderStage( material.vertexShader ).id;\n\n\t}\n\n\tgetFragmentShaderID( material ) {\n\n\t\treturn this._getShaderStage( material.fragmentShader ).id;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shaderCache.clear();\n\t\tthis.materialCache.clear();\n\n\t}\n\n\t_getShaderCacheForMaterial( material ) {\n\n\t\tconst cache = this.materialCache;\n\n\t\tif ( cache.has( material ) === false ) {\n\n\t\t\tcache.set( material, new Set() );\n\n\t\t}\n\n\t\treturn cache.get( material );\n\n\t}\n\n\t_getShaderStage( code ) {\n\n\t\tconst cache = this.shaderCache;\n\n\t\tif ( cache.has( code ) === false ) {\n\n\t\t\tconst stage = new WebGLShaderStage();\n\t\t\tcache.set( code, stage );\n\n\t\t}\n\n\t\treturn cache.get( code );\n\n\t}\n\n}\n\nclass WebGLShaderStage {\n\n\tconstructor() {\n\n\t\tthis.id = _id ++;\n\n\t\tthis.usedTimes = 0;\n\n\t}\n\n}\n\nexport { WebGLShaderCache };\n","import { BackSide, DoubleSide, CubeUVRefractionMapping, CubeUVReflectionMapping, ObjectSpaceNormalMap, TangentSpaceNormalMap, NoToneMapping, LinearEncoding, sRGBEncoding } from '../../constants.js';\nimport { Layers } from '../../core/Layers.js';\nimport { WebGLProgram } from './WebGLProgram.js';\nimport { WebGLShaderCache } from './WebGLShaderCache.js';\nimport { ShaderLib } from '../shaders/ShaderLib.js';\nimport { UniformsUtils } from '../shaders/UniformsUtils.js';\n\nfunction WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping ) {\n\n\tconst _programLayers = new Layers();\n\tconst _customShaders = new WebGLShaderCache();\n\tconst programs = [];\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\tconst logarithmicDepthBuffer = capabilities.logarithmicDepthBuffer;\n\tconst floatVertexTextures = capabilities.floatVertexTextures;\n\tconst maxVertexUniforms = capabilities.maxVertexUniforms;\n\tconst vertexTextures = capabilities.vertexTextures;\n\tlet precision = capabilities.precision;\n\n\tconst shaderIDs = {\n\t\tMeshDepthMaterial: 'depth',\n\t\tMeshDistanceMaterial: 'distanceRGBA',\n\t\tMeshNormalMaterial: 'normal',\n\t\tMeshBasicMaterial: 'basic',\n\t\tMeshLambertMaterial: 'lambert',\n\t\tMeshPhongMaterial: 'phong',\n\t\tMeshToonMaterial: 'toon',\n\t\tMeshStandardMaterial: 'physical',\n\t\tMeshPhysicalMaterial: 'physical',\n\t\tMeshMatcapMaterial: 'matcap',\n\t\tLineBasicMaterial: 'basic',\n\t\tLineDashedMaterial: 'dashed',\n\t\tPointsMaterial: 'points',\n\t\tShadowMaterial: 'shadow',\n\t\tSpriteMaterial: 'sprite'\n\t};\n\n\tfunction getMaxBones( object ) {\n\n\t\tconst skeleton = object.skeleton;\n\t\tconst bones = skeleton.bones;\n\n\t\tif ( floatVertexTextures ) {\n\n\t\t\treturn 1024;\n\n\t\t} else {\n\n\t\t\t// default for when object is not specified\n\t\t\t// ( for example when prebuilding shader to be used with multiple objects )\n\t\t\t//\n\t\t\t//  - leave some extra space for other uniforms\n\t\t\t//  - limit here is ANGLE's 254 max uniform vectors\n\t\t\t//    (up to 54 should be safe)\n\n\t\t\tconst nVertexUniforms = maxVertexUniforms;\n\t\t\tconst nVertexMatrices = Math.floor( ( nVertexUniforms - 20 ) / 4 );\n\n\t\t\tconst maxBones = Math.min( nVertexMatrices, bones.length );\n\n\t\t\tif ( maxBones < bones.length ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Skeleton has ' + bones.length + ' bones. This GPU supports ' + maxBones + '.' );\n\t\t\t\treturn 0;\n\n\t\t\t}\n\n\t\t\treturn maxBones;\n\n\t\t}\n\n\t}\n\n\tfunction getParameters( material, lights, shadows, scene, object ) {\n\n\t\tconst fog = scene.fog;\n\t\tconst environment = material.isMeshStandardMaterial ? scene.environment : null;\n\n\t\tconst envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment );\n\n\t\tconst shaderID = shaderIDs[ material.type ];\n\n\t\t// heuristics to create shader parameters according to lights in the scene\n\t\t// (not to blow over maxLights budget)\n\n\t\tconst maxBones = object.isSkinnedMesh ? getMaxBones( object ) : 0;\n\n\t\tif ( material.precision !== null ) {\n\n\t\t\tprecision = capabilities.getMaxPrecision( material.precision );\n\n\t\t\tif ( precision !== material.precision ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet vertexShader, fragmentShader;\n\t\tlet customVertexShaderID, customFragmentShaderID;\n\n\t\tif ( shaderID ) {\n\n\t\t\tconst shader = ShaderLib[ shaderID ];\n\n\t\t\tvertexShader = shader.vertexShader;\n\t\t\tfragmentShader = shader.fragmentShader;\n\n\t\t} else {\n\n\t\t\tvertexShader = material.vertexShader;\n\t\t\tfragmentShader = material.fragmentShader;\n\n\t\t\t_customShaders.update( material );\n\n\t\t\tcustomVertexShaderID = _customShaders.getVertexShaderID( material );\n\t\t\tcustomFragmentShaderID = _customShaders.getFragmentShaderID( material );\n\n\t\t}\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\t\tconst useAlphaTest = material.alphaTest > 0;\n\t\tconst useClearcoat = material.clearcoat > 0;\n\n\t\tconst parameters = {\n\n\t\t\tisWebGL2: isWebGL2,\n\n\t\t\tshaderID: shaderID,\n\t\t\tshaderName: material.type,\n\n\t\t\tvertexShader: vertexShader,\n\t\t\tfragmentShader: fragmentShader,\n\t\t\tdefines: material.defines,\n\n\t\t\tcustomVertexShaderID: customVertexShaderID,\n\t\t\tcustomFragmentShaderID: customFragmentShaderID,\n\n\t\t\tisRawShaderMaterial: material.isRawShaderMaterial === true,\n\t\t\tglslVersion: material.glslVersion,\n\n\t\t\tprecision: precision,\n\n\t\t\tinstancing: object.isInstancedMesh === true,\n\t\t\tinstancingColor: object.isInstancedMesh === true && object.instanceColor !== null,\n\n\t\t\tsupportsVertexTextures: vertexTextures,\n\t\t\toutputEncoding: ( currentRenderTarget === null ) ? renderer.outputEncoding : ( currentRenderTarget.isXRRenderTarget === true ? currentRenderTarget.texture.encoding : LinearEncoding ),\n\t\t\tmap: !! material.map,\n\t\t\tmatcap: !! material.matcap,\n\t\t\tenvMap: !! envMap,\n\t\t\tenvMapMode: envMap && envMap.mapping,\n\t\t\tenvMapCubeUV: ( !! envMap ) && ( ( envMap.mapping === CubeUVReflectionMapping ) || ( envMap.mapping === CubeUVRefractionMapping ) ),\n\t\t\tlightMap: !! material.lightMap,\n\t\t\taoMap: !! material.aoMap,\n\t\t\temissiveMap: !! material.emissiveMap,\n\t\t\tbumpMap: !! material.bumpMap,\n\t\t\tnormalMap: !! material.normalMap,\n\t\t\tobjectSpaceNormalMap: material.normalMapType === ObjectSpaceNormalMap,\n\t\t\ttangentSpaceNormalMap: material.normalMapType === TangentSpaceNormalMap,\n\n\t\t\tdecodeVideoTexture: !! material.map && ( material.map.isVideoTexture === true ) && ( material.map.encoding === sRGBEncoding ),\n\n\t\t\tclearcoat: useClearcoat,\n\t\t\tclearcoatMap: useClearcoat && !! material.clearcoatMap,\n\t\t\tclearcoatRoughnessMap: useClearcoat && !! material.clearcoatRoughnessMap,\n\t\t\tclearcoatNormalMap: useClearcoat && !! material.clearcoatNormalMap,\n\n\t\t\tdisplacementMap: !! material.displacementMap,\n\t\t\troughnessMap: !! material.roughnessMap,\n\t\t\tmetalnessMap: !! material.metalnessMap,\n\t\t\tspecularMap: !! material.specularMap,\n\t\t\tspecularIntensityMap: !! material.specularIntensityMap,\n\t\t\tspecularColorMap: !! material.specularColorMap,\n\n\t\t\ttransparent: material.transparent,\n\n\t\t\talphaMap: !! material.alphaMap,\n\t\t\talphaTest: useAlphaTest,\n\n\t\t\tgradientMap: !! material.gradientMap,\n\n\t\t\tsheen: material.sheen > 0,\n\t\t\tsheenColorMap: !! material.sheenColorMap,\n\t\t\tsheenRoughnessMap: !! material.sheenRoughnessMap,\n\n\t\t\ttransmission: material.transmission > 0,\n\t\t\ttransmissionMap: !! material.transmissionMap,\n\t\t\tthicknessMap: !! material.thicknessMap,\n\n\t\t\tcombine: material.combine,\n\n\t\t\tvertexTangents: ( !! material.normalMap && !! object.geometry && !! object.geometry.attributes.tangent ),\n\t\t\tvertexColors: material.vertexColors,\n\t\t\tvertexAlphas: material.vertexColors === true && !! object.geometry && !! object.geometry.attributes.color && object.geometry.attributes.color.itemSize === 4,\n\t\t\tvertexUvs: !! material.map || !! material.bumpMap || !! material.normalMap || !! material.specularMap || !! material.alphaMap || !! material.emissiveMap || !! material.roughnessMap || !! material.metalnessMap || !! material.clearcoatMap || !! material.clearcoatRoughnessMap || !! material.clearcoatNormalMap || !! material.displacementMap || !! material.transmissionMap || !! material.thicknessMap || !! material.specularIntensityMap || !! material.specularColorMap || !! material.sheenColorMap || !! material.sheenRoughnessMap,\n\t\t\tuvsVertexOnly: ! ( !! material.map || !! material.bumpMap || !! material.normalMap || !! material.specularMap || !! material.alphaMap || !! material.emissiveMap || !! material.roughnessMap || !! material.metalnessMap || !! material.clearcoatNormalMap || material.transmission > 0 || !! material.transmissionMap || !! material.thicknessMap || !! material.specularIntensityMap || !! material.specularColorMap || material.sheen > 0 || !! material.sheenColorMap || !! material.sheenRoughnessMap ) && !! material.displacementMap,\n\n\t\t\tfog: !! fog,\n\t\t\tuseFog: material.fog,\n\t\t\tfogExp2: ( fog && fog.isFogExp2 ),\n\n\t\t\tflatShading: !! material.flatShading,\n\n\t\t\tsizeAttenuation: material.sizeAttenuation,\n\t\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\n\t\t\tskinning: object.isSkinnedMesh === true && maxBones > 0,\n\t\t\tmaxBones: maxBones,\n\t\t\tuseVertexTexture: floatVertexTextures,\n\n\t\t\tmorphTargets: !! object.geometry && !! object.geometry.morphAttributes.position,\n\t\t\tmorphNormals: !! object.geometry && !! object.geometry.morphAttributes.normal,\n\t\t\tmorphTargetsCount: ( !! object.geometry && !! object.geometry.morphAttributes.position ) ? object.geometry.morphAttributes.position.length : 0,\n\n\t\t\tnumDirLights: lights.directional.length,\n\t\t\tnumPointLights: lights.point.length,\n\t\t\tnumSpotLights: lights.spot.length,\n\t\t\tnumRectAreaLights: lights.rectArea.length,\n\t\t\tnumHemiLights: lights.hemi.length,\n\n\t\t\tnumDirLightShadows: lights.directionalShadowMap.length,\n\t\t\tnumPointLightShadows: lights.pointShadowMap.length,\n\t\t\tnumSpotLightShadows: lights.spotShadowMap.length,\n\n\t\t\tnumClippingPlanes: clipping.numPlanes,\n\t\t\tnumClipIntersection: clipping.numIntersection,\n\n\t\t\tdithering: material.dithering,\n\n\t\t\tshadowMapEnabled: renderer.shadowMap.enabled && shadows.length > 0,\n\t\t\tshadowMapType: renderer.shadowMap.type,\n\n\t\t\ttoneMapping: material.toneMapped ? renderer.toneMapping : NoToneMapping,\n\t\t\tphysicallyCorrectLights: renderer.physicallyCorrectLights,\n\n\t\t\tpremultipliedAlpha: material.premultipliedAlpha,\n\n\t\t\tdoubleSided: material.side === DoubleSide,\n\t\t\tflipSided: material.side === BackSide,\n\n\t\t\tdepthPacking: ( material.depthPacking !== undefined ) ? material.depthPacking : false,\n\n\t\t\tindex0AttributeName: material.index0AttributeName,\n\n\t\t\textensionDerivatives: material.extensions && material.extensions.derivatives,\n\t\t\textensionFragDepth: material.extensions && material.extensions.fragDepth,\n\t\t\textensionDrawBuffers: material.extensions && material.extensions.drawBuffers,\n\t\t\textensionShaderTextureLOD: material.extensions && material.extensions.shaderTextureLOD,\n\n\t\t\trendererExtensionFragDepth: isWebGL2 || extensions.has( 'EXT_frag_depth' ),\n\t\t\trendererExtensionDrawBuffers: isWebGL2 || extensions.has( 'WEBGL_draw_buffers' ),\n\t\t\trendererExtensionShaderTextureLod: isWebGL2 || extensions.has( 'EXT_shader_texture_lod' ),\n\n\t\t\tcustomProgramCacheKey: material.customProgramCacheKey()\n\n\t\t};\n\n\t\treturn parameters;\n\n\t}\n\n\tfunction getProgramCacheKey( parameters ) {\n\n\t\tconst array = [];\n\n\t\tif ( parameters.shaderID ) {\n\n\t\t\tarray.push( parameters.shaderID );\n\n\t\t} else {\n\n\t\t\tarray.push( parameters.customVertexShaderID );\n\t\t\tarray.push( parameters.customFragmentShaderID );\n\n\t\t}\n\n\t\tif ( parameters.defines !== undefined ) {\n\n\t\t\tfor ( const name in parameters.defines ) {\n\n\t\t\t\tarray.push( name );\n\t\t\t\tarray.push( parameters.defines[ name ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( parameters.isRawShaderMaterial === false ) {\n\n\t\t\tgetProgramCacheKeyParameters( array, parameters );\n\t\t\tgetProgramCacheKeyBooleans( array, parameters );\n\t\t\tarray.push( renderer.outputEncoding );\n\n\t\t}\n\n\t\tarray.push( parameters.customProgramCacheKey );\n\n\t\treturn array.join();\n\n\t}\n\n\tfunction getProgramCacheKeyParameters( array, parameters ) {\n\n\t\tarray.push( parameters.precision );\n\t\tarray.push( parameters.outputEncoding );\n\t\tarray.push( parameters.envMapMode );\n\t\tarray.push( parameters.combine );\n\t\tarray.push( parameters.vertexUvs );\n\t\tarray.push( parameters.fogExp2 );\n\t\tarray.push( parameters.sizeAttenuation );\n\t\tarray.push( parameters.maxBones );\n\t\tarray.push( parameters.morphTargetsCount );\n\t\tarray.push( parameters.numDirLights );\n\t\tarray.push( parameters.numPointLights );\n\t\tarray.push( parameters.numSpotLights );\n\t\tarray.push( parameters.numHemiLights );\n\t\tarray.push( parameters.numRectAreaLights );\n\t\tarray.push( parameters.numDirLightShadows );\n\t\tarray.push( parameters.numPointLightShadows );\n\t\tarray.push( parameters.numSpotLightShadows );\n\t\tarray.push( parameters.shadowMapType );\n\t\tarray.push( parameters.toneMapping );\n\t\tarray.push( parameters.numClippingPlanes );\n\t\tarray.push( parameters.numClipIntersection );\n\n\t}\n\n\tfunction getProgramCacheKeyBooleans( array, parameters ) {\n\n\t\t_programLayers.disableAll();\n\n\t\tif ( parameters.isWebGL2 )\n\t\t\t_programLayers.enable( 0 );\n\t\tif ( parameters.supportsVertexTextures )\n\t\t\t_programLayers.enable( 1 );\n\t\tif ( parameters.instancing )\n\t\t\t_programLayers.enable( 2 );\n\t\tif ( parameters.instancingColor )\n\t\t\t_programLayers.enable( 3 );\n\t\tif ( parameters.map )\n\t\t\t_programLayers.enable( 4 );\n\t\tif ( parameters.matcap )\n\t\t\t_programLayers.enable( 5 );\n\t\tif ( parameters.envMap )\n\t\t\t_programLayers.enable( 6 );\n\t\tif ( parameters.envMapCubeUV )\n\t\t\t_programLayers.enable( 7 );\n\t\tif ( parameters.lightMap )\n\t\t\t_programLayers.enable( 8 );\n\t\tif ( parameters.aoMap )\n\t\t\t_programLayers.enable( 9 );\n\t\tif ( parameters.emissiveMap )\n\t\t\t_programLayers.enable( 10 );\n\t\tif ( parameters.bumpMap )\n\t\t\t_programLayers.enable( 11 );\n\t\tif ( parameters.normalMap )\n\t\t\t_programLayers.enable( 12 );\n\t\tif ( parameters.objectSpaceNormalMap )\n\t\t\t_programLayers.enable( 13 );\n\t\tif ( parameters.tangentSpaceNormalMap )\n\t\t\t_programLayers.enable( 14 );\n\t\tif ( parameters.clearcoat )\n\t\t\t_programLayers.enable( 15 );\n\t\tif ( parameters.clearcoatMap )\n\t\t\t_programLayers.enable( 16 );\n\t\tif ( parameters.clearcoatRoughnessMap )\n\t\t\t_programLayers.enable( 17 );\n\t\tif ( parameters.clearcoatNormalMap )\n\t\t\t_programLayers.enable( 18 );\n\t\tif ( parameters.displacementMap )\n\t\t\t_programLayers.enable( 19 );\n\t\tif ( parameters.specularMap )\n\t\t\t_programLayers.enable( 20 );\n\t\tif ( parameters.roughnessMap )\n\t\t\t_programLayers.enable( 21 );\n\t\tif ( parameters.metalnessMap )\n\t\t\t_programLayers.enable( 22 );\n\t\tif ( parameters.gradientMap )\n\t\t\t_programLayers.enable( 23 );\n\t\tif ( parameters.alphaMap )\n\t\t\t_programLayers.enable( 24 );\n\t\tif ( parameters.alphaTest )\n\t\t\t_programLayers.enable( 25 );\n\t\tif ( parameters.vertexColors )\n\t\t\t_programLayers.enable( 26 );\n\t\tif ( parameters.vertexAlphas )\n\t\t\t_programLayers.enable( 27 );\n\t\tif ( parameters.vertexUvs )\n\t\t\t_programLayers.enable( 28 );\n\t\tif ( parameters.vertexTangents )\n\t\t\t_programLayers.enable( 29 );\n\t\tif ( parameters.uvsVertexOnly )\n\t\t\t_programLayers.enable( 30 );\n\t\tif ( parameters.fog )\n\t\t\t_programLayers.enable( 31 );\n\n\t\tarray.push( _programLayers.mask );\n\t\t_programLayers.disableAll();\n\n\t\tif ( parameters.useFog )\n\t\t\t_programLayers.enable( 0 );\n\t\tif ( parameters.flatShading )\n\t\t\t_programLayers.enable( 1 );\n\t\tif ( parameters.logarithmicDepthBuffer )\n\t\t\t_programLayers.enable( 2 );\n\t\tif ( parameters.skinning )\n\t\t\t_programLayers.enable( 3 );\n\t\tif ( parameters.useVertexTexture )\n\t\t\t_programLayers.enable( 4 );\n\t\tif ( parameters.morphTargets )\n\t\t\t_programLayers.enable( 5 );\n\t\tif ( parameters.morphNormals )\n\t\t\t_programLayers.enable( 6 );\n\t\tif ( parameters.premultipliedAlpha )\n\t\t\t_programLayers.enable( 7 );\n\t\tif ( parameters.shadowMapEnabled )\n\t\t\t_programLayers.enable( 8 );\n\t\tif ( parameters.physicallyCorrectLights )\n\t\t\t_programLayers.enable( 9 );\n\t\tif ( parameters.doubleSided )\n\t\t\t_programLayers.enable( 10 );\n\t\tif ( parameters.flipSided )\n\t\t\t_programLayers.enable( 11 );\n\t\tif ( parameters.depthPacking )\n\t\t\t_programLayers.enable( 12 );\n\t\tif ( parameters.dithering )\n\t\t\t_programLayers.enable( 13 );\n\t\tif ( parameters.specularIntensityMap )\n\t\t\t_programLayers.enable( 14 );\n\t\tif ( parameters.specularColorMap )\n\t\t\t_programLayers.enable( 15 );\n\t\tif ( parameters.transmission )\n\t\t\t_programLayers.enable( 16 );\n\t\tif ( parameters.transmissionMap )\n\t\t\t_programLayers.enable( 17 );\n\t\tif ( parameters.thicknessMap )\n\t\t\t_programLayers.enable( 18 );\n\t\tif ( parameters.sheen )\n\t\t\t_programLayers.enable( 19 );\n\t\tif ( parameters.sheenColorMap )\n\t\t\t_programLayers.enable( 20 );\n\t\tif ( parameters.sheenRoughnessMap )\n\t\t\t_programLayers.enable( 21 );\n\t\tif ( parameters.decodeVideoTexture )\n\t\t\t_programLayers.enable( 22 );\n\t\tif ( parameters.transparent )\n\t\t\t_programLayers.enable( 23 );\n\n\t\tarray.push( _programLayers.mask );\n\n\t}\n\n\tfunction getUniforms( material ) {\n\n\t\tconst shaderID = shaderIDs[ material.type ];\n\t\tlet uniforms;\n\n\t\tif ( shaderID ) {\n\n\t\t\tconst shader = ShaderLib[ shaderID ];\n\t\t\tuniforms = UniformsUtils.clone( shader.uniforms );\n\n\t\t} else {\n\n\t\t\tuniforms = material.uniforms;\n\n\t\t}\n\n\t\treturn uniforms;\n\n\t}\n\n\tfunction acquireProgram( parameters, cacheKey ) {\n\n\t\tlet program;\n\n\t\t// Check if code has been already compiled\n\t\tfor ( let p = 0, pl = programs.length; p < pl; p ++ ) {\n\n\t\t\tconst preexistingProgram = programs[ p ];\n\n\t\t\tif ( preexistingProgram.cacheKey === cacheKey ) {\n\n\t\t\t\tprogram = preexistingProgram;\n\t\t\t\t++ program.usedTimes;\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( program === undefined ) {\n\n\t\t\tprogram = new WebGLProgram( renderer, cacheKey, parameters, bindingStates );\n\t\t\tprograms.push( program );\n\n\t\t}\n\n\t\treturn program;\n\n\t}\n\n\tfunction releaseProgram( program ) {\n\n\t\tif ( -- program.usedTimes === 0 ) {\n\n\t\t\t// Remove from unordered set\n\t\t\tconst i = programs.indexOf( program );\n\t\t\tprograms[ i ] = programs[ programs.length - 1 ];\n\t\t\tprograms.pop();\n\n\t\t\t// Free WebGL resources\n\t\t\tprogram.destroy();\n\n\t\t}\n\n\t}\n\n\tfunction releaseShaderCache( material ) {\n\n\t\t_customShaders.remove( material );\n\n\t}\n\n\tfunction dispose() {\n\n\t\t_customShaders.dispose();\n\n\t}\n\n\treturn {\n\t\tgetParameters: getParameters,\n\t\tgetProgramCacheKey: getProgramCacheKey,\n\t\tgetUniforms: getUniforms,\n\t\tacquireProgram: acquireProgram,\n\t\treleaseProgram: releaseProgram,\n\t\treleaseShaderCache: releaseShaderCache,\n\t\t// Exposed for resource monitoring & error feedback via renderer.info:\n\t\tprograms: programs,\n\t\tdispose: dispose\n\t};\n\n}\n\n\nexport { WebGLPrograms };\n","function WebGLProperties() {\n\n\tlet properties = new WeakMap();\n\n\tfunction get( object ) {\n\n\t\tlet map = properties.get( object );\n\n\t\tif ( map === undefined ) {\n\n\t\t\tmap = {};\n\t\t\tproperties.set( object, map );\n\n\t\t}\n\n\t\treturn map;\n\n\t}\n\n\tfunction remove( object ) {\n\n\t\tproperties.delete( object );\n\n\t}\n\n\tfunction update( object, key, value ) {\n\n\t\tproperties.get( object )[ key ] = value;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tproperties = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tremove: remove,\n\t\tupdate: update,\n\t\tdispose: dispose\n\t};\n\n}\n\n\nexport { WebGLProperties };\n","function painterSortStable( a, b ) {\n\n\tif ( a.groupOrder !== b.groupOrder ) {\n\n\t\treturn a.groupOrder - b.groupOrder;\n\n\t} else if ( a.renderOrder !== b.renderOrder ) {\n\n\t\treturn a.renderOrder - b.renderOrder;\n\n\t} else if ( a.material.id !== b.material.id ) {\n\n\t\treturn a.material.id - b.material.id;\n\n\t} else if ( a.z !== b.z ) {\n\n\t\treturn a.z - b.z;\n\n\t} else {\n\n\t\treturn a.id - b.id;\n\n\t}\n\n}\n\nfunction reversePainterSortStable( a, b ) {\n\n\tif ( a.groupOrder !== b.groupOrder ) {\n\n\t\treturn a.groupOrder - b.groupOrder;\n\n\t} else if ( a.renderOrder !== b.renderOrder ) {\n\n\t\treturn a.renderOrder - b.renderOrder;\n\n\t} else if ( a.z !== b.z ) {\n\n\t\treturn b.z - a.z;\n\n\t} else {\n\n\t\treturn a.id - b.id;\n\n\t}\n\n}\n\n\nfunction WebGLRenderList() {\n\n\tconst renderItems = [];\n\tlet renderItemsIndex = 0;\n\n\tconst opaque = [];\n\tconst transmissive = [];\n\tconst transparent = [];\n\n\tfunction init() {\n\n\t\trenderItemsIndex = 0;\n\n\t\topaque.length = 0;\n\t\ttransmissive.length = 0;\n\t\ttransparent.length = 0;\n\n\t}\n\n\tfunction getNextRenderItem( object, geometry, material, groupOrder, z, group ) {\n\n\t\tlet renderItem = renderItems[ renderItemsIndex ];\n\n\t\tif ( renderItem === undefined ) {\n\n\t\t\trenderItem = {\n\t\t\t\tid: object.id,\n\t\t\t\tobject: object,\n\t\t\t\tgeometry: geometry,\n\t\t\t\tmaterial: material,\n\t\t\t\tgroupOrder: groupOrder,\n\t\t\t\trenderOrder: object.renderOrder,\n\t\t\t\tz: z,\n\t\t\t\tgroup: group\n\t\t\t};\n\n\t\t\trenderItems[ renderItemsIndex ] = renderItem;\n\n\t\t} else {\n\n\t\t\trenderItem.id = object.id;\n\t\t\trenderItem.object = object;\n\t\t\trenderItem.geometry = geometry;\n\t\t\trenderItem.material = material;\n\t\t\trenderItem.groupOrder = groupOrder;\n\t\t\trenderItem.renderOrder = object.renderOrder;\n\t\t\trenderItem.z = z;\n\t\t\trenderItem.group = group;\n\n\t\t}\n\n\t\trenderItemsIndex ++;\n\n\t\treturn renderItem;\n\n\t}\n\n\tfunction push( object, geometry, material, groupOrder, z, group ) {\n\n\t\tconst renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group );\n\n\t\tif ( material.transmission > 0.0 ) {\n\n\t\t\ttransmissive.push( renderItem );\n\n\t\t} else if ( material.transparent === true ) {\n\n\t\t\ttransparent.push( renderItem );\n\n\t\t} else {\n\n\t\t\topaque.push( renderItem );\n\n\t\t}\n\n\t}\n\n\tfunction unshift( object, geometry, material, groupOrder, z, group ) {\n\n\t\tconst renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group );\n\n\t\tif ( material.transmission > 0.0 ) {\n\n\t\t\ttransmissive.unshift( renderItem );\n\n\t\t} else if ( material.transparent === true ) {\n\n\t\t\ttransparent.unshift( renderItem );\n\n\t\t} else {\n\n\t\t\topaque.unshift( renderItem );\n\n\t\t}\n\n\t}\n\n\tfunction sort( customOpaqueSort, customTransparentSort ) {\n\n\t\tif ( opaque.length > 1 ) opaque.sort( customOpaqueSort || painterSortStable );\n\t\tif ( transmissive.length > 1 ) transmissive.sort( customTransparentSort || reversePainterSortStable );\n\t\tif ( transparent.length > 1 ) transparent.sort( customTransparentSort || reversePainterSortStable );\n\n\t}\n\n\tfunction finish() {\n\n\t\t// Clear references from inactive renderItems in the list\n\n\t\tfor ( let i = renderItemsIndex, il = renderItems.length; i < il; i ++ ) {\n\n\t\t\tconst renderItem = renderItems[ i ];\n\n\t\t\tif ( renderItem.id === null ) break;\n\n\t\t\trenderItem.id = null;\n\t\t\trenderItem.object = null;\n\t\t\trenderItem.geometry = null;\n\t\t\trenderItem.material = null;\n\t\t\trenderItem.group = null;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\topaque: opaque,\n\t\ttransmissive: transmissive,\n\t\ttransparent: transparent,\n\n\t\tinit: init,\n\t\tpush: push,\n\t\tunshift: unshift,\n\t\tfinish: finish,\n\n\t\tsort: sort\n\t};\n\n}\n\nfunction WebGLRenderLists() {\n\n\tlet lists = new WeakMap();\n\n\tfunction get( scene, renderCallDepth ) {\n\n\t\tlet list;\n\n\t\tif ( lists.has( scene ) === false ) {\n\n\t\t\tlist = new WebGLRenderList();\n\t\t\tlists.set( scene, [ list ] );\n\n\t\t} else {\n\n\t\t\tif ( renderCallDepth >= lists.get( scene ).length ) {\n\n\t\t\t\tlist = new WebGLRenderList();\n\t\t\t\tlists.get( scene ).push( list );\n\n\t\t\t} else {\n\n\t\t\t\tlist = lists.get( scene )[ renderCallDepth ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn list;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tlists = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\n\nexport { WebGLRenderLists, WebGLRenderList };\n","import { Color } from '../../math/Color.js';\nimport { Matrix4 } from '../../math/Matrix4.js';\nimport { Vector2 } from '../../math/Vector2.js';\nimport { Vector3 } from '../../math/Vector3.js';\nimport { UniformsLib } from '../shaders/UniformsLib.js';\n\nfunction UniformsCache() {\n\n\tconst lights = {};\n\n\treturn {\n\n\t\tget: function ( light ) {\n\n\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\treturn lights[ light.id ];\n\n\t\t\t}\n\n\t\t\tlet uniforms;\n\n\t\t\tswitch ( light.type ) {\n\n\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tcolor: new Color()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'SpotLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\tconeCos: 0,\n\t\t\t\t\t\tpenumbraCos: 0,\n\t\t\t\t\t\tdecay: 0\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PointLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\tdecay: 0\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'HemisphereLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tskyColor: new Color(),\n\t\t\t\t\t\tgroundColor: new Color()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'RectAreaLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\thalfWidth: new Vector3(),\n\t\t\t\t\t\thalfHeight: new Vector3()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\treturn uniforms;\n\n\t\t}\n\n\t};\n\n}\n\nfunction ShadowUniformsCache() {\n\n\tconst lights = {};\n\n\treturn {\n\n\t\tget: function ( light ) {\n\n\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\treturn lights[ light.id ];\n\n\t\t\t}\n\n\t\t\tlet uniforms;\n\n\t\t\tswitch ( light.type ) {\n\n\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'SpotLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PointLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2(),\n\t\t\t\t\t\tshadowCameraNear: 1,\n\t\t\t\t\t\tshadowCameraFar: 1000\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\t// TODO (abelnation): set RectAreaLight shadow uniforms\n\n\t\t\t}\n\n\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\treturn uniforms;\n\n\t\t}\n\n\t};\n\n}\n\n\n\nlet nextVersion = 0;\n\nfunction shadowCastingLightsFirst( lightA, lightB ) {\n\n\treturn ( lightB.castShadow ? 1 : 0 ) - ( lightA.castShadow ? 1 : 0 );\n\n}\n\nfunction WebGLLights( extensions, capabilities ) {\n\n\tconst cache = new UniformsCache();\n\n\tconst shadowCache = ShadowUniformsCache();\n\n\tconst state = {\n\n\t\tversion: 0,\n\n\t\thash: {\n\t\t\tdirectionalLength: - 1,\n\t\t\tpointLength: - 1,\n\t\t\tspotLength: - 1,\n\t\t\trectAreaLength: - 1,\n\t\t\themiLength: - 1,\n\n\t\t\tnumDirectionalShadows: - 1,\n\t\t\tnumPointShadows: - 1,\n\t\t\tnumSpotShadows: - 1\n\t\t},\n\n\t\tambient: [ 0, 0, 0 ],\n\t\tprobe: [],\n\t\tdirectional: [],\n\t\tdirectionalShadow: [],\n\t\tdirectionalShadowMap: [],\n\t\tdirectionalShadowMatrix: [],\n\t\tspot: [],\n\t\tspotShadow: [],\n\t\tspotShadowMap: [],\n\t\tspotShadowMatrix: [],\n\t\trectArea: [],\n\t\trectAreaLTC1: null,\n\t\trectAreaLTC2: null,\n\t\tpoint: [],\n\t\tpointShadow: [],\n\t\tpointShadowMap: [],\n\t\tpointShadowMatrix: [],\n\t\themi: []\n\n\t};\n\n\tfor ( let i = 0; i < 9; i ++ ) state.probe.push( new Vector3() );\n\n\tconst vector3 = new Vector3();\n\tconst matrix4 = new Matrix4();\n\tconst matrix42 = new Matrix4();\n\n\tfunction setup( lights, physicallyCorrectLights ) {\n\n\t\tlet r = 0, g = 0, b = 0;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) state.probe[ i ].set( 0, 0, 0 );\n\n\t\tlet directionalLength = 0;\n\t\tlet pointLength = 0;\n\t\tlet spotLength = 0;\n\t\tlet rectAreaLength = 0;\n\t\tlet hemiLength = 0;\n\n\t\tlet numDirectionalShadows = 0;\n\t\tlet numPointShadows = 0;\n\t\tlet numSpotShadows = 0;\n\n\t\tlights.sort( shadowCastingLightsFirst );\n\n\t\t// artist-friendly light intensity scaling factor\n\t\tconst scaleFactor = ( physicallyCorrectLights !== true ) ? Math.PI : 1;\n\n\t\tfor ( let i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\n\t\t\tconst color = light.color;\n\t\t\tconst intensity = light.intensity;\n\t\t\tconst distance = light.distance;\n\n\t\t\tconst shadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null;\n\n\t\t\tif ( light.isAmbientLight ) {\n\n\t\t\t\tr += color.r * intensity * scaleFactor;\n\t\t\t\tg += color.g * intensity * scaleFactor;\n\t\t\t\tb += color.b * intensity * scaleFactor;\n\n\t\t\t} else if ( light.isLightProbe ) {\n\n\t\t\t\tfor ( let j = 0; j < 9; j ++ ) {\n\n\t\t\t\t\tstate.probe[ j ].addScaledVector( light.sh.coefficients[ j ], intensity );\n\n\t\t\t\t}\n\n\t\t\t} else if ( light.isDirectionalLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity * scaleFactor );\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\n\t\t\t\t\tstate.directionalShadow[ directionalLength ] = shadowUniforms;\n\t\t\t\t\tstate.directionalShadowMap[ directionalLength ] = shadowMap;\n\t\t\t\t\tstate.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix;\n\n\t\t\t\t\tnumDirectionalShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.directional[ directionalLength ] = uniforms;\n\n\t\t\t\tdirectionalLength ++;\n\n\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\n\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity * scaleFactor );\n\t\t\t\tuniforms.distance = distance;\n\n\t\t\t\tuniforms.coneCos = Math.cos( light.angle );\n\t\t\t\tuniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) );\n\t\t\t\tuniforms.decay = light.decay;\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\n\t\t\t\t\tstate.spotShadow[ spotLength ] = shadowUniforms;\n\t\t\t\t\tstate.spotShadowMap[ spotLength ] = shadowMap;\n\t\t\t\t\tstate.spotShadowMatrix[ spotLength ] = light.shadow.matrix;\n\n\t\t\t\t\tnumSpotShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.spot[ spotLength ] = uniforms;\n\n\t\t\t\tspotLength ++;\n\n\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\t// (a) intensity is the total visible light emitted\n\t\t\t\t//uniforms.color.copy( color ).multiplyScalar( intensity / ( light.width * light.height * Math.PI ) );\n\n\t\t\t\t// (b) intensity is the brightness of the light\n\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\n\t\t\t\tuniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );\n\t\t\t\tuniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );\n\n\t\t\t\tstate.rectArea[ rectAreaLength ] = uniforms;\n\n\t\t\t\trectAreaLength ++;\n\n\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity * scaleFactor );\n\t\t\t\tuniforms.distance = light.distance;\n\t\t\t\tuniforms.decay = light.decay;\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\t\t\t\t\tshadowUniforms.shadowCameraNear = shadow.camera.near;\n\t\t\t\t\tshadowUniforms.shadowCameraFar = shadow.camera.far;\n\n\t\t\t\t\tstate.pointShadow[ pointLength ] = shadowUniforms;\n\t\t\t\t\tstate.pointShadowMap[ pointLength ] = shadowMap;\n\t\t\t\t\tstate.pointShadowMatrix[ pointLength ] = light.shadow.matrix;\n\n\t\t\t\t\tnumPointShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.point[ pointLength ] = uniforms;\n\n\t\t\t\tpointLength ++;\n\n\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.skyColor.copy( light.color ).multiplyScalar( intensity * scaleFactor );\n\t\t\t\tuniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity * scaleFactor );\n\n\t\t\t\tstate.hemi[ hemiLength ] = uniforms;\n\n\t\t\t\themiLength ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( rectAreaLength > 0 ) {\n\n\t\t\tif ( capabilities.isWebGL2 ) {\n\n\t\t\t\t// WebGL 2\n\n\t\t\t\tstate.rectAreaLTC1 = UniformsLib.LTC_FLOAT_1;\n\t\t\t\tstate.rectAreaLTC2 = UniformsLib.LTC_FLOAT_2;\n\n\t\t\t} else {\n\n\t\t\t\t// WebGL 1\n\n\t\t\t\tif ( extensions.has( 'OES_texture_float_linear' ) === true ) {\n\n\t\t\t\t\tstate.rectAreaLTC1 = UniformsLib.LTC_FLOAT_1;\n\t\t\t\t\tstate.rectAreaLTC2 = UniformsLib.LTC_FLOAT_2;\n\n\t\t\t\t} else if ( extensions.has( 'OES_texture_half_float_linear' ) === true ) {\n\n\t\t\t\t\tstate.rectAreaLTC1 = UniformsLib.LTC_HALF_1;\n\t\t\t\t\tstate.rectAreaLTC2 = UniformsLib.LTC_HALF_2;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer: Unable to use RectAreaLight. Missing WebGL extensions.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.ambient[ 0 ] = r;\n\t\tstate.ambient[ 1 ] = g;\n\t\tstate.ambient[ 2 ] = b;\n\n\t\tconst hash = state.hash;\n\n\t\tif ( hash.directionalLength !== directionalLength ||\n\t\t\thash.pointLength !== pointLength ||\n\t\t\thash.spotLength !== spotLength ||\n\t\t\thash.rectAreaLength !== rectAreaLength ||\n\t\t\thash.hemiLength !== hemiLength ||\n\t\t\thash.numDirectionalShadows !== numDirectionalShadows ||\n\t\t\thash.numPointShadows !== numPointShadows ||\n\t\t\thash.numSpotShadows !== numSpotShadows ) {\n\n\t\t\tstate.directional.length = directionalLength;\n\t\t\tstate.spot.length = spotLength;\n\t\t\tstate.rectArea.length = rectAreaLength;\n\t\t\tstate.point.length = pointLength;\n\t\t\tstate.hemi.length = hemiLength;\n\n\t\t\tstate.directionalShadow.length = numDirectionalShadows;\n\t\t\tstate.directionalShadowMap.length = numDirectionalShadows;\n\t\t\tstate.pointShadow.length = numPointShadows;\n\t\t\tstate.pointShadowMap.length = numPointShadows;\n\t\t\tstate.spotShadow.length = numSpotShadows;\n\t\t\tstate.spotShadowMap.length = numSpotShadows;\n\t\t\tstate.directionalShadowMatrix.length = numDirectionalShadows;\n\t\t\tstate.pointShadowMatrix.length = numPointShadows;\n\t\t\tstate.spotShadowMatrix.length = numSpotShadows;\n\n\t\t\thash.directionalLength = directionalLength;\n\t\t\thash.pointLength = pointLength;\n\t\t\thash.spotLength = spotLength;\n\t\t\thash.rectAreaLength = rectAreaLength;\n\t\t\thash.hemiLength = hemiLength;\n\n\t\t\thash.numDirectionalShadows = numDirectionalShadows;\n\t\t\thash.numPointShadows = numPointShadows;\n\t\t\thash.numSpotShadows = numSpotShadows;\n\n\t\t\tstate.version = nextVersion ++;\n\n\t\t}\n\n\t}\n\n\tfunction setupView( lights, camera ) {\n\n\t\tlet directionalLength = 0;\n\t\tlet pointLength = 0;\n\t\tlet spotLength = 0;\n\t\tlet rectAreaLength = 0;\n\t\tlet hemiLength = 0;\n\n\t\tconst viewMatrix = camera.matrixWorldInverse;\n\n\t\tfor ( let i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\n\t\t\tif ( light.isDirectionalLight ) {\n\n\t\t\t\tconst uniforms = state.directional[ directionalLength ];\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tvector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\tuniforms.direction.sub( vector3 );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\tdirectionalLength ++;\n\n\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\tconst uniforms = state.spot[ spotLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tvector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\tuniforms.direction.sub( vector3 );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\tspotLength ++;\n\n\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\tconst uniforms = state.rectArea[ rectAreaLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t// extract local rotation of light to derive width/height half vectors\n\t\t\t\tmatrix42.identity();\n\t\t\t\tmatrix4.copy( light.matrixWorld );\n\t\t\t\tmatrix4.premultiply( viewMatrix );\n\t\t\t\tmatrix42.extractRotation( matrix4 );\n\n\t\t\t\tuniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );\n\t\t\t\tuniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );\n\n\t\t\t\tuniforms.halfWidth.applyMatrix4( matrix42 );\n\t\t\t\tuniforms.halfHeight.applyMatrix4( matrix42 );\n\n\t\t\t\trectAreaLength ++;\n\n\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\tconst uniforms = state.point[ pointLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\tpointLength ++;\n\n\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\tconst uniforms = state.hemi[ hemiLength ];\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\t\t\t\tuniforms.direction.normalize();\n\n\t\t\t\themiLength ++;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tsetup: setup,\n\t\tsetupView: setupView,\n\t\tstate: state\n\t};\n\n}\n\n\nexport { WebGLLights };\n","import { WebGLLights } from './WebGLLights.js';\n\nfunction WebGLRenderState( extensions, capabilities ) {\n\n\tconst lights = new WebGLLights( extensions, capabilities );\n\n\tconst lightsArray = [];\n\tconst shadowsArray = [];\n\n\tfunction init() {\n\n\t\tlightsArray.length = 0;\n\t\tshadowsArray.length = 0;\n\n\t}\n\n\tfunction pushLight( light ) {\n\n\t\tlightsArray.push( light );\n\n\t}\n\n\tfunction pushShadow( shadowLight ) {\n\n\t\tshadowsArray.push( shadowLight );\n\n\t}\n\n\tfunction setupLights( physicallyCorrectLights ) {\n\n\t\tlights.setup( lightsArray, physicallyCorrectLights );\n\n\t}\n\n\tfunction setupLightsView( camera ) {\n\n\t\tlights.setupView( lightsArray, camera );\n\n\t}\n\n\tconst state = {\n\t\tlightsArray: lightsArray,\n\t\tshadowsArray: shadowsArray,\n\n\t\tlights: lights\n\t};\n\n\treturn {\n\t\tinit: init,\n\t\tstate: state,\n\t\tsetupLights: setupLights,\n\t\tsetupLightsView: setupLightsView,\n\n\t\tpushLight: pushLight,\n\t\tpushShadow: pushShadow\n\t};\n\n}\n\nfunction WebGLRenderStates( extensions, capabilities ) {\n\n\tlet renderStates = new WeakMap();\n\n\tfunction get( scene, renderCallDepth = 0 ) {\n\n\t\tlet renderState;\n\n\t\tif ( renderStates.has( scene ) === false ) {\n\n\t\t\trenderState = new WebGLRenderState( extensions, capabilities );\n\t\t\trenderStates.set( scene, [ renderState ] );\n\n\t\t} else {\n\n\t\t\tif ( renderCallDepth >= renderStates.get( scene ).length ) {\n\n\t\t\t\trenderState = new WebGLRenderState( extensions, capabilities );\n\t\t\t\trenderStates.get( scene ).push( renderState );\n\n\t\t\t} else {\n\n\t\t\t\trenderState = renderStates.get( scene )[ renderCallDepth ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn renderState;\n\n\t}\n\n\tfunction dispose() {\n\n\t\trenderStates = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\n\nexport { WebGLRenderStates };\n","import { Material } from './Material.js';\nimport { BasicDepthPacking } from '../constants.js';\n\n/**\n * parameters = {\n *\n *  opacity: <float>,\n *\n *  map: new THREE.Texture( <Image> ),\n *\n *  alphaMap: new THREE.Texture( <Image> ),\n *\n *  displacementMap: new THREE.Texture( <Image> ),\n *  displacementScale: <float>,\n *  displacementBias: <float>,\n *\n *  wireframe: <boolean>,\n *  wireframeLinewidth: <float>\n * }\n */\n\nclass MeshDepthMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'MeshDepthMaterial';\n\n\t\tthis.depthPacking = BasicDepthPacking;\n\n\t\tthis.map = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.fog = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.depthPacking = source.depthPacking;\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\treturn this;\n\n\t}\n\n}\n\nMeshDepthMaterial.prototype.isMeshDepthMaterial = true;\n\nexport { MeshDepthMaterial };\n","import { Material } from './Material.js';\nimport { Vector3 } from '../math/Vector3.js';\n\n/**\n * parameters = {\n *\n *  referencePosition: <float>,\n *  nearDistance: <float>,\n *  farDistance: <float>,\n *\n *  map: new THREE.Texture( <Image> ),\n *\n *  alphaMap: new THREE.Texture( <Image> ),\n *\n *  displacementMap: new THREE.Texture( <Image> ),\n *  displacementScale: <float>,\n *  displacementBias: <float>\n *\n * }\n */\n\nclass MeshDistanceMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'MeshDistanceMaterial';\n\n\t\tthis.referencePosition = new Vector3();\n\t\tthis.nearDistance = 1;\n\t\tthis.farDistance = 1000;\n\n\t\tthis.map = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.fog = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.referencePosition.copy( source.referencePosition );\n\t\tthis.nearDistance = source.nearDistance;\n\t\tthis.farDistance = source.farDistance;\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\treturn this;\n\n\t}\n\n}\n\nMeshDistanceMaterial.prototype.isMeshDistanceMaterial = true;\n\nexport { MeshDistanceMaterial };\n","import { FrontSide, BackSide, DoubleSide, RGBAFormat, NearestFilter, LinearFilter, PCFShadowMap, VSMShadowMap, RGBADepthPacking, NoBlending } from '../../constants.js';\nimport { WebGLRenderTarget } from '../WebGLRenderTarget.js';\nimport { MeshDepthMaterial } from '../../materials/MeshDepthMaterial.js';\nimport { MeshDistanceMaterial } from '../../materials/MeshDistanceMaterial.js';\nimport { ShaderMaterial } from '../../materials/ShaderMaterial.js';\nimport { BufferAttribute } from '../../core/BufferAttribute.js';\nimport { BufferGeometry } from '../../core/BufferGeometry.js';\nimport { Mesh } from '../../objects/Mesh.js';\nimport { Vector4 } from '../../math/Vector4.js';\nimport { Vector2 } from '../../math/Vector2.js';\nimport { Frustum } from '../../math/Frustum.js';\n\nimport * as vsm from '../shaders/ShaderLib/vsm.glsl.js';\n\nfunction WebGLShadowMap( _renderer, _objects, _capabilities ) {\n\n\tlet _frustum = new Frustum();\n\n\tconst _shadowMapSize = new Vector2(),\n\t\t_viewportSize = new Vector2(),\n\n\t\t_viewport = new Vector4(),\n\n\t\t_depthMaterial = new MeshDepthMaterial( { depthPacking: RGBADepthPacking } ),\n\t\t_distanceMaterial = new MeshDistanceMaterial(),\n\n\t\t_materialCache = {},\n\n\t\t_maxTextureSize = _capabilities.maxTextureSize;\n\n\tconst shadowSide = { 0: BackSide, 1: FrontSide, 2: DoubleSide };\n\n\tconst shadowMaterialVertical = new ShaderMaterial( {\n\t\tdefines: {\n\t\t\tVSM_SAMPLES: 8\n\t\t},\n\t\tuniforms: {\n\t\t\tshadow_pass: { value: null },\n\t\t\tresolution: { value: new Vector2() },\n\t\t\tradius: { value: 4.0 }\n\t\t},\n\n\t\tvertexShader: vsm.vertex,\n\t\tfragmentShader: vsm.fragment\n\n\t} );\n\n\tconst shadowMaterialHorizontal = shadowMaterialVertical.clone();\n\tshadowMaterialHorizontal.defines.HORIZONTAL_PASS = 1;\n\n\tconst fullScreenTri = new BufferGeometry();\n\tfullScreenTri.setAttribute(\n\t\t'position',\n\t\tnew BufferAttribute(\n\t\t\tnew Float32Array( [ - 1, - 1, 0.5, 3, - 1, 0.5, - 1, 3, 0.5 ] ),\n\t\t\t3\n\t\t)\n\t);\n\n\tconst fullScreenMesh = new Mesh( fullScreenTri, shadowMaterialVertical );\n\n\tconst scope = this;\n\n\tthis.enabled = false;\n\n\tthis.autoUpdate = true;\n\tthis.needsUpdate = false;\n\n\tthis.type = PCFShadowMap;\n\n\tthis.render = function ( lights, scene, camera ) {\n\n\t\tif ( scope.enabled === false ) return;\n\t\tif ( scope.autoUpdate === false && scope.needsUpdate === false ) return;\n\n\t\tif ( lights.length === 0 ) return;\n\n\t\tconst currentRenderTarget = _renderer.getRenderTarget();\n\t\tconst activeCubeFace = _renderer.getActiveCubeFace();\n\t\tconst activeMipmapLevel = _renderer.getActiveMipmapLevel();\n\n\t\tconst _state = _renderer.state;\n\n\t\t// Set GL state for depth map.\n\t\t_state.setBlending( NoBlending );\n\t\t_state.buffers.color.setClear( 1, 1, 1, 1 );\n\t\t_state.buffers.depth.setTest( true );\n\t\t_state.setScissorTest( false );\n\n\t\t// render depth map\n\n\t\tfor ( let i = 0, il = lights.length; i < il; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\t\t\tconst shadow = light.shadow;\n\n\t\t\tif ( shadow === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLShadowMap:', light, 'has no shadow.' );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( shadow.autoUpdate === false && shadow.needsUpdate === false ) continue;\n\n\t\t\t_shadowMapSize.copy( shadow.mapSize );\n\n\t\t\tconst shadowFrameExtents = shadow.getFrameExtents();\n\n\t\t\t_shadowMapSize.multiply( shadowFrameExtents );\n\n\t\t\t_viewportSize.copy( shadow.mapSize );\n\n\t\t\tif ( _shadowMapSize.x > _maxTextureSize || _shadowMapSize.y > _maxTextureSize ) {\n\n\t\t\t\tif ( _shadowMapSize.x > _maxTextureSize ) {\n\n\t\t\t\t\t_viewportSize.x = Math.floor( _maxTextureSize / shadowFrameExtents.x );\n\t\t\t\t\t_shadowMapSize.x = _viewportSize.x * shadowFrameExtents.x;\n\t\t\t\t\tshadow.mapSize.x = _viewportSize.x;\n\n\t\t\t\t}\n\n\t\t\t\tif ( _shadowMapSize.y > _maxTextureSize ) {\n\n\t\t\t\t\t_viewportSize.y = Math.floor( _maxTextureSize / shadowFrameExtents.y );\n\t\t\t\t\t_shadowMapSize.y = _viewportSize.y * shadowFrameExtents.y;\n\t\t\t\t\tshadow.mapSize.y = _viewportSize.y;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( shadow.map === null && ! shadow.isPointLightShadow && this.type === VSMShadowMap ) {\n\n\t\t\t\tconst pars = { minFilter: LinearFilter, magFilter: LinearFilter, format: RGBAFormat };\n\n\t\t\t\tshadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );\n\t\t\t\tshadow.map.texture.name = light.name + '.shadowMap';\n\n\t\t\t\tshadow.mapPass = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );\n\n\t\t\t\tshadow.camera.updateProjectionMatrix();\n\n\t\t\t}\n\n\t\t\tif ( shadow.map === null ) {\n\n\t\t\t\tconst pars = { minFilter: NearestFilter, magFilter: NearestFilter, format: RGBAFormat };\n\n\t\t\t\tshadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );\n\t\t\t\tshadow.map.texture.name = light.name + '.shadowMap';\n\n\t\t\t\tshadow.camera.updateProjectionMatrix();\n\n\t\t\t}\n\n\t\t\t_renderer.setRenderTarget( shadow.map );\n\t\t\t_renderer.clear();\n\n\t\t\tconst viewportCount = shadow.getViewportCount();\n\n\t\t\tfor ( let vp = 0; vp < viewportCount; vp ++ ) {\n\n\t\t\t\tconst viewport = shadow.getViewport( vp );\n\n\t\t\t\t_viewport.set(\n\t\t\t\t\t_viewportSize.x * viewport.x,\n\t\t\t\t\t_viewportSize.y * viewport.y,\n\t\t\t\t\t_viewportSize.x * viewport.z,\n\t\t\t\t\t_viewportSize.y * viewport.w\n\t\t\t\t);\n\n\t\t\t\t_state.viewport( _viewport );\n\n\t\t\t\tshadow.updateMatrices( light, vp );\n\n\t\t\t\t_frustum = shadow.getFrustum();\n\n\t\t\t\trenderObject( scene, camera, shadow.camera, light, this.type );\n\n\t\t\t}\n\n\t\t\t// do blur pass for VSM\n\n\t\t\tif ( ! shadow.isPointLightShadow && this.type === VSMShadowMap ) {\n\n\t\t\t\tVSMPass( shadow, camera );\n\n\t\t\t}\n\n\t\t\tshadow.needsUpdate = false;\n\n\t\t}\n\n\t\tscope.needsUpdate = false;\n\n\t\t_renderer.setRenderTarget( currentRenderTarget, activeCubeFace, activeMipmapLevel );\n\n\t};\n\n\tfunction VSMPass( shadow, camera ) {\n\n\t\tconst geometry = _objects.update( fullScreenMesh );\n\n\t\tif ( shadowMaterialVertical.defines.VSM_SAMPLES !== shadow.blurSamples ) {\n\n\t\t\tshadowMaterialVertical.defines.VSM_SAMPLES = shadow.blurSamples;\n\t\t\tshadowMaterialHorizontal.defines.VSM_SAMPLES = shadow.blurSamples;\n\n\t\t\tshadowMaterialVertical.needsUpdate = true;\n\t\t\tshadowMaterialHorizontal.needsUpdate = true;\n\n\t\t}\n\n\t\t// vertical pass\n\n\t\tshadowMaterialVertical.uniforms.shadow_pass.value = shadow.map.texture;\n\t\tshadowMaterialVertical.uniforms.resolution.value = shadow.mapSize;\n\t\tshadowMaterialVertical.uniforms.radius.value = shadow.radius;\n\t\t_renderer.setRenderTarget( shadow.mapPass );\n\t\t_renderer.clear();\n\t\t_renderer.renderBufferDirect( camera, null, geometry, shadowMaterialVertical, fullScreenMesh, null );\n\n\t\t// horizontal pass\n\n\t\tshadowMaterialHorizontal.uniforms.shadow_pass.value = shadow.mapPass.texture;\n\t\tshadowMaterialHorizontal.uniforms.resolution.value = shadow.mapSize;\n\t\tshadowMaterialHorizontal.uniforms.radius.value = shadow.radius;\n\t\t_renderer.setRenderTarget( shadow.map );\n\t\t_renderer.clear();\n\t\t_renderer.renderBufferDirect( camera, null, geometry, shadowMaterialHorizontal, fullScreenMesh, null );\n\n\t}\n\n\tfunction getDepthMaterial( object, geometry, material, light, shadowCameraNear, shadowCameraFar, type ) {\n\n\t\tlet result = null;\n\n\t\tconst customMaterial = ( light.isPointLight === true ) ? object.customDistanceMaterial : object.customDepthMaterial;\n\n\t\tif ( customMaterial !== undefined ) {\n\n\t\t\tresult = customMaterial;\n\n\t\t} else {\n\n\t\t\tresult = ( light.isPointLight === true ) ? _distanceMaterial : _depthMaterial;\n\n\t\t}\n\n\t\tif ( ( _renderer.localClippingEnabled && material.clipShadows === true && material.clippingPlanes.length !== 0 ) ||\n\t\t\t( material.displacementMap && material.displacementScale !== 0 ) ||\n\t\t\t( material.alphaMap && material.alphaTest > 0 ) ) {\n\n\t\t\t// in this case we need a unique material instance reflecting the\n\t\t\t// appropriate state\n\n\t\t\tconst keyA = result.uuid, keyB = material.uuid;\n\n\t\t\tlet materialsForVariant = _materialCache[ keyA ];\n\n\t\t\tif ( materialsForVariant === undefined ) {\n\n\t\t\t\tmaterialsForVariant = {};\n\t\t\t\t_materialCache[ keyA ] = materialsForVariant;\n\n\t\t\t}\n\n\t\t\tlet cachedMaterial = materialsForVariant[ keyB ];\n\n\t\t\tif ( cachedMaterial === undefined ) {\n\n\t\t\t\tcachedMaterial = result.clone();\n\t\t\t\tmaterialsForVariant[ keyB ] = cachedMaterial;\n\n\t\t\t}\n\n\t\t\tresult = cachedMaterial;\n\n\t\t}\n\n\t\tresult.visible = material.visible;\n\t\tresult.wireframe = material.wireframe;\n\n\t\tif ( type === VSMShadowMap ) {\n\n\t\t\tresult.side = ( material.shadowSide !== null ) ? material.shadowSide : material.side;\n\n\t\t} else {\n\n\t\t\tresult.side = ( material.shadowSide !== null ) ? material.shadowSide : shadowSide[ material.side ];\n\n\t\t}\n\n\t\tresult.alphaMap = material.alphaMap;\n\t\tresult.alphaTest = material.alphaTest;\n\n\t\tresult.clipShadows = material.clipShadows;\n\t\tresult.clippingPlanes = material.clippingPlanes;\n\t\tresult.clipIntersection = material.clipIntersection;\n\n\t\tresult.displacementMap = material.displacementMap;\n\t\tresult.displacementScale = material.displacementScale;\n\t\tresult.displacementBias = material.displacementBias;\n\n\t\tresult.wireframeLinewidth = material.wireframeLinewidth;\n\t\tresult.linewidth = material.linewidth;\n\n\t\tif ( light.isPointLight === true && result.isMeshDistanceMaterial === true ) {\n\n\t\t\tresult.referencePosition.setFromMatrixPosition( light.matrixWorld );\n\t\t\tresult.nearDistance = shadowCameraNear;\n\t\t\tresult.farDistance = shadowCameraFar;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tfunction renderObject( object, camera, shadowCamera, light, type ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tconst visible = object.layers.test( camera.layers );\n\n\t\tif ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) {\n\n\t\t\tif ( ( object.castShadow || ( object.receiveShadow && type === VSMShadowMap ) ) && ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) ) {\n\n\t\t\t\tobject.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld );\n\n\t\t\t\tconst geometry = _objects.update( object );\n\t\t\t\tconst material = object.material;\n\n\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\tconst groups = geometry.groups;\n\n\t\t\t\t\tfor ( let k = 0, kl = groups.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\tconst group = groups[ k ];\n\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\tif ( groupMaterial && groupMaterial.visible ) {\n\n\t\t\t\t\t\t\tconst depthMaterial = getDepthMaterial( object, geometry, groupMaterial, light, shadowCamera.near, shadowCamera.far, type );\n\n\t\t\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( material.visible ) {\n\n\t\t\t\t\tconst depthMaterial = getDepthMaterial( object, geometry, material, light, shadowCamera.near, shadowCamera.far, type );\n\n\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\trenderObject( children[ i ], camera, shadowCamera, light, type );\n\n\t\t}\n\n\t}\n\n}\n\n\nexport { WebGLShadowMap };\n","export const vertex = /* glsl */`\nvoid main() {\n\n\tgl_Position = vec4( position, 1.0 );\n\n}\n`;\n\nexport const fragment = /* glsl */`\nuniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\n\n#include <packing>\n\nvoid main() {\n\n\tconst float samples = float( VSM_SAMPLES );\n\n\tfloat mean = 0.0;\n\tfloat squared_mean = 0.0;\n\n\t// This seems totally useless but it's a crazy work around for a Adreno compiler bug\n\t// float depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy ) / resolution ) );\n\n\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\n\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\n\tfor ( float i = 0.0; i < samples; i ++ ) {\n\n\t\tfloat uvOffset = uvStart + i * uvStride;\n\n\t\t#ifdef HORIZONTAL_PASS\n\n\t\t\tvec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ) );\n\t\t\tmean += distribution.x;\n\t\t\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n\n\t\t#else\n\n\t\t\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ) );\n\t\t\tmean += depth;\n\t\t\tsquared_mean += depth * depth;\n\n\t\t#endif\n\n\t}\n\n\tmean = mean / samples;\n\tsquared_mean = squared_mean / samples;\n\n\tfloat std_dev = sqrt( squared_mean - mean * mean );\n\n\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\n\n}\n`;\n","import { NotEqualDepth, GreaterDepth, GreaterEqualDepth, EqualDepth, LessEqualDepth, LessDepth, AlwaysDepth, NeverDepth, CullFaceFront, CullFaceBack, CullFaceNone, DoubleSide, BackSide, CustomBlending, MultiplyBlending, SubtractiveBlending, AdditiveBlending, NoBlending, NormalBlending, AddEquation, SubtractEquation, ReverseSubtractEquation, MinEquation, MaxEquation, ZeroFactor, OneFactor, SrcColorFactor, SrcAlphaFactor, SrcAlphaSaturateFactor, DstColorFactor, DstAlphaFactor, OneMinusSrcColorFactor, OneMinusSrcAlphaFactor, OneMinusDstColorFactor, OneMinusDstAlphaFactor } from '../../constants.js';\nimport { Vector4 } from '../../math/Vector4.js';\n\nfunction WebGLState( gl, extensions, capabilities ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\n\tfunction ColorBuffer() {\n\n\t\tlet locked = false;\n\n\t\tconst color = new Vector4();\n\t\tlet currentColorMask = null;\n\t\tconst currentColorClear = new Vector4( 0, 0, 0, 0 );\n\n\t\treturn {\n\n\t\t\tsetMask: function ( colorMask ) {\n\n\t\t\t\tif ( currentColorMask !== colorMask && ! locked ) {\n\n\t\t\t\t\tgl.colorMask( colorMask, colorMask, colorMask, colorMask );\n\t\t\t\t\tcurrentColorMask = colorMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( r, g, b, a, premultipliedAlpha ) {\n\n\t\t\t\tif ( premultipliedAlpha === true ) {\n\n\t\t\t\t\tr *= a; g *= a; b *= a;\n\n\t\t\t\t}\n\n\t\t\t\tcolor.set( r, g, b, a );\n\n\t\t\t\tif ( currentColorClear.equals( color ) === false ) {\n\n\t\t\t\t\tgl.clearColor( r, g, b, a );\n\t\t\t\t\tcurrentColorClear.copy( color );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentColorMask = null;\n\t\t\t\tcurrentColorClear.set( - 1, 0, 0, 0 ); // set to invalid state\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tfunction DepthBuffer() {\n\n\t\tlet locked = false;\n\n\t\tlet currentDepthMask = null;\n\t\tlet currentDepthFunc = null;\n\t\tlet currentDepthClear = null;\n\n\t\treturn {\n\n\t\t\tsetTest: function ( depthTest ) {\n\n\t\t\t\tif ( depthTest ) {\n\n\t\t\t\t\tenable( gl.DEPTH_TEST );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdisable( gl.DEPTH_TEST );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetMask: function ( depthMask ) {\n\n\t\t\t\tif ( currentDepthMask !== depthMask && ! locked ) {\n\n\t\t\t\t\tgl.depthMask( depthMask );\n\t\t\t\t\tcurrentDepthMask = depthMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetFunc: function ( depthFunc ) {\n\n\t\t\t\tif ( currentDepthFunc !== depthFunc ) {\n\n\t\t\t\t\tif ( depthFunc ) {\n\n\t\t\t\t\t\tswitch ( depthFunc ) {\n\n\t\t\t\t\t\t\tcase NeverDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( gl.NEVER );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase AlwaysDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( gl.ALWAYS );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase LessDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( gl.LESS );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase LessEqualDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase EqualDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( gl.EQUAL );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase GreaterEqualDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( gl.GEQUAL );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase GreaterDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( gl.GREATER );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase NotEqualDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( gl.NOTEQUAL );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcurrentDepthFunc = depthFunc;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( depth ) {\n\n\t\t\t\tif ( currentDepthClear !== depth ) {\n\n\t\t\t\t\tgl.clearDepth( depth );\n\t\t\t\t\tcurrentDepthClear = depth;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentDepthMask = null;\n\t\t\t\tcurrentDepthFunc = null;\n\t\t\t\tcurrentDepthClear = null;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tfunction StencilBuffer() {\n\n\t\tlet locked = false;\n\n\t\tlet currentStencilMask = null;\n\t\tlet currentStencilFunc = null;\n\t\tlet currentStencilRef = null;\n\t\tlet currentStencilFuncMask = null;\n\t\tlet currentStencilFail = null;\n\t\tlet currentStencilZFail = null;\n\t\tlet currentStencilZPass = null;\n\t\tlet currentStencilClear = null;\n\n\t\treturn {\n\n\t\t\tsetTest: function ( stencilTest ) {\n\n\t\t\t\tif ( ! locked ) {\n\n\t\t\t\t\tif ( stencilTest ) {\n\n\t\t\t\t\t\tenable( gl.STENCIL_TEST );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdisable( gl.STENCIL_TEST );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetMask: function ( stencilMask ) {\n\n\t\t\t\tif ( currentStencilMask !== stencilMask && ! locked ) {\n\n\t\t\t\t\tgl.stencilMask( stencilMask );\n\t\t\t\t\tcurrentStencilMask = stencilMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetFunc: function ( stencilFunc, stencilRef, stencilMask ) {\n\n\t\t\t\tif ( currentStencilFunc !== stencilFunc ||\n\t\t\t\t     currentStencilRef !== stencilRef ||\n\t\t\t\t     currentStencilFuncMask !== stencilMask ) {\n\n\t\t\t\t\tgl.stencilFunc( stencilFunc, stencilRef, stencilMask );\n\n\t\t\t\t\tcurrentStencilFunc = stencilFunc;\n\t\t\t\t\tcurrentStencilRef = stencilRef;\n\t\t\t\t\tcurrentStencilFuncMask = stencilMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetOp: function ( stencilFail, stencilZFail, stencilZPass ) {\n\n\t\t\t\tif ( currentStencilFail !== stencilFail ||\n\t\t\t\t     currentStencilZFail !== stencilZFail ||\n\t\t\t\t     currentStencilZPass !== stencilZPass ) {\n\n\t\t\t\t\tgl.stencilOp( stencilFail, stencilZFail, stencilZPass );\n\n\t\t\t\t\tcurrentStencilFail = stencilFail;\n\t\t\t\t\tcurrentStencilZFail = stencilZFail;\n\t\t\t\t\tcurrentStencilZPass = stencilZPass;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( stencil ) {\n\n\t\t\t\tif ( currentStencilClear !== stencil ) {\n\n\t\t\t\t\tgl.clearStencil( stencil );\n\t\t\t\t\tcurrentStencilClear = stencil;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentStencilMask = null;\n\t\t\t\tcurrentStencilFunc = null;\n\t\t\t\tcurrentStencilRef = null;\n\t\t\t\tcurrentStencilFuncMask = null;\n\t\t\t\tcurrentStencilFail = null;\n\t\t\t\tcurrentStencilZFail = null;\n\t\t\t\tcurrentStencilZPass = null;\n\t\t\t\tcurrentStencilClear = null;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t//\n\n\tconst colorBuffer = new ColorBuffer();\n\tconst depthBuffer = new DepthBuffer();\n\tconst stencilBuffer = new StencilBuffer();\n\n\tlet enabledCapabilities = {};\n\n\tlet currentBoundFramebuffers = {};\n\tlet currentDrawbuffers = new WeakMap();\n\tlet defaultDrawbuffers = [];\n\n\tlet currentProgram = null;\n\n\tlet currentBlendingEnabled = false;\n\tlet currentBlending = null;\n\tlet currentBlendEquation = null;\n\tlet currentBlendSrc = null;\n\tlet currentBlendDst = null;\n\tlet currentBlendEquationAlpha = null;\n\tlet currentBlendSrcAlpha = null;\n\tlet currentBlendDstAlpha = null;\n\tlet currentPremultipledAlpha = false;\n\n\tlet currentFlipSided = null;\n\tlet currentCullFace = null;\n\n\tlet currentLineWidth = null;\n\n\tlet currentPolygonOffsetFactor = null;\n\tlet currentPolygonOffsetUnits = null;\n\n\tconst maxTextures = gl.getParameter( gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS );\n\n\tlet lineWidthAvailable = false;\n\tlet version = 0;\n\tconst glVersion = gl.getParameter( gl.VERSION );\n\n\tif ( glVersion.indexOf( 'WebGL' ) !== - 1 ) {\n\n\t\tversion = parseFloat( /^WebGL (\\d)/.exec( glVersion )[ 1 ] );\n\t\tlineWidthAvailable = ( version >= 1.0 );\n\n\t} else if ( glVersion.indexOf( 'OpenGL ES' ) !== - 1 ) {\n\n\t\tversion = parseFloat( /^OpenGL ES (\\d)/.exec( glVersion )[ 1 ] );\n\t\tlineWidthAvailable = ( version >= 2.0 );\n\n\t}\n\n\tlet currentTextureSlot = null;\n\tlet currentBoundTextures = {};\n\n\tconst scissorParam = gl.getParameter( gl.SCISSOR_BOX );\n\tconst viewportParam = gl.getParameter( gl.VIEWPORT );\n\n\tconst currentScissor = new Vector4().fromArray( scissorParam );\n\tconst currentViewport = new Vector4().fromArray( viewportParam );\n\n\tfunction createTexture( type, target, count ) {\n\n\t\tconst data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4.\n\t\tconst texture = gl.createTexture();\n\n\t\tgl.bindTexture( type, texture );\n\t\tgl.texParameteri( type, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\t\tgl.texParameteri( type, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tgl.texImage2D( target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data );\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tconst emptyTextures = {};\n\temptyTextures[ gl.TEXTURE_2D ] = createTexture( gl.TEXTURE_2D, gl.TEXTURE_2D, 1 );\n\temptyTextures[ gl.TEXTURE_CUBE_MAP ] = createTexture( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6 );\n\n\t// init\n\n\tcolorBuffer.setClear( 0, 0, 0, 1 );\n\tdepthBuffer.setClear( 1 );\n\tstencilBuffer.setClear( 0 );\n\n\tenable( gl.DEPTH_TEST );\n\tdepthBuffer.setFunc( LessEqualDepth );\n\n\tsetFlipSided( false );\n\tsetCullFace( CullFaceBack );\n\tenable( gl.CULL_FACE );\n\n\tsetBlending( NoBlending );\n\n\t//\n\n\tfunction enable( id ) {\n\n\t\tif ( enabledCapabilities[ id ] !== true ) {\n\n\t\t\tgl.enable( id );\n\t\t\tenabledCapabilities[ id ] = true;\n\n\t\t}\n\n\t}\n\n\tfunction disable( id ) {\n\n\t\tif ( enabledCapabilities[ id ] !== false ) {\n\n\t\t\tgl.disable( id );\n\t\t\tenabledCapabilities[ id ] = false;\n\n\t\t}\n\n\t}\n\n\tfunction bindFramebuffer( target, framebuffer ) {\n\n\t\tif ( currentBoundFramebuffers[ target ] !== framebuffer ) {\n\n\t\t\tgl.bindFramebuffer( target, framebuffer );\n\n\t\t\tcurrentBoundFramebuffers[ target ] = framebuffer;\n\n\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\t// gl.DRAW_FRAMEBUFFER is equivalent to gl.FRAMEBUFFER\n\n\t\t\t\tif ( target === gl.DRAW_FRAMEBUFFER ) {\n\n\t\t\t\t\tcurrentBoundFramebuffers[ gl.FRAMEBUFFER ] = framebuffer;\n\n\t\t\t\t}\n\n\t\t\t\tif ( target === gl.FRAMEBUFFER ) {\n\n\t\t\t\t\tcurrentBoundFramebuffers[ gl.DRAW_FRAMEBUFFER ] = framebuffer;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tfunction drawBuffers( renderTarget, framebuffer ) {\n\n\t\tlet drawBuffers = defaultDrawbuffers;\n\n\t\tlet needsUpdate = false;\n\n\t\tif ( renderTarget ) {\n\n\t\t\tdrawBuffers = currentDrawbuffers.get( framebuffer );\n\n\t\t\tif ( drawBuffers === undefined ) {\n\n\t\t\t\tdrawBuffers = [];\n\t\t\t\tcurrentDrawbuffers.set( framebuffer, drawBuffers );\n\n\t\t\t}\n\n\t\t\tif ( renderTarget.isWebGLMultipleRenderTargets ) {\n\n\t\t\t\tconst textures = renderTarget.texture;\n\n\t\t\t\tif ( drawBuffers.length !== textures.length || drawBuffers[ 0 ] !== gl.COLOR_ATTACHMENT0 ) {\n\n\t\t\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tdrawBuffers[ i ] = gl.COLOR_ATTACHMENT0 + i;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tdrawBuffers.length = textures.length;\n\n\t\t\t\t\tneedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( drawBuffers[ 0 ] !== gl.COLOR_ATTACHMENT0 ) {\n\n\t\t\t\t\tdrawBuffers[ 0 ] = gl.COLOR_ATTACHMENT0;\n\n\t\t\t\t\tneedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( drawBuffers[ 0 ] !== gl.BACK ) {\n\n\t\t\t\tdrawBuffers[ 0 ] = gl.BACK;\n\n\t\t\t\tneedsUpdate = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( needsUpdate ) {\n\n\t\t\tif ( capabilities.isWebGL2 ) {\n\n\t\t\t\tgl.drawBuffers( drawBuffers );\n\n\t\t\t} else {\n\n\t\t\t\textensions.get( 'WEBGL_draw_buffers' ).drawBuffersWEBGL( drawBuffers );\n\n\t\t\t}\n\n\t\t}\n\n\n\t}\n\n\tfunction useProgram( program ) {\n\n\t\tif ( currentProgram !== program ) {\n\n\t\t\tgl.useProgram( program );\n\n\t\t\tcurrentProgram = program;\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tconst equationToGL = {\n\t\t[ AddEquation ]: gl.FUNC_ADD,\n\t\t[ SubtractEquation ]: gl.FUNC_SUBTRACT,\n\t\t[ ReverseSubtractEquation ]: gl.FUNC_REVERSE_SUBTRACT\n\t};\n\n\tif ( isWebGL2 ) {\n\n\t\tequationToGL[ MinEquation ] = gl.MIN;\n\t\tequationToGL[ MaxEquation ] = gl.MAX;\n\n\t} else {\n\n\t\tconst extension = extensions.get( 'EXT_blend_minmax' );\n\n\t\tif ( extension !== null ) {\n\n\t\t\tequationToGL[ MinEquation ] = extension.MIN_EXT;\n\t\t\tequationToGL[ MaxEquation ] = extension.MAX_EXT;\n\n\t\t}\n\n\t}\n\n\tconst factorToGL = {\n\t\t[ ZeroFactor ]: gl.ZERO,\n\t\t[ OneFactor ]: gl.ONE,\n\t\t[ SrcColorFactor ]: gl.SRC_COLOR,\n\t\t[ SrcAlphaFactor ]: gl.SRC_ALPHA,\n\t\t[ SrcAlphaSaturateFactor ]: gl.SRC_ALPHA_SATURATE,\n\t\t[ DstColorFactor ]: gl.DST_COLOR,\n\t\t[ DstAlphaFactor ]: gl.DST_ALPHA,\n\t\t[ OneMinusSrcColorFactor ]: gl.ONE_MINUS_SRC_COLOR,\n\t\t[ OneMinusSrcAlphaFactor ]: gl.ONE_MINUS_SRC_ALPHA,\n\t\t[ OneMinusDstColorFactor ]: gl.ONE_MINUS_DST_COLOR,\n\t\t[ OneMinusDstAlphaFactor ]: gl.ONE_MINUS_DST_ALPHA\n\t};\n\n\tfunction setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha ) {\n\n\t\tif ( blending === NoBlending ) {\n\n\t\t\tif ( currentBlendingEnabled === true ) {\n\n\t\t\t\tdisable( gl.BLEND );\n\t\t\t\tcurrentBlendingEnabled = false;\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( currentBlendingEnabled === false ) {\n\n\t\t\tenable( gl.BLEND );\n\t\t\tcurrentBlendingEnabled = true;\n\n\t\t}\n\n\t\tif ( blending !== CustomBlending ) {\n\n\t\t\tif ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) {\n\n\t\t\t\tif ( currentBlendEquation !== AddEquation || currentBlendEquationAlpha !== AddEquation ) {\n\n\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\n\t\t\t\t\tcurrentBlendEquation = AddEquation;\n\t\t\t\t\tcurrentBlendEquationAlpha = AddEquation;\n\n\t\t\t\t}\n\n\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\tswitch ( blending ) {\n\n\t\t\t\t\t\tcase NormalBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AdditiveBlending:\n\t\t\t\t\t\t\tgl.blendFunc( gl.ONE, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase SubtractiveBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ZERO, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase MultiplyBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.SRC_COLOR, gl.ZERO, gl.SRC_ALPHA );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.WebGLState: Invalid blending: ', blending );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tswitch ( blending ) {\n\n\t\t\t\t\t\tcase NormalBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AdditiveBlending:\n\t\t\t\t\t\t\tgl.blendFunc( gl.SRC_ALPHA, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase SubtractiveBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ZERO, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase MultiplyBlending:\n\t\t\t\t\t\t\tgl.blendFunc( gl.ZERO, gl.SRC_COLOR );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.WebGLState: Invalid blending: ', blending );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tcurrentBlendSrc = null;\n\t\t\t\tcurrentBlendDst = null;\n\t\t\t\tcurrentBlendSrcAlpha = null;\n\t\t\t\tcurrentBlendDstAlpha = null;\n\n\t\t\t\tcurrentBlending = blending;\n\t\t\t\tcurrentPremultipledAlpha = premultipliedAlpha;\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// custom blending\n\n\t\tblendEquationAlpha = blendEquationAlpha || blendEquation;\n\t\tblendSrcAlpha = blendSrcAlpha || blendSrc;\n\t\tblendDstAlpha = blendDstAlpha || blendDst;\n\n\t\tif ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) {\n\n\t\t\tgl.blendEquationSeparate( equationToGL[ blendEquation ], equationToGL[ blendEquationAlpha ] );\n\n\t\t\tcurrentBlendEquation = blendEquation;\n\t\t\tcurrentBlendEquationAlpha = blendEquationAlpha;\n\n\t\t}\n\n\t\tif ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) {\n\n\t\t\tgl.blendFuncSeparate( factorToGL[ blendSrc ], factorToGL[ blendDst ], factorToGL[ blendSrcAlpha ], factorToGL[ blendDstAlpha ] );\n\n\t\t\tcurrentBlendSrc = blendSrc;\n\t\t\tcurrentBlendDst = blendDst;\n\t\t\tcurrentBlendSrcAlpha = blendSrcAlpha;\n\t\t\tcurrentBlendDstAlpha = blendDstAlpha;\n\n\t\t}\n\n\t\tcurrentBlending = blending;\n\t\tcurrentPremultipledAlpha = null;\n\n\t}\n\n\tfunction setMaterial( material, frontFaceCW ) {\n\n\t\tmaterial.side === DoubleSide\n\t\t\t? disable( gl.CULL_FACE )\n\t\t\t: enable( gl.CULL_FACE );\n\n\t\tlet flipSided = ( material.side === BackSide );\n\t\tif ( frontFaceCW ) flipSided = ! flipSided;\n\n\t\tsetFlipSided( flipSided );\n\n\t\t( material.blending === NormalBlending && material.transparent === false )\n\t\t\t? setBlending( NoBlending )\n\t\t\t: setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha );\n\n\t\tdepthBuffer.setFunc( material.depthFunc );\n\t\tdepthBuffer.setTest( material.depthTest );\n\t\tdepthBuffer.setMask( material.depthWrite );\n\t\tcolorBuffer.setMask( material.colorWrite );\n\n\t\tconst stencilWrite = material.stencilWrite;\n\t\tstencilBuffer.setTest( stencilWrite );\n\t\tif ( stencilWrite ) {\n\n\t\t\tstencilBuffer.setMask( material.stencilWriteMask );\n\t\t\tstencilBuffer.setFunc( material.stencilFunc, material.stencilRef, material.stencilFuncMask );\n\t\t\tstencilBuffer.setOp( material.stencilFail, material.stencilZFail, material.stencilZPass );\n\n\t\t}\n\n\t\tsetPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );\n\n\t\tmaterial.alphaToCoverage === true\n\t\t\t? enable( gl.SAMPLE_ALPHA_TO_COVERAGE )\n\t\t\t: disable( gl.SAMPLE_ALPHA_TO_COVERAGE );\n\n\t}\n\n\t//\n\n\tfunction setFlipSided( flipSided ) {\n\n\t\tif ( currentFlipSided !== flipSided ) {\n\n\t\t\tif ( flipSided ) {\n\n\t\t\t\tgl.frontFace( gl.CW );\n\n\t\t\t} else {\n\n\t\t\t\tgl.frontFace( gl.CCW );\n\n\t\t\t}\n\n\t\t\tcurrentFlipSided = flipSided;\n\n\t\t}\n\n\t}\n\n\tfunction setCullFace( cullFace ) {\n\n\t\tif ( cullFace !== CullFaceNone ) {\n\n\t\t\tenable( gl.CULL_FACE );\n\n\t\t\tif ( cullFace !== currentCullFace ) {\n\n\t\t\t\tif ( cullFace === CullFaceBack ) {\n\n\t\t\t\t\tgl.cullFace( gl.BACK );\n\n\t\t\t\t} else if ( cullFace === CullFaceFront ) {\n\n\t\t\t\t\tgl.cullFace( gl.FRONT );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.cullFace( gl.FRONT_AND_BACK );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tdisable( gl.CULL_FACE );\n\n\t\t}\n\n\t\tcurrentCullFace = cullFace;\n\n\t}\n\n\tfunction setLineWidth( width ) {\n\n\t\tif ( width !== currentLineWidth ) {\n\n\t\t\tif ( lineWidthAvailable ) gl.lineWidth( width );\n\n\t\t\tcurrentLineWidth = width;\n\n\t\t}\n\n\t}\n\n\tfunction setPolygonOffset( polygonOffset, factor, units ) {\n\n\t\tif ( polygonOffset ) {\n\n\t\t\tenable( gl.POLYGON_OFFSET_FILL );\n\n\t\t\tif ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) {\n\n\t\t\t\tgl.polygonOffset( factor, units );\n\n\t\t\t\tcurrentPolygonOffsetFactor = factor;\n\t\t\t\tcurrentPolygonOffsetUnits = units;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tdisable( gl.POLYGON_OFFSET_FILL );\n\n\t\t}\n\n\t}\n\n\tfunction setScissorTest( scissorTest ) {\n\n\t\tif ( scissorTest ) {\n\n\t\t\tenable( gl.SCISSOR_TEST );\n\n\t\t} else {\n\n\t\t\tdisable( gl.SCISSOR_TEST );\n\n\t\t}\n\n\t}\n\n\t// texture\n\n\tfunction activeTexture( webglSlot ) {\n\n\t\tif ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1;\n\n\t\tif ( currentTextureSlot !== webglSlot ) {\n\n\t\t\tgl.activeTexture( webglSlot );\n\t\t\tcurrentTextureSlot = webglSlot;\n\n\t\t}\n\n\t}\n\n\tfunction bindTexture( webglType, webglTexture ) {\n\n\t\tif ( currentTextureSlot === null ) {\n\n\t\t\tactiveTexture();\n\n\t\t}\n\n\t\tlet boundTexture = currentBoundTextures[ currentTextureSlot ];\n\n\t\tif ( boundTexture === undefined ) {\n\n\t\t\tboundTexture = { type: undefined, texture: undefined };\n\t\t\tcurrentBoundTextures[ currentTextureSlot ] = boundTexture;\n\n\t\t}\n\n\t\tif ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) {\n\n\t\t\tgl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] );\n\n\t\t\tboundTexture.type = webglType;\n\t\t\tboundTexture.texture = webglTexture;\n\n\t\t}\n\n\t}\n\n\tfunction unbindTexture() {\n\n\t\tconst boundTexture = currentBoundTextures[ currentTextureSlot ];\n\n\t\tif ( boundTexture !== undefined && boundTexture.type !== undefined ) {\n\n\t\t\tgl.bindTexture( boundTexture.type, null );\n\n\t\t\tboundTexture.type = undefined;\n\t\t\tboundTexture.texture = undefined;\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexImage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texSubImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texSubImage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texSubImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texSubImage3D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexSubImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexSubImage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texStorage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texStorage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texStorage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texStorage3D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texImage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texImage3D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction scissor( scissor ) {\n\n\t\tif ( currentScissor.equals( scissor ) === false ) {\n\n\t\t\tgl.scissor( scissor.x, scissor.y, scissor.z, scissor.w );\n\t\t\tcurrentScissor.copy( scissor );\n\n\t\t}\n\n\t}\n\n\tfunction viewport( viewport ) {\n\n\t\tif ( currentViewport.equals( viewport ) === false ) {\n\n\t\t\tgl.viewport( viewport.x, viewport.y, viewport.z, viewport.w );\n\t\t\tcurrentViewport.copy( viewport );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction reset() {\n\n\t\t// reset state\n\n\t\tgl.disable( gl.BLEND );\n\t\tgl.disable( gl.CULL_FACE );\n\t\tgl.disable( gl.DEPTH_TEST );\n\t\tgl.disable( gl.POLYGON_OFFSET_FILL );\n\t\tgl.disable( gl.SCISSOR_TEST );\n\t\tgl.disable( gl.STENCIL_TEST );\n\t\tgl.disable( gl.SAMPLE_ALPHA_TO_COVERAGE );\n\n\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\tgl.blendFunc( gl.ONE, gl.ZERO );\n\t\tgl.blendFuncSeparate( gl.ONE, gl.ZERO, gl.ONE, gl.ZERO );\n\n\t\tgl.colorMask( true, true, true, true );\n\t\tgl.clearColor( 0, 0, 0, 0 );\n\n\t\tgl.depthMask( true );\n\t\tgl.depthFunc( gl.LESS );\n\t\tgl.clearDepth( 1 );\n\n\t\tgl.stencilMask( 0xffffffff );\n\t\tgl.stencilFunc( gl.ALWAYS, 0, 0xffffffff );\n\t\tgl.stencilOp( gl.KEEP, gl.KEEP, gl.KEEP );\n\t\tgl.clearStencil( 0 );\n\n\t\tgl.cullFace( gl.BACK );\n\t\tgl.frontFace( gl.CCW );\n\n\t\tgl.polygonOffset( 0, 0 );\n\n\t\tgl.activeTexture( gl.TEXTURE0 );\n\n\t\tgl.bindFramebuffer( gl.FRAMEBUFFER, null );\n\n\t\tif ( isWebGL2 === true ) {\n\n\t\t\tgl.bindFramebuffer( gl.DRAW_FRAMEBUFFER, null );\n\t\t\tgl.bindFramebuffer( gl.READ_FRAMEBUFFER, null );\n\n\t\t}\n\n\t\tgl.useProgram( null );\n\n\t\tgl.lineWidth( 1 );\n\n\t\tgl.scissor( 0, 0, gl.canvas.width, gl.canvas.height );\n\t\tgl.viewport( 0, 0, gl.canvas.width, gl.canvas.height );\n\n\t\t// reset internals\n\n\t\tenabledCapabilities = {};\n\n\t\tcurrentTextureSlot = null;\n\t\tcurrentBoundTextures = {};\n\n\t\tcurrentBoundFramebuffers = {};\n\t\tcurrentDrawbuffers = new WeakMap();\n\t\tdefaultDrawbuffers = [];\n\n\t\tcurrentProgram = null;\n\n\t\tcurrentBlendingEnabled = false;\n\t\tcurrentBlending = null;\n\t\tcurrentBlendEquation = null;\n\t\tcurrentBlendSrc = null;\n\t\tcurrentBlendDst = null;\n\t\tcurrentBlendEquationAlpha = null;\n\t\tcurrentBlendSrcAlpha = null;\n\t\tcurrentBlendDstAlpha = null;\n\t\tcurrentPremultipledAlpha = false;\n\n\t\tcurrentFlipSided = null;\n\t\tcurrentCullFace = null;\n\n\t\tcurrentLineWidth = null;\n\n\t\tcurrentPolygonOffsetFactor = null;\n\t\tcurrentPolygonOffsetUnits = null;\n\n\t\tcurrentScissor.set( 0, 0, gl.canvas.width, gl.canvas.height );\n\t\tcurrentViewport.set( 0, 0, gl.canvas.width, gl.canvas.height );\n\n\t\tcolorBuffer.reset();\n\t\tdepthBuffer.reset();\n\t\tstencilBuffer.reset();\n\n\t}\n\n\treturn {\n\n\t\tbuffers: {\n\t\t\tcolor: colorBuffer,\n\t\t\tdepth: depthBuffer,\n\t\t\tstencil: stencilBuffer\n\t\t},\n\n\t\tenable: enable,\n\t\tdisable: disable,\n\n\t\tbindFramebuffer: bindFramebuffer,\n\t\tdrawBuffers: drawBuffers,\n\n\t\tuseProgram: useProgram,\n\n\t\tsetBlending: setBlending,\n\t\tsetMaterial: setMaterial,\n\n\t\tsetFlipSided: setFlipSided,\n\t\tsetCullFace: setCullFace,\n\n\t\tsetLineWidth: setLineWidth,\n\t\tsetPolygonOffset: setPolygonOffset,\n\n\t\tsetScissorTest: setScissorTest,\n\n\t\tactiveTexture: activeTexture,\n\t\tbindTexture: bindTexture,\n\t\tunbindTexture: unbindTexture,\n\t\tcompressedTexImage2D: compressedTexImage2D,\n\t\ttexImage2D: texImage2D,\n\t\ttexImage3D: texImage3D,\n\n\t\ttexStorage2D: texStorage2D,\n\t\ttexStorage3D: texStorage3D,\n\t\ttexSubImage2D: texSubImage2D,\n\t\ttexSubImage3D: texSubImage3D,\n\t\tcompressedTexSubImage2D: compressedTexSubImage2D,\n\n\t\tscissor: scissor,\n\t\tviewport: viewport,\n\n\t\treset: reset\n\n\t};\n\n}\n\nexport { WebGLState };\n","import { LinearFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, NearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, RGBAFormat, DepthFormat, DepthStencilFormat, UnsignedShortType, UnsignedIntType, UnsignedInt248Type, FloatType, HalfFloatType, MirroredRepeatWrapping, ClampToEdgeWrapping, RepeatWrapping, sRGBEncoding, LinearEncoding, UnsignedByteType, _SRGBAFormat } from '../../constants.js';\nimport * as MathUtils from '../../math/MathUtils.js';\nimport { ImageUtils } from '../../extras/ImageUtils.js';\nimport { createElementNS } from '../../utils.js';\n\nfunction WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\tconst maxTextures = capabilities.maxTextures;\n\tconst maxCubemapSize = capabilities.maxCubemapSize;\n\tconst maxTextureSize = capabilities.maxTextureSize;\n\tconst maxSamples = capabilities.maxSamples;\n\tconst hasMultisampledRenderToTexture = extensions.has( 'WEBGL_multisampled_render_to_texture' );\n\tconst MultisampledRenderToTextureExtension = hasMultisampledRenderToTexture ? extensions.get( 'WEBGL_multisampled_render_to_texture' ) : undefined;\n\n\tconst _videoTextures = new WeakMap();\n\tlet _canvas;\n\n\t// cordova iOS (as of 5.0) still uses UIWebView, which provides OffscreenCanvas,\n\t// also OffscreenCanvas.getContext(\"webgl\"), but not OffscreenCanvas.getContext(\"2d\")!\n\t// Some implementations may only implement OffscreenCanvas partially (e.g. lacking 2d).\n\n\tlet useOffscreenCanvas = false;\n\n\ttry {\n\n\t\tuseOffscreenCanvas = typeof OffscreenCanvas !== 'undefined'\n\t\t\t&& ( new OffscreenCanvas( 1, 1 ).getContext( '2d' ) ) !== null;\n\n\t} catch ( err ) {\n\n\t\t// Ignore any errors\n\n\t}\n\n\tfunction createCanvas( width, height ) {\n\n\t\t// Use OffscreenCanvas when available. Specially needed in web workers\n\n\t\treturn useOffscreenCanvas ?\n\t\t\tnew OffscreenCanvas( width, height ) : createElementNS( 'canvas' );\n\n\t}\n\n\tfunction resizeImage( image, needsPowerOfTwo, needsNewCanvas, maxSize ) {\n\n\t\tlet scale = 1;\n\n\t\t// handle case if texture exceeds max size\n\n\t\tif ( image.width > maxSize || image.height > maxSize ) {\n\n\t\t\tscale = maxSize / Math.max( image.width, image.height );\n\n\t\t}\n\n\t\t// only perform resize if necessary\n\n\t\tif ( scale < 1 || needsPowerOfTwo === true ) {\n\n\t\t\t// only perform resize for certain image types\n\n\t\t\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t\t\tconst floor = needsPowerOfTwo ? MathUtils.floorPowerOfTwo : Math.floor;\n\n\t\t\t\tconst width = floor( scale * image.width );\n\t\t\t\tconst height = floor( scale * image.height );\n\n\t\t\t\tif ( _canvas === undefined ) _canvas = createCanvas( width, height );\n\n\t\t\t\t// cube textures can't reuse the same canvas\n\n\t\t\t\tconst canvas = needsNewCanvas ? createCanvas( width, height ) : _canvas;\n\n\t\t\t\tcanvas.width = width;\n\t\t\t\tcanvas.height = height;\n\n\t\t\t\tconst context = canvas.getContext( '2d' );\n\t\t\t\tcontext.drawImage( image, 0, 0, width, height );\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture has been resized from (' + image.width + 'x' + image.height + ') to (' + width + 'x' + height + ').' );\n\n\t\t\t\treturn canvas;\n\n\t\t\t} else {\n\n\t\t\t\tif ( 'data' in image ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Image in DataTexture is too big (' + image.width + 'x' + image.height + ').' );\n\n\t\t\t\t}\n\n\t\t\t\treturn image;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn image;\n\n\t}\n\n\tfunction isPowerOfTwo( image ) {\n\n\t\treturn MathUtils.isPowerOfTwo( image.width ) && MathUtils.isPowerOfTwo( image.height );\n\n\t}\n\n\tfunction textureNeedsPowerOfTwo( texture ) {\n\n\t\tif ( isWebGL2 ) return false;\n\n\t\treturn ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) ||\n\t\t\t( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter );\n\n\t}\n\n\tfunction textureNeedsGenerateMipmaps( texture, supportsMips ) {\n\n\t\treturn texture.generateMipmaps && supportsMips &&\n\t\t\ttexture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter;\n\n\t}\n\n\tfunction generateMipmap( target ) {\n\n\t\t_gl.generateMipmap( target );\n\n\t}\n\n\tfunction getInternalFormat( internalFormatName, glFormat, glType, encoding, isVideoTexture = false ) {\n\n\t\tif ( isWebGL2 === false ) return glFormat;\n\n\t\tif ( internalFormatName !== null ) {\n\n\t\t\tif ( _gl[ internalFormatName ] !== undefined ) return _gl[ internalFormatName ];\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format \\'' + internalFormatName + '\\'' );\n\n\t\t}\n\n\t\tlet internalFormat = glFormat;\n\n\t\tif ( glFormat === _gl.RED ) {\n\n\t\t\tif ( glType === _gl.FLOAT ) internalFormat = _gl.R32F;\n\t\t\tif ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.R16F;\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.R8;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RG ) {\n\n\t\t\tif ( glType === _gl.FLOAT ) internalFormat = _gl.RG32F;\n\t\t\tif ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.RG16F;\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RG8;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RGBA ) {\n\n\t\t\tif ( glType === _gl.FLOAT ) internalFormat = _gl.RGBA32F;\n\t\t\tif ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.RGBA16F;\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = ( encoding === sRGBEncoding && isVideoTexture === false ) ? _gl.SRGB8_ALPHA8 : _gl.RGBA8;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT_4_4_4_4 ) internalFormat = _gl.RGBA4;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT_5_5_5_1 ) internalFormat = _gl.RGB5_A1;\n\n\t\t}\n\n\t\tif ( internalFormat === _gl.R16F || internalFormat === _gl.R32F ||\n\t\t\tinternalFormat === _gl.RG16F || internalFormat === _gl.RG32F ||\n\t\t\tinternalFormat === _gl.RGBA16F || internalFormat === _gl.RGBA32F ) {\n\n\t\t\textensions.get( 'EXT_color_buffer_float' );\n\n\t\t}\n\n\t\treturn internalFormat;\n\n\t}\n\n\tfunction getMipLevels( texture, image, supportsMips ) {\n\n\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) === true || ( texture.isFramebufferTexture && texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) ) {\n\n\t\t\treturn Math.log2( Math.max( image.width, image.height ) ) + 1;\n\n\t\t} else if ( texture.mipmaps !== undefined && texture.mipmaps.length > 0 ) {\n\n\t\t\t// user-defined mipmaps\n\n\t\t\treturn texture.mipmaps.length;\n\n\t\t} else if ( texture.isCompressedTexture && Array.isArray( texture.image ) ) {\n\n\t\t\treturn image.mipmaps.length;\n\n\t\t} else {\n\n\t\t\t// texture without mipmaps (only base level)\n\n\t\t\treturn 1;\n\n\t\t}\n\n\t}\n\n\t// Fallback filters for non-power-of-2 textures\n\n\tfunction filterFallback( f ) {\n\n\t\tif ( f === NearestFilter || f === NearestMipmapNearestFilter || f === NearestMipmapLinearFilter ) {\n\n\t\t\treturn _gl.NEAREST;\n\n\t\t}\n\n\t\treturn _gl.LINEAR;\n\n\t}\n\n\t//\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tdeallocateTexture( texture );\n\n\t\tif ( texture.isVideoTexture ) {\n\n\t\t\t_videoTextures.delete( texture );\n\n\t\t}\n\n\t\tinfo.memory.textures --;\n\n\t}\n\n\tfunction onRenderTargetDispose( event ) {\n\n\t\tconst renderTarget = event.target;\n\n\t\trenderTarget.removeEventListener( 'dispose', onRenderTargetDispose );\n\n\t\tdeallocateRenderTarget( renderTarget );\n\n\t}\n\n\t//\n\n\tfunction deallocateTexture( texture ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( textureProperties.__webglInit === undefined ) return;\n\n\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\tproperties.remove( texture );\n\n\t}\n\n\tfunction deallocateRenderTarget( renderTarget ) {\n\n\t\tconst texture = renderTarget.texture;\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( ! renderTarget ) return;\n\n\t\tif ( textureProperties.__webglTexture !== undefined ) {\n\n\t\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\t\tinfo.memory.textures --;\n\n\t\t}\n\n\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\trenderTarget.depthTexture.dispose();\n\n\t\t}\n\n\t\tif ( renderTarget.isWebGLCubeRenderTarget ) {\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );\n\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );\n\t\t\tif ( renderTargetProperties.__webglMultisampledFramebuffer ) _gl.deleteFramebuffer( renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\tif ( renderTargetProperties.__webglColorRenderbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglColorRenderbuffer );\n\t\t\tif ( renderTargetProperties.__webglDepthRenderbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthRenderbuffer );\n\n\t\t}\n\n\t\tif ( renderTarget.isWebGLMultipleRenderTargets ) {\n\n\t\t\tfor ( let i = 0, il = texture.length; i < il; i ++ ) {\n\n\t\t\t\tconst attachmentProperties = properties.get( texture[ i ] );\n\n\t\t\t\tif ( attachmentProperties.__webglTexture ) {\n\n\t\t\t\t\t_gl.deleteTexture( attachmentProperties.__webglTexture );\n\n\t\t\t\t\tinfo.memory.textures --;\n\n\t\t\t\t}\n\n\t\t\t\tproperties.remove( texture[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tproperties.remove( texture );\n\t\tproperties.remove( renderTarget );\n\n\t}\n\n\t//\n\n\tlet textureUnits = 0;\n\n\tfunction resetTextureUnits() {\n\n\t\ttextureUnits = 0;\n\n\t}\n\n\tfunction allocateTextureUnit() {\n\n\t\tconst textureUnit = textureUnits;\n\n\t\tif ( textureUnit >= maxTextures ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLTextures: Trying to use ' + textureUnit + ' texture units while this GPU supports only ' + maxTextures );\n\n\t\t}\n\n\t\ttextureUnits += 1;\n\n\t\treturn textureUnit;\n\n\t}\n\n\t//\n\n\tfunction setTexture2D( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.isVideoTexture ) updateVideoTexture( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tconst image = texture.image;\n\n\t\t\tif ( image === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is undefined' );\n\n\t\t\t} else if ( image.complete === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete' );\n\n\t\t\t} else {\n\n\t\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\n\n\t}\n\n\tfunction setTexture2DArray( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\tstate.bindTexture( _gl.TEXTURE_2D_ARRAY, textureProperties.__webglTexture );\n\n\t}\n\n\tfunction setTexture3D( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\tstate.bindTexture( _gl.TEXTURE_3D, textureProperties.__webglTexture );\n\n\t}\n\n\tfunction setTextureCube( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadCubeTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );\n\n\t}\n\n\tconst wrappingToGL = {\n\t\t[ RepeatWrapping ]: _gl.REPEAT,\n\t\t[ ClampToEdgeWrapping ]: _gl.CLAMP_TO_EDGE,\n\t\t[ MirroredRepeatWrapping ]: _gl.MIRRORED_REPEAT\n\t};\n\n\tconst filterToGL = {\n\t\t[ NearestFilter ]: _gl.NEAREST,\n\t\t[ NearestMipmapNearestFilter ]: _gl.NEAREST_MIPMAP_NEAREST,\n\t\t[ NearestMipmapLinearFilter ]: _gl.NEAREST_MIPMAP_LINEAR,\n\n\t\t[ LinearFilter ]: _gl.LINEAR,\n\t\t[ LinearMipmapNearestFilter ]: _gl.LINEAR_MIPMAP_NEAREST,\n\t\t[ LinearMipmapLinearFilter ]: _gl.LINEAR_MIPMAP_LINEAR\n\t};\n\n\tfunction setTextureParameters( textureType, texture, supportsMips ) {\n\n\t\tif ( supportsMips ) {\n\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, wrappingToGL[ texture.wrapS ] );\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, wrappingToGL[ texture.wrapT ] );\n\n\t\t\tif ( textureType === _gl.TEXTURE_3D || textureType === _gl.TEXTURE_2D_ARRAY ) {\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_R, wrappingToGL[ texture.wrapR ] );\n\n\t\t\t}\n\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterToGL[ texture.magFilter ] );\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterToGL[ texture.minFilter ] );\n\n\t\t} else {\n\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE );\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE );\n\n\t\t\tif ( textureType === _gl.TEXTURE_3D || textureType === _gl.TEXTURE_2D_ARRAY ) {\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_R, _gl.CLAMP_TO_EDGE );\n\n\t\t\t}\n\n\t\t\tif ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.' );\n\n\t\t\t}\n\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterFallback( texture.magFilter ) );\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterFallback( texture.minFilter ) );\n\n\t\t\tif ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( extensions.has( 'EXT_texture_filter_anisotropic' ) === true ) {\n\n\t\t\tconst extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tif ( texture.type === FloatType && extensions.has( 'OES_texture_float_linear' ) === false ) return; // verify extension for WebGL 1 and WebGL 2\n\t\t\tif ( isWebGL2 === false && ( texture.type === HalfFloatType && extensions.has( 'OES_texture_half_float_linear' ) === false ) ) return; // verify extension for WebGL 1 only\n\n\t\t\tif ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) {\n\n\t\t\t\t_gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) );\n\t\t\t\tproperties.get( texture ).__currentAnisotropy = texture.anisotropy;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction initTexture( textureProperties, texture ) {\n\n\t\tif ( textureProperties.__webglInit === undefined ) {\n\n\t\t\ttextureProperties.__webglInit = true;\n\n\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\tinfo.memory.textures ++;\n\n\t\t}\n\n\t}\n\n\tfunction uploadTexture( textureProperties, texture, slot ) {\n\n\t\tlet textureType = _gl.TEXTURE_2D;\n\n\t\tif ( texture.isDataTexture2DArray ) textureType = _gl.TEXTURE_2D_ARRAY;\n\t\tif ( texture.isDataTexture3D ) textureType = _gl.TEXTURE_3D;\n\n\t\tinitTexture( textureProperties, texture );\n\n\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\tstate.bindTexture( textureType, textureProperties.__webglTexture );\n\n\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );\n\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );\n\t\t_gl.pixelStorei( _gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, _gl.NONE );\n\n\t\tconst needsPowerOfTwo = textureNeedsPowerOfTwo( texture ) && isPowerOfTwo( texture.image ) === false;\n\t\tlet image = resizeImage( texture.image, needsPowerOfTwo, false, maxTextureSize );\n\t\timage = verifyColorSpace( texture, image );\n\n\t\tconst supportsMips = isPowerOfTwo( image ) || isWebGL2,\n\t\t\tglFormat = utils.convert( texture.format, texture.encoding );\n\n\t\tlet glType = utils.convert( texture.type ),\n\t\t\tglInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding, texture.isVideoTexture );\n\n\t\tsetTextureParameters( textureType, texture, supportsMips );\n\n\t\tlet mipmap;\n\t\tconst mipmaps = texture.mipmaps;\n\n\t\tconst useTexStorage = ( isWebGL2 && texture.isVideoTexture !== true );\n\t\tconst allocateMemory = ( textureProperties.__version === undefined );\n\t\tconst levels = getMipLevels( texture, image, supportsMips );\n\n\t\tif ( texture.isDepthTexture ) {\n\n\t\t\t// populate depth texture with dummy data\n\n\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT;\n\n\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\tif ( texture.type === FloatType ) {\n\n\t\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT32F;\n\n\t\t\t\t} else if ( texture.type === UnsignedIntType ) {\n\n\t\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT24;\n\n\t\t\t\t} else if ( texture.type === UnsignedInt248Type ) {\n\n\t\t\t\t\tglInternalFormat = _gl.DEPTH24_STENCIL8;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT16; // WebGL2 requires sized internalformat for glTexImage2D\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( texture.type === FloatType ) {\n\n\t\t\t\t\tconsole.error( 'WebGLRenderer: Floating point depth texture requires WebGL2.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// validation checks for WebGL 1\n\n\t\t\tif ( texture.format === DepthFormat && glInternalFormat === _gl.DEPTH_COMPONENT ) {\n\n\t\t\t\t// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are\n\t\t\t\t// DEPTH_COMPONENT and type is not UNSIGNED_SHORT or UNSIGNED_INT\n\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\tif ( texture.type !== UnsignedShortType && texture.type !== UnsignedIntType ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.' );\n\n\t\t\t\t\ttexture.type = UnsignedShortType;\n\t\t\t\t\tglType = utils.convert( texture.type );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( texture.format === DepthStencilFormat && glInternalFormat === _gl.DEPTH_COMPONENT ) {\n\n\t\t\t\t// Depth stencil textures need the DEPTH_STENCIL internal format\n\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\tglInternalFormat = _gl.DEPTH_STENCIL;\n\n\t\t\t\t// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are\n\t\t\t\t// DEPTH_STENCIL and type is not UNSIGNED_INT_24_8_WEBGL.\n\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\tif ( texture.type !== UnsignedInt248Type ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.' );\n\n\t\t\t\t\ttexture.type = UnsignedInt248Type;\n\t\t\t\t\tglType = utils.convert( texture.type );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, 1, glInternalFormat, image.width, image.height );\n\n\t\t\t} else {\n\n\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, null );\n\n\t\t\t}\n\n\t\t} else if ( texture.isDataTexture ) {\n\n\t\t\t// use manually created mipmaps if available\n\t\t\t// if there are no manual mipmaps\n\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\tif ( mipmaps.length > 0 && supportsMips ) {\n\n\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t} else {\n\n\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, image.width, image.height, glFormat, glType, image.data );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, image.data );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( texture.isCompressedTexture ) {\n\n\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\tif ( texture.format !== RGBAFormat ) {\n\n\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tstate.compressedTexSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( texture.isDataTexture2DArray ) {\n\n\t\t\tif ( useTexStorage ) {\n\n\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\tstate.texStorage3D( _gl.TEXTURE_2D_ARRAY, levels, glInternalFormat, image.width, image.height, image.depth );\n\n\t\t\t\t}\n\n\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_2D_ARRAY, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );\n\n\t\t\t} else {\n\n\t\t\t\tstate.texImage3D( _gl.TEXTURE_2D_ARRAY, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );\n\n\t\t\t}\n\n\t\t} else if ( texture.isDataTexture3D ) {\n\n\t\t\tif ( useTexStorage ) {\n\n\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\tstate.texStorage3D( _gl.TEXTURE_3D, levels, glInternalFormat, image.width, image.height, image.depth );\n\n\t\t\t\t}\n\n\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_3D, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );\n\n\t\t\t} else {\n\n\t\t\t\tstate.texImage3D( _gl.TEXTURE_3D, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );\n\n\t\t\t}\n\n\t\t} else if ( texture.isFramebufferTexture ) {\n\n\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t} else {\n\n\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, null );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// regular Texture (image, video, canvas)\n\n\t\t\t// use manually created mipmaps if available\n\t\t\t// if there are no manual mipmaps\n\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\tif ( mipmaps.length > 0 && supportsMips ) {\n\n\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, glFormat, glType, mipmap );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, glFormat, glType, mipmap );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t} else {\n\n\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, glFormat, glType, image );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, glFormat, glType, image );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {\n\n\t\t\tgenerateMipmap( textureType );\n\n\t\t}\n\n\t\ttextureProperties.__version = texture.version;\n\n\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t}\n\n\tfunction uploadCubeTexture( textureProperties, texture, slot ) {\n\n\t\tif ( texture.image.length !== 6 ) return;\n\n\t\tinitTexture( textureProperties, texture );\n\n\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );\n\n\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );\n\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );\n\t\t_gl.pixelStorei( _gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, _gl.NONE );\n\n\t\tconst isCompressed = ( texture && ( texture.isCompressedTexture || texture.image[ 0 ].isCompressedTexture ) );\n\t\tconst isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture );\n\n\t\tconst cubeImage = [];\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tif ( ! isCompressed && ! isDataTexture ) {\n\n\t\t\t\tcubeImage[ i ] = resizeImage( texture.image[ i ], false, true, maxCubemapSize );\n\n\t\t\t} else {\n\n\t\t\t\tcubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ];\n\n\t\t\t}\n\n\t\t\tcubeImage[ i ] = verifyColorSpace( texture, cubeImage[ i ] );\n\n\t\t}\n\n\t\tconst image = cubeImage[ 0 ],\n\t\t\tsupportsMips = isPowerOfTwo( image ) || isWebGL2,\n\t\t\tglFormat = utils.convert( texture.format, texture.encoding ),\n\t\t\tglType = utils.convert( texture.type ),\n\t\t\tglInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );\n\n\t\tconst useTexStorage = ( isWebGL2 && texture.isVideoTexture !== true );\n\t\tconst allocateMemory = ( textureProperties.__version === undefined );\n\t\tlet levels = getMipLevels( texture, image, supportsMips );\n\n\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, supportsMips );\n\n\t\tlet mipmaps;\n\n\t\tif ( isCompressed ) {\n\n\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\tstate.texStorage2D( _gl.TEXTURE_CUBE_MAP, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tmipmaps = cubeImage[ i ].mipmaps;\n\n\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\n\t\t\t\t\tif ( texture.format !== RGBAFormat ) {\n\n\t\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tstate.compressedTexSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tmipmaps = texture.mipmaps;\n\n\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t// TODO: Uniformly handle mipmap definitions\n\t\t\t\t// Normal textures and compressed cube textures define base level + mips with their mipmap array\n\t\t\t\t// Uncompressed cube textures use their mipmap array only for mips (no base level)\n\n\t\t\t\tif ( mipmaps.length > 0 ) levels ++;\n\n\t\t\t\tstate.texStorage2D( _gl.TEXTURE_CUBE_MAP, levels, glInternalFormat, cubeImage[ 0 ].width, cubeImage[ 0 ].height );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( isDataTexture ) {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, cubeImage[ i ].width, cubeImage[ i ].height, glFormat, glType, cubeImage[ i ].data );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\t\t\t\t\t\tconst mipmapImage = mipmap.image[ i ].image;\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, 0, 0, mipmapImage.width, mipmapImage.height, glFormat, glType, mipmapImage.data );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, mipmapImage.width, mipmapImage.height, 0, glFormat, glType, mipmapImage.data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, 0, 0, glFormat, glType, mipmap.image[ i ] );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, glFormat, glType, mipmap.image[ i ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {\n\n\t\t\t// We assume images for cube map have the same size.\n\t\t\tgenerateMipmap( _gl.TEXTURE_CUBE_MAP );\n\n\t\t}\n\n\t\ttextureProperties.__version = texture.version;\n\n\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t}\n\n\t// Render targets\n\n\t// Setup storage for target texture and bind it to correct framebuffer\n\tfunction setupFrameBufferTexture( framebuffer, renderTarget, texture, attachment, textureTarget ) {\n\n\t\tconst glFormat = utils.convert( texture.format, texture.encoding );\n\t\tconst glType = utils.convert( texture.type );\n\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\tif ( ! renderTargetProperties.__hasExternalTextures ) {\n\n\t\t\tif ( textureTarget === _gl.TEXTURE_3D || textureTarget === _gl.TEXTURE_2D_ARRAY ) {\n\n\t\t\t\tstate.texImage3D( textureTarget, 0, glInternalFormat, renderTarget.width, renderTarget.height, renderTarget.depth, 0, glFormat, glType, null );\n\n\t\t\t} else {\n\n\t\t\t\tstate.texImage2D( textureTarget, 0, glInternalFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\t\tif ( renderTarget.useRenderToTexture ) {\n\n\t\t\tMultisampledRenderToTextureExtension.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( texture ).__webglTexture, 0, getRenderTargetSamples( renderTarget ) );\n\n\t\t} else {\n\n\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( texture ).__webglTexture, 0 );\n\n\t\t}\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t}\n\n\n\t// Setup storage for internal depth/stencil buffers and bind to correct framebuffer\n\tfunction setupRenderBufferStorage( renderbuffer, renderTarget, isMultisample ) {\n\n\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );\n\n\t\tif ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) {\n\n\t\t\tlet glInternalFormat = _gl.DEPTH_COMPONENT16;\n\n\t\t\tif ( isMultisample || renderTarget.useRenderToTexture ) {\n\n\t\t\t\tconst depthTexture = renderTarget.depthTexture;\n\n\t\t\t\tif ( depthTexture && depthTexture.isDepthTexture ) {\n\n\t\t\t\t\tif ( depthTexture.type === FloatType ) {\n\n\t\t\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT32F;\n\n\t\t\t\t\t} else if ( depthTexture.type === UnsignedIntType ) {\n\n\t\t\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT24;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\t\t\tif ( renderTarget.useRenderToTexture ) {\n\n\t\t\t\t\tMultisampledRenderToTextureExtension.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t} else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) {\n\n\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\t\tif ( isMultisample && renderTarget.useRenderbuffer ) {\n\n\t\t\t\t_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, _gl.DEPTH24_STENCIL8, renderTarget.width, renderTarget.height );\n\n\t\t\t} else if ( renderTarget.useRenderToTexture ) {\n\n\t\t\t\tMultisampledRenderToTextureExtension.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, _gl.DEPTH24_STENCIL8, renderTarget.width, renderTarget.height );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\n\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t} else {\n\n\t\t\t// Use the first texture for MRT so far\n\t\t\tconst texture = renderTarget.isWebGLMultipleRenderTargets === true ? renderTarget.texture[ 0 ] : renderTarget.texture;\n\n\t\t\tconst glFormat = utils.convert( texture.format, texture.encoding );\n\t\t\tconst glType = utils.convert( texture.type );\n\t\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );\n\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\t\tif ( isMultisample && renderTarget.useRenderbuffer ) {\n\n\t\t\t\t_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t} else if ( renderTarget.useRenderToTexture ) {\n\n\t\t\t\tMultisampledRenderToTextureExtension.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t}\n\n\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );\n\n\t}\n\n\t// Setup resources for a Depth Texture for a FBO (needs an extension)\n\tfunction setupDepthTexture( framebuffer, renderTarget ) {\n\n\t\tconst isCube = ( renderTarget && renderTarget.isWebGLCubeRenderTarget );\n\t\tif ( isCube ) throw new Error( 'Depth Texture with cube render targets is not supported' );\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\tif ( ! ( renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture ) ) {\n\n\t\t\tthrow new Error( 'renderTarget.depthTexture must be an instance of THREE.DepthTexture' );\n\n\t\t}\n\n\t\t// upload an empty depth texture with framebuffer size\n\t\tif ( ! properties.get( renderTarget.depthTexture ).__webglTexture ||\n\t\t\t\trenderTarget.depthTexture.image.width !== renderTarget.width ||\n\t\t\t\trenderTarget.depthTexture.image.height !== renderTarget.height ) {\n\n\t\t\trenderTarget.depthTexture.image.width = renderTarget.width;\n\t\t\trenderTarget.depthTexture.image.height = renderTarget.height;\n\t\t\trenderTarget.depthTexture.needsUpdate = true;\n\n\t\t}\n\n\t\tsetTexture2D( renderTarget.depthTexture, 0 );\n\n\t\tconst webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture;\n\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\tif ( renderTarget.depthTexture.format === DepthFormat ) {\n\n\t\t\tif ( renderTarget.useRenderToTexture ) {\n\n\t\t\t\tMultisampledRenderToTextureExtension.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0, samples );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t}\n\n\t\t} else if ( renderTarget.depthTexture.format === DepthStencilFormat ) {\n\n\t\t\tif ( renderTarget.useRenderToTexture ) {\n\n\t\t\t\tMultisampledRenderToTextureExtension.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0, samples );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'Unknown depthTexture format' );\n\n\t\t}\n\n\t}\n\n\t// Setup GL resources for a non-texture depth buffer\n\tfunction setupDepthRenderbuffer( renderTarget ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst isCube = ( renderTarget.isWebGLCubeRenderTarget === true );\n\n\t\tif ( renderTarget.depthTexture && ! renderTargetProperties.__autoAllocateDepthBuffer ) {\n\n\t\t\tif ( isCube ) throw new Error( 'target.depthTexture not supported in Cube render targets' );\n\n\t\t\tsetupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget );\n\n\t\t} else {\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\trenderTargetProperties.__webglDepthbuffer = [];\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget, false );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\t\t\t\trenderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer();\n\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget, false );\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t}\n\n\t// rebind framebuffer with external textures\n\tfunction rebindTextures( renderTarget, colorTexture, depthTexture ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\tif ( colorTexture !== undefined ) {\n\n\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, renderTarget.texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D );\n\n\t\t}\n\n\t\tif ( depthTexture !== undefined ) {\n\n\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t}\n\n\t}\n\n\t// Set up GL resources for the render target\n\tfunction setupRenderTarget( renderTarget ) {\n\n\t\tconst texture = renderTarget.texture;\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst textureProperties = properties.get( texture );\n\n\t\trenderTarget.addEventListener( 'dispose', onRenderTargetDispose );\n\n\t\tif ( renderTarget.isWebGLMultipleRenderTargets !== true ) {\n\n\t\t\tif ( textureProperties.__webglTexture === undefined ) {\n\n\t\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t}\n\n\t\t\ttextureProperties.__version = texture.version;\n\t\t\tinfo.memory.textures ++;\n\n\t\t}\n\n\t\tconst isCube = ( renderTarget.isWebGLCubeRenderTarget === true );\n\t\tconst isMultipleRenderTargets = ( renderTarget.isWebGLMultipleRenderTargets === true );\n\t\tconst isRenderTarget3D = texture.isDataTexture3D || texture.isDataTexture2DArray;\n\t\tconst supportsMips = isPowerOfTwo( renderTarget ) || isWebGL2;\n\n\t\t// Setup framebuffer\n\n\t\tif ( isCube ) {\n\n\t\t\trenderTargetProperties.__webglFramebuffer = [];\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer();\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\trenderTargetProperties.__webglFramebuffer = _gl.createFramebuffer();\n\n\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\tif ( capabilities.drawBuffers ) {\n\n\t\t\t\t\tconst textures = renderTarget.texture;\n\n\t\t\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst attachmentProperties = properties.get( textures[ i ] );\n\n\t\t\t\t\t\tif ( attachmentProperties.__webglTexture === undefined ) {\n\n\t\t\t\t\t\t\tattachmentProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t\t\t\t\tinfo.memory.textures ++;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: WebGLMultipleRenderTargets can only be used with WebGL2 or WEBGL_draw_buffers extension.' );\n\n\t\t\t\t}\n\n\t\t\t} else if ( renderTarget.useRenderbuffer ) {\n\n\t\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\t\trenderTargetProperties.__webglMultisampledFramebuffer = _gl.createFramebuffer();\n\t\t\t\t\trenderTargetProperties.__webglColorRenderbuffer = _gl.createRenderbuffer();\n\n\t\t\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer );\n\n\t\t\t\t\tconst glFormat = utils.convert( texture.format, texture.encoding );\n\t\t\t\t\tconst glType = utils.convert( texture.type );\n\t\t\t\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );\n\t\t\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\t\t\t\t\t_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer );\n\t\t\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );\n\n\t\t\t\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t\t\t\trenderTargetProperties.__webglDepthRenderbuffer = _gl.createRenderbuffer();\n\t\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthRenderbuffer, renderTarget, true );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Setup color buffer\n\n\t\tif ( isCube ) {\n\n\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );\n\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, supportsMips );\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i );\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {\n\n\t\t\t\tgenerateMipmap( _gl.TEXTURE_CUBE_MAP );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t} else if ( isMultipleRenderTargets ) {\n\n\t\t\tconst textures = renderTarget.texture;\n\n\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\tconst attachment = textures[ i ];\n\t\t\t\tconst attachmentProperties = properties.get( attachment );\n\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_2D, attachmentProperties.__webglTexture );\n\t\t\t\tsetTextureParameters( _gl.TEXTURE_2D, attachment, supportsMips );\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, attachment, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D );\n\n\t\t\t\tif ( textureNeedsGenerateMipmaps( attachment, supportsMips ) ) {\n\n\t\t\t\t\tgenerateMipmap( _gl.TEXTURE_2D );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t} else {\n\n\t\t\tlet glTextureType = _gl.TEXTURE_2D;\n\n\t\t\tif ( isRenderTarget3D ) {\n\n\t\t\t\t// Render targets containing layers, i.e: Texture 3D and 2d arrays\n\n\t\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\t\tconst isTexture3D = texture.isDataTexture3D;\n\t\t\t\t\tglTextureType = isTexture3D ? _gl.TEXTURE_3D : _gl.TEXTURE_2D_ARRAY;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.DataTexture3D and THREE.DataTexture2DArray only supported with WebGL2.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.bindTexture( glTextureType, textureProperties.__webglTexture );\n\t\t\tsetTextureParameters( glTextureType, texture, supportsMips );\n\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, texture, _gl.COLOR_ATTACHMENT0, glTextureType );\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {\n\n\t\t\t\tgenerateMipmap( glTextureType );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t}\n\n\t\t// Setup depth and stencil buffers\n\n\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t}\n\n\t}\n\n\tfunction updateRenderTargetMipmap( renderTarget ) {\n\n\t\tconst supportsMips = isPowerOfTwo( renderTarget ) || isWebGL2;\n\n\t\tconst textures = renderTarget.isWebGLMultipleRenderTargets === true ? renderTarget.texture : [ renderTarget.texture ];\n\n\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\tconst texture = textures[ i ];\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {\n\n\t\t\t\tconst target = renderTarget.isWebGLCubeRenderTarget ? _gl.TEXTURE_CUBE_MAP : _gl.TEXTURE_2D;\n\t\t\t\tconst webglTexture = properties.get( texture ).__webglTexture;\n\n\t\t\t\tstate.bindTexture( target, webglTexture );\n\t\t\t\tgenerateMipmap( target );\n\t\t\t\tstate.unbindTexture();\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction updateMultisampleRenderTarget( renderTarget ) {\n\n\t\tif ( renderTarget.useRenderbuffer ) {\n\n\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\tconst width = renderTarget.width;\n\t\t\t\tconst height = renderTarget.height;\n\t\t\t\tlet mask = _gl.COLOR_BUFFER_BIT;\n\t\t\t\tconst invalidationArray = [ _gl.COLOR_ATTACHMENT0 ];\n\t\t\t\tconst depthStyle = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\n\t\t\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t\t\tinvalidationArray.push( depthStyle );\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! renderTarget.ignoreDepthForMultisampleCopy ) {\n\n\t\t\t\t\tif ( renderTarget.depthBuffer ) mask |= _gl.DEPTH_BUFFER_BIT;\n\t\t\t\t\tif ( renderTarget.stencilBuffer ) mask |= _gl.STENCIL_BUFFER_BIT;\n\n\t\t\t\t}\n\n\t\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\n\t\t\t\tif ( renderTarget.ignoreDepthForMultisampleCopy ) {\n\n\t\t\t\t\t_gl.invalidateFramebuffer( _gl.READ_FRAMEBUFFER, [ depthStyle ] );\n\t\t\t\t\t_gl.invalidateFramebuffer( _gl.DRAW_FRAMEBUFFER, [ depthStyle ] );\n\n\t\t\t\t}\n\n\t\t\t\t_gl.blitFramebuffer( 0, 0, width, height, 0, 0, width, height, mask, _gl.NEAREST );\n\t\t\t\t_gl.invalidateFramebuffer( _gl.READ_FRAMEBUFFER, invalidationArray );\n\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, null );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.' );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction getRenderTargetSamples( renderTarget ) {\n\n\t\treturn ( isWebGL2 && ( renderTarget.useRenderbuffer || renderTarget.useRenderToTexture ) ) ?\n\t\t\tMath.min( maxSamples, renderTarget.samples ) : 0;\n\n\t}\n\n\tfunction updateVideoTexture( texture ) {\n\n\t\tconst frame = info.render.frame;\n\n\t\t// Check the last frame we updated the VideoTexture\n\n\t\tif ( _videoTextures.get( texture ) !== frame ) {\n\n\t\t\t_videoTextures.set( texture, frame );\n\t\t\ttexture.update();\n\n\t\t}\n\n\t}\n\n\tfunction verifyColorSpace( texture, image ) {\n\n\t\tconst encoding = texture.encoding;\n\t\tconst format = texture.format;\n\t\tconst type = texture.type;\n\n\t\tif ( texture.isCompressedTexture === true || texture.isVideoTexture === true || texture.format === _SRGBAFormat ) return image;\n\n\t\tif ( encoding !== LinearEncoding ) {\n\n\t\t\t// sRGB\n\n\t\t\tif ( encoding === sRGBEncoding ) {\n\n\t\t\t\tif ( isWebGL2 === false ) {\n\n\t\t\t\t\t// in WebGL 1, try to use EXT_sRGB extension and unsized formats\n\n\t\t\t\t\tif ( extensions.has( 'EXT_sRGB' ) === true && format === RGBAFormat ) {\n\n\t\t\t\t\t\ttexture.format = _SRGBAFormat;\n\n\t\t\t\t\t\t// it's not possible to generate mips in WebGL 1 with this extension\n\n\t\t\t\t\t\ttexture.minFilter = LinearFilter;\n\t\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// slow fallback (CPU decode)\n\n\t\t\t\t\t\timage = ImageUtils.sRGBToLinear( image );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// in WebGL 2 uncompressed textures can only be sRGB encoded if they have the RGBA8 format\n\n\t\t\t\t\tif ( format !== RGBAFormat || type !== UnsignedByteType ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.WebGLTextures: Unsupported texture encoding:', encoding );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn image;\n\n\t}\n\n\t// backwards compatibility\n\n\tlet warnedTexture2D = false;\n\tlet warnedTextureCube = false;\n\n\tfunction safeSetTexture2D( texture, slot ) {\n\n\t\tif ( texture && texture.isWebGLRenderTarget ) {\n\n\t\t\tif ( warnedTexture2D === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLTextures.safeSetTexture2D: don\\'t use render targets as textures. Use their .texture property instead.' );\n\t\t\t\twarnedTexture2D = true;\n\n\t\t\t}\n\n\t\t\ttexture = texture.texture;\n\n\t\t}\n\n\t\tsetTexture2D( texture, slot );\n\n\t}\n\n\tfunction safeSetTextureCube( texture, slot ) {\n\n\t\tif ( texture && texture.isWebGLCubeRenderTarget ) {\n\n\t\t\tif ( warnedTextureCube === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLTextures.safeSetTextureCube: don\\'t use cube render targets as textures. Use their .texture property instead.' );\n\t\t\t\twarnedTextureCube = true;\n\n\t\t\t}\n\n\t\t\ttexture = texture.texture;\n\n\t\t}\n\n\n\t\tsetTextureCube( texture, slot );\n\n\t}\n\n\t//\n\n\tthis.allocateTextureUnit = allocateTextureUnit;\n\tthis.resetTextureUnits = resetTextureUnits;\n\n\tthis.setTexture2D = setTexture2D;\n\tthis.setTexture2DArray = setTexture2DArray;\n\tthis.setTexture3D = setTexture3D;\n\tthis.setTextureCube = setTextureCube;\n\tthis.rebindTextures = rebindTextures;\n\tthis.setupRenderTarget = setupRenderTarget;\n\tthis.updateRenderTargetMipmap = updateRenderTargetMipmap;\n\tthis.updateMultisampleRenderTarget = updateMultisampleRenderTarget;\n\tthis.setupDepthRenderbuffer = setupDepthRenderbuffer;\n\tthis.setupFrameBufferTexture = setupFrameBufferTexture;\n\n\tthis.safeSetTexture2D = safeSetTexture2D;\n\tthis.safeSetTextureCube = safeSetTextureCube;\n\n}\n\nexport { WebGLTextures };\n","import { RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_10x10_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGB_ETC1_Format, RGB_ETC2_Format, RGBA_ETC2_EAC_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT5_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT1_Format, RGB_S3TC_DXT1_Format, DepthFormat, DepthStencilFormat, LuminanceAlphaFormat, LuminanceFormat, RedFormat, RGBFormat, RGBAFormat, AlphaFormat, RedIntegerFormat, RGFormat, RGIntegerFormat, RGBAIntegerFormat, HalfFloatType, FloatType, UnsignedIntType, IntType, UnsignedShortType, ShortType, ByteType, UnsignedInt248Type, UnsignedShort5551Type, UnsignedShort4444Type, UnsignedByteType, RGBA_BPTC_Format, sRGBEncoding, _SRGBAFormat } from '../../constants.js';\n\nfunction WebGLUtils( gl, extensions, capabilities ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\n\tfunction convert( p, encoding = null ) {\n\n\t\tlet extension;\n\n\t\tif ( p === UnsignedByteType ) return gl.UNSIGNED_BYTE;\n\t\tif ( p === UnsignedShort4444Type ) return gl.UNSIGNED_SHORT_4_4_4_4;\n\t\tif ( p === UnsignedShort5551Type ) return gl.UNSIGNED_SHORT_5_5_5_1;\n\n\t\tif ( p === ByteType ) return gl.BYTE;\n\t\tif ( p === ShortType ) return gl.SHORT;\n\t\tif ( p === UnsignedShortType ) return gl.UNSIGNED_SHORT;\n\t\tif ( p === IntType ) return gl.INT;\n\t\tif ( p === UnsignedIntType ) return gl.UNSIGNED_INT;\n\t\tif ( p === FloatType ) return gl.FLOAT;\n\n\t\tif ( p === HalfFloatType ) {\n\n\t\t\tif ( isWebGL2 ) return gl.HALF_FLOAT;\n\n\t\t\textension = extensions.get( 'OES_texture_half_float' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\treturn extension.HALF_FLOAT_OES;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( p === AlphaFormat ) return gl.ALPHA;\n\t\tif ( p === RGBAFormat ) return gl.RGBA;\n\t\tif ( p === LuminanceFormat ) return gl.LUMINANCE;\n\t\tif ( p === LuminanceAlphaFormat ) return gl.LUMINANCE_ALPHA;\n\t\tif ( p === DepthFormat ) return gl.DEPTH_COMPONENT;\n\t\tif ( p === DepthStencilFormat ) return gl.DEPTH_STENCIL;\n\t\tif ( p === RedFormat ) return gl.RED;\n\n\t\tif ( p === RGBFormat ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: THREE.RGBFormat has been removed. Use THREE.RGBAFormat instead. https://github.com/mrdoob/three.js/pull/23228' );\n\t\t\treturn gl.RGBA;\n\n\t\t}\n\n\t\t// WebGL 1 sRGB fallback\n\n\t\tif ( p === _SRGBAFormat ) {\n\n\t\t\textension = extensions.get( 'EXT_sRGB' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\treturn extension.SRGB_ALPHA_EXT;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// WebGL2 formats.\n\n\t\tif ( p === RedIntegerFormat ) return gl.RED_INTEGER;\n\t\tif ( p === RGFormat ) return gl.RG;\n\t\tif ( p === RGIntegerFormat ) return gl.RG_INTEGER;\n\t\tif ( p === RGBAIntegerFormat ) return gl.RGBA_INTEGER;\n\n\t\t// S3TC\n\n\t\tif ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format || p === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) {\n\n\t\t\tif ( encoding === sRGBEncoding ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc_srgb' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_SRGB_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// PVRTC\n\n\t\tif ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format || p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;\n\t\t\t\tif ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;\n\t\t\t\tif ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;\n\t\t\t\tif ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ETC1\n\n\t\tif ( p === RGB_ETC1_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_etc1' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\treturn extension.COMPRESSED_RGB_ETC1_WEBGL;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ETC2\n\n\t\tif ( p === RGB_ETC2_Format || p === RGBA_ETC2_EAC_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_etc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGB_ETC2_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ETC2 : extension.COMPRESSED_RGB8_ETC2;\n\t\t\t\tif ( p === RGBA_ETC2_EAC_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC : extension.COMPRESSED_RGBA8_ETC2_EAC;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ASTC\n\n\t\tif ( p === RGBA_ASTC_4x4_Format || p === RGBA_ASTC_5x4_Format || p === RGBA_ASTC_5x5_Format ||\n\t\t\tp === RGBA_ASTC_6x5_Format || p === RGBA_ASTC_6x6_Format || p === RGBA_ASTC_8x5_Format ||\n\t\t\tp === RGBA_ASTC_8x6_Format || p === RGBA_ASTC_8x8_Format || p === RGBA_ASTC_10x5_Format ||\n\t\t\tp === RGBA_ASTC_10x6_Format || p === RGBA_ASTC_10x8_Format || p === RGBA_ASTC_10x10_Format ||\n\t\t\tp === RGBA_ASTC_12x10_Format || p === RGBA_ASTC_12x12_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_astc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGBA_ASTC_4x4_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR : extension.COMPRESSED_RGBA_ASTC_4x4_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_5x4_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR : extension.COMPRESSED_RGBA_ASTC_5x4_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_5x5_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR : extension.COMPRESSED_RGBA_ASTC_5x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_6x5_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR : extension.COMPRESSED_RGBA_ASTC_6x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_6x6_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR : extension.COMPRESSED_RGBA_ASTC_6x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x5_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR : extension.COMPRESSED_RGBA_ASTC_8x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x6_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR : extension.COMPRESSED_RGBA_ASTC_8x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x8_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR : extension.COMPRESSED_RGBA_ASTC_8x8_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x5_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR : extension.COMPRESSED_RGBA_ASTC_10x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x6_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR : extension.COMPRESSED_RGBA_ASTC_10x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x8_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR : extension.COMPRESSED_RGBA_ASTC_10x8_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x10_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR : extension.COMPRESSED_RGBA_ASTC_10x10_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_12x10_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR : extension.COMPRESSED_RGBA_ASTC_12x10_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_12x12_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR : extension.COMPRESSED_RGBA_ASTC_12x12_KHR;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// BPTC\n\n\t\tif ( p === RGBA_BPTC_Format ) {\n\n\t\t\textension = extensions.get( 'EXT_texture_compression_bptc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGBA_BPTC_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT : extension.COMPRESSED_RGBA_BPTC_UNORM_EXT;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( p === UnsignedInt248Type ) {\n\n\t\t\tif ( isWebGL2 ) return gl.UNSIGNED_INT_24_8;\n\n\t\t\textension = extensions.get( 'WEBGL_depth_texture' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\treturn extension.UNSIGNED_INT_24_8_WEBGL;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn { convert: convert };\n\n}\n\n\nexport { WebGLUtils };\n","import { PerspectiveCamera } from './PerspectiveCamera.js';\n\nclass ArrayCamera extends PerspectiveCamera {\n\n\tconstructor( array = [] ) {\n\n\t\tsuper();\n\n\t\tthis.cameras = array;\n\n\t}\n\n}\n\nArrayCamera.prototype.isArrayCamera = true;\n\n\nexport { ArrayCamera };\n","import { Object3D } from '../core/Object3D.js';\n\nclass Group extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'Group';\n\n\t}\n\n}\n\nGroup.prototype.isGroup = true;\n\nexport { Group };\n","import { Vector3 } from '../../math/Vector3.js';\nimport { Group } from '../../objects/Group.js';\n\nconst _moveEvent = { type: 'move' };\n\nclass WebXRController {\n\n\tconstructor() {\n\n\t\tthis._targetRay = null;\n\t\tthis._grip = null;\n\t\tthis._hand = null;\n\n\t}\n\n\tgetHandSpace() {\n\n\t\tif ( this._hand === null ) {\n\n\t\t\tthis._hand = new Group();\n\t\t\tthis._hand.matrixAutoUpdate = false;\n\t\t\tthis._hand.visible = false;\n\n\t\t\tthis._hand.joints = {};\n\t\t\tthis._hand.inputState = { pinching: false };\n\n\t\t}\n\n\t\treturn this._hand;\n\n\t}\n\n\tgetTargetRaySpace() {\n\n\t\tif ( this._targetRay === null ) {\n\n\t\t\tthis._targetRay = new Group();\n\t\t\tthis._targetRay.matrixAutoUpdate = false;\n\t\t\tthis._targetRay.visible = false;\n\t\t\tthis._targetRay.hasLinearVelocity = false;\n\t\t\tthis._targetRay.linearVelocity = new Vector3();\n\t\t\tthis._targetRay.hasAngularVelocity = false;\n\t\t\tthis._targetRay.angularVelocity = new Vector3();\n\n\t\t}\n\n\t\treturn this._targetRay;\n\n\t}\n\n\tgetGripSpace() {\n\n\t\tif ( this._grip === null ) {\n\n\t\t\tthis._grip = new Group();\n\t\t\tthis._grip.matrixAutoUpdate = false;\n\t\t\tthis._grip.visible = false;\n\t\t\tthis._grip.hasLinearVelocity = false;\n\t\t\tthis._grip.linearVelocity = new Vector3();\n\t\t\tthis._grip.hasAngularVelocity = false;\n\t\t\tthis._grip.angularVelocity = new Vector3();\n\n\t\t}\n\n\t\treturn this._grip;\n\n\t}\n\n\tdispatchEvent( event ) {\n\n\t\tif ( this._targetRay !== null ) {\n\n\t\t\tthis._targetRay.dispatchEvent( event );\n\n\t\t}\n\n\t\tif ( this._grip !== null ) {\n\n\t\t\tthis._grip.dispatchEvent( event );\n\n\t\t}\n\n\t\tif ( this._hand !== null ) {\n\n\t\t\tthis._hand.dispatchEvent( event );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tdisconnect( inputSource ) {\n\n\t\tthis.dispatchEvent( { type: 'disconnected', data: inputSource } );\n\n\t\tif ( this._targetRay !== null ) {\n\n\t\t\tthis._targetRay.visible = false;\n\n\t\t}\n\n\t\tif ( this._grip !== null ) {\n\n\t\t\tthis._grip.visible = false;\n\n\t\t}\n\n\t\tif ( this._hand !== null ) {\n\n\t\t\tthis._hand.visible = false;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tupdate( inputSource, frame, referenceSpace ) {\n\n\t\tlet inputPose = null;\n\t\tlet gripPose = null;\n\t\tlet handPose = null;\n\n\t\tconst targetRay = this._targetRay;\n\t\tconst grip = this._grip;\n\t\tconst hand = this._hand;\n\n\t\tif ( inputSource && frame.session.visibilityState !== 'visible-blurred' ) {\n\n\t\t\tif ( targetRay !== null ) {\n\n\t\t\t\tinputPose = frame.getPose( inputSource.targetRaySpace, referenceSpace );\n\n\t\t\t\tif ( inputPose !== null ) {\n\n\t\t\t\t\ttargetRay.matrix.fromArray( inputPose.transform.matrix );\n\t\t\t\t\ttargetRay.matrix.decompose( targetRay.position, targetRay.rotation, targetRay.scale );\n\n\t\t\t\t\tif ( inputPose.linearVelocity ) {\n\n\t\t\t\t\t\ttargetRay.hasLinearVelocity = true;\n\t\t\t\t\t\ttargetRay.linearVelocity.copy( inputPose.linearVelocity );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttargetRay.hasLinearVelocity = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( inputPose.angularVelocity ) {\n\n\t\t\t\t\t\ttargetRay.hasAngularVelocity = true;\n\t\t\t\t\t\ttargetRay.angularVelocity.copy( inputPose.angularVelocity );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttargetRay.hasAngularVelocity = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.dispatchEvent( _moveEvent );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( hand && inputSource.hand ) {\n\n\t\t\t\thandPose = true;\n\n\t\t\t\tfor ( const inputjoint of inputSource.hand.values() ) {\n\n\t\t\t\t\t// Update the joints groups with the XRJoint poses\n\t\t\t\t\tconst jointPose = frame.getJointPose( inputjoint, referenceSpace );\n\n\t\t\t\t\tif ( hand.joints[ inputjoint.jointName ] === undefined ) {\n\n\t\t\t\t\t\t// The transform of this joint will be updated with the joint pose on each frame\n\t\t\t\t\t\tconst joint = new Group();\n\t\t\t\t\t\tjoint.matrixAutoUpdate = false;\n\t\t\t\t\t\tjoint.visible = false;\n\t\t\t\t\t\thand.joints[ inputjoint.jointName ] = joint;\n\t\t\t\t\t\t// ??\n\t\t\t\t\t\thand.add( joint );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst joint = hand.joints[ inputjoint.jointName ];\n\n\t\t\t\t\tif ( jointPose !== null ) {\n\n\t\t\t\t\t\tjoint.matrix.fromArray( jointPose.transform.matrix );\n\t\t\t\t\t\tjoint.matrix.decompose( joint.position, joint.rotation, joint.scale );\n\t\t\t\t\t\tjoint.jointRadius = jointPose.radius;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tjoint.visible = jointPose !== null;\n\n\t\t\t\t}\n\n\t\t\t\t// Custom events\n\n\t\t\t\t// Check pinchz\n\t\t\t\tconst indexTip = hand.joints[ 'index-finger-tip' ];\n\t\t\t\tconst thumbTip = hand.joints[ 'thumb-tip' ];\n\t\t\t\tconst distance = indexTip.position.distanceTo( thumbTip.position );\n\n\t\t\t\tconst distanceToPinch = 0.02;\n\t\t\t\tconst threshold = 0.005;\n\n\t\t\t\tif ( hand.inputState.pinching && distance > distanceToPinch + threshold ) {\n\n\t\t\t\t\thand.inputState.pinching = false;\n\t\t\t\t\tthis.dispatchEvent( {\n\t\t\t\t\t\ttype: 'pinchend',\n\t\t\t\t\t\thandedness: inputSource.handedness,\n\t\t\t\t\t\ttarget: this\n\t\t\t\t\t} );\n\n\t\t\t\t} else if ( ! hand.inputState.pinching && distance <= distanceToPinch - threshold ) {\n\n\t\t\t\t\thand.inputState.pinching = true;\n\t\t\t\t\tthis.dispatchEvent( {\n\t\t\t\t\t\ttype: 'pinchstart',\n\t\t\t\t\t\thandedness: inputSource.handedness,\n\t\t\t\t\t\ttarget: this\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( grip !== null && inputSource.gripSpace ) {\n\n\t\t\t\t\tgripPose = frame.getPose( inputSource.gripSpace, referenceSpace );\n\n\t\t\t\t\tif ( gripPose !== null ) {\n\n\t\t\t\t\t\tgrip.matrix.fromArray( gripPose.transform.matrix );\n\t\t\t\t\t\tgrip.matrix.decompose( grip.position, grip.rotation, grip.scale );\n\n\t\t\t\t\t\tif ( gripPose.linearVelocity ) {\n\n\t\t\t\t\t\t\tgrip.hasLinearVelocity = true;\n\t\t\t\t\t\t\tgrip.linearVelocity.copy( gripPose.linearVelocity );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgrip.hasLinearVelocity = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( gripPose.angularVelocity ) {\n\n\t\t\t\t\t\t\tgrip.hasAngularVelocity = true;\n\t\t\t\t\t\t\tgrip.angularVelocity.copy( gripPose.angularVelocity );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgrip.hasAngularVelocity = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( targetRay !== null ) {\n\n\t\t\ttargetRay.visible = ( inputPose !== null );\n\n\t\t}\n\n\t\tif ( grip !== null ) {\n\n\t\t\tgrip.visible = ( gripPose !== null );\n\n\t\t}\n\n\t\tif ( hand !== null ) {\n\n\t\t\thand.visible = ( handPose !== null );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n\nexport { WebXRController };\n","import { Texture } from './Texture.js';\nimport { NearestFilter, UnsignedShortType, UnsignedInt248Type, DepthFormat, DepthStencilFormat } from '../constants.js';\n\nclass DepthTexture extends Texture {\n\n\tconstructor( width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format ) {\n\n\t\tformat = format !== undefined ? format : DepthFormat;\n\n\t\tif ( format !== DepthFormat && format !== DepthStencilFormat ) {\n\n\t\t\tthrow new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' );\n\n\t\t}\n\n\t\tif ( type === undefined && format === DepthFormat ) type = UnsignedShortType;\n\t\tif ( type === undefined && format === DepthStencilFormat ) type = UnsignedInt248Type;\n\n\t\tsuper( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.image = { width: width, height: height };\n\n\t\tthis.magFilter = magFilter !== undefined ? magFilter : NearestFilter;\n\t\tthis.minFilter = minFilter !== undefined ? minFilter : NearestFilter;\n\n\t\tthis.flipY = false;\n\t\tthis.generateMipmaps\t= false;\n\n\t}\n\n\n}\n\nDepthTexture.prototype.isDepthTexture = true;\n\nexport { DepthTexture };\n","import { ArrayCamera } from '../../cameras/ArrayCamera.js';\nimport { EventDispatcher } from '../../core/EventDispatcher.js';\nimport { PerspectiveCamera } from '../../cameras/PerspectiveCamera.js';\nimport { Vector3 } from '../../math/Vector3.js';\nimport { Vector4 } from '../../math/Vector4.js';\nimport { WebGLAnimation } from '../webgl/WebGLAnimation.js';\nimport { WebGLRenderTarget } from '../WebGLRenderTarget.js';\nimport { WebXRController } from './WebXRController.js';\nimport { DepthTexture } from '../../textures/DepthTexture.js';\nimport { WebGLMultisampleRenderTarget } from '../WebGLMultisampleRenderTarget.js';\nimport {\n\tDepthFormat,\n\tDepthStencilFormat,\n\tRGBAFormat,\n\tsRGBEncoding,\n\tUnsignedByteType,\n\tUnsignedShortType,\n\tUnsignedInt248Type,\n} from '../../constants.js';\n\nclass WebXRManager extends EventDispatcher {\n\n\tconstructor( renderer, gl ) {\n\n\t\tsuper();\n\n\t\tconst scope = this;\n\n\t\tlet session = null;\n\t\tlet framebufferScaleFactor = 1.0;\n\n\t\tlet referenceSpace = null;\n\t\tlet referenceSpaceType = 'local-floor';\n\t\tconst hasMultisampledRenderToTexture = renderer.extensions.has( 'WEBGL_multisampled_render_to_texture' );\n\n\t\tlet pose = null;\n\t\tlet glBinding = null;\n\t\tlet glProjLayer = null;\n\t\tlet glBaseLayer = null;\n\t\tlet isMultisample = false;\n\t\tlet xrFrame = null;\n\t\tconst attributes = gl.getContextAttributes();\n\t\tlet initialRenderTarget = null;\n\t\tlet newRenderTarget = null;\n\n\t\tconst controllers = [];\n\t\tconst inputSourcesMap = new Map();\n\n\t\t//\n\n\t\tconst cameraL = new PerspectiveCamera();\n\t\tcameraL.layers.enable( 1 );\n\t\tcameraL.viewport = new Vector4();\n\n\t\tconst cameraR = new PerspectiveCamera();\n\t\tcameraR.layers.enable( 2 );\n\t\tcameraR.viewport = new Vector4();\n\n\t\tconst cameras = [ cameraL, cameraR ];\n\n\t\tconst cameraVR = new ArrayCamera();\n\t\tcameraVR.layers.enable( 1 );\n\t\tcameraVR.layers.enable( 2 );\n\n\t\tlet _currentDepthNear = null;\n\t\tlet _currentDepthFar = null;\n\n\t\t//\n\n\t\tthis.cameraAutoUpdate = true;\n\t\tthis.enabled = false;\n\n\t\tthis.isPresenting = false;\n\n\t\tthis.getController = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getTargetRaySpace();\n\n\t\t};\n\n\t\tthis.getControllerGrip = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getGripSpace();\n\n\t\t};\n\n\t\tthis.getHand = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getHandSpace();\n\n\t\t};\n\n\t\t//\n\n\t\tfunction onSessionEvent( event ) {\n\n\t\t\tconst controller = inputSourcesMap.get( event.inputSource );\n\n\t\t\tif ( controller ) {\n\n\t\t\t\tcontroller.dispatchEvent( { type: event.type, data: event.inputSource } );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onSessionEnd() {\n\n\t\t\tinputSourcesMap.forEach( function ( controller, inputSource ) {\n\n\t\t\t\tcontroller.disconnect( inputSource );\n\n\t\t\t} );\n\n\t\t\tinputSourcesMap.clear();\n\n\t\t\t_currentDepthNear = null;\n\t\t\t_currentDepthFar = null;\n\n\t\t\t// restore framebuffer/rendering state\n\n\t\t\trenderer.setRenderTarget( initialRenderTarget );\n\n\t\t\tglBaseLayer = null;\n\t\t\tglProjLayer = null;\n\t\t\tglBinding = null;\n\t\t\tsession = null;\n\t\t\tnewRenderTarget = null;\n\n\t\t\t//\n\n\t\t\tanimation.stop();\n\n\t\t\tscope.isPresenting = false;\n\n\t\t\tscope.dispatchEvent( { type: 'sessionend' } );\n\n\t\t}\n\n\t\tthis.setFramebufferScaleFactor = function ( value ) {\n\n\t\t\tframebufferScaleFactor = value;\n\n\t\t\tif ( scope.isPresenting === true ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebXRManager: Cannot change framebuffer scale while presenting.' );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.setReferenceSpaceType = function ( value ) {\n\n\t\t\treferenceSpaceType = value;\n\n\t\t\tif ( scope.isPresenting === true ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebXRManager: Cannot change reference space type while presenting.' );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.getReferenceSpace = function () {\n\n\t\t\treturn referenceSpace;\n\n\t\t};\n\n\t\tthis.getBaseLayer = function () {\n\n\t\t\treturn glProjLayer !== null ? glProjLayer : glBaseLayer;\n\n\t\t};\n\n\t\tthis.getBinding = function () {\n\n\t\t\treturn glBinding;\n\n\t\t};\n\n\t\tthis.getFrame = function () {\n\n\t\t\treturn xrFrame;\n\n\t\t};\n\n\t\tthis.getSession = function () {\n\n\t\t\treturn session;\n\n\t\t};\n\n\t\tthis.setSession = async function ( value ) {\n\n\t\t\tsession = value;\n\n\t\t\tif ( session !== null ) {\n\n\t\t\t\tinitialRenderTarget = renderer.getRenderTarget();\n\n\t\t\t\tsession.addEventListener( 'select', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'selectstart', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'selectend', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeeze', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeezestart', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeezeend', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'end', onSessionEnd );\n\t\t\t\tsession.addEventListener( 'inputsourceschange', onInputSourcesChange );\n\n\t\t\t\tif ( attributes.xrCompatible !== true ) {\n\n\t\t\t\t\tawait gl.makeXRCompatible();\n\n\t\t\t\t}\n\n\t\t\t\tif ( ( session.renderState.layers === undefined ) || ( renderer.capabilities.isWebGL2 === false ) ) {\n\n\t\t\t\t\tconst layerInit = {\n\t\t\t\t\t\tantialias: ( session.renderState.layers === undefined ) ? attributes.antialias : true,\n\t\t\t\t\t\talpha: attributes.alpha,\n\t\t\t\t\t\tdepth: attributes.depth,\n\t\t\t\t\t\tstencil: attributes.stencil,\n\t\t\t\t\t\tframebufferScaleFactor: framebufferScaleFactor\n\t\t\t\t\t};\n\n\t\t\t\t\tglBaseLayer = new XRWebGLLayer( session, gl, layerInit );\n\n\t\t\t\t\tsession.updateRenderState( { baseLayer: glBaseLayer } );\n\n\t\t\t\t\tnewRenderTarget = new WebGLRenderTarget(\n\t\t\t\t\t\tglBaseLayer.framebufferWidth,\n\t\t\t\t\t\tglBaseLayer.framebufferHeight,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tformat: RGBAFormat,\n\t\t\t\t\t\t\ttype: UnsignedByteType,\n\t\t\t\t\t\t\tencoding: renderer.outputEncoding\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\n\t\t\t\t} else {\n\n\t\t\t\t\tisMultisample = attributes.antialias;\n\t\t\t\t\tlet depthFormat = null;\n\t\t\t\t\tlet depthType = null;\n\t\t\t\t\tlet glDepthFormat = null;\n\n\t\t\t\t\tif ( attributes.depth ) {\n\n\t\t\t\t\t\tglDepthFormat = attributes.stencil ? gl.DEPTH24_STENCIL8 : gl.DEPTH_COMPONENT24;\n\t\t\t\t\t\tdepthFormat = attributes.stencil ? DepthStencilFormat : DepthFormat;\n\t\t\t\t\t\tdepthType = attributes.stencil ? UnsignedInt248Type : UnsignedShortType;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst projectionlayerInit = {\n\t\t\t\t\t\tcolorFormat: ( renderer.outputEncoding === sRGBEncoding ) ? gl.SRGB8_ALPHA8 : gl.RGBA8,\n\t\t\t\t\t\tdepthFormat: glDepthFormat,\n\t\t\t\t\t\tscaleFactor: framebufferScaleFactor\n\t\t\t\t\t};\n\n\t\t\t\t\tglBinding = new XRWebGLBinding( session, gl );\n\n\t\t\t\t\tglProjLayer = glBinding.createProjectionLayer( projectionlayerInit );\n\n\t\t\t\t\tsession.updateRenderState( { layers: [ glProjLayer ] } );\n\n\t\t\t\t\tif ( isMultisample ) {\n\n\t\t\t\t\t\tnewRenderTarget = new WebGLMultisampleRenderTarget(\n\t\t\t\t\t\t\tglProjLayer.textureWidth,\n\t\t\t\t\t\t\tglProjLayer.textureHeight,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tformat: RGBAFormat,\n\t\t\t\t\t\t\t\ttype: UnsignedByteType,\n\t\t\t\t\t\t\t\tdepthTexture: new DepthTexture( glProjLayer.textureWidth, glProjLayer.textureHeight, depthType, undefined, undefined, undefined, undefined, undefined, undefined, depthFormat ),\n\t\t\t\t\t\t\t\tstencilBuffer: attributes.stencil,\n\t\t\t\t\t\t\t\tignoreDepth: glProjLayer.ignoreDepthValues,\n\t\t\t\t\t\t\t\tuseRenderToTexture: hasMultisampledRenderToTexture,\n\t\t\t\t\t\t\t\tencoding: renderer.outputEncoding\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tnewRenderTarget = new WebGLRenderTarget(\n\t\t\t\t\t\t\tglProjLayer.textureWidth,\n\t\t\t\t\t\t\tglProjLayer.textureHeight,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tformat: RGBAFormat,\n\t\t\t\t\t\t\t\ttype: UnsignedByteType,\n\t\t\t\t\t\t\t\tdepthTexture: new DepthTexture( glProjLayer.textureWidth, glProjLayer.textureHeight, depthType, undefined, undefined, undefined, undefined, undefined, undefined, depthFormat ),\n\t\t\t\t\t\t\t\tstencilBuffer: attributes.stencil,\n\t\t\t\t\t\t\t\tignoreDepth: glProjLayer.ignoreDepthValues,\n\t\t\t\t\t\t\t\tencoding: renderer.outputEncoding\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tnewRenderTarget.isXRRenderTarget = true; // TODO Remove this when possible, see #23278\n\n\t\t\t\t// Set foveation to maximum.\n\t\t\t\tthis.setFoveation( 1.0 );\n\n\t\t\t\treferenceSpace = await session.requestReferenceSpace( referenceSpaceType );\n\n\t\t\t\tanimation.setContext( session );\n\t\t\t\tanimation.start();\n\n\t\t\t\tscope.isPresenting = true;\n\n\t\t\t\tscope.dispatchEvent( { type: 'sessionstart' } );\n\n\t\t\t}\n\n\t\t};\n\n\t\tfunction onInputSourcesChange( event ) {\n\n\t\t\tconst inputSources = session.inputSources;\n\n\t\t\t// Assign inputSources to available controllers\n\n\t\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\tinputSourcesMap.set( inputSources[ i ], controllers[ i ] );\n\n\t\t\t}\n\n\t\t\t// Notify disconnected\n\n\t\t\tfor ( let i = 0; i < event.removed.length; i ++ ) {\n\n\t\t\t\tconst inputSource = event.removed[ i ];\n\t\t\t\tconst controller = inputSourcesMap.get( inputSource );\n\n\t\t\t\tif ( controller ) {\n\n\t\t\t\t\tcontroller.dispatchEvent( { type: 'disconnected', data: inputSource } );\n\t\t\t\t\tinputSourcesMap.delete( inputSource );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Notify connected\n\n\t\t\tfor ( let i = 0; i < event.added.length; i ++ ) {\n\n\t\t\t\tconst inputSource = event.added[ i ];\n\t\t\t\tconst controller = inputSourcesMap.get( inputSource );\n\n\t\t\t\tif ( controller ) {\n\n\t\t\t\t\tcontroller.dispatchEvent( { type: 'connected', data: inputSource } );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst cameraLPos = new Vector3();\n\t\tconst cameraRPos = new Vector3();\n\n\t\t/**\n\t\t * Assumes 2 cameras that are parallel and share an X-axis, and that\n\t\t * the cameras' projection and world matrices have already been set.\n\t\t * And that near and far planes are identical for both cameras.\n\t\t * Visualization of this technique: https://computergraphics.stackexchange.com/a/4765\n\t\t */\n\t\tfunction setProjectionFromUnion( camera, cameraL, cameraR ) {\n\n\t\t\tcameraLPos.setFromMatrixPosition( cameraL.matrixWorld );\n\t\t\tcameraRPos.setFromMatrixPosition( cameraR.matrixWorld );\n\n\t\t\tconst ipd = cameraLPos.distanceTo( cameraRPos );\n\n\t\t\tconst projL = cameraL.projectionMatrix.elements;\n\t\t\tconst projR = cameraR.projectionMatrix.elements;\n\n\t\t\t// VR systems will have identical far and near planes, and\n\t\t\t// most likely identical top and bottom frustum extents.\n\t\t\t// Use the left camera for these values.\n\t\t\tconst near = projL[ 14 ] / ( projL[ 10 ] - 1 );\n\t\t\tconst far = projL[ 14 ] / ( projL[ 10 ] + 1 );\n\t\t\tconst topFov = ( projL[ 9 ] + 1 ) / projL[ 5 ];\n\t\t\tconst bottomFov = ( projL[ 9 ] - 1 ) / projL[ 5 ];\n\n\t\t\tconst leftFov = ( projL[ 8 ] - 1 ) / projL[ 0 ];\n\t\t\tconst rightFov = ( projR[ 8 ] + 1 ) / projR[ 0 ];\n\t\t\tconst left = near * leftFov;\n\t\t\tconst right = near * rightFov;\n\n\t\t\t// Calculate the new camera's position offset from the\n\t\t\t// left camera. xOffset should be roughly half `ipd`.\n\t\t\tconst zOffset = ipd / ( - leftFov + rightFov );\n\t\t\tconst xOffset = zOffset * - leftFov;\n\n\t\t\t// TODO: Better way to apply this offset?\n\t\t\tcameraL.matrixWorld.decompose( camera.position, camera.quaternion, camera.scale );\n\t\t\tcamera.translateX( xOffset );\n\t\t\tcamera.translateZ( zOffset );\n\t\t\tcamera.matrixWorld.compose( camera.position, camera.quaternion, camera.scale );\n\t\t\tcamera.matrixWorldInverse.copy( camera.matrixWorld ).invert();\n\n\t\t\t// Find the union of the frustum values of the cameras and scale\n\t\t\t// the values so that the near plane's position does not change in world space,\n\t\t\t// although must now be relative to the new union camera.\n\t\t\tconst near2 = near + zOffset;\n\t\t\tconst far2 = far + zOffset;\n\t\t\tconst left2 = left - xOffset;\n\t\t\tconst right2 = right + ( ipd - xOffset );\n\t\t\tconst top2 = topFov * far / far2 * near2;\n\t\t\tconst bottom2 = bottomFov * far / far2 * near2;\n\n\t\t\tcamera.projectionMatrix.makePerspective( left2, right2, top2, bottom2, near2, far2 );\n\n\t\t}\n\n\t\tfunction updateCamera( camera, parent ) {\n\n\t\t\tif ( parent === null ) {\n\n\t\t\t\tcamera.matrixWorld.copy( camera.matrix );\n\n\t\t\t} else {\n\n\t\t\t\tcamera.matrixWorld.multiplyMatrices( parent.matrixWorld, camera.matrix );\n\n\t\t\t}\n\n\t\t\tcamera.matrixWorldInverse.copy( camera.matrixWorld ).invert();\n\n\t\t}\n\n\t\tthis.updateCamera = function ( camera ) {\n\n\t\t\tif ( session === null ) return;\n\n\t\t\tcameraVR.near = cameraR.near = cameraL.near = camera.near;\n\t\t\tcameraVR.far = cameraR.far = cameraL.far = camera.far;\n\n\t\t\tif ( _currentDepthNear !== cameraVR.near || _currentDepthFar !== cameraVR.far ) {\n\n\t\t\t\t// Note that the new renderState won't apply until the next frame. See #18320\n\n\t\t\t\tsession.updateRenderState( {\n\t\t\t\t\tdepthNear: cameraVR.near,\n\t\t\t\t\tdepthFar: cameraVR.far\n\t\t\t\t} );\n\n\t\t\t\t_currentDepthNear = cameraVR.near;\n\t\t\t\t_currentDepthFar = cameraVR.far;\n\n\t\t\t}\n\n\t\t\tconst parent = camera.parent;\n\t\t\tconst cameras = cameraVR.cameras;\n\n\t\t\tupdateCamera( cameraVR, parent );\n\n\t\t\tfor ( let i = 0; i < cameras.length; i ++ ) {\n\n\t\t\t\tupdateCamera( cameras[ i ], parent );\n\n\t\t\t}\n\n\t\t\tcameraVR.matrixWorld.decompose( cameraVR.position, cameraVR.quaternion, cameraVR.scale );\n\n\t\t\t// update user camera and its children\n\n\t\t\tcamera.position.copy( cameraVR.position );\n\t\t\tcamera.quaternion.copy( cameraVR.quaternion );\n\t\t\tcamera.scale.copy( cameraVR.scale );\n\t\t\tcamera.matrix.copy( cameraVR.matrix );\n\t\t\tcamera.matrixWorld.copy( cameraVR.matrixWorld );\n\n\t\t\tconst children = camera.children;\n\n\t\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].updateMatrixWorld( true );\n\n\t\t\t}\n\n\t\t\t// update projection matrix for proper view frustum culling\n\n\t\t\tif ( cameras.length === 2 ) {\n\n\t\t\t\tsetProjectionFromUnion( cameraVR, cameraL, cameraR );\n\n\t\t\t} else {\n\n\t\t\t\t// assume single camera setup (AR)\n\n\t\t\t\tcameraVR.projectionMatrix.copy( cameraL.projectionMatrix );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.getCamera = function () {\n\n\t\t\treturn cameraVR;\n\n\t\t};\n\n\t\tthis.getFoveation = function () {\n\n\t\t\tif ( glProjLayer !== null ) {\n\n\t\t\t\treturn glProjLayer.fixedFoveation;\n\n\t\t\t}\n\n\t\t\tif ( glBaseLayer !== null ) {\n\n\t\t\t\treturn glBaseLayer.fixedFoveation;\n\n\t\t\t}\n\n\t\t\treturn undefined;\n\n\t\t};\n\n\t\tthis.setFoveation = function ( foveation ) {\n\n\t\t\t// 0 = no foveation = full resolution\n\t\t\t// 1 = maximum foveation = the edges render at lower resolution\n\n\t\t\tif ( glProjLayer !== null ) {\n\n\t\t\t\tglProjLayer.fixedFoveation = foveation;\n\n\t\t\t}\n\n\t\t\tif ( glBaseLayer !== null && glBaseLayer.fixedFoveation !== undefined ) {\n\n\t\t\t\tglBaseLayer.fixedFoveation = foveation;\n\n\t\t\t}\n\n\t\t};\n\n\t\t// Animation Loop\n\n\t\tlet onAnimationFrameCallback = null;\n\n\t\tfunction onAnimationFrame( time, frame ) {\n\n\t\t\tpose = frame.getViewerPose( referenceSpace );\n\t\t\txrFrame = frame;\n\n\t\t\tif ( pose !== null ) {\n\n\t\t\t\tconst views = pose.views;\n\n\t\t\t\tif ( glBaseLayer !== null ) {\n\n\t\t\t\t\trenderer.setRenderTargetFramebuffer( newRenderTarget, glBaseLayer.framebuffer );\n\t\t\t\t\trenderer.setRenderTarget( newRenderTarget );\n\n\t\t\t\t}\n\n\t\t\t\tlet cameraVRNeedsUpdate = false;\n\n\t\t\t\t// check if it's necessary to rebuild cameraVR's camera list\n\n\t\t\t\tif ( views.length !== cameraVR.cameras.length ) {\n\n\t\t\t\t\tcameraVR.cameras.length = 0;\n\t\t\t\t\tcameraVRNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < views.length; i ++ ) {\n\n\t\t\t\t\tconst view = views[ i ];\n\n\t\t\t\t\tlet viewport = null;\n\n\t\t\t\t\tif ( glBaseLayer !== null ) {\n\n\t\t\t\t\t\tviewport = glBaseLayer.getViewport( view );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst glSubImage = glBinding.getViewSubImage( glProjLayer, view );\n\t\t\t\t\t\tviewport = glSubImage.viewport;\n\n\t\t\t\t\t\t// For side-by-side projection, we only produce a single texture for both eyes.\n\t\t\t\t\t\tif ( i === 0 ) {\n\n\t\t\t\t\t\t\trenderer.setRenderTargetTextures(\n\t\t\t\t\t\t\t\tnewRenderTarget,\n\t\t\t\t\t\t\t\tglSubImage.colorTexture,\n\t\t\t\t\t\t\t\tglProjLayer.ignoreDepthValues ? undefined : glSubImage.depthStencilTexture );\n\n\t\t\t\t\t\t\trenderer.setRenderTarget( newRenderTarget );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst camera = cameras[ i ];\n\n\t\t\t\t\tcamera.matrix.fromArray( view.transform.matrix );\n\t\t\t\t\tcamera.projectionMatrix.fromArray( view.projectionMatrix );\n\t\t\t\t\tcamera.viewport.set( viewport.x, viewport.y, viewport.width, viewport.height );\n\n\t\t\t\t\tif ( i === 0 ) {\n\n\t\t\t\t\t\tcameraVR.matrix.copy( camera.matrix );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( cameraVRNeedsUpdate === true ) {\n\n\t\t\t\t\t\tcameraVR.cameras.push( camera );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tconst inputSources = session.inputSources;\n\n\t\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\tconst controller = controllers[ i ];\n\t\t\t\tconst inputSource = inputSources[ i ];\n\n\t\t\t\tcontroller.update( inputSource, frame, referenceSpace );\n\n\t\t\t}\n\n\t\t\tif ( onAnimationFrameCallback ) onAnimationFrameCallback( time, frame );\n\n\t\t\txrFrame = null;\n\n\t\t}\n\n\t\tconst animation = new WebGLAnimation();\n\n\t\tanimation.setAnimationLoop( onAnimationFrame );\n\n\t\tthis.setAnimationLoop = function ( callback ) {\n\n\t\t\tonAnimationFrameCallback = callback;\n\n\t\t};\n\n\t\tthis.dispose = function () {};\n\n\t}\n\n}\n\nexport { WebXRManager };\n","import { BackSide } from '../../constants.js';\n\nfunction WebGLMaterials( properties ) {\n\n\tfunction refreshFogUniforms( uniforms, fog ) {\n\n\t\tuniforms.fogColor.value.copy( fog.color );\n\n\t\tif ( fog.isFog ) {\n\n\t\t\tuniforms.fogNear.value = fog.near;\n\t\t\tuniforms.fogFar.value = fog.far;\n\n\t\t} else if ( fog.isFogExp2 ) {\n\n\t\t\tuniforms.fogDensity.value = fog.density;\n\n\t\t}\n\n\t}\n\n\tfunction refreshMaterialUniforms( uniforms, material, pixelRatio, height, transmissionRenderTarget ) {\n\n\t\tif ( material.isMeshBasicMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshLambertMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsLambert( uniforms, material );\n\n\t\t} else if ( material.isMeshToonMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsToon( uniforms, material );\n\n\t\t} else if ( material.isMeshPhongMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsPhong( uniforms, material );\n\n\t\t} else if ( material.isMeshStandardMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t\tif ( material.isMeshPhysicalMaterial ) {\n\n\t\t\t\trefreshUniformsPhysical( uniforms, material, transmissionRenderTarget );\n\n\t\t\t} else {\n\n\t\t\t\trefreshUniformsStandard( uniforms, material );\n\n\t\t\t}\n\n\t\t} else if ( material.isMeshMatcapMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsMatcap( uniforms, material );\n\n\t\t} else if ( material.isMeshDepthMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsDepth( uniforms, material );\n\n\t\t} else if ( material.isMeshDistanceMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsDistance( uniforms, material );\n\n\t\t} else if ( material.isMeshNormalMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsNormal( uniforms, material );\n\n\t\t} else if ( material.isLineBasicMaterial ) {\n\n\t\t\trefreshUniformsLine( uniforms, material );\n\n\t\t\tif ( material.isLineDashedMaterial ) {\n\n\t\t\t\trefreshUniformsDash( uniforms, material );\n\n\t\t\t}\n\n\t\t} else if ( material.isPointsMaterial ) {\n\n\t\t\trefreshUniformsPoints( uniforms, material, pixelRatio, height );\n\n\t\t} else if ( material.isSpriteMaterial ) {\n\n\t\t\trefreshUniformsSprites( uniforms, material );\n\n\t\t} else if ( material.isShadowMaterial ) {\n\n\t\t\tuniforms.color.value.copy( material.color );\n\t\t\tuniforms.opacity.value = material.opacity;\n\n\t\t} else if ( material.isShaderMaterial ) {\n\n\t\t\tmaterial.uniformsNeedUpdate = false; // #15581\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsCommon( uniforms, material ) {\n\n\t\tuniforms.opacity.value = material.opacity;\n\n\t\tif ( material.color ) {\n\n\t\t\tuniforms.diffuse.value.copy( material.color );\n\n\t\t}\n\n\t\tif ( material.emissive ) {\n\n\t\t\tuniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity );\n\n\t\t}\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t}\n\n\t\tif ( material.specularMap ) {\n\n\t\t\tuniforms.specularMap.value = material.specularMap;\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t\tconst envMap = properties.get( material ).envMap;\n\n\t\tif ( envMap ) {\n\n\t\t\tuniforms.envMap.value = envMap;\n\n\t\t\tuniforms.flipEnvMap.value = ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) ? - 1 : 1;\n\n\t\t\tuniforms.reflectivity.value = material.reflectivity;\n\t\t\tuniforms.ior.value = material.ior;\n\t\t\tuniforms.refractionRatio.value = material.refractionRatio;\n\n\t\t}\n\n\t\tif ( material.lightMap ) {\n\n\t\t\tuniforms.lightMap.value = material.lightMap;\n\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity;\n\n\t\t}\n\n\t\tif ( material.aoMap ) {\n\n\t\t\tuniforms.aoMap.value = material.aoMap;\n\t\t\tuniforms.aoMapIntensity.value = material.aoMapIntensity;\n\n\t\t}\n\n\t\t// uv repeat and offset setting priorities\n\t\t// 1. color map\n\t\t// 2. specular map\n\t\t// 3. displacementMap map\n\t\t// 4. normal map\n\t\t// 5. bump map\n\t\t// 6. roughnessMap map\n\t\t// 7. metalnessMap map\n\t\t// 8. alphaMap map\n\t\t// 9. emissiveMap map\n\t\t// 10. clearcoat map\n\t\t// 11. clearcoat normal map\n\t\t// 12. clearcoat roughnessMap map\n\t\t// 13. specular intensity map\n\t\t// 14. specular tint map\n\t\t// 15. transmission map\n\t\t// 16. thickness map\n\n\t\tlet uvScaleMap;\n\n\t\tif ( material.map ) {\n\n\t\t\tuvScaleMap = material.map;\n\n\t\t} else if ( material.specularMap ) {\n\n\t\t\tuvScaleMap = material.specularMap;\n\n\t\t} else if ( material.displacementMap ) {\n\n\t\t\tuvScaleMap = material.displacementMap;\n\n\t\t} else if ( material.normalMap ) {\n\n\t\t\tuvScaleMap = material.normalMap;\n\n\t\t} else if ( material.bumpMap ) {\n\n\t\t\tuvScaleMap = material.bumpMap;\n\n\t\t} else if ( material.roughnessMap ) {\n\n\t\t\tuvScaleMap = material.roughnessMap;\n\n\t\t} else if ( material.metalnessMap ) {\n\n\t\t\tuvScaleMap = material.metalnessMap;\n\n\t\t} else if ( material.alphaMap ) {\n\n\t\t\tuvScaleMap = material.alphaMap;\n\n\t\t} else if ( material.emissiveMap ) {\n\n\t\t\tuvScaleMap = material.emissiveMap;\n\n\t\t} else if ( material.clearcoatMap ) {\n\n\t\t\tuvScaleMap = material.clearcoatMap;\n\n\t\t} else if ( material.clearcoatNormalMap ) {\n\n\t\t\tuvScaleMap = material.clearcoatNormalMap;\n\n\t\t} else if ( material.clearcoatRoughnessMap ) {\n\n\t\t\tuvScaleMap = material.clearcoatRoughnessMap;\n\n\t\t} else if ( material.specularIntensityMap ) {\n\n\t\t\tuvScaleMap = material.specularIntensityMap;\n\n\t\t} else if ( material.specularColorMap ) {\n\n\t\t\tuvScaleMap = material.specularColorMap;\n\n\t\t} else if ( material.transmissionMap ) {\n\n\t\t\tuvScaleMap = material.transmissionMap;\n\n\t\t} else if ( material.thicknessMap ) {\n\n\t\t\tuvScaleMap = material.thicknessMap;\n\n\t\t} else if ( material.sheenColorMap ) {\n\n\t\t\tuvScaleMap = material.sheenColorMap;\n\n\t\t} else if ( material.sheenRoughnessMap ) {\n\n\t\t\tuvScaleMap = material.sheenRoughnessMap;\n\n\t\t}\n\n\t\tif ( uvScaleMap !== undefined ) {\n\n\t\t\t// backwards compatibility\n\t\t\tif ( uvScaleMap.isWebGLRenderTarget ) {\n\n\t\t\t\tuvScaleMap = uvScaleMap.texture;\n\n\t\t\t}\n\n\t\t\tif ( uvScaleMap.matrixAutoUpdate === true ) {\n\n\t\t\t\tuvScaleMap.updateMatrix();\n\n\t\t\t}\n\n\t\t\tuniforms.uvTransform.value.copy( uvScaleMap.matrix );\n\n\t\t}\n\n\t\t// uv repeat and offset setting priorities for uv2\n\t\t// 1. ao map\n\t\t// 2. light map\n\n\t\tlet uv2ScaleMap;\n\n\t\tif ( material.aoMap ) {\n\n\t\t\tuv2ScaleMap = material.aoMap;\n\n\t\t} else if ( material.lightMap ) {\n\n\t\t\tuv2ScaleMap = material.lightMap;\n\n\t\t}\n\n\t\tif ( uv2ScaleMap !== undefined ) {\n\n\t\t\t// backwards compatibility\n\t\t\tif ( uv2ScaleMap.isWebGLRenderTarget ) {\n\n\t\t\t\tuv2ScaleMap = uv2ScaleMap.texture;\n\n\t\t\t}\n\n\t\t\tif ( uv2ScaleMap.matrixAutoUpdate === true ) {\n\n\t\t\t\tuv2ScaleMap.updateMatrix();\n\n\t\t\t}\n\n\t\t\tuniforms.uv2Transform.value.copy( uv2ScaleMap.matrix );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsLine( uniforms, material ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\n\t}\n\n\tfunction refreshUniformsDash( uniforms, material ) {\n\n\t\tuniforms.dashSize.value = material.dashSize;\n\t\tuniforms.totalSize.value = material.dashSize + material.gapSize;\n\t\tuniforms.scale.value = material.scale;\n\n\t}\n\n\tfunction refreshUniformsPoints( uniforms, material, pixelRatio, height ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\t\tuniforms.size.value = material.size * pixelRatio;\n\t\tuniforms.scale.value = height * 0.5;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t\t// uv repeat and offset setting priorities\n\t\t// 1. color map\n\t\t// 2. alpha map\n\n\t\tlet uvScaleMap;\n\n\t\tif ( material.map ) {\n\n\t\t\tuvScaleMap = material.map;\n\n\t\t} else if ( material.alphaMap ) {\n\n\t\t\tuvScaleMap = material.alphaMap;\n\n\t\t}\n\n\t\tif ( uvScaleMap !== undefined ) {\n\n\t\t\tif ( uvScaleMap.matrixAutoUpdate === true ) {\n\n\t\t\t\tuvScaleMap.updateMatrix();\n\n\t\t\t}\n\n\t\t\tuniforms.uvTransform.value.copy( uvScaleMap.matrix );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsSprites( uniforms, material ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\t\tuniforms.rotation.value = material.rotation;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t\t// uv repeat and offset setting priorities\n\t\t// 1. color map\n\t\t// 2. alpha map\n\n\t\tlet uvScaleMap;\n\n\t\tif ( material.map ) {\n\n\t\t\tuvScaleMap = material.map;\n\n\t\t} else if ( material.alphaMap ) {\n\n\t\t\tuvScaleMap = material.alphaMap;\n\n\t\t}\n\n\t\tif ( uvScaleMap !== undefined ) {\n\n\t\t\tif ( uvScaleMap.matrixAutoUpdate === true ) {\n\n\t\t\t\tuvScaleMap.updateMatrix();\n\n\t\t\t}\n\n\t\t\tuniforms.uvTransform.value.copy( uvScaleMap.matrix );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsLambert( uniforms, material ) {\n\n\t\tif ( material.emissiveMap ) {\n\n\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsPhong( uniforms, material ) {\n\n\t\tuniforms.specular.value.copy( material.specular );\n\t\tuniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 )\n\n\t\tif ( material.emissiveMap ) {\n\n\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t}\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\t\t\tif ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;\n\n\t\t}\n\n\t\tif ( material.normalMap ) {\n\n\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\t\t\tif ( material.side === BackSide ) uniforms.normalScale.value.negate();\n\n\t\t}\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsToon( uniforms, material ) {\n\n\t\tif ( material.gradientMap ) {\n\n\t\t\tuniforms.gradientMap.value = material.gradientMap;\n\n\t\t}\n\n\t\tif ( material.emissiveMap ) {\n\n\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t}\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\t\t\tif ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;\n\n\t\t}\n\n\t\tif ( material.normalMap ) {\n\n\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\t\t\tif ( material.side === BackSide ) uniforms.normalScale.value.negate();\n\n\t\t}\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsStandard( uniforms, material ) {\n\n\t\tuniforms.roughness.value = material.roughness;\n\t\tuniforms.metalness.value = material.metalness;\n\n\t\tif ( material.roughnessMap ) {\n\n\t\t\tuniforms.roughnessMap.value = material.roughnessMap;\n\n\t\t}\n\n\t\tif ( material.metalnessMap ) {\n\n\t\t\tuniforms.metalnessMap.value = material.metalnessMap;\n\n\t\t}\n\n\t\tif ( material.emissiveMap ) {\n\n\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t}\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\t\t\tif ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;\n\n\t\t}\n\n\t\tif ( material.normalMap ) {\n\n\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\t\t\tif ( material.side === BackSide ) uniforms.normalScale.value.negate();\n\n\t\t}\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t\tconst envMap = properties.get( material ).envMap;\n\n\t\tif ( envMap ) {\n\n\t\t\t//uniforms.envMap.value = material.envMap; // part of uniforms common\n\t\t\tuniforms.envMapIntensity.value = material.envMapIntensity;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsPhysical( uniforms, material, transmissionRenderTarget ) {\n\n\t\trefreshUniformsStandard( uniforms, material );\n\n\t\tuniforms.ior.value = material.ior; // also part of uniforms common\n\n\t\tif ( material.sheen > 0 ) {\n\n\t\t\tuniforms.sheenColor.value.copy( material.sheenColor ).multiplyScalar( material.sheen );\n\n\t\t\tuniforms.sheenRoughness.value = material.sheenRoughness;\n\n\t\t\tif ( material.sheenColorMap ) {\n\n\t\t\t\tuniforms.sheenColorMap.value = material.sheenColorMap;\n\n\t\t\t}\n\n\t\t\tif ( material.sheenRoughnessMap ) {\n\n\t\t\t\tuniforms.sheenRoughnessMap.value = material.sheenRoughnessMap;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.clearcoat > 0 ) {\n\n\t\t\tuniforms.clearcoat.value = material.clearcoat;\n\t\t\tuniforms.clearcoatRoughness.value = material.clearcoatRoughness;\n\n\t\t\tif ( material.clearcoatMap ) {\n\n\t\t\t\tuniforms.clearcoatMap.value = material.clearcoatMap;\n\n\t\t\t}\n\n\t\t\tif ( material.clearcoatRoughnessMap ) {\n\n\t\t\t\tuniforms.clearcoatRoughnessMap.value = material.clearcoatRoughnessMap;\n\n\t\t\t}\n\n\t\t\tif ( material.clearcoatNormalMap ) {\n\n\t\t\t\tuniforms.clearcoatNormalScale.value.copy( material.clearcoatNormalScale );\n\t\t\t\tuniforms.clearcoatNormalMap.value = material.clearcoatNormalMap;\n\n\t\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\t\tuniforms.clearcoatNormalScale.value.negate();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.transmission > 0 ) {\n\n\t\t\tuniforms.transmission.value = material.transmission;\n\t\t\tuniforms.transmissionSamplerMap.value = transmissionRenderTarget.texture;\n\t\t\tuniforms.transmissionSamplerSize.value.set( transmissionRenderTarget.width, transmissionRenderTarget.height );\n\n\t\t\tif ( material.transmissionMap ) {\n\n\t\t\t\tuniforms.transmissionMap.value = material.transmissionMap;\n\n\t\t\t}\n\n\t\t\tuniforms.thickness.value = material.thickness;\n\n\t\t\tif ( material.thicknessMap ) {\n\n\t\t\t\tuniforms.thicknessMap.value = material.thicknessMap;\n\n\t\t\t}\n\n\t\t\tuniforms.attenuationDistance.value = material.attenuationDistance;\n\t\t\tuniforms.attenuationColor.value.copy( material.attenuationColor );\n\n\t\t}\n\n\t\tuniforms.specularIntensity.value = material.specularIntensity;\n\t\tuniforms.specularColor.value.copy( material.specularColor );\n\n\t\tif ( material.specularIntensityMap ) {\n\n\t\t\tuniforms.specularIntensityMap.value = material.specularIntensityMap;\n\n\t\t}\n\n\t\tif ( material.specularColorMap ) {\n\n\t\t\tuniforms.specularColorMap.value = material.specularColorMap;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsMatcap( uniforms, material ) {\n\n\t\tif ( material.matcap ) {\n\n\t\t\tuniforms.matcap.value = material.matcap;\n\n\t\t}\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\t\t\tif ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;\n\n\t\t}\n\n\t\tif ( material.normalMap ) {\n\n\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\t\t\tif ( material.side === BackSide ) uniforms.normalScale.value.negate();\n\n\t\t}\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsDepth( uniforms, material ) {\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsDistance( uniforms, material ) {\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t\tuniforms.referencePosition.value.copy( material.referencePosition );\n\t\tuniforms.nearDistance.value = material.nearDistance;\n\t\tuniforms.farDistance.value = material.farDistance;\n\n\t}\n\n\tfunction refreshUniformsNormal( uniforms, material ) {\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\t\t\tif ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;\n\n\t\t}\n\n\t\tif ( material.normalMap ) {\n\n\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\t\t\tif ( material.side === BackSide ) uniforms.normalScale.value.negate();\n\n\t\t}\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\trefreshFogUniforms: refreshFogUniforms,\n\t\trefreshMaterialUniforms: refreshMaterialUniforms\n\t};\n\n}\n\nexport { WebGLMaterials };\n","import {\n\tREVISION,\n\tBackSide,\n\tDoubleSide,\n\tFrontSide,\n\tRGBAFormat,\n\tHalfFloatType,\n\tFloatType,\n\tUnsignedByteType,\n\tLinearEncoding,\n\tNoToneMapping,\n\tLinearMipmapLinearFilter,\n\tNearestFilter,\n\tClampToEdgeWrapping\n} from '../constants.js';\nimport { Frustum } from '../math/Frustum.js';\nimport { Matrix4 } from '../math/Matrix4.js';\nimport { Vector3 } from '../math/Vector3.js';\nimport { Vector4 } from '../math/Vector4.js';\nimport { WebGLAnimation } from './webgl/WebGLAnimation.js';\nimport { WebGLAttributes } from './webgl/WebGLAttributes.js';\nimport { WebGLBackground } from './webgl/WebGLBackground.js';\nimport { WebGLBindingStates } from './webgl/WebGLBindingStates.js';\nimport { WebGLBufferRenderer } from './webgl/WebGLBufferRenderer.js';\nimport { WebGLCapabilities } from './webgl/WebGLCapabilities.js';\nimport { WebGLClipping } from './webgl/WebGLClipping.js';\nimport { WebGLCubeMaps } from './webgl/WebGLCubeMaps.js';\nimport { WebGLCubeUVMaps } from './webgl/WebGLCubeUVMaps.js';\nimport { WebGLExtensions } from './webgl/WebGLExtensions.js';\nimport { WebGLGeometries } from './webgl/WebGLGeometries.js';\nimport { WebGLIndexedBufferRenderer } from './webgl/WebGLIndexedBufferRenderer.js';\nimport { WebGLInfo } from './webgl/WebGLInfo.js';\nimport { WebGLMorphtargets } from './webgl/WebGLMorphtargets.js';\nimport { WebGLMultisampleRenderTarget } from './WebGLMultisampleRenderTarget.js';\nimport { WebGLObjects } from './webgl/WebGLObjects.js';\nimport { WebGLPrograms } from './webgl/WebGLPrograms.js';\nimport { WebGLProperties } from './webgl/WebGLProperties.js';\nimport { WebGLRenderLists } from './webgl/WebGLRenderLists.js';\nimport { WebGLRenderStates } from './webgl/WebGLRenderStates.js';\nimport { WebGLRenderTarget } from './WebGLRenderTarget.js';\nimport { WebGLShadowMap } from './webgl/WebGLShadowMap.js';\nimport { WebGLState } from './webgl/WebGLState.js';\nimport { WebGLTextures } from './webgl/WebGLTextures.js';\nimport { WebGLUniforms } from './webgl/WebGLUniforms.js';\nimport { WebGLUtils } from './webgl/WebGLUtils.js';\nimport { WebXRManager } from './webxr/WebXRManager.js';\nimport { WebGLMaterials } from './webgl/WebGLMaterials.js';\nimport { createElementNS } from '../utils.js';\n\nfunction createCanvasElement() {\n\n\tconst canvas = createElementNS( 'canvas' );\n\tcanvas.style.display = 'block';\n\treturn canvas;\n\n}\n\nfunction WebGLRenderer( parameters = {} ) {\n\n\tconst _canvas = parameters.canvas !== undefined ? parameters.canvas : createCanvasElement(),\n\t\t_context = parameters.context !== undefined ? parameters.context : null,\n\n\t\t_alpha = parameters.alpha !== undefined ? parameters.alpha : false,\n\t\t_depth = parameters.depth !== undefined ? parameters.depth : true,\n\t\t_stencil = parameters.stencil !== undefined ? parameters.stencil : true,\n\t\t_antialias = parameters.antialias !== undefined ? parameters.antialias : false,\n\t\t_premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true,\n\t\t_preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false,\n\t\t_powerPreference = parameters.powerPreference !== undefined ? parameters.powerPreference : 'default',\n\t\t_failIfMajorPerformanceCaveat = parameters.failIfMajorPerformanceCaveat !== undefined ? parameters.failIfMajorPerformanceCaveat : false;\n\n\tlet currentRenderList = null;\n\tlet currentRenderState = null;\n\n\t// render() can be called from within a callback triggered by another render.\n\t// We track this so that the nested render call gets its list and state isolated from the parent render call.\n\n\tconst renderListStack = [];\n\tconst renderStateStack = [];\n\n\t// public properties\n\n\tthis.domElement = _canvas;\n\n\t// Debug configuration container\n\tthis.debug = {\n\n\t\t/**\n\t\t * Enables error checking and reporting when shader programs are being compiled\n\t\t * @type {boolean}\n\t\t */\n\t\tcheckShaderErrors: true\n\t};\n\n\t// clearing\n\n\tthis.autoClear = true;\n\tthis.autoClearColor = true;\n\tthis.autoClearDepth = true;\n\tthis.autoClearStencil = true;\n\n\t// scene graph\n\n\tthis.sortObjects = true;\n\n\t// user-defined clipping\n\n\tthis.clippingPlanes = [];\n\tthis.localClippingEnabled = false;\n\n\t// physically based shading\n\n\tthis.outputEncoding = LinearEncoding;\n\n\t// physical lights\n\n\tthis.physicallyCorrectLights = false;\n\n\t// tone mapping\n\n\tthis.toneMapping = NoToneMapping;\n\tthis.toneMappingExposure = 1.0;\n\n\t// internal properties\n\n\tconst _this = this;\n\n\tlet _isContextLost = false;\n\n\t// internal state cache\n\n\tlet _currentActiveCubeFace = 0;\n\tlet _currentActiveMipmapLevel = 0;\n\tlet _currentRenderTarget = null;\n\tlet _currentMaterialId = - 1;\n\n\tlet _currentCamera = null;\n\n\tconst _currentViewport = new Vector4();\n\tconst _currentScissor = new Vector4();\n\tlet _currentScissorTest = null;\n\n\t//\n\n\tlet _width = _canvas.width;\n\tlet _height = _canvas.height;\n\n\tlet _pixelRatio = 1;\n\tlet _opaqueSort = null;\n\tlet _transparentSort = null;\n\n\tconst _viewport = new Vector4( 0, 0, _width, _height );\n\tconst _scissor = new Vector4( 0, 0, _width, _height );\n\tlet _scissorTest = false;\n\n\t// frustum\n\n\tconst _frustum = new Frustum();\n\n\t// clipping\n\n\tlet _clippingEnabled = false;\n\tlet _localClippingEnabled = false;\n\n\t// transmission\n\n\tlet _transmissionRenderTarget = null;\n\n\t// camera matrices cache\n\n\tconst _projScreenMatrix = new Matrix4();\n\n\tconst _vector3 = new Vector3();\n\n\tconst _emptyScene = { background: null, fog: null, environment: null, overrideMaterial: null, isScene: true };\n\n\tfunction getTargetPixelRatio() {\n\n\t\treturn _currentRenderTarget === null ? _pixelRatio : 1;\n\n\t}\n\n\t// initialize\n\n\tlet _gl = _context;\n\n\tfunction getContext( contextNames, contextAttributes ) {\n\n\t\tfor ( let i = 0; i < contextNames.length; i ++ ) {\n\n\t\t\tconst contextName = contextNames[ i ];\n\t\t\tconst context = _canvas.getContext( contextName, contextAttributes );\n\t\t\tif ( context !== null ) return context;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\ttry {\n\n\t\tconst contextAttributes = {\n\t\t\talpha: true,\n\t\t\tdepth: _depth,\n\t\t\tstencil: _stencil,\n\t\t\tantialias: _antialias,\n\t\t\tpremultipliedAlpha: _premultipliedAlpha,\n\t\t\tpreserveDrawingBuffer: _preserveDrawingBuffer,\n\t\t\tpowerPreference: _powerPreference,\n\t\t\tfailIfMajorPerformanceCaveat: _failIfMajorPerformanceCaveat\n\t\t};\n\n\t\t// OffscreenCanvas does not have setAttribute, see #22811\n\t\tif ( 'setAttribute' in _canvas ) _canvas.setAttribute( 'data-engine', `three.js r${REVISION}` );\n\n\t\t// event listeners must be registered before WebGL context is created, see #12753\n\t\t_canvas.addEventListener( 'webglcontextlost', onContextLost, false );\n\t\t_canvas.addEventListener( 'webglcontextrestored', onContextRestore, false );\n\n\t\tif ( _gl === null ) {\n\n\t\t\tconst contextNames = [ 'webgl2', 'webgl', 'experimental-webgl' ];\n\n\t\t\tif ( _this.isWebGL1Renderer === true ) {\n\n\t\t\t\tcontextNames.shift();\n\n\t\t\t}\n\n\t\t\t_gl = getContext( contextNames, contextAttributes );\n\n\t\t\tif ( _gl === null ) {\n\n\t\t\t\tif ( getContext( contextNames ) ) {\n\n\t\t\t\t\tthrow new Error( 'Error creating WebGL context with your selected attributes.' );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( 'Error creating WebGL context.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Some experimental-webgl implementations do not have getShaderPrecisionFormat\n\n\t\tif ( _gl.getShaderPrecisionFormat === undefined ) {\n\n\t\t\t_gl.getShaderPrecisionFormat = function () {\n\n\t\t\t\treturn { 'rangeMin': 1, 'rangeMax': 1, 'precision': 1 };\n\n\t\t\t};\n\n\t\t}\n\n\t} catch ( error ) {\n\n\t\tconsole.error( 'THREE.WebGLRenderer: ' + error.message );\n\t\tthrow error;\n\n\t}\n\n\tlet extensions, capabilities, state, info;\n\tlet properties, textures, cubemaps, cubeuvmaps, attributes, geometries, objects;\n\tlet programCache, materials, renderLists, renderStates, clipping, shadowMap;\n\n\tlet background, morphtargets, bufferRenderer, indexedBufferRenderer;\n\n\tlet utils, bindingStates;\n\n\tfunction initGLContext() {\n\n\t\textensions = new WebGLExtensions( _gl );\n\n\t\tcapabilities = new WebGLCapabilities( _gl, extensions, parameters );\n\n\t\textensions.init( capabilities );\n\n\t\tutils = new WebGLUtils( _gl, extensions, capabilities );\n\n\t\tstate = new WebGLState( _gl, extensions, capabilities );\n\n\t\tinfo = new WebGLInfo( _gl );\n\t\tproperties = new WebGLProperties();\n\t\ttextures = new WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info );\n\t\tcubemaps = new WebGLCubeMaps( _this );\n\t\tcubeuvmaps = new WebGLCubeUVMaps( _this );\n\t\tattributes = new WebGLAttributes( _gl, capabilities );\n\t\tbindingStates = new WebGLBindingStates( _gl, extensions, attributes, capabilities );\n\t\tgeometries = new WebGLGeometries( _gl, attributes, info, bindingStates );\n\t\tobjects = new WebGLObjects( _gl, geometries, attributes, info );\n\t\tmorphtargets = new WebGLMorphtargets( _gl, capabilities, textures );\n\t\tclipping = new WebGLClipping( properties );\n\t\tprogramCache = new WebGLPrograms( _this, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping );\n\t\tmaterials = new WebGLMaterials( properties );\n\t\trenderLists = new WebGLRenderLists();\n\t\trenderStates = new WebGLRenderStates( extensions, capabilities );\n\t\tbackground = new WebGLBackground( _this, cubemaps, state, objects, _alpha, _premultipliedAlpha );\n\t\tshadowMap = new WebGLShadowMap( _this, objects, capabilities );\n\n\t\tbufferRenderer = new WebGLBufferRenderer( _gl, extensions, info, capabilities );\n\t\tindexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, info, capabilities );\n\n\t\tinfo.programs = programCache.programs;\n\n\t\t_this.capabilities = capabilities;\n\t\t_this.extensions = extensions;\n\t\t_this.properties = properties;\n\t\t_this.renderLists = renderLists;\n\t\t_this.shadowMap = shadowMap;\n\t\t_this.state = state;\n\t\t_this.info = info;\n\n\t}\n\n\tinitGLContext();\n\n\t// xr\n\n\tconst xr = new WebXRManager( _this, _gl );\n\n\tthis.xr = xr;\n\n\t// API\n\n\tthis.getContext = function () {\n\n\t\treturn _gl;\n\n\t};\n\n\tthis.getContextAttributes = function () {\n\n\t\treturn _gl.getContextAttributes();\n\n\t};\n\n\tthis.forceContextLoss = function () {\n\n\t\tconst extension = extensions.get( 'WEBGL_lose_context' );\n\t\tif ( extension ) extension.loseContext();\n\n\t};\n\n\tthis.forceContextRestore = function () {\n\n\t\tconst extension = extensions.get( 'WEBGL_lose_context' );\n\t\tif ( extension ) extension.restoreContext();\n\n\t};\n\n\tthis.getPixelRatio = function () {\n\n\t\treturn _pixelRatio;\n\n\t};\n\n\tthis.setPixelRatio = function ( value ) {\n\n\t\tif ( value === undefined ) return;\n\n\t\t_pixelRatio = value;\n\n\t\tthis.setSize( _width, _height, false );\n\n\t};\n\n\tthis.getSize = function ( target ) {\n\n\t\treturn target.set( _width, _height );\n\n\t};\n\n\tthis.setSize = function ( width, height, updateStyle ) {\n\n\t\tif ( xr.isPresenting ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: Can\\'t change size while VR device is presenting.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\t_width = width;\n\t\t_height = height;\n\n\t\t_canvas.width = Math.floor( width * _pixelRatio );\n\t\t_canvas.height = Math.floor( height * _pixelRatio );\n\n\t\tif ( updateStyle !== false ) {\n\n\t\t\t_canvas.style.width = width + 'px';\n\t\t\t_canvas.style.height = height + 'px';\n\n\t\t}\n\n\t\tthis.setViewport( 0, 0, width, height );\n\n\t};\n\n\tthis.getDrawingBufferSize = function ( target ) {\n\n\t\treturn target.set( _width * _pixelRatio, _height * _pixelRatio ).floor();\n\n\t};\n\n\tthis.setDrawingBufferSize = function ( width, height, pixelRatio ) {\n\n\t\t_width = width;\n\t\t_height = height;\n\n\t\t_pixelRatio = pixelRatio;\n\n\t\t_canvas.width = Math.floor( width * pixelRatio );\n\t\t_canvas.height = Math.floor( height * pixelRatio );\n\n\t\tthis.setViewport( 0, 0, width, height );\n\n\t};\n\n\tthis.getCurrentViewport = function ( target ) {\n\n\t\treturn target.copy( _currentViewport );\n\n\t};\n\n\tthis.getViewport = function ( target ) {\n\n\t\treturn target.copy( _viewport );\n\n\t};\n\n\tthis.setViewport = function ( x, y, width, height ) {\n\n\t\tif ( x.isVector4 ) {\n\n\t\t\t_viewport.set( x.x, x.y, x.z, x.w );\n\n\t\t} else {\n\n\t\t\t_viewport.set( x, y, width, height );\n\n\t\t}\n\n\t\tstate.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).floor() );\n\n\t};\n\n\tthis.getScissor = function ( target ) {\n\n\t\treturn target.copy( _scissor );\n\n\t};\n\n\tthis.setScissor = function ( x, y, width, height ) {\n\n\t\tif ( x.isVector4 ) {\n\n\t\t\t_scissor.set( x.x, x.y, x.z, x.w );\n\n\t\t} else {\n\n\t\t\t_scissor.set( x, y, width, height );\n\n\t\t}\n\n\t\tstate.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).floor() );\n\n\t};\n\n\tthis.getScissorTest = function () {\n\n\t\treturn _scissorTest;\n\n\t};\n\n\tthis.setScissorTest = function ( boolean ) {\n\n\t\tstate.setScissorTest( _scissorTest = boolean );\n\n\t};\n\n\tthis.setOpaqueSort = function ( method ) {\n\n\t\t_opaqueSort = method;\n\n\t};\n\n\tthis.setTransparentSort = function ( method ) {\n\n\t\t_transparentSort = method;\n\n\t};\n\n\t// Clearing\n\n\tthis.getClearColor = function ( target ) {\n\n\t\treturn target.copy( background.getClearColor() );\n\n\t};\n\n\tthis.setClearColor = function () {\n\n\t\tbackground.setClearColor.apply( background, arguments );\n\n\t};\n\n\tthis.getClearAlpha = function () {\n\n\t\treturn background.getClearAlpha();\n\n\t};\n\n\tthis.setClearAlpha = function () {\n\n\t\tbackground.setClearAlpha.apply( background, arguments );\n\n\t};\n\n\tthis.clear = function ( color, depth, stencil ) {\n\n\t\tlet bits = 0;\n\n\t\tif ( color === undefined || color ) bits |= _gl.COLOR_BUFFER_BIT;\n\t\tif ( depth === undefined || depth ) bits |= _gl.DEPTH_BUFFER_BIT;\n\t\tif ( stencil === undefined || stencil ) bits |= _gl.STENCIL_BUFFER_BIT;\n\n\t\t_gl.clear( bits );\n\n\t};\n\n\tthis.clearColor = function () {\n\n\t\tthis.clear( true, false, false );\n\n\t};\n\n\tthis.clearDepth = function () {\n\n\t\tthis.clear( false, true, false );\n\n\t};\n\n\tthis.clearStencil = function () {\n\n\t\tthis.clear( false, false, true );\n\n\t};\n\n\t//\n\n\tthis.dispose = function () {\n\n\t\t_canvas.removeEventListener( 'webglcontextlost', onContextLost, false );\n\t\t_canvas.removeEventListener( 'webglcontextrestored', onContextRestore, false );\n\n\t\trenderLists.dispose();\n\t\trenderStates.dispose();\n\t\tproperties.dispose();\n\t\tcubemaps.dispose();\n\t\tcubeuvmaps.dispose();\n\t\tobjects.dispose();\n\t\tbindingStates.dispose();\n\t\tprogramCache.dispose();\n\n\t\txr.dispose();\n\n\t\txr.removeEventListener( 'sessionstart', onXRSessionStart );\n\t\txr.removeEventListener( 'sessionend', onXRSessionEnd );\n\n\t\tif ( _transmissionRenderTarget ) {\n\n\t\t\t_transmissionRenderTarget.dispose();\n\t\t\t_transmissionRenderTarget = null;\n\n\t\t}\n\n\t\tanimation.stop();\n\n\t};\n\n\t// Events\n\n\tfunction onContextLost( event ) {\n\n\t\tevent.preventDefault();\n\n\t\tconsole.log( 'THREE.WebGLRenderer: Context Lost.' );\n\n\t\t_isContextLost = true;\n\n\t}\n\n\tfunction onContextRestore( /* event */ ) {\n\n\t\tconsole.log( 'THREE.WebGLRenderer: Context Restored.' );\n\n\t\t_isContextLost = false;\n\n\t\tconst infoAutoReset = info.autoReset;\n\t\tconst shadowMapEnabled = shadowMap.enabled;\n\t\tconst shadowMapAutoUpdate = shadowMap.autoUpdate;\n\t\tconst shadowMapNeedsUpdate = shadowMap.needsUpdate;\n\t\tconst shadowMapType = shadowMap.type;\n\n\t\tinitGLContext();\n\n\t\tinfo.autoReset = infoAutoReset;\n\t\tshadowMap.enabled = shadowMapEnabled;\n\t\tshadowMap.autoUpdate = shadowMapAutoUpdate;\n\t\tshadowMap.needsUpdate = shadowMapNeedsUpdate;\n\t\tshadowMap.type = shadowMapType;\n\n\t}\n\n\tfunction onMaterialDispose( event ) {\n\n\t\tconst material = event.target;\n\n\t\tmaterial.removeEventListener( 'dispose', onMaterialDispose );\n\n\t\tdeallocateMaterial( material );\n\n\t}\n\n\t// Buffer deallocation\n\n\tfunction deallocateMaterial( material ) {\n\n\t\treleaseMaterialProgramReferences( material );\n\n\t\tproperties.remove( material );\n\n\t}\n\n\n\tfunction releaseMaterialProgramReferences( material ) {\n\n\t\tconst programs = properties.get( material ).programs;\n\n\t\tif ( programs !== undefined ) {\n\n\t\t\tprograms.forEach( function ( program ) {\n\n\t\t\t\tprogramCache.releaseProgram( program );\n\n\t\t\t} );\n\n\t\t\tif ( material.isShaderMaterial ) {\n\n\t\t\t\tprogramCache.releaseShaderCache( material );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// Buffer rendering\n\n\tthis.renderBufferDirect = function ( camera, scene, geometry, material, object, group ) {\n\n\t\tif ( scene === null ) scene = _emptyScene; // renderBufferDirect second parameter used to be fog (could be null)\n\n\t\tconst frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 );\n\n\t\tconst program = setProgram( camera, scene, geometry, material, object );\n\n\t\tstate.setMaterial( material, frontFaceCW );\n\n\t\t//\n\n\t\tlet index = geometry.index;\n\t\tconst position = geometry.attributes.position;\n\n\t\t//\n\n\t\tif ( index === null ) {\n\n\t\t\tif ( position === undefined || position.count === 0 ) return;\n\n\t\t} else if ( index.count === 0 ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t//\n\n\t\tlet rangeFactor = 1;\n\n\t\tif ( material.wireframe === true ) {\n\n\t\t\tindex = geometries.getWireframeAttribute( geometry );\n\t\t\trangeFactor = 2;\n\n\t\t}\n\n\t\tbindingStates.setup( object, material, program, geometry, index );\n\n\t\tlet attribute;\n\t\tlet renderer = bufferRenderer;\n\n\t\tif ( index !== null ) {\n\n\t\t\tattribute = attributes.get( index );\n\n\t\t\trenderer = indexedBufferRenderer;\n\t\t\trenderer.setIndex( attribute );\n\n\t\t}\n\n\t\t//\n\n\t\tconst dataCount = ( index !== null ) ? index.count : position.count;\n\n\t\tconst rangeStart = geometry.drawRange.start * rangeFactor;\n\t\tconst rangeCount = geometry.drawRange.count * rangeFactor;\n\n\t\tconst groupStart = group !== null ? group.start * rangeFactor : 0;\n\t\tconst groupCount = group !== null ? group.count * rangeFactor : Infinity;\n\n\t\tconst drawStart = Math.max( rangeStart, groupStart );\n\t\tconst drawEnd = Math.min( dataCount, rangeStart + rangeCount, groupStart + groupCount ) - 1;\n\n\t\tconst drawCount = Math.max( 0, drawEnd - drawStart + 1 );\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\t//\n\n\t\tif ( object.isMesh ) {\n\n\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\tstate.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() );\n\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t} else {\n\n\t\t\t\trenderer.setMode( _gl.TRIANGLES );\n\n\t\t\t}\n\n\t\t} else if ( object.isLine ) {\n\n\t\t\tlet lineWidth = material.linewidth;\n\n\t\t\tif ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material\n\n\t\t\tstate.setLineWidth( lineWidth * getTargetPixelRatio() );\n\n\t\t\tif ( object.isLineSegments ) {\n\n\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t} else if ( object.isLineLoop ) {\n\n\t\t\t\trenderer.setMode( _gl.LINE_LOOP );\n\n\t\t\t} else {\n\n\t\t\t\trenderer.setMode( _gl.LINE_STRIP );\n\n\t\t\t}\n\n\t\t} else if ( object.isPoints ) {\n\n\t\t\trenderer.setMode( _gl.POINTS );\n\n\t\t} else if ( object.isSprite ) {\n\n\t\t\trenderer.setMode( _gl.TRIANGLES );\n\n\t\t}\n\n\t\tif ( object.isInstancedMesh ) {\n\n\t\t\trenderer.renderInstances( drawStart, drawCount, object.count );\n\n\t\t} else if ( geometry.isInstancedBufferGeometry ) {\n\n\t\t\tconst instanceCount = Math.min( geometry.instanceCount, geometry._maxInstanceCount );\n\n\t\t\trenderer.renderInstances( drawStart, drawCount, instanceCount );\n\n\t\t} else {\n\n\t\t\trenderer.render( drawStart, drawCount );\n\n\t\t}\n\n\t};\n\n\t// Compile\n\n\tthis.compile = function ( scene, camera ) {\n\n\t\tcurrentRenderState = renderStates.get( scene );\n\t\tcurrentRenderState.init();\n\n\t\trenderStateStack.push( currentRenderState );\n\n\t\tscene.traverseVisible( function ( object ) {\n\n\t\t\tif ( object.isLight && object.layers.test( camera.layers ) ) {\n\n\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t\tcurrentRenderState.setupLights( _this.physicallyCorrectLights );\n\n\t\tscene.traverse( function ( object ) {\n\n\t\t\tconst material = object.material;\n\n\t\t\tif ( material ) {\n\n\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\tfor ( let i = 0; i < material.length; i ++ ) {\n\n\t\t\t\t\t\tconst material2 = material[ i ];\n\n\t\t\t\t\t\tgetProgram( material2, scene, object );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgetProgram( material, scene, object );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t\trenderStateStack.pop();\n\t\tcurrentRenderState = null;\n\n\t};\n\n\t// Animation Loop\n\n\tlet onAnimationFrameCallback = null;\n\n\tfunction onAnimationFrame( time ) {\n\n\t\tif ( onAnimationFrameCallback ) onAnimationFrameCallback( time );\n\n\t}\n\n\tfunction onXRSessionStart() {\n\n\t\tanimation.stop();\n\n\t}\n\n\tfunction onXRSessionEnd() {\n\n\t\tanimation.start();\n\n\t}\n\n\tconst animation = new WebGLAnimation();\n\tanimation.setAnimationLoop( onAnimationFrame );\n\n\tif ( typeof window !== 'undefined' ) animation.setContext( window );\n\n\tthis.setAnimationLoop = function ( callback ) {\n\n\t\tonAnimationFrameCallback = callback;\n\t\txr.setAnimationLoop( callback );\n\n\t\t( callback === null ) ? animation.stop() : animation.start();\n\n\t};\n\n\txr.addEventListener( 'sessionstart', onXRSessionStart );\n\txr.addEventListener( 'sessionend', onXRSessionEnd );\n\n\t// Rendering\n\n\tthis.render = function ( scene, camera ) {\n\n\t\tif ( camera !== undefined && camera.isCamera !== true ) {\n\n\t\t\tconsole.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( _isContextLost === true ) return;\n\n\t\t// update scene graph\n\n\t\tif ( scene.autoUpdate === true ) scene.updateMatrixWorld();\n\n\t\t// update camera matrices and frustum\n\n\t\tif ( camera.parent === null ) camera.updateMatrixWorld();\n\n\t\tif ( xr.enabled === true && xr.isPresenting === true ) {\n\n\t\t\tif ( xr.cameraAutoUpdate === true ) xr.updateCamera( camera );\n\n\t\t\tcamera = xr.getCamera(); // use XR camera for rendering\n\n\t\t}\n\n\t\t//\n\t\tif ( scene.isScene === true ) scene.onBeforeRender( _this, scene, camera, _currentRenderTarget );\n\n\t\tcurrentRenderState = renderStates.get( scene, renderStateStack.length );\n\t\tcurrentRenderState.init();\n\n\t\trenderStateStack.push( currentRenderState );\n\n\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\t_frustum.setFromProjectionMatrix( _projScreenMatrix );\n\n\t\t_localClippingEnabled = this.localClippingEnabled;\n\t\t_clippingEnabled = clipping.init( this.clippingPlanes, _localClippingEnabled, camera );\n\n\t\tcurrentRenderList = renderLists.get( scene, renderListStack.length );\n\t\tcurrentRenderList.init();\n\n\t\trenderListStack.push( currentRenderList );\n\n\t\tprojectObject( scene, camera, 0, _this.sortObjects );\n\n\t\tcurrentRenderList.finish();\n\n\t\tif ( _this.sortObjects === true ) {\n\n\t\t\tcurrentRenderList.sort( _opaqueSort, _transparentSort );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( _clippingEnabled === true ) clipping.beginShadows();\n\n\t\tconst shadowsArray = currentRenderState.state.shadowsArray;\n\n\t\tshadowMap.render( shadowsArray, scene, camera );\n\n\t\tif ( _clippingEnabled === true ) clipping.endShadows();\n\n\t\t//\n\n\t\tif ( this.info.autoReset === true ) this.info.reset();\n\n\t\t//\n\n\t\tbackground.render( currentRenderList, scene );\n\n\t\t// render scene\n\n\t\tcurrentRenderState.setupLights( _this.physicallyCorrectLights );\n\n\t\tif ( camera.isArrayCamera ) {\n\n\t\t\tconst cameras = camera.cameras;\n\n\t\t\tfor ( let i = 0, l = cameras.length; i < l; i ++ ) {\n\n\t\t\t\tconst camera2 = cameras[ i ];\n\n\t\t\t\trenderScene( currentRenderList, scene, camera2, camera2.viewport );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\trenderScene( currentRenderList, scene, camera );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( _currentRenderTarget !== null ) {\n\n\t\t\t// resolve multisample renderbuffers to a single-sample texture if necessary\n\n\t\t\ttextures.updateMultisampleRenderTarget( _currentRenderTarget );\n\n\t\t\t// Generate mipmap if we're using any kind of mipmap filtering\n\n\t\t\ttextures.updateRenderTargetMipmap( _currentRenderTarget );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( scene.isScene === true ) scene.onAfterRender( _this, scene, camera );\n\n\t\t// Ensure depth buffer writing is enabled so it can be cleared on next render\n\n\t\tstate.buffers.depth.setTest( true );\n\t\tstate.buffers.depth.setMask( true );\n\t\tstate.buffers.color.setMask( true );\n\n\t\tstate.setPolygonOffset( false );\n\n\t\t// _gl.finish();\n\n\t\tbindingStates.resetDefaultState();\n\t\t_currentMaterialId = - 1;\n\t\t_currentCamera = null;\n\n\t\trenderStateStack.pop();\n\n\t\tif ( renderStateStack.length > 0 ) {\n\n\t\t\tcurrentRenderState = renderStateStack[ renderStateStack.length - 1 ];\n\n\t\t} else {\n\n\t\t\tcurrentRenderState = null;\n\n\t\t}\n\n\t\trenderListStack.pop();\n\n\t\tif ( renderListStack.length > 0 ) {\n\n\t\t\tcurrentRenderList = renderListStack[ renderListStack.length - 1 ];\n\n\t\t} else {\n\n\t\t\tcurrentRenderList = null;\n\n\t\t}\n\n\t};\n\n\tfunction projectObject( object, camera, groupOrder, sortObjects ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tconst visible = object.layers.test( camera.layers );\n\n\t\tif ( visible ) {\n\n\t\t\tif ( object.isGroup ) {\n\n\t\t\t\tgroupOrder = object.renderOrder;\n\n\t\t\t} else if ( object.isLOD ) {\n\n\t\t\t\tif ( object.autoUpdate === true ) object.update( camera );\n\n\t\t\t} else if ( object.isLight ) {\n\n\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\tif ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) {\n\n\t\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld )\n\t\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\t\tconst material = object.material;\n\n\t\t\t\t\tif ( material.visible ) {\n\n\t\t\t\t\t\tcurrentRenderList.push( object, geometry, material, groupOrder, _vector3.z, null );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isMesh || object.isLine || object.isPoints ) {\n\n\t\t\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\t\t\t// update skeleton only once in a frame\n\n\t\t\t\t\tif ( object.skeleton.frame !== info.render.frame ) {\n\n\t\t\t\t\t\tobject.skeleton.update();\n\t\t\t\t\t\tobject.skeleton.frame = info.render.frame;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) {\n\n\t\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld )\n\t\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\t\tconst material = object.material;\n\n\t\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\t\tconst groups = geometry.groups;\n\n\t\t\t\t\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\t\tif ( groupMaterial && groupMaterial.visible ) {\n\n\t\t\t\t\t\t\t\tcurrentRenderList.push( object, geometry, groupMaterial, groupOrder, _vector3.z, group );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( material.visible ) {\n\n\t\t\t\t\t\tcurrentRenderList.push( object, geometry, material, groupOrder, _vector3.z, null );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tprojectObject( children[ i ], camera, groupOrder, sortObjects );\n\n\t\t}\n\n\t}\n\n\tfunction renderScene( currentRenderList, scene, camera, viewport ) {\n\n\t\tconst opaqueObjects = currentRenderList.opaque;\n\t\tconst transmissiveObjects = currentRenderList.transmissive;\n\t\tconst transparentObjects = currentRenderList.transparent;\n\n\t\tcurrentRenderState.setupLightsView( camera );\n\n\t\tif ( transmissiveObjects.length > 0 ) renderTransmissionPass( opaqueObjects, scene, camera );\n\n\t\tif ( viewport ) state.viewport( _currentViewport.copy( viewport ) );\n\n\t\tif ( opaqueObjects.length > 0 ) renderObjects( opaqueObjects, scene, camera );\n\t\tif ( transmissiveObjects.length > 0 ) renderObjects( transmissiveObjects, scene, camera );\n\t\tif ( transparentObjects.length > 0 ) renderObjects( transparentObjects, scene, camera );\n\n\t}\n\n\tfunction renderTransmissionPass( opaqueObjects, scene, camera ) {\n\n\t\tif ( _transmissionRenderTarget === null ) {\n\n\t\t\tconst needsAntialias = _antialias === true && capabilities.isWebGL2 === true;\n\t\t\tconst renderTargetType = needsAntialias ? WebGLMultisampleRenderTarget : WebGLRenderTarget;\n\n\t\t\t_transmissionRenderTarget = new renderTargetType( 1024, 1024, {\n\t\t\t\tgenerateMipmaps: true,\n\t\t\t\ttype: utils.convert( HalfFloatType ) !== null ? HalfFloatType : UnsignedByteType,\n\t\t\t\tminFilter: LinearMipmapLinearFilter,\n\t\t\t\tmagFilter: NearestFilter,\n\t\t\t\twrapS: ClampToEdgeWrapping,\n\t\t\t\twrapT: ClampToEdgeWrapping,\n\t\t\t\tuseRenderToTexture: extensions.has( 'WEBGL_multisampled_render_to_texture' )\n\t\t\t} );\n\n\t\t}\n\n\t\tconst currentRenderTarget = _this.getRenderTarget();\n\t\t_this.setRenderTarget( _transmissionRenderTarget );\n\t\t_this.clear();\n\n\t\t// Turn off the features which can affect the frag color for opaque objects pass.\n\t\t// Otherwise they are applied twice in opaque objects pass and transmission objects pass.\n\t\tconst currentToneMapping = _this.toneMapping;\n\t\t_this.toneMapping = NoToneMapping;\n\n\t\trenderObjects( opaqueObjects, scene, camera );\n\n\t\t_this.toneMapping = currentToneMapping;\n\n\t\ttextures.updateMultisampleRenderTarget( _transmissionRenderTarget );\n\t\ttextures.updateRenderTargetMipmap( _transmissionRenderTarget );\n\n\t\t_this.setRenderTarget( currentRenderTarget );\n\n\t}\n\n\tfunction renderObjects( renderList, scene, camera ) {\n\n\t\tconst overrideMaterial = scene.isScene === true ? scene.overrideMaterial : null;\n\n\t\tfor ( let i = 0, l = renderList.length; i < l; i ++ ) {\n\n\t\t\tconst renderItem = renderList[ i ];\n\n\t\t\tconst object = renderItem.object;\n\t\t\tconst geometry = renderItem.geometry;\n\t\t\tconst material = overrideMaterial === null ? renderItem.material : overrideMaterial;\n\t\t\tconst group = renderItem.group;\n\n\t\t\tif ( object.layers.test( camera.layers ) ) {\n\n\t\t\t\trenderObject( object, scene, camera, geometry, material, group );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction renderObject( object, scene, camera, geometry, material, group ) {\n\n\t\tobject.onBeforeRender( _this, scene, camera, geometry, material, group );\n\n\t\tobject.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );\n\t\tobject.normalMatrix.getNormalMatrix( object.modelViewMatrix );\n\n\t\tmaterial.onBeforeRender( _this, scene, camera, geometry, object, group );\n\n\t\tif ( material.transparent === true && material.side === DoubleSide ) {\n\n\t\t\tmaterial.side = BackSide;\n\t\t\tmaterial.needsUpdate = true;\n\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t\tmaterial.side = FrontSide;\n\t\t\tmaterial.needsUpdate = true;\n\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t\tmaterial.side = DoubleSide;\n\n\t\t} else {\n\n\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t}\n\n\t\tobject.onAfterRender( _this, scene, camera, geometry, material, group );\n\n\t}\n\n\tfunction getProgram( material, scene, object ) {\n\n\t\tif ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ...\n\n\t\tconst materialProperties = properties.get( material );\n\n\t\tconst lights = currentRenderState.state.lights;\n\t\tconst shadowsArray = currentRenderState.state.shadowsArray;\n\n\t\tconst lightsStateVersion = lights.state.version;\n\n\t\tconst parameters = programCache.getParameters( material, lights.state, shadowsArray, scene, object );\n\t\tconst programCacheKey = programCache.getProgramCacheKey( parameters );\n\n\t\tlet programs = materialProperties.programs;\n\n\t\t// always update environment and fog - changing these trigger an getProgram call, but it's possible that the program doesn't change\n\n\t\tmaterialProperties.environment = material.isMeshStandardMaterial ? scene.environment : null;\n\t\tmaterialProperties.fog = scene.fog;\n\t\tmaterialProperties.envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || materialProperties.environment );\n\n\t\tif ( programs === undefined ) {\n\n\t\t\t// new material\n\n\t\t\tmaterial.addEventListener( 'dispose', onMaterialDispose );\n\n\t\t\tprograms = new Map();\n\t\t\tmaterialProperties.programs = programs;\n\n\t\t}\n\n\t\tlet program = programs.get( programCacheKey );\n\n\t\tif ( program !== undefined ) {\n\n\t\t\t// early out if program and light state is identical\n\n\t\t\tif ( materialProperties.currentProgram === program && materialProperties.lightsStateVersion === lightsStateVersion ) {\n\n\t\t\t\tupdateCommonMaterialProperties( material, parameters );\n\n\t\t\t\treturn program;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tparameters.uniforms = programCache.getUniforms( material );\n\n\t\t\tmaterial.onBuild( object, parameters, _this );\n\n\t\t\tmaterial.onBeforeCompile( parameters, _this );\n\n\t\t\tprogram = programCache.acquireProgram( parameters, programCacheKey );\n\t\t\tprograms.set( programCacheKey, program );\n\n\t\t\tmaterialProperties.uniforms = parameters.uniforms;\n\n\t\t}\n\n\t\tconst uniforms = materialProperties.uniforms;\n\n\t\tif ( ( ! material.isShaderMaterial && ! material.isRawShaderMaterial ) || material.clipping === true ) {\n\n\t\t\tuniforms.clippingPlanes = clipping.uniform;\n\n\t\t}\n\n\t\tupdateCommonMaterialProperties( material, parameters );\n\n\t\t// store the light setup it was created for\n\n\t\tmaterialProperties.needsLights = materialNeedsLights( material );\n\t\tmaterialProperties.lightsStateVersion = lightsStateVersion;\n\n\t\tif ( materialProperties.needsLights ) {\n\n\t\t\t// wire up the material to this renderer's lighting state\n\n\t\t\tuniforms.ambientLightColor.value = lights.state.ambient;\n\t\t\tuniforms.lightProbe.value = lights.state.probe;\n\t\t\tuniforms.directionalLights.value = lights.state.directional;\n\t\t\tuniforms.directionalLightShadows.value = lights.state.directionalShadow;\n\t\t\tuniforms.spotLights.value = lights.state.spot;\n\t\t\tuniforms.spotLightShadows.value = lights.state.spotShadow;\n\t\t\tuniforms.rectAreaLights.value = lights.state.rectArea;\n\t\t\tuniforms.ltc_1.value = lights.state.rectAreaLTC1;\n\t\t\tuniforms.ltc_2.value = lights.state.rectAreaLTC2;\n\t\t\tuniforms.pointLights.value = lights.state.point;\n\t\t\tuniforms.pointLightShadows.value = lights.state.pointShadow;\n\t\t\tuniforms.hemisphereLights.value = lights.state.hemi;\n\n\t\t\tuniforms.directionalShadowMap.value = lights.state.directionalShadowMap;\n\t\t\tuniforms.directionalShadowMatrix.value = lights.state.directionalShadowMatrix;\n\t\t\tuniforms.spotShadowMap.value = lights.state.spotShadowMap;\n\t\t\tuniforms.spotShadowMatrix.value = lights.state.spotShadowMatrix;\n\t\t\tuniforms.pointShadowMap.value = lights.state.pointShadowMap;\n\t\t\tuniforms.pointShadowMatrix.value = lights.state.pointShadowMatrix;\n\t\t\t// TODO (abelnation): add area lights shadow info to uniforms\n\n\t\t}\n\n\t\tconst progUniforms = program.getUniforms();\n\t\tconst uniformsList = WebGLUniforms.seqWithValue( progUniforms.seq, uniforms );\n\n\t\tmaterialProperties.currentProgram = program;\n\t\tmaterialProperties.uniformsList = uniformsList;\n\n\t\treturn program;\n\n\t}\n\n\tfunction updateCommonMaterialProperties( material, parameters ) {\n\n\t\tconst materialProperties = properties.get( material );\n\n\t\tmaterialProperties.outputEncoding = parameters.outputEncoding;\n\t\tmaterialProperties.instancing = parameters.instancing;\n\t\tmaterialProperties.skinning = parameters.skinning;\n\t\tmaterialProperties.morphTargets = parameters.morphTargets;\n\t\tmaterialProperties.morphNormals = parameters.morphNormals;\n\t\tmaterialProperties.morphTargetsCount = parameters.morphTargetsCount;\n\t\tmaterialProperties.numClippingPlanes = parameters.numClippingPlanes;\n\t\tmaterialProperties.numIntersection = parameters.numClipIntersection;\n\t\tmaterialProperties.vertexAlphas = parameters.vertexAlphas;\n\t\tmaterialProperties.vertexTangents = parameters.vertexTangents;\n\t\tmaterialProperties.toneMapping = parameters.toneMapping;\n\n\t}\n\n\tfunction setProgram( camera, scene, geometry, material, object ) {\n\n\t\tif ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ...\n\n\t\ttextures.resetTextureUnits();\n\n\t\tconst fog = scene.fog;\n\t\tconst environment = material.isMeshStandardMaterial ? scene.environment : null;\n\t\tconst encoding = ( _currentRenderTarget === null ) ? _this.outputEncoding : ( _currentRenderTarget.isXRRenderTarget === true ? _currentRenderTarget.texture.encoding : LinearEncoding );\n\t\tconst envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment );\n\t\tconst vertexAlphas = material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4;\n\t\tconst vertexTangents = !! material.normalMap && !! geometry.attributes.tangent;\n\t\tconst morphTargets = !! geometry.morphAttributes.position;\n\t\tconst morphNormals = !! geometry.morphAttributes.normal;\n\t\tconst morphTargetsCount = !! geometry.morphAttributes.position ? geometry.morphAttributes.position.length : 0;\n\t\tconst toneMapping = material.toneMapped ? _this.toneMapping : NoToneMapping;\n\n\t\tconst materialProperties = properties.get( material );\n\t\tconst lights = currentRenderState.state.lights;\n\n\t\tif ( _clippingEnabled === true ) {\n\n\t\t\tif ( _localClippingEnabled === true || camera !== _currentCamera ) {\n\n\t\t\t\tconst useCache =\n\t\t\t\t\tcamera === _currentCamera &&\n\t\t\t\t\tmaterial.id === _currentMaterialId;\n\n\t\t\t\t// we might want to call this function with some ClippingGroup\n\t\t\t\t// object instead of the material, once it becomes feasible\n\t\t\t\t// (#8465, #8379)\n\t\t\t\tclipping.setState( material, camera, useCache );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tlet needsProgramChange = false;\n\n\t\tif ( material.version === materialProperties.__version ) {\n\n\t\t\tif ( materialProperties.needsLights && ( materialProperties.lightsStateVersion !== lights.state.version ) ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.outputEncoding !== encoding ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancing === false ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( ! object.isInstancedMesh && materialProperties.instancing === true ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( object.isSkinnedMesh && materialProperties.skinning === false ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( ! object.isSkinnedMesh && materialProperties.skinning === true ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.envMap !== envMap ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( material.fog && materialProperties.fog !== fog ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.numClippingPlanes !== undefined &&\n\t\t\t\t( materialProperties.numClippingPlanes !== clipping.numPlanes ||\n\t\t\t\tmaterialProperties.numIntersection !== clipping.numIntersection ) ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.vertexAlphas !== vertexAlphas ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.vertexTangents !== vertexTangents ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.morphTargets !== morphTargets ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.morphNormals !== morphNormals ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.toneMapping !== toneMapping ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( capabilities.isWebGL2 === true && materialProperties.morphTargetsCount !== morphTargetsCount ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tneedsProgramChange = true;\n\t\t\tmaterialProperties.__version = material.version;\n\n\t\t}\n\n\t\t//\n\n\t\tlet program = materialProperties.currentProgram;\n\n\t\tif ( needsProgramChange === true ) {\n\n\t\t\tprogram = getProgram( material, scene, object );\n\n\t\t}\n\n\t\tlet refreshProgram = false;\n\t\tlet refreshMaterial = false;\n\t\tlet refreshLights = false;\n\n\t\tconst p_uniforms = program.getUniforms(),\n\t\t\tm_uniforms = materialProperties.uniforms;\n\n\t\tif ( state.useProgram( program.program ) ) {\n\n\t\t\trefreshProgram = true;\n\t\t\trefreshMaterial = true;\n\t\t\trefreshLights = true;\n\n\t\t}\n\n\t\tif ( material.id !== _currentMaterialId ) {\n\n\t\t\t_currentMaterialId = material.id;\n\n\t\t\trefreshMaterial = true;\n\n\t\t}\n\n\t\tif ( refreshProgram || _currentCamera !== camera ) {\n\n\t\t\tp_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix );\n\n\t\t\tif ( capabilities.logarithmicDepthBuffer ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'logDepthBufFC',\n\t\t\t\t\t2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) );\n\n\t\t\t}\n\n\t\t\tif ( _currentCamera !== camera ) {\n\n\t\t\t\t_currentCamera = camera;\n\n\t\t\t\t// lighting uniforms depend on the camera so enforce an update\n\t\t\t\t// now, in case this material supports lights - or later, when\n\t\t\t\t// the next material that does gets activated:\n\n\t\t\t\trefreshMaterial = true;\t\t// set to true on material change\n\t\t\t\trefreshLights = true;\t\t// remains set until update done\n\n\t\t\t}\n\n\t\t\t// load material specific uniforms\n\t\t\t// (shader material also gets them for the sake of genericity)\n\n\t\t\tif ( material.isShaderMaterial ||\n\t\t\t\tmaterial.isMeshPhongMaterial ||\n\t\t\t\tmaterial.isMeshToonMaterial ||\n\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\tmaterial.envMap ) {\n\n\t\t\t\tconst uCamPos = p_uniforms.map.cameraPosition;\n\n\t\t\t\tif ( uCamPos !== undefined ) {\n\n\t\t\t\t\tuCamPos.setValue( _gl,\n\t\t\t\t\t\t_vector3.setFromMatrixPosition( camera.matrixWorld ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.isMeshPhongMaterial ||\n\t\t\t\tmaterial.isMeshToonMaterial ||\n\t\t\t\tmaterial.isMeshLambertMaterial ||\n\t\t\t\tmaterial.isMeshBasicMaterial ||\n\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\tmaterial.isShaderMaterial ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'isOrthographic', camera.isOrthographicCamera === true );\n\n\t\t\t}\n\n\t\t\tif ( material.isMeshPhongMaterial ||\n\t\t\t\tmaterial.isMeshToonMaterial ||\n\t\t\t\tmaterial.isMeshLambertMaterial ||\n\t\t\t\tmaterial.isMeshBasicMaterial ||\n\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\tmaterial.isShaderMaterial ||\n\t\t\t\tmaterial.isShadowMaterial ||\n\t\t\t\tobject.isSkinnedMesh ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// skinning and morph target uniforms must be set even if material didn't change\n\t\t// auto-setting of texture unit for bone and morph texture must go before other textures\n\t\t// otherwise textures used for skinning and morphing can take over texture units reserved for other material textures\n\n\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrix' );\n\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrixInverse' );\n\n\t\t\tconst skeleton = object.skeleton;\n\n\t\t\tif ( skeleton ) {\n\n\t\t\t\tif ( capabilities.floatVertexTextures ) {\n\n\t\t\t\t\tif ( skeleton.boneTexture === null ) skeleton.computeBoneTexture();\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture, textures );\n\t\t\t\t\tp_uniforms.setValue( _gl, 'boneTextureSize', skeleton.boneTextureSize );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tp_uniforms.setOptional( _gl, skeleton, 'boneMatrices' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( !! geometry && ( geometry.morphAttributes.position !== undefined || geometry.morphAttributes.normal !== undefined ) ) {\n\n\t\t\tmorphtargets.update( object, geometry, material, program );\n\n\t\t}\n\n\n\t\tif ( refreshMaterial || materialProperties.receiveShadow !== object.receiveShadow ) {\n\n\t\t\tmaterialProperties.receiveShadow = object.receiveShadow;\n\t\t\tp_uniforms.setValue( _gl, 'receiveShadow', object.receiveShadow );\n\n\t\t}\n\n\t\tif ( refreshMaterial ) {\n\n\t\t\tp_uniforms.setValue( _gl, 'toneMappingExposure', _this.toneMappingExposure );\n\n\t\t\tif ( materialProperties.needsLights ) {\n\n\t\t\t\t// the current material requires lighting info\n\n\t\t\t\t// note: all lighting uniforms are always set correctly\n\t\t\t\t// they simply reference the renderer's state for their\n\t\t\t\t// values\n\t\t\t\t//\n\t\t\t\t// use the current material's .needsUpdate flags to set\n\t\t\t\t// the GL state when required\n\n\t\t\t\tmarkUniformsLightsNeedsUpdate( m_uniforms, refreshLights );\n\n\t\t\t}\n\n\t\t\t// refresh uniforms common to several materials\n\n\t\t\tif ( fog && material.fog ) {\n\n\t\t\t\tmaterials.refreshFogUniforms( m_uniforms, fog );\n\n\t\t\t}\n\n\t\t\tmaterials.refreshMaterialUniforms( m_uniforms, material, _pixelRatio, _height, _transmissionRenderTarget );\n\n\t\t\tWebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, textures );\n\n\t\t}\n\n\t\tif ( material.isShaderMaterial && material.uniformsNeedUpdate === true ) {\n\n\t\t\tWebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, textures );\n\t\t\tmaterial.uniformsNeedUpdate = false;\n\n\t\t}\n\n\t\tif ( material.isSpriteMaterial ) {\n\n\t\t\tp_uniforms.setValue( _gl, 'center', object.center );\n\n\t\t}\n\n\t\t// common matrices\n\n\t\tp_uniforms.setValue( _gl, 'modelViewMatrix', object.modelViewMatrix );\n\t\tp_uniforms.setValue( _gl, 'normalMatrix', object.normalMatrix );\n\t\tp_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld );\n\n\t\treturn program;\n\n\t}\n\n\t// If uniforms are marked as clean, they don't need to be loaded to the GPU.\n\n\tfunction markUniformsLightsNeedsUpdate( uniforms, value ) {\n\n\t\tuniforms.ambientLightColor.needsUpdate = value;\n\t\tuniforms.lightProbe.needsUpdate = value;\n\n\t\tuniforms.directionalLights.needsUpdate = value;\n\t\tuniforms.directionalLightShadows.needsUpdate = value;\n\t\tuniforms.pointLights.needsUpdate = value;\n\t\tuniforms.pointLightShadows.needsUpdate = value;\n\t\tuniforms.spotLights.needsUpdate = value;\n\t\tuniforms.spotLightShadows.needsUpdate = value;\n\t\tuniforms.rectAreaLights.needsUpdate = value;\n\t\tuniforms.hemisphereLights.needsUpdate = value;\n\n\t}\n\n\tfunction materialNeedsLights( material ) {\n\n\t\treturn material.isMeshLambertMaterial || material.isMeshToonMaterial || material.isMeshPhongMaterial ||\n\t\t\tmaterial.isMeshStandardMaterial || material.isShadowMaterial ||\n\t\t\t( material.isShaderMaterial && material.lights === true );\n\n\t}\n\n\tthis.getActiveCubeFace = function () {\n\n\t\treturn _currentActiveCubeFace;\n\n\t};\n\n\tthis.getActiveMipmapLevel = function () {\n\n\t\treturn _currentActiveMipmapLevel;\n\n\t};\n\n\tthis.getRenderTarget = function () {\n\n\t\treturn _currentRenderTarget;\n\n\t};\n\n\tthis.setRenderTargetTextures = function ( renderTarget, colorTexture, depthTexture ) {\n\n\t\tproperties.get( renderTarget.texture ).__webglTexture = colorTexture;\n\t\tproperties.get( renderTarget.depthTexture ).__webglTexture = depthTexture;\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\trenderTargetProperties.__hasExternalTextures = true;\n\n\t\tif ( renderTargetProperties.__hasExternalTextures ) {\n\n\t\t\trenderTargetProperties.__autoAllocateDepthBuffer = depthTexture === undefined;\n\n\t\t\tif ( ! renderTargetProperties.__autoAllocateDepthBuffer ) {\n\n\t\t\t\t// The multisample_render_to_texture extension doesn't work properly if there\n\t\t\t\t// are midframe flushes and an external depth buffer. Disable use of the extension.\n\t\t\t\tif ( renderTarget.useRenderToTexture ) {\n\n\t\t\t\t\tconsole.warn( 'render-to-texture extension was disabled because an external texture was provided' );\n\t\t\t\t\trenderTarget.useRenderToTexture = false;\n\t\t\t\t\trenderTarget.useRenderbuffer = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tthis.setRenderTargetFramebuffer = function ( renderTarget, defaultFramebuffer ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\trenderTargetProperties.__webglFramebuffer = defaultFramebuffer;\n\t\trenderTargetProperties.__useDefaultFramebuffer = defaultFramebuffer === undefined;\n\n\t};\n\n\tthis.setRenderTarget = function ( renderTarget, activeCubeFace = 0, activeMipmapLevel = 0 ) {\n\n\t\t_currentRenderTarget = renderTarget;\n\t\t_currentActiveCubeFace = activeCubeFace;\n\t\t_currentActiveMipmapLevel = activeMipmapLevel;\n\t\tlet useDefaultFramebuffer = true;\n\n\t\tif ( renderTarget ) {\n\n\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\t\tif ( renderTargetProperties.__useDefaultFramebuffer !== undefined ) {\n\n\t\t\t\t// We need to make sure to rebind the framebuffer.\n\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\t\t\t\tuseDefaultFramebuffer = false;\n\n\t\t\t} else if ( renderTargetProperties.__webglFramebuffer === undefined ) {\n\n\t\t\t\ttextures.setupRenderTarget( renderTarget );\n\n\t\t\t} else if ( renderTargetProperties.__hasExternalTextures ) {\n\n\t\t\t\t// Color and depth texture must be rebound in order for the swapchain to update.\n\t\t\t\ttextures.rebindTextures( renderTarget, properties.get( renderTarget.texture ).__webglTexture, properties.get( renderTarget.depthTexture ).__webglTexture );\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet framebuffer = null;\n\t\tlet isCube = false;\n\t\tlet isRenderTarget3D = false;\n\n\t\tif ( renderTarget ) {\n\n\t\t\tconst texture = renderTarget.texture;\n\n\t\t\tif ( texture.isDataTexture3D || texture.isDataTexture2DArray ) {\n\n\t\t\t\tisRenderTarget3D = true;\n\n\t\t\t}\n\n\t\t\tconst __webglFramebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\t\tif ( renderTarget.isWebGLCubeRenderTarget ) {\n\n\t\t\t\tframebuffer = __webglFramebuffer[ activeCubeFace ];\n\t\t\t\tisCube = true;\n\n\t\t\t} else if ( renderTarget.useRenderbuffer ) {\n\n\t\t\t\tframebuffer = properties.get( renderTarget ).__webglMultisampledFramebuffer;\n\n\t\t\t} else {\n\n\t\t\t\tframebuffer = __webglFramebuffer;\n\n\t\t\t}\n\n\t\t\t_currentViewport.copy( renderTarget.viewport );\n\t\t\t_currentScissor.copy( renderTarget.scissor );\n\t\t\t_currentScissorTest = renderTarget.scissorTest;\n\n\t\t} else {\n\n\t\t\t_currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).floor();\n\t\t\t_currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).floor();\n\t\t\t_currentScissorTest = _scissorTest;\n\n\t\t}\n\n\t\tconst framebufferBound = state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\tif ( framebufferBound && capabilities.drawBuffers && useDefaultFramebuffer ) {\n\n\t\t\tstate.drawBuffers( renderTarget, framebuffer );\n\n\t\t}\n\n\t\tstate.viewport( _currentViewport );\n\t\tstate.scissor( _currentScissor );\n\t\tstate.setScissorTest( _currentScissorTest );\n\n\t\tif ( isCube ) {\n\n\t\t\tconst textureProperties = properties.get( renderTarget.texture );\n\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + activeCubeFace, textureProperties.__webglTexture, activeMipmapLevel );\n\n\t\t} else if ( isRenderTarget3D ) {\n\n\t\t\tconst textureProperties = properties.get( renderTarget.texture );\n\t\t\tconst layer = activeCubeFace || 0;\n\t\t\t_gl.framebufferTextureLayer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, textureProperties.__webglTexture, activeMipmapLevel || 0, layer );\n\n\t\t}\n\n\t\t_currentMaterialId = - 1; // reset current material to ensure correct uniform bindings\n\n\t};\n\n\tthis.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer, activeCubeFaceIndex ) {\n\n\t\tif ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) {\n\n\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tlet framebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\tif ( renderTarget.isWebGLCubeRenderTarget && activeCubeFaceIndex !== undefined ) {\n\n\t\t\tframebuffer = framebuffer[ activeCubeFaceIndex ];\n\n\t\t}\n\n\t\tif ( framebuffer ) {\n\n\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\ttry {\n\n\t\t\t\tconst texture = renderTarget.texture;\n\t\t\t\tconst textureFormat = texture.format;\n\t\t\t\tconst textureType = texture.type;\n\n\t\t\t\tif ( textureFormat !== RGBAFormat && utils.convert( textureFormat ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tconst halfFloatSupportedByExt = ( textureType === HalfFloatType ) && ( extensions.has( 'EXT_color_buffer_half_float' ) || ( capabilities.isWebGL2 && extensions.has( 'EXT_color_buffer_float' ) ) );\n\n\t\t\t\tif ( textureType !== UnsignedByteType && utils.convert( textureType ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // Edge and Chrome Mac < 52 (#9513)\n\t\t\t\t\t! ( textureType === FloatType && ( capabilities.isWebGL2 || extensions.has( 'OES_texture_float' ) || extensions.has( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox\n\t\t\t\t\t! halfFloatSupportedByExt ) {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( _gl.checkFramebufferStatus( _gl.FRAMEBUFFER ) === _gl.FRAMEBUFFER_COMPLETE ) {\n\n\t\t\t\t\t// the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)\n\n\t\t\t\t\tif ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {\n\n\t\t\t\t\t\t_gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), buffer );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.' );\n\n\t\t\t\t}\n\n\t\t\t} finally {\n\n\t\t\t\t// restore framebuffer of current render target if necessary\n\n\t\t\t\tconst framebuffer = ( _currentRenderTarget !== null ) ? properties.get( _currentRenderTarget ).__webglFramebuffer : null;\n\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tthis.copyFramebufferToTexture = function ( position, texture, level = 0 ) {\n\n\t\tif ( texture.isFramebufferTexture !== true ) {\n\n\t\t\tconsole.error( 'THREE.WebGLRenderer: copyFramebufferToTexture() can only be used with FramebufferTexture.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst levelScale = Math.pow( 2, - level );\n\t\tconst width = Math.floor( texture.image.width * levelScale );\n\t\tconst height = Math.floor( texture.image.height * levelScale );\n\n\t\ttextures.setTexture2D( texture, 0 );\n\n\t\t_gl.copyTexSubImage2D( _gl.TEXTURE_2D, level, 0, 0, position.x, position.y, width, height );\n\n\t\tstate.unbindTexture();\n\n\t};\n\n\tthis.copyTextureToTexture = function ( position, srcTexture, dstTexture, level = 0 ) {\n\n\t\tconst width = srcTexture.image.width;\n\t\tconst height = srcTexture.image.height;\n\t\tconst glFormat = utils.convert( dstTexture.format );\n\t\tconst glType = utils.convert( dstTexture.type );\n\n\t\ttextures.setTexture2D( dstTexture, 0 );\n\n\t\t// As another texture upload may have changed pixelStorei\n\t\t// parameters, make sure they are correct for the dstTexture\n\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, dstTexture.flipY );\n\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, dstTexture.premultiplyAlpha );\n\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, dstTexture.unpackAlignment );\n\n\t\tif ( srcTexture.isDataTexture ) {\n\n\t\t\t_gl.texSubImage2D( _gl.TEXTURE_2D, level, position.x, position.y, width, height, glFormat, glType, srcTexture.image.data );\n\n\t\t} else {\n\n\t\t\tif ( srcTexture.isCompressedTexture ) {\n\n\t\t\t\t_gl.compressedTexSubImage2D( _gl.TEXTURE_2D, level, position.x, position.y, srcTexture.mipmaps[ 0 ].width, srcTexture.mipmaps[ 0 ].height, glFormat, srcTexture.mipmaps[ 0 ].data );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.texSubImage2D( _gl.TEXTURE_2D, level, position.x, position.y, glFormat, glType, srcTexture.image );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Generate mipmaps only when copying level 0\n\t\tif ( level === 0 && dstTexture.generateMipmaps ) _gl.generateMipmap( _gl.TEXTURE_2D );\n\n\t\tstate.unbindTexture();\n\n\t};\n\n\tthis.copyTextureToTexture3D = function ( sourceBox, position, srcTexture, dstTexture, level = 0 ) {\n\n\t\tif ( _this.isWebGL1Renderer ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer.copyTextureToTexture3D: can only be used with WebGL2.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst width = sourceBox.max.x - sourceBox.min.x + 1;\n\t\tconst height = sourceBox.max.y - sourceBox.min.y + 1;\n\t\tconst depth = sourceBox.max.z - sourceBox.min.z + 1;\n\t\tconst glFormat = utils.convert( dstTexture.format );\n\t\tconst glType = utils.convert( dstTexture.type );\n\t\tlet glTarget;\n\n\t\tif ( dstTexture.isDataTexture3D ) {\n\n\t\t\ttextures.setTexture3D( dstTexture, 0 );\n\t\t\tglTarget = _gl.TEXTURE_3D;\n\n\t\t} else if ( dstTexture.isDataTexture2DArray ) {\n\n\t\t\ttextures.setTexture2DArray( dstTexture, 0 );\n\t\t\tglTarget = _gl.TEXTURE_2D_ARRAY;\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer.copyTextureToTexture3D: only supports THREE.DataTexture3D and THREE.DataTexture2DArray.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, dstTexture.flipY );\n\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, dstTexture.premultiplyAlpha );\n\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, dstTexture.unpackAlignment );\n\n\t\tconst unpackRowLen = _gl.getParameter( _gl.UNPACK_ROW_LENGTH );\n\t\tconst unpackImageHeight = _gl.getParameter( _gl.UNPACK_IMAGE_HEIGHT );\n\t\tconst unpackSkipPixels = _gl.getParameter( _gl.UNPACK_SKIP_PIXELS );\n\t\tconst unpackSkipRows = _gl.getParameter( _gl.UNPACK_SKIP_ROWS );\n\t\tconst unpackSkipImages = _gl.getParameter( _gl.UNPACK_SKIP_IMAGES );\n\n\t\tconst image = srcTexture.isCompressedTexture ? srcTexture.mipmaps[ 0 ] : srcTexture.image;\n\n\t\t_gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, image.width );\n\t\t_gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, image.height );\n\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, sourceBox.min.x );\n\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, sourceBox.min.y );\n\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, sourceBox.min.z );\n\n\t\tif ( srcTexture.isDataTexture || srcTexture.isDataTexture3D ) {\n\n\t\t\t_gl.texSubImage3D( glTarget, level, position.x, position.y, position.z, width, height, depth, glFormat, glType, image.data );\n\n\t\t} else {\n\n\t\t\tif ( srcTexture.isCompressedTexture ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer.copyTextureToTexture3D: untested support for compressed srcTexture.' );\n\t\t\t\t_gl.compressedTexSubImage3D( glTarget, level, position.x, position.y, position.z, width, height, depth, glFormat, image.data );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.texSubImage3D( glTarget, level, position.x, position.y, position.z, width, height, depth, glFormat, glType, image );\n\n\t\t\t}\n\n\t\t}\n\n\t\t_gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, unpackRowLen );\n\t\t_gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, unpackImageHeight );\n\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, unpackSkipPixels );\n\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, unpackSkipRows );\n\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, unpackSkipImages );\n\n\t\t// Generate mipmaps only when copying level 0\n\t\tif ( level === 0 && dstTexture.generateMipmaps ) _gl.generateMipmap( glTarget );\n\n\t\tstate.unbindTexture();\n\n\t};\n\n\tthis.initTexture = function ( texture ) {\n\n\t\ttextures.setTexture2D( texture, 0 );\n\n\t\tstate.unbindTexture();\n\n\t};\n\n\tthis.resetState = function () {\n\n\t\t_currentActiveCubeFace = 0;\n\t\t_currentActiveMipmapLevel = 0;\n\t\t_currentRenderTarget = null;\n\n\t\tstate.reset();\n\t\tbindingStates.reset();\n\n\t};\n\n\tif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) );\n\n\t}\n\n}\n\nWebGLRenderer.prototype.isWebGLRenderer = true;\n\nexport { WebGLRenderer };\n","import { WebGLRenderer } from './WebGLRenderer.js';\n\nclass WebGL1Renderer extends WebGLRenderer {}\n\nWebGL1Renderer.prototype.isWebGL1Renderer = true;\n\nexport { WebGL1Renderer };\n","import { WebGL1Renderer } from \"three/src/renderers/WebGL1Renderer.js\";\nimport { Bootstrap } from \"../bootstrap\";\n\nBootstrap.registerPlugin(\"renderer\", {\n  defaults: {\n    klass: WebGL1Renderer,\n    parameters: {\n      depth: true,\n      stencil: true,\n      preserveDrawingBuffer: true,\n      antialias: true,\n    },\n  },\n\n  listen: [\"resize\"],\n\n  install: function (three) {\n    // Instantiate Three renderer\n    const renderer = (three.renderer = new this.options.klass(\n      this.options.parameters\n    ));\n    three.canvas = renderer.domElement;\n\n    // Add to DOM\n    three.element.appendChild(renderer.domElement);\n  },\n\n  uninstall: function (three) {\n    // Remove from DOM\n    three.element.removeChild(three.renderer.domElement);\n\n    delete three.renderer;\n    delete three.canvas;\n  },\n\n  resize: function (event, three) {\n    const renderer = three.renderer;\n    const el = renderer.domElement;\n\n    // Resize renderer to render size if it's a canvas\n    if (el && el.tagName == \"CANVAS\") {\n      renderer.setSize(event.renderWidth, event.renderHeight, false);\n    }\n    // Or view size if it's just a DOM element or multi-renderer\n    else {\n      if (renderer.setRenderSize) {\n        renderer.setRenderSize(event.renderWidth, event.renderHeight);\n      }\n      renderer.setSize(event.viewWidth, event.viewHeight, false);\n    }\n  },\n});\n","import { Scene } from \"three/src/scenes/Scene.js\";\nimport { Bootstrap } from \"../bootstrap\";\n\nBootstrap.registerPlugin(\"scene\", {\n  install: function (three) {\n    three.scene = new Scene();\n  },\n\n  uninstall: function (three) {\n    delete three.scene;\n  },\n});\n","import { Bootstrap } from \"../bootstrap\";\n\nBootstrap.registerPlugin(\"size\", {\n  defaults: {\n    width: null,\n    height: null,\n    aspect: null,\n    scale: 1,\n    maxRenderWidth: Infinity,\n    maxRenderHeight: Infinity,\n    devicePixelRatio: true,\n  },\n\n  listen: [\n    \"window.resize:queue\",\n    \"element.resize:queue\",\n    \"this.change:queue\",\n    \"ready:resize\",\n    \"pre:pre\",\n  ],\n\n  install: function (three) {\n    three.Size = this.api({\n      renderWidth: 0,\n      renderHeight: 0,\n      viewWidth: 0,\n      viewHeight: 0,\n    });\n\n    this.resized = false;\n  },\n\n  uninstall: function (three) {\n    delete three.Size;\n  },\n\n  queue: function (_event, _three) {\n    this.resized = true;\n  },\n\n  pre: function (event, three) {\n    if (!this.resized) return;\n    this.resized = false;\n    this.resize(event, three);\n  },\n\n  resize: function (event, three) {\n    const options = this.options;\n    const element = three.element;\n    const renderer = three.renderer;\n\n    let w,\n      h,\n      ew,\n      eh,\n      rw,\n      rh,\n      aspect,\n      ratio,\n      ml = 0,\n      mt = 0;\n\n    // Measure element\n    w = ew =\n      options.width === undefined || options.width == null\n        ? element.offsetWidth || element.innerWidth || 0\n        : options.width;\n\n    h = eh =\n      options.height === undefined || options.height == null\n        ? element.offsetHeight || element.innerHeight || 0\n        : options.height;\n\n    // Force aspect ratio\n    aspect = w / h;\n    if (options.aspect) {\n      if (options.aspect > aspect) {\n        h = Math.round(w / options.aspect);\n        mt = Math.floor((eh - h) / 2);\n      } else {\n        w = Math.round(h * options.aspect);\n        ml = Math.floor((ew - w) / 2);\n      }\n      aspect = w / h;\n    }\n\n    // Get device pixel ratio\n    ratio = 1;\n    if (options.devicePixelRatio && typeof window != \"undefined\") {\n      ratio = window.devicePixelRatio || 1;\n    }\n\n    // Apply scale and resolution max\n    rw = Math.round(\n      Math.min(w * ratio * options.scale, options.maxRenderWidth)\n    );\n    rh = Math.round(\n      Math.min(h * ratio * options.scale, options.maxRenderHeight)\n    );\n\n    // Retain aspect ratio\n    const raspect = rw / rh;\n    if (raspect > aspect) {\n      rw = Math.round(rh * aspect);\n    } else {\n      rh = Math.round(rw / aspect);\n    }\n\n    // Measure final pixel ratio\n    ratio = rh / h;\n\n    // Resize and position renderer element\n    const style = renderer.domElement.style;\n    style.width = w + \"px\";\n    style.height = h + \"px\";\n    style.marginLeft = ml + \"px\";\n    style.marginTop = mt + \"px\";\n\n    // Notify\n    Object.assign(three.Size, {\n      renderWidth: rw,\n      renderHeight: rh,\n      viewWidth: w,\n      viewHeight: h,\n      aspect: aspect,\n      pixelRatio: ratio,\n    });\n\n    three.trigger({\n      type: \"resize\",\n      renderWidth: rw,\n      renderHeight: rh,\n      viewWidth: w,\n      viewHeight: h,\n      aspect: aspect,\n      pixelRatio: ratio,\n    });\n  },\n});\n","import { Bootstrap } from \"../bootstrap\";\n\nBootstrap.registerPlugin(\"time\", {\n  defaults: {\n    speed: 1, // Clock speed\n    warmup: 0, // Wait N frames before starting clock\n    timeout: 1, // Timeout in seconds. Pause if no tick happens in this time.\n  },\n\n  listen: [\"pre:tick\", \"this.change\"],\n\n  now: function () {\n    return +new Date() / 1000;\n  },\n\n  install: function (three) {\n    three.Time = this.api({\n      now: this.now(), // Time since 1970 in seconds\n\n      clock: 0, // Adjustable clock that counts up from 0 seconds\n      step: 1 / 60, // Clock step in seconds\n\n      frames: 0, // Framenumber\n      time: 0, // Real time in seconds\n      delta: 1 / 60, // Frame step in seconds\n\n      average: 0, // Average frame time in seconds\n      fps: 0, // Average frames per second\n    });\n\n    this.last = 0;\n    this.time = 0;\n    this.clock = 0;\n    this.wait = this.options.warmup;\n\n    this.clockStart = 0;\n    this.timeStart = 0;\n  },\n\n  tick: function (event, three) {\n    const speed = this.options.speed;\n    const timeout = this.options.timeout;\n\n    const api = three.Time;\n    const now = (api.now = this.now());\n    const last = this.last;\n    let time = this.time;\n    let clock = this.clock;\n\n    if (last) {\n      let delta = (api.delta = now - last);\n      const average = api.average || delta;\n\n      if (delta > timeout) {\n        delta = 0;\n      }\n\n      const step = delta * speed;\n\n      time += delta;\n      clock += step;\n\n      if (api.frames > 0) {\n        api.average = average + (delta - average) * 0.1;\n        api.fps = 1 / average;\n      }\n\n      api.step = step;\n      api.clock = clock - this.clockStart;\n      api.time = time - this.timeStart;\n\n      api.frames++;\n\n      if (this.wait-- > 0) {\n        this.clockStart = clock;\n        this.timeStart = time;\n        api.clock = 0;\n        api.step = 1e-100;\n      }\n    }\n\n    this.last = now;\n    this.clock = clock;\n    this.time = time;\n  },\n\n  uninstall: function (three) {\n    delete three.Time;\n  },\n});\n","import { Bootstrap } from \"../bootstrap\";\n\nBootstrap.registerPlugin(\"warmup\", {\n  defaults: {\n    delay: 2,\n  },\n\n  listen: [\"ready\", \"post\"],\n\n  ready: function (event, three) {\n    three.renderer.domElement.style.visibility = \"hidden\";\n    this.frame = 0;\n    this.hidden = true;\n  },\n\n  post: function (event, three) {\n    if (this.hidden && this.frame >= this.options.delay) {\n      three.renderer.domElement.style.visibility = \"visible\";\n      this.hidden = false;\n    }\n    this.frame++;\n  },\n});\n","import { PerspectiveCamera } from \"three/src/cameras/PerspectiveCamera.js\";\nimport { Bootstrap } from \"../bootstrap\";\n\nBootstrap.registerPlugin(\"controls\", {\n  listen: [\"update\", \"resize\", \"camera\", \"this.change\"],\n\n  defaults: {\n    klass: null,\n    parameters: {},\n  },\n\n  install: function (three) {\n    if (!this.options.klass) throw \"Must provide class for `controls.klass`\";\n\n    three.controls = null;\n\n    this._camera = three.camera || new PerspectiveCamera();\n    this.change(null, three);\n  },\n\n  uninstall: function (three) {\n    delete three.controls;\n  },\n\n  change: function (event, three) {\n    if (this.options.klass) {\n      if (!event || event.changes.klass) {\n        three.controls = new this.options.klass(\n          this._camera,\n          three.renderer.domElement\n        );\n      }\n\n      Object.assign(three.controls, this.options.parameters);\n    } else {\n      three.controls = null;\n    }\n  },\n\n  update: function (event, three) {\n    const delta = (three.Time && three.Time.delta) || 1 / 60;\n    const vr = three.VR && three.VR.state;\n\n    if (three.controls.vr) three.controls.vr(vr);\n    three.controls.update(delta);\n  },\n\n  camera: function (event, three) {\n    three.controls.object = this._camera = event.camera;\n  },\n\n  resize: function (event, three) {\n    three.controls.handleResize && three.controls.handleResize();\n  },\n});\n","import { Bootstrap } from \"../bootstrap\";\n\nBootstrap.registerPlugin(\"cursor\", {\n  listen: [\n    \"update\",\n    \"this.change\",\n    \"install:change\",\n    \"uninstall:change\",\n    \"element.mousemove\",\n    \"vr\",\n  ],\n\n  defaults: {\n    cursor: null,\n    hide: false,\n    timeout: 3,\n  },\n\n  install: function (three) {\n    this.timeout = this.options.timeout;\n    this.element = three.element;\n    this.change(null, three);\n  },\n\n  uninstall: function (three) {\n    delete three.controls;\n  },\n\n  change: function (event, three) {\n    this.applyCursor(three);\n  },\n\n  mousemove: function (event, three) {\n    if (this.options.hide) {\n      this.applyCursor(three);\n      this.timeout = +this.options.timeout || 0;\n    }\n  },\n\n  update: function (event, three) {\n    const delta = (three.Time && three.Time.delta) || 1 / 60;\n\n    if (this.options.hide) {\n      this.timeout -= delta;\n      if (this.timeout < 0) {\n        this.applyCursor(three, \"none\");\n      }\n    }\n  },\n\n  vr: function (event, three) {\n    this.hide = event.active && !event.hmd.fake;\n    this.applyCursor(three);\n  },\n\n  applyCursor: function (three, cursor) {\n    const auto = three.controls ? \"move\" : \"\";\n    cursor = cursor || this.options.cursor || auto;\n    if (this.hide) cursor = \"none\";\n    if (this.cursor != cursor) {\n      this.element.style.cursor = cursor;\n    }\n  },\n});\n","import { Bootstrap } from \"../bootstrap\";\n\nBootstrap.registerPlugin(\"fullscreen\", {\n  defaults: {\n    key: \"f\",\n  },\n\n  listen: [\"ready\", \"update\"],\n\n  install: function (three) {\n    three.Fullscreen = this.api(\n      {\n        active: false,\n        toggle: this.toggle.bind(this),\n      },\n      three\n    );\n  },\n\n  uninstall: function (three) {\n    delete three.Fullscreen;\n  },\n\n  ready: function (event, three) {\n    document.body.addEventListener(\n      \"keypress\",\n      function (event) {\n        if (\n          this.options.key &&\n          event.charCode == this.options.key.charCodeAt(0)\n        ) {\n          this.toggle(three);\n        }\n      }.bind(this)\n    );\n\n    const changeHandler = function () {\n      const active =\n        !!document.fullscreenElement ||\n        !!document.mozFullScreenElement ||\n        !!document.webkitFullscreenElement ||\n        !!document.msFullscreenElement;\n      three.Fullscreen.active = this.active = active;\n      three.trigger({\n        type: \"fullscreen\",\n        active: active,\n      });\n    }.bind(this);\n    document.addEventListener(\"fullscreenchange\", changeHandler, false);\n    document.addEventListener(\"webkitfullscreenchange\", changeHandler, false);\n    document.addEventListener(\"mozfullscreenchange\", changeHandler, false);\n  },\n\n  toggle: function (three) {\n    const canvas = three.canvas;\n    const options =\n      three.VR && three.VR.active ? { vrDisplay: three.VR.hmd } : {};\n\n    if (!this.active) {\n      if (canvas.requestFullScreen) {\n        canvas.requestFullScreen(options);\n      } else if (canvas.msRequestFullScreen) {\n        canvas.msRequestFullscreen(options);\n      } else if (canvas.webkitRequestFullscreen) {\n        canvas.webkitRequestFullscreen(options);\n      } else if (canvas.mozRequestFullScreen) {\n        canvas.mozRequestFullScreen(options); // s vs S\n      }\n    } else {\n      if (document.exitFullscreen) {\n        document.exitFullscreen();\n      } else if (document.msExitFullscreen) {\n        document.msExitFullscreen();\n      } else if (document.webkitExitFullscreen) {\n        document.webkitExitFullscreen();\n      } else if (document.mozCancelFullScreen) {\n        document.mozCancelFullScreen(); // s vs S\n      }\n    }\n  },\n});\n","import { default as Stats } from \"stats.js\";\nimport { Bootstrap } from \"../bootstrap\";\n\nBootstrap.registerPlugin(\"stats\", {\n  listen: [\"pre\", \"post\"],\n\n  install: function (three) {\n    const stats = (this.stats = new Stats());\n    const style = stats.domElement.style;\n\n    style.position = \"absolute\";\n    style.top = style.left = 0;\n    three.element.appendChild(stats.domElement);\n\n    three.stats = stats;\n  },\n\n  uninstall: function (three) {\n    document.body.removeChild(this.stats.domElement);\n\n    delete three.stats;\n  },\n\n  pre: function (_event, _three) {\n    this.stats.begin();\n  },\n\n  post: function (_event, _three) {\n    this.stats.end();\n  },\n});\n","import { Bootstrap } from \"../bootstrap\";\n\nBootstrap.registerPlugin(\"ui\", {\n  defaults: {\n    theme: \"white\",\n    style:\n      \".threestrap-ui { position: absolute; bottom: 5px; right: 5px; float: left; }\" +\n      \".threestrap-ui button { border: 0; background: none;\" +\n      \"  vertical-align: middle; font-weight: bold; } \" +\n      \".threestrap-ui .glyphicon { top: 2px; font-weight: bold; } \" +\n      \"@media (max-width: 640px) { .threestrap-ui button { font-size: 120% } }\" +\n      \".threestrap-white button { color: #fff; text-shadow: 0 1px 1px rgba(0, 0, 0, 1), \" +\n      \"0 1px 3px rgba(0, 0, 0, 1); }\" +\n      \".threestrap-black button { color: #000; text-shadow: 0 0px 1px rgba(255, 255, 255, 1), \" +\n      \"0 0px 2px rgba(255, 255, 255, 1), \" +\n      \"0 0px 2px rgba(255, 255, 255, 1) }\",\n  },\n\n  listen: [\"fullscreen\"],\n\n  markup: function (three, theme, style) {\n    let url =\n      \"//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap-glyphicons.css\";\n    if (location.href.match(/^file:\\/\\//)) url = \"http://\" + url;\n\n    const buttons = [];\n\n    if (three.Fullscreen) {\n      buttons.push(\n        '<button class=\"fullscreen\" title=\"Full Screen\">' +\n          '<span class=\"glyphicon glyphicon-fullscreen\"></span>' +\n          \"</button>\"\n      );\n    }\n    if (three.VR) {\n      buttons.push('<button class=\"vr\" title=\"VR Headset\">VR</button>');\n    }\n\n    return (\n      '<style type=\"text/css\">@import url(\"' +\n      url +\n      '\"); ' +\n      style +\n      \"</style>\" +\n      '<div class=\"threestrap-ui threestrap-' +\n      theme +\n      '\">' +\n      buttons.join(\"\\n\") +\n      \"</div>\"\n    );\n  },\n\n  install: function (three) {\n    const ui = (this.ui = document.createElement(\"div\"));\n    ui.innerHTML = this.markup(three, this.options.theme, this.options.style);\n    document.body.appendChild(ui);\n\n    const fullscreen = (this.ui.fullscreen =\n      ui.querySelector(\"button.fullscreen\"));\n    if (fullscreen) {\n      three.bind([fullscreen, \"click:goFullscreen\"], this);\n    }\n\n    const vr = (this.ui.vr = ui.querySelector(\"button.vr\"));\n    if (vr && three.VR) {\n      three.VR.set({ mode: \"2d\" });\n      three.bind([vr, \"click:goVR\"], this);\n    }\n  },\n\n  fullscreen: function (event, three) {\n    this.ui.style.display = event.active ? \"none\" : \"block\";\n    if (!event.active) three.VR && three.VR.set({ mode: \"2d\" });\n  },\n\n  goFullscreen: function (event, three) {\n    if (three.Fullscreen) {\n      three.Fullscreen.toggle();\n    }\n  },\n\n  goVR: function (event, three) {\n    if (three.VR) {\n      three.VR.set({ mode: \"auto\" });\n      three.Fullscreen.toggle();\n    }\n  },\n\n  uninstall: function (_three) {\n    document.body.removeChild(this.ui);\n  },\n});\n","/**\n * VRRenderer\n *\n * @author wwwtyro https://github.com/wwwtyro\n * @author unconed https://github.com/unconed\n */\nimport { PerspectiveCamera } from \"three/src/cameras/PerspectiveCamera.js\";\nimport { Vector3 } from \"three/src/math/Vector3.js\";\n\nexport class VRRenderer {\n  constructor(renderer, hmd) {\n    this.renderer = renderer;\n\n    this.right = new Vector3();\n    this.cameraLeft = new PerspectiveCamera();\n    this.cameraRight = new PerspectiveCamera();\n\n    const et = hmd.getEyeTranslation(\"left\");\n    this.halfIPD = new Vector3(et.x, et.y, et.z).length();\n    this.fovLeft = hmd.getRecommendedEyeFieldOfView(\"left\");\n    this.fovRight = hmd.getRecommendedEyeFieldOfView(\"right\");\n  }\n\n  FovToNDCScaleOffset(fov) {\n    const pxscale = 2.0 / (fov.leftTan + fov.rightTan);\n    const pxoffset = (fov.leftTan - fov.rightTan) * pxscale * 0.5;\n    const pyscale = 2.0 / (fov.upTan + fov.downTan);\n    const pyoffset = (fov.upTan - fov.downTan) * pyscale * 0.5;\n    return {\n      scale: [pxscale, pyscale],\n      offset: [pxoffset, pyoffset],\n    };\n  }\n\n  FovPortToProjection(\n    matrix,\n    fov,\n    rightHanded /* = true */,\n    zNear /* = 0.01 */,\n    zFar /* = 10000.0 */\n  ) {\n    rightHanded = rightHanded === undefined ? true : rightHanded;\n    zNear = zNear === undefined ? 0.01 : zNear;\n    zFar = zFar === undefined ? 10000.0 : zFar;\n    const handednessScale = rightHanded ? -1.0 : 1.0;\n    const m = matrix.elements;\n    const scaleAndOffset = this.FovToNDCScaleOffset(fov);\n    m[0 * 4 + 0] = scaleAndOffset.scale[0];\n    m[0 * 4 + 1] = 0.0;\n    m[0 * 4 + 2] = scaleAndOffset.offset[0] * handednessScale;\n    m[0 * 4 + 3] = 0.0;\n    m[1 * 4 + 0] = 0.0;\n    m[1 * 4 + 1] = scaleAndOffset.scale[1];\n    m[1 * 4 + 2] = -scaleAndOffset.offset[1] * handednessScale;\n    m[1 * 4 + 3] = 0.0;\n    m[2 * 4 + 0] = 0.0;\n    m[2 * 4 + 1] = 0.0;\n    m[2 * 4 + 2] = (zFar / (zNear - zFar)) * -handednessScale;\n    m[2 * 4 + 3] = (zFar * zNear) / (zNear - zFar);\n    m[3 * 4 + 0] = 0.0;\n    m[3 * 4 + 1] = 0.0;\n    m[3 * 4 + 2] = handednessScale;\n    m[3 * 4 + 3] = 0.0;\n    matrix.transpose();\n  }\n\n  FovToProjection(\n    matrix,\n    fov,\n    rightHanded /* = true */,\n    zNear /* = 0.01 */,\n    zFar /* = 10000.0 */\n  ) {\n    const fovPort = {\n      upTan: Math.tan((fov.upDegrees * Math.PI) / 180.0),\n      downTan: Math.tan((fov.downDegrees * Math.PI) / 180.0),\n      leftTan: Math.tan((fov.leftDegrees * Math.PI) / 180.0),\n      rightTan: Math.tan((fov.rightDegrees * Math.PI) / 180.0),\n    };\n    return this.FovPortToProjection(matrix, fovPort, rightHanded, zNear, zFar);\n  }\n\n  render(scene, camera) {\n    this.FovToProjection(\n      this.cameraLeft.projectionMatrix,\n      this.fovLeft,\n      true,\n      camera.near,\n      camera.far\n    );\n    this.FovToProjection(\n      this.cameraRight.projectionMatrix,\n      this.fovRight,\n      true,\n      camera.near,\n      camera.far\n    );\n\n    this.right.set(this.halfIPD, 0, 0);\n    this.right.applyQuaternion(camera.quaternion);\n\n    this.cameraLeft.position.copy(camera.position).sub(this.right);\n    this.cameraRight.position.copy(camera.position).add(this.right);\n\n    this.cameraLeft.quaternion.copy(camera.quaternion);\n    this.cameraRight.quaternion.copy(camera.quaternion);\n\n    const dpr = this.renderer.devicePixelRatio || 1;\n    const width = this.renderer.domElement.width / 2 / dpr;\n    const height = this.renderer.domElement.height / dpr;\n\n    this.renderer.enableScissorTest(true);\n\n    this.renderer.setViewport(0, 0, width, height);\n    this.renderer.setScissor(0, 0, width, height);\n    this.renderer.render(scene, this.cameraLeft);\n\n    this.renderer.setViewport(width, 0, width, height);\n    this.renderer.setScissor(width, 0, width, height);\n    this.renderer.render(scene, this.cameraRight);\n  }\n}\n","import { Bootstrap } from \"../bootstrap.js\";\nimport { VRRenderer } from \"../renderers/VRRenderer.js\";\n\n/*\nVR sensor / HMD hookup.\n*/\nBootstrap.registerPlugin(\"vr\", {\n  defaults: {\n    mode: \"auto\", // 'auto', '2d'\n    device: null,\n    fov: 80, // emulated FOV for fallback\n  },\n\n  listen: [\"window.load\", \"pre\", \"render\", \"resize\", \"this.change\"],\n\n  install: function (three) {\n    three.VR = this.api(\n      {\n        active: false,\n        devices: [],\n        hmd: null,\n        sensor: null,\n        renderer: null,\n        state: null,\n      },\n      three\n    );\n  },\n\n  uninstall: function (three) {\n    delete three.VR;\n  },\n\n  mocks: function (three, fov, def) {\n    // Fake VR device for cardboard / desktop\n\n    // Interpuppilary distance\n    const ipd = 0.03;\n\n    // Symmetric eye FOVs (Cardboard style)\n    const getEyeTranslation = function (key) {\n      return { left: { x: -ipd, y: 0, z: 0 }, right: { x: ipd, y: 0, z: 0 } }[\n        key\n      ];\n    };\n    const getRecommendedEyeFieldOfView = function (key) {\n      const camera = three.camera;\n      const aspect = (camera && camera.aspect) || 16 / 9;\n      const fov2 = (fov || (camera && camera.fov) || def) / 2;\n      const fovX =\n        (Math.atan((Math.tan((fov2 * Math.PI) / 180) * aspect) / 2) * 180) /\n        Math.PI;\n      const fovY = fov2;\n\n      return {\n        left: {\n          rightDegrees: fovX,\n          leftDegrees: fovX,\n          downDegrees: fovY,\n          upDegrees: fovY,\n        },\n        right: {\n          rightDegrees: fovX,\n          leftDegrees: fovX,\n          downDegrees: fovY,\n          upDegrees: fovY,\n        },\n      }[key];\n    };\n    // Will be replaced with orbit controls or device orientation controls by VRControls\n    const getState = function () {\n      return {};\n    };\n\n    return [\n      {\n        fake: true,\n        force: 1,\n        deviceId: \"emu\",\n        deviceName: \"Emulated\",\n        getEyeTranslation: getEyeTranslation,\n        getRecommendedEyeFieldOfView: getRecommendedEyeFieldOfView,\n      },\n      {\n        force: 2,\n        getState: getState,\n      },\n    ];\n  },\n\n  load: function (event, three) {\n    const callback = function (devs) {\n      this.callback(devs, three);\n    }.bind(this);\n\n    if (navigator.getVRDevices) {\n      navigator.getVRDevices().then(callback);\n    } else if (navigator.mozGetVRDevices) {\n      navigator.mozGetVRDevices(callback);\n    } else {\n      console.warn(\"No native VR support detected.\");\n      callback(this.mocks(three, this.options.fov, this.defaults.fov), three);\n    }\n  },\n\n  callback: function (vrdevs, three) {\n    let hmd, sensor;\n\n    const HMD = window.HMDVRDevice || function () {};\n    const SENSOR = window.PositionSensorVRDevice || function () {};\n\n    // Export list of devices\n    vrdevs = three.VR.devices = vrdevs || three.VR.devices;\n\n    // Get HMD device\n    const deviceId = this.options.device;\n    let dev;\n\n    for (let i = 0; i < vrdevs.length; ++i) {\n      dev = vrdevs[i];\n      if (dev.force == 1 || dev instanceof HMD) {\n        if (deviceId && deviceId != dev.deviceId) continue;\n        hmd = dev;\n        break;\n      }\n    }\n\n    if (hmd) {\n      // Get sensor device\n      let dev;\n      for (let i = 0; i < vrdevs.length; ++i) {\n        dev = vrdevs[i];\n        if (\n          dev.force == 2 ||\n          (dev instanceof SENSOR && dev.hardwareUnitId == hmd.hardwareUnitId)\n        ) {\n          sensor = dev;\n          break;\n        }\n      }\n\n      this.hookup(hmd, sensor, three);\n    }\n  },\n\n  hookup: function (hmd, sensor, three) {\n    if (!VRRenderer) console.log(\"VRRenderer not found\");\n    const klass = VRRenderer || function () {};\n\n    this.renderer = new klass(three.renderer, hmd);\n    this.hmd = hmd;\n    this.sensor = sensor;\n\n    three.VR.renderer = this.renderer;\n    three.VR.hmd = hmd;\n    three.VR.sensor = sensor;\n\n    console.log(\"VRRenderer\", hmd.deviceName);\n  },\n\n  change: function (event, three) {\n    if (event.changes.device) {\n      this.callback(null, three);\n    }\n    this.pre(event, three);\n  },\n\n  pre: function (event, three) {\n    const last = this.active;\n\n    // Global active flag\n    const active = (this.active = this.renderer && this.options.mode != \"2d\");\n    three.VR.active = active;\n\n    // Load sensor state\n    if (active && this.sensor) {\n      const state = this.sensor.getState();\n      three.VR.state = state;\n    } else {\n      three.VR.state = null;\n    }\n\n    // Notify if VR state changed\n    if (last != this.active) {\n      three.trigger({\n        type: \"vr\",\n        active: active,\n        hmd: this.hmd,\n        sensor: this.sensor,\n      });\n    }\n  },\n\n  resize: function (_event, _three) {\n    if (this.active) {\n      // Reinit HMD projection\n      this.renderer.initialize();\n    }\n  },\n\n  render: function (event, three) {\n    if (three.scene && three.camera) {\n      const renderer = this.active ? this.renderer : three.renderer;\n\n      if (this.last != renderer) {\n        if (renderer == three.renderer) {\n          // Cleanup leftover renderer state when swapping back to normal\n          const dpr = renderer.getPixelRatio();\n          const width = renderer.domElement.width / dpr;\n          const height = renderer.domElement.height / dpr;\n          renderer.setScissorTest(false);\n          renderer.setViewport(0, 0, width, height);\n        }\n      }\n\n      this.last = renderer;\n\n      renderer.render(three.scene, three.camera);\n    }\n  },\n});\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining\n * DS104: Avoid inline assignments\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n/*\n Custom attribute model\n - Organizes attributes by trait in .attributes\n - Provides constant-time .props / .get() access to flat dictionary\n - Provides .get(key) with or without trait namespaces\n - Change attributes with .set(key) or .set(dictionary)\n - Validation is double-buffered and in-place to detect changes and nops\n - Change notifications are coalesced per object and per trait, digested later\n - Values are stored in three.js uniform-style objects so they can be bound as GL uniforms\n - Originally passed (unnormalized) values are preserved and can be fetched via .orig()\n - Attributes can be defined as final/const\n - Attributes can be computed from both public or private expressions with .bind(key, false/true)\n - Expressions are time-dependent, can be time-travelled with .evaluate()\n - This enables continous simulation and data logging despite choppy animation updates\n\n  Actual type and trait definitions are injected from Primitives\n*/\n\nexport class Attributes {\n  constructor(definitions, context) {\n    this.context = context;\n    this.traits = definitions.Traits;\n    this.types = definitions.Types;\n    this.pending = [];\n    this.bound = [];\n    this.last = null;\n  }\n\n  make(type) {\n    return {\n      enum: typeof type.enum === \"function\" ? type.enum() : undefined,\n      type: typeof type.uniform === \"function\" ? type.uniform() : undefined, // for three.js\n      value: type.make(),\n    };\n  }\n\n  apply(object, config) {\n    return new Data(object, config, this);\n  }\n\n  bind(callback) {\n    return this.bound.push(callback);\n  }\n  unbind(callback) {\n    return (this.bound = Array.from(this.bound).filter(\n      (cb) => cb !== callback\n    ));\n  }\n\n  queue(callback, object, key, value) {\n    this.lastObject = object;\n    this.lastKey = key;\n    this.lastValue = value;\n    return this.pending.push(callback);\n  }\n\n  invoke(callback) {\n    return callback(this.context.time.clock, this.context.time.step);\n  }\n\n  compute() {\n    if (this.bound.length) {\n      for (const cb of Array.from(this.bound)) {\n        this.invoke(cb);\n      }\n    }\n  }\n\n  digest() {\n    let calls;\n    if (!this.pending.length) {\n      return false;\n    }\n\n    [calls, this.pending] = Array.from([this.pending, []]);\n    for (const callback of Array.from(calls)) {\n      callback();\n    }\n\n    return true;\n  }\n\n  getTrait(name) {\n    return this.traits[name];\n  }\n\n  getLastTrigger() {\n    return `${this.lastObject.toString()} - ${this.lastKey}=\\`${\n      this.lastValue\n    }\\``;\n  }\n}\n\nconst shallowCopy = function (x) {\n  const out = {};\n  for (const k in x) {\n    const v = x[k];\n    out[k] = v;\n  }\n  return out;\n};\n\nclass Data {\n  constructor(object, config, _attributes) {\n    let key, ns, oldComputed, oldExpr, oldOrig, oldProps, spec;\n    let { props } = config;\n    const { traits, finals, freeform } = config;\n    const data = this;\n\n    // Save existing (original) values if re-applying\n    if (\n      object.props != null &&\n      object.expr != null &&\n      object.orig != null &&\n      object.computed != null &&\n      object.attributes != null\n    ) {\n      oldProps = shallowCopy(object.props);\n      oldExpr = shallowCopy(object.expr);\n      oldOrig = object.orig();\n      oldComputed = object.computed();\n\n      // Dispose of old attributes/bindings\n      if (object.attributes != null) {\n        object.attributes.dispose();\n      }\n    }\n\n    // Flattened and original values\n    const flattened = {};\n    const originals = {};\n\n    // Aliases\n    const mapTo = {};\n    const to = (name) => (mapTo[name] != null ? mapTo[name] : name);\n    const define = function (name, alias) {\n      if (mapTo[alias]) {\n        throw new Error(\n          `${object.toString()} - Duplicate property \\`${alias}\\``\n        );\n      }\n      return (mapTo[alias] = name);\n    };\n\n    // Get/set\n    const get = (key) =>\n      (data[key] != null ? data[key].value : undefined) != null\n        ? data[key] != null\n          ? data[key].value\n          : undefined\n        : __guard__(data[to(key)], (x) => x.value);\n    const set = function (key, value, ignore, initial) {\n      let attr;\n      key = to(key);\n\n      // Look for defined attribute\n      if ((attr = data[key]) == null) {\n        if (!freeform) {\n          throw new Error(\n            `${object.toString()} - Setting unknown property \\`${key}={${value}}\\``\n          );\n        }\n\n        // Define attribute on the fly (placeholder)\n        attr = data[key] = {\n          short: key,\n          type: null,\n          last: null,\n          value: null,\n        };\n        validators[key] = (v) => v;\n      }\n\n      if (!ignore) {\n        // See if prop isn't bound\n        if (_expr[key]) {\n          throw new Error(\n            `${object.toString()} - Can't set bound property \\`${key}={${value}}\\``\n          );\n        }\n\n        // See if prop isn't computed\n        if (_computed[key]) {\n          throw new Error(\n            `${object.toString()} - Can't set computed property \\`${key}={${value}}\\``\n          );\n        }\n\n        // See if prop isn't final\n        if (_finals[key]) {\n          throw new Error(\n            `${object.toString()} - Can't set final property \\`${key}={${value}}\\``\n          );\n        }\n      }\n\n      // Validate new value\n      let valid = true;\n      const validated = validate(key, value, attr.last, function () {\n        valid = false;\n        return null;\n      });\n\n      // Accept and insert into flattened/original list\n      if (valid) {\n        [attr.value, attr.last] = Array.from([validated, attr.value]);\n\n        // Remember in flattened dict\n        const { short } = attr;\n        flattened[short] = validated;\n        if (!ignore) {\n          originals[short] = value;\n        } // Remember original unvalidated value\n\n        // Compare to last value unless setting initial value\n        if (!initial && !equals(key, attr.value, attr.last)) {\n          change(key, value);\n        }\n      }\n\n      return valid;\n    };\n\n    const constant = function (key, value, initial) {\n      key = to(key);\n\n      set(key, value, true, initial);\n      return (_finals[key] = true);\n    };\n\n    // Prop/expression binding\n    const expr = {};\n\n    const _bound = {};\n    const _eval = {};\n    const _expr = {};\n    const _computed = {};\n    const _finals = {};\n\n    const bind = function (key, expression, computed) {\n      if (computed == null) {\n        computed = false;\n      }\n      key = to(key);\n\n      if (typeof expression !== \"function\") {\n        throw new Error(\n          `${object.toString()} - Expression \\`${key}=>{${expr}}\\` is not a function`\n        );\n      }\n      if (_expr[key]) {\n        throw new Error(\n          `${object.toString()} - Property \\`${key}=>{${expr}}\\` is already bound`\n        );\n      }\n      if (_computed[key]) {\n        throw new Error(\n          `${object.toString()} - Property \\`${key}\\` is computed`\n        );\n      }\n      if (_finals[key]) {\n        throw new Error(`${object.toString()} - Property \\`${key}\\` is final`);\n      }\n\n      const list = computed ? _computed : _expr;\n      list[key] = expression;\n\n      const short = data[key] != null ? data[key].short : key;\n      if (!computed) {\n        expr[short] = expression;\n      } // flattened\n      _eval[key] = expression;\n\n      expression = expression.bind(object);\n      _bound[key] = function (t, d) {\n        let clock;\n        if (\n          (clock = object.clock != null ? object.clock.getTime() : undefined)\n        ) {\n          t = clock.clock;\n          d = clock.step;\n        }\n\n        return object.set(key, expression(t, d), true);\n      };\n      return _attributes.bind(_bound[key]);\n    };\n\n    const unbind = function (key, computed) {\n      if (computed == null) {\n        computed = false;\n      }\n      key = to(key);\n\n      const list = computed ? _computed : _expr;\n      if (!list[key]) {\n        return;\n      }\n      _attributes.unbind(_bound[key]);\n      delete _bound[key];\n      delete list[key];\n\n      if (data[key] != null) {\n        key = data[key].short;\n      }\n      return delete expr[key];\n    };\n\n    const evaluate = function (key, time) {\n      let left;\n      key = to(key);\n      return (left =\n        typeof _eval[key] === \"function\" ? _eval[key](time, 0) : undefined) !=\n        null\n        ? left\n        : data[key].value;\n    };\n\n    // Public interface\n    object.expr = expr;\n    object.props = flattened;\n\n    object.evaluate = function (key, time) {\n      if (key != null) {\n        return evaluate(key, time);\n      } else {\n        const out = {};\n        for (key in props) {\n          out[key] = evaluate(key, time);\n        }\n        return out;\n      }\n    };\n\n    object.get = function (key) {\n      if (key != null) {\n        return get(key);\n      } else {\n        return flattened;\n      }\n    };\n\n    object.set = function (key, value, ignore, initial) {\n      if (typeof key === \"string\") {\n        set(key, value, ignore, initial);\n      } else {\n        initial = ignore;\n        ignore = value;\n        const options = key;\n        for (key in options) {\n          value = options[key];\n          set(key, value, ignore, initial);\n        }\n      }\n    };\n\n    object.bind = function (key, expr, computed) {\n      if (typeof key === \"string\") {\n        bind(key, expr, computed);\n      } else {\n        computed = expr;\n        const binds = key;\n        for (key in binds) {\n          expr = binds[key];\n          bind(key, expr, computed);\n        }\n      }\n    };\n\n    object.unbind = function (key, computed) {\n      if (typeof key === \"string\") {\n        unbind(key, computed);\n      } else {\n        computed = expr;\n        const binds = key;\n        for (key in binds) {\n          unbind(key, computed);\n        }\n      }\n    };\n\n    object.attribute = function (key) {\n      if (key != null) {\n        return data[to(key)];\n      } else {\n        return data;\n      }\n    };\n    object.orig = function (key) {\n      if (key != null) {\n        return originals[to(key)];\n      } else {\n        return shallowCopy(originals);\n      }\n    };\n    object.computed = function (key) {\n      if (key != null) {\n        return _computed[to(key)];\n      } else {\n        return shallowCopy(_computed);\n      }\n    };\n\n    // Validate value for key\n    const makers = {};\n    const validators = {};\n    const equalors = {};\n\n    const equals = (key, value, target) => equalors[key](value, target);\n    const validate = (key, value, target, invalid) =>\n      validators[key](value, target, invalid);\n\n    object.validate = function (key, value) {\n      let target;\n      key = to(key);\n      const make = makers[key];\n      if (make != null) {\n        target = make();\n      }\n      return (target = validate(key, value, target, function () {\n        throw new Error(\n          `${object.toString()} - Invalid value \\`${key}={${value}}\\``\n        );\n      }));\n    };\n\n    // Accumulate changes\n    let dirty = false;\n    let changes = {};\n    let touches = {};\n    let changed = {};\n    let touched = {};\n    const getNS = (key) => key.split(\".\")[0];\n    const change = function (key, value) {\n      if (!dirty) {\n        dirty = true;\n        _attributes.queue(digest, object, key, value);\n      }\n\n      const trait = getNS(key);\n\n      // Log change\n      changes[key] = true;\n\n      // Mark trait/namespace as dirty\n      return (touches[trait] = true);\n    };\n\n    const event = {\n      type: \"change\",\n      changed: null,\n      touched: null,\n    };\n\n    // Notify listeners of accumulated changes\n    const digest = function () {\n      // Swap double buffered changes objects\n      let k;\n      event.changed = changes;\n      event.touched = touches;\n      changes = changed;\n      touches = touched;\n      ({ changed } = event);\n      ({ touched } = event);\n\n      // Reset all dirty flags\n      dirty = false;\n      for (k in changes) {\n        changes[k] = false;\n      }\n      for (k in touches) {\n        touches[k] = false;\n      }\n\n      event.type = \"change\";\n      object.trigger(event);\n\n      return (() => {\n        const result = [];\n        for (const trait in event.touched) {\n          event.type = `change:${trait}`;\n          result.push(object.trigger(event));\n        }\n        return result;\n      })();\n    };\n\n    // Convert name.trait.key into keyName\n    const shorthand = function (name) {\n      const parts = name.split(/\\./g);\n      const suffix = parts.pop();\n      parts.pop(); // Discard\n      parts.unshift(suffix);\n      return parts.reduce(\n        (a, b) => a + b.charAt(0).toUpperCase() + b.substring(1)\n      );\n    };\n\n    // Define attributes for given trait spec by namespace\n    const addSpec = (name, spec) =>\n      (() => {\n        const result = [];\n        for (let key in spec) {\n          let value;\n          const type = spec[key];\n          key = [name, key].join(\".\");\n          const short = shorthand(key);\n\n          // Make attribute object\n          data[key] = {\n            T: type,\n            ns: name,\n            short,\n            enum: typeof type.enum === \"function\" ? type.enum() : undefined,\n            type:\n              typeof type.uniform === \"function\" ? type.uniform() : undefined,\n            last: type.make(),\n            value: (value = type.make()),\n          };\n\n          // Define flat namespace alias\n          define(key, short);\n          flattened[short] = value;\n\n          // Collect makers, validators and comparators\n          makers[key] = type.make;\n          validators[key] = type.validate != null ? type.validate : (a) => a;\n          result.push(\n            (equalors[key] =\n              type.equals != null ? type.equals : (a, b) => a === b)\n          );\n        }\n        return result;\n      })();\n\n    // Add in traits\n    const list = [];\n    for (let trait of Array.from(traits)) {\n      [trait, ns] = Array.from(trait.split(\":\"));\n      const name = ns ? [ns, trait].join(\".\") : trait;\n      spec = _attributes.getTrait(trait);\n      list.push(trait);\n\n      if (spec != null) {\n        addSpec(name, spec);\n      }\n    }\n\n    // Add custom props by namespace\n    if (props != null) {\n      for (ns in props) {\n        spec = props[ns];\n        addSpec(ns, spec);\n      }\n    }\n\n    // Store array of traits\n    const unique = list.filter((object, i) => list.indexOf(object) === i);\n    object.traits = unique;\n\n    // Set previous internal values\n    if (oldProps != null) {\n      object.set(oldProps, true, true);\n    }\n\n    // Set final props\n    if (finals != null) {\n      for (key in finals) {\n        const value = finals[key];\n        constant(key, value, true);\n      }\n    }\n\n    // Set previous external values\n    if (oldOrig != null) {\n      object.set(oldOrig, false, true);\n    }\n\n    // Bind previous computed props/expressions\n    if (oldComputed != null) {\n      object.bind(oldComputed, true);\n    }\n    if (oldExpr != null) {\n      object.bind(oldExpr, false);\n    }\n\n    // Destructor\n    this.dispose = function () {\n      for (key in _computed) {\n        unbind(key, true);\n      }\n      for (key in _expr) {\n        unbind(key, false);\n      }\n      props = {};\n      delete object.attributes;\n      delete object.get;\n      return delete object.set;\n    };\n\n    null;\n  }\n}\n\nfunction __guard__(value, transform) {\n  return typeof value !== \"undefined\" && value !== null\n    ? transform(value)\n    : undefined;\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nconst NUMBER_PRECISION = 5;\nconst NUMBER_THRESHOLD = 0.0001;\n\nconst checkFactor = (v, f) =>\n  Math.abs(v / f - Math.round(v / f)) < NUMBER_THRESHOLD;\nconst checkUnit = (v) => checkFactor(v, 1);\n\nconst formatMultiple = function (v, f, k, compact) {\n  const d = Math.round(v / f);\n  if (d === 1) {\n    return `${k}`;\n  }\n  if (d === -1) {\n    return `-${k}`;\n  }\n  if (k === \"1\") {\n    return `${d}`;\n  }\n  if (compact) {\n    return `${d}${k}`;\n  } else {\n    return `${d}*${k}`;\n  }\n};\n\nconst formatFraction = function (v, f, k, compact) {\n  let d = Math.round(v * f);\n  if (Math.abs(d) === 1) {\n    d = d < 0 ? \"-\" : \"\";\n    d += k;\n  } else if (k !== \"1\") {\n    d += compact ? `${k}` : `*${k}`;\n  }\n\n  return `${d}/${f}`;\n};\n\nconst formatFactors = [\n  { 1: 1 },\n  { 1: 1, τ: Math.PI * 2 },\n  { 1: 1, π: Math.PI },\n  { 1: 1, τ: Math.PI * 2, π: Math.PI },\n  { 1: 1, e: Math.E },\n  { 1: 1, τ: Math.PI * 2, e: Math.E },\n  { 1: 1, π: Math.PI, e: Math.E },\n  { 1: 1, τ: Math.PI * 2, π: Math.PI, e: Math.E },\n];\nconst formatPrimes = [\n  // denominators 1-30 + interesting multiples\n  [2 * 2 * 3 * 5 * 7, [2, 3, 5, 7]], // 1-7\n  [2 * 2 * 2 * 3 * 3 * 5 * 5 * 7 * 7, [2, 3, 5, 7]], // 8-11\n  [2 * 2 * 3 * 5 * 7 * 11 * 13, [2, 3, 5, 7, 11, 13]], // 12-16\n  [2 * 2 * 17 * 19 * 23 * 29, [2, 17, 19, 23, 29]], // 17-30\n  [256 * 256, [2]], // Powers of 2\n  [1000000, [2, 5]], // Powers of 10\n];\n\nconst prettyNumber = function (options) {\n  let cache, compact, e, pi, tau;\n  if (options) {\n    ({ cache, compact, tau, pi, e } = options);\n  }\n\n  compact = +!!(compact != null ? compact : true);\n  tau = +!!(tau != null ? tau : true);\n  pi = +!!(pi != null ? pi : true);\n  e = +!!(e != null ? e : true);\n  cache = +!!(cache != null ? cache : true);\n\n  const formatIndex = tau + pi * 2 + e * 4;\n\n  const numberCache = cache ? {} : null;\n\n  return function (v) {\n    if (numberCache != null) {\n      let cached;\n      if ((cached = numberCache[v]) != null) {\n        return cached;\n      }\n      if (v === Math.round(v)) {\n        return (numberCache[v] = `${v}`);\n      }\n    }\n\n    let out = `${v}`;\n    let best = out.length + out.indexOf(\".\") + 2;\n    const match = function (x) {\n      const d = x.length;\n      if (d <= best) {\n        out = `${x}`;\n        return (best = d);\n      }\n    };\n\n    for (const k in formatFactors[formatIndex]) {\n      const f = formatFactors[formatIndex][k];\n      if (checkUnit(v / f)) {\n        match(`${formatMultiple(v / f, 1, k, compact)}`);\n      } else {\n        // eslint-disable-next-line prefer-const\n        for (let [denom, list] of Array.from(formatPrimes)) {\n          let numer = (v / f) * denom;\n          if (checkUnit(numer)) {\n            for (const p of Array.from(list)) {\n              let d, n;\n              while (checkUnit((n = numer / p)) && checkUnit((d = denom / p))) {\n                numer = n;\n                denom = d;\n              }\n            }\n\n            match(`${formatFraction(v / f, denom, k, compact)}`);\n            break;\n          }\n        }\n      }\n    }\n\n    if (`${v}`.length > NUMBER_PRECISION) {\n      match(`${v.toPrecision(NUMBER_PRECISION)}`);\n    }\n\n    if (numberCache != null) {\n      numberCache[v] = out;\n    }\n\n    return out;\n  };\n};\n\nconst prettyPrint = function (markup, level) {\n  if (level == null) {\n    level = \"info\";\n  }\n  markup = prettyMarkup(markup);\n  return console[level].apply(console, markup);\n};\n\nconst prettyMarkup = function (markup) {\n  // quick n dirty\n\n  const tag = \"color:rgb(128,0,128)\";\n  const attr = \"color:rgb(144,64,0)\";\n  const str = \"color:rgb(0,0,192)\";\n  const obj = \"color:rgb(0,70,156)\";\n  const txt = \"color:inherit\";\n\n  let quoted = false;\n  let nested = 0;\n\n  const args = [];\n  markup = markup.replace(\n    /(\\\\[<={}> \"'])|(=>|[<={}> \"'])/g,\n    function (_, escape, char) {\n      if (escape != null ? escape.length : undefined) {\n        return escape;\n      }\n      if (quoted && !['\"', \"'\"].includes(char)) {\n        return char;\n      }\n      if (nested && !['\"', \"'\", \"{\", \"}\"].includes(char)) {\n        return char;\n      }\n\n      return (() => {\n        switch (char) {\n          case \"<\":\n            args.push(tag);\n            return \"%c<\";\n          case \">\":\n            args.push(tag);\n            args.push(txt);\n            return \"%c>%c\";\n          case \" \":\n            args.push(attr);\n            return \" %c\";\n          case \"=\":\n          case \"=>\":\n            args.push(tag);\n            return `%c${char}`;\n          case '\"':\n          case \"'\":\n            quoted = !quoted;\n            if (quoted) {\n              args.push(nested ? attr : str);\n              return `${char}%c`;\n            } else {\n              args.push(nested ? obj : tag);\n              return `%c${char}`;\n            }\n          case \"{\":\n            if (nested++ === 0) {\n              args.push(obj);\n              return `%c${char}`;\n            } else {\n              return char;\n            }\n          case \"}\":\n            if (--nested === 0) {\n              args.push(tag);\n              return `${char}%c`;\n            } else {\n              return char;\n            }\n          default:\n            return char;\n        }\n      })();\n    }\n  );\n\n  return [markup].concat(args);\n};\n\nconst prettyJSXProp = (k, v) => prettyJSXPair(k, v, \"=\");\nconst prettyJSXBind = (k, v) => prettyJSXPair(k, v, \"=>\");\n\nconst prettyJSXPair = (function () {\n  const formatNumber = prettyNumber({ compact: false });\n\n  return function (k, v, op) {\n    const key = function (k) {\n      if (k === \"\" + +k || k.match(/^[A-Za-z_][A-Za-z0-9]*$/)) {\n        return k;\n      } else {\n        return JSON.stringify(k);\n      }\n    };\n    const wrap = function (v) {\n      if (v.match('\\n*\"')) {\n        return v;\n      } else {\n        return `{${v}}`;\n      }\n    };\n    const value = function (v) {\n      if (v instanceof Array) {\n        return `[${v.map(value).join(\", \")}]`;\n      }\n\n      switch (typeof v) {\n        case \"string\":\n          if (v.match(\"\\n\")) {\n            return `\"\\n${v}\"\\n`;\n          } else {\n            return `\"${v}\"`;\n          }\n        case \"function\":\n          v = `${v}`;\n          if (v.match(\"\\n\")) {\n            `\\n${v}\\n`;\n          } else {\n            `${v}`;\n          }\n          v = v.replace(/^function (\\([^)]+\\))/, \"$1 =>\");\n          return (v = v.replace(\n            /^(\\([^)]+\\)) =>\\s*{\\s*return\\s*([^}]+)\\s*;\\s*}/,\n            \"$1 => $2\"\n          ));\n        case \"number\":\n          return formatNumber(v);\n        default:\n          if (v != null && v !== !!v) {\n            if (v._up != null) {\n              return value(v.map((v) => v));\n            }\n            if (v.toMarkup) {\n              return v.toString();\n            } else {\n              return (\n                \"{\" +\n                (() => {\n                  const result = [];\n                  for (const kk in v) {\n                    const vv = v[kk];\n                    if (Object.prototype.hasOwnProperty.call(v, kk)) {\n                      result.push(`${key(kk)}: ${value(vv)}`);\n                    }\n                  }\n                  return result;\n                })().join(\", \") +\n                \"}\"\n              );\n            }\n          } else {\n            return `${JSON.stringify(v)}`;\n          }\n      }\n    };\n\n    return [k, op, wrap(value(v))].join(\"\");\n  };\n})();\n\nconst escapeHTML = function (str) {\n  str = str.replace(/&/g, \"&amp;\");\n  str = str.replace(/</g, \"&lt;\");\n  return (str = str.replace(/\"/g, \"&quot;\"));\n};\n\nconst prettyFormat = function (str) {\n  const args = [].slice.call(arguments);\n  args.shift();\n\n  let out = \"<span>\";\n\n  str = escapeHTML(str);\n\n  // eslint-disable-next-line no-unused-vars\n  for (const _arg of Array.from(args)) {\n    str = str.replace(/%([a-z])/, function (_, f) {\n      const v = args.shift();\n      switch (f) {\n        case \"c\":\n          return `</span><span style=\"${escapeHTML(v)}\">`;\n        default:\n          return escapeHTML(v);\n      }\n    });\n  }\n\n  out += str;\n  return (out += \"</span>\");\n};\n\nexport const JSX = { prop: prettyJSXProp, bind: prettyJSXBind };\n\nexport {\n  prettyMarkup as markup,\n  prettyNumber as number,\n  prettyPrint as print,\n  prettyFormat as format,\n};\n\n/*\nfor x in [1, 2, 1/2, 3, 1/3, Math.PI, Math.PI / 2, Math.PI * 2, Math.PI * 3, Math.PI * 4, Math.PI * 3 / 4, Math.E * 100, Math.E / 100]\n  console.log prettyNumber({})(x)\n*/\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as Pretty from \"../util/pretty.js\";\nimport { Binder } from \"threestrap/src/binder.js\";\n\nlet nodeIndex = 0;\n\nexport class Node {\n  constructor(type, defaults, options, binds, config, attributes) {\n    this.type = type;\n    this._id = (++nodeIndex).toString();\n\n    this.configure(config, attributes);\n    this.parent = this.root = this.path = this.index = null;\n\n    this.set(defaults, true, true);\n    this.set(options, false, true);\n    this.bind(binds, false);\n  }\n\n  configure(config, attributes) {\n    let { traits, props, finals, freeform } = config;\n    if (traits == null) {\n      traits =\n        (this._config != null ? this._config.traits : undefined) != null\n          ? this._config != null\n            ? this._config.traits\n            : undefined\n          : [];\n    }\n    if (props == null) {\n      props =\n        (this._config != null ? this._config.props : undefined) != null\n          ? this._config != null\n            ? this._config.props\n            : undefined\n          : {};\n    }\n    if (finals == null) {\n      finals =\n        (this._config != null ? this._config.finals : undefined) != null\n          ? this._config != null\n            ? this._config.finals\n            : undefined\n          : {};\n    }\n    if (freeform == null) {\n      freeform =\n        (this._config != null ? this._config.freeform : undefined) != null\n          ? this._config != null\n            ? this._config.freeform\n            : undefined\n          : false;\n    }\n\n    this._config = { traits, props, finals, freeform };\n    return (this.attributes = attributes.apply(this, this._config));\n  }\n\n  dispose() {\n    this.attributes.dispose();\n    return (this.attributes = null);\n  }\n\n  // Add/removal callback\n  _added(parent) {\n    this.parent = parent;\n    this.root = parent.root;\n\n    // Notify root listeners of child addition\n    const event = {\n      type: \"add\",\n      node: this,\n      parent: this.parent,\n    };\n    if (this.root) {\n      this.root.trigger(event);\n    }\n\n    // Notify self listeners of own addition\n    event.type = \"added\";\n    return this.trigger(event);\n  }\n\n  _removed() {\n    // Notify root listeners of child removal\n    const event = {\n      type: \"remove\",\n      node: this,\n    };\n    if (this.root) {\n      this.root.trigger(event);\n    }\n\n    // Notify self listeners of own removal\n    event.type = \"removed\";\n    this.trigger(event);\n\n    return (this.root = this.parent = null);\n  }\n\n  // Assign unique indices to nodes to make paths\n  _index(index, parent) {\n    let path;\n    if (parent == null) {\n      ({ parent } = this);\n    }\n    this.index = index;\n    this.path = path =\n      index != null\n        ? ((parent != null ? parent.path : undefined) != null\n            ? parent != null\n              ? parent.path\n              : undefined\n            : []\n          ).concat([index])\n        : null;\n    this.order = path != null ? this._encode(path) : Infinity;\n    if (this.root != null) {\n      return this.trigger({ type: \"reindex\" });\n    }\n  }\n\n  // Asymptotic arithmetic encoding\n  // Computes invariant node order from path of indices\n  // Goes from 1 at the root [0] of the tree, to 0 at [∞] (best for FP precision).\n  // Divides the interval into countably infinite many intervals, nested recursively.\n  //\n  // (loses precision eventually, it's used cos three.js needs a single numerical order)\n  _encode(path) {\n    // Tune precision between deep and narrow (1) vs shallow and wide (n)\n    const k = 3;\n\n    const map = (x) => k / (x + k);\n    const lerp = (t) => b + (a - b) * t;\n\n    let a = 1 + 1 / k;\n    let b = 0;\n    for (const index of Array.from(path)) {\n      const f = map(index + 1);\n      const g = map(index + 2);\n      [a, b] = Array.from([lerp(f), lerp(g)]);\n    }\n    return a;\n  }\n\n  toString() {\n    const _id = this.id != null ? this.id : this._id;\n\n    const tag = this.type != null ? this.type : \"node\";\n    let id = tag;\n    id += `#${_id}`;\n    if (this.classes != null ? this.classes.length : undefined) {\n      id += `.${this.classes.join(\".\")}`;\n    }\n\n    if (this.children != null) {\n      let count;\n      if ((count = this.children.length)) {\n        return `<${id}>…(${count})…</${tag}>`;\n      } else {\n        return `<${id}></${tag}>`;\n      }\n    } else {\n      return `<${id} />`;\n    }\n  }\n\n  toMarkup(selector = null, indent) {\n    let k, v;\n    if (indent == null) {\n      indent = \"\";\n    }\n    if (selector && typeof selector !== \"function\") {\n      let left;\n      selector =\n        (left =\n          this.root != null ? this.root.model._matcher(selector) : undefined) !=\n        null\n          ? left\n          : () => true;\n    }\n\n    const tag = this.type != null ? this.type : \"node\";\n    let { expr } = this;\n\n    // Ensure generated ID goes first\n    const orig = { id: this._id };\n    const object = typeof this.orig === \"function\" ? this.orig() : undefined;\n    for (k in object) {\n      v = object[k];\n      orig[k] = v;\n    }\n\n    const props = (() => {\n      const result = [];\n      for (k in orig) {\n        v = orig[k];\n        if (!this.expr[k]) {\n          result.push(Pretty.JSX.prop(k, v));\n        }\n      }\n      return result;\n    })();\n    expr = (() => {\n      const result1 = [];\n      for (k in expr) {\n        v = expr[k];\n        result1.push(Pretty.JSX.bind(k, v));\n      }\n      return result1;\n    })();\n\n    let attr = [\"\"];\n    if (props.length) {\n      attr = attr.concat(props);\n    }\n    if (expr.length) {\n      attr = attr.concat(expr);\n    }\n    attr = attr.join(\" \");\n\n    let child = indent;\n    const recurse = () => {\n      if (!(this.children != null ? this.children.length : undefined)) {\n        return \"\";\n      }\n      return this.children\n        .map((x) => x.toMarkup(selector, child))\n        .filter((x) => x != null && x.length)\n        .join(\"\\n\");\n    };\n\n    if (selector && !selector(this)) {\n      return recurse();\n    }\n\n    if (this.children != null) {\n      const open = `<${tag}${attr}>`;\n      const close = `</${tag}>`;\n\n      child = indent + \"  \";\n      let children = recurse();\n      if (children.length) {\n        children = \"\\n\" + children + \"\\n\" + indent;\n      }\n      if (children == null) {\n        children = \"\";\n      }\n\n      return indent + open + children + close;\n    } else {\n      return `${indent}<${tag}${attr} />`;\n    }\n  }\n\n  print(selector, level) {\n    return Pretty.print(this.toMarkup(selector), level);\n  }\n}\n\nBinder.apply(Node.prototype);\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Node } from \"./node.js\";\n\nexport class Group extends Node {\n  constructor(type, defaults, options, binds, config, attributes) {\n    super(type, defaults, options, binds, config, attributes);\n\n    this.children = [];\n    this.on(\"reindex\", (event) =>\n      Array.from(this.children).map((child) => child.trigger(event))\n    );\n  }\n\n  add(node) {\n    if (node.parent != null) {\n      node.parent.remove(node);\n    }\n\n    node._index(this.children.length, this);\n    this.children.push(node);\n    return node._added(this);\n  }\n\n  remove(node) {\n    if (node.children != null ? node.children.length : undefined) {\n      node.empty();\n    }\n\n    const index = this.children.indexOf(node);\n    if (index === -1) {\n      return;\n    }\n\n    this.children.splice(index, 1);\n    node._index(null);\n    node._removed(this);\n\n    for (let i = 0; i < this.children.length; i++) {\n      node = this.children[i];\n      if (i >= index) {\n        node._index(i);\n      }\n    }\n  }\n\n  empty() {\n    const children = this.children.slice().reverse();\n    for (const node of Array.from(children)) {\n      this.remove(node);\n    }\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nexport class Guard {\n  constructor(limit) {\n    if (limit == null) {\n      limit = 10;\n    }\n    this.limit = limit;\n  }\n  iterate(options) {\n    const { step, last } = options;\n\n    let { limit } = this;\n    while (step()) {\n      if (!--limit) {\n        console.warn(\n          \"Last iteration\",\n          typeof last === \"function\" ? last() : undefined\n        );\n        throw new Error(\"Exceeded iteration limit.\");\n      }\n    }\n    return null;\n  }\n}\n","/**\n * This file contains an *adapter* for css-select. css-select is a CSS selection\n * engine for HTML that can be used with other data structures (XML, etc) via\n * adapters. Here we define an adapter for MathBox's vdom.\n *\n * The adapter interface is described here:\n *    https://github.com/fb55/css-select/blob/1aa44bdd64aaf2ebdfd7f338e2e76bed36521957/src/types.ts#L6-L96\n *\n * Nodes vs Elements:\n * In general, CSS Selectors act on a document tree built from nodes, which can\n * include element nodes and non-element nodes. For example, in HTML, tags are\n * element nodes but lines of text are non-element node. Non-element text nodes\n * can influence css selection, e.g., via :first-line pseudoclass, but these\n * non-element nodes are never returned by selectors.\n *\n * Mathbox only has element nodes.\n */\n\n/**\n * Is this node an element node? Yes. Mathbox only has element nodes.\n */\nfunction isTag(_elem) {\n  return true;\n}\n\nfunction getChildren(elem) {\n  return elem.children || [];\n}\n\nfunction getParent(elem) {\n  return elem.parent;\n}\n\n/**\n * Takes an array of nodes, and removes any duplicates, as well as any\n * nodes whose ancestors are also in the array.\n */\nfunction removeSubsets(nodes) {\n  const deduped = new Set(nodes);\n\n  deduped.forEach((node) => {\n    let ancestor = node.parent;\n    while (ancestor) {\n      if (deduped.has(ancestor)) {\n        deduped.delete(node);\n        return;\n      }\n      ancestor = ancestor.parent;\n    }\n  });\n\n  return Array.from(deduped);\n}\n\nconst adapter = {\n  isTag,\n  /**\n   * Does at least one of passed element nodes pass the test predicate?\n   */\n  existsOne(test, elems) {\n    return elems.some((elem) =>\n      isTag(elem)\n        ? test(elem) || adapter.existsOne(test, getChildren(elem))\n        : false\n    );\n  },\n  /**\n   * Get the siblings of the node. Note that unlike jQuery's `siblings` method,\n   * this is expected to include the current node as well\n   */\n  getSiblings(elem) {\n    const parent = getParent(elem);\n    return parent ? getChildren(parent) : [elem];\n  },\n  getChildren,\n  getParent,\n  getAttributeValue(elem, name) {\n    if (name === \"class\") return elem.props.classes.join(\" \");\n    if (name === \"id\") return elem.id;\n    return \"\";\n  },\n  hasAttrib(elem, name) {\n    if (name === \"id\") return !!elem.id;\n    if (name === \"class\") return elem.props.classes.length > 0;\n    if (!elem.traits.hash) return false;\n    return Object.prototype.hasOwnProperty.call(elem.traits.hash, name);\n  },\n  removeSubsets,\n  getName(elem) {\n    return elem.type ?? \"\";\n  },\n  /**\n   * Finds the first node in the array that matches the test predicate, or one\n   * of its children.\n   */\n  findOne: function findOne(test, elems) {\n    for (const node of elems) {\n      if (test(node)) {\n        return node;\n      } else {\n        const match = findOne(test, getChildren(node));\n        if (match) return match;\n      }\n    }\n\n    return null;\n  },\n  findAll: function findAll(test, elems) {\n    const result = [];\n    for (const elem of elems) {\n      if (!isTag(elem)) continue;\n      if (test(elem)) {\n        result.push(elem);\n      }\n      result.push(...findAll(test, getChildren(elem)));\n    }\n    return result;\n  },\n  getText: function getText(_elem) {\n    return \"\";\n  },\n};\n\nexport default adapter;\n","import * as CSSselect from \"css-select\";\nimport adapter from \"./css-select-adapter.js\";\n\n/**\n * Returns a filtered array of elements which are contained in context.\n */\nconst filter = (nodes, context) => {\n  const out = [];\n  const contextNodes = Array.isArray(context) ? context : [context];\n  const contextSet = new Set(contextNodes);\n  for (const node of Array.from(nodes)) {\n    let ancestor = node;\n    while (ancestor != null) {\n      if (contextSet.has(ancestor)) {\n        out.push(node);\n        break;\n      }\n      ancestor = adapter.getParent(ancestor);\n    }\n  }\n  return out;\n};\n\nconst getRoot = (element) => {\n  let ancestor = element;\n  while (adapter.getParent(ancestor) !== null) {\n    ancestor = adapter.getParent(ancestor);\n  }\n  return ancestor;\n};\n\n/**\n * Finds elements in the given context matching the given css-selector.\n *\n * Does NOT throw if css query is invalid.\n *\n * @param {string} query A css selector\n * @param {*} context Element or array of elements\n * @returns All elements in context matching query\n */\nexport const selectAll = (query, context) => {\n  try {\n    /**\n     * Try/catch to tolerate invalid css queries.\n     * See https://gitgud.io/unconed/mathbox/-/issues/23\n     */\n    CSSselect.compile(query);\n  } catch (err) {\n    return [];\n  }\n\n  /**\n   * Delegate to css-select, except always make queries relative to root and\n   * filter matches outside of context ourselves. css-select does not currently\n   * handle contextualized queries relative to root correctly.\n   *\n   * See https://github.com/fb55/css-select/issues/709\n   */\n\n  const isArray = Array.isArray(context);\n  if (isArray && context.length === 0) return [];\n  const root = getRoot(isArray ? context[0] : context);\n  const matches = CSSselect.selectAll(query, root, { adapter });\n  if (context) return filter(matches, context);\n  return matches;\n};\n\nexport const compile = (query) => {\n  try {\n    /**\n     * Try/catch to tolerate invalid css queries.\n     * See https://gitgud.io/unconed/mathbox/-/issues/23\n     */\n    return CSSselect.compile(query, { adapter });\n  } catch (err) {\n    return () => false;\n  }\n};\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { compile, selectAll } from \"./css-select-adapted\";\nconst AUTO = /^<([0-9]+|<*)$/;\n\n/*\n  Model that wraps a root node and its children.\n\n  Monitors adds, removals and ID/class changes.\n  Enables CSS selectors, both querying and watching.\n\n  Watchers are primed differentially as changes come in,\n  and fired with digest().\n*/\nexport class Model {\n  constructor(root) {\n    this.root = root;\n    this.root.model = this;\n    this.root.root = this.root;\n\n    this.ids = {};\n    this.classes = {};\n    this.traits = {};\n    this.types = {};\n    this.nodes = [];\n    this.watchers = [];\n    this.fire = false;\n\n    this.lastNode = null;\n\n    this.event = { type: \"update\" };\n\n    // Triggered by child addition/removal\n    const add = (event) => adopt(event.node);\n    const remove = (event) => dispose(event.node);\n\n    this.root.on(\"add\", add);\n    this.root.on(\"remove\", remove);\n\n    // Track node lifecycle\n    const adopt = (node) => {\n      addNode(node);\n      addType(node);\n      addTraits(node);\n\n      node.on(\"change:node\", update);\n      update(null, node, true);\n      return force(node);\n    };\n\n    const dispose = (node) => {\n      removeNode(node);\n      removeType(node);\n      removeTraits(node);\n      removeID(node.id, node);\n      removeClasses(node.classes, node);\n\n      node.off(\"change:node\", update);\n      return force(node);\n    };\n\n    // Watcher cycle for catching changes in id/classes\n    const prime = (node) => {\n      for (const watcher of Array.from(this.watchers)) {\n        watcher.match = watcher.matcher(node);\n      }\n      return null;\n    };\n\n    const check = (node) => {\n      for (const watcher of Array.from(this.watchers)) {\n        const fire =\n          watcher.fire ||\n          (watcher.fire = watcher.match !== watcher.matcher(node));\n        if (fire) {\n          this.lastNode = node;\n        }\n        if (!this.fire) {\n          this.fire = fire;\n        }\n      }\n      return null;\n    };\n\n    const force = (node) => {\n      for (const watcher of Array.from(this.watchers)) {\n        const fire = watcher.fire || (watcher.fire = watcher.matcher(node));\n        if (fire) {\n          this.lastNode = node;\n        }\n        if (!this.fire) {\n          this.fire = fire;\n        }\n      }\n      return null;\n    };\n\n    this.digest = () => {\n      if (!this.fire) {\n        return false;\n      }\n      for (const watcher of Array.from(this.watchers.slice())) {\n        if (watcher.fire) {\n          watcher.fire = false;\n          watcher.handler();\n        }\n      }\n      this.fire = false;\n      return true;\n    };\n\n    // Track id/class changes\n    const update = (event, node, init) => {\n      const _id = init || event.changed[\"node.id\"];\n      const _klass = init || event.changed[\"node.classes\"];\n      let primed = false;\n\n      if (_id) {\n        const id = node.get(\"node.id\");\n        if (id !== node.id) {\n          if (!init) {\n            prime(node);\n          }\n          primed = true;\n\n          if (node.id != null) {\n            removeID(node.id, node);\n          }\n          addID(id, node);\n        }\n      }\n\n      if (_klass) {\n        let left;\n        let classes = (left = node.get(\"node.classes\")) != null ? left : [];\n        const klass = classes.join(\",\");\n        if (klass !== (node.classes != null ? node.classes.klass : undefined)) {\n          classes = classes.slice();\n\n          if (!init && !primed) {\n            prime(node);\n          }\n          primed = true;\n\n          if (node.classes != null) {\n            removeClasses(node.classes, node);\n          }\n          addClasses(classes, node);\n\n          node.classes = classes;\n          node.classes.klass = klass;\n        }\n      }\n\n      if (!init && primed) {\n        check(node);\n      }\n      return null;\n    };\n\n    // Manage lookup tables for types/classes/traits\n    const addTags = function (sets, tags, node) {\n      if (tags == null) {\n        return;\n      }\n      for (const k of Array.from(tags)) {\n        const list = sets[k] != null ? sets[k] : [];\n        list.push(node);\n        sets[k] = list;\n      }\n      return null;\n    };\n\n    const removeTags = function (sets, tags, node) {\n      if (tags == null) {\n        return;\n      }\n      for (const k of Array.from(tags)) {\n        const list = sets[k];\n        const index = list.indexOf(node);\n        if (index >= 0) {\n          list.splice(index, 1);\n        }\n        if (list.length === 0) {\n          delete sets[k];\n        }\n      }\n      return null;\n    };\n\n    // Build a hash for an array of tags for quick lookups\n    const hashTags = function (array) {\n      if (!(array.length > 0)) {\n        return;\n      }\n      const hash = (array.hash = {});\n      return Array.from(array).map((klass) => (hash[klass] = true));\n    };\n\n    const unhashTags = (array) => delete array.hash;\n\n    // Track IDs (live)\n    const addID = (id, node) => {\n      if (this.ids[id]) {\n        throw new Error(`Duplicate node id \\`${id}\\``);\n      }\n\n      if (id != null) {\n        this.ids[id] = [node];\n      }\n      return (node.id = id != null ? id : node._id);\n    };\n\n    const removeID = (id, node) => {\n      if (id != null) {\n        delete this.ids[id];\n      }\n      return (node.id = node._id);\n    };\n\n    // Track classes (live)\n    const addClasses = (classes, node) => {\n      addTags(this.classes, classes, node);\n      if (classes != null) {\n        return hashTags(classes);\n      }\n    };\n\n    const removeClasses = (classes, node) => {\n      removeTags(this.classes, classes, node);\n      if (classes != null) {\n        return unhashTags(classes);\n      }\n    };\n\n    // Track nodes\n    const addNode = (node) => this.nodes.push(node);\n    const removeNode = (node) => this.nodes.splice(this.nodes.indexOf(node), 1);\n\n    // Track nodes by type\n    const addType = (node) => addTags(this.types, [node.type], node);\n    const removeType = (node) => removeTags(this.types, [node.type], node);\n\n    // Track nodes by trait\n    const addTraits = (node) => {\n      addTags(this.traits, node.traits, node);\n      return hashTags(node.traits);\n    };\n\n    const removeTraits = (node) => {\n      removeTags(this.traits, node.traits, node);\n      return unhashTags(node.traits);\n    };\n\n    adopt(this.root);\n    this.root.trigger({ type: \"added\" });\n  }\n\n  select(query, context) {\n    return selectAll(query, context || this.getRoot());\n  }\n\n  // Watch selector with handler\n  watch(selector, handler) {\n    let watcher;\n    handler.unwatch = () => this.unwatch(handler);\n    handler.watcher = watcher = {\n      selector,\n      handler,\n      matcher: this._matcher(selector),\n      match: false,\n      fire: false,\n    };\n    this.watchers.push(watcher);\n    return this.select(selector);\n  }\n\n  // Unwatch a handler\n  unwatch(handler) {\n    const { watcher } = handler;\n    if (watcher == null) {\n      return;\n    }\n\n    this.watchers.splice(this.watchers.indexOf(watcher), 1);\n    delete handler.unwatch;\n    return delete handler.watcher;\n  }\n\n  // Make a matcher for a single selector\n  _matcher(query) {\n    if (AUTO.test(query)) {\n      throw new Error(\"Auto-link matcher unsupported\");\n    }\n    return compile(query);\n  }\n\n  getRoot() {\n    return this.root;\n  }\n\n  getLastTrigger() {\n    return this.lastNode.toString();\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nexport class OverlayFactory {\n  constructor(classes, canvas) {\n    this.classes = classes;\n    this.canvas = canvas;\n    const div = document.createElement(\"div\");\n    div.classList.add(\"mathbox-overlays\");\n    this.div = div;\n  }\n\n  inject() {\n    const element = this.canvas.parentNode;\n    if (!element) {\n      throw new Error(\"Canvas not inserted into document.\");\n    }\n    return element.insertBefore(this.div, this.canvas);\n  }\n\n  unject() {\n    const element = this.div.parentNode;\n    return element.removeChild(this.div);\n  }\n\n  getTypes() {\n    return Object.keys(this.classes);\n  }\n\n  make(type, options) {\n    return new this.classes[type](this.div, options);\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n// Quick'n'dirty Virtual DOM diffing\n// with a poor man's React for components\n//\n// This is for rendering HTML with data from a GL readback. See DOM examples.\nconst HEAP = [];\nlet id = 0;\n\n// Static render components\nexport const Types = {\n  /*\n  * el('example', props, children);\n  example: MathBox.DOM.createClass({\n    render: (el, props, children) ->\n      * VDOM node\n      return el('span', { className: \"foo\" }, \"Hello World\")\n  })\n  */\n};\n\nconst descriptor = () => ({\n  id: id++,\n  type: null,\n  props: null,\n  children: null,\n  rendered: null,\n  instance: null,\n});\n\nexport const hint = function (n) {\n  n *= 2;\n  n = Math.max(0, HEAP.length - n);\n  return __range__(0, n, false).map((_i) => HEAP.push(descriptor()));\n};\n\nexport const element = function (type, props, children) {\n  const el = HEAP.length ? HEAP.pop() : descriptor();\n\n  el.type = type != null ? type : \"div\";\n  el.props = props != null ? props : null;\n  el.children = children != null ? children : null;\n  // Can't use `arguments` here to pass children as direct args, it de-optimizes label emitters\n\n  return el;\n};\n\nexport const recycle = function (el) {\n  if (!el.type) {\n    return;\n  }\n\n  const { children } = el;\n  el.type = el.props = el.children = el.instance = null;\n\n  HEAP.push(el);\n\n  if (children != null) {\n    for (const child of Array.from(children)) {\n      recycle(child);\n    }\n  }\n};\n\nexport const apply = function (el, last, node, parent, index) {\n  if (el != null) {\n    if (last == null) {\n      // New node\n      return mount(el, parent, index);\n    } else {\n      // Literal DOM node\n      let same;\n      if (el instanceof Node) {\n        same = el === last;\n        if (same) {\n          return;\n        }\n      } else {\n        // Check compatibility\n        same =\n          typeof el === typeof last &&\n          last !== null &&\n          el !== null &&\n          el.type === last.type;\n      }\n\n      if (!same) {\n        // Not compatible: unmount and remount\n        unmount(last.instance, node);\n        node.remove();\n        return mount(el, parent, index);\n      } else {\n        // Maintain component ref\n        let key, ref, value;\n        el.instance = last.instance;\n\n        // Check if it's a component\n        const type = (el.type != null ? el.type.isComponentClass : undefined)\n          ? el.type\n          : Types[el.type];\n\n        // Prepare to diff props and children\n        const props = last != null ? last.props : undefined;\n        const nextProps = el.props;\n        const children =\n          (last != null ? last.children : undefined) != null\n            ? last != null\n              ? last.children\n              : undefined\n            : null;\n        const nextChildren = el.children;\n\n        if (nextProps != null) {\n          nextProps.children = nextChildren;\n        }\n\n        // Component\n        if (type != null) {\n          // See if it changed\n          let dirty = node._COMPONENT_DIRTY;\n\n          if ((props != null) !== (nextProps != null)) {\n            dirty = true;\n          }\n          if (children !== nextChildren) {\n            dirty = true;\n          }\n\n          if (props != null && nextProps != null) {\n            if (!dirty) {\n              for (key in props) {\n                if (!Object.prototype.hasOwnProperty.call(nextProps, key)) {\n                  dirty = true;\n                }\n              }\n            }\n            if (!dirty) {\n              for (key in nextProps) {\n                value = nextProps[key];\n                if ((ref = props[key]) !== value) {\n                  dirty = true;\n                }\n              }\n            }\n          }\n\n          if (dirty) {\n            let left;\n            const comp = last.instance;\n            if (el.props == null) {\n              el.props = {};\n            }\n            for (const k in comp.defaultProps) {\n              const v = comp.defaultProps[k];\n              if (el.props[k] == null) {\n                el.props[k] = v;\n              }\n            }\n            el.props.children = el.children;\n\n            if (typeof comp.willReceiveProps === \"function\") {\n              comp.willReceiveProps(el.props);\n            }\n            const should =\n              node._COMPONENT_FORCE ||\n              ((left =\n                typeof comp.shouldUpdate === \"function\"\n                  ? comp.shouldUpdate(el.props)\n                  : undefined) != null\n                ? left\n                : true);\n\n            if (should) {\n              const nextState = comp.getNextState();\n              if (typeof comp.willUpdate === \"function\") {\n                comp.willUpdate(el.props, nextState);\n              }\n            }\n\n            const prevProps = comp.props;\n            const prevState = comp.applyNextState();\n\n            comp.props = el.props;\n            comp.children = el.children;\n\n            if (should) {\n              el = el.rendered =\n                typeof comp.render === \"function\"\n                  ? comp.render(element, el.props, el.children)\n                  : undefined;\n              apply(el, last.rendered, node, parent, index);\n\n              if (typeof comp.didUpdate === \"function\") {\n                comp.didUpdate(prevProps, prevState);\n              }\n            }\n          }\n\n          return;\n        } else {\n          // VDOM node\n          if (props != null) {\n            for (key in props) {\n              if (!Object.prototype.hasOwnProperty.call(nextProps, key)) {\n                unset(node, key, props[key]);\n              }\n            }\n          }\n          if (nextProps != null) {\n            for (key in nextProps) {\n              value = nextProps[key];\n              if ((ref = props[key]) !== value && key !== \"children\") {\n                set(node, key, value, ref);\n              }\n            }\n          }\n\n          // Diff children\n          if (nextChildren != null) {\n            if ([\"string\", \"number\"].includes(typeof nextChildren)) {\n              // Insert text directly\n              if (nextChildren !== children) {\n                node.textContent = nextChildren;\n              }\n            } else {\n              if (nextChildren.type != null) {\n                // Single child\n                apply(nextChildren, children, node.childNodes[0], node, 0);\n              } else {\n                // Diff children\n                let child, i;\n                const { childNodes } = node;\n                if (children != null) {\n                  for (i = 0; i < nextChildren.length; i++) {\n                    child = nextChildren[i];\n                    apply(child, children[i], childNodes[i], node, i);\n                  }\n                } else {\n                  for (i = 0; i < nextChildren.length; i++) {\n                    child = nextChildren[i];\n                    apply(child, null, childNodes[i], node, i);\n                  }\n                }\n              }\n            }\n          } else if (children != null) {\n            // Unmount all child components\n            unmount(null, node);\n\n            // Remove all children\n            node.innerHTML = \"\";\n          }\n        }\n\n        return;\n      }\n    }\n  }\n\n  if (last != null) {\n    // Removed node\n    unmount(last.instance, node);\n    return last.node.remove();\n  }\n};\n\nconst mount = function (el, parent, index) {\n  let node;\n  if (index == null) {\n    index = 0;\n  }\n  const type = (el.type != null ? el.type.isComponentClass : undefined)\n    ? el.type\n    : Types[el.type];\n\n  // Literal DOM node\n  if (el instanceof Node) {\n    node = el;\n  } else {\n    if (type != null) {\n      // Component\n      let comp;\n      const ctor = (el.type != null ? el.type.isComponentClass : undefined)\n        ? el.type\n        : Types[el.type];\n\n      // No component class found\n      if (!ctor) {\n        el = el.rendered = element(\"noscript\");\n        node = mount(el, parent, index);\n        return node;\n      }\n\n      // Construct component class\n      el.instance = comp = new ctor(parent);\n      if (el.props == null) {\n        el.props = {};\n      }\n      for (const k in comp.defaultProps) {\n        const v = comp.defaultProps[k];\n        if (el.props[k] == null) {\n          el.props[k] = v;\n        }\n      }\n      el.props.children = el.children;\n\n      // Do initial state transition\n      comp.props = el.props;\n      comp.children = el.children;\n      comp.setState(\n        typeof comp.getInitialState === \"function\"\n          ? comp.getInitialState()\n          : undefined\n      );\n      if (typeof comp.willMount === \"function\") {\n        comp.willMount();\n      }\n\n      // Render\n      el = el.rendered =\n        typeof comp.render === \"function\"\n          ? comp.render(element, el.props, el.children)\n          : undefined;\n      node = mount(el, parent, index);\n\n      // Finish mounting and remember component/node association\n      if (typeof comp.didMount === \"function\") {\n        comp.didMount(el);\n      }\n      node._COMPONENT = comp;\n\n      return node;\n    } else if ([\"string\", \"number\"].includes(typeof el)) {\n      // Text\n      node = document.createTextNode(el);\n    } else {\n      // VDOM Node\n      node = document.createElement(el.type);\n      for (const key in el.props) {\n        const value = el.props[key];\n        set(node, key, value);\n      }\n    }\n\n    const { children } = el;\n    if (children != null) {\n      if ([\"string\", \"number\"].includes(typeof children)) {\n        // Insert text directly\n        node.textContent = children;\n      } else {\n        if (children.type != null) {\n          // Single child\n          mount(children, node, 0);\n        } else {\n          // Insert children\n          for (let i = 0; i < children.length; i++) {\n            const child = children[i];\n            mount(child, node, i);\n          }\n        }\n      }\n    }\n  }\n\n  parent.insertBefore(node, parent.childNodes[index]);\n  return node;\n};\n\nconst unmount = function (comp, node) {\n  if (comp) {\n    if (typeof comp.willUnmount === \"function\") {\n      comp.willUnmount();\n    }\n    for (const k in comp) {\n      delete comp[k];\n    }\n  }\n\n  return (() => {\n    const result = [];\n    for (const child of Array.from(node.childNodes)) {\n      unmount(child._COMPONENT, child);\n      result.push(delete child._COMPONENT);\n    }\n    return result;\n  })();\n};\n\nconst prop = function (key) {\n  if (typeof document === \"undefined\") {\n    return true;\n  }\n  if (document.documentElement.style[key] != null) {\n    return key;\n  }\n\n  key = key[0].toUpperCase() + key.slice(1);\n  const prefixes = [\"webkit\", \"moz\", \"ms\", \"o\"];\n  for (const prefix of Array.from(prefixes)) {\n    if (document.documentElement.style[prefix + key] != null) {\n      return prefix + key;\n    }\n  }\n};\n\nconst map = {};\nfor (const key of [\"transform\"]) {\n  map[key] = prop(key);\n}\n\nconst set = function (node, key, value, orig) {\n  if (key === \"style\") {\n    for (const k in value) {\n      const v = value[k];\n      if ((orig != null ? orig[k] : undefined) !== v) {\n        node.style[map[k] != null ? map[k] : k] = v;\n      }\n    }\n    return;\n  }\n\n  if (node[key] != null) {\n    try {\n      node[key] = value;\n    } catch (e1) {\n      console.log(\"failed setting \" + key);\n    }\n    return;\n  }\n\n  if (node instanceof Node) {\n    node.setAttribute(key, value);\n    return;\n  }\n};\n\nconst unset = function (node, key, orig) {\n  if (key === \"style\") {\n    for (const k in orig) {\n      node.style[map[k] != null ? map[k] : k] = \"\";\n    }\n    return;\n  }\n\n  if (node[key] != null) {\n    node[key] = undefined;\n  }\n\n  if (node instanceof Node) {\n    node.removeAttribute(key);\n    return;\n  }\n};\n\nexport const createClass = function (prototype) {\n  let left;\n  const aliases = {\n    willMount: \"componentWillMount\",\n    didMount: \"componentDidMount\",\n    willReceiveProps: \"componentWillReceiveProps\",\n    shouldUpdate: \"shouldComponentUpdate\",\n    willUpdate: \"componentWillUpdate\",\n    didUpdate: \"componentDidUpdate\",\n    willUnmount: \"componentWillUnmount\",\n  };\n  for (const a in aliases) {\n    const b = aliases[a];\n    if (prototype[a] == null) {\n      prototype[a] = prototype[b];\n    }\n  }\n\n  class Component {\n    constructor(node, props, state = null, children = null) {\n      let k, v;\n      if (props == null) {\n        props = {};\n      }\n      this.props = props;\n      this.state = state;\n      this.children = children;\n      const bind = function (f, self) {\n        if (typeof f === \"function\") {\n          return f.bind(self);\n        } else {\n          return f;\n        }\n      };\n      for (k in prototype) {\n        v = prototype[k];\n        this[k] = bind(v, this);\n      }\n\n      let nextState = null;\n\n      this.setState = function (state) {\n        if (nextState == null) {\n          nextState = state ? (nextState != null ? nextState : {}) : null;\n        }\n        for (k in state) {\n          v = state[k];\n          nextState[k] = v;\n        }\n        node._COMPONENT_DIRTY = true;\n      };\n\n      this.forceUpdate = function () {\n        node._COMPONENT_FORCE = node._COMPONENT_DIRTY = true;\n\n        let el = node;\n        return (() => {\n          const result = [];\n          while ((el = el.parentNode)) {\n            if (el._COMPONENT) {\n              result.push((el._COMPONENT_FORCE = true));\n            } else {\n              result.push(undefined);\n            }\n          }\n          return result;\n        })();\n      };\n\n      this.getNextState = () => nextState;\n\n      this.applyNextState = function () {\n        node._COMPONENT_FORCE = node._COMPONENT_DIRTY = false;\n        const prevState = this.state;\n        [nextState, this.state] = Array.from([null, nextState]);\n        return prevState;\n      };\n    }\n  }\n\n  Component.isComponentClass = true;\n  Component.prototype.defaultProps =\n    (left =\n      typeof prototype.getDefaultProps === \"function\"\n        ? prototype.getDefaultProps()\n        : undefined) != null\n      ? left\n      : {};\n  return Component;\n};\n\nfunction __range__(left, right, inclusive) {\n  const range = [];\n  const ascending = left < right;\n  const end = !inclusive ? right : ascending ? right + 1 : right - 1;\n  for (let i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {\n    range.push(i);\n  }\n  return range;\n}\n","export class Overlay {\n  constructor(element, options) {\n    this.element = element;\n    if (typeof this.init === \"function\") {\n      this.init(options);\n    }\n  }\n\n  dispose() {}\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as VDOM from \"../util/vdom.js\";\nimport { Overlay } from \"./overlay.js\";\n\nexport class DOM extends Overlay {\n  static initClass() {\n    this.prototype.el = VDOM.element;\n    this.prototype.hint = VDOM.hint;\n    this.prototype.apply = VDOM.apply;\n    this.prototype.recycle = VDOM.recycle;\n  }\n\n  init(_options) {\n    return (this.last = null);\n  }\n\n  dispose() {\n    this.unmount();\n    return super.dispose();\n  }\n\n  mount() {\n    const overlay = document.createElement(\"div\");\n    overlay.classList.add(\"mathbox-overlay\");\n    this.element.appendChild(overlay);\n    return (this.overlay = overlay);\n  }\n\n  unmount(_overlay) {\n    if (this.overlay && this.overlay.parentNode) {\n      this.element.removeChild(this.overlay);\n    }\n    return (this.overlay = null);\n  }\n\n  render(el) {\n    // Lazy mounting\n    if (!this.overlay) {\n      this.mount();\n    }\n\n    // Wrap naked string or array in a div\n    if ([\"string\", \"number\"].includes(typeof el)) {\n      el = this.el(\"div\", null, el);\n    }\n    if (el instanceof Array) {\n      el = this.el(\"div\", null, el);\n    }\n\n    // Create empty div if el is null\n    if (el == null) {\n      el = this.el(\"div\");\n    }\n\n    // See if it can be mounted directly\n    const naked = el.type === \"div\";\n\n    // Fetch last DOM state\n    let { last } = this;\n\n    // Start with root node\n    const { overlay } = this;\n    const node = naked ? overlay : overlay.childNodes[0];\n    const parent = naked ? overlay.parentNode : overlay;\n\n    // Create phantom DOM state if mounting into existing element\n    if (!last && node) {\n      last = this.el(\"div\");\n    }\n\n    // Update DOM\n    this.apply(el, last, node, parent, 0);\n    this.last = el;\n\n    // Recycle old descriptors\n    if (last != null) {\n      this.recycle(last);\n    }\n  }\n}\nDOM.initClass();\n","import { DOM } from \"./dom.js\";\n\nexport const Classes = { dom: DOM };\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as Model from \"../model\";\nimport { Binder } from \"threestrap/src/binder.js\";\n\nexport class Primitive {\n  static initClass() {\n    this.Node = Model.Node;\n    this.Group = Model.Group;\n\n    // Class default\n    this.model = this.Node;\n    this.defaults = null;\n    this.traits = null;\n    this.props = null;\n    this.finals = null;\n    this.freeform = false;\n  }\n\n  constructor(node, _context, helpers) {\n    this.node = node;\n    this._context = _context;\n    this._renderables = this._context.renderables;\n    this._attributes = this._context.attributes;\n    this._shaders = this._context.shaders;\n    this._overlays = this._context.overlays;\n    this._animator = this._context.animator;\n    this._types = this._attributes.types;\n\n    // Link up node 1-to-1\n    this.node.controller = this;\n\n    // This node has been inserted/removed\n    this.node.on(\"added\", (_event) => this._added());\n    this.node.on(\"removed\", (_event) => this._removed());\n\n    // Property change (if mounted)\n    this.node.on(\"change\", (event) => {\n      if (this._root) {\n        return this.change(event.changed, event.touched);\n      }\n    });\n\n    // Store local refs\n    this.reconfigure();\n\n    // Attribute getter / helpers\n    this._get = this.node.get.bind(this.node);\n    this._helpers = helpers(this, this.node.traits);\n\n    // Keep track of various handlers to do auto-cleanup on unmake()\n    this._handlers = { inherit: {}, listen: [], watch: [], compute: [] };\n\n    // Detached initially\n    this._root = this._parent = null;\n\n    // Friendly constructor\n    this.init();\n  }\n\n  is(trait) {\n    return this.traits.hash[trait];\n  }\n\n  // Primitive lifecycle\n  init() {}\n  make() {}\n  made() {}\n  unmake(_rebuild) {}\n  unmade() {}\n  change(_changed, _touched, _init) {}\n\n  // Force property reinit\n  refresh() {\n    return this.change({}, {}, true);\n  }\n\n  // Destroy and create cycle\n  rebuild() {\n    if (this._root) {\n      this._removed(true);\n      return this._added();\n    }\n  }\n\n  // Reconfigure traits/props\n  reconfigure(config) {\n    if (config != null) {\n      this.node.configure(config, this._attributes);\n    }\n\n    this.traits = this.node.traits;\n    return (this.props = this.node.props);\n  }\n\n  // This node has been inserted\n  _added() {\n    let e, left;\n    this._parent =\n      this.node.parent != null ? this.node.parent.controller : undefined;\n    this._root = this.node.root != null ? this.node.root.controller : undefined;\n\n    this.node.clock =\n      (left = this._inherit(\"clock\")) != null ? left : this._root;\n\n    try {\n      try {\n        this.make();\n        this.refresh();\n        return this.made();\n      } catch (error) {\n        e = error;\n        this.node.print(\"warn\");\n        console.error(e);\n        throw e;\n      }\n    } catch (error1) {\n      e = error1;\n      try {\n        return this._removed();\n        // eslint-disable-next-line no-empty\n      } catch (error2) {}\n    }\n  }\n\n  _removed(rebuild) {\n    if (rebuild == null) {\n      rebuild = false;\n    }\n    this.unmake(rebuild);\n\n    this._unlisten();\n    this._unattach();\n    this._uncompute();\n\n    this._root = null;\n    this._parent = null;\n\n    return this.unmade(rebuild);\n  }\n\n  // Bind event listeners to methods\n  _listen(object, type, method, self) {\n    if (self == null) {\n      self = this;\n    }\n    if (object instanceof Array) {\n      for (const o of Array.from(object)) {\n        return this.__listen(o, type, method, self);\n      }\n    }\n    return this.__listen(object, type, method, self);\n  }\n\n  __listen(object, type, method, self) {\n    if (self == null) {\n      self = this;\n    }\n    if (typeof object === \"string\") {\n      object = this._inherit(object);\n    }\n\n    if (object != null) {\n      const handler = method.bind(self);\n      handler.node = this.node;\n      object.on(type, handler);\n\n      this._handlers.listen.push([object, type, handler]);\n    }\n    return object;\n  }\n\n  _unlisten() {\n    if (!this._handlers.listen.length) {\n      return;\n    }\n\n    for (const [object, type, handler] of Array.from(this._handlers.listen)) {\n      object.off(type, handler);\n    }\n    return (this._handlers.listen = []);\n  }\n\n  // Find parent with certain trait\n  _inherit(trait) {\n    const cached = this._handlers.inherit[trait];\n    if (cached !== undefined) {\n      return cached;\n    }\n\n    return (this._handlers.inherit[trait] =\n      this._parent != null\n        ? this._parent._find(trait != null ? trait : null)\n        : undefined);\n  }\n\n  _find(trait) {\n    if (this.is(trait)) {\n      return this;\n    }\n    return this._parent != null ? this._parent._find(trait) : undefined;\n  }\n\n  _uninherit() {\n    return (this._handlers.inherit = {});\n  }\n\n  // Attach to controller by trait and watch the selector\n  _attach(selector, trait, method, self, start, optional, multiple) {\n    if (self == null) {\n      self = this;\n    }\n    if (start == null) {\n      start = this;\n    }\n    if (optional == null) {\n      optional = false;\n    }\n    if (multiple == null) {\n      multiple = false;\n    }\n    const filter = function (node) {\n      if (node != null && Array.from(node.traits).includes(trait)) {\n        return node;\n      }\n    };\n    const map = (node) => (node != null ? node.controller : undefined);\n    const flatten = function (list) {\n      if (list == null) {\n        return list;\n      }\n      let out = [];\n      for (const sub of Array.from(list)) {\n        if (sub instanceof Array) {\n          out = out.concat(sub);\n        } else {\n          out.push(sub);\n        }\n      }\n      return out;\n    };\n\n    const resolve = (selector) => {\n      // Direct JS binding, no watcher.\n      let node, nodes;\n      if (typeof selector === \"object\") {\n        node = selector;\n\n        // API object\n        if (node != null ? node._up : undefined) {\n          selector = multiple ? node._targets : [node[0]];\n          return selector;\n        }\n\n        // Array of things\n        if (node instanceof Array) {\n          selector = multiple ? flatten(node.map(resolve)) : resolve(node[0]);\n          return selector;\n        }\n\n        // Node\n        if (node instanceof Model.Node) {\n          return [node];\n        }\n\n        // Auto-link selector '<'\n      } else if (typeof selector === \"string\" && selector[0] === \"<\") {\n        let match;\n        let discard = 0;\n        if ((match = selector.match(/^<([0-9])+$/))) {\n          discard = +match[1] - 1;\n        }\n        if (selector.match(/^<+$/)) {\n          discard = +selector.length - 1;\n        }\n\n        nodes = [];\n\n        // Implicitly associated node (scan backwards until we find one)\n        let previous = start.node;\n        while (previous) {\n          // Find previous node\n          const { parent } = previous;\n          if (!parent) {\n            break;\n          }\n          previous = parent.children[previous.index - 1];\n\n          // If we reached the first child, ascend if nothing found yet\n          if (!previous && !nodes.length) {\n            previous = parent;\n          }\n\n          // Include if matched\n          node = null;\n          if (filter(previous)) {\n            node = previous;\n          }\n          if (node != null && discard-- <= 0) {\n            nodes.push(node);\n          }\n\n          // Return solo match\n          if (!multiple && nodes.length) {\n            return nodes;\n          }\n        }\n\n        // Return list match\n        if (multiple && nodes.length) {\n          return nodes;\n        }\n\n        // Selector binding\n      } else if (typeof selector === \"string\") {\n        const watcher = method.bind(self);\n        this._handlers.watch.push(watcher);\n\n        const selection = this._root.watch(selector, watcher);\n        if (!multiple) {\n          if (filter(selection[0])) {\n            node = selection[0];\n          }\n          if (node != null) {\n            return [node];\n          }\n        } else {\n          nodes = selection.filter(filter);\n          if (nodes.length) {\n            return nodes;\n          }\n        }\n      }\n\n      // Nothing found\n      if (!optional) {\n        console.warn(this.node.toMarkup());\n        throw new Error(\n          `${this.node.toString()} - Could not find ${trait} \\`${selector}\\``\n        );\n      }\n      if (multiple) {\n        return [];\n      } else {\n        return null;\n      }\n    };\n\n    // Resolve selection recursively\n    const nodes = flatten(resolve(selector));\n\n    // Return node's controllers if found\n    if (multiple) {\n      if (nodes != null) {\n        return nodes.map(map);\n      } else {\n        return null;\n      }\n    } else {\n      if (nodes != null) {\n        return map(nodes[0]);\n      } else {\n        return null;\n      }\n    }\n  }\n\n  // Remove watcher attachments\n  _unattach() {\n    if (!this._handlers.watch.length) {\n      return;\n    }\n\n    for (const watcher of Array.from(this._handlers.watch)) {\n      if (watcher != null) {\n        watcher.unwatch();\n      }\n    }\n    return (this._handlers.watch = []);\n  }\n\n  // Bind a computed value to a prop\n  _compute(key, expr) {\n    this._handlers.compute.push(key);\n    return this.node.bind(key, expr, true);\n  }\n\n  // Remove prop bindings\n  _uncompute() {\n    if (!this._handlers.compute.length) {\n      return;\n    }\n    for (const key of Array.from(this._handlers.compute)) {\n      this.node.unbind(key, true);\n    }\n    return (this._handlers.compute = []);\n  }\n}\nPrimitive.initClass();\n\nBinder.apply(Primitive.prototype);\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Primitive } from \"../../primitive.js\";\n\nexport class Parent extends Primitive {\n  static initClass() {\n    this.model = Primitive.Group;\n    this.traits = [\"node\"];\n  }\n}\nParent.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Parent } from \"./parent.js\";\n\nexport class Group extends Parent {\n  static initClass() {\n    this.traits = [\"node\", \"object\", \"entity\", \"visible\", \"active\"];\n  }\n\n  make() {\n    this._helpers.visible.make();\n    return this._helpers.active.make();\n  }\n\n  unmake() {\n    this._helpers.visible.unmake();\n    return this._helpers.active.unmake();\n  }\n}\nGroup.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Parent } from \"./parent.js\";\n\nexport class Inherit extends Parent {\n  static initClass() {\n    this.traits = [\"node\", \"bind\"];\n  }\n\n  make() {\n    // Bind to attached trait source\n    return this._helpers.bind.make([{ to: \"inherit.source\", trait: \"node\" }]);\n  }\n\n  unmake() {\n    return this._helpers.bind.unmake();\n  }\n\n  _find(trait) {\n    if (this.bind.source && Array.from(this.props.traits).includes(trait)) {\n      return this.bind.source._inherit(trait);\n    }\n    return super._find();\n  }\n}\nInherit.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining\n * DS104: Avoid inline assignments\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Parent } from \"./parent.js\";\n\nexport class Root extends Parent {\n  static initClass() {\n    this.traits = [\"node\", \"root\", \"clock\", \"scene\", \"vertex\", \"unit\"];\n  }\n\n  init() {\n    this.size = null;\n\n    this.cameraEvent = { type: \"root.camera\" };\n    this.preEvent = { type: \"root.pre\" };\n    this.updateEvent = { type: \"root.update\" };\n    this.renderEvent = { type: \"root.render\" };\n    this.postEvent = { type: \"root.post\" };\n\n    this.clockEvent = { type: \"clock.tick\" };\n\n    return (this.camera = null);\n  }\n\n  make() {\n    return this._helpers.unit.make();\n  }\n  unmake() {\n    return this._helpers.unit.unmake();\n  }\n\n  change(changed, touched, init) {\n    if (changed[\"root.camera\"] || init) {\n      this._unattach();\n      this._attach(\n        this.props.camera,\n        \"camera\",\n        this.setCamera,\n        this,\n        this,\n        true\n      );\n      return this.setCamera();\n    }\n  }\n\n  adopt(renderable) {\n    return Array.from(renderable.renders).map((object) =>\n      this._context.scene.add(object)\n    );\n  }\n  unadopt(renderable) {\n    return Array.from(renderable.renders).map((object) =>\n      this._context.scene.remove(object)\n    );\n  }\n\n  select(selector) {\n    return this.node.model.select(selector);\n  }\n\n  watch(selector, handler) {\n    return this.node.model.watch(selector, handler);\n  }\n\n  unwatch(handler) {\n    return this.node.model.unwatch(handler);\n  }\n\n  resize(size) {\n    this.size = size;\n    return this.trigger({\n      type: \"root.resize\",\n      size,\n    });\n  }\n\n  getSize() {\n    return this.size;\n  }\n  getSpeed() {\n    return this.props.speed;\n  }\n\n  getUnit() {\n    return this._helpers.unit.get();\n  }\n  getUnitUniforms() {\n    return this._helpers.unit.uniforms();\n  }\n\n  pre() {\n    this.getCamera().updateProjectionMatrix();\n    this.trigger(this.clockEvent);\n    return this.trigger(this.preEvent);\n  }\n\n  update() {\n    return this.trigger(this.updateEvent);\n  }\n  render() {\n    return this.trigger(this.renderEvent);\n  }\n  post() {\n    return this.trigger(this.postEvent);\n  }\n\n  setCamera() {\n    const camera = __guard__(\n      this.select(this.props.camera)[0],\n      (x) => x.controller\n    );\n    if (this.camera !== camera) {\n      this.camera = camera;\n      return this.trigger({ type: \"root.camera\" });\n    }\n  }\n\n  getCamera() {\n    let left;\n    return (left = this.camera != null ? this.camera.getCamera() : undefined) !=\n      null\n      ? left\n      : this._context.defaultCamera;\n  }\n\n  getTime() {\n    return this._context.time;\n  }\n\n  // End transform chain here\n  vertex(shader, pass) {\n    if (pass === 2) {\n      return shader.pipe(\"view.position\");\n    }\n    if (pass === 3) {\n      return shader.pipe(\"root.position\");\n    }\n    return shader;\n  }\n}\nRoot.initClass();\n\nfunction __guard__(value, transform) {\n  return typeof value !== \"undefined\" && value !== null\n    ? transform(value)\n    : undefined;\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Parent } from \"./parent.js\";\n\nexport class Unit extends Parent {\n  static initClass() {\n    this.traits = [\"node\", \"unit\"];\n  }\n\n  make() {\n    return this._helpers.unit.make();\n  }\n  unmake() {\n    return this._helpers.unit.unmake();\n  }\n\n  getUnit() {\n    return this._helpers.unit.get();\n  }\n  getUnitUniforms() {\n    return this._helpers.unit.uniforms();\n  }\n}\nUnit.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport * as CONST from \"three/src/constants.js\";\n\nimport { Euler } from \"three/src/math/Euler.js\";\nimport { Matrix4 } from \"three/src/math/Matrix4.js\";\nimport { Quaternion } from \"three/src/math/Quaternion.js\";\nimport { Vector3 } from \"three/src/math/Vector3.js\";\n\nexport const paramToGL = function (gl, p) {\n  if (p === CONST.RepeatWrapping) {\n    return gl.REPEAT;\n  }\n  if (p === CONST.ClampToEdgeWrapping) {\n    return gl.CLAMP_TO_EDGE;\n  }\n  if (p === CONST.MirroredRepeatWrapping) {\n    return gl.MIRRORED_REPEAT;\n  }\n\n  if (p === CONST.NearestFilter) {\n    return gl.NEAREST;\n  }\n  if (p === CONST.NearestMipMapNearestFilter) {\n    return gl.NEAREST_MIPMAP_NEAREST;\n  }\n  if (p === CONST.NearestMipMapLinearFilter) {\n    return gl.NEAREST_MIPMAP_LINEAR;\n  }\n\n  if (p === CONST.LinearFilter) {\n    return gl.LINEAR;\n  }\n  if (p === CONST.LinearMipMapNearestFilter) {\n    return gl.LINEAR_MIPMAP_NEAREST;\n  }\n  if (p === CONST.LinearMipMapLinearFilter) {\n    return gl.LINEAR_MIPMAP_LINEAR;\n  }\n\n  if (p === CONST.UnsignedByteType) {\n    return gl.UNSIGNED_BYTE;\n  }\n  if (p === CONST.UnsignedShort4444Type) {\n    return gl.UNSIGNED_SHORT_4_4_4_4;\n  }\n  if (p === CONST.UnsignedShort5551Type) {\n    return gl.UNSIGNED_SHORT_5_5_5_1;\n  }\n  if (p === CONST.ByteType) {\n    return gl.BYTE;\n  }\n  if (p === CONST.ShortType) {\n    return gl.SHORT;\n  }\n  if (p === CONST.UnsignedShortType) {\n    return gl.UNSIGNED_SHORT;\n  }\n  if (p === CONST.IntType) {\n    return gl.INT;\n  }\n  if (p === CONST.UnsignedIntType) {\n    return gl.UNSIGNED_INT;\n  }\n  if (p === CONST.FloatType) {\n    return gl.FLOAT;\n  }\n\n  if (p === CONST.AlphaFormat) {\n    return gl.ALPHA;\n  }\n  if (p === CONST.RGBAFormat) {\n    return gl.RGBA;\n  }\n  if (p === CONST.LuminanceFormat) {\n    return gl.LUMINANCE;\n  }\n  if (p === CONST.LuminanceAlphaFormat) {\n    return gl.LUMINANCE_ALPHA;\n  }\n\n  if (p === CONST.AddEquation) {\n    return gl.FUNC_ADD;\n  }\n  if (p === CONST.SubtractEquation) {\n    return gl.FUNC_SUBTRACT;\n  }\n  if (p === CONST.ReverseSubtractEquation) {\n    return gl.FUNC_REVERSE_SUBTRACT;\n  }\n\n  if (p === CONST.ZeroFactor) {\n    return gl.ZERO;\n  }\n  if (p === CONST.OneFactor) {\n    return gl.ONE;\n  }\n  if (p === CONST.SrcColorFactor) {\n    return gl.SRC_COLOR;\n  }\n  if (p === CONST.OneMinusSrcColorFactor) {\n    return gl.ONE_MINUS_SRC_COLOR;\n  }\n  if (p === CONST.SrcAlphaFactor) {\n    return gl.SRC_ALPHA;\n  }\n  if (p === CONST.OneMinusSrcAlphaFactor) {\n    return gl.ONE_MINUS_SRC_ALPHA;\n  }\n  if (p === CONST.DstAlphaFactor) {\n    return gl.DST_ALPHA;\n  }\n  if (p === CONST.OneMinusDstAlphaFactor) {\n    return gl.ONE_MINUS_DST_ALPHA;\n  }\n\n  if (p === CONST.DstColorFactor) {\n    return gl.DST_COLOR;\n  }\n  if (p === CONST.OneMinusDstColorFactor) {\n    return gl.ONE_MINUS_DST_COLOR;\n  }\n  if (p === CONST.SrcAlphaSaturateFactor) {\n    return gl.SRC_ALPHA_SATURATE;\n  }\n\n  return 0;\n};\n\nexport const paramToArrayStorage = function (type) {\n  switch (type) {\n    case CONST.UnsignedByteType:\n      return Uint8Array;\n    case CONST.ByteType:\n      return Int8Array;\n    case CONST.ShortType:\n      return Int16Array;\n    case CONST.UnsignedShortType:\n      return Uint16Array;\n    case CONST.IntType:\n      return Int32Array;\n    case CONST.UnsignedIntType:\n      return Uint32Array;\n    case CONST.FloatType:\n      return Float32Array;\n  }\n};\n\nexport const swizzleToEulerOrder = (swizzle) =>\n  swizzle.map((i) => [\"\", \"X\", \"Y\", \"Z\"][i]).join(\"\");\n\nexport const transformComposer = function () {\n  const euler = new Euler();\n  const quat = new Quaternion();\n  const pos = new Vector3();\n  const scl = new Vector3();\n  const transform = new Matrix4();\n\n  return function (position, rotation, quaternion, scale, matrix, eulerOrder) {\n    if (eulerOrder == null) {\n      eulerOrder = \"XYZ\";\n    }\n    if (rotation != null) {\n      if (eulerOrder instanceof Array) {\n        eulerOrder = swizzleToEulerOrder(eulerOrder);\n      }\n      euler.setFromVector3(rotation, eulerOrder);\n      quat.setFromEuler(euler);\n    } else {\n      quat.set(0, 0, 0, 1);\n    }\n\n    if (quaternion != null) {\n      quat.multiply(quaternion);\n    }\n\n    if (position != null) {\n      pos.copy(position);\n    } else {\n      pos.set(0, 0, 0);\n    }\n\n    if (scale != null) {\n      scl.copy(scale);\n    } else {\n      scl.set(1, 1, 1);\n    }\n\n    transform.compose(pos, quat, scl);\n    if (matrix != null) {\n      transform.multiplyMatrices(transform, matrix);\n    }\n\n    return transform;\n  };\n};\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UThree from \"../../../util/three.js\";\nimport { Euler } from \"three/src/math/Euler.js\";\nimport { Primitive } from \"../../primitive.js\";\nimport { Quaternion } from \"three/src/math/Quaternion.js\";\n\nexport class Camera extends Primitive {\n  static initClass() {\n    this.traits = [\"node\", \"camera\"];\n  }\n\n  init() {}\n\n  make() {\n    const camera = this._context.defaultCamera;\n    this.camera = this.props.proxy ? camera : camera.clone();\n\n    this.euler = new Euler();\n    return (this.quat = new Quaternion());\n  }\n\n  unmake() {}\n\n  getCamera() {\n    return this.camera;\n  }\n\n  change(changed, touched, init) {\n    if (\n      changed[\"camera.position\"] ||\n      changed[\"camera.quaternion\"] ||\n      changed[\"camera.rotation\"] ||\n      changed[\"camera.lookAt\"] ||\n      changed[\"camera.up\"] ||\n      changed[\"camera.fov\"] ||\n      init\n    ) {\n      const { position, quaternion, rotation, lookAt, up, fov } = this.props;\n\n      // Apply transform conservatively to avoid conflicts with controls / proxy\n      if (position != null) {\n        this.camera.position.copy(position);\n      }\n\n      if (quaternion != null || rotation != null || lookAt != null) {\n        if (lookAt != null) {\n          this.camera.lookAt(lookAt);\n        } else {\n          this.camera.quaternion.set(0, 0, 0, 1);\n        }\n\n        if (rotation != null) {\n          this.euler.setFromVector3(\n            rotation,\n            UThree.swizzleToEulerOrder(this.props.eulerOrder)\n          );\n          this.quat.setFromEuler(this.euler);\n          this.camera.quaternion.multiply(this.quat);\n        }\n\n        if (quaternion != null) {\n          this.camera.quaternion.multiply(quaternion);\n        }\n      }\n\n      if (fov != null && this.camera.fov != null) {\n        this.camera.fov = fov;\n      }\n\n      if (up != null) {\n        this.camera.up.copy(up);\n      }\n\n      return this.camera.updateMatrix();\n    }\n  }\n}\nCamera.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS202: Simplify dynamic range loops\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nexport const getSizes = function (data) {\n  const sizes = [];\n  let array = data;\n  while (\n    typeof array !== \"string\" &&\n    (array != null ? array.length : undefined) != null\n  ) {\n    sizes.push(array.length);\n    array = array[0];\n  }\n  return sizes;\n};\n\nexport const getDimensions = function (data, spec) {\n  let left;\n  if (spec == null) {\n    spec = {};\n  }\n  const { items, channels, width, height, depth } = spec;\n\n  const dims = {};\n\n  if (!data || !data.length) {\n    return {\n      items,\n      channels,\n      width: width != null ? width : 0,\n      height: height != null ? height : 0,\n      depth: depth != null ? depth : 0,\n    };\n  }\n\n  const sizes = getSizes(data);\n  const nesting = sizes.length;\n\n  dims.channels = channels !== 1 && sizes.length > 1 ? sizes.pop() : channels;\n  dims.items = items !== 1 && sizes.length > 1 ? sizes.pop() : items;\n  dims.width = width !== 1 && sizes.length > 1 ? sizes.pop() : width;\n  dims.height = height !== 1 && sizes.length > 1 ? sizes.pop() : height;\n  dims.depth = depth !== 1 && sizes.length > 1 ? sizes.pop() : depth;\n\n  let levels = nesting;\n  if (channels === 1) {\n    levels++;\n  }\n  if (items === 1 && levels > 1) {\n    levels++;\n  }\n  if (width === 1 && levels > 2) {\n    levels++;\n  }\n  if (height === 1 && levels > 3) {\n    levels++;\n  }\n\n  let n = (left = sizes.pop()) != null ? left : 1;\n  if (levels <= 1) {\n    n /= dims.channels != null ? dims.channels : 1;\n  }\n  if (levels <= 2) {\n    n /= dims.items != null ? dims.items : 1;\n  }\n  if (levels <= 3) {\n    n /= dims.width != null ? dims.width : 1;\n  }\n  if (levels <= 4) {\n    n /= dims.height != null ? dims.height : 1;\n  }\n  n = Math.floor(n);\n\n  if (dims.width == null) {\n    dims.width = n;\n    n = 1;\n  }\n  if (dims.height == null) {\n    dims.height = n;\n    n = 1;\n  }\n  if (dims.depth == null) {\n    dims.depth = n;\n    n = 1;\n  }\n\n  return dims;\n};\n\nexport const repeatCall = function (call, times) {\n  switch (times) {\n    case 0:\n      return () => true;\n    case 1:\n      return () => call();\n    case 2:\n      return function () {\n        call();\n        return call();\n      };\n    case 3:\n      return function () {\n        call();\n        call();\n        call();\n        return call();\n      };\n    case 4:\n      return function () {\n        call();\n        call();\n        call();\n        return call();\n      };\n    case 6:\n      return function () {\n        call();\n        call();\n        call();\n        call();\n        call();\n        return call();\n      };\n    case 8:\n      return function () {\n        call();\n        call();\n        call();\n        call();\n        call();\n        return call();\n      };\n  }\n};\n\nexport const makeEmitter = function (thunk, items, channels) {\n  let outer;\n  const inner = (() => {\n    switch (channels) {\n      case 0:\n        return () => true;\n      case 1:\n        return (emit) => emit(thunk());\n      case 2:\n        return (emit) => emit(thunk(), thunk());\n      case 3:\n        return (emit) => emit(thunk(), thunk(), thunk());\n      case 4:\n        return (emit) => emit(thunk(), thunk(), thunk(), thunk());\n      case 6:\n        return (emit) =>\n          emit(thunk(), thunk(), thunk(), thunk(), thunk(), thunk());\n      case 8:\n        return (emit) =>\n          emit(\n            thunk(),\n            thunk(),\n            thunk(),\n            thunk(),\n            thunk(),\n            thunk(),\n            thunk(),\n            thunk()\n          );\n    }\n  })();\n\n  let next = null;\n  while (items > 0) {\n    const n = Math.min(items, 8);\n    outer = (() => {\n      switch (n) {\n        case 1:\n          return (emit) => inner(emit);\n        case 2:\n          return function (emit) {\n            inner(emit);\n            return inner(emit);\n          };\n        case 3:\n          return function (emit) {\n            inner(emit);\n            inner(emit);\n            return inner(emit);\n          };\n        case 4:\n          return function (emit) {\n            inner(emit);\n            inner(emit);\n            inner(emit);\n            return inner(emit);\n          };\n        case 5:\n          return function (emit) {\n            inner(emit);\n            inner(emit);\n            inner(emit);\n            inner(emit);\n            return inner(emit);\n          };\n        case 6:\n          return function (emit) {\n            inner(emit);\n            inner(emit);\n            inner(emit);\n            inner(emit);\n            inner(emit);\n            return inner(emit);\n          };\n        case 7:\n          return function (emit) {\n            inner(emit);\n            inner(emit);\n            inner(emit);\n            inner(emit);\n            inner(emit);\n            inner(emit);\n            return inner(emit);\n          };\n        case 8:\n          return function (emit) {\n            inner(emit);\n            inner(emit);\n            inner(emit);\n            inner(emit);\n            inner(emit);\n            inner(emit);\n            inner(emit);\n            return inner(emit);\n          };\n      }\n    })();\n    if (next != null) {\n      next = ((outer, next) =>\n        function (emit) {\n          outer(emit);\n          return next(emit);\n        })(outer, next);\n    } else {\n      next = outer;\n    }\n    items -= n;\n  }\n\n  outer = next != null ? next : () => true;\n  outer.reset = thunk.reset;\n  outer.rebind = thunk.rebind;\n  return outer;\n};\n\nexport const getThunk = function (data) {\n  let thunk;\n  let j, k, l, m;\n  let sizes = getSizes(data);\n  const nesting = sizes.length;\n\n  let a = sizes.pop();\n  let b = sizes.pop();\n  let c = sizes.pop();\n  const d = sizes.pop();\n\n  let i, first, second, third, fourth;\n\n  switch (nesting) {\n    case 0:\n      thunk = () => 0;\n      thunk.reset = function () {};\n      break;\n\n    case 1:\n      i = 0;\n      thunk = () => data[i++];\n      thunk.reset = () => (i = 0);\n      break;\n\n    case 2:\n      i = j = 0;\n      first = data[j] != null ? data[j] : [];\n\n      thunk = function () {\n        const x = first[i++];\n        if (i === a) {\n          i = 0;\n          j++;\n          first = data[j] != null ? data[j] : [];\n        }\n        return x;\n      };\n\n      thunk.reset = function () {\n        i = j = 0;\n        first = data[j] != null ? data[j] : [];\n      };\n      break;\n\n    case 3:\n      i = j = k = 0;\n      second = data[k] != null ? data[k] : [];\n      first = second[j] != null ? second[j] : [];\n\n      thunk = function () {\n        const x = first[i++];\n        if (i === a) {\n          i = 0;\n          j++;\n          if (j === b) {\n            j = 0;\n            k++;\n            second = data[k] != null ? data[k] : [];\n          }\n          first = second[j] != null ? second[j] : [];\n        }\n        return x;\n      };\n\n      thunk.reset = function () {\n        i = j = k = 0;\n        second = data[k] != null ? data[k] : [];\n        first = second[j] != null ? second[j] : [];\n      };\n      break;\n\n    case 4:\n      i = j = k = l = 0;\n      third = data[l] != null ? data[l] : [];\n      second = third[k] != null ? third[k] : [];\n      first = second[j] != null ? second[j] : [];\n\n      thunk = function () {\n        const x = first[i++];\n        if (i === a) {\n          i = 0;\n          j++;\n          if (j === b) {\n            j = 0;\n            k++;\n            if (k === c) {\n              k = 0;\n              l++;\n              third = data[l] != null ? data[l] : [];\n            }\n            second = third[k] != null ? third[k] : [];\n          }\n          first = second[j] != null ? second[j] : [];\n        }\n        return x;\n      };\n\n      thunk.reset = function () {\n        i = j = k = l = 0;\n        third = data[l] != null ? data[l] : [];\n        second = third[k] != null ? third[k] : [];\n        first = second[j] != null ? second[j] : [];\n      };\n      break;\n\n    case 5:\n      i = j = k = l = m = 0;\n      fourth = data[m] != null ? data[m] : [];\n      third = fourth[l] != null ? fourth[l] : [];\n      second = third[k] != null ? third[k] : [];\n      first = second[j] != null ? second[j] : [];\n\n      thunk = function () {\n        const x = first[i++];\n        if (i === a) {\n          i = 0;\n          j++;\n          if (j === b) {\n            j = 0;\n            k++;\n            if (k === c) {\n              k = 0;\n              l++;\n              if (l === d) {\n                l = 0;\n                m++;\n                fourth = data[m] != null ? data[m] : [];\n              }\n              third = fourth[l] != null ? fourth[l] : [];\n            }\n            second = third[k] != null ? third[k] : [];\n          }\n          first = second[j] != null ? second[j] : [];\n        }\n        return x;\n      };\n\n      thunk.reset = function () {\n        i = j = k = l = m = 0;\n        fourth = data[m] != null ? data[m] : [];\n        third = fourth[l] != null ? fourth[l] : [];\n        second = third[k] != null ? third[k] : [];\n        first = second[j] != null ? second[j] : [];\n      };\n      break;\n  }\n\n  thunk.rebind = function (d) {\n    data = d;\n\n    sizes = getSizes(data);\n    if (sizes.length) {\n      a = sizes.pop();\n    }\n    if (sizes.length) {\n      b = sizes.pop();\n    }\n    if (sizes.length) {\n      c = sizes.pop();\n    }\n    if (sizes.length) {\n      return (d = sizes.pop());\n    }\n  };\n\n  return thunk;\n};\n\nexport const getStreamer = function (array, samples, channels, items) {\n  let i, j;\n  let limit = (i = j = 0);\n\n  const reset = function () {\n    limit = samples * channels * items;\n    return (i = j = 0);\n  };\n\n  const count = () => j;\n  const done = () => limit - i <= 0;\n\n  const skip = (() => {\n    switch (channels) {\n      case 1:\n        return function (n) {\n          i += n;\n          j += n;\n        };\n\n      case 2:\n        return function (n) {\n          i += n * 2;\n          j += n;\n        };\n\n      case 3:\n        return function (n) {\n          i += n * 3;\n          j += n;\n        };\n\n      case 4:\n        return function (n) {\n          i += n * 4;\n          j += n;\n        };\n    }\n  })();\n\n  const consume = (() => {\n    switch (channels) {\n      case 1:\n        return function (emit) {\n          emit(array[i++]);\n          ++j;\n        };\n\n      case 2:\n        return function (emit) {\n          emit(array[i++], array[i++]);\n          ++j;\n        };\n\n      case 3:\n        return function (emit) {\n          emit(array[i++], array[i++], array[i++]);\n          ++j;\n        };\n\n      case 4:\n        return function (emit) {\n          emit(array[i++], array[i++], array[i++], array[i++]);\n          ++j;\n        };\n    }\n  })();\n\n  const emit = (() => {\n    switch (channels) {\n      case 1:\n        return function (x) {\n          array[i++] = x;\n          ++j;\n        };\n\n      case 2:\n        return function (x, y) {\n          array[i++] = x;\n          array[i++] = y;\n          ++j;\n        };\n\n      case 3:\n        return function (x, y, z) {\n          array[i++] = x;\n          array[i++] = y;\n          array[i++] = z;\n          ++j;\n        };\n\n      case 4:\n        return function (x, y, z, w) {\n          array[i++] = x;\n          array[i++] = y;\n          array[i++] = z;\n          array[i++] = w;\n          ++j;\n        };\n    }\n  })();\n\n  consume.reset = reset;\n  emit.reset = reset;\n\n  reset();\n  return { emit, consume, skip, count, done, reset };\n};\n\nexport const getLerpEmitter = function (expr1, expr2) {\n  let emitter, lerp2, q, r, s;\n  const scratch = new Float32Array(4096);\n  let lerp1 = (lerp2 = 0.5);\n  let p = (q = r = s = 0);\n\n  const emit1 = function (x, y, z, w) {\n    r++;\n    scratch[p++] = x * lerp1;\n    scratch[p++] = y * lerp1;\n    scratch[p++] = z * lerp1;\n    return (scratch[p++] = w * lerp1);\n  };\n\n  const emit2 = function (x, y, z, w) {\n    s++;\n    scratch[q++] += x * lerp2;\n    scratch[q++] += y * lerp2;\n    scratch[q++] += z * lerp2;\n    return (scratch[q++] += w * lerp2);\n  };\n\n  const args = Math.max(expr1.length, expr2.length);\n\n  if (args <= 3) {\n    emitter = function (emit, x, i) {\n      p = q = r = s = 0;\n      expr1(emit1, x, i);\n      expr2(emit2, x, i);\n      const n = Math.min(r, s);\n      let l = 0;\n      return __range__(0, n, false).map((_k) =>\n        emit(scratch[l++], scratch[l++], scratch[l++], scratch[l++])\n      );\n    };\n  } else if (args <= 5) {\n    emitter = function (emit, x, y, i, j) {\n      p = q = r = s = 0;\n      expr1(emit1, x, y, i, j);\n      expr2(emit2, x, y, i, j);\n      const n = Math.min(r, s);\n      let l = 0;\n      return __range__(0, n, false).map((_k) =>\n        emit(scratch[l++], scratch[l++], scratch[l++], scratch[l++])\n      );\n    };\n  } else if (args <= 7) {\n    emitter = function (emit, x, y, z, i, j, k) {\n      p = q = r = s = 0;\n      expr1(emit1, x, y, z, i, j, k);\n      expr2(emit2, x, y, z, i, j, k);\n      const n = Math.min(r, s);\n      let l = 0;\n      return (() => {\n        let asc, end;\n        const result = [];\n        for (\n          k = 0, end = n, asc = 0 <= end;\n          asc ? k < end : k > end;\n          asc ? k++ : k--\n        ) {\n          result.push(\n            emit(scratch[l++], scratch[l++], scratch[l++], scratch[l++])\n          );\n        }\n        return result;\n      })();\n    };\n  } else if (args <= 9) {\n    emitter = function (emit, x, y, z, w, i, j, k, l) {\n      p = q = r = s = 0;\n      expr1(emit1, x, y, z, w, i, j, k, l);\n      expr2(emit2, x, y, z, w, i, j, k, l);\n      const n = Math.min(r, s);\n      l = 0;\n      return (() => {\n        let asc, end;\n        const result = [];\n        for (\n          k = 0, end = n, asc = 0 <= end;\n          asc ? k < end : k > end;\n          asc ? k++ : k--\n        ) {\n          result.push(\n            emit(scratch[l++], scratch[l++], scratch[l++], scratch[l++])\n          );\n        }\n        return result;\n      })();\n    };\n  } else {\n    emitter = function (emit, x, y, z, w, i, j, k, l, d, t) {\n      p = q = 0;\n      expr1(emit1, x, y, z, w, i, j, k, l, d, t);\n      expr2(emit2, x, y, z, w, i, j, k, l, d, t);\n      const n = Math.min(r, s);\n      l = 0;\n      return (() => {\n        let asc, end;\n        const result = [];\n        for (\n          k = 0, end = n, asc = 0 <= end;\n          asc ? k < end : k > end;\n          asc ? k++ : k--\n        ) {\n          result.push(\n            emit(scratch[l++], scratch[l++], scratch[l++], scratch[l++])\n          );\n        }\n        return result;\n      })();\n    };\n  }\n\n  emitter.lerp = function (f) {\n    let ref;\n    return ([lerp1, lerp2] = Array.from((ref = [1 - f, f]))), ref;\n  };\n\n  return emitter;\n};\n\nexport const getLerpThunk = function (data1, data2) {\n  // Get sizes\n  const n1 = getSizes(data1).reduce((a, b) => a * b);\n  const n2 = getSizes(data2).reduce((a, b) => a * b);\n  const n = Math.min(n1, n2);\n\n  // Create data thunks to copy (multi-)array\n  const thunk1 = getThunk(data1);\n  const thunk2 = getThunk(data2);\n\n  // Create scratch array\n  const scratch = new Float32Array(n);\n\n  scratch.lerp = function (f) {\n    thunk1.reset();\n    thunk2.reset();\n\n    let i = 0;\n    return (() => {\n      const result = [];\n      while (i < n) {\n        const a = thunk1();\n        const b = thunk2();\n        result.push((scratch[i++] = a + (b - a) * f));\n      }\n      return result;\n    })();\n  };\n\n  return scratch;\n};\n\nfunction __range__(left, right, inclusive) {\n  const range = [];\n  const ascending = left < right;\n  const end = !inclusive ? right : ascending ? right + 1 : right - 1;\n  for (let i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {\n    range.push(i);\n  }\n  return range;\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nconst letters = \"xyzw\".split(\"\");\n\nconst index = {\n  0: -1,\n  x: 0,\n  y: 1,\n  z: 2,\n  w: 3,\n};\n\nconst parseOrder = function (order) {\n  if (order === \"\" + order) {\n    order = order.split(\"\");\n  }\n  if (order === +order) {\n    order = [order];\n  }\n  return order;\n};\n\nexport const toType = function (type) {\n  if (type === +type) {\n    type = \"vec\" + type;\n  }\n  if (type === \"vec1\") {\n    type = \"float\";\n  }\n  return type;\n};\n\nconst toFloatString = function (value) {\n  value = \"\" + value;\n  if (value.indexOf(\".\") < 0) {\n    return (value += \".0\");\n  }\n};\n\n// Helper for float to byte conversion on the w axis, for readback\nexport const mapByte2FloatOffset = function (stretch) {\n  if (stretch == null) {\n    stretch = 4;\n  }\n  const factor = toFloatString(stretch);\n  return `\\\nvec4 float2ByteIndex(vec4 xyzw, out float channelIndex) {\n  float relative = xyzw.w / ${factor};\n  float w = floor(relative);\n  channelIndex = (relative - w) * ${factor};\n  return vec4(xyzw.xyz, w);\n}\\\n`;\n};\n\n// Sample data texture array\nexport const sample2DArray = function (textures) {\n  const divide = function (a, b) {\n    let out;\n    if (a === b) {\n      out = `\\\nreturn texture2D(dataTextures[${a}], uv);\\\n`;\n    } else {\n      const mid = Math.ceil(a + (b - a) / 2);\n      out = `\\\nif (z < ${mid - 0.5}) {\n  ${divide(a, mid - 1)}\n}\nelse {\n  ${divide(mid, b)}\n}\\\n`;\n    }\n    return (out = out.replace(/\\n/g, \"\\n  \"));\n  };\n\n  const body = divide(0, textures - 1);\n\n  return `\\\nuniform sampler2D dataTextures[${textures}];\n\nvec4 sample2DArray(vec2 uv, float z) {\n  ${body}\n}\\\n`;\n};\n\n// Binary operator\nexport const binaryOperator = function (type, op, curry) {\n  type = toType(type);\n  if (curry != null) {\n    return `\\\n${type} binaryOperator(${type} a) {\n  return a ${op} ${curry};\n}\\\n`;\n  } else {\n    return `\\\n${type} binaryOperator(${type} a, ${type} b) {\n  return a ${op} b;\n}\\\n`;\n  }\n};\n\n// Extend to n-vector with zeroes\nexport const extendVec = function (from, to, value) {\n  if (value == null) {\n    value = 0;\n  }\n  if (from > to) {\n    return truncateVec(from, to);\n  }\n\n  const diff = to - from;\n\n  from = toType(from);\n  to = toType(to);\n\n  value = toFloatString(value);\n\n  const parts = __range__(0, diff, true).map(function (x) {\n    if (x) {\n      return value;\n    } else {\n      return \"v\";\n    }\n  });\n  const ctor = parts.join(\",\");\n\n  return `\\\n${to} extendVec(${from} v) { return ${to}(${ctor}); }\\\n`;\n};\n\n// Truncate n-vector\nexport const truncateVec = function (from, to) {\n  if (from < to) {\n    return extendVec(from, to);\n  }\n\n  const swizzle = \".\" + \"xyzw\".substr(0, to);\n\n  from = toType(from);\n  to = toType(to);\n\n  return `\\\n${to} truncateVec(${from} v) { return v${swizzle}; }\\\n`;\n};\n\n// Inject float into 4-component vector\nexport const injectVec4 = function (order) {\n  const swizzler = [\"0.0\", \"0.0\", \"0.0\", \"0.0\"];\n\n  order = parseOrder(order);\n  order = order.map(function (v) {\n    if (v === \"\" + v) {\n      return index[v];\n    } else {\n      return v;\n    }\n  });\n\n  for (let i = 0; i < order.length; i++) {\n    const channel = order[i];\n    swizzler[channel] = [\"a\", \"b\", \"c\", \"d\"][i];\n  }\n\n  const mask = swizzler.slice(0, 4).join(\", \");\n\n  const args = [\"float a\", \"float b\", \"float c\", \"float d\"].slice(\n    0,\n    order.length\n  );\n\n  return `\\\nvec4 inject(${args}) {\n  return vec4(${mask});\n}\\\n`;\n};\n\n// Apply 4-component vector swizzle\nexport const swizzleVec4 = function (order, size = null) {\n  const lookup = [\"0.0\", \"xyzw.x\", \"xyzw.y\", \"xyzw.z\", \"xyzw.w\"];\n\n  if (size == null) {\n    size = order.length;\n  }\n\n  order = parseOrder(order);\n  order = order.map(function (v) {\n    if (Array.from([0, 1, 2, 3, 4]).includes(+v)) {\n      v = +v;\n    }\n    if (v === \"\" + v) {\n      v = index[v] + 1;\n    }\n    return lookup[v];\n  });\n\n  while (order.length < size) {\n    order.push(\"0.0\");\n  }\n  const mask = order.join(\", \");\n\n  return `\\\nvec${size} swizzle(vec4 xyzw) {\n  return vec${size}(${mask});\n}\\\n`.replace(/vec1/g, \"float\");\n};\n\n// Invert full or truncated swizzles for pointer lookups\nexport const invertSwizzleVec4 = function (order) {\n  const swizzler = [\"0.0\", \"0.0\", \"0.0\", \"0.0\"];\n\n  order = parseOrder(order);\n  order = order.map(function (v) {\n    if (v === +v) {\n      return letters[v - 1];\n    } else {\n      return v;\n    }\n  });\n\n  for (let i = 0; i < order.length; i++) {\n    const letter = order[i];\n    const src = letters[i];\n    const j = index[letter];\n\n    swizzler[j] = `xyzw.${src}`;\n  }\n\n  const mask = swizzler.join(\", \");\n\n  return `\\\nvec4 invertSwizzle(vec4 xyzw) {\n  return vec4(${mask});\n}\\\n`;\n};\n\nexport const identity = function (type) {\n  let args = [].slice.call(arguments);\n  if (args.length > 1) {\n    args = args.map((t, i) =>\n      [\"inout\", t, String.fromCharCode(97 + i)].join(\" \")\n    );\n    args = args.join(\", \");\n    return `\\\nvoid identity(${args}) { }\\\n`;\n  } else {\n    return `\\\n${type} identity(${type} x) {\n  return x;\n}\\\n`;\n  }\n};\n\nexport const constant = (type, value) => `\\\n${type} constant() {\nreturn ${value};\n}\\\n`;\n\nfunction __range__(left, right, inclusive) {\n  const range = [];\n  const ascending = left < right;\n  const end = !inclusive ? right : ascending ? right + 1 : right - 1;\n  for (let i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {\n    range.push(i);\n  }\n  return range;\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as GLSL from \"../../../util/glsl.js\";\nimport { Primitive } from \"../../primitive.js\";\n\nexport class Source extends Primitive {\n  static initClass() {\n    this.traits = [\"node\", \"source\", \"index\"];\n  }\n\n  made() {\n    // Notify of buffer reallocation\n    return this.trigger({\n      type: \"source.rebuild\",\n    });\n  }\n\n  indexShader(shader) {\n    return shader.pipe(GLSL.identity(\"vec4\"));\n  }\n  sourceShader(shader) {\n    return shader.pipe(GLSL.identity(\"vec4\"));\n  }\n\n  getDimensions() {\n    return {\n      items: 1,\n      width: 1,\n      height: 1,\n      depth: 1,\n    };\n  }\n\n  getActiveDimensions() {\n    return this.getDimensions();\n  }\n\n  getIndexDimensions() {\n    return this.getActiveDimensions();\n  }\n  getFutureDimensions() {\n    return this.getActiveDimensions();\n  }\n}\nSource.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UData from \"../../../util/data.js\";\nimport { Source } from \"../base/source.js\";\n\nexport class Data extends Source {\n  static initClass() {\n    this.traits = [\"node\", \"data\", \"source\", \"index\", \"entity\", \"active\"];\n  }\n\n  init() {\n    this.dataEmitter = null;\n    return (this.dataSizes = null);\n  }\n\n  emitter(channels, items) {\n    let emitter, resolve;\n    const { data, bind, expr } = this.props;\n\n    if (data != null) {\n      // Make new emitter if data geometry doesn't match\n      const last = this.dataSizes;\n      const sizes = UData.getSizes(data);\n\n      if (!last || last.length !== sizes.length) {\n        // Create data thunk to copy (multi-)array\n        const thunk = UData.getThunk(data);\n        this.dataEmitter = this.callback(\n          UData.makeEmitter(thunk, items, channels)\n        );\n        this.dataSizes = sizes;\n      }\n\n      emitter = this.dataEmitter;\n    } else if (resolve != null) {\n      // Hook up data-bound expression to its source\n      resolve = this._inherit(\"resolve\");\n      emitter = this.callback(resolve.callback(bind));\n    } else if (expr != null) {\n      // Convert given free expression to appropriate callback\n      emitter = this.callback(expr);\n    } else {\n      // Passthrough\n      emitter = this.callback(this.passthrough);\n    }\n\n    return emitter;\n  }\n\n  callback(callback) {\n    return callback != null ? callback : function () {};\n  }\n\n  update() {}\n\n  make() {\n    this._helpers.active.make();\n\n    // Always run update at least once to prime JS VM optimization for entering elements\n    this.first = true;\n    return this._listen(\"root\", \"root.update\", () => {\n      if (this.isActive || this.first) {\n        this.update();\n      }\n      return (this.first = false);\n    });\n  }\n\n  unmake() {\n    this._helpers.active.unmake();\n\n    this.dataEmitter = null;\n    return (this.dataSizes = null);\n  }\n}\nData.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS202: Simplify dynamic range loops\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Data } from \"./data.js\";\n\nexport class Buffer extends Data {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"buffer\",\n      \"active\",\n      \"data\",\n      \"source\",\n      \"index\",\n      \"texture\",\n    ];\n  }\n\n  init() {\n    this.bufferSlack = 0;\n    this.bufferFrames = 0;\n\n    this.bufferTime = 0;\n    this.bufferDelta = 0;\n\n    this.bufferClock = 0;\n    this.bufferStep = 0;\n    super.init();\n  }\n\n  make() {\n    super.make();\n\n    return (this.clockParent = this._inherit(\"clock\"));\n  }\n\n  unmake() {\n    return super.unmake();\n  }\n\n  rawBuffer() {\n    return this.buffer;\n  }\n\n  emitter() {\n    const { channels, items } = this.props;\n\n    return super.emitter(channels, items);\n  }\n\n  change(changed, touched, init) {\n    if (changed[\"buffer.fps\"] || init) {\n      const { fps } = this.props;\n      return (this.bufferSlack = fps ? 0.5 / fps : 0);\n    }\n  }\n\n  syncBuffer(callback) {\n    let delta, step;\n    if (!this.buffer) {\n      return;\n    }\n    const { live, fps, hurry, limit, realtime, observe } = this.props;\n\n    const filled = this.buffer.getFilled();\n    if (!!filled && !live) {\n      return;\n    }\n\n    const time = this.clockParent.getTime();\n\n    if (fps != null) {\n      const slack = this.bufferSlack;\n      const speed = time.step / time.delta;\n      delta = realtime ? time.delta : time.step;\n      const frame = 1 / fps;\n      step = realtime && observe ? speed * frame : frame;\n\n      this.bufferSlack = Math.min(limit / fps, slack + delta);\n      this.bufferDelta = delta;\n      this.bufferStep = step;\n\n      let frames = Math.min(hurry, Math.floor(slack * fps));\n      if (!filled) {\n        frames = Math.max(1, frames);\n      }\n\n      let stop = false;\n      const abort = () => (stop = true);\n      return (() => {\n        const result = [];\n        for (\n          let i = 0, end = frames, asc = 0 <= end;\n          asc ? i < end : i > end;\n          asc ? i++ : i--\n        ) {\n          this.bufferTime += delta;\n          this.bufferClock += step;\n\n          if (stop) {\n            break;\n          }\n          callback(abort, this.bufferFrames++, i, frames);\n\n          result.push((this.bufferSlack -= frame));\n        }\n        return result;\n      })();\n    } else {\n      this.bufferTime = time.time;\n      this.bufferDelta = time.delta;\n      this.bufferClock = time.clock;\n      this.bufferStep = time.step;\n      return callback(function () {}, this.bufferFrames++, 0, 1);\n    }\n  }\n\n  alignShader(dims, shader) {\n    const { minFilter, magFilter, aligned } = this.props;\n    const mixed =\n      (dims.items > 1 && dims.width > 1) || (dims.height > 1 && dims.depth > 1);\n\n    if (aligned || !mixed) {\n      return;\n    }\n\n    const nearest =\n      minFilter === this.node.attributes[\"texture.minFilter\"].enum.nearest &&\n      magFilter === this.node.attributes[\"texture.magFilter\"].enum.nearest;\n\n    if (!nearest) {\n      console.warn(\n        `${this.node.toString()} - Cannot use linear min/magFilter with 3D/4D sampling`\n      );\n    }\n\n    return shader.pipe(\"map.xyzw.align\");\n  }\n}\nBuffer.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UData from \"../../../util/data.js\";\nimport { Buffer } from \"./buffer.js\";\n\nexport class Array_ extends Buffer {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"buffer\",\n      \"active\",\n      \"data\",\n      \"source\",\n      \"index\",\n      \"array\",\n      \"texture\",\n      \"raw\",\n    ];\n  }\n\n  init() {\n    this.buffer = this.spec = null;\n\n    this.space = {\n      width: 0,\n      history: 0,\n    };\n\n    this.used = { width: 0 };\n\n    this.storage = \"arrayBuffer\";\n    this.passthrough = (emit, x) => emit(x, 0, 0, 0);\n\n    return super.init();\n  }\n\n  sourceShader(shader) {\n    const dims = this.getDimensions();\n    this.alignShader(dims, shader);\n    return this.buffer.shader(shader);\n  }\n\n  getDimensions() {\n    return {\n      items: this.items,\n      width: this.space.width,\n      height: this.space.history,\n      depth: 1,\n    };\n  }\n\n  getActiveDimensions() {\n    return {\n      items: this.items,\n      width: this.used.width,\n      height: this.buffer.getFilled(),\n      depth: 1,\n    };\n  }\n\n  getFutureDimensions() {\n    return {\n      items: this.items,\n      width: this.used.width,\n      height: this.space.history,\n      depth: 1,\n    };\n  }\n\n  getRawDimensions() {\n    return {\n      items: this.items,\n      width: this.space.width,\n      height: 1,\n      depth: 1,\n    };\n  }\n\n  make() {\n    super.make();\n\n    // Read sampling parameters\n    const minFilter =\n      this.minFilter != null ? this.minFilter : this.props.minFilter;\n    const magFilter =\n      this.magFilter != null ? this.magFilter : this.props.magFilter;\n    const type = this.type != null ? this.type : this.props.type;\n\n    // Read given dimensions\n    const { width } = this.props;\n    const { history } = this.props;\n    const reserve = this.props.bufferWidth;\n    const { channels } = this.props;\n    const { items } = this.props;\n\n    let dims = (this.spec = { channels, items, width });\n\n    this.items = dims.items;\n    this.channels = dims.channels;\n\n    // Init to right size if data supplied\n    const { data } = this.props;\n    dims = UData.getDimensions(data, dims);\n\n    const { space } = this;\n    space.width = Math.max(reserve, dims.width || 1);\n    space.history = history;\n\n    // Create array buffer\n    return (this.buffer = this._renderables.make(this.storage, {\n      width: space.width,\n      history: space.history,\n      channels,\n      items,\n      minFilter,\n      magFilter,\n      type,\n    }));\n  }\n\n  unmake() {\n    super.unmake();\n    if (this.buffer) {\n      this.buffer.dispose();\n      return (this.buffer = this.spec = null);\n    }\n  }\n\n  change(changed, touched, init) {\n    if (\n      touched[\"texture\"] ||\n      changed[\"history.history\"] ||\n      changed[\"buffer.channels\"] ||\n      changed[\"buffer.items\"] ||\n      changed[\"array.bufferWidth\"]\n    ) {\n      return this.rebuild();\n    }\n\n    if (!this.buffer) {\n      return;\n    }\n\n    if (changed[\"array.width\"]) {\n      const { width } = this.props;\n      if (width > this.space.width) {\n        return this.rebuild();\n      }\n    }\n\n    if (\n      changed[\"data.map\"] ||\n      changed[\"data.data\"] ||\n      changed[\"data.resolve\"] ||\n      changed[\"data.expr\"] ||\n      init\n    ) {\n      return this.buffer.setCallback(this.emitter());\n    }\n  }\n\n  callback(callback) {\n    if (callback.length <= 2) {\n      return callback;\n    } else {\n      return (emit, i) => {\n        return callback(emit, i, this.bufferClock, this.bufferStep);\n      };\n    }\n  }\n\n  update() {\n    if (!this.buffer) {\n      return;\n    }\n\n    const { data } = this.props;\n    const { space, used } = this;\n    const l = used.width;\n\n    const filled = this.buffer.getFilled();\n\n    this.syncBuffer((abort) => {\n      if (data != null) {\n        const dims = UData.getDimensions(data, this.spec);\n\n        // Grow width if needed\n        if (dims.width > space.width) {\n          abort();\n          return this.rebuild();\n        }\n\n        used.width = dims.width;\n\n        this.buffer.setActive(used.width);\n        if (typeof this.buffer.callback.rebind === \"function\") {\n          this.buffer.callback.rebind(data);\n        }\n        return this.buffer.update();\n      } else {\n        let width = this.spec.width || 1;\n\n        this.buffer.setActive(width);\n\n        width = this.buffer.update();\n        return (used.width = width);\n      }\n    });\n\n    if (used.width !== l || filled !== this.buffer.getFilled()) {\n      return this.trigger({\n        type: \"source.resize\",\n      });\n    }\n  }\n}\nArray_.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Array_ } from \"./array.js\";\n\nexport class Interval extends Array_ {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"buffer\",\n      \"active\",\n      \"data\",\n      \"source\",\n      \"index\",\n      \"texture\",\n      \"array\",\n      \"span\",\n      \"interval\",\n      \"sampler\",\n      \"raw\",\n    ];\n  }\n\n  updateSpan() {\n    let inverse;\n    const dimension = this.props.axis;\n    let { width } = this.props;\n    const { centered } = this.props;\n    const pad = this.props.padding;\n\n    const range = this._helpers.span.get(\"\", dimension);\n\n    width += pad * 2;\n\n    this.a = range.x;\n    const span = range.y - range.x;\n\n    if (centered) {\n      inverse = 1 / Math.max(1, width);\n      this.a += (span * inverse) / 2;\n    } else {\n      inverse = 1 / Math.max(1, width - 1);\n    }\n\n    this.b = span * inverse;\n\n    return (this.a += pad * this.b);\n  }\n\n  callback(callback) {\n    this.updateSpan();\n\n    if (this.last === callback) {\n      return this._callback;\n    }\n    this.last = callback;\n\n    if (callback.length <= 3) {\n      return (this._callback = (emit, i) => {\n        const x = this.a + this.b * i;\n        return callback(emit, x, i);\n      });\n    } else {\n      return (this._callback = (emit, i) => {\n        const x = this.a + this.b * i;\n        return callback(emit, x, i, this.bufferClock, this.bufferStep);\n      });\n    }\n  }\n\n  make() {\n    super.make();\n    this._helpers.span.make();\n    return this._listen(this, \"span.range\", this.updateSpan);\n  }\n\n  unmake() {\n    super.unmake();\n    return this._helpers.span.unmake();\n  }\n}\nInterval.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UData from \"../../../util/data.js\";\nimport { Buffer } from \"./buffer.js\";\n\nexport class Matrix extends Buffer {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"buffer\",\n      \"active\",\n      \"data\",\n      \"source\",\n      \"index\",\n      \"texture\",\n      \"matrix\",\n      \"raw\",\n    ];\n  }\n\n  init() {\n    this.buffer = this.spec = null;\n\n    this.space = {\n      width: 0,\n      height: 0,\n      history: 0,\n    };\n\n    this.used = {\n      width: 0,\n      height: 0,\n    };\n\n    this.storage = \"matrixBuffer\";\n    this.passthrough = (emit, x, y) => emit(x, y, 0, 0);\n\n    return super.init();\n  }\n\n  sourceShader(shader) {\n    const dims = this.getDimensions();\n    this.alignShader(dims, shader);\n    return this.buffer.shader(shader);\n  }\n\n  getDimensions() {\n    return {\n      items: this.items,\n      width: this.space.width,\n      height: this.space.height,\n      depth: this.space.history,\n    };\n  }\n\n  getActiveDimensions() {\n    return {\n      items: this.items,\n      width: this.used.width,\n      height: this.used.height,\n      depth: this.buffer.getFilled(),\n    };\n  }\n\n  getFutureDimensions() {\n    return {\n      items: this.items,\n      width: this.used.width,\n      height: this.used.height,\n      depth: this.space.history,\n    };\n  }\n\n  getRawDimensions() {\n    return {\n      items: this.items,\n      width: this.space.width,\n      height: this.space.height,\n      depth: 1,\n    };\n  }\n\n  make() {\n    super.make();\n\n    // Read sampling parameters\n    const minFilter =\n      this.minFilter != null ? this.minFilter : this.props.minFilter;\n    const magFilter =\n      this.magFilter != null ? this.magFilter : this.props.magFilter;\n    const type = this.type != null ? this.type : this.props.type;\n\n    // Read given dimensions\n    const { width } = this.props;\n    const { height } = this.props;\n    const { history } = this.props;\n    const reserveX = this.props.bufferWidth;\n    const reserveY = this.props.bufferHeight;\n    const { channels } = this.props;\n    const { items } = this.props;\n\n    let dims = (this.spec = { channels, items, width, height });\n\n    this.items = dims.items;\n    this.channels = dims.channels;\n\n    // Init to right size if data supplied\n    const { data } = this.props;\n    dims = UData.getDimensions(data, dims);\n\n    const { space } = this;\n    space.width = Math.max(reserveX, dims.width || 1);\n    space.height = Math.max(reserveY, dims.height || 1);\n    space.history = history;\n\n    // Create matrix buffer\n    return (this.buffer = this._renderables.make(this.storage, {\n      width: space.width,\n      height: space.height,\n      history: space.history,\n      channels,\n      items,\n      minFilter,\n      magFilter,\n      type,\n    }));\n  }\n\n  unmake() {\n    super.unmake();\n    if (this.buffer) {\n      this.buffer.dispose();\n      return (this.buffer = this.spec = null);\n    }\n  }\n\n  change(changed, touched, init) {\n    if (\n      touched[\"texture\"] ||\n      changed[\"matrix.history\"] ||\n      changed[\"buffer.channels\"] ||\n      changed[\"buffer.items\"] ||\n      changed[\"matrix.bufferWidth\"] ||\n      changed[\"matrix.bufferHeight\"]\n    ) {\n      return this.rebuild();\n    }\n\n    if (!this.buffer) {\n      return;\n    }\n\n    if (changed[\"matrix.width\"]) {\n      const { width } = this.props;\n      if (width > this.space.width) {\n        return this.rebuild();\n      }\n    }\n\n    if (changed[\"matrix.height\"]) {\n      const { height } = this.props;\n      if (height > this.space.height) {\n        return this.rebuild();\n      }\n    }\n\n    if (\n      changed[\"data.map\"] ||\n      changed[\"data.data\"] ||\n      changed[\"data.resolve\"] ||\n      changed[\"data.expr\"] ||\n      init\n    ) {\n      return this.buffer.setCallback(this.emitter());\n    }\n  }\n\n  callback(callback) {\n    if (callback.length <= 3) {\n      return callback;\n    } else {\n      return (emit, i, j) => {\n        return callback(emit, i, j, this.bufferClock, this.bufferStep);\n      };\n    }\n  }\n\n  update() {\n    if (!this.buffer) {\n      return;\n    }\n\n    const { data } = this.props;\n    const { space, used } = this;\n    const w = used.width;\n    const h = used.height;\n\n    const filled = this.buffer.getFilled();\n\n    this.syncBuffer((abort) => {\n      if (data != null) {\n        const dims = UData.getDimensions(data, this.spec);\n\n        // Grow if needed\n        if (dims.width > space.width || dims.height > space.height) {\n          abort();\n          return this.rebuild();\n        }\n\n        used.width = dims.width;\n        used.height = dims.height;\n\n        this.buffer.setActive(used.width, used.height);\n        if (typeof this.buffer.callback.rebind === \"function\") {\n          this.buffer.callback.rebind(data);\n        }\n        return this.buffer.update();\n      } else {\n        let _w;\n        const width = this.spec.width || 1;\n        const height = this.spec.height || 1;\n\n        this.buffer.setActive(width, height);\n\n        const length = this.buffer.update();\n\n        used.width = _w = width;\n        used.height = Math.ceil(length / _w);\n        if (used.height === 1) {\n          return (used.width = length);\n        }\n      }\n    });\n\n    if (\n      used.width !== w ||\n      used.height !== h ||\n      filled !== this.buffer.getFilled()\n    ) {\n      return this.trigger({\n        type: \"source.resize\",\n      });\n    }\n  }\n}\nMatrix.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { Matrix } from \"./matrix.js\";\n\nexport class Area extends Matrix {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"buffer\",\n      \"active\",\n      \"data\",\n      \"source\",\n      \"index\",\n      \"matrix\",\n      \"texture\",\n      \"raw\",\n      \"span:x\",\n      \"span:y\",\n      \"area\",\n      \"sampler:x\",\n      \"sampler:y\",\n    ];\n  }\n\n  updateSpan() {\n    let inverseX, inverseY;\n    const dimensions = this.props.axes;\n    let { width } = this.props;\n    let { height } = this.props;\n\n    const { centeredX } = this.props;\n    const { centeredY } = this.props;\n\n    const padX = this.props.paddingX;\n    const padY = this.props.paddingY;\n\n    const rangeX = this._helpers.span.get(\"x.\", dimensions[0]);\n    const rangeY = this._helpers.span.get(\"y.\", dimensions[1]);\n\n    this.aX = rangeX.x;\n    this.aY = rangeY.x;\n\n    const spanX = rangeX.y - rangeX.x;\n    const spanY = rangeY.y - rangeY.x;\n\n    width += padX * 2;\n    height += padY * 2;\n\n    if (centeredX) {\n      inverseX = 1 / Math.max(1, width);\n      this.aX += (spanX * inverseX) / 2;\n    } else {\n      inverseX = 1 / Math.max(1, width - 1);\n    }\n\n    if (centeredY) {\n      inverseY = 1 / Math.max(1, height);\n      this.aY += (spanY * inverseY) / 2;\n    } else {\n      inverseY = 1 / Math.max(1, height - 1);\n    }\n\n    this.bX = spanX * inverseX;\n    this.bY = spanY * inverseY;\n\n    this.aX += padX * this.bX;\n    return (this.aY += padY * this.bY);\n  }\n\n  callback(callback) {\n    this.updateSpan();\n\n    if (this.last === callback) {\n      return this._callback;\n    }\n    this.last = callback;\n\n    if (callback.length <= 5) {\n      return (this._callback = (emit, i, j) => {\n        const x = this.aX + this.bX * i;\n        const y = this.aY + this.bY * j;\n        return callback(emit, x, y, i, j);\n      });\n    } else {\n      return (this._callback = (emit, i, j) => {\n        const x = this.aX + this.bX * i;\n        const y = this.aY + this.bY * j;\n        return callback(emit, x, y, i, j, this.bufferClock, this.bufferStep);\n      });\n    }\n  }\n\n  make() {\n    super.make();\n    this._helpers.span.make();\n    return this._listen(this, \"span.range\", this.updateSpan);\n  }\n\n  unmake() {\n    super.unmake();\n    return this._helpers.span.unmake();\n  }\n}\nArea.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS002: Fix invalid constructor\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UData from \"../../../util/data.js\";\nimport { Buffer } from \"./buffer.js\";\n\nexport class Voxel extends Buffer {\n  constructor(...args) {\n    super(...args);\n    this.update = this.update.bind(this);\n  }\n\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"buffer\",\n      \"active\",\n      \"data\",\n      \"source\",\n      \"index\",\n      \"texture\",\n      \"voxel\",\n      \"raw\",\n    ];\n  }\n\n  init() {\n    this.buffer = this.spec = null;\n\n    this.space = {\n      width: 0,\n      height: 0,\n      depth: 0,\n    };\n\n    this.used = {\n      width: 0,\n      height: 0,\n      depth: 0,\n    };\n\n    this.storage = \"voxelBuffer\";\n    this.passthrough = (emit, x, y, z) => emit(x, y, z, 0);\n    super.init();\n  }\n\n  sourceShader(shader) {\n    const dims = this.getDimensions();\n    this.alignShader(dims, shader);\n    return this.buffer.shader(shader);\n  }\n\n  getDimensions() {\n    return {\n      items: this.items,\n      width: this.space.width,\n      height: this.space.height,\n      depth: this.space.depth,\n    };\n  }\n\n  getActiveDimensions() {\n    return {\n      items: this.items,\n      width: this.used.width,\n      height: this.used.height,\n      depth: this.used.depth * this.buffer.getFilled(),\n    };\n  }\n\n  getRawDimensions() {\n    return this.getDimensions();\n  }\n\n  make() {\n    super.make();\n\n    // Read sampling parameters\n    const minFilter =\n      this.minFilter != null ? this.minFilter : this.props.minFilter;\n    const magFilter =\n      this.magFilter != null ? this.magFilter : this.props.magFilter;\n    const type = this.type != null ? this.type : this.props.type;\n\n    // Read given dimensions\n    const { width } = this.props;\n    const { height } = this.props;\n    const { depth } = this.props;\n    const reserveX = this.props.bufferWidth;\n    const reserveY = this.props.bufferHeight;\n    const reserveZ = this.props.bufferDepth;\n    const { channels } = this.props;\n    const { items } = this.props;\n\n    let dims = (this.spec = { channels, items, width, height, depth });\n\n    this.items = dims.items;\n    this.channels = dims.channels;\n\n    // Init to right size if data supplied\n    const { data } = this.props;\n    dims = UData.getDimensions(data, dims);\n\n    const { space } = this;\n    space.width = Math.max(reserveX, dims.width || 1);\n    space.height = Math.max(reserveY, dims.height || 1);\n    space.depth = Math.max(reserveZ, dims.depth || 1);\n\n    // Create voxel buffer\n    return (this.buffer = this._renderables.make(this.storage, {\n      width: space.width,\n      height: space.height,\n      depth: space.depth,\n      channels,\n      items,\n      minFilter,\n      magFilter,\n      type,\n    }));\n  }\n\n  unmake() {\n    super.unmake();\n    if (this.buffer) {\n      this.buffer.dispose();\n      return (this.buffer = this.spec = null);\n    }\n  }\n\n  change(changed, touched, init) {\n    if (\n      touched[\"texture\"] ||\n      changed[\"buffer.channels\"] ||\n      changed[\"buffer.items\"] ||\n      changed[\"voxel.bufferWidth\"] ||\n      changed[\"voxel.bufferHeight\"] ||\n      changed[\"voxel.bufferDepth\"]\n    ) {\n      return this.rebuild();\n    }\n\n    if (!this.buffer) {\n      return;\n    }\n\n    if (changed[\"voxel.width\"]) {\n      const { width } = this.props;\n      if (width > this.space.width) {\n        return this.rebuild();\n      }\n    }\n\n    if (changed[\"voxel.height\"]) {\n      const { height } = this.props;\n      if (height > this.space.height) {\n        return this.rebuild();\n      }\n    }\n\n    if (changed[\"voxel.depth\"]) {\n      const { depth } = this.props;\n      if (depth > this.space.depth) {\n        return this.rebuild();\n      }\n    }\n\n    if (\n      changed[\"data.map\"] ||\n      changed[\"data.data\"] ||\n      changed[\"data.resolve\"] ||\n      changed[\"data.expr\"] ||\n      init\n    ) {\n      return this.buffer.setCallback(this.emitter());\n    }\n  }\n\n  callback(callback) {\n    if (callback.length <= 4) {\n      return callback;\n    } else {\n      return (emit, i, j, k) => {\n        return callback(emit, i, j, k, this.bufferClock, this.bufferStep);\n      };\n    }\n  }\n\n  update() {\n    if (!this.buffer) {\n      return;\n    }\n\n    const { data } = this.props;\n    const { space, used } = this;\n    const w = used.width;\n    const h = used.height;\n    const d = used.depth;\n\n    const filled = this.buffer.getFilled();\n\n    this.syncBuffer((abort) => {\n      if (data != null) {\n        const dims = UData.getDimensions(data, this.spec);\n\n        // Grow dimensions if needed\n        if (\n          dims.width > space.width ||\n          dims.height > space.height ||\n          dims.depth > space.depth\n        ) {\n          abort();\n          return this.rebuild();\n        }\n\n        used.width = dims.width;\n        used.height = dims.height;\n        used.depth = dims.depth;\n\n        this.buffer.setActive(used.width, used.height, used.depth);\n        if (typeof this.buffer.callback.rebind === \"function\") {\n          this.buffer.callback.rebind(data);\n        }\n        return this.buffer.update();\n      } else {\n        let _h, _w;\n        const width = this.spec.width || 1;\n        const height = this.spec.height || 1;\n        const depth = this.spec.depth || 1;\n\n        this.buffer.setActive(width, height, depth);\n\n        const length = this.buffer.update();\n\n        used.width = _w = width;\n        used.height = _h = height;\n        used.depth = Math.ceil(length / _w / _h);\n\n        if (used.depth === 1) {\n          used.height = Math.ceil(length / _w);\n          if (used.height === 1) {\n            return (used.width = length);\n          }\n        }\n      }\n    });\n\n    if (\n      used.width !== w ||\n      used.height !== h ||\n      used.depth !== d ||\n      filled !== this.buffer.getFilled()\n    ) {\n      return this.trigger({\n        type: \"source.resize\",\n      });\n    }\n  }\n}\nVoxel.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Voxel } from \"./voxel.js\";\n\nexport class Volume extends Voxel {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"buffer\",\n      \"active\",\n      \"data\",\n      \"source\",\n      \"index\",\n      \"texture\",\n      \"voxel\",\n      \"span:x\",\n      \"span:y\",\n      \"span:z\",\n      \"volume\",\n      \"sampler:x\",\n      \"sampler:y\",\n      \"sampler:z\",\n      \"raw\",\n    ];\n  }\n\n  updateSpan() {\n    let inverseX, inverseY, inverseZ;\n    const dimensions = this.props.axes;\n    let { width } = this.props;\n    let { height } = this.props;\n    let { depth } = this.props;\n\n    const { centeredX } = this.props;\n    const { centeredY } = this.props;\n    const { centeredZ } = this.props;\n\n    const padX = this.props.paddingX;\n    const padY = this.props.paddingY;\n    const padZ = this.props.paddingZ;\n\n    const rangeX = this._helpers.span.get(\"x.\", dimensions[0]);\n    const rangeY = this._helpers.span.get(\"y.\", dimensions[1]);\n    const rangeZ = this._helpers.span.get(\"z.\", dimensions[2]);\n\n    this.aX = rangeX.x;\n    this.aY = rangeY.x;\n    this.aZ = rangeZ.x;\n\n    const spanX = rangeX.y - rangeX.x;\n    const spanY = rangeY.y - rangeY.x;\n    const spanZ = rangeZ.y - rangeZ.x;\n\n    width += padX * 2;\n    height += padY * 2;\n    depth += padZ * 2;\n\n    if (centeredX) {\n      inverseX = 1 / Math.max(1, width);\n      this.aX += (spanX * inverseX) / 2;\n    } else {\n      inverseX = 1 / Math.max(1, width - 1);\n    }\n\n    if (centeredY) {\n      inverseY = 1 / Math.max(1, height);\n      this.aY += (spanY * inverseY) / 2;\n    } else {\n      inverseY = 1 / Math.max(1, height - 1);\n    }\n\n    if (centeredZ) {\n      inverseZ = 1 / Math.max(1, depth);\n      this.aZ += (spanZ * inverseZ) / 2;\n    } else {\n      inverseZ = 1 / Math.max(1, depth - 1);\n    }\n\n    this.bX = spanX * inverseX;\n    this.bY = spanY * inverseY;\n    this.bZ = spanZ * inverseZ;\n\n    this.aX += this.bX * padX;\n    this.aY += this.bY * padY;\n    return (this.aZ += this.bZ * padY);\n  }\n\n  callback(callback) {\n    this.updateSpan();\n\n    if (this.last === callback) {\n      return this._callback;\n    }\n    this.last = callback;\n\n    if (callback.length <= 7) {\n      return (this._callback = (emit, i, j, k) => {\n        const x = this.aX + this.bX * i;\n        const y = this.aY + this.bY * j;\n        const z = this.aZ + this.bZ * k;\n        return callback(emit, x, y, z, i, j, k);\n      });\n    } else {\n      return (this._callback = (emit, i, j, k) => {\n        const x = this.aX + this.bX * i;\n        const y = this.aY + this.bY * j;\n        const z = this.aZ + this.bZ * k;\n        return callback(\n          emit,\n          x,\n          y,\n          z,\n          i,\n          j,\n          k,\n          this.bufferClock,\n          this.bufferStep\n        );\n      });\n    }\n  }\n\n  make() {\n    super.make();\n    this._helpers.span.make();\n    return this._listen(this, \"span.range\", this.updateSpan);\n  }\n\n  unmake() {\n    super.unmake();\n    return this._helpers.span.unmake();\n  }\n}\nVolume.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Vector4 } from \"three/src/math/Vector4.js\";\n\nexport const setOrigin = function (vec, dimensions, origin) {\n  if (+dimensions === dimensions) {\n    dimensions = [dimensions];\n  }\n  const x = Array.from(dimensions).includes(1) ? 0 : origin.x;\n  const y = Array.from(dimensions).includes(2) ? 0 : origin.y;\n  const z = Array.from(dimensions).includes(3) ? 0 : origin.z;\n  const w = Array.from(dimensions).includes(4) ? 0 : origin.w;\n  return vec.set(x, y, z, w);\n};\n\nexport const addOrigin = (function () {\n  const v = new Vector4();\n  return function (vec, dimension, origin) {\n    setOrigin(v, dimension, origin);\n    return vec.add(v);\n  };\n})();\n\nexport const setDimension = function (vec, dimension) {\n  const x = dimension === 1 ? 1 : 0;\n  const y = dimension === 2 ? 1 : 0;\n  const z = dimension === 3 ? 1 : 0;\n  const w = dimension === 4 ? 1 : 0;\n  return vec.set(x, y, z, w);\n};\n\nexport const setDimensionNormal = function (vec, dimension) {\n  const x = dimension === 1 ? 1 : 0;\n  const y = dimension === 2 ? 1 : 0;\n  const z = dimension === 3 ? 1 : 0;\n  const w = dimension === 4 ? 1 : 0;\n  return vec.set(y, z + x, w, 0);\n};\n\nexport const recenterAxis = (function () {\n  const axis = [0, 0];\n\n  return function (x, dx, bend, f) {\n    if (f == null) {\n      f = 0;\n    }\n    if (bend > 0) {\n      const x1 = x;\n      const x2 = x + dx;\n\n      const abs = Math.max(Math.abs(x1), Math.abs(x2));\n      const fabs = abs * f;\n\n      const min = Math.min(x1, x2);\n      const max = Math.max(x1, x2);\n\n      x = min + (-abs + fabs - min) * bend;\n      dx = max + (abs + fabs - max) * bend - x;\n    }\n\n    axis[0] = x;\n    axis[1] = dx;\n    return axis;\n  };\n})();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UAxis from \"../../../util/axis.js\";\nimport { Source } from \"../base/source.js\";\n\nexport class Scale extends Source {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"source\",\n      \"index\",\n      \"interval\",\n      \"span\",\n      \"scale\",\n      \"raw\",\n      \"origin\",\n    ];\n  }\n\n  init() {\n    return (this.used = this.space = this.scaleAxis = this.sampler = null);\n  }\n\n  rawBuffer() {\n    return this.buffer;\n  }\n\n  sourceShader(shader) {\n    return shader.pipe(this.sampler);\n  }\n\n  getDimensions() {\n    return {\n      items: 1,\n      width: this.space,\n      height: 1,\n      depth: 1,\n    };\n  }\n\n  getActiveDimensions() {\n    return {\n      items: 1,\n      width: this.used,\n      height: this.buffer.getFilled(),\n      depth: 1,\n    };\n  }\n\n  getRawDimensions() {\n    return this.getDimensions();\n  }\n\n  make() {\n    // Prepare data buffer of tick positions\n    let samples;\n    this.space = samples = this._helpers.scale.divide(\"\");\n\n    this.buffer = this._renderables.make(\"dataBuffer\", {\n      width: samples,\n      channels: 1,\n      items: 1,\n    });\n\n    // Prepare position shader\n    const positionUniforms = {\n      scaleAxis: this._attributes.make(this._types.vec4()),\n      scaleOffset: this._attributes.make(this._types.vec4()),\n    };\n\n    this.scaleAxis = positionUniforms.scaleAxis.value;\n    this.scaleOffset = positionUniforms.scaleOffset.value;\n\n    // Build sampler\n    const p = (this.sampler = this._shaders.shader());\n    // Require buffer sampler as callback\n    p.require(this.buffer.shader(this._shaders.shader(), 1));\n    // Shader to expand scalars to 4D vector on an axis.\n    p.pipe(\"scale.position\", positionUniforms);\n\n    this._helpers.span.make();\n\n    // Monitor view range\n    return this._listen(this, \"span.range\", this.updateRanges);\n  }\n\n  unmake() {\n    this.scaleAxis = null;\n\n    return this._helpers.span.unmake();\n  }\n\n  change(changed, touched, init) {\n    if (changed[\"scale.divide\"]) {\n      return this.rebuild();\n    }\n\n    if (\n      touched[\"view\"] ||\n      touched[\"interval\"] ||\n      touched[\"span\"] ||\n      touched[\"scale\"] ||\n      init\n    ) {\n      return this.updateRanges();\n    }\n  }\n\n  updateRanges() {\n    const { used } = this;\n\n    // Fetch range along axis\n    const { axis, origin } = this.props;\n    const range = this._helpers.span.get(\"\", axis);\n\n    // Calculate scale along axis\n    const min = range.x;\n    const max = range.y;\n    const ticks = this._helpers.scale.generate(\"\", this.buffer, min, max);\n\n    UAxis.setDimension(this.scaleAxis, axis);\n    UAxis.setOrigin(this.scaleOffset, axis, origin);\n\n    // Clip to number of ticks\n    this.used = ticks.length;\n\n    // Notify of resize\n    if (this.used !== used) {\n      return this.trigger({\n        type: \"source.resize\",\n      });\n    }\n  }\n}\nScale.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n// Merge multiple objects\nexport const merge = function () {\n  const x = {};\n  for (const obj of Array.from(arguments)) {\n    for (const k in obj) {\n      const v = obj[k];\n      x[k] = v;\n    }\n  }\n  return x;\n};\n\nexport const clone = (o) => JSON.parse(JSON.serialize(o));\n\nexport const parseQuoted = function (str) {\n  let accum = \"\";\n\n  const unescape = (str) => (str = str.replace(/\\\\/g, \"\"));\n  const munch = function (next) {\n    if (accum.length) {\n      list.push(unescape(accum));\n    }\n    return (accum = next != null ? next : \"\");\n  };\n\n  str = str.split(/(?=(?:\\\\.|[\"' ,]))/g);\n  let quote = false;\n  const list = [];\n\n  for (const chunk of Array.from(str)) {\n    const char = chunk[0];\n    const token = chunk.slice(1);\n    switch (char) {\n      case '\"':\n      case \"'\":\n        if (quote) {\n          if (quote === char) {\n            quote = false;\n            munch(token);\n          } else {\n            accum += chunk;\n          }\n        } else {\n          if (accum !== \"\") {\n            throw new Error(\n              `ParseError: String \\`${str}\\` does not contain comma-separated quoted tokens.`\n            );\n          }\n\n          quote = char;\n          accum += token;\n        }\n        break;\n      case \" \":\n      case \",\":\n        if (!quote) {\n          munch(token);\n        } else {\n          accum += chunk;\n        }\n        break;\n      default:\n        accum += chunk;\n    }\n  }\n  munch();\n  return list;\n};\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UAxis from \"../../../util/axis.js\";\nimport * as UJS from \"../../../util/js.js\";\nimport { Primitive } from \"../../primitive.js\";\n\nexport class Axis extends Primitive {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"object\",\n      \"visible\",\n      \"style\",\n      \"line\",\n      \"axis\",\n      \"span\",\n      \"interval\",\n      \"arrow\",\n      \"position\",\n      \"origin\",\n      \"shade\",\n    ];\n    this.defaults = {\n      end: true,\n      zBias: -1,\n    };\n  }\n\n  constructor(node, context, helpers) {\n    super(node, context, helpers);\n\n    this.axisPosition =\n      this.axisStep =\n      this.resolution =\n      this.line =\n      this.arrows =\n        null;\n  }\n\n  make() {\n    // Prepare position shader\n    const positionUniforms = {\n      axisPosition: this._attributes.make(this._types.vec4()),\n      axisStep: this._attributes.make(this._types.vec4()),\n    };\n\n    this.axisPosition = positionUniforms.axisPosition.value;\n    this.axisStep = positionUniforms.axisStep.value;\n\n    // Build transform chain\n    let position = this._shaders.shader();\n    position.pipe(\"axis.position\", positionUniforms);\n    position = this._helpers.position.pipeline(position);\n\n    // Prepare bound uniforms\n    const styleUniforms = this._helpers.style.uniforms();\n    const lineUniforms = this._helpers.line.uniforms();\n    const arrowUniforms = this._helpers.arrow.uniforms();\n    const unitUniforms = this._inherit(\"unit\").getUnitUniforms();\n\n    // Line geometry\n    const { detail } = this.props;\n    const samples = detail + 1;\n    this.resolution = 1 / detail;\n\n    // Clip start/end for terminating arrow\n    const { start, end } = this.props;\n\n    // Stroke style\n    const { stroke, join } = this.props;\n\n    // Build transition mask lookup\n    let mask = this._helpers.object.mask();\n\n    // Build fragment material lookup\n    const material = this._helpers.shade.pipeline() || false;\n\n    // Indexing by fixed or by given axis\n    const { crossed, axis } = this.props;\n    if (!crossed && mask != null && axis > 1) {\n      const swizzle = [\"x000\", \"y000\", \"z000\", \"w000\"][axis];\n      mask = this._helpers.position.swizzle(mask, swizzle);\n    }\n\n    // Make line renderable\n    const uniforms = UJS.merge(\n      arrowUniforms,\n      lineUniforms,\n      styleUniforms,\n      unitUniforms\n    );\n    this.line = this._renderables.make(\"line\", {\n      uniforms,\n      samples,\n      position,\n      clip: start || end,\n      stroke,\n      join,\n      mask,\n      material,\n    });\n\n    // Make arrow renderables\n    this.arrows = [];\n    if (start) {\n      this.arrows.push(\n        this._renderables.make(\"arrow\", {\n          uniforms,\n          flip: true,\n          samples,\n          position,\n          mask,\n          material,\n        })\n      );\n    }\n\n    if (end) {\n      this.arrows.push(\n        this._renderables.make(\"arrow\", {\n          uniforms,\n          samples,\n          position,\n          mask,\n          material,\n        })\n      );\n    }\n\n    // Visible, object and span traits\n    this._helpers.visible.make();\n    this._helpers.object.make(this.arrows.concat([this.line]));\n    this._helpers.span.make();\n\n    // Monitor view range\n    return this._listen(this, \"span.range\", this.updateRanges);\n  }\n\n  unmake() {\n    this._helpers.visible.unmake();\n    this._helpers.object.unmake();\n    return this._helpers.span.unmake();\n  }\n\n  change(changed, touched, init) {\n    if (\n      changed[\"axis.detail\"] ||\n      changed[\"line.stroke\"] ||\n      changed[\"line.join\"] ||\n      changed[\"axis.crossed\"] ||\n      (changed[\"interval.axis\"] && this.props.crossed)\n    ) {\n      return this.rebuild();\n    }\n\n    if (touched[\"interval\"] || touched[\"span\"] || touched[\"view\"] || init) {\n      return this.updateRanges();\n    }\n  }\n\n  updateRanges() {\n    const { axis, origin } = this.props;\n\n    const range = this._helpers.span.get(\"\", axis);\n\n    const min = range.x;\n    const max = range.y;\n\n    UAxis.setDimension(this.axisPosition, axis).multiplyScalar(min);\n    UAxis.setDimension(this.axisStep, axis).multiplyScalar(\n      (max - min) * this.resolution\n    );\n\n    return UAxis.addOrigin(this.axisPosition, axis, origin);\n  }\n}\nAxis.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UGLSL from \"../../../util/glsl.js\";\nimport * as UJS from \"../../../util/js.js\";\nimport { Primitive } from \"../../primitive.js\";\n\nexport class Face extends Primitive {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"object\",\n      \"visible\",\n      \"style\",\n      \"line\",\n      \"mesh\",\n      \"face\",\n      \"geometry\",\n      \"position\",\n      \"bind\",\n      \"shade\",\n    ];\n  }\n\n  constructor(node, context, helpers) {\n    super(node, context, helpers);\n\n    this.face = null;\n  }\n\n  resize() {\n    if (this.bind.points == null) {\n      return;\n    }\n\n    const dims = this.bind.points.getActiveDimensions();\n    const { items, width, height, depth } = dims;\n\n    if (this.face) {\n      this.face.geometry.clip(width, height, depth, items);\n    }\n    if (this.line) {\n      this.line.geometry.clip(items, width, height, depth);\n    }\n\n    if (this.bind.map != null) {\n      const map = this.bind.map.getActiveDimensions();\n      if (this.face) {\n        return this.face.geometry.map(\n          map.width,\n          map.height,\n          map.depth,\n          map.items\n        );\n      }\n    }\n  }\n\n  make() {\n    // Bind to attached data sources\n    let color, uniforms;\n    this._helpers.bind.make([\n      { to: \"geometry.points\", trait: \"source\" },\n      { to: \"geometry.colors\", trait: \"source\" },\n      { to: \"mesh.map\", trait: \"source\" },\n    ]);\n\n    if (this.bind.points == null) {\n      return;\n    }\n\n    // Fetch position and transform to view\n    let position = this.bind.points.sourceShader(this._shaders.shader());\n    position = this._helpers.position.pipeline(position);\n\n    // Prepare bound uniforms\n    const styleUniforms = this._helpers.style.uniforms();\n    const lineUniforms = this._helpers.line.uniforms();\n    const unitUniforms = this._inherit(\"unit\").getUnitUniforms();\n\n    // Auto z-bias wireframe over surface\n    const wireUniforms = {};\n    wireUniforms.styleZBias = this._attributes.make(this._types.number());\n    this.wireZBias = wireUniforms.styleZBias;\n\n    // Fetch geometry dimensions\n    const dims = this.bind.points.getDimensions();\n    const { items, width, height, depth } = dims;\n\n    // Get display properties\n    const { line, shaded, fill, stroke, join } = this.props;\n\n    // Build color lookup\n    if (this.bind.colors) {\n      color = this._shaders.shader();\n      this.bind.colors.sourceShader(color);\n    }\n\n    // Build transition mask lookup\n    const mask = this._helpers.object.mask();\n\n    // Build texture map lookup\n    const map = this._helpers.shade.map(\n      this.bind.map != null\n        ? this.bind.map.sourceShader(this._shaders.shader())\n        : undefined\n    );\n\n    // Build fragment material lookup\n    const material = this._helpers.shade.pipeline();\n    const faceMaterial = material || shaded;\n    const lineMaterial = material || false;\n\n    const objects = [];\n\n    // Make line renderable\n    if (line) {\n      // Swizzle face edges into segments\n      const swizzle = this._shaders.shader();\n      swizzle.pipe(UGLSL.swizzleVec4(\"yzwx\"));\n      swizzle.pipe(position);\n\n      uniforms = UJS.merge(\n        unitUniforms,\n        lineUniforms,\n        styleUniforms,\n        wireUniforms\n      );\n      this.line = this._renderables.make(\"line\", {\n        uniforms,\n        samples: items,\n        strips: width,\n        ribbons: height,\n        layers: depth,\n        position: swizzle,\n        color,\n        stroke,\n        join,\n        material: lineMaterial,\n        mask,\n        closed: true,\n      });\n      objects.push(this.line);\n    }\n\n    // Make face renderable\n    if (fill) {\n      uniforms = UJS.merge(unitUniforms, styleUniforms, {});\n      this.face = this._renderables.make(\"face\", {\n        uniforms,\n        width,\n        height,\n        depth,\n        items,\n        position,\n        color,\n        material: faceMaterial,\n        mask,\n        map,\n      });\n      objects.push(this.face);\n    }\n\n    this._helpers.visible.make();\n    return this._helpers.object.make(objects);\n  }\n\n  made() {\n    return this.resize();\n  }\n\n  unmake() {\n    this._helpers.bind.unmake();\n    this._helpers.visible.unmake();\n    this._helpers.object.unmake();\n\n    return (this.face = this.line = null);\n  }\n\n  change(changed, touched, init) {\n    if (changed[\"geometry.points\"] || touched[\"mesh\"]) {\n      return this.rebuild();\n    }\n\n    if (changed[\"style.zBias\"] || changed[\"mesh.lineBias\"] || init) {\n      const { fill, zBias, lineBias } = this.props;\n      return (this.wireZBias.value = zBias + (fill ? lineBias : 0));\n    }\n  }\n}\nFace.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UAxis from \"../../../util/axis.js\";\nimport * as UJS from \"../../../util/js.js\";\nimport { Primitive } from \"../../primitive.js\";\n\nexport class Grid extends Primitive {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"object\",\n      \"visible\",\n      \"style\",\n      \"line\",\n      \"grid\",\n      \"area\",\n      \"position\",\n      \"origin\",\n      \"shade\",\n      \"axis:x\",\n      \"axis:y\",\n      \"scale:x\",\n      \"scale:y\",\n      \"span:x\",\n      \"span:y\",\n    ];\n    this.defaults = {\n      width: 1,\n      zBias: -2,\n    };\n  }\n\n  constructor(node, context, helpers) {\n    super(node, context, helpers);\n\n    this.axes = null;\n  }\n\n  make() {\n    // Build transition mask lookup\n    let axis;\n    let mask = this._helpers.object.mask();\n\n    // Build fragment material lookup\n    const material = this._helpers.shade.pipeline() || false;\n\n    axis = (first, second, transpose) => {\n      // Prepare data buffer of tick positions\n      let position;\n      const detail = this._get(first + \"axis.detail\");\n      const samples = detail + 1;\n      const resolution = 1 / detail;\n\n      const strips = this._helpers.scale.divide(second);\n      const buffer = this._renderables.make(\"dataBuffer\", {\n        width: strips,\n        channels: 1,\n      });\n\n      // Prepare position shader\n      const positionUniforms = {\n        gridPosition: this._attributes.make(this._types.vec4()),\n        gridStep: this._attributes.make(this._types.vec4()),\n        gridAxis: this._attributes.make(this._types.vec4()),\n      };\n\n      const values = {\n        gridPosition: positionUniforms.gridPosition.value,\n        gridStep: positionUniforms.gridStep.value,\n        gridAxis: positionUniforms.gridAxis.value,\n      };\n\n      // Build transform chain\n      const p = (position = this._shaders.shader());\n\n      // Align second grid with first in mask space if requested\n      if (transpose != null && mask != null) {\n        mask = this._helpers.position.swizzle(mask, transpose);\n      }\n\n      // Require buffer sampler as callback\n      p.require(buffer.shader(this._shaders.shader(), 2));\n\n      // Calculate grid position\n      p.pipe(\"grid.position\", positionUniforms);\n\n      // Apply view transform\n      position = this._helpers.position.pipeline(p);\n\n      // Prepare bound uniforms\n      const styleUniforms = this._helpers.style.uniforms();\n      const lineUniforms = this._helpers.line.uniforms();\n      const unitUniforms = this._inherit(\"unit\").getUnitUniforms();\n      const uniforms = UJS.merge(lineUniforms, styleUniforms, unitUniforms);\n\n      // Make line renderable\n      const line = this._renderables.make(\"line\", {\n        uniforms,\n        samples,\n        strips,\n        position,\n        stroke,\n        join,\n        mask,\n        material,\n      });\n\n      // Store axis object for manipulation later\n      return { first, second, resolution, samples, line, buffer, values };\n    };\n\n    // Generate both line sets\n    const { lineX, lineY, crossed, axes } = this.props;\n    const transpose = [\"0000\", \"x000\", \"y000\", \"z000\", \"w000\"][axes[1]];\n\n    // Stroke style\n    const { stroke, join } = this.props;\n\n    this.axes = [];\n    lineX && this.axes.push(axis(\"x.\", \"y.\", null));\n    lineY && this.axes.push(axis(\"y.\", \"x.\", crossed ? null : transpose));\n\n    // Register lines\n    const lines = (() => {\n      const result = [];\n      for (axis of this.axes) {\n        result.push(axis.line);\n      }\n      return result;\n    })();\n    this._helpers.visible.make();\n    this._helpers.object.make(lines);\n    this._helpers.span.make();\n\n    // Monitor view range\n    return this._listen(this, \"span.range\", this.updateRanges);\n  }\n\n  unmake() {\n    this._helpers.visible.unmake();\n    this._helpers.object.unmake();\n    this._helpers.span.unmake();\n\n    for (const axis of this.axes) {\n      axis.buffer.dispose();\n    }\n\n    this.axes = null;\n  }\n\n  change(changed, touched, init) {\n    if (\n      changed[\"x.axis.detail\"] ||\n      changed[\"y.axis.detail\"] ||\n      changed[\"x.axis.factor\"] ||\n      changed[\"y.axis.factor\"] ||\n      changed[\"grid.lineX\"] ||\n      changed[\"grid.lineY\"] ||\n      changed[\"line.stroke\"] ||\n      changed[\"line.join\"] ||\n      changed[\"grid.crossed\"] ||\n      (changed[\"grid.axes\"] && this.props.crossed)\n    ) {\n      return this.rebuild();\n    }\n\n    if (\n      touched[\"x\"] ||\n      touched[\"y\"] ||\n      touched[\"area\"] ||\n      touched[\"grid\"] ||\n      touched[\"view\"] ||\n      init\n    ) {\n      return this.updateRanges();\n    }\n  }\n\n  updateRanges() {\n    const axis = (x, y, range1, range2, axis) => {\n      const { second, resolution, samples, line, buffer, values } = axis;\n\n      // Set line steps along first axis\n      let min = range1.x;\n      let max = range1.y;\n      UAxis.setDimension(values.gridPosition, x).multiplyScalar(min);\n      UAxis.setDimension(values.gridStep, x).multiplyScalar(\n        (max - min) * resolution\n      );\n\n      // Add origin on remaining two axes\n      UAxis.addOrigin(values.gridPosition, axes, origin);\n\n      // Calculate scale along second axis\n      min = range2.x;\n      max = range2.y;\n      const ticks = this._helpers.scale.generate(second, buffer, min, max);\n      UAxis.setDimension(values.gridAxis, y);\n\n      // Clip to number of ticks\n      const n = ticks.length;\n      return line.geometry.clip(samples, n, 1, 1);\n    };\n\n    // Fetch grid range in both dimensions\n    const { axes, origin } = this.props;\n    const range1 = this._helpers.span.get(\"x.\", axes[0]);\n    const range2 = this._helpers.span.get(\"y.\", axes[1]);\n\n    // Update both line sets\n    const { lineX, lineY } = this.props;\n\n    if (lineX) {\n      axis(axes[0], axes[1], range1, range2, this.axes[0]);\n    }\n    if (lineY) {\n      axis(axes[1], axes[0], range2, range1, this.axes[+lineX]);\n    }\n    window.cake1 = this.axes[0].buffer;\n    window.cake2 = this.axes[1].buffer;\n    window.cake3 = this.axes[0];\n  }\n}\nGrid.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UJS from \"../../../util/js.js\";\nimport { Primitive } from \"../../primitive.js\";\n\nexport class Line extends Primitive {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"object\",\n      \"visible\",\n      \"style\",\n      \"line\",\n      \"arrow\",\n      \"geometry\",\n      \"position\",\n      \"bind\",\n      \"shade\",\n    ];\n  }\n\n  constructor(node, context, helpers) {\n    super(node, context, helpers);\n\n    this.line = this.arrows = null;\n  }\n\n  resize() {\n    if (this.bind.points == null) {\n      return;\n    }\n    const dims = this.bind.points.getActiveDimensions();\n\n    const samples = dims.width;\n    const strips = dims.height;\n    const ribbons = dims.depth;\n    const layers = dims.items;\n\n    this.line.geometry.clip(samples, strips, ribbons, layers);\n    return Array.from(this.arrows).map((arrow) =>\n      arrow.geometry.clip(samples, strips, ribbons, layers)\n    );\n  }\n\n  make() {\n    // Bind to attached data sources\n    let color;\n    this._helpers.bind.make([\n      { to: \"geometry.points\", trait: \"source\" },\n      { to: \"geometry.colors\", trait: \"source\" },\n    ]);\n\n    if (this.bind.points == null) {\n      return;\n    }\n\n    // Build transform chain\n    let position = this._shaders.shader();\n\n    // Fetch position\n    position = this.bind.points.sourceShader(position);\n\n    // Transform position to view\n    position = this._helpers.position.pipeline(position);\n\n    // Prepare bound uniforms\n    const styleUniforms = this._helpers.style.uniforms();\n    const lineUniforms = this._helpers.line.uniforms();\n    const arrowUniforms = this._helpers.arrow.uniforms();\n    const unitUniforms = this._inherit(\"unit\").getUnitUniforms();\n\n    // Clip start/end for terminating arrow\n    const { start, end } = this.props;\n\n    // Stroke style\n    const { stroke, join, proximity } = this.props;\n    this.proximity = proximity;\n\n    // Fetch geometry dimensions\n    const dims = this.bind.points.getDimensions();\n    const samples = dims.width;\n    const strips = dims.height;\n    const ribbons = dims.depth;\n    const layers = dims.items;\n\n    // Build color lookup\n    if (this.bind.colors) {\n      color = this._shaders.shader();\n      this.bind.colors.sourceShader(color);\n    }\n\n    // Build transition mask lookup\n    const mask = this._helpers.object.mask();\n\n    // Build fragment material lookup\n    const material = this._helpers.shade.pipeline() || false;\n\n    // Make line renderable\n    const uniforms = UJS.merge(\n      arrowUniforms,\n      lineUniforms,\n      styleUniforms,\n      unitUniforms\n    );\n    this.line = this._renderables.make(\"line\", {\n      uniforms,\n      samples,\n      strips,\n      ribbons,\n      layers,\n      position,\n      color,\n      clip: start || end,\n      stroke,\n      join,\n      proximity,\n      mask,\n      material,\n    });\n\n    // Make arrow renderables\n    this.arrows = [];\n    if (start) {\n      this.arrows.push(\n        this._renderables.make(\"arrow\", {\n          uniforms,\n          flip: true,\n          samples,\n          strips,\n          ribbons,\n          layers,\n          position,\n          color,\n          mask,\n          material,\n        })\n      );\n    }\n\n    if (end) {\n      this.arrows.push(\n        this._renderables.make(\"arrow\", {\n          uniforms,\n          samples,\n          strips,\n          ribbons,\n          layers,\n          position,\n          color,\n          mask,\n          material,\n        })\n      );\n    }\n\n    this._helpers.visible.make();\n    return this._helpers.object.make(this.arrows.concat([this.line]));\n  }\n\n  made() {\n    return this.resize();\n  }\n\n  unmake() {\n    this._helpers.bind.unmake();\n    this._helpers.visible.unmake();\n    this._helpers.object.unmake();\n\n    return (this.line = this.arrows = null);\n  }\n\n  change(changed, _touched, _init) {\n    if (\n      changed[\"geometry.points\"] ||\n      changed[\"line.stroke\"] ||\n      changed[\"line.join\"] ||\n      changed[\"arrow.start\"] ||\n      changed[\"arrow.end\"]\n    ) {\n      return this.rebuild();\n    }\n\n    if (changed[\"line.proximity\"]) {\n      if ((this.proximity != null) !== (this.props.proximity != null)) {\n        return this.rebuild();\n      }\n    }\n  }\n}\nLine.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UJS from \"../../../util/js.js\";\nimport { Primitive } from \"../../primitive.js\";\n\nexport class Point extends Primitive {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"object\",\n      \"visible\",\n      \"style\",\n      \"point\",\n      \"geometry\",\n      \"position\",\n      \"bind\",\n      \"shade\",\n    ];\n  }\n\n  constructor(node, context, helpers) {\n    super(node, context, helpers);\n\n    this.point = null;\n  }\n\n  resize() {\n    if (this.bind.points == null) {\n      return;\n    }\n\n    const dims = this.bind.points.getActiveDimensions();\n    const { items, width, height, depth } = dims;\n\n    return this.point.geometry.clip(width, height, depth, items);\n  }\n\n  make() {\n    // Bind to attached data sources\n    let color, size;\n    this._helpers.bind.make([\n      { to: \"geometry.points\", trait: \"source\" },\n      { to: \"geometry.colors\", trait: \"source\" },\n      { to: \"point.sizes\", trait: \"source\" },\n    ]);\n\n    if (this.bind.points == null) {\n      return;\n    }\n\n    // Build transform chain\n    let position = this._shaders.shader();\n\n    // Fetch position and transform to view\n    position = this.bind.points.sourceShader(position);\n    position = this._helpers.position.pipeline(position);\n\n    // Fetch geometry dimensions\n    const dims = this.bind.points.getDimensions();\n    const { items, width, height, depth } = dims;\n\n    // Prepare bound uniforms\n    const styleUniforms = this._helpers.style.uniforms();\n    const pointUniforms = this._helpers.point.uniforms();\n    const unitUniforms = this._inherit(\"unit\").getUnitUniforms();\n\n    // Build color lookup\n    if (this.bind.colors) {\n      color = this._shaders.shader();\n      this.bind.colors.sourceShader(color);\n    }\n\n    // Build size lookup\n    if (this.bind.sizes) {\n      size = this._shaders.shader();\n      this.bind.sizes.sourceShader(size);\n    }\n\n    // Build transition mask lookup\n    const mask = this._helpers.object.mask();\n\n    // Build fragment material lookup\n    const material = this._helpers.shade.pipeline() || false;\n\n    // Point style\n    const { shape } = this.props;\n    const { fill } = this.props;\n    const { optical } = this.props;\n\n    // Make point renderable\n    const uniforms = UJS.merge(unitUniforms, pointUniforms, styleUniforms);\n    this.point = this._renderables.make(\"point\", {\n      uniforms,\n      width,\n      height,\n      depth,\n      items,\n      position,\n      color,\n      size,\n      shape,\n      optical,\n      fill,\n      mask,\n      material,\n    });\n\n    this._helpers.visible.make();\n    this._helpers.object.make([this.point]);\n  }\n\n  made() {\n    return this.resize();\n  }\n\n  unmake() {\n    this._helpers.bind.unmake();\n    this._helpers.visible.unmake();\n    this._helpers.object.unmake();\n\n    this.point = null;\n  }\n\n  change(changed, _touched, _init) {\n    if (\n      changed[\"geometry.points\"] ||\n      changed[\"point.shape\"] ||\n      changed[\"point.fill\"]\n    ) {\n      return this.rebuild();\n    }\n  }\n}\nPoint.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UGLSL from \"../../../util/glsl.js\";\nimport * as UJS from \"../../../util/js.js\";\nimport { Primitive } from \"../../primitive.js\";\n\nexport class Strip extends Primitive {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"object\",\n      \"visible\",\n      \"style\",\n      \"line\",\n      \"mesh\",\n      \"strip\",\n      \"geometry\",\n      \"position\",\n      \"bind\",\n      \"shade\",\n    ];\n  }\n\n  constructor(node, context, helpers) {\n    super(node, context, helpers);\n\n    this.strip = null;\n  }\n\n  resize() {\n    if (this.bind.points == null) {\n      return;\n    }\n\n    const dims = this.bind.points.getActiveDimensions();\n    const { items, width, height, depth } = dims;\n\n    if (this.strip) {\n      this.strip.geometry.clip(width, height, depth, items);\n    }\n    if (this.line) {\n      this.line.geometry.clip(items, width, height, depth);\n    }\n\n    if (this.bind.map != null) {\n      const map = this.bind.map.getActiveDimensions();\n      if (this.strip) {\n        return this.strip.geometry.map(\n          map.width,\n          map.height,\n          map.depth,\n          map.items\n        );\n      }\n    }\n  }\n\n  make() {\n    // Bind to attached data sources\n    let color, uniforms;\n    this._helpers.bind.make([\n      { to: \"geometry.points\", trait: \"source\" },\n      { to: \"geometry.colors\", trait: \"source\" },\n      { to: \"mesh.map\", trait: \"source\" },\n    ]);\n\n    if (this.bind.points == null) {\n      return;\n    }\n\n    // Build transform chain\n    let position = this._shaders.shader();\n\n    // Fetch position\n    position = this.bind.points.sourceShader(position);\n\n    // Transform position to view\n    position = this._helpers.position.pipeline(position);\n\n    // Prepare bound uniforms\n    const styleUniforms = this._helpers.style.uniforms();\n    const lineUniforms = this._helpers.line.uniforms();\n    const unitUniforms = this._inherit(\"unit\").getUnitUniforms();\n\n    // Get display properties\n    const { line, shaded, fill, stroke, join } = this.props;\n\n    // Auto z-bias wireframe over surface\n    const wireUniforms = {};\n    wireUniforms.styleZBias = this._attributes.make(this._types.number());\n    this.wireZBias = wireUniforms.styleZBias;\n\n    // Fetch geometry dimensions\n    const dims = this.bind.points.getDimensions();\n    const { items, width, height, depth } = dims;\n\n    // Build color lookup\n    if (this.bind.colors) {\n      color = this._shaders.shader();\n      color = this.bind.colors.sourceShader(color);\n    }\n\n    // Build transition mask lookup\n    const mask = this._helpers.object.mask();\n\n    // Build texture map lookup\n    this._helpers.shade.map(\n      this.bind.map != null\n        ? this.bind.map.sourceShader(this._shaders.shader())\n        : undefined\n    );\n\n    // Build fragment material lookup\n    const material = this._helpers.shade.pipeline();\n    const faceMaterial = material || shaded;\n    const lineMaterial = material || false;\n\n    const objects = [];\n\n    // Make line renderable\n    if (line) {\n      // Swizzle strip edges into segments\n      const swizzle = this._shaders.shader();\n      swizzle.pipe(UGLSL.swizzleVec4(\"yzwx\"));\n      swizzle.pipe(position);\n\n      uniforms = UJS.merge(\n        unitUniforms,\n        lineUniforms,\n        styleUniforms,\n        wireUniforms\n      );\n\n      this.line = this._renderables.make(\"line\", {\n        uniforms,\n        samples: items,\n        strips: width,\n        ribbons: height,\n        layers: depth,\n        position: swizzle,\n        color,\n        stroke,\n        join,\n        mask,\n        material: lineMaterial,\n      });\n\n      objects.push(this.line);\n    }\n\n    // Make strip renderable\n    if (fill) {\n      uniforms = UJS.merge(styleUniforms, {});\n\n      this.strip = this._renderables.make(\"strip\", {\n        uniforms,\n        width,\n        height,\n        depth,\n        items,\n        position,\n        color,\n        material: faceMaterial,\n      });\n      objects.push(this.strip);\n    }\n\n    this._helpers.visible.make();\n    return this._helpers.object.make(objects);\n  }\n\n  made() {\n    return this.resize();\n  }\n\n  unmake() {\n    this._helpers.bind.unmake();\n    this._helpers.visible.unmake();\n    this._helpers.object.unmake();\n\n    return (this.strip = null);\n  }\n\n  change(changed, touched, init) {\n    if (changed[\"geometry.points\"] || touched[\"mesh\"]) {\n      return this.rebuild();\n    }\n\n    if (changed[\"style.zBias\"] || changed[\"mesh.lineBias\"] || init) {\n      const { fill, zBias, lineBias } = this.props;\n      return (this.wireZBias.value = zBias + (fill ? lineBias : 0));\n    }\n  }\n}\nStrip.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UJS from \"../../../util/js.js\";\nimport { Color } from \"three/src/math/Color.js\";\nimport { Primitive } from \"../../primitive.js\";\n\nexport class Surface extends Primitive {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"object\",\n      \"visible\",\n      \"style\",\n      \"line\",\n      \"mesh\",\n      \"geometry\",\n      \"surface\",\n      \"position\",\n      \"grid\",\n      \"bind\",\n      \"shade\",\n    ];\n    this.defaults = {\n      lineX: false,\n      lineY: false,\n    };\n  }\n\n  constructor(node, context, helpers) {\n    super(node, context, helpers);\n\n    this.lineX = this.lineY = this.surface = null;\n  }\n\n  resize() {\n    if (this.bind.points == null) {\n      return;\n    }\n\n    const dims = this.bind.points.getActiveDimensions();\n    const { width, height, depth, items } = dims;\n\n    if (this.surface) {\n      this.surface.geometry.clip(width, height, depth, items);\n    }\n    if (this.lineX) {\n      this.lineX.geometry.clip(width, height, depth, items);\n    }\n    if (this.lineY) {\n      this.lineY.geometry.clip(height, width, depth, items);\n    }\n\n    if (this.bind.map != null) {\n      const map = this.bind.map.getActiveDimensions();\n      if (this.surface) {\n        return this.surface.geometry.map(\n          map.width,\n          map.height,\n          map.depth,\n          map.items\n        );\n      }\n    }\n  }\n\n  make() {\n    // Bind to attached data sources\n    let color;\n    this._helpers.bind.make([\n      { to: \"geometry.points\", trait: \"source\" },\n      { to: \"geometry.colors\", trait: \"source\" },\n      { to: \"mesh.map\", trait: \"source\" },\n    ]);\n\n    if (this.bind.points == null) {\n      return;\n    }\n\n    // Build transform chain\n    let position = this._shaders.shader();\n\n    // Fetch position and transform to view\n    position = this.bind.points.sourceShader(position);\n    position = this._helpers.position.pipeline(position);\n\n    // Prepare bound uniforms\n    const styleUniforms = this._helpers.style.uniforms();\n    const wireUniforms = this._helpers.style.uniforms();\n    const lineUniforms = this._helpers.line.uniforms();\n    const surfaceUniforms = this._helpers.surface.uniforms();\n    const unitUniforms = this._inherit(\"unit\").getUnitUniforms();\n\n    // Darken wireframe if needed for contrast\n    // Auto z-bias wireframe over surface\n    wireUniforms.styleColor = this._attributes.make(this._types.color());\n    wireUniforms.styleZBias = this._attributes.make(this._types.number());\n    this.wireColor = wireUniforms.styleColor.value;\n    this.wireZBias = wireUniforms.styleZBias;\n    this.wireScratch = new Color();\n\n    // Fetch geometry dimensions\n    const dims = this.bind.points.getDimensions();\n    const { width, height, depth, items } = dims;\n\n    // Get display properties\n    const {\n      shaded,\n      fill,\n      lineX,\n      lineY,\n      closedX,\n      closedY,\n      stroke,\n      join,\n      proximity,\n      crossed,\n    } = this.props;\n    const objects = [];\n    this.proximity = proximity;\n\n    // Build color lookup\n    if (this.bind.colors) {\n      color = this._shaders.shader();\n      this.bind.colors.sourceShader(color);\n    }\n\n    // Build transition mask lookup\n    const mask = this._helpers.object.mask();\n\n    // Build texture map lookup\n    const map = this._helpers.shade.map(\n      this.bind.map != null\n        ? this.bind.map.sourceShader(this._shaders.shader())\n        : undefined\n    );\n\n    // Build fragment material lookup\n    const material = this._helpers.shade.pipeline();\n    const faceMaterial = material || shaded;\n    const lineMaterial = material || false;\n\n    // Make line and surface renderables\n    const { swizzle, swizzle2 } = this._helpers.position;\n    let uniforms = UJS.merge(\n      unitUniforms,\n      lineUniforms,\n      styleUniforms,\n      wireUniforms\n    );\n    const zUnits = lineX || lineY ? -50 : 0;\n    if (lineX) {\n      this.lineX = this._renderables.make(\"line\", {\n        uniforms,\n        samples: width,\n        strips: height,\n        ribbons: depth,\n        layers: items,\n        position,\n        color,\n        zUnits: -zUnits,\n        stroke,\n        join,\n        mask,\n        material: lineMaterial,\n        proximity,\n        closed: closedX || closed,\n      });\n      objects.push(this.lineX);\n    }\n\n    if (lineY) {\n      this.lineY = this._renderables.make(\"line\", {\n        uniforms,\n        samples: height,\n        strips: width,\n        ribbons: depth,\n        layers: items,\n        position: swizzle2(position, \"yxzw\", \"yxzw\"),\n        color: swizzle(color, \"yxzw\"),\n        zUnits: -zUnits,\n        stroke,\n        join,\n        mask: swizzle(mask, crossed ? \"xyzw\" : \"yxzw\"),\n        material: lineMaterial,\n        proximity,\n        closed: closedY || closed,\n      });\n      objects.push(this.lineY);\n    }\n\n    if (fill) {\n      uniforms = UJS.merge(unitUniforms, surfaceUniforms, styleUniforms);\n      this.surface = this._renderables.make(\"surface\", {\n        uniforms,\n        width,\n        height,\n        surfaces: depth,\n        layers: items,\n        position,\n        color,\n        zUnits,\n        stroke,\n        material: faceMaterial,\n        mask,\n        map,\n        intUV: true,\n        closedX: closedX || closed,\n        closedY: closedY || closed,\n      });\n      objects.push(this.surface);\n    }\n\n    this._helpers.visible.make();\n    return this._helpers.object.make(objects);\n  }\n\n  made() {\n    return this.resize();\n  }\n\n  unmake() {\n    this._helpers.bind.unmake();\n    this._helpers.visible.unmake();\n    this._helpers.object.unmake();\n\n    return (this.lineX = this.lineY = this.surface = null);\n  }\n\n  _convertGammaToLinear(color, gammaFactor = 2.0) {\n    color.r = Math.pow(color.r, gammaFactor);\n    color.g = Math.pow(color.g, gammaFactor);\n    color.b = Math.pow(color.b, gammaFactor);\n\n    return color;\n  }\n\n  _convertLinearToGamma(color, gammaFactor = 2.0) {\n    const safeInverse = gammaFactor > 0 ? 1.0 / gammaFactor : 1.0;\n\n    color.r = Math.pow(color.r, safeInverse);\n    color.g = Math.pow(color.g, safeInverse);\n    color.b = Math.pow(color.b, safeInverse);\n\n    return color;\n  }\n\n  change(changed, touched, init) {\n    if (\n      changed[\"geometry.points\"] ||\n      changed[\"mesh.shaded\"] ||\n      changed[\"mesh.fill\"] ||\n      changed[\"line.stroke\"] ||\n      changed[\"line.join\"] ||\n      touched[\"grid\"]\n    ) {\n      return this.rebuild();\n    }\n\n    if (\n      changed[\"style.color\"] ||\n      changed[\"style.zBias\"] ||\n      changed[\"mesh.fill\"] ||\n      changed[\"mesh.lineBias\"] ||\n      init\n    ) {\n      const { fill, color, zBias, lineBias } = this.props;\n\n      this.wireZBias.value = zBias + (fill ? lineBias : 0);\n      this.wireColor.copy(color);\n      if (fill) {\n        const c = this.wireScratch;\n        c.setRGB(color.x, color.y, color.z);\n        this._convertLinearToGamma(\n          this._convertGammaToLinear(c).multiplyScalar(0.75)\n        );\n        this.wireColor.x = c.r;\n        this.wireColor.y = c.g;\n        this.wireColor.z = c.b;\n      }\n    }\n\n    if (changed[\"line.proximity\"]) {\n      if ((this.proximity != null) !== (this.props.proximity != null)) {\n        return this.rebuild();\n      }\n    }\n  }\n}\nSurface.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UJS from \"../../../util/js.js\";\nimport { Primitive } from \"../../primitive.js\";\n\nexport class Ticks extends Primitive {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"object\",\n      \"visible\",\n      \"style\",\n      \"line\",\n      \"ticks\",\n      \"geometry\",\n      \"position\",\n      \"bind\",\n      \"shade\",\n    ];\n  }\n\n  init() {\n    return (this.tickStrip = this.line = null);\n  }\n\n  resize() {\n    if (this.bind.points == null) {\n      return;\n    }\n    const dims = this.bind.points.getActiveDimensions();\n\n    const active = +(dims.items > 0);\n    const strips = dims.width * active;\n    const ribbons = dims.height * active;\n    const layers = dims.depth * active;\n\n    this.line.geometry.clip(2, strips, ribbons, layers);\n    return this.tickStrip.set(0, strips - 1);\n  }\n\n  make() {\n    // Bind to attached data sources\n    let color, position;\n    this._helpers.bind.make([\n      { to: \"geometry.points\", trait: \"source\" },\n      { to: \"geometry.colors\", trait: \"source\" },\n    ]);\n\n    if (this.bind.points == null) {\n      return;\n    }\n\n    // Prepare bound uniforms\n    const styleUniforms = this._helpers.style.uniforms();\n    const lineUniforms = this._helpers.line.uniforms();\n    const unitUniforms = this._inherit(\"unit\").getUnitUniforms();\n    const uniforms = UJS.merge(lineUniforms, styleUniforms, unitUniforms);\n\n    // Prepare position shader\n    const positionUniforms = {\n      tickEpsilon: this.node.attributes[\"ticks.epsilon\"],\n      tickSize: this.node.attributes[\"ticks.size\"],\n      tickNormal: this.node.attributes[\"ticks.normal\"],\n      tickStrip: this._attributes.make(this._types.vec2(0, 0)),\n      worldUnit: uniforms.worldUnit,\n      focusDepth: uniforms.focusDepth,\n    };\n\n    this.tickStrip = positionUniforms.tickStrip.value;\n\n    // Build transform chain\n    const p = (position = this._shaders.shader());\n\n    // Require buffer sampler as callback\n    p.require(this.bind.points.sourceShader(this._shaders.shader()));\n\n    // Require view transform as callback\n    p.require(this._helpers.position.pipeline(this._shaders.shader()));\n\n    // Link to tick shader\n    p.pipe(\"ticks.position\", positionUniforms);\n\n    // Stroke style\n    const { stroke, join } = this.props;\n\n    // Fetch geometry dimensions\n    const dims = this.bind.points.getDimensions();\n    const strips = dims.width;\n    const ribbons = dims.height;\n    const layers = dims.depth;\n\n    // Build color lookup\n    if (this.bind.colors) {\n      color = this._shaders.shader();\n      this.bind.colors.sourceShader(color);\n    }\n\n    // Build transition mask lookup\n    const mask = this._helpers.object.mask();\n\n    // Build fragment material lookup\n    const material = this._helpers.shade.pipeline() || false;\n\n    // Make line renderable\n    const { swizzle } = this._helpers.position;\n    this.line = this._renderables.make(\"line\", {\n      uniforms,\n      samples: 2,\n      strips,\n      ribbons,\n      layers,\n      position,\n      color,\n      stroke,\n      join,\n      mask: swizzle(mask, \"yzwx\"),\n      material,\n    });\n\n    this._helpers.visible.make();\n    return this._helpers.object.make([this.line]);\n  }\n\n  made() {\n    return this.resize();\n  }\n\n  unmake() {\n    this.line = null;\n\n    this._helpers.visible.unmake();\n    return this._helpers.object.unmake();\n  }\n\n  change(changed, _touched, _init) {\n    if (\n      changed[\"geometry.points\"] ||\n      changed[\"line.stroke\"] ||\n      changed[\"line.join\"]\n    ) {\n      return this.rebuild();\n    }\n  }\n}\nTicks.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UJS from \"../../../util/js.js\";\nimport { Primitive } from \"../../primitive.js\";\n\nexport class Vector extends Primitive {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"object\",\n      \"visible\",\n      \"style\",\n      \"line\",\n      \"arrow\",\n      \"geometry\",\n      \"position\",\n      \"bind\",\n      \"shade\",\n    ];\n  }\n\n  constructor(node, context, helpers) {\n    super(node, context, helpers);\n\n    this.line = this.arrows = null;\n  }\n\n  resize() {\n    if (this.bind.points == null) {\n      return;\n    }\n    const dims = this.bind.points.getActiveDimensions();\n\n    const samples = dims.items;\n    const strips = dims.width;\n    const ribbons = dims.height;\n    const layers = dims.depth;\n\n    this.line.geometry.clip(samples, strips, ribbons, layers);\n    return Array.from(this.arrows).map((arrow) =>\n      arrow.geometry.clip(samples, strips, ribbons, layers)\n    );\n  }\n\n  make() {\n    // Bind to attached data sources\n    let color;\n    this._helpers.bind.make([\n      { to: \"geometry.points\", trait: \"source\" },\n      { to: \"geometry.colors\", trait: \"source\" },\n    ]);\n\n    if (this.bind.points == null) {\n      return;\n    }\n\n    // Build transform chain\n    let position = this._shaders.shader();\n\n    // Fetch position\n    this.bind.points.sourceShader(position);\n\n    // Transform position to view\n    this._helpers.position.pipeline(position);\n\n    // Prepare bound uniforms\n    const styleUniforms = this._helpers.style.uniforms();\n    const lineUniforms = this._helpers.line.uniforms();\n    const arrowUniforms = this._helpers.arrow.uniforms();\n    const unitUniforms = this._inherit(\"unit\").getUnitUniforms();\n\n    // Clip start/end for terminating arrow\n    const { start, end } = this.props;\n\n    // Stroke style\n    const { stroke, join, proximity } = this.props;\n    this.proximity = proximity;\n\n    // Fetch geometry dimensions\n    const dims = this.bind.points.getDimensions();\n    const samples = dims.items;\n    const strips = dims.width;\n    const ribbons = dims.height;\n    const layers = dims.depth;\n\n    // Build color lookup\n    if (this.bind.colors) {\n      color = this._shaders.shader();\n      this.bind.colors.sourceShader(color);\n    }\n\n    // Build transition mask lookup\n    let mask = this._helpers.object.mask();\n\n    // Build fragment material lookup\n    let material = this._helpers.shade.pipeline() || false;\n\n    // Swizzle vector to line\n    const { swizzle, swizzle2 } = this._helpers.position;\n    position = swizzle2(position, \"yzwx\", \"yzwx\");\n    color = swizzle(color, \"yzwx\");\n    mask = swizzle(mask, \"yzwx\");\n    material = swizzle(material, \"yzwx\");\n\n    // Make line renderable\n    const uniforms = UJS.merge(\n      arrowUniforms,\n      lineUniforms,\n      styleUniforms,\n      unitUniforms\n    );\n    this.line = this._renderables.make(\"line\", {\n      uniforms,\n      samples,\n      ribbons,\n      strips,\n      layers,\n      position,\n      color,\n      clip: start || end,\n      stroke,\n      join,\n      proximity,\n      mask,\n      material,\n    });\n\n    // Make arrow renderables\n    this.arrows = [];\n    if (start) {\n      this.arrows.push(\n        this._renderables.make(\"arrow\", {\n          uniforms,\n          flip: true,\n          samples,\n          ribbons,\n          strips,\n          layers,\n          position,\n          color,\n          mask,\n          material,\n        })\n      );\n    }\n\n    if (end) {\n      this.arrows.push(\n        this._renderables.make(\"arrow\", {\n          uniforms,\n          samples,\n          ribbons,\n          strips,\n          layers,\n          position,\n          color,\n          mask,\n          material,\n        })\n      );\n    }\n\n    this._helpers.visible.make();\n    return this._helpers.object.make(this.arrows.concat([this.line]));\n  }\n\n  made() {\n    return this.resize();\n  }\n\n  unmake() {\n    this._helpers.bind.unmake();\n    this._helpers.visible.unmake();\n    this._helpers.object.unmake();\n\n    return (this.line = this.arrows = null);\n  }\n\n  change(changed, _touched, _init) {\n    if (\n      changed[\"geometry.points\"] ||\n      changed[\"line.stroke\"] ||\n      changed[\"line.join\"] ||\n      changed[\"arrow.start\"] ||\n      changed[\"arrow.end\"]\n    ) {\n      return this.rebuild();\n    }\n\n    if (changed[\"line.proximity\"]) {\n      if ((this.proximity != null) !== (this.props.proximity != null)) {\n        return this.rebuild();\n      }\n    }\n  }\n}\nVector.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Voxel } from \"../data/voxel.js\";\n\nexport class HTML extends Voxel {\n  static initClass() {\n    this.traits = [\"node\", \"buffer\", \"active\", \"data\", \"voxel\", \"html\"];\n    this.finals = { channels: 1 };\n  }\n\n  init() {\n    super.init();\n    this.storage = \"pushBuffer\";\n  }\n\n  make() {\n    super.make();\n\n    // Get our own size\n    const { items, width, height, depth } = this.getDimensions();\n\n    // Prepare DOM element factory\n    this.dom = this._overlays.make(\"dom\");\n    return this.dom.hint(items * width * height * depth);\n  }\n\n  unmake() {\n    super.unmake();\n    if (this.dom != null) {\n      this.dom.dispose();\n      return (this.dom = null);\n    }\n  }\n\n  update() {\n    return super.update();\n  }\n\n  change(changed, touched, init) {\n    if (touched[\"html\"]) {\n      return this.rebuild();\n    }\n    return super.change(changed, touched, init);\n  }\n\n  nodes() {\n    return this.buffer.read();\n  }\n\n  callback(callback) {\n    const { el } = this.dom;\n\n    if (callback.length <= 6) {\n      return (emit, i, j, k, l) => callback(emit, el, i, j, k, l);\n    } else {\n      return (emit, i, j, k, l) => {\n        return callback(\n          emit,\n          el,\n          i,\n          j,\n          k,\n          l,\n          this.bufferClock,\n          this.bufferStep\n        );\n      };\n    }\n  }\n}\nHTML.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Primitive } from \"../../primitive.js\";\n\nexport class DOM extends Primitive {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"bind\",\n      \"object\",\n      \"visible\",\n      \"overlay\",\n      \"dom\",\n      \"attach\",\n      \"position\",\n    ];\n  }\n\n  init() {\n    this.emitter = this.root = null;\n    this.active = {};\n  }\n\n  make() {\n    super.make();\n\n    // Bind to attached objects\n    this._helpers.bind.make([\n      { to: \"dom.html\", trait: \"html\" },\n      { to: \"dom.points\", trait: \"source\" },\n    ]);\n\n    if (this.bind.points == null || this.bind.html == null) {\n      return;\n    }\n\n    // Listen for updates\n    this.root = this._inherit(\"root\");\n    this._listen(\"root\", \"root.update\", this.update);\n    this._listen(\"root\", \"root.post\", this.post);\n\n    // Fetch geometry dimensions\n    const pointDims = this.bind.points.getDimensions();\n    const htmlDims = this.bind.html.getDimensions();\n\n    const items = Math.min(pointDims.items, htmlDims.items);\n    const width = Math.min(pointDims.width, htmlDims.width);\n    const height = Math.min(pointDims.height, htmlDims.height);\n    const depth = Math.min(pointDims.depth, htmlDims.depth);\n\n    // Build shader to sample position data\n    let position = this.bind.points.sourceShader(this._shaders.shader());\n\n    // Transform data into screen space\n    position = this._helpers.position.pipeline(position);\n\n    // Apply global projection\n    const projection = this._shaders.shader({ globals: [\"projectionMatrix\"] });\n    projection.pipe(\"project.readback\");\n    position.pipe(projection);\n\n    // Build nop index shader\n    const indexer = this._shaders.shader();\n\n    // Prepare readback/memo RTT\n    this.readback = this._renderables.make(\"readback\", {\n      map: position,\n      indexer,\n      items,\n      width,\n      height,\n      depth,\n      channels: 4,\n      stpq: true,\n    });\n\n    // Prepare overlay container VDOM\n    this.dom = this._overlays.make(\"dom\");\n    this.dom.hint(items * width * height * depth * 2);\n    // Make sure we have enough for wrapping each given element once\n\n    // Prepare readback consumer\n    this.emitter = this.callback(this.bind.html.nodes());\n    this.readback.setCallback(this.emitter);\n\n    this._helpers.visible.make();\n  }\n\n  unmake() {\n    if (this.readback != null) {\n      this.readback.dispose();\n      this.dom.dispose();\n      this.readback = this.dom = null;\n\n      this.root = null;\n      this.emitter = null;\n      this.active = {};\n    }\n\n    this._helpers.bind.unmake();\n    this._helpers.visible.unmake();\n  }\n\n  update() {\n    if (this.readback == null) {\n      return;\n    }\n    if (this.props.visible) {\n      this.readback.update(\n        this.root != null ? this.root.getCamera() : undefined\n      );\n      this.readback.post();\n      this.readback.iterate();\n    }\n  }\n\n  post() {\n    if (this.readback == null) {\n      return;\n    }\n    this.dom.render(this.isVisible ? this.emitter.nodes() : null);\n  }\n\n  callback(data) {\n    // Create static consumer for the readback\n    let strideJ, strideK;\n    const uniforms = this._inherit(\"unit\").getUnitUniforms();\n    const width = uniforms.viewWidth;\n    const height = uniforms.viewHeight;\n\n    const attr = this.node.attributes[\"dom.attributes\"];\n    const size = this.node.attributes[\"dom.size\"];\n    const zoom = this.node.attributes[\"dom.zoom\"];\n    const color = this.node.attributes[\"dom.color\"];\n    const outline = this.node.attributes[\"dom.outline\"];\n    const pointer = this.node.attributes[\"dom.pointerEvents\"];\n    const opacity = this.node.attributes[\"overlay.opacity\"];\n    const zIndex = this.node.attributes[\"overlay.zIndex\"];\n    const offset = this.node.attributes[\"attach.offset\"];\n    const depth = this.node.attributes[\"attach.depth\"];\n    const snap = this.node.attributes[\"attach.snap\"];\n    const { el } = this.dom;\n\n    let nodes = [];\n    let styles = null;\n    let className = null;\n\n    let strideI = (strideJ = strideK = 0);\n    let colorString = \"\";\n\n    const f = function (x, y, z, w, i, j, k, l) {\n      // Get HTML item by offset\n      let v;\n      const index = l + strideI * i + strideJ * j + strideK * k;\n      const children = data[index];\n\n      // Clip behind camera or when invisible\n      const clip = w < 0;\n\n      // Depth blending\n      const iw = 1 / w;\n      const flatZ = 1 + (iw - 1) * depth.value;\n      const scale = clip ? 0 : flatZ;\n\n      // GL to CSS coordinate transform\n      const ox = +offset.value.x * scale;\n      const oy = +offset.value.y * scale;\n      let xx = (x + 1) * width.value * 0.5 + ox;\n      let yy = (y - 1) * height.value * 0.5 + oy;\n\n      // Handle zoom/scale\n      xx /= zoom.value;\n      yy /= zoom.value;\n\n      // Snap to pixel\n      if (snap.value) {\n        xx = Math.round(xx);\n        yy = Math.round(yy);\n      }\n\n      // Clip and apply opacity\n      const alpha = Math.min(0.999, clip ? 0 : opacity.value);\n\n      // Generate div\n      const props = {\n        className,\n        style: {\n          transform: `translate3d(${xx}px, ${-yy}px, ${\n            1 - w\n          }px) translate(-50%, -50%) scale(${scale},${scale})`,\n          opacity: alpha,\n        },\n      };\n      for (k in styles) {\n        v = styles[k];\n        props.style[k] = v;\n      }\n\n      // Merge in external attributes\n      const a = attr.value;\n      if (a != null) {\n        const s = a.style;\n        for (k in a) {\n          v = a[k];\n          if (![\"style\", \"className\"].includes(k)) {\n            props[k] = v;\n          }\n        }\n        if (s != null) {\n          for (k in s) {\n            v = s[k];\n            props.style[k] = v;\n          }\n        }\n      }\n      props.className +=\n        \" \" +\n        ((a != null ? a.className : undefined) != null\n          ? a != null\n            ? a.className\n            : undefined\n          : \"mathbox-label\");\n\n      // Push node onto list\n      return nodes.push(el(\"div\", props, children));\n    };\n\n    f.reset = () => {\n      nodes = [];\n      [strideI, strideJ, strideK] = Array.from([\n        this.strideI,\n        this.strideJ,\n        this.strideK,\n      ]);\n\n      const c = color.value;\n      const m = (x) => Math.floor(x * 255);\n      colorString = c ? `rgb(${[m(c.x), m(c.y), m(c.z)]})` : \"\";\n\n      className = `mathbox-outline-${Math.round(outline.value)}`;\n      styles = {};\n      if (c) {\n        styles.color = colorString;\n      }\n      styles.fontSize = `${size.value}px`;\n      if (zoom.value !== 1) {\n        styles.zoom = zoom.value;\n      }\n      if (zIndex.value > 0) {\n        styles.zIndex = zIndex.value;\n      }\n      if (pointer.value) {\n        return (styles.pointerEvents = \"auto\");\n      }\n    };\n\n    f.nodes = () => nodes;\n    return f;\n  }\n\n  resize() {\n    let sI, sJ;\n    if (this.readback == null) {\n      return;\n    }\n\n    // Fetch geometry/html dimensions\n    const pointDims = this.bind.points.getActiveDimensions();\n    const htmlDims = this.bind.html.getActiveDimensions();\n\n    const items = Math.min(pointDims.items, htmlDims.items);\n    const width = Math.min(pointDims.width, htmlDims.width);\n    const height = Math.min(pointDims.height, htmlDims.height);\n    const depth = Math.min(pointDims.depth, htmlDims.depth);\n\n    // Limit readback to active area\n    this.readback.setActive(items, width, height, depth);\n\n    // Recalculate iteration strides\n    this.strideI = sI = htmlDims.items;\n    this.strideJ = sJ = sI * htmlDims.width;\n    this.strideK = sJ * htmlDims.height;\n  }\n\n  change(changed, _touched, _init) {\n    if (changed[\"dom.html\"] || changed[\"dom.points\"]) {\n      return this.rebuild();\n    }\n  }\n}\nDOM.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UData from \"../../../util/data.js\";\n\nimport { FloatType, NearestFilter } from \"three/src/constants.js\";\nimport { Buffer } from \"../data/buffer.js\";\nimport { Voxel } from \"../data/voxel.js\";\n\nexport class Text extends Voxel {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"buffer\",\n      \"active\",\n      \"data\",\n      \"texture\",\n      \"voxel\",\n      \"text\",\n      \"font\",\n    ];\n    this.defaults = {\n      minFilter: \"linear\",\n      magFilter: \"linear\",\n    };\n    this.finals = { channels: 1 };\n  }\n\n  init() {\n    super.init();\n    return (this.atlas = null);\n  }\n\n  textShader(shader) {\n    return this.atlas.shader(shader);\n  }\n\n  textIsSDF() {\n    return this.props.sdf > 0;\n  }\n  textHeight() {\n    return this.props.detail;\n  }\n\n  make() {\n    // Read sampling parameters\n    let { minFilter, magFilter, type } = this.props;\n\n    // Read font parameters\n    const { font, style, variant, weight, detail, sdf } = this.props;\n\n    // Prepare text atlas\n    this.atlas = this._renderables.make(\"textAtlas\", {\n      font,\n      size: detail,\n      style,\n      variant,\n      weight,\n      outline: sdf,\n      minFilter,\n      magFilter,\n      type,\n    });\n\n    // Underlying data buffer needs no filtering\n    this.minFilter = NearestFilter;\n    this.magFilter = NearestFilter;\n    this.type = FloatType;\n\n    // Skip voxel::make(), as we need 4 channels internally in our buffer to store sprite x/y/w/h per string\n    Buffer.prototype.make.call(this);\n\n    // Read sampling parameters\n    minFilter = this.minFilter != null ? this.minFilter : this.props.minFilter;\n    magFilter = this.magFilter != null ? this.magFilter : this.props.magFilter;\n    type = this.type != null ? this.type : this.props.type;\n\n    // Read given dimensions\n    const { width } = this.props;\n    const { height } = this.props;\n    const { depth } = this.props;\n    const reserveX = this.props.bufferWidth;\n    const reserveY = this.props.bufferHeight;\n    const reserveZ = this.props.bufferDepth;\n    const { channels } = this.props;\n    const { items } = this.props;\n\n    let dims = (this.spec = { channels, items, width, height, depth });\n\n    this.items = dims.items;\n    this.channels = dims.channels;\n\n    // Init to right size if data supplied\n    const { data } = this.props;\n    dims = UData.getDimensions(data, dims);\n\n    const { space } = this;\n    space.width = Math.max(reserveX, dims.width || 1);\n    space.height = Math.max(reserveY, dims.height || 1);\n    space.depth = Math.max(reserveZ, dims.depth || 1);\n\n    // Create text voxel buffer\n    this.buffer = this._renderables.make(this.storage, {\n      width: space.width,\n      height: space.height,\n      depth: space.depth,\n      channels: 4,\n      items,\n      minFilter,\n      magFilter,\n      type,\n    });\n\n    // Hook buffer emitter to map atlas text\n    const { atlas } = this;\n    const { emit } = this.buffer.streamer;\n    return (this.buffer.streamer.emit = (text) => atlas.map(text, emit));\n  }\n\n  unmake() {\n    super.unmake();\n    if (this.atlas) {\n      this.atlas.dispose();\n      return (this.atlas = null);\n    }\n  }\n\n  update() {\n    this.atlas.begin();\n    super.update();\n    return this.atlas.end();\n  }\n\n  change(changed, touched, init) {\n    if (touched[\"font\"]) {\n      return this.rebuild();\n    }\n    return super.change(changed, touched, init);\n  }\n}\nText.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Source } from \"../base/source\";\n\nexport class Operator extends Source {\n  static initClass() {\n    this.traits = [\"node\", \"bind\", \"operator\", \"source\", \"index\"];\n  }\n\n  indexShader(shader) {\n    return __guardMethod__(this.bind.source, \"indexShader\", (o) =>\n      o.indexShader(shader)\n    );\n  }\n  sourceShader(shader) {\n    return __guardMethod__(this.bind.source, \"sourceShader\", (o) =>\n      o.sourceShader(shader)\n    );\n  }\n\n  getDimensions() {\n    return this.bind.source.getDimensions();\n  }\n  getFutureDimensions() {\n    return this.bind.source.getFutureDimensions();\n  }\n  getActiveDimensions() {\n    return this.bind.source.getActiveDimensions();\n  }\n  getIndexDimensions() {\n    return this.bind.source.getIndexDimensions();\n  }\n\n  init() {\n    return (this.sourceSpec = [{ to: \"operator.source\", trait: \"source\" }]);\n  }\n\n  make() {\n    super.make();\n\n    // Bind to attached data sources\n    return this._helpers.bind.make(this.sourceSpec);\n  }\n\n  made() {\n    this.resize();\n    return super.made();\n  }\n\n  unmake() {\n    return this._helpers.bind.unmake();\n  }\n\n  resize(_rebuild) {\n    return this.trigger({\n      type: \"source.resize\",\n    });\n  }\n}\nOperator.initClass();\n\nfunction __guardMethod__(obj, methodName, transform) {\n  if (\n    typeof obj !== \"undefined\" &&\n    obj !== null &&\n    typeof obj[methodName] === \"function\"\n  ) {\n    return transform(obj, methodName);\n  } else {\n    return undefined;\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { FloatType, NearestFilter } from \"three/src/constants.js\";\nimport { Operator } from \"../operator/operator.js\";\n\nexport class Format extends Operator {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"bind\",\n      \"operator\",\n      \"texture\",\n      \"text\",\n      \"format\",\n      \"font\",\n    ];\n    this.defaults = {\n      minFilter: \"linear\",\n      magFilter: \"linear\",\n    };\n  }\n\n  init() {\n    super.init();\n    this.atlas = this.buffer = this.used = this.time = null;\n    return (this.filled = false);\n  }\n\n  sourceShader(shader) {\n    return this.buffer.shader(shader);\n  }\n\n  textShader(shader) {\n    return this.atlas.shader(shader);\n  }\n\n  textIsSDF() {\n    return this.props.sdf > 0;\n  }\n\n  textHeight() {\n    return this.props.detail;\n  }\n\n  make() {\n    // Bind to attached data sources    # super()\n    this._helpers.bind.make([{ to: \"operator.source\", trait: \"raw\" }]);\n\n    // Read sampling parameters\n    let { minFilter, magFilter, type } = this.props;\n\n    // Read font parameters\n    const { font, style, variant, weight, detail, sdf } = this.props;\n\n    // Prepare text atlas\n    this.atlas = this._renderables.make(\"textAtlas\", {\n      font,\n      size: detail,\n      style,\n      variant,\n      weight,\n      outline: sdf,\n      minFilter,\n      magFilter,\n      type,\n    });\n\n    // Underlying data buffer needs no filtering\n    minFilter = NearestFilter;\n    magFilter = NearestFilter;\n    type = FloatType;\n\n    // Fetch geometry dimensions\n    const dims = this.bind.source.getDimensions();\n    const { items, width, height, depth } = dims;\n\n    // Create voxel buffer for text atlas coords\n    this.buffer = this._renderables.make(\"voxelBuffer\", {\n      width,\n      height,\n      depth,\n      channels: 4,\n      items,\n      minFilter,\n      magFilter,\n      type,\n    });\n\n    // Hook buffer emitter to map atlas text\n    const { atlas } = this;\n    const { emit } = this.buffer.streamer;\n    this.buffer.streamer.emit = (t) => atlas.map(t, emit);\n\n    // Grab parent clock\n    this.clockParent = this._inherit(\"clock\");\n    return this._listen(\"root\", \"root.update\", this.update);\n  }\n\n  made() {\n    super.made();\n    return this.resize();\n  }\n\n  unmake() {\n    super.unmake();\n    if (this.buffer) {\n      this.buffer.dispose();\n      this.buffer = null;\n    }\n\n    if (this.atlas) {\n      this.atlas.dispose();\n      return (this.atlas = null);\n    }\n  }\n\n  update() {\n    if ((this.filled && !this.props.live) || !this.through) {\n      return;\n    }\n\n    this.time = this.clockParent.getTime();\n\n    const { used } = this;\n\n    this.atlas.begin();\n    this.used = this.through();\n    this.buffer.write(this.used);\n    this.atlas.end();\n\n    this.filled = true;\n\n    if (used !== this.used) {\n      return this.trigger({\n        type: \"source.resize\",\n      });\n    }\n  }\n\n  change(changed, touched, init) {\n    if (touched[\"font\"]) {\n      return this.rebuild();\n    }\n\n    if (\n      changed[\"format.expr\"] ||\n      changed[\"format.digits\"] ||\n      changed[\"format.data\"] ||\n      init\n    ) {\n      let map;\n      let { expr } = this.props;\n      const { digits, data } = this.props;\n\n      if (expr == null) {\n        if (data != null) {\n          expr = (x, y, z, w, i) => data[i];\n        } else {\n          expr = (x) => x;\n        }\n      }\n\n      const { length } = expr;\n\n      if (digits != null) {\n        expr = (\n          (expr) => (x, y, z, w, i, j, k, l, t, d) =>\n            +expr(x, y, z, w, i, j, k, l, t, d).toPrecision(digits)\n        )(expr);\n      }\n\n      // Stream raw source data and format it with expression\n      if (length > 8) {\n        map = (emit, x, y, z, w, i, j, k, l, _t, _d) => {\n          return emit(\n            expr(x, y, z, w, i, j, k, l, this.time.clock, this.time.step)\n          );\n        };\n      } else {\n        map = (emit, x, y, z, w, i, j, k, l) => {\n          return emit(expr(x, y, z, w, i, j, k, l));\n        };\n      }\n\n      return (this.through = this.bind.source\n        .rawBuffer()\n        .through(map, this.buffer));\n    }\n  }\n}\nFormat.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UJS from \"../../../util/js.js\";\n\nimport { Primitive } from \"../../primitive.js\";\n\nexport class Label extends Primitive {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"bind\",\n      \"object\",\n      \"visible\",\n      \"style\",\n      \"label\",\n      \"attach\",\n      \"geometry\",\n      \"position\",\n    ];\n  }\n\n  make() {\n    let color;\n    super.make();\n\n    // Bind to attached objects\n    this._helpers.bind.make([\n      { to: \"label.text\", trait: \"text\" },\n      { to: \"geometry.points\", trait: \"source\" },\n      { to: \"geometry.colors\", trait: \"source\" },\n    ]);\n\n    if (this.bind.points == null) {\n      return;\n    }\n    if (this.bind.text == null) {\n      return;\n    }\n\n    // Fetch geometry/text dimensions\n    const pointDims = this.bind.points.getDimensions();\n    const textDims = this.bind.text.getDimensions();\n    const textIsSDF = this.bind.text.textIsSDF();\n\n    const items = Math.min(pointDims.items, textDims.items);\n    const width = Math.min(pointDims.width, textDims.width);\n    const height = Math.min(pointDims.height, textDims.height);\n    const depth = Math.min(pointDims.depth, textDims.depth);\n\n    // Build shader to sample position data\n    // and transform into screen space\n    let position = this.bind.points.sourceShader(this._shaders.shader());\n    position = this._helpers.position.pipeline(position);\n\n    // Build shader to sample text geometry data\n    const sprite = this.bind.text.sourceShader(this._shaders.shader());\n\n    // Build shader to sample text image data\n    const map = this._shaders.shader().pipe(\"label.map\");\n    map.pipe(this.bind.text.textShader(this._shaders.shader()));\n\n    // Build shader to resolve text data\n    const labelUniforms = {\n      spriteDepth: this.node.attributes[\"attach.depth\"],\n      spriteOffset: this.node.attributes[\"attach.offset\"],\n      spriteSnap: this.node.attributes[\"attach.snap\"],\n      spriteScale: this._attributes.make(this._types.number()),\n      outlineStep: this._attributes.make(this._types.number()),\n      outlineExpand: this._attributes.make(this._types.number()),\n      outlineColor: this.node.attributes[\"label.background\"],\n    };\n\n    this.spriteScale = labelUniforms.spriteScale;\n    this.outlineStep = labelUniforms.outlineStep;\n    this.outlineExpand = labelUniforms.outlineExpand;\n\n    const snippet = textIsSDF ? \"label.outline\" : \"label.alpha\";\n    const combine = this._shaders.shader().pipe(snippet, labelUniforms);\n\n    // Build color lookup\n    if (this.bind.colors) {\n      color = this._shaders.shader();\n      this.bind.colors.sourceShader(color);\n    }\n\n    // Build transition mask lookup\n    const mask = this._helpers.object.mask();\n\n    // Prepare bound uniforms\n    const styleUniforms = this._helpers.style.uniforms();\n    const unitUniforms = this._inherit(\"unit\").getUnitUniforms();\n\n    // Make sprite renderable\n    const uniforms = UJS.merge(unitUniforms, styleUniforms, labelUniforms);\n    this.sprite = this._renderables.make(\"sprite\", {\n      uniforms,\n      width,\n      height,\n      depth,\n      items,\n      position,\n      sprite,\n      map,\n      combine,\n      color,\n      mask,\n      linear: true,\n    });\n\n    this._helpers.visible.make();\n    return this._helpers.object.make([this.sprite]);\n  }\n\n  unmake() {\n    this._helpers.bind.unmake();\n    this._helpers.visible.unmake();\n    this._helpers.object.unmake();\n\n    return (this.sprite = null);\n  }\n\n  resize() {\n    // Fetch geometry/text dimensions\n    const pointDims = this.bind.points.getActiveDimensions();\n    const textDims = this.bind.text.getActiveDimensions();\n\n    const items = Math.min(pointDims.items, textDims.items);\n    const width = Math.min(pointDims.width, textDims.width);\n    const height = Math.min(pointDims.height, textDims.height);\n    const depth = Math.min(pointDims.depth, textDims.depth);\n\n    return this.sprite.geometry.clip(width, height, depth, items);\n  }\n\n  change(changed, touched, _init) {\n    if (touched[\"geometry\"] || changed[\"label.text\"]) {\n      return this.rebuild();\n    }\n    if (this.bind.points == null) {\n      return;\n    }\n\n    const { size } = this.props;\n    const { outline } = this.props;\n    const { expand } = this.props;\n    const height = this.bind.text.textHeight();\n    const scale = size / height;\n\n    this.outlineExpand.value = ((expand / scale) * 16) / 255;\n    this.outlineStep.value = ((outline / scale) * 16) / 255;\n    return (this.spriteScale.value = scale);\n  }\n}\nLabel.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UGLSL from \"../../../util/glsl.js\";\nimport { Operator } from \"./operator.js\";\n\nexport class Resample extends Operator {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"bind\",\n      \"operator\",\n      \"source\",\n      \"index\",\n      \"resample\",\n      \"sampler:x\",\n      \"sampler:y\",\n      \"sampler:z\",\n      \"sampler:w\",\n      \"include\",\n    ];\n  }\n\n  indexShader(shader) {\n    shader.pipe(this.indexer);\n    return super.indexShader(shader);\n  }\n\n  sourceShader(shader) {\n    return shader.pipe(this.operator);\n  }\n\n  getDimensions() {\n    return this._resample(this.bind.source.getDimensions());\n  }\n  getActiveDimensions() {\n    return this._resample(this.bind.source.getActiveDimensions());\n  }\n  getFutureDimensions() {\n    return this._resample(this.bind.source.getFutureDimensions());\n  }\n  getIndexDimensions() {\n    return this._resample(this.bind.source.getIndexDimensions());\n  }\n\n  _resample(dims) {\n    const r = this.resampled;\n    const c = this.centered;\n    const p = this.padding;\n\n    if (this.relativeSize) {\n      if (!c.items) {\n        dims.items--;\n      }\n      if (!c.width) {\n        dims.width--;\n      }\n      if (!c.height) {\n        dims.height--;\n      }\n      if (!c.depth) {\n        dims.depth--;\n      }\n\n      if (r.items != null) {\n        dims.items *= r.items;\n      }\n      if (r.width != null) {\n        dims.width *= r.width;\n      }\n      if (r.height != null) {\n        dims.height *= r.height;\n      }\n      if (r.depth != null) {\n        dims.depth *= r.depth;\n      }\n\n      if (!c.items) {\n        dims.items++;\n      }\n      if (!c.width) {\n        dims.width++;\n      }\n      if (!c.height) {\n        dims.height++;\n      }\n      if (!c.depth) {\n        dims.depth++;\n      }\n\n      dims.items -= p.items * 2;\n      dims.width -= p.width * 2;\n      dims.height -= p.height * 2;\n      dims.depth -= p.depth * 2;\n    } else {\n      if (r.items != null) {\n        dims.items = r.items;\n      }\n      if (r.width != null) {\n        dims.width = r.width;\n      }\n      if (r.height != null) {\n        dims.height = r.height;\n      }\n      if (r.depth != null) {\n        dims.depth = r.depth;\n      }\n    }\n\n    dims.items = Math.max(0, Math.floor(dims.items));\n    dims.width = Math.max(0, Math.floor(dims.width));\n    dims.height = Math.max(0, Math.floor(dims.height));\n    dims.depth = Math.max(0, Math.floor(dims.depth));\n\n    return dims;\n  }\n\n  make() {\n    super.make();\n    if (this.bind.source == null) {\n      return;\n    }\n\n    // Bind to attached shader\n    this._helpers.bind.make([\n      { to: \"include.shader\", trait: \"shader\", optional: true },\n    ]);\n\n    // Get custom shader\n    const { indices, channels } = this.props;\n    const { shader } = this.bind;\n\n    // Get resampled dimensions (if any)\n    const { sample, size, items, width, height, depth } = this.props;\n\n    // Sampler behavior\n    const relativeSample =\n      sample === this.node.attributes[\"resample.sample\"].enum.relative;\n    const relativeSize =\n      size === this.node.attributes[\"resample.size\"].enum.relative;\n\n    this.resampled = {};\n    if (items != null) {\n      this.resampled.items = items;\n    }\n    if (width != null) {\n      this.resampled.width = width;\n    }\n    if (height != null) {\n      this.resampled.height = height;\n    }\n    if (depth != null) {\n      this.resampled.depth = depth;\n    }\n\n    this.centered = {};\n    this.centered.items = this.props.centeredW;\n    this.centered.width = this.props.centeredX;\n    this.centered.height = this.props.centeredY;\n    this.centered.depth = this.props.centeredZ;\n\n    this.padding = {};\n    this.padding.items = this.props.paddingW;\n    this.padding.width = this.props.paddingX;\n    this.padding.height = this.props.paddingY;\n    this.padding.depth = this.props.paddingZ;\n\n    // Build shader to resample data\n    const operator = this._shaders.shader();\n    const indexer = this._shaders.shader();\n\n    // Uniforms\n    const type = [\n      null,\n      this._types.number,\n      this._types.vec2,\n      this._types.vec3,\n      this._types.vec4,\n    ][indices];\n    const uniforms = {\n      dataSize: this._attributes.make(type(0, 0, 0, 0)),\n      dataResolution: this._attributes.make(type(0, 0, 0, 0)),\n\n      targetSize: this._attributes.make(type(0, 0, 0, 0)),\n      targetResolution: this._attributes.make(type(0, 0, 0, 0)),\n\n      resampleFactor: this._attributes.make(this._types.vec4(0, 0, 0, 0)),\n      resampleBias: this._attributes.make(this._types.vec4(0, 0, 0, 0)),\n    };\n\n    this.dataResolution = uniforms.dataResolution;\n    this.dataSize = uniforms.dataSize;\n    this.targetResolution = uniforms.targetResolution;\n    this.targetSize = uniforms.targetSize;\n    this.resampleFactor = uniforms.resampleFactor;\n    this.resampleBias = uniforms.resampleBias;\n\n    // Has resize props?\n    const resize =\n      items != null || width != null || height != null || depth != null;\n\n    // Add padding\n    operator.pipe(\"resample.padding\", uniforms);\n\n    // Add centered sampling offset\n    let vec = [];\n    let any = false;\n    const iterable = [\"width\", \"height\", \"depth\", \"items\"];\n    for (let i = 0; i < iterable.length; i++) {\n      const key = iterable[i];\n      const centered = this.centered[key];\n      if (!any) {\n        any = centered;\n      }\n      vec[i] = centered ? \"0.5\" : \"0.0\";\n    }\n\n    if (any) {\n      vec = `vec4(${vec})`;\n      // TODO is this right? seems like copy paste.\n      operator.pipe(UGLSL.binaryOperator(4, \"+\", vec));\n      if (resize) {\n        indexer.pipe(UGLSL.binaryOperator(4, \"+\", vec));\n      }\n    }\n\n    if (relativeSample) {\n      // Addressing relative to target\n      if (resize) {\n        operator.pipe(\"resample.relative\", uniforms);\n        indexer.pipe(\"resample.relative\", uniforms);\n      } else {\n        indexer.pipe(UGLSL.identity(\"vec4\"));\n      }\n    }\n\n    if (shader != null) {\n      if (indices !== 4) {\n        operator.pipe(UGLSL.truncateVec(4, indices));\n      }\n\n      operator.callback();\n      if (indices !== 4) {\n        operator.pipe(UGLSL.extendVec(indices, 4));\n      }\n      if (any) {\n        operator.pipe(UGLSL.binaryOperator(4, \"-\", vec));\n      }\n      operator.pipe(this.bind.source.sourceShader(this._shaders.shader()));\n      if (channels !== 4) {\n        operator.pipe(UGLSL.truncateVec(4, channels));\n      }\n      operator.join();\n\n      if (this.bind.shader != null) {\n        operator.pipe(this.bind.shader.shaderBind(uniforms));\n      }\n\n      if (channels !== 4) {\n        operator.pipe(UGLSL.extendVec(channels, 4));\n      }\n    } else {\n      if (any) {\n        operator.pipe(UGLSL.binaryOperator(4, \"-\", vec));\n      }\n      operator.pipe(this.bind.source.sourceShader(this._shaders.shader()));\n    }\n\n    if (any && resize) {\n      indexer.pipe(UGLSL.binaryOperator(4, \"-\", vec));\n    }\n\n    this.operator = operator;\n    this.indexer = indexer;\n    this.indices = indices;\n\n    this.relativeSample = relativeSample;\n    return (this.relativeSize = relativeSize);\n  }\n\n  unmake() {\n    super.unmake();\n    return (this.operator = null);\n  }\n\n  resize() {\n    if (this.bind.source == null) {\n      return;\n    }\n\n    const dims = this.bind.source.getActiveDimensions();\n    const target = this.getActiveDimensions();\n\n    const axis = (key) => {\n      const centered = this.centered[key];\n      const pad = this.padding[key];\n\n      target[key] += pad * 2;\n\n      const res = centered\n        ? dims[key] / Math.max(1, target[key])\n        : Math.max(1, dims[key] - 1) / Math.max(1, target[key] - 1);\n      return [res, pad];\n    };\n\n    const [rw, bw] = Array.from(axis(\"width\"));\n    const [rh, bh] = Array.from(axis(\"height\"));\n    const [rd, bd] = Array.from(axis(\"depth\"));\n    const [ri, bi] = Array.from(axis(\"items\"));\n\n    if (this.indices === 1) {\n      this.dataResolution.value = 1 / dims.width;\n      this.targetResolution.value = 1 / target.width;\n\n      this.dataSize.value = dims.width;\n      this.targetSize.value = target.width;\n    } else {\n      this.dataResolution.value.set(\n        1 / dims.width,\n        1 / dims.height,\n        1 / dims.depth,\n        1 / dims.items\n      );\n      this.targetResolution.value.set(\n        1 / target.width,\n        1 / target.height,\n        1 / target.depth,\n        1 / target.items\n      );\n\n      this.dataSize.value.set(dims.width, dims.height, dims.depth, dims.items);\n      this.targetSize.value.set(\n        target.width,\n        target.height,\n        target.depth,\n        target.items\n      );\n    }\n\n    this.resampleFactor.value.set(rw, rh, rd, ri);\n    this.resampleBias.value.set(bw, bh, bd, bi);\n\n    return super.resize();\n  }\n\n  change(changed, touched, _init) {\n    if (\n      touched[\"operator\"] ||\n      touched[\"resample\"] ||\n      touched[\"sampler\"] ||\n      touched[\"include\"]\n    ) {\n      return this.rebuild();\n    }\n  }\n}\nResample.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Resample } from \"../operator/resample.js\";\n\nexport class Retext extends Resample {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"bind\",\n      \"operator\",\n      \"resample\",\n      \"sampler:x\",\n      \"sampler:y\",\n      \"sampler:z\",\n      \"sampler:w\",\n      \"include\",\n      \"text\",\n    ];\n  }\n\n  init() {\n    return (this.sourceSpec = [{ to: \"operator.source\", trait: \"text\" }]);\n  }\n\n  textShader(shader) {\n    return this.bind.source.textShader(shader);\n  }\n\n  textIsSDF() {\n    return (\n      (this.bind.source != null ? this.bind.source.props.sdf : undefined) > 0\n    );\n  }\n  textHeight() {\n    return this.bind.source != null ? this.bind.source.props.detail : undefined;\n  }\n}\nRetext.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Parent } from \"../base/parent.js\";\n\nexport class Clock extends Parent {\n  static initClass() {\n    this.traits = [\"node\", \"clock\", \"seek\", \"play\"];\n  }\n\n  init() {\n    this.skew = 0;\n    this.last = 0;\n    return (this.time = {\n      now: +new Date() / 1000,\n      time: 0,\n      delta: 0,\n      clock: 0,\n      step: 0,\n    });\n  }\n\n  make() {\n    // Listen to parent clock\n    return this._listen(\"clock\", \"clock.tick\", this.tick);\n  }\n\n  reset() {\n    return (this.skew = 0);\n  }\n\n  tick(e) {\n    const { from, to, speed, seek, pace, delay, realtime } = this.props;\n\n    const parent = this._inherit(\"clock\").getTime();\n\n    const time = realtime ? parent.time : parent.clock;\n    const delta = realtime ? parent.delta : parent.step;\n    const ratio = speed / pace;\n\n    this.skew += delta * (ratio - 1);\n    if (this.last > time) {\n      this.skew = 0;\n    }\n\n    this.time.now = parent.now + this.skew;\n\n    this.time.time = parent.time;\n    this.time.delta = parent.delta;\n\n    const clock = seek != null ? seek : parent.clock + this.skew;\n    this.time.clock = Math.min(to, from + Math.max(0, clock - delay * ratio));\n    this.time.step = delta * ratio;\n\n    this.last = time;\n\n    return this.trigger(e);\n  }\n\n  getTime() {\n    return this.time;\n  }\n}\nClock.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Parent } from \"../base/parent.js\";\n\nexport class Now extends Parent {\n  static initClass() {\n    this.traits = [\"node\", \"clock\", \"now\"];\n  }\n\n  init() {\n    let now;\n    this.now = now = +new Date() / 1000;\n    this.skew = 0;\n    return (this.time = {\n      now,\n      time: 0,\n      delta: 0,\n      clock: 0,\n      step: 0,\n    });\n  }\n\n  make() {\n    // Listen to parent clock\n    this.clockParent = this._inherit(\"clock\");\n    return this._listen(\"clock\", \"clock.tick\", this.tick);\n  }\n\n  unmake() {\n    return (this.clockParent = null);\n  }\n\n  change(changed, _touched, _init) {\n    if (changed[\"date.now\"]) {\n      return (this.skew = 0);\n    }\n  }\n\n  tick(e) {\n    const { seek, pace, speed } = this.props;\n\n    const parent = this.clockParent.getTime();\n\n    this.skew += (parent.step * pace) / speed;\n    if (seek != null) {\n      this.skew = seek;\n    }\n\n    this.time.now =\n      this.time.time =\n      this.time.clock =\n        (this.props.now != null ? this.props.now : this.now) + this.skew;\n    this.time.delta = this.time.step = parent.delta;\n\n    return this.trigger(e);\n  }\n\n  getTime() {\n    return this.time;\n  }\n}\nNow.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining\n * DS104: Avoid inline assignments\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Parent } from \"../base/parent.js\";\n\nexport class Transform extends Parent {\n  static initClass() {\n    this.traits = [\"node\", \"vertex\", \"fragment\"];\n  }\n\n  vertex(shader, pass) {\n    let left;\n    return (left = __guard__(this._inherit(\"vertex\"), (x) =>\n      x.vertex(shader, pass)\n    )) != null\n      ? left\n      : shader;\n  }\n\n  fragment(shader, pass) {\n    let left;\n    return (left = __guard__(this._inherit(\"fragment\"), (x) =>\n      x.fragment(shader, pass)\n    )) != null\n      ? left\n      : shader;\n  }\n}\nTransform.initClass();\n\nfunction __guard__(value, xform) {\n  return typeof value !== \"undefined\" && value !== null\n    ? xform(value)\n    : undefined;\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UThree from \"../../../util/three.js\";\nimport { Transform } from \"./transform.js\";\n\nexport class Transform3 extends Transform {\n  static initClass() {\n    this.traits = [\"node\", \"vertex\", \"transform3\"];\n  }\n\n  make() {\n    this.uniforms = {\n      transformMatrix: this._attributes.make(this._types.mat4()),\n    };\n\n    return (this.composer = UThree.transformComposer());\n  }\n\n  unmake() {\n    return delete this.uniforms;\n  }\n\n  change(changed, touched, init) {\n    if (changed[\"transform3.pass\"]) {\n      return this.rebuild();\n    }\n    if (!touched[\"transform3\"] && !init) {\n      return;\n    }\n\n    const p = this.props.position;\n    const q = this.props.quaternion;\n    const r = this.props.rotation;\n    const s = this.props.scale;\n    const m = this.props.matrix;\n    const e = this.props.eulerOrder;\n\n    return (this.uniforms.transformMatrix.value = this.composer(\n      p,\n      r,\n      q,\n      s,\n      m,\n      e\n    ));\n  }\n\n  vertex(shader, pass) {\n    if (pass === this.props.pass) {\n      shader.pipe(\"transform3.position\", this.uniforms);\n    }\n    return super.vertex(shader, pass);\n  }\n}\nTransform3.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Transform } from \"./transform.js\";\n\nexport class Transform4 extends Transform {\n  static initClass() {\n    this.traits = [\"node\", \"vertex\", \"transform4\"];\n  }\n\n  make() {\n    this.uniforms = {\n      transformMatrix: this._attributes.make(this._types.mat4()),\n      transformOffset: this.node.attributes[\"transform4.position\"],\n    };\n\n    return (this.transformMatrix = this.uniforms.transformMatrix.value);\n  }\n\n  unmake() {\n    return delete this.uniforms;\n  }\n\n  change(changed, touched, init) {\n    if (changed[\"transform4.pass\"]) {\n      return this.rebuild();\n    }\n    if (!touched[\"transform4\"] && !init) {\n      return;\n    }\n\n    const s = this.props.scale;\n    const m = this.props.matrix;\n\n    const t = this.transformMatrix;\n    t.copy(m);\n    return t.scale(s);\n  }\n\n  vertex(shader, pass) {\n    if (pass === this.props.pass) {\n      shader.pipe(\"transform4.position\", this.uniforms);\n    }\n    return super.vertex(shader, pass);\n  }\n}\nTransform4.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Transform } from \"./transform.js\";\n\nexport class Vertex extends Transform {\n  static initClass() {\n    this.traits = [\"node\", \"include\", \"vertex\", \"bind\"];\n  }\n\n  make() {\n    // Bind to attached shader\n    return this._helpers.bind.make([\n      { to: \"include.shader\", trait: \"shader\", optional: true },\n    ]);\n  }\n\n  unmake() {\n    return this._helpers.bind.unmake();\n  }\n\n  change(changed, touched, _init) {\n    if (touched[\"include\"]) {\n      return this.rebuild();\n    }\n  }\n\n  vertex(shader, pass) {\n    if (this.bind.shader != null) {\n      if (pass === this.props.pass) {\n        shader.pipe(this.bind.shader.shaderBind());\n      }\n    }\n    return super.vertex(shader, pass);\n  }\n}\nVertex.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Transform } from \"./transform.js\";\n\nexport class Fragment extends Transform {\n  static initClass() {\n    this.traits = [\"node\", \"include\", \"fragment\", \"bind\"];\n  }\n\n  make() {\n    // Bind to attached shader\n    return this._helpers.bind.make([\n      { to: \"include.shader\", trait: \"shader\", optional: true },\n    ]);\n  }\n\n  unmake() {\n    return this._helpers.bind.unmake();\n  }\n\n  change(changed, touched, _init) {\n    if (touched[\"include\"] || changed[\"fragment.gamma\"]) {\n      return this.rebuild();\n    }\n  }\n\n  fragment(shader, pass) {\n    if (this.bind.shader != null) {\n      if (pass === this.props.pass) {\n        if (this.props.gamma) {\n          shader.pipe(\"mesh.gamma.out\");\n        }\n        shader.pipe(this.bind.shader.shaderBind());\n        shader.split();\n        if (this.props.gamma) {\n          shader.pipe(\"mesh.gamma.in\");\n        }\n        shader.pass();\n      }\n    }\n    return super.fragment(shader, pass);\n  }\n}\nFragment.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Transform } from \"./transform.js\";\n\nexport class Layer extends Transform {\n  static initClass() {\n    this.traits = [\"node\", \"vertex\", \"layer\"];\n  }\n\n  make() {\n    this._listen(\"root\", \"root.resize\", this.update);\n\n    return (this.uniforms = {\n      layerScale: this._attributes.make(this._types.vec4()),\n      layerBias: this._attributes.make(this._types.vec4()),\n    });\n  }\n\n  update() {\n    const camera = this._inherit(\"root\").getCamera();\n\n    const aspect = camera.aspect != null ? camera.aspect : 1;\n    const fov = camera.fov != null ? camera.fov : 1;\n\n    const pitch = Math.tan((fov * Math.PI) / 360);\n\n    const _enum = this.node.attributes[\"layer.fit\"].enum;\n\n    let { fit } = this.props;\n    const { depth } = this.props;\n\n    // Convert contain/cover into x/y\n    switch (fit) {\n      case _enum.contain:\n        fit = aspect > 1 ? _enum.y : _enum.x;\n        break;\n      case _enum.cover:\n        fit = aspect > 1 ? _enum.x : _enum.y;\n        break;\n    }\n\n    // Fit x/y\n    switch (fit) {\n      case _enum.x:\n        this.uniforms.layerScale.value.set(pitch * aspect, pitch * aspect);\n        break;\n      case _enum.y:\n        this.uniforms.layerScale.value.set(pitch, pitch);\n        break;\n    }\n\n    return this.uniforms.layerBias.value.set(0, 0, -depth, 0);\n  }\n\n  change(changed, touched, init) {\n    if (changed[\"layer.fit\"] || changed[\"layer.depth\"] || init) {\n      return this.update();\n    }\n  }\n\n  // End transform chain here without applying camera view\n  vertex(shader, pass) {\n    if (pass === 2) {\n      return shader.pipe(\"layer.position\", this.uniforms);\n    }\n    if (pass === 3) {\n      return shader.pipe(\"root.position\");\n    }\n    return shader;\n  }\n}\nLayer.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining\n * DS104: Avoid inline assignments\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UGLSL from \"../../../util/glsl.js\";\nimport { Parent } from \"../base/parent.js\";\n\nexport class Mask extends Parent {\n  static initClass() {\n    this.traits = [\"node\", \"include\", \"mask\", \"bind\"];\n  }\n\n  make() {\n    // Bind to attached shader\n    return this._helpers.bind.make([\n      { to: \"include.shader\", trait: \"shader\", optional: true },\n    ]);\n  }\n\n  unmake() {\n    return this._helpers.bind.unmake();\n  }\n\n  change(changed, touched, _init) {\n    if (touched[\"include\"]) {\n      return this.rebuild();\n    }\n  }\n\n  mask(shader) {\n    let left, s;\n    if (this.bind.shader != null) {\n      if (shader) {\n        s = this._shaders.shader();\n        s.pipe(UGLSL.identity(\"vec4\"));\n        s.fan();\n        s.pipe(shader);\n        s.next();\n        s.pipe(this.bind.shader.shaderBind());\n        s.end();\n        s.pipe(\"float combine(float a, float b) { return min(a, b); }\");\n      } else {\n        s = this._shaders.shader();\n        s.pipe(this.bind.shader.shaderBind());\n      }\n    } else {\n      s = shader;\n    }\n\n    return (left = __guard__(this._inherit(\"mask\"), (x) => x.mask(s))) != null\n      ? left\n      : s;\n  }\n}\nMask.initClass();\n\nfunction __guard__(value, transform) {\n  return typeof value !== \"undefined\" && value !== null\n    ? transform(value)\n    : undefined;\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Operator } from \"./operator.js\";\n\nexport class Clamp extends Operator {\n  static initClass() {\n    this.traits = [\"node\", \"bind\", \"operator\", \"source\", \"index\", \"clamp\"];\n  }\n\n  indexShader(shader) {\n    shader.pipe(this.operator);\n    return super.indexShader(shader);\n  }\n\n  sourceShader(shader) {\n    shader.pipe(this.operator);\n    return super.sourceShader(shader);\n  }\n\n  make() {\n    super.make();\n    if (this.bind.source == null) {\n      return;\n    }\n\n    // Max index on all 4 dimensions\n    const uniforms = { clampLimit: this._attributes.make(this._types.vec4()) };\n    this.clampLimit = uniforms.clampLimit;\n\n    // Build shader to clamp along all dimensions\n    const transform = this._shaders.shader();\n    transform.pipe(\"clamp.position\", uniforms);\n    return (this.operator = transform);\n  }\n\n  unmake() {\n    return super.unmake();\n  }\n\n  resize() {\n    if (this.bind.source != null) {\n      const dims = this.bind.source.getActiveDimensions();\n      this.clampLimit.value.set(\n        dims.width - 1,\n        dims.height - 1,\n        dims.depth - 1,\n        dims.items - 1\n      );\n    }\n\n    return super.resize();\n  }\n\n  change(changed, touched, _init) {\n    if (touched[\"operator\"] || touched[\"clamp\"]) {\n      return this.rebuild();\n    }\n  }\n}\nClamp.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Operator } from \"./operator.js\";\n\nexport class Grow extends Operator {\n  static initClass() {\n    this.traits = [\"node\", \"bind\", \"operator\", \"source\", \"index\", \"grow\"];\n  }\n\n  sourceShader(shader) {\n    return shader.pipe(this.operator);\n  }\n\n  make() {\n    super.make();\n    if (this.bind.source == null) {\n      return;\n    }\n\n    // Uniforms\n    const uniforms = {\n      growScale: this.node.attributes[\"grow.scale\"],\n      growMask: this._attributes.make(this._types.vec4()),\n      growAnchor: this._attributes.make(this._types.vec4()),\n    };\n\n    this.growMask = uniforms.growMask.value;\n    this.growAnchor = uniforms.growAnchor.value;\n\n    // Build shader to spread data on one dimension\n    const transform = this._shaders.shader();\n    transform.require(this.bind.source.sourceShader(this._shaders.shader()));\n    transform.pipe(\"grow.position\", uniforms);\n\n    return (this.operator = transform);\n  }\n\n  unmake() {\n    return super.unmake();\n  }\n\n  resize() {\n    this.update();\n    return super.resize();\n  }\n\n  update() {\n    // Size to fit to include future history\n    const dims = this.bind.source.getFutureDimensions();\n\n    const order = [\"width\", \"height\", \"depth\", \"items\"];\n\n    const m = (d, anchor) => ((d || 1) - 1) * (0.5 - anchor * 0.5);\n\n    return (() => {\n      const result = [];\n      for (let i = 0; i < order.length; i++) {\n        const key = order[i];\n        const anchor = this.props[key];\n\n        this.growMask.setComponent(i, +(anchor == null));\n        result.push(\n          this.growAnchor.setComponent(\n            i,\n            anchor != null ? m(dims[key], anchor) : 0\n          )\n        );\n      }\n      return result;\n    })();\n  }\n\n  change(changed, touched, _init) {\n    if (touched[\"operator\"]) {\n      return this.rebuild();\n    }\n\n    if (touched[\"grow\"]) {\n      return this.update();\n    }\n  }\n}\nGrow.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UGLSL from \"../../../util/glsl.js\";\nimport { Operator } from \"./operator.js\";\n\n/*\nsplit:\n  order:       Types.transpose('wxyz')\n  axis:        Types.axis()\n  overlap:     Types.int(0)\n*/\n\nexport class Join extends Operator {\n  static initClass() {\n    this.traits = [\"node\", \"bind\", \"operator\", \"source\", \"index\", \"join\"];\n  }\n\n  indexShader(shader) {\n    shader.pipe(this.operator);\n    return super.indexShader(shader);\n  }\n\n  sourceShader(shader) {\n    shader.pipe(this.operator);\n    return super.sourceShader(shader);\n  }\n\n  getDimensions() {\n    return this._resample(this.bind.source.getDimensions());\n  }\n  getActiveDimensions() {\n    return this._resample(this.bind.source.getActiveDimensions());\n  }\n  getFutureDimensions() {\n    return this._resample(this.bind.source.getFutureDimensions());\n  }\n  getIndexDimensions() {\n    return this._resample(this.bind.source.getIndexDimensions());\n  }\n\n  _resample(dims) {\n    let left;\n    let dim;\n    const { order, axis, stride } = this;\n\n    const labels = [\"width\", \"height\", \"depth\", \"items\"];\n    const mapped = order.map((x) => labels[x - 1]);\n    const index = order.indexOf(axis);\n    let set = (() => {\n      const result = [];\n      for (dim of Array.from(mapped)) {\n        result.push(dims[dim]);\n      }\n      return result;\n    })();\n    const product = ((left = set[index + 1]) != null ? left : 1) * stride;\n\n    set.splice(index, 2, product);\n    set = set.slice(0, 3);\n    set.push(1);\n\n    const out = {};\n    for (let i = 0; i < mapped.length; i++) {\n      dim = mapped[i];\n      out[dim] = set[i];\n    }\n\n    //console.log 'join', order, axis, length, stride\n    //console.log dims, out\n\n    return out;\n  }\n\n  make() {\n    super.make();\n    if (this.bind.source == null) {\n      return;\n    }\n\n    const { order } = this.props;\n    let { axis } = this.props;\n    let { overlap } = this.props;\n\n    /*\n    Calculate index transform\n\n    order: wxyz\n    length: 3\n    overlap: 1\n\n    axis: w\n    index: 0\n    rest: 00xy\n\n    axis: x\n    index: 1\n    rest: w00y\n\n    axis: y\n    index: 2\n    rest: wx00\n\n    axis: z\n    index: 3\n    rest: wxy0\n\n    */\n\n    const permute = order.join(\"\");\n    if (axis == null) {\n      axis = order[0];\n    }\n    const index = permute.indexOf(axis);\n    const rest = permute.replace(axis, \"00\").substring(0, 4);\n\n    const labels = [null, \"width\", \"height\", \"depth\", \"items\"];\n    const major = labels[axis];\n\n    // Prepare uniforms\n    const dims = this.bind.source.getDimensions();\n    const length = dims[major];\n\n    overlap = Math.min(length - 1, overlap);\n    const stride = length - overlap;\n\n    const uniforms = {\n      joinStride: this._attributes.make(this._types.number(stride)),\n      joinStrideInv: this._attributes.make(this._types.number(1 / stride)),\n    };\n\n    // Build shader to split a dimension into two\n    const transform = this._shaders.shader();\n    transform.require(UGLSL.swizzleVec4(axis, 1));\n    transform.require(UGLSL.swizzleVec4(rest, 4));\n    transform.require(UGLSL.injectVec4([index, index + 1]));\n    transform.pipe(\"join.position\", uniforms);\n    transform.pipe(UGLSL.invertSwizzleVec4(order));\n\n    this.operator = transform;\n\n    this.order = order;\n    this.axis = axis;\n    this.overlap = overlap;\n    this.length = length;\n    return (this.stride = stride);\n  }\n\n  unmake() {\n    return super.unmake();\n  }\n\n  change(changed, touched, _init) {\n    if (touched[\"join\"] || touched[\"operator\"]) {\n      return this.rebuild();\n    }\n  }\n}\nJoin.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UGLSL from \"../../../util/glsl.js\";\nimport { Operator } from \"./operator.js\";\n\nexport class Lerp extends Operator {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"bind\",\n      \"operator\",\n      \"source\",\n      \"index\",\n      \"lerp\",\n      \"sampler:x\",\n      \"sampler:y\",\n      \"sampler:z\",\n      \"sampler:w\",\n    ];\n  }\n\n  indexShader(shader) {\n    shader.pipe(this.indexer);\n    return super.indexShader(shader);\n  }\n\n  sourceShader(shader) {\n    return shader.pipe(this.operator);\n  }\n\n  getDimensions() {\n    return this._resample(this.bind.source.getDimensions());\n  }\n  getActiveDimensions() {\n    return this._resample(this.bind.source.getActiveDimensions());\n  }\n  getFutureDimensions() {\n    return this._resample(this.bind.source.getFutureDimensions());\n  }\n  getIndexDimensions() {\n    return this._resample(this.bind.source.getIndexDimensions());\n  }\n\n  _resample(dims) {\n    const r = this.resampled;\n    const c = this.centered;\n    const p = this.padding;\n\n    if (this.relativeSize) {\n      if (!c.items) {\n        dims.items--;\n      }\n      if (!c.width) {\n        dims.width--;\n      }\n      if (!c.height) {\n        dims.height--;\n      }\n      if (!c.depth) {\n        dims.depth--;\n      }\n\n      if (r.items != null) {\n        dims.items *= r.items;\n      }\n      if (r.width != null) {\n        dims.width *= r.width;\n      }\n      if (r.height != null) {\n        dims.height *= r.height;\n      }\n      if (r.depth != null) {\n        dims.depth *= r.depth;\n      }\n\n      if (!c.items) {\n        dims.items++;\n      }\n      if (!c.width) {\n        dims.width++;\n      }\n      if (!c.height) {\n        dims.height++;\n      }\n      if (!c.depth) {\n        dims.depth++;\n      }\n\n      dims.items -= p.items * 2;\n      dims.width -= p.width * 2;\n      dims.height -= p.height * 2;\n      dims.depth -= p.depth * 2;\n    } else {\n      if (r.items != null) {\n        dims.items = r.items;\n      }\n      if (r.width != null) {\n        dims.width = r.width;\n      }\n      if (r.height != null) {\n        dims.height = r.height;\n      }\n      if (r.depth != null) {\n        dims.depth = r.depth;\n      }\n    }\n\n    dims.items = Math.max(0, Math.floor(dims.items));\n    dims.width = Math.max(0, Math.floor(dims.width));\n    dims.height = Math.max(0, Math.floor(dims.height));\n    dims.depth = Math.max(0, Math.floor(dims.depth));\n\n    return dims;\n  }\n\n  make() {\n    let i, key;\n    super.make();\n    if (this.bind.source == null) {\n      return;\n    }\n\n    // Get resampled dimensions\n    const { size, items, width, height, depth } = this.props;\n\n    // Sampler behavior\n    const relativeSize =\n      size === this.node.attributes[\"lerp.size\"].enum.relative;\n\n    this.resampled = {};\n    if (items != null) {\n      this.resampled.items = items;\n    }\n    if (width != null) {\n      this.resampled.width = width;\n    }\n    if (height != null) {\n      this.resampled.height = height;\n    }\n    if (depth != null) {\n      this.resampled.depth = depth;\n    }\n\n    this.centered = {};\n    this.centered.items = this.props.centeredW;\n    this.centered.width = this.props.centeredX;\n    this.centered.height = this.props.centeredY;\n    this.centered.depth = this.props.centeredZ;\n\n    this.padding = {};\n    this.padding.items = this.props.paddingW;\n    this.padding.width = this.props.paddingX;\n    this.padding.height = this.props.paddingY;\n    this.padding.depth = this.props.paddingZ;\n\n    // Build shader to resample data\n    const operator = this._shaders.shader();\n    const indexer = this._shaders.shader();\n\n    // Uniforms\n    const uniforms = {\n      resampleFactor: this._attributes.make(this._types.vec4(0, 0, 0, 0)),\n      resampleBias: this._attributes.make(this._types.vec4(0, 0, 0, 0)),\n    };\n\n    this.resampleFactor = uniforms.resampleFactor;\n    this.resampleBias = uniforms.resampleBias;\n\n    // Has resize props?\n    const resize =\n      items != null || width != null || height != null || depth != null;\n\n    // Add padding\n    operator.pipe(\"resample.padding\", uniforms);\n\n    // Prepare centered sampling offset\n    const vec = [];\n    let any = false;\n    const iterable = [\"width\", \"height\", \"depth\", \"items\"];\n    for (i = 0; i < iterable.length; i++) {\n      key = iterable[i];\n      const centered = this.centered[key];\n      if (!any) {\n        any = centered;\n      }\n      vec[i] = centered ? \"0.5\" : \"0.0\";\n    }\n\n    let vec4;\n\n    // Add centered sampling offset (from source)\n    if (any && resize) {\n      vec4 = `vec4(${vec})`;\n      operator.pipe(UGLSL.binaryOperator(4, \"+\", vec4));\n      indexer.pipe(UGLSL.binaryOperator(4, \"+\", vec4));\n    }\n\n    // Addressing relative to target\n    if (resize) {\n      operator.pipe(\"resample.relative\", uniforms);\n      indexer.pipe(\"resample.relative\", uniforms);\n    } else {\n      operator.pipe(UGLSL.identity(\"vec4\"));\n      indexer.pipe(UGLSL.identity(\"vec4\"));\n    }\n\n    // Remove centered sampling offset (to target)\n    if (any && resize) {\n      operator.pipe(UGLSL.binaryOperator(4, \"-\", vec4));\n      indexer.pipe(UGLSL.binaryOperator(4, \"-\", vec4));\n    }\n\n    // Make sampler\n    let sampler = this.bind.source.sourceShader(this._shaders.shader());\n\n    // Iterate over dimensions (items, width, height, depth)\n    const iterable1 = [\"width\", \"height\", \"depth\", \"items\"];\n    for (i = 0; i < iterable1.length; i++) {\n      key = iterable1[i];\n      const id = `lerp.${key}`;\n\n      if (this.props[key] != null) {\n        sampler = this._shaders.shader().require(sampler);\n        sampler.pipe(id, uniforms);\n      }\n    }\n\n    // Combine operator and composite lerp sampler\n    operator.pipe(sampler);\n\n    this.operator = operator;\n    this.indexer = indexer;\n\n    return (this.relativeSize = relativeSize);\n  }\n\n  unmake() {\n    super.unmake();\n    return (this.operator = null);\n  }\n\n  resize() {\n    if (this.bind.source == null) {\n      return;\n    }\n\n    const dims = this.bind.source.getActiveDimensions();\n    const target = this.getActiveDimensions();\n\n    const axis = (key) => {\n      const centered = this.centered[key];\n      const pad = this.padding[key];\n\n      target[key] += pad * 2;\n\n      const res = centered\n        ? dims[key] / Math.max(1, target[key])\n        : Math.max(1, dims[key] - 1) / Math.max(1, target[key] - 1);\n      return [res, pad];\n    };\n\n    const [rw, bw] = Array.from(axis(\"width\"));\n    const [rh, bh] = Array.from(axis(\"height\"));\n    const [rd, bd] = Array.from(axis(\"depth\"));\n    const [ri, bi] = Array.from(axis(\"items\"));\n\n    this.resampleFactor.value.set(rw, rh, rd, ri);\n    this.resampleBias.value.set(bw, bh, bd, bi);\n\n    return super.resize();\n  }\n\n  change(changed, touched, _init) {\n    if (touched[\"operator\"] || touched[\"lerp\"] || touched[\"sampler\"]) {\n      return this.rebuild();\n    }\n  }\n}\nLerp.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Operator } from \"./operator\";\n\nexport class Memo extends Operator {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"bind\",\n      \"active\",\n      \"operator\",\n      \"source\",\n      \"index\",\n      \"texture\",\n      \"memo\",\n    ];\n  }\n\n  sourceShader(shader) {\n    return this.memo.shaderAbsolute(shader, 1);\n  }\n\n  make() {\n    super.make();\n    if (this.bind.source == null) {\n      return;\n    }\n\n    // Listen for updates\n    this._helpers.active.make();\n    this._listen(\"root\", \"root.update\", () => {\n      if (this.isActive) {\n        return this.update();\n      }\n    });\n\n    // Read sampling parameters\n    const { minFilter, magFilter, type } = this.props;\n\n    // Fetch geometry dimensions\n    const dims = this.bind.source.getDimensions();\n    const { items, width, height, depth } = dims;\n\n    // Prepare memoization RTT\n    this.memo = this._renderables.make(\"memo\", {\n      items,\n      width,\n      height,\n      depth,\n      minFilter,\n      magFilter,\n      type,\n    });\n\n    // Build shader to remap data (do it after RTT creation to allow feedback)\n    const operator = this._shaders.shader();\n    this.bind.source.sourceShader(operator);\n\n    // Make screen renderable inside RTT scene\n    this.compose = this._renderables.make(\"memoScreen\", {\n      map: operator,\n      items,\n      width,\n      height,\n      depth,\n    });\n    this.memo.adopt(this.compose);\n\n    this.objects = [this.compose];\n    return (this.renders = this.compose.renders);\n  }\n\n  unmake() {\n    super.unmake();\n\n    if (this.bind.source != null) {\n      this._helpers.active.unmake();\n\n      this.memo.unadopt(this.compose);\n      this.memo.dispose();\n\n      return (this.memo = this.compose = null);\n    }\n  }\n\n  update() {\n    return this.memo != null ? this.memo.render() : undefined;\n  }\n\n  resize() {\n    if (this.bind.source == null) {\n      return;\n    }\n\n    // Fetch geometry dimensions\n    const dims = this.bind.source.getActiveDimensions();\n    const { width, height, depth } = dims;\n\n    // Cover only part of the RTT viewport\n    this.compose.cover(width, height, depth);\n\n    return super.resize();\n  }\n\n  change(changed, touched, _init) {\n    if (touched[\"texture\"] || touched[\"operator\"]) {\n      return this.rebuild();\n    }\n  }\n}\nMemo.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Primitive } from \"../../primitive.js\";\n\nexport class Readback extends Primitive {\n  static initClass() {\n    this.traits = [\"node\", \"bind\", \"operator\", \"readback\", \"entity\", \"active\"];\n    this.finals = { channels: 4 };\n  }\n\n  init() {\n    this.emitter = this.root = null;\n    return (this.active = {});\n  }\n\n  make() {\n    super.make();\n\n    this._compute(\"readback.data\", () =>\n      this.readback != null ? this.readback.data : undefined\n    );\n    this._compute(\"readback.items\", () =>\n      this.readback != null ? this.readback.items : undefined\n    );\n    this._compute(\"readback.width\", () =>\n      this.readback != null ? this.readback.width : undefined\n    );\n    this._compute(\"readback.height\", () =>\n      this.readback != null ? this.readback.height : undefined\n    );\n    this._compute(\"readback.depth\", () =>\n      this.readback != null ? this.readback.depth : undefined\n    );\n\n    // Bind to attached objects\n    this._helpers.bind.make([{ to: \"operator.source\", trait: \"source\" }]);\n\n    if (this.bind.source == null) {\n      return;\n    }\n\n    // Sampler props\n    const { type, channels, expr } = this.props;\n\n    // Listen for updates\n    this.root = this._inherit(\"root\");\n    this._listen(\"root\", \"root.update\", this.update);\n\n    // Fetch source dimensions\n    const { items, width, height, depth } = this.bind.source.getDimensions();\n\n    // Build shader to sample source data\n    const sampler = this.bind.source.sourceShader(this._shaders.shader());\n\n    // Prepare readback/memo RTT\n    this.readback = this._renderables.make(\"readback\", {\n      map: sampler,\n      items,\n      width,\n      height,\n      depth,\n      channels,\n      type,\n    });\n\n    // Prepare readback consumer\n    if (expr != null) {\n      this.readback.setCallback(expr);\n    }\n\n    this._helpers.active.make();\n  }\n\n  unmake() {\n    if (this.readback != null) {\n      this.readback.dispose();\n      this.readback = null;\n\n      this.root = null;\n      this.emitter = null;\n      this.active = {};\n    }\n\n    this._helpers.active.unmake();\n    return this._helpers.bind.unmake();\n  }\n\n  update() {\n    if (this.readback == null) {\n      return;\n    }\n    if (this.isActive) {\n      this.readback.update(\n        this.root != null ? this.root.getCamera() : undefined\n      );\n      this.readback.post();\n      if (this.props.expr != null) {\n        this.readback.iterate();\n      }\n    }\n  }\n\n  resize() {\n    let sI, sJ;\n    if (this.readback == null) {\n      return;\n    }\n\n    // Fetch geometry/html dimensions\n    const { items, width, height, depth } =\n      this.bind.source.getActiveDimensions();\n\n    // Limit readback to active area\n    this.readback.setActive(items, width, height, depth);\n\n    // Recalculate iteration strides\n    this.strideI = sI = items;\n    this.strideJ = sJ = sI * width;\n    return (this.strideK = sJ * height);\n  }\n\n  change(changed, _touched, _init) {\n    if (changed[\"readback.type\"]) {\n      return this.rebuild();\n    }\n\n    if (changed[\"readback.expr\"] && this.readback) {\n      return this.readback.setCallback(this.props.expr);\n    }\n  }\n}\nReadback.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Operator } from \"./operator.js\";\n\nexport class Repeat extends Operator {\n  static initClass() {\n    this.traits = [\"node\", \"bind\", \"operator\", \"source\", \"index\", \"repeat\"];\n  }\n\n  indexShader(shader) {\n    shader.pipe(this.operator);\n    return super.indexShader(shader);\n  }\n\n  sourceShader(shader) {\n    shader.pipe(this.operator);\n    return super.sourceShader(shader);\n  }\n\n  getDimensions() {\n    return this._resample(this.bind.source.getDimensions());\n  }\n  getActiveDimensions() {\n    return this._resample(this.bind.source.getActiveDimensions());\n  }\n  getFutureDimensions() {\n    return this._resample(this.bind.source.getFutureDimensions());\n  }\n  getIndexDimensions() {\n    return this._resample(this.bind.source.getIndexDimensions());\n  }\n\n  _resample(dims) {\n    const r = this.resample;\n    return {\n      items: r.items * dims.items,\n      width: r.width * dims.width,\n      height: r.height * dims.height,\n      depth: r.depth * dims.depth,\n    };\n  }\n\n  make() {\n    super.make();\n    if (this.bind.source == null) {\n      return;\n    }\n\n    // Repeat multipliers\n    this.resample = {};\n\n    // Modulus on all 4 dimensions\n    const uniforms = {\n      repeatModulus: this._attributes.make(this._types.vec4()),\n    };\n    this.repeatModulus = uniforms.repeatModulus;\n\n    // Build shader to repeat along all dimensions\n    const transform = this._shaders.shader();\n    transform.pipe(\"repeat.position\", uniforms);\n    return (this.operator = transform);\n  }\n\n  unmake() {\n    return super.unmake();\n  }\n\n  resize() {\n    if (this.bind.source != null) {\n      const dims = this.bind.source.getActiveDimensions();\n      this.repeatModulus.value.set(\n        dims.width,\n        dims.height,\n        dims.depth,\n        dims.items\n      );\n    }\n\n    return super.resize();\n  }\n\n  change(changed, touched, init) {\n    if (touched[\"operator\"] || touched[\"repeat\"]) {\n      return this.rebuild();\n    }\n\n    if (init) {\n      return [\"items\", \"width\", \"height\", \"depth\"].map(\n        (key) => (this.resample[key] = this.props[key])\n      );\n    }\n  }\n}\nRepeat.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UGLSL from \"../../../util/glsl.js\";\nimport { Operator } from \"./operator.js\";\n\nexport class Swizzle extends Operator {\n  static initClass() {\n    this.traits = [\"node\", \"bind\", \"operator\", \"source\", \"index\", \"swizzle\"];\n  }\n\n  sourceShader(shader) {\n    shader = super.sourceShader(shader);\n    if (this.swizzler) {\n      shader.pipe(this.swizzler);\n    }\n    return shader;\n  }\n\n  make() {\n    super.make();\n    if (this.bind.source == null) {\n      return;\n    }\n\n    // Swizzling order\n    const { order } = this.props;\n    if (order.join() !== \"1234\") {\n      return (this.swizzler = UGLSL.swizzleVec4(order, 4));\n    }\n  }\n\n  unmake() {\n    super.unmake();\n    return (this.swizzler = null);\n  }\n\n  change(changed, touched, _init) {\n    if (touched[\"swizzle\"] || touched[\"operator\"]) {\n      return this.rebuild();\n    }\n  }\n}\nSwizzle.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Operator } from \"./operator.js\";\n\nexport class Spread extends Operator {\n  static initClass() {\n    this.traits = [\"node\", \"bind\", \"operator\", \"source\", \"index\", \"spread\"];\n  }\n\n  sourceShader(shader) {\n    return shader.pipe(this.operator);\n  }\n\n  make() {\n    super.make();\n    if (this.bind.source == null) {\n      return;\n    }\n\n    // Uniforms\n    const uniforms = {\n      spreadMatrix: this._attributes.make(this._types.mat4()),\n      spreadOffset: this._attributes.make(this._types.vec4()),\n    };\n\n    this.spreadMatrix = uniforms.spreadMatrix;\n    this.spreadOffset = uniforms.spreadOffset;\n\n    // Build shader to spread data on one dimension\n    const transform = this._shaders.shader();\n    transform.require(this.bind.source.sourceShader(this._shaders.shader()));\n    transform.pipe(\"spread.position\", uniforms);\n\n    return (this.operator = transform);\n  }\n\n  unmake() {\n    return super.unmake();\n  }\n\n  resize() {\n    this.update();\n    return super.resize();\n  }\n\n  update() {\n    // Size to fit to include future history\n    let key, i, k, v;\n    const dims = this.bind.source.getFutureDimensions();\n\n    const matrix = this.spreadMatrix.value;\n    const els = matrix.elements;\n\n    const order = [\"width\", \"height\", \"depth\", \"items\"];\n    const align = [\"alignWidth\", \"alignHeight\", \"alignDepth\", \"alignItems\"];\n\n    const { unit } = this.props;\n    const unitEnum = this.node.attributes[\"spread.unit\"].enum;\n\n    const map = (() => {\n      switch (unit) {\n        case unitEnum.relative:\n          return (key, i, k, v) =>\n            (els[i * 4 + k] = v / Math.max(1, dims[key] - 1));\n        case unitEnum.absolute:\n          return (key, i, k, v) => (els[i * 4 + k] = v);\n      }\n    })();\n\n    return (() => {\n      const result = [];\n      for (i = 0; i < order.length; i++) {\n        let offset;\n        key = order[i];\n        const spread = this.props[key];\n        const anchor = this.props[align[i]];\n\n        if (spread != null) {\n          const d = dims[key] != null ? dims[key] : 1;\n          offset = -(d - 1) * (0.5 - anchor * 0.5);\n        } else {\n          offset = 0;\n        }\n        this.spreadOffset.value.setComponent(i, offset);\n\n        result.push(\n          (() => {\n            const result1 = [];\n            for (k = 0; k <= 3; k++) {\n              let left;\n              v =\n                (left = spread != null ? spread.getComponent(k) : undefined) !=\n                null\n                  ? left\n                  : 0;\n              result1.push((els[i * 4 + k] = map(key, i, k, v)));\n            }\n            return result1;\n          })()\n        );\n      }\n      return result;\n    })();\n  }\n\n  change(changed, touched, _init) {\n    if (touched[\"operator\"]) {\n      return this.rebuild();\n    }\n\n    if (touched[\"spread\"]) {\n      return this.update();\n    }\n  }\n}\nSpread.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UGLSL from \"../../../util/glsl.js\";\nimport { Operator } from \"./operator.js\";\n\n/*\nsplit:\n  order:       Types.transpose('wxyz')\n  axis:        Types.axis()\n  length:      Types.int(1)\n  overlap:     Types.int(0)\n*/\n\nexport class Split extends Operator {\n  static initClass() {\n    this.traits = [\"node\", \"bind\", \"operator\", \"source\", \"index\", \"split\"];\n  }\n\n  indexShader(shader) {\n    shader.pipe(this.operator);\n    return super.indexShader(shader);\n  }\n\n  sourceShader(shader) {\n    shader.pipe(this.operator);\n    return super.sourceShader(shader);\n  }\n\n  getDimensions() {\n    return this._resample(this.bind.source.getDimensions());\n  }\n  getActiveDimensions() {\n    return this._resample(this.bind.source.getActiveDimensions());\n  }\n  getFutureDimensions() {\n    return this._resample(this.bind.source.getFutureDimensions());\n  }\n  getIndexDimensions() {\n    return this._resample(this.bind.source.getIndexDimensions());\n  }\n\n  _resample(dims) {\n    let dim;\n    const { order } = this;\n    const { axis } = this;\n    const { overlap } = this;\n    const { length } = this;\n    const { stride } = this;\n\n    const labels = [\"width\", \"height\", \"depth\", \"items\"];\n    const mapped = order.map((x) => labels[x - 1]);\n    const index = order.indexOf(axis);\n    let set = (() => {\n      const result = [];\n      for (dim of Array.from(mapped)) {\n        result.push(dims[dim]);\n      }\n      return result;\n    })();\n    const remain = Math.floor((set[index] - overlap) / stride);\n\n    set.splice(index, 1, length, remain);\n    set = set.slice(0, 4);\n\n    const out = {};\n    for (let i = 0; i < mapped.length; i++) {\n      dim = mapped[i];\n      out[dim] = set[i];\n    }\n\n    //console.log 'split', order, axis, length, stride\n    //console.log dims, out\n\n    return out;\n  }\n\n  make() {\n    let left;\n    super.make();\n    if (this.bind.source == null) {\n      return;\n    }\n\n    const { order } = this.props;\n    let { axis } = this.props;\n    let { overlap } = this.props;\n    const { length } = this.props;\n\n    /*\n    Calculate index transform\n\n    order: wxyz\n    length: 3\n    overlap: 1\n\n    axis: w\n    index: 0\n    split: wx\n    rest:  0yz0\n           s\n\n    axis: x\n    index: 1\n    split: xy\n    rest:  w0z0\n            s\n\n    axis: y\n    index: 2\n    split: yz\n    rest:  wx00\n             s\n\n    axis: z\n    index: 3\n    split: z0\n    rest: wxy0\n             s\n\n    */\n\n    const permute = order.join(\"\");\n    if (axis == null) {\n      axis = order[0];\n    }\n\n    const index = permute.indexOf(axis);\n    const split =\n      permute[index] + ((left = permute[index + 1]) != null ? left : 0);\n    const rest = permute.replace(split[1], \"\").replace(split[0], \"0\") + \"0\";\n\n    // Prepare uniforms\n    overlap = Math.min(length - 1, overlap);\n    const stride = length - overlap;\n\n    const uniforms = {\n      splitStride: this._attributes.make(this._types.number(stride)),\n    };\n\n    // Build shader to split a dimension into two\n    const transform = this._shaders.shader();\n    transform.require(UGLSL.swizzleVec4(split, 2));\n    transform.require(UGLSL.swizzleVec4(rest, 4));\n    transform.require(UGLSL.injectVec4(index));\n    transform.pipe(\"split.position\", uniforms);\n    transform.pipe(UGLSL.invertSwizzleVec4(order));\n\n    this.operator = transform;\n\n    this.order = order;\n    this.axis = axis;\n    this.overlap = overlap;\n    this.length = length;\n    return (this.stride = stride);\n  }\n\n  unmake() {\n    return super.unmake();\n  }\n\n  change(changed, touched, _init) {\n    if (\n      changed[\"split.axis\"] ||\n      changed[\"split.order\"] ||\n      touched[\"operator\"]\n    ) {\n      return this.rebuild();\n    }\n  }\n}\nSplit.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Operator } from \"./operator.js\";\n\nexport class Slice extends Operator {\n  static initClass() {\n    this.traits = [\"node\", \"bind\", \"operator\", \"source\", \"index\", \"slice\"];\n  }\n\n  getDimensions() {\n    return this._resample(this.bind.source.getDimensions());\n  }\n  getActiveDimensions() {\n    return this._resample(this.bind.source.getActiveDimensions());\n  }\n  getFutureDimensions() {\n    return this._resample(this.bind.source.getFutureDimensions());\n  }\n  getIndexDimensions() {\n    return this._resample(this.bind.source.getIndexDimensions());\n  }\n\n  sourceShader(shader) {\n    shader.pipe(\"slice.position\", this.uniforms);\n    return this.bind.source.sourceShader(shader);\n  }\n\n  _resolve(key, dims) {\n    const range = this.props[key];\n    const dim = dims[key];\n    if (range == null) {\n      return [0, dim];\n    }\n\n    const index = function (i, dim) {\n      if (i < 0) {\n        return dim + i;\n      } else {\n        return i;\n      }\n    };\n\n    const start = index(Math.round(range.x), dim);\n    let end = index(Math.round(range.y), dim);\n\n    end = Math.max(start, end);\n    return [start, end - start];\n  }\n\n  _resample(dims) {\n    dims.width = this._resolve(\"width\", dims)[1];\n    dims.height = this._resolve(\"height\", dims)[1];\n    dims.depth = this._resolve(\"depth\", dims)[1];\n    dims.items = this._resolve(\"items\", dims)[1];\n    return dims;\n  }\n\n  make() {\n    super.make();\n    if (this.bind.source == null) {\n      return;\n    }\n\n    return (this.uniforms = {\n      sliceOffset: this._attributes.make(this._types.vec4()),\n    });\n  }\n\n  unmake() {\n    return super.unmake();\n  }\n\n  resize() {\n    if (this.bind.source == null) {\n      return;\n    }\n\n    const dims = this.bind.source.getActiveDimensions();\n\n    this.uniforms.sliceOffset.value.set(\n      this._resolve(\"width\", dims)[0],\n      this._resolve(\"height\", dims)[0],\n      this._resolve(\"depth\", dims)[0],\n      this._resolve(\"items\", dims)[0]\n    );\n\n    return super.resize();\n  }\n\n  change(changed, touched, _init) {\n    if (touched[\"operator\"]) {\n      return this.rebuild();\n    }\n\n    if (touched[\"slice\"]) {\n      return this.resize();\n    }\n  }\n}\nSlice.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UGLSL from \"../../../util/glsl.js\";\nimport { Operator } from \"./operator.js\";\n\nexport class Subdivide extends Operator {\n  static initClass() {\n    this.traits = [\"node\", \"bind\", \"operator\", \"source\", \"index\", \"subdivide\"];\n  }\n\n  indexShader(shader) {\n    shader.pipe(this.indexer);\n    return super.indexShader(shader);\n  }\n\n  sourceShader(shader) {\n    return shader.pipe(this.operator);\n  }\n\n  getDimensions() {\n    return this._resample(this.bind.source.getDimensions());\n  }\n  getActiveDimensions() {\n    return this._resample(this.bind.source.getActiveDimensions());\n  }\n  getFutureDimensions() {\n    return this._resample(this.bind.source.getFutureDimensions());\n  }\n  getIndexDimensions() {\n    return this._resample(this.bind.source.getIndexDimensions());\n  }\n\n  _resample(dims) {\n    const r = this.resampled;\n\n    dims.items--;\n    dims.width--;\n    dims.height--;\n    dims.depth--;\n\n    if (r.items != null) {\n      dims.items *= r.items;\n    }\n    if (r.width != null) {\n      dims.width *= r.width;\n    }\n    if (r.height != null) {\n      dims.height *= r.height;\n    }\n    if (r.depth != null) {\n      dims.depth *= r.depth;\n    }\n\n    dims.items++;\n    dims.width++;\n    dims.height++;\n    dims.depth++;\n\n    return dims;\n  }\n\n  make() {\n    super.make();\n    if (this.bind.source == null) {\n      return;\n    }\n\n    // Get resampled dimensions\n    let { lerp } = this.props;\n    const { items, width, height, depth } = this.props;\n\n    this.resampled = {};\n    if (items != null) {\n      this.resampled.items = items;\n    }\n    if (width != null) {\n      this.resampled.width = width;\n    }\n    if (height != null) {\n      this.resampled.height = height;\n    }\n    if (depth != null) {\n      this.resampled.depth = depth;\n    }\n\n    // Build shader to resample data\n    const operator = this._shaders.shader();\n    const indexer = this._shaders.shader();\n\n    // Uniforms\n    const uniforms = {\n      resampleFactor: this._attributes.make(this._types.vec4(0, 0, 0, 0)),\n      subdivideBevel: this.node.attributes[\"subdivide.bevel\"],\n    };\n\n    this.resampleFactor = uniforms.resampleFactor;\n    this.resampleBias = uniforms.resampleBias;\n\n    // Has resize props?\n    const resize =\n      items != null || width != null || height != null || depth != null;\n\n    // Addressing relative to target\n    if (resize) {\n      operator.pipe(\"resample.relative\", uniforms);\n      indexer.pipe(\"resample.relative\", uniforms);\n    } else {\n      operator.pipe(UGLSL.identity(\"vec4\"));\n      indexer.pipe(UGLSL.identity(\"vec4\"));\n    }\n\n    // Make sampler\n    let sampler = this.bind.source.sourceShader(this._shaders.shader());\n    lerp = lerp ? \".lerp\" : \"\";\n\n    // Iterate over dimensions (items, width, height, depth)\n    const iterable = [\"width\", \"height\", \"depth\", \"items\"];\n    for (let i = 0; i < iterable.length; i++) {\n      const key = iterable[i];\n      const id = `subdivide.${key}${lerp}`;\n\n      if (this.props[key] != null) {\n        sampler = this._shaders.shader().require(sampler);\n        sampler.pipe(id, uniforms);\n      }\n    }\n\n    // Combine operator and composite lerp sampler\n    operator.pipe(sampler);\n\n    this.operator = operator;\n    return (this.indexer = indexer);\n  }\n\n  unmake() {\n    super.unmake();\n    return (this.operator = null);\n  }\n\n  resize() {\n    if (this.bind.source == null) {\n      return;\n    }\n\n    const dims = this.bind.source.getActiveDimensions();\n    const target = this.getActiveDimensions();\n\n    const axis = (key) =>\n      Math.max(1, dims[key] - 1) / Math.max(1, target[key] - 1);\n\n    const rw = axis(\"width\");\n    const rh = axis(\"height\");\n    const rd = axis(\"depth\");\n    const ri = axis(\"items\");\n\n    this.resampleFactor.value.set(rw, rh, rd, ri);\n\n    return super.resize();\n  }\n\n  change(changed, touched, _init) {\n    if (touched[\"operator\"] || touched[\"subdivide\"]) {\n      return this.rebuild();\n    }\n  }\n}\nSubdivide.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UGLSL from \"../../../util/glsl.js\";\nimport { Operator } from \"./operator.js\";\n\nconst labels = {\n  1: \"width\",\n  2: \"height\",\n  3: \"depth\",\n  4: \"items\",\n};\n\nexport class Transpose extends Operator {\n  static initClass() {\n    this.traits = [\"node\", \"bind\", \"operator\", \"source\", \"index\", \"transpose\"];\n  }\n\n  indexShader(shader) {\n    if (this.swizzler) {\n      shader.pipe(this.swizzler);\n    }\n    return super.indexShader(shader);\n  }\n\n  sourceShader(shader) {\n    if (this.swizzler) {\n      shader.pipe(this.swizzler);\n    }\n    return super.sourceShader(shader);\n  }\n\n  getDimensions() {\n    return this._remap(this.transpose, this.bind.source.getDimensions());\n  }\n  getActiveDimensions() {\n    return this._remap(this.transpose, this.bind.source.getActiveDimensions());\n  }\n  getFutureDimensions() {\n    return this._remap(this.transpose, this.bind.source.getFutureDimensions());\n  }\n  getIndexDimensions() {\n    return this._remap(this.transpose, this.bind.source.getIndexDimensions());\n  }\n\n  _remap(transpose, dims) {\n    // Map dimensions onto their new axis\n    const out = {};\n\n    for (let i = 0; i <= 3; i++) {\n      const dst = labels[i + 1];\n      const src = labels[transpose[i]];\n      out[dst] = dims[src] != null ? dims[src] : 1;\n    }\n\n    return out;\n  }\n\n  make() {\n    super.make();\n    if (this.bind.source == null) {\n      return;\n    }\n\n    // Transposition order\n    const { order } = this.props;\n    if (order.join() !== \"1234\") {\n      this.swizzler = UGLSL.invertSwizzleVec4(order);\n    }\n    this.transpose = order;\n\n    // Notify of reallocation\n    return this.trigger({\n      type: \"source.rebuild\",\n    });\n  }\n\n  unmake() {\n    super.unmake();\n    return (this.swizzler = null);\n  }\n\n  change(changed, touched, _init) {\n    if (touched[\"transpose\"] || touched[\"operator\"]) {\n      return this.rebuild();\n    }\n  }\n}\nTranspose.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Parent } from \"../base/parent.js\";\n\nexport class Transition extends Parent {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"transition\",\n      \"transform\",\n      \"mask\",\n      \"visible\",\n      \"active\",\n    ];\n  }\n\n  init() {\n    this.animate = null;\n    this.uniforms = null;\n\n    this.state = {\n      isVisible: true,\n      isActive: true,\n      enter: 1,\n      exit: 1,\n    };\n\n    this.latched = null;\n    return (this.locked = null);\n  }\n\n  make() {\n    this.uniforms = {\n      transitionFrom: this._attributes.make(this._types.vec4()),\n      transitionTo: this._attributes.make(this._types.vec4()),\n\n      transitionActive: this._attributes.make(this._types.bool()),\n      transitionScale: this._attributes.make(this._types.vec4()),\n      transitionBias: this._attributes.make(this._types.vec4()),\n      transitionEnter: this._attributes.make(this._types.number()),\n      transitionExit: this._attributes.make(this._types.number()),\n      transitionSkew: this._attributes.make(this._types.number()),\n    };\n\n    const slideParent = this._inherit(\"slide\");\n    const visibleParent = this._inherit(\"visible\");\n    const activeParent = this._inherit(\"active\");\n\n    this._listen(slideParent, \"transition.latch\", (e) => this.latch(e.step));\n    this._listen(slideParent, \"transition.release\", () => this.release());\n\n    this._listen(visibleParent, \"visible.change\", () => {\n      //console.log @node.toString(), 'visible.change ^', visibleParent.isVisible\n      return this.update((this.state.isVisible = visibleParent.isVisible));\n    });\n\n    this._listen(activeParent, \"active.change\", () => {\n      //console.log @node.toString(), 'active.change ^', activeParent.isActive\n      return this.update((this.state.isActive = activeParent.isActive));\n    });\n\n    this.animate = this._animator.make(this._types.vec2(1, 1), {\n      step: (value) => {\n        this.state.enter = value.x;\n        this.state.exit = value.y;\n        return this.update();\n      },\n      complete: (done) => this.complete(done),\n    });\n\n    return (this.move = this.props.from != null || this.props.to != null);\n  }\n\n  //@_helpers.visible.make()\n  //@_helpers.active.make()\n\n  unmake() {\n    return this.animate.dispose();\n  }\n\n  //@_helpers.visible.unmake()\n  //@_helpers.active.unmake()\n\n  latch(step) {\n    let latched;\n    this.locked = null;\n    this.latched = latched = {\n      isVisible: this.state.isVisible,\n      isActive: this.state.isActive,\n      step,\n    };\n\n    // Reset enter/exit animation if invisible\n    const visible = this.isVisible;\n    if (!visible) {\n      const forward = latched.step >= 0;\n      const [enter, exit] = Array.from(forward ? [0, 1] : [1, 0]);\n      return this.animate.set(enter, exit);\n    }\n  }\n\n  //console.log @node.toString(), 'transition::latch', @latched, enter, exit\n\n  release() {\n    // Get before/after and unlatch state\n    const { latched } = this;\n    const { state } = this;\n    this.latched = null;\n\n    //console.log @node.toString(), 'transition::release', JSON.parse JSON.stringify {latched, state}\n\n    //p = @; console.log '-> ', p.node.toString(), p.isVisible while p = p._inherit 'visible'\n\n    // Transition if visibility state change\n    if (latched.isVisible !== state.isVisible) {\n      // Maintain step direction\n      const forward = latched.step >= 0;\n      const visible = state.isVisible;\n      const [enter, exit] = Array.from(\n        visible ? [1, 1] : forward ? [1, 0] : [0, 1]\n      );\n\n      // Get duration\n      let { duration, durationEnter, durationExit } = this.props;\n      if (durationEnter == null) {\n        durationEnter = duration;\n      }\n      if (durationExit == null) {\n        durationExit = duration;\n      }\n      duration = visible * durationEnter + !visible * durationExit;\n\n      // Get delay\n      let { delay, delayEnter, delayExit } = this.props;\n      if (delayEnter == null) {\n        delayEnter = delay;\n      }\n      if (delayExit == null) {\n        delayExit = delay;\n      }\n      delay = visible * delayEnter + !visible * delayExit;\n\n      // Animate enter/exit\n      //console.log @node.toString(), '@animate.immediate', {x: enter, y: exit}, {duration, delay, ease: 'linear'}\n      this.animate.immediate(\n        { x: enter, y: exit },\n        { duration, delay, ease: \"linear\" }\n      );\n\n      // Lock visibility and active open during transition\n      this.locked = {\n        isVisible: true,\n        isActive: latched.isActive || state.isActive,\n      };\n    }\n\n    return this.update();\n  }\n\n  complete(done) {\n    if (!done) {\n      return;\n    }\n    this.locked = null;\n    return this.update();\n  }\n\n  update() {\n    if (this.latched != null) {\n      return;\n    } // latched\n\n    let { enter, exit } = this.props;\n\n    // Resolve transition state\n    if (enter == null) {\n      ({ enter } = this.state);\n    }\n    if (exit == null) {\n      ({ exit } = this.state);\n    }\n\n    const level = enter * exit;\n    let visible = level > 0;\n    const partial = level < 1;\n\n    this.uniforms.transitionEnter.value = enter;\n    this.uniforms.transitionExit.value = exit;\n    this.uniforms.transitionActive.value = partial;\n\n    // Resolve visibility state\n    if (visible) {\n      visible = !!this.state.isVisible;\n    }\n    if (this.locked != null) {\n      visible = this.locked.isVisible;\n    }\n\n    if (this.isVisible !== visible) {\n      this.isVisible = visible;\n      this.trigger({ type: \"visible.change\" });\n    }\n\n    // Resolve active state\n    const active = !!(\n      this.state.isActive ||\n      (this.locked != null ? this.locked.isActive : undefined)\n    );\n\n    if (this.isActive !== active) {\n      this.isActive = active;\n      return this.trigger({ type: \"active.change\" });\n    }\n  }\n\n  //console.log 'transition update', 'enter', enter, 'exit', exit, 'visible', visible, 'active', active\n\n  change(changed, touched, init) {\n    if (changed[\"transition.enter\"] || changed[\"transition.exit\"] || init) {\n      this.update();\n    }\n\n    if (changed[\"transition.stagger\"] || init) {\n      const { stagger } = this.props;\n\n      // Precompute shader constants\n\n      const flipX = stagger.x < 0;\n      const flipY = stagger.y < 0;\n      const flipZ = stagger.z < 0;\n      const flipW = stagger.w < 0;\n\n      const staggerX = Math.abs(stagger.x);\n      const staggerY = Math.abs(stagger.y);\n      const staggerZ = Math.abs(stagger.z);\n      const staggerW = Math.abs(stagger.w);\n\n      this.uniforms.transitionSkew.value =\n        staggerX + staggerY + staggerZ + staggerW;\n\n      this.uniforms.transitionScale.value.set(\n        (1 - flipX * 2) * staggerX,\n        (1 - flipY * 2) * staggerY,\n        (1 - flipZ * 2) * staggerZ,\n        (1 - flipW * 2) * staggerW\n      );\n\n      return this.uniforms.transitionBias.value.set(\n        flipX * staggerX,\n        flipY * staggerY,\n        flipZ * staggerZ,\n        flipW * staggerW\n      );\n    }\n  }\n}\nTransition.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining\n * DS104: Avoid inline assignments\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Transition } from \"./transition.js\";\n\nexport class Move extends Transition {\n  static initClass() {\n    this.traits = [\"node\", \"transition\", \"vertex\", \"move\", \"visible\", \"active\"];\n  }\n\n  make() {\n    super.make();\n\n    const object = {\n      moveFrom: this.node.attributes[\"move.from\"],\n      moveTo: this.node.attributes[\"move.to\"],\n    };\n    for (const k in object) {\n      const v = object[k];\n      this.uniforms[k] = v;\n    }\n  }\n\n  vertex(shader, pass) {\n    let left;\n    if (pass === this.props.pass) {\n      shader.pipe(\"move.position\", this.uniforms);\n    }\n    return (left = __guard__(this._inherit(\"vertex\"), (x) =>\n      x.vertex(shader, pass)\n    )) != null\n      ? left\n      : shader;\n  }\n}\nMove.initClass();\n\nfunction __guard__(value, transform) {\n  return typeof value !== \"undefined\" && value !== null\n    ? transform(value)\n    : undefined;\n}\n","export function clamp(x, a, b) {\n  return Math.max(a, Math.min(b, x));\n}\n\nexport function cosine(x) {\n  return 0.5 - 0.5 * Math.cos(clamp(x, 0, 1) * Math.PI);\n}\n\nexport function binary(x) {\n  return +(x >= 0.5);\n}\n\nexport function hold(x) {\n  return +(x >= 1);\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as Ease from \"../../../util/ease.js\";\nimport { Primitive } from \"../../primitive.js\";\n\nconst deepCopy = function (x) {\n  const out = {};\n  for (const k in x) {\n    const v = x[k];\n    if (v instanceof Array) {\n      out[k] = v.slice();\n    } else if (v != null && typeof v === \"object\") {\n      out[k] = deepCopy(v);\n    } else {\n      out[k] = v;\n    }\n  }\n\n  return out;\n};\n\nexport class Track extends Primitive {\n  static initClass() {\n    this.traits = [\"node\", \"track\", \"seek\", \"bind\"];\n  }\n\n  init() {\n    this.handlers = {};\n    this.script = null;\n    this.values = null;\n    this.playhead = 0;\n    this.velocity = null;\n    this.section = null;\n    return (this.expr = null);\n  }\n\n  make() {\n    // Bind to attached data sources\n    let ref;\n    this._helpers.bind.make([\n      { to: \"track.target\", trait: \"node\", callback: null },\n    ]);\n\n    const { script } = this.props;\n    const { node } = this.bind.target;\n\n    this.targetNode = node;\n    return (\n      ([this.script, this.values, this.start, this.end] = Array.from(\n        (ref = this._process(node, script))\n      )),\n      ref\n    );\n  }\n\n  unmake() {\n    this.unbindExpr();\n    this._helpers.bind.unmake();\n    this.script =\n      this.values =\n      this.start =\n      this.end =\n      this.section =\n      this.expr =\n        null;\n    return (this.playhead = 0);\n  }\n\n  // Bind animated expressions\n  bindExpr(expr) {\n    this.unbindExpr();\n    this.expr = expr;\n    this.targetNode.bind(expr, true);\n\n    // Measure playhead velocity on attribute computation\n    const { clock } = this.targetNode;\n    const self = this;\n    return this._attributes.bind(\n      (this.measure = (function () {\n        let playhead = null;\n        return () => {\n          const { step } = clock.getTime();\n          if (playhead != null) {\n            self.velocity = (self.playhead - playhead) / step;\n          }\n          return (playhead = self.playhead);\n        };\n      })())\n    );\n  }\n\n  unbindExpr() {\n    if (this.expr != null) {\n      this.targetNode.unbind(this.expr, true);\n    }\n    if (this.measure != null) {\n      this._attributes.unbind(this.measure);\n    }\n    return (this.expr = this.measure = null);\n  }\n\n  // Process script steps by filling out missing props\n  _process(object, script) {\n    let k, key, last, message, s, step, v;\n    if (script instanceof Array) {\n      // Normalize array to numbered dict\n      s = {};\n      for (let i = 0; i < script.length; i++) {\n        step = script[i];\n        s[i] = step;\n      }\n      script = s;\n    }\n\n    // Normalize keyed steps to array of step objects\n    s = [];\n    for (key in script) {\n      step = script[key];\n      if (step == null) {\n        step = [];\n      }\n\n      if (step instanceof Array) {\n        // [props, expr] array\n        step = {\n          key: +key,\n          props: step[0] != null ? deepCopy(step[0]) : {},\n          expr: step[1] != null ? deepCopy(step[1]) : {},\n        };\n      } else {\n        if (step.key == null && !step.props && !step.expr) {\n          // Direct props object (iffy, but people will do this anyhow)\n          step = { props: deepCopy(step) };\n        } else {\n          // Proper step\n          step = deepCopy(step);\n        }\n\n        // Prepare step object\n        step.key = step.key != null ? +step.key : +key;\n        if (step.props == null) {\n          step.props = {};\n        }\n        if (step.expr == null) {\n          step.expr = {};\n        }\n      }\n\n      s.push(step);\n    }\n    script = s;\n\n    if (!script.length) {\n      return [[], {}, 0, 0];\n    }\n\n    // Sort by keys\n    script.sort((a, b) => a.key - b.key);\n    const start = script[0].key;\n    const end = script[script.length - 1].key;\n\n    // Connect steps\n    for (key in script) {\n      step = script[key];\n      if (last != null) {\n        last.next = step;\n      }\n      last = step;\n    }\n\n    // Last step leads to itself\n    last.next = last;\n    script = s;\n\n    // Determine starting props\n    const props = {};\n    const values = {};\n    for (key in script) {\n      step = script[key];\n      for (k in step.props) {\n        v = step.props[k];\n        props[k] = true;\n      }\n    }\n    for (key in script) {\n      step = script[key];\n      for (k in step.expr) {\n        v = step.expr[k];\n        props[k] = true;\n      }\n    }\n    for (k in props) {\n      props[k] = object.get(k);\n    }\n    try {\n      // Need two sources and one destination value for correct mixing of live expressions\n      for (k in props) {\n        values[k] = [\n          object.attribute(k).T.make(),\n          object.attribute(k).T.make(),\n          object.attribute(k).T.make(),\n        ];\n      }\n    } catch (error) {\n      console.warn(this.node.toMarkup());\n      message = `${this.node.toString()} - Target ${object} has no \\`${k}\\` property`;\n      throw new Error(message);\n    }\n\n    const result = [];\n\n    // Normalize script props, insert held values\n    for (step of Array.from(script)) {\n      for (k in props) {\n        v = props[k];\n        v = object.validate(k, step.props[k] != null ? step.props[k] : v);\n        props[k] = step.props[k] = v;\n\n        if (step.expr[k] != null && typeof step.expr[k] !== \"function\") {\n          console.warn(this.node.toMarkup());\n          message = `${this.node.toString()} - Expression \\`${\n            step.expr[k]\n          }\\` on property \\`${k}\\` is not a function`;\n          throw new Error(message);\n        }\n      }\n      result.push(step);\n    }\n\n    return [result, values, start, end];\n  }\n\n  update() {\n    let { playhead } = this;\n    const { script } = this;\n    const { ease, seek } = this.props;\n    const node = this.targetNode;\n\n    if (seek != null) {\n      playhead = seek;\n    }\n\n    if (script.length) {\n      let k;\n      const find = function () {\n        let last = script[0];\n        for (let i = 0; i < script.length; i++) {\n          const step = script[i];\n          if (step.key > playhead) {\n            break;\n          }\n          last = step;\n        }\n        return last;\n      };\n\n      let { section } = this;\n      if (!section || playhead < section.key || playhead > section.next.key) {\n        section = find(script, playhead);\n      }\n\n      if (section === this.section) {\n        return;\n      }\n      this.section = section;\n\n      const from = section;\n      const to = section.next;\n      const start = from.key;\n      const end = to.key;\n\n      // Easing of playhead along track\n      const easeMethod = (() => {\n        switch (ease) {\n          case \"linear\":\n          case 0:\n            return Ease.clamp;\n          case \"cosine\":\n          case 1:\n            return Ease.cosine;\n          case \"binary\":\n          case 2:\n            return Ease.binary;\n          case \"hold\":\n          case 3:\n            return Ease.hold;\n          default:\n            return Ease.cosine;\n        }\n      })();\n\n      // Callback for live playhead interpolator (linear approx time travel)\n      const { clock } = node;\n      const getPlayhead = (time) => {\n        if (this.velocity == null) {\n          return this.playhead;\n        }\n        const now = clock.getTime();\n        return this.playhead + this.velocity * (time - now.time);\n      };\n\n      const getLerpFactor = (function () {\n        const scale = 1 / Math.max(0.0001, end - start);\n        return (time) => easeMethod((getPlayhead(time) - start) * scale, 0, 1);\n      })();\n\n      // Create prop expression interpolator\n      const live = (key) => {\n        const fromE = from.expr[key];\n        const toE = to.expr[key];\n        const fromP = from.props[key];\n        const toP = to.props[key];\n\n        const invalid = function () {\n          console.warn(node.toMarkup());\n          throw new Error(\n            `${this.node.toString()} - Invalid expression result on track \\`${key}\\``\n          );\n        };\n\n        const attr = node.attribute(key);\n        const values = this.values[key];\n        const animator = this._animator;\n\n        // Lerp between two expressions\n        if (fromE && toE) {\n          return ((values, _from, _to) =>\n            function (time, delta) {\n              let _from, _to;\n              values[0] = _from = attr.T.validate(\n                fromE(time, delta),\n                values[0],\n                invalid\n              );\n              values[1] = _to = attr.T.validate(\n                toE(time, delta),\n                values[1],\n                invalid\n              );\n              return (values[2] = animator.lerp(\n                attr.T,\n                _from,\n                _to,\n                getLerpFactor(time),\n                values[2]\n              ));\n            })(values, from, to);\n\n          // Lerp between an expression and a constant\n        } else if (fromE) {\n          return ((values, _from, _to) =>\n            function (time, delta) {\n              let _from;\n              values[0] = _from = attr.T.validate(\n                fromE(time, delta),\n                values[0],\n                invalid\n              );\n              return (values[1] = animator.lerp(\n                attr.T,\n                _from,\n                toP,\n                getLerpFactor(time),\n                values[1]\n              ));\n            })(values, from, to);\n\n          // Lerp between a constant and an expression\n        } else if (toE) {\n          return ((values, _from, _to) =>\n            function (time, delta) {\n              let _to;\n              values[0] = _to = attr.T.validate(\n                toE(time, delta),\n                values[0],\n                invalid\n              );\n              return (values[1] = animator.lerp(\n                attr.T,\n                fromP,\n                _to,\n                getLerpFactor(time),\n                values[1]\n              ));\n            })(values, from, to);\n\n          // Lerp between two constants\n        } else {\n          return (\n            (values, _from, _to) => (time, _delta) =>\n              (values[0] = animator.lerp(\n                attr.T,\n                fromP,\n                toP,\n                getLerpFactor(time),\n                values[0]\n              ))\n          )(values, from, to);\n        }\n      };\n\n      // Handle expr / props on both ends\n      const expr = {};\n      for (k in from.expr) {\n        if (expr[k] == null) {\n          expr[k] = live(k);\n        }\n      }\n      for (k in to.expr) {\n        if (expr[k] == null) {\n          expr[k] = live(k);\n        }\n      }\n      for (k in from.props) {\n        if (expr[k] == null) {\n          expr[k] = live(k);\n        }\n      }\n      for (k in to.props) {\n        if (expr[k] == null) {\n          expr[k] = live(k);\n        }\n      }\n\n      // Bind node props\n      return this.bindExpr(expr);\n    }\n  }\n\n  change(changed, touched, init) {\n    if (\n      changed[\"track.target\"] ||\n      changed[\"track.script\"] ||\n      changed[\"track.mode\"]\n    ) {\n      return this.rebuild();\n    }\n\n    if (changed[\"seek.seek\"] || init) {\n      return this.update();\n    }\n  }\n}\nTrack.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Track } from \"./track.js\";\n\nexport class Play extends Track {\n  static initClass() {\n    this.traits = [\"node\", \"track\", \"trigger\", \"play\", \"bind\"];\n  }\n\n  init() {\n    super.init();\n    this.skew = null;\n    return (this.start = null);\n  }\n\n  reset(go) {\n    if (go == null) {\n      go = true;\n    }\n    this.skew = go ? 0 : null;\n    return (this.start = null);\n  }\n\n  make() {\n    super.make();\n\n    // Start on slide, or immediately if not inside slide\n    this._listen(\"slide\", \"slide.step\", (e) => {\n      const { trigger } = this.props;\n      if (trigger != null && e.index === trigger) {\n        return this.reset();\n      }\n      if (trigger != null && e.index === 0) {\n        return this.reset(false);\n      }\n    });\n    if (!this.props.trigger || this._inherit(\"slide\") == null) {\n      this.reset();\n    }\n\n    // Find parent clock\n    const parentClock = this._inherit(\"clock\");\n\n    // Update clock\n    return this._listen(parentClock, \"clock.tick\", () => {\n      const { from, to, speed, pace, delay, realtime } = this.props;\n\n      const time = parentClock.getTime();\n      if (this.skew != null) {\n        const now = realtime ? time.time : time.clock;\n        const delta = realtime ? time.delta : time.step;\n        const ratio = speed / pace;\n\n        if (this.start == null) {\n          this.start = now;\n        }\n        this.skew += delta * (ratio - 1);\n\n        let offset = Math.max(0, now - this.start + this.skew - delay * ratio);\n        if (this.props.loop) {\n          offset = offset % (to - from);\n        }\n\n        this.playhead = Math.min(to, from + offset);\n      } else {\n        this.playhead = 0;\n      }\n\n      return this.update();\n    });\n  }\n\n  update() {\n    return super.update();\n  }\n\n  change(changed, touched, init) {\n    if (changed[\"trigger.trigger\"] || changed[\"play.realtime\"]) {\n      return this.rebuild();\n    }\n    return super.change(changed, touched, init);\n  }\n}\nPlay.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS202: Simplify dynamic range loops\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Parent } from \"../base/parent.js\";\n\nexport class Present extends Parent {\n  static initClass() {\n    this.traits = [\"node\", \"present\"];\n  }\n\n  init() {}\n\n  make() {\n    this.nodes = [];\n    this.steps = [];\n    this.length = 0;\n    this.last = [];\n    this.index = 0;\n    this.dirty = [];\n\n    this._listen(\"root\", \"root.update\", this.update);\n    return this._compute(\"present.length\", () => this.length);\n  }\n\n  adopt(controller) {\n    const { node } = controller;\n    if (this.nodes.indexOf(controller) < 0) {\n      this.nodes.push(node);\n    }\n    return this.dirty.push(controller);\n  }\n\n  unadopt(controller) {\n    this.nodes = this.nodes.filter((x) => x !== controller);\n    return this.dirty.push(controller);\n  }\n\n  update() {\n    if (!this.dirty.length) {\n      return;\n    }\n\n    for (const controller of Array.from(this.dirty)) {\n      this.slideReset(controller);\n    }\n\n    [this.steps, this.indices] = Array.from(this.process(this.nodes));\n\n    this.length = this.steps.length;\n    this.index = null;\n    this.go(this.props.index);\n\n    return (this.dirty = []);\n  }\n\n  slideLatch(controller, enabled, step) {\n    return controller.slideLatch(enabled, step);\n  }\n  slideStep(controller, index, step) {\n    return controller.slideStep(this.mapIndex(controller, index), step);\n  }\n  slideRelease(controller, _step) {\n    return controller.slideRelease();\n  }\n  slideReset(controller) {\n    return controller.slideReset();\n  }\n\n  mapIndex(controller, index) {\n    return index - this.indices[controller.node._id];\n  }\n\n  process(nodes) {\n    // Grab nodes' path of slide parents\n    const slides = (nodes) =>\n      Array.from(nodes).map((el) => parents(el).filter(isSlide));\n    const traverse = (map) => (el) =>\n      (() => {\n        let ref, ref1;\n        const result = [];\n        while (el && (([el, ref] = Array.from((ref1 = [map(el), el]))), ref1)) {\n          result.push(ref);\n        }\n        return result;\n      })();\n\n    const parents = traverse(function (el) {\n      if (el.parent.traits.hash.present) {\n        return null;\n      } else {\n        return el.parent;\n      }\n    });\n\n    // Helpers\n    const isSlide = (el) => nodes.indexOf(el) >= 0;\n\n    // Order paths (leaf -> parent slide -> ...)\n    const order = (paths) =>\n      paths.sort(function (a, b) {\n        // Path lengths\n        const c = a.length;\n        const d = b.length;\n\n        // Compare from outside in\n        let e = Math.min(c, d);\n        for (\n          let i = 1, end = e, asc = 1 <= end;\n          asc ? i <= end : i >= end;\n          asc ? i++ : i--\n        ) {\n          // inclusive end\n          const nodeA = a[c - i];\n          const nodeB = b[d - i];\n\n          // Explicit sibling order (natural)\n          const f = nodeA.props.order;\n          const g = nodeB.props.order;\n          if (f != null || g != null) {\n            if (f != null && g != null && (e = f - g) !== 0) {\n              return e;\n            }\n            if (f != null) {\n              return -1;\n            }\n            if (g != null) {\n              return 1;\n            }\n          }\n\n          // Document sibling order (inverted)\n          if (nodeB.order !== nodeA.order) {\n            return nodeB.order - nodeA.order;\n          }\n        }\n\n        // Different tree level\n        e = c - d;\n        if (e !== 0) {\n          return e;\n        }\n\n        // Equal\n        return 0;\n      });\n\n    const split = function (steps) {\n      const relative = [];\n      const absolute = [];\n      for (const step of Array.from(steps)) {\n        (step[0].props.steps != null ? relative : absolute).push(step);\n      }\n      return [relative, absolute];\n    };\n\n    const expand = function (lists) {\n      let step;\n      const [relative, absolute] = Array.from(lists);\n\n      const limit = 100;\n\n      const indices = {};\n      let steps = [];\n      const slide = function (step, index) {\n        let node;\n        const { props } = (node = step[0]);\n        const parent = step[1];\n\n        const parentIndex = parent != null ? indices[parent._id] : 0;\n        //throw \"parent index missing\" if !parentIndex?\n        const childIndex = index;\n\n        let from =\n          props.from != null\n            ? parentIndex + props.from\n            : childIndex - props.early;\n        let to =\n          props.to != null\n            ? parentIndex + props.to\n            : childIndex + props.steps + props.late;\n\n        from = Math.max(0, from);\n        to = Math.min(limit, to);\n\n        if (indices[node._id] == null) {\n          indices[node._id] = from;\n        }\n        for (\n          let i = from, end = to, asc = from <= end;\n          asc ? i < end : i > end;\n          asc ? i++ : i--\n        ) {\n          steps[i] = (steps[i] != null ? steps[i] : (steps[i] = [])).concat(\n            step\n          );\n        }\n\n        return props.steps;\n      };\n\n      let i = 0;\n      for (step of Array.from(relative)) {\n        i += slide(step, i);\n      }\n      for (step of Array.from(absolute)) {\n        slide(step, 0);\n      }\n\n      // Dedupe and order\n      steps = (() => {\n        const result = [];\n        for (step of Array.from(steps)) {\n          result.push(finalize(dedupe(step)));\n        }\n        return result;\n      })();\n\n      return [steps, indices];\n    };\n\n    // Remove duplicates\n    const dedupe = function (step) {\n      if (step) {\n        return (() => {\n          const result = [];\n          for (let i = 0; i < step.length; i++) {\n            const node = step[i];\n            if (step.indexOf(node) === i) {\n              result.push(node);\n            }\n          }\n          return result;\n        })();\n      } else {\n        return [];\n      }\n    };\n\n    // Finalize individual step by document order\n    const finalize = (step) => step.sort((a, b) => a.order - b.order);\n\n    const paths = slides(nodes);\n    const steps = order(paths);\n    return expand(split(steps));\n  }\n\n  go(index) {\n    // Pad with an empty slide before and after for initial enter/final exit\n    let left;\n    let node;\n    index = Math.max(0, Math.min(this.length + 1, +index || 0));\n\n    const active = (left = this.steps[index - 1]) != null ? left : [];\n    const step = this.props.directed ? index - this.index : 1;\n    this.index = index;\n\n    const enter = (() => {\n      const result = [];\n      for (node of Array.from(active)) {\n        if (this.last.indexOf(node) < 0) {\n          result.push(node);\n        }\n      }\n      return result;\n    })();\n    const exit = (() => {\n      const result1 = [];\n      for (node of Array.from(this.last)) {\n        if (active.indexOf(node) < 0) {\n          result1.push(node);\n        }\n      }\n      return result1;\n    })();\n    const stay = (() => {\n      const result2 = [];\n      for (node of Array.from(active)) {\n        if (enter.indexOf(node) < 0 && exit.indexOf(node) < 0) {\n          result2.push(node);\n        }\n      }\n      return result2;\n    })();\n\n    const ascend = (nodes) => nodes.sort((a, b) => a.order - b.order);\n    const descend = (nodes) => nodes.sort((a, b) => b.order - a.order);\n\n    //const toStr = (x) => x.toString();\n    //console.log '============================================================'\n    //console.log 'go',  index, {enter: enter.map(toStr), stay: stay.map(toStr), exit: exit.map(toStr)}\n\n    for (node of Array.from(ascend(enter))) {\n      this.slideLatch(node.controller, true, step);\n    }\n    for (node of Array.from(ascend(stay))) {\n      this.slideLatch(node.controller, null, step);\n    }\n    for (node of Array.from(ascend(exit))) {\n      this.slideLatch(node.controller, false, step);\n    }\n\n    for (node of Array.from(enter)) {\n      this.slideStep(node.controller, index, step);\n    }\n    for (node of Array.from(stay)) {\n      this.slideStep(node.controller, index, step);\n    }\n    for (node of Array.from(exit)) {\n      this.slideStep(node.controller, index, step);\n    }\n\n    for (node of Array.from(descend(enter))) {\n      this.slideRelease(node.controller);\n    }\n    for (node of Array.from(descend(stay))) {\n      this.slideRelease(node.controller);\n    }\n    for (node of Array.from(descend(exit))) {\n      this.slideRelease(node.controller);\n    }\n\n    this.last = active;\n  }\n\n  change(changed, touched, init) {\n    if (changed[\"present.index\"] || init) {\n      return this.go(this.props.index);\n    }\n  }\n}\nPresent.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining\n * DS104: Avoid inline assignments\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UGLSL from \"../../../util/glsl.js\";\nimport { Transition } from \"./transition.js\";\n\nexport class Reveal extends Transition {\n  static initClass() {\n    this.traits = [\"node\", \"transition\", \"mask\", \"visible\", \"active\"];\n  }\n\n  mask(shader) {\n    let left, s;\n    if (shader) {\n      s = this._shaders.shader();\n      s.pipe(UGLSL.identity(\"vec4\"));\n      s.fan();\n      s.pipe(shader, this.uniforms);\n      s.next();\n      s.pipe(\"reveal.mask\", this.uniforms);\n      s.end();\n      s.pipe(\"float combine(float a, float b) { return min(a, b); }\");\n    } else {\n      s = this._shaders.shader();\n      s.pipe(\"reveal.mask\", this.uniforms);\n    }\n\n    return (left = __guard__(this._inherit(\"mask\"), (x) => x.mask(s))) != null\n      ? left\n      : s;\n  }\n}\nReveal.initClass();\n\nfunction __guard__(value, transform) {\n  return typeof value !== \"undefined\" && value !== null\n    ? transform(value)\n    : undefined;\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Parent } from \"../base/parent.js\";\n\nexport class Slide extends Parent {\n  static initClass() {\n    this.traits = [\"node\", \"slide\", \"visible\", \"active\"];\n  }\n\n  make() {\n    this._helpers.visible.make();\n    this._helpers.active.make();\n\n    if (!this._inherit(\"present\")) {\n      throw new Error(\n        `${this.node.toString()} must be placed inside <present></present>`\n      );\n    }\n\n    return this._inherit(\"present\").adopt(this);\n  }\n\n  unmake() {\n    this._helpers.visible.unmake();\n    this._helpers.active.unmake();\n\n    return this._inherit(\"present\").unadopt(this);\n  }\n\n  change(changed, _touched, _init) {\n    if (\n      changed[\"slide.early\"] ||\n      changed[\"slide.late\"] ||\n      changed[\"slide.steps\"] ||\n      changed[\"slide.from\"] ||\n      changed[\"slide.to\"]\n    ) {\n      return this.rebuild();\n    }\n  }\n\n  slideLatch(enabled, step) {\n    //console.log 'slide:latch', @node.toString(), enabled, step\n    this.trigger({\n      type: \"transition.latch\",\n      step: step,\n    });\n\n    if (enabled != null) {\n      return this._instant(enabled);\n    }\n  }\n\n  slideStep(index, step) {\n    //console.log 'slide:step', @node.toString(), index, step\n    return this.trigger({\n      type: \"slide.step\",\n      index: index,\n      step: step,\n    });\n  }\n\n  slideRelease() {\n    //console.log 'slide:release', @node.toString()\n    return this.trigger({\n      type: \"transition.release\",\n    });\n  }\n\n  slideReset() {\n    this._instant(false);\n    return this.trigger({\n      type: \"slide.reset\",\n    });\n  }\n\n  _instant(enabled) {\n    //console.log 'slide:instant', @node.toString(), enabled\n    this.setVisible(enabled);\n    return this.setActive(enabled);\n  }\n}\nSlide.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Track } from \"./track.js\";\n\nexport class Step extends Track {\n  static initClass() {\n    this.traits = [\"node\", \"track\", \"step\", \"trigger\", \"bind\"];\n  }\n\n  make() {\n    super.make();\n\n    const clock = this._inherit(\"clock\");\n\n    if (this.actualIndex == null) {\n      this.actualIndex = null;\n    }\n    this.animateIndex = this._animator.make(this._types.number(0), {\n      clock,\n      realtime: this.props.realtime,\n      step: (value) => {\n        return (this.actualIndex = value);\n      },\n    });\n\n    if (this.lastIndex == null) {\n      this.lastIndex = null;\n    }\n    this.animateStep = this._animator.make(this._types.number(0), {\n      clock,\n      realtime: this.props.realtime,\n      step: (value) => {\n        this.playhead = value;\n        return this.update();\n      },\n    });\n\n    this.stops =\n      this.props.stops != null\n        ? this.props.stops\n        : __range__(0, this.script.length, false);\n\n    // Seek instantly after reset\n    this._listen(\"slide\", \"slide.reset\", (_e) => {\n      return (this.lastIndex = null);\n    });\n\n    // Update playhead in response to slide change\n    return this._listen(\"slide\", \"slide.step\", (e) => {\n      let left;\n      let { duration } = this.props;\n      const { delay, pace, speed, playback, rewind, skip, trigger } =\n        this.props;\n\n      // Note: enter phase is from index 0 to 1\n      const i = Math.max(0, Math.min(this.stops.length - 1, e.index - trigger));\n\n      // Animation range\n      const from = this.playhead;\n      const to = this.stops[i];\n\n      // Seek if first step after reset\n      if (this.lastIndex == null && trigger) {\n        this.lastIndex = i;\n        this.animateStep.set(to);\n        this.animateIndex.set(i);\n        return;\n      }\n\n      // Calculate actual step from current offset (may be still animating)\n      let last =\n        (left = this.actualIndex != null ? this.actualIndex : this.lastIndex) !=\n        null\n          ? left\n          : 0;\n      const step = i - last;\n\n      // Don't count duped stops\n      const skips = this.stops.slice(Math.min(last, i), Math.max(last, i));\n      let free = 0;\n      last = skips.shift();\n      for (const stop of Array.from(skips)) {\n        if (last === stop) {\n          free++;\n        }\n        last = stop;\n      }\n\n      // Remember last intended stop\n      this.lastIndex = i;\n\n      // Apply rewind factor\n      let factor = speed * (e.step >= 0 ? 1 : rewind);\n\n      // Pass through multiple steps at faster rate if skip is enabled\n      factor *= skip ? Math.max(1, Math.abs(step) - free) : 1;\n\n      // Apply pace\n      duration += (Math.abs(to - from) * pace) / factor;\n\n      if (from !== to) {\n        this.animateIndex.immediate(i, { delay, duration, ease: playback });\n        return this.animateStep.immediate(to, {\n          delay,\n          duration,\n          ease: playback,\n        });\n      }\n    });\n  }\n\n  made() {\n    return this.update();\n  }\n\n  unmake() {\n    this.animateIndex.dispose();\n    this.animateStep.dispose();\n    this.animateIndex = this.animateStep = null;\n\n    return super.unmake();\n  }\n\n  change(changed, touched, init) {\n    if (changed[\"step.stops\"] || changed[\"step.realtime\"]) {\n      return this.rebuild();\n    }\n    return super.change(changed, touched, init);\n  }\n}\nStep.initClass();\n\nfunction __range__(left, right, inclusive) {\n  const range = [];\n  const ascending = left < right;\n  const end = !inclusive ? right : ascending ? right + 1 : right - 1;\n  for (let i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {\n    range.push(i);\n  }\n  return range;\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining\n * DS104: Avoid inline assignments\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Parent } from \"../base/parent.js\";\n\nexport class RTT extends Parent {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"root\",\n      \"scene\",\n      \"vertex\",\n      \"texture\",\n      \"rtt\",\n      \"source\",\n      \"index\",\n      \"image\",\n    ];\n    this.defaults = {\n      minFilter: \"linear\",\n      magFilter: \"linear\",\n      type: \"unsignedByte\",\n    };\n  }\n\n  init() {\n    return (this.rtt =\n      this.scene =\n      this.camera =\n      this.width =\n      this.height =\n      this.history =\n      this.rootSize =\n      this.size =\n        null);\n  }\n\n  indexShader(shader) {\n    return shader;\n  }\n  imageShader(shader) {\n    return this.rtt.shaderRelative(shader);\n  }\n  sourceShader(shader) {\n    return this.rtt.shaderAbsolute(shader, this.history);\n  }\n\n  getDimensions() {\n    return {\n      items: 1,\n      width: this.width,\n      height: this.height,\n      depth: this.history,\n    };\n  }\n\n  getActiveDimensions() {\n    return this.getDimensions();\n  }\n\n  make() {\n    let aspect;\n    this.parentRoot = this._inherit(\"root\");\n    this.rootSize = this.parentRoot.getSize();\n\n    this._listen(this.parentRoot, \"root.pre\", this.pre);\n    this._listen(this.parentRoot, \"root.update\", this.update);\n    this._listen(this.parentRoot, \"root.render\", this.render);\n    this._listen(this.parentRoot, \"root.post\", this.post);\n    this._listen(this.parentRoot, \"root.camera\", this.setCamera);\n    this._listen(this.parentRoot, \"root.resize\", function (event) {\n      return this.resize(event.size);\n    });\n\n    if (this.rootSize == null) {\n      return;\n    }\n\n    const { minFilter, magFilter, type } = this.props;\n\n    const { width, height, history, size } = this.props;\n\n    const relativeSize =\n      size === this.node.attributes[\"rtt.size\"].enum.relative;\n    const widthFactor = relativeSize ? this.rootSize.renderWidth : 1;\n    const heightFactor = relativeSize ? this.rootSize.renderHeight : 1;\n\n    this.width = Math.round(\n      width != null ? width * widthFactor : this.rootSize.renderWidth\n    );\n    this.height = Math.round(\n      height != null ? height * heightFactor : this.rootSize.renderHeight\n    );\n    this.history = history;\n    this.aspect = aspect = this.width / this.height;\n\n    if (this.scene == null) {\n      this.scene = this._renderables.make(\"scene\");\n    }\n    this.rtt = this._renderables.make(\"renderToTexture\", {\n      scene: this.scene,\n      camera: this._context.defaultCamera,\n      width: this.width,\n      height: this.height,\n      frames: this.history,\n      minFilter,\n      magFilter,\n      type,\n    });\n\n    aspect = width || height ? aspect : this.rootSize.aspect;\n    const viewWidth = width != null ? width : this.rootSize.viewWidth;\n    const viewHeight = height != null ? height : this.rootSize.viewHeight;\n\n    return (this.size = {\n      renderWidth: this.width,\n      renderHeight: this.height,\n      aspect,\n      viewWidth,\n      viewHeight,\n      pixelRatio: this.height / viewHeight,\n    });\n  }\n\n  made() {\n    // Notify of buffer reallocation\n    this.trigger({\n      type: \"source.rebuild\",\n    });\n\n    if (this.size) {\n      return this.trigger({\n        type: \"root.resize\",\n        size: this.size,\n      });\n    }\n  }\n\n  unmake(rebuild) {\n    if (this.rtt == null) {\n      return;\n    }\n\n    this.rtt.dispose();\n    if (!rebuild) {\n      this.scene.dispose();\n    }\n\n    return (this.rtt = this.width = this.height = this.history = null);\n  }\n\n  change(changed, touched, init) {\n    if (touched[\"texture\"] || changed[\"rtt.width\"] || changed[\"rtt.height\"]) {\n      return this.rebuild();\n    }\n\n    if (changed[\"root.camera\"] || init) {\n      this._unattach();\n      this._attach(\n        this.props.camera,\n        \"camera\",\n        this.setCamera,\n        this,\n        this,\n        true\n      );\n      return this.setCamera();\n    }\n  }\n\n  adopt(renderable) {\n    return Array.from(renderable.renders).map((object) =>\n      this.scene.add(object)\n    );\n  }\n  unadopt(renderable) {\n    return Array.from(renderable.renders).map((object) =>\n      this.scene.remove(object)\n    );\n  }\n\n  resize(size) {\n    let height, width;\n    this.rootSize = size;\n\n    ({ width, height, size } = this.props);\n    const relativeSize =\n      size === this.node.attributes[\"rtt.size\"].enum.relative;\n\n    if (!this.rtt || width == null || height == null || relativeSize) {\n      return this.rebuild();\n    }\n  }\n\n  select(selector) {\n    return this._root.node.model.select(selector, [this.node]);\n  }\n\n  watch(selector, handler) {\n    return this._root.node.model.watch(selector, handler);\n  }\n\n  unwatch(handler) {\n    return this._root.node.model.unwatch(handler);\n  }\n\n  pre(e) {\n    return this.trigger(e);\n  }\n  update(e) {\n    let camera;\n    if ((camera = this.getOwnCamera()) != null) {\n      camera.aspect = this.aspect || 1;\n      camera.updateProjectionMatrix();\n    }\n    return this.trigger(e);\n  }\n  render(e) {\n    this.trigger(e);\n    return this.rtt != null ? this.rtt.render(this.getCamera()) : undefined;\n  }\n  post(e) {\n    return this.trigger(e);\n  }\n\n  setCamera() {\n    const camera = __guard__(\n      this.select(this.props.camera)[0],\n      (x) => x.controller\n    );\n    if (this.camera !== camera) {\n      this.camera = camera;\n      this.rtt.camera = this.getCamera();\n      return this.trigger({ type: \"root.camera\" });\n    } else if (!this.camera) {\n      return this.trigger({ type: \"root.camera\" });\n    }\n  }\n\n  getOwnCamera() {\n    return this.camera != null ? this.camera.getCamera() : undefined;\n  }\n  getCamera() {\n    let left;\n    return (left = this.getOwnCamera()) != null\n      ? left\n      : this._inherit(\"root\").getCamera();\n  }\n\n  // End transform chain here\n  vertex(shader, pass) {\n    if (pass === 2) {\n      return shader.pipe(\"view.position\");\n    }\n    if (pass === 3) {\n      return shader.pipe(\"root.position\");\n    }\n    return shader;\n  }\n}\nRTT.initClass();\n\nfunction __guard__(value, transform) {\n  return typeof value !== \"undefined\" && value !== null\n    ? transform(value)\n    : undefined;\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Primitive } from \"../../primitive.js\";\n\nexport class Compose extends Primitive {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"bind\",\n      \"object\",\n      \"visible\",\n      \"operator\",\n      \"style\",\n      \"compose\",\n    ];\n    this.defaults = {\n      zWrite: false,\n      zTest: false,\n      color: \"#ffffff\",\n    };\n  }\n\n  init() {\n    return (this.compose = null);\n  }\n\n  //rebuild: () ->\n  //  console.log 'compose.rebuild', @node.get(null, true), @bind.source?\n  //  super()\n\n  resize() {\n    if (!this.compose || !this.bind.source) {\n      return;\n    }\n\n    const dims = this.bind.source.getActiveDimensions();\n    const { width } = dims;\n    const { height } = dims;\n\n    return this.remapUVScale.set(width, height);\n  }\n\n  make() {\n    // Bind to attached data sources\n    this._helpers.bind.make([{ to: \"operator.source\", trait: \"source\" }]);\n\n    if (this.bind.source == null) {\n      return;\n    }\n\n    // Prepare uniforms for remapping to absolute coords on the fly\n    const resampleUniforms = {\n      remapUVScale: this._attributes.make(this._types.vec2()),\n    };\n    this.remapUVScale = resampleUniforms.remapUVScale.value;\n\n    // Build fragment shader\n    let fragment = this._shaders.shader();\n    const { alpha } = this.props;\n\n    if (this.bind.source.is(\"image\")) {\n      // Sample image directly in 2D UV\n      fragment.pipe(\"screen.pass.uv\", resampleUniforms);\n      fragment = this.bind.source.imageShader(fragment);\n    } else {\n      // Sample data source in 4D\n      fragment.pipe(\"screen.map.xy\", resampleUniforms);\n      fragment = this.bind.source.sourceShader(fragment);\n    }\n\n    // Force pixels to solid if requested\n    if (!alpha) {\n      fragment.pipe(\"color.opaque\");\n    }\n\n    // Make screen renderable\n    const composeUniforms = this._helpers.style.uniforms();\n    this.compose = this._renderables.make(\"screen\", {\n      map: fragment,\n      uniforms: composeUniforms,\n      linear: true,\n    });\n\n    this._helpers.visible.make();\n    return this._helpers.object.make([this.compose]);\n  }\n\n  made() {\n    return this.resize();\n  }\n\n  unmake() {\n    this._helpers.bind.unmake();\n    this._helpers.visible.unmake();\n    return this._helpers.object.unmake();\n  }\n\n  change(changed, _touched, _init) {\n    if (changed[\"operator.source\"] || changed[\"compose.alpha\"]) {\n      return this.rebuild();\n    }\n  }\n}\nCompose.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { Transform } from \"../transform/transform.js\";\n\nexport class View extends Transform {\n  static initClass() {\n    this.traits = [\"node\", \"object\", \"visible\", \"view\", \"vertex\"];\n  }\n\n  make() {\n    return this._helpers.visible.make();\n  }\n\n  unmake() {\n    return this._helpers.visible.unmake();\n  }\n\n  axis(dimension) {\n    return this.props.range[dimension - 1];\n  }\n}\nView.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UThree from \"../../../util/three.js\";\nimport { View } from \"./view.js\";\n\nexport class Cartesian extends View {\n  static initClass() {\n    this.traits = [\"node\", \"object\", \"visible\", \"view\", \"view3\", \"vertex\"];\n  }\n\n  make() {\n    super.make();\n\n    this.uniforms = { viewMatrix: this._attributes.make(this._types.mat4()) };\n\n    this.viewMatrix = this.uniforms.viewMatrix.value;\n    this.composer = UThree.transformComposer();\n  }\n\n  unmake() {\n    super.unmake();\n\n    delete this.viewMatrix;\n    delete this.objectMatrix;\n    delete this.uniforms;\n  }\n\n  change(changed, touched, init) {\n    if (!touched[\"view\"] && !touched[\"view3\"] && !init) {\n      return;\n    }\n\n    const p = this.props.position;\n    const s = this.props.scale;\n    const q = this.props.quaternion;\n    const r = this.props.rotation;\n    const g = this.props.range;\n    const e = this.props.eulerOrder;\n\n    const { x } = g[0];\n    const y = g[1].x;\n    const z = g[2].x;\n    const dx = g[0].y - x || 1;\n    const dy = g[1].y - y || 1;\n    const dz = g[2].y - z || 1;\n\n    // Forward transform\n    this.viewMatrix.set(\n      2 / dx,\n      0,\n      0,\n      -(2 * x + dx) / dx,\n      0,\n      2 / dy,\n      0,\n      -(2 * y + dy) / dy,\n      0,\n      0,\n      2 / dz,\n      -(2 * z + dz) / dz,\n      0,\n      0,\n      0,\n      1\n    );\n\n    const transformMatrix = this.composer(p, r, q, s, null, e);\n    this.viewMatrix.multiplyMatrices(transformMatrix, this.viewMatrix);\n\n    if (changed[\"view.range\"]) {\n      this.trigger({\n        type: \"view.range\",\n      });\n    }\n  }\n\n  vertex(shader, pass) {\n    if (pass === 1) {\n      shader.pipe(\"cartesian.position\", this.uniforms);\n    }\n    return super.vertex(shader, pass);\n  }\n}\nCartesian.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { View } from \"./view.js\";\n\nexport class Cartesian4 extends View {\n  static initClass() {\n    this.traits = [\"node\", \"object\", \"visible\", \"view\", \"view4\", \"vertex\"];\n  }\n\n  make() {\n    super.make();\n\n    this.uniforms = {\n      basisOffset: this._attributes.make(this._types.vec4()),\n      basisScale: this._attributes.make(this._types.vec4()),\n    };\n\n    this.basisScale = this.uniforms.basisScale.value;\n    return (this.basisOffset = this.uniforms.basisOffset.value);\n  }\n\n  unmake() {\n    super.unmake();\n    delete this.basisScale;\n    delete this.basisOffset;\n    return delete this.uniforms;\n  }\n\n  change(changed, touched, init) {\n    if (!touched[\"view\"] && !touched[\"view4\"] && !init) {\n      return;\n    }\n\n    const p = this.props.position;\n    const s = this.props.scale;\n    const g = this.props.range;\n\n    const { x } = g[0];\n    const y = g[1].x;\n    const z = g[2].x;\n    const w = g[3].x;\n    const dx = g[0].y - x || 1;\n    const dy = g[1].y - y || 1;\n    const dz = g[2].y - z || 1;\n    const dw = g[3].y - w || 1;\n\n    const mult = function (a, b) {\n      a.x *= b.x;\n      a.y *= b.y;\n      a.z *= b.z;\n      return (a.w *= b.w);\n    };\n\n    // 4D axis adjustment\n    this.basisScale.set(2 / dx, 2 / dy, 2 / dz, 2 / dw);\n    this.basisOffset.set(\n      -(2 * x + dx) / dx,\n      -(2 * y + dy) / dy,\n      -(2 * z + dz) / dz,\n      -(2 * w + dw) / dw\n    );\n\n    // 4D scale\n    mult(this.basisScale, s);\n    mult(this.basisOffset, s);\n\n    // 4D position\n    this.basisOffset.add(p);\n\n    if (changed[\"view.range\"]) {\n      return this.trigger({\n        type: \"view.range\",\n      });\n    }\n  }\n\n  vertex(shader, pass) {\n    if (pass === 1) {\n      shader.pipe(\"cartesian4.position\", this.uniforms);\n    }\n    return super.vertex(shader, pass);\n  }\n}\nCartesian4.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UAxis from \"../../../util/axis.js\";\nimport * as UThree from \"../../../util/three.js\";\n\nimport { Vector2 } from \"three/src/math/Vector2.js\";\nimport { View } from \"./view.js\";\n\nexport class Polar extends View {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"object\",\n      \"visible\",\n      \"view\",\n      \"view3\",\n      \"polar\",\n      \"vertex\",\n    ];\n  }\n\n  make() {\n    super.make();\n\n    const { types } = this._attributes;\n    this.uniforms = {\n      polarBend: this.node.attributes[\"polar.bend\"],\n      polarHelix: this.node.attributes[\"polar.helix\"],\n      polarFocus: this._attributes.make(types.number()),\n      polarAspect: this._attributes.make(types.number()),\n      viewMatrix: this._attributes.make(types.mat4()),\n    };\n\n    this.viewMatrix = this.uniforms.viewMatrix.value;\n    this.composer = UThree.transformComposer();\n\n    return (this.aspect = 1);\n  }\n\n  unmake() {\n    super.unmake();\n\n    delete this.viewMatrix;\n    delete this.objectMatrix;\n    delete this.aspect;\n    return delete this.uniforms;\n  }\n\n  change(changed, touched, init) {\n    let aspect, bend, focus;\n    if (!touched[\"view\"] && !touched[\"view3\"] && !touched[\"polar\"] && !init) {\n      return;\n    }\n\n    this.helix = this.props.helix;\n    this.bend = bend = this.props.bend;\n\n    this.focus = focus = bend > 0 ? 1 / bend - 1 : 0;\n\n    const p = this.props.position;\n    const s = this.props.scale;\n    const q = this.props.quaternion;\n    const r = this.props.rotation;\n    const g = this.props.range;\n    const e = this.props.eulerOrder;\n\n    const { x } = g[0];\n    let y = g[1].x;\n    const z = g[2].x;\n    const dx = g[0].y - x || 1;\n    let dy = g[1].y - y || 1;\n    const dz = g[2].y - z || 1;\n    const sx = s.x;\n    const sy = s.y;\n\n    // Watch for negative scales.\n    const idx = dx > 0 ? 1 : -1;\n\n    // Recenter viewport on origin the more it's bent\n    [y, dy] = Array.from(UAxis.recenterAxis(y, dy, bend));\n\n    // Adjust viewport range for polar transform.\n    // As the viewport goes polar, the X-range is interpolated to the Y-range instead,\n    // creating a square/circular viewport.\n    const ady = Math.abs(dy);\n    const fdx = dx + (ady * idx - dx) * bend;\n    const sdx = fdx / sx;\n    const sdy = dy / sy;\n    this.aspect = aspect = Math.abs(sdx / sdy);\n\n    this.uniforms.polarFocus.value = focus;\n    this.uniforms.polarAspect.value = aspect;\n\n    // Forward transform\n    this.viewMatrix.set(\n      2 / fdx,\n      0,\n      0,\n      -(2 * x + dx) / dx,\n      0,\n      2 / dy,\n      0,\n      -(2 * y + dy) / dy,\n      0,\n      0,\n      2 / dz,\n      -(2 * z + dz) / dz,\n      0,\n      0,\n      0,\n      1 //,\n    );\n\n    const transformMatrix = this.composer(p, r, q, s, null, e);\n    this.viewMatrix.multiplyMatrices(transformMatrix, this.viewMatrix);\n\n    if (changed[\"view.range\"] || touched[\"polar\"]) {\n      this.trigger({\n        type: \"view.range\",\n      });\n    }\n  }\n\n  vertex(shader, pass) {\n    if (pass === 1) {\n      shader.pipe(\"polar.position\", this.uniforms);\n    }\n    return super.vertex(shader, pass);\n  }\n\n  axis(dimension) {\n    const range = this.props.range[dimension - 1];\n    let min = range.x;\n    let max = range.y;\n\n    // Correct Y extents during polar warp.\n    if (dimension === 2 && this.bend > 0) {\n      max = Math.max(Math.abs(max), Math.abs(min));\n      min = Math.max(-this.focus / this.aspect, min);\n    }\n\n    return new Vector2(min, max);\n  }\n}\nPolar.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UAxis from \"../../../util/axis.js\";\nimport * as UThree from \"../../../util/three.js\";\n\nimport { Vector2 } from \"three/src/math/Vector2.js\";\nimport { View } from \"./view.js\";\n\nexport class Spherical extends View {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"object\",\n      \"visible\",\n      \"view\",\n      \"view3\",\n      \"spherical\",\n      \"vertex\",\n    ];\n  }\n\n  make() {\n    super.make();\n\n    this.uniforms = {\n      sphericalBend: this.node.attributes[\"spherical.bend\"],\n      sphericalFocus: this._attributes.make(this._types.number()),\n      sphericalAspectX: this._attributes.make(this._types.number()),\n      sphericalAspectY: this._attributes.make(this._types.number()),\n      sphericalScaleY: this._attributes.make(this._types.number()),\n      viewMatrix: this._attributes.make(this._types.mat4()),\n    };\n\n    this.viewMatrix = this.uniforms.viewMatrix.value;\n    this.composer = UThree.transformComposer();\n\n    this.aspectX = 1;\n    return (this.aspectY = 1);\n  }\n\n  unmake() {\n    super.unmake();\n\n    delete this.viewMatrix;\n    delete this.objectMatrix;\n    delete this.aspectX;\n    delete this.aspectY;\n    return delete this.uniforms;\n  }\n\n  change(changed, touched, init) {\n    let aspectX, aspectY, bend, focus, scaleY;\n    if (\n      !touched[\"view\"] &&\n      !touched[\"view3\"] &&\n      !touched[\"spherical\"] &&\n      !init\n    ) {\n      return;\n    }\n\n    this.bend = bend = this.props.bend;\n    this.focus = focus = bend > 0 ? 1 / bend - 1 : 0;\n\n    const p = this.props.position;\n    const s = this.props.scale;\n    const q = this.props.quaternion;\n    const r = this.props.rotation;\n    const g = this.props.range;\n    const e = this.props.eulerOrder;\n\n    const { x } = g[0];\n    let y = g[1].x;\n    let z = g[2].x;\n    const dx = g[0].y - x || 1;\n    let dy = g[1].y - y || 1;\n    let dz = g[2].y - z || 1;\n    const sx = s.x;\n    const sy = s.y;\n    const sz = s.z;\n\n    // Recenter viewport on origin the more it's bent\n    [y, dy] = Array.from(UAxis.recenterAxis(y, dy, bend));\n    [z, dz] = Array.from(UAxis.recenterAxis(z, dz, bend));\n\n    // Watch for negative scales.\n    const idx = dx > 0 ? 1 : -1;\n    const idy = dy > 0 ? 1 : -1;\n\n    // Adjust viewport range for spherical transform.\n    // As the viewport goes spherical, the X/Y-ranges are interpolated to the Z-range,\n    // creating a perfectly spherical viewport.\n    const adz = Math.abs(dz);\n    const fdx = dx + (adz * idx - dx) * bend;\n    const fdy = dy + (adz * idy - dy) * bend;\n    const sdx = fdx / sx;\n    const sdy = fdy / sy;\n    const sdz = dz / sz;\n    this.aspectX = aspectX = Math.abs(sdx / sdz);\n    this.aspectY = aspectY = Math.abs(sdy / sdz / aspectX);\n\n    // Scale Y coordinates before transforming, but cap at aspectY/alpha to prevent from poking through the poles mid-transform.\n    // See shaders/glsl/spherical.position.glsl\n    const aspectZ = (((dy / dx) * sx) / sy) * 2; // Factor of 2 due to the fact that in the Y direction we only go 180º from pole to pole.\n    this.scaleY = scaleY = Math.min(aspectY / bend, 1 + (aspectZ - 1) * bend);\n\n    this.uniforms.sphericalBend.value = bend;\n    this.uniforms.sphericalFocus.value = focus;\n    this.uniforms.sphericalAspectX.value = aspectX;\n    this.uniforms.sphericalAspectY.value = aspectY;\n    this.uniforms.sphericalScaleY.value = scaleY;\n\n    // Forward transform\n    this.viewMatrix.set(\n      2 / fdx,\n      0,\n      0,\n      -(2 * x + dx) / dx,\n      0,\n      2 / fdy,\n      0,\n      -(2 * y + dy) / dy,\n      0,\n      0,\n      2 / dz,\n      -(2 * z + dz) / dz,\n      0,\n      0,\n      0,\n      1 //,\n    );\n\n    const transformMatrix = this.composer(p, r, q, s, null, e);\n    this.viewMatrix.multiplyMatrices(transformMatrix, this.viewMatrix);\n\n    if (changed[\"view.range\"] || touched[\"spherical\"]) {\n      return this.trigger({\n        type: \"view.range\",\n      });\n    }\n  }\n\n  vertex(shader, pass) {\n    if (pass === 1) {\n      shader.pipe(\"spherical.position\", this.uniforms);\n    }\n    return super.vertex(shader, pass);\n  }\n\n  axis(dimension) {\n    const range = this.props.range[dimension - 1];\n    let min = range.x;\n    let max = range.y;\n\n    // Correct Z extents during polar warp.\n    if (dimension === 3 && this.bend > 0) {\n      max = Math.max(Math.abs(max), Math.abs(min));\n      min = Math.max(-this.focus / this.aspectX + 0.001, min);\n    }\n\n    return new Vector2(min, max);\n  }\n}\nSpherical.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UAxis from \"../../../util/axis.js\";\nimport * as UThree from \"../../../util/three.js\";\n\nimport { View } from \"./view.js\";\n\nexport class Stereographic extends View {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"object\",\n      \"visible\",\n      \"view\",\n      \"view3\",\n      \"stereographic\",\n      \"vertex\",\n    ];\n  }\n\n  make() {\n    super.make();\n\n    this.uniforms = {\n      stereoBend: this.node.attributes[\"stereographic.bend\"],\n      viewMatrix: this._attributes.make(this._types.mat4()),\n    };\n\n    this.viewMatrix = this.uniforms.viewMatrix.value;\n    return (this.composer = UThree.transformComposer());\n  }\n\n  unmake() {\n    super.unmake();\n\n    delete this.viewMatrix;\n    delete this.rotationMatrix;\n    return delete this.uniforms;\n  }\n\n  change(changed, touched, init) {\n    let bend;\n    if (\n      !touched[\"view\"] &&\n      !touched[\"view3\"] &&\n      !touched[\"stereographic\"] &&\n      !init\n    ) {\n      return;\n    }\n\n    this.bend = bend = this.props.bend;\n\n    const p = this.props.position;\n    const s = this.props.scale;\n    const q = this.props.quaternion;\n    const r = this.props.rotation;\n    const g = this.props.range;\n    const e = this.props.eulerOrder;\n\n    const { x } = g[0];\n    const y = g[1].x;\n    let z = g[2].x;\n    const dx = g[0].y - x || 1;\n    const dy = g[1].y - y || 1;\n    let dz = g[2].y - z || 1;\n\n    // Recenter viewport on projection point the more it's bent\n    [z, dz] = Array.from(UAxis.recenterAxis(z, dz, bend, 1));\n\n    this.uniforms.stereoBend.value = bend;\n\n    // Forward transform\n    this.viewMatrix.set(\n      2 / dx,\n      0,\n      0,\n      -(2 * x + dx) / dx,\n      0,\n      2 / dy,\n      0,\n      -(2 * y + dy) / dy,\n      0,\n      0,\n      2 / dz,\n      -(2 * z + dz) / dz,\n      0,\n      0,\n      0,\n      1 //,\n    );\n\n    const transformMatrix = this.composer(p, r, q, s, null, e);\n    this.viewMatrix.multiplyMatrices(transformMatrix, this.viewMatrix);\n\n    if (changed[\"view.range\"] || touched[\"stereographic\"]) {\n      return this.trigger({\n        type: \"view.range\",\n      });\n    }\n  }\n\n  vertex(shader, pass) {\n    if (pass === 1) {\n      shader.pipe(\"stereographic.position\", this.uniforms);\n    }\n    return super.vertex(shader, pass);\n  }\n}\nStereographic.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UAxis from \"../../../util/axis.js\";\n\nimport { View } from \"./view.js\";\n\nexport class Stereographic4 extends View {\n  static initClass() {\n    this.traits = [\n      \"node\",\n      \"object\",\n      \"visible\",\n      \"view\",\n      \"view4\",\n      \"stereographic\",\n      \"vertex\",\n    ];\n  }\n\n  make() {\n    super.make();\n\n    this.uniforms = {\n      basisOffset: this._attributes.make(this._types.vec4()),\n      basisScale: this._attributes.make(this._types.vec4()),\n      stereoBend: this.node.attributes[\"stereographic.bend\"],\n    };\n\n    this.basisScale = this.uniforms.basisScale.value;\n    this.basisOffset = this.uniforms.basisOffset.value;\n  }\n\n  unmake() {\n    super.unmake();\n\n    delete this.basisScale;\n    delete this.basisOffset;\n    delete this.uniforms;\n  }\n\n  change(changed, touched, init) {\n    let bend;\n    if (\n      !touched[\"view\"] &&\n      !touched[\"view4\"] &&\n      !touched[\"stereographic\"] &&\n      !init\n    ) {\n      return;\n    }\n\n    this.bend = bend = this.props.bend;\n\n    const p = this.props.position;\n    const s = this.props.scale;\n    const g = this.props.range;\n\n    const { x } = g[0];\n    const y = g[1].x;\n    const z = g[2].x;\n    let w = g[3].x;\n    const dx = g[0].y - x || 1;\n    const dy = g[1].y - y || 1;\n    const dz = g[2].y - z || 1;\n    let dw = g[3].y - w || 1;\n\n    const mult = function (a, b) {\n      a.x *= b.x;\n      a.y *= b.y;\n      a.z *= b.z;\n      a.w *= b.w;\n    };\n\n    // Recenter viewport on projection point the more it's bent\n    [w, dw] = Array.from(UAxis.recenterAxis(w, dw, bend, 1));\n\n    // 4D axis adjustment\n    this.basisScale.set(2 / dx, 2 / dy, 2 / dz, 2 / dw);\n    this.basisOffset.set(\n      -(2 * x + dx) / dx,\n      -(2 * y + dy) / dy,\n      -(2 * z + dz) / dz,\n      -(2 * w + dw) / dw\n    );\n\n    // 4D scale\n    mult(this.basisScale, s);\n    mult(this.basisOffset, s);\n\n    // 4D position\n    this.basisOffset.add(p);\n\n    if (changed[\"view.range\"] || touched[\"stereographic\"]) {\n      this.trigger({\n        type: \"view.range\",\n      });\n    }\n  }\n\n  vertex(shader, pass) {\n    if (pass === 1) {\n      shader.pipe(\"stereographic4.position\", this.uniforms);\n    }\n    return super.vertex(shader, pass);\n  }\n}\nStereographic4.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Primitive } from \"../../primitive.js\";\n\nexport class Shader extends Primitive {\n  static initClass() {\n    this.traits = [\"node\", \"bind\", \"shader\"];\n    this.freeform = true;\n  }\n\n  init() {\n    return (this.shader = null);\n  }\n\n  make() {\n    const { language, code } = this.props;\n    if (language !== \"glsl\") {\n      throw new Error(\"GLSL required\");\n    }\n\n    // Bind to attached data sources\n    this._helpers.bind.make([\n      { to: \"shader.sources\", trait: \"source\", multiple: true },\n    ]);\n\n    // Parse snippet w/ shadergraph (will do implicit DOM script tag by ID\n    // lookup if simple selector or ID given)\n    const snippet = this._shaders.fetch(code);\n\n    // Convert uniforms to attributes\n    const types = this._types;\n    const uniforms = {};\n    const make = (type) => {\n      let t;\n      switch (type) {\n        case \"i\":\n          return types.int();\n        case \"f\":\n          return types.number();\n        case \"v2\":\n          return types.vec2();\n        case \"v3\":\n          return types.vec3();\n        case \"v4\":\n          return types.vec4();\n        case \"m3\":\n          return types.mat3();\n        case \"m4\":\n          return types.mat4();\n        case \"t\":\n          return types.object();\n        default:\n          t = type.split(\"\");\n          if (t.pop() === \"v\") {\n            return types.array(make(t.join(\"\")));\n          } else {\n            return null;\n          }\n      }\n    };\n\n    for (const def of Array.from(snippet._signatures.uniform)) {\n      let type;\n      if ((type = make(def.type))) {\n        uniforms[def.name] = type;\n      }\n    }\n\n    // Reconfigure node model\n    return this.reconfigure({ props: { uniform: uniforms } });\n  }\n\n  made() {\n    // Notify of shader reallocation\n    return this.trigger({\n      type: \"source.rebuild\",\n    });\n  }\n\n  unmake() {\n    return (this.shader = null);\n  }\n\n  change(changed, _touched, _init) {\n    if (\n      changed[\"shader.uniforms\"] ||\n      changed[\"shader.code\"] ||\n      changed[\"shader.language\"]\n    ) {\n      return this.rebuild();\n    }\n  }\n\n  shaderBind(uniforms) {\n    let k, u, v;\n    if (uniforms == null) {\n      uniforms = {};\n    }\n    const { code } = this.props;\n\n    // Merge in prop attributes as uniforms\n    for (k in this.node.attributes) {\n      v = this.node.attributes[k];\n      if (v.type != null && v.short != null && v.ns === \"uniform\") {\n        if (uniforms[v.short] == null) {\n          uniforms[v.short] = v;\n        }\n      }\n    }\n\n    // Merge in explicit uniform object if set\n    if ((u = this.props.uniforms) != null) {\n      for (k in u) {\n        v = u[k];\n        uniforms[k] = v;\n      }\n    }\n\n    // New shader\n    const s = this._shaders.shader();\n\n    // Require sources\n    if (this.bind.sources != null) {\n      for (const source of Array.from(this.bind.sources)) {\n        s.require(source.sourceShader(this._shaders.shader()));\n      }\n    }\n\n    // Build bound shader\n    return s.pipe(code, uniforms);\n  }\n}\nShader.initClass();\n","/* eslint-disable sort-imports */\nimport { Group, Inherit, Root, Unit } from \"./base\";\nimport { Camera } from \"./camera\";\nimport { Area, Array_, Interval, Matrix, Scale, Volume, Voxel } from \"./data\";\nimport {\n  Axis,\n  Face,\n  Grid,\n  Line,\n  Point,\n  Strip,\n  Surface,\n  Ticks,\n  Vector,\n} from \"./draw\";\nimport { DOM, HTML } from \"./overlay\";\nimport { Format, Label, Retext, Text } from \"./text\";\nimport { Clock, Now } from \"./time\";\nimport {\n  Fragment,\n  Layer,\n  Mask,\n  Transform3,\n  Transform4,\n  Vertex,\n} from \"./transform\";\nimport {\n  Clamp,\n  Grow,\n  Join,\n  Lerp,\n  Memo,\n  Readback,\n  Repeat,\n  Resample,\n  Slice,\n  Split,\n  Spread,\n  Subdivide,\n  Swizzle,\n  Transpose,\n} from \"./operator\";\nimport { Move, Play, Present, Reveal, Slide, Step } from \"./present\";\nimport { Compose, RTT } from \"./rtt\";\nimport {\n  Cartesian,\n  Cartesian4,\n  Polar,\n  Spherical,\n  Stereographic,\n  Stereographic4,\n  View,\n} from \"./view\";\n\nimport { Shader } from \"./shader\";\n\nexport const Classes = {\n  axis: Axis,\n  face: Face,\n  grid: Grid,\n  line: Line,\n  point: Point,\n  strip: Strip,\n  surface: Surface,\n  ticks: Ticks,\n  vector: Vector,\n\n  view: View,\n  cartesian: Cartesian,\n  cartesian4: Cartesian4,\n  polar: Polar,\n  spherical: Spherical,\n  stereographic: Stereographic,\n  stereographic4: Stereographic4,\n\n  transform: Transform3,\n  transform4: Transform4,\n  vertex: Vertex,\n  fragment: Fragment,\n  layer: Layer,\n  mask: Mask,\n\n  array: Array_,\n  interval: Interval,\n  matrix: Matrix,\n  area: Area,\n  voxel: Voxel,\n  volume: Volume,\n  scale: Scale,\n\n  html: HTML,\n  dom: DOM,\n\n  text: Text,\n  format: Format,\n  label: Label,\n  retext: Retext,\n\n  clamp: Clamp,\n  grow: Grow,\n  join: Join,\n  lerp: Lerp,\n  memo: Memo,\n  readback: Readback,\n  resample: Resample,\n  repeat: Repeat,\n  swizzle: Swizzle,\n  spread: Spread,\n  split: Split,\n  slice: Slice,\n  subdivide: Subdivide,\n  transpose: Transpose,\n\n  group: Group,\n  inherit: Inherit,\n  root: Root,\n  unit: Unit,\n\n  shader: Shader,\n\n  camera: Camera,\n\n  rtt: RTT,\n  compose: Compose,\n\n  clock: Clock,\n  now: Now,\n\n  move: Move,\n  play: Play,\n  present: Present,\n  reveal: Reveal,\n  slide: Slide,\n  step: Step,\n};\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining\n * DS104: Avoid inline assignments\n * DS202: Simplify dynamic range loops\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UData from \"../../util/data.js\";\nimport * as UJS from \"../../util/js.js\";\n\nimport {\n  ByteType,\n  FloatType,\n  IntType,\n  LinearFilter,\n  LinearMipMapLinearFilter,\n  LinearMipMapNearestFilter,\n  NearestFilter,\n  NearestMipMapLinearFilter,\n  NearestMipMapNearestFilter,\n  ShortType,\n  UnsignedByteType,\n  UnsignedIntType,\n  UnsignedShortType,\n} from \"three/src/constants.js\";\nimport { Color } from \"three/src/math/Color.js\";\nimport { Matrix3 } from \"three/src/math/Matrix3.js\";\nimport { Matrix4 } from \"three/src/math/Matrix4.js\";\nimport { Quaternion } from \"three/src/math/Quaternion.js\";\nimport { Vector2 } from \"three/src/math/Vector2.js\";\nimport { Vector3 } from \"three/src/math/Vector3.js\";\nimport { Vector4 } from \"three/src/math/Vector4.js\";\n\n// Property types\n//\n// The weird calling convention is for double-buffering the values\n// while validating compound types like arrays and nullables.\n//\n// validate: (value, target, invalid) ->\n//\n//   # Option 1: Call invalid() to reject\n//   return invalid() if value < 0\n//\n//   # Option 2: Change target in-place\n//   target.set(value)\n//   return target\n//\n//   # Option 3: Return new value\n//   return +value\n//\nconst _Types = {\n  array(type, size, value = null) {\n    const lerp = type.lerp\n      ? function (a, b, target, f) {\n          const l = Math.min(a.length, b.length);\n          for (\n            let i = 0, end = l, asc = 0 <= end;\n            asc ? i < end : i > end;\n            asc ? i++ : i--\n          ) {\n            target[i] = type.lerp(a[i], b[i], target[i], f);\n          }\n          return target;\n        }\n      : undefined;\n\n    const op = type.op\n      ? function (a, b, target, op) {\n          const l = Math.min(a.length, b.length);\n          for (\n            let i = 0, end = l, asc = 0 <= end;\n            asc ? i < end : i > end;\n            asc ? i++ : i--\n          ) {\n            target[i] = type.op(a[i], b[i], target[i], op);\n          }\n          return target;\n        }\n      : undefined;\n\n    if (value != null && !(value instanceof Array)) {\n      value = [value];\n    }\n\n    return {\n      uniform() {\n        if (type.uniform) {\n          return type.uniform() + \"v\";\n        } else {\n          return undefined;\n        }\n      },\n      make() {\n        if (value != null) {\n          return value.slice();\n        }\n        if (!size) {\n          return [];\n        }\n        return __range__(0, size, false).map((_i) => type.make());\n      },\n      validate(value, target, invalid) {\n        if (!(value instanceof Array)) {\n          value = [value];\n        }\n\n        const l = (target.length = size ? size : value.length);\n        for (\n          let i = 0, end = l, asc = 0 <= end;\n          asc ? i < end : i > end;\n          asc ? i++ : i--\n        ) {\n          const input = value[i] != null ? value[i] : type.make();\n          target[i] = type.validate(input, target[i], invalid);\n        }\n\n        return target;\n      },\n      equals(a, b) {\n        const al = a.length;\n        const bl = b.length;\n        if (al !== bl) {\n          return false;\n        }\n\n        const l = Math.min(al, bl);\n        for (\n          let i = 0, end = l, asc = 0 <= end;\n          asc ? i < end : i > end;\n          asc ? i++ : i--\n        ) {\n          if (\n            !(typeof type.equals === \"function\"\n              ? type.equals(a[i], b[i])\n              : undefined)\n          ) {\n            return false;\n          }\n        }\n        return true;\n      },\n      lerp,\n      op,\n      clone(v) {\n        return Array.from(v).map((x) => type.clone(x));\n      },\n    };\n  },\n\n  letters(type, size, value = null) {\n    if (value != null) {\n      if (value === \"\" + value) {\n        value = value.split(\"\");\n      }\n      for (let i = 0; i < value.length; i++) {\n        const v = value[i];\n        value[i] = type.validate(v, v);\n      }\n    }\n\n    const array = Types.array(type, size, value);\n\n    return {\n      uniform() {\n        return array.uniform();\n      },\n      make() {\n        return array.make();\n      },\n      validate(value, target, invalid) {\n        if (value === \"\" + value) {\n          value = value.split(\"\");\n        }\n        return array.validate(value, target, invalid);\n      },\n      equals(a, b) {\n        return array.equals(a, b);\n      },\n      clone: array.clone,\n    };\n  },\n\n  nullable(type, make) {\n    if (make == null) {\n      make = false;\n    }\n    let value = make ? type.make() : null;\n\n    const emitter = type.emitter\n      ? function (expr1, expr2) {\n          if (expr2 == null) {\n            return expr1;\n          }\n          if (expr1 == null) {\n            return expr2;\n          }\n          return type.emitter(expr1, expr2);\n        }\n      : undefined;\n\n    const lerp = type.lerp\n      ? function (a, b, target, f) {\n          if (a === null || b === null) {\n            if (f < 0.5) {\n              return a;\n            } else {\n              return b;\n            }\n          }\n          if (target == null) {\n            target = type.make();\n          }\n          value = type.lerp(a, b, target, f);\n          return target;\n        }\n      : undefined;\n\n    const op = type.op\n      ? function (a, b, target, op) {\n          if (a === null || b === null) {\n            return null;\n          }\n          if (target == null) {\n            target = type.make();\n          }\n          value = type.op(a, b, target, op);\n          return value;\n        }\n      : undefined;\n\n    return {\n      make() {\n        return value;\n      },\n      validate(value, target, invalid) {\n        if (value === null) {\n          return value;\n        }\n        if (target === null) {\n          target = type.make();\n        }\n        return type.validate(value, target, invalid);\n      },\n      uniform() {\n        return typeof type.uniform === \"function\" ? type.uniform() : undefined;\n      },\n      equals(a, b) {\n        let left;\n        const an = a === null;\n        const bn = b === null;\n        if (an && bn) {\n          return true;\n        }\n        if (an ^ bn) {\n          return false;\n        }\n        return (left =\n          typeof type.equals === \"function\" ? type.equals(a, b) : undefined) !=\n          null\n          ? left\n          : a === b;\n      },\n      lerp,\n      op,\n      emitter,\n    };\n  },\n\n  enum(value, keys, map) {\n    let key;\n    if (keys == null) {\n      keys = [];\n    }\n    if (map == null) {\n      map = {};\n    }\n    let i = 0;\n    const values = {};\n    for (key of Array.from(keys)) {\n      if (key !== +key) {\n        if (map[key] == null) {\n          map[key] = i++;\n        }\n      }\n    }\n    for (key of Array.from(keys)) {\n      if (key === +key) {\n        values[key] = key;\n      }\n    }\n    for (key in map) {\n      i = map[key];\n      values[i] = true;\n    }\n\n    if (values[value] == null) {\n      value = map[value];\n    }\n\n    return {\n      enum() {\n        return map;\n      },\n      make() {\n        return value;\n      },\n      validate(value, target, invalid) {\n        const v = values[value] ? value : map[value];\n        if (v != null) {\n          return v;\n        }\n        return invalid();\n      },\n    };\n  },\n\n  enumber(value, keys, map) {\n    if (map == null) {\n      map = {};\n    }\n    const _enum = Types.enum(value, keys, map);\n\n    return {\n      enum: _enum.enum,\n      uniform() {\n        return \"f\";\n      },\n      make() {\n        let left;\n        return (left = _enum.make()) != null ? left : +value;\n      },\n      validate(value, target, invalid) {\n        if (value === +value) {\n          return value;\n        }\n        return _enum.validate(value, target, invalid);\n      },\n      op(a, b, target, op) {\n        return op(a, b);\n      },\n    };\n  },\n\n  select(value) {\n    if (value == null) {\n      value = \"<\";\n    }\n    value;\n    return {\n      make() {\n        return value;\n      },\n      validate(value, target, invalid) {\n        if (typeof value === \"string\") {\n          return value;\n        }\n        if (typeof value === \"object\") {\n          return value;\n        }\n        return invalid();\n      },\n    };\n  },\n\n  bool(value) {\n    value = !!value;\n    return {\n      uniform() {\n        return \"f\";\n      },\n      make() {\n        return value;\n      },\n      validate(value, _target, _invalid) {\n        return !!value;\n      },\n    };\n  },\n\n  int(value) {\n    if (value == null) {\n      value = 0;\n    }\n    value = +Math.round(value);\n    return {\n      uniform() {\n        return \"i\";\n      },\n      make() {\n        return value;\n      },\n      validate(value, target, invalid) {\n        let x;\n        if (value !== (x = +value)) {\n          return invalid();\n        }\n        return Math.round(x) || 0;\n      },\n      op(a, b, target, op) {\n        return op(a, b);\n      },\n    };\n  },\n\n  round(value) {\n    if (value == null) {\n      value = 0;\n    }\n    value = +Math.round(value);\n    return {\n      uniform() {\n        return \"f\";\n      },\n      make() {\n        return value;\n      },\n      validate(value, target, invalid) {\n        let x;\n        if (value !== (x = +value)) {\n          return invalid();\n        }\n        return Math.round(x) || 0;\n      },\n      op(a, b, target, op) {\n        return op(a, b);\n      },\n    };\n  },\n\n  number(value) {\n    if (value == null) {\n      value = 0;\n    }\n    return {\n      uniform() {\n        return \"f\";\n      },\n      make() {\n        return +value;\n      },\n      validate(value, target, invalid) {\n        let x;\n        if (value !== (x = +value)) {\n          return invalid();\n        }\n        return x || 0;\n      },\n      op(a, b, target, op) {\n        return op(a, b);\n      },\n    };\n  },\n\n  positive(type, strict) {\n    if (strict == null) {\n      strict = false;\n    }\n    return {\n      uniform: type.uniform,\n      make: type.make,\n      validate(value, target, invalid) {\n        value = type.validate(value, target, invalid);\n        if (value < 0 || (strict && value <= 0)) {\n          return invalid();\n        }\n        return value;\n      },\n      op(a, b, target, op) {\n        return op(a, b);\n      },\n    };\n  },\n\n  string(value) {\n    if (value == null) {\n      value = \"\";\n    }\n    return {\n      make() {\n        return \"\" + value;\n      },\n      validate(value, target, invalid) {\n        let x;\n        if (value !== (x = \"\" + value)) {\n          return invalid();\n        }\n        return x;\n      },\n    };\n  },\n\n  func() {\n    return {\n      make() {\n        return function () {};\n      },\n      validate(value, target, invalid) {\n        if (typeof value === \"function\") {\n          return value;\n        }\n        return invalid();\n      },\n    };\n  },\n\n  emitter() {\n    return {\n      make() {\n        return (emit) => emit(1, 1, 1, 1);\n      },\n      validate(value, target, invalid) {\n        if (typeof value === \"function\") {\n          return value;\n        }\n        return invalid();\n      },\n      emitter(a, b) {\n        return UData.getLerpEmitter(a, b);\n      },\n    };\n  },\n\n  object(value) {\n    return {\n      make() {\n        return value != null ? value : {};\n      },\n      validate(value, target, invalid) {\n        if (typeof value === \"object\") {\n          return value;\n        }\n        return invalid();\n      },\n      clone(v) {\n        return JSON.parse(JSON.stringify(v));\n      },\n    };\n  },\n\n  timestamp(value = null) {\n    if (typeof value === \"string\") {\n      value = Date.parse(value);\n    }\n\n    return {\n      uniform() {\n        return \"f\";\n      },\n      make() {\n        return value != null ? value : +new Date();\n      },\n      validate(value, target, invalid) {\n        value = Date.parse(value);\n        if (value !== +value) {\n          return invalid();\n        }\n        return value;\n      },\n      op(a, b, target, op) {\n        return op(a, b);\n      },\n    };\n  },\n\n  vec2(x, y) {\n    if (x == null) {\n      x = 0;\n    }\n    if (y == null) {\n      y = 0;\n    }\n    const defaults = [x, y];\n    return {\n      uniform() {\n        return \"v2\";\n      },\n      make() {\n        return new Vector2(x, y);\n      },\n      validate(value, target, invalid) {\n        if (value === +value) {\n          value = [value];\n        }\n\n        if (value instanceof Vector2) {\n          target.copy(value);\n        } else if (value instanceof Array) {\n          value = value.concat(defaults.slice(value.length));\n          target.set.apply(target, value);\n        } else if (value != null) {\n          const xx = value.x != null ? value.x : x;\n          const yy = value.y != null ? value.y : y;\n          target.set(xx, yy);\n        } else {\n          return invalid();\n        }\n        return target;\n      },\n\n      equals(a, b) {\n        return a.x === b.x && a.y === b.y;\n      },\n      op(a, b, target, op) {\n        target.x = op(a.x, b.x);\n        target.y = op(a.y, b.y);\n        return target;\n      },\n    };\n  },\n\n  ivec2(x, y) {\n    if (x == null) {\n      x = 0;\n    }\n    if (y == null) {\n      y = 0;\n    }\n    const vec2 = Types.vec2(x, y);\n    const { validate } = vec2;\n    vec2.validate = function (value, target, invalid) {\n      validate(value, target, invalid);\n      target.x = Math.round(target.x);\n      target.y = Math.round(target.y);\n      return target;\n    };\n    return vec2;\n  },\n\n  vec3(x, y, z) {\n    if (x == null) {\n      x = 0;\n    }\n    if (y == null) {\n      y = 0;\n    }\n    if (z == null) {\n      z = 0;\n    }\n    const defaults = [x, y, z];\n    return {\n      uniform() {\n        return \"v3\";\n      },\n      make() {\n        return new Vector3(x, y, z);\n      },\n      validate(value, target, invalid) {\n        if (value === +value) {\n          value = [value];\n        }\n\n        if (value instanceof Vector3) {\n          target.copy(value);\n        } else if (value instanceof Array) {\n          value = value.concat(defaults.slice(value.length));\n          target.set.apply(target, value);\n        } else if (value != null) {\n          const xx = value.x != null ? value.x : x;\n          const yy = value.y != null ? value.y : y;\n          const zz = value.z != null ? value.z : z;\n          target.set(xx, yy, zz);\n        } else {\n          return invalid();\n        }\n        return target;\n      },\n\n      equals(a, b) {\n        return a.x === b.x && a.y === b.y && a.z === b.z;\n      },\n      op(a, b, target, op) {\n        target.x = op(a.x, b.x);\n        target.y = op(a.y, b.y);\n        target.z = op(a.z, b.z);\n        return target;\n      },\n    };\n  },\n\n  ivec3(x, y, z) {\n    if (x == null) {\n      x = 0;\n    }\n    if (y == null) {\n      y = 0;\n    }\n    if (z == null) {\n      z = 0;\n    }\n    const vec3 = Types.vec3(x, y, z);\n    const { validate } = vec3;\n    vec3.validate = function (value, target, invalid) {\n      validate(value, target, invalid);\n      target.x = Math.round(target.x);\n      target.y = Math.round(target.y);\n      target.z = Math.round(target.z);\n      return target;\n    };\n    return vec3;\n  },\n\n  vec4(x, y, z, w) {\n    if (x == null) {\n      x = 0;\n    }\n    if (y == null) {\n      y = 0;\n    }\n    if (z == null) {\n      z = 0;\n    }\n    if (w == null) {\n      w = 0;\n    }\n    const defaults = [x, y, z, w];\n    return {\n      uniform() {\n        return \"v4\";\n      },\n      make() {\n        return new Vector4(x, y, z, w);\n      },\n      validate(value, target, invalid) {\n        if (value === +value) {\n          value = [value];\n        }\n\n        if (value instanceof Vector4) {\n          target.copy(value);\n        } else if (value instanceof Array) {\n          value = value.concat(defaults.slice(value.length));\n          target.set.apply(target, value);\n        } else if (value != null) {\n          const xx = value.x != null ? value.x : x;\n          const yy = value.y != null ? value.y : y;\n          const zz = value.z != null ? value.z : z;\n          const ww = value.w != null ? value.w : w;\n          target.set(xx, yy, zz, ww);\n        } else {\n          return invalid();\n        }\n        return target;\n      },\n      equals(a, b) {\n        return a.x === b.x && a.y === b.y && a.z === b.z && a.w === b.w;\n      },\n      op(a, b, target, op) {\n        target.x = op(a.x, b.x);\n        target.y = op(a.y, b.y);\n        target.z = op(a.z, b.z);\n        target.w = op(a.w, b.w);\n        return target;\n      },\n    };\n  },\n\n  ivec4(x, y, z, w) {\n    if (x == null) {\n      x = 0;\n    }\n    if (y == null) {\n      y = 0;\n    }\n    if (z == null) {\n      z = 0;\n    }\n    if (w == null) {\n      w = 0;\n    }\n    const vec4 = Types.vec4(x, y, z, w);\n    const { validate } = vec4;\n    vec4.validate = function (value, target, invalid) {\n      validate(value, target, invalid);\n      target.x = Math.round(target.x);\n      target.y = Math.round(target.y);\n      target.z = Math.round(target.z);\n      target.w = Math.round(target.w);\n      return target;\n    };\n    return vec4;\n  },\n\n  mat3(n11, n12, n13, n21, n22, n23, n31, n32, n33) {\n    if (n11 == null) {\n      n11 = 1;\n    }\n    if (n12 == null) {\n      n12 = 0;\n    }\n    if (n13 == null) {\n      n13 = 0;\n    }\n    if (n21 == null) {\n      n21 = 0;\n    }\n    if (n22 == null) {\n      n22 = 1;\n    }\n    if (n23 == null) {\n      n23 = 0;\n    }\n    if (n31 == null) {\n      n31 = 0;\n    }\n    if (n32 == null) {\n      n32 = 0;\n    }\n    if (n33 == null) {\n      n33 = 1;\n    }\n    const defaults = [n11, n12, n13, n21, n22, n23, n31, n32, n33];\n\n    return {\n      uniform() {\n        return \"m4\";\n      },\n      make() {\n        const m = new Matrix3();\n        m.set(n11, n12, n13, n21, n22, n23, n31, n32, n33);\n        return m;\n      },\n      validate(value, target, invalid) {\n        if (value instanceof Matrix3) {\n          target.copy(value);\n        } else if (value instanceof Array) {\n          value = value.concat(defaults.slice(value.length));\n          target.set.apply(target, value);\n        } else {\n          return invalid();\n        }\n        return target;\n      },\n    };\n  },\n\n  mat4(\n    n11,\n    n12,\n    n13,\n    n14,\n    n21,\n    n22,\n    n23,\n    n24,\n    n31,\n    n32,\n    n33,\n    n34,\n    n41,\n    n42,\n    n43,\n    n44\n  ) {\n    if (n11 == null) {\n      n11 = 1;\n    }\n    if (n12 == null) {\n      n12 = 0;\n    }\n    if (n13 == null) {\n      n13 = 0;\n    }\n    if (n14 == null) {\n      n14 = 0;\n    }\n    if (n21 == null) {\n      n21 = 0;\n    }\n    if (n22 == null) {\n      n22 = 1;\n    }\n    if (n23 == null) {\n      n23 = 0;\n    }\n    if (n24 == null) {\n      n24 = 0;\n    }\n    if (n31 == null) {\n      n31 = 0;\n    }\n    if (n32 == null) {\n      n32 = 0;\n    }\n    if (n33 == null) {\n      n33 = 1;\n    }\n    if (n34 == null) {\n      n34 = 0;\n    }\n    if (n41 == null) {\n      n41 = 0;\n    }\n    if (n42 == null) {\n      n42 = 0;\n    }\n    if (n43 == null) {\n      n43 = 0;\n    }\n    if (n44 == null) {\n      n44 = 1;\n    }\n    const defaults = [\n      n11,\n      n12,\n      n13,\n      n14,\n      n21,\n      n22,\n      n23,\n      n24,\n      n31,\n      n32,\n      n33,\n      n34,\n      n41,\n      n42,\n      n43,\n      n44,\n    ];\n\n    return {\n      uniform() {\n        return \"m4\";\n      },\n      make() {\n        const m = new Matrix4();\n        m.set(\n          n11,\n          n12,\n          n13,\n          n14,\n          n21,\n          n22,\n          n23,\n          n24,\n          n31,\n          n32,\n          n33,\n          n34,\n          n41,\n          n42,\n          n43,\n          n44\n        );\n        return m;\n      },\n      validate(value, target, invalid) {\n        if (value instanceof Matrix4) {\n          target.copy(value);\n        } else if (value instanceof Array) {\n          value = value.concat(defaults.slice(value.length));\n          target.set.apply(target, value);\n        } else {\n          return invalid();\n        }\n        return target;\n      },\n    };\n  },\n\n  quat(x, y, z, w) {\n    if (x == null) {\n      x = 0;\n    }\n    if (y == null) {\n      y = 0;\n    }\n    if (z == null) {\n      z = 0;\n    }\n    if (w == null) {\n      w = 1;\n    }\n    const vec4 = Types.vec4(x, y, z, w);\n\n    return {\n      uniform() {\n        return \"v4\";\n      },\n      make() {\n        return new Quaternion();\n      },\n      validate(value, target, invalid) {\n        if (value instanceof Quaternion) {\n          target.copy(value);\n        } else {\n          target = vec4.validate(value, target, invalid);\n        }\n        target.normalize();\n        return target;\n      },\n      equals(a, b) {\n        return a.x === b.x && a.y === b.y && a.z === b.z && a.w === b.w;\n      },\n      op(a, b, target, op) {\n        target.x = op(a.x, b.x);\n        target.y = op(a.y, b.y);\n        target.z = op(a.z, b.z);\n        target.w = op(a.w, b.w);\n        target.normalize();\n        return target;\n      },\n      lerp(a, b, target, f) {\n        if (target.slerpQuaternions) {\n          // NOTE: slerpQuaternions replaced the static slerp method in three.js\n          // r127. This switch removes the deprecation warning and keeps the\n          // project three.js compatible across this version.\n          target.slerpQuaternions(a, b, f);\n        } else {\n          Quaternion.slerp(a, b, target, f);\n        }\n        return target;\n      },\n    };\n  },\n\n  color(r, g, b) {\n    if (r == null) {\n      r = 0.5;\n    }\n    if (g == null) {\n      g = 0.5;\n    }\n    if (b == null) {\n      b = 0.5;\n    }\n    const defaults = [r, g, b];\n\n    return {\n      uniform() {\n        return \"c\";\n      },\n      make() {\n        return new Color(r, g, b);\n      },\n      validate(value, target, invalid) {\n        if (value === \"\" + value) {\n          value = new Color().setStyle(value);\n        } else if (value === +value) {\n          value = new Color(value);\n        }\n\n        if (value instanceof Color) {\n          target.copy(value);\n        } else if (value instanceof Array) {\n          value = value.concat(defaults.slice(value.length));\n          target.setRGB.apply(target, value);\n        } else if (value != null) {\n          const rr = value.r != null ? value.r : r;\n          const gg = value.g != null ? value.g : g;\n          const bb = value.b != null ? value.b : b;\n          target.set(rr, gg, bb);\n        } else {\n          return invalid();\n        }\n        return target;\n      },\n\n      equals(a, b) {\n        return a.r === b.r && a.g === b.g && a.b === b.b;\n      },\n      op(a, b, target, op) {\n        target.r = op(a.r, b.r);\n        target.g = op(a.g, b.g);\n        target.b = op(a.b, b.b);\n        return target;\n      },\n    };\n  },\n\n  axis(value, allowZero) {\n    let v;\n    if (value == null) {\n      value = 1;\n    }\n    if (allowZero == null) {\n      allowZero = false;\n    }\n    const map = {\n      x: 1,\n      y: 2,\n      z: 3,\n      w: 4,\n      W: 1,\n      H: 2,\n      D: 3,\n      I: 4,\n      zero: 0,\n      null: 0,\n      width: 1,\n      height: 2,\n      depth: 3,\n      items: 4,\n    };\n\n    const range = allowZero ? [0, 1, 2, 3, 4] : [1, 2, 3, 4];\n    if ((v = map[value]) != null) {\n      value = v;\n    }\n\n    return {\n      make() {\n        return value;\n      },\n      validate(value, target, invalid) {\n        let left;\n        if ((v = map[value]) != null) {\n          value = v;\n        }\n        value = (left = Math.round(value)) != null ? left : 0;\n        if (Array.from(range).includes(value)) {\n          return value;\n        }\n        return invalid();\n      },\n    };\n  },\n\n  transpose(order) {\n    if (order == null) {\n      order = [1, 2, 3, 4];\n    }\n    const looseArray = Types.letters(Types.axis(null, false), 0, order);\n    const axesArray = Types.letters(Types.axis(null, false), 4, order);\n\n    return {\n      make() {\n        return axesArray.make();\n      },\n      validate(value, target, invalid) {\n        let temp = [1, 2, 3, 4];\n        looseArray.validate(value, temp, invalid);\n\n        if (temp.length < 4) {\n          const missing = [1, 2, 3, 4].filter((x) => temp.indexOf(x) === -1);\n          temp = temp.concat(missing);\n        }\n\n        const unique = Array.from(temp).map(\n          (letter, i) => temp.indexOf(letter) === i\n        );\n        if (unique.indexOf(false) < 0) {\n          return axesArray.validate(temp, target, invalid);\n        }\n        return invalid();\n      },\n      equals: axesArray.equals,\n      clone: axesArray.clone,\n    };\n  },\n\n  swizzle(order, size = null) {\n    if (order == null) {\n      order = [1, 2, 3, 4];\n    }\n    if (size == null) {\n      size = order.length;\n    }\n    order = order.slice(0, size);\n    const looseArray = Types.letters(Types.axis(null, false), 0, order);\n    const axesArray = Types.letters(Types.axis(null, true), size, order);\n\n    return {\n      make() {\n        return axesArray.make();\n      },\n      validate(value, target, invalid) {\n        let temp = order.slice();\n        looseArray.validate(value, temp, invalid);\n\n        if (temp.length < size) {\n          temp = temp.concat([0, 0, 0, 0]).slice(0, size);\n        }\n\n        return axesArray.validate(temp, target, invalid);\n      },\n      equals: axesArray.equals,\n      clone: axesArray.clone,\n    };\n  },\n\n  classes() {\n    const stringArray = Types.array(Types.string());\n\n    return {\n      make() {\n        return stringArray.make();\n      },\n      validate(value, target, invalid) {\n        if (value === \"\" + value) {\n          value = value.split(\" \");\n        }\n        value = value.filter((x) => !!x.length);\n        return stringArray.validate(value, target, invalid);\n      },\n      equals: stringArray.equals,\n      clone: stringArray.clone,\n    };\n  },\n\n  blending(value) {\n    if (value == null) {\n      value = \"normal\";\n    }\n    const keys = [\"no\", \"normal\", \"add\", \"subtract\", \"multiply\", \"custom\"];\n    return Types.enum(value, keys);\n  },\n\n  filter(value) {\n    if (value == null) {\n      value = \"nearest\";\n    }\n    const map = {\n      nearest: NearestFilter,\n      nearestMipMapNearest: NearestMipMapNearestFilter,\n      nearestMipMapLinear: NearestMipMapLinearFilter,\n      linear: LinearFilter,\n      linearMipMapNearest: LinearMipMapNearestFilter,\n      linearMipmapLinear: LinearMipMapLinearFilter,\n    };\n\n    return Types.enum(value, [], map);\n  },\n\n  type(value) {\n    if (value == null) {\n      value = \"unsignedByte\";\n    }\n    const map = {\n      unsignedByte: UnsignedByteType,\n      byte: ByteType,\n      short: ShortType,\n      unsignedShort: UnsignedShortType,\n      int: IntType,\n      unsignedInt: UnsignedIntType,\n      float: FloatType,\n    };\n\n    return Types.enum(value, [], map);\n  },\n\n  scale(value) {\n    if (value == null) {\n      value = \"linear\";\n    }\n    const keys = [\"linear\", \"log\"];\n    return Types.enum(value, keys);\n  },\n\n  mapping(value) {\n    if (value == null) {\n      value = \"relative\";\n    }\n    const keys = [\"relative\", \"absolute\"];\n    return Types.enum(value, keys);\n  },\n\n  indexing(value) {\n    if (value == null) {\n      value = \"original\";\n    }\n    const keys = [\"original\", \"final\"];\n    return Types.enum(value, keys);\n  },\n\n  shape(value) {\n    if (value == null) {\n      value = \"circle\";\n    }\n    const keys = [\"circle\", \"square\", \"diamond\", \"up\", \"down\", \"left\", \"right\"];\n    return Types.enum(value, keys);\n  },\n\n  join(value) {\n    if (value == null) {\n      value = \"miter\";\n    }\n    const keys = [\"miter\", \"round\", \"bevel\"];\n    return Types.enum(value, keys);\n  },\n\n  stroke(value) {\n    if (value == null) {\n      value = \"solid\";\n    }\n    const keys = [\"solid\", \"dotted\", \"dashed\"];\n    return Types.enum(value, keys);\n  },\n\n  vertexPass(value) {\n    if (value == null) {\n      value = \"view\";\n    }\n    const keys = [\"data\", \"view\", \"world\", \"eye\"];\n    return Types.enum(value, keys);\n  },\n\n  fragmentPass(value) {\n    if (value == null) {\n      value = \"light\";\n    }\n    const keys = [\"color\", \"light\", \"rgba\"];\n    return Types.enum(value, keys);\n  },\n\n  ease(value) {\n    if (value == null) {\n      value = \"linear\";\n    }\n    const keys = [\"linear\", \"cosine\", \"binary\", \"hold\"];\n    return Types.enum(value, keys);\n  },\n\n  fit(value) {\n    if (value == null) {\n      value = \"contain\";\n    }\n    const keys = [\"x\", \"y\", \"contain\", \"cover\"];\n    return Types.enum(value, keys);\n  },\n\n  anchor(value) {\n    if (value == null) {\n      value = \"middle\";\n    }\n    const map = {\n      first: 1,\n      middle: 0,\n      last: -1,\n    };\n\n    return Types.enumber(value, [], map);\n  },\n\n  transitionState(value) {\n    if (value == null) {\n      value = \"enter\";\n    }\n    const map = {\n      enter: -1,\n      visible: 0,\n      exit: 1,\n    };\n\n    return Types.enumber(value, [], map);\n  },\n\n  font(value) {\n    if (value == null) {\n      value = \"sans-serif\";\n    }\n    const parse = UJS.parseQuoted;\n    if (!(value instanceof Array)) {\n      value = parse(value);\n    }\n    const stringArray = Types.array(Types.string(), 0, value);\n\n    return {\n      make() {\n        return stringArray.make();\n      },\n      validate(value, target, invalid) {\n        try {\n          if (!(value instanceof Array)) {\n            value = parse(value);\n          }\n        } catch (error) {\n          return invalid();\n        }\n\n        value = value.filter((x) => !!x.length);\n        return stringArray.validate(value, target, invalid);\n      },\n      equals: stringArray.equals,\n      clone: stringArray.clone,\n    };\n  },\n\n  data(value) {\n    if (value == null) {\n      value = [];\n    }\n    return {\n      make() {\n        return [];\n      },\n      validate(value, target, invalid) {\n        if (value instanceof Array) {\n          return value;\n        } else if ((value != null ? value.length : undefined) != null) {\n          return value;\n        } else {\n          return invalid();\n        }\n      },\n\n      emitter(a, b) {\n        return UData.getLerpThunk(a, b);\n      },\n    };\n  },\n};\n\nconst decorate = function (types) {\n  for (const k in types) {\n    const type = types[k];\n    types[k] = ((type) =>\n      function () {\n        const t = type.apply(type, arguments);\n        if (t.validate == null) {\n          t.validate = (v) => v != null;\n        }\n        if (t.equals == null) {\n          t.equals = (a, b) => a === b;\n        }\n        if (t.clone == null) {\n          t.clone = function (v) {\n            let left;\n            return (left = __guardMethod__(v, \"clone\", (o) => o.clone())) !=\n              null\n              ? left\n              : v;\n          };\n        }\n        return t;\n      })(type);\n  }\n  return types;\n};\n\nexport const Types = decorate(_Types);\n\nfunction __range__(left, right, inclusive) {\n  const range = [];\n  const ascending = left < right;\n  const end = !inclusive ? right : ascending ? right + 1 : right - 1;\n  for (let i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {\n    range.push(i);\n  }\n  return range;\n}\nfunction __guardMethod__(obj, methodName, transform) {\n  if (\n    typeof obj !== \"undefined\" &&\n    obj !== null &&\n    typeof obj[methodName] === \"function\"\n  ) {\n    return transform(obj, methodName);\n  } else {\n    return undefined;\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\nimport { Types } from \"./types.js\";\n\nexport const Traits = {\n  node: {\n    id: Types.nullable(Types.string()),\n    classes: Types.classes(),\n  },\n\n  entity: {\n    active: Types.bool(true),\n  },\n\n  object: {\n    visible: Types.bool(true),\n  },\n\n  unit: {\n    scale: Types.nullable(Types.number()),\n    fov: Types.nullable(Types.number()),\n    focus: Types.nullable(Types.number(1), true),\n  },\n\n  span: {\n    range: Types.nullable(Types.vec2(-1, 1)),\n  },\n  view: {\n    range: Types.array(Types.vec2(-1, 1), 4),\n  },\n  view3: {\n    position: Types.vec3(),\n    quaternion: Types.quat(),\n    rotation: Types.vec3(),\n    scale: Types.vec3(1, 1, 1),\n    eulerOrder: Types.swizzle(\"xyz\"),\n  },\n  view4: {\n    position: Types.vec4(),\n    scale: Types.vec4(1, 1, 1, 1),\n  },\n\n  layer: {\n    depth: Types.number(1),\n    fit: Types.fit(\"y\"),\n  },\n\n  vertex: {\n    pass: Types.vertexPass(),\n  },\n  fragment: {\n    pass: Types.fragmentPass(),\n    gamma: Types.bool(false),\n  },\n\n  transform3: {\n    position: Types.vec3(),\n    quaternion: Types.quat(),\n    rotation: Types.vec3(),\n    eulerOrder: Types.swizzle(\"xyz\"),\n    scale: Types.vec3(1, 1, 1),\n    matrix: Types.mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1),\n  },\n  transform4: {\n    position: Types.vec4(),\n    scale: Types.vec4(1, 1, 1, 1),\n    matrix: Types.mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1),\n  },\n\n  camera: {\n    proxy: Types.bool(false),\n    position: Types.nullable(Types.vec3()),\n    quaternion: Types.nullable(Types.quat()),\n    rotation: Types.nullable(Types.vec3()),\n    lookAt: Types.nullable(Types.vec3()),\n    up: Types.nullable(Types.vec3()),\n    eulerOrder: Types.swizzle(\"xyz\"),\n    fov: Types.nullable(Types.number(1)),\n  },\n  //ortho:             Types.nullable(Types.number(0))\n\n  polar: {\n    bend: Types.number(1),\n    helix: Types.number(0),\n  },\n  spherical: {\n    bend: Types.number(1),\n  },\n  stereographic: {\n    bend: Types.number(1),\n  },\n\n  interval: {\n    axis: Types.axis(),\n  },\n  area: {\n    axes: Types.swizzle([1, 2], 2),\n  },\n  volume: {\n    axes: Types.swizzle([1, 2, 3], 3),\n  },\n\n  origin: {\n    origin: Types.vec4(),\n  },\n  scale: {\n    divide: Types.number(10),\n    unit: Types.number(1),\n    base: Types.number(10),\n    mode: Types.scale(),\n    start: Types.bool(true),\n    end: Types.bool(true),\n    zero: Types.bool(true),\n    factor: Types.positive(Types.number(1)),\n    nice: Types.bool(true),\n  },\n  grid: {\n    lineX: Types.bool(true),\n    lineY: Types.bool(true),\n    crossed: Types.bool(false),\n    closedX: Types.bool(false),\n    closedY: Types.bool(false),\n  },\n  axis: {\n    detail: Types.int(1),\n    crossed: Types.bool(false),\n  },\n\n  data: {\n    data: Types.nullable(Types.data()),\n    expr: Types.nullable(Types.emitter()),\n    bind: Types.nullable(Types.func()),\n    live: Types.bool(true),\n  },\n  buffer: {\n    channels: Types.enum(4, [1, 2, 3, 4]),\n    items: Types.int(1),\n    fps: Types.nullable(Types.int(60)),\n    hurry: Types.int(5),\n    limit: Types.int(60),\n    realtime: Types.bool(false),\n    observe: Types.bool(false),\n    aligned: Types.bool(false),\n  },\n  sampler: {\n    centered: Types.bool(false),\n    padding: Types.number(0),\n  },\n  array: {\n    width: Types.nullable(Types.positive(Types.int(1), true)),\n    bufferWidth: Types.int(1),\n    history: Types.int(1),\n  },\n  matrix: {\n    width: Types.nullable(Types.positive(Types.int(1), true)),\n    height: Types.nullable(Types.positive(Types.int(1), true)),\n    history: Types.int(1),\n    bufferWidth: Types.int(1),\n    bufferHeight: Types.int(1),\n  },\n  voxel: {\n    width: Types.nullable(Types.positive(Types.int(1), true)),\n    height: Types.nullable(Types.positive(Types.int(1), true)),\n    depth: Types.nullable(Types.positive(Types.int(1), true)),\n    bufferWidth: Types.int(1),\n    bufferHeight: Types.int(1),\n    bufferDepth: Types.int(1),\n  },\n\n  resolve: {\n    expr: Types.nullable(Types.func()),\n    items: Types.int(1),\n  },\n\n  style: {\n    opacity: Types.positive(Types.number(1)),\n    color: Types.color(),\n    blending: Types.blending(),\n    zWrite: Types.bool(true),\n    zTest: Types.bool(true),\n    zIndex: Types.positive(Types.round()),\n    zBias: Types.number(0),\n    zOrder: Types.nullable(Types.int()),\n  },\n\n  geometry: {\n    points: Types.select(),\n    colors: Types.nullable(Types.select()),\n  },\n\n  point: {\n    size: Types.positive(Types.number(4)),\n    sizes: Types.nullable(Types.select()),\n\n    shape: Types.shape(),\n    optical: Types.bool(true),\n    fill: Types.bool(true),\n    depth: Types.number(1),\n  },\n\n  line: {\n    width: Types.positive(Types.number(2)),\n    depth: Types.positive(Types.number(1)),\n    join: Types.join(),\n    stroke: Types.stroke(),\n    proximity: Types.nullable(Types.number(Infinity)),\n    closed: Types.bool(false),\n  },\n  mesh: {\n    fill: Types.bool(true),\n    shaded: Types.bool(false),\n    map: Types.nullable(Types.select()),\n    lineBias: Types.number(5),\n  },\n  strip: {\n    line: Types.bool(false),\n  },\n  face: {\n    line: Types.bool(false),\n  },\n  arrow: {\n    size: Types.number(3),\n    start: Types.bool(false),\n    end: Types.bool(false),\n  },\n  ticks: {\n    normal: Types.vec3(0, 0, 1),\n    size: Types.positive(Types.number(10)),\n    epsilon: Types.positive(Types.number(0.001)),\n  },\n  attach: {\n    offset: Types.vec2(0, -20),\n    snap: Types.bool(false),\n    depth: Types.number(0),\n  },\n\n  format: {\n    digits: Types.nullable(Types.positive(Types.number(3))),\n    data: Types.nullable(Types.data()),\n    expr: Types.nullable(Types.func()),\n    live: Types.bool(true),\n  },\n  font: {\n    font: Types.font(\"sans-serif\"),\n    style: Types.string(),\n    variant: Types.string(),\n    weight: Types.string(),\n    detail: Types.number(24),\n    sdf: Types.number(5),\n  },\n  label: {\n    text: Types.select(),\n    size: Types.number(16),\n    outline: Types.number(2),\n    expand: Types.number(0),\n    background: Types.color(1, 1, 1),\n  },\n\n  overlay: {\n    opacity: Types.number(1),\n    zIndex: Types.positive(Types.round(0)),\n  },\n  dom: {\n    points: Types.select(),\n    html: Types.select(),\n    size: Types.number(16),\n    outline: Types.number(2),\n    zoom: Types.number(1),\n    color: Types.nullable(Types.color()),\n    attributes: Types.nullable(Types.object()),\n    pointerEvents: Types.bool(false),\n  },\n\n  texture: {\n    minFilter: Types.filter(\"nearest\"),\n    magFilter: Types.filter(\"nearest\"),\n    type: Types.type(\"float\"),\n  },\n\n  shader: {\n    sources: Types.nullable(Types.select()),\n    language: Types.string(\"glsl\"),\n    code: Types.string(),\n    uniforms: Types.nullable(Types.object()),\n  },\n  include: {\n    shader: Types.select(),\n  },\n\n  operator: {\n    source: Types.select(),\n  },\n  spread: {\n    unit: Types.mapping(),\n    items: Types.nullable(Types.vec4()),\n    width: Types.nullable(Types.vec4()),\n    height: Types.nullable(Types.vec4()),\n    depth: Types.nullable(Types.vec4()),\n    alignItems: Types.anchor(),\n    alignWidth: Types.anchor(),\n    alignHeight: Types.anchor(),\n    alignDepth: Types.anchor(),\n  },\n  grow: {\n    scale: Types.number(1),\n    items: Types.nullable(Types.anchor()),\n    width: Types.nullable(Types.anchor()),\n    height: Types.nullable(Types.anchor()),\n    depth: Types.nullable(Types.anchor()),\n  },\n  split: {\n    order: Types.transpose(\"wxyz\"),\n    axis: Types.nullable(Types.axis()),\n    length: Types.int(1),\n    overlap: Types.int(0),\n  },\n  join: {\n    order: Types.transpose(\"wxyz\"),\n    axis: Types.nullable(Types.axis()),\n    overlap: Types.int(0),\n  },\n  swizzle: {\n    order: Types.swizzle(),\n  },\n  transpose: {\n    order: Types.transpose(),\n  },\n  repeat: {\n    items: Types.number(1),\n    width: Types.number(1),\n    height: Types.number(1),\n    depth: Types.number(1),\n  },\n  slice: {\n    items: Types.nullable(Types.vec2()),\n    width: Types.nullable(Types.vec2()),\n    height: Types.nullable(Types.vec2()),\n    depth: Types.nullable(Types.vec2()),\n  },\n  lerp: {\n    size: Types.mapping(\"absolute\"),\n    items: Types.nullable(Types.number()),\n    width: Types.nullable(Types.number()),\n    height: Types.nullable(Types.number()),\n    depth: Types.nullable(Types.number()),\n  },\n  subdivide: {\n    items: Types.nullable(Types.positive(Types.int(), true)),\n    width: Types.nullable(Types.positive(Types.int(), true)),\n    height: Types.nullable(Types.positive(Types.int(), true)),\n    depth: Types.nullable(Types.positive(Types.int(), true)),\n    bevel: Types.number(1),\n    lerp: Types.bool(true),\n  },\n  resample: {\n    indices: Types.number(4),\n    channels: Types.number(4),\n    sample: Types.mapping(),\n    size: Types.mapping(\"absolute\"),\n    items: Types.nullable(Types.number()),\n    width: Types.nullable(Types.number()),\n    height: Types.nullable(Types.number()),\n    depth: Types.nullable(Types.number()),\n  },\n  readback: {\n    type: Types.type(\"float\"),\n    expr: Types.nullable(Types.func()),\n    data: Types.data(),\n    channels: Types.enum(4, [1, 2, 3, 4]),\n    items: Types.nullable(Types.int()),\n    width: Types.nullable(Types.int()),\n    height: Types.nullable(Types.int()),\n    depth: Types.nullable(Types.int()),\n  },\n  root: {\n    speed: Types.number(1),\n    camera: Types.select(\"[camera]\"),\n  },\n  inherit: {\n    source: Types.select(),\n    traits: Types.array(Types.string()),\n  },\n\n  rtt: {\n    size: Types.mapping(\"absolute\"),\n    width: Types.nullable(Types.number()),\n    height: Types.nullable(Types.number()),\n    history: Types.int(1),\n  },\n  compose: {\n    alpha: Types.bool(false),\n  },\n\n  present: {\n    index: Types.int(1),\n    directed: Types.bool(true),\n    length: Types.number(0),\n  },\n  slide: {\n    order: Types.nullable(Types.int(0)),\n    steps: Types.number(1),\n    early: Types.int(0),\n    late: Types.int(0),\n    from: Types.nullable(Types.int(0)),\n    to: Types.nullable(Types.int(1)),\n  },\n\n  transition: {\n    stagger: Types.vec4(),\n    enter: Types.nullable(Types.number(1)),\n    exit: Types.nullable(Types.number(1)),\n    delay: Types.number(0),\n    delayEnter: Types.nullable(Types.number(0)),\n    delayExit: Types.nullable(Types.number(0)),\n    duration: Types.number(0.3),\n    durationEnter: Types.nullable(Types.number(0)),\n    durationExit: Types.nullable(Types.number(0)),\n  },\n  move: {\n    from: Types.vec4(),\n    to: Types.vec4(),\n  },\n\n  seek: {\n    seek: Types.nullable(Types.number(0)),\n  },\n  track: {\n    target: Types.select(),\n    script: Types.object({}),\n    ease: Types.ease(\"cosine\"),\n  },\n  trigger: {\n    trigger: Types.nullable(Types.int(1), true),\n  },\n  step: {\n    playback: Types.ease(\"linear\"),\n    stops: Types.nullable(Types.array(Types.number())),\n    delay: Types.number(0),\n    duration: Types.number(0.3),\n    pace: Types.number(0),\n    speed: Types.number(1),\n    rewind: Types.number(2),\n    skip: Types.bool(true),\n    realtime: Types.bool(false),\n  },\n  play: {\n    delay: Types.number(0),\n    pace: Types.number(1),\n    speed: Types.number(1),\n    from: Types.number(0),\n    to: Types.number(Infinity),\n    realtime: Types.bool(false),\n    loop: Types.bool(false),\n  },\n  now: {\n    now: Types.nullable(Types.timestamp()),\n    seek: Types.nullable(Types.number(0)),\n    pace: Types.number(1),\n    speed: Types.number(1),\n  },\n};\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS202: Simplify dynamic range loops\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n/*\n Generate equally spaced ticks in a range at sensible positions.\n\n @param min/max - Minimum and maximum of range\n @param n - Desired number of ticks in range\n @param unit - Base unit of scale (e.g. 1 or π).\n @param scale - Division scale (e.g. 2 = binary division, or 10 = decimal division).\n @param bias - Integer to bias divisions one or more levels up or down (to create nested scales)\n @param start - Whether to include a tick at the start\n @param end - Whether to include a tick at the end\n @param zero - Whether to include zero as a tick\n @param nice - Whether to round to a more reasonable interval\n*/\n\nexport const linear = function (\n  min,\n  max,\n  n,\n  unit,\n  base,\n  factor,\n  start,\n  end,\n  zero,\n  nice\n) {\n  let ticks;\n  let i, f;\n  if (nice == null) {\n    nice = true;\n  }\n  if (!n) {\n    n = 10;\n  }\n  if (!unit) {\n    unit = 1;\n  }\n  if (!base) {\n    base = 10;\n  }\n  if (!factor) {\n    factor = 1;\n  }\n\n  // Calculate naive tick size.\n  const span = max - min;\n  const ideal = span / n;\n\n  // Unsnapped division\n  if (!nice) {\n    ticks = (() => {\n      let asc, end1;\n      const result = [];\n      for (\n        i = 0, end1 = n, asc = 0 <= end1;\n        asc ? i <= end1 : i >= end1;\n        asc ? i++ : i--\n      ) {\n        result.push(min + i * ideal);\n      }\n      return result;\n    })();\n    if (!start) {\n      ticks.shift();\n    }\n    if (!end) {\n      ticks.pop();\n    }\n    if (!zero) {\n      ticks = ticks.filter((x) => x !== 0);\n    }\n    return ticks;\n  }\n\n  // Round to the floor'd power of 'scale'\n  if (!unit) {\n    unit = 1;\n  }\n  if (!base) {\n    base = 10;\n  }\n  const ref =\n    unit * Math.pow(base, Math.floor(Math.log(ideal / unit) / Math.log(base)));\n\n  // Make derived steps at sensible factors.\n  const factors =\n    base % 2 === 0\n      ? [base / 2, 1, 1 / 2]\n      : base % 3 === 0\n      ? [base / 3, 1, 1 / 3]\n      : [1];\n  const steps = (() => {\n    const result1 = [];\n    for (f of Array.from(factors)) {\n      result1.push(ref * f);\n    }\n    return result1;\n  })();\n\n  // Find step size closest to ideal.\n  let distance = Infinity;\n  let step = steps.reduce(function (ref, step) {\n    f = step / ideal;\n    const d = Math.max(f, 1 / f);\n\n    if (d < distance) {\n      distance = d;\n      return step;\n    } else {\n      return ref;\n    }\n  }, ref);\n\n  // Scale final step\n  step *= factor;\n\n  // Renormalize min/max onto aligned steps.\n  min = Math.ceil(min / step + +!start) * step;\n  max = (Math.floor(max / step) - +!end) * step;\n  n = Math.ceil((max - min) / step);\n\n  // Generate equally spaced ticks\n  ticks = (() => {\n    let asc1, end2;\n    const result2 = [];\n    for (\n      i = 0, end2 = n, asc1 = 0 <= end2;\n      asc1 ? i <= end2 : i >= end2;\n      asc1 ? i++ : i--\n    ) {\n      result2.push(min + i * step);\n    }\n    return result2;\n  })();\n  if (!zero) {\n    ticks = ticks.filter((x) => x !== 0);\n  }\n  return ticks;\n};\n\n/*\n Generate logarithmically spaced ticks in a range at sensible positions.\n*/\n\nexport const log = function (\n  _min,\n  _max,\n  _n,\n  _unit,\n  _base,\n  _bias,\n  _start,\n  _end,\n  _zero,\n  _nice\n) {\n  throw new Error(\"Log ticks not yet implemented.\");\n};\n\nconst LINEAR = 0;\nconst LOG = 1;\n\nexport const make = function (\n  type,\n  min,\n  max,\n  n,\n  unit,\n  base,\n  bias,\n  start,\n  end,\n  zero,\n  nice\n) {\n  switch (type) {\n    case LINEAR:\n      return linear(min, max, n, unit, base, bias, start, end, zero, nice);\n    case LOG:\n      return log(min, max, n, unit, base, bias, start, end, zero, nice);\n  }\n};\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining\n * DS104: Avoid inline assignments\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UGLSL from \"../../util/glsl.js\";\nimport * as UTicks from \"../../util/ticks.js\";\n\nimport { NormalBlending } from \"three/src/constants.js\";\nimport { Vector2 } from \"three/src/math/Vector2.js\";\nimport { Vector3 } from \"three/src/math/Vector3.js\";\n/*\n\nThis is the general dumping ground for trait behavior.\n\nHelpers are auto-attached to primitives that have the matching trait\n\n*/\n\nconst helpers = {\n  bind: {\n    make(slots) {\n      if (this.bind == null) {\n        this.bind = {};\n      }\n      if (this.bound == null) {\n        this.bound = [];\n      }\n\n      // Fetch attached objects and bind to them\n      // Attach rebuild watcher for DOM changes to bound nodes\n      for (const slot of Array.from(slots)) {\n        let { callback } = slot;\n        const { to, trait, optional, unique, multiple } = slot;\n\n        if (callback == null) {\n          callback = this.rebuild;\n        }\n        const name = to.split(/\\./g).pop();\n        const selector = this._get(to);\n\n        // Find by selector\n        let source = null;\n        if (selector != null) {\n          let start = this;\n          let done = false;\n          while (!done) {\n            // Keep scanning back until a new node is found\n            start = source = this._attach(\n              selector,\n              trait,\n              callback,\n              this,\n              start,\n              optional,\n              multiple\n            );\n            const isUnique =\n              unique && (source == null || this.bound.indexOf(source) < 0);\n            done = multiple || optional || !unique || isUnique;\n          }\n        }\n\n        // Monitor source for reallocation / resize\n        if (source != null) {\n          if (this.resize != null) {\n            this._listen(source, \"source.resize\", this.resize);\n          }\n          if (callback) {\n            this._listen(source, \"source.rebuild\", callback);\n          }\n\n          if (multiple) {\n            for (const s of Array.from(source)) {\n              this.bound.push(s);\n            }\n          } else {\n            this.bound.push(source);\n          }\n        }\n\n        this.bind[name] = source;\n      }\n\n      return null;\n    },\n\n    unmake() {\n      if (!this.bind) {\n        return;\n      }\n      delete this.bind;\n      return delete this.bound;\n    },\n  },\n\n  span: {\n    make() {\n      // Look up nearest view to inherit from\n      // Monitor size changes\n      this.spanView = this._inherit(\"view\");\n      return this._listen(\"view\", \"view.range\", () =>\n        this.trigger({ type: \"span.range\" })\n      );\n    },\n\n    unmake() {\n      return delete this.spanView;\n    },\n\n    get: (function () {\n      const def = new Vector2(-1, 1);\n\n      return function (prefix, dimension) {\n        // Return literal range\n        let left;\n        const range = this._get(prefix + \"span.range\");\n        if (range != null) {\n          return range;\n        }\n\n        // Inherit from view\n        return (left =\n          this.spanView != null ? this.spanView.axis(dimension) : undefined) !=\n          null\n          ? left\n          : def;\n      };\n    })(),\n  },\n\n  scale: {\n    // Divisions to allocate on scale\n    divide(prefix) {\n      const divide = this._get(prefix + \"scale.divide\");\n      const factor = this._get(prefix + \"scale.factor\");\n      return Math.round((divide * 2.5) / factor);\n    },\n\n    // Generate ticks on scale\n    generate(prefix, buffer, min, max) {\n      const mode = this._get(prefix + \"scale.mode\");\n      const divide = this._get(prefix + \"scale.divide\");\n      const unit = this._get(prefix + \"scale.unit\");\n      const base = this._get(prefix + \"scale.base\");\n      const factor = this._get(prefix + \"scale.factor\");\n      const start = this._get(prefix + \"scale.start\");\n      const end = this._get(prefix + \"scale.end\");\n      const zero = this._get(prefix + \"scale.zero\");\n      const nice = this._get(prefix + \"scale.nice\");\n\n      const ticks = UTicks.make(\n        mode,\n        min,\n        max,\n        divide,\n        unit,\n        base,\n        factor,\n        start,\n        end,\n        zero,\n        nice\n      );\n      buffer.copy(ticks);\n      return ticks;\n    },\n  },\n\n  style: {\n    // Return bound style uniforms\n    uniforms() {\n      return {\n        styleColor: this.node.attributes[\"style.color\"],\n        styleOpacity: this.node.attributes[\"style.opacity\"],\n        styleZBias: this.node.attributes[\"style.zBias\"],\n        styleZIndex: this.node.attributes[\"style.zIndex\"],\n      };\n    },\n  },\n\n  arrow: {\n    // Return bound arrow style uniforms\n    uniforms() {\n      const { start } = this.props;\n      const { end } = this.props;\n\n      const space = this._attributes.make(\n        this._types.number(1.25 / (start + end))\n      );\n      const style = this._attributes.make(this._types.vec2(+start, +end));\n      const size = this.node.attributes[\"arrow.size\"];\n\n      return {\n        clipStyle: style,\n        clipRange: size,\n        clipSpace: space,\n\n        arrowSpace: space,\n        arrowSize: size,\n      };\n    },\n  },\n\n  point: {\n    // Return bound point style uniforms\n    uniforms() {\n      return {\n        pointSize: this.node.attributes[\"point.size\"],\n        pointDepth: this.node.attributes[\"point.depth\"],\n      };\n    },\n  },\n\n  line: {\n    // Return bound line style uniforms\n    uniforms() {\n      return {\n        lineWidth: this.node.attributes[\"line.width\"],\n        lineDepth: this.node.attributes[\"line.depth\"],\n        lineProximity: this.node.attributes[\"line.proximity\"],\n      };\n    },\n  },\n\n  surface: {\n    // Return bound surface style uniforms\n    uniforms() {\n      return {};\n    },\n  },\n\n  shade: {\n    pipeline(shader) {\n      if (!this._inherit(\"fragment\")) {\n        return shader;\n      }\n      if (shader == null) {\n        shader = this._shaders.shader();\n      }\n      for (let pass = 0; pass <= 2; pass++) {\n        shader = __guard__(this._inherit(\"fragment\"), (x) =>\n          x.fragment(shader, pass)\n        );\n      }\n      shader.pipe(\"fragment.map.rgba\");\n      return shader;\n    },\n\n    map(shader) {\n      if (!shader) {\n        return shader;\n      }\n      return (shader = this._shaders\n        .shader()\n        .pipe(\"mesh.map.uvwo\")\n        .pipe(shader));\n    },\n  },\n\n  position: {\n    pipeline(shader) {\n      if (!this._inherit(\"vertex\")) {\n        return shader;\n      }\n      if (shader == null) {\n        shader = this._shaders.shader();\n      }\n      for (let pass = 0; pass <= 3; pass++) {\n        shader = __guard__(this._inherit(\"vertex\"), (x) =>\n          x.vertex(shader, pass)\n        );\n      }\n      return shader;\n    },\n\n    swizzle(shader, order) {\n      if (shader) {\n        return this._shaders\n          .shader()\n          .pipe(UGLSL.swizzleVec4(order))\n          .pipe(shader);\n      }\n    },\n\n    swizzle2(shader, order1, order2) {\n      if (shader) {\n        return this._shaders\n          .shader()\n          .split()\n          .pipe(UGLSL.swizzleVec4(order1))\n          .next()\n          .pipe(UGLSL.swizzleVec4(order2))\n          .join()\n          .pipe(shader);\n      }\n    },\n  },\n\n  visible: {\n    make() {\n      const e = { type: \"visible.change\" };\n\n      let visible = null;\n      this.setVisible = function (vis) {\n        if (vis != null) {\n          visible = vis;\n        }\n        return onVisible();\n      };\n\n      const onVisible = () => {\n        let left;\n        const last = this.isVisible;\n        let self =\n          (left = visible != null ? visible : this._get(\"object.visible\")) !=\n          null\n            ? left\n            : true;\n        if (visibleParent != null) {\n          if (self) {\n            self = visibleParent.isVisible;\n          }\n        }\n        this.isVisible = self;\n        if (last !== this.isVisible) {\n          return this.trigger(e);\n        }\n      };\n\n      const visibleParent = this._inherit(\"visible\");\n      if (visibleParent) {\n        this._listen(visibleParent, \"visible.change\", onVisible);\n      }\n      if (this.is(\"object\")) {\n        this._listen(this.node, \"change:object\", onVisible);\n      }\n\n      return onVisible();\n    },\n\n    unmake() {\n      return delete this.isVisible;\n    },\n  },\n\n  active: {\n    make() {\n      const e = { type: \"active.change\" };\n\n      let active = null;\n      this.setActive = function (act) {\n        if (act != null) {\n          active = act;\n        }\n        return onActive();\n      };\n\n      const onActive = () => {\n        let left;\n        const last = this.isActive;\n        let self =\n          (left = active != null ? active : this._get(\"entity.active\")) != null\n            ? left\n            : true;\n        if (activeParent != null) {\n          if (self) {\n            self = activeParent.isActive;\n          }\n        }\n        this.isActive = self;\n        if (last !== this.isActive) {\n          return this.trigger(e);\n        }\n      };\n\n      const activeParent = this._inherit(\"active\");\n      if (activeParent) {\n        this._listen(activeParent, \"active.change\", onActive);\n      }\n      if (this.is(\"entity\")) {\n        this._listen(this.node, \"change:entity\", onActive);\n      }\n\n      return onActive();\n    },\n\n    unmake() {\n      return delete this.isActive;\n    },\n  },\n\n  object: {\n    // Generic 3D renderable wrapper, handles the fiddly Three.js bits that require a 'style recalculation'.\n    //\n    // Pass renderables to nearest root for rendering\n    // Track visibility from parent and notify children\n    // Track blends / transparency for three.js materials\n    make(objects) {\n      // Aggregate rendered three objects for reference\n      let blending, zOrder;\n      if (objects == null) {\n        objects = [];\n      }\n      this.objects = objects;\n      this.renders = this.objects.reduce((a, b) => a.concat(b.renders), []);\n\n      const objectScene = this._inherit(\"scene\");\n\n      let opacity = (blending = zOrder = null);\n\n      const hasStyle = Array.from(this.traits).includes(\"style\");\n      opacity = 1;\n      blending = NormalBlending;\n      let zWrite = true;\n      let zTest = true;\n\n      if (hasStyle) {\n        ({ opacity } = this.props);\n        ({ blending } = this.props);\n        ({ zOrder } = this.props);\n        ({ zWrite } = this.props);\n        ({ zTest } = this.props);\n      }\n\n      const onChange = (event) => {\n        const { changed } = event;\n        let refresh = null;\n        if (changed[\"style.opacity\"]) {\n          refresh = opacity = this.props.opacity;\n        }\n        if (changed[\"style.blending\"]) {\n          refresh = blending = this.props.blending;\n        }\n        if (changed[\"style.zOrder\"]) {\n          refresh = zOrder = this.props.zOrder;\n        }\n        if (changed[\"style.zWrite\"]) {\n          refresh = zWrite = this.props.zWrite;\n        }\n        if (changed[\"style.zTest\"]) {\n          refresh = zTest = this.props.zTest;\n        }\n        if (refresh != null) {\n          return onVisible();\n        }\n      };\n\n      const onVisible = () => {\n        const order = zOrder != null ? -zOrder : this.node.order;\n\n        const visible =\n          (this.isVisible != null ? this.isVisible : true) && opacity > 0;\n\n        if (visible) {\n          if (hasStyle) {\n            return (() => {\n              const result = [];\n              for (const o of Array.from(this.objects)) {\n                o.show(opacity < 1, blending, order);\n                result.push(o.depth(zWrite, zTest));\n              }\n              return result;\n            })();\n          } else {\n            return (() => {\n              const result1 = [];\n              for (const o of Array.from(this.objects)) {\n                result1.push(o.show(true, blending, order));\n              }\n              return result1;\n            })();\n          }\n        } else {\n          return (() => {\n            const result2 = [];\n            for (const o of Array.from(this.objects)) {\n              result2.push(o.hide());\n            }\n            return result2;\n          })();\n        }\n      };\n\n      this._listen(this.node, \"change:style\", onChange);\n      this._listen(this.node, \"reindex\", onVisible);\n      this._listen(this, \"visible.change\", onVisible);\n\n      for (const object of Array.from(this.objects)) {\n        objectScene.adopt(object);\n      }\n      return onVisible();\n    },\n\n    unmake(dispose) {\n      let object;\n      if (dispose == null) {\n        dispose = true;\n      }\n      if (!this.objects) {\n        return;\n      }\n\n      const objectScene = this._inherit(\"scene\");\n      for (object of Array.from(this.objects)) {\n        objectScene.unadopt(object);\n      }\n      if (dispose) {\n        return (() => {\n          const result = [];\n          for (object of Array.from(this.objects)) {\n            result.push(object.dispose());\n          }\n          return result;\n        })();\n      }\n    },\n\n    mask() {\n      let mask, shader;\n      if (!(mask = this._inherit(\"mask\"))) {\n        return;\n      }\n      return (shader = mask.mask(shader));\n    },\n  },\n\n  unit: {\n    make() {\n      let focusDepth,\n        pixelRatio,\n        pixelUnit,\n        renderAspect,\n        renderHeight,\n        renderOdd,\n        renderScale,\n        renderScaleInv,\n        renderWidth,\n        viewHeight,\n        viewWidth,\n        worldUnit;\n      let π = Math.PI;\n\n      this.unitUniforms = {\n        renderScaleInv: (renderScaleInv = this._attributes.make(\n          this._types.number(1)\n        )),\n        renderScale: (renderScale = this._attributes.make(\n          this._types.number(1)\n        )),\n        renderAspect: (renderAspect = this._attributes.make(\n          this._types.number(1)\n        )),\n        renderWidth: (renderWidth = this._attributes.make(\n          this._types.number(0)\n        )),\n        renderHeight: (renderHeight = this._attributes.make(\n          this._types.number(0)\n        )),\n        viewWidth: (viewWidth = this._attributes.make(this._types.number(0))),\n        viewHeight: (viewHeight = this._attributes.make(this._types.number(0))),\n        pixelRatio: (pixelRatio = this._attributes.make(this._types.number(1))),\n        pixelUnit: (pixelUnit = this._attributes.make(this._types.number(1))),\n        worldUnit: (worldUnit = this._attributes.make(this._types.number(1))),\n        focusDepth: (focusDepth = this._attributes.make(this._types.number(1))),\n        renderOdd: (renderOdd = this._attributes.make(this._types.vec2())),\n      };\n\n      const top = new Vector3();\n      const bottom = new Vector3();\n\n      const handler = () => {\n        let camera, size;\n        if ((size = root != null ? root.getSize() : undefined) == null) {\n          return;\n        }\n\n        π = Math.PI;\n\n        const { scale } = this.props;\n        const { fov } = this.props;\n        const focus =\n          this.props.focus != null\n            ? this.props.focus\n            : this.inherit(\"unit\").props.focus;\n\n        const isAbsolute = scale === null;\n\n        // Measure live FOV to be able to accurately predict anti-aliasing in\n        // perspective\n        let measure = 1;\n        if ((camera = root != null ? root.getCamera() : undefined)) {\n          const m = camera.projectionMatrix;\n\n          // Measure top to bottom\n          top.set(0, -0.5, 1).applyMatrix4(m);\n          bottom.set(0, 0.5, 1).applyMatrix4(m);\n          top.sub(bottom);\n          measure = top.y;\n        }\n\n        // Calculate device pixel ratio\n        const dpr = size.renderHeight / size.viewHeight;\n\n        // Calculate correction for fixed on-screen size regardless of FOV\n        const fovtan = fov != null ? measure * Math.tan((fov * π) / 360) : 1;\n\n        // Calculate device pixels per virtual pixel\n        const pixel = isAbsolute ? dpr : (size.renderHeight / scale) * fovtan;\n\n        // Calculate device pixels per world unit\n        const rscale = (size.renderHeight * measure) / 2;\n\n        // Calculate world units per virtual pixel\n        const world = pixel / rscale;\n\n        viewWidth.value = size.viewWidth;\n        viewHeight.value = size.viewHeight;\n        renderWidth.value = size.renderWidth;\n        renderHeight.value = size.renderHeight;\n        renderAspect.value = size.aspect;\n        renderScale.value = rscale;\n        renderScaleInv.value = 1 / rscale;\n        pixelRatio.value = dpr;\n        pixelUnit.value = pixel;\n        worldUnit.value = world;\n        focusDepth.value = focus;\n\n        return renderOdd.value\n          .set(size.renderWidth % 2, size.renderHeight % 2)\n          .multiplyScalar(0.5);\n      };\n\n      //console.log 'worldUnit', world, pixel, rscale, isAbsolute\n\n      const root = this.is(\"root\") ? this : this._inherit(\"root\");\n      //@_listen root, 'root.resize', handler\n      //@_listen root, 'root.camera', handler\n      //@_listen @node, 'change:unit', handler\n      this._listen(root, \"root.update\", handler);\n\n      return handler();\n    },\n\n    unmake() {\n      return delete this.unitUniforms;\n    },\n\n    get() {\n      const u = {};\n      for (const k in this.unitUniforms) {\n        const v = this.unitUniforms[k];\n        u[k] = v.value;\n      }\n      return u;\n    },\n\n    uniforms() {\n      return this.unitUniforms;\n    },\n  },\n};\n\nexport const Helpers = function (object, traits) {\n  const h = {};\n  for (const trait of Array.from(traits)) {\n    let methods;\n    if (!(methods = helpers[trait])) {\n      continue;\n    }\n\n    h[trait] = {};\n    for (const key in methods) {\n      const method = methods[key];\n      h[trait][key] = method.bind(object);\n    }\n  }\n  return h;\n};\n\nfunction __guard__(value, transform) {\n  return typeof value !== \"undefined\" && value !== null\n    ? transform(value)\n    : undefined;\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nexport class PrimitiveFactory {\n  constructor(definitions, context) {\n    this.context = context;\n    this.classes = definitions.Classes;\n    this.helpers = definitions.Helpers;\n  }\n\n  getTypes() {\n    return Object.keys(this.classes);\n  }\n\n  make(type, options, binds = null) {\n    if (options == null) {\n      options = {};\n    }\n\n    const klass = this.classes[type];\n\n    if (klass == null) {\n      throw new Error(`Unknown primitive class \\`${type}\\``);\n    }\n\n    const node = new klass.model(\n      type,\n      klass.defaults,\n      options,\n      binds,\n      klass,\n      this.context.attributes\n    );\n\n    // NOTE: keep for side effects.\n    new klass(node, this.context, this.helpers);\n    return node;\n  }\n}\n","import * as types from \"./types\";\n\nexport { PrimitiveFactory as Factory } from \"./factory.js\";\nexport * from \"./primitive.js\";\nexport const Types = types;\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nexport class Renderable {\n  constructor(renderer, shaders) {\n    this.renderer = renderer;\n    this.shaders = shaders;\n    this.gl = this.renderer.getContext();\n    if (this.uniforms == null) {\n      this.uniforms = {};\n    }\n  }\n\n  dispose() {\n    this.uniforms = null;\n  }\n\n  _adopt(uniforms) {\n    for (const key in uniforms) {\n      const value = uniforms[key];\n      this.uniforms[key] = value;\n    }\n  }\n\n  _set(uniforms) {\n    for (const key in uniforms) {\n      const value = uniforms[key];\n      if (this.uniforms[key] != null) {\n        this.uniforms[key].value = value;\n      }\n    }\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS202: Simplify dynamic range loops\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { Object3D } from \"three/src/core/Object3D.js\";\nimport { PerspectiveCamera } from \"three/src/cameras/PerspectiveCamera.js\";\nimport { Renderable } from \"./renderable.js\";\nimport { Scene as ThreeScene } from \"three/src/scenes/Scene.js\";\nimport { WebGLRenderTarget } from \"three/src/renderers/WebGLRenderTarget.js\";\n\n/*\n All MathBox renderables sit inside this root, to keep things tidy.\n*/\nclass MathBox extends Object3D {\n  constructor() {\n    super();\n    this.rotationAutoUpdate = false;\n    this.frustumCulled = false;\n    this.matrixAutoUpdate = false;\n  }\n}\n\n/*\n Holds the root and binds to a THREE.Scene\n\n Will hold objects and inject them a few at a time\n to avoid long UI blocks.\n\n Will render injected objects to a 1x1 scratch buffer to ensure availability\n*/\nexport class Scene extends Renderable {\n  constructor(renderer, shaders, options) {\n    super(renderer, shaders, options);\n    this.root = new MathBox();\n\n    if ((options != null ? options.scene : undefined) != null) {\n      this.scene = options.scene;\n    }\n    if (this.scene == null) {\n      this.scene = new ThreeScene();\n    }\n\n    this.pending = [];\n    this.async = 0;\n\n    this.scratch = new WebGLRenderTarget(1, 1);\n    this.camera = new PerspectiveCamera();\n  }\n\n  inject(scene) {\n    if (scene != null) {\n      this.scene = scene;\n    }\n    return this.scene.add(this.root);\n  }\n\n  unject() {\n    return this.scene != null ? this.scene.remove(this.root) : undefined;\n  }\n\n  add(object) {\n    if (this.async) {\n      return this.pending.push(object);\n    } else {\n      return this._add(object);\n    }\n  }\n\n  remove(object) {\n    this.pending = this.pending.filter((o) => o !== object);\n    if (object.parent != null) {\n      return this._remove(object);\n    }\n  }\n\n  _add(object) {\n    return this.root.add(object);\n  }\n\n  _remove(object) {\n    return this.root.remove(object);\n  }\n\n  dispose() {\n    if (this.root.parent != null) {\n      return this.unject();\n    }\n  }\n\n  warmup(n) {\n    return (this.async = +n || 0);\n  }\n\n  render() {\n    if (!this.pending.length) {\n      return;\n    }\n    const { children } = this.root;\n\n    // Insert up to @async children\n    const added = [];\n    for (\n      let i = 0, end = this.async, asc = 0 <= end;\n      asc ? i < end : i > end;\n      asc ? i++ : i--\n    ) {\n      const pending = this.pending.shift();\n      if (!pending) {\n        break;\n      }\n\n      // Insert new child\n      this._add(pending);\n      added.push(added);\n    }\n\n    // Remember current visibility\n    const visible = children.map(function (o) {\n      return o.visible;\n    });\n\n    // Force only this child visible\n    children.map((o) => (o.visible = !Array.from(added).includes(o)));\n\n    // Render and throw away\n    const currentTarget = this.renderer.getRenderTarget();\n    this.renderer.setRenderTarget(this.scratch);\n    this.renderer.render(this.scene, this.camera);\n    this.renderer.setRenderTarget(currentTarget);\n\n    // Restore visibility\n    return children.map((o, i) => (o.visible = visible[i]));\n  }\n\n  toJSON() {\n    return this.root.toJSON();\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nexport class RenderFactory {\n  constructor(classes, renderer, shaders) {\n    this.classes = classes;\n    this.renderer = renderer;\n    this.shaders = shaders;\n  }\n\n  getTypes() {\n    return Object.keys(this.classes);\n  }\n\n  make(type, options) {\n    return new this.classes[type](this.renderer, this.shaders, options);\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UData from \"../../util/data.js\";\nimport { Renderable } from \"../renderable.js\";\n\n/*\n * Base class for sample buffers\n */\nexport class Buffer extends Renderable {\n  constructor(renderer, shaders, options) {\n    super(renderer, shaders);\n\n    if (this.items == null) {\n      this.items = options.items || 1;\n    }\n    if (this.samples == null) {\n      this.samples = options.samples || 1;\n    }\n    if (this.channels == null) {\n      this.channels = options.channels || 4;\n    }\n    if (this.callback == null) {\n      this.callback = options.callback || function () {};\n    }\n  }\n\n  dispose() {\n    return super.dispose();\n  }\n\n  update() {\n    const n = this.fill();\n    this.write(n);\n    return n;\n  }\n\n  setActive(_i, _j, _k, _l) {}\n\n  setCallback(callback) {\n    this.callback = callback;\n  }\n\n  write() {}\n  fill() {}\n  generate(data) {\n    return UData.getStreamer(data, this.samples, this.channels, this.items);\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as CONST from \"three/src/constants.js\";\nimport * as UThree from \"../../../util/three.js\";\n\nimport { Texture } from \"three/src/textures/Texture.js\";\nimport { Vector2 } from \"three/src/math/Vector2.js\";\n\n/*\nManually allocated GL texture for data streaming.\n\nAllows partial updates via subImage.\n*/\nexport class DataTexture {\n  constructor(renderer, width, height, channels, options) {\n    this.renderer = renderer;\n    this.width = width;\n    this.height = height;\n    this.channels = channels;\n    this.n = this.width * this.height * this.channels;\n\n    const gl = this.renderer.getContext();\n    this.gl = gl;\n    const minFilter =\n      (options != null ? options.minFilter : undefined) != null\n        ? options != null\n          ? options.minFilter\n          : undefined\n        : CONST.NearestFilter;\n    const magFilter =\n      (options != null ? options.magFilter : undefined) != null\n        ? options != null\n          ? options.magFilter\n          : undefined\n        : CONST.NearestFilter;\n    const type =\n      (options != null ? options.type : undefined) != null\n        ? options != null\n          ? options.type\n          : undefined\n        : CONST.FloatType;\n\n    this.minFilter = UThree.paramToGL(gl, minFilter);\n    this.magFilter = UThree.paramToGL(gl, magFilter);\n    this.type = UThree.paramToGL(gl, type);\n    this.ctor = UThree.paramToArrayStorage(type);\n\n    this.build(options);\n  }\n\n  build(options) {\n    const { gl } = this;\n    const state = this.renderer.state;\n\n    // Make GL texture\n    this.texture = gl.createTexture();\n    this.format = [null, gl.LUMINANCE, gl.LUMINANCE_ALPHA, gl.RGB, gl.RGBA][\n      this.channels\n    ];\n    this.format3 = [\n      null,\n      CONST.LuminanceFormat,\n      CONST.LuminanceAlphaFormat,\n      CONST.RGBFormat,\n      CONST.RGBAFormat,\n    ][this.channels];\n\n    state.bindTexture(gl.TEXTURE_2D, this.texture);\n\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, this.minFilter);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, this.magFilter);\n\n    // Attach empty data\n    this.data = new this.ctor(this.n);\n    gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);\n    gl.texImage2D(\n      gl.TEXTURE_2D,\n      0,\n      this.format,\n      this.width,\n      this.height,\n      0,\n      this.format,\n      this.type,\n      this.data\n    );\n\n    // Make wrapper texture object.\n    this.textureObject = new Texture(\n      new Image(),\n      CONST.UVMapping,\n      CONST.ClampToEdgeWrapping,\n      CONST.ClampToEdgeWrapping,\n      options != null ? options.minFilter : undefined,\n      options != null ? options.magFilter : undefined\n    );\n\n    // Pre-init texture to trick WebGLRenderer\n    this.textureProperties = this.renderer.properties.get(this.textureObject);\n    this.textureProperties.__webglInit = true;\n    this.textureProperties.__webglTexture = this.texture;\n\n    this.textureObject.format = this.format3;\n    this.textureObject.type = CONST.FloatType;\n    this.textureObject.unpackAlignment = 1;\n    this.textureObject.flipY = false;\n    this.textureObject.generateMipmaps = false;\n\n    // Create uniforms\n    this.uniforms = {\n      dataResolution: {\n        type: \"v2\",\n        value: new Vector2(1 / this.width, 1 / this.height),\n      },\n      dataTexture: {\n        type: \"t\",\n        value: this.textureObject,\n      },\n    };\n  }\n\n  write(data, x, y, w, h) {\n    const { gl } = this;\n    const state = this.renderer.state;\n\n    // Write to rectangle\n    state.bindTexture(gl.TEXTURE_2D, this.texture);\n    gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);\n    gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);\n    gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);\n    return gl.texSubImage2D(\n      gl.TEXTURE_2D,\n      0,\n      x,\n      y,\n      w,\n      h,\n      this.format,\n      this.type,\n      data\n    );\n  }\n\n  dispose() {\n    this.gl.deleteTexture(this.texture);\n\n    this.textureProperties.__webglInit = false;\n    this.textureProperties.__webglTexture = null;\n    this.textureProperties = null;\n    return (this.textureObject = this.texture = null);\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS202: Simplify dynamic range loops\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UData from \"../../util/data.js\";\nimport * as UGLSL from \"../../util/glsl.js\";\n\nimport { Buffer } from \"./buffer.js\";\nimport { DataTexture } from \"./texture/datatexture.js\";\nimport { Vector2 } from \"three/src/math/Vector2.js\";\n\n/*\n * Data buffer on the GPU\n * - Stores samples (1-n) x items (1-n) x channels (1-4)\n * - Provides generic sampler shader\n * - Provides generic copy/write handler\n * => specialized into Array/Matrix/VoxelBuffer\n */\nexport class DataBuffer extends Buffer {\n  constructor(renderer, shaders, options, build) {\n    if (build == null) {\n      build = true;\n    }\n    const width = options.width || 1;\n    const height = options.height || 1;\n    const depth = options.depth || 1;\n    const samples = width * height * depth;\n\n    if (!options.samples) {\n      options.samples = samples;\n    }\n\n    super(renderer, shaders, options);\n\n    this.width = width;\n    this.height = height;\n    this.depth = depth;\n    if (this.samples == null) {\n      this.samples = samples;\n    }\n\n    if (build) {\n      this.build(options);\n    }\n  }\n\n  shader(shader, indices) {\n    if (indices == null) {\n      indices = 4;\n    }\n    if (this.items > 1 || this.depth > 1) {\n      if (indices !== 4) {\n        shader.pipe(UGLSL.extendVec(indices, 4));\n      }\n      shader.pipe(\"map.xyzw.texture\", this.uniforms);\n    } else {\n      if (indices !== 2) {\n        shader.pipe(UGLSL.truncateVec(indices, 2));\n      }\n    }\n\n    const wrap = this.wrap ? \".wrap\" : \"\";\n    shader.pipe(`map.2d.data${wrap}`, this.uniforms);\n    shader.pipe(\"sample.2d\", this.uniforms);\n    if (this.channels < 4) {\n      shader.pipe(\n        UGLSL.swizzleVec4([\"0000\", \"x000\", \"xw00\", \"xyz0\"][this.channels])\n      );\n    }\n    return shader;\n  }\n\n  build(options) {\n    this.data = new Float32Array(this.samples * this.channels * this.items);\n    this.texture = new DataTexture(\n      this.renderer,\n      this.items * this.width,\n      this.height * this.depth,\n      this.channels,\n      options\n    );\n    this.filled = 0;\n    this.used = 0;\n\n    this._adopt(this.texture.uniforms);\n    this._adopt({\n      dataPointer: { type: \"v2\", value: new Vector2() },\n      textureItems: { type: \"f\", value: this.items },\n      textureHeight: { type: \"f\", value: this.height },\n    });\n\n    this.dataPointer = this.uniforms.dataPointer.value;\n    this.streamer = this.generate(this.data);\n  }\n\n  dispose() {\n    this.data = null;\n    this.texture.dispose();\n    return super.dispose();\n  }\n\n  getFilled() {\n    return this.filled;\n  }\n  setCallback(callback) {\n    this.callback = callback;\n    return (this.filled = 0);\n  }\n\n  copy(data) {\n    const n = Math.min(data.length, this.samples * this.channels * this.items);\n    const d = this.data;\n    for (\n      let i = 0, end = n, asc = 0 <= end;\n      asc ? i < end : i > end;\n      asc ? i++ : i--\n    ) {\n      d[i] = data[i];\n    }\n    this.write(Math.ceil(n / this.channels / this.items));\n  }\n\n  write(n) {\n    if (n == null) {\n      n = this.samples;\n    }\n    let height = n / this.width;\n    n *= this.items;\n    const width = height < 1 ? n : this.items * this.width;\n    height = Math.ceil(height);\n\n    this.texture.write(this.data, 0, 0, width, height);\n    this.dataPointer.set(0.5, 0.5);\n\n    this.filled = 1;\n    this.used = n;\n  }\n\n  through(callback, target) {\n    let dst, src;\n    const { consume, done } = (src = this.streamer);\n    const { emit } = (dst = target.streamer);\n\n    let i = 0;\n\n    let pipe = () => consume((x, y, z, w) => callback(emit, x, y, z, w, i));\n    pipe = UData.repeatCall(pipe, this.items);\n\n    return () => {\n      src.reset();\n      dst.reset();\n      const limit = this.used;\n      i = 0;\n      while (!done() && i < limit) {\n        pipe();\n        i++;\n      }\n\n      return src.count();\n    };\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS202: Simplify dynamic range loops\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { BufferGeometry } from \"three/src/core/BufferGeometry.js\";\n\nexport class Geometry extends BufferGeometry {\n  constructor() {\n    super();\n    new BufferGeometry(this);\n    if (this.uniforms == null) {\n      this.uniforms = {};\n    }\n    if (this.groups == null) {\n      this.groups = [];\n    }\n  }\n\n  _reduce(dims, maxs) {\n    let multiple = false;\n    for (let i = 0; i < dims.length; i++) {\n      const dim = dims[i];\n      const max = maxs[i];\n      if (multiple) {\n        dims[i] = max;\n      }\n      if (dim > 1) {\n        multiple = true;\n      }\n    }\n\n    return dims.reduce((a, b) => a * b);\n  }\n\n  _emitter(name) {\n    const attribute =\n      name == \"index\" ? this.getIndex() : this.getAttribute(name);\n    const dimensions = attribute.itemSize;\n    const { array } = attribute;\n\n    let offset = 0;\n    const one = function (a) {\n      array[offset++] = a;\n    };\n    const two = function (a, b) {\n      array[offset++] = a;\n      array[offset++] = b;\n    };\n    const three = function (a, b, c) {\n      array[offset++] = a;\n      array[offset++] = b;\n      array[offset++] = c;\n    };\n    const four = function (a, b, c, d) {\n      array[offset++] = a;\n      array[offset++] = b;\n      array[offset++] = c;\n      array[offset++] = d;\n    };\n\n    return [null, one, two, three, four][dimensions];\n  }\n\n  _finalize() {\n    return;\n  }\n\n  _offsets(offsets) {\n    this.groups = offsets;\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { Geometry } from \"./geometry.js\";\nimport { Vector4 } from \"three/src/math/Vector4.js\";\n\n// Instanced geometry that is clippable along 4 dimensions\nexport class ClipGeometry extends Geometry {\n  _clipUniforms() {\n    this.geometryClip = new Vector4(1e10, 1e10, 1e10, 1e10);\n    this.geometryResolution = new Vector4();\n    this.mapSize = new Vector4();\n\n    if (this.uniforms == null) {\n      this.uniforms = {};\n    }\n    this.uniforms.geometryClip = {\n      type: \"v4\",\n      value: this.geometryClip,\n    };\n    this.uniforms.geometryResolution = {\n      type: \"v4\",\n      value: this.geometryResolution,\n    };\n    return (this.uniforms.mapSize = {\n      type: \"v4\",\n      value: this.mapSize,\n    });\n  }\n\n  _clipGeometry(width, height, depth, items) {\n    const c = (x) => Math.max(0, x - 1);\n    const r = (x) => 1 / Math.max(1, x - 1);\n\n    this.geometryClip.set(c(width), c(height), c(depth), c(items));\n    return this.geometryResolution.set(r(width), r(height), r(depth), r(items));\n  }\n\n  _clipMap(mapWidth, mapHeight, mapDepth, mapItems) {\n    return this.mapSize.set(mapWidth, mapHeight, mapDepth, mapItems);\n  }\n\n  _clipOffsets(\n    factor,\n    width,\n    height,\n    depth,\n    items,\n    _width,\n    _height,\n    _depth,\n    _items\n  ) {\n    const dims = [depth, height, width, items];\n    const maxs = [_depth, _height, _width, _items];\n    const elements = this._reduce(dims, maxs);\n\n    return this._offsets([\n      {\n        start: 0,\n        count: elements * factor,\n        materialIndex: 0,\n      },\n    ]);\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS202: Simplify dynamic range loops\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { BufferAttribute } from \"three/src/core/BufferAttribute.js\";\nimport { ClipGeometry } from \"./clipgeometry.js\";\n\n/*\nCones to attach as arrowheads on line strips\n\n.....> .....> .....> .....>\n\n.....> .....> .....> .....>\n\n.....> .....> .....> .....>\n*/\n\nexport class ArrowGeometry extends ClipGeometry {\n  constructor(options) {\n    let anchor, flip, k, layers, ribbons, samples, sides, strips;\n    let asc, end;\n    super(options);\n\n    this._clipUniforms();\n\n    this.sides = sides = +options.sides || 12;\n    this.samples = samples = +options.samples || 2;\n    this.strips = strips = +options.strips || 1;\n    this.ribbons = ribbons = +options.ribbons || 1;\n    this.layers = layers = +options.layers || 1;\n    this.flip = flip = options.flip != null ? options.flip : false;\n    this.anchor = anchor =\n      options.anchor != null ? options.anchor : flip ? 0 : samples - 1;\n\n    const arrows = strips * ribbons * layers;\n    const points = (sides + 2) * arrows;\n    const triangles = sides * 2 * arrows;\n\n    this.setIndex(new BufferAttribute(new Uint32Array(triangles * 3), 1));\n\n    this.setAttribute(\n      \"position4\",\n      new BufferAttribute(new Float32Array(points * 4), 4)\n    );\n    this.setAttribute(\n      \"arrow\",\n      new BufferAttribute(new Float32Array(points * 3), 3)\n    );\n    this.setAttribute(\n      \"attach\",\n      new BufferAttribute(new Float32Array(points * 2), 2)\n    );\n\n    const index = this._emitter(\"index\");\n    const position = this._emitter(\"position4\");\n    const arrow = this._emitter(\"arrow\");\n    const attach = this._emitter(\"attach\");\n\n    const circle = [];\n    for (\n      k = 0, end = sides, asc = 0 <= end;\n      asc ? k < end : k > end;\n      asc ? k++ : k--\n    ) {\n      const angle = (k / sides) * 2 * Math.PI;\n      circle.push([Math.cos(angle), Math.sin(angle), 1]);\n    }\n\n    let base = 0;\n    for (\n      let i = 0, end1 = arrows, asc1 = 0 <= end1;\n      asc1 ? i < end1 : i > end1;\n      asc1 ? i++ : i--\n    ) {\n      let asc2, end2;\n      const tip = base++;\n      const back = tip + sides + 1;\n\n      for (\n        k = 0, end2 = sides, asc2 = 0 <= end2;\n        asc2 ? k < end2 : k > end2;\n        asc2 ? k++ : k--\n      ) {\n        const a = base + (k % sides);\n        const b = base + ((k + 1) % sides);\n\n        index(tip);\n        index(a);\n        index(b);\n\n        index(b);\n        index(a);\n        index(back);\n      }\n\n      base += sides + 1;\n    }\n\n    const step = flip ? 1 : -1;\n    const far = flip ? samples - 1 : 0;\n    const near = anchor + step;\n    const x = anchor;\n\n    for (\n      let l = 0, end3 = layers, asc3 = 0 <= end3;\n      asc3 ? l < end3 : l > end3;\n      asc3 ? l++ : l--\n    ) {\n      for (\n        let z = 0, end4 = ribbons, asc4 = 0 <= end4;\n        asc4 ? z < end4 : z > end4;\n        asc4 ? z++ : z--\n      ) {\n        for (\n          let y = 0, end5 = strips, asc5 = 0 <= end5;\n          asc5 ? y < end5 : y > end5;\n          asc5 ? y++ : y--\n        ) {\n          let asc6, end6;\n          position(x, y, z, l);\n          arrow(0, 0, 0);\n          attach(near, far);\n\n          for (\n            k = 0, end6 = sides, asc6 = 0 <= end6;\n            asc6 ? k < end6 : k > end6;\n            asc6 ? k++ : k--\n          ) {\n            position(x, y, z, l);\n\n            const c = circle[k];\n            arrow(c[0], c[1], c[2]);\n            attach(near, far);\n          }\n\n          position(x, y, z, l);\n          arrow(0, 0, 1);\n          attach(near, far);\n        }\n      }\n    }\n\n    this._finalize();\n    this.clip();\n  }\n\n  clip(samples, strips, ribbons, layers) {\n    let quads;\n    if (samples == null) {\n      ({ samples } = this);\n    }\n    if (strips == null) {\n      ({ strips } = this);\n    }\n    if (ribbons == null) {\n      ({ ribbons } = this);\n    }\n    if (layers == null) {\n      ({ layers } = this);\n    }\n\n    this._clipGeometry(samples, strips, ribbons, layers);\n\n    if (samples > this.anchor) {\n      const dims = [layers, ribbons, strips];\n      const maxs = [this.layers, this.ribbons, this.strips];\n      quads = this.sides * this._reduce(dims, maxs);\n    } else {\n      quads = 0;\n    }\n\n    return this._offsets([\n      {\n        start: 0,\n        count: quads * 6,\n        materialIndex: 0,\n      },\n    ]);\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UGLSL from \"../../util/glsl.js\";\n\nimport { RawShaderMaterial } from \"three/src/materials/RawShaderMaterial.js\";\nimport { Renderable } from \"../renderable.js\";\n\nexport class Base extends Renderable {\n  constructor(renderer, shaders, options) {\n    super(renderer, shaders, options);\n    this.zUnits = options.zUnits != null ? options.zUnits : 0;\n  }\n\n  raw() {\n    for (const object of Array.from(this.renders)) {\n      this._raw(object);\n    }\n    return null;\n  }\n\n  depth(write, test) {\n    for (const object of Array.from(this.renders)) {\n      this._depth(object, write, test);\n    }\n    return null;\n  }\n\n  polygonOffset(factor, units) {\n    for (const object of Array.from(this.renders)) {\n      this._polygonOffset(object, factor, units);\n    }\n    return null;\n  }\n\n  show(transparent, blending, order) {\n    return Array.from(this.renders).map((object) =>\n      this._show(object, transparent, blending, order)\n    );\n  }\n\n  hide() {\n    for (const object of Array.from(this.renders)) {\n      this._hide(object);\n    }\n    return null;\n  }\n\n  _material(options) {\n    const precision = this.renderer.capabilities.precision;\n\n    const vertexPrefix = `\\\n    precision ${precision} float;\n    precision ${precision} int;\nuniform mat4 modelMatrix;\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform mat4 viewMatrix;\nuniform mat3 normalMatrix;\nuniform vec3 cameraPosition;\\\n`;\n\n    const fragmentPrefix = `\\\n    precision ${precision} float;\n    precision ${precision} int;\nuniform mat4 viewMatrix;\nuniform vec3 cameraPosition;\\\n`;\n\n    const shaderOptions = {};\n    Object.assign(shaderOptions, options);\n    delete shaderOptions.attributes;\n    delete shaderOptions.varyings;\n    delete shaderOptions.inspect;\n    delete shaderOptions.vertexGraph;\n    delete shaderOptions.fragmentGraph;\n\n    const material = new RawShaderMaterial(shaderOptions);\n\n    [\"vertexGraph\", \"fragmentGraph\", \"inspect\"].forEach(\n      (key) => (material[key] = options[key])\n    );\n\n    material.vertexShader = [vertexPrefix, material.vertexShader].join(\"\\n\");\n    material.fragmentShader = [fragmentPrefix, material.fragmentShader].join(\n      \"\\n\"\n    );\n    return material;\n  }\n\n  _raw(object) {\n    object.rotationAutoUpdate = false;\n    object.frustumCulled = false;\n    object.matrixAutoUpdate = false;\n    object.material.defaultAttributeValues = undefined;\n  }\n\n  _depth(object, write, test) {\n    const m = object.material;\n    m.depthWrite = write;\n    return (m.depthTest = test);\n  }\n\n  _polygonOffset(object, factor, units) {\n    units -= this.zUnits;\n    const enabled = units !== 0;\n\n    const m = object.material;\n\n    m.polygonOffset = enabled;\n    if (enabled) {\n      m.polygonOffsetFactor = factor;\n      return (m.polygonOffsetUnits = units);\n    }\n  }\n\n  _show(object, transparent, blending, order) {\n    // Force transparent to true to ensure all renderables drawn in order\n    transparent = true;\n\n    const m = object.material;\n\n    object.renderOrder = -order;\n    object.visible = true;\n    m.transparent = transparent;\n    m.blending = blending;\n\n    return null;\n  }\n\n  _hide(object) {\n    return (object.visible = false);\n  }\n\n  _vertexColor(color, mask) {\n    if (!color && !mask) {\n      return;\n    }\n\n    const v = this.shaders.shader();\n\n    if (color) {\n      v.require(color);\n      v.pipe(\"mesh.vertex.color\", this.uniforms);\n    }\n\n    if (mask) {\n      v.require(mask);\n      v.pipe(\"mesh.vertex.mask\", this.uniforms);\n    }\n\n    return v;\n  }\n\n  _vertexPosition(position, material, map, channels, stpq) {\n    let defs;\n    const v = this.shaders.shader();\n\n    if (map || (material && material !== true)) {\n      defs = {};\n      if (channels > 0 || stpq) {\n        defs.POSITION_MAP = \"\";\n      }\n      if (channels > 0) {\n        defs[\n          [\"POSITION_U\", \"POSITION_UV\", \"POSITION_UVW\", \"POSITION_UVWO\"][\n            channels - 1\n          ]\n        ] = \"\";\n      }\n      if (stpq) {\n        defs.POSITION_STPQ = \"\";\n      }\n    }\n\n    v.require(position);\n    return v.pipe(\"mesh.vertex.position\", this.uniforms, defs);\n  }\n\n  _fragmentColor(\n    hasStyle,\n    material,\n    color,\n    mask,\n    map,\n    channels,\n    stpq,\n    combine,\n    linear\n  ) {\n    const f = this.shaders.shader();\n\n    // metacode is terrible\n    let join = false;\n    let gamma = false;\n\n    const defs = {};\n    if (channels > 0) {\n      defs[\n        [\"POSITION_U\", \"POSITION_UV\", \"POSITION_UVW\", \"POSITION_UVWO\"][\n          channels - 1\n        ]\n      ] = \"\";\n    }\n    if (stpq) {\n      defs.POSITION_STPQ = \"\";\n    }\n\n    if (hasStyle) {\n      f.pipe(\"style.color\", this.uniforms);\n      join = true;\n\n      if (color || map || material) {\n        if (!linear || color) {\n          f.pipe(\"mesh.gamma.in\");\n        }\n        gamma = true;\n      }\n    }\n\n    if (color) {\n      f.isolate();\n      f.pipe(\"mesh.fragment.color\", this.uniforms);\n      if (!linear || join) {\n        f.pipe(\"mesh.gamma.in\");\n      }\n      f.end();\n      if (join) {\n        f.pipe(UGLSL.binaryOperator(\"vec4\", \"*\"));\n      }\n\n      if (linear && join) {\n        f.pipe(\"mesh.gamma.out\");\n      }\n\n      join = true;\n      gamma = true;\n    }\n\n    if (map) {\n      if (!join && combine) {\n        f.pipe(UGLSL.constant(\"vec4\", \"vec4(1.0)\"));\n      }\n\n      f.isolate();\n      f.require(map);\n      f.pipe(\"mesh.fragment.map\", this.uniforms, defs);\n      if (!linear) {\n        f.pipe(\"mesh.gamma.in\");\n      }\n      f.end();\n\n      if (combine) {\n        f.pipe(combine);\n      } else {\n        if (join) {\n          f.pipe(UGLSL.binaryOperator(\"vec4\", \"*\"));\n        }\n      }\n\n      join = true;\n      gamma = true;\n    }\n\n    if (material) {\n      if (!join) {\n        f.pipe(UGLSL.constant(\"vec4\", \"vec4(1.0)\"));\n      }\n      if (material === true) {\n        f.pipe(\"mesh.fragment.shaded\", this.uniforms);\n      } else {\n        f.require(material);\n        f.pipe(\"mesh.fragment.material\", this.uniforms, defs);\n      }\n\n      gamma = true;\n    }\n\n    if (gamma && !linear) {\n      f.pipe(\"mesh.gamma.out\");\n    }\n\n    if (mask) {\n      f.pipe(\"mesh.fragment.mask\", this.uniforms);\n      if (join) {\n        f.pipe(UGLSL.binaryOperator(\"vec4\", \"*\"));\n      }\n    }\n\n    return f;\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { DataTexture } from \"./datatexture.js\";\n\n/*\nManually allocated GL texture for data streaming, locally backed.\n\nAllows partial updates via subImage.\nContains local copy of its data to allow quick resizing without gl.copyTexImage2d\n(which requires render-to-framebuffer)\n*/\nexport class BackedTexture extends DataTexture {\n  constructor(renderer, width, height, channels, options) {\n    super(renderer, width, height, channels, options);\n    this.data = new this.ctor(this.n);\n  }\n\n  resize(width, height) {\n    const old = this.data;\n    const oldWidth = this.width;\n    const oldHeight = this.height;\n\n    this.width = width;\n    this.height = height;\n    this.n = width * height * this.channels;\n    this.data = new this.ctor(this.n);\n\n    const { gl } = this;\n    const state = this.renderer.state;\n    state.bindTexture(gl.TEXTURE_2D, this.texture);\n    gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);\n    gl.texImage2D(\n      gl.TEXTURE_2D,\n      0,\n      this.format,\n      width,\n      height,\n      0,\n      this.format,\n      this.type,\n      this.data\n    );\n\n    this.uniforms.dataResolution.value.set(1 / width, 1 / height);\n\n    return this.write(old, 0, 0, oldWidth, oldHeight);\n  }\n\n  write(src, x, y, w, h) {\n    let j;\n    const { width } = this;\n    const dst = this.data;\n    const { channels } = this;\n\n    let i = 0;\n    if (width === w && x === 0) {\n      j = y * w * channels;\n      const n = w * h * channels;\n      while (i < n) {\n        dst[j++] = src[i++];\n      }\n    } else {\n      const stride = width * channels;\n      const ww = w * channels;\n      const xx = x * channels;\n      let yy = y;\n      const yh = y + h;\n      while (yy < yh) {\n        let k = 0;\n        j = xx + yy * stride;\n        while (k++ < ww) {\n          dst[j++] = src[i++];\n        }\n        yy++;\n      }\n    }\n\n    return super.write(src, x, y, w, h);\n  }\n\n  dispose() {\n    this.data = null;\n    return super.dispose();\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining\n * DS104: Avoid inline assignments\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UGLSL from \"../../util/glsl.js\";\n\nimport { BackedTexture } from \"./texture/backedtexture.js\";\nimport { DataTexture } from \"./texture/datatexture.js\";\nimport { Renderable } from \"../renderable.js\";\nimport { Vector2 } from \"three/src/math/Vector2.js\";\n\n/*\n * Dynamic sprite atlas\n *\n * - Allocates variable-sized sprites in rows\n * - Will grow itself when full\n */\nexport class Atlas extends Renderable {\n  constructor(renderer, shaders, options, build) {\n    if (build == null) {\n      build = true;\n    }\n    super(renderer, shaders);\n\n    if (this.width == null) {\n      this.width = options.width || 512;\n    }\n    if (this.height == null) {\n      this.height = options.height || 512;\n    }\n    if (this.channels == null) {\n      this.channels = options.channels || 4;\n    }\n    if (this.backed == null) {\n      this.backed = options.backed || false;\n    }\n    this.samples = this.width * this.height;\n\n    if (build) {\n      this.build(options);\n    }\n  }\n\n  shader(shader) {\n    shader.pipe(\"map.2d.data\", this.uniforms);\n    shader.pipe(\"sample.2d\", this.uniforms);\n    if (this.channels < 4) {\n      shader.pipe(\n        UGLSL.swizzleVec4([\"0000\", \"x000\", \"xw00\", \"xyz0\"][this.channels])\n      );\n    }\n    return shader;\n  }\n\n  build(options) {\n    let klass;\n    this.klass = klass = this.backed ? BackedTexture : DataTexture;\n    this.texture = new klass(\n      this.renderer,\n      this.width,\n      this.height,\n      this.channels,\n      options\n    );\n\n    this.uniforms = {\n      dataPointer: {\n        type: \"v2\",\n        value: new Vector2(0, 0),\n      },\n    };\n    this._adopt(this.texture.uniforms);\n\n    return this.reset();\n  }\n\n  reset() {\n    this.rows = [];\n    return (this.bottom = 0);\n  }\n\n  resize(width, height) {\n    if (!this.backed) {\n      throw new Error(\"Cannot resize unbacked texture atlas\");\n    }\n    if (width > 2048 && height > 2048) {\n      console.warn(`Giant text atlas ${width}x${height}.`);\n    } else {\n      console.info(`Resizing text atlas ${width}x${height}.`);\n    }\n\n    this.texture.resize(width, height);\n\n    this.width = width;\n    this.height = height;\n    return (this.samples = width * height);\n  }\n\n  collapse(row) {\n    let left;\n    const { rows } = this;\n    rows.splice(rows.indexOf(row), 1);\n    this.bottom =\n      (left = __guard__(rows[rows.length - 1], (x) => x.bottom)) != null\n        ? left\n        : 0;\n    if (this.last === row) {\n      return (this.last = null);\n    }\n  }\n\n  allocate(key, width, height, emit) {\n    const w = this.width;\n    const h = this.height;\n\n    const max = height * 2;\n\n    if (width > w) {\n      this.resize(w * 2, h * 2);\n      this.last = null;\n      // Try again\n      return this.allocate(key, width, height, emit);\n    }\n\n    // See if we can append to the last used row (fast code path)\n    let row = this.last;\n    if (row != null) {\n      if (row.height >= height && row.height < max && row.width + width <= w) {\n        row.append(key, width, height, emit);\n        return;\n      }\n    }\n\n    // Scan all rows and append to the first suitable one (slower code path)\n    let bottom = 0;\n    let index = -1;\n    let top = 0;\n    for (let i = 0; i < this.rows.length; i++) {\n      // Measure gap between rows\n      // Note suitable holes for later\n      row = this.rows[i];\n      const gap = row.top - bottom;\n      if (gap >= height && index < 0) {\n        index = i;\n        top = bottom;\n      }\n      ({ bottom } = row);\n\n      if (row.height >= height && row.height < max && row.width + width <= w) {\n        row.append(key, width, height, emit);\n        this.last = row;\n        return;\n      }\n    }\n\n    // New row (slowest path)\n    if (index >= 0) {\n      // Fill a gap\n      row = new Row(top, height);\n      this.rows.splice(index, 0, row);\n      //console.log 'fill gap', row\n    } else {\n      // Append to bottom\n      top = bottom;\n      bottom += height;\n\n      // Resize if atlas is full\n      if (bottom >= h) {\n        this.resize(w * 2, h * 2);\n        this.last = null;\n        // Try again\n        return this.allocate(key, width, height, emit);\n      }\n\n      // Add new row to the end\n      row = new Row(top, height);\n      this.rows.push(row);\n      this.bottom = bottom;\n    }\n\n    row.append(key, width, height, emit);\n    this.last = row;\n  }\n\n  read() {\n    return this.texture.textureObject;\n  }\n\n  write(data, x, y, w, h) {\n    return this.texture.write(data, x, y, w, h);\n  }\n\n  dispose() {\n    this.texture.dispose();\n    this.data = null;\n    return super.dispose();\n  }\n}\n\nclass Row {\n  constructor(top, height) {\n    this.top = top;\n    this.bottom = top + height;\n    this.width = 0;\n    this.height = height;\n    this.alive = 0;\n    this.keys = [];\n  }\n\n  append(key, width, height, emit) {\n    const x = this.width;\n    const y = this.top;\n    this.alive++;\n    this.width += width;\n    this.keys.push(key);\n    return emit(this, x, y);\n  }\n}\n\nfunction __guard__(value, transform) {\n  return typeof value !== \"undefined\" && value !== null\n    ? transform(value)\n    : undefined;\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS202: Simplify dynamic range loops\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { BufferAttribute } from \"three/src/core/BufferAttribute.js\";\nimport { ClipGeometry } from \"./clipgeometry.js\";\n\n/*\n(flat) Triangle fans arranged in items, columns and rows\n\n+-+     +-+     +-+     +-+\n|\\\\\\    |\\\\\\    |\\\\\\    |\\\\\\\n+-+-+   +-+-+   +-+-+   +-+-+\n\n+-+     +-+     +-+     +-+\n|\\\\\\    |\\\\\\    |\\\\\\    |\\\\\\\n+-+-+   +-+-+   +-+-+   +-+-+\n\n+-+     +-+     +-+     +-+\n|\\\\\\    |\\\\\\    |\\\\\\    |\\\\\\\n+-+-+   +-+-+   +-+-+   +-+-+\n*/\n\nexport class FaceGeometry extends ClipGeometry {\n  constructor(options) {\n    let depth, height, items, sides, width;\n    super(options);\n\n    this._clipUniforms();\n\n    this.items = items = +options.items || 2;\n    this.width = width = +options.width || 1;\n    this.height = height = +options.height || 1;\n    this.depth = depth = +options.depth || 1;\n    this.sides = sides = Math.max(0, items - 2);\n\n    const samples = width * height * depth;\n    const points = items * samples;\n    const triangles = sides * samples;\n\n    this.setIndex(new BufferAttribute(new Uint32Array(triangles * 3), 1));\n\n    this.setAttribute(\n      \"position4\",\n      new BufferAttribute(new Float32Array(points * 4), 4)\n    );\n\n    const index = this._emitter(\"index\");\n    const position = this._emitter(\"position4\");\n\n    let base = 0;\n    for (\n      let i = 0, end = samples, asc = 0 <= end;\n      asc ? i < end : i > end;\n      asc ? i++ : i--\n    ) {\n      for (\n        let j = 0, end1 = sides, asc1 = 0 <= end1;\n        asc1 ? j < end1 : j > end1;\n        asc1 ? j++ : j--\n      ) {\n        index(base);\n        index(base + j + 1);\n        index(base + j + 2);\n      }\n\n      base += items;\n    }\n\n    for (\n      let z = 0, end2 = depth, asc2 = 0 <= end2;\n      asc2 ? z < end2 : z > end2;\n      asc2 ? z++ : z--\n    ) {\n      for (\n        let y = 0, end3 = height, asc3 = 0 <= end3;\n        asc3 ? y < end3 : y > end3;\n        asc3 ? y++ : y--\n      ) {\n        for (\n          let x = 0, end4 = width, asc4 = 0 <= end4;\n          asc4 ? x < end4 : x > end4;\n          asc4 ? x++ : x--\n        ) {\n          for (\n            let l = 0, end5 = items, asc5 = 0 <= end5;\n            asc5 ? l < end5 : l > end5;\n            asc5 ? l++ : l--\n          ) {\n            position(x, y, z, l);\n          }\n        }\n      }\n    }\n\n    this._finalize();\n    this.clip();\n  }\n\n  clip(width, height, depth, items) {\n    if (width == null) {\n      ({ width } = this);\n    }\n    if (height == null) {\n      ({ height } = this);\n    }\n    if (depth == null) {\n      ({ depth } = this);\n    }\n    if (items == null) {\n      ({ items } = this);\n    }\n    const sides = Math.max(0, items - 2);\n\n    this._clipGeometry(width, height, depth, items);\n    return this._clipOffsets(\n      3,\n      width,\n      height,\n      depth,\n      sides,\n      this.width,\n      this.height,\n      this.depth,\n      this.sides\n    );\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS202: Simplify dynamic range loops\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { BufferAttribute } from \"three/src/core/BufferAttribute.js\";\nimport { ClipGeometry } from \"./clipgeometry.js\";\n\n/*\nLine strips arranged in columns and rows\n\n+----+ +----+ +----+ +----+\n\n+----+ +----+ +----+ +----+\n\n+----+ +----+ +----+ +----+\n*/\n\nexport class LineGeometry extends ClipGeometry {\n  constructor(options) {\n    let closed,\n      detail,\n      edge,\n      joint,\n      joints,\n      l,\n      layers,\n      ribbons,\n      samples,\n      segments,\n      strips,\n      vertices,\n      x,\n      y,\n      z;\n    super(options);\n\n    this._clipUniforms();\n\n    this.closed = closed = options.closed || false;\n    this.samples = samples = (+options.samples || 2) + (closed ? 1 : 0);\n    this.strips = strips = +options.strips || 1;\n    this.ribbons = ribbons = +options.ribbons || 1;\n    this.layers = layers = +options.layers || 1;\n    this.detail = detail = +options.detail || 1;\n\n    const lines = samples - 1;\n    this.joints = joints = detail - 1;\n\n    this.vertices = vertices = (lines - 1) * joints + samples;\n    this.segments = segments = (lines - 1) * joints + lines;\n\n    const wrap = samples - (closed ? 1 : 0);\n    const points = vertices * strips * ribbons * layers * 2;\n    const quads = segments * strips * ribbons * layers;\n    const triangles = quads * 2;\n\n    this.setIndex(new BufferAttribute(new Uint32Array(triangles * 3), 1));\n\n    this.setAttribute(\n      \"position4\",\n      new BufferAttribute(new Float32Array(points * 4), 4)\n    );\n    this.setAttribute(\n      \"line\",\n      new BufferAttribute(new Float32Array(points * 2), 2)\n    );\n    this.setAttribute(\n      \"strip\",\n      new BufferAttribute(new Float32Array(points * 2), 2)\n    );\n    if (detail > 1) {\n      this.setAttribute(\n        \"joint\",\n        new BufferAttribute(new Float32Array(points), 1)\n      );\n    }\n\n    const index = this._emitter(\"index\");\n    const position = this._emitter(\"position4\");\n    const line = this._emitter(\"line\");\n    const strip = this._emitter(\"strip\");\n    if (detail > 1) {\n      joint = this._emitter(\"joint\");\n    }\n\n    let base = 0;\n    for (\n      let i = 0, end = ribbons * layers, asc = 0 <= end;\n      asc ? i < end : i > end;\n      asc ? i++ : i--\n    ) {\n      for (\n        let j = 0, end1 = strips, asc1 = 0 <= end1;\n        asc1 ? j < end1 : j > end1;\n        asc1 ? j++ : j--\n      ) {\n        for (\n          let k = 0, end2 = segments, asc2 = 0 <= end2;\n          asc2 ? k < end2 : k > end2;\n          asc2 ? k++ : k--\n        ) {\n          // note implied - 1\n          index(base);\n          index(base + 1);\n          index(base + 2);\n\n          index(base + 2);\n          index(base + 1);\n          index(base + 3);\n\n          base += 2;\n        }\n        base += 2;\n      }\n    }\n\n    const edger = closed\n      ? () => 0\n      : function (x) {\n          if (x === 0) {\n            return -1;\n          } else if (x === samples - 1) {\n            return 1;\n          } else {\n            return 0;\n          }\n        };\n\n    if (detail > 1) {\n      let asc3, end3;\n      for (\n        l = 0, end3 = layers, asc3 = 0 <= end3;\n        asc3 ? l < end3 : l > end3;\n        asc3 ? l++ : l--\n      ) {\n        let asc4, end4;\n        for (\n          z = 0, end4 = ribbons, asc4 = 0 <= end4;\n          asc4 ? z < end4 : z > end4;\n          asc4 ? z++ : z--\n        ) {\n          let asc5, end5;\n          for (\n            y = 0, end5 = strips, asc5 = 0 <= end5;\n            asc5 ? y < end5 : y > end5;\n            asc5 ? y++ : y--\n          ) {\n            let asc6, end6, i1;\n            for (\n              i1 = 0, x = i1, end6 = samples, asc6 = 0 <= end6;\n              asc6 ? i1 < end6 : i1 > end6;\n              asc6 ? i1++ : i1--, x = i1\n            ) {\n              if (closed) {\n                x = x % wrap;\n              }\n              edge = edger(x);\n\n              if (edge !== 0) {\n                position(x, y, z, l);\n                position(x, y, z, l);\n\n                line(edge, 1);\n                line(edge, -1);\n\n                strip(0, segments);\n                strip(0, segments);\n\n                joint(0.5);\n                joint(0.5);\n              } else {\n                for (\n                  let m = 0, end7 = detail, asc7 = 0 <= end7;\n                  asc7 ? m < end7 : m > end7;\n                  asc7 ? m++ : m--\n                ) {\n                  position(x, y, z, l);\n                  position(x, y, z, l);\n\n                  line(edge, 1);\n                  line(edge, -1);\n\n                  strip(0, segments);\n                  strip(0, segments);\n\n                  joint(m / joints);\n                  joint(m / joints);\n                }\n              }\n            }\n          }\n        }\n      }\n    } else {\n      let asc8, end8;\n      for (\n        l = 0, end8 = layers, asc8 = 0 <= end8;\n        asc8 ? l < end8 : l > end8;\n        asc8 ? l++ : l--\n      ) {\n        let asc9, end9;\n        for (\n          z = 0, end9 = ribbons, asc9 = 0 <= end9;\n          asc9 ? z < end9 : z > end9;\n          asc9 ? z++ : z--\n        ) {\n          let asc10, end10;\n          for (\n            y = 0, end10 = strips, asc10 = 0 <= end10;\n            asc10 ? y < end10 : y > end10;\n            asc10 ? y++ : y--\n          ) {\n            let asc11, end11, j1;\n            for (\n              j1 = 0, x = j1, end11 = samples, asc11 = 0 <= end11;\n              asc11 ? j1 < end11 : j1 > end11;\n              asc11 ? j1++ : j1--, x = j1\n            ) {\n              if (closed) {\n                x = x % wrap;\n              }\n              edge = edger(x);\n\n              position(x, y, z, l);\n              position(x, y, z, l);\n\n              line(edge, 1);\n              line(edge, -1);\n\n              strip(0, segments);\n              strip(0, segments);\n            }\n          }\n        }\n      }\n    }\n\n    this._finalize();\n    this.clip();\n  }\n\n  clip(samples, strips, ribbons, layers) {\n    if (samples == null) {\n      samples = this.samples - this.closed;\n    }\n    if (strips == null) {\n      ({ strips } = this);\n    }\n    if (ribbons == null) {\n      ({ ribbons } = this);\n    }\n    if (layers == null) {\n      ({ layers } = this);\n    }\n    let segments = Math.max(0, samples - (this.closed ? 0 : 1));\n\n    const vertices = samples + (samples - 2) * this.joints;\n    segments = vertices - 1;\n\n    this._clipGeometry(vertices, strips, ribbons, layers);\n    return this._clipOffsets(\n      6,\n      segments,\n      strips,\n      ribbons,\n      layers,\n      this.segments,\n      this.strips,\n      this.ribbons,\n      this.layers\n    );\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS202: Simplify dynamic range loops\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n/*\nVirtual RenderTarget that cycles through multiple frames\nProvides easy access to past rendered frames\n@reads[] and @write contain WebGLRenderTargets whose internal pointers are rotated automatically\n*/\n\nimport {\n  NearestFilter,\n  RGBAFormat,\n  UnsignedByteType,\n} from \"three/src/constants.js\";\nimport { Vector2 } from \"three/src/math/Vector2.js\";\nimport { WebGLRenderTarget } from \"three/src/renderers/WebGLRenderTarget.js\";\n\nexport class RenderTarget {\n  constructor(gl, width, height, frames, options) {\n    this.gl = gl;\n    if (options == null) {\n      options = {};\n    }\n    if (options.minFilter == null) {\n      options.minFilter = NearestFilter;\n    }\n    if (options.magFilter == null) {\n      options.magFilter = NearestFilter;\n    }\n    if (options.format == null) {\n      options.format = RGBAFormat;\n    }\n    if (options.type == null) {\n      options.type = UnsignedByteType;\n    }\n\n    this.options = options;\n\n    this.width = width || 1;\n    this.height = height || 1;\n    this.frames = frames || 1;\n    this.buffers = this.frames + 1;\n\n    this.build();\n  }\n\n  build() {\n    let i;\n    const make = () =>\n      new WebGLRenderTarget(this.width, this.height, this.options);\n\n    this.targets = (() => {\n      let asc, end;\n      const result = [];\n      for (\n        i = 0, end = this.buffers, asc = 0 <= end;\n        asc ? i < end : i > end;\n        asc ? i++ : i--\n      ) {\n        result.push(make());\n      }\n      return result;\n    })();\n\n    const acc = [];\n    this.targets.forEach((target) => acc.push(target.texture));\n    this.reads = acc;\n\n    this.write = this.targets[this.buffers - 1];\n\n    // Texture access uniforms\n    this.uniforms = {\n      dataResolution: {\n        type: \"v2\",\n        value: new Vector2(1 / this.width, 1 / this.height),\n      },\n      dataTexture: {\n        type: \"t\",\n        value: this.reads[0],\n      },\n      dataTextures: {\n        type: \"tv\",\n        value: this.reads,\n      },\n    };\n  }\n\n  cycle() {\n    this.targets.unshift(this.targets.pop());\n    this.write = this.targets[this.buffers - 1];\n    this.reads.unshift(this.reads.pop());\n    this.uniforms.dataTexture.value = this.reads[0];\n  }\n\n  warmup(callback) {\n    return (() => {\n      const result = [];\n      for (\n        let i = 0, end = this.buffers, asc = 0 <= end;\n        asc ? i < end : i > end;\n        asc ? i++ : i--\n      ) {\n        callback(this.write);\n        result.push(this.cycle());\n      }\n      return result;\n    })();\n  }\n\n  dispose() {\n    for (const target of Array.from(this.targets)) {\n      target.dispose();\n    }\n    return (this.targets = this.reads = this.write = null);\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UGLSL from \"../../util/glsl.js\";\n\nimport { PerspectiveCamera } from \"three/src/cameras/PerspectiveCamera.js\";\nimport { RenderTarget } from \"./texture/rendertarget.js\";\nimport { Renderable } from \"../renderable.js\";\nimport { Scene } from \"three/src/scenes/Scene.js\";\nimport { Vector2 } from \"three/src/math/Vector2.js\";\nimport { Vector3 } from \"three/src/math/Vector3.js\";\n\n/*\n * Render-To-Texture with history\n */\nexport class RenderToTexture extends Renderable {\n  constructor(renderer, shaders, options) {\n    super(renderer, shaders);\n\n    this.scene = options.scene != null ? options.scene : new Scene();\n    this.camera = options.camera;\n\n    this.build(options);\n  }\n\n  shaderRelative(shader) {\n    if (shader == null) {\n      shader = this.shaders.shader();\n    }\n    return shader.pipe(\"sample.2d\", this.uniforms);\n  }\n\n  shaderAbsolute(shader, frames, indices) {\n    if (frames == null) {\n      frames = 1;\n    }\n    if (indices == null) {\n      indices = 4;\n    }\n    if (shader == null) {\n      shader = this.shaders.shader();\n    }\n    if (frames <= 1) {\n      if (indices > 2) {\n        shader.pipe(UGLSL.truncateVec(indices, 2));\n      }\n      shader.pipe(\"map.2d.data\", this.uniforms);\n      return shader.pipe(\"sample.2d\", this.uniforms);\n    } else {\n      const sample2DArray = UGLSL.sample2DArray(\n        Math.min(frames, this.target.frames)\n      );\n      if (indices < 4) {\n        shader.pipe(UGLSL.extendVec(indices, 4));\n      }\n      shader.pipe(\"map.xyzw.2dv\");\n      shader.split();\n      shader.pipe(\"map.2d.data\", this.uniforms);\n      shader.pass();\n      return shader.pipe(sample2DArray, this.uniforms);\n    }\n  }\n\n  build(options) {\n    if (!this.camera) {\n      this.camera = new PerspectiveCamera();\n      this.camera.position.set(0, 0, 3);\n      this.camera.lookAt(new Vector3());\n    }\n    if (typeof this.scene.inject === \"function\") {\n      this.scene.inject();\n    }\n\n    this.target = new RenderTarget(\n      this.gl,\n      options.width,\n      options.height,\n      options.frames,\n      options\n    );\n    this.target.warmup((target) => this.renderer.setRenderTarget(target));\n    this.renderer.setRenderTarget(null);\n\n    this._adopt(this.target.uniforms);\n    this._adopt({\n      dataPointer: {\n        type: \"v2\",\n        value: new Vector2(0.5, 0.5),\n      },\n    });\n\n    return (this.filled = 0);\n  }\n\n  adopt(renderable) {\n    return Array.from(renderable.renders).map((object) =>\n      this.scene.add(object)\n    );\n  }\n  unadopt(renderable) {\n    return Array.from(renderable.renders).map((object) =>\n      this.scene.remove(object)\n    );\n  }\n\n  render(camera) {\n    if (camera == null) {\n      ({ camera } = this);\n    }\n    const currentTarget = this.renderer.getRenderTarget();\n    this.renderer.setRenderTarget(this.target.write);\n    this.renderer.render(\n      this.scene.scene != null ? this.scene.scene : this.scene,\n      camera\n    );\n    this.renderer.setRenderTarget(currentTarget);\n\n    this.target.cycle();\n    if (this.filled < this.target.frames) {\n      return this.filled++;\n    }\n  }\n\n  read(frame) {\n    if (frame == null) {\n      frame = 0;\n    }\n    return this.target.reads[Math.abs(frame)];\n  }\n\n  getFrames() {\n    return this.target.frames;\n  }\n\n  getFilled() {\n    return this.filled;\n  }\n\n  dispose() {\n    if (typeof this.scene.unject === \"function\") {\n      this.scene.unject();\n    }\n    this.scene = this.camera = null;\n\n    this.target.dispose();\n\n    return super.dispose();\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { RGBAFormat } from \"three/src/constants.js\";\nimport { RenderToTexture } from \"./rendertotexture.js\";\n\n/*\n * Wrapped RTT for memoizing 4D arrays back to a 2D texture\n */\nexport class Memo extends RenderToTexture {\n  constructor(renderer, shaders, options) {\n    let _height, _width;\n    const items = options.items || 1;\n    const channels = options.channels || 4;\n    const width = options.width || 1;\n    const height = options.height || 1;\n    const depth = options.depth || 1;\n\n    //options.format = [null, THREE.LuminanceFormat, THREE.LuminanceAlphaFormat, THREE.RGBFormat, THREE.RGBAFormat][@channels]\n    options.format = RGBAFormat;\n    options.width = _width = items * width;\n    options.height = _height = height * depth;\n    options.frames = 1;\n\n    delete options.items;\n    delete options.depth;\n    delete options.channels;\n\n    super(renderer, shaders, options);\n\n    if (this.items == null) {\n      this.items = items;\n    }\n    if (this.channels == null) {\n      this.channels = channels;\n    }\n    if (this.width == null) {\n      this.width = width;\n    }\n    this._width = _width;\n    if (this.height == null) {\n      this.height = height;\n    }\n    this._height = _height;\n    if (this.depth == null) {\n      this.depth = depth;\n    }\n\n    this._adopt({\n      textureItems: { type: \"f\", value: this.items },\n      textureHeight: { type: \"f\", value: this.height },\n    });\n  }\n\n  shaderAbsolute(shader) {\n    if (shader == null) {\n      shader = this.shaders.shader();\n    }\n    shader.pipe(\"map.xyzw.texture\", this.uniforms);\n    return super.shaderAbsolute(shader, 1, 2);\n  }\n}\n//shader.pipe Util.GLSL.swizzleVec4 ['0000', 'x000', 'xw00', 'xyz0'][@channels] if @channels < 4\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS202: Simplify dynamic range loops\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { BufferAttribute } from \"three/src/core/BufferAttribute.js\";\nimport { ClipGeometry } from \"./clipgeometry.js\";\n\n/*\nGrid Surface\n\n+----+----+----+----+\n|    |    |    |    |\n+----+----+----+----+\n|    |    |    |    |\n+----+----+----+----+\n\n+----+----+----+----+\n|    |    |    |    |\n+----+----+----+----+\n|    |    |    |    |\n+----+----+----+----+\n*/\n\nexport class SurfaceGeometry extends ClipGeometry {\n  constructor(options, build) {\n    if (build == null) {\n      build = true;\n    }\n    super();\n    // TODO not great... but use this pattern, maybe, to defer construction if\n    // options are missing, NOT the boolean.\n    if (build) {\n      this.construct(options);\n    }\n  }\n\n  construct(options) {\n    let closedX, closedY, height, layers, segmentsX, segmentsY, surfaces, width;\n    this._clipUniforms();\n\n    this.closedX = closedX = options.closedX || false;\n    this.closedY = closedY = options.closedY || false;\n    this.width = width = (+options.width || 2) + (closedX ? 1 : 0);\n    this.height = height = (+options.height || 2) + (closedY ? 1 : 0);\n    this.surfaces = surfaces = +options.surfaces || 1;\n    this.layers = layers = +options.layers || 1;\n\n    const wrapX = width - (closedX ? 1 : 0);\n    const wrapY = height - (closedY ? 1 : 0);\n\n    this.segmentsX = segmentsX = Math.max(0, width - 1);\n    this.segmentsY = segmentsY = Math.max(0, height - 1);\n\n    const points = width * height * surfaces * layers;\n    const quads = segmentsX * segmentsY * surfaces * layers;\n    const triangles = quads * 2;\n\n    this.setIndex(new BufferAttribute(new Uint32Array(triangles * 3), 1));\n\n    this.setAttribute(\n      \"position4\",\n      new BufferAttribute(new Float32Array(points * 4), 4)\n    );\n    this.setAttribute(\n      \"surface\",\n      new BufferAttribute(new Float32Array(points * 2), 2)\n    );\n\n    const index = this._emitter(\"index\");\n    const position = this._emitter(\"position4\");\n    const surface = this._emitter(\"surface\");\n\n    let base = 0;\n    for (\n      let i = 0, end = surfaces * layers, asc = 0 <= end;\n      asc ? i < end : i > end;\n      asc ? i++ : i--\n    ) {\n      for (\n        let j = 0, end1 = segmentsY, asc1 = 0 <= end1;\n        asc1 ? j < end1 : j > end1;\n        asc1 ? j++ : j--\n      ) {\n        for (\n          let k = 0, end2 = segmentsX, asc2 = 0 <= end2;\n          asc2 ? k < end2 : k > end2;\n          asc2 ? k++ : k--\n        ) {\n          index(base);\n          index(base + 1);\n          index(base + width);\n\n          index(base + width);\n          index(base + 1);\n          index(base + width + 1);\n\n          base++;\n        }\n        base++;\n      }\n      base += width;\n    }\n\n    const edgerX = closedX\n      ? () => 0\n      : function (x) {\n          if (x === 0) {\n            return -1;\n          } else if (x === segmentsX) {\n            return 1;\n          } else {\n            return 0;\n          }\n        };\n\n    const edgerY = closedY\n      ? () => 0\n      : function (y) {\n          if (y === 0) {\n            return -1;\n          } else if (y === segmentsY) {\n            return 1;\n          } else {\n            return 0;\n          }\n        };\n\n    for (\n      let l = 0, end3 = layers, asc3 = 0 <= end3;\n      asc3 ? l < end3 : l > end3;\n      asc3 ? l++ : l--\n    ) {\n      for (\n        let z = 0, end4 = surfaces, asc4 = 0 <= end4;\n        asc4 ? z < end4 : z > end4;\n        asc4 ? z++ : z--\n      ) {\n        for (\n          let i1 = 0, y = i1, end5 = height, asc5 = 0 <= end5;\n          asc5 ? i1 < end5 : i1 > end5;\n          asc5 ? i1++ : i1--, y = i1\n        ) {\n          if (closedY) {\n            y = y % wrapY;\n          }\n          const edgeY = edgerY(y);\n\n          for (\n            let j1 = 0, x = j1, end6 = width, asc6 = 0 <= end6;\n            asc6 ? j1 < end6 : j1 > end6;\n            asc6 ? j1++ : j1--, x = j1\n          ) {\n            if (closedX) {\n              x = x % wrapX;\n            }\n            const edgeX = edgerX(x);\n\n            position(x, y, z, l);\n\n            surface(edgeX, edgeY);\n          }\n        }\n      }\n    }\n\n    this._finalize();\n    this.clip();\n  }\n\n  clip(width, height, surfaces, layers) {\n    if (width == null) {\n      ({ width } = this);\n    }\n    if (height == null) {\n      ({ height } = this);\n    }\n    if (surfaces == null) {\n      ({ surfaces } = this);\n    }\n    if (layers == null) {\n      ({ layers } = this);\n    }\n    const segmentsX = Math.max(0, width - 1);\n    const segmentsY = Math.max(0, height - 1);\n\n    this._clipGeometry(width, height, surfaces, layers);\n    return this._clipOffsets(\n      6,\n      segmentsX,\n      segmentsY,\n      surfaces,\n      layers,\n      this.segmentsX,\n      this.segmentsY,\n      this.surfaces,\n      this.layers\n    );\n  }\n\n  map(width, height, surfaces, layers) {\n    if (width == null) {\n      ({ width } = this);\n    }\n    if (height == null) {\n      ({ height } = this);\n    }\n    if (surfaces == null) {\n      ({ surfaces } = this);\n    }\n    if (layers == null) {\n      ({ layers } = this);\n    }\n    return this._clipMap(width, height, surfaces, layers);\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { SurfaceGeometry } from \"./surfacegeometry.js\";\nimport { Vector4 } from \"three/src/math/Vector4.js\";\n\n/*\nGrid Surface in normalized screen space\n\n+----+----+----+----+\n|    |    |    |    |\n+----+----+----+----+\n|    |    |    |    |\n+----+----+----+----+\n\n+----+----+----+----+\n|    |    |    |    |\n+----+----+----+----+\n|    |    |    |    |\n+----+----+----+----+\n*/\n\nexport class ScreenGeometry extends SurfaceGeometry {\n  constructor(options) {\n    options.width = Math.max(2, +options.width != null ? +options.width : 2);\n    options.height = Math.max(2, +options.height != null ? +options.height : 2);\n\n    super(options, false);\n\n    if (this.uniforms == null) {\n      this.uniforms = {};\n    }\n    this.uniforms.geometryScale = {\n      type: \"v4\",\n      value: new Vector4(),\n    };\n\n    this.cover();\n    this.construct(options);\n  }\n\n  cover(scaleX, scaleY, scaleZ, scaleW) {\n    if (scaleX == null) {\n      scaleX = 1;\n    }\n    this.scaleX = scaleX;\n    if (scaleY == null) {\n      scaleY = 1;\n    }\n    this.scaleY = scaleY;\n    if (scaleZ == null) {\n      scaleZ = 1;\n    }\n    this.scaleZ = scaleZ;\n    if (scaleW == null) {\n      scaleW = 1;\n    }\n    this.scaleW = scaleW;\n  }\n\n  clip(width, height, surfaces, layers) {\n    if (width == null) {\n      ({ width } = this);\n    }\n    if (height == null) {\n      ({ height } = this);\n    }\n    if (surfaces == null) {\n      ({ surfaces } = this);\n    }\n    if (layers == null) {\n      ({ layers } = this);\n    }\n    super.clip(width, height, surfaces, layers);\n\n    const invert = (x) => 1 / Math.max(1, x - 1);\n    return this.uniforms.geometryScale.value.set(\n      invert(width) * this.scaleX,\n      invert(height) * this.scaleY,\n      invert(surfaces) * this.scaleZ,\n      invert(layers) * this.scaleW\n    );\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { Base } from \"./base.js\";\nimport { DoubleSide } from \"three/src/constants.js\";\nimport { Mesh } from \"three/src/objects/Mesh.js\";\nimport { ScreenGeometry } from \"../geometry/screengeometry.js\";\n\nexport class Screen extends Base {\n  constructor(renderer, shaders, options) {\n    let f;\n    super(renderer, shaders, options);\n\n    let { uniforms } = options;\n    const { map, combine, stpq, linear } = options;\n\n    if (uniforms == null) {\n      uniforms = {};\n    }\n\n    const hasStyle = uniforms.styleColor != null;\n\n    this.geometry = new ScreenGeometry({\n      width: options.width,\n      height: options.height,\n    });\n\n    this._adopt(uniforms);\n    this._adopt(this.geometry.uniforms);\n\n    const factory = shaders.material();\n\n    const v = factory.vertex;\n    v.pipe(\"raw.position.scale\", this.uniforms);\n    v.fan();\n    v.pipe(\"stpq.xyzw.2d\", this.uniforms);\n    v.next();\n    v.pipe(\"screen.position\", this.uniforms);\n    v.join();\n\n    factory.fragment = f = this._fragmentColor(\n      hasStyle,\n      false,\n      null,\n      null,\n      map,\n      2,\n      stpq,\n      combine,\n      linear\n    );\n\n    f.pipe(\"fragment.color\", this.uniforms);\n\n    const opts = factory.link({\n      side: DoubleSide,\n    });\n    this.material = this._material(opts);\n\n    const object = new Mesh(this.geometry, this.material);\n    object.frustumCulled = false;\n    object.userData = opts;\n\n    this._raw(object);\n    this.renders = [object];\n  }\n\n  dispose() {\n    this.geometry.dispose();\n    this.material.dispose();\n    this.renders = this.geometry = this.material = null;\n    return super.dispose();\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { Screen } from \"./screen.js\";\nimport { Vector2 } from \"three/src/math/Vector2.js\";\nimport { Vector4 } from \"three/src/math/Vector4.js\";\n\nexport class MemoScreen extends Screen {\n  constructor(renderer, shaders, options) {\n    const { items, width, height, depth, stpq } = options;\n\n    const inv = (x) => 1 / Math.max(1, x);\n    const inv1 = (x) => 1 / Math.max(1, x - 1);\n\n    const uniforms = {\n      remapUVScale: {\n        type: \"v2\",\n        value: new Vector2(items * width, height * depth),\n      },\n      remapModulus: {\n        type: \"v2\",\n        value: new Vector2(items, height),\n      },\n      remapModulusInv: {\n        type: \"v2\",\n        value: new Vector2(inv(items), inv(height)),\n      },\n      remapSTPQScale: {\n        type: \"v4\",\n        value: new Vector4(inv1(width), inv1(height), inv1(depth), inv1(items)),\n      },\n    };\n\n    const map = shaders.shader();\n    map.pipe(\"screen.map.xyzw\", uniforms);\n    if (options.map != null) {\n      // Need artifical STPQs because the screen is not the real geometry\n      if (stpq) {\n        map.pipe(\"screen.map.stpq\", uniforms);\n      }\n      map.pipe(options.map);\n    }\n\n    super(renderer, shaders, { map, linear: true });\n    this.memo = options;\n    this.uniforms = uniforms;\n\n    for (const object of Array.from(this.renders)) {\n      object.transparent = false;\n    }\n  }\n\n  cover(width, height, depth, items) {\n    if (width == null) {\n      ({ width } = this.memo);\n    }\n    if (height == null) {\n      ({ height } = this.memo);\n    }\n    if (depth == null) {\n      ({ depth } = this.memo);\n    }\n    if (items == null) {\n      ({ items } = this.memo);\n    }\n    const inv1 = (x) => 1 / Math.max(1, x - 1);\n    this.uniforms.remapSTPQScale.value.set(\n      inv1(width),\n      inv1(height),\n      inv1(depth),\n      inv1(items)\n    );\n\n    const x = width / this.memo.width;\n    let y = depth / this.memo.depth;\n    if (this.memo.depth === 1) {\n      y = height / this.memo.height;\n    }\n\n    return this.geometry.cover(x, y);\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS202: Simplify dynamic range loops\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { BufferAttribute } from \"three/src/core/BufferAttribute.js\";\nimport { ClipGeometry } from \"./clipgeometry.js\";\n\n/*\nRender points as quads\n\n+----+  +----+  +----+  +----+\n|    |  |    |  |    |  |    |\n+----+  +----+  +----+  +----+\n\n+----+  +----+  +----+  +----+\n|    |  |    |  |    |  |    |\n+----+  +----+  +----+  +----+\n\n+----+  +----+  +----+  +----+\n|    |  |    |  |    |  |    |\n+----+  +----+  +----+  +----+\n\n*/\n\nexport class SpriteGeometry extends ClipGeometry {\n  constructor(options) {\n    let depth, height, items, width;\n    super(options);\n\n    this._clipUniforms();\n\n    this.items = items = +options.items || 2;\n    this.width = width = +options.width || 1;\n    this.height = height = +options.height || 1;\n    this.depth = depth = +options.depth || 1;\n\n    const samples = items * width * height * depth;\n    const points = samples * 4;\n    const triangles = samples * 2;\n\n    this.setIndex(new BufferAttribute(new Uint32Array(triangles * 3), 1));\n\n    this.setAttribute(\n      \"position4\",\n      new BufferAttribute(new Float32Array(points * 4), 4)\n    );\n    this.setAttribute(\n      \"sprite\",\n      new BufferAttribute(new Float32Array(points * 2), 2)\n    );\n\n    const index = this._emitter(\"index\");\n    const position = this._emitter(\"position4\");\n    const sprite = this._emitter(\"sprite\");\n\n    const quad = [\n      [-1, -1],\n      [-1, 1],\n      [1, -1],\n      [1, 1],\n    ];\n\n    let base = 0;\n    for (\n      let i = 0, end = samples, asc = 0 <= end;\n      asc ? i < end : i > end;\n      asc ? i++ : i--\n    ) {\n      index(base);\n      index(base + 1);\n      index(base + 2);\n\n      index(base + 1);\n      index(base + 2);\n      index(base + 3);\n\n      base += 4;\n    }\n\n    for (\n      let z = 0, end1 = depth, asc1 = 0 <= end1;\n      asc1 ? z < end1 : z > end1;\n      asc1 ? z++ : z--\n    ) {\n      for (\n        let y = 0, end2 = height, asc2 = 0 <= end2;\n        asc2 ? y < end2 : y > end2;\n        asc2 ? y++ : y--\n      ) {\n        for (\n          let x = 0, end3 = width, asc3 = 0 <= end3;\n          asc3 ? x < end3 : x > end3;\n          asc3 ? x++ : x--\n        ) {\n          for (\n            let l = 0, end4 = items, asc4 = 0 <= end4;\n            asc4 ? l < end4 : l > end4;\n            asc4 ? l++ : l--\n          ) {\n            for (const v of Array.from(quad)) {\n              position(x, y, z, l);\n              sprite(v[0], v[1]);\n            }\n          }\n        }\n      }\n    }\n\n    this._finalize();\n    this.clip();\n  }\n\n  clip(width, height, depth, items) {\n    if (width == null) {\n      ({ width } = this);\n    }\n    if (height == null) {\n      ({ height } = this);\n    }\n    if (depth == null) {\n      ({ depth } = this);\n    }\n    if (items == null) {\n      ({ items } = this);\n    }\n    this._clipGeometry(width, height, depth, items);\n    return this._clipOffsets(\n      6,\n      width,\n      height,\n      depth,\n      items,\n      this.width,\n      this.height,\n      this.depth,\n      this.items\n    );\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS202: Simplify dynamic range loops\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { BufferAttribute } from \"three/src/core/BufferAttribute.js\";\nimport { ClipGeometry } from \"./clipgeometry.js\";\n\n/*\nTriangle strips arranged in items, columns and rows\n\n+--+--+--+  +--+--+--+  +--+--+--+  +--+--+--+\n| /| /| /   | /| /| /   | /| /| /   | /| /| /\n+--+--+/    +--+--+/    +--+--+/    +--+--+/\n\n+--+--+--+  +--+--+--+  +--+--+--+  +--+--+--+\n| /| /| /   | /| /| /   | /| /| /   | /| /| /\n+--+--+/    +--+--+/    +--+--+/    +--+--+/\n\n+--+--+--+  +--+--+--+  +--+--+--+  +--+--+--+\n| /| /| /   | /| /| /   | /| /| /   | /| /| /\n+--+--+/    +--+--+/    +--+--+/    +--+--+/\n\n*/\n\nexport class StripGeometry extends ClipGeometry {\n  constructor(options) {\n    let depth, height, items, sides, width;\n    super(options);\n\n    this._clipUniforms();\n\n    this.items = items = +options.items || 2;\n    this.width = width = +options.width || 1;\n    this.height = height = +options.height || 1;\n    this.depth = depth = +options.depth || 1;\n    this.sides = sides = Math.max(0, items - 2);\n\n    const samples = width * height * depth;\n    const points = items * samples;\n    const triangles = sides * samples;\n\n    this.setIndex(new BufferAttribute(new Uint32Array(triangles * 3), 1));\n\n    this.setAttribute(\n      \"position4\",\n      new BufferAttribute(new Float32Array(points * 4), 4)\n    );\n    this.setAttribute(\n      \"strip\",\n      new BufferAttribute(new Float32Array(points * 3), 3)\n    );\n\n    const index = this._emitter(\"index\");\n    const position = this._emitter(\"position4\");\n    const strip = this._emitter(\"strip\");\n\n    let base = 0;\n    for (\n      let i = 0, end = samples, asc = 0 <= end;\n      asc ? i < end : i > end;\n      asc ? i++ : i--\n    ) {\n      let o = base;\n      for (\n        let j = 0, end1 = sides, asc1 = 0 <= end1;\n        asc1 ? j < end1 : j > end1;\n        asc1 ? j++ : j--\n      ) {\n        if (j & 1) {\n          index(o + 1);\n          index(o);\n          index(o + 2);\n        } else {\n          index(o);\n          index(o + 1);\n          index(o + 2);\n        }\n        o++;\n      }\n      base += items;\n    }\n\n    const last = items - 1;\n    for (\n      let z = 0, end2 = depth, asc2 = 0 <= end2;\n      asc2 ? z < end2 : z > end2;\n      asc2 ? z++ : z--\n    ) {\n      for (\n        let y = 0, end3 = height, asc3 = 0 <= end3;\n        asc3 ? y < end3 : y > end3;\n        asc3 ? y++ : y--\n      ) {\n        for (\n          let x = 0, end4 = width, asc4 = 0 <= end4;\n          asc4 ? x < end4 : x > end4;\n          asc4 ? x++ : x--\n        ) {\n          let f = 1;\n\n          position(x, y, z, 0);\n          strip(1, 2, f);\n\n          for (\n            let l = 1, end5 = last, asc5 = 1 <= end5;\n            asc5 ? l < end5 : l > end5;\n            asc5 ? l++ : l--\n          ) {\n            position(x, y, z, l);\n            strip(l - 1, l + 1, (f = -f));\n          }\n\n          position(x, y, z, last);\n          strip(last - 2, last - 1, -f);\n        }\n      }\n    }\n\n    this._finalize();\n    this.clip();\n  }\n\n  clip(width, height, depth, items) {\n    if (width == null) {\n      ({ width } = this);\n    }\n    if (height == null) {\n      ({ height } = this);\n    }\n    if (depth == null) {\n      ({ depth } = this);\n    }\n    if (items == null) {\n      ({ items } = this);\n    }\n    const sides = Math.max(0, items - 2);\n\n    this._clipGeometry(width, height, depth, items);\n    return this._clipOffsets(\n      3,\n      width,\n      height,\n      depth,\n      sides,\n      this.width,\n      this.height,\n      this.depth,\n      this.sides\n    );\n  }\n}\n","import { ArrayBuffer_ } from \"./buffer/arraybuffer.js\";\nimport { Arrow } from \"./meshes/arrow.js\";\nimport { Atlas } from \"./buffer/atlas.js\";\nimport { DataBuffer } from \"./buffer/databuffer.js\";\nimport { Debug } from \"./meshes/debug.js\";\nimport { Face } from \"./meshes/face.js\";\nimport { Line } from \"./meshes/line.js\";\nimport { MatrixBuffer } from \"./buffer/matrixbuffer.js\";\nimport { Memo } from \"./buffer/memo.js\";\nimport { MemoScreen } from \"./meshes/memoscreen.js\";\nimport { Point } from \"./meshes/point.js\";\nimport { PushBuffer } from \"./buffer/pushbuffer.js\";\nimport { Readback } from \"./buffer/readback.js\";\nimport { RenderToTexture } from \"./buffer/rendertotexture.js\";\nimport { Scene } from \"./scene.js\";\nimport { Screen } from \"./meshes/screen.js\";\nimport { Sprite } from \"./meshes/sprite.js\";\nimport { Strip } from \"./meshes/strip.js\";\nimport { Surface } from \"./meshes/surface.js\";\nimport { TextAtlas } from \"./buffer/textatlas.js\";\nimport { VoxelBuffer } from \"./buffer/voxelbuffer.js\";\n\nexport const Classes = {\n  sprite: Sprite,\n  point: Point,\n  line: Line,\n  surface: Surface,\n  face: Face,\n  strip: Strip,\n  arrow: Arrow,\n  screen: Screen,\n  memoScreen: MemoScreen,\n  debug: Debug,\n  dataBuffer: DataBuffer,\n  arrayBuffer: ArrayBuffer_,\n  matrixBuffer: MatrixBuffer,\n  voxelBuffer: VoxelBuffer,\n  pushBuffer: PushBuffer,\n  renderToTexture: RenderToTexture,\n  memo: Memo,\n  readback: Readback,\n  atlas: Atlas,\n  textAtlas: TextAtlas,\n  scene: Scene,\n};\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { Base } from \"./base.js\";\nimport { DoubleSide } from \"three/src/constants.js\";\nimport { Mesh } from \"three/src/objects/Mesh.js\";\nimport { SpriteGeometry } from \"../geometry/spritegeometry.js\";\n\nexport class Sprite extends Base {\n  constructor(renderer, shaders, options) {\n    let f;\n    super(renderer, shaders, options);\n\n    let { uniforms } = options;\n    const {\n      material,\n      position,\n      sprite,\n      map,\n      combine,\n      linear,\n      color,\n      mask,\n      stpq,\n    } = options;\n\n    if (uniforms == null) {\n      uniforms = {};\n    }\n\n    const hasStyle = uniforms.styleColor != null;\n\n    this.geometry = new SpriteGeometry({\n      items: options.items,\n      width: options.width,\n      height: options.height,\n      depth: options.depth,\n    });\n\n    this._adopt(uniforms);\n    this._adopt(this.geometry.uniforms);\n\n    // Shared vertex shader\n    const factory = shaders.material();\n    const v = factory.vertex;\n\n    v.pipe(this._vertexColor(color, mask));\n\n    v.require(this._vertexPosition(position, material, map, 2, stpq));\n    v.require(sprite);\n    v.pipe(\"sprite.position\", this.uniforms);\n    v.pipe(\"project.position\", this.uniforms);\n\n    // Shared fragment shader\n    factory.fragment = f = this._fragmentColor(\n      hasStyle,\n      material,\n      color,\n      mask,\n      map,\n      2,\n      stpq,\n      combine,\n      linear\n    );\n\n    // Split fragment into edge and fill pass for better z layering\n    const edgeFactory = shaders.material();\n    edgeFactory.vertex.pipe(v);\n    edgeFactory.fragment.pipe(f);\n    edgeFactory.fragment.pipe(\"fragment.transparent\", this.uniforms);\n\n    const fillFactory = shaders.material();\n    fillFactory.vertex.pipe(v);\n    fillFactory.fragment.pipe(f);\n    fillFactory.fragment.pipe(\"fragment.solid\", this.uniforms);\n\n    const fillOpts = fillFactory.link({\n      side: DoubleSide,\n    });\n    this.fillMaterial = this._material(fillOpts);\n\n    const edgeOpts = edgeFactory.link({\n      side: DoubleSide,\n    });\n    this.edgeMaterial = this._material(edgeOpts);\n\n    this.fillObject = new Mesh(this.geometry, this.fillMaterial);\n    this.edgeObject = new Mesh(this.geometry, this.edgeMaterial);\n\n    this._raw(this.fillObject);\n    this.fillObject.userData = fillOpts;\n\n    this._raw(this.edgeObject);\n    this.edgeObject.userData = edgeOpts;\n\n    this.renders = [this.fillObject, this.edgeObject];\n  }\n\n  show(transparent, blending, order, depth) {\n    this._show(this.edgeObject, true, blending, order, depth);\n    return this._show(this.fillObject, transparent, blending, order, depth);\n  }\n\n  dispose() {\n    this.geometry.dispose();\n    this.edgeMaterial.dispose();\n    this.fillMaterial.dispose();\n    this.nreders =\n      this.geometry =\n      this.edgeMaterial =\n      this.fillMaterial =\n      this.edgeObject =\n      this.fillObject =\n        null;\n    return super.dispose();\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { Base } from \"./base.js\";\nimport { DoubleSide } from \"three/src/constants.js\";\nimport { Mesh } from \"three/src/objects/Mesh.js\";\nimport { SpriteGeometry } from \"../geometry/spritegeometry.js\";\n\nexport class Point extends Base {\n  constructor(renderer, shaders, options) {\n    let f, left;\n    super(renderer, shaders, options);\n\n    let { uniforms, shape, fill } = options;\n\n    const {\n      material,\n      position,\n      color,\n      size,\n      mask,\n      map,\n      combine,\n      linear,\n      optical,\n      stpq,\n    } = options;\n\n    if (uniforms == null) {\n      uniforms = {};\n    }\n    shape = +shape != null ? +shape : 0;\n    if (fill == null) {\n      fill = true;\n    }\n\n    const hasStyle = uniforms.styleColor != null;\n\n    const shapes = [\n      \"circle\",\n      \"square\",\n      \"diamond\",\n      \"up\",\n      \"down\",\n      \"left\",\n      \"right\",\n    ];\n    const passes = [\n      \"circle\",\n      \"generic\",\n      \"generic\",\n      \"generic\",\n      \"generic\",\n      \"generic\",\n      \"generic\",\n    ];\n    const scales = [1.2, 1, 1.414, 1.16, 1.16, 1.16, 1.16];\n    const pass = passes[shape] != null ? passes[shape] : passes[0];\n    const _shape = shapes[shape] != null ? shapes[shape] : shapes[0];\n    const _scale = (left = optical && scales[shape]) != null ? left : 1;\n    const alpha = fill ? pass : `${pass}.hollow`;\n\n    this.geometry = new SpriteGeometry({\n      items: options.items,\n      width: options.width,\n      height: options.height,\n      depth: options.depth,\n    });\n\n    this._adopt(uniforms);\n    this._adopt(this.geometry.uniforms);\n\n    const defines = { POINT_SHAPE_SCALE: +(_scale + 0.00001) };\n\n    // Shared vertex shader\n    const factory = shaders.material();\n    const v = factory.vertex;\n\n    v.pipe(this._vertexColor(color, mask));\n\n    // Point sizing\n    if (size) {\n      v.isolate();\n      v.require(size);\n      v.require(\"point.size.varying\", this.uniforms);\n      v.end();\n    } else {\n      v.require(\"point.size.uniform\", this.uniforms);\n    }\n\n    v.require(this._vertexPosition(position, material, map, 2, stpq));\n\n    v.pipe(\"point.position\", this.uniforms, defines);\n    v.pipe(\"project.position\", this.uniforms);\n\n    // Shared fragment shader\n    factory.fragment = f = this._fragmentColor(\n      hasStyle,\n      material,\n      color,\n      mask,\n      map,\n      2,\n      stpq,\n      combine,\n      linear\n    );\n\n    // Split fragment into edge and fill pass for better z layering\n    const edgeFactory = shaders.material();\n    edgeFactory.vertex.pipe(v);\n    f = edgeFactory.fragment.pipe(factory.fragment);\n    f.require(`point.mask.${_shape}`, this.uniforms);\n    f.require(`point.alpha.${alpha}`, this.uniforms);\n    f.pipe(\"point.edge\", this.uniforms);\n\n    const fillFactory = shaders.material();\n    fillFactory.vertex.pipe(v);\n    f = fillFactory.fragment.pipe(factory.fragment);\n    f.require(`point.mask.${_shape}`, this.uniforms);\n    f.require(`point.alpha.${alpha}`, this.uniforms);\n    f.pipe(\"point.fill\", this.uniforms);\n\n    const fillOpts = fillFactory.link({\n      side: DoubleSide,\n    });\n    this.fillMaterial = this._material(fillOpts);\n\n    const edgeOpts = edgeFactory.link({\n      side: DoubleSide,\n    });\n    this.edgeMaterial = this._material(edgeOpts);\n\n    this.fillObject = new Mesh(this.geometry, this.fillMaterial);\n    this.edgeObject = new Mesh(this.geometry, this.edgeMaterial);\n\n    this._raw(this.fillObject);\n    this.fillObject.userData = fillOpts;\n\n    this._raw(this.edgeObject);\n    this.edgeObject.userData = edgeOpts;\n\n    this.renders = [this.fillObject, this.edgeObject];\n  }\n\n  show(transparent, blending, order, depth) {\n    this._show(this.edgeObject, true, blending, order, depth);\n    return this._show(this.fillObject, transparent, blending, order, depth);\n  }\n\n  dispose() {\n    this.geometry.dispose();\n    this.edgeMaterial.dispose();\n    this.fillMaterial.dispose();\n    this.renders =\n      this.edgeObject =\n      this.fillObject =\n      this.geometry =\n      this.edgeMaterial =\n      this.fillMaterial =\n        null;\n    return super.dispose();\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { Base } from \"./base.js\";\nimport { DoubleSide } from \"three/src/constants.js\";\nimport { LineGeometry } from \"../geometry/linegeometry.js\";\nimport { Mesh } from \"three/src/objects/Mesh.js\";\n\nexport class Line extends Base {\n  constructor(renderer, shaders, options) {\n    let left;\n    super(renderer, shaders, options);\n\n    let { uniforms, stroke, join } = options;\n\n    const {\n      material,\n      position,\n      color,\n      mask,\n      map,\n      combine,\n      stpq,\n      linear,\n      clip,\n      proximity,\n    } = options;\n\n    if (uniforms == null) {\n      uniforms = {};\n    }\n    stroke = [null, \"dotted\", \"dashed\"][stroke];\n\n    const hasStyle = uniforms.styleColor != null;\n\n    // Line join\n    join = (left = [\"miter\", \"round\", \"bevel\"][join]) != null ? left : \"miter\";\n    const detail = { miter: 1, round: 4, bevel: 2 }[join];\n\n    this.geometry = new LineGeometry({\n      samples: options.samples,\n      strips: options.strips,\n      ribbons: options.ribbons,\n      layers: options.layers,\n      anchor: options.anchor,\n      closed: options.closed,\n      detail,\n    });\n\n    this._adopt(uniforms);\n    this._adopt(this.geometry.uniforms);\n\n    const factory = shaders.material();\n\n    const defs = {};\n    if (stroke) {\n      defs.LINE_STROKE = \"\";\n    }\n    if (clip) {\n      defs.LINE_CLIP = \"\";\n    }\n    if (proximity != null) {\n      defs.LINE_PROXIMITY = \"\";\n    }\n\n    defs[\"LINE_JOIN_\" + join.toUpperCase()] = \"\";\n    if (detail > 1) {\n      defs[\"LINE_JOIN_DETAIL\"] = detail;\n    }\n\n    const v = factory.vertex;\n\n    v.pipe(this._vertexColor(color, mask));\n\n    v.require(this._vertexPosition(position, material, map, 2, stpq));\n    v.pipe(\"line.position\", this.uniforms, defs);\n    v.pipe(\"project.position\", this.uniforms);\n\n    const f = factory.fragment;\n    if (stroke) {\n      f.pipe(`fragment.clip.${stroke}`, this.uniforms);\n    }\n    if (clip) {\n      f.pipe(\"fragment.clip.ends\", this.uniforms);\n    }\n    if (proximity != null) {\n      f.pipe(\"fragment.clip.proximity\", this.uniforms);\n    }\n\n    f.pipe(\n      this._fragmentColor(\n        hasStyle,\n        material,\n        color,\n        mask,\n        map,\n        2,\n        stpq,\n        combine,\n        linear\n      )\n    );\n\n    f.pipe(\"fragment.color\", this.uniforms);\n\n    const opts = factory.link({\n      side: DoubleSide,\n    });\n    this.material = this._material(opts);\n\n    const object = new Mesh(this.geometry, this.material);\n    object.userData = opts;\n\n    this._raw(object);\n    this.renders = [object];\n  }\n\n  dispose() {\n    this.geometry.dispose();\n    this.material.dispose();\n    this.renders = this.geometry = this.material = null;\n    return super.dispose();\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { Base } from \"./base.js\";\nimport { DoubleSide } from \"three/src/constants.js\";\nimport { Mesh } from \"three/src/objects/Mesh.js\";\nimport { SurfaceGeometry } from \"../geometry/surfacegeometry.js\";\n\nexport class Surface extends Base {\n  constructor(renderer, shaders, options) {\n    let defs, f;\n    super(renderer, shaders, options);\n\n    let { uniforms, material } = options;\n\n    const { position, color, mask, map, combine, linear, stpq, intUV } =\n      options;\n\n    if (uniforms == null) {\n      uniforms = {};\n    }\n    if (material == null) {\n      material = true;\n    }\n\n    const hasStyle = uniforms.styleColor != null;\n\n    this.geometry = new SurfaceGeometry({\n      width: options.width,\n      height: options.height,\n      surfaces: options.surfaces,\n      layers: options.layers,\n      closedX: options.closedX,\n      closedY: options.closedY,\n    });\n\n    this._adopt(uniforms);\n    this._adopt(this.geometry.uniforms);\n\n    const factory = shaders.material();\n\n    const v = factory.vertex;\n\n    if (intUV) {\n      defs = { POSITION_UV_INT: \"\" };\n    }\n\n    v.pipe(this._vertexColor(color, mask));\n\n    v.require(this._vertexPosition(position, material, map, 2, stpq));\n    if (!material) {\n      v.pipe(\"surface.position\", this.uniforms, defs);\n    }\n    if (material) {\n      v.pipe(\"surface.position.normal\", this.uniforms, defs);\n    }\n    v.pipe(\"project.position\", this.uniforms);\n\n    factory.fragment = f = this._fragmentColor(\n      hasStyle,\n      material,\n      color,\n      mask,\n      map,\n      2,\n      stpq,\n      combine,\n      linear\n    );\n\n    f.pipe(\"fragment.color\", this.uniforms);\n\n    const opts = factory.link({\n      side: DoubleSide,\n    });\n    this.material = this._material(opts);\n\n    const object = new Mesh(this.geometry, this.material);\n    object.userData = opts;\n\n    this._raw(object);\n    this.renders = [object];\n  }\n\n  dispose() {\n    this.geometry.dispose();\n    this.material.dispose();\n    this.renders = this.geometry = this.material = null;\n    return super.dispose();\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { Base } from \"./base.js\";\nimport { DoubleSide } from \"three/src/constants.js\";\nimport { FaceGeometry } from \"../geometry/facegeometry.js\";\nimport { Mesh } from \"three/src/objects/Mesh.js\";\n\nexport class Face extends Base {\n  constructor(renderer, shaders, options) {\n    let f;\n    super(renderer, shaders, options);\n\n    let { uniforms, material } = options;\n    const { position, color, mask, map, combine, stpq, linear } = options;\n\n    if (uniforms == null) {\n      uniforms = {};\n    }\n    if (material == null) {\n      material = true;\n    }\n\n    const hasStyle = uniforms.styleColor != null;\n\n    this.geometry = new FaceGeometry({\n      items: options.items,\n      width: options.width,\n      height: options.height,\n      depth: options.depth,\n    });\n\n    this._adopt(uniforms);\n    this._adopt(this.geometry.uniforms);\n\n    const factory = shaders.material();\n\n    const v = factory.vertex;\n\n    v.pipe(this._vertexColor(color, mask));\n\n    v.require(this._vertexPosition(position, material, map, 2, stpq));\n    if (!material) {\n      v.pipe(\"face.position\", this.uniforms);\n    }\n    if (material) {\n      v.pipe(\"face.position.normal\", this.uniforms);\n    }\n    v.pipe(\"project.position\", this.uniforms);\n\n    factory.fragment = f = this._fragmentColor(\n      hasStyle,\n      material,\n      color,\n      mask,\n      map,\n      2,\n      stpq,\n      combine,\n      linear\n    );\n\n    f.pipe(\"fragment.color\", this.uniforms);\n\n    const opts = factory.link({\n      side: DoubleSide,\n    });\n    this.material = this._material(opts);\n\n    const object = new Mesh(this.geometry, this.material);\n    object.userData = opts;\n\n    this._raw(object);\n    this.renders = [object];\n  }\n\n  dispose() {\n    this.geometry.dispose();\n    this.material.dispose();\n    this.renders = this.geometry = this.material = null;\n    return super.dispose();\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { Base } from \"./base.js\";\nimport { DoubleSide } from \"three/src/constants.js\";\nimport { Mesh } from \"three/src/objects/Mesh.js\";\nimport { StripGeometry } from \"../geometry/stripgeometry.js\";\n\nexport class Strip extends Base {\n  constructor(renderer, shaders, options) {\n    let f;\n    super(renderer, shaders, options);\n\n    let { uniforms, material } = options;\n    const { position, color, mask, map, combine, linear, stpq } = options;\n\n    if (uniforms == null) {\n      uniforms = {};\n    }\n    if (material == null) {\n      material = true;\n    }\n\n    const hasStyle = uniforms.styleColor != null;\n\n    this.geometry = new StripGeometry({\n      items: options.items,\n      width: options.width,\n      height: options.height,\n      depth: options.depth,\n    });\n\n    this._adopt(uniforms);\n    this._adopt(this.geometry.uniforms);\n\n    const factory = shaders.material();\n\n    const v = factory.vertex;\n\n    v.pipe(this._vertexColor(color, mask));\n\n    v.require(this._vertexPosition(position, material, map, 2, stpq));\n    if (!material) {\n      v.pipe(\"mesh.position\", this.uniforms);\n    }\n    if (material) {\n      v.pipe(\"strip.position.normal\", this.uniforms);\n    }\n    v.pipe(\"project.position\", this.uniforms);\n\n    factory.fragment = f = this._fragmentColor(\n      hasStyle,\n      material,\n      color,\n      mask,\n      map,\n      2,\n      stpq,\n      combine,\n      linear\n    );\n\n    f.pipe(\"fragment.color\", this.uniforms);\n\n    const opts = factory.link({\n      side: DoubleSide,\n    });\n    this.material = this._material(opts);\n\n    const object = new Mesh(this.geometry, this.material);\n    object.userData = opts;\n\n    this._raw(object);\n    this.renders = [object];\n  }\n\n  dispose() {\n    this.geometry.dispose();\n    this.material.dispose();\n    this.renders = this.geometry = this.material = null;\n    return super.dispose();\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { ArrowGeometry } from \"../geometry/arrowgeometry.js\";\nimport { Base } from \"./base.js\";\nimport { DoubleSide } from \"three/src/constants.js\";\nimport { Mesh } from \"three/src/objects/Mesh.js\";\n\nexport class Arrow extends Base {\n  constructor(renderer, shaders, options) {\n    let f;\n    super(renderer, shaders, options);\n\n    let { uniforms } = options;\n\n    const { material, position, color, mask, map, combine, stpq, linear } =\n      options;\n    if (uniforms == null) {\n      uniforms = {};\n    }\n\n    const hasStyle = uniforms.styleColor != null;\n\n    this.geometry = new ArrowGeometry({\n      sides: options.sides,\n      samples: options.samples,\n      strips: options.strips,\n      ribbons: options.ribbons,\n      layers: options.layers,\n      anchor: options.anchor,\n      flip: options.flip,\n    });\n\n    this._adopt(uniforms);\n    this._adopt(this.geometry.uniforms);\n\n    const factory = shaders.material();\n\n    const v = factory.vertex;\n\n    v.pipe(this._vertexColor(color, mask));\n\n    v.require(this._vertexPosition(position, material, map, 1, stpq));\n    v.pipe(\"arrow.position\", this.uniforms);\n    v.pipe(\"project.position\", this.uniforms);\n\n    factory.fragment = f = this._fragmentColor(\n      hasStyle,\n      material,\n      color,\n      mask,\n      map,\n      1,\n      stpq,\n      combine,\n      linear\n    );\n\n    f.pipe(\"fragment.color\", this.uniforms);\n\n    const opts = factory.link({\n      side: DoubleSide,\n    });\n    this.material = this._material(opts);\n\n    const object = new Mesh(this.geometry, this.material);\n    object.frustumCulled = false;\n    object.matrixAutoUpdate = false;\n    object.userData = opts;\n\n    this._raw(object);\n    this.renders = [object];\n  }\n\n  dispose() {\n    this.geometry.dispose();\n    this.material.dispose();\n    this.renders = this.geometry = this.material = null;\n    return super.dispose();\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { Base } from \"./base.js\";\nimport { DoubleSide } from \"three/src/constants.js\";\nimport { Mesh } from \"three/src/objects/Mesh.js\";\nimport { MeshBasicMaterial } from \"three/src/materials/MeshBasicMaterial.js\";\nimport { PlaneGeometry } from \"three/src/geometries/PlaneGeometry.js\";\n\nexport class Debug extends Base {\n  constructor(renderer, shaders, options) {\n    super(renderer, shaders, options);\n\n    this.geometry = new PlaneGeometry(1, 1);\n    this.material = new MeshBasicMaterial({ map: options.map });\n    this.material.side = DoubleSide;\n\n    const object = new Mesh(this.geometry, this.material);\n    object.position.x += options.x || 0;\n    object.position.y += options.y || 0;\n    object.frustumCulled = false;\n    object.scale.set(2, 2, 2);\n    object.__debug = true;\n\n    this.objects = [object];\n  }\n\n  dispose() {\n    this.geometry.dispose();\n    this.material.dispose();\n    this.objects = this.geometry = this.material = null;\n    return super.dispose();\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UData from \"../../util/data.js\";\nimport { DataBuffer } from \"./databuffer.js\";\n\n/*\n * 1D + history array\n */\nexport class ArrayBuffer_ extends DataBuffer {\n  constructor(renderer, shaders, options) {\n    const width = options.width || 1;\n    const history = options.history || 1;\n\n    options.width = width;\n    options.height = history;\n    options.depth = 1;\n\n    super(renderer, shaders, options, false);\n\n    this.width = width;\n    this.history = history;\n    this.samples = width;\n    this.wrap = history > 1;\n\n    this.build(options);\n  }\n\n  build(_options) {\n    super.build();\n\n    this.index = 0;\n    this.pad = 0;\n    return (this.streamer = this.generate(this.data));\n  }\n\n  setActive(i) {\n    return (this.pad = Math.max(0, this.width - i));\n  }\n\n  fill() {\n    const { callback } = this;\n    if (typeof callback.reset === \"function\") {\n      callback.reset();\n    }\n\n    const { emit, count, done, reset } = this.streamer;\n    reset();\n\n    const limit = this.samples - this.pad;\n\n    let i = 0;\n    while (!done() && i < limit && callback(emit, i++) !== false) {\n      true;\n    }\n\n    return Math.floor(count() / this.items);\n  }\n\n  write(n) {\n    if (n == null) {\n      n = this.samples;\n    }\n    n *= this.items;\n    this.texture.write(this.data, 0, this.index, n, 1);\n    this.dataPointer.set(0.5, this.index + 0.5);\n    this.index = (this.index + this.history - 1) % this.history;\n    return (this.filled = Math.min(this.history, this.filled + 1));\n  }\n\n  through(callback, target) {\n    let dst, src;\n    const { consume, done } = (src = this.streamer);\n    const { emit } = (dst = target.streamer);\n\n    let i = 0;\n\n    let pipe = () => consume((x, y, z, w) => callback(emit, x, y, z, w, i));\n    pipe = UData.repeatCall(pipe, this.items);\n\n    return () => {\n      src.reset();\n      dst.reset();\n      const limit = this.samples - this.pad;\n      i = 0;\n      while (!done() && i < limit) {\n        pipe();\n        i++;\n      }\n\n      return src.count();\n    };\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UData from \"../../util/data.js\";\nimport { DataBuffer } from \"./databuffer.js\";\n\n/*\n * 2D + history array\n */\nexport class MatrixBuffer extends DataBuffer {\n  constructor(renderer, shaders, options) {\n    const width = options.width || 1;\n    const height = options.height || 1;\n    const history = options.history || 1;\n\n    options.depth = history;\n\n    super(renderer, shaders, options, false);\n\n    this.width = width;\n    this.height = height;\n    this.history = history;\n    this.samples = width * height;\n    this.wrap = history > 1;\n\n    this.build(options);\n  }\n\n  build(_options) {\n    super.build();\n\n    this.index = 0;\n    this.pad = { x: 0, y: 0 };\n    return (this.streamer = this.generate(this.data));\n  }\n\n  getFilled() {\n    return this.filled;\n  }\n\n  setActive(i, j) {\n    let ref;\n    return (\n      ([this.pad.x, this.pad.y] = Array.from(\n        (ref = [Math.max(0, this.width - i), Math.max(0, this.height - j)])\n      )),\n      ref\n    );\n  }\n\n  fill() {\n    let j, k, repeat;\n    const { callback } = this;\n    if (typeof callback.reset === \"function\") {\n      callback.reset();\n    }\n\n    const { emit, skip, count, done, reset } = this.streamer;\n    reset();\n\n    const n = this.width;\n    const pad = this.pad.x;\n    const limit = this.samples - this.pad.y * n;\n\n    let i = (j = k = 0);\n    if (pad) {\n      while (!done() && k < limit) {\n        k++;\n        repeat = callback(emit, i, j);\n        if (++i === n - pad) {\n          skip(pad);\n          i = 0;\n          j++;\n        }\n        if (repeat === false) {\n          break;\n        }\n      }\n    } else {\n      while (!done() && k < limit) {\n        k++;\n        repeat = callback(emit, i, j);\n        if (++i === n) {\n          i = 0;\n          j++;\n        }\n        if (repeat === false) {\n          break;\n        }\n      }\n    }\n\n    return Math.floor(count() / this.items);\n  }\n\n  write(n) {\n    if (n == null) {\n      n = this.samples;\n    }\n    n *= this.items;\n    const width = this.width * this.items;\n    const height = Math.ceil(n / width);\n\n    this.texture.write(this.data, 0, this.index * this.height, width, height);\n    this.dataPointer.set(0.5, this.index * this.height + 0.5);\n    this.index = (this.index + this.history - 1) % this.history;\n    return (this.filled = Math.min(this.history, this.filled + 1));\n  }\n\n  through(callback, target) {\n    let dst, j, src;\n    const { consume, skip, done } = (src = this.streamer);\n    const { emit } = (dst = target.streamer);\n\n    let i = (j = 0);\n\n    let pipe = () => consume((x, y, z, w) => callback(emit, x, y, z, w, i, j));\n    pipe = UData.repeatCall(pipe, this.items);\n\n    return () => {\n      let k;\n      src.reset();\n      dst.reset();\n\n      const n = this.width;\n      const pad = this.pad.x;\n      const limit = this.samples - this.pad.y * n;\n\n      i = j = k = 0;\n      if (pad) {\n        while (!done() && k < limit) {\n          k++;\n          pipe();\n          if (++i === n - pad) {\n            skip(pad);\n            i = 0;\n            j++;\n          }\n        }\n      } else {\n        while (!done() && k < limit) {\n          k++;\n          pipe();\n          if (++i === n) {\n            i = 0;\n            j++;\n          }\n        }\n      }\n\n      return src.count();\n    };\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UData from \"../../util/data.js\";\nimport { DataBuffer } from \"./databuffer.js\";\n\n//\n// 3D array\n//\nexport class VoxelBuffer extends DataBuffer {\n  build(_options) {\n    super.build();\n    this.pad = { x: 0, y: 0, z: 0 };\n    return (this.streamer = this.generate(this.data));\n  }\n\n  setActive(i, j, k) {\n    let ref;\n    return (\n      ([this.pad.x, this.pad.y, this.pad.z] = Array.from(\n        (ref = [\n          Math.max(0, this.width - i),\n          Math.max(0, this.height - j),\n          Math.max(0, this.depth - k),\n        ])\n      )),\n      ref\n    );\n  }\n\n  fill() {\n    let j, k, l, repeat;\n    const { callback } = this;\n    if (typeof callback.reset === \"function\") {\n      callback.reset();\n    }\n\n    const { emit, skip, count, done, reset } = this.streamer;\n    reset();\n\n    const n = this.width;\n    const m = this.height;\n    const padX = this.pad.x;\n    const padY = this.pad.y;\n    const limit = this.samples - this.pad.z * n * m;\n\n    let i = (j = k = l = 0);\n    if (padX > 0 || padY > 0) {\n      while (!done() && l < limit) {\n        l++;\n        repeat = callback(emit, i, j, k);\n        if (++i === n - padX) {\n          skip(padX);\n          i = 0;\n          if (++j === m - padY) {\n            skip(n * padY);\n            j = 0;\n            k++;\n          }\n        }\n        if (repeat === false) {\n          break;\n        }\n      }\n    } else {\n      while (!done() && l < limit) {\n        l++;\n        repeat = callback(emit, i, j, k);\n        if (++i === n) {\n          i = 0;\n          if (++j === m) {\n            j = 0;\n            k++;\n          }\n        }\n        if (repeat === false) {\n          break;\n        }\n      }\n    }\n\n    return Math.floor(count() / this.items);\n  }\n\n  through(callback, target) {\n    // must be identical sized buffers w/ identical active areas\n\n    let dst, j, k, src;\n    const { consume, done, skip } = (src = this.streamer);\n    const { emit } = (dst = target.streamer);\n\n    let i = (j = k = 0);\n\n    let pipe = () =>\n      consume((x, y, z, w) => callback(emit, x, y, z, w, i, j, k));\n    pipe = UData.repeatCall(pipe, this.items);\n\n    return () => {\n      let l;\n      src.reset();\n      dst.reset();\n      const n = this.width;\n      const m = this.height;\n      const padX = this.pad.x;\n      const padY = this.pad.y;\n      const limit = this.samples - this.pad.z * n * m;\n\n      i = j = k = l = 0;\n      if (padX > 0 || padY > 0) {\n        while (!done() && l < limit) {\n          l++;\n          pipe();\n          if (++i === n - padX) {\n            skip(padX);\n            i = 0;\n            if (++j === m - padY) {\n              skip(n * padY);\n              j = 0;\n              k++;\n            }\n          }\n        }\n      } else {\n        while (!done() && l < limit) {\n          l++;\n          pipe();\n          if (++i === n) {\n            i = 0;\n            if (++j === m) {\n              j = 0;\n              k++;\n            }\n          }\n        }\n      }\n\n      return src.count();\n    };\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Buffer } from \"./buffer.js\";\n\n/*\n * Buffer for CPU-side use\n */\nexport class PushBuffer extends Buffer {\n  constructor(renderer, shaders, options) {\n    const width = options.width || 1;\n    const height = options.height || 1;\n    const depth = options.depth || 1;\n    const samples = width * height * depth;\n\n    if (!options.samples) {\n      options.samples = samples;\n    }\n\n    super(renderer, shaders, options);\n\n    this.width = width;\n    this.height = height;\n    this.depth = depth;\n    if (this.samples == null) {\n      this.samples = samples;\n    }\n\n    this.build(options);\n  }\n\n  build(_options) {\n    this.data = [];\n    this.data.length = this.samples;\n\n    this.filled = 0;\n    this.pad = { x: 0, y: 0, z: 0 };\n    return (this.streamer = this.generate(this.data));\n  }\n\n  dispose() {\n    this.data = null;\n    return super.dispose();\n  }\n\n  getFilled() {\n    return this.filled;\n  }\n\n  setActive(i, j, k) {\n    let ref;\n    return (\n      ([this.pad.x, this.pad.y, this.pad.z] = Array.from(\n        (ref = [this.width - i, this.height - j, this.depth - k])\n      )),\n      ref\n    );\n  }\n\n  read() {\n    return this.data;\n  }\n\n  copy(data) {\n    const n = Math.min(data.length, this.samples);\n    const d = this.data;\n    return __range__(0, n, false).map((i) => (d[i] = data[i]));\n  }\n\n  fill() {\n    let j, k, l, repeat;\n    const { callback } = this;\n    if (typeof callback.reset === \"function\") {\n      callback.reset();\n    }\n\n    const { emit, skip, count, done, reset } = this.streamer;\n    reset();\n\n    const n = this.width;\n    const m = this.height;\n    const padX = this.pad.x;\n    const padY = this.pad.y;\n    const limit = this.samples - this.pad.z * n * m;\n\n    let i = (j = k = l = 0);\n    if (padX > 0 || padY > 0) {\n      while (!done() && l < limit) {\n        l++;\n        repeat = callback(emit, i, j, k);\n        if (++i === n - padX) {\n          skip(padX);\n          i = 0;\n          if (++j === m - padY) {\n            skip(n * padY);\n            j = 0;\n            k++;\n          }\n        }\n        if (repeat === false) {\n          break;\n        }\n      }\n    } else {\n      while (!done() && l < limit) {\n        l++;\n        repeat = callback(emit, i, j, k);\n        if (++i === n) {\n          i = 0;\n          if (++j === m) {\n            j = 0;\n            k++;\n          }\n        }\n        if (repeat === false) {\n          break;\n        }\n      }\n    }\n\n    this.filled = 1;\n    return count();\n  }\n}\n\nfunction __range__(left, right, inclusive) {\n  const range = [];\n  const ascending = left < right;\n  const end = !inclusive ? right : ascending ? right + 1 : right - 1;\n  for (let i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {\n    range.push(i);\n  }\n  return range;\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as UData from \"../../util/data.js\";\nimport * as UGLSL from \"../../util/glsl.js\";\n\nimport { FloatType, UnsignedByteType } from \"three/src/constants.js\";\nimport { Memo } from \"./memo.js\";\nimport { MemoScreen } from \"../meshes/memoscreen.js\";\nimport { Renderable } from \"../renderable.js\";\nimport { Vector4 } from \"three/src/math/Vector4.js\";\n\n/*\n * Readback up to 4D array of up to 4D data from GL\n */\nexport class Readback extends Renderable {\n  constructor(renderer, shaders, options) {\n    super(renderer, shaders);\n\n    if (this.items == null) {\n      this.items = options.items || 1;\n    }\n    if (this.channels == null) {\n      this.channels = options.channels || 4;\n    }\n    if (this.width == null) {\n      this.width = options.width || 1;\n    }\n    if (this.height == null) {\n      this.height = options.height || 1;\n    }\n    if (this.depth == null) {\n      this.depth = options.depth || 1;\n    }\n    if (this.type == null) {\n      this.type = options.type || FloatType;\n    }\n    if (this.stpq == null) {\n      this.stpq = options.stpq || false;\n    }\n    this.isFloat = this.type === FloatType;\n\n    this.active = this.sampled = this.rect = this.pad = null;\n\n    this.build(options);\n\n    /*\n    * log precision\n    gl = @gl\n    for name, pass of {Vertex: gl.VERTEX_SHADER, Fragment: gl.FRAGMENT_SHADER}\n      bits = for prec in [gl.LOW_FLOAT, gl.MEDIUM_FLOAT, gl.HIGH_FLOAT]\n        gl.getShaderPrecisionFormat(pass, prec).precision\n      console.log name, 'shader precision',  bits\n    */\n  }\n\n  build(options) {\n    let channels, encoder, stretch;\n    const { map } = options;\n    const { indexer } = options;\n    const isIndexed = indexer != null && !indexer.empty();\n\n    let { stpq } = this;\n    const { items, width, height, depth } = this;\n\n    let sampler = map;\n    if (isIndexed) {\n      // Preserve original xyzw offset of datapoint to tie it back to the source\n\n      // Modulus to pack xyzw into a single integer index\n      this._adopt({\n        indexModulus: {\n          type: \"v4\",\n          value: new Vector4(items, items * width, items * width * height, 1),\n        },\n      });\n\n      // Build shader to pack XYZ + index into a single RGBA\n      sampler = this.shaders.shader();\n      sampler.require(map);\n      sampler.require(indexer);\n      //sampler.require UGLSL.identity 'vec4'\n      sampler.pipe(\"float.index.pack\", this.uniforms);\n    }\n\n    if (this.isFloat && this.channels > 1) {\n      // Memoize multi-channel float data into float buffer first\n      this.floatMemo = new Memo(this.renderer, this.shaders, {\n        items,\n        channels: 4, // non-RGBA render target not supported\n        width,\n        height,\n        depth,\n        history: 0,\n        type: FloatType,\n      });\n\n      this.floatCompose = new MemoScreen(this.renderer, this.shaders, {\n        map: sampler,\n        items,\n        width,\n        height,\n        depth,\n        stpq,\n      });\n\n      this.floatMemo.adopt(this.floatCompose);\n\n      // Second pass won't need texture coordinates\n      stpq = false;\n\n      // Replace sampler with memoized sampler\n      sampler = this.shaders.shader();\n      this.floatMemo.shaderAbsolute(sampler);\n    }\n\n    if (this.isFloat) {\n      // Encode float data into byte buffer\n      stretch = this.channels;\n      channels = 4; // one 32-bit float per pixel\n    } else {\n      // Render byte data directly\n      stretch = 1;\n      channels = this.channels;\n    }\n\n    if (stretch > 1) {\n      // Stretch horizontally, sampling once per channel\n      encoder = this.shaders.shader();\n      encoder.pipe(UGLSL.mapByte2FloatOffset(stretch));\n      encoder.require(sampler);\n      encoder.pipe(\"float.stretch\");\n      encoder.pipe(\"float.encode\");\n      sampler = encoder;\n    } else if (this.isFloat) {\n      // Direct sampling\n      encoder = this.shaders.shader();\n      encoder.pipe(sampler);\n      encoder.pipe(UGLSL.truncateVec(4, 1));\n      encoder.pipe(\"float.encode\");\n      sampler = encoder;\n    }\n\n    // Memoize byte data\n    this.byteMemo = new Memo(this.renderer, this.shaders, {\n      items: items * stretch,\n      channels: channels, // non-RGBA render target not supported\n      width,\n      height,\n      depth,\n      history: 0,\n      type: UnsignedByteType,\n    });\n\n    this.byteCompose = new MemoScreen(this.renderer, this.shaders, {\n      map: sampler,\n      items: items * stretch,\n      width,\n      height,\n      depth,\n      stpq,\n    });\n\n    this.byteMemo.adopt(this.byteCompose);\n\n    // CPU-side buffers\n    const w = items * width * stretch;\n    const h = height * depth;\n\n    this.samples = this.width * this.height * this.depth;\n\n    this.bytes = new Uint8Array(w * h * 4); // non-RGBA render target not supported\n    if (this.isFloat) {\n      this.floats = new Float32Array(this.bytes.buffer);\n    }\n    this.data = this.isFloat ? this.floats : this.bytes;\n    this.streamer = this.generate(this.data);\n\n    this.active = { items: 0, width: 0, height: 0, depth: 0 };\n    this.sampled = { items: 0, width: 0, height: 0, depth: 0 };\n    this.rect = { w: 0, h: 0 };\n    this.pad = { x: 0, y: 0, z: 0, w: 0 };\n\n    this.stretch = stretch;\n    this.isIndexed = isIndexed;\n\n    return this.setActive(items, width, height, depth);\n  }\n\n  generate(data) {\n    return UData.getStreamer(data, this.samples, 4, this.items);\n  } // non-RGBA render target not supported\n\n  setActive(items, width, height, depth) {\n    let ref;\n    if (\n      items === this.active.items &&\n      width === this.active.width &&\n      height === this.active.height &&\n      depth === this.active.depth\n    ) {\n      return;\n    }\n\n    // Actively sampled area\n    [\n      this.active.items,\n      this.active.width,\n      this.active.height,\n      this.active.depth,\n    ] = Array.from([items, width, height, depth]);\n\n    // Render only necessary samples in RTTs\n    if (this.floatCompose != null) {\n      this.floatCompose.cover(width, height, depth);\n    }\n    if (this.byteCompose != null) {\n      this.byteCompose.cover(width * this.stretch, height, depth);\n    }\n\n    // Calculate readback buffer geometry\n    ({ items } = this);\n    ({ width } = this.active);\n    height = this.depth === 1 ? this.active.height : this.height;\n    ({ depth } = this.active);\n    const w = items * width * this.stretch;\n    const h = height * depth;\n\n    // Calculate array paddings on readback\n    [\n      this.sampled.items,\n      this.sampled.width,\n      this.sampled.height,\n      this.sampled.depth,\n    ] = Array.from([items, width, height, depth]);\n    [this.rect.w, this.rect.h] = Array.from([w, h]);\n    return (\n      ([this.pad.x, this.pad.y, this.pad.z, this.pad.w] = Array.from(\n        (ref = [\n          this.sampled.width - this.active.width,\n          this.sampled.height - this.active.height,\n          this.sampled.depth - this.active.depth,\n          this.sampled.items - this.active.items,\n        ])\n      )),\n      ref\n    );\n  }\n\n  update(camera) {\n    if (this.floatMemo != null) {\n      this.floatMemo.render(camera);\n    }\n    return this.byteMemo != null ? this.byteMemo.render(camera) : undefined;\n  }\n\n  post() {\n    const currentTarget = this.renderer.getRenderTarget();\n    this.renderer.setRenderTarget(this.byteMemo.target.targets[0]);\n    this.gl.readPixels(\n      0,\n      0,\n      this.rect.w,\n      this.rect.h,\n      this.gl.RGBA,\n      this.gl.UNSIGNED_BYTE,\n      this.bytes\n    );\n    this.renderer.setRenderTarget(currentTarget);\n  }\n\n  readFloat(n) {\n    return this.floatMemo != null ? this.floatMemo.read(n) : undefined;\n  }\n  readByte(n) {\n    return this.byteMemo != null ? this.byteMemo.read(n) : undefined;\n  }\n\n  setCallback(callback) {\n    this.emitter = this.callback(callback);\n  }\n\n  callback(callback) {\n    if (!this.isIndexed) {\n      return callback;\n    }\n\n    const n = this.width;\n    const m = this.height;\n    const p = this.items;\n\n    // Decode packed index\n    const f = function (x, y, z, w) {\n      let idx = w;\n      const ll = idx % p;\n      idx = (idx - ll) / p;\n      const ii = idx % n;\n      idx = (idx - ii) / n;\n      const jj = idx % m;\n      idx = (idx - jj) / m;\n      const kk = idx;\n\n      return callback(x, y, z, w, ii, jj, kk, ll);\n    };\n\n    f.reset = () =>\n      typeof callback.reset === \"function\" ? callback.reset() : undefined;\n    return f;\n  }\n\n  iterate() {\n    let j, k, l;\n    let emit = this.emitter;\n    if (typeof emit.reset === \"function\") {\n      emit.reset();\n    }\n\n    const { consume, skip, count, done, reset } = this.streamer;\n    reset();\n\n    const n = this.sampled.width | 0;\n    let m = this.sampled.height | 0;\n    const o = this.sampled.depth | 0;\n    const p = this.sampled.items | 0;\n    const padX = this.pad.x | 0;\n    const padY = this.pad.y | 0;\n    const padZ = this.pad.z | 0;\n    const padW = this.pad.w | 0;\n    const limit = n * m * p * (o - padZ);\n\n    if (!this.isIndexed) {\n      const callback = emit;\n      emit = (x, y, z, w) => callback(x, y, z, w, i, j, k, l);\n    }\n\n    let i = (j = k = l = m = 0);\n    while (!done() && m < limit) {\n      m++;\n      const repeat = consume(emit);\n      if (++l === p - padW) {\n        skip(padX);\n        l = 0;\n        if (++i === n - padX) {\n          skip(p * padX);\n          i = 0;\n          if (++j === m - padY) {\n            skip(p * n * padY);\n            j = 0;\n            k++;\n          }\n        }\n      }\n      if (repeat === false) {\n        break;\n      }\n    }\n\n    return Math.floor(count() / p);\n  }\n\n  dispose() {\n    if (this.floatMemo != null) {\n      this.floatMemo.unadopt(this.floatCompose);\n    }\n    if (this.floatMemo != null) {\n      this.floatMemo.dispose();\n    }\n    if (this.floatCompose != null) {\n      this.floatCompose.dispose();\n    }\n\n    if (this.byteMemo != null) {\n      this.byteMemo.unadopt(this.byteCompose);\n    }\n    if (this.byteMemo != null) {\n      this.byteMemo.dispose();\n    }\n    if (this.byteCompose != null) {\n      this.byteCompose.dispose();\n    }\n\n    return (this.floatMemo =\n      this.byteMemo =\n      this.floatCompose =\n      this.byteCompose =\n        null);\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS202: Simplify dynamic range loops\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { Atlas } from \"./atlas.js\";\nimport { UnsignedByteType } from \"three/src/constants.js\";\n\nconst SCRATCH_SIZE = 512 / 16;\n\n/*\n * Dynamic text atlas\n * - Stores entire strings as sprites\n * - Renders alpha mask (fast) or signed distance field (slow)\n * - Emits (x,y,width,height) pointers into the atlas\n */\nexport class TextAtlas extends Atlas {\n  constructor(renderer, shaders, options) {\n    let left;\n    if (!options.width) {\n      options.width = 256;\n    }\n    if (!options.height) {\n      options.height = 256;\n    }\n    options.type = UnsignedByteType;\n    options.channels = 1;\n    options.backed = true;\n\n    super(renderer, shaders, options, false);\n\n    this.font = options.font != null ? options.font : [\"sans-serif\"];\n    this.size = options.size || 24;\n    this.style = options.style != null ? options.style : \"normal\";\n    this.variant = options.variant != null ? options.variant : \"normal\";\n    this.weight = options.weight != null ? options.weight : \"normal\";\n    this.outline =\n      (left = +(options.outline != null ? options.outline : 5)) != null\n        ? left\n        : 0;\n    this.gamma = 1;\n\n    if (typeof navigator !== \"undefined\") {\n      const ua = navigator.userAgent;\n      if (ua.match(/Chrome/) && ua.match(/OS X/)) {\n        this.gamma = 0.5;\n      }\n    }\n\n    this.scratchW = this.scratchH = 0;\n\n    this.build(options);\n  }\n\n  build(options) {\n    super.build(options);\n\n    // Prepare line-height with room for outline\n    let lineHeight = 16;\n    lineHeight = this.size;\n    lineHeight += 4 + 2 * Math.min(1, this.outline);\n    const maxWidth = SCRATCH_SIZE * lineHeight;\n\n    // Prepare scratch canvas\n    const canvas = document.createElement(\"canvas\");\n    canvas.width = maxWidth;\n    canvas.height = lineHeight;\n\n    const quote = (str) => `${str.replace(/(['\"\\\\])/g, \"\\\\$1\")}`;\n    const font = this.font.map(quote).join(\", \");\n\n    const context = canvas.getContext(\"2d\");\n    context.font = `${this.style} ${this.variant} ${this.weight} ${this.size}px ${font}`;\n    context.fillStyle = \"#FF0000\";\n    context.textAlign = \"left\";\n    context.textBaseline = \"bottom\";\n    context.lineJoin = \"round\";\n\n    // debug: show scratch canvas\n    /*\n    document.body.appendChild canvas\n    canvas.setAttribute('style', \"position: absolute; top: 0; left: 0; z-index: 100; border: 1px solid red; background: rgba(255,0,255,.25);\")\n    */\n\n    // Cache hex colors for distance field rendering\n    const colors = [];\n    const dilate = this.outline * 3;\n    for (\n      let i = 0, end = dilate, asc = 0 <= end;\n      asc ? i < end : i > end;\n      asc ? i++ : i--\n    ) {\n      // 8 rgb levels = 1 step = .5 pixel increase\n      const hex = (\n        \"00\" + Math.max(0, -i * 8 + 128 - !i * 8).toString(16)\n      ).slice(-2);\n      colors.push(\"#\" + hex + hex + hex);\n    }\n\n    const scratch = new Uint8Array(maxWidth * lineHeight * 2);\n\n    this.canvas = canvas;\n    this.context = context;\n    this.lineHeight = lineHeight;\n    this.maxWidth = maxWidth;\n    this.colors = colors;\n    this.scratch = scratch;\n\n    this._allocate = this.allocate.bind(this);\n    return (this._write = this.write.bind(this));\n  }\n\n  reset() {\n    super.reset();\n    return (this.mapped = {});\n  }\n\n  begin() {\n    return Array.from(this.rows).map((row) => (row.alive = 0));\n  }\n\n  end() {\n    const { mapped } = this;\n    for (const row of Array.from(this.rows.slice())) {\n      if (row.alive === 0) {\n        for (const key of Array.from(row.keys)) {\n          delete mapped[key];\n        }\n        this.collapse(row);\n      }\n    }\n  }\n\n  map(text, emit) {\n    // See if already mapped into atlas\n    const { mapped } = this;\n    const c = mapped[text];\n    if (c != null) {\n      c.row.alive++;\n      return emit(c.x, c.y, c.w, c.h);\n    }\n\n    // Draw text (don't recurse stack in @draw so it can be optimized cleanly)\n    this.draw(text);\n    const data = this.scratch;\n    const w = this.scratchW;\n    const h = this.scratchH;\n\n    // Allocate and write into atlas\n    const allocate = this._allocate;\n    const write = this._write;\n    return allocate(text, w, h, function (row, x, y) {\n      mapped[text] = { x, y, w, h, row };\n      write(data, x, y, w, h);\n      return emit(x, y, w, h);\n    });\n  }\n\n  draw(text) {\n    let data, i, j;\n    let w = this.width;\n    const h = this.lineHeight;\n    const o = this.outline;\n    const ctx = this.context;\n    const dst = this.scratch;\n    const max = this.maxWidth;\n    const { colors } = this;\n\n    // Bottom aligned\n    const x = o + 1;\n    const y = Math.round(h * 1.05 - 1);\n\n    // Measure text\n    const m = ctx.measureText(text);\n    w = Math.min(max, Math.ceil(m.width + 2 * x + 1));\n\n    // Clear scratch area\n    ctx.clearRect(0, 0, w, h);\n\n    if (this.outline === 0) {\n      // Alpha sprite (fast)\n      let asc, end;\n      ctx.fillText(text, x, y);\n      ({ data } = ctx.getImageData(0, 0, w, h));\n      j = 3; // Skip to alpha channel\n      for (\n        i = 0, end = data.length / 4, asc = 0 <= end;\n        asc ? i < end : i > end;\n        asc ? i++ : i--\n      ) {\n        //dst[i] = 255 * (i%2); # test pattern to check pixel perfect alignment\n        dst[i] = data[j];\n        j += 4;\n      }\n\n      this.scratchW = w;\n      return (this.scratchH = h);\n    } else {\n      // Signed distance field sprite (approximation) (slow)\n\n      // Draw strokes of decreasing width to create nested outlines (absolute distance)\n      let asc1, start;\n      let asc2, end1;\n      ctx.globalCompositeOperation = \"source-over\";\n      for (\n        start = o + 1, i = start, asc1 = start <= 1;\n        asc1 ? i <= 1 : i >= 1;\n        asc1 ? i++ : i--\n      ) {\n        j = i > 1 ? i * 2 - 2 : i; // Eliminate odd strokes once past > 1px, don't need the detail\n        ctx.strokeStyle = colors[j - 1];\n        ctx.lineWidth = j;\n        ctx.strokeText(text, x, y);\n      }\n      //console.log 'stroke', j, j+.5, colors[j]\n\n      // Fill center with multiply blend #FF0000 to mark inside/outside\n      ctx.globalCompositeOperation = \"multiply\";\n      ctx.fillText(text, x, y);\n\n      // Pull image data\n      ({ data } = ctx.getImageData(0, 0, w, h));\n      j = 0;\n      const { gamma } = this;\n\n      for (\n        i = 0, end1 = data.length / 4, asc2 = 0 <= end1;\n        asc2 ? i < end1 : i > end1;\n        asc2 ? i++ : i--\n      ) {\n        // Get value + mask\n        const a = data[j];\n        let mask = a ? data[j + 1] / a : 1;\n        if (gamma === 0.5) {\n          mask = Math.sqrt(mask);\n        }\n        mask = Math.min(1, Math.max(0, mask));\n\n        // Blend between positive/outside and negative/inside\n        const b = 256 - a;\n        const c = b + (a - b) * mask;\n\n        // Clamp\n        // (slight expansion to hide errors around the transition)\n        dst[i] = Math.max(0, Math.min(255, c + 2));\n        j += 4;\n      }\n\n      // Debug: copy back into canvas\n      //\n      // TODO hide behind debug flag or delete.\n      /*\n      j = 0\n      for i in [0...data.length / 4]\n        v = dst[i]\n        *data[j] = v\n        *data[j+1] = v\n        data[j+2] = v\n        data[j+3] = 255\n        j += 4\n      ctx.putImageData(imageData, 0, 0);\n      */\n\n      this.scratchW = w;\n      return (this.scratchH = h);\n    }\n  }\n}\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n/*\n  Graph of nodes with outlets\n*/\nexport class Graph {\n  static initClass() {\n    this.index = 0;\n\n    this.IN = 0;\n    this.OUT = 1;\n  }\n  // eslint-disable-next-line no-unused-vars\n  static id(name) {\n    return ++Graph.index;\n  }\n\n  constructor(nodes, parent = null) {\n    this.parent = parent;\n    this.id = Graph.id();\n    this.nodes = [];\n    nodes && this.add(nodes);\n  }\n\n  inputs() {\n    const inputs = [];\n    for (const node of Array.from(this.nodes)) {\n      for (const outlet of Array.from(node.inputs)) {\n        if (outlet.input === null) {\n          inputs.push(outlet);\n        }\n      }\n    }\n    return inputs;\n  }\n\n  outputs() {\n    const outputs = [];\n    for (const node of Array.from(this.nodes)) {\n      for (const outlet of Array.from(node.outputs)) {\n        if (outlet.output.length === 0) {\n          outputs.push(outlet);\n        }\n      }\n    }\n    return outputs;\n  }\n\n  getIn(name) {\n    return Array.from(this.inputs()).filter(\n      (outlet) => outlet.name === name\n    )[0];\n  }\n  getOut(name) {\n    return Array.from(this.outputs()).filter(\n      (outlet) => outlet.name === name\n    )[0];\n  }\n\n  add(node, ignore) {\n    if (node.length) {\n      for (const _node of Array.from(node)) {\n        this.add(_node);\n      }\n      return;\n    }\n\n    if (node.graph && !ignore) {\n      throw new Error(\"Adding node to two graphs at once\");\n    }\n\n    node.graph = this;\n    this.nodes.push(node);\n  }\n\n  remove(node, ignore) {\n    if (node.length) {\n      for (const _node of Array.from(node)) {\n        this.remove(_node);\n      }\n      return;\n    }\n\n    if (node.graph !== this) {\n      throw new Error(\"Removing node from wrong graph.\");\n    }\n\n    ignore || node.disconnect();\n\n    this.nodes.splice(this.nodes.indexOf(node), 1);\n    node.graph = null;\n  }\n\n  adopt(node) {\n    if (node.length) {\n      for (const _node of Array.from(node)) {\n        this.adopt(_node);\n      }\n      return;\n    }\n\n    node.graph.remove(node, true);\n    this.add(node, true);\n  }\n}\nGraph.initClass();\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Graph } from \"./graph\";\n\n/*\n  In/out outlet on node\n*/\nexport class Outlet {\n  static initClass() {\n    this.index = 0;\n  }\n  static make(outlet, extra) {\n    if (extra == null) {\n      extra = {};\n    }\n    const meta = extra;\n    if (outlet.meta != null) {\n      for (const key in outlet.meta) {\n        const value = outlet.meta[key];\n        meta[key] = value;\n      }\n    }\n    return new Outlet(\n      outlet.inout,\n      outlet.name,\n      outlet.hint,\n      outlet.type,\n      meta\n    );\n  }\n  static id(name) {\n    return `_io_${++Outlet.index}_${name}`;\n  }\n\n  static hint(name) {\n    name = name.replace(/^_io_[0-9]+_/, \"\");\n    name = name.replace(/_i_o$/, \"\");\n    return (name = name.replace(/(In|Out|Inout|InOut)$/, \"\"));\n  }\n\n  constructor(inout, name, hint, type, meta, id) {\n    this.inout = inout;\n    this.name = name;\n    this.hint = hint;\n    this.type = type;\n    if (meta == null) {\n      meta = {};\n    }\n    this.meta = meta;\n    this.id = id;\n    if (this.hint == null) {\n      this.hint = Outlet.hint(this.name);\n    }\n\n    this.node = null;\n    this.input = null;\n    this.output = [];\n    if (this.id == null) {\n      this.id = Outlet.id(this.hint);\n    }\n  }\n\n  // Change into given outlet without touching connections\n  morph(outlet) {\n    this.inout = outlet.inout;\n    this.name = outlet.name;\n    this.hint = outlet.hint;\n    this.type = outlet.type;\n    return (this.meta = outlet.meta);\n  }\n\n  // Copy with unique name and cloned metadata\n  dupe(name) {\n    if (name == null) {\n      name = this.id;\n    }\n    const outlet = Outlet.make(this);\n    outlet.name = name;\n    return outlet;\n  }\n\n  // Connect to given outlet\n  connect(outlet) {\n    // Auto-reverse in/out to out/in\n    if (this.inout === Graph.IN && outlet.inout === Graph.OUT) {\n      return outlet.connect(this);\n    }\n\n    // Disallow bad combinations\n    if (this.inout !== Graph.OUT || outlet.inout !== Graph.IN) {\n      throw new Error(\"Can only connect out to in.\");\n    }\n\n    // Check for existing connection\n    if (outlet.input === this) {\n      return;\n    }\n\n    // Disconnect existing connections\n    outlet.disconnect();\n\n    // Add new connection.\n    outlet.input = this;\n    return this.output.push(outlet);\n  }\n\n  // Disconnect given outlet (or all)\n  disconnect(outlet) {\n    // Disconnect input from the other side.\n    if (this.input) {\n      this.input.disconnect(this);\n    }\n\n    if (this.output.length) {\n      if (outlet) {\n        // Remove one outgoing connection.\n        const index = this.output.indexOf(outlet);\n        if (index >= 0) {\n          this.output.splice(index, 1);\n          return (outlet.input = null);\n        }\n      } else {\n        // Remove all outgoing connections.\n        for (outlet of Array.from(this.output)) {\n          outlet.input = null;\n        }\n        return (this.output = []);\n      }\n    }\n  }\n}\nOutlet.initClass();\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Graph } from \"./graph\";\nimport { Outlet } from \"./outlet\";\n\n/*\n Node in graph.\n*/\nexport class Node {\n  static initClass() {\n    this.index = 0;\n  }\n  static id(_name) {\n    return ++Node.index;\n  }\n\n  constructor(owner, outlets) {\n    this.owner = owner;\n    this.graph = null;\n    this.inputs = [];\n    this.outputs = [];\n    this.all = [];\n    this.outlets = null;\n    this.id = Node.id();\n\n    this.setOutlets(outlets);\n  }\n\n  // Retrieve input\n  getIn(name) {\n    return Array.from(this.inputs).filter((outlet) => outlet.name === name)[0];\n  }\n\n  // Retrieve output\n  getOut(name) {\n    return Array.from(this.outputs).filter((outlet) => outlet.name === name)[0];\n  }\n\n  // Retrieve by name\n  get(name) {\n    return this.getIn(name) || this.getOut(name);\n  }\n\n  // Set new outlet definition\n  setOutlets(outlets) {\n    if (outlets != null) {\n      // First init\n      let outlet;\n      if (this.outlets == null) {\n        this.outlets = {};\n        for (outlet of Array.from(outlets)) {\n          if (!(outlet instanceof Outlet)) {\n            outlet = Outlet.make(outlet);\n          }\n          this._add(outlet);\n        }\n        return;\n      }\n\n      // Return new/old outlet matching hash key\n      const hash = (\n        outlet // Match by name, direction and type.\n      ) => [outlet.name, outlet.inout, outlet.type].join(\"-\");\n\n      // Build hash of new outlets\n      const match = {};\n      for (outlet of Array.from(outlets)) {\n        match[hash(outlet)] = true;\n      }\n\n      // Remove missing outlets, record matches\n      for (let key in this.outlets) {\n        outlet = this.outlets[key];\n        key = hash(outlet);\n        if (match[key]) {\n          match[key] = outlet;\n        } else {\n          this._remove(outlet);\n        }\n      }\n\n      // Insert new outlets\n      for (outlet of Array.from(outlets)) {\n        // Find match by hash\n        const existing = match[hash(outlet)];\n        if (existing instanceof Outlet) {\n          // Update existing outlets in place to retain connections.\n          this._morph(existing, outlet);\n        } else {\n          // Spawn new outlet\n          if (!(outlet instanceof Outlet)) {\n            outlet = Outlet.make(outlet);\n          }\n          this._add(outlet);\n        }\n      }\n\n      this;\n    }\n    return this.outlets;\n  }\n\n  // Connect to the target node by matching up inputs and outputs.\n  connect(node, empty, force) {\n    let dest, dests, hint, source, type;\n    const outlets = {};\n    const hints = {};\n\n    const typeHint = (outlet) => type + \"/\" + outlet.hint;\n\n    // Hash the types/hints of available target outlets.\n    for (dest of Array.from(node.inputs)) {\n      // Only autoconnect if not already connected\n      let list;\n      if (!force && dest.input) {\n        continue;\n      }\n\n      // Match outlets by type/name hint, then type/position key\n      ({ type } = dest);\n      hint = typeHint(dest);\n\n      if (!hints[hint]) {\n        hints[hint] = dest;\n      }\n      outlets[type] = list = outlets[type] || [];\n      list.push(dest);\n    }\n\n    // Available source outlets\n    let sources = this.outputs;\n\n    // Ignore connected source if only matching empties.\n    sources = sources.filter((outlet) => !(empty && outlet.output.length));\n\n    // Match hints first\n    for (source of Array.from(sources.slice())) {\n      // Match outlets by type and name\n      ({ type } = source);\n      hint = typeHint(source);\n      dests = outlets[type];\n\n      // Connect if found\n      if ((dest = hints[hint])) {\n        source.connect(dest);\n\n        // Remove from potential set\n        delete hints[hint];\n        dests.splice(dests.indexOf(dest), 1);\n        sources.splice(sources.indexOf(source), 1);\n      }\n    }\n\n    // Match what's left\n    if (!sources.length) {\n      return this;\n    }\n    for (source of Array.from(sources.slice())) {\n      ({ type } = source);\n      dests = outlets[type];\n\n      // Match outlets by type and order\n      if (dests && dests.length) {\n        // Link up and remove from potential set\n        source.connect(dests.shift());\n      }\n    }\n\n    return this;\n  }\n\n  // Disconnect entire node\n  disconnect(_node) {\n    let outlet;\n    for (outlet of Array.from(this.inputs)) {\n      outlet.disconnect();\n    }\n    for (outlet of Array.from(this.outputs)) {\n      outlet.disconnect();\n    }\n\n    return this;\n  }\n\n  // Return hash key for outlet\n  _key(outlet) {\n    return [outlet.name, outlet.inout].join(\"-\");\n  }\n\n  // Add outlet object to node\n  _add(outlet) {\n    const key = this._key(outlet);\n\n    // Sanity checks\n    if (outlet.node) {\n      throw new Error(\"Adding outlet to two nodes at once.\");\n    }\n    if (this.outlets[key]) {\n      throw new Error(`Adding two identical outlets to same node. (${key})`);\n    }\n\n    // Link back outlet\n    outlet.node = this;\n\n    // Add to name hash and inout list\n    if (outlet.inout === Graph.IN) {\n      this.inputs.push(outlet);\n    }\n    if (outlet.inout === Graph.OUT) {\n      this.outputs.push(outlet);\n    }\n    this.all.push(outlet);\n    return (this.outlets[key] = outlet);\n  }\n\n  // Morph outlet to other\n  _morph(existing, outlet) {\n    let key = this._key(outlet);\n    delete this.outlets[key];\n\n    existing.morph(outlet);\n\n    key = this._key(outlet);\n    return (this.outlets[key] = outlet);\n  }\n\n  // Remove outlet object from node.\n  _remove(outlet) {\n    const key = this._key(outlet);\n\n    // Sanity checks\n    if (outlet.node !== this) {\n      throw new Error(\"Removing outlet from wrong node.\");\n    }\n\n    // Disconnect outlet.\n    outlet.disconnect();\n\n    // Unlink outlet.\n    outlet.node = null;\n\n    // Remove from name list and inout list.\n    delete this.outlets[key];\n    if (outlet.inout === Graph.IN) {\n      this.inputs.splice(this.inputs.indexOf(outlet), 1);\n    }\n    if (outlet.inout === Graph.OUT) {\n      this.outputs.splice(this.outputs.indexOf(outlet), 1);\n    }\n    this.all.splice(this.all.indexOf(outlet), 1);\n    return this;\n  }\n}\nNode.initClass();\n","import { Graph } from \"./graph\";\nexport const { IN, OUT } = Graph;\n\nexport * from \"./graph\";\nexport * from \"./node\";\nexport * from \"./outlet\";\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nexport class Snippet {\n  static initClass() {\n    this.index = 0;\n  }\n  static namespace() {\n    return `_sn_${++Snippet.index}_`;\n  }\n\n  static load(language, name, code) {\n    const program = language.parse(name, code);\n    const [sigs, compiler] = Array.from(language.compile(program));\n    return new Snippet(language, sigs, compiler, name, code);\n  }\n\n  constructor(language, _signatures, _compiler, _name, _original) {\n    this.language = language;\n    this._signatures = _signatures;\n    this._compiler = _compiler;\n    this._name = _name;\n    this._original = _original;\n    this.namespace = null;\n    this.code = null;\n\n    this.main = null;\n    this.entry = null;\n\n    this.uniforms = null;\n    this.externals = null;\n    this.symbols = null;\n    this.attributes = null;\n    this.varyings = null;\n\n    // Tidy up object for export\n    if (!this.language) {\n      delete this.language;\n    }\n    if (!this._signatures) {\n      delete this._signatures;\n    }\n    if (!this._compiler) {\n      delete this._compiler;\n    }\n    if (!this._original) {\n      delete this._original;\n    }\n\n    // Insert snippet name if not provided\n    if (!this._name) {\n      this._name =\n        this._signatures != null ? this._signatures.main.name : undefined;\n    }\n  }\n\n  clone() {\n    return new Snippet(\n      this.language,\n      this._signatures,\n      this._compiler,\n      this._name,\n      this._original\n    );\n  }\n\n  bind(config, uniforms, namespace, defines) {\n    // Alt syntax (namespace, uniforms, defines)\n    let def, left;\n    let v;\n    if (uniforms === \"\" + uniforms) {\n      [namespace, uniforms, defines] = Array.from([\n        uniforms,\n        namespace != null ? namespace : {},\n        defines != null ? defines : {},\n      ]);\n      // Alt syntax (uniforms, defines)\n    } else if (namespace !== \"\" + namespace) {\n      [defines, namespace] = Array.from([\n        namespace != null ? namespace : {},\n        undefined,\n      ]);\n    }\n\n    // Prepare data structure\n    this.main = this._signatures.main;\n    this.namespace =\n      (left = namespace != null ? namespace : this.namespace) != null\n        ? left\n        : Snippet.namespace();\n    this.entry = this.namespace + this.main.name;\n\n    this.uniforms = {};\n    this.varyings = {};\n    this.attributes = {};\n    this.externals = {};\n    this.symbols = [];\n    const exist = {};\n    const exceptions = {};\n\n    // Handle globals and locals for prefixing\n    const global = function (name) {\n      exceptions[name] = true;\n      return name;\n    };\n    const local = (name) => {\n      return this.namespace + name;\n    };\n\n    // Apply config\n    if (config.globals) {\n      for (const key of Array.from(config.globals)) {\n        global(key);\n      }\n    }\n    const _u = config.globalUniforms ? global : local;\n    const _v = config.globalVaryings ? global : local;\n    const _a = config.globalAttributes ? global : local;\n    const _e = local;\n\n    // Build finalized properties\n    const x = (def) => {\n      return (exist[def.name] = true);\n    };\n    const u = (def, name) => {\n      return (this.uniforms[_u(name != null ? name : def.name)] = def);\n    };\n    v = (def) => {\n      return (this.varyings[_v(def.name)] = def);\n    };\n    const a = (def) => {\n      return (this.attributes[_a(def.name)] = def);\n    };\n    const e = (def) => {\n      const name = _e(def.name);\n      this.externals[name] = def;\n      return this.symbols.push(name);\n    };\n\n    const redef = (def) => ({\n      type: def.type,\n      name: def.name,\n      value: def.value,\n    });\n\n    for (def of Array.from(this._signatures.uniform)) {\n      x(def);\n    }\n    for (def of Array.from(this._signatures.uniform)) {\n      u(redef(def));\n    }\n    for (def of Array.from(this._signatures.varying)) {\n      v(redef(def));\n    }\n    for (def of Array.from(this._signatures.external)) {\n      e(def);\n    }\n    for (def of Array.from(this._signatures.attribute)) {\n      a(redef(def));\n    }\n    for (const name in uniforms) {\n      def = uniforms[name];\n      if (exist[name]) {\n        u(def, name);\n      }\n    }\n\n    this.body = this.code = this._compiler(this.namespace, exceptions, defines);\n\n    // Adds defs to original snippet for inspection\n    if (defines) {\n      const defs = (() => {\n        const result = [];\n        for (const k in defines) {\n          v = defines[k];\n          result.push(`#define ${k} ${v}`);\n        }\n        return result;\n      })().join(\"\\n\");\n      if (defs.length) {\n        this._original = [\n          defs,\n          \"//----------------------------------------\",\n          this._original,\n        ].join(\"\\n\");\n      }\n    }\n\n    return null;\n  }\n}\nSnippet.initClass();\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport * as Graph from \"../graph\";\nimport * as Priority from \"./priority\";\n\n/*\n  Program assembler\n\n  Builds composite program that can act as new module/snippet\n  Unconnected input/outputs and undefined callbacks are exposed in the new global/main scope\n  If there is only one call with an identical call signature, a #define is output instead.\n*/\nexport const assemble = function (language, namespace, calls, requires) {\n  const generate = language;\n\n  const externals = {};\n  const symbols = [];\n  const uniforms = {};\n  const varyings = {};\n  const attributes = {};\n  const library = {};\n\n  const process = function () {\n    let body;\n    let ns;\n    for (ns in requires) {\n      const r = requires[ns];\n      required(r.node, r.module);\n    }\n\n    [body, calls] = Array.from(handle(calls));\n    if (namespace != null) {\n      body.entry = namespace;\n    }\n    const main = generate.build(body, calls);\n\n    const sorted = (() => {\n      const result = [];\n      for (ns in library) {\n        const lib = library[ns];\n        result.push(lib);\n      }\n      return result;\n    })().sort((a, b) => Priority.compare(a.priority, b.priority));\n    const includes = sorted.map((x) => x.code);\n    includes.push(main.code);\n    const code = generate.lines(includes);\n\n    // Build new virtual snippet\n    return {\n      namespace: main.name,\n      library, // Included library functions\n      body: main.code, // Snippet body\n      code, // Complete snippet (tests/debug)\n      main, // Function signature\n      entry: main.name, // Entry point name\n      symbols,\n      externals,\n      uniforms,\n      varyings,\n      attributes,\n    };\n  };\n\n  // Sort and process calls\n  const handle = (calls) => {\n    let c;\n    calls = (() => {\n      const result = [];\n      for (const ns in calls) {\n        c = calls[ns];\n        result.push(c);\n      }\n      return result;\n    })();\n    calls.sort((a, b) => b.priority - a.priority);\n\n    // Call module in DAG chain\n    const call = (node, module, priority) => {\n      include(node, module, priority);\n      const { main } = module;\n      const { entry } = module;\n\n      const _lookup = (name) => lookup(node, name);\n      const _dangling = (name) => isDangling(node, name);\n      return generate.call(_lookup, _dangling, entry, main.signature, body);\n    };\n\n    const body = generate.body();\n    for (c of Array.from(calls)) {\n      call(c.node, c.module, c.priority);\n    }\n\n    return [body, calls];\n  };\n\n  // Adopt given code as a library at given priority\n  const adopt = function (namespace, code, priority) {\n    const record = library[namespace];\n    if (record != null) {\n      return (record.priority = Priority.max(record.priority, priority));\n    } else {\n      return (library[namespace] = { code, priority });\n    }\n  };\n\n  // Include snippet for a call\n  const include = function (node, module, priority) {\n    let def, key;\n    priority = Priority.make(priority);\n\n    // Adopt snippet's libraries\n    for (const ns in module.library) {\n      const lib = module.library[ns];\n      adopt(ns, lib.code, Priority.nest(priority, lib.priority));\n    }\n\n    // Adopt snippet body as library\n    adopt(module.namespace, module.body, priority);\n\n    // Adopt GL vars\n    for (key in module.uniforms) {\n      def = module.uniforms[key];\n      uniforms[key] = def;\n    }\n    for (key in module.varyings) {\n      def = module.varyings[key];\n      varyings[key] = def;\n    }\n    for (key in module.attributes) {\n      def = module.attributes[key];\n      attributes[key] = def;\n    }\n\n    return required(node, module);\n  };\n\n  const required = (\n    node,\n    module // Adopt external symbols\n  ) =>\n    (() => {\n      const result = [];\n      for (const key of Array.from(module.symbols)) {\n        const ext = module.externals[key];\n        if (isDangling(node, ext.name)) {\n          const copy = {};\n          for (const k in ext) {\n            const v = ext[k];\n            copy[k] = v;\n          }\n          copy.name = lookup(node, ext.name);\n          externals[key] = copy;\n          result.push(symbols.push(key));\n        } else {\n          result.push(undefined);\n        }\n      }\n      return result;\n    })();\n\n  // Check for dangling input/output\n  const isDangling = function (node, name) {\n    const outlet = node.get(name);\n\n    if (outlet.inout === Graph.IN) {\n      return outlet.input === null;\n    } else if (outlet.inout === Graph.OUT) {\n      return outlet.output.length === 0;\n    }\n  };\n\n  // Look up unique name for outlet\n  const lookup = function (node, name) {\n    // Traverse graph edge\n    let outlet = node.get(name);\n    if (!outlet) {\n      return null;\n    }\n\n    if (outlet.input) {\n      outlet = outlet.input;\n    }\n    ({ name } = outlet);\n\n    return outlet.id;\n  };\n\n  return process();\n};\n","/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Snippet } from \"./snippet\";\nimport { assemble } from \"./assemble\";\n\n/*\n  Program assembly model\n\n  Snippets are added to its queue, registering calls and code includes.\n  Calls are de-duped and scheduled at the earliest point required for correct data flow.\n\n  When assemble() is called, it builds a main() function to\n  execute all calls in final order.\n\n  The result is a new instance of Snippet that acts as if it\n  was parsed from the combined source of the component\n  nodes.\n*/\nexport class Program {\n  static initClass() {\n    this.index = 0;\n  }\n  static entry() {\n    return `_pg_${++Program.index}_`;\n  }\n\n  // Program starts out empty, ready to compile starting from a particular block\n  constructor(language, namespace, graph) {\n    this.language = language;\n    this.namespace = namespace;\n    this.graph = graph;\n    this.calls = {};\n    this.requires = {};\n  }\n\n  // Call a given module at certain priority\n  call(node, module, priority) {\n    let exists;\n    const ns = module.namespace;\n\n    // Merge all calls down into one with the right priority\n    if ((exists = this.calls[ns])) {\n      exists.priority = Math.max(exists.priority, priority);\n    } else {\n      this.calls[ns] = { node, module, priority };\n    }\n\n    return this;\n  }\n\n  // Require a given (callback) module's externals\n  require(node, module) {\n    const ns = module.namespace;\n    return (this.requires[ns] = { node, module });\n  }\n\n  // Compile queued ops into result\n  assemble() {\n    const data = assemble(\n      this.language,\n      this.namespace != null ? this.namespace : Program.entry,\n      this.calls,\n      this.requires\n    );\n    const snippet = new Snippet();\n    for (const key in data) {\n      snippet[key] = data[key];\n    }\n    snippet.graph = this.graph;\n    return snippet;\n  }\n}\nProgram.initClass();\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport * as Graph from \"../graph\";\nimport * as Priority from \"./priority\";\n\n/*\n Callback linker\n\n Imports given modules and generates linkages for registered callbacks.\n\n Builds composite program with single module as exported entry point\n*/\n\nexport const link = function (language, links, modules, exported) {\n  const generate = language;\n  let includes = [];\n\n  const symbols = [];\n  const externals = {};\n  const uniforms = {};\n  const attributes = {};\n  const varyings = {};\n  const library = {};\n\n  const process = function () {\n    const exports = generate.links(links);\n\n    const header = [];\n    if (exports.defs != null) {\n      header.push(exports.defs);\n    }\n    if (exports.bodies != null) {\n      header.push(exports.bodies);\n    }\n\n    for (const m of Array.from(modules)) {\n      include(m.node, m.module, m.priority);\n    }\n    const sorted = (() => {\n      const result = [];\n      for (const ns in library) {\n        const lib = library[ns];\n        result.push(lib);\n      }\n      return result;\n    })().sort((a, b) => Priority.compare(a.priority, b.priority));\n    includes = sorted.map((x) => x.code);\n\n    let code = generate.lines(includes);\n    code = generate.defuse(code);\n    if (header.length) {\n      code = [generate.lines(header), code].join(\"\\n\");\n    }\n    code = generate.hoist(code);\n    code = generate.dedupe(code);\n\n    // Export module's externals\n    const e = exported;\n    return {\n      namespace: e.main.name,\n      code, // Complete snippet (tests/debug)\n      main: e.main, // Function signature\n      entry: e.main.name, // Entry point name\n      externals,\n      uniforms,\n      attributes,\n      varyings,\n    };\n  };\n\n  // Adopt given code as a library at given priority\n  const adopt = function (namespace, code, priority) {\n    const record = library[namespace];\n    if (record != null) {\n      return (record.priority = Priority.max(record.priority, priority));\n    } else {\n      return (library[namespace] = { code, priority });\n    }\n  };\n\n  // Include piece of code\n  const include = function (node, module, priority) {\n    let def, key;\n    priority = Priority.make(priority);\n\n    // Adopt snippet's libraries\n    for (const ns in module.library) {\n      const lib = module.library[ns];\n      adopt(ns, lib.code, Priority.nest(priority, lib.priority));\n    }\n\n    // Adopt snippet body as library\n    adopt(module.namespace, module.body, priority);\n\n    // Adopt externals\n    for (key in module.uniforms) {\n      def = module.uniforms[key];\n      uniforms[key] = def;\n    }\n    for (key in module.varyings) {\n      def = module.varyings[key];\n      varyings[key] = def;\n    }\n    for (key in module.attributes) {\n      def = module.attributes[key];\n      attributes[key] = def;\n    }\n\n    return (() => {\n      const result = [];\n      for (key of Array.from(module.symbols)) {\n        const ext = module.externals[key];\n        if (isDangling(node, ext.name)) {\n          externals[key] = ext;\n          result.push(symbols.push(key));\n        } else {\n          result.push(undefined);\n        }\n      }\n      return result;\n    })();\n  };\n\n  // Check for dangling input/output\n  const isDangling = function (node, name) {\n    const outlet = node.get(name);\n\n    if (!outlet) {\n      const module =\n        (node.owner.snippet != null ? node.owner.snippet._name : undefined) !=\n        null\n          ? node.owner.snippet != null\n            ? node.owner.snippet._name\n            : undefined\n          : node.owner.namespace;\n      throw new Error(\n        `Unable to link program. Unlinked callback \\`${name}\\` on \\`${module}\\``\n      );\n    }\n\n    if (outlet.inout === Graph.IN) {\n      return outlet.input === null;\n    } else if (outlet.inout === Graph.OUT) {\n      return outlet.output.length === 0;\n    }\n  };\n\n  return process();\n};\n","/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Snippet } from \"./snippet\";\nimport { link } from \"./link\";\n\nconst debug = false;\n\n/*\n  Program linkage layout\n\n  Entry points are added to its dependency graph\n  Callbacks are linked either with a go-between function\n  or a #define if the signatures are identical.\n*/\nexport class Layout {\n  constructor(language, graph) {\n    this.language = language;\n    this.graph = graph;\n    this.links = [];\n    this.includes = [];\n    this.modules = {};\n    this.visits = {};\n  }\n\n  // Link up a given named external to this module's entry point\n  callback(node, module, priority, name, external) {\n    return this.links.push({ node, module, priority, name, external });\n  }\n\n  // Include this module of code\n  include(node, module, priority) {\n    let m;\n    if ((m = this.modules[module.namespace]) != null) {\n      return (m.priority = Math.max(priority, m.priority));\n    } else {\n      this.modules[module.namespace] = true;\n      return this.includes.push({ node, module, priority });\n    }\n  }\n\n  // Visit each namespace at most once to avoid infinite recursion\n  visit(namespace) {\n    debug && console.log(\"Visit\", namespace, !this.visits[namespace]);\n    if (this.visits[namespace]) {\n      return false;\n    }\n    return (this.visits[namespace] = true);\n  }\n\n  // Compile queued ops into result\n  link(module) {\n    const data = link(this.language, this.links, this.includes, module);\n    const snippet = new Snippet();\n    for (const key in data) {\n      snippet[key] = data[key];\n    }\n    snippet.graph = this.graph;\n    return snippet;\n  }\n}\n","import { Snippet } from \"./snippet\";\n\nexport const { load } = Snippet;\n\nexport * from \"./snippet\";\nexport * from \"./program\";\nexport * from \"./layout\";\nexport * from \"./assemble\";\nexport * from \"./link\";\nexport * from \"./priority\";\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining\n * DS104: Avoid inline assignments\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as Graph from \"../graph\";\nimport { Program, Layout } from \"../linker\";\n\nconst debug = false;\n\nexport class Block {\n  static previous(outlet) {\n    return outlet.input != null ? outlet.input.node.owner : undefined;\n  }\n\n  constructor(delay) {\n    // Subclasses can pass `delay` to allow them to initialize before they call\n    // `@construct`.\n    if (delay == null) {\n      delay = false;\n    }\n    if (!delay) {\n      this.construct();\n    }\n  }\n\n  construct() {\n    let left;\n    if (this.namespace == null) {\n      this.namespace = Program.entry();\n    }\n    return (this.node = new Graph.Node(\n      this,\n      (left =\n        typeof this.makeOutlets === \"function\"\n          ? this.makeOutlets()\n          : undefined) != null\n        ? left\n        : {}\n    ));\n  }\n\n  refresh() {\n    let left;\n    return this.node.setOutlets(\n      (left =\n        typeof this.makeOutlets === \"function\"\n          ? this.makeOutlets()\n          : undefined) != null\n        ? left\n        : {}\n    );\n  }\n\n  clone() {\n    return new Block();\n  }\n\n  // Compile a new program starting from this block\n  compile(language, namespace) {\n    const program = new Program(\n      language,\n      namespace != null ? namespace : Program.entry(),\n      this.node.graph\n    );\n    this.call(program, 0);\n    return program.assemble();\n  }\n\n  // Link up programs into a layout, starting from this block\n  link(language, namespace) {\n    const module = this.compile(language, namespace);\n\n    const layout = new Layout(language, this.node.graph);\n    this._include(module, layout, 0);\n    this.export(layout, 0);\n    return layout.link(module);\n  }\n\n  // Subclassed methods\n  call(_program, _depth) {}\n  callback(_layout, _depth, _name, _external, _outlet) {}\n  export(_layout, _depth) {}\n\n  // Info string for debugging\n  _info(suffix) {\n    let string =\n      (this.node.owner.snippet != null\n        ? this.node.owner.snippet._name\n        : undefined) != null\n        ? this.node.owner.snippet != null\n          ? this.node.owner.snippet._name\n          : undefined\n        : this.node.owner.namespace;\n    if (suffix != null) {\n      return (string += \".\" + suffix);\n    }\n  }\n\n  // Create an outlet for a signature definition\n  _outlet(def, props) {\n    const outlet = Graph.Outlet.make(def, props);\n    outlet.meta.def = def;\n    return outlet;\n  }\n\n  // Make a call to this module in the given program\n  _call(module, program, depth) {\n    return program.call(this.node, module, depth);\n  }\n\n  // Require this module's dependencies in the given program\n  _require(module, program) {\n    return program.require(this.node, module);\n  }\n\n  // Make a call to all connected inputs\n  _inputs(module, program, depth) {\n    return (() => {\n      const result = [];\n      for (const arg of Array.from(module.main.signature)) {\n        const outlet = this.node.get(arg.name);\n        result.push(\n          __guard__(Block.previous(outlet), (x) => x.call(program, depth + 1))\n        );\n      }\n      return result;\n    })();\n  }\n\n  // Insert callback to this module in the given layout\n  _callback(module, layout, depth, name, external, outlet) {\n    return layout.callback(this.node, module, depth, name, external, outlet);\n  }\n\n  // Include this module in the given layout\n  _include(module, layout, depth) {\n    return layout.include(this.node, module, depth);\n  }\n\n  // Link this module's connected callbacks\n  _link(module, layout, depth) {\n    debug && console.log(\"block::_link\", this.toString(), module.namespace);\n    return (() => {\n      const result = [];\n      for (const key of Array.from(module.symbols)) {\n        const ext = module.externals[key];\n        let outlet = this.node.get(ext.name);\n        if (!outlet) {\n          throw new OutletError(\n            `External not found on ${this._info(ext.name)}`\n          );\n        }\n\n        if (outlet.meta.child != null) {\n          continue;\n        }\n\n        let parent = outlet;\n\n        // eslint-disable-next-line prefer-const\n        let block;\n        while (!block && parent) {\n          [parent, outlet] = Array.from([outlet.meta.parent, parent]);\n        }\n\n        block = Block.previous(outlet);\n        if (!block) {\n          throw new OutletError(\n            `Missing connection on ${this._info(ext.name)}`\n          );\n        }\n\n        debug && console.log(\"callback -> \", this.toString(), ext.name, outlet);\n        block.callback(layout, depth + 1, key, ext, outlet.input);\n        result.push(\n          block != null ? block.export(layout, depth + 1) : undefined\n        );\n      }\n      return result;\n    })();\n  }\n\n  // Trace backwards to discover callbacks further up\n  _trace(module, layout, depth) {\n    debug && console.log(\"block::_trace\", this.toString(), module.namespace);\n    return (() => {\n      const result = [];\n      for (const arg of Array.from(module.main.signature)) {\n        const outlet = this.node.get(arg.name);\n        result.push(\n          __guard__(Block.previous(outlet), (x) => x.export(layout, depth + 1))\n        );\n      }\n      return result;\n    })();\n  }\n}\n\nconst OutletError = function (message) {\n  const e = new Error(message);\n  e.name = \"OutletError\";\n  return e;\n};\n\nOutletError.prototype = new Error();\n\nfunction __guard__(value, transform) {\n  return typeof value !== \"undefined\" && value !== null\n    ? transform(value)\n    : undefined;\n}\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Block } from \"./block\";\n\nexport class Call extends Block {\n  constructor(snippet) {\n    super(true);\n\n    this.snippet = snippet;\n    this.namespace = snippet.namespace;\n    this.construct();\n  }\n\n  clone() {\n    return new Call(this.snippet);\n  }\n\n  makeOutlets() {\n    const main = this.snippet.main.signature;\n    const { externals } = this.snippet;\n    const { symbols } = this.snippet;\n\n    const params = Array.from(main).map((outlet) =>\n      this._outlet(outlet, { callback: false })\n    );\n    const callbacks = Array.from(symbols).map((key) =>\n      this._outlet(externals[key], { callback: true })\n    );\n\n    return params.concat(callbacks);\n  }\n\n  call(program, depth) {\n    this._call(this.snippet, program, depth);\n    return this._inputs(this.snippet, program, depth);\n  }\n\n  export(layout, depth) {\n    if (!layout.visit(this.namespace, depth)) {\n      return;\n    }\n\n    this._link(this.snippet, layout, depth);\n    return this._trace(this.snippet, layout, depth);\n  }\n}\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Graph } from \"../graph\";\nimport { Block } from \"./block\";\n\n/*\n  Re-use a subgraph as a callback\n*/\nexport class Callback extends Block {\n  constructor(graph) {\n    super(true);\n    this.graph = graph;\n    this.construct();\n  }\n\n  refresh() {\n    super.refresh();\n    return delete this.subroutine;\n  }\n\n  clone() {\n    return new Callback(this.graph);\n  }\n\n  makeOutlets() {\n    let outlet;\n    this.make();\n\n    const outlets = [];\n    let ins = [];\n    let outs = [];\n\n    // Pass-through existing callbacks\n    // Collect open inputs/outputs\n    const handle = (outlet, list) => {\n      if (outlet.meta.callback) {\n        if (outlet.inout === Graph.IN) {\n          // Dupe outlet and create two-way link between cloned outlets\n          const dupe = outlet.dupe();\n          if (dupe.meta.child == null) {\n            dupe.meta.child = outlet;\n          }\n          outlet.meta.parent = dupe;\n\n          return outlets.push(dupe);\n        }\n      } else {\n        return list.push(outlet.type);\n      }\n    };\n\n    for (outlet of Array.from(this.graph.inputs())) {\n      handle(outlet, ins);\n    }\n    for (outlet of Array.from(this.graph.outputs())) {\n      handle(outlet, outs);\n    }\n\n    // Merge inputs/outputs into new callback signature\n    ins = ins.join(\",\");\n    outs = outs.join(\",\");\n    const type = `(${ins})(${outs})`;\n\n    outlets.push({\n      name: \"callback\",\n      type,\n      inout: Graph.OUT,\n      meta: {\n        callback: true,\n        def: this.subroutine.main,\n      },\n    });\n\n    return outlets;\n  }\n\n  make() {\n    return (this.subroutine = this.graph.compile(this.namespace));\n  }\n\n  export(layout, depth) {\n    if (!layout.visit(this.namespace, depth)) {\n      return;\n    }\n\n    this._link(this.subroutine, layout, depth);\n    return this.graph.export(layout, depth);\n  }\n\n  call(program, depth) {\n    return this._require(this.subroutine, program, depth);\n  }\n\n  callback(layout, depth, name, external, outlet) {\n    this._include(this.subroutine, layout, depth);\n    return this._callback(\n      this.subroutine,\n      layout,\n      depth,\n      name,\n      external,\n      outlet\n    );\n  }\n}\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Graph } from \"../graph\";\nimport { Block } from \"./block\";\n\n/*\n  Isolate a subgraph as a single node\n*/\nexport class Isolate extends Block {\n  constructor(graph) {\n    super(true);\n    this.graph = graph;\n    this.construct();\n  }\n\n  refresh() {\n    super.refresh();\n    return delete this.subroutine;\n  }\n\n  clone() {\n    return new Isolate(this.graph);\n  }\n\n  makeOutlets() {\n    this.make();\n\n    const outlets = [];\n\n    const seen = {};\n    const done = {};\n    for (const set of [\"inputs\", \"outputs\"]) {\n      for (const outlet of Array.from(this.graph[set]())) {\n        // Preserve name of 'return' and 'callback' outlets\n        let name = undefined;\n        if (\n          [\"return\", \"callback\"].includes(outlet.hint) &&\n          outlet.inout === Graph.OUT\n        ) {\n          name = outlet.hint;\n        }\n\n        // Unless it already exists\n        if (seen[name] != null) {\n          name = undefined;\n        }\n\n        // Dupe outlet and remember link to original\n        const dupe = outlet.dupe(name);\n        if (dupe.meta.child == null) {\n          dupe.meta.child = outlet;\n        }\n        outlet.meta.parent = dupe;\n        if (name != null) {\n          seen[name] = true;\n        }\n        done[outlet.name] = dupe;\n\n        outlets.push(dupe);\n      }\n    }\n\n    return outlets;\n  }\n\n  make() {\n    return (this.subroutine = this.graph.compile(this.namespace));\n  }\n\n  call(program, depth) {\n    this._call(this.subroutine, program, depth);\n    return this._inputs(this.subroutine, program, depth);\n  }\n\n  export(layout, depth) {\n    if (!layout.visit(this.namespace, depth)) {\n      return;\n    }\n\n    // Link up with normal inputs\n    this._link(this.subroutine, layout, depth);\n    this._trace(this.subroutine, layout, depth);\n\n    // Export callbacks needed to call the subroutine\n    return this.graph.export(layout, depth);\n  }\n\n  callback(layout, depth, name, external, outlet) {\n    outlet = outlet.meta.child;\n    return outlet.node.owner.callback(layout, depth, name, external, outlet);\n  }\n}\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS205: Consider reworking code to avoid use of IIFEs\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Block } from \"./block\";\n\n/*\n  Join multiple disconnected nodes\n*/\nexport class Join extends Block {\n  constructor(nodes) {\n    super(true);\n    this.nodes = nodes;\n    this.construct();\n  }\n\n  clone() {\n    return new Join(this.nodes);\n  }\n\n  makeOutlets() {\n    return [];\n  }\n\n  call(program, depth) {\n    return (() => {\n      const result = [];\n      for (const node of Array.from(this.nodes)) {\n        const block = node.owner;\n        result.push(block.call(program, depth));\n      }\n      return result;\n    })();\n  }\n\n  export(layout, depth) {\n    return (() => {\n      const result = [];\n      for (const node of Array.from(this.nodes)) {\n        const block = node.owner;\n        result.push(block.export(layout, depth));\n      }\n      return result;\n    })();\n  }\n}\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n// Dump graph for debug/visualization purposes\nimport * as Block from \"../block\";\n\nexport const serialize = function (graph) {\n  const nodes = [];\n  const links = [];\n\n  for (const node of Array.from(graph.nodes)) {\n    let outlet;\n    const record = {\n      // Data\n      id: node.id,\n      name: null,\n      type: null,\n      depth: null,\n      graph: null,\n      inputs: [],\n      outputs: [],\n    };\n\n    nodes.push(record);\n\n    const { inputs } = record;\n    const { outputs } = record;\n\n    const block = node.owner;\n\n    if (block instanceof Block.Call) {\n      record.name = block.snippet._name;\n      record.type = \"call\";\n      record.code = block.snippet._original;\n    } else if (block instanceof Block.Callback) {\n      record.name = \"Callback\";\n      record.type = \"callback\";\n      record.graph = serialize(block.graph);\n    } else if (block instanceof Block.Isolate) {\n      record.name = \"Isolate\";\n      record.type = \"isolate\";\n      record.graph = serialize(block.graph);\n    } else if (block instanceof Block.Join) {\n      record.name = \"Join\";\n      record.type = \"join\";\n    } else if (block != null) {\n      if (record.name == null) {\n        record.name = block.name != null ? block.name : block.type;\n      }\n      if (record.type == null) {\n        record.type = block.type;\n      }\n      if (record.code == null) {\n        record.code = block.code;\n      }\n      if (block.graph != null) {\n        record.graph = serialize(block.graph);\n      }\n    }\n\n    const format = function (type) {\n      type = type.replace(\")(\", \")→(\");\n      return (type = type.replace(\"()\", \"\"));\n    };\n\n    for (outlet of Array.from(node.inputs)) {\n      inputs.push({\n        id: outlet.id,\n        name: outlet.name,\n        type: format(outlet.type),\n        open: outlet.input == null,\n      });\n    }\n\n    for (outlet of Array.from(node.outputs)) {\n      outputs.push({\n        id: outlet.id,\n        name: outlet.name,\n        type: format(outlet.type),\n        open: !outlet.output.length,\n      });\n\n      for (const other of Array.from(outlet.output)) {\n        links.push({\n          from: node.id,\n          out: outlet.id,\n          to: other.node.id,\n          in: other.id,\n          type: format(outlet.type),\n        });\n      }\n    }\n  }\n\n  return { nodes, links };\n};\n","/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n// Hash string into a 32-bit key (murmurhash3)\nconst c1 = 0xcc9e2d51;\nconst c2 = 0x1b873593;\nconst c3 = 0xe6546b64;\nconst c4 = 0x85ebca6b;\nconst c5 = 0xc2b2ae35;\n\n// Fix imul in old/broken browsers\nlet imul = function (a, b) {\n  const ah = (a >>> 16) & 0xffff;\n  const al = a & 0xffff;\n  const bh = (b >>> 16) & 0xffff;\n  const bl = b & 0xffff;\n  return (al * bl + (((ah * bl + al * bh) << 16) >>> 0)) | 0;\n};\n\nif (Math.imul != null) {\n  const test = Math.imul(0xffffffff, 5);\n  if (test === -5) {\n    ({ imul } = Math);\n  }\n}\n\nexport const hash = function (string) {\n  let h;\n  const n = string.length;\n  let m = Math.floor(n / 2);\n  let j = (h = 0);\n\n  const next = () => string.charCodeAt(j++);\n  const iterate = function (a, b) {\n    let k = a | (b << 16); // two utf-16 words\n    k ^= k << 9; // whitening for ascii-only strings\n\n    k = imul(k, c1);\n    k = (k << 15) | (k >>> 17);\n    k = imul(k, c2);\n\n    h ^= k;\n\n    h = (h << 13) | (h >>> 19);\n    h = imul(h, 5);\n    return (h = (h + c3) | 0);\n  };\n\n  while (m--) {\n    iterate(next(), next());\n  }\n  if (n & 1) {\n    iterate(next(), 0);\n  }\n\n  h ^= n;\n  h ^= h >>> 16;\n  h = imul(h, c4);\n  h ^= h >>> 13;\n  h = imul(h, c5);\n\n  return (h ^= h >>> 16);\n};\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { hash } from \"../factory/hash\";\n\nconst trim = (string) => (\"\" + string).replace(/^\\s+|\\s+$/g, \"\");\n\nconst cssColor = (r, g, b, alpha) =>\n  \"rgba(\" + [r, g, b, alpha].join(\", \") + \")\";\n\nconst hashColor = function (string, alpha) {\n  if (alpha == null) {\n    alpha = 1;\n  }\n  const color = hash(string) ^ 0x123456;\n\n  let r = color & 0xff;\n  let g = (color >>> 8) & 0xff;\n  let b = (color >>> 16) & 0xff;\n\n  const max = Math.max(r, g, b);\n  const norm = 140 / max;\n  const min = Math.round(max / 3);\n\n  r = Math.min(255, Math.round(norm * Math.max(r, min)));\n  g = Math.min(255, Math.round(norm * Math.max(g, min)));\n  b = Math.min(255, Math.round(norm * Math.max(b, min)));\n\n  return cssColor(r, g, b, alpha);\n};\n\nconst escapeText = function (string) {\n  string = string != null ? string : \"\";\n  return string\n    .replace(/&/g, \"&amp;\")\n    .replace(/</g, \"&lt;\")\n    .replace(/>/g, \"&gt;\")\n    .replace(/'/g, \"&#39;\")\n    .replace(/\"/g, \"&quot;\");\n};\n\nexport const process = function (data) {\n  const links = [];\n  const el = _markup(data, links);\n  el.update = () => connect(el, links);\n  _activate(el);\n  return el;\n};\n\nconst _activate = function (el) {\n  const codes = el.querySelectorAll(\".shadergraph-code\");\n  return Array.from(codes).map((code) =>\n    (function () {\n      const popup = code;\n      popup.parentNode.classList.add(\"shadergraph-has-code\");\n      return popup.parentNode.addEventListener(\n        \"click\",\n        (_event) =>\n          (popup.style.display = {\n            block: \"none\",\n            none: \"block\",\n          }[popup.style.display || \"none\"])\n      );\n    })()\n  );\n};\n\nconst _order = function (data) {\n  let link, node;\n  const nodeMap = {};\n  const linkMap = {};\n  for (node of Array.from(data.nodes)) {\n    nodeMap[node.id] = node;\n  }\n\n  for (link of Array.from(data.links)) {\n    if (linkMap[link.from] == null) {\n      linkMap[link.from] = [];\n    }\n    linkMap[link.from].push(link);\n  }\n\n  const recurse = function (node, depth) {\n    let next;\n    if (depth == null) {\n      depth = 0;\n    }\n    node.depth = Math.max(node.depth != null ? node.depth : 0, depth);\n    if ((next = linkMap[node.id])) {\n      for (link of Array.from(next)) {\n        recurse(nodeMap[link.to], depth + 1);\n      }\n    }\n    return null;\n  };\n\n  for (node of Array.from(data.nodes)) {\n    if (node.depth == null) {\n      recurse(node);\n    }\n  }\n\n  return null;\n};\n\nconst _markup = function (data, links) {\n  let column;\n  _order(data);\n\n  const wrapper = document.createElement(\"div\");\n  wrapper.classList.add(\"shadergraph-graph\");\n\n  const columns = [];\n  const outlets = {};\n\n  for (const node of Array.from(data.nodes)) {\n    let outlet;\n    const block = document.createElement(\"div\");\n    block.classList.add(\"shadergraph-node\");\n    block.classList.add(`shadergraph-node-${node.type}`);\n\n    block.innerHTML = `\\\n<div class=\"shadergraph-header\">${escapeText(node.name)}</div>\\\n`;\n\n    const addOutlet = function (outlet, inout) {\n      const color = hashColor(outlet.type);\n\n      const div = document.createElement(\"div\");\n      div.classList.add(\"shadergraph-outlet\");\n      div.classList.add(`shadergraph-outlet-${inout}`);\n      div.innerHTML = `\\\n<div class=\"shadergraph-point\" style=\"background: ${color}\"></div>\n<div class=\"shadergraph-type\" style=\"color: ${color}\">${escapeText(\n        outlet.type\n      )}</div>\n<div class=\"shadergraph-name\">${escapeText(outlet.name)}</div>\\\n`;\n      block.appendChild(div);\n\n      return (outlets[outlet.id] = div.querySelector(\".shadergraph-point\"));\n    };\n\n    for (outlet of Array.from(node.inputs)) {\n      addOutlet(outlet, \"in\");\n    }\n    for (outlet of Array.from(node.outputs)) {\n      addOutlet(outlet, \"out\");\n    }\n\n    if (node.graph != null) {\n      block.appendChild(_markup(node.graph, links));\n    } else {\n      const clear = document.createElement(\"div\");\n      clear.classList.add(\"shadergraph-clear\");\n      block.appendChild(clear);\n    }\n\n    if (node.code != null) {\n      const div = document.createElement(\"div\");\n      div.classList.add(\"shadergraph-code\");\n      div.innerHTML = escapeText(trim(node.code));\n      block.appendChild(div);\n    }\n\n    column = columns[node.depth];\n    if (column == null) {\n      column = document.createElement(\"div\");\n      column.classList.add(\"shadergraph-column\");\n      columns[node.depth] = column;\n    }\n    column.appendChild(block);\n  }\n\n  for (column of Array.from(columns)) {\n    if (column != null) {\n      wrapper.appendChild(column);\n    }\n  }\n\n  for (const link of Array.from(data.links)) {\n    const color = hashColor(link.type);\n\n    links.push({\n      color,\n      out: outlets[link.out],\n      in: outlets[link.in],\n    });\n  }\n\n  return wrapper;\n};\n\nconst sqr = (x) => x * x;\n\nconst path = function (x1, y1, x2, y2) {\n  let h;\n  const dx = x2 - x1;\n  const dy = y2 - y1;\n  const d = Math.sqrt(sqr(dx) + sqr(dy));\n\n  const vert = Math.abs(dy) > Math.abs(dx);\n  if (vert) {\n    const mx = (x1 + x2) / 2;\n    const my = (y1 + y2) / 2;\n\n    const f = dy > 0 ? 0.3 : -0.3;\n    h = Math.min(Math.abs(dx) / 2, 20 + d / 8);\n\n    return [\n      \"M\",\n      x1,\n      y1,\n      \"C\",\n      x1 + h,\n      y1 + \",\",\n      mx,\n      my - d * f,\n      mx,\n      my,\n      \"C\",\n      mx,\n      my + d * f,\n      x2 - h,\n      y2 + \",\",\n      x2,\n      y2,\n    ].join(\" \");\n  } else {\n    h = Math.min(Math.abs(dx) / 2.5, 20 + d / 4);\n\n    return [\"M\", x1, y1, \"C\", x1 + h, y1 + \",\", x2 - h, y2 + \",\", x2, y2].join(\n      \" \"\n    );\n  }\n};\n\nconst makeSVG = function (tag) {\n  if (tag == null) {\n    tag = \"svg\";\n  }\n  return document.createElementNS(\"http://www.w3.org/2000/svg\", tag);\n};\n\nconst connect = function (element, links) {\n  let link;\n  if (element.parentNode == null) {\n    return;\n  }\n\n  const ref = element.getBoundingClientRect();\n\n  for (link of Array.from(links)) {\n    const a = link.out.getBoundingClientRect();\n    const b = link.in.getBoundingClientRect();\n\n    link.coords = {\n      x1: (a.left + a.right) / 2 - ref.left,\n      y1: (a.top + a.bottom) / 2 - ref.top,\n      x2: (b.left + b.right) / 2 - ref.left,\n      y2: (b.top + b.bottom) / 2 - ref.top,\n    };\n  }\n\n  let svg = element.querySelector(\"svg\");\n  if (svg != null) {\n    element.removeChild(svg);\n  }\n\n  let box = element;\n  while (box.parentNode && box.offsetHeight === 0) {\n    box = box.parentNode;\n  }\n\n  svg = makeSVG();\n  svg.setAttribute(\"width\", box.offsetWidth);\n  svg.setAttribute(\"height\", box.offsetHeight);\n\n  for (link of Array.from(links)) {\n    const c = link.coords;\n\n    const line = makeSVG(\"path\");\n    line.setAttribute(\"d\", path(c.x1, c.y1, c.x2, c.y2));\n    line.setAttribute(\"stroke\", link.color);\n    line.setAttribute(\"stroke-width\", 3);\n    line.setAttribute(\"fill\", \"transparent\");\n    svg.appendChild(line);\n  }\n\n  return element.appendChild(svg);\n};\n\nexport const overlay = function (contents) {\n  const div = document.createElement(\"div\");\n  div.setAttribute(\"class\", \"shadergraph-overlay\");\n\n  const close = document.createElement(\"div\");\n  close.setAttribute(\"class\", \"shadergraph-close\");\n  close.innerHTML = \"&times;\";\n\n  const view = document.createElement(\"div\");\n  view.setAttribute(\"class\", \"shadergraph-view\");\n\n  const inside = document.createElement(\"div\");\n  inside.setAttribute(\"class\", \"shadergraph-inside\");\n\n  inside.appendChild(contents);\n  view.appendChild(inside);\n  div.appendChild(view);\n  div.appendChild(close);\n\n  close.addEventListener(\"click\", () => div.parentNode.removeChild(div));\n\n  return div;\n};\n\nconst wrap = function (markup) {\n  if (markup instanceof Node) {\n    return markup;\n  }\n  const p = document.createElement(\"span\");\n  p.innerText = markup != null ? markup : \"\";\n  return p;\n};\n\nexport const merge = function (markup) {\n  if (markup.length !== 1) {\n    let el;\n    const div = document.createElement(\"div\");\n    for (el of Array.from(markup)) {\n      div.appendChild(wrap(el));\n    }\n    div.update = () =>\n      (() => {\n        const result = [];\n        for (el of Array.from(markup)) {\n          result.push(\n            typeof el.update === \"function\" ? el.update() : undefined\n          );\n        }\n        return result;\n      })();\n    return div;\n  } else {\n    return wrap(markup[0]);\n  }\n};\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport { serialize as _serialize } from \"./serialize\";\nimport * as _markup from \"./markup\";\n\nexport const serialize = _serialize;\nexport const markup = _markup;\n\nconst _visualize = function (graph) {\n  if (!graph) {\n    return;\n  }\n  if (!graph.nodes) {\n    return graph;\n  }\n\n  const data = serialize(graph);\n  return markup.process(data);\n};\n\nconst resolve = function (arg) {\n  if (arg == null) {\n    return arg;\n  }\n  if (arg instanceof Array) {\n    return arg.map(resolve);\n  }\n  if (arg.vertex != null && arg.fragment != null) {\n    return [resolve(arg.vertex, resolve(arg.fragment))];\n  }\n  if (arg._graph != null) {\n    return arg._graph;\n  }\n  if (arg.graph != null) {\n    return arg.graph;\n  }\n  return arg;\n};\n\nconst merge = function (args) {\n  let out = [];\n  for (const arg of Array.from(args)) {\n    if (arg instanceof Array) {\n      out = out.concat(merge(arg));\n    } else if (arg != null) {\n      out.push(arg);\n    }\n  }\n  return out;\n};\n\nexport const visualize = function () {\n  const list = merge(resolve([].slice.call(arguments)));\n  return markup.merge(\n    Array.from(list)\n      .filter((graph) => graph)\n      .map((graph) => _visualize(graph))\n  );\n};\n\nexport const inspect = function () {\n  const contents = visualize.apply(null, arguments);\n  const element = markup.overlay(contents);\n\n  for (const el of Array.from(\n    document.querySelectorAll(\".shadergraph-overlay\")\n  )) {\n    el.remove();\n  }\n  document.body.appendChild(element);\n  contents.update();\n\n  return element;\n};\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Graph } from \"../graph\";\nimport * as Block from \"../block\";\nimport * as Visualize from \"../visualize\";\n\n/*\n  Chainable factory\n\n  Exposes methods to build a graph incrementally\n*/\nexport class Factory {\n  constructor(language, fetch, config) {\n    this.language = language;\n    this.fetch = fetch;\n    this.config = config;\n    this.graph();\n  }\n\n  // Combined call/concat shortcut\n  pipe(name, uniforms, namespace, defines) {\n    if (name instanceof Factory) {\n      this._concat(name);\n    } else if (name != null) {\n      this._call(name, uniforms, namespace, defines);\n    }\n    return this;\n  }\n\n  // Old name\n  call(name, uniforms, namespace, defines) {\n    return this.pipe(name, uniforms, namespace, defines);\n  }\n\n  // Combined callback/import shortcut\n  require(name, uniforms, namespace, defines) {\n    if (name instanceof Factory) {\n      this._import(name);\n    } else if (name != null) {\n      this.callback();\n      this._call(name, uniforms, namespace, defines);\n      this.end();\n    }\n    return this;\n  }\n\n  // Old name\n  import(name, uniforms, namespace, defines) {\n    return this.require(name, uniforms, namespace, defines);\n  }\n\n  // Create parallel branches that connect as one block to the end\n  // (one outgoing connection per outlet)\n  split() {\n    this._group(\"_combine\", true);\n    return this;\n  }\n\n  // Create parallel branches that fan out from the end\n  // (multiple outgoing connections per outlet)\n  fan() {\n    this._group(\"_combine\", false);\n    return this;\n  }\n\n  // Create isolated subgraph\n  isolate() {\n    this._group(\"_isolate\");\n    return this;\n  }\n\n  // Create callback subgraph\n  callback() {\n    this._group(\"_callback\");\n    return this;\n  }\n\n  // Next branch in group\n  next() {\n    this._next();\n    return this;\n  }\n\n  // Connect branches to previous tail and add pass-through from end\n  pass() {\n    const pass = this._stack[2].end;\n    this.end();\n    this._state.end = this._state.end.concat(pass);\n    return this;\n  }\n\n  // Leave nested branches and join up with main graph,\n  // applying stored op along the way\n  end() {\n    const [sub, main] = Array.from(this._exit());\n    const { op } = sub;\n    if (this[op]) {\n      this[op](sub, main);\n    }\n    return this;\n  }\n\n  // Old name\n  join() {\n    return this.end();\n  }\n\n  // Return finalized graph / reset factory\n  graph() {\n    // Pop remaining stack\n    while ((this._stack != null ? this._stack.length : undefined) > 1) {\n      this.end();\n    }\n\n    // Remember terminating node(s) of graph\n    if (this._graph) {\n      this._tail(this._state, this._graph);\n    }\n\n    const graph = this._graph;\n\n    this._graph = new Graph();\n    this._state = new State();\n    this._stack = [this._state];\n\n    return graph;\n  }\n\n  // Compile shortcut (graph is thrown away)\n  compile(namespace) {\n    if (namespace == null) {\n      namespace = \"main\";\n    }\n    return this.graph().compile(namespace);\n  }\n\n  // Link shortcut (graph is thrown away)\n  link(namespace) {\n    if (namespace == null) {\n      namespace = \"main\";\n    }\n    return this.graph().link(namespace);\n  }\n\n  // Serialize for debug\n  serialize() {\n    return Visualize.serialize(this._graph);\n  }\n\n  // Return true if empty\n  empty() {\n    return this._graph.nodes.length === 0;\n  }\n\n  // Concatenate existing factory onto tail\n  // Retains original factory\n  _concat(factory) {\n    // Ignore empty concat\n    let block;\n    if (factory._state.nodes.length === 0) {\n      return this;\n    }\n\n    this._tail(factory._state, factory._graph);\n\n    try {\n      block = new Block.Isolate(factory._graph);\n    } catch (error) {\n      if (this.config.autoInspect) {\n        Visualize.inspect(error, this._graph, factory);\n      }\n      throw error;\n    }\n\n    this._auto(block);\n    return this;\n  }\n\n  // Add existing factory as callback\n  // Retains original factory\n  _import(factory) {\n    // Check for empty require\n    let block;\n    if (factory._state.nodes.length === 0) {\n      throw \"Can't import empty callback\";\n    }\n\n    this._tail(factory._state, factory._graph);\n\n    try {\n      block = new Block.Callback(factory._graph);\n    } catch (error) {\n      if (this.config.autoInspect) {\n        Visualize.inspect(error, this._graph, factory);\n      }\n      throw error;\n    }\n\n    this._auto(block);\n    return this;\n  }\n\n  // Connect parallel branches to tail\n  _combine(sub, main) {\n    for (const to of Array.from(sub.start)) {\n      for (const from of Array.from(main.end)) {\n        from.connect(to, sub.multi);\n      }\n    }\n\n    main.end = sub.end;\n    return (main.nodes = main.nodes.concat(sub.nodes));\n  }\n\n  // Make subgraph and connect to tail\n  _isolate(sub, _main) {\n    if (sub.nodes.length) {\n      let block;\n      const subgraph = this._subgraph(sub);\n      this._tail(sub, subgraph);\n\n      try {\n        block = new Block.Isolate(subgraph);\n      } catch (error) {\n        if (this.config.autoInspect) {\n          Visualize.inspect(error, this._graph, subgraph);\n        }\n        throw error;\n      }\n\n      return this._auto(block);\n    }\n  }\n\n  // Convert to callback and connect to tail\n  _callback(sub, _main) {\n    if (sub.nodes.length) {\n      let block;\n      const subgraph = this._subgraph(sub);\n      this._tail(sub, subgraph);\n\n      try {\n        block = new Block.Callback(subgraph);\n      } catch (error) {\n        if (this.config.autoInspect) {\n          Visualize.inspect(error, this._graph, subgraph);\n        }\n        throw error;\n      }\n\n      return this._auto(block);\n    }\n  }\n\n  // Create next call block\n  _call(name, uniforms, namespace, defines) {\n    const snippet = this.fetch(name);\n    snippet.bind(this.config, uniforms, namespace, defines);\n    const block = new Block.Call(snippet);\n    return this._auto(block);\n  }\n\n  // Move current state into subgraph\n  _subgraph(sub) {\n    const subgraph = new Graph(null, this._graph);\n    subgraph.adopt(sub.nodes);\n    return subgraph;\n  }\n\n  // Finalize graph tail\n  _tail(state, graph) {\n    // Merge (unique) terminating ends into single tail node if needed\n    let tail = state.end.concat(state.tail);\n    tail = tail.filter((node, i) => tail.indexOf(node) === i);\n\n    if (tail.length > 1) {\n      tail = new Block.Join(tail);\n      tail = [tail.node];\n      this._graph.add(tail);\n    }\n\n    // Save single endpoint\n    graph.tail = tail[0];\n    state.end = tail;\n    state.tail = [];\n\n    if (!graph.tail) {\n      throw new Error(\"Cannot finalize empty graph\");\n    }\n\n    // Add compile/link/export/inspect shortcut methods\n    graph.compile = (namespace) => {\n      if (namespace == null) {\n        namespace = \"main\";\n      }\n      try {\n        return graph.tail.owner.compile(this.language, namespace);\n      } catch (error) {\n        if (this.config.autoInspect) {\n          graph.inspect(error);\n        }\n        throw error;\n      }\n    };\n\n    graph.link = (namespace) => {\n      if (namespace == null) {\n        namespace = \"main\";\n      }\n      try {\n        return graph.tail.owner.link(this.language, namespace);\n      } catch (error) {\n        if (this.config.autoInspect) {\n          graph.inspect(error);\n        }\n        throw error;\n      }\n    };\n\n    graph.export = (layout, depth) => {\n      return graph.tail.owner.export(layout, depth);\n    };\n\n    return (graph.inspect = (message = null) =>\n      Visualize.inspect(message, graph));\n  }\n\n  // Create group for branches or callbacks\n  _group(op, multi) {\n    this._push(op, multi); // Accumulator\n    this._push(); // Current\n    return this;\n  }\n\n  // Merge branch into accumulator and reset state\n  _next() {\n    const sub = this._pop();\n\n    this._state.start = this._state.start.concat(sub.start);\n    this._state.end = this._state.end.concat(sub.end);\n    this._state.nodes = this._state.nodes.concat(sub.nodes);\n    this._state.tail = this._state.tail.concat(sub.tail);\n\n    return this._push();\n  }\n\n  // Exit nested branches\n  _exit() {\n    this._next();\n    this._pop();\n    return [this._pop(), this._state];\n  }\n\n  // State stack\n  _push(op, multi) {\n    this._stack.unshift(new State(op, multi));\n    return (this._state = this._stack[0]);\n  }\n\n  _pop() {\n    let left;\n    this._state = this._stack[1];\n    if (this._state == null) {\n      this._state = new State();\n    }\n    return (left = this._stack.shift()) != null ? left : new State();\n  }\n\n  // Auto append or insert depending on whether we have inputs\n  _auto(block) {\n    if (block.node.inputs.length) {\n      return this._append(block);\n    } else {\n      return this._insert(block);\n    }\n  }\n\n  // Add block and connect to end\n  _append(block) {\n    let end;\n    const { node } = block;\n    this._graph.add(node);\n\n    for (end of Array.from(this._state.end)) {\n      end.connect(node);\n    }\n\n    if (!this._state.start.length) {\n      this._state.start = [node];\n    }\n    this._state.end = [node];\n\n    this._state.nodes.push(node);\n    if (!node.outputs.length) {\n      this._state.tail.push(node);\n    }\n  }\n\n  // Add block and connect to start\n  _prepend(block) {\n    let start;\n    const { node } = block;\n    this._graph.add(node);\n\n    for (start of Array.from(this._state.start)) {\n      node.connect(start);\n    }\n\n    if (!this._state.end.length) {\n      this._state.end = [node];\n    }\n    this._state.start = [node];\n\n    this._state.nodes.push(node);\n    if (!node.outputs.length) {\n      this._state.tail.push(node);\n    }\n  }\n\n  // Insert loose block\n  _insert(block) {\n    const { node } = block;\n    this._graph.add(node);\n\n    this._state.start.push(node);\n    this._state.end.push(node);\n\n    this._state.nodes.push(node);\n    if (!node.outputs.length) {\n      return this._state.tail.push(node);\n    }\n  }\n}\n\nclass State {\n  constructor(op = null, multi, start, end, nodes, tail) {\n    this.op = op;\n    if (multi == null) {\n      multi = false;\n    }\n    this.multi = multi;\n    if (start == null) {\n      start = [];\n    }\n    this.start = start;\n    if (end == null) {\n      end = [];\n    }\n    this.end = end;\n    if (nodes == null) {\n      nodes = [];\n    }\n    this.nodes = nodes;\n    if (tail == null) {\n      tail = [];\n    }\n    this.tail = tail;\n  }\n}\n","/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as Visualize from \"../visualize\";\n\nconst debug = false;\n\nconst tick = function () {\n  const now = +new Date();\n  return function (label) {\n    const delta = +new Date() - now;\n    console.log(label, delta + \" ms\");\n    return delta;\n  };\n};\n\nexport class Material {\n  constructor(vertex, fragment) {\n    this.vertex = vertex;\n    this.fragment = fragment;\n    if (debug) {\n      this.tock = tick();\n    }\n  }\n\n  build(options) {\n    return this.link(options);\n  }\n\n  link(options) {\n    if (options == null) {\n      options = {};\n    }\n    const uniforms = {};\n    const varyings = {};\n    const attributes = {};\n\n    const vertex = this.vertex.link(\"main\");\n    const fragment = this.fragment.link(\"main\");\n\n    for (const shader of [vertex, fragment]) {\n      for (const key in shader.uniforms) {\n        const value = shader.uniforms[key];\n        uniforms[key] = value;\n      }\n      for (const key in shader.varyings) {\n        const value = shader.varyings[key];\n        varyings[key] = value;\n      }\n      for (const key in shader.attributes) {\n        const value = shader.attributes[key];\n        attributes[key] = value;\n      }\n    }\n\n    options.vertexShader = vertex.code;\n    options.vertexGraph = vertex.graph;\n    options.fragmentShader = fragment.code;\n    options.fragmentGraph = fragment.graph;\n    options.attributes = attributes;\n    options.uniforms = uniforms;\n    options.varyings = varyings;\n    options.inspect = () =>\n      Visualize.inspect(\n        \"Vertex Shader\",\n        vertex,\n        \"Fragment Shader\",\n        fragment.graph\n      );\n\n    if (debug) {\n      this.tock(\"Material build\");\n    }\n\n    return options;\n  }\n\n  inspect() {\n    return Visualize.inspect(\n      \"Vertex Shader\",\n      this.vertex,\n      \"Fragment Shader\",\n      this.fragment.graph\n    );\n  }\n}\n","/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n/*\n  Snippet library\n\n  Takes:\n    - Hash of snippets: named library\n    - (name) -> getter: dynamic lookup\n    - nothing:          no library, only pass in inline source code\n\n  If 'name' contains any of \"{;(#\" it is assumed to be direct GLSL code.\n*/\nexport const library = function (language, snippets, load) {\n  let callback = null;\n  let used = {};\n\n  if (snippets != null) {\n    if (typeof snippets === \"function\") {\n      callback = (name) => load(language, name, snippets(name));\n    } else if (typeof snippets === \"object\") {\n      callback = function (name) {\n        if (snippets[name] == null) {\n          throw new Error(`Unknown snippet \\`${name}\\``);\n        }\n        return load(language, name, snippets[name]);\n      };\n    }\n  }\n\n  const inline = (code) => load(language, \"\", code);\n\n  if (callback == null) {\n    return inline;\n  }\n\n  const fetch = function (name) {\n    if (name.match(/[{;]/)) {\n      return inline(name);\n    }\n    used[name] = true;\n    return callback(name);\n  };\n\n  fetch.used = function (_used) {\n    if (_used == null) {\n      _used = used;\n    }\n    return (used = _used);\n  };\n\n  return fetch;\n};\n","/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n// Least-recently-used queue for key expiry via linked list\nexport const queue = function (limit) {\n  if (limit == null) {\n    limit = 100;\n  }\n  const map = {};\n\n  let head = null;\n  let tail = null;\n  let count = 0;\n\n  // Insert at front\n  const add = function (item) {\n    item.prev = null;\n    item.next = head;\n\n    if (head != null) {\n      head.prev = item;\n    }\n\n    head = item;\n    if (tail == null) {\n      return (tail = item);\n    }\n  };\n\n  // Remove from list\n  const remove = function (item) {\n    const { prev } = item;\n    const { next } = item;\n\n    if (prev != null) {\n      prev.next = next;\n    }\n    if (next != null) {\n      next.prev = prev;\n    }\n\n    if (head === item) {\n      head = next;\n    }\n    if (tail === item) {\n      return (tail = prev);\n    }\n  };\n\n  // Push key to top of list\n  return function (key) {\n    let dead, item;\n    if ((item = map[key]) && item !== head) {\n      // Already in queue\n      remove(item);\n      add(item);\n    } else {\n      // Check capacity\n      if (count === limit) {\n        // Pop tail\n        dead = tail.key;\n        remove(tail);\n\n        // Expire key\n        delete map[dead];\n      } else {\n        count++;\n      }\n\n      // Replace head\n      item = { next: head, prev: null, key };\n      add(item);\n\n      // Map record for lookup\n      map[key] = item;\n    }\n\n    // Return expired key\n    return dead;\n  };\n};\n","/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n/*\n  Cache decorator\n  Fetches snippets once, clones for reuse\n  Inline code is hashed to avoid bloat\n*/\nimport { queue } from \"./queue\";\nimport { hash } from \"./hash\";\n\nexport const cache = function (fetch) {\n  const cached = {};\n  const push = queue(100);\n\n  // Snippet factory\n  return function (name) {\n    const key = name.length > 32 ? \"##\" + hash(name).toString(16) : name;\n\n    // Push new key onto queue, see if an old key expired\n    const expire = push(key);\n    if (expire != null) {\n      delete cached[expire];\n    }\n\n    // Clone cached snippet\n    if (cached[key] == null) {\n      cached[key] = fetch(name);\n    }\n    return cached[key].clone();\n  };\n};\n","/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n/*\n  Compile snippet back into GLSL, but with certain symbols replaced by prefixes / placeholders\n*/\n\nexport const compile = function (program) {\n  const { code, signatures } = program;\n\n  // Prepare list of placeholders\n  const placeholders = replaced(signatures);\n\n  // Compile\n  const assembler = string_compiler(code, placeholders);\n\n  return [signatures, assembler];\n};\n\nconst replaced = function (signatures) {\n  const out = {};\n  const s = (sig) => (out[sig.name] = true);\n\n  s(signatures.main);\n\n  // Prefix all global symbols\n  for (const key of [\n    \"external\",\n    \"internal\",\n    \"varying\",\n    \"uniform\",\n    \"attribute\",\n  ]) {\n    for (const sig of signatures[key]) {\n      s(sig);\n    }\n  }\n\n  return out;\n};\n\n/*\nString-replacement based compiler\n*/\nconst string_compiler = function (code, placeholders) {\n  // Make regexp for finding placeholders\n  // Replace on word boundaries\n  let key;\n  const re = new RegExp(\n    \"\\\\b(\" +\n      (() => {\n        const result = [];\n        for (key in placeholders) {\n          result.push(key);\n        }\n        return result;\n      })().join(\"|\") +\n      \")\\\\b\",\n    \"g\"\n  );\n\n  // Strip comments\n  code = code.replace(/\\/\\/[^\\n]*/g, \"\");\n  code = code.replace(/\\/\\*([^*]|\\*[^/])*\\*\\//g, \"\");\n\n  // Strip all preprocessor commands (lazy)\n  //code = code.replace /^#[^\\n]*/mg, ''\n\n  // Assembler function that takes namespace prefix and exceptions\n  // and returns GLSL source code\n  return function (prefix, exceptions, defines) {\n    let key;\n    if (prefix == null) {\n      prefix = \"\";\n    }\n    if (exceptions == null) {\n      exceptions = {};\n    }\n    if (defines == null) {\n      defines = {};\n    }\n    const replace = {};\n    for (key in placeholders) {\n      replace[key] = exceptions[key] != null ? key : prefix + key;\n    }\n\n    const compiled = code.replace(re, (key) => replace[key]);\n\n    const defs = (() => {\n      const result1 = [];\n      for (key in defines) {\n        const value = defines[key];\n        result1.push(`#define ${key} ${value}`);\n      }\n      return result1;\n    })();\n    if (defs.length) {\n      defs.push(\"\");\n    }\n    return defs.join(\"\\n\") + compiled;\n  };\n};\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n// AST node parsers\n\nimport { Vector2 } from \"three/src/math/Vector2.js\";\nimport { Vector3 } from \"three/src/math/Vector3.js\";\nimport { Vector4 } from \"three/src/math/Vector4.js\";\nimport { Matrix3 } from \"three/src/math/Matrix3.js\";\nimport { Matrix4 } from \"three/src/math/Matrix4.js\";\n\nexport const decl = {};\n\ndecl.in = 0;\ndecl.out = 1;\ndecl.inout = 2;\n\nconst get = (n) => n.token.data;\n\ndecl.node = function (node) {\n  if (\n    (node.children[5] != null ? node.children[5].type : undefined) ===\n    \"function\"\n  ) {\n    return decl.function(node);\n  } else if ((node.token != null ? node.token.type : undefined) === \"keyword\") {\n    return decl.external(node);\n  }\n};\n\ndecl.external = function (node) {\n  //    console.log 'external', node\n  let c = node.children;\n\n  let storage = get(c[1]);\n  const type = get(c[4]);\n  const list = c[5];\n\n  if (![\"attribute\", \"uniform\", \"varying\"].includes(storage)) {\n    storage = \"global\";\n  }\n\n  const out = [];\n\n  for (let i = 0; i < list.children.length; i++) {\n    c = list.children[i];\n    if (c.type === \"ident\") {\n      const ident = get(c);\n      const next = list.children[i + 1];\n      const quant = (next != null ? next.type : undefined) === \"quantifier\";\n\n      out.push({\n        decl: \"external\",\n        storage,\n        type,\n        ident,\n        quant: !!quant,\n        count: quant,\n      });\n    }\n  }\n\n  return out;\n};\n\ndecl.function = function (node) {\n  const c = node.children;\n\n  //    console.log 'function', node\n\n  const storage = get(c[1]);\n  const type = get(c[4]);\n  const func = c[5];\n  const ident = get(func.children[0]);\n  const args = func.children[1];\n  const body = func.children[2];\n\n  const decls = Array.from(args.children).map((child) => decl.argument(child));\n\n  return [\n    {\n      decl: \"function\",\n      storage,\n      type,\n      ident,\n      body: !!body,\n      args: decls,\n    },\n  ];\n};\n\ndecl.argument = function (node) {\n  const c = node.children;\n\n  //    console.log 'argument', node\n\n  const storage = get(c[1]);\n  const inout = get(c[2]);\n  const type = get(c[4]);\n  const list = c[5];\n  const ident = get(list.children[0]);\n  const quant = list.children[1];\n\n  const count = quant ? quant.children[0].token.data : undefined;\n\n  return {\n    decl: \"argument\",\n    storage,\n    inout,\n    type,\n    ident,\n    quant: !!quant,\n    count,\n  };\n};\n\ndecl.param = function (dir, storage, spec, quant, count) {\n  let prefix = [];\n  if (storage != null) {\n    prefix.push(storage);\n  }\n  if (spec != null) {\n    prefix.push(spec);\n  }\n  prefix.push(\"\");\n\n  prefix = prefix.join(\" \");\n  const suffix = quant ? \"[\" + count + \"]\" : \"\";\n  if (dir !== \"\") {\n    dir += \" \";\n  }\n\n  const f = (name, long) => (long ? dir : \"\") + `${prefix}${name}${suffix}`;\n  f.split = (dir) => decl.param(dir, storage, spec, quant, count);\n\n  return f;\n};\n\n// Three.js sugar\nconst win = typeof window !== \"undefined\";\nconst threejs = win && !!window.THREE;\n\nconst defaults = {\n  int: 0,\n  float: 0,\n  vec2: threejs ? Vector2 : null,\n  vec3: threejs ? Vector3 : null,\n  vec4: threejs ? Vector4 : null,\n  mat2: null,\n  mat3: threejs ? Matrix3 : null,\n  mat4: threejs ? Matrix4 : null,\n  sampler2D: 0,\n  samplerCube: 0,\n};\n\nconst three = {\n  int: \"i\",\n  float: \"f\",\n  vec2: \"v2\",\n  vec3: \"v3\",\n  vec4: \"v4\",\n  mat2: \"m2\",\n  mat3: \"m3\",\n  mat4: \"m4\",\n  sampler2D: \"t\",\n  samplerCube: \"t\",\n};\n\ndecl.type = function (name, spec, quant, count, dir, storage) {\n  const dirs = {\n    in: decl.in,\n    out: decl.out,\n    inout: decl.inout,\n  };\n\n  const storages = { const: \"const\" };\n\n  let type = three[spec];\n  if (quant) {\n    type += \"v\";\n  }\n\n  let value = defaults[spec];\n  if (value != null ? value.call : undefined) {\n    value = new value();\n  }\n  if (quant) {\n    value = [value];\n  }\n\n  const inout = dirs[dir] != null ? dirs[dir] : dirs.in;\n  storage = storages[storage];\n\n  const param = decl.param(dir, storage, spec, quant, count);\n  return new Definition(name, type, spec, param, value, inout);\n};\n\nclass Definition {\n  constructor(name, type, spec, param, value, inout, meta) {\n    this.name = name;\n    this.type = type;\n    this.spec = spec;\n    this.param = param;\n    this.value = value;\n    this.inout = inout;\n    this.meta = meta;\n  }\n\n  split() {\n    // Split inouts\n    const isIn = this.meta.shadowed != null;\n    const dir = isIn ? \"in\" : \"out\";\n    const inout = isIn ? decl.in : decl.out;\n    const param = this.param.split(dir);\n    return new Definition(\n      this.name,\n      this.type,\n      this.spec,\n      param,\n      this.value,\n      inout\n    );\n  }\n\n  copy(name, meta) {\n    return new Definition(\n      name != null ? name : this.name,\n      this.type,\n      this.spec,\n      this.param,\n      this.value,\n      this.inout,\n      meta\n    );\n  }\n}\n","export const SHADOW_ARG = \"_i_o\";\nexport const RETURN_ARG = \"return\";\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS201: Simplify complex destructure assignments\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport tokenize from \"glsl-tokenizer/string\";\nimport parser from \"@sicmutils/glsl-parser/direct\";\nimport { decl } from \"./decl\";\nimport { SHADOW_ARG, RETURN_ARG } from \"./constants\";\n\nlet debug = false;\n\n/*\nparse GLSL into AST\nextract all global symbols and make type signatures\n*/\n// Parse a GLSL snippet\nexport const parse = function (name, code) {\n  const ast = parseGLSL(name, code);\n  return processAST(ast, code);\n};\n\n// Parse GLSL language into AST\nconst parseGLSL = function (name, code) {\n  let ast, tock;\n  let errors = [];\n  if (debug) {\n    tock = tick();\n  }\n\n  try {\n    const tokens = tokenize(code);\n    ast = parser(tokens);\n  } catch (e) {\n    errors = [{ message: e }];\n  }\n\n  if (debug) {\n    tock(\"GLSL Tokenize & Parse\");\n  }\n\n  const fmt = function (code) {\n    code = code.split(\"\\n\");\n    const max = (\"\" + code.length).length;\n    const pad = function (v) {\n      if ((v = \"\" + v).length < max) {\n        return (\"       \" + v).slice(-max);\n      } else {\n        return v;\n      }\n    };\n    return code.map((line, i) => `${pad(i + 1)}: ${line}`).join(\"\\n\");\n  };\n\n  if (!ast || errors.length) {\n    if (!name) {\n      name = \"(inline code)\";\n    }\n    console.warn(fmt(code));\n    for (const error of errors) {\n      console.error(`${name} -`, error.message);\n    }\n    throw new Error(\"GLSL parse error\");\n  }\n\n  return ast;\n};\n\n// Process AST for compilation\nconst processAST = function (ast, code) {\n  let tock;\n  if (debug) {\n    tock = tick();\n  }\n\n  // Walk AST tree and collect global declarations\n  const symbols = [];\n  walk(mapSymbols, collect(symbols), ast, \"\");\n\n  // Sort symbols into bins\n  const [main, internals, externals] = Array.from(sortSymbols(symbols));\n\n  // Extract storage/type signatures of symbols\n  const signatures = extractSignatures(main, internals, externals);\n\n  if (debug) {\n    tock(\"GLSL AST\");\n  }\n\n  return { ast, code, signatures };\n};\n\n// Extract functions and external symbols from AST\nconst mapSymbols = function (node, collect) {\n  switch (node.type) {\n    case \"decl\":\n      collect(decl.node(node));\n      return false;\n  }\n  return true;\n};\n\nconst collect = (out) =>\n  function (value) {\n    if (value != null) {\n      Array.from(value).map((obj) => out.push(obj));\n    }\n  };\n\n// Identify internals, externals and main function\nconst sortSymbols = function (symbols) {\n  let main = null;\n  const internals = [];\n  let externals = [];\n  const maybe = {};\n  let found = false;\n\n  for (const s of Array.from(symbols)) {\n    if (!s.body) {\n      // Unmarked globals are definitely internal\n      if (s.storage === \"global\") {\n        internals.push(s);\n\n        // Possible external\n      } else {\n        externals.push(s);\n        maybe[s.ident] = true;\n      }\n    } else {\n      // Remove earlier forward declaration\n      if (maybe[s.ident]) {\n        externals = Array.from(externals).filter((e) => e.ident !== s.ident);\n        delete maybe[s.ident];\n      }\n\n      // Internal function\n      internals.push(s);\n\n      // Last function is main\n      // unless there is a function called 'main'\n      if (s.ident === \"main\") {\n        main = s;\n        found = true;\n      } else if (!found) {\n        main = s;\n      }\n    }\n  }\n\n  return [main, internals, externals];\n};\n\n// Generate type signatures and appropriate ins/outs\nconst extractSignatures = function (main, internals, externals) {\n  let symbol;\n  const sigs = {\n    uniform: [],\n    attribute: [],\n    varying: [],\n    external: [],\n    internal: [],\n    global: [],\n    main: null,\n  };\n\n  const defn = (symbol) =>\n    decl.type(\n      symbol.ident,\n      symbol.type,\n      symbol.quant,\n      symbol.count,\n      symbol.inout,\n      symbol.storage\n    );\n\n  const func = function (symbol, inout) {\n    let d;\n    const signature = Array.from(symbol.args).map((arg) => defn(arg));\n\n    // Split inouts into in and out\n    for (d of Array.from(signature)) {\n      if (d.inout === decl.inout) {\n        const a = d;\n        const b = d.copy();\n\n        a.inout = decl.in;\n        b.inout = decl.out;\n        b.meta = { shadow: a.name };\n        b.name += SHADOW_ARG;\n        a.meta = { shadowed: b.name };\n\n        signature.push(b);\n      }\n    }\n\n    // Add output for return type\n    if (symbol.type !== \"void\") {\n      signature.unshift(decl.type(RETURN_ARG, symbol.type, false, \"\", \"out\"));\n    }\n\n    // Make type string\n    const inTypes = (() => {\n      const result = [];\n      for (d of Array.from(signature)) {\n        if (d.inout === decl.in) {\n          result.push(d.type);\n        }\n      }\n      return result;\n    })().join(\",\");\n    const outTypes = (() => {\n      const result1 = [];\n      for (d of Array.from(signature)) {\n        if (d.inout === decl.out) {\n          result1.push(d.type);\n        }\n      }\n      return result1;\n    })().join(\",\");\n    const type = `(${inTypes})(${outTypes})`;\n\n    return {\n      name: symbol.ident,\n      type,\n      signature,\n      inout,\n      spec: symbol.type,\n    };\n  };\n\n  // Main\n  sigs.main = func(main, decl.out);\n\n  // Internals (for name replacement only)\n  for (symbol of Array.from(internals)) {\n    sigs.internal.push({\n      name: symbol.ident,\n    });\n  }\n\n  // Externals\n  for (symbol of Array.from(externals)) {\n    let def;\n    switch (symbol.decl) {\n      // Uniforms/attributes/varyings\n      case \"external\":\n        def = defn(symbol);\n        sigs[symbol.storage].push(def);\n        break;\n\n      // Callbacks\n      case \"function\":\n        def = func(symbol, decl.in);\n        sigs.external.push(def);\n        break;\n    }\n  }\n\n  return sigs;\n};\n\n// Walk AST, apply map and collect values\ndebug = false;\n\nexport const walk = function (map, collect, node, indent) {\n  debug &&\n    console.log(\n      indent,\n      node.type,\n      node.token != null ? node.token.data : undefined,\n      node.token != null ? node.token.type : undefined\n    );\n\n  const recurse = map(node, collect);\n\n  if (recurse) {\n    for (let i = 0; i < node.children.length; i++) {\n      const child = node.children[i];\n      walk(map, collect, child, indent + \"  \", debug);\n    }\n  }\n\n  return null;\n};\n\n// #####\n\nconst tick = function () {\n  const now = +new Date();\n  return function (label) {\n    const delta = +new Date() - now;\n    console.log(label, delta + \" ms\");\n    return delta;\n  };\n};\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as Graph from \"../graph\";\nimport * as $ from \"./constants\";\n\n/*\n  GLSL code generator for compiler and linker stubs\n*/\n\n// Check if shadow outlet\nexport function unshadow(name) {\n  const real = name.replace($.SHADOW_ARG, \"\");\n  if (real !== name) {\n    return real;\n  } else {\n    return null;\n  }\n}\n\n// Line joiners\nexport function lines(lines) {\n  return lines.join(\"\\n\");\n}\nexport function list(lines) {\n  return lines.join(\", \");\n}\nexport function statements(lines) {\n  return lines.join(\";\\n\");\n}\n\n// Function body\nexport function body(entry) {\n  return {\n    entry,\n    type: \"void\",\n    params: [],\n    signature: [],\n    return: \"\",\n    vars: {},\n    calls: [],\n    post: [],\n    chain: {},\n  };\n}\n\n// Symbol define\nexport function define(a, b) {\n  return `#define ${a} ${b}`;\n}\n\n// Function define\nexport function fn(type, entry, params, vars, calls) {\n  return `${type} ${entry}(${params}) {\\n${vars}${calls}}`;\n}\n\n// Function invocation\nexport function invoke(ret, entry, args) {\n  ret = ret ? `${ret} = ` : \"\";\n  args = list(args);\n  return `  ${ret}${entry}(${args})`;\n}\n\n// Compare two signatures\nexport function same(a, b) {\n  for (let i = 0; i < a.length; i++) {\n    const A = a[i];\n    const B = b[i];\n    if (!B) {\n      return false;\n    }\n    if (A.type !== B.type) {\n      return false;\n    }\n    if ((A.name === $.RETURN_ARG) !== (B.name === $.RETURN_ARG)) {\n      return false;\n    }\n  }\n  return true;\n}\n\n// Generate call signature for module invocation\nexport function call(lookup, dangling, entry, signature, body) {\n  const args = [];\n  let ret = \"\";\n\n  for (let arg of Array.from(signature)) {\n    let id, shadow;\n    const { name } = arg;\n\n    let copy = (id = lookup(name));\n    let other = null;\n    let meta = null;\n    let omit = false;\n\n    const isReturn = name === $.RETURN_ARG;\n\n    // Shadowed inout: input side\n    if ((shadow = arg.meta != null ? arg.meta.shadowed : undefined)) {\n      other = lookup(shadow);\n      if (other) {\n        body.vars[other] = \"  \" + arg.param(other);\n        body.calls.push(`  ${other} = ${id}`);\n\n        if (!dangling(shadow)) {\n          arg = arg.split();\n        } else {\n          meta = { shadowed: other };\n        }\n      }\n    }\n\n    // Shadowed inout: output side\n    if ((shadow = arg.meta != null ? arg.meta.shadow : undefined)) {\n      other = lookup(shadow);\n      if (other) {\n        if (!dangling(shadow)) {\n          arg = arg.split();\n          omit = true;\n        } else {\n          meta = { shadow: other };\n          continue;\n        }\n      }\n    }\n\n    if (isReturn) {\n      // Capture return value\n      ret = id;\n    } else if (!omit) {\n      // Pass all non return, non shadow args in\n      args.push(other != null ? other : id);\n    }\n\n    // Export argument if unconnected\n    if (dangling(name)) {\n      let op = \"push\";\n      if (isReturn) {\n        if (body.return === \"\") {\n          op = \"unshift\";\n          // Preserve 'return' arg name\n          copy = name;\n          body.type = arg.spec;\n          body.return = `  return ${id}`;\n          body.vars[id] = \"  \" + arg.param(id);\n        } else {\n          body.vars[id] = \"  \" + arg.param(id);\n          body.params.push(arg.param(id, true));\n        }\n      } else {\n        body.params.push(arg.param(id, true));\n      }\n\n      // Copy argument into new signature\n      arg = arg.copy(copy, meta);\n      body.signature[op](arg);\n    } else {\n      body.vars[id] = \"  \" + arg.param(id);\n    }\n  }\n\n  return body.calls.push(invoke(ret, entry, args));\n}\n\n// Assemble main() function from body and call reference\nexport function build(body, calls) {\n  const { entry } = body;\n  let code = null;\n\n  // Check if we're only calling one snippet with identical signature\n  // and not building void main();\n  if (calls && calls.length === 1 && entry !== \"main\") {\n    const b = calls[0].module;\n\n    if (same(body.signature, b.main.signature)) {\n      code = define(entry, b.entry);\n    }\n  }\n\n  // Otherwise build function body\n  if (code == null) {\n    let vars = (() => {\n      const result = [];\n      for (const v in body.vars) {\n        const decl = body.vars[v];\n        result.push(decl);\n      }\n      return result;\n    })();\n    ({ calls } = body);\n    const { post } = body;\n    let { params } = body;\n    const { type } = body;\n    const ret = body.return;\n\n    calls = calls.concat(post);\n    if (ret !== \"\") {\n      calls.push(ret);\n    }\n    calls.push(\"\");\n\n    if (vars.length) {\n      vars.push(\"\");\n      vars = statements(vars) + \"\\n\";\n    } else {\n      vars = \"\";\n    }\n\n    calls = statements(calls);\n    params = list(params);\n\n    code = fn(type, entry, params, vars, calls);\n  }\n\n  return {\n    signature: body.signature,\n    code,\n    name: entry,\n  };\n}\n\n// Build links to other callbacks\nexport function links(links) {\n  const out = {\n    defs: [],\n    bodies: [],\n  };\n\n  for (const l of Array.from(links)) {\n    link(l, out);\n  }\n\n  out.defs = lines(out.defs);\n  out.bodies = statements(out.bodies);\n\n  if (out.defs === \"\") {\n    delete out.defs;\n  }\n  if (out.bodies === \"\") {\n    delete out.bodies;\n  }\n\n  return out;\n}\n\n// Link a module's entry point as a callback\nexport const link = (link, out) => {\n  let arg, list;\n  const { module, name, external } = link;\n  const { main } = module;\n  const { entry } = module;\n\n  // If signatures match, #define alias for the symbol\n  if (same(main.signature, external.signature)) {\n    return out.defs.push(define(name, entry));\n  }\n\n  // Signatures differ, build one-line callback to match defined prototype\n\n  // Map names to names\n  const ins = [];\n  const outs = [];\n  let map = {};\n  const returnVar = [module.namespace, $.RETURN_ARG].join(\"\");\n\n  for (arg of Array.from(external.signature)) {\n    list = arg.inout === Graph.IN ? ins : outs;\n    list.push(arg);\n  }\n\n  for (arg of Array.from(main.signature)) {\n    list = arg.inout === Graph.IN ? ins : outs;\n    const other = list.shift();\n    let _name = other.name;\n\n    // Avoid 'return' keyword\n    if (_name === $.RETURN_ARG) {\n      _name = returnVar;\n    }\n\n    map[arg.name] = _name;\n  }\n\n  // Build function prototype to invoke the other side\n  let _lookup = (name) => map[name];\n  const _dangling = () => true;\n\n  const inner = body();\n  call(_lookup, _dangling, entry, main.signature, inner);\n  inner.entry = entry;\n\n  // Avoid 'return' keyword\n  map = { return: returnVar };\n  _lookup = (name) => (map[name] != null ? map[name] : name);\n\n  // Build wrapper function for the calling side\n  const outer = body();\n  call(_lookup, _dangling, entry, external.signature, outer);\n\n  outer.calls = inner.calls;\n  outer.entry = name;\n\n  out.bodies.push(build(inner).code.split(\" {\")[0]);\n  return out.bodies.push(build(outer).code);\n};\n\n// Remove all function prototypes to avoid redefinition errors\nexport function defuse(code) {\n  // Don't try this at home kids\n  const re =\n    /([A-Za-z0-9_]+\\s+)?[A-Za-z0-9_]+\\s+[A-Za-z0-9_]+\\s*\\([^)]*\\)\\s*;\\s*/gm;\n  const strip = (code) => code.replace(re, (_m) => \"\");\n\n  // Split into scopes by braces\n  const blocks = code.split(/(?=[{}])/g);\n  let level = 0;\n  for (let i = 0; i < blocks.length; i++) {\n    const b = blocks[i];\n    switch (b[0]) {\n      case \"{\":\n        level++;\n        break;\n      case \"}\":\n        level--;\n        break;\n    }\n\n    // Only mess with top level scope\n    if (level === 0) {\n      // Preprocessor lines will fuck us up. Split on them.\n      const hash = b.split(/^[ \\t]*#/m);\n      for (let j = 0; j < hash.length; j++) {\n        let line = hash[j];\n        if (j > 0) {\n          // Trim off preprocessor directive\n          line = line.split(/\\n/);\n          const head = line.shift();\n          const rest = line.join(\"\\n\");\n\n          // Process rest\n          hash[j] = [head, strip(rest)].join(\"\\n\");\n        } else {\n          // Process entire line\n          hash[j] = strip(line);\n        }\n      }\n\n      // Reassemble\n      blocks[i] = hash.join(\"#\");\n    }\n  }\n\n  return (code = blocks.join(\"\"));\n}\n\n// Remove duplicate uniforms / varyings / attributes\nexport function dedupe(code) {\n  const map = {};\n  const re =\n    /((attribute|uniform|varying)\\s+)[A-Za-z0-9_]+\\s+([A-Za-z0-9_]+)\\s*(\\[[^\\]]*\\]\\s*)?;\\s*/gm;\n  return code.replace(re, function (m, qual, type, name, _struct) {\n    if (map[name]) {\n      return \"\";\n    }\n    map[name] = true;\n    return m;\n  });\n}\n\n// Move definitions to top so they compile properly\nexport function hoist(code) {\n  const filter = function (lines, re) {\n    const defs = [];\n    const out = [];\n    for (const line of Array.from(lines)) {\n      const list = line.match(re) ? defs : out;\n      list.push(line);\n    }\n\n    return defs.concat(out);\n  };\n\n  let lines = code.split(\"\\n\");\n\n  // Hoist symbol defines to the top so (re)definitions use the right alias\n  lines = filter(lines, /^#define ([^ ]+ _pg_[0-9]+_|_pg_[0-9]+_ [^ ]+)$/);\n\n  // Hoist extensions\n  lines = filter(lines, /^#extension/);\n\n  return lines.join(\"\\n\");\n}\n","/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport { Block } from \"./block\";\nimport * as Factory from \"./factory\";\nimport * as GLSL from \"./glsl\";\nimport * as Graph from \"./graph\";\nimport * as Linker from \"./linker\";\nimport * as Visualize from \"./visualize\";\n\nconst { library, cache } = Factory;\nexport const { visualize, inspect } = Visualize;\nconst { Snippet } = Linker;\n\nconst merge = function (a, b = {}) {\n  const out = {};\n  for (let key in a) {\n    out[key] = b[key] || a[key];\n  }\n  return out;\n};\n\nexport class ShaderGraph {\n  constructor(snippets, config) {\n    const defaults = {\n      globalUniforms: false,\n      globalVaryings: true,\n      globalAttributes: true,\n      globals: [],\n      autoInspect: false,\n    };\n\n    this.config = merge(defaults, config);\n    this.fetch = cache(library(GLSL, snippets, Snippet.load));\n  }\n\n  shader(config) {\n    if (config == null) {\n      config = {};\n    }\n    const _config = merge(this.config, config);\n    return new Factory.Factory(GLSL, this.fetch, _config);\n  }\n\n  material(config) {\n    return new Factory.Material(this.shader(config), this.shader(config));\n  }\n\n  inspect(shader) {\n    return ShaderGraph.inspect(shader);\n  }\n  visualize(shader) {\n    return ShaderGraph.visualize(shader);\n  }\n\n  // Static visualization method\n  static inspect(shader) {\n    return inspect(shader);\n  }\n  static visualize(shader) {\n    return visualize(shader);\n  }\n}\n\n// Expose class hierarchy\nShaderGraph.Block = Block;\nShaderGraph.Factory = Factory;\nShaderGraph.GLSL = GLSL;\nShaderGraph.Graph = Graph;\nShaderGraph.Linker = Linker;\nShaderGraph.Visualize = Visualize;\n\nexport function load(snippets, config = {}) {\n  return new ShaderGraph(snippets, config);\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as ShaderGraph from \"shadergraph\";\n\nexport const Factory = function (snippets) {\n  function fetch(name) {\n    // Built-in library\n    const s = snippets[name];\n    if (s != null) {\n      return s;\n    }\n\n    // Load from <script> tags by ID\n    const ref = [\"#\", \".\", \":\", \"[\"].includes(name[0]);\n    const sel = ref ? name : `#${name}`;\n    const element = document.querySelector(sel);\n    if (element != null && element.tagName === \"SCRIPT\") {\n      return element.textContent || element.innerText;\n    }\n\n    throw new Error(`Unknown shader \\`${name}\\``);\n  }\n\n  return ShaderGraph.load(fetch, { autoInspect: true });\n};\n","import arrowposition from \"./glsl/arrow.position\";\nimport axisposition from \"./glsl/axis.position\";\nimport cartesian4position from \"./glsl/cartesian4.position\";\nimport cartesianposition from \"./glsl/cartesian.position\";\nimport clampposition from \"./glsl/clamp.position\";\nimport coloropaque from \"./glsl/color.opaque\";\nimport faceposition from \"./glsl/face.position\";\nimport facepositionnormal from \"./glsl/face.position.normal\";\nimport floatencode from \"./glsl/float.encode\";\nimport floatindexpack from \"./glsl/float.index.pack\";\nimport floatstretch from \"./glsl/float.stretch\";\nimport fragmentclipdashed from \"./glsl/fragment.clip.dashed\";\nimport fragmentclipdotted from \"./glsl/fragment.clip.dotted\";\nimport fragmentclipends from \"./glsl/fragment.clip.ends\";\nimport fragmentclipproximity from \"./glsl/fragment.clip.proximity\";\nimport fragmentcolor from \"./glsl/fragment.color\";\nimport fragmentmaprgba from \"./glsl/fragment.map.rgba\";\nimport fragmentsolid from \"./glsl/fragment.solid\";\nimport fragmenttransparent from \"./glsl/fragment.transparent\";\nimport gridposition from \"./glsl/grid.position\";\nimport growposition from \"./glsl/grow.position\";\nimport joinposition from \"./glsl/join.position\";\nimport labelalpha from \"./glsl/label.alpha\";\nimport labelmap from \"./glsl/label.map\";\nimport labeloutline from \"./glsl/label.outline\";\nimport layerposition from \"./glsl/layer.position\";\nimport lerpdepth from \"./glsl/lerp.depth\";\nimport lerpheight from \"./glsl/lerp.height\";\nimport lerpitems from \"./glsl/lerp.items\";\nimport lerpwidth from \"./glsl/lerp.width\";\nimport lineposition from \"./glsl/line.position\";\nimport map2ddata from \"./glsl/map.2d.data\";\nimport map2ddatawrap from \"./glsl/map.2d.data.wrap\";\nimport mapxyzw2dv from \"./glsl/map.xyzw.2dv\";\nimport mapxyzwalign from \"./glsl/map.xyzw.align\";\nimport mapxyzwtexture from \"./glsl/map.xyzw.texture\";\nimport meshfragmentcolor from \"./glsl/mesh.fragment.color\";\nimport meshfragmentmap from \"./glsl/mesh.fragment.map\";\nimport meshfragmentmask from \"./glsl/mesh.fragment.mask\";\nimport meshfragmentmaterial from \"./glsl/mesh.fragment.material\";\nimport meshfragmentshaded from \"./glsl/mesh.fragment.shaded\";\nimport meshfragmenttexture from \"./glsl/mesh.fragment.texture\";\nimport meshgammain from \"./glsl/mesh.gamma.in\";\nimport meshgammaout from \"./glsl/mesh.gamma.out\";\nimport meshmapuvwo from \"./glsl/mesh.map.uvwo\";\nimport meshposition from \"./glsl/mesh.position\";\nimport meshvertexcolor from \"./glsl/mesh.vertex.color\";\nimport meshvertexmask from \"./glsl/mesh.vertex.mask\";\nimport meshvertexposition from \"./glsl/mesh.vertex.position\";\nimport moveposition from \"./glsl/move.position\";\nimport objectmaskdefault from \"./glsl/object.mask.default\";\nimport pointalphacircle from \"./glsl/point.alpha.circle\";\nimport pointalphacirclehollow from \"./glsl/point.alpha.circle.hollow\";\nimport pointalphageneric from \"./glsl/point.alpha.generic\";\nimport pointalphagenerichollow from \"./glsl/point.alpha.generic.hollow\";\nimport pointedge from \"./glsl/point.edge\";\nimport pointfill from \"./glsl/point.fill\";\nimport pointmaskcircle from \"./glsl/point.mask.circle\";\nimport pointmaskdiamond from \"./glsl/point.mask.diamond\";\nimport pointmaskdown from \"./glsl/point.mask.down\";\nimport pointmaskleft from \"./glsl/point.mask.left\";\nimport pointmaskright from \"./glsl/point.mask.right\";\nimport pointmasksquare from \"./glsl/point.mask.square\";\nimport pointmaskup from \"./glsl/point.mask.up\";\nimport pointposition from \"./glsl/point.position\";\nimport pointsizeuniform from \"./glsl/point.size.uniform\";\nimport pointsizevarying from \"./glsl/point.size.varying\";\nimport polarposition from \"./glsl/polar.position\";\nimport projectposition from \"./glsl/project.position\";\nimport projectreadback from \"./glsl/project.readback\";\nimport rawpositionscale from \"./glsl/raw.position.scale\";\nimport repeatposition from \"./glsl/repeat.position\";\nimport resamplepadding from \"./glsl/resample.padding\";\nimport resamplerelative from \"./glsl/resample.relative\";\nimport revealmask from \"./glsl/reveal.mask\";\nimport rootposition from \"./glsl/root.position\";\nimport sample2d from \"./glsl/sample.2d\";\nimport scaleposition from \"./glsl/scale.position\";\nimport screenmapstpq from \"./glsl/screen.map.stpq\";\nimport screenmapxy from \"./glsl/screen.map.xy\";\nimport screenmapxyzw from \"./glsl/screen.map.xyzw\";\nimport screenpassuv from \"./glsl/screen.pass.uv\";\nimport screenposition from \"./glsl/screen.position\";\nimport sliceposition from \"./glsl/slice.position\";\nimport sphericalposition from \"./glsl/spherical.position\";\nimport splitposition from \"./glsl/split.position\";\nimport spreadposition from \"./glsl/spread.position\";\nimport spritefragment from \"./glsl/sprite.fragment\";\nimport spriteposition from \"./glsl/sprite.position\";\nimport stereographic4position from \"./glsl/stereographic4.position\";\nimport stereographicposition from \"./glsl/stereographic.position\";\nimport stpqsample2d from \"./glsl/stpq.sample.2d\";\nimport stpqxyzw2d from \"./glsl/stpq.xyzw.2d\";\nimport strippositionnormal from \"./glsl/strip.position.normal\";\nimport stylecolor from \"./glsl/style.color\";\nimport subdividedepth from \"./glsl/subdivide.depth\";\nimport subdividedepthlerp from \"./glsl/subdivide.depth.lerp\";\nimport subdivideheight from \"./glsl/subdivide.height\";\nimport subdivideheightlerp from \"./glsl/subdivide.height.lerp\";\nimport subdivideitems from \"./glsl/subdivide.items\";\nimport subdivideitemslerp from \"./glsl/subdivide.items.lerp\";\nimport subdividewidth from \"./glsl/subdivide.width\";\nimport subdividewidthlerp from \"./glsl/subdivide.width.lerp\";\nimport surfacemaskhollow from \"./glsl/surface.mask.hollow\";\nimport surfaceposition from \"./glsl/surface.position\";\nimport surfacepositionnormal from \"./glsl/surface.position.normal\";\nimport ticksposition from \"./glsl/ticks.position\";\nimport transform3position from \"./glsl/transform3.position\";\nimport transform4position from \"./glsl/transform4.position\";\nimport viewposition from \"./glsl/view.position\";\n\nexport const Snippets = {\n  \"arrow.position\": arrowposition,\n  \"axis.position\": axisposition,\n  \"cartesian.position\": cartesianposition,\n  \"cartesian4.position\": cartesian4position,\n  \"clamp.position\": clampposition,\n  \"color.opaque\": coloropaque,\n  \"face.position\": faceposition,\n  \"face.position.normal\": facepositionnormal,\n  \"float.encode\": floatencode,\n  \"float.index.pack\": floatindexpack,\n  \"float.stretch\": floatstretch,\n  \"fragment.clip.dashed\": fragmentclipdashed,\n  \"fragment.clip.dotted\": fragmentclipdotted,\n  \"fragment.clip.ends\": fragmentclipends,\n  \"fragment.clip.proximity\": fragmentclipproximity,\n  \"fragment.color\": fragmentcolor,\n  \"fragment.map.rgba\": fragmentmaprgba,\n  \"fragment.solid\": fragmentsolid,\n  \"fragment.transparent\": fragmenttransparent,\n  \"grid.position\": gridposition,\n  \"grow.position\": growposition,\n  \"join.position\": joinposition,\n  \"label.alpha\": labelalpha,\n  \"label.map\": labelmap,\n  \"label.outline\": labeloutline,\n  \"layer.position\": layerposition,\n  \"lerp.depth\": lerpdepth,\n  \"lerp.height\": lerpheight,\n  \"lerp.items\": lerpitems,\n  \"lerp.width\": lerpwidth,\n  \"line.position\": lineposition,\n  \"map.2d.data\": map2ddata,\n  \"map.2d.data.wrap\": map2ddatawrap,\n  \"map.xyzw.2dv\": mapxyzw2dv,\n  \"map.xyzw.align\": mapxyzwalign,\n  \"map.xyzw.texture\": mapxyzwtexture,\n  \"mesh.fragment.color\": meshfragmentcolor,\n  \"mesh.fragment.map\": meshfragmentmap,\n  \"mesh.fragment.mask\": meshfragmentmask,\n  \"mesh.fragment.material\": meshfragmentmaterial,\n  \"mesh.fragment.shaded\": meshfragmentshaded,\n  \"mesh.fragment.texture\": meshfragmenttexture,\n  \"mesh.gamma.in\": meshgammain,\n  \"mesh.gamma.out\": meshgammaout,\n  \"mesh.map.uvwo\": meshmapuvwo,\n  \"mesh.position\": meshposition,\n  \"mesh.vertex.color\": meshvertexcolor,\n  \"mesh.vertex.mask\": meshvertexmask,\n  \"mesh.vertex.position\": meshvertexposition,\n  \"move.position\": moveposition,\n  \"object.mask.default\": objectmaskdefault,\n  \"point.alpha.circle\": pointalphacircle,\n  \"point.alpha.circle.hollow\": pointalphacirclehollow,\n  \"point.alpha.generic\": pointalphageneric,\n  \"point.alpha.generic.hollow\": pointalphagenerichollow,\n  \"point.edge\": pointedge,\n  \"point.fill\": pointfill,\n  \"point.mask.circle\": pointmaskcircle,\n  \"point.mask.diamond\": pointmaskdiamond,\n  \"point.mask.down\": pointmaskdown,\n  \"point.mask.left\": pointmaskleft,\n  \"point.mask.right\": pointmaskright,\n  \"point.mask.square\": pointmasksquare,\n  \"point.mask.up\": pointmaskup,\n  \"point.position\": pointposition,\n  \"point.size.uniform\": pointsizeuniform,\n  \"point.size.varying\": pointsizevarying,\n  \"polar.position\": polarposition,\n  \"project.position\": projectposition,\n  \"project.readback\": projectreadback,\n  \"raw.position.scale\": rawpositionscale,\n  \"repeat.position\": repeatposition,\n  \"resample.padding\": resamplepadding,\n  \"resample.relative\": resamplerelative,\n  \"reveal.mask\": revealmask,\n  \"root.position\": rootposition,\n  \"sample.2d\": sample2d,\n  \"scale.position\": scaleposition,\n  \"screen.map.stpq\": screenmapstpq,\n  \"screen.map.xy\": screenmapxy,\n  \"screen.map.xyzw\": screenmapxyzw,\n  \"screen.pass.uv\": screenpassuv,\n  \"screen.position\": screenposition,\n  \"slice.position\": sliceposition,\n  \"spherical.position\": sphericalposition,\n  \"split.position\": splitposition,\n  \"spread.position\": spreadposition,\n  \"sprite.fragment\": spritefragment,\n  \"sprite.position\": spriteposition,\n  \"stereographic.position\": stereographicposition,\n  \"stereographic4.position\": stereographic4position,\n  \"stpq.sample.2d\": stpqsample2d,\n  \"stpq.xyzw.2d\": stpqxyzw2d,\n  \"strip.position.normal\": strippositionnormal,\n  \"style.color\": stylecolor,\n  \"subdivide.depth\": subdividedepth,\n  \"subdivide.depth.lerp\": subdividedepthlerp,\n  \"subdivide.height\": subdivideheight,\n  \"subdivide.height.lerp\": subdivideheightlerp,\n  \"subdivide.items\": subdivideitems,\n  \"subdivide.items.lerp\": subdivideitemslerp,\n  \"subdivide.width\": subdividewidth,\n  \"subdivide.width.lerp\": subdividewidthlerp,\n  \"surface.mask.hollow\": surfacemaskhollow,\n  \"surface.position\": surfaceposition,\n  \"surface.position.normal\": surfacepositionnormal,\n  \"ticks.position\": ticksposition,\n  \"transform3.position\": transform3position,\n  \"transform4.position\": transform4position,\n  \"view.position\": viewposition,\n};\n\nexport * from \"./factory.js\";\n","export default /* glsl */ `uniform float worldUnit;\nuniform float lineDepth;\nuniform float lineWidth;\nuniform float focusDepth;\n\nuniform vec4 geometryClip;\nuniform float arrowSize;\nuniform float arrowSpace;\n\nattribute vec4 position4;\nattribute vec3 arrow;\nattribute vec2 attach;\n\n// External\nvec3 getPosition(vec4 xyzw, float canonical);\n\nvoid getArrowGeometry(vec4 xyzw, float near, float far, out vec3 left, out vec3 right, out vec3 start) {\n  right = getPosition(xyzw, 1.0);\n  left  = getPosition(vec4(near, xyzw.yzw), 0.0);\n  start = getPosition(vec4(far, xyzw.yzw), 0.0);\n}\n\nmat4 getArrowMatrix(vec3 left, vec3 right, vec3 start) {\n\n  float depth = focusDepth;\n  if (lineDepth < 1.0) {\n    // Depth blending\n    float z = max(0.00001, -right.z);\n    depth = mix(z, focusDepth, lineDepth);\n  }\n    \n  vec3 diff = left - right;\n  float l = length(diff);\n  if (l == 0.0) {\n    return mat4(1.0, 0.0, 0.0, 0.0,\n                0.0, 1.0, 0.0, 0.0,\n                0.0, 0.0, 1.0, 0.0,\n                0.0, 0.0, 0.0, 1.0);\n  }\n\n  // Construct TBN matrix around shaft\n  vec3 t = normalize(diff);\n  vec3 n = normalize(cross(t, t.yzx + vec3(.1, .2, .3)));\n  vec3 b = cross(n, t);\n  \n  // Shrink arrows when vector gets too small\n  // Approach linear scaling with cubic ease the smaller we get\n  float size = arrowSize * lineWidth * worldUnit * depth * 1.25;\n  diff = right - start;\n  l = length(diff) * arrowSpace;\n  float mini = clamp(1.0 - l / size * .333, 0.0, 1.0);\n  float scale = 1.0 - mini * mini * mini;\n  float range = size * scale;\n  \n  // Size to 2.5:1 ratio\n  float rangeNB = range / 2.5;\n\n  // Anchor at end position\n  return mat4(vec4(n * rangeNB,  0),\n              vec4(b * rangeNB,  0),\n              vec4(t * range, 0),\n              vec4(right,  1.0));\n}\n\nvec3 getArrowPosition() {\n  vec3 left, right, start;\n  \n  vec4 p = min(geometryClip, position4);\n  \n  getArrowGeometry(p, attach.x, attach.y, left, right, start);\n  mat4 matrix = getArrowMatrix(left, right, start);\n  return (matrix * vec4(arrow.xyz, 1.0)).xyz;\n\n}\n`;\n","export default /* glsl */ `uniform vec4 axisStep;\nuniform vec4 axisPosition;\n\nvec4 getAxisPosition(vec4 xyzw, inout vec4 stpq) {\n  return axisStep * xyzw.x + axisPosition;\n}\n`;","export default /* glsl */ `uniform mat4 viewMatrix;\n\nvec4 getCartesianPosition(vec4 position, inout vec4 stpq) {\n  return viewMatrix * vec4(position.xyz, 1.0);\n}\n`;","export default /* glsl */ `uniform vec4 basisScale;\nuniform vec4 basisOffset;\nuniform vec4 viewScale;\nuniform vec4 viewOffset;\n\nvec4 getCartesian4Position(vec4 position, inout vec4 stpq) {\n  return position * basisScale + basisOffset;\n}\n`;","export default /* glsl */ `uniform vec4 clampLimit;\n\nvec4 getClampXYZW(vec4 xyzw) {\n  return clamp(xyzw, vec4(0.0), clampLimit);\n}\n`;","export default /* glsl */ `vec4 opaqueColor(vec4 color) {\n  return vec4(color.rgb, 1.0);\n}\n`;","export default /* glsl */ `uniform vec4 geometryClip;\nattribute vec4 position4;\n\n// External\nvec3 getPosition(vec4 xyzw, float canonical);\n\nvec3 getFacePosition() {\n  vec4 p = min(geometryClip, position4);\n  return getPosition(p, 1.0);\n}\n`;","export default /* glsl */ `attribute vec4 position4;\n\n// External\nvec3 getPosition(vec4 xyzw, float canonical);\n\nvarying vec3 vNormal;\nvarying vec3 vLight;\nvarying vec3 vPosition;\n\nvoid getFaceGeometry(vec4 xyzw, out vec3 pos, out vec3 normal) {\n  vec3 a, b, c;\n\n  a   = getPosition(vec4(xyzw.xyz, 0.0), 0.0);\n  b   = getPosition(vec4(xyzw.xyz, 1.0), 0.0);\n  c   = getPosition(vec4(xyzw.xyz, 2.0), 0.0);\n\n  pos = getPosition(xyzw, 1.0);\n  normal = normalize(cross(c - a, b - a));\n}\n\nvec3 getFacePositionNormal() {\n  vec3 center, normal;\n\n  getFaceGeometry(position4, center, normal);\n  vNormal   = normal;\n  vLight    = normalize((viewMatrix * vec4(1.0, 2.0, 2.0, 0.0)).xyz);\n  vPosition = -center;\n\n  return center;\n}\n`;","export default /* glsl */ `/*\nFloat encoding technique by\nCarlos Scheidegger\nhttps://github.com/cscheid/lux/blob/master/src/shade/bits/encode_float.js\n\nConversion to GLSL by:\nhttp://concord-consortium.github.io/lab/experiments/webgl-gpgpu/script.js\n*/\n\nfloat shift_right(float v, float amt) { \n  v = floor(v) + 0.5; \n  return floor(v / exp2(amt)); \n}\n\nfloat shift_left(float v, float amt) { \n  return floor(v * exp2(amt) + 0.5); \n}\n\nfloat mask_last(float v, float bits) { \n  return mod(v, shift_left(1.0, bits)); \n}\n\nfloat extract_bits(float num, float from, float to) { \n  from = floor(from + 0.5); to = floor(to + 0.5); \n  return mask_last(shift_right(num, from), to - from); \n}\n\nvec4 encode_float(float val) { \n  if (val == 0.0) return vec4(0, 0, 0, 0); \n  float valuesign = val > 0.0 ? 0.0 : 1.0; \n  val = abs(val); \n  float exponent = floor(log2(val)); \n  float biased_exponent = exponent + 127.0; \n  float fraction = ((val / exp2(exponent)) - 1.0) * 8388608.0; \n  float t = biased_exponent / 2.0; \n  float last_bit_of_biased_exponent = fract(t) * 2.0; \n  float remaining_bits_of_biased_exponent = floor(t); \n  float byte4 = extract_bits(fraction, 0.0, 8.0) / 255.0; \n  float byte3 = extract_bits(fraction, 8.0, 16.0) / 255.0; \n  float byte2 = (last_bit_of_biased_exponent * 128.0 + extract_bits(fraction, 16.0, 23.0)) / 255.0; \n  float byte1 = (valuesign * 128.0 + remaining_bits_of_biased_exponent) / 255.0; \n  return vec4(byte4, byte3, byte2, byte1); \n}\n`;","export default /* glsl */ `uniform vec4 indexModulus;\n\nvec4 getSample(vec4 xyzw);\nvec4 getIndex(vec4 xyzw);\n\nvec4 floatPackIndex(vec4 xyzw) {\n  vec4 value = getSample(xyzw);\n  vec4 index = getIndex(xyzw);\n\n  vec4 offset = floor(index + .5) * indexModulus;\n  vec2 sum2 = offset.xy + offset.zw;\n  float sum = sum2.x + sum2.y;\n  return vec4(value.xyz, sum);\n}`;","export default /* glsl */ `vec4 getSample(vec4 xyzw);\n\nfloat floatStretch(vec4 xyzw, float channelIndex) {\n  vec4 sample = getSample(xyzw);\n  vec2 xy = channelIndex > 1.5 ? sample.zw : sample.xy;\n  return mod(channelIndex, 2.0) > .5 ? xy.y : xy.x;\n}`;","export default /* glsl */ `varying float vClipStrokeWidth;\nvarying float vClipStrokeIndex;\nvarying vec3  vClipStrokeEven;\nvarying vec3  vClipStrokeOdd;\nvarying vec3  vClipStrokePosition;\n\nvoid clipStrokeFragment() {\n  bool odd = mod(vClipStrokeIndex, 2.0) >= 1.0;\n\n  vec3 tangent;\n  if (odd) {\n    tangent = vClipStrokeOdd;\n  }\n  else {\n    tangent = vClipStrokeEven;\n  }\n\n  float travel = dot(vClipStrokePosition, normalize(tangent)) / vClipStrokeWidth;\n  if (mod(travel, 16.0) > 8.0) {\n    discard;\n  }\n}\n`;","export default /* glsl */ `varying float vClipStrokeWidth;\nvarying float vClipStrokeIndex;\nvarying vec3  vClipStrokeEven;\nvarying vec3  vClipStrokeOdd;\nvarying vec3  vClipStrokePosition;\n\nvoid clipStrokeFragment() {\n  bool odd = mod(vClipStrokeIndex, 2.0) >= 1.0;\n\n  vec3 tangent;\n  if (odd) {\n    tangent = vClipStrokeOdd;\n  }\n  else {\n    tangent = vClipStrokeEven;\n  }\n\n  float travel = dot(vClipStrokePosition, normalize(tangent)) / vClipStrokeWidth;\n  if (mod(travel, 4.0) > 2.0) {\n    discard;\n  }\n}\n`;","export default /* glsl */ `varying vec2 vClipEnds;\n\nvoid clipEndsFragment() {\n  if (vClipEnds.x < 0.0 || vClipEnds.y < 0.0) discard;\n}\n`;","export default /* glsl */ `varying float vClipProximity;\n\nvoid clipProximityFragment() {\n  if (vClipProximity >= 0.5) discard;\n}`;","export default /* glsl */ `void setFragmentColor(vec4 color) {\n  gl_FragColor = color;\n}`;","export default /* glsl */ `vec4 fragmentRGBA(vec4 rgba, vec4 stpq) {\n  return rgba;\n}`;","export default /* glsl */ `void setFragmentColor(vec4 color) {\n  if (color.a < 1.0) discard;\n  gl_FragColor = color;\n}`;","export default /* glsl */ `void setFragmentColor(vec4 color) {\n  if (color.a >= 1.0) discard;\n  gl_FragColor = color;\n}`;","export default /* glsl */ `uniform vec4 gridPosition;\nuniform vec4 gridStep;\nuniform vec4 gridAxis;\n\nvec4 sampleData(vec2 xy);\n\nvec4 getGridPosition(vec4 xyzw) {\n  vec4 onAxis  = gridAxis * sampleData(vec2(xyzw.y, 0.0)).x;\n  vec4 offAxis = gridStep * xyzw.x + gridPosition;\n  return onAxis + offAxis;\n}\n`;","export default /* glsl */ `uniform float growScale;\nuniform vec4  growMask;\nuniform vec4  growAnchor;\n\nvec4 getSample(vec4 xyzw);\n\nvec4 getGrowSample(vec4 xyzw) {\n  vec4 anchor = xyzw * growMask + growAnchor;\n\n  vec4 position = getSample(xyzw);\n  vec4 center = getSample(anchor);\n\n  return mix(center, position, growScale);\n}`;","export default /* glsl */ `uniform float joinStride;\nuniform float joinStrideInv;\n\nfloat getIndex(vec4 xyzw);\nvec4 getRest(vec4 xyzw);\nvec4 injectIndices(float a, float b);\n\nvec4 getJoinXYZW(vec4 xyzw) {\n\n  float a = getIndex(xyzw);\n  float b = a * joinStrideInv;\n\n  float integer  = floor(b);\n  float fraction = b - integer;\n  \n  return injectIndices(fraction * joinStride, integer) + getRest(xyzw);\n}\n`;","export default /* glsl */ `varying float vPixelSize;\n\nvec4 getLabelAlphaColor(vec4 color, vec4 sample) {\n  float mask = clamp(sample.r * 1000.0, 0.0, 1.0);\n  float alpha = (sample.r - .5) * vPixelSize + .5;\n  float a = mask * alpha * color.a;\n  if (a <= 0.0) discard;\n  return vec4(color.xyz, a);\n}\n`;","export default /* glsl */ `vec2 mapUV(vec4 uvwo, vec4 stpq) {\n  return uvwo.xy;\n}\n`;","export default /* glsl */ `uniform float outlineExpand;\nuniform float outlineStep;\nuniform vec3  outlineColor;\n\nvarying float vPixelSize;\n\nconst float PIXEL_STEP = 255.0 / 16.0;\n\nvec4 getLabelOutlineColor(vec4 color, vec4 sample) {\n  float ps = vPixelSize * PIXEL_STEP;\n  float os = outlineStep;\n\n  float sdf = sample.r - .5 + outlineExpand;\n  vec2  sdfs = vec2(sdf, sdf + os);\n  vec2  alpha = clamp(sdfs * ps + .5, 0.0, 1.0);\n\n  if (alpha.y <= 0.0) {\n    discard;\n  }\n\n  vec3 blend = color.xyz;\n  if (alpha.y > alpha.x) {\n    blend = sqrt(mix(outlineColor * outlineColor, blend * blend, alpha.x));\n  }\n  \n  return vec4(blend, alpha.y * color.a);\n}\n`;","export default /* glsl */ `uniform vec4 layerScale;\nuniform vec4 layerBias;\n\nvec4 layerPosition(vec4 position, inout vec4 stpq) {\n  return layerScale * position + layerBias;\n}\n`;","export default /* glsl */ `// External\nvec4 sampleData(vec4 xyzw);\n\nvec4 lerpDepth(vec4 xyzw) {\n  float x = xyzw.z;\n  float i = floor(x);\n  float f = x - i;\n    \n  vec4 xyzw1 = vec4(xyzw.xy, i, xyzw.w);\n  vec4 xyzw2 = vec4(xyzw.xy, i + 1.0, xyzw.w);\n  \n  vec4 a = sampleData(xyzw1);\n  vec4 b = sampleData(xyzw2);\n\n  return mix(a, b, f);\n}\n`;","export default /* glsl */ `// External\nvec4 sampleData(vec4 xyzw);\n\nvec4 lerpHeight(vec4 xyzw) {\n  float x = xyzw.y;\n  float i = floor(x);\n  float f = x - i;\n    \n  vec4 xyzw1 = vec4(xyzw.x, i, xyzw.zw);\n  vec4 xyzw2 = vec4(xyzw.x, i + 1.0, xyzw.zw);\n  \n  vec4 a = sampleData(xyzw1);\n  vec4 b = sampleData(xyzw2);\n\n  return mix(a, b, f);\n}\n`;","export default /* glsl */ `// External\nvec4 sampleData(vec4 xyzw);\n\nvec4 lerpItems(vec4 xyzw) {\n  float x = xyzw.w;\n  float i = floor(x);\n  float f = x - i;\n    \n  vec4 xyzw1 = vec4(xyzw.xyz, i);\n  vec4 xyzw2 = vec4(xyzw.xyz, i + 1.0);\n  \n  vec4 a = sampleData(xyzw1);\n  vec4 b = sampleData(xyzw2);\n\n  return mix(a, b, f);\n}\n`;","export default /* glsl */ `// External\nvec4 sampleData(vec4 xyzw);\n\nvec4 lerpWidth(vec4 xyzw) {\n  float x = xyzw.x;\n  float i = floor(x);\n  float f = x - i;\n    \n  vec4 xyzw1 = vec4(i, xyzw.yzw);\n  vec4 xyzw2 = vec4(i + 1.0, xyzw.yzw);\n  \n  vec4 a = sampleData(xyzw1);\n  vec4 b = sampleData(xyzw2);\n\n  return mix(a, b, f);\n}\n`;","export default /* glsl */ `// Units and calibration\nuniform float worldUnit;\nuniform float lineWidth;\nuniform float lineDepth;\nuniform float focusDepth;\n\n// General data index\nuniform vec4 geometryClip;\nattribute vec4 position4;\n\n// (Start/mid/end -1/0/1, top/bottom -1,1)\nattribute vec2 line;\n\n// 0...1 for round or bevel joins\n#ifdef LINE_JOIN_DETAIL\nattribute float joint;\n#else\nconst float joint = 0.0;\n#endif\n\n// Knock out excessively long line segments (e.g. for asymtpotes)\n#ifdef LINE_PROXIMITY\nuniform float lineProximity;\nvarying float vClipProximity;\n#endif\n\n// Ghetto line stroking (local only, not global)\n#ifdef LINE_STROKE\nvarying float vClipStrokeWidth;\nvarying float vClipStrokeIndex;\nvarying vec3  vClipStrokeEven;\nvarying vec3  vClipStrokeOdd;\nvarying vec3  vClipStrokePosition;\n#endif\n\n// External\nvec3 getPosition(vec4 xyzw, float canonical);\n\n// Clip line ends for arrows / decoration\n#ifdef LINE_CLIP\nuniform float clipRange;\nuniform vec2  clipStyle;\nuniform float clipSpace;\n\nattribute vec2 strip;\n\nvarying vec2 vClipEnds;\n\nvoid clipEnds(vec4 xyzw, vec3 center, vec3 pos) {\n\n  // Sample end of line strip\n  vec4 xyzwE = vec4(strip.y, xyzw.yzw);\n  vec3 end   = getPosition(xyzwE, 0.0);\n\n  // Sample start of line strip\n  vec4 xyzwS = vec4(strip.x, xyzw.yzw);\n  vec3 start = getPosition(xyzwS, 0.0);\n\n  // Measure length\n  vec3 diff = end - start;\n  float l = length(diff) * clipSpace;\n\n  // Arrow length (=2.5x radius)\n  float arrowSize = 1.25 * clipRange * lineWidth * worldUnit;\n\n  vClipEnds = vec2(1.0);\n\n  if (clipStyle.y > 0.0) {\n    // Depth blend end\n    float depth = focusDepth;\n    if (lineDepth < 1.0) {\n      float z = max(0.00001, -end.z);\n      depth = mix(z, focusDepth, lineDepth);\n    }\n\n    // Absolute arrow length\n    float size = arrowSize * depth;\n\n    // Adjust clip range\n    // Approach linear scaling with cubic ease the smaller we get\n    float mini = clamp(1.0 - l / size * .333, 0.0, 1.0);\n    float scale = 1.0 - mini * mini * mini;\n    float invrange = 1.0 / (size * scale);\n\n    // Clip end\n    diff = end - center;\n    if(diff == vec3(0.0))\n      vClipEnds.x = -1.0;\n    else {\n      diff = normalize(end - center);\n      float d = dot(end - pos, diff);\n      vClipEnds.x = d * invrange - 1.0;\n    }\n  }\n\n  if (clipStyle.x > 0.0) {\n    // Depth blend start\n    float depth = focusDepth;\n    if (lineDepth < 1.0) {\n      float z = max(0.00001, -start.z);\n      depth = mix(z, focusDepth, lineDepth);\n    }\n\n    // Absolute arrow length\n    float size = arrowSize * depth;\n\n    // Adjust clip range\n    // Approach linear scaling with cubic ease the smaller we get\n    float mini = clamp(1.0 - l / size * .333, 0.0, 1.0);\n    float scale = 1.0 - mini * mini * mini;\n    float invrange = 1.0 / (size * scale);\n\n    // Clip start\n    diff = center - start;\n    if(diff == vec3(0.0))\n      vClipEnds.y = -1.0;\n    else {\n      diff = normalize(center - start);\n      float d = dot(pos - start, diff);\n      vClipEnds.y = d * invrange - 1.0;\n    }\n  }\n\n\n}\n#endif\n\n// Adjust left/center/right to be inside near/far z range\nconst float epsilon = 1e-5;\nvoid fixCenter(inout vec3 left, inout vec3 center, inout vec3 right) {\n  if (center.z >= 0.0) {\n    if (left.z < 0.0) {\n      float d = (center.z + epsilon) / (center.z - left.z);\n      center = mix(center, left, d);\n    }\n    else if (right.z < 0.0) {\n      float d = (center.z + epsilon) / (center.z - right.z);\n      center = mix(center, right, d);\n    }\n  }\n\n  if (left.z >= 0.0) {\n    if (center.z < 0.0) {\n      float d = (left.z + epsilon) / (left.z - center.z);\n      left = mix(left, center, d);\n    }\n  }\n\n  if (right.z >= 0.0) {\n    if (center.z < 0.0) {\n      float d = (right.z + epsilon) / (right.z - center.z);\n      right = mix(right, center, d);\n    }\n  }\n}\n\n// Sample the source data in an edge-aware manner\nvoid getLineGeometry(vec4 xyzw, float edge, out vec3 left, out vec3 center, out vec3 right) {\n  vec4 delta = vec4(1.0, 0.0, 0.0, 0.0);\n\n  center =                 getPosition(xyzw, 1.0);\n  left   = (edge > -0.5) ? getPosition(xyzw - delta, 0.0) : center;\n  right  = (edge < 0.5)  ? getPosition(xyzw + delta, 0.0) : center;\n}\n\n// Calculate the position for a vertex along the line, including joins\nvec3 getLineJoin(float edge, bool odd, vec3 left, vec3 center, vec3 right, float width, float offset, float joint) {\n  vec2 join = vec2(1.0, 0.0);\n\n  fixCenter(left, center, right);\n\n  vec4 a = vec4(left.xy, right.xy);\n  vec4 b = a / vec4(left.zz, right.zz);\n\n  vec2 l = b.xy;\n  vec2 r = b.zw;\n  vec2 c = center.xy / center.z;\n\n  vec4 d = vec4(l, c) - vec4(c, r);\n  float l1 = dot(d.xy, d.xy);\n  float l2 = dot(d.zw, d.zw);\n\n  if (l1 + l2 > 0.0) {\n\n    if (edge > 0.5 || l2 == 0.0) {\n      vec2 nl = normalize(d.xy);\n      vec2 tl = vec2(nl.y, -nl.x);\n\n#ifdef LINE_PROXIMITY\n      vClipProximity = 1.0;\n#endif\n\n#ifdef LINE_STROKE\n      vClipStrokeEven = vClipStrokeOdd = normalize(left - center);\n#endif\n      join = tl;\n    }\n    else if (edge < -0.5 || l1 == 0.0) {\n      vec2 nr = normalize(d.zw);\n      vec2 tr = vec2(nr.y, -nr.x);\n\n#ifdef LINE_PROXIMITY\n      vClipProximity = 1.0;\n#endif\n\n#ifdef LINE_STROKE\n      vClipStrokeEven = vClipStrokeOdd = normalize(center - right);\n#endif\n      join = tr;\n    }\n    else {\n      // Limit join stretch for tiny segments\n      float lmin2 = min(l1, l2) / (width * width);\n\n      // Hide line segment if ratio of leg lengths exceeds promixity threshold\n#ifdef LINE_PROXIMITY\n      float lr     = l1 / l2;\n      float rl     = l2 / l1;\n      float ratio  = max(lr, rl);\n      float thresh = lineProximity + 1.0;\n      vClipProximity = (ratio > thresh * thresh) ? 1.0 : 0.0;\n#endif\n\n      // Calculate normals/tangents\n      vec2 nl = normalize(d.xy);\n      vec2 nr = normalize(d.zw);\n\n      // Calculate tangents\n      vec2 tl = vec2(nl.y, -nl.x);\n      vec2 tr = vec2(nr.y, -nr.x);\n\n#ifdef LINE_PROXIMITY\n      // Mix tangents according to leg lengths\n      vec2 tc = normalize(mix(tl, tr, l1/(l1+l2)));\n#else\n      // Average tangent\n      vec2 tc = normalize(tl + tr);\n#endif\n\n      // Miter join\n      float cosA   = dot(nl, tc);\n      float sinA   = max(0.1, abs(dot(tl, tc)));\n      float factor = cosA / sinA;\n      float scale  = sqrt(1.0 + min(lmin2, factor * factor));\n\n      // Stroke normals\n#ifdef LINE_STROKE\n      vec3 stroke1 = normalize(left - center);\n      vec3 stroke2 = normalize(center - right);\n\n      if (odd) {\n        vClipStrokeEven = stroke1;\n        vClipStrokeOdd  = stroke2;\n      }\n      else {\n        vClipStrokeEven = stroke2;\n        vClipStrokeOdd  = stroke1;\n      }\n#endif\n\n#ifdef LINE_JOIN_MITER\n      // Apply straight up miter\n      join = tc * scale;\n#endif\n\n#ifdef LINE_JOIN_ROUND\n      // Slerp bevel join into circular arc\n      float dotProduct = dot(nl, nr);\n      float angle = acos(dotProduct);\n      float sinT  = sin(angle);\n      join = (sin((1.0 - joint) * angle) * tl + sin(joint * angle) * tr) / sinT;\n#endif\n\n#ifdef LINE_JOIN_BEVEL\n      // Direct bevel join between two flat ends\n      float dotProduct = dot(nl, nr);\n      join = mix(tl, tr, joint);\n#endif\n\n#ifdef LINE_JOIN_DETAIL\n      // Check if on inside or outside of joint\n      float crossProduct = nl.x * nr.y - nl.y * nr.x;\n      if (offset * crossProduct < 0.0) {\n        // For near-180-degree bends, correct back to a miter to avoid discontinuities\n        float ratio = clamp(-dotProduct * 2.0 - 1.0, 0.0, 1.0);\n        // Otherwise collapse the inside vertices into one.\n        join = mix(tc * scale, join, ratio * ratio * ratio);\n      }\n#endif\n\n    }\n    return vec3(join, 0.0);\n  }\n  else {\n    return vec3(0.0);\n  }\n\n}\n\n// Calculate final line position\nvec3 getLinePosition() {\n  vec3 left, center, right, join;\n\n  // left/center/right\n  float edge = line.x;\n  // up/down\n  float offset = line.y;\n\n  // Clip data\n  vec4 p = min(geometryClip, position4);\n  edge += max(0.0, position4.x - geometryClip.x);\n\n  // Get position + adjacent neighbours\n  getLineGeometry(p, edge, left, center, right);\n\n#ifdef LINE_STROKE\n  // Set parameters for line stroke fragment shader\n  vClipStrokePosition = center;\n  vClipStrokeIndex = p.x;\n  bool odd = mod(p.x, 2.0) >= 1.0;\n#else\n  bool odd = true;\n#endif\n\n  // Divide line width up/down\n  float width = lineWidth * 0.5;\n\n  float depth = focusDepth;\n  if (lineDepth < 1.0) {\n    // Depth blending\n    float z = max(0.00001, -center.z);\n    depth = mix(z, focusDepth, lineDepth);\n  }\n  width *= depth;\n\n  // Convert to world units\n  width *= worldUnit;\n\n  // Calculate line join\n  join = getLineJoin(edge, odd, left, center, right, width, offset, joint);\n  vec3 pos = center + join * offset * width;\n\n#ifdef LINE_STROKE\n  vClipStrokeWidth = width;\n#endif\n\n#ifdef LINE_CLIP\n  clipEnds(p, center, pos);\n#endif\n\n  return pos;\n}\n`;","export default /* glsl */ `uniform vec2 dataResolution;\nuniform vec2 dataPointer;\n\nvec2 map2DData(vec2 xy) {\n  return (xy + dataPointer) * dataResolution;\n}\n`;","export default /* glsl */ `uniform vec2 dataResolution;\nuniform vec2 dataPointer;\n\nvec2 map2DData(vec2 xy) {\n  return fract((xy + dataPointer) * dataResolution);\n}\n`;","export default /* glsl */ `void mapXyzw2DV(vec4 xyzw, out vec2 xy, out float z) {\n  xy = xyzw.xy;\n  z  = xyzw.z;\n}\n\n`;","export default /* glsl */ `vec4 alignXYZW(vec4 xyzw) {\n  return floor(xyzw + .5);\n}\n\n`;","export default /* glsl */ `uniform float textureItems;\nuniform float textureHeight;\n\nvec2 mapXyzwTexture(vec4 xyzw) {\n  \n  float x = xyzw.x;\n  float y = xyzw.y;\n  float z = xyzw.z;\n  float i = xyzw.w;\n  \n  return vec2(i, y) + vec2(x, z) * vec2(textureItems, textureHeight);\n}\n\n`;","export default /* glsl */ `varying vec4 vColor;\n\nvec4 getColor() {\n  return vColor;\n}\n`;","export default /* glsl */ `#ifdef POSITION_STPQ\nvarying vec4 vSTPQ;\n#endif\n#ifdef POSITION_U\nvarying float vU;\n#endif\n#ifdef POSITION_UV\nvarying vec2 vUV;\n#endif\n#ifdef POSITION_UVW\nvarying vec3 vUVW;\n#endif\n#ifdef POSITION_UVWO\nvarying vec4 vUVWO;\n#endif\n\nvec4 getSample(vec4 uvwo, vec4 stpq);\n\nvec4 getMapColor() {\n  #ifdef POSITION_STPQ\n  vec4 stpq = vSTPQ;\n  #else\n  vec4 stpq = vec4(0.0);\n  #endif\n\n  #ifdef POSITION_U\n  vec4 uvwo = vec4(vU, 0.0, 0.0, 0.0);\n  #endif\n  #ifdef POSITION_UV\n  vec4 uvwo = vec4(vUV, 0.0, 0.0);\n  #endif\n  #ifdef POSITION_UVW\n  vec4 uvwo = vec4(vUVW, 0.0);\n  #endif\n  #ifdef POSITION_UVWO\n  vec4 uvwo = vec4(vUVWO);\n  #endif\n\n  return getSample(uvwo, stpq);\n}\n`;","export default /* glsl */ `varying float vMask;\n\nfloat ease(float t) {\n  t = clamp(t, 0.0, 1.0);\n  return t * t * (3.0 - 2.0 * t);\n}\n\nvec4 maskColor() {\n  if (vMask <= 0.0) discard;\n  return vec4(vec3(1.0), ease(vMask));\n}\n`;","export default /* glsl */ `#ifdef POSITION_STPQ\nvarying vec4 vSTPQ;\n#endif\n#ifdef POSITION_U\nvarying float vU;\n#endif\n#ifdef POSITION_UV\nvarying vec2 vUV;\n#endif\n#ifdef POSITION_UVW\nvarying vec3 vUVW;\n#endif\n#ifdef POSITION_UVWO\nvarying vec4 vUVWO;\n#endif\n\nvec4 getSample(vec4 rgba, vec4 stpq);\n\nvec4 getMaterialColor(vec4 rgba) {\n  vec4 stpq = vec4(0.0);\n\n  #ifdef POSITION_U\n  stpq.x = vU;\n  #endif\n  #ifdef POSITION_UV\n  stpq.xy = vUV;\n  #endif\n  #ifdef POSITION_UVW\n  stpq.xyz = vUVW;\n  #endif\n  #ifdef POSITION_UVWO\n  stpq = vUVWO;\n  #endif\n\n  #ifdef POSITION_STPQ\n  stpq = vSTPQ;\n  #endif\n\n  return getSample(rgba, stpq);\n}\n`;","export default /* glsl */ `varying vec3 vNormal;\nvarying vec3 vLight;\nvarying vec3 vPosition;\n\nvec3 offSpecular(vec3 color) {\n  vec3 c = 1.0 - color;\n  return 1.0 - c * c;\n}\n\nvec4 getShadedColor(vec4 rgba) {\n  \n  vec3 color = rgba.xyz;\n  vec3 color2 = offSpecular(rgba.xyz);\n\n  vec3 normal = normalize(vNormal);\n  vec3 light = normalize(vLight);\n  vec3 position = normalize(vPosition);\n  \n  float side    = gl_FrontFacing ? -1.0 : 1.0;\n  float cosine  = side * dot(normal, light);\n  float diffuse = mix(max(0.0, cosine), .5 + .5 * cosine, .1);\n  \n  vec3  halfLight = normalize(light + position);\n\tfloat cosineHalf = max(0.0, side * dot(normal, halfLight));\n\tfloat specular = pow(cosineHalf, 16.0);\n\t\n\treturn vec4(color * (diffuse * .9 + .05) + .25 * color2 * specular, rgba.a);\n}\n`;","export default /* glsl */ ``;","export default /* glsl */ `vec4 getGammaInColor(vec4 rgba) {\n  return vec4(rgba.rgb * rgba.rgb, rgba.a);\n}\n`;","export default /* glsl */ `vec4 getGammaOutColor(vec4 rgba) {\n  return vec4(sqrt(rgba.rgb), rgba.a);\n}\n`;","export default /* glsl */ `vec4 mapUVWO(vec4 uvwo, vec4 stpq) {\n  return uvwo;\n}\n`;","export default /* glsl */ `uniform vec4 geometryClip;\nattribute vec4 position4;\n\n// External\nvec3 getPosition(vec4 xyzw, float canonical);\n\nvec3 getMeshPosition() {\n  vec4 p = min(geometryClip, position4);\n  return getPosition(p, 1.0);\n}\n`;","export default /* glsl */ `attribute vec4 position4;\nuniform vec4 geometryClip;\nvarying vec4 vColor;\n\n// External\nvec4 getSample(vec4 xyzw);\n\nvoid vertexColor() {\n  vec4 p = min(geometryClip, position4);\n  vColor = getSample(p);\n}\n`;","export default /* glsl */ `attribute vec4 position4;\nuniform vec4 geometryResolution;\nuniform vec4 geometryClip;\nvarying float vMask;\n\n// External\nfloat getSample(vec4 xyzw);\n\nvoid maskLevel() {\n  vec4 p = min(geometryClip, position4);\n  vMask = getSample(p * geometryResolution);\n}\n`;","export default /* glsl */ `uniform vec4 geometryResolution;\n\n#ifdef POSITION_STPQ\nvarying vec4 vSTPQ;\n#endif\n#ifdef POSITION_U\nvarying float vU;\n#endif\n#ifdef POSITION_UV\nvarying vec2 vUV;\n#endif\n#ifdef POSITION_UVW\nvarying vec3 vUVW;\n#endif\n#ifdef POSITION_UVWO\nvarying vec4 vUVWO;\n#endif\n\n// External\nvec3 getPosition(vec4 xyzw, in vec4 stpqIn, out vec4 stpqOut);\n\nvec3 getMeshPosition(vec4 xyzw, float canonical) {\n  vec4 stpqOut, stpqIn = xyzw * geometryResolution;\n  vec3 xyz = getPosition(xyzw, stpqIn, stpqOut);\n\n  #ifdef POSITION_MAP\n  if (canonical > 0.5) {\n    #ifdef POSITION_STPQ\n    vSTPQ = stpqOut;\n    #endif\n    #ifdef POSITION_U\n    vU = stpqOut.x;\n    #endif\n    #ifdef POSITION_UV\n    vUV = stpqOut.xy;\n    #endif\n    #ifdef POSITION_UVW\n    vUVW = stpqOut.xyz;\n    #endif\n    #ifdef POSITION_UVWO\n    vUVWO = stpqOut;\n    #endif\n  }\n  #endif\n  return xyz;\n}\n`;","export default /* glsl */ `uniform float transitionEnter;\nuniform float transitionExit;\nuniform vec4  transitionScale;\nuniform vec4  transitionBias;\nuniform float transitionSkew;\nuniform float transitionActive;\n\nuniform vec4  moveFrom;\nuniform vec4  moveTo;\n\nfloat ease(float t) {\n  t = clamp(t, 0.0, 1.0);\n  return 1.0 - (2.0 - t) * t;\n}\n\nvec4 getTransitionPosition(vec4 xyzw, inout vec4 stpq) {\n  if (transitionActive < 0.5) return xyzw;\n\n  float enter   = transitionEnter;\n  float exit    = transitionExit;\n  float skew    = transitionSkew;\n  vec4  scale   = transitionScale;\n  vec4  bias    = transitionBias;\n\n  float factor  = 1.0 + skew;\n  float offset  = dot(vec4(1.0), stpq * scale + bias);\n\n  float a1 = ease(enter * factor - offset);\n  float a2 = ease(exit  * factor + offset - skew);\n\n  return xyzw + a1 * moveFrom + a2 * moveTo;\n}`;","export default /* glsl */ `vec4 getMask(vec4 xyzw) {\n  return vec4(1.0);\n}`;","export default /* glsl */ `varying float vPixelSize;\n\nfloat getDiscAlpha(float mask) {\n  // Approximation: 1 - x*x is approximately linear around x = 1 with slope 2\n  return vPixelSize * (1.0 - mask);\n  //  return vPixelSize * 2.0 * (1.0 - sqrt(mask));\n}\n`;","export default /* glsl */ `varying float vPixelSize;\n\nfloat getDiscHollowAlpha(float mask) {\n  return vPixelSize * (0.5 - 2.0 * abs(sqrt(mask) - .75));\n}\n`;","export default /* glsl */ `varying float vPixelSize;\n\nfloat getGenericAlpha(float mask) {\n  return vPixelSize * 2.0 * (1.0 - mask);\n}\n`;","export default /* glsl */ `varying float vPixelSize;\n\nfloat getGenericHollowAlpha(float mask) {\n  return vPixelSize * (0.5 - 2.0 * abs(mask - .75));\n}\n`;","export default /* glsl */ `varying vec2 vSprite;\n\nfloat getSpriteMask(vec2 xy);\nfloat getSpriteAlpha(float mask);\n\nvoid setFragmentColorFill(vec4 color) {\n  float mask = getSpriteMask(vSprite);\n  if (mask > 1.0) {\n    discard;\n  }\n  float alpha = getSpriteAlpha(mask);\n  if (alpha >= 1.0) {\n    discard;\n  }\n  gl_FragColor = vec4(color.rgb, alpha * color.a);\n}\n`;","export default /* glsl */ `varying vec2 vSprite;\n\nfloat getSpriteMask(vec2 xy);\nfloat getSpriteAlpha(float mask);\n\nvoid setFragmentColorFill(vec4 color) {\n  float mask = getSpriteMask(vSprite);\n  if (mask > 1.0) {\n    discard;\n  }\n  float alpha = getSpriteAlpha(mask);\n  if (alpha < 1.0) {\n    discard;\n  }\n  gl_FragColor = color;\n}\n\n`;","export default /* glsl */ `varying float vPixelSize;\n\nfloat getCircleMask(vec2 uv) {\n  return dot(uv, uv);\n}\n`;","export default /* glsl */ `varying float vPixelSize;\n\nfloat getDiamondMask(vec2 uv) {\n  vec2 a = abs(uv);\n  return a.x + a.y;\n}\n`;","export default /* glsl */ `varying float vPixelSize;\n\nfloat getTriangleDownMask(vec2 uv) {\n  uv.y += .25;\n  return max(uv.y, abs(uv.x) * .866 - uv.y * .5 + .6);\n}\n`;","export default /* glsl */ `varying float vPixelSize;\n\nfloat getTriangleLeftMask(vec2 uv) {\n  uv.x += .25;\n  return max(uv.x, abs(uv.y) * .866 - uv.x * .5 + .6);\n}\n`;","export default /* glsl */ `varying float vPixelSize;\n\nfloat getTriangleRightMask(vec2 uv) {\n  uv.x -= .25;\n  return max(-uv.x, abs(uv.y) * .866 + uv.x * .5 + .6);\n}\n`;","export default /* glsl */ `varying float vPixelSize;\n\nfloat getSquareMask(vec2 uv) {\n  vec2 a = abs(uv);\n  return max(a.x, a.y);\n}\n`;","export default /* glsl */ `varying float vPixelSize;\n\nfloat getTriangleUpMask(vec2 uv) {\n  uv.y -= .25;\n  return max(-uv.y, abs(uv.x) * .866 + uv.y * .5 + .6);\n}\n`;","export default /* glsl */ `uniform float pointDepth;\n\nuniform float pixelUnit;\nuniform float renderScale;\nuniform float renderScaleInv;\nuniform float focusDepth;\n\nuniform vec4 geometryClip;\nattribute vec4 position4;\nattribute vec2 sprite;\n\nvarying vec2 vSprite;\nvarying float vPixelSize;\n\nconst float pointScale = POINT_SHAPE_SCALE;\n\n// External\nfloat getPointSize(vec4 xyzw);\nvec3 getPosition(vec4 xyzw, float canonical);\n\nvec3 getPointPosition() {\n  vec4 p = min(geometryClip, position4);\n  vec3 center = getPosition(p, 1.0);\n\n  // Depth blending\n  // TODO: orthographic camera\n  // Workaround: set depth = 0\n  float z = -center.z;\n  float depth = mix(z, focusDepth, pointDepth);\n  \n  // Match device/unit mapping \n  // Sprite goes from -1..1, width = 2.\n  float pointSize = getPointSize(p);\n  float size = pointScale * pointSize * pixelUnit * .5;\n  float depthSize = depth * size;\n  \n  // Pad sprite by half a pixel to make the anti-aliasing straddle the pixel edge\n  // Note: pixelsize measures radius\n  float pixelSize = .5 * (pointDepth > 0.0 ? depthSize / z : size);\n  float paddedSize = pixelSize + 0.5;\n  float padFactor = paddedSize / pixelSize;\n\n  vPixelSize = paddedSize;\n  vSprite    = sprite;\n\n  return center + vec3(sprite * depthSize * renderScaleInv * padFactor, 0.0);\n}\n`;","export default /* glsl */ `uniform float pointSize;\n\nfloat getPointSize(vec4 xyzw) {\n  return pointSize;\n}`;","export default /* glsl */ `uniform float pointSize;\n\nvec4 getSample(vec4 xyzw);\n\nfloat getPointSize(vec4 xyzw) {\n  return pointSize * getSample(xyzw).x;\n}`;","export default /* glsl */ `uniform float polarBend;\nuniform float polarFocus;\nuniform float polarAspect;\nuniform float polarHelix;\n\nuniform mat4 viewMatrix;\n\nvec4 getPolarPosition(vec4 position, inout vec4 stpq) {\n  if (polarBend > 0.0) {\n\n    if (polarBend < 0.001) {\n      // Factor out large addition/subtraction of polarFocus\n      // to avoid numerical error\n      // sin(x) ~ x\n      // cos(x) ~ 1 - x * x / 2\n      vec2 pb = position.xy * polarBend;\n      float ppbbx = pb.x * pb.x;\n      return viewMatrix * vec4(\n        position.x * (1.0 - polarBend + (pb.y * polarAspect)),\n        position.y * (1.0 - .5 * ppbbx) - (.5 * ppbbx) * polarFocus / polarAspect,\n        position.z + position.x * polarHelix * polarBend,\n        1.0\n      );\n    }\n    else {\n      vec2 xy = position.xy * vec2(polarBend, polarAspect);\n      float radius = polarFocus + xy.y;\n      return viewMatrix * vec4(\n        sin(xy.x) * radius,\n        (cos(xy.x) * radius - polarFocus) / polarAspect,\n        position.z + position.x * polarHelix * polarBend,\n        1.0\n      );\n    }\n  }\n  else {\n    return viewMatrix * vec4(position.xyz, 1.0);\n  }\n}`;","export default /* glsl */ `uniform float styleZBias;\nuniform float styleZIndex;\n\nvoid setPosition(vec3 position) {\n  vec4 pos = projectionMatrix * vec4(position, 1.0);\n\n  // Apply relative Z bias\n  float bias  = (1.0 - styleZBias / 32768.0);\n  pos.z *= bias;\n  \n  // Apply large scale Z index changes\n  if (styleZIndex > 0.0) {\n    float z = pos.z / pos.w;\n    pos.z = ((z + 1.0) / (styleZIndex + 1.0) - 1.0) * pos.w;\n  }\n  \n  gl_Position = pos;\n}`;","export default /* glsl */ `// This is three.js' global uniform, missing from fragment shaders.\nuniform mat4 projectionMatrix;\n\nvec4 readbackPosition(vec3 position, vec4 stpq) {\n  vec4 pos = projectionMatrix * vec4(position, 1.0);\n  vec3 final = pos.xyz / pos.w;\n  if (final.z < -1.0) {\n    return vec4(0.0, 0.0, 0.0, -1.0);\n  }\n  else {\n    return vec4(final, -position.z);\n  }\n}\n`;","export default /* glsl */ `uniform vec4 geometryScale;\nattribute vec4 position4;\n\nvec4 getRawPositionScale() {\n  return geometryScale * position4;\n}\n`;","export default /* glsl */ `uniform vec4 repeatModulus;\n\nvec4 getRepeatXYZW(vec4 xyzw) {\n  return mod(xyzw + .5, repeatModulus) - .5;\n}\n`;","export default /* glsl */ `uniform vec4 resampleBias;\n\nvec4 resamplePadding(vec4 xyzw) {\n  return xyzw + resampleBias;\n}`;","export default /* glsl */ `uniform vec4 resampleFactor;\n\nvec4 resampleRelative(vec4 xyzw) {\n  return xyzw * resampleFactor;\n}`;","export default /* glsl */ `uniform float transitionEnter;\nuniform float transitionExit;\nuniform vec4  transitionScale;\nuniform vec4  transitionBias;\nuniform float transitionSkew;\nuniform float transitionActive;\n\nfloat getTransitionSDFMask(vec4 stpq) {\n  if (transitionActive < 0.5) return 1.0;\n\n  float enter   = transitionEnter;\n  float exit    = transitionExit;\n  float skew    = transitionSkew;\n  vec4  scale   = transitionScale;\n  vec4  bias    = transitionBias;\n\n  float factor  = 1.0 + skew;\n  float offset  = dot(vec4(1.0), stpq * scale + bias);\n\n  vec2 d = vec2(enter, exit) * factor + vec2(-offset, offset - skew);\n  if (exit  == 1.0) return d.x;\n  if (enter == 1.0) return d.y;\n  return min(d.x, d.y);\n}`;","export default /* glsl */ `vec3 getRootPosition(vec4 position, in vec4 stpqIn, out vec4 stpqOut) {\n  stpqOut = stpqIn; // avoid inout confusion\n  return position.xyz;\n}`;","export default /* glsl */ `uniform sampler2D dataTexture;\n\nvec4 sample2D(vec2 uv) {\n  return texture2D(dataTexture, uv);\n}\n`;","export default /* glsl */ `uniform vec4 scaleAxis;\nuniform vec4 scaleOffset;\n\nvec4 sampleData(float x);\n\nvec4 getScalePosition(vec4 xyzw) {\n  return scaleAxis * sampleData(xyzw.x).x + scaleOffset;\n}\n`;","export default /* glsl */ `uniform vec4 remapSTPQScale;\n\nvec4 screenMapSTPQ(vec4 xyzw, out vec4 stpq) {\n  stpq = xyzw * remapSTPQScale;\n  return xyzw;\n}\n`;","export default /* glsl */ `uniform vec2 remapUVScale;\n\nvec4 screenMapXY(vec4 uvwo, vec4 stpq) {\n  return vec4(floor(remapUVScale * uvwo.xy), 0.0, 0.0);\n}\n`;","export default /* glsl */ `uniform vec2 remapUVScale;\nuniform vec2 remapModulus;\nuniform vec2 remapModulusInv;\n\nvec4 screenMapXYZW(vec4 uvwo, vec4 stpq) {\n  vec2 st = floor(remapUVScale * uvwo.xy);\n  vec2 xy = st * remapModulusInv;\n  vec2 ixy = floor(xy);\n  vec2 fxy = xy - ixy;\n  vec2 zw = fxy * remapModulus;\n  return vec4(ixy.x, zw.y, ixy.y, zw.x);\n}\n`;","export default /* glsl */ `vec2 screenPassUV(vec4 uvwo, vec4 stpq) {\n  return uvwo.xy;\n}\n`;","export default /* glsl */ `void setScreenPosition(vec4 position) {\n  gl_Position = vec4(position.xy * 2.0 - 1.0, 0.5, 1.0);\n}\n`;","export default /* glsl */ `uniform vec4 sliceOffset;\n\nvec4 getSliceOffset(vec4 xyzw) {\n  return xyzw + sliceOffset;\n}\n`;","export default /* glsl */ `uniform float sphericalBend;\nuniform float sphericalFocus;\nuniform float sphericalAspectX;\nuniform float sphericalAspectY;\nuniform float sphericalScaleY;\n\nuniform mat4 viewMatrix;\n\nvec4 getSphericalPosition(vec4 position, inout vec4 stpq) {\n  if (sphericalBend > 0.0001) {\n\n    vec3 xyz = position.xyz * vec3(sphericalBend, sphericalBend / sphericalAspectY * sphericalScaleY, sphericalAspectX);\n    float radius = sphericalFocus + xyz.z;\n    float cosine = cos(xyz.y) * radius;\n\n    return viewMatrix * vec4(\n      sin(xyz.x) * cosine,\n      sin(xyz.y) * radius * sphericalAspectY,\n      (cos(xyz.x) * cosine - sphericalFocus) / sphericalAspectX,\n      1.0\n    );\n  }\n  else {\n    return viewMatrix * vec4(position.xyz, 1.0);\n  }\n}`;","export default /* glsl */ `uniform float splitStride;\n\nvec2 getIndices(vec4 xyzw);\nvec4 getRest(vec4 xyzw);\nvec4 injectIndex(float v);\n\nvec4 getSplitXYZW(vec4 xyzw) {\n  vec2 uv = getIndices(xyzw);\n  float offset = uv.x + uv.y * splitStride;\n  return injectIndex(offset) + getRest(xyzw);\n}\n`;","export default /* glsl */ `uniform vec4 spreadOffset;\nuniform mat4 spreadMatrix;\n\n// External\nvec4 getSample(vec4 xyzw);\n\nvec4 getSpreadSample(vec4 xyzw) {\n  vec4 sample = getSample(xyzw);\n  return sample + spreadMatrix * (spreadOffset + xyzw);\n}\n`;","export default /* glsl */ `varying vec2 vSprite;\n\nvec4 getSample(vec2 xy);\n\nvec4 getSpriteColor() {\n  return getSample(vSprite);\n}`;","export default /* glsl */ `uniform vec2 spriteOffset;\nuniform float spriteScale;\nuniform float spriteDepth;\nuniform float spriteSnap;\n\nuniform vec2 renderOdd;\nuniform float renderScale;\nuniform float renderScaleInv;\nuniform float pixelUnit;\nuniform float focusDepth;\n\nuniform vec4 geometryClip;\nattribute vec4 position4;\nattribute vec2 sprite;\n\nvarying float vPixelSize;\n\n// External\nvec3 getPosition(vec4 xyzw, float canonical);\nvec4 getSprite(vec4 xyzw);\n\nvec3 getSpritePosition() {\n  // Clip points\n  vec4 p = min(geometryClip, position4);\n  float diff = length(position4 - p);\n  if (diff > 0.0) {\n    return vec3(0.0, 0.0, 1000.0);\n  }\n\n  // Make sprites\n  vec3 center = getPosition(p, 1.0);\n  vec4 atlas = getSprite(p);\n\n  // Sprite goes from -1..1, width = 2.\n  // -1..1 -> -0.5..0.5\n  vec2 halfSprite = sprite * .5;\n  vec2 halfFlipSprite = vec2(halfSprite.x, -halfSprite.y);\n\n#ifdef POSITION_UV\n  // Assign UVs\n  vUV = atlas.xy + atlas.zw * (halfFlipSprite + .5);\n#endif\n\n  // Depth blending\n  // TODO: orthographic camera\n  // Workaround: set depth = 0\n  float depth = focusDepth, z;\n  z = -center.z;\n  if (spriteDepth < 1.0) {\n    depth = mix(z, focusDepth, spriteDepth);\n  }\n  \n  // Match device/unit mapping \n  float size = pixelUnit * spriteScale;\n  float depthSize = depth * size;\n\n  // Calculate pixelSize for anti-aliasing\n  float pixelSize = (spriteDepth > 0.0 ? depthSize / z : size);\n  vPixelSize = pixelSize;\n\n  // Position sprite\n  vec2 atlasOdd = fract(atlas.zw / 2.0);\n  vec2 offset = (spriteOffset + halfSprite * atlas.zw) * depthSize;\n  if (spriteSnap > 0.5) {\n    // Snap to pixel (w/ epsilon shift to avoid jitter)\n    return vec3(((floor(center.xy / center.z * renderScale + 0.001) + renderOdd + atlasOdd) * center.z + offset) * renderScaleInv, center.z);\n  }\n  else {\n    // Place directly\n    return center + vec3(offset * renderScaleInv, 0.0);\n  }\n\n}\n`;","export default /* glsl */ `uniform float stereoBend;\n\nuniform mat4 viewMatrix;\n\nvec4 getStereoPosition(vec4 position, inout vec4 stpq) {\n  if (stereoBend > 0.0001) {\n\n    vec3 pos = position.xyz;\n    float r = length(pos);\n    float z = r + pos.z;\n    vec3 project = vec3(pos.xy / z, r);\n    \n    vec3 lerped = mix(pos, project, stereoBend);\n\n    return viewMatrix * vec4(lerped, 1.0);\n  }\n  else {\n    return viewMatrix * vec4(position.xyz, 1.0);\n  }\n}`;","export default /* glsl */ `uniform float stereoBend;\nuniform vec4 basisScale;\nuniform vec4 basisOffset;\nuniform mat4 viewMatrix;\nuniform vec2 view4D;\n\nvec4 getStereographic4Position(vec4 position, inout vec4 stpq) {\n  \n  vec4 transformed;\n  if (stereoBend > 0.0001) {\n\n    float r = length(position);\n    float w = r + position.w;\n    vec4 project = vec4(position.xyz / w, r);\n    \n    transformed = mix(position, project, stereoBend);\n  }\n  else {\n    transformed = position;\n  }\n\n  vec4 pos4 = transformed * basisScale - basisOffset;\n  vec3 xyz = (viewMatrix * vec4(pos4.xyz, 1.0)).xyz;\n  return vec4(xyz, pos4.w * view4D.y + view4D.x);\n}\n`;","export default /* glsl */ `varying vec2 vST;\n\nvec4 getSample(vec2 st);\n\nvec4 getSTSample() {\n  return getSample(vST);\n}\n`;","export default /* glsl */ `varying vec2 vUV;\n\nvoid setRawUV(vec4 xyzw) {\n  vUV = xyzw.xy;\n}\n`;","export default /* glsl */ `uniform vec4 geometryClip;\nattribute vec4 position4;\nattribute vec3 strip;\n\n// External\nvec3 getPosition(vec4 xyzw, float canonical);\n\nvarying vec3 vNormal;\nvarying vec3 vLight;\nvarying vec3 vPosition;\n\nvoid getStripGeometry(vec4 xyzw, vec3 strip, out vec3 pos, out vec3 normal) {\n  vec3 a, b, c;\n\n  a   = getPosition(xyzw, 1.0);\n  b   = getPosition(vec4(xyzw.xyz, strip.x), 0.0);\n  c   = getPosition(vec4(xyzw.xyz, strip.y), 0.0);\n\n  normal = normalize(cross(c - a, b - a)) * strip.z;\n  \n  pos = a;\n}\n\nvec3 getStripPositionNormal() {\n  vec3 center, normal;\n\n  vec4 p = min(geometryClip, position4);\n\n  getStripGeometry(p, strip, center, normal);\n  vNormal   = normal;\n  vLight    = normalize((viewMatrix * vec4(1.0, 2.0, 2.0, 0.0)).xyz);\n  vPosition = -center;\n\n  return center;\n}\n`;","export default /* glsl */ `uniform vec3 styleColor;\nuniform float styleOpacity;\n\nvec4 getStyleColor() {\n  return vec4(styleColor, styleOpacity);\n}\n`;","export default /* glsl */ `uniform float subdivideBevel;\n\n// External\nvec4 sampleData(vec4 xyzw);\n\nvec4 subdivideDepth(vec4 xyzw) {\n  float x = xyzw.z;\n  float i = floor(x);\n  float f = x - i;\n\n  float minf = subdivideBevel * min(f, 1.0 - f);\n  float g = (f > 0.5) ? 1.0 - minf : (f < 0.5) ? minf : 0.5;\n\n  return sampleData(vec4(xyzw.xy, i + g, xyzw.w));\n}\n`;","export default /* glsl */ `uniform float subdivideBevel;\n\n// External\nvec4 sampleData(vec4 xyzw);\n\nvec4 subdivideDepthLerp(vec4 xyzw) {\n  float x = xyzw.z;\n  float i = floor(x);\n  float f = x - i;\n\n  float minf = subdivideBevel * min(f, 1.0 - f);\n  float g = (f > 0.5) ? 1.0 - minf : (f < 0.5) ? minf : 0.5;\n\n  vec4 xyzw1 = vec4(xyzw.xy, i, xyzw.w);\n  vec4 xyzw2 = vec4(xyzw.xy, i + 1.0, xyzw.w);\n  \n  vec4 a = sampleData(xyzw1);\n  vec4 b = sampleData(xyzw2);\n\n  return mix(a, b, g);\n}\n`;","export default /* glsl */ `uniform float subdivideBevel;\n\n// External\nvec4 sampleData(vec4 xyzw);\n\nvec4 subdivideHeight(vec4 xyzw) {\n  float x = xyzw.y;\n  float i = floor(x);\n  float f = x - i;\n\n  float minf = subdivideBevel * min(f, 1.0 - f);\n  float g = (f > 0.5) ? 1.0 - minf : (f < 0.5) ? minf : 0.5;\n\n  return sampleData(vec4(xyzw.x, i + g, xyzw.zw));\n}\n`;","export default /* glsl */ `uniform float subdivideBevel;\n\n// External\nvec4 sampleData(vec4 xyzw);\n\nvec4 subdivideHeightLerp(vec4 xyzw) {\n  float x = xyzw.y;\n  float i = floor(x);\n  float f = x - i;\n\n  float minf = subdivideBevel * min(f, 1.0 - f);\n  float g = (f > 0.5) ? 1.0 - minf : (f < 0.5) ? minf : 0.5;\n\n  vec4 xyzw1 = vec4(xyzw.x, i, xyzw.zw);\n  vec4 xyzw2 = vec4(xyzw.x, i + 1.0, xyzw.zw);\n  \n  vec4 a = sampleData(xyzw1);\n  vec4 b = sampleData(xyzw2);\n\n  return mix(a, b, g);\n}\n`;","export default /* glsl */ `uniform float subdivideBevel;\n\n// External\nvec4 sampleData(vec4 xyzw);\n\nvec4 subdivideItems(vec4 xyzw) {\n  float x = xyzw.w;\n  float i = floor(x);\n  float f = x - i;\n\n  float minf = subdivideBevel * min(f, 1.0 - f);\n  float g = (f > 0.5) ? 1.0 - minf : (f < 0.5) ? minf : 0.5;\n\n  return sampleData(vec4(xyzw.xyz, i + g));\n}\n`;","export default /* glsl */ `uniform float subdivideBevel;\n\n// External\nvec4 sampleData(vec4 xyzw);\n\nvec4 subdivideItemsLerp(vec4 xyzw) {\n  float x = xyzw.w;\n  float i = floor(x);\n  float f = x - i;\n\n  float minf = subdivideBevel * min(f, 1.0 - f);\n  float g = (f > 0.5) ? 1.0 - minf : (f < 0.5) ? minf : 0.5;\n\n  vec4 xyzw1 = vec4(xyzw.xyz, i);\n  vec4 xyzw2 = vec4(xyzw.xyz, i + 1.0);\n  \n  vec4 a = sampleData(xyzw1);\n  vec4 b = sampleData(xyzw2);\n\n  return mix(a, b, g);\n}\n`;","export default /* glsl */ `uniform float subdivideBevel;\n\n// External\nvec4 sampleData(vec4 xyzw);\n\nvec4 subdivideWidth(vec4 xyzw) {\n  float x = xyzw.x;\n  float i = floor(x);\n  float f = x - i;\n\n  float minf = subdivideBevel * min(f, 1.0 - f);\n  float g = (f > 0.5) ? 1.0 - minf : (f < 0.5) ? minf : 0.5;\n\n  return sampleData(vec4(i + g, xyzw.yzw));\n}\n`;","export default /* glsl */ `uniform float subdivideBevel;\n\n// External\nvec4 sampleData(vec4 xyzw);\n\nvec4 subdivideWidthLerp(vec4 xyzw) {\n  float x = xyzw.x;\n  float i = floor(x);\n  float f = x - i;\n\n  float minf = subdivideBevel * min(f, 1.0 - f);\n  float g = (f > 0.5) ? 1.0 - minf : (f < 0.5) ? minf : 0.5;\n\n  vec4 xyzw1 = vec4(i, xyzw.yzw);\n  vec4 xyzw2 = vec4(i + 1.0, xyzw.yzw);\n  \n  vec4 a = sampleData(xyzw1);\n  vec4 b = sampleData(xyzw2);\n\n  return mix(a, b, g);\n}\n`;","export default /* glsl */ `attribute vec4 position4;\n\nfloat getSurfaceHollowMask(vec4 xyzw) {\n  vec4 df = abs(fract(position4) - .5);\n  vec2 df2 = min(df.xy, df.zw);\n  float df3 = min(df2.x, df2.y);\n  return df3;\n}`;","export default /* glsl */ `uniform vec4 geometryClip;\nuniform vec4 geometryResolution;\nuniform vec4 mapSize;\n\nattribute vec4 position4;\n\n// External\nvec3 getPosition(vec4 xyzw, float canonical);\n\nvec3 getSurfacePosition() {\n  vec4 p = min(geometryClip, position4);\n  vec3 xyz = getPosition(p, 1.0);\n\n  // Overwrite UVs\n#ifdef POSITION_UV\n#ifdef POSITION_UV_INT\n  vUV = -.5 + (position4.xy * geometryResolution.xy) * mapSize.xy;\n#else\n  vUV = position4.xy * geometryResolution.xy;\n#endif\n#endif\n\n  return xyz;\n}\n`;","export default /* glsl */ `uniform vec4 mapSize;\nuniform vec4 geometryResolution;\nuniform vec4 geometryClip;\nattribute vec4 position4;\nattribute vec2 surface;\n\n// External\nvec3 getPosition(vec4 xyzw, float canonical);\n\nvoid getSurfaceGeometry(vec4 xyzw, float edgeX, float edgeY, out vec3 left, out vec3 center, out vec3 right, out vec3 up, out vec3 down) {\n  vec4 deltaX = vec4(1.0, 0.0, 0.0, 0.0);\n  vec4 deltaY = vec4(0.0, 1.0, 0.0, 0.0);\n\n  /*\n  // high quality, 5 tap\n  center =                  getPosition(xyzw, 1.0);\n  left   = (edgeX > -0.5) ? getPosition(xyzw - deltaX, 0.0) : center;\n  right  = (edgeX < 0.5)  ? getPosition(xyzw + deltaX, 0.0) : center;\n  down   = (edgeY > -0.5) ? getPosition(xyzw - deltaY, 0.0) : center;\n  up     = (edgeY < 0.5)  ? getPosition(xyzw + deltaY, 0.0) : center;\n  */\n  \n  // low quality, 3 tap\n  center =                  getPosition(xyzw, 1.0);\n  left   =                  center;\n  down   =                  center;\n  right  = (edgeX < 0.5)  ? getPosition(xyzw + deltaX, 0.0) : (2.0 * center - getPosition(xyzw - deltaX, 0.0));\n  up     = (edgeY < 0.5)  ? getPosition(xyzw + deltaY, 0.0) : (2.0 * center - getPosition(xyzw - deltaY, 0.0));\n}\n\nvec3 getSurfaceNormal(vec3 left, vec3 center, vec3 right, vec3 up, vec3 down) {\n  vec3 dx = right - left;\n  vec3 dy = up    - down;\n  vec3 n = cross(dy, dx);\n  if (length(n) > 0.0) {\n    return normalize(n);\n  }\n  return vec3(0.0, 1.0, 0.0);\n}\n\nvarying vec3 vNormal;\nvarying vec3 vLight;\nvarying vec3 vPosition;\n\nvec3 getSurfacePositionNormal() {\n  vec3 left, center, right, up, down;\n\n  vec4 p = min(geometryClip, position4);\n\n  getSurfaceGeometry(p, surface.x, surface.y, left, center, right, up, down);\n  vNormal   = getSurfaceNormal(left, center, right, up, down);\n  vLight    = normalize((viewMatrix * vec4(1.0, 2.0, 2.0, 0.0)).xyz); // hardcoded directional light\n  vPosition = -center;\n\n#ifdef POSITION_UV\n#ifdef POSITION_UV_INT\n  vUV = -.5 + (position4.xy * geometryResolution.xy) * mapSize.xy;\n#else\n  vUV = position4.xy * geometryResolution.xy;\n#endif\n#endif\n  \n  return center;\n}\n`;","export default /* glsl */ `uniform float worldUnit;\nuniform float focusDepth;\nuniform float tickSize;\nuniform float tickEpsilon;\nuniform vec3  tickNormal;\nuniform vec2  tickStrip;\n\nvec4 getSample(vec4 xyzw);\n\nvec3 transformPosition(vec4 position, in vec4 stpqIn, out vec4 stpqOut);\n\nvec3 getTickPosition(vec4 xyzw, in vec4 stpqIn, out vec4 stpqOut) {\n  float epsilon = tickEpsilon;\n\n  // determine tick direction\n  float leftX  = max(tickStrip.x, xyzw.y - 1.0);\n  float rightX = min(tickStrip.y, xyzw.y + 1.0);\n  \n  vec4 left    = getSample(vec4(leftX,  xyzw.zw, 0.0));\n  vec4 right   = getSample(vec4(rightX, xyzw.zw, 0.0));\n  vec4 diff    = right - left;\n\n  vec3 normal  = cross(normalize(diff.xyz + vec3(diff.w)), tickNormal);\n  float bias   = max(0.0, 1.0 - length(normal) * 2.0);\n       normal  = mix(normal, tickNormal.yzx, bias * bias);\n  \n  // transform (point) and (point + delta)\n  vec4 center  = getSample(vec4(xyzw.yzw, 0.0));\n  vec4 delta   = vec4(normal, 0.0) * epsilon;\n\n  vec4 a = center;\n  vec4 b = center + delta;\n\n  vec4 _;\n  vec3 c = transformPosition(a, stpqIn, stpqOut);\n  vec3 d = transformPosition(b, stpqIn, _);\n  \n  // sample on either side to create line\n  float line = xyzw.x - .5;\n  vec3  mid  = c;\n  vec3  side = normalize(d - c);\n\n  return mid + side * line * tickSize * worldUnit * focusDepth;\n}\n`;","export default /* glsl */ `uniform mat4 transformMatrix;\n\nvec4 transformPosition(vec4 position, inout vec4 stpq) {\n  return transformMatrix * vec4(position.xyz, 1.0);\n}\n`;","export default /* glsl */ `uniform mat4 transformMatrix;\nuniform vec4 transformOffset;\n\nvec4 transformPosition(vec4 position, inout vec4 stpq) {\n  return transformMatrix * position + transformOffset;\n}\n`;","export default /* glsl */ `// Implicit three.js uniform\n// uniform mat4 viewMatrix;\n\nvec4 getViewPosition(vec4 position, inout vec4 stpq) {\n  return (viewMatrix * vec4(position.xyz, 1.0));\n}\n`;","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport * as Ease from \"../util/ease.js\";\n\nexport class Animator {\n  constructor(context) {\n    this.context = context;\n    this.anims = [];\n  }\n\n  make(type, options) {\n    const anim = new Animation(this, this.context.time, type, options);\n    this.anims.push(anim);\n    return anim;\n  }\n\n  unmake(anim) {\n    return (this.anims = Array.from(this.anims).filter((a) => a !== anim));\n  }\n\n  update() {\n    const { time } = this.context;\n    return (this.anims = (() => {\n      const result = [];\n      for (const anim of Array.from(this.anims)) {\n        if (anim.update(time) !== false) {\n          result.push(anim);\n        }\n      }\n      return result;\n    })());\n  }\n\n  lerp(type, from, to, f, value) {\n    if (value == null) {\n      value = type.make();\n    }\n\n    // Use the most appropriate interpolation method for the type\n\n    // Direct lerp operator\n    if (type.lerp) {\n      value = type.lerp(from, to, value, f);\n\n      // Substitute emitter\n    } else if (type.emitter) {\n      const fromE = from.emitterFrom;\n      const toE = to.emitterTo;\n\n      if (fromE != null && toE != null && fromE === toE) {\n        fromE.lerp(f);\n        return fromE;\n      } else {\n        const emitter = type.emitter(from, to);\n        from.emitterFrom = emitter;\n        to.emitterTo = emitter;\n        emitter.lerp(f);\n        return emitter;\n      }\n\n      // Generic binary operator\n    } else if (type.op) {\n      const lerp = function (a, b) {\n        if (a === +a && b === +b) {\n          // Lerp numbers\n          return a + (b - a) * f;\n        } else {\n          // No lerp\n          if (f > 0.5) {\n            return b;\n          } else {\n            return a;\n          }\n        }\n      };\n\n      value = type.op(from, to, value, lerp);\n\n      // No lerp\n    } else {\n      value = f > 0.5 ? to : from;\n    }\n\n    return value;\n  }\n}\n\nclass Animation {\n  constructor(animator, time, type, options) {\n    this.animator = animator;\n    this.time = time;\n    this.type = type;\n    this.options = options;\n    this.value = this.type.make();\n    this.target = this.type.make();\n\n    this.queue = [];\n  }\n\n  dispose() {\n    return this.animator.unmake(this);\n  }\n\n  set() {\n    let { target } = this;\n    let value = arguments.length > 1 ? [].slice.call(arguments) : arguments[0];\n\n    let invalid = false;\n    value = this.type.validate(value, target, () => (invalid = true));\n    if (!invalid) {\n      target = value;\n    }\n\n    this.cancel();\n    this.target = this.value;\n    this.value = target;\n    return this.notify();\n  }\n\n  getTime() {\n    const { clock } = this.options;\n    const time = clock ? clock.getTime() : this.time;\n    if (this.options.realtime) {\n      return time.time;\n    } else {\n      return time.clock;\n    }\n  }\n\n  cancel(from) {\n    let stage;\n    if (from == null) {\n      from = this.getTime();\n    }\n    const { queue } = this;\n\n    const cancelled = (() => {\n      const result = [];\n      for (stage of Array.from(queue)) {\n        if (stage.end >= from) {\n          result.push(stage);\n        }\n      }\n      return result;\n    })();\n    this.queue = (() => {\n      const result1 = [];\n      for (stage of Array.from(queue)) {\n        if (stage.end < from) {\n          result1.push(stage);\n        }\n      }\n      return result1;\n    })();\n\n    for (stage of Array.from(cancelled)) {\n      if (typeof stage.complete === \"function\") {\n        stage.complete(false);\n      }\n    }\n    if (typeof this.options.complete === \"function\") {\n      this.options.complete(false);\n    }\n  }\n\n  notify() {\n    return typeof this.options.step === \"function\"\n      ? this.options.step(this.value)\n      : undefined;\n  }\n\n  immediate(value, options) {\n    const { duration, delay, ease, step, complete } = options;\n\n    const time = this.getTime();\n\n    const start = time + delay;\n    const end = start + duration;\n\n    let invalid = false;\n    let target = this.type.make();\n    value = this.type.validate(value, target, function () {\n      invalid = true;\n      return null;\n    });\n    if (value !== undefined && !invalid) {\n      target = value;\n    }\n\n    this.cancel(start);\n    return this.queue.push({\n      from: null,\n      to: target,\n      start,\n      end,\n      ease,\n      step,\n      complete,\n    });\n  }\n\n  update(time) {\n    this.time = time;\n    if (this.queue.length === 0) {\n      return true;\n    }\n\n    const clock = this.getTime();\n    let { value } = this;\n    const { queue } = this;\n\n    let active = false;\n    while (!active) {\n      const stage = queue[0];\n\n      let { from } = stage;\n      const { to, start, end, step, complete, ease } = stage;\n\n      if (from == null) {\n        from = stage.from = this.type.clone(this.value);\n      }\n\n      let f = Ease.clamp(\n        (clock - start) / Math.max(0.00001, end - start) || 0,\n        0,\n        1\n      );\n      if (f === 0) {\n        return;\n      } // delayed animation not yet active\n\n      const method = (() => {\n        switch (ease) {\n          case \"linear\":\n          case 0:\n            return null;\n          case \"cosine\":\n          case 1:\n            return Ease.cosine;\n          case \"binary\":\n          case 2:\n            return Ease.binary;\n          case \"hold\":\n          case 3:\n            return Ease.hold;\n          default:\n            return Ease.cosine;\n        }\n      })();\n      if (method != null) {\n        f = method(f);\n      }\n\n      active = f < 1;\n      value = active ? this.animator.lerp(this.type, from, to, f, value) : to;\n\n      //console.log 'animation step', f, from, to, value\n      if (typeof step === \"function\") {\n        step(value);\n      }\n\n      if (!active) {\n        if (typeof complete === \"function\") {\n          complete(true);\n        }\n        if (typeof this.options.complete === \"function\") {\n          this.options.complete(true);\n        }\n        queue.shift();\n        if (queue.length === 0) {\n          break;\n        } // end of queue\n      }\n    }\n\n    this.value = value;\n    return this.notify();\n  }\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS104: Avoid inline assignments\n * DS202: Simplify dynamic range loops\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nimport * as Pretty from \"../util/pretty.js\";\nimport * as ShaderGraph from \"shadergraph\";\n\nexport class API {\n  v2() {\n    return this;\n  }\n\n  constructor(_context, _up, _targets) {\n    this._context = _context;\n    this._up = _up;\n    this._targets = _targets;\n    const root = this._context.controller.getRoot();\n\n    if (this._targets == null) {\n      this._targets = [root];\n    }\n    this.isRoot = this._targets.length === 1 && this._targets[0] === root;\n    this.isLeaf =\n      this._targets.length === 1 && this._targets[0].children == null;\n\n    // Look like an array\n    for (let i = 0; i < this._targets.length; i++) {\n      const t = this._targets[i];\n      this[i] = t;\n    }\n    this.length = this._targets.length;\n\n    // Primitive factory. This is where all API methods are assigned.\n    for (const type of Array.from(this._context.controller.getTypes())) {\n      if (![\"root\"].includes(type)) {\n        this[type] = (options, binds) => this.add(type, options, binds);\n      }\n    }\n  }\n\n  select(selector) {\n    const targets = this._context.model.select(\n      selector,\n      !this.isRoot ? this._targets : null\n    );\n    return this._push(targets);\n  }\n\n  eq(index) {\n    if (this._targets.length > index) {\n      return this._push([this._targets[index]]);\n    }\n    return this._push([]);\n  }\n\n  filter(callback) {\n    if (typeof callback === \"string\") {\n      const matcher = this._context.model._matcher(callback);\n      callback = (x) => matcher(x);\n    }\n\n    return this._push(this._targets.filter(callback));\n  }\n\n  map(callback) {\n    return __range__(0, this.length, false).map((i) =>\n      callback(this[i], i, this)\n    );\n  }\n\n  each(callback) {\n    for (\n      let i = 0, end = this.length, asc = 0 <= end;\n      asc ? i < end : i > end;\n      asc ? i++ : i--\n    ) {\n      callback(this[i], i, this);\n    }\n    return this;\n  }\n\n  add(type, options, binds) {\n    // Make node/primitive\n    const { controller } = this._context;\n\n    // Auto-pop if targeting leaf\n    if (this.isLeaf) {\n      return this._pop().add(type, options, binds);\n    }\n\n    // Add to target\n    const nodes = [];\n    for (const target of this._targets) {\n      const node = controller.make(type, options, binds);\n      controller.add(node, target);\n      nodes.push(node);\n    }\n\n    // Return changed selection\n    return this._push(nodes);\n  }\n\n  remove(selector) {\n    if (selector) {\n      return this.select(selector).remove();\n    }\n    for (const target of Array.from(this._targets.slice().reverse())) {\n      this._context.controller.remove(target);\n    }\n    return this._pop();\n  }\n\n  set(key, value) {\n    for (const target of Array.from(this._targets)) {\n      this._context.controller.set(target, key, value);\n    }\n    return this;\n  }\n\n  getAll(key) {\n    return Array.from(this._targets).map((target) =>\n      this._context.controller.get(target, key)\n    );\n  }\n\n  get(key) {\n    return this._targets[0] != null ? this._targets[0].get(key) : undefined;\n  }\n\n  evaluate(key, time) {\n    return this._targets[0] != null\n      ? this._targets[0].evaluate(key, time)\n      : undefined;\n  }\n\n  bind(key, value) {\n    for (const target of Array.from(this._targets)) {\n      this._context.controller.bind(target, key, value);\n    }\n    return this;\n  }\n\n  unbind(key) {\n    for (const target of Array.from(this._targets)) {\n      this._context.controller.unbind(target, key);\n    }\n    return this;\n  }\n\n  end() {\n    return (this.isLeaf ? this._pop() : this)._pop();\n  }\n\n  _push(targets) {\n    return new API(this._context, this, targets);\n  }\n  _pop() {\n    return this._up != null ? this._up : this;\n  }\n  _reset() {\n    let left;\n    return (left = this._up != null ? this._up.reset() : undefined) != null\n      ? left\n      : this;\n  }\n\n  // TODO is this okay??\n  // eslint-disable-next-line no-dupe-class-members\n  map(callback) {\n    return this._targets.map(callback);\n  }\n\n  on() {\n    const args = arguments;\n    this._targets.map((x) => x.on.apply(x, args));\n    return this;\n  }\n\n  off() {\n    const args = arguments;\n    this._targets.map((x) => x.off.apply(x, args));\n    return this;\n  }\n\n  toString() {\n    const tags = this._targets.map((x) => x.toString());\n    if (this._targets.length > 1) {\n      return `[${tags.join(\", \")}]`;\n    } else {\n      return tags[0];\n    }\n  }\n\n  toMarkup() {\n    const tags = this._targets.map((x) => x.toMarkup());\n    return tags.join(\"\\n\\n\");\n  }\n\n  print() {\n    Pretty.print(this._targets.map((x) => x.toMarkup()).join(\"\\n\\n\"));\n    return this;\n  }\n\n  debug() {\n    const info = this.inspect();\n    console.log(\"Renderables: \", info.renderables);\n    console.log(\"Renders: \", info.renders);\n    console.log(\"Shaders: \", info.shaders);\n\n    const getName = (owner) =>\n      owner.constructor.toString().match(\"function +([^(]*)\")[1];\n\n    const shaders = [];\n    for (const shader of Array.from(info.shaders)) {\n      const name = getName(shader.owner);\n      shaders.push(`${name} - Vertex`);\n      shaders.push(shader.vertex);\n      shaders.push(`${name} - Fragment`);\n      shaders.push(shader.fragment);\n    }\n    return ShaderGraph.inspect(shaders);\n  }\n\n  inspect(selector, trait, print) {\n    let self;\n    if (typeof trait === \"boolean\") {\n      print = trait;\n      trait = null;\n    }\n    if (print == null) {\n      print = true;\n    }\n\n    // Recurse tree and extract all inserted renderables\n    const map = (node) =>\n      (node.controller != null ? node.controller.objects : undefined) != null\n        ? node.controller != null\n          ? node.controller.objects\n          : undefined\n        : [];\n    const recurse = (self = function (node, list) {\n      if (list == null) {\n        list = [];\n      }\n      if (!trait || node.traits.hash[trait]) {\n        list.push(map(node));\n      }\n      if (node.children != null) {\n        for (const child of Array.from(node.children)) {\n          self(child, list);\n        }\n      }\n      return list;\n    });\n\n    // Flatten arrays\n    const flatten = function (list) {\n      list = list.reduce((a, b) => a.concat(b), []);\n      return (list = list.filter((x, i) => x != null && list.indexOf(x) === i));\n    };\n\n    // Render descriptor\n    const make = function (renderable, render) {\n      const d = {};\n      d.owner = renderable;\n      d.geometry = render.geometry;\n      d.material = render.material;\n      d.vertex = render.userData.vertexGraph;\n      d.fragment = render.userData.fragmentGraph;\n      return d;\n    };\n\n    const info = {\n      nodes: this._targets.slice(),\n      renderables: [],\n      renders: [],\n      shaders: [],\n    };\n\n    // Inspect all targets\n    for (const target of Array.from(this._targets)) {\n      let renderables;\n      if (print) {\n        target.print(selector, \"info\");\n      }\n\n      const _info = {\n        renderables: (renderables = flatten(recurse(target))),\n        renders: flatten(renderables.map((x) => x.renders)),\n        shaders: flatten(\n          renderables.map((x) =>\n            x.renders != null ? x.renders.map((r) => make(x, r)) : undefined\n          )\n        ),\n      };\n\n      for (const k in _info) {\n        info[k] = info[k].concat(_info[k]);\n      }\n    }\n\n    return info;\n  }\n}\n\nfunction __range__(left, right, inclusive) {\n  const range = [];\n  const ascending = left < right;\n  const end = !inclusive ? right : ascending ? right + 1 : right - 1;\n  for (let i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {\n    range.push(i);\n  }\n  return range;\n}\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nexport class Controller {\n  constructor(model, primitives) {\n    this.model = model;\n    this.primitives = primitives;\n  }\n\n  getRoot() {\n    return this.model.getRoot();\n  }\n\n  getTypes() {\n    return this.primitives.getTypes();\n  }\n\n  make(type, options, binds) {\n    return this.primitives.make(type, options, binds);\n  }\n\n  get(node, key) {\n    return node.get(key);\n  }\n\n  set(node, key, value) {\n    try {\n      return node.set(key, value);\n    } catch (e) {\n      node.print(null, \"warn\");\n      return console.error(e);\n    }\n  }\n\n  bind(node, key, expr) {\n    try {\n      return node.bind(key, expr);\n    } catch (e) {\n      node.print(null, \"warn\");\n      return console.error(e);\n    }\n  }\n\n  unbind(node, key) {\n    try {\n      return node.unbind(key);\n    } catch (e) {\n      node.print(null, \"warn\");\n      return console.error(e);\n    }\n  }\n\n  add(node, target) {\n    if (target == null) {\n      target = this.model.getRoot();\n    }\n    return target.add(node);\n  }\n\n  remove(node) {\n    const target = node.parent;\n    if (target) {\n      return target.remove(node);\n    }\n  }\n}\n","import * as axis from \"./axis.js\";\nimport * as data from \"./data.js\";\nimport * as ease from \"./ease.js\";\nimport * as glsl from \"./glsl.js\";\nimport * as js from \"./js.js\";\nimport * as pretty from \"./pretty.js\";\nimport * as three from \"./three.js\";\nimport * as ticks from \"./ticks.js\";\nimport * as vdom from \"./vdom.js\";\n\nexport const Axis = axis;\nexport const Data = data;\nexport const Ease = ease;\nexport const GLSL = glsl;\nexport const JS = js;\nexport const Pretty = pretty;\nexport const Three = three;\nexport const Ticks = ticks;\nexport const VDOM = vdom;\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport * as Model from \"./model\";\nimport * as Overlay from \"./overlay\";\nimport * as Primitives from \"./primitives\";\nimport * as Render from \"./render\";\nimport * as Shaders from \"./shaders\";\nimport * as Stage from \"./stage\";\nimport * as Util from \"./util\";\n\nimport { PerspectiveCamera } from \"three/src/cameras/PerspectiveCamera.js\";\n\nexport class Context {\n  static initClass() {\n    // Export for extending. TODO what is the story here, what is this syntax?\n    this.Namespace = {\n      Model,\n      Overlay,\n      Primitives,\n      Render,\n      Shaders,\n      Stage,\n      Util,\n      DOM: Util.VDOM,\n    };\n  }\n\n  //-------------------------------------------------------------------\n\n  // Set up entire environment\n  constructor(renderer, scene = null, camera = null) {\n    // DOM container\n    let canvas;\n    this.canvas = canvas = renderer.domElement;\n    this.element = null;\n\n    // Rendering factory\n    this.shaders = Shaders.Factory(Shaders.Snippets);\n\n    this.renderables = new Render.Factory(\n      Render.Classes,\n      renderer,\n      this.shaders\n    );\n    this.overlays = new Overlay.Factory(Overlay.Classes, canvas);\n\n    this.scene = this.renderables.make(\"scene\", { scene });\n    this.camera = this.defaultCamera =\n      camera != null ? camera : new PerspectiveCamera();\n\n    // Primitives factory\n    this.attributes = new Model.Attributes(Primitives.Types, this);\n    this.primitives = new Primitives.Factory(Primitives.Types, this);\n\n    this.root = this.primitives.make(\"root\");\n\n    // Document model\n    this.model = new Model.Model(this.root);\n    this.guard = new Model.Guard();\n\n    // Scene controllers\n    this.controller = new Stage.Controller(this.model, this.primitives);\n    this.animator = new Stage.Animator(this);\n\n    // Public API\n    this.api = new Stage.API(this);\n\n    // Global clocks, one real-time and one adjustable\n    this.speed = 1;\n    this.time = {\n      now: +new Date() / 1000,\n      time: 0,\n      delta: 0,\n      clock: 0,\n      step: 0,\n    };\n  }\n\n  //-------------------------------------------------------------------\n  // Lifecycle\n\n  init() {\n    this.scene.inject();\n    this.overlays.inject();\n    return this;\n  }\n\n  destroy() {\n    this.scene.unject();\n    this.overlays.unject();\n    return this;\n  }\n\n  resize(size) {\n    /*\n    {\n      viewWidth, viewHeight, renderWidth, renderHeight, aspect, pixelRatio\n    }\n    */\n    if (size == null) {\n      size = {};\n    }\n    if (size.renderWidth == null) {\n      size.renderWidth =\n        size.viewWidth != null ? size.viewWidth : (size.viewWidth = 1280);\n    }\n    if (size.renderHeight == null) {\n      size.renderHeight =\n        size.viewHeight != null ? size.viewHeight : (size.viewHeight = 720);\n    }\n    if (size.pixelRatio == null) {\n      size.pixelRatio = size.renderWidth / Math.max(0.000001, size.viewWidth);\n    }\n    if (size.aspect == null) {\n      size.aspect = size.viewWidth / Math.max(0.000001, size.viewHeight);\n    }\n\n    this.root.controller.resize(size);\n    return this;\n  }\n\n  frame(time) {\n    /*\n    {\n      now, clock, step\n    }\n    */\n    this.pre(time);\n    this.update();\n    this.render();\n    this.post();\n    return this;\n  }\n\n  //-------------------------------------------------------------------\n  // Broken down update/render cycle, for manual scheduling/invocation\n\n  pre(time) {\n    if (!time) {\n      time = {\n        now: +new Date() / 1000,\n        time: 0,\n        delta: 0,\n        clock: 0,\n        step: 0,\n      };\n\n      time.delta = this.time.now != null ? time.now - this.time.now : 0;\n\n      // Check for stopped render loop, assume 1 60fps frame\n      if (time.delta > 1) {\n        time.delta = 1 / 60;\n      }\n\n      time.step = time.delta * this.speed;\n      time.time = this.time.time + time.delta;\n      time.clock = this.time.clock + time.step;\n    }\n\n    this.time = time;\n    if (typeof this.root.controller.pre === \"function\") {\n      this.root.controller.pre();\n    }\n    return this;\n  }\n\n  update() {\n    this.animator.update();\n    this.attributes.compute();\n\n    this.guard.iterate({\n      step: () => {\n        let change = this.attributes.digest();\n        return change || (change = this.model.digest());\n      },\n      last() {\n        return {\n          attribute: this.attributes.getLastTrigger(),\n          model: this.model.getLastTrigger(),\n        };\n      },\n    });\n\n    if (typeof this.root.controller.update === \"function\") {\n      this.root.controller.update();\n    }\n\n    this.camera = this.root.controller.getCamera();\n    this.speed = this.root.controller.getSpeed();\n\n    return this;\n  }\n\n  render() {\n    if (typeof this.root.controller.render === \"function\") {\n      this.root.controller.render();\n    }\n    this.scene.render();\n\n    return this;\n  }\n\n  post() {\n    if (typeof this.root.controller.post === \"function\") {\n      this.root.controller.post();\n    }\n    return this;\n  }\n\n  //-------------------------------------------------------------------\n  // Warmup mode, inserts only n objects into the scene per frame\n  // Will render objects to offscreen 1x1 buffer to ensure shader is compiled even if invisible\n  setWarmup(n) {\n    this.scene.warmup(n);\n    return this;\n  }\n\n  getPending() {\n    return this.scene.pending.length;\n  }\n}\nContext.initClass();\n","// TODO: This file was created by bulk-decaffeinate.\n// Sanity-check the conversion and remove this comment.\n/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport \"./splash.js\";\n\n// NOTE this import triggers the installation of all plugins as a side effect.\nimport \"threestrap\";\n\nimport * as model from \"./model\";\nimport * as overlay from \"./overlay\";\nimport * as primitives from \"./primitives\";\nimport * as render from \"./render\";\nimport * as shaders from \"./shaders\";\nimport * as stage from \"./stage\";\nimport * as util from \"./util\";\n\nimport { Bootstrap } from \"threestrap/src/bootstrap.js\";\nimport { Context as ctx } from \"./context.js\";\n\nexport const version = \"2.1.1\";\n\n// Just because\nexport const π = Math.PI;\nexport const τ = π * 2;\nexport const e = Math.E;\nexport const Context = ctx;\nexport const Model = model;\nexport const Overlay = overlay;\nexport const Primitives = primitives;\nexport const Render = render;\nexport const Shaders = shaders;\nexport const Stage = stage;\nexport const Util = util;\nexport const DOM = util.VDOM;\n\nexport const mathBox = function (options) {\n  const three = new Bootstrap(options);\n\n  if (!three.fallback) {\n    if (!three.Time) {\n      three.install(\"time\");\n    }\n    if (!three.MathBox) {\n      three.install([\"mathbox\", \"splash\"]);\n    }\n  }\n\n  return three.mathbox != null ? three.mathbox : three;\n};\n\n// Load context and export namespace\n// TODO suspicious... how can I export??\n// for (let k in Context.Namespace) {\n//   const v = Context.Namespace[k];\n//   exports[k] = v;\n// }\n\n// Threestrap plugin\nBootstrap.registerPlugin(\"mathbox\", {\n  defaults: {\n    init: true,\n    warmup: 2,\n    inspect: true,\n    splash: true,\n  },\n\n  listen: [\"ready\", \"pre\", \"update\", \"post\", \"resize\"],\n\n  // Install meta-API\n  install(three) {\n    let inited = false;\n    this.first = true;\n\n    return (three.MathBox = {\n      // Init the mathbox context\n      init: (options) => {\n        if (inited) {\n          return;\n        }\n        inited = true;\n\n        const scene =\n          (options != null ? options.scene : undefined) ||\n          this.options.scene ||\n          three.scene;\n        const camera =\n          (options != null ? options.camera : undefined) ||\n          this.options.camera ||\n          three.camera;\n\n        this.context = new Context(three.renderer, scene, camera);\n\n        // Enable handy destructuring\n        this.context.api.three = three.three = three;\n        this.context.api.mathbox = three.mathbox = this.context.api;\n\n        // v1 compatibility\n        this.context.api.start = () => three.Loop.start();\n        this.context.api.stop = () => three.Loop.stop();\n\n        // Initialize and set initial size\n        this.context.init();\n        this.context.resize(three.Size);\n\n        // Set warmup mode and track pending objects\n        this.context.setWarmup(this.options.warmup);\n        this.pending = 0;\n        this.warm = !this.options.warmup;\n\n        console.log(\"MathBox²\", version);\n        three.trigger({\n          type: \"mathbox/init\",\n          version: version,\n          context: this.context,\n        });\n      },\n\n      // Destroy the mathbox context\n      destroy: () => {\n        if (!inited) {\n          return;\n        }\n        inited = false;\n\n        three.trigger({ type: \"mathbox/destroy\", context: this.context });\n\n        this.context.destroy();\n\n        delete three.mathbox;\n        delete this.context.api.three;\n        delete this.context;\n      },\n\n      object: () =>\n        this.context != null ? this.context.scene.root : undefined,\n    });\n  },\n\n  uninstall(three) {\n    three.MathBox.destroy();\n    delete three.MathBox;\n  },\n\n  // Ready event: right before mathbox() / THREE.bootstrap() returns\n  ready(event, three) {\n    if (this.options.init) {\n      three.MathBox.init();\n\n      return setTimeout(() => {\n        if (this.options.inspect) {\n          return this.inspect(three);\n        }\n      });\n    }\n  },\n\n  // Log scene for inspection\n  inspect(three) {\n    this.context.api.inspect();\n    if (!this.options.warmup) {\n      return this.info(three);\n    }\n  },\n\n  info(three) {\n    const fmt = function (x) {\n      const out = [];\n      while (x >= 1000) {\n        out.unshift((\"000\" + (x % 1000)).slice(-3));\n        x = Math.floor(x / 1000);\n      }\n      out.unshift(x);\n      return out.join(\",\");\n    };\n\n    const info = three.renderer.info.render;\n    console.log(\n      \"Geometry  \",\n      fmt(info.triangles) + \" triangles  \",\n      fmt(info.points) + \" points  \",\n      fmt(info.lines) + \" lines  \",\n      fmt(info.calls) + \" draw calls  \"\n    );\n  },\n\n  // Hook up context events\n  resize(event, three) {\n    return this.context != null ? this.context.resize(three.Size) : undefined;\n  },\n\n  pre(event, three) {\n    return this.context != null ? this.context.pre(three.Time) : undefined;\n  },\n\n  update(event, three) {\n    let camera;\n    if (this.context != null) {\n      this.context.update();\n    }\n\n    if (\n      (camera = this.context != null ? this.context.camera : undefined) &&\n      camera !== three.camera\n    ) {\n      three.camera = camera;\n    }\n\n    three.Time.set({ speed: this.context.speed });\n\n    this.progress(this.context.getPending(), three);\n\n    // Call render here instead of on:render because it renders off screen material\n    // that needs to be available for rendering the actual frame.\n    return this.context != null ? this.context.render() : undefined;\n  },\n\n  post(_event, _three) {\n    return this.context != null ? this.context.post() : undefined;\n  },\n\n  // Warmup progress changed\n  progress(remain, three) {\n    if (!remain && !this.pending) {\n      return;\n    }\n\n    // Latch max value until queue is emptied to get a total\n    let pending = Math.max(remain + this.options.warmup, this.pending);\n\n    // Send events for external progress reporting\n    const current = pending - remain;\n    const total = pending;\n    three.trigger({\n      type: \"mathbox/progress\",\n      current: pending - remain,\n      total: pending,\n    });\n\n    if (remain === 0) {\n      pending = 0;\n    }\n    this.pending = pending;\n\n    // Report once when loaded\n    if (current === total && !this.warm) {\n      this.warm = true;\n      if (this.options.inspect) {\n        this.info(three);\n      }\n    }\n  },\n});\n"],"names":["root","factory","exports","module","require","define","amd","self","__WEBPACK_EXTERNAL_MODULE__824__","parse","tokens","parser","i","length","state","token","idx","original_symbol","nud","this","children","fail","led","symbol_table","itself","symbol","id","binding_power","sym","lbp","Object","create","expression","rbp","left","t","advance","infix","bp","type","infixr","prefix","suffix","assignment","next","value","output","data","unexpected","scope","find","create_node","message","fake","push","incoming_state","incoming_tokens","result","parent","emit","node","unshift","len","shift","Error","stmtlist","n","STMTLIST","stmt","STMT","decllist","DECLLIST","precision","PRECISION","ident","IDENT","fn","KEYWORD_OR_IDENT","FUNCTION","fnargs","FUNCTIONARGS","forstmt","FORLOOP","ifstmt","IF","whilestmt","WHILELOOP","returnstmt","RETURN","dowhilestmt","DOWHILELOOP","quantifier","QUANTIFIER","parse_struct","parse_precision","parse_quantifier","parse_forloop","parse_if","parse_return","parse_whileloop","parse_dowhileloop","parse_function","parse_function_args","program","check","arguments","slice","call","complete","ended","nodes","whitespace","errored","special_shift","special_unshift","special_fake","Scope","mknode","reader","setup_stative_parsers","expecting","mode","end","write","input","preceding","concat","take","parse_stmt","parse_stmtlist","DECL","parse_decl","parse_decllist","EXPR","parse_expr","STRUCT","parse_ident","KEYWORD","parse_keyword","parse_keyword_or_ident","x","_node","add_child","ret","undefined","okay","test","stative","enter","Advance","exit","adhoc","brace","got_eof","BREAK","CONTINUE","DISCARD","decl","DECL_STATEMENT","lookup","expr","flags","keyword","PLACEHOLDER","position","is_storage","is_parameter","is_precision","struct","stage","collected_name","name","parenlevel","bracelevel","indexOf","full_parse_expr","err","parseexpr","token_map","_","allow_assign","allow_comma","default_value","str","line","assert","assert_null_string_or_array","y","join","step","steps","current","op","last","last_node","succeeding","advance_expr","until","advance_ident","declare","advance_stmtlist","maybe_stmtlist","skip","popstmt","COMMENT","PREPROCESSOR","preprocessor","stmt_type","sourcetoken","Math","random","toString","constructor","scopes","proto","prototype","s","pop","hasOwnProperty","trueFunc","falseFunc","defineProperty","attributeRules","boolbase_1","reChars","escapeRegex","replace","equals","_a","adapter","ignoreCase","toLowerCase","elem","attr","getAttributeValue","hyphen","charAt","substr","element","_b","regex","RegExp","exists","hasAttrib","start","startsWith","endsWith","any","regex_1","includes","not","__importDefault","mod","__esModule","compileToken","compileUnsafe","compile","css_what_1","sort_1","procedure_1","general_1","subselects_1","selector","options","context","includesScopePseudo","Array","isArray","some","ensureIsTag","DESCENDANT_TOKEN","FLEXIBLE_DESCENDANT_TOKEN","SCOPE_TOKEN","filter","forEach","default","isArrayContext","finalContext","hasContext","every","e","isTag","getParent","PLACEHOLDER_ELEMENT","_i","token_1","isTraversal","absolutize","shouldTestNextSiblings","query","map","rules","first","second","reduce","previous","rule","compileGeneralSelector","rootFunc","compileRules","reduceRules","a","b","attributes_1","pseudo_selectors_1","action","compilePseudoSelector","getName","cacheResults","WeakSet","isFalseCache_1","has","add","getChildren","siblings","getSiblings","currentSibling","lastElement","__createBinding","o","m","k","k2","enumerable","get","__setModuleDefault","v","__importStar","aliases","pseudos","filters","is","selectOne","selectAll","prepareContext","_compileToken","_compileUnsafe","DomUtils","compile_1","defaultEquals","defaultOptions","convertOptionFormats","_c","_d","opts","wrapCompile","func","getSelectorFunc","searchFunc","elements","filteredElements","elems","elemsLength","nextSiblings","getNextSiblings","apply","appendNextSiblings","removeSubsets","findAll","findOne","procedure","universal","tag","attribute","pseudo","descendant","child","sibling","adjacent","_flexibleDescendant","link","disabled","enabled","checked","required","optional","selected","checkbox","file","password","radio","reset","image","submit","header","button","text","nth_check_1","getChildFunc","dynamicStatePseudo","_rule","contains","getText","icontains","itext","pos","hover","visited","active","filters_1","pseudos_1","aliases_1","subselects","alias","pseudo_1","verifyPseudoArgs","empty","firstChild","elemName","subselect","__spreadArray","to","from","pack","ar","l","elemIndex","xmlMode","matches","where","_context","compiled","hasElement","childs","nextElements","existsOne","attributes","getProcedure","proc","cur","arr","procs","procNew","j","__exportStar","p","stringify","parse_1","stringify_1","reName","reEscape","actionTypes","Map","Traversals","attribSelectors","unpackPseudos","Set","traversalNames","keys","caseInsensitiveAttributes","stripQuotesFromPseudos","quotes","funescape","escaped","escapedWhitespace","high","parseInt","String","fromCharCode","unescapeCSS","isWhitespace","c","parseSelector","selectorIndex","sawWS","offset","match","stripWhitespace","isEscaped","slashCount","ensureNotTraversal","firstChar","endIndex","name_1","namespace","name_2","lowerCaseAttributeNames","possibleAction","quote","sectionEnd","valueStart","forceIgnore","attributeSelector","name_3","counter","quot","name_4","addToken","lowerCaseTags","charsToEscape","typeKey","Boolean","stringifySubselector","stringifyToken","getNamespace","getNamespacedName","escapeName","split","attributeNames","elementNames","__assign","assign","ElementType","entities_1","foreignNames_1","unencodedElements","singleTag","render","renderNode","Root","Directive","Doctype","Comment","renderComment","CDATA","renderCdata","Script","Style","Tag","foreignModeIntegrationPoints","foreignElements","attribs","key","emptyAttrs","decodeEntities","encodeXML","formatAttributes","selfClosingTags","renderTag","Text","renderText","DomHandler","domelementtype_1","node_1","reWhitespace","defaultOpts","normalizeWhitespace","withStartIndices","withEndIndices","callback","elementCB","dom","Document","done","tagStack","lastNode","onparserinit","onreset","onend","handleCallback","onerror","error","onclosetag","onopentag","Element","addNode","ontext","oncomment","oncommentend","oncdatastart","NodeWithChildren","oncdataend","onprocessinginstruction","ProcessingInstruction","previousSibling","startIndex","prev","extendStatics","__extends","d","setPrototypeOf","__proto__","TypeError","__","cloneNode","hasChildren","isDocument","isDirective","isComment","isText","isCDATA","DataNode","Node","nodeTypes","configurable","set","recursive","_super","_this","cloneChildren","clone_1","clone_2","clone_3","instruction","sourceCodeLocation","getFeed","legacy_1","doc","feedRoot","getOneElement","isValidFeed","feed","items","getElementsByTagName","item","entry","media","getMediaElements","addConditionally","href","description","fetch","pubDate","Date","updated","getAtomFeed","getRssFeed","MEDIA_KEYS_STRING","MEDIA_KEYS_INT","medium","isDefault","MEDIA_KEYS_STRING_1","attrib","MEDIA_KEYS_INT_1","tagName","recurse","textContent","trim","obj","prop","val","uniqueSort","compareDocumentPosition","domhandler_1","nodeA","nodeB","aParents","bParents","maxIdx","min","sharedParent","aSibling","bSibling","lastIndexOf","splice","ancestor","sort","relative","getElementsByTagType","getElementById","getElements","testElement","querying_1","Checks","tag_name","tag_type","tag_contains","getAttribCheck","combineFuncs","compileTest","funcs","limit","Infinity","removeElement","prepend","prependChild","append","appendChild","replaceElement","replacement","currNext","findOneChild","nodes_1","stack","innerText","getInnerHTML","getOuterHTML","dom_serializer_1","prevElementSibling","nextElementSibling","emptyArray","decodeHTML","decodeHTMLStrict","decodeXML","entities_json_1","legacy_json_1","xml_json_1","decode_codepoint_1","strictEntityRe","getStrictDecoder","getReplacer","sorter","secondChar","legacy","re","replacer","decode_json_1","fromCodePoint","codePoint","escapeUTF8","escape","encodeNonAsciiHTML","encodeHTML","inverseXML","getInverseObj","xmlReplacer","getInverseReplacer","getASCIIEncoder","inverse","inverseHTML","htmlReplacer","single","multiple","charCodeAt","count","reNonASCII","singleCharReplacer","getCodePoint","codePointAt","toUpperCase","reEscapeChars","source","decodeXMLStrict","decodeHTML5Strict","decodeHTML4Strict","decodeHTML5","decodeHTML4","encodeHTML5","encodeHTML4","encode","decodeStrict","decode","decode_1","encode_1","level","encode_2","decode_2","opt","total","NORMAL","content","col","isnum","isoperator","allBuiltins","builtins100","allLiterals","literals100","version","builtins300es","literals300es","builtinsDict","literalsDict","chunk","block_comment","line_comment","operator","integer","hex","decimal","TOKEN","readtoken","normal","column","determine_operator","is_composite_operator","buf","res","operators","contentstr","v100","tokenize","generator","parsed","index","absA","abs","bMod","formula","ZERO","NINE","sign","readSign","number","readNumber","skipWhitespace","make","nest","compare","asc","q","max","f","u","style","display","document","createElement","cssText","addEventListener","preventDefault","performance","now","g","r","Panel","h","memory","REVISION","addPanel","showPanel","begin","update","usedJSHeapSize","jsHeapSizeLimit","domElement","setMode","round","window","devicePixelRatio","width","height","getContext","font","textBaseline","fillStyle","fillRect","fillText","globalAlpha","w","drawImage","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","getter","definition","Symbol","toStringTag","EventDispatcher","listener","_listeners","listeners","hasEventListener","removeEventListener","listenerArray","dispatchEvent","event","target","array","Binder","static","globals","object","__binds","fallback","exec","path","dest","on","_polyfill","method","bind","__name","trigger","_trigger","triggerOnce","_triggerOnce","off","methods","_method","isString","valueOf","Bootstrap","Plugins","Aliases","spec","ctor","Plugin","plugins","args","init","body","plugindb","aliasdb","__options","__inited","__destroyed","__installed","querySelector","frame","events","install","destroy","uninstall","resolve","pred","entries","list","out","__install","__ready","reverse","__uninstall","console","warn","plugin","flag","initClass","defaults","listen","_three","changes","api","registerPlugin","color","fancy","ready","three","MathBox","div","html","innerHTML","z","sqrt","loader","bar","gyro","querySelectorAll","transforms","Time","timer","progress","visible","clearTimeout","classList","remove","setTimeout","weights","increment","transform","el","WebkitTransform","registerAlias","unbind","_lut","DEG2RAD","PI","RAD2DEG","generateUUID","d0","d1","d2","d3","clamp","euclideanModulo","lerp","floorPowerOfTwo","pow","floor","log","LN2","Quaternion","_x","_y","_z","_w","qa","qb","qm","slerpQuaternions","dst","dstOffset","src0","srcOffset0","src1","srcOffset1","x0","y0","z0","w0","x1","y1","z1","w1","cos","dir","sqrSin","Number","EPSILON","sin","atan2","tDir","_onChangeCallback","clone","copy","quaternion","setFromEuler","euler","isEuler","order","_order","c1","c2","c3","s1","s2","s3","setFromAxisAngle","axis","angle","halfAngle","setFromRotationMatrix","te","m11","m12","m13","m21","m22","m23","m31","m32","m33","trace","setFromUnitVectors","vFrom","vTo","dot","normalize","angleTo","acos","rotateTowards","slerp","identity","invert","conjugate","lengthSq","multiply","multiplyQuaternions","premultiply","qax","qay","qaz","qaw","qbx","qby","qbz","qbw","cosHalfTheta","sqrSinHalfTheta","sinHalfTheta","halfTheta","ratioA","ratioB","u1","sqrt1u1","sqrtu1","u2","u3","fromArray","toArray","fromBufferAttribute","getX","getY","getZ","getW","_onChange","isQuaternion","Vector3","setScalar","scalar","setX","setY","setZ","setComponent","getComponent","addVectors","addScalar","addScaledVector","sub","subVectors","subScalar","multiplyVectors","multiplyScalar","applyEuler","applyQuaternion","_quaternion","applyAxisAngle","applyMatrix3","applyNormalMatrix","applyMatrix4","qx","qy","qz","qw","ix","iy","iz","iw","project","camera","matrixWorldInverse","projectionMatrix","unproject","projectionMatrixInverse","matrixWorld","transformDirection","divide","divideScalar","clampScalar","minVal","maxVal","clampLength","ceil","roundToZero","negate","manhattanLength","setLength","alpha","lerpVectors","v1","v2","cross","crossVectors","ax","ay","az","bx","by","bz","projectOnVector","denominator","projectOnPlane","planeNormal","_vector","reflect","theta","distanceTo","distanceToSquared","dx","dy","dz","manhattanDistanceTo","setFromSpherical","setFromSphericalCoords","radius","phi","sinPhiRadius","setFromCylindrical","setFromCylindricalCoords","setFromMatrixPosition","setFromMatrixScale","sx","setFromMatrixColumn","sy","sz","setFromMatrix3Column","randomDirection","iterator","isVector3","n11","n12","n13","n14","n21","n22","n23","n24","n31","n32","n33","n34","n41","n42","n43","n44","me","copyPosition","setFromMatrix3","extractBasis","xAxis","yAxis","zAxis","makeBasis","extractRotation","scaleX","_v1","scaleY","scaleZ","makeRotationFromEuler","ae","af","be","bf","ce","cf","de","df","ac","ad","bc","bd","makeRotationFromQuaternion","compose","_zero","_one","lookAt","eye","up","multiplyMatrices","a11","a12","a13","a14","a21","a22","a23","a24","a31","a32","a33","a34","a41","a42","a43","a44","b11","b12","b13","b14","b21","b22","b23","b24","b31","b32","b33","b34","b41","b42","b43","b44","determinant","transpose","tmp","setPosition","t11","t12","t13","t14","det","detInv","scale","getMaxScaleOnAxis","scaleXSq","scaleYSq","scaleZSq","makeTranslation","makeRotationX","makeRotationY","makeRotationZ","makeRotationAxis","tx","ty","makeScale","makeShear","xy","xz","yx","yz","zx","zy","x2","y2","z2","xx","yy","zz","wx","wy","wz","decompose","_m1","invSX","invSY","invSZ","makePerspective","right","top","bottom","near","far","makeOrthographic","matrix","isMatrix4","_matrix","Euler","DefaultOrder","asin","setFromQuaternion","setFromVector3","reorder","newOrder","toVector3","optionalResult","RotationOrders","Layers","mask","channel","enable","enableAll","toggle","disable","disableAll","layers","isEnabled","Matrix3","setFromMatrix4","getNormalMatrix","matrix4","transposeIntoArray","setUvTransform","rotation","cx","cy","rotate","translate","isMatrix3","_object3DId","_q1","_target","_position","_scale","_xAxis","_yAxis","_zAxis","_addedEvent","_removedEvent","Object3D","super","uuid","DefaultUp","defineProperties","modelViewMatrix","normalMatrix","matrixAutoUpdate","DefaultMatrixAutoUpdate","matrixWorldNeedsUpdate","castShadow","receiveShadow","frustumCulled","renderOrder","animations","userData","onBeforeRender","onAfterRender","updateMatrix","setRotationFromAxisAngle","setRotationFromEuler","setRotationFromMatrix","setRotationFromQuaternion","rotateOnAxis","rotateOnWorldAxis","rotateX","rotateY","rotateZ","translateOnAxis","distance","translateX","translateY","translateZ","localToWorld","vector","worldToLocal","updateWorldMatrix","isCamera","isLight","isObject3D","removeFromParent","clear","attach","getObjectById","getObjectByProperty","getObjectByName","getWorldPosition","getWorldQuaternion","getWorldScale","getWorldDirection","raycast","traverse","traverseVisible","traverseAncestors","updateMatrixWorld","force","updateParents","updateChildren","toJSON","meta","isRootObject","geometries","materials","textures","images","shapes","skeletons","metadata","serialize","library","JSON","isInstancedMesh","instanceMatrix","instanceColor","isScene","background","isColor","isTexture","environment","isMesh","isLine","isPoints","geometry","parameters","shape","isSkinnedMesh","bindMode","bindMatrix","skeleton","material","uuids","animation","extractFromCache","cache","values","Camera","OrthographicCamera","zoom","view","updateProjectionMatrix","setViewOffset","fullWidth","fullHeight","offsetX","offsetY","clearViewOffset","scaleW","scaleH","isOrthographicCamera","fov","aspect","klass","change","old","perspective","PerspectiveCamera","orthographic","resize","viewWidth","viewHeight","fill","cnv","gl","childNodes","parentNode","removeChild","block","layout","applied","documentElement","margin","padding","canvas","getComputedStyle","each","running","lastRequestId","Loop","stop","loop","requestAnimationFrame","cancelAnimationFrame","scene","renderer","AddEquation","CubeReflectionMapping","CubeRefractionMapping","CubeUVReflectionMapping","RepeatWrapping","ClampToEdgeWrapping","MirroredRepeatWrapping","NearestFilter","LinearFilter","LinearMipmapLinearFilter","UnsignedByteType","UnsignedShortType","UnsignedIntType","FloatType","HalfFloatType","UnsignedInt248Type","RGBAFormat","DepthFormat","DepthStencilFormat","RGB_S3TC_DXT1_Format","RGBA_S3TC_DXT1_Format","RGBA_S3TC_DXT3_Format","RGBA_S3TC_DXT5_Format","LinearEncoding","sRGBEncoding","KeepStencilOp","GLSL3","_SRGBAFormat","Box3","setFromArray","minX","minY","minZ","maxX","maxY","maxZ","setFromBufferAttribute","setFromPoints","points","makeEmpty","il","expandByPoint","setFromCenterAndSize","center","size","halfSize","setFromObject","precise","expandByObject","box","isEmpty","getCenter","getSize","point","expandByVector","expandByScalar","boundingBox","computeBoundingBox","_box","union","containsPoint","containsBox","getParameter","intersectsBox","intersectsSphere","sphere","clampPoint","intersectsPlane","plane","constant","intersectsTriangle","triangle","_center","_extents","_v0","_v2","_f0","_f1","_f2","axes","satForAxes","_triangleNormal","distanceToPoint","getBoundingSphere","intersect","_points","isBox3","_testAxis","v0","extents","p0","p1","p2","_toFarthestPoint","_toPoint","Sphere","optionalCenter","maxRadiusSq","radiusSum","deltaLengthSq","getBoundingBox","missingRadiusHalf","_vector1","_vector2","_normalMatrix","Plane","setComponents","setFromNormalAndCoplanarPoint","setFromCoplanarPoints","inverseNormalLength","distanceToSphere","projectPoint","intersectLine","direction","delta","intersectsLine","startSign","endSign","coplanarPoint","optionalNormalMatrix","referencePoint","isPlane","_sphere","Frustum","p3","p4","p5","planes","frustum","setFromProjectionMatrix","me0","me1","me2","me3","me4","me5","me6","me7","me8","me9","me10","me11","me12","me13","me14","me15","intersectsObject","boundingSphere","computeBoundingSphere","intersectsSprite","sprite","negRadius","Vector4","setW","setAxisAngleFromQuaternion","setAxisAngleFromRotationMatrix","epsilon","epsilon2","WebGLAnimation","isAnimating","animationLoop","requestId","onAnimationFrame","time","setAnimationLoop","setContext","WebGLAttributes","capabilities","isWebGL2","buffers","WeakMap","isInterleavedBufferAttribute","deleteBuffer","buffer","delete","bufferType","isGLBufferAttribute","cached","bytesPerElement","elementSize","usage","createBuffer","bindBuffer","bufferData","onUploadCallback","FLOAT","Float32Array","Float64Array","Uint16Array","isFloat16BufferAttribute","HALF_FLOAT","UNSIGNED_SHORT","Int16Array","SHORT","Uint32Array","UNSIGNED_INT","Int32Array","INT","Int8Array","BYTE","Uint8Array","Uint8ClampedArray","UNSIGNED_BYTE","BYTES_PER_ELEMENT","updateRange","bufferSubData","subarray","updateBuffer","isVector4","Vector2","rotateAround","isVector2","_colorKeywords","_hslA","_hslB","hue2rgb","SRGBToLinear","LinearToSRGB","Color","setRGB","setHex","setStyle","setHSL","handleAlpha","string","parseFloat","components","setColorName","copySRGBToLinear","copyLinearToSRGB","convertSRGBToLinear","convertLinearToSRGB","getHex","getHexString","getHSL","hue","saturation","lightness","getStyle","offsetHSL","addColors","color1","color2","lerpColors","lerpHSL","normalized","NAMES","BufferAttribute","itemSize","needsUpdate","setUsage","copyAt","index1","index2","copyArray","copyColorsArray","colors","copyVector2sArray","vectors","copyVector3sArray","copyVector4sArray","setXY","setXYZ","setXYZW","onUpload","isBufferAttribute","Uint16BufferAttribute","Uint32BufferAttribute","Float32BufferAttribute","arrayNeedsUint32","createElementNS","_id","_obj","_offset","_boxMorphTargets","BufferGeometry","morphAttributes","morphTargetsRelative","groups","drawRange","getIndex","setIndex","getAttribute","setAttribute","deleteAttribute","hasAttribute","addGroup","materialIndex","clearGroups","setDrawRange","tangent","morphAttributesPosition","morphAttribute","isNaN","jl","computeTangents","uv","indices","positions","normals","uvs","nVertices","tangents","tan1","tan2","vA","vB","vC","uvA","uvB","uvC","sdir","tdir","handleTriangle","isFinite","group","tmp2","n2","handleVertex","computeVertexNormals","positionAttribute","normalAttribute","pA","pB","pC","nA","nB","nC","cb","ab","normalizeNormals","merge","isBufferGeometry","attributeArray1","attribute2","attributeArray2","attributeOffset","toNonIndexed","convertBufferAttribute","array2","stride","geometry2","newAttribute","morphArray","hasMorphAttributes","attributeArray","dispose","BoxGeometry","depth","widthSegments","heightSegments","depthSegments","vertices","numberOfVertices","groupStart","buildPlane","udir","vdir","gridX","gridY","segmentWidth","segmentHeight","widthHalf","heightHalf","depthHalf","gridX1","gridY1","vertexCounter","groupCount","PlaneGeometry","width_half","height_half","segment_width","segment_height","materialId","Material","fog","blending","side","vertexColors","opacity","transparent","blendSrc","blendDst","blendEquation","blendSrcAlpha","blendDstAlpha","blendEquationAlpha","depthFunc","depthTest","depthWrite","stencilWriteMask","stencilFunc","stencilRef","stencilFuncMask","stencilFail","stencilZFail","stencilZPass","stencilWrite","clippingPlanes","clipIntersection","clipShadows","shadowSide","colorWrite","polygonOffset","polygonOffsetFactor","polygonOffsetUnits","dithering","alphaToCoverage","premultipliedAlpha","toneMapped","_alphaTest","alphaTest","onBuild","onBeforeCompile","customProgramCacheKey","setValues","newValue","flatShading","currentValue","isRoot","roughness","metalness","sheen","sheenColor","sheenRoughness","emissive","emissiveIntensity","specular","specularIntensity","specularColor","shininess","clearcoat","clearcoatRoughness","clearcoatMap","clearcoatRoughnessMap","clearcoatNormalMap","clearcoatNormalScale","matcap","alphaMap","lightMap","lightMapIntensity","aoMap","aoMapIntensity","bumpMap","bumpScale","normalMap","normalMapType","normalScale","displacementMap","displacementScale","displacementBias","roughnessMap","metalnessMap","emissiveMap","specularMap","specularIntensityMap","specularColorMap","envMap","combine","envMapIntensity","reflectivity","refractionRatio","gradientMap","transmission","transmissionMap","thickness","thicknessMap","attenuationDistance","attenuationColor","sizeAttenuation","linewidth","dashSize","gapSize","wireframe","wireframeLinewidth","wireframeLinecap","wireframeLinejoin","srcPlanes","dstPlanes","cloneUniforms","src","property","mergeUniforms","uniforms","merged","isMaterial","UniformsUtils","ShaderMaterial","defines","vertexShader","fragmentShader","lights","clipping","extensions","derivatives","fragDepth","drawBuffers","shaderTextureLOD","defaultAttributeValues","index0AttributeName","uniformsNeedUpdate","glslVersion","isShaderMaterial","_segCenter","_segDir","_diff","_edge1","_edge2","_normal","Ray","origin","ray","at","recast","closestPointToPoint","directionDistance","distanceSqToPoint","distanceSqToSegment","optionalPointOnRay","optionalPointOnSegment","segExtent","a01","b0","b1","s0","sqrDist","extDet","invDet","intersectSphere","tca","radius2","thc","t0","t1","distanceToPlane","intersectPlane","distToPoint","intersectBox","tmin","tmax","tymin","tymax","tzmin","tzmax","invdirx","invdiry","invdirz","intersectTriangle","backfaceCulling","DdN","DdQxE2","DdE1xQ","QdN","_v3","_vab","_vac","_vbc","_vap","_vbp","_vcp","Triangle","targetLengthSq","dot00","dot01","dot02","dot11","dot12","denom","invDenom","getBarycoord","uv1","uv2","uv3","setFromPointsAndIndices","i0","i1","i2","setFromAttributeAndIndices","getArea","getMidpoint","getNormal","getPlane","getUV","isFrontFacing","d4","vc","d5","d6","vb","va","MeshBasicMaterial","isMeshBasicMaterial","_inverseMatrix","_ray","_vA","_vB","_vC","_tempA","_tempB","_tempC","_morphA","_morphB","_morphC","_uvA","_uvB","_uvC","_intersectionPoint","_intersectionPointWorld","Mesh","updateMorphTargets","morphTargetInfluences","morphTargetDictionary","ml","morphTargets","raycaster","intersects","intersection","morphPosition","groupMaterial","checkBufferGeometryIntersection","faceIndex","face","isGeometry","morphInfluences","influence","boneTransform","checkIntersection","ShaderChunk","alphamap_fragment","alphamap_pars_fragment","alphatest_fragment","alphatest_pars_fragment","aomap_fragment","aomap_pars_fragment","begin_vertex","beginnormal_vertex","bsdfs","bumpmap_pars_fragment","clipping_planes_fragment","clipping_planes_pars_fragment","clipping_planes_pars_vertex","clipping_planes_vertex","color_fragment","color_pars_fragment","color_pars_vertex","color_vertex","common","cube_uv_reflection_fragment","defaultnormal_vertex","displacementmap_pars_vertex","displacementmap_vertex","emissivemap_fragment","emissivemap_pars_fragment","encodings_fragment","encodings_pars_fragment","envmap_fragment","envmap_common_pars_fragment","envmap_pars_fragment","envmap_pars_vertex","envmap_physical_pars_fragment","envmap_vertex","fog_vertex","fog_pars_vertex","fog_fragment","fog_pars_fragment","gradientmap_pars_fragment","lightmap_fragment","lightmap_pars_fragment","lights_lambert_vertex","lights_pars_begin","lights_toon_fragment","lights_toon_pars_fragment","lights_phong_fragment","lights_phong_pars_fragment","lights_physical_fragment","lights_physical_pars_fragment","lights_fragment_begin","lights_fragment_maps","lights_fragment_end","logdepthbuf_fragment","logdepthbuf_pars_fragment","logdepthbuf_pars_vertex","logdepthbuf_vertex","map_fragment","map_pars_fragment","map_particle_fragment","map_particle_pars_fragment","metalnessmap_fragment","metalnessmap_pars_fragment","morphnormal_vertex","morphtarget_pars_vertex","morphtarget_vertex","normal_fragment_begin","normal_fragment_maps","normal_pars_fragment","normal_pars_vertex","normal_vertex","normalmap_pars_fragment","clearcoat_normal_fragment_begin","clearcoat_normal_fragment_maps","clearcoat_pars_fragment","output_fragment","packing","premultiplied_alpha_fragment","project_vertex","dithering_fragment","dithering_pars_fragment","roughnessmap_fragment","roughnessmap_pars_fragment","shadowmap_pars_fragment","shadowmap_pars_vertex","shadowmap_vertex","shadowmask_pars_fragment","skinbase_vertex","skinning_pars_vertex","skinning_vertex","skinnormal_vertex","specularmap_fragment","specularmap_pars_fragment","tonemapping_fragment","tonemapping_pars_fragment","transmission_fragment","transmission_pars_fragment","uv_pars_fragment","uv_pars_vertex","uv_vertex","uv2_pars_fragment","uv2_pars_vertex","uv2_vertex","worldpos_vertex","background_vert","background_frag","cube_vert","cube_frag","depth_vert","depth_frag","distanceRGBA_vert","distanceRGBA_frag","equirect_vert","equirect_frag","linedashed_vert","linedashed_frag","meshbasic_vert","meshbasic_frag","meshlambert_vert","meshlambert_frag","meshmatcap_vert","meshmatcap_frag","meshnormal_vert","meshnormal_frag","meshphong_vert","meshphong_frag","meshphysical_vert","meshphysical_frag","meshtoon_vert","meshtoon_frag","points_vert","points_frag","shadow_vert","shadow_frag","sprite_vert","sprite_frag","UniformsLib","diffuse","uvTransform","uv2Transform","specularmap","envmap","flipEnvMap","ior","aomap","lightmap","emissivemap","bumpmap","normalmap","displacementmap","roughnessmap","metalnessmap","gradientmap","fogDensity","fogNear","fogFar","fogColor","ambientLightColor","lightProbe","directionalLights","properties","directionalLightShadows","shadowBias","shadowNormalBias","shadowRadius","shadowMapSize","directionalShadowMap","directionalShadowMatrix","spotLights","coneCos","penumbraCos","decay","spotLightShadows","spotShadowMap","spotShadowMatrix","pointLights","pointLightShadows","shadowCameraNear","shadowCameraFar","pointShadowMap","pointShadowMatrix","hemisphereLights","skyColor","groundColor","rectAreaLights","ltc_1","ltc_2","ShaderLib","basic","lambert","phong","standard","toon","dashed","totalSize","t2D","cube","equirect","tEquirect","distanceRGBA","referencePosition","nearDistance","farDistance","shadow","WebGLBackground","cubemaps","objects","clearColor","planeMesh","boxMesh","clearAlpha","currentBackground","currentBackgroundVersion","currentTonemapping","setClear","getClearColor","setClearColor","getClearAlpha","setClearAlpha","renderList","forceClear","xr","session","getSession","environmentBlendMode","autoClear","autoClearColor","autoClearDepth","autoClearStencil","isCubeTexture","mapping","isRenderTargetTexture","toneMapping","WebGLBindingStates","maxVertexAttributes","MAX_VERTEX_ATTRIBS","extension","vaoAvailable","bindingStates","defaultState","createBindingState","currentState","bindVertexArrayObject","vao","bindVertexArray","bindVertexArrayOES","deleteVertexArrayObject","deleteVertexArray","deleteVertexArrayOES","newAttributes","enabledAttributes","attributeDivisors","initAttributes","enableAttribute","enableAttributeAndDivisor","meshPerAttribute","enableVertexAttribArray","disableUnusedAttributes","disableVertexAttribArray","vertexAttribPointer","vertexAttribIPointer","resetDefaultState","setup","updateBuffers","programMap","stateMap","createVertexArray","createVertexArrayOES","getBindingState","cachedAttributes","geometryAttributes","attributesNum","cachedAttribute","geometryAttribute","saveCache","ELEMENT_ARRAY_BUFFER","isInstancedBufferGeometry","programAttributes","getAttributes","materialDefaultAttributeValues","programAttribute","location","isInstancedInterleavedBuffer","locationSize","_maxInstanceCount","ARRAY_BUFFER","isInstancedBufferAttribute","vertexAttrib2fv","vertexAttrib3fv","vertexAttrib4fv","vertexAttrib1fv","setupVertexAttributes","geometryId","programId","releaseStatesOfGeometry","releaseStatesOfProgram","WebGLBufferRenderer","info","drawArrays","renderInstances","primcount","methodName","WebGLCapabilities","maxAnisotropy","getMaxPrecision","getShaderPrecisionFormat","VERTEX_SHADER","HIGH_FLOAT","FRAGMENT_SHADER","MEDIUM_FLOAT","WebGL2RenderingContext","WebGL2ComputeRenderingContext","maxPrecision","logarithmicDepthBuffer","maxTextures","MAX_TEXTURE_IMAGE_UNITS","maxVertexTextures","MAX_VERTEX_TEXTURE_IMAGE_UNITS","maxTextureSize","MAX_TEXTURE_SIZE","maxCubemapSize","MAX_CUBE_MAP_TEXTURE_SIZE","maxAttributes","maxVertexUniforms","MAX_VERTEX_UNIFORM_VECTORS","maxVaryings","MAX_VARYING_VECTORS","maxFragmentUniforms","MAX_FRAGMENT_UNIFORM_VECTORS","vertexTextures","floatFragmentTextures","getMaxAnisotropy","MAX_TEXTURE_MAX_ANISOTROPY_EXT","floatVertexTextures","maxSamples","MAX_SAMPLES","WebGLClipping","globalState","numGlobalPlanes","localClippingEnabled","renderingShadows","viewNormalMatrix","uniform","resetGlobalState","numPlanes","numIntersection","projectPlanes","skipTransform","nPlanes","dstArray","flatSize","viewMatrix","i4","enableLocalClipping","beginShadows","endShadows","setState","useCache","materialProperties","nGlobal","lGlobal","clippingState","_canvas","physical","sheenColorMap","sheenRoughnessMap","transmissionSamplerSize","transmissionSamplerMap","ImageUtils","HTMLCanvasElement","ImageData","putImageData","toDataURL","HTMLImageElement","ImageBitmap","imageData","getImageData","textureId","Texture","DEFAULT_IMAGE","DEFAULT_MAPPING","wrapS","wrapT","magFilter","minFilter","format","anisotropy","encoding","mipmaps","internalFormat","repeat","generateMipmaps","premultiplyAlpha","flipY","unpackAlignment","onUpdate","needsPMREMUpdate","wrap","url","isDataTexture","serializeImage","transformUv","getDataURL","WebGLRenderTarget","scissor","scissorTest","viewport","texture","depthBuffer","stencilBuffer","depthTexture","setTexture","setSize","isWebGLRenderTarget","focus","filmGauge","filmOffset","setFocalLength","focalLength","vExtentSlope","getFilmHeight","atan","getFocalLength","tan","getEffectiveFOV","getFilmWidth","skew","isPerspectiveCamera","CubeCamera","renderTarget","isWebGLCubeRenderTarget","cameraPX","cameraNX","cameraPY","cameraNY","cameraPZ","cameraNZ","currentXrEnabled","currentRenderTarget","getRenderTarget","setRenderTarget","CubeTexture","WebGLCubeRenderTarget","dummy","isInteger","fromEquirectangularTexture","shader","mesh","currentMinFilter","stencil","WebGLCubeMaps","mapTextureMapping","onTextureDispose","cubemap","RawShaderMaterial","isRawShaderMaterial","SIZE_MAX","EXTRA_LOD_SIGMA","TOTAL_LODS","LOD_MAX","_flatCamera","_lodPlanes","_sizeLods","_sigmas","_createPlanes","_clearColor","_oldTarget","PHI","INV_PHI","_axisDirections","PMREMGenerator","_renderer","_pingPongRenderTarget","_blurMaterial","poleAxis","_getCommonVertexShader","_getBlurShader","_equirectShader","_cubemapShader","_compileMaterial","fromScene","sigma","cubeUVRenderTarget","_allocateTargets","_sceneToCubeUV","_blur","_applyPMREM","_cleanup","fromEquirectangular","equirectangular","_fromTexture","fromCubemap","compileCubemapShader","_getCubemapShader","compileEquirectangularShader","_getEquirectShader","outputTarget","_setViewport","_textureToCubeUV","params","_createRenderTarget","tmpMesh","cubeCamera","upSign","forwardSign","originalAutoClear","backgroundMaterial","backgroundBox","useSolidColor","lodIn","lodOut","pingPongRenderTarget","_halfBlur","targetIn","targetOut","sigmaRadians","blurMaterial","blurMesh","blurUniforms","pixels","radiansPerPixel","sigmaPixels","samples","sum","weight","exp","outputSize","lod","sizeLod","texelSize","cubeFaces","positionSize","uvSize","faceIndexSize","coordinates","WebGLCubeUVMaps","cubeUVmaps","pmremGenerator","cubemapUV","isEquirectMap","isCubeMap","isCubeTextureComplete","WebGLExtensions","getExtension","WebGLGeometries","wireframeAttributes","onGeometryDispose","updateWireframeAttribute","geometryIndex","geometryPosition","previousAttribute","getWireframeAttribute","currentAttribute","WebGLIndexedBufferRenderer","drawElements","WebGLInfo","calls","triangles","lines","programs","autoReset","instanceCount","TRIANGLES","LINES","LINE_STRIP","LINE_LOOP","POINTS","DataTexture2DArray","wrapR","numericalSort","absNumericalSort","denormalize","morph","WebGLMorphtargets","influencesList","morphTextures","workInfluences","objectInfluences","numberOfMorphTargets","hasMorphNormals","morphNormals","numberOfVertexData","vertexDataStride","morphTarget","morphNormal","disposeTexture","morphInfluencesSum","morphBaseInfluence","getUniforms","setValue","influences","MAX_SAFE_INTEGER","isDataTexture2DArray","WebGLMultisampleRenderTarget","ignoreDepthForMultisampleCopy","ignoreDepth","useRenderToTexture","useRenderbuffer","WebGLObjects","updateMap","onInstancedMeshDispose","instancedMesh","buffergeometry","isWebGLMultisampleRenderTarget","DataTexture3D","isDataTexture3D","emptyTexture","emptyTexture2dArray","emptyTexture3d","emptyCubeTexture","arrayCacheF32","arrayCacheI32","mat4array","mat3array","mat2array","flatten","nBlocks","blockSize","firstElem","arraysEqual","allocTexUnits","allocateTextureUnit","setValueV1f","uniform1f","addr","setValueV2f","uniform2f","uniform2fv","setValueV3f","uniform3f","uniform3fv","setValueV4f","uniform4f","uniform4fv","setValueM2","uniformMatrix2fv","setValueM3","uniformMatrix3fv","setValueM4","uniformMatrix4fv","setValueV1i","uniform1i","setValueV2i","uniform2iv","setValueV3i","uniform3iv","setValueV4i","uniform4iv","setValueV1ui","uniform1ui","setValueV2ui","uniform2uiv","setValueV3ui","uniform3uiv","setValueV4ui","uniform4uiv","setValueT1","unit","safeSetTexture2D","setValueT3D1","setTexture3D","setValueT6","safeSetTextureCube","setValueT2DArray1","setTexture2DArray","setValueV1fArray","uniform1fv","setValueV2fArray","setValueV3fArray","setValueV4fArray","setValueM2Array","setValueM3Array","setValueM4Array","setValueV1iArray","uniform1iv","setValueV2iArray","setValueV3iArray","setValueV4iArray","setValueV1uiArray","uniform1uiv","setValueV2uiArray","setValueV3uiArray","setValueV4uiArray","setValueT1Array","units","setValueT3DArray","setValueT6Array","setValueT2DArrayArray","SingleUniform","activeInfo","getSingularSetter","PureArrayUniform","getPureArraySetter","StructuredUniform","seq","updateCache","RePathPart","addUniform","container","uniformObject","parseUniform","pathLength","lastIndex","matchEnd","idIsIndex","subscript","WebGLUniforms","getProgramParameter","ACTIVE_UNIFORMS","getActiveUniform","getUniformLocation","WebGLShader","createShader","shaderSource","compileShader","setOptional","upload","seqWithValue","programIdCount","getShaderErrors","status","getShaderParameter","COMPILE_STATUS","errors","getShaderInfoLog","addLineNumbers","getShaderSource","getTexelEncodingFunction","functionName","getEncodingComponents","getToneMappingFunction","toneMappingName","filterEmptyLine","replaceLightNums","numDirLights","numSpotLights","numRectAreaLights","numPointLights","numHemiLights","numDirLightShadows","numSpotLightShadows","numPointLightShadows","replaceClippingPlaneNums","numClippingPlanes","numClipIntersection","includePattern","resolveIncludes","includeReplacer","include","deprecatedUnrollLoopPattern","unrollLoopPattern","unrollLoops","loopReplacer","deprecatedLoopReplacer","snippet","generatePrecision","precisionstring","WebGLProgram","cacheKey","shadowMapTypeDefine","shadowMapType","generateShadowMapTypeDefine","envMapTypeDefine","envMapMode","generateEnvMapTypeDefine","envMapModeDefine","generateEnvMapModeDefine","envMapBlendingDefine","generateEnvMapBlendingDefine","customExtensions","extensionDerivatives","envMapCubeUV","tangentSpaceNormalMap","shaderID","extensionFragDepth","rendererExtensionFragDepth","extensionDrawBuffers","rendererExtensionDrawBuffers","extensionShaderTextureLOD","rendererExtensionShaderTextureLod","generateExtensions","customDefines","chunks","generateDefines","createProgram","prefixVertex","prefixFragment","versionString","shaderName","instancing","instancingColor","supportsVertexTextures","maxBones","useFog","fogExp2","objectSpaceNormalMap","vertexTangents","vertexAlphas","vertexUvs","uvsVertexOnly","skinning","useVertexTexture","morphTargetsCount","doubleSided","flipSided","shadowMapEnabled","decodeVideoTexture","physicallyCorrectLights","outputEncoding","depthPacking","vertexGlsl","fragmentGlsl","glVertexShader","glFragmentShader","attachShader","bindAttribLocation","linkProgram","debug","checkShaderErrors","programLog","getProgramInfoLog","vertexLog","fragmentLog","runnable","haveDiagnostics","LINK_STATUS","vertexErrors","fragmentErrors","getError","VALIDATE_STATUS","diagnostics","cachedUniforms","deleteShader","ACTIVE_ATTRIBUTES","getActiveAttrib","FLOAT_MAT2","FLOAT_MAT3","FLOAT_MAT4","getAttribLocation","fetchAttributeLocations","deleteProgram","usedTimes","WebGLShaderCache","shaderCache","materialCache","vertexShaderStage","_getShaderStage","fragmentShaderStage","materialShaders","_getShaderCacheForMaterial","shaderStage","getVertexShaderID","getFragmentShaderID","code","WebGLShaderStage","WebGLPrograms","cubeuvmaps","_programLayers","_customShaders","shaderIDs","MeshDepthMaterial","MeshDistanceMaterial","MeshNormalMaterial","MeshLambertMaterial","MeshPhongMaterial","MeshToonMaterial","MeshStandardMaterial","MeshPhysicalMaterial","MeshMatcapMaterial","LineBasicMaterial","LineDashedMaterial","PointsMaterial","ShadowMaterial","SpriteMaterial","getParameters","shadows","isMeshStandardMaterial","bones","nVertexUniforms","nVertexMatrices","getMaxBones","customVertexShaderID","customFragmentShaderID","useAlphaTest","useClearcoat","isXRRenderTarget","isVideoTexture","isFogExp2","directional","spot","rectArea","hemi","shadowMap","getProgramCacheKey","getProgramCacheKeyParameters","getProgramCacheKeyBooleans","acquireProgram","pl","preexistingProgram","releaseProgram","releaseShaderCache","WebGLProperties","painterSortStable","groupOrder","reversePainterSortStable","WebGLRenderList","renderItems","renderItemsIndex","opaque","transmissive","getNextRenderItem","renderItem","finish","customOpaqueSort","customTransparentSort","WebGLRenderLists","lists","renderCallDepth","UniformsCache","light","halfWidth","halfHeight","nextVersion","shadowCastingLightsFirst","lightA","lightB","WebGLLights","shadowCache","ShadowUniformsCache","hash","directionalLength","pointLength","spotLength","rectAreaLength","hemiLength","numDirectionalShadows","numPointShadows","numSpotShadows","ambient","probe","directionalShadow","spotShadow","rectAreaLTC1","rectAreaLTC2","pointShadow","vector3","matrix42","scaleFactor","intensity","isAmbientLight","isLightProbe","sh","coefficients","isDirectionalLight","shadowUniforms","bias","normalBias","mapSize","isSpotLight","penumbra","isRectAreaLight","isPointLight","isHemisphereLight","LTC_FLOAT_1","LTC_FLOAT_2","LTC_HALF_1","LTC_HALF_2","setupView","WebGLRenderState","lightsArray","shadowsArray","setupLights","setupLightsView","pushLight","pushShadow","shadowLight","WebGLRenderStates","renderStates","renderState","isMeshDepthMaterial","isMeshDistanceMaterial","WebGLShadowMap","_objects","_capabilities","_frustum","_shadowMapSize","_viewportSize","_viewport","_depthMaterial","_distanceMaterial","_materialCache","_maxTextureSize","shadowMaterialVertical","VSM_SAMPLES","shadow_pass","resolution","shadowMaterialHorizontal","HORIZONTAL_PASS","fullScreenTri","fullScreenMesh","VSMPass","blurSamples","mapPass","renderBufferDirect","getDepthMaterial","customMaterial","customDistanceMaterial","customDepthMaterial","keyA","keyB","materialsForVariant","cachedMaterial","renderObject","shadowCamera","kl","depthMaterial","autoUpdate","activeCubeFace","getActiveCubeFace","activeMipmapLevel","getActiveMipmapLevel","_state","setBlending","setTest","setScissorTest","shadowFrameExtents","getFrameExtents","isPointLightShadow","pars","viewportCount","getViewportCount","vp","getViewport","updateMatrices","getFrustum","WebGLState","colorBuffer","locked","currentColorMask","currentColorClear","setMask","colorMask","setLocked","lock","currentDepthMask","currentDepthFunc","currentDepthClear","DEPTH_TEST","depthMask","setFunc","NEVER","ALWAYS","LESS","LEQUAL","EQUAL","GEQUAL","GREATER","NOTEQUAL","clearDepth","currentStencilMask","currentStencilFunc","currentStencilRef","currentStencilFuncMask","currentStencilFail","currentStencilZFail","currentStencilZPass","currentStencilClear","stencilTest","STENCIL_TEST","stencilMask","setOp","stencilOp","clearStencil","enabledCapabilities","currentBoundFramebuffers","currentDrawbuffers","defaultDrawbuffers","currentProgram","currentBlendingEnabled","currentBlending","currentBlendEquation","currentBlendSrc","currentBlendDst","currentBlendEquationAlpha","currentBlendSrcAlpha","currentBlendDstAlpha","currentPremultipledAlpha","currentFlipSided","currentCullFace","currentLineWidth","currentPolygonOffsetFactor","currentPolygonOffsetUnits","MAX_COMBINED_TEXTURE_IMAGE_UNITS","lineWidthAvailable","glVersion","VERSION","currentTextureSlot","currentBoundTextures","scissorParam","SCISSOR_BOX","viewportParam","VIEWPORT","currentScissor","currentViewport","createTexture","bindTexture","texParameteri","TEXTURE_MIN_FILTER","NEAREST","TEXTURE_MAG_FILTER","texImage2D","RGBA","emptyTextures","TEXTURE_2D","TEXTURE_CUBE_MAP","TEXTURE_CUBE_MAP_POSITIVE_X","setFlipSided","setCullFace","CULL_FACE","equationToGL","FUNC_ADD","FUNC_SUBTRACT","FUNC_REVERSE_SUBTRACT","MIN","MAX","MIN_EXT","MAX_EXT","factorToGL","ONE","SRC_COLOR","SRC_ALPHA","SRC_ALPHA_SATURATE","DST_COLOR","DST_ALPHA","ONE_MINUS_SRC_COLOR","ONE_MINUS_SRC_ALPHA","ONE_MINUS_DST_COLOR","ONE_MINUS_DST_ALPHA","BLEND","blendEquationSeparate","blendFuncSeparate","blendFunc","frontFace","CW","CCW","cullFace","BACK","FRONT","FRONT_AND_BACK","setPolygonOffset","factor","POLYGON_OFFSET_FILL","activeTexture","webglSlot","TEXTURE0","bindFramebuffer","framebuffer","DRAW_FRAMEBUFFER","FRAMEBUFFER","isWebGLMultipleRenderTargets","COLOR_ATTACHMENT0","drawBuffersWEBGL","useProgram","setMaterial","frontFaceCW","SAMPLE_ALPHA_TO_COVERAGE","setLineWidth","lineWidth","SCISSOR_TEST","webglType","webglTexture","boundTexture","unbindTexture","compressedTexImage2D","texImage3D","texStorage2D","texStorage3D","texSubImage2D","texSubImage3D","compressedTexSubImage2D","KEEP","READ_FRAMEBUFFER","WebGLTextures","_gl","utils","MultisampledRenderToTextureExtension","_videoTextures","useOffscreenCanvas","OffscreenCanvas","createCanvas","resizeImage","needsPowerOfTwo","needsNewCanvas","maxSize","isPowerOfTwo","textureNeedsGenerateMipmaps","supportsMips","generateMipmap","getInternalFormat","internalFormatName","glFormat","glType","RED","R32F","R16F","R8","RG","RG32F","RG16F","RG8","RGBA32F","RGBA16F","SRGB8_ALPHA8","RGBA8","UNSIGNED_SHORT_4_4_4_4","RGBA4","UNSIGNED_SHORT_5_5_5_1","RGB5_A1","getMipLevels","isFramebufferTexture","log2","isCompressedTexture","filterFallback","LINEAR","textureProperties","__webglInit","deleteTexture","__webglTexture","deallocateTexture","onRenderTargetDispose","renderTargetProperties","deleteFramebuffer","__webglFramebuffer","__webglDepthbuffer","deleteRenderbuffer","__webglMultisampledFramebuffer","__webglColorRenderbuffer","__webglDepthRenderbuffer","attachmentProperties","deallocateRenderTarget","textureUnits","setTexture2D","slot","updateVideoTexture","__version","uploadTexture","setTextureCube","initTexture","pixelStorei","UNPACK_FLIP_Y_WEBGL","UNPACK_PREMULTIPLY_ALPHA_WEBGL","UNPACK_ALIGNMENT","UNPACK_COLORSPACE_CONVERSION_WEBGL","NONE","isCompressed","cubeImage","verifyColorSpace","convert","glInternalFormat","useTexStorage","allocateMemory","levels","setTextureParameters","mipmap","mipmapImage","uploadCubeTexture","wrappingToGL","REPEAT","CLAMP_TO_EDGE","MIRRORED_REPEAT","filterToGL","NEAREST_MIPMAP_NEAREST","NEAREST_MIPMAP_LINEAR","LINEAR_MIPMAP_NEAREST","LINEAR_MIPMAP_LINEAR","textureType","TEXTURE_WRAP_S","TEXTURE_WRAP_T","TEXTURE_3D","TEXTURE_2D_ARRAY","TEXTURE_WRAP_R","__currentAnisotropy","texParameterf","TEXTURE_MAX_ANISOTROPY_EXT","textureNeedsPowerOfTwo","isDepthTexture","DEPTH_COMPONENT","DEPTH_COMPONENT32F","DEPTH_COMPONENT24","DEPTH24_STENCIL8","DEPTH_COMPONENT16","DEPTH_STENCIL","setupFrameBufferTexture","attachment","textureTarget","__hasExternalTextures","framebufferTexture2DMultisampleEXT","getRenderTargetSamples","framebufferTexture2D","setupRenderBufferStorage","renderbuffer","isMultisample","bindRenderbuffer","RENDERBUFFER","renderbufferStorageMultisampleEXT","renderbufferStorageMultisample","renderbufferStorage","framebufferRenderbuffer","DEPTH_ATTACHMENT","DEPTH_STENCIL_ATTACHMENT","setupDepthRenderbuffer","isCube","__autoAllocateDepthBuffer","webglDepthTexture","setupDepthTexture","createRenderbuffer","sRGBToLinear","warnedTexture2D","warnedTextureCube","textureUnit","resetTextureUnits","rebindTextures","colorTexture","setupRenderTarget","isMultipleRenderTargets","isRenderTarget3D","createFramebuffer","glTextureType","updateRenderTargetMipmap","updateMultisampleRenderTarget","COLOR_BUFFER_BIT","invalidationArray","depthStyle","DEPTH_BUFFER_BIT","STENCIL_BUFFER_BIT","invalidateFramebuffer","blitFramebuffer","WebGLUtils","HALF_FLOAT_OES","ALPHA","LUMINANCE","LUMINANCE_ALPHA","SRGB_ALPHA_EXT","RED_INTEGER","RG_INTEGER","RGBA_INTEGER","COMPRESSED_SRGB_S3TC_DXT1_EXT","COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT","COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT","COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT","COMPRESSED_RGB_S3TC_DXT1_EXT","COMPRESSED_RGBA_S3TC_DXT1_EXT","COMPRESSED_RGBA_S3TC_DXT3_EXT","COMPRESSED_RGBA_S3TC_DXT5_EXT","COMPRESSED_RGB_PVRTC_4BPPV1_IMG","COMPRESSED_RGB_PVRTC_2BPPV1_IMG","COMPRESSED_RGBA_PVRTC_4BPPV1_IMG","COMPRESSED_RGBA_PVRTC_2BPPV1_IMG","COMPRESSED_RGB_ETC1_WEBGL","COMPRESSED_SRGB8_ETC2","COMPRESSED_RGB8_ETC2","COMPRESSED_SRGB8_ALPHA8_ETC2_EAC","COMPRESSED_RGBA8_ETC2_EAC","COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR","COMPRESSED_RGBA_ASTC_4x4_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR","COMPRESSED_RGBA_ASTC_5x4_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR","COMPRESSED_RGBA_ASTC_5x5_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR","COMPRESSED_RGBA_ASTC_6x5_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR","COMPRESSED_RGBA_ASTC_6x6_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR","COMPRESSED_RGBA_ASTC_8x5_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR","COMPRESSED_RGBA_ASTC_8x6_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR","COMPRESSED_RGBA_ASTC_8x8_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR","COMPRESSED_RGBA_ASTC_10x5_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR","COMPRESSED_RGBA_ASTC_10x6_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR","COMPRESSED_RGBA_ASTC_10x8_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR","COMPRESSED_RGBA_ASTC_10x10_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR","COMPRESSED_RGBA_ASTC_12x10_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR","COMPRESSED_RGBA_ASTC_12x12_KHR","COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT","COMPRESSED_RGBA_BPTC_UNORM_EXT","UNSIGNED_INT_24_8","UNSIGNED_INT_24_8_WEBGL","ArrayCamera","cameras","isArrayCamera","Group","isGroup","_moveEvent","WebXRController","_targetRay","_grip","_hand","getHandSpace","joints","inputState","pinching","getTargetRaySpace","hasLinearVelocity","linearVelocity","hasAngularVelocity","angularVelocity","getGripSpace","disconnect","inputSource","referenceSpace","inputPose","gripPose","handPose","targetRay","grip","hand","visibilityState","getPose","targetRaySpace","inputjoint","jointPose","getJointPose","jointName","joint","jointRadius","indexTip","thumbTip","distanceToPinch","threshold","handedness","gripSpace","DepthTexture","WebXRManager","framebufferScaleFactor","referenceSpaceType","hasMultisampledRenderToTexture","pose","glBinding","glProjLayer","glBaseLayer","xrFrame","getContextAttributes","initialRenderTarget","newRenderTarget","controllers","inputSourcesMap","cameraL","cameraR","cameraVR","_currentDepthNear","_currentDepthFar","onSessionEvent","controller","onSessionEnd","isPresenting","onInputSourcesChange","inputSources","removed","added","cameraAutoUpdate","getController","getControllerGrip","getHand","setFramebufferScaleFactor","setReferenceSpaceType","getReferenceSpace","getBaseLayer","getBinding","getFrame","setSession","async","xrCompatible","makeXRCompatible","layerInit","antialias","XRWebGLLayer","updateRenderState","baseLayer","framebufferWidth","framebufferHeight","depthFormat","depthType","glDepthFormat","projectionlayerInit","colorFormat","XRWebGLBinding","createProjectionLayer","textureWidth","textureHeight","ignoreDepthValues","setFoveation","requestReferenceSpace","cameraLPos","cameraRPos","updateCamera","depthNear","depthFar","ipd","projL","projR","topFov","bottomFov","leftFov","rightFov","zOffset","xOffset","near2","far2","left2","right2","top2","bottom2","setProjectionFromUnion","getCamera","getFoveation","fixedFoveation","foveation","onAnimationFrameCallback","getViewerPose","views","setRenderTargetFramebuffer","cameraVRNeedsUpdate","glSubImage","getViewSubImage","setRenderTargetTextures","depthStencilTexture","WebGLMaterials","refreshUniformsCommon","uvScaleMap","uv2ScaleMap","refreshUniformsStandard","refreshFogUniforms","isFog","density","refreshMaterialUniforms","pixelRatio","transmissionRenderTarget","isMeshLambertMaterial","refreshUniformsLambert","isMeshToonMaterial","refreshUniformsToon","isMeshPhongMaterial","refreshUniformsPhong","isMeshPhysicalMaterial","refreshUniformsPhysical","isMeshMatcapMaterial","refreshUniformsMatcap","refreshUniformsDepth","refreshUniformsDistance","isMeshNormalMaterial","refreshUniformsNormal","isLineBasicMaterial","refreshUniformsLine","isLineDashedMaterial","refreshUniformsDash","isPointsMaterial","refreshUniformsPoints","isSpriteMaterial","refreshUniformsSprites","isShadowMaterial","WebGLRenderer","createCanvasElement","_alpha","_depth","_stencil","_antialias","_premultipliedAlpha","_preserveDrawingBuffer","preserveDrawingBuffer","_powerPreference","powerPreference","_failIfMajorPerformanceCaveat","failIfMajorPerformanceCaveat","currentRenderList","currentRenderState","renderListStack","renderStateStack","sortObjects","toneMappingExposure","_isContextLost","_currentActiveCubeFace","_currentActiveMipmapLevel","_currentRenderTarget","_currentMaterialId","_currentCamera","_currentViewport","_currentScissor","_currentScissorTest","_width","_height","_pixelRatio","_opaqueSort","_transparentSort","_scissor","_scissorTest","_clippingEnabled","_localClippingEnabled","_transmissionRenderTarget","_projScreenMatrix","_vector3","_emptyScene","overrideMaterial","getTargetPixelRatio","programCache","renderLists","morphtargets","bufferRenderer","indexedBufferRenderer","contextNames","contextAttributes","contextName","onContextLost","onContextRestore","isWebGL1Renderer","initGLContext","infoAutoReset","shadowMapAutoUpdate","shadowMapNeedsUpdate","onMaterialDispose","releaseMaterialProgramReferences","deallocateMaterial","forceContextLoss","loseContext","forceContextRestore","restoreContext","getPixelRatio","setPixelRatio","updateStyle","setViewport","getDrawingBufferSize","setDrawingBufferSize","getCurrentViewport","getScissor","setScissor","getScissorTest","boolean","setOpaqueSort","setTransparentSort","bits","onXRSessionStart","onXRSessionEnd","needsProgramChange","needsLights","lightsStateVersion","getProgram","refreshProgram","refreshMaterial","refreshLights","p_uniforms","m_uniforms","uCamPos","cameraPosition","boneTexture","computeBoneTexture","boneTextureSize","uniformsList","setProgram","rangeFactor","dataCount","rangeStart","rangeCount","drawStart","drawEnd","drawCount","isLineSegments","isLineLoop","isSprite","projectObject","isLOD","renderScene","opaqueObjects","transmissiveObjects","transparentObjects","needsAntialias","currentToneMapping","renderObjects","renderTransmissionPass","programCacheKey","updateCommonMaterialProperties","materialNeedsLights","progUniforms","camera2","defaultFramebuffer","__useDefaultFramebuffer","useDefaultFramebuffer","layer","framebufferTextureLayer","readRenderTargetPixels","activeCubeFaceIndex","textureFormat","IMPLEMENTATION_COLOR_READ_FORMAT","halfFloatSupportedByExt","IMPLEMENTATION_COLOR_READ_TYPE","checkFramebufferStatus","FRAMEBUFFER_COMPLETE","readPixels","copyFramebufferToTexture","levelScale","copyTexSubImage2D","copyTextureToTexture","srcTexture","dstTexture","copyTextureToTexture3D","sourceBox","glTarget","unpackRowLen","UNPACK_ROW_LENGTH","unpackImageHeight","UNPACK_IMAGE_HEIGHT","unpackSkipPixels","UNPACK_SKIP_PIXELS","unpackSkipRows","UNPACK_SKIP_ROWS","unpackSkipImages","UNPACK_SKIP_IMAGES","compressedTexSubImage3D","resetState","__THREE_DEVTOOLS__","CustomEvent","detail","isWebGLRenderer","WebGL1Renderer","renderWidth","renderHeight","setRenderSize","Scene","maxRenderWidth","maxRenderHeight","Size","resized","queue","_event","pre","ew","eh","rw","rh","ratio","mt","offsetWidth","innerWidth","offsetHeight","innerHeight","marginLeft","marginTop","speed","warmup","timeout","clock","frames","average","fps","wait","clockStart","timeStart","tick","delay","visibility","hidden","post","controls","_camera","vr","VR","handleResize","cursor","hide","applyCursor","mousemove","hmd","auto","Fullscreen","charCode","changeHandler","fullscreenElement","mozFullScreenElement","webkitFullscreenElement","msFullscreenElement","vrDisplay","exitFullscreen","msExitFullscreen","webkitExitFullscreen","mozCancelFullScreen","requestFullScreen","msRequestFullScreen","msRequestFullscreen","webkitRequestFullscreen","mozRequestFullScreen","stats","theme","markup","buttons","ui","fullscreen","goFullscreen","goVR","VRRenderer","cameraLeft","cameraRight","et","getEyeTranslation","halfIPD","fovLeft","getRecommendedEyeFieldOfView","fovRight","FovToNDCScaleOffset","pxscale","leftTan","rightTan","pxoffset","pyscale","upTan","downTan","FovPortToProjection","rightHanded","zNear","zFar","handednessScale","scaleAndOffset","FovToProjection","fovPort","upDegrees","downDegrees","leftDegrees","rightDegrees","dpr","enableScissorTest","device","devices","sensor","mocks","def","deviceId","deviceName","fov2","fovX","getState","load","devs","navigator","getVRDevices","then","mozGetVRDevices","vrdevs","HMD","HMDVRDevice","SENSOR","PositionSensorVRDevice","dev","hardwareUnitId","hookup","initialize","Attributes","definitions","traits","Traits","types","Types","pending","bound","enum","config","Data","lastObject","lastKey","lastValue","invoke","compute","digest","getTrait","getLastTrigger","shallowCopy","_attributes","ns","oldComputed","oldExpr","oldOrig","oldProps","props","finals","freeform","orig","computed","flattened","originals","mapTo","ignore","initial","short","validators","_expr","_computed","_finals","valid","validated","validate","_bound","_eval","getTime","evaluate","binds","makers","equalors","invalid","dirty","touches","changed","touched","trait","getNS","shorthand","parts","substring","addSpec","T","unique","checkUnit","checkFactor","formatMultiple","compact","formatFraction","formatFactors","E","formatPrimes","prettyNumber","pi","tau","formatIndex","numberCache","best","numer","toPrecision","prettyPrint","prettyMarkup","quoted","nested","char","prettyJSXPair","formatNumber","_up","toMarkup","kk","vv","escapeHTML","prettyFormat","_arg","JSX","nodeIndex","configure","_config","_added","_removed","_index","_encode","classes","indent","model","_matcher","result1","open","close","print","Guard","iterate","_elem","deduped","getRoot","contextNodes","contextSet","AUTO","Model","ids","watchers","fire","adopt","addType","addTraits","removeNode","removeType","removeTraits","removeID","removeClasses","prime","watcher","matcher","handler","_klass","primed","addID","addClasses","addTags","sets","tags","removeTags","hashTags","unhashTags","select","watch","unwatch","OverlayFactory","inject","insertBefore","unject","getTypes","HEAP","descriptor","rendered","instance","hint","inclusive","range","ascending","__range__","recycle","mount","same","ref","isComponentClass","nextProps","nextChildren","_COMPONENT_DIRTY","comp","defaultProps","willReceiveProps","should","_COMPONENT_FORCE","shouldUpdate","nextState","getNextState","willUpdate","prevProps","prevState","applyNextState","didUpdate","unset","unmount","getInitialState","willMount","didMount","_COMPONENT","createTextNode","willUnmount","prefixes","e1","removeAttribute","createClass","Component","forceUpdate","getDefaultProps","Overlay","DOM","_options","overlay","_overlay","naked","Classes","Primitive","helpers","_renderables","renderables","_shaders","shaders","_overlays","overlays","_animator","animator","_types","_root","reconfigure","_get","_helpers","_handlers","inherit","_parent","made","unmake","_rebuild","unmade","_changed","_touched","_init","refresh","rebuild","_inherit","error1","error2","_unlisten","_unattach","_uncompute","_listen","__listen","_find","_uninherit","_attach","_targets","discard","selection","_compute","Parent","Inherit","cameraEvent","preEvent","updateEvent","renderEvent","postEvent","clockEvent","setCamera","renderable","renders","unadopt","getSpeed","getUnit","getUnitUniforms","defaultCamera","vertex","pass","pipe","Unit","paramToGL","paramToArrayStorage","swizzleToEulerOrder","swizzle","transformComposer","quat","scl","Matrix4","eulerOrder","proxy","getSizes","sizes","getDimensions","channels","dims","nesting","repeatCall","times","makeEmitter","thunk","outer","inner","rebind","getThunk","third","fourth","getStreamer","consume","getLerpEmitter","expr1","expr2","emitter","lerp2","scratch","lerp1","emit1","emit2","_k","getLerpThunk","data1","data2","n1","thunk1","thunk2","letters","parseOrder","toType","toFloatString","mapByte2FloatOffset","stretch","mid","binaryOperator","curry","extendVec","truncateVec","diff","injectVec4","swizzler","swizzleVec4","invertSwizzleVec4","letter","Source","indexShader","sourceShader","getActiveDimensions","getIndexDimensions","getFutureDimensions","dataEmitter","dataSizes","passthrough","isActive","Buffer","bufferSlack","bufferFrames","bufferTime","bufferDelta","bufferClock","bufferStep","clockParent","rawBuffer","syncBuffer","live","hurry","realtime","observe","filled","getFilled","slack","abort","alignShader","aligned","mixed","nearest","Array_","space","history","used","storage","getRawDimensions","reserve","bufferWidth","setCallback","setActive","Interval","updateSpan","dimension","centered","pad","span","_callback","Matrix","reserveX","reserveY","bufferHeight","Area","inverseX","inverseY","dimensions","centeredX","centeredY","padX","paddingX","padY","paddingY","rangeX","rangeY","aX","aY","spanX","spanY","bX","bY","Voxel","reserveZ","bufferDepth","_h","Volume","inverseZ","centeredZ","padZ","paddingZ","rangeZ","aZ","spanZ","bZ","setOrigin","vec","addOrigin","setDimension","setDimensionNormal","recenterAxis","bend","fabs","Scale","scaleAxis","sampler","positionUniforms","vec4","scaleOffset","updateRanges","ticks","generate","parseQuoted","accum","munch","unescape","Axis","zBias","axisPosition","axisStep","arrows","pipeline","styleUniforms","lineUniforms","arrowUniforms","arrow","unitUniforms","stroke","shade","crossed","clip","flip","Face","wireUniforms","styleZBias","wireZBias","shaded","faceMaterial","lineMaterial","strips","ribbons","closed","lineBias","Grid","gridPosition","gridStep","gridAxis","lineX","lineY","range1","range2","cake1","cake2","cake3","Line","proximity","Point","pointUniforms","optical","Strip","strip","Surface","surface","surfaceUniforms","styleColor","wireColor","wireScratch","closedX","closedY","swizzle2","zUnits","surfaces","intUV","_convertGammaToLinear","gammaFactor","_convertLinearToGamma","safeInverse","Ticks","tickStrip","tickEpsilon","tickSize","tickNormal","vec2","worldUnit","focusDepth","Vector","HTML","read","pointDims","htmlDims","projection","indexer","readback","stpq","isVisible","strideJ","strideK","outline","pointer","zIndex","snap","styles","className","strideI","colorString","flatZ","ox","oy","fontSize","pointerEvents","sI","sJ","atlas","textShader","textIsSDF","sdf","textHeight","variant","streamer","Operator","__guardMethod__","sourceSpec","Format","through","digits","_t","Label","textDims","labelUniforms","spriteDepth","spriteOffset","spriteSnap","spriteScale","outlineStep","outlineExpand","outlineColor","linear","expand","Resample","_resample","resampled","relativeSize","sample","relativeSample","centeredW","paddingW","vec3","dataSize","dataResolution","targetSize","targetResolution","resampleFactor","resampleBias","iterable","shaderBind","bw","bh","rd","ri","bi","Retext","Clock","seek","pace","Now","Transform","fragment","xform","Transform3","transformMatrix","mat4","composer","Transform4","transformOffset","Vertex","Fragment","gamma","Layer","layerScale","layerBias","pitch","_enum","fit","contain","cover","Mask","fan","Clamp","clampLimit","Grow","growScale","growMask","growAnchor","anchor","Join","dim","labels","mapped","product","overlap","permute","rest","major","joinStride","joinStrideInv","Lerp","iterable1","Memo","memo","shaderAbsolute","Readback","Repeat","resample","repeatModulus","Swizzle","Spread","spreadMatrix","spreadOffset","els","align","unitEnum","absolute","spread","Split","remain","splitStride","Slice","_resolve","sliceOffset","Subdivide","subdivideBevel","Transpose","_remap","Transition","animate","latched","transitionFrom","transitionTo","transitionActive","bool","transitionScale","transitionBias","transitionEnter","transitionExit","transitionSkew","slideParent","visibleParent","activeParent","latch","release","move","forward","duration","durationEnter","durationExit","delayEnter","delayExit","immediate","ease","partial","stagger","flipX","flipZ","flipW","staggerX","staggerY","staggerZ","staggerW","Move","moveFrom","moveTo","cosine","binary","hold","deepCopy","Track","handlers","script","playhead","velocity","section","targetNode","_process","unbindExpr","bindExpr","measure","easeMethod","getPlayhead","getLerpFactor","fromE","toE","fromP","toP","_from","_to","_delta","Play","go","parentClock","Present","slideReset","process","slideLatch","slideStep","mapIndex","slideRelease","_step","parents","ref1","present","isSlide","dedupe","finalize","paths","slides","slide","parentIndex","childIndex","early","late","directed","stay","result2","ascend","descend","Reveal","Slide","_instant","setVisible","Step","actualIndex","animateIndex","animateStep","stops","_e","playback","rewind","skips","free","RTT","rtt","rootSize","imageShader","shaderRelative","parentRoot","widthFactor","heightFactor","getOwnCamera","Compose","zWrite","zTest","remapUVScale","resampleUniforms","composeUniforms","View","Cartesian","objectMatrix","Cartesian4","basisOffset","basisScale","dw","mult","Polar","polarBend","polarHelix","polarFocus","polarAspect","helix","fdx","sdx","sdy","Spherical","sphericalBend","sphericalFocus","sphericalAspectX","sphericalAspectY","sphericalScaleY","aspectX","aspectY","idy","adz","fdy","sdz","aspectZ","Stereographic","stereoBend","rotationMatrix","Stereographic4","Shader","language","int","mat3","_signatures","sources","grid","cartesian","cartesian4","polar","spherical","stereographic","stereographic4","transform4","interval","area","voxel","volume","label","retext","grow","subdivide","play","reveal","_Types","al","bl","nullable","an","bn","enumber","_invalid","positive","strict","timestamp","ivec2","ivec3","ww","ivec4","rr","gg","bb","allowZero","W","H","D","I","zero","null","looseArray","axesArray","temp","missing","stringArray","nearestMipMapNearest","NearestMipMapNearestFilter","nearestMipMapLinear","NearestMipMapLinearFilter","linearMipMapNearest","LinearMipMapNearestFilter","linearMipmapLinear","LinearMipMapLinearFilter","unsignedByte","byte","ByteType","ShortType","unsignedShort","IntType","unsignedInt","float","indexing","vertexPass","fragmentPass","middle","transitionState","decorate","entity","view3","view4","transform3","base","nice","zOrder","alignItems","alignWidth","alignHeight","alignDepth","bevel","transition","track","ideal","end1","factors","asc1","end2","_min","_max","_n","_unit","_base","_bias","_start","_end","_nice","slots","isUnique","spanView","styleOpacity","styleZIndex","clipStyle","clipRange","clipSpace","arrowSpace","arrowSize","pointSize","pointDepth","lineDepth","lineProximity","order1","order2","vis","onVisible","act","onActive","objectScene","hasStyle","NormalBlending","show","pixelUnit","renderAspect","renderOdd","renderScale","renderScaleInv","isAbsolute","fovtan","pixel","rscale","world","Helpers","PrimitiveFactory","Renderable","_adopt","_set","rotationAutoUpdate","_add","_remove","currentTarget","RenderFactory","_j","_l","DataTexture","build","RGB","format3","textureObject","Image","dataTexture","DataBuffer","dataPointer","textureItems","Geometry","_reduce","maxs","_emitter","_finalize","_offsets","offsets","ClipGeometry","_clipUniforms","geometryClip","geometryResolution","_clipGeometry","_clipMap","mapWidth","mapHeight","mapDepth","mapItems","_clipOffsets","_items","ArrowGeometry","sides","circle","asc2","tip","back","end3","asc3","end4","asc4","end5","asc5","asc6","end6","quads","Base","raw","_raw","_polygonOffset","_show","_hide","_material","vertexPrefix","fragmentPrefix","shaderOptions","varyings","inspect","vertexGraph","fragmentGraph","_vertexColor","_vertexPosition","defs","POSITION_MAP","POSITION_STPQ","_fragmentColor","isolate","BackedTexture","oldWidth","oldHeight","yh","Atlas","backed","rows","collapse","row","allocate","Row","alive","FaceGeometry","LineGeometry","edge","segments","edger","end7","asc7","asc8","end8","asc9","end9","asc10","end10","asc11","end11","j1","RenderTarget","targets","acc","reads","dataTextures","cycle","RenderToTexture","sample2DArray","getFrames","SurfaceGeometry","construct","segmentsX","segmentsY","wrapX","wrapY","edgerX","edgerY","edgeY","edgeX","ScreenGeometry","geometryScale","Screen","DoubleSide","MemoScreen","inv","inv1","remapModulus","remapModulusInv","remapSTPQScale","SpriteGeometry","quad","StripGeometry","edgeFactory","fillFactory","fillOpts","fillMaterial","edgeOpts","edgeMaterial","fillObject","edgeObject","nreders","passes","_shape","POINT_SHAPE_SCALE","miter","LINE_STROKE","LINE_CLIP","LINE_PROXIMITY","POSITION_UV_INT","screen","memoScreen","__debug","dataBuffer","arrayBuffer","matrixBuffer","voxelBuffer","pushBuffer","renderToTexture","isFloat","sampled","rect","encoder","isIndexed","indexModulus","floatMemo","floatCompose","byteMemo","byteCompose","bytes","floats","readFloat","readByte","ll","ii","jj","padW","textAtlas","ua","userAgent","scratchW","scratchH","lineHeight","maxWidth","textAlign","lineJoin","_allocate","_write","draw","ctx","measureText","clearRect","globalCompositeOperation","strokeStyle","strokeText","Graph","IN","OUT","inputs","outlet","outputs","getIn","getOut","graph","Outlet","extra","inout","dupe","connect","_name","owner","outlets","all","setOutlets","existing","_morph","dests","hints","typeHint","_key","Snippet","sigs","compiler","_compiler","_original","main","externals","symbols","exist","exceptions","global","local","_u","globalUniforms","_v","globalVaryings","globalAttributes","redef","varying","external","assemble","requires","handle","priority","isDangling","signature","record","lib","ext","sorted","Program","links","modules","exported","bodies","defuse","hoist","Layout","visits","visit","Block","makeOutlets","_include","export","_program","_layout","_external","_outlet","_info","_call","_require","_inputs","arg","_link","OutletError","_trace","Call","callbacks","Callback","subroutine","ins","outs","Isolate","seen","other","in","imul","hashColor","norm","cssColor","escapeText","_markup","_activate","codes","popup","none","nodeMap","linkMap","wrapper","columns","addOutlet","sqr","mx","my","makeSVG","getBoundingClientRect","coords","svg","contents","inside","_visualize","_graph","visualize","Factory","_concat","_import","import","_group","_next","_stack","_exit","_tail","State","autoInspect","_auto","_combine","multi","_isolate","_main","subgraph","_subgraph","tail","_push","_pop","_append","_insert","_prepend","snippets","inline","_used","head","dead","expire","signatures","placeholders","replaced","string_compiler","sig","function","quant","argument","param","long","threejs","THREE","mat2","sampler2D","samplerCube","dirs","const","Definition","isIn","shadowed","SHADOW_ARG","RETURN_ARG","ast","parseGLSL","processAST","tock","fmt","walk","mapSymbols","collect","internals","sortSymbols","extractSignatures","maybe","found","internal","defn","unshadow","real","statements","return","vars","chain","A","B","dangling","omit","isReturn","returnVar","_lookup","_dangling","_m","blocks","qual","_struct","ShaderGraph","GLSL","Linker","Visualize","sel","Snippets","Animator","anims","anim","Animation","emitterFrom","emitterTo","cancel","notify","cancelled","API","isLeaf","eq","getAll","_reset","Controller","primitives","Ease","JS","Pretty","Three","VDOM","Context","Namespace","Primitives","Render","Shaders","Stage","Util","guard","setWarmup","getPending","mathBox","mathbox","splash","inited","warm"],"sourceRoot":""}
\ No newline at end of file
diff --git a/config/webpack.config.base.js b/config/webpack.config.base.js
new file mode 100644
index 0000000000000000000000000000000000000000..831285c81a12b85657ad920fb083ea597d5242ff
--- /dev/null
+++ b/config/webpack.config.base.js
@@ -0,0 +1,28 @@
+const webpack = require("webpack");
+const TerserPlugin = require("terser-webpack-plugin");
+
+module.exports = {
+  resolve: {
+    extensions: [
+      // '.ts',
+      ".js",
+    ],
+  },
+  plugins: [
+    new webpack.ProvidePlugin({
+      Buffer: ["buffer", "Buffer"],
+      process: "process/browser",
+    }),
+  ],
+  // Activate source maps for the bundles in order to preserve the original
+  // source when the user debugs the application
+  devtool: "source-map",
+  optimization: {
+    minimize: true,
+    minimizer: [
+      new TerserPlugin({
+        test: /\.min\.js$/,
+      }),
+    ],
+  },
+};
diff --git a/config/webpack.config.docs.js b/config/webpack.config.docs.js
new file mode 100644
index 0000000000000000000000000000000000000000..5eb1794e303cb3a5021a662d1d1a3384929b5493
--- /dev/null
+++ b/config/webpack.config.docs.js
@@ -0,0 +1,12 @@
+const { resolve } = require("path");
+const baseConfig = require("./webpack.config.base");
+
+module.exports = {
+  ...baseConfig,
+  entry: resolve(__dirname, "../src/docs/generate.js"),
+  output: {
+    path: resolve(__dirname, "../build_docs"),
+    filename: "generate.js",
+  },
+  mode: "development",
+};
diff --git a/webpack.config.js b/config/webpack.config.js
similarity index 68%
rename from webpack.config.js
rename to config/webpack.config.js
index 1770d3808688ca110829f8a4e263ba2b411df5d1..f3ddc7387a52bf283d30ca0da901516bb7550644 100644
--- a/webpack.config.js
+++ b/config/webpack.config.js
@@ -1,14 +1,14 @@
 const path = require("path");
-const webpack = require("webpack");
-const TerserPlugin = require("terser-webpack-plugin");
+const baseConfig = require("./webpack.config.base");
 
 const libraryName = "MathBox";
 const PATHS = {
-  entryPoint: path.resolve(__dirname, "src/index.js"),
-  bundles: path.resolve(__dirname, "dist"),
+  entryPoint: path.resolve(__dirname, "../src/index.js"),
+  bundles: path.resolve(__dirname, "../build"),
 };
 
 const config = {
+  ...baseConfig,
   entry: {
     "mathbox-bundle": [PATHS.entryPoint],
     "mathbox.min": [PATHS.entryPoint],
@@ -48,32 +48,6 @@ const config = {
     library: libraryName,
     umdNamedDefine: true,
   },
-  resolve: {
-    extensions: [
-      // '.ts',
-      ".js",
-    ],
-    fallback: {
-      stream: require.resolve("stream-browserify"),
-    },
-  },
-  plugins: [
-    new webpack.ProvidePlugin({
-      Buffer: ["buffer", "Buffer"],
-      process: "process/browser",
-    }),
-  ],
-  // Activate source maps for the bundles in order to preserve the original
-  // source when the user debugs the application
-  devtool: "source-map",
-  optimization: {
-    minimize: true,
-    minimizer: [
-      new TerserPlugin({
-        test: /\.min\.js$/,
-      }),
-    ],
-  },
 };
 
 module.exports = config;
diff --git a/config/webpack.config.testing.js b/config/webpack.config.testing.js
new file mode 100644
index 0000000000000000000000000000000000000000..2c4a1a8c29d838d3c30c6c544a98a6079cc4eb8f
--- /dev/null
+++ b/config/webpack.config.testing.js
@@ -0,0 +1,12 @@
+const { resolve } = require("path");
+const baseConfig = require("./webpack.config.base");
+
+module.exports = {
+  entry: resolve(__dirname, "../test/test_entrypoint.js"),
+  output: {
+    path: resolve(__dirname, "../build_testing"),
+    filename: "spec_bundle.js",
+  },
+  mode: "development",
+  ...baseConfig,
+};
diff --git a/docs/primitives.md b/docs/primitives.md
index 22847049ac8d016fd49395469924680fa169ab31..72a47295f3df8434a81447d2e549197b6c73732d 100644
--- a/docs/primitives.md
+++ b/docs/primitives.md
@@ -218,6 +218,7 @@
  * *start* = `true` (bool) - Draw start arrow
  * *stroke* = `"solid"` (stroke) - Line stroke (solid, dotted, dashed)
  * *visible* = `true` (bool) - Visibility for rendering
+ * *width* = `2` (positive number) - Line width
  * *zBias* = `-1` (positive number) - Z-Bias (3D stacking)
  * *zIndex* = `0` (positive int) - Z-Index (2D stacking)
  * *zOrder* = `null` (nullable number) - Z-Order (drawing order), e.g. `2`
@@ -347,9 +348,9 @@
  * *points* = `<` (select) - Points data source
  * *proximity* = `null` (nullable number) - Proximity threshold, e.g. `10`
  * *shaded* = `false` (bool) - Shade mesh
- * *size* = `2` (positive number) - Line width
  * *stroke* = `"solid"` (stroke) - Line stroke (solid, dotted, dashed)
  * *visible* = `true` (bool) - Visibility for rendering
+ * *width* = `2` (positive number) - Line width
  * *zBias* = `0` (positive number) - Z-Bias (3D stacking)
  * *zIndex* = `0` (positive int) - Z-Index (2D stacking)
  * *zOrder* = `null` (nullable number) - Z-Order (drawing order), e.g. `2`
@@ -424,13 +425,13 @@
  * *proximity* = `null` (nullable number) - Proximity threshold, e.g. `10`
  * *rangeX* = `[-1, 1]` (vec2) - Range on axis
  * *rangeY* = `[-1, 1]` (vec2) - Range on axis
- * *size* = `2` (positive number) - Line width
  * *startX* = `true` (bool) - Include start
  * *startY* = `true` (bool) - Include start
  * *stroke* = `"solid"` (stroke) - Line stroke (solid, dotted, dashed)
  * *unitX* = `1` (number) - Reference unit
  * *unitY* = `1` (number) - Reference unit
  * *visible* = `true` (bool) - Visibility for rendering
+ * *width* = `1` (positive number) - Line width
  * *zBias* = `-2` (positive number) - Z-Bias (3D stacking)
  * *zIndex* = `0` (positive int) - Z-Index (2D stacking)
  * *zOrder* = `null` (nullable number) - Z-Order (drawing order), e.g. `2`
@@ -607,6 +608,7 @@
  * *start* = `true` (bool) - Draw start arrow
  * *stroke* = `"solid"` (stroke) - Line stroke (solid, dotted, dashed)
  * *visible* = `true` (bool) - Visibility for rendering
+ * *width* = `2` (positive number) - Line width
  * *zBias* = `0` (positive number) - Z-Bias (3D stacking)
  * *zIndex* = `0` (positive int) - Z-Index (2D stacking)
  * *zOrder* = `null` (nullable number) - Z-Order (drawing order), e.g. `2`
@@ -1049,9 +1051,9 @@
  * *points* = `<` (select) - Points data source
  * *proximity* = `null` (nullable number) - Proximity threshold, e.g. `10`
  * *shaded* = `false` (bool) - Shade mesh
- * *size* = `2` (positive number) - Line width
  * *stroke* = `"solid"` (stroke) - Line stroke (solid, dotted, dashed)
  * *visible* = `true` (bool) - Visibility for rendering
+ * *width* = `2` (positive number) - Line width
  * *zBias* = `0` (positive number) - Z-Bias (3D stacking)
  * *zIndex* = `0` (positive int) - Z-Index (2D stacking)
  * *zOrder* = `null` (nullable number) - Z-Order (drawing order), e.g. `2`
@@ -1095,9 +1097,9 @@
  * *points* = `<` (select) - Points data source
  * *proximity* = `null` (nullable number) - Proximity threshold, e.g. `10`
  * *shaded* = `false` (bool) - Shade mesh
- * *size* = `2` (positive number) - Line width
  * *stroke* = `"solid"` (stroke) - Line stroke (solid, dotted, dashed)
  * *visible* = `true` (bool) - Visibility for rendering
+ * *width* = `2` (positive number) - Line width
  * *zBias* = `0` (positive number) - Z-Bias (3D stacking)
  * *zIndex* = `0` (positive int) - Z-Index (2D stacking)
  * *zOrder* = `null` (nullable number) - Z-Order (drawing order), e.g. `2`
@@ -1165,6 +1167,7 @@
  * *size* = `10` (number) - Tick size
  * *stroke* = `"solid"` (stroke) - Line stroke (solid, dotted, dashed)
  * *visible* = `true` (bool) - Visibility for rendering
+ * *width* = `2` (positive number) - Line width
  * *zBias* = `0` (positive number) - Z-Bias (3D stacking)
  * *zIndex* = `0` (positive int) - Z-Index (2D stacking)
  * *zOrder* = `null` (nullable number) - Z-Order (drawing order), e.g. `2`
@@ -1234,6 +1237,7 @@
  * *start* = `true` (bool) - Draw start arrow
  * *stroke* = `"solid"` (stroke) - Line stroke (solid, dotted, dashed)
  * *visible* = `true` (bool) - Visibility for rendering
+ * *width* = `2` (positive number) - Line width
  * *zBias* = `0` (positive number) - Z-Bias (3D stacking)
  * *zIndex* = `0` (positive int) - Z-Index (2D stacking)
  * *zOrder* = `null` (nullable number) - Z-Order (drawing order), e.g. `2`
diff --git a/gulpfile.js b/gulpfile.js
index e49e069cd907d683b512fa15ce0f2a08d2cfc7e6..19175c6693d9bbede9847882175050195b3b1a21 100644
--- a/gulpfile.js
+++ b/gulpfile.js
@@ -1,17 +1,10 @@
 const gulp = require("gulp");
-const eslint = require("gulp-eslint");
 const concat = require("gulp-concat");
 const compiler = require("webpack");
 const webpack = require("webpack-stream");
 const watch = require("gulp-watch");
-const shell = require("gulp-shell");
-const jsify = require("./vendor/gulp-jsify");
-const karma = require("karma");
 
-const parseConfig = karma.config.parseConfig;
-const KarmaServer = karma.Server;
-
-const webpackConfig = require("./webpack.config.js");
+const webpackConfig = require("./config/webpack.config.js");
 
 const builds = {
   bundle: "build/mathbox.js",
@@ -20,89 +13,30 @@ const builds = {
 
 const css = ["node_modules/shadergraph/build/*.css", "src/**/*.css"];
 
-const glsls = ["src/shaders/glsl/**/*.glsl"];
-
 const files = ["src/**/*.js"];
 
-const source = files.concat(glsls).concat(css);
-
-const test = builds.bundle.concat(["test/**/*.spec.js"]);
-
-gulp.task("glsl", function () {
-  return gulp
-    .src(glsls)
-    .pipe(jsify("shaders.js", "module.exports"))
-    .pipe(gulp.dest("./build/"));
-});
+const source = files.concat(css);
 
 gulp.task("pack", function () {
-  return gulp
-    .src("src/index.js")
-    .pipe(
-      webpack(webpackConfig, compiler, function (_err, _stats) {
-        /* Use stats to do more things if needed */
-      })
-    )
-    .pipe(gulp.dest("build/"));
+  return webpack(webpackConfig, compiler, function (_err, _stats) {
+    /* Use stats to do more things if needed */
+  }).pipe(gulp.dest("build/"));
 });
 
 gulp.task("css", function () {
   return gulp.src(css).pipe(concat(builds.css)).pipe(gulp.dest("./"));
 });
 
-gulp.task("lint", function () {
-  return (
-    gulp
-      // Define the source files
-      .src("src/**/*.js")
-      .pipe(eslint({}))
-      // Output the results in the console
-      .pipe(eslint.format())
-  );
-});
-
-gulp.task("karma", function (done) {
-  parseConfig(
-    __dirname + "/karma.conf.js",
-    { files: test, singleRun: true },
-    { promiseConfig: true, throwErrors: true }
-  ).then(
-    (karmaConfig) => {
-      new KarmaServer(karmaConfig, done).start();
-    },
-    (_rejectReason) => {}
-  );
-});
-
-gulp.task("watch-karma", function () {
-  return gulp.src(test).pipe(
-    karma({
-      configFile: "karma.conf.js",
-      action: "watch",
-    })
-  );
-});
-
 gulp.task("watch-build-watch", function () {
   watch(source, gulp.series("build"));
 });
 
 // Main tasks
 
-const buildTask = gulp.series("glsl", "pack", "css");
+const buildTask = gulp.series("pack", "css");
 
 gulp.task("default", buildTask);
 
 gulp.task("build", buildTask);
 
-gulp.task("test", gulp.series("build", "karma"));
-
-// TODO fix!
-gulp.task(
-  "docs",
-  shell.task(["node src/docs/generate.js > docs/primitives.md"])
-);
-
 gulp.task("watch-build", gulp.series("build", "watch-build-watch"));
-
-gulp.task("watch", gulp.series("watch-build", "watch-karma"));
diff --git a/karma.conf.js b/karma.conf.js
index a6152aba3145921d87e3106a13545a66be73898b..cc0227a671bc7f03896801bd6a5e96abd34b93d3 100644
--- a/karma.conf.js
+++ b/karma.conf.js
@@ -1,65 +1,17 @@
-// Karma configuration
-// Generated on Wed Jan 22 2014 23:58:15 GMT-0800 (PST)
-
-module.exports = function(config) {
+module.exports = function (config) {
   config.set({
-
-    // base path, that will be used to resolve files and exclude
-    basePath: '',
-
-    // frameworks to use
-    frameworks: ['jasmine'],
-
-    // list of files / patterns to load in the browser
+    browsers: ["Chrome"],
     files: [
-      // Defined by gulp
+      "./build_testing/spec_bundle.js",
+      "node_modules/shadergraph/build/*.css",
+      "./src/splash.css",
     ],
-
-
-    // list of files to exclude
-    exclude: [
-    ],
-
-
-    // test results reporter to use
-    // possible values: 'dots', 'progress', 'junit', 'growl', 'coverage'
-    reporters: ['progress'],
-
-
-    // web server port
-    port: 9876,
-
-
-    // enable / disable colors in the output (reporters and logs)
-    colors: true,
-
-
-    // level of logging
-    // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
-    logLevel: config.LOG_INFO,
-
-
-    // enable / disable watching file and executing tests whenever any file changes
+    frameworks: ["jasmine"],
     autoWatch: true,
-
-
-    // Start these browsers, currently available:
-    // - Chrome
-    // - ChromeCanary
-    // - Firefox
-    // - Opera (has to be installed with `npm install karma-opera-launcher`)
-    // - Safari (only Mac; has to be installed with `npm install karma-safari-launcher`)
-    // - PhantomJS
-    // - IE (only Windows; has to be installed with `npm install karma-ie-launcher`)
-    browsers: ['Chrome'],
-
-
+    singleRun: false,
+    reporters: ["progress"],
+    port: 9876,
     // If browser does not capture in given timeout [ms], kill it
     captureTimeout: 60000,
-
-
-    // Continuous Integration mode
-    // if true, it capture browsers, run tests and exit
-    singleRun: true
   });
 };
diff --git a/package-lock.json b/package-lock.json
index 51b76cf6dc7e65adc8306647043a1ab300d67d2b..e0c1c47c04d530a6733fa6dfb23adf9be8b963c2 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,33 +1,32 @@
 {
   "name": "mathbox",
-  "version": "2.0.0",
+  "version": "2.1.1-dev",
   "lockfileVersion": 2,
   "requires": true,
   "packages": {
     "": {
-      "version": "2.0.0",
+      "name": "mathbox",
+      "version": "2.1.1-dev",
       "license": "MIT",
       "dependencies": {
-        "cssauron": "^1.4.0",
-        "shadergraph": "^2.1.0",
-        "threestrap": "^0.3.0"
+        "css-select": "^4.2.1",
+        "shadergraph": "^2.1.3",
+        "threestrap": "^0.4.1"
       },
       "devDependencies": {
+        "concurrently": "^7.0.0",
         "eslint": "^7.28.0",
         "eslint-plugin-jasmine": "^4.1.2",
         "gulp": "^4.0.2",
         "gulp-concat": "^2.6.1",
         "gulp-eslint": "^6.0.0",
-        "gulp-jsify": "file:./vendor/gulp-jsify",
         "gulp-rename": "^2.0.0",
-        "gulp-shell": "^0.8.0",
         "gulp-watch": "^5.0.1",
         "jasmine-core": "^3.7.1",
         "karma": "^6.3.3",
         "karma-chrome-launcher": "^3.1.0",
         "karma-jasmine": "^4.0.1",
         "prettier": "2.3.1",
-        "stream-browserify": "^2.0.2",
         "webpack": "^5.38.1",
         "webpack-cli": "^4.7.2",
         "webpack-stream": "^6.1.2"
@@ -36,55 +35,31 @@
         "three": ">=0.118.0"
       }
     },
-    "../shadergraph": {
-      "version": "2.1.0",
-      "license": "MIT",
-      "dependencies": {
-        "glsl-parser": "^2.0.1",
-        "glsl-tokenizer": "^2.1.5"
-      },
-      "devDependencies": {
-        "eslint": "^7.28.0",
-        "eslint-plugin-jasmine": "^4.1.2",
-        "gulp": "^4.0.2",
-        "gulp-concat": "^2.6.1",
-        "gulp-eslint": "^6.0.0",
-        "gulp-watch": "^5.0.1",
-        "jasmine-core": "^3.7.1",
-        "karma": "^6.3.3",
-        "karma-chrome-launcher": "^3.1.0",
-        "karma-jasmine": "^4.0.1",
-        "prettier": "2.3.1",
-        "webpack": "^5.38.1",
-        "webpack-cli": "^4.7.2",
-        "webpack-stream": "^6.1.2"
-      },
-      "peerDependencies": {
-        "three": ">= 0.72.0"
-      }
-    },
-    "../shadergraph/node_modules/@babel/code-frame": {
+    "node_modules/@babel/code-frame": {
       "version": "7.12.11",
+      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
+      "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "@babel/highlight": "^7.10.4"
       }
     },
-    "../shadergraph/node_modules/@babel/helper-validator-identifier": {
-      "version": "7.14.5",
+    "node_modules/@babel/helper-validator-identifier": {
+      "version": "7.16.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz",
+      "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=6.9.0"
       }
     },
-    "../shadergraph/node_modules/@babel/highlight": {
-      "version": "7.14.5",
+    "node_modules/@babel/highlight": {
+      "version": "7.16.10",
+      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz",
+      "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "@babel/helper-validator-identifier": "^7.14.5",
+        "@babel/helper-validator-identifier": "^7.16.7",
         "chalk": "^2.0.0",
         "js-tokens": "^4.0.0"
       },
@@ -92,10 +67,11 @@
         "node": ">=6.9.0"
       }
     },
-    "../shadergraph/node_modules/@babel/highlight/node_modules/ansi-styles": {
+    "node_modules/@babel/highlight/node_modules/ansi-styles": {
       "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "color-convert": "^1.9.0"
       },
@@ -103,10 +79,11 @@
         "node": ">=4"
       }
     },
-    "../shadergraph/node_modules/@babel/highlight/node_modules/chalk": {
+    "node_modules/@babel/highlight/node_modules/chalk": {
       "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "ansi-styles": "^3.2.1",
         "escape-string-regexp": "^1.0.5",
@@ -116,39 +93,44 @@
         "node": ">=4"
       }
     },
-    "../shadergraph/node_modules/@babel/highlight/node_modules/color-convert": {
+    "node_modules/@babel/highlight/node_modules/color-convert": {
       "version": "1.9.3",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "color-name": "1.1.3"
       }
     },
-    "../shadergraph/node_modules/@babel/highlight/node_modules/color-name": {
+    "node_modules/@babel/highlight/node_modules/color-name": {
       "version": "1.1.3",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+      "dev": true
     },
-    "../shadergraph/node_modules/@babel/highlight/node_modules/escape-string-regexp": {
+    "node_modules/@babel/highlight/node_modules/escape-string-regexp": {
       "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.8.0"
       }
     },
-    "../shadergraph/node_modules/@babel/highlight/node_modules/has-flag": {
+    "node_modules/@babel/highlight/node_modules/has-flag": {
       "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=4"
       }
     },
-    "../shadergraph/node_modules/@babel/highlight/node_modules/supports-color": {
+    "node_modules/@babel/highlight/node_modules/supports-color": {
       "version": "5.5.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "has-flag": "^3.0.0"
       },
@@ -156,18 +138,20 @@
         "node": ">=4"
       }
     },
-    "../shadergraph/node_modules/@discoveryjs/json-ext": {
-      "version": "0.5.3",
+    "node_modules/@discoveryjs/json-ext": {
+      "version": "0.5.6",
+      "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz",
+      "integrity": "sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=10.0.0"
       }
     },
-    "../shadergraph/node_modules/@eslint/eslintrc": {
-      "version": "0.4.2",
+    "node_modules/@eslint/eslintrc": {
+      "version": "0.4.3",
+      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz",
+      "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "ajv": "^6.12.4",
         "debug": "^4.1.1",
@@ -183,241 +167,309 @@
         "node": "^10.12.0 || >=12.0.0"
       }
     },
-    "../shadergraph/node_modules/@types/component-emitter": {
-      "version": "1.2.10",
+    "node_modules/@humanwhocodes/config-array": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz",
+      "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==",
       "dev": true,
-      "license": "MIT"
+      "dependencies": {
+        "@humanwhocodes/object-schema": "^1.2.0",
+        "debug": "^4.1.1",
+        "minimatch": "^3.0.4"
+      },
+      "engines": {
+        "node": ">=10.10.0"
+      }
     },
-    "../shadergraph/node_modules/@types/cookie": {
-      "version": "0.4.0",
-      "dev": true,
-      "license": "MIT"
+    "node_modules/@humanwhocodes/object-schema": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
+      "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
+      "dev": true
+    },
+    "node_modules/@sicmutils/glsl-parser": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/@sicmutils/glsl-parser/-/glsl-parser-2.0.1.tgz",
+      "integrity": "sha512-svY++7/9A7oYE/BJtURM+Y77uvVWZ+PXfKuzZmbiQSWgBJRChUU3AHt8QXmmt4GFIXeVHV1zuSwjYpluU2WjXQ==",
+      "dependencies": {
+        "glsl-tokenizer": "^2.1.4"
+      }
     },
-    "../shadergraph/node_modules/@types/cors": {
-      "version": "2.8.10",
+    "node_modules/@socket.io/base64-arraybuffer": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/@socket.io/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz",
+      "integrity": "sha512-dOlCBKnDw4iShaIsH/bxujKTM18+2TOAsYz+KSc11Am38H4q5Xw8Bbz97ZYdrVNM+um3p7w86Bvvmcn9q+5+eQ==",
       "dev": true,
-      "license": "MIT"
+      "engines": {
+        "node": ">= 0.6.0"
+      }
+    },
+    "node_modules/@types/component-emitter": {
+      "version": "1.2.11",
+      "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz",
+      "integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==",
+      "dev": true
+    },
+    "node_modules/@types/cookie": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz",
+      "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==",
+      "dev": true
+    },
+    "node_modules/@types/cors": {
+      "version": "2.8.12",
+      "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz",
+      "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==",
+      "dev": true
     },
-    "../shadergraph/node_modules/@types/eslint": {
-      "version": "7.2.13",
+    "node_modules/@types/eslint": {
+      "version": "8.4.1",
+      "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.1.tgz",
+      "integrity": "sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "@types/estree": "*",
         "@types/json-schema": "*"
       }
     },
-    "../shadergraph/node_modules/@types/eslint-scope": {
-      "version": "3.7.0",
+    "node_modules/@types/eslint-scope": {
+      "version": "3.7.3",
+      "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz",
+      "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "@types/eslint": "*",
         "@types/estree": "*"
       }
     },
-    "../shadergraph/node_modules/@types/estree": {
-      "version": "0.0.47",
-      "dev": true,
-      "license": "MIT"
+    "node_modules/@types/estree": {
+      "version": "0.0.51",
+      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz",
+      "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==",
+      "dev": true
     },
-    "../shadergraph/node_modules/@types/json-schema": {
-      "version": "7.0.7",
-      "dev": true,
-      "license": "MIT"
+    "node_modules/@types/json-schema": {
+      "version": "7.0.9",
+      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz",
+      "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==",
+      "dev": true
     },
-    "../shadergraph/node_modules/@types/node": {
-      "version": "15.12.2",
-      "dev": true,
-      "license": "MIT"
+    "node_modules/@types/node": {
+      "version": "17.0.18",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.18.tgz",
+      "integrity": "sha512-eKj4f/BsN/qcculZiRSujogjvp5O/k4lOW5m35NopjZM/QwLOR075a8pJW5hD+Rtdm2DaCVPENS6KtSQnUD6BA==",
+      "dev": true
     },
-    "../shadergraph/node_modules/@webassemblyjs/ast": {
-      "version": "1.11.0",
+    "node_modules/@webassemblyjs/ast": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz",
+      "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "@webassemblyjs/helper-numbers": "1.11.0",
-        "@webassemblyjs/helper-wasm-bytecode": "1.11.0"
+        "@webassemblyjs/helper-numbers": "1.11.1",
+        "@webassemblyjs/helper-wasm-bytecode": "1.11.1"
       }
     },
-    "../shadergraph/node_modules/@webassemblyjs/floating-point-hex-parser": {
-      "version": "1.11.0",
-      "dev": true,
-      "license": "MIT"
+    "node_modules/@webassemblyjs/floating-point-hex-parser": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz",
+      "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==",
+      "dev": true
     },
-    "../shadergraph/node_modules/@webassemblyjs/helper-api-error": {
-      "version": "1.11.0",
-      "dev": true,
-      "license": "MIT"
+    "node_modules/@webassemblyjs/helper-api-error": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz",
+      "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==",
+      "dev": true
     },
-    "../shadergraph/node_modules/@webassemblyjs/helper-buffer": {
-      "version": "1.11.0",
-      "dev": true,
-      "license": "MIT"
+    "node_modules/@webassemblyjs/helper-buffer": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz",
+      "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==",
+      "dev": true
     },
-    "../shadergraph/node_modules/@webassemblyjs/helper-code-frame": {
+    "node_modules/@webassemblyjs/helper-code-frame": {
       "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz",
+      "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "@webassemblyjs/wast-printer": "1.9.0"
       }
     },
-    "../shadergraph/node_modules/@webassemblyjs/helper-code-frame/node_modules/@webassemblyjs/ast": {
+    "node_modules/@webassemblyjs/helper-code-frame/node_modules/@webassemblyjs/ast": {
       "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz",
+      "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "@webassemblyjs/helper-module-context": "1.9.0",
         "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
         "@webassemblyjs/wast-parser": "1.9.0"
       }
     },
-    "../shadergraph/node_modules/@webassemblyjs/helper-code-frame/node_modules/@webassemblyjs/helper-wasm-bytecode": {
+    "node_modules/@webassemblyjs/helper-code-frame/node_modules/@webassemblyjs/helper-wasm-bytecode": {
       "version": "1.9.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz",
+      "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==",
+      "dev": true
     },
-    "../shadergraph/node_modules/@webassemblyjs/helper-code-frame/node_modules/@webassemblyjs/wast-printer": {
+    "node_modules/@webassemblyjs/helper-code-frame/node_modules/@webassemblyjs/wast-printer": {
       "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz",
+      "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "@webassemblyjs/ast": "1.9.0",
         "@webassemblyjs/wast-parser": "1.9.0",
         "@xtuc/long": "4.2.2"
       }
     },
-    "../shadergraph/node_modules/@webassemblyjs/helper-fsm": {
+    "node_modules/@webassemblyjs/helper-fsm": {
       "version": "1.9.0",
-      "dev": true,
-      "license": "ISC"
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz",
+      "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==",
+      "dev": true
     },
-    "../shadergraph/node_modules/@webassemblyjs/helper-module-context": {
+    "node_modules/@webassemblyjs/helper-module-context": {
       "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz",
+      "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "@webassemblyjs/ast": "1.9.0"
       }
     },
-    "../shadergraph/node_modules/@webassemblyjs/helper-module-context/node_modules/@webassemblyjs/ast": {
+    "node_modules/@webassemblyjs/helper-module-context/node_modules/@webassemblyjs/ast": {
       "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz",
+      "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "@webassemblyjs/helper-module-context": "1.9.0",
         "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
         "@webassemblyjs/wast-parser": "1.9.0"
       }
     },
-    "../shadergraph/node_modules/@webassemblyjs/helper-module-context/node_modules/@webassemblyjs/helper-wasm-bytecode": {
+    "node_modules/@webassemblyjs/helper-module-context/node_modules/@webassemblyjs/helper-wasm-bytecode": {
       "version": "1.9.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz",
+      "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==",
+      "dev": true
     },
-    "../shadergraph/node_modules/@webassemblyjs/helper-numbers": {
-      "version": "1.11.0",
+    "node_modules/@webassemblyjs/helper-numbers": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz",
+      "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "@webassemblyjs/floating-point-hex-parser": "1.11.0",
-        "@webassemblyjs/helper-api-error": "1.11.0",
+        "@webassemblyjs/floating-point-hex-parser": "1.11.1",
+        "@webassemblyjs/helper-api-error": "1.11.1",
         "@xtuc/long": "4.2.2"
       }
     },
-    "../shadergraph/node_modules/@webassemblyjs/helper-wasm-bytecode": {
-      "version": "1.11.0",
-      "dev": true,
-      "license": "MIT"
+    "node_modules/@webassemblyjs/helper-wasm-bytecode": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz",
+      "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==",
+      "dev": true
     },
-    "../shadergraph/node_modules/@webassemblyjs/helper-wasm-section": {
-      "version": "1.11.0",
+    "node_modules/@webassemblyjs/helper-wasm-section": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz",
+      "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "@webassemblyjs/ast": "1.11.0",
-        "@webassemblyjs/helper-buffer": "1.11.0",
-        "@webassemblyjs/helper-wasm-bytecode": "1.11.0",
-        "@webassemblyjs/wasm-gen": "1.11.0"
+        "@webassemblyjs/ast": "1.11.1",
+        "@webassemblyjs/helper-buffer": "1.11.1",
+        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+        "@webassemblyjs/wasm-gen": "1.11.1"
       }
     },
-    "../shadergraph/node_modules/@webassemblyjs/ieee754": {
-      "version": "1.11.0",
+    "node_modules/@webassemblyjs/ieee754": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz",
+      "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "@xtuc/ieee754": "^1.2.0"
       }
     },
-    "../shadergraph/node_modules/@webassemblyjs/leb128": {
-      "version": "1.11.0",
+    "node_modules/@webassemblyjs/leb128": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz",
+      "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==",
       "dev": true,
-      "license": "Apache-2.0",
       "dependencies": {
         "@xtuc/long": "4.2.2"
       }
     },
-    "../shadergraph/node_modules/@webassemblyjs/utf8": {
-      "version": "1.11.0",
-      "dev": true,
-      "license": "MIT"
+    "node_modules/@webassemblyjs/utf8": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz",
+      "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==",
+      "dev": true
     },
-    "../shadergraph/node_modules/@webassemblyjs/wasm-edit": {
-      "version": "1.11.0",
+    "node_modules/@webassemblyjs/wasm-edit": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz",
+      "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "@webassemblyjs/ast": "1.11.0",
-        "@webassemblyjs/helper-buffer": "1.11.0",
-        "@webassemblyjs/helper-wasm-bytecode": "1.11.0",
-        "@webassemblyjs/helper-wasm-section": "1.11.0",
-        "@webassemblyjs/wasm-gen": "1.11.0",
-        "@webassemblyjs/wasm-opt": "1.11.0",
-        "@webassemblyjs/wasm-parser": "1.11.0",
-        "@webassemblyjs/wast-printer": "1.11.0"
+        "@webassemblyjs/ast": "1.11.1",
+        "@webassemblyjs/helper-buffer": "1.11.1",
+        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+        "@webassemblyjs/helper-wasm-section": "1.11.1",
+        "@webassemblyjs/wasm-gen": "1.11.1",
+        "@webassemblyjs/wasm-opt": "1.11.1",
+        "@webassemblyjs/wasm-parser": "1.11.1",
+        "@webassemblyjs/wast-printer": "1.11.1"
       }
     },
-    "../shadergraph/node_modules/@webassemblyjs/wasm-gen": {
-      "version": "1.11.0",
+    "node_modules/@webassemblyjs/wasm-gen": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz",
+      "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "@webassemblyjs/ast": "1.11.0",
-        "@webassemblyjs/helper-wasm-bytecode": "1.11.0",
-        "@webassemblyjs/ieee754": "1.11.0",
-        "@webassemblyjs/leb128": "1.11.0",
-        "@webassemblyjs/utf8": "1.11.0"
+        "@webassemblyjs/ast": "1.11.1",
+        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+        "@webassemblyjs/ieee754": "1.11.1",
+        "@webassemblyjs/leb128": "1.11.1",
+        "@webassemblyjs/utf8": "1.11.1"
       }
     },
-    "../shadergraph/node_modules/@webassemblyjs/wasm-opt": {
-      "version": "1.11.0",
+    "node_modules/@webassemblyjs/wasm-opt": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz",
+      "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "@webassemblyjs/ast": "1.11.0",
-        "@webassemblyjs/helper-buffer": "1.11.0",
-        "@webassemblyjs/wasm-gen": "1.11.0",
-        "@webassemblyjs/wasm-parser": "1.11.0"
+        "@webassemblyjs/ast": "1.11.1",
+        "@webassemblyjs/helper-buffer": "1.11.1",
+        "@webassemblyjs/wasm-gen": "1.11.1",
+        "@webassemblyjs/wasm-parser": "1.11.1"
       }
     },
-    "../shadergraph/node_modules/@webassemblyjs/wasm-parser": {
-      "version": "1.11.0",
+    "node_modules/@webassemblyjs/wasm-parser": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz",
+      "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "@webassemblyjs/ast": "1.11.0",
-        "@webassemblyjs/helper-api-error": "1.11.0",
-        "@webassemblyjs/helper-wasm-bytecode": "1.11.0",
-        "@webassemblyjs/ieee754": "1.11.0",
-        "@webassemblyjs/leb128": "1.11.0",
-        "@webassemblyjs/utf8": "1.11.0"
+        "@webassemblyjs/ast": "1.11.1",
+        "@webassemblyjs/helper-api-error": "1.11.1",
+        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+        "@webassemblyjs/ieee754": "1.11.1",
+        "@webassemblyjs/leb128": "1.11.1",
+        "@webassemblyjs/utf8": "1.11.1"
       }
     },
-    "../shadergraph/node_modules/@webassemblyjs/wast-parser": {
+    "node_modules/@webassemblyjs/wast-parser": {
       "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz",
+      "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "@webassemblyjs/ast": "1.9.0",
         "@webassemblyjs/floating-point-hex-parser": "1.9.0",
@@ -427,53 +479,60 @@
         "@xtuc/long": "4.2.2"
       }
     },
-    "../shadergraph/node_modules/@webassemblyjs/wast-parser/node_modules/@webassemblyjs/ast": {
+    "node_modules/@webassemblyjs/wast-parser/node_modules/@webassemblyjs/ast": {
       "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz",
+      "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "@webassemblyjs/helper-module-context": "1.9.0",
         "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
         "@webassemblyjs/wast-parser": "1.9.0"
       }
     },
-    "../shadergraph/node_modules/@webassemblyjs/wast-parser/node_modules/@webassemblyjs/floating-point-hex-parser": {
+    "node_modules/@webassemblyjs/wast-parser/node_modules/@webassemblyjs/floating-point-hex-parser": {
       "version": "1.9.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz",
+      "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==",
+      "dev": true
     },
-    "../shadergraph/node_modules/@webassemblyjs/wast-parser/node_modules/@webassemblyjs/helper-api-error": {
+    "node_modules/@webassemblyjs/wast-parser/node_modules/@webassemblyjs/helper-api-error": {
       "version": "1.9.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz",
+      "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==",
+      "dev": true
     },
-    "../shadergraph/node_modules/@webassemblyjs/wast-parser/node_modules/@webassemblyjs/helper-wasm-bytecode": {
+    "node_modules/@webassemblyjs/wast-parser/node_modules/@webassemblyjs/helper-wasm-bytecode": {
       "version": "1.9.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz",
+      "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==",
+      "dev": true
     },
-    "../shadergraph/node_modules/@webassemblyjs/wast-printer": {
-      "version": "1.11.0",
+    "node_modules/@webassemblyjs/wast-printer": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz",
+      "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "@webassemblyjs/ast": "1.11.0",
+        "@webassemblyjs/ast": "1.11.1",
         "@xtuc/long": "4.2.2"
       }
     },
-    "../shadergraph/node_modules/@webpack-cli/configtest": {
-      "version": "1.0.4",
+    "node_modules/@webpack-cli/configtest": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.1.tgz",
+      "integrity": "sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg==",
       "dev": true,
-      "license": "MIT",
       "peerDependencies": {
         "webpack": "4.x.x || 5.x.x",
         "webpack-cli": "4.x.x"
       }
     },
-    "../shadergraph/node_modules/@webpack-cli/info": {
-      "version": "1.3.0",
+    "node_modules/@webpack-cli/info": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.1.tgz",
+      "integrity": "sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "envinfo": "^7.7.3"
       },
@@ -481,10 +540,11 @@
         "webpack-cli": "4.x.x"
       }
     },
-    "../shadergraph/node_modules/@webpack-cli/serve": {
-      "version": "1.5.1",
+    "node_modules/@webpack-cli/serve": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.1.tgz",
+      "integrity": "sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw==",
       "dev": true,
-      "license": "MIT",
       "peerDependencies": {
         "webpack-cli": "4.x.x"
       },
@@ -494,32 +554,36 @@
         }
       }
     },
-    "../shadergraph/node_modules/@xtuc/ieee754": {
+    "node_modules/@xtuc/ieee754": {
       "version": "1.2.0",
-      "dev": true,
-      "license": "BSD-3-Clause"
+      "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+      "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
+      "dev": true
     },
-    "../shadergraph/node_modules/@xtuc/long": {
+    "node_modules/@xtuc/long": {
       "version": "4.2.2",
-      "dev": true,
-      "license": "Apache-2.0"
+      "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
+      "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
+      "dev": true
     },
-    "../shadergraph/node_modules/accepts": {
-      "version": "1.3.7",
+    "node_modules/accepts": {
+      "version": "1.3.8",
+      "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
+      "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "mime-types": "~2.1.24",
-        "negotiator": "0.6.2"
+        "mime-types": "~2.1.34",
+        "negotiator": "0.6.3"
       },
       "engines": {
         "node": ">= 0.6"
       }
     },
-    "../shadergraph/node_modules/acorn": {
+    "node_modules/acorn": {
       "version": "7.4.1",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+      "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
       "dev": true,
-      "license": "MIT",
       "bin": {
         "acorn": "bin/acorn"
       },
@@ -527,18 +591,20 @@
         "node": ">=0.4.0"
       }
     },
-    "../shadergraph/node_modules/acorn-jsx": {
-      "version": "5.3.1",
+    "node_modules/acorn-jsx": {
+      "version": "5.3.2",
+      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+      "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
       "dev": true,
-      "license": "MIT",
       "peerDependencies": {
         "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
       }
     },
-    "../shadergraph/node_modules/ajv": {
+    "node_modules/ajv": {
       "version": "6.12.6",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "fast-deep-equal": "^3.1.1",
         "fast-json-stable-stringify": "^2.0.0",
@@ -550,34 +616,38 @@
         "url": "https://github.com/sponsors/epoberezkin"
       }
     },
-    "../shadergraph/node_modules/ajv-errors": {
+    "node_modules/ajv-errors": {
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz",
+      "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==",
       "dev": true,
-      "license": "MIT",
       "peerDependencies": {
         "ajv": ">=5.0.0"
       }
     },
-    "../shadergraph/node_modules/ajv-keywords": {
+    "node_modules/ajv-keywords": {
       "version": "3.5.2",
+      "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+      "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
       "dev": true,
-      "license": "MIT",
       "peerDependencies": {
         "ajv": "^6.9.1"
       }
     },
-    "../shadergraph/node_modules/ansi-colors": {
+    "node_modules/ansi-colors": {
       "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
+      "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=6"
       }
     },
-    "../shadergraph/node_modules/ansi-escapes": {
+    "node_modules/ansi-escapes": {
       "version": "4.3.2",
+      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+      "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "type-fest": "^0.21.3"
       },
@@ -588,10 +658,11 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "../shadergraph/node_modules/ansi-escapes/node_modules/type-fest": {
+    "node_modules/ansi-escapes/node_modules/type-fest": {
       "version": "0.21.3",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+      "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
       "dev": true,
-      "license": "(MIT OR CC0-1.0)",
       "engines": {
         "node": ">=10"
       },
@@ -599,10 +670,11 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "../shadergraph/node_modules/ansi-gray": {
+    "node_modules/ansi-gray": {
       "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz",
+      "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "ansi-wrap": "0.1.0"
       },
@@ -610,18 +682,20 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/ansi-regex": {
-      "version": "5.0.0",
+    "node_modules/ansi-regex": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
     },
-    "../shadergraph/node_modules/ansi-styles": {
+    "node_modules/ansi-styles": {
       "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "color-convert": "^2.0.1"
       },
@@ -632,27 +706,30 @@
         "url": "https://github.com/chalk/ansi-styles?sponsor=1"
       }
     },
-    "../shadergraph/node_modules/ansi-wrap": {
+    "node_modules/ansi-wrap": {
       "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz",
+      "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/anymatch": {
+    "node_modules/anymatch": {
       "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
+      "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
       "dev": true,
-      "license": "ISC",
       "dependencies": {
         "micromatch": "^3.1.4",
         "normalize-path": "^2.1.1"
       }
     },
-    "../shadergraph/node_modules/anymatch/node_modules/normalize-path": {
+    "node_modules/anymatch/node_modules/normalize-path": {
       "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+      "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "remove-trailing-separator": "^1.0.1"
       },
@@ -660,10 +737,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/append-buffer": {
+    "node_modules/append-buffer": {
       "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz",
+      "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "buffer-equal": "^1.0.0"
       },
@@ -671,36 +749,41 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/aproba": {
+    "node_modules/aproba": {
       "version": "1.2.0",
-      "dev": true,
-      "license": "ISC"
+      "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
+      "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
+      "dev": true
     },
-    "../shadergraph/node_modules/archy": {
+    "node_modules/archy": {
       "version": "1.0.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
+      "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=",
+      "dev": true
     },
-    "../shadergraph/node_modules/argparse": {
+    "node_modules/argparse": {
       "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "sprintf-js": "~1.0.2"
       }
     },
-    "../shadergraph/node_modules/arr-diff": {
+    "node_modules/arr-diff": {
       "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+      "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/arr-filter": {
+    "node_modules/arr-filter": {
       "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz",
+      "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "make-iterator": "^1.0.0"
       },
@@ -708,18 +791,20 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/arr-flatten": {
+    "node_modules/arr-flatten": {
       "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+      "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/arr-map": {
+    "node_modules/arr-map": {
       "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz",
+      "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "make-iterator": "^1.0.0"
       },
@@ -727,26 +812,29 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/arr-union": {
+    "node_modules/arr-union": {
       "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+      "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/array-each": {
+    "node_modules/array-each": {
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz",
+      "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/array-initial": {
+    "node_modules/array-initial": {
       "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz",
+      "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "array-slice": "^1.0.0",
         "is-number": "^4.0.0"
@@ -755,18 +843,20 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/array-initial/node_modules/is-number": {
+    "node_modules/array-initial/node_modules/is-number": {
       "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+      "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/array-last": {
+    "node_modules/array-last": {
       "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz",
+      "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-number": "^4.0.0"
       },
@@ -774,26 +864,29 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/array-last/node_modules/is-number": {
+    "node_modules/array-last/node_modules/is-number": {
       "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+      "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/array-slice": {
+    "node_modules/array-slice": {
       "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz",
+      "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/array-sort": {
+    "node_modules/array-sort": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz",
+      "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "default-compare": "^1.0.0",
         "get-value": "^2.0.6",
@@ -803,18 +896,20 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/array-unique": {
+    "node_modules/array-unique": {
       "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+      "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/asn1.js": {
+    "node_modules/asn1.js": {
       "version": "5.4.1",
+      "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz",
+      "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "bn.js": "^4.0.0",
         "inherits": "^2.0.1",
@@ -822,53 +917,60 @@
         "safer-buffer": "^2.1.0"
       }
     },
-    "../shadergraph/node_modules/asn1.js/node_modules/bn.js": {
+    "node_modules/asn1.js/node_modules/bn.js": {
       "version": "4.12.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+      "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+      "dev": true
     },
-    "../shadergraph/node_modules/assert": {
+    "node_modules/assert": {
       "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz",
+      "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "object-assign": "^4.1.1",
         "util": "0.10.3"
       }
     },
-    "../shadergraph/node_modules/assert/node_modules/inherits": {
+    "node_modules/assert/node_modules/inherits": {
       "version": "2.0.1",
-      "dev": true,
-      "license": "ISC"
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
+      "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
+      "dev": true
     },
-    "../shadergraph/node_modules/assert/node_modules/util": {
+    "node_modules/assert/node_modules/util": {
       "version": "0.10.3",
+      "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
+      "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "inherits": "2.0.1"
       }
     },
-    "../shadergraph/node_modules/assign-symbols": {
+    "node_modules/assign-symbols": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+      "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/astral-regex": {
+    "node_modules/astral-regex": {
       "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+      "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
     },
-    "../shadergraph/node_modules/async-done": {
+    "node_modules/async-done": {
       "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz",
+      "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "end-of-stream": "^1.1.0",
         "once": "^1.3.2",
@@ -879,15 +981,17 @@
         "node": ">= 0.10"
       }
     },
-    "../shadergraph/node_modules/async-each": {
+    "node_modules/async-each": {
       "version": "1.0.3",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz",
+      "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==",
+      "dev": true
     },
-    "../shadergraph/node_modules/async-settle": {
+    "node_modules/async-settle": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz",
+      "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "async-done": "^1.2.2"
       },
@@ -895,10 +999,11 @@
         "node": ">= 0.10"
       }
     },
-    "../shadergraph/node_modules/atob": {
+    "node_modules/atob": {
       "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
+      "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
       "dev": true,
-      "license": "(MIT OR Apache-2.0)",
       "bin": {
         "atob": "bin/atob.js"
       },
@@ -906,10 +1011,11 @@
         "node": ">= 4.5.0"
       }
     },
-    "../shadergraph/node_modules/bach": {
+    "node_modules/bach": {
       "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz",
+      "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "arr-filter": "^1.1.1",
         "arr-flatten": "^1.0.1",
@@ -925,15 +1031,17 @@
         "node": ">= 0.10"
       }
     },
-    "../shadergraph/node_modules/balanced-match": {
+    "node_modules/balanced-match": {
       "version": "1.0.2",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+      "dev": true
     },
-    "../shadergraph/node_modules/base": {
+    "node_modules/base": {
       "version": "0.11.2",
+      "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+      "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "cache-base": "^1.0.1",
         "class-utils": "^0.3.5",
@@ -947,10 +1055,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/base/node_modules/define-property": {
+    "node_modules/base/node_modules/define-property": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+      "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-descriptor": "^1.0.0"
       },
@@ -958,15 +1067,10 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/base64-arraybuffer": {
-      "version": "0.1.4",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.6.0"
-      }
-    },
-    "../shadergraph/node_modules/base64-js": {
+    "node_modules/base64-js": {
       "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+      "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
       "dev": true,
       "funding": [
         {
@@ -981,98 +1085,113 @@
           "type": "consulting",
           "url": "https://feross.org/support"
         }
-      ],
-      "license": "MIT"
+      ]
     },
-    "../shadergraph/node_modules/base64id": {
+    "node_modules/base64id": {
       "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
+      "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": "^4.5.0 || >= 5.9"
       }
     },
-    "../shadergraph/node_modules/big.js": {
+    "node_modules/big.js": {
       "version": "5.2.2",
+      "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
+      "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": "*"
       }
     },
-    "../shadergraph/node_modules/binary-extensions": {
+    "node_modules/binary-extensions": {
       "version": "1.13.1",
+      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
+      "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/bindings": {
+    "node_modules/bindings": {
       "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
+      "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
       "dev": true,
-      "license": "MIT",
       "optional": true,
       "dependencies": {
         "file-uri-to-path": "1.0.0"
       }
     },
-    "../shadergraph/node_modules/bluebird": {
+    "node_modules/bluebird": {
       "version": "3.7.2",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+      "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+      "dev": true
     },
-    "../shadergraph/node_modules/bn.js": {
+    "node_modules/bn.js": {
       "version": "5.2.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz",
+      "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==",
+      "dev": true
     },
-    "../shadergraph/node_modules/body-parser": {
-      "version": "1.19.0",
+    "node_modules/body-parser": {
+      "version": "1.19.2",
+      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz",
+      "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "bytes": "3.1.0",
+        "bytes": "3.1.2",
         "content-type": "~1.0.4",
         "debug": "2.6.9",
         "depd": "~1.1.2",
-        "http-errors": "1.7.2",
+        "http-errors": "1.8.1",
         "iconv-lite": "0.4.24",
         "on-finished": "~2.3.0",
-        "qs": "6.7.0",
-        "raw-body": "2.4.0",
-        "type-is": "~1.6.17"
+        "qs": "6.9.7",
+        "raw-body": "2.4.3",
+        "type-is": "~1.6.18"
       },
       "engines": {
         "node": ">= 0.8"
       }
     },
-    "../shadergraph/node_modules/body-parser/node_modules/debug": {
+    "node_modules/body-parser/node_modules/debug": {
       "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "ms": "2.0.0"
       }
     },
-    "../shadergraph/node_modules/body-parser/node_modules/ms": {
+    "node_modules/body-parser/node_modules/ms": {
       "version": "2.0.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+      "dev": true
+    },
+    "node_modules/boolbase": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+      "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24="
     },
-    "../shadergraph/node_modules/brace-expansion": {
+    "node_modules/brace-expansion": {
       "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "balanced-match": "^1.0.0",
         "concat-map": "0.0.1"
       }
     },
-    "../shadergraph/node_modules/braces": {
+    "node_modules/braces": {
       "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+      "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "arr-flatten": "^1.1.0",
         "array-unique": "^0.3.2",
@@ -1089,15 +1208,17 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/brorand": {
+    "node_modules/brorand": {
       "version": "1.1.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
+      "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=",
+      "dev": true
     },
-    "../shadergraph/node_modules/browserify-aes": {
+    "node_modules/browserify-aes": {
       "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
+      "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "buffer-xor": "^1.0.3",
         "cipher-base": "^1.0.0",
@@ -1107,20 +1228,22 @@
         "safe-buffer": "^5.0.1"
       }
     },
-    "../shadergraph/node_modules/browserify-cipher": {
+    "node_modules/browserify-cipher": {
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
+      "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "browserify-aes": "^1.0.4",
         "browserify-des": "^1.0.0",
         "evp_bytestokey": "^1.0.0"
       }
     },
-    "../shadergraph/node_modules/browserify-des": {
+    "node_modules/browserify-des": {
       "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
+      "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "cipher-base": "^1.0.1",
         "des.js": "^1.0.0",
@@ -1128,19 +1251,21 @@
         "safe-buffer": "^5.1.2"
       }
     },
-    "../shadergraph/node_modules/browserify-rsa": {
+    "node_modules/browserify-rsa": {
       "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz",
+      "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "bn.js": "^5.0.0",
         "randombytes": "^2.0.1"
       }
     },
-    "../shadergraph/node_modules/browserify-sign": {
+    "node_modules/browserify-sign": {
       "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz",
+      "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==",
       "dev": true,
-      "license": "ISC",
       "dependencies": {
         "bn.js": "^5.1.1",
         "browserify-rsa": "^4.0.1",
@@ -1153,10 +1278,11 @@
         "safe-buffer": "^5.2.0"
       }
     },
-    "../shadergraph/node_modules/browserify-sign/node_modules/readable-stream": {
+    "node_modules/browserify-sign/node_modules/readable-stream": {
       "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+      "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "inherits": "^2.0.3",
         "string_decoder": "^1.1.1",
@@ -1166,8 +1292,10 @@
         "node": ">= 6"
       }
     },
-    "../shadergraph/node_modules/browserify-sign/node_modules/safe-buffer": {
+    "node_modules/browserify-sign/node_modules/safe-buffer": {
       "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
       "dev": true,
       "funding": [
         {
@@ -1182,27 +1310,28 @@
           "type": "consulting",
           "url": "https://feross.org/support"
         }
-      ],
-      "license": "MIT"
+      ]
     },
-    "../shadergraph/node_modules/browserify-zlib": {
+    "node_modules/browserify-zlib": {
       "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
+      "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "pako": "~1.0.5"
       }
     },
-    "../shadergraph/node_modules/browserslist": {
-      "version": "4.16.6",
+    "node_modules/browserslist": {
+      "version": "4.19.1",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz",
+      "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "caniuse-lite": "^1.0.30001219",
-        "colorette": "^1.2.2",
-        "electron-to-chromium": "^1.3.723",
+        "caniuse-lite": "^1.0.30001286",
+        "electron-to-chromium": "^1.4.17",
         "escalade": "^3.1.1",
-        "node-releases": "^1.1.71"
+        "node-releases": "^2.0.1",
+        "picocolors": "^1.0.0"
       },
       "bin": {
         "browserslist": "cli.js"
@@ -1215,51 +1344,58 @@
         "url": "https://opencollective.com/browserslist"
       }
     },
-    "../shadergraph/node_modules/buffer": {
+    "node_modules/buffer": {
       "version": "4.9.2",
+      "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz",
+      "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "base64-js": "^1.0.2",
         "ieee754": "^1.1.4",
         "isarray": "^1.0.0"
       }
     },
-    "../shadergraph/node_modules/buffer-equal": {
+    "node_modules/buffer-equal": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz",
+      "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.4.0"
       }
     },
-    "../shadergraph/node_modules/buffer-from": {
-      "version": "1.1.1",
-      "dev": true,
-      "license": "MIT"
+    "node_modules/buffer-from": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+      "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+      "dev": true
     },
-    "../shadergraph/node_modules/buffer-xor": {
+    "node_modules/buffer-xor": {
       "version": "1.0.3",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
+      "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=",
+      "dev": true
     },
-    "../shadergraph/node_modules/builtin-status-codes": {
+    "node_modules/builtin-status-codes": {
       "version": "3.0.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
+      "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=",
+      "dev": true
     },
-    "../shadergraph/node_modules/bytes": {
-      "version": "3.1.0",
+    "node_modules/bytes": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+      "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">= 0.8"
       }
     },
-    "../shadergraph/node_modules/cacache": {
+    "node_modules/cacache": {
       "version": "12.0.4",
+      "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz",
+      "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==",
       "dev": true,
-      "license": "ISC",
       "dependencies": {
         "bluebird": "^3.5.5",
         "chownr": "^1.1.1",
@@ -1278,18 +1414,20 @@
         "y18n": "^4.0.0"
       }
     },
-    "../shadergraph/node_modules/cacache/node_modules/lru-cache": {
+    "node_modules/cacache/node_modules/lru-cache": {
       "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+      "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
       "dev": true,
-      "license": "ISC",
       "dependencies": {
         "yallist": "^3.0.2"
       }
     },
-    "../shadergraph/node_modules/cacache/node_modules/rimraf": {
+    "node_modules/cacache/node_modules/rimraf": {
       "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+      "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
       "dev": true,
-      "license": "ISC",
       "dependencies": {
         "glob": "^7.1.3"
       },
@@ -1297,20 +1435,23 @@
         "rimraf": "bin.js"
       }
     },
-    "../shadergraph/node_modules/cacache/node_modules/y18n": {
+    "node_modules/cacache/node_modules/y18n": {
       "version": "4.0.3",
-      "dev": true,
-      "license": "ISC"
+      "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
+      "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
+      "dev": true
     },
-    "../shadergraph/node_modules/cacache/node_modules/yallist": {
+    "node_modules/cacache/node_modules/yallist": {
       "version": "3.1.1",
-      "dev": true,
-      "license": "ISC"
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+      "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+      "dev": true
     },
-    "../shadergraph/node_modules/cache-base": {
+    "node_modules/cache-base": {
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+      "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "collection-visit": "^1.0.0",
         "component-emitter": "^1.2.1",
@@ -1326,10 +1467,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/call-bind": {
+    "node_modules/call-bind": {
       "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+      "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "function-bind": "^1.1.1",
         "get-intrinsic": "^1.0.2"
@@ -1338,35 +1480,39 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "../shadergraph/node_modules/callsites": {
+    "node_modules/callsites": {
       "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=6"
       }
     },
-    "../shadergraph/node_modules/camelcase": {
+    "node_modules/camelcase": {
       "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
+      "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/caniuse-lite": {
-      "version": "1.0.30001237",
+    "node_modules/caniuse-lite": {
+      "version": "1.0.30001312",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz",
+      "integrity": "sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ==",
       "dev": true,
-      "license": "CC-BY-4.0",
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/browserslist"
       }
     },
-    "../shadergraph/node_modules/chalk": {
-      "version": "4.1.1",
+    "node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "ansi-styles": "^4.1.0",
         "supports-color": "^7.1.0"
@@ -1378,15 +1524,18 @@
         "url": "https://github.com/chalk/chalk?sponsor=1"
       }
     },
-    "../shadergraph/node_modules/chardet": {
+    "node_modules/chardet": {
       "version": "0.7.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
+      "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
+      "dev": true
     },
-    "../shadergraph/node_modules/chokidar": {
+    "node_modules/chokidar": {
       "version": "2.1.8",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
+      "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
+      "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "anymatch": "^2.0.0",
         "async-each": "^1.0.1",
@@ -1404,19 +1553,21 @@
         "fsevents": "^1.2.7"
       }
     },
-    "../shadergraph/node_modules/chokidar/node_modules/glob-parent": {
+    "node_modules/chokidar/node_modules/glob-parent": {
       "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+      "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
       "dev": true,
-      "license": "ISC",
       "dependencies": {
         "is-glob": "^3.1.0",
         "path-dirname": "^1.0.0"
       }
     },
-    "../shadergraph/node_modules/chokidar/node_modules/glob-parent/node_modules/is-glob": {
+    "node_modules/chokidar/node_modules/glob-parent/node_modules/is-glob": {
       "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+      "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-extglob": "^2.1.0"
       },
@@ -1424,32 +1575,36 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/chownr": {
+    "node_modules/chownr": {
       "version": "1.1.4",
-      "dev": true,
-      "license": "ISC"
+      "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
+      "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
+      "dev": true
     },
-    "../shadergraph/node_modules/chrome-trace-event": {
+    "node_modules/chrome-trace-event": {
       "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
+      "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=6.0"
       }
     },
-    "../shadergraph/node_modules/cipher-base": {
+    "node_modules/cipher-base": {
       "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
+      "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "inherits": "^2.0.1",
         "safe-buffer": "^5.0.1"
       }
     },
-    "../shadergraph/node_modules/class-utils": {
+    "node_modules/class-utils": {
       "version": "0.3.6",
+      "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+      "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "arr-union": "^3.1.0",
         "define-property": "^0.2.5",
@@ -1460,10 +1615,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/class-utils/node_modules/define-property": {
+    "node_modules/class-utils/node_modules/define-property": {
       "version": "0.2.5",
+      "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+      "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-descriptor": "^0.1.0"
       },
@@ -1471,10 +1627,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/class-utils/node_modules/is-accessor-descriptor": {
+    "node_modules/class-utils/node_modules/is-accessor-descriptor": {
       "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+      "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "kind-of": "^3.0.2"
       },
@@ -1482,10 +1639,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": {
+    "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": {
       "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-buffer": "^1.1.5"
       },
@@ -1493,10 +1651,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/class-utils/node_modules/is-data-descriptor": {
+    "node_modules/class-utils/node_modules/is-data-descriptor": {
       "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+      "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "kind-of": "^3.0.2"
       },
@@ -1504,10 +1663,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": {
+    "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": {
       "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-buffer": "^1.1.5"
       },
@@ -1515,10 +1675,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/class-utils/node_modules/is-descriptor": {
+    "node_modules/class-utils/node_modules/is-descriptor": {
       "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+      "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-accessor-descriptor": "^0.1.6",
         "is-data-descriptor": "^0.1.4",
@@ -1528,10 +1689,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/cli-cursor": {
+    "node_modules/cli-cursor": {
       "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
+      "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "restore-cursor": "^3.1.0"
       },
@@ -1539,36 +1701,40 @@
         "node": ">=8"
       }
     },
-    "../shadergraph/node_modules/cli-width": {
+    "node_modules/cli-width": {
       "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz",
+      "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==",
       "dev": true,
-      "license": "ISC",
       "engines": {
         "node": ">= 10"
       }
     },
-    "../shadergraph/node_modules/cliui": {
+    "node_modules/cliui": {
       "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
+      "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
       "dev": true,
-      "license": "ISC",
       "dependencies": {
         "string-width": "^1.0.1",
         "strip-ansi": "^3.0.1",
         "wrap-ansi": "^2.0.0"
       }
     },
-    "../shadergraph/node_modules/cliui/node_modules/ansi-regex": {
+    "node_modules/cliui/node_modules/ansi-regex": {
       "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+      "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/cliui/node_modules/is-fullwidth-code-point": {
+    "node_modules/cliui/node_modules/is-fullwidth-code-point": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+      "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "number-is-nan": "^1.0.0"
       },
@@ -1576,10 +1742,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/cliui/node_modules/string-width": {
+    "node_modules/cliui/node_modules/string-width": {
       "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+      "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "code-point-at": "^1.0.0",
         "is-fullwidth-code-point": "^1.0.0",
@@ -1589,10 +1756,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/cliui/node_modules/strip-ansi": {
+    "node_modules/cliui/node_modules/strip-ansi": {
       "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+      "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "ansi-regex": "^2.0.0"
       },
@@ -1600,26 +1768,29 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/clone": {
+    "node_modules/clone": {
       "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+      "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.8"
       }
     },
-    "../shadergraph/node_modules/clone-buffer": {
+    "node_modules/clone-buffer": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz",
+      "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">= 0.10"
       }
     },
-    "../shadergraph/node_modules/clone-deep": {
+    "node_modules/clone-deep": {
       "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
+      "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-plain-object": "^2.0.4",
         "kind-of": "^6.0.2",
@@ -1629,10 +1800,11 @@
         "node": ">=6"
       }
     },
-    "../shadergraph/node_modules/clone-deep/node_modules/is-plain-object": {
+    "node_modules/clone-deep/node_modules/is-plain-object": {
       "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "isobject": "^3.0.1"
       },
@@ -1640,41 +1812,46 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/clone-deep/node_modules/kind-of": {
+    "node_modules/clone-deep/node_modules/kind-of": {
       "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/clone-stats": {
+    "node_modules/clone-stats": {
       "version": "1.0.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
+      "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=",
+      "dev": true
     },
-    "../shadergraph/node_modules/cloneable-readable": {
+    "node_modules/cloneable-readable": {
       "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz",
+      "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "inherits": "^2.0.1",
         "process-nextick-args": "^2.0.0",
         "readable-stream": "^2.3.5"
       }
     },
-    "../shadergraph/node_modules/code-point-at": {
+    "node_modules/code-point-at": {
       "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
+      "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/collection-map": {
+    "node_modules/collection-map": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz",
+      "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "arr-map": "^2.0.2",
         "for-own": "^1.0.0",
@@ -1684,10 +1861,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/collection-visit": {
+    "node_modules/collection-visit": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+      "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "map-visit": "^1.0.0",
         "object-visit": "^1.0.0"
@@ -1696,10 +1874,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/color-convert": {
+    "node_modules/color-convert": {
       "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "color-name": "~1.1.4"
       },
@@ -1707,59 +1886,71 @@
         "node": ">=7.0.0"
       }
     },
-    "../shadergraph/node_modules/color-name": {
+    "node_modules/color-name": {
       "version": "1.1.4",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+      "dev": true
     },
-    "../shadergraph/node_modules/color-support": {
+    "node_modules/color-support": {
       "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
+      "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
       "dev": true,
-      "license": "ISC",
       "bin": {
         "color-support": "bin.js"
       }
     },
-    "../shadergraph/node_modules/colorette": {
-      "version": "1.2.2",
-      "dev": true,
-      "license": "MIT"
+    "node_modules/colorette": {
+      "version": "2.0.16",
+      "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz",
+      "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==",
+      "dev": true
     },
-    "../shadergraph/node_modules/colors": {
+    "node_modules/colors": {
       "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
+      "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.1.90"
       }
     },
-    "../shadergraph/node_modules/commander": {
-      "version": "2.20.3",
+    "node_modules/commander": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+      "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
       "dev": true,
-      "license": "MIT"
+      "engines": {
+        "node": ">= 10"
+      }
     },
-    "../shadergraph/node_modules/commondir": {
+    "node_modules/commondir": {
       "version": "1.0.1",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+      "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
+      "dev": true
     },
-    "../shadergraph/node_modules/component-emitter": {
+    "node_modules/component-emitter": {
       "version": "1.3.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
+      "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
+      "dev": true
     },
-    "../shadergraph/node_modules/concat-map": {
+    "node_modules/concat-map": {
       "version": "0.0.1",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+      "dev": true
     },
-    "../shadergraph/node_modules/concat-stream": {
+    "node_modules/concat-stream": {
       "version": "1.6.2",
+      "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+      "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
       "dev": true,
       "engines": [
         "node >= 0.8"
       ],
-      "license": "MIT",
       "dependencies": {
         "buffer-from": "^1.0.0",
         "inherits": "^2.0.3",
@@ -1767,18 +1958,130 @@
         "typedarray": "^0.0.6"
       }
     },
-    "../shadergraph/node_modules/concat-with-sourcemaps": {
+    "node_modules/concat-with-sourcemaps": {
       "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz",
+      "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==",
       "dev": true,
-      "license": "ISC",
       "dependencies": {
         "source-map": "^0.6.1"
       }
     },
-    "../shadergraph/node_modules/connect": {
+    "node_modules/concurrently": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.0.0.tgz",
+      "integrity": "sha512-WKM7PUsI8wyXpF80H+zjHP32fsgsHNQfPLw/e70Z5dYkV7hF+rf8q3D+ScWJIEr57CpkO3OWBko6hwhQLPR8Pw==",
+      "dev": true,
+      "dependencies": {
+        "chalk": "^4.1.0",
+        "date-fns": "^2.16.1",
+        "lodash": "^4.17.21",
+        "rxjs": "^6.6.3",
+        "spawn-command": "^0.0.2-1",
+        "supports-color": "^8.1.0",
+        "tree-kill": "^1.2.2",
+        "yargs": "^16.2.0"
+      },
+      "bin": {
+        "concurrently": "dist/bin/concurrently.js"
+      },
+      "engines": {
+        "node": "^12.20.0 || ^14.13.0 || >=16.0.0"
+      }
+    },
+    "node_modules/concurrently/node_modules/cliui": {
+      "version": "7.0.4",
+      "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+      "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+      "dev": true,
+      "dependencies": {
+        "string-width": "^4.2.0",
+        "strip-ansi": "^6.0.0",
+        "wrap-ansi": "^7.0.0"
+      }
+    },
+    "node_modules/concurrently/node_modules/get-caller-file": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+      "dev": true,
+      "engines": {
+        "node": "6.* || 8.* || >= 10.*"
+      }
+    },
+    "node_modules/concurrently/node_modules/supports-color": {
+      "version": "8.1.1",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+      "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+      "dev": true,
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/supports-color?sponsor=1"
+      }
+    },
+    "node_modules/concurrently/node_modules/wrap-ansi": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+      "dev": true,
+      "dependencies": {
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+      }
+    },
+    "node_modules/concurrently/node_modules/y18n": {
+      "version": "5.0.8",
+      "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+      "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/concurrently/node_modules/yargs": {
+      "version": "16.2.0",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+      "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+      "dev": true,
+      "dependencies": {
+        "cliui": "^7.0.2",
+        "escalade": "^3.1.1",
+        "get-caller-file": "^2.0.5",
+        "require-directory": "^2.1.1",
+        "string-width": "^4.2.0",
+        "y18n": "^5.0.5",
+        "yargs-parser": "^20.2.2"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/concurrently/node_modules/yargs-parser": {
+      "version": "20.2.9",
+      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+      "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/connect": {
       "version": "3.7.0",
+      "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz",
+      "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "debug": "2.6.9",
         "finalhandler": "1.1.2",
@@ -1789,56 +2092,65 @@
         "node": ">= 0.10.0"
       }
     },
-    "../shadergraph/node_modules/connect/node_modules/debug": {
+    "node_modules/connect/node_modules/debug": {
       "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "ms": "2.0.0"
       }
     },
-    "../shadergraph/node_modules/connect/node_modules/ms": {
+    "node_modules/connect/node_modules/ms": {
       "version": "2.0.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+      "dev": true
     },
-    "../shadergraph/node_modules/console-browserify": {
+    "node_modules/console-browserify": {
       "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz",
+      "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==",
       "dev": true
     },
-    "../shadergraph/node_modules/constants-browserify": {
+    "node_modules/constants-browserify": {
       "version": "1.0.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
+      "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
+      "dev": true
     },
-    "../shadergraph/node_modules/content-type": {
+    "node_modules/content-type": {
       "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
+      "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">= 0.6"
       }
     },
-    "../shadergraph/node_modules/convert-source-map": {
-      "version": "1.7.0",
+    "node_modules/convert-source-map": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz",
+      "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "safe-buffer": "~5.1.1"
       }
     },
-    "../shadergraph/node_modules/cookie": {
-      "version": "0.4.1",
+    "node_modules/cookie": {
+      "version": "0.4.2",
+      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
+      "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">= 0.6"
       }
     },
-    "../shadergraph/node_modules/copy-concurrently": {
+    "node_modules/copy-concurrently": {
       "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz",
+      "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==",
       "dev": true,
-      "license": "ISC",
       "dependencies": {
         "aproba": "^1.1.1",
         "fs-write-stream-atomic": "^1.0.8",
@@ -1848,10 +2160,11 @@
         "run-queue": "^1.0.0"
       }
     },
-    "../shadergraph/node_modules/copy-concurrently/node_modules/rimraf": {
+    "node_modules/copy-concurrently/node_modules/rimraf": {
       "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+      "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
       "dev": true,
-      "license": "ISC",
       "dependencies": {
         "glob": "^7.1.3"
       },
@@ -1859,31 +2172,35 @@
         "rimraf": "bin.js"
       }
     },
-    "../shadergraph/node_modules/copy-descriptor": {
+    "node_modules/copy-descriptor": {
       "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+      "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/copy-props": {
+    "node_modules/copy-props": {
       "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.5.tgz",
+      "integrity": "sha512-XBlx8HSqrT0ObQwmSzM7WE5k8FxTV75h1DX1Z3n6NhQ/UYYAvInWYmG06vFt7hQZArE2fuO62aihiWIVQwh1sw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "each-props": "^1.3.2",
         "is-plain-object": "^5.0.0"
       }
     },
-    "../shadergraph/node_modules/core-util-is": {
-      "version": "1.0.2",
-      "license": "MIT"
+    "node_modules/core-util-is": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+      "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
     },
-    "../shadergraph/node_modules/cors": {
+    "node_modules/cors": {
       "version": "2.8.5",
+      "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
+      "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "object-assign": "^4",
         "vary": "^1"
@@ -1892,24 +2209,27 @@
         "node": ">= 0.10"
       }
     },
-    "../shadergraph/node_modules/create-ecdh": {
+    "node_modules/create-ecdh": {
       "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz",
+      "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "bn.js": "^4.1.0",
         "elliptic": "^6.5.3"
       }
     },
-    "../shadergraph/node_modules/create-ecdh/node_modules/bn.js": {
+    "node_modules/create-ecdh/node_modules/bn.js": {
       "version": "4.12.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+      "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+      "dev": true
     },
-    "../shadergraph/node_modules/create-hash": {
+    "node_modules/create-hash": {
       "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
+      "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "cipher-base": "^1.0.1",
         "inherits": "^2.0.1",
@@ -1918,10 +2238,11 @@
         "sha.js": "^2.4.0"
       }
     },
-    "../shadergraph/node_modules/create-hmac": {
+    "node_modules/create-hmac": {
       "version": "1.1.7",
+      "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
+      "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "cipher-base": "^1.0.3",
         "create-hash": "^1.1.0",
@@ -1931,10 +2252,11 @@
         "sha.js": "^2.4.8"
       }
     },
-    "../shadergraph/node_modules/cross-spawn": {
+    "node_modules/cross-spawn": {
       "version": "7.0.3",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+      "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "path-key": "^3.1.0",
         "shebang-command": "^2.0.0",
@@ -1944,10 +2266,11 @@
         "node": ">= 8"
       }
     },
-    "../shadergraph/node_modules/crypto-browserify": {
+    "node_modules/crypto-browserify": {
       "version": "3.12.0",
+      "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
+      "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "browserify-cipher": "^1.0.0",
         "browserify-sign": "^4.0.0",
@@ -1965,37 +2288,81 @@
         "node": "*"
       }
     },
-    "../shadergraph/node_modules/custom-event": {
+    "node_modules/css-select": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz",
+      "integrity": "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==",
+      "dependencies": {
+        "boolbase": "^1.0.0",
+        "css-what": "^5.1.0",
+        "domhandler": "^4.3.0",
+        "domutils": "^2.8.0",
+        "nth-check": "^2.0.1"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/fb55"
+      }
+    },
+    "node_modules/css-what": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz",
+      "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==",
+      "engines": {
+        "node": ">= 6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/fb55"
+      }
+    },
+    "node_modules/custom-event": {
       "version": "1.0.1",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz",
+      "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=",
+      "dev": true
     },
-    "../shadergraph/node_modules/cyclist": {
+    "node_modules/cyclist": {
       "version": "1.0.1",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz",
+      "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=",
+      "dev": true
     },
-    "../shadergraph/node_modules/d": {
+    "node_modules/d": {
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
+      "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
       "dev": true,
-      "license": "ISC",
       "dependencies": {
         "es5-ext": "^0.10.50",
         "type": "^1.0.1"
       }
     },
-    "../shadergraph/node_modules/date-format": {
-      "version": "3.0.0",
+    "node_modules/date-fns": {
+      "version": "2.28.0",
+      "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.28.0.tgz",
+      "integrity": "sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.11"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/date-fns"
+      }
+    },
+    "node_modules/date-format": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.3.tgz",
+      "integrity": "sha512-7P3FyqDcfeznLZp2b+OMitV9Sz2lUnsT87WaTat9nVwqsBkTzPG3lPLNwW3en6F4pHUiWzr6vb8CLhjdK9bcxQ==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=4.0"
       }
     },
-    "../shadergraph/node_modules/debug": {
-      "version": "4.3.1",
+    "node_modules/debug": {
+      "version": "4.3.3",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
+      "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "ms": "2.1.2"
       },
@@ -2008,31 +2375,35 @@
         }
       }
     },
-    "../shadergraph/node_modules/decamelize": {
+    "node_modules/decamelize": {
       "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/decode-uri-component": {
+    "node_modules/decode-uri-component": {
       "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+      "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10"
       }
     },
-    "../shadergraph/node_modules/deep-is": {
-      "version": "0.1.3",
-      "dev": true,
-      "license": "MIT"
+    "node_modules/deep-is": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+      "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+      "dev": true
     },
-    "../shadergraph/node_modules/default-compare": {
+    "node_modules/default-compare": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz",
+      "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "kind-of": "^5.0.2"
       },
@@ -2040,18 +2411,20 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/default-resolution": {
+    "node_modules/default-resolution": {
       "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz",
+      "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">= 0.10"
       }
     },
-    "../shadergraph/node_modules/define-properties": {
+    "node_modules/define-properties": {
       "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+      "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "object-keys": "^1.0.12"
       },
@@ -2059,10 +2432,11 @@
         "node": ">= 0.4"
       }
     },
-    "../shadergraph/node_modules/define-property": {
+    "node_modules/define-property": {
       "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+      "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-descriptor": "^1.0.2",
         "isobject": "^3.0.1"
@@ -2071,55 +2445,62 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/depd": {
+    "node_modules/depd": {
       "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+      "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">= 0.6"
       }
     },
-    "../shadergraph/node_modules/des.js": {
+    "node_modules/des.js": {
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz",
+      "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "inherits": "^2.0.1",
         "minimalistic-assert": "^1.0.0"
       }
     },
-    "../shadergraph/node_modules/detect-file": {
+    "node_modules/detect-file": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
+      "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/di": {
+    "node_modules/di": {
       "version": "0.0.1",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz",
+      "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=",
+      "dev": true
     },
-    "../shadergraph/node_modules/diffie-hellman": {
+    "node_modules/diffie-hellman": {
       "version": "5.0.3",
+      "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
+      "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "bn.js": "^4.1.0",
         "miller-rabin": "^4.0.0",
         "randombytes": "^2.0.0"
       }
     },
-    "../shadergraph/node_modules/diffie-hellman/node_modules/bn.js": {
+    "node_modules/diffie-hellman/node_modules/bn.js": {
       "version": "4.12.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+      "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+      "dev": true
     },
-    "../shadergraph/node_modules/doctrine": {
+    "node_modules/doctrine": {
       "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+      "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
       "dev": true,
-      "license": "Apache-2.0",
       "dependencies": {
         "esutils": "^2.0.2"
       },
@@ -2127,10 +2508,11 @@
         "node": ">=6.0.0"
       }
     },
-    "../shadergraph/node_modules/dom-serialize": {
+    "node_modules/dom-serialize": {
       "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz",
+      "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "custom-event": "~1.0.0",
         "ent": "~2.2.0",
@@ -2138,39 +2520,94 @@
         "void-elements": "^2.0.0"
       }
     },
-    "../shadergraph/node_modules/domain-browser": {
+    "node_modules/dom-serializer": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz",
+      "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==",
+      "dependencies": {
+        "domelementtype": "^2.0.1",
+        "domhandler": "^4.2.0",
+        "entities": "^2.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+      }
+    },
+    "node_modules/domain-browser": {
       "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
+      "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.4",
         "npm": ">=1.2"
       }
     },
-    "../shadergraph/node_modules/duplexify": {
-      "version": "3.7.1",
-      "dev": true,
-      "license": "MIT",
+    "node_modules/domelementtype": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz",
+      "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/fb55"
+        }
+      ]
+    },
+    "node_modules/domhandler": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz",
+      "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==",
       "dependencies": {
-        "end-of-stream": "^1.0.0",
-        "inherits": "^2.0.1",
-        "readable-stream": "^2.0.0",
-        "stream-shift": "^1.0.0"
+        "domelementtype": "^2.2.0"
+      },
+      "engines": {
+        "node": ">= 4"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/domhandler?sponsor=1"
       }
     },
-    "../shadergraph/node_modules/each-props": {
-      "version": "1.3.2",
+    "node_modules/domutils": {
+      "version": "2.8.0",
+      "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
+      "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
+      "dependencies": {
+        "dom-serializer": "^1.0.1",
+        "domelementtype": "^2.2.0",
+        "domhandler": "^4.2.0"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/domutils?sponsor=1"
+      }
+    },
+    "node_modules/duplexify": {
+      "version": "3.7.1",
+      "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz",
+      "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==",
+      "dev": true,
+      "dependencies": {
+        "end-of-stream": "^1.0.0",
+        "inherits": "^2.0.1",
+        "readable-stream": "^2.0.0",
+        "stream-shift": "^1.0.0"
+      }
+    },
+    "node_modules/each-props": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz",
+      "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-plain-object": "^2.0.1",
         "object.defaults": "^1.1.0"
       }
     },
-    "../shadergraph/node_modules/each-props/node_modules/is-plain-object": {
+    "node_modules/each-props/node_modules/is-plain-object": {
       "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "isobject": "^3.0.1"
       },
@@ -2178,20 +2615,23 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/ee-first": {
+    "node_modules/ee-first": {
       "version": "1.1.1",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+      "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
+      "dev": true
     },
-    "../shadergraph/node_modules/electron-to-chromium": {
-      "version": "1.3.752",
-      "dev": true,
-      "license": "ISC"
+    "node_modules/electron-to-chromium": {
+      "version": "1.4.71",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.71.tgz",
+      "integrity": "sha512-Hk61vXXKRb2cd3znPE9F+2pLWdIOmP7GjiTj45y6L3W/lO+hSnUSUhq+6lEaERWBdZOHbk2s3YV5c9xVl3boVw==",
+      "dev": true
     },
-    "../shadergraph/node_modules/elliptic": {
+    "node_modules/elliptic": {
       "version": "6.5.4",
+      "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz",
+      "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "bn.js": "^4.11.9",
         "brorand": "^1.1.0",
@@ -2202,72 +2642,83 @@
         "minimalistic-crypto-utils": "^1.0.1"
       }
     },
-    "../shadergraph/node_modules/elliptic/node_modules/bn.js": {
+    "node_modules/elliptic/node_modules/bn.js": {
       "version": "4.12.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+      "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+      "dev": true
     },
-    "../shadergraph/node_modules/emoji-regex": {
+    "node_modules/emoji-regex": {
       "version": "8.0.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+      "dev": true
     },
-    "../shadergraph/node_modules/emojis-list": {
+    "node_modules/emojis-list": {
       "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+      "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">= 4"
       }
     },
-    "../shadergraph/node_modules/encodeurl": {
+    "node_modules/encodeurl": {
       "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+      "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">= 0.8"
       }
     },
-    "../shadergraph/node_modules/end-of-stream": {
+    "node_modules/end-of-stream": {
       "version": "1.4.4",
+      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+      "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "once": "^1.4.0"
       }
     },
-    "../shadergraph/node_modules/engine.io": {
-      "version": "4.1.1",
+    "node_modules/engine.io": {
+      "version": "6.1.2",
+      "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.1.2.tgz",
+      "integrity": "sha512-v/7eGHxPvO2AWsksyx2PUsQvBafuvqs0jJJQ0FdmJG1b9qIvgSbqDRGwNhfk2XHaTTbTXiC4quRE8Q9nRjsrQQ==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
+        "@types/cookie": "^0.4.1",
+        "@types/cors": "^2.8.12",
+        "@types/node": ">=10.0.0",
         "accepts": "~1.3.4",
         "base64id": "2.0.0",
         "cookie": "~0.4.1",
         "cors": "~2.8.5",
         "debug": "~4.3.1",
-        "engine.io-parser": "~4.0.0",
-        "ws": "~7.4.2"
+        "engine.io-parser": "~5.0.0",
+        "ws": "~8.2.3"
       },
       "engines": {
         "node": ">=10.0.0"
       }
     },
-    "../shadergraph/node_modules/engine.io-parser": {
-      "version": "4.0.2",
+    "node_modules/engine.io-parser": {
+      "version": "5.0.3",
+      "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.3.tgz",
+      "integrity": "sha512-BtQxwF27XUNnSafQLvDi0dQ8s3i6VgzSoQMJacpIcGNrlUdfHSKbgm3jmjCVvQluGzqwujQMPAoMai3oYSTurg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "base64-arraybuffer": "0.1.4"
+        "@socket.io/base64-arraybuffer": "~1.0.2"
       },
       "engines": {
-        "node": ">=8.0.0"
+        "node": ">=10.0.0"
       }
     },
-    "../shadergraph/node_modules/enhanced-resolve": {
-      "version": "5.8.2",
+    "node_modules/enhanced-resolve": {
+      "version": "5.9.0",
+      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.0.tgz",
+      "integrity": "sha512-weDYmzbBygL7HzGGS26M3hGQx68vehdEg6VUmqSOaFzXExFqlnKuSvsEJCVGQHScS8CQMbrAqftT+AzzHNt/YA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "graceful-fs": "^4.2.4",
         "tapable": "^2.2.0"
@@ -2276,10 +2727,11 @@
         "node": ">=10.13.0"
       }
     },
-    "../shadergraph/node_modules/enquirer": {
+    "node_modules/enquirer": {
       "version": "2.3.6",
+      "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
+      "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "ansi-colors": "^4.1.1"
       },
@@ -2287,15 +2739,25 @@
         "node": ">=8.6"
       }
     },
-    "../shadergraph/node_modules/ent": {
+    "node_modules/ent": {
       "version": "2.2.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz",
+      "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=",
+      "dev": true
+    },
+    "node_modules/entities": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
+      "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
+      "funding": {
+        "url": "https://github.com/fb55/entities?sponsor=1"
+      }
     },
-    "../shadergraph/node_modules/envinfo": {
+    "node_modules/envinfo": {
       "version": "7.8.1",
+      "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz",
+      "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==",
       "dev": true,
-      "license": "MIT",
       "bin": {
         "envinfo": "dist/cli.js"
       },
@@ -2303,10 +2765,11 @@
         "node": ">=4"
       }
     },
-    "../shadergraph/node_modules/errno": {
+    "node_modules/errno": {
       "version": "0.1.8",
+      "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
+      "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "prr": "~1.0.1"
       },
@@ -2314,52 +2777,58 @@
         "errno": "cli.js"
       }
     },
-    "../shadergraph/node_modules/error-ex": {
+    "node_modules/error-ex": {
       "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+      "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-arrayish": "^0.2.1"
       }
     },
-    "../shadergraph/node_modules/es-module-lexer": {
-      "version": "0.4.1",
-      "dev": true,
-      "license": "MIT"
+    "node_modules/es-module-lexer": {
+      "version": "0.9.3",
+      "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz",
+      "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==",
+      "dev": true
     },
-    "../shadergraph/node_modules/es5-ext": {
+    "node_modules/es5-ext": {
       "version": "0.10.53",
+      "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz",
+      "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==",
       "dev": true,
-      "license": "ISC",
       "dependencies": {
         "es6-iterator": "~2.0.3",
         "es6-symbol": "~3.1.3",
         "next-tick": "~1.0.0"
       }
     },
-    "../shadergraph/node_modules/es6-iterator": {
+    "node_modules/es6-iterator": {
       "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
+      "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "d": "1",
         "es5-ext": "^0.10.35",
         "es6-symbol": "^3.1.1"
       }
     },
-    "../shadergraph/node_modules/es6-symbol": {
+    "node_modules/es6-symbol": {
       "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz",
+      "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
       "dev": true,
-      "license": "ISC",
       "dependencies": {
         "d": "^1.0.1",
         "ext": "^1.1.2"
       }
     },
-    "../shadergraph/node_modules/es6-weak-map": {
+    "node_modules/es6-weak-map": {
       "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz",
+      "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==",
       "dev": true,
-      "license": "ISC",
       "dependencies": {
         "d": "1",
         "es5-ext": "^0.10.46",
@@ -2367,23 +2836,26 @@
         "es6-symbol": "^3.1.1"
       }
     },
-    "../shadergraph/node_modules/escalade": {
+    "node_modules/escalade": {
       "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+      "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=6"
       }
     },
-    "../shadergraph/node_modules/escape-html": {
+    "node_modules/escape-html": {
       "version": "1.0.3",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
+      "dev": true
     },
-    "../shadergraph/node_modules/escape-string-regexp": {
+    "node_modules/escape-string-regexp": {
       "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+      "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=10"
       },
@@ -2391,13 +2863,15 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "../shadergraph/node_modules/eslint": {
-      "version": "7.28.0",
+    "node_modules/eslint": {
+      "version": "7.32.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz",
+      "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "@babel/code-frame": "7.12.11",
-        "@eslint/eslintrc": "^0.4.2",
+        "@eslint/eslintrc": "^0.4.3",
+        "@humanwhocodes/config-array": "^0.5.0",
         "ajv": "^6.10.0",
         "chalk": "^4.0.0",
         "cross-spawn": "^7.0.2",
@@ -2446,19 +2920,21 @@
         "url": "https://opencollective.com/eslint"
       }
     },
-    "../shadergraph/node_modules/eslint-plugin-jasmine": {
-      "version": "4.1.2",
+    "node_modules/eslint-plugin-jasmine": {
+      "version": "4.1.3",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-jasmine/-/eslint-plugin-jasmine-4.1.3.tgz",
+      "integrity": "sha512-q8j8KnLH/4uwmPELFZvEyfEcuCuGxXScJaRdqHjOjz064GcfX6aoFbzy5VohZ5QYk2+WvoqMoqDSb9nRLf89GQ==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=8",
         "npm": ">=6"
       }
     },
-    "../shadergraph/node_modules/eslint-scope": {
+    "node_modules/eslint-scope": {
       "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+      "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
       "dev": true,
-      "license": "BSD-2-Clause",
       "dependencies": {
         "esrecurse": "^4.3.0",
         "estraverse": "^4.1.1"
@@ -2467,10 +2943,11 @@
         "node": ">=8.0.0"
       }
     },
-    "../shadergraph/node_modules/eslint-utils": {
+    "node_modules/eslint-utils": {
       "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
+      "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "eslint-visitor-keys": "^1.1.0"
       },
@@ -2481,26 +2958,29 @@
         "url": "https://github.com/sponsors/mysticatea"
       }
     },
-    "../shadergraph/node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
+    "node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
       "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+      "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
       "dev": true,
-      "license": "Apache-2.0",
       "engines": {
         "node": ">=4"
       }
     },
-    "../shadergraph/node_modules/eslint-visitor-keys": {
+    "node_modules/eslint-visitor-keys": {
       "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+      "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
       "dev": true,
-      "license": "Apache-2.0",
       "engines": {
         "node": ">=10"
       }
     },
-    "../shadergraph/node_modules/espree": {
+    "node_modules/espree": {
       "version": "7.3.1",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz",
+      "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==",
       "dev": true,
-      "license": "BSD-2-Clause",
       "dependencies": {
         "acorn": "^7.4.0",
         "acorn-jsx": "^5.3.1",
@@ -2510,18 +2990,20 @@
         "node": "^10.12.0 || >=12.0.0"
       }
     },
-    "../shadergraph/node_modules/espree/node_modules/eslint-visitor-keys": {
+    "node_modules/espree/node_modules/eslint-visitor-keys": {
       "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+      "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
       "dev": true,
-      "license": "Apache-2.0",
       "engines": {
         "node": ">=4"
       }
     },
-    "../shadergraph/node_modules/esprima": {
+    "node_modules/esprima": {
       "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
       "dev": true,
-      "license": "BSD-2-Clause",
       "bin": {
         "esparse": "bin/esparse.js",
         "esvalidate": "bin/esvalidate.js"
@@ -2530,10 +3012,11 @@
         "node": ">=4"
       }
     },
-    "../shadergraph/node_modules/esquery": {
+    "node_modules/esquery": {
       "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
+      "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
       "dev": true,
-      "license": "BSD-3-Clause",
       "dependencies": {
         "estraverse": "^5.1.0"
       },
@@ -2541,18 +3024,20 @@
         "node": ">=0.10"
       }
     },
-    "../shadergraph/node_modules/esquery/node_modules/estraverse": {
-      "version": "5.2.0",
+    "node_modules/esquery/node_modules/estraverse": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+      "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
       "dev": true,
-      "license": "BSD-2-Clause",
       "engines": {
         "node": ">=4.0"
       }
     },
-    "../shadergraph/node_modules/esrecurse": {
+    "node_modules/esrecurse": {
       "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
       "dev": true,
-      "license": "BSD-2-Clause",
       "dependencies": {
         "estraverse": "^5.2.0"
       },
@@ -2560,56 +3045,63 @@
         "node": ">=4.0"
       }
     },
-    "../shadergraph/node_modules/esrecurse/node_modules/estraverse": {
-      "version": "5.2.0",
+    "node_modules/esrecurse/node_modules/estraverse": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+      "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
       "dev": true,
-      "license": "BSD-2-Clause",
       "engines": {
         "node": ">=4.0"
       }
     },
-    "../shadergraph/node_modules/estraverse": {
+    "node_modules/estraverse": {
       "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+      "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
       "dev": true,
-      "license": "BSD-2-Clause",
       "engines": {
         "node": ">=4.0"
       }
     },
-    "../shadergraph/node_modules/esutils": {
+    "node_modules/esutils": {
       "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
       "dev": true,
-      "license": "BSD-2-Clause",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/eventemitter3": {
+    "node_modules/eventemitter3": {
       "version": "4.0.7",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
+      "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
+      "dev": true
     },
-    "../shadergraph/node_modules/events": {
+    "node_modules/events": {
       "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+      "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.8.x"
       }
     },
-    "../shadergraph/node_modules/evp_bytestokey": {
+    "node_modules/evp_bytestokey": {
       "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
+      "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "md5.js": "^1.3.4",
         "safe-buffer": "^5.1.1"
       }
     },
-    "../shadergraph/node_modules/execa": {
+    "node_modules/execa": {
       "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+      "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "cross-spawn": "^7.0.3",
         "get-stream": "^6.0.0",
@@ -2628,10 +3120,11 @@
         "url": "https://github.com/sindresorhus/execa?sponsor=1"
       }
     },
-    "../shadergraph/node_modules/expand-brackets": {
+    "node_modules/expand-brackets": {
       "version": "2.1.4",
+      "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+      "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "debug": "^2.3.3",
         "define-property": "^0.2.5",
@@ -2645,18 +3138,20 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/expand-brackets/node_modules/debug": {
+    "node_modules/expand-brackets/node_modules/debug": {
       "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "ms": "2.0.0"
       }
     },
-    "../shadergraph/node_modules/expand-brackets/node_modules/define-property": {
+    "node_modules/expand-brackets/node_modules/define-property": {
       "version": "0.2.5",
+      "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+      "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-descriptor": "^0.1.0"
       },
@@ -2664,10 +3159,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/expand-brackets/node_modules/is-accessor-descriptor": {
+    "node_modules/expand-brackets/node_modules/is-accessor-descriptor": {
       "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+      "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "kind-of": "^3.0.2"
       },
@@ -2675,10 +3171,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": {
+    "node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": {
       "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-buffer": "^1.1.5"
       },
@@ -2686,10 +3183,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/expand-brackets/node_modules/is-data-descriptor": {
+    "node_modules/expand-brackets/node_modules/is-data-descriptor": {
       "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+      "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "kind-of": "^3.0.2"
       },
@@ -2697,10 +3195,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": {
+    "node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": {
       "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-buffer": "^1.1.5"
       },
@@ -2708,10 +3207,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/expand-brackets/node_modules/is-descriptor": {
+    "node_modules/expand-brackets/node_modules/is-descriptor": {
       "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+      "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-accessor-descriptor": "^0.1.6",
         "is-data-descriptor": "^0.1.4",
@@ -2721,15 +3221,17 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/expand-brackets/node_modules/ms": {
+    "node_modules/expand-brackets/node_modules/ms": {
       "version": "2.0.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+      "dev": true
     },
-    "../shadergraph/node_modules/expand-range": {
+    "node_modules/expand-range": {
       "version": "1.8.2",
+      "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
+      "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "fill-range": "^2.1.0"
       },
@@ -2737,10 +3239,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/expand-range/node_modules/fill-range": {
+    "node_modules/expand-range/node_modules/fill-range": {
       "version": "2.2.4",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz",
+      "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-number": "^2.1.0",
         "isobject": "^2.0.0",
@@ -2752,10 +3255,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/expand-range/node_modules/is-number": {
+    "node_modules/expand-range/node_modules/is-number": {
       "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
+      "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "kind-of": "^3.0.2"
       },
@@ -2763,10 +3267,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/expand-range/node_modules/isobject": {
+    "node_modules/expand-range/node_modules/isobject": {
       "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+      "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "isarray": "1.0.0"
       },
@@ -2774,10 +3279,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/expand-range/node_modules/kind-of": {
+    "node_modules/expand-range/node_modules/kind-of": {
       "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-buffer": "^1.1.5"
       },
@@ -2785,10 +3291,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/expand-tilde": {
+    "node_modules/expand-tilde": {
       "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
+      "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "homedir-polyfill": "^1.0.1"
       },
@@ -2796,28 +3303,32 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/ext": {
-      "version": "1.4.0",
+    "node_modules/ext": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz",
+      "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==",
       "dev": true,
-      "license": "ISC",
       "dependencies": {
-        "type": "^2.0.0"
+        "type": "^2.5.0"
       }
     },
-    "../shadergraph/node_modules/ext/node_modules/type": {
-      "version": "2.5.0",
-      "dev": true,
-      "license": "ISC"
+    "node_modules/ext/node_modules/type": {
+      "version": "2.6.0",
+      "resolved": "https://registry.npmjs.org/type/-/type-2.6.0.tgz",
+      "integrity": "sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ==",
+      "dev": true
     },
-    "../shadergraph/node_modules/extend": {
+    "node_modules/extend": {
       "version": "3.0.2",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+      "dev": true
     },
-    "../shadergraph/node_modules/extend-shallow": {
+    "node_modules/extend-shallow": {
       "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+      "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-extendable": "^0.1.0"
       },
@@ -2825,10 +3336,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/external-editor": {
+    "node_modules/external-editor": {
       "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
+      "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "chardet": "^0.7.0",
         "iconv-lite": "^0.4.24",
@@ -2838,10 +3350,11 @@
         "node": ">=4"
       }
     },
-    "../shadergraph/node_modules/external-editor/node_modules/tmp": {
+    "node_modules/external-editor/node_modules/tmp": {
       "version": "0.0.33",
+      "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+      "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "os-tmpdir": "~1.0.2"
       },
@@ -2849,10 +3362,11 @@
         "node": ">=0.6.0"
       }
     },
-    "../shadergraph/node_modules/extglob": {
+    "node_modules/extglob": {
       "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+      "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "array-unique": "^0.3.2",
         "define-property": "^1.0.0",
@@ -2867,10 +3381,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/extglob/node_modules/define-property": {
+    "node_modules/extglob/node_modules/define-property": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+      "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-descriptor": "^1.0.0"
       },
@@ -2878,10 +3393,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/fancy-log": {
+    "node_modules/fancy-log": {
       "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz",
+      "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "ansi-gray": "^0.1.1",
         "color-support": "^1.1.3",
@@ -2892,35 +3408,41 @@
         "node": ">= 0.10"
       }
     },
-    "../shadergraph/node_modules/fast-deep-equal": {
+    "node_modules/fast-deep-equal": {
       "version": "3.1.3",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+      "dev": true
     },
-    "../shadergraph/node_modules/fast-json-stable-stringify": {
+    "node_modules/fast-json-stable-stringify": {
       "version": "2.1.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+      "dev": true
     },
-    "../shadergraph/node_modules/fast-levenshtein": {
+    "node_modules/fast-levenshtein": {
       "version": "2.0.6",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+      "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+      "dev": true
     },
-    "../shadergraph/node_modules/fastest-levenshtein": {
+    "node_modules/fastest-levenshtein": {
       "version": "1.0.12",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz",
+      "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==",
+      "dev": true
     },
-    "../shadergraph/node_modules/figgy-pudding": {
+    "node_modules/figgy-pudding": {
       "version": "3.5.2",
-      "dev": true,
-      "license": "ISC"
+      "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz",
+      "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==",
+      "dev": true
     },
-    "../shadergraph/node_modules/figures": {
+    "node_modules/figures": {
       "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
+      "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "escape-string-regexp": "^1.0.5"
       },
@@ -2931,18 +3453,20 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "../shadergraph/node_modules/figures/node_modules/escape-string-regexp": {
+    "node_modules/figures/node_modules/escape-string-regexp": {
       "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.8.0"
       }
     },
-    "../shadergraph/node_modules/file-entry-cache": {
+    "node_modules/file-entry-cache": {
       "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+      "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "flat-cache": "^3.0.4"
       },
@@ -2950,24 +3474,27 @@
         "node": "^10.12.0 || >=12.0.0"
       }
     },
-    "../shadergraph/node_modules/file-uri-to-path": {
+    "node_modules/file-uri-to-path": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
+      "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
       "dev": true,
-      "license": "MIT",
       "optional": true
     },
-    "../shadergraph/node_modules/filename-regex": {
+    "node_modules/filename-regex": {
       "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
+      "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/fill-range": {
+    "node_modules/fill-range": {
       "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+      "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "extend-shallow": "^2.0.1",
         "is-number": "^3.0.0",
@@ -2978,10 +3505,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/finalhandler": {
+    "node_modules/finalhandler": {
       "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
+      "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "debug": "2.6.9",
         "encodeurl": "~1.0.2",
@@ -2995,23 +3523,26 @@
         "node": ">= 0.8"
       }
     },
-    "../shadergraph/node_modules/finalhandler/node_modules/debug": {
+    "node_modules/finalhandler/node_modules/debug": {
       "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "ms": "2.0.0"
       }
     },
-    "../shadergraph/node_modules/finalhandler/node_modules/ms": {
+    "node_modules/finalhandler/node_modules/ms": {
       "version": "2.0.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+      "dev": true
     },
-    "../shadergraph/node_modules/find-cache-dir": {
+    "node_modules/find-cache-dir": {
       "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
+      "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "commondir": "^1.0.1",
         "make-dir": "^2.0.0",
@@ -3021,10 +3552,11 @@
         "node": ">=6"
       }
     },
-    "../shadergraph/node_modules/find-cache-dir/node_modules/find-up": {
+    "node_modules/find-cache-dir/node_modules/find-up": {
       "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+      "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "locate-path": "^3.0.0"
       },
@@ -3032,10 +3564,11 @@
         "node": ">=6"
       }
     },
-    "../shadergraph/node_modules/find-cache-dir/node_modules/locate-path": {
+    "node_modules/find-cache-dir/node_modules/locate-path": {
       "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+      "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "p-locate": "^3.0.0",
         "path-exists": "^3.0.0"
@@ -3044,24 +3577,11 @@
         "node": ">=6"
       }
     },
-    "../shadergraph/node_modules/find-cache-dir/node_modules/p-limit": {
-      "version": "2.3.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "p-try": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "../shadergraph/node_modules/find-cache-dir/node_modules/p-locate": {
+    "node_modules/find-cache-dir/node_modules/p-locate": {
       "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+      "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "p-limit": "^2.0.0"
       },
@@ -3069,18 +3589,20 @@
         "node": ">=6"
       }
     },
-    "../shadergraph/node_modules/find-cache-dir/node_modules/path-exists": {
+    "node_modules/find-cache-dir/node_modules/path-exists": {
       "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+      "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=4"
       }
     },
-    "../shadergraph/node_modules/find-cache-dir/node_modules/pkg-dir": {
+    "node_modules/find-cache-dir/node_modules/pkg-dir": {
       "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
+      "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "find-up": "^3.0.0"
       },
@@ -3088,10 +3610,11 @@
         "node": ">=6"
       }
     },
-    "../shadergraph/node_modules/find-up": {
+    "node_modules/find-up": {
       "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "locate-path": "^5.0.0",
         "path-exists": "^4.0.0"
@@ -3100,10 +3623,11 @@
         "node": ">=8"
       }
     },
-    "../shadergraph/node_modules/findup-sync": {
+    "node_modules/findup-sync": {
       "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz",
+      "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "detect-file": "^1.0.0",
         "is-glob": "^4.0.0",
@@ -3114,10 +3638,11 @@
         "node": ">= 0.10"
       }
     },
-    "../shadergraph/node_modules/fined": {
+    "node_modules/fined": {
       "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz",
+      "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "expand-tilde": "^2.0.2",
         "is-plain-object": "^2.0.3",
@@ -3129,10 +3654,11 @@
         "node": ">= 0.10"
       }
     },
-    "../shadergraph/node_modules/fined/node_modules/is-plain-object": {
+    "node_modules/fined/node_modules/is-plain-object": {
       "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "isobject": "^3.0.1"
       },
@@ -3140,10 +3666,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/first-chunk-stream": {
+    "node_modules/first-chunk-stream": {
       "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz",
+      "integrity": "sha1-G97NuOCDwGZLkZRVgVd6Q6nzHXA=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "readable-stream": "^2.0.2"
       },
@@ -3151,18 +3678,20 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/flagged-respawn": {
+    "node_modules/flagged-respawn": {
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz",
+      "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">= 0.10"
       }
     },
-    "../shadergraph/node_modules/flat-cache": {
+    "node_modules/flat-cache": {
       "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+      "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "flatted": "^3.1.0",
         "rimraf": "^3.0.2"
@@ -3171,22 +3700,26 @@
         "node": "^10.12.0 || >=12.0.0"
       }
     },
-    "../shadergraph/node_modules/flatted": {
-      "version": "3.1.1",
-      "dev": true,
-      "license": "ISC"
+    "node_modules/flatted": {
+      "version": "3.2.5",
+      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz",
+      "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==",
+      "dev": true
     },
-    "../shadergraph/node_modules/flush-write-stream": {
+    "node_modules/flush-write-stream": {
       "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz",
+      "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "inherits": "^2.0.3",
         "readable-stream": "^2.3.6"
       }
     },
-    "../shadergraph/node_modules/follow-redirects": {
-      "version": "1.14.1",
+    "node_modules/follow-redirects": {
+      "version": "1.14.8",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz",
+      "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==",
       "dev": true,
       "funding": [
         {
@@ -3194,7 +3727,6 @@
           "url": "https://github.com/sponsors/RubenVerborgh"
         }
       ],
-      "license": "MIT",
       "engines": {
         "node": ">=4.0"
       },
@@ -3204,18 +3736,20 @@
         }
       }
     },
-    "../shadergraph/node_modules/for-in": {
+    "node_modules/for-in": {
       "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+      "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/for-own": {
+    "node_modules/for-own": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
+      "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "for-in": "^1.0.1"
       },
@@ -3223,10 +3757,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/fragment-cache": {
+    "node_modules/fragment-cache": {
       "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+      "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "map-cache": "^0.2.2"
       },
@@ -3234,32 +3769,35 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/from2": {
+    "node_modules/from2": {
       "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
+      "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "inherits": "^2.0.1",
         "readable-stream": "^2.0.0"
       }
     },
-    "../shadergraph/node_modules/fs-extra": {
-      "version": "8.1.0",
+    "node_modules/fs-extra": {
+      "version": "10.0.0",
+      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz",
+      "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "graceful-fs": "^4.2.0",
-        "jsonfile": "^4.0.0",
-        "universalify": "^0.1.0"
+        "jsonfile": "^6.0.1",
+        "universalify": "^2.0.0"
       },
       "engines": {
-        "node": ">=6 <7 || >=8"
+        "node": ">=12"
       }
     },
-    "../shadergraph/node_modules/fs-mkdirp-stream": {
+    "node_modules/fs-mkdirp-stream": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz",
+      "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "graceful-fs": "^4.1.11",
         "through2": "^2.0.3"
@@ -3268,19 +3806,11 @@
         "node": ">= 0.10"
       }
     },
-    "../shadergraph/node_modules/fs-mkdirp-stream/node_modules/through2": {
-      "version": "2.0.5",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "readable-stream": "~2.3.6",
-        "xtend": "~4.0.1"
-      }
-    },
-    "../shadergraph/node_modules/fs-write-stream-atomic": {
+    "node_modules/fs-write-stream-atomic": {
       "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz",
+      "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=",
       "dev": true,
-      "license": "ISC",
       "dependencies": {
         "graceful-fs": "^4.1.2",
         "iferr": "^0.1.5",
@@ -3288,16 +3818,19 @@
         "readable-stream": "1 || 2"
       }
     },
-    "../shadergraph/node_modules/fs.realpath": {
+    "node_modules/fs.realpath": {
       "version": "1.0.0",
-      "dev": true,
-      "license": "ISC"
+      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+      "dev": true
     },
-    "../shadergraph/node_modules/fsevents": {
+    "node_modules/fsevents": {
       "version": "1.2.13",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
+      "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
+      "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.",
       "dev": true,
       "hasInstallScript": true,
-      "license": "MIT",
       "optional": true,
       "os": [
         "darwin"
@@ -3310,25 +3843,29 @@
         "node": ">= 4.0"
       }
     },
-    "../shadergraph/node_modules/function-bind": {
+    "node_modules/function-bind": {
       "version": "1.1.1",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+      "dev": true
     },
-    "../shadergraph/node_modules/functional-red-black-tree": {
+    "node_modules/functional-red-black-tree": {
       "version": "1.0.1",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+      "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
+      "dev": true
     },
-    "../shadergraph/node_modules/get-caller-file": {
+    "node_modules/get-caller-file": {
       "version": "1.0.3",
-      "dev": true,
-      "license": "ISC"
+      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
+      "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==",
+      "dev": true
     },
-    "../shadergraph/node_modules/get-intrinsic": {
+    "node_modules/get-intrinsic": {
       "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
+      "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "function-bind": "^1.1.1",
         "has": "^1.0.3",
@@ -3338,10 +3875,11 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "../shadergraph/node_modules/get-stream": {
+    "node_modules/get-stream": {
       "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+      "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=10"
       },
@@ -3349,18 +3887,20 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "../shadergraph/node_modules/get-value": {
+    "node_modules/get-value": {
       "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+      "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/glob": {
-      "version": "7.1.7",
+    "node_modules/glob": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
+      "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
       "dev": true,
-      "license": "ISC",
       "dependencies": {
         "fs.realpath": "^1.0.0",
         "inflight": "^1.0.4",
@@ -3376,10 +3916,11 @@
         "url": "https://github.com/sponsors/isaacs"
       }
     },
-    "../shadergraph/node_modules/glob-base": {
+    "node_modules/glob-base": {
       "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
+      "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "glob-parent": "^2.0.0",
         "is-glob": "^2.0.0"
@@ -3388,26 +3929,29 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/glob-base/node_modules/glob-parent": {
+    "node_modules/glob-base/node_modules/glob-parent": {
       "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
+      "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
       "dev": true,
-      "license": "ISC",
       "dependencies": {
         "is-glob": "^2.0.0"
       }
     },
-    "../shadergraph/node_modules/glob-base/node_modules/is-extglob": {
+    "node_modules/glob-base/node_modules/is-extglob": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+      "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/glob-base/node_modules/is-glob": {
+    "node_modules/glob-base/node_modules/is-glob": {
       "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+      "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-extglob": "^1.0.0"
       },
@@ -3415,10 +3959,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/glob-parent": {
+    "node_modules/glob-parent": {
       "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
       "dev": true,
-      "license": "ISC",
       "dependencies": {
         "is-glob": "^4.0.1"
       },
@@ -3426,10 +3971,11 @@
         "node": ">= 6"
       }
     },
-    "../shadergraph/node_modules/glob-stream": {
+    "node_modules/glob-stream": {
       "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz",
+      "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "extend": "^3.0.0",
         "glob": "^7.1.1",
@@ -3446,19 +3992,21 @@
         "node": ">= 0.10"
       }
     },
-    "../shadergraph/node_modules/glob-stream/node_modules/glob-parent": {
+    "node_modules/glob-stream/node_modules/glob-parent": {
       "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+      "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
       "dev": true,
-      "license": "ISC",
       "dependencies": {
         "is-glob": "^3.1.0",
         "path-dirname": "^1.0.0"
       }
     },
-    "../shadergraph/node_modules/glob-stream/node_modules/is-glob": {
+    "node_modules/glob-stream/node_modules/is-glob": {
       "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+      "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-extglob": "^2.1.0"
       },
@@ -3466,15 +4014,17 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/glob-to-regexp": {
+    "node_modules/glob-to-regexp": {
       "version": "0.4.1",
-      "dev": true,
-      "license": "BSD-2-Clause"
+      "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
+      "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
+      "dev": true
     },
-    "../shadergraph/node_modules/glob-watcher": {
+    "node_modules/glob-watcher": {
       "version": "5.0.5",
+      "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.5.tgz",
+      "integrity": "sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "anymatch": "^2.0.0",
         "async-done": "^1.2.0",
@@ -3488,10 +4038,11 @@
         "node": ">= 0.10"
       }
     },
-    "../shadergraph/node_modules/global-modules": {
+    "node_modules/global-modules": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
+      "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "global-prefix": "^1.0.1",
         "is-windows": "^1.0.1",
@@ -3501,10 +4052,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/global-prefix": {
+    "node_modules/global-prefix": {
       "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
+      "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "expand-tilde": "^2.0.2",
         "homedir-polyfill": "^1.0.1",
@@ -3516,10 +4068,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/global-prefix/node_modules/which": {
+    "node_modules/global-prefix/node_modules/which": {
       "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+      "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
       "dev": true,
-      "license": "ISC",
       "dependencies": {
         "isexe": "^2.0.0"
       },
@@ -3527,10 +4080,11 @@
         "which": "bin/which"
       }
     },
-    "../shadergraph/node_modules/globals": {
-      "version": "13.9.0",
+    "node_modules/globals": {
+      "version": "13.12.1",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz",
+      "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "type-fest": "^0.20.2"
       },
@@ -3541,10 +4095,11 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "../shadergraph/node_modules/glogg": {
+    "node_modules/glogg": {
       "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz",
+      "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "sparkles": "^1.0.0"
       },
@@ -3552,31 +4107,55 @@
         "node": ">= 0.10"
       }
     },
-    "../shadergraph/node_modules/glsl-parser": {
-      "version": "2.0.1",
-      "license": "MIT",
+    "node_modules/glsl-tokenizer": {
+      "version": "2.1.5",
+      "resolved": "https://registry.npmjs.org/glsl-tokenizer/-/glsl-tokenizer-2.1.5.tgz",
+      "integrity": "sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA==",
       "dependencies": {
-        "glsl-tokenizer": "^2.1.4",
-        "through": "2.3.4",
         "through2": "^0.6.3"
       }
     },
-    "../shadergraph/node_modules/glsl-tokenizer": {
-      "version": "2.1.5",
-      "license": "MIT",
+    "node_modules/glsl-tokenizer/node_modules/isarray": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+      "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+    },
+    "node_modules/glsl-tokenizer/node_modules/readable-stream": {
+      "version": "1.0.34",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+      "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
       "dependencies": {
-        "through2": "^0.6.3"
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.1",
+        "isarray": "0.0.1",
+        "string_decoder": "~0.10.x"
       }
     },
-    "../shadergraph/node_modules/graceful-fs": {
-      "version": "4.2.6",
-      "dev": true,
-      "license": "ISC"
+    "node_modules/glsl-tokenizer/node_modules/string_decoder": {
+      "version": "0.10.31",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+      "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
+    },
+    "node_modules/glsl-tokenizer/node_modules/through2": {
+      "version": "0.6.5",
+      "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+      "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+      "dependencies": {
+        "readable-stream": ">=1.0.33-1 <1.1.0-0",
+        "xtend": ">=4.0.0 <4.1.0-0"
+      }
+    },
+    "node_modules/graceful-fs": {
+      "version": "4.2.9",
+      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz",
+      "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==",
+      "dev": true
     },
-    "../shadergraph/node_modules/gulp": {
+    "node_modules/gulp": {
       "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz",
+      "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "glob-watcher": "^5.0.3",
         "gulp-cli": "^2.2.0",
@@ -3590,10 +4169,11 @@
         "node": ">= 0.10"
       }
     },
-    "../shadergraph/node_modules/gulp-cli": {
+    "node_modules/gulp-cli": {
       "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.3.0.tgz",
+      "integrity": "sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "ansi-colors": "^1.0.1",
         "archy": "^1.0.0",
@@ -3621,10 +4201,11 @@
         "node": ">= 0.10"
       }
     },
-    "../shadergraph/node_modules/gulp-cli/node_modules/ansi-colors": {
+    "node_modules/gulp-cli/node_modules/ansi-colors": {
       "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
+      "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "ansi-wrap": "^0.1.0"
       },
@@ -3632,10 +4213,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/gulp-concat": {
+    "node_modules/gulp-concat": {
       "version": "2.6.1",
+      "resolved": "https://registry.npmjs.org/gulp-concat/-/gulp-concat-2.6.1.tgz",
+      "integrity": "sha1-Yz0WyV2IUEYorQJmVmPO5aR5M1M=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "concat-with-sourcemaps": "^1.0.0",
         "through2": "^2.0.0",
@@ -3645,37 +4227,31 @@
         "node": ">= 0.10"
       }
     },
-    "../shadergraph/node_modules/gulp-concat/node_modules/through2": {
-      "version": "2.0.5",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "readable-stream": "~2.3.6",
-        "xtend": "~4.0.1"
-      }
-    },
-    "../shadergraph/node_modules/gulp-eslint": {
+    "node_modules/gulp-eslint": {
       "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/gulp-eslint/-/gulp-eslint-6.0.0.tgz",
+      "integrity": "sha512-dCVPSh1sA+UVhn7JSQt7KEb4An2sQNbOdB3PA8UCfxsoPlAKjJHxYHGXdXC7eb+V1FAnilSFFqslPrq037l1ig==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "eslint": "^6.0.0",
         "fancy-log": "^1.3.2",
         "plugin-error": "^1.0.1"
       }
     },
-    "../shadergraph/node_modules/gulp-eslint/node_modules/ansi-regex": {
+    "node_modules/gulp-eslint/node_modules/ansi-regex": {
       "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+      "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=6"
       }
     },
-    "../shadergraph/node_modules/gulp-eslint/node_modules/ansi-styles": {
+    "node_modules/gulp-eslint/node_modules/ansi-styles": {
       "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "color-convert": "^1.9.0"
       },
@@ -3683,18 +4259,20 @@
         "node": ">=4"
       }
     },
-    "../shadergraph/node_modules/gulp-eslint/node_modules/astral-regex": {
+    "node_modules/gulp-eslint/node_modules/astral-regex": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
+      "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=4"
       }
     },
-    "../shadergraph/node_modules/gulp-eslint/node_modules/chalk": {
+    "node_modules/gulp-eslint/node_modules/chalk": {
       "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "ansi-styles": "^3.2.1",
         "escape-string-regexp": "^1.0.5",
@@ -3704,23 +4282,26 @@
         "node": ">=4"
       }
     },
-    "../shadergraph/node_modules/gulp-eslint/node_modules/color-convert": {
+    "node_modules/gulp-eslint/node_modules/color-convert": {
       "version": "1.9.3",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "color-name": "1.1.3"
       }
     },
-    "../shadergraph/node_modules/gulp-eslint/node_modules/color-name": {
+    "node_modules/gulp-eslint/node_modules/color-name": {
       "version": "1.1.3",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+      "dev": true
     },
-    "../shadergraph/node_modules/gulp-eslint/node_modules/cross-spawn": {
+    "node_modules/gulp-eslint/node_modules/cross-spawn": {
       "version": "6.0.5",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+      "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "nice-try": "^1.0.4",
         "path-key": "^2.0.1",
@@ -3732,31 +4313,35 @@
         "node": ">=4.8"
       }
     },
-    "../shadergraph/node_modules/gulp-eslint/node_modules/cross-spawn/node_modules/semver": {
+    "node_modules/gulp-eslint/node_modules/cross-spawn/node_modules/semver": {
       "version": "5.7.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+      "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
       "dev": true,
-      "license": "ISC",
       "bin": {
         "semver": "bin/semver"
       }
     },
-    "../shadergraph/node_modules/gulp-eslint/node_modules/emoji-regex": {
+    "node_modules/gulp-eslint/node_modules/emoji-regex": {
       "version": "7.0.3",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
+      "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+      "dev": true
     },
-    "../shadergraph/node_modules/gulp-eslint/node_modules/escape-string-regexp": {
+    "node_modules/gulp-eslint/node_modules/escape-string-regexp": {
       "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.8.0"
       }
     },
-    "../shadergraph/node_modules/gulp-eslint/node_modules/eslint": {
+    "node_modules/gulp-eslint/node_modules/eslint": {
       "version": "6.8.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz",
+      "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "@babel/code-frame": "^7.0.0",
         "ajv": "^6.10.0",
@@ -3806,10 +4391,11 @@
         "url": "https://opencollective.com/eslint"
       }
     },
-    "../shadergraph/node_modules/gulp-eslint/node_modules/eslint-utils": {
+    "node_modules/gulp-eslint/node_modules/eslint-utils": {
       "version": "1.4.3",
+      "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz",
+      "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "eslint-visitor-keys": "^1.1.0"
       },
@@ -3817,18 +4403,20 @@
         "node": ">=6"
       }
     },
-    "../shadergraph/node_modules/gulp-eslint/node_modules/eslint-visitor-keys": {
+    "node_modules/gulp-eslint/node_modules/eslint-visitor-keys": {
       "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+      "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
       "dev": true,
-      "license": "Apache-2.0",
       "engines": {
         "node": ">=4"
       }
     },
-    "../shadergraph/node_modules/gulp-eslint/node_modules/espree": {
+    "node_modules/gulp-eslint/node_modules/espree": {
       "version": "6.2.1",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz",
+      "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==",
       "dev": true,
-      "license": "BSD-2-Clause",
       "dependencies": {
         "acorn": "^7.1.1",
         "acorn-jsx": "^5.2.0",
@@ -3838,10 +4426,11 @@
         "node": ">=6.0.0"
       }
     },
-    "../shadergraph/node_modules/gulp-eslint/node_modules/file-entry-cache": {
+    "node_modules/gulp-eslint/node_modules/file-entry-cache": {
       "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
+      "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "flat-cache": "^2.0.1"
       },
@@ -3849,10 +4438,11 @@
         "node": ">=4"
       }
     },
-    "../shadergraph/node_modules/gulp-eslint/node_modules/flat-cache": {
+    "node_modules/gulp-eslint/node_modules/flat-cache": {
       "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
+      "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "flatted": "^2.0.0",
         "rimraf": "2.6.3",
@@ -3862,15 +4452,17 @@
         "node": ">=4"
       }
     },
-    "../shadergraph/node_modules/gulp-eslint/node_modules/flatted": {
+    "node_modules/gulp-eslint/node_modules/flatted": {
       "version": "2.0.2",
-      "dev": true,
-      "license": "ISC"
+      "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz",
+      "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==",
+      "dev": true
     },
-    "../shadergraph/node_modules/gulp-eslint/node_modules/globals": {
+    "node_modules/gulp-eslint/node_modules/globals": {
       "version": "12.4.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
+      "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "type-fest": "^0.8.1"
       },
@@ -3881,26 +4473,29 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "../shadergraph/node_modules/gulp-eslint/node_modules/has-flag": {
+    "node_modules/gulp-eslint/node_modules/has-flag": {
       "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=4"
       }
     },
-    "../shadergraph/node_modules/gulp-eslint/node_modules/is-fullwidth-code-point": {
+    "node_modules/gulp-eslint/node_modules/is-fullwidth-code-point": {
       "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+      "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=4"
       }
     },
-    "../shadergraph/node_modules/gulp-eslint/node_modules/levn": {
+    "node_modules/gulp-eslint/node_modules/levn": {
       "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+      "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "prelude-ls": "~1.1.2",
         "type-check": "~0.3.2"
@@ -3909,10 +4504,11 @@
         "node": ">= 0.8.0"
       }
     },
-    "../shadergraph/node_modules/gulp-eslint/node_modules/optionator": {
+    "node_modules/gulp-eslint/node_modules/optionator": {
       "version": "0.8.3",
+      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
+      "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "deep-is": "~0.1.3",
         "fast-levenshtein": "~2.0.6",
@@ -3925,33 +4521,38 @@
         "node": ">= 0.8.0"
       }
     },
-    "../shadergraph/node_modules/gulp-eslint/node_modules/path-key": {
+    "node_modules/gulp-eslint/node_modules/path-key": {
       "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+      "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=4"
       }
     },
-    "../shadergraph/node_modules/gulp-eslint/node_modules/prelude-ls": {
+    "node_modules/gulp-eslint/node_modules/prelude-ls": {
       "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+      "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
       "dev": true,
       "engines": {
         "node": ">= 0.8.0"
       }
     },
-    "../shadergraph/node_modules/gulp-eslint/node_modules/regexpp": {
+    "node_modules/gulp-eslint/node_modules/regexpp": {
       "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz",
+      "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=6.5.0"
       }
     },
-    "../shadergraph/node_modules/gulp-eslint/node_modules/rimraf": {
+    "node_modules/gulp-eslint/node_modules/rimraf": {
       "version": "2.6.3",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
+      "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
       "dev": true,
-      "license": "ISC",
       "dependencies": {
         "glob": "^7.1.3"
       },
@@ -3959,18 +4560,20 @@
         "rimraf": "bin.js"
       }
     },
-    "../shadergraph/node_modules/gulp-eslint/node_modules/semver": {
+    "node_modules/gulp-eslint/node_modules/semver": {
       "version": "6.3.0",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
       "dev": true,
-      "license": "ISC",
       "bin": {
         "semver": "bin/semver.js"
       }
     },
-    "../shadergraph/node_modules/gulp-eslint/node_modules/shebang-command": {
+    "node_modules/gulp-eslint/node_modules/shebang-command": {
       "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+      "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "shebang-regex": "^1.0.0"
       },
@@ -3978,18 +4581,20 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/gulp-eslint/node_modules/shebang-regex": {
+    "node_modules/gulp-eslint/node_modules/shebang-regex": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+      "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/gulp-eslint/node_modules/slice-ansi": {
+    "node_modules/gulp-eslint/node_modules/slice-ansi": {
       "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
+      "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "ansi-styles": "^3.2.0",
         "astral-regex": "^1.0.0",
@@ -3999,10 +4604,11 @@
         "node": ">=6"
       }
     },
-    "../shadergraph/node_modules/gulp-eslint/node_modules/string-width": {
+    "node_modules/gulp-eslint/node_modules/string-width": {
       "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+      "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "emoji-regex": "^7.0.1",
         "is-fullwidth-code-point": "^2.0.0",
@@ -4012,10 +4618,11 @@
         "node": ">=6"
       }
     },
-    "../shadergraph/node_modules/gulp-eslint/node_modules/strip-ansi": {
+    "node_modules/gulp-eslint/node_modules/strip-ansi": {
       "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+      "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "ansi-regex": "^4.1.0"
       },
@@ -4023,10 +4630,11 @@
         "node": ">=6"
       }
     },
-    "../shadergraph/node_modules/gulp-eslint/node_modules/supports-color": {
+    "node_modules/gulp-eslint/node_modules/supports-color": {
       "version": "5.5.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "has-flag": "^3.0.0"
       },
@@ -4034,10 +4642,11 @@
         "node": ">=4"
       }
     },
-    "../shadergraph/node_modules/gulp-eslint/node_modules/table": {
+    "node_modules/gulp-eslint/node_modules/table": {
       "version": "5.4.6",
+      "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
+      "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==",
       "dev": true,
-      "license": "BSD-3-Clause",
       "dependencies": {
         "ajv": "^6.10.2",
         "lodash": "^4.17.14",
@@ -4048,10 +4657,11 @@
         "node": ">=6.0.0"
       }
     },
-    "../shadergraph/node_modules/gulp-eslint/node_modules/type-check": {
+    "node_modules/gulp-eslint/node_modules/type-check": {
       "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+      "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "prelude-ls": "~1.1.2"
       },
@@ -4059,18 +4669,20 @@
         "node": ">= 0.8.0"
       }
     },
-    "../shadergraph/node_modules/gulp-eslint/node_modules/type-fest": {
+    "node_modules/gulp-eslint/node_modules/type-fest": {
       "version": "0.8.1",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+      "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
       "dev": true,
-      "license": "(MIT OR CC0-1.0)",
       "engines": {
         "node": ">=8"
       }
     },
-    "../shadergraph/node_modules/gulp-eslint/node_modules/which": {
+    "node_modules/gulp-eslint/node_modules/which": {
       "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+      "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
       "dev": true,
-      "license": "ISC",
       "dependencies": {
         "isexe": "^2.0.0"
       },
@@ -4078,10 +4690,20 @@
         "which": "bin/which"
       }
     },
-    "../shadergraph/node_modules/gulp-watch": {
+    "node_modules/gulp-rename": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-2.0.0.tgz",
+      "integrity": "sha512-97Vba4KBzbYmR5VBs9mWmK+HwIf5mj+/zioxfZhOKeXtx5ZjBk57KFlePf5nxq9QsTtFl0ejnHE3zTC9MHXqyQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/gulp-watch": {
       "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/gulp-watch/-/gulp-watch-5.0.1.tgz",
+      "integrity": "sha512-HnTSBdzAOFIT4wmXYPDUn783TaYAq9bpaN05vuZNP5eni3z3aRx0NAKbjhhMYtcq76x4R1wf4oORDGdlrEjuog==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "ansi-colors": "1.1.0",
         "anymatch": "^1.3.0",
@@ -4097,10 +4719,11 @@
         "vinyl-file": "^2.0.0"
       }
     },
-    "../shadergraph/node_modules/gulp-watch/node_modules/ansi-colors": {
+    "node_modules/gulp-watch/node_modules/ansi-colors": {
       "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
+      "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "ansi-wrap": "^0.1.0"
       },
@@ -4108,19 +4731,21 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/gulp-watch/node_modules/anymatch": {
+    "node_modules/gulp-watch/node_modules/anymatch": {
       "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz",
+      "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==",
       "dev": true,
-      "license": "ISC",
       "dependencies": {
         "micromatch": "^2.1.5",
         "normalize-path": "^2.0.0"
       }
     },
-    "../shadergraph/node_modules/gulp-watch/node_modules/arr-diff": {
+    "node_modules/gulp-watch/node_modules/arr-diff": {
       "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
+      "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "arr-flatten": "^1.0.1"
       },
@@ -4128,18 +4753,20 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/gulp-watch/node_modules/array-unique": {
+    "node_modules/gulp-watch/node_modules/array-unique": {
       "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
+      "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/gulp-watch/node_modules/braces": {
+    "node_modules/gulp-watch/node_modules/braces": {
       "version": "1.8.5",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
+      "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "expand-range": "^1.8.1",
         "preserve": "^0.2.0",
@@ -4149,10 +4776,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/gulp-watch/node_modules/expand-brackets": {
+    "node_modules/gulp-watch/node_modules/expand-brackets": {
       "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
+      "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-posix-bracket": "^0.1.0"
       },
@@ -4160,10 +4788,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/gulp-watch/node_modules/extglob": {
+    "node_modules/gulp-watch/node_modules/extglob": {
       "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
+      "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-extglob": "^1.0.0"
       },
@@ -4171,18 +4800,20 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/gulp-watch/node_modules/extglob/node_modules/is-extglob": {
+    "node_modules/gulp-watch/node_modules/extglob/node_modules/is-extglob": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+      "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/gulp-watch/node_modules/fancy-log": {
+    "node_modules/gulp-watch/node_modules/fancy-log": {
       "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz",
+      "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "ansi-gray": "^0.1.1",
         "color-support": "^1.1.3",
@@ -4192,19 +4823,21 @@
         "node": ">= 0.10"
       }
     },
-    "../shadergraph/node_modules/gulp-watch/node_modules/glob-parent": {
+    "node_modules/gulp-watch/node_modules/glob-parent": {
       "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+      "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
       "dev": true,
-      "license": "ISC",
       "dependencies": {
         "is-glob": "^3.1.0",
         "path-dirname": "^1.0.0"
       }
     },
-    "../shadergraph/node_modules/gulp-watch/node_modules/is-glob": {
+    "node_modules/gulp-watch/node_modules/is-glob": {
       "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+      "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-extglob": "^2.1.0"
       },
@@ -4212,10 +4845,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/gulp-watch/node_modules/kind-of": {
+    "node_modules/gulp-watch/node_modules/kind-of": {
       "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-buffer": "^1.1.5"
       },
@@ -4223,10 +4857,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/gulp-watch/node_modules/micromatch": {
+    "node_modules/gulp-watch/node_modules/micromatch": {
       "version": "2.3.11",
+      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
+      "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "arr-diff": "^2.0.0",
         "array-unique": "^0.2.1",
@@ -4246,18 +4881,20 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/gulp-watch/node_modules/micromatch/node_modules/is-extglob": {
+    "node_modules/gulp-watch/node_modules/micromatch/node_modules/is-extglob": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+      "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/gulp-watch/node_modules/micromatch/node_modules/is-glob": {
+    "node_modules/gulp-watch/node_modules/micromatch/node_modules/is-glob": {
       "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+      "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-extglob": "^1.0.0"
       },
@@ -4265,10 +4902,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/gulp-watch/node_modules/normalize-path": {
+    "node_modules/gulp-watch/node_modules/normalize-path": {
       "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+      "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "remove-trailing-separator": "^1.0.1"
       },
@@ -4276,10 +4914,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/gulplog": {
+    "node_modules/gulplog": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz",
+      "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "glogg": "^1.0.0"
       },
@@ -4287,10 +4926,11 @@
         "node": ">= 0.10"
       }
     },
-    "../shadergraph/node_modules/has": {
+    "node_modules/has": {
       "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "function-bind": "^1.1.1"
       },
@@ -4298,18 +4938,20 @@
         "node": ">= 0.4.0"
       }
     },
-    "../shadergraph/node_modules/has-flag": {
+    "node_modules/has-flag": {
       "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
     },
-    "../shadergraph/node_modules/has-symbols": {
+    "node_modules/has-symbols": {
       "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
+      "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">= 0.4"
       },
@@ -4317,10 +4959,11 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "../shadergraph/node_modules/has-value": {
+    "node_modules/has-value": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+      "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "get-value": "^2.0.6",
         "has-values": "^1.0.0",
@@ -4330,10 +4973,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/has-values": {
+    "node_modules/has-values": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+      "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-number": "^3.0.0",
         "kind-of": "^4.0.0"
@@ -4342,10 +4986,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/has-values/node_modules/kind-of": {
+    "node_modules/has-values/node_modules/kind-of": {
       "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+      "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-buffer": "^1.1.5"
       },
@@ -4353,10 +4998,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/hash-base": {
+    "node_modules/hash-base": {
       "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz",
+      "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "inherits": "^2.0.4",
         "readable-stream": "^3.6.0",
@@ -4366,10 +5012,11 @@
         "node": ">=4"
       }
     },
-    "../shadergraph/node_modules/hash-base/node_modules/readable-stream": {
+    "node_modules/hash-base/node_modules/readable-stream": {
       "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+      "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "inherits": "^2.0.3",
         "string_decoder": "^1.1.1",
@@ -4379,8 +5026,10 @@
         "node": ">= 6"
       }
     },
-    "../shadergraph/node_modules/hash-base/node_modules/safe-buffer": {
+    "node_modules/hash-base/node_modules/safe-buffer": {
       "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
       "dev": true,
       "funding": [
         {
@@ -4395,32 +5044,34 @@
           "type": "consulting",
           "url": "https://feross.org/support"
         }
-      ],
-      "license": "MIT"
+      ]
     },
-    "../shadergraph/node_modules/hash.js": {
+    "node_modules/hash.js": {
       "version": "1.1.7",
+      "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
+      "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "inherits": "^2.0.3",
         "minimalistic-assert": "^1.0.1"
       }
     },
-    "../shadergraph/node_modules/hmac-drbg": {
+    "node_modules/hmac-drbg": {
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
+      "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "hash.js": "^1.0.3",
         "minimalistic-assert": "^1.0.0",
         "minimalistic-crypto-utils": "^1.0.1"
       }
     },
-    "../shadergraph/node_modules/homedir-polyfill": {
+    "node_modules/homedir-polyfill": {
       "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz",
+      "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "parse-passwd": "^1.0.0"
       },
@@ -4428,35 +5079,33 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/hosted-git-info": {
+    "node_modules/hosted-git-info": {
       "version": "2.8.9",
-      "dev": true,
-      "license": "ISC"
+      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+      "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
+      "dev": true
     },
-    "../shadergraph/node_modules/http-errors": {
-      "version": "1.7.2",
+    "node_modules/http-errors": {
+      "version": "1.8.1",
+      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz",
+      "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "depd": "~1.1.2",
-        "inherits": "2.0.3",
-        "setprototypeof": "1.1.1",
+        "inherits": "2.0.4",
+        "setprototypeof": "1.2.0",
         "statuses": ">= 1.5.0 < 2",
-        "toidentifier": "1.0.0"
+        "toidentifier": "1.0.1"
       },
       "engines": {
         "node": ">= 0.6"
       }
     },
-    "../shadergraph/node_modules/http-errors/node_modules/inherits": {
-      "version": "2.0.3",
-      "dev": true,
-      "license": "ISC"
-    },
-    "../shadergraph/node_modules/http-proxy": {
+    "node_modules/http-proxy": {
       "version": "1.18.1",
+      "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
+      "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "eventemitter3": "^4.0.0",
         "follow-redirects": "^1.0.0",
@@ -4466,23 +5115,26 @@
         "node": ">=8.0.0"
       }
     },
-    "../shadergraph/node_modules/https-browserify": {
+    "node_modules/https-browserify": {
       "version": "1.0.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
+      "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=",
+      "dev": true
     },
-    "../shadergraph/node_modules/human-signals": {
+    "node_modules/human-signals": {
       "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+      "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
       "dev": true,
-      "license": "Apache-2.0",
       "engines": {
         "node": ">=10.17.0"
       }
     },
-    "../shadergraph/node_modules/iconv-lite": {
+    "node_modules/iconv-lite": {
       "version": "0.4.24",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "safer-buffer": ">= 2.1.2 < 3"
       },
@@ -4490,8 +5142,10 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/ieee754": {
+    "node_modules/ieee754": {
       "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+      "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
       "dev": true,
       "funding": [
         {
@@ -4506,26 +5160,28 @@
           "type": "consulting",
           "url": "https://feross.org/support"
         }
-      ],
-      "license": "BSD-3-Clause"
+      ]
     },
-    "../shadergraph/node_modules/iferr": {
+    "node_modules/iferr": {
       "version": "0.1.5",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz",
+      "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=",
+      "dev": true
     },
-    "../shadergraph/node_modules/ignore": {
+    "node_modules/ignore": {
       "version": "4.0.6",
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
+      "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">= 4"
       }
     },
-    "../shadergraph/node_modules/import-fresh": {
+    "node_modules/import-fresh": {
       "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+      "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "parent-module": "^1.0.0",
         "resolve-from": "^4.0.0"
@@ -4537,10 +5193,11 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "../shadergraph/node_modules/import-local": {
-      "version": "3.0.2",
+    "node_modules/import-local": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
+      "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "pkg-dir": "^4.2.0",
         "resolve-cwd": "^3.0.0"
@@ -4550,43 +5207,52 @@
       },
       "engines": {
         "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "../shadergraph/node_modules/imurmurhash": {
+    "node_modules/imurmurhash": {
       "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.8.19"
       }
     },
-    "../shadergraph/node_modules/infer-owner": {
+    "node_modules/infer-owner": {
       "version": "1.0.4",
-      "dev": true,
-      "license": "ISC"
+      "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz",
+      "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==",
+      "dev": true
     },
-    "../shadergraph/node_modules/inflight": {
+    "node_modules/inflight": {
       "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
       "dev": true,
-      "license": "ISC",
       "dependencies": {
         "once": "^1.3.0",
         "wrappy": "1"
       }
     },
-    "../shadergraph/node_modules/inherits": {
+    "node_modules/inherits": {
       "version": "2.0.4",
-      "license": "ISC"
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
     },
-    "../shadergraph/node_modules/ini": {
+    "node_modules/ini": {
       "version": "1.3.8",
-      "dev": true,
-      "license": "ISC"
+      "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+      "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+      "dev": true
     },
-    "../shadergraph/node_modules/inquirer": {
+    "node_modules/inquirer": {
       "version": "7.3.3",
+      "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz",
+      "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "ansi-escapes": "^4.2.1",
         "chalk": "^4.1.0",
@@ -4606,31 +5272,29 @@
         "node": ">=8.0.0"
       }
     },
-    "../shadergraph/node_modules/inquirer/node_modules/through": {
-      "version": "2.3.8",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../shadergraph/node_modules/interpret": {
+    "node_modules/interpret": {
       "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz",
+      "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">= 0.10"
       }
     },
-    "../shadergraph/node_modules/invert-kv": {
+    "node_modules/invert-kv": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
+      "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/is-absolute": {
+    "node_modules/is-absolute": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz",
+      "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-relative": "^1.0.0",
         "is-windows": "^1.0.1"
@@ -4639,10 +5303,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/is-accessor-descriptor": {
+    "node_modules/is-accessor-descriptor": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+      "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "kind-of": "^6.0.0"
       },
@@ -4650,23 +5315,26 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/is-accessor-descriptor/node_modules/kind-of": {
+    "node_modules/is-accessor-descriptor/node_modules/kind-of": {
       "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/is-arrayish": {
+    "node_modules/is-arrayish": {
       "version": "0.2.1",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+      "dev": true
     },
-    "../shadergraph/node_modules/is-binary-path": {
+    "node_modules/is-binary-path": {
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
+      "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "binary-extensions": "^1.0.0"
       },
@@ -4674,15 +5342,17 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/is-buffer": {
+    "node_modules/is-buffer": {
       "version": "1.1.6",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+      "dev": true
     },
-    "../shadergraph/node_modules/is-core-module": {
-      "version": "2.4.0",
+    "node_modules/is-core-module": {
+      "version": "2.8.1",
+      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz",
+      "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "has": "^1.0.3"
       },
@@ -4690,10 +5360,11 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "../shadergraph/node_modules/is-data-descriptor": {
+    "node_modules/is-data-descriptor": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+      "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "kind-of": "^6.0.0"
       },
@@ -4701,18 +5372,20 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/is-data-descriptor/node_modules/kind-of": {
+    "node_modules/is-data-descriptor/node_modules/kind-of": {
       "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/is-descriptor": {
+    "node_modules/is-descriptor": {
       "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+      "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-accessor-descriptor": "^1.0.0",
         "is-data-descriptor": "^1.0.0",
@@ -4722,26 +5395,29 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/is-descriptor/node_modules/kind-of": {
+    "node_modules/is-descriptor/node_modules/kind-of": {
       "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/is-dotfile": {
+    "node_modules/is-dotfile": {
       "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz",
+      "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/is-equal-shallow": {
+    "node_modules/is-equal-shallow": {
       "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
+      "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-primitive": "^2.0.0"
       },
@@ -4749,34 +5425,38 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/is-extendable": {
+    "node_modules/is-extendable": {
       "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+      "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/is-extglob": {
+    "node_modules/is-extglob": {
       "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/is-fullwidth-code-point": {
+    "node_modules/is-fullwidth-code-point": {
       "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
     },
-    "../shadergraph/node_modules/is-glob": {
-      "version": "4.0.1",
+    "node_modules/is-glob": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-extglob": "^2.1.1"
       },
@@ -4784,18 +5464,20 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/is-negated-glob": {
+    "node_modules/is-negated-glob": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz",
+      "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/is-number": {
+    "node_modules/is-number": {
       "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+      "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "kind-of": "^3.0.2"
       },
@@ -4803,10 +5485,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/is-number/node_modules/kind-of": {
+    "node_modules/is-number/node_modules/kind-of": {
       "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-buffer": "^1.1.5"
       },
@@ -4814,34 +5497,38 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/is-plain-object": {
+    "node_modules/is-plain-object": {
       "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
+      "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/is-posix-bracket": {
+    "node_modules/is-posix-bracket": {
       "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
+      "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/is-primitive": {
+    "node_modules/is-primitive": {
       "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
+      "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/is-relative": {
+    "node_modules/is-relative": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz",
+      "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-unc-path": "^1.0.0"
       },
@@ -4849,18 +5536,23 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/is-stream": {
-      "version": "2.0.0",
+    "node_modules/is-stream": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+      "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "../shadergraph/node_modules/is-unc-path": {
+    "node_modules/is-unc-path": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz",
+      "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "unc-path-regex": "^0.1.2"
       },
@@ -4868,44 +5560,50 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/is-utf8": {
+    "node_modules/is-utf8": {
       "version": "0.2.1",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
+      "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
+      "dev": true
     },
-    "../shadergraph/node_modules/is-valid-glob": {
+    "node_modules/is-valid-glob": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz",
+      "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/is-windows": {
+    "node_modules/is-windows": {
       "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+      "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/is-wsl": {
+    "node_modules/is-wsl": {
       "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
+      "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=4"
       }
     },
-    "../shadergraph/node_modules/isarray": {
+    "node_modules/isarray": {
       "version": "1.0.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+      "dev": true
     },
-    "../shadergraph/node_modules/isbinaryfile": {
+    "node_modules/isbinaryfile": {
       "version": "4.0.8",
+      "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.8.tgz",
+      "integrity": "sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">= 8.0.0"
       },
@@ -4913,28 +5611,32 @@
         "url": "https://github.com/sponsors/gjtorikian/"
       }
     },
-    "../shadergraph/node_modules/isexe": {
+    "node_modules/isexe": {
       "version": "2.0.0",
-      "dev": true,
-      "license": "ISC"
+      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+      "dev": true
     },
-    "../shadergraph/node_modules/isobject": {
+    "node_modules/isobject": {
       "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+      "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/jasmine-core": {
-      "version": "3.7.1",
-      "dev": true,
-      "license": "MIT"
+    "node_modules/jasmine-core": {
+      "version": "3.99.0",
+      "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.99.0.tgz",
+      "integrity": "sha512-+ZDaJlEfRopINQqgE+hvzRyDIQDeKfqqTvF8RzXsvU1yE3pBDRud2+Qfh9WvGgRpuzqxyQJVI6Amy5XQ11r/3w==",
+      "dev": true
     },
-    "../shadergraph/node_modules/jest-worker": {
-      "version": "27.0.2",
+    "node_modules/jest-worker": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
+      "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "@types/node": "*",
         "merge-stream": "^2.0.0",
@@ -4944,10 +5646,11 @@
         "node": ">= 10.13.0"
       }
     },
-    "../shadergraph/node_modules/jest-worker/node_modules/supports-color": {
+    "node_modules/jest-worker/node_modules/supports-color": {
       "version": "8.1.1",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+      "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "has-flag": "^4.0.0"
       },
@@ -4958,15 +5661,17 @@
         "url": "https://github.com/chalk/supports-color?sponsor=1"
       }
     },
-    "../shadergraph/node_modules/js-tokens": {
+    "node_modules/js-tokens": {
       "version": "4.0.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+      "dev": true
     },
-    "../shadergraph/node_modules/js-yaml": {
+    "node_modules/js-yaml": {
       "version": "3.14.1",
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+      "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "argparse": "^1.0.7",
         "esprima": "^4.0.0"
@@ -4975,25 +5680,29 @@
         "js-yaml": "bin/js-yaml.js"
       }
     },
-    "../shadergraph/node_modules/json-parse-better-errors": {
+    "node_modules/json-parse-better-errors": {
       "version": "1.0.2",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
+      "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
+      "dev": true
     },
-    "../shadergraph/node_modules/json-schema-traverse": {
+    "node_modules/json-schema-traverse": {
       "version": "0.4.1",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+      "dev": true
     },
-    "../shadergraph/node_modules/json-stable-stringify-without-jsonify": {
+    "node_modules/json-stable-stringify-without-jsonify": {
       "version": "1.0.1",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+      "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+      "dev": true
     },
-    "../shadergraph/node_modules/json5": {
+    "node_modules/json5": {
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+      "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "minimist": "^1.2.0"
       },
@@ -5001,28 +5710,34 @@
         "json5": "lib/cli.js"
       }
     },
-    "../shadergraph/node_modules/jsonfile": {
-      "version": "4.0.0",
+    "node_modules/jsonfile": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+      "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
       "dev": true,
-      "license": "MIT",
+      "dependencies": {
+        "universalify": "^2.0.0"
+      },
       "optionalDependencies": {
         "graceful-fs": "^4.1.6"
       }
     },
-    "../shadergraph/node_modules/just-debounce": {
+    "node_modules/just-debounce": {
       "version": "1.1.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.1.0.tgz",
+      "integrity": "sha512-qpcRocdkUmf+UTNBYx5w6dexX5J31AKK1OmPwH630a83DdVVUIngk55RSAiIGpQyoH0dlr872VHfPjnQnK1qDQ==",
+      "dev": true
     },
-    "../shadergraph/node_modules/karma": {
-      "version": "6.3.4",
+    "node_modules/karma": {
+      "version": "6.3.16",
+      "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.16.tgz",
+      "integrity": "sha512-nEU50jLvDe5yvXqkEJRf8IuvddUkOY2x5Xc4WXHz6dxINgGDrgD2uqQWeVrJs4hbfNaotn+HQ1LZJ4yOXrL7xQ==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "body-parser": "^1.19.0",
         "braces": "^3.0.2",
         "chokidar": "^3.5.1",
-        "colors": "^1.4.0",
+        "colors": "1.4.0",
         "connect": "^3.7.0",
         "di": "^0.0.1",
         "dom-serialize": "^2.2.1",
@@ -5031,16 +5746,17 @@
         "http-proxy": "^1.18.1",
         "isbinaryfile": "^4.0.8",
         "lodash": "^4.17.21",
-        "log4js": "^6.3.0",
+        "log4js": "^6.4.1",
         "mime": "^2.5.2",
         "minimatch": "^3.0.4",
+        "mkdirp": "^0.5.5",
         "qjobs": "^1.2.0",
         "range-parser": "^1.2.1",
         "rimraf": "^3.0.2",
-        "socket.io": "^3.1.0",
+        "socket.io": "^4.2.0",
         "source-map": "^0.6.1",
         "tmp": "^0.2.1",
-        "ua-parser-js": "^0.7.28",
+        "ua-parser-js": "^0.7.30",
         "yargs": "^16.1.1"
       },
       "bin": {
@@ -5050,18 +5766,20 @@
         "node": ">= 10"
       }
     },
-    "../shadergraph/node_modules/karma-chrome-launcher": {
+    "node_modules/karma-chrome-launcher": {
       "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz",
+      "integrity": "sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "which": "^1.2.1"
       }
     },
-    "../shadergraph/node_modules/karma-chrome-launcher/node_modules/which": {
+    "node_modules/karma-chrome-launcher/node_modules/which": {
       "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+      "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
       "dev": true,
-      "license": "ISC",
       "dependencies": {
         "isexe": "^2.0.0"
       },
@@ -5069,10 +5787,11 @@
         "which": "bin/which"
       }
     },
-    "../shadergraph/node_modules/karma-jasmine": {
+    "node_modules/karma-jasmine": {
       "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-4.0.1.tgz",
+      "integrity": "sha512-h8XDAhTiZjJKzfkoO1laMH+zfNlra+dEQHUAjpn5JV1zCPtOIVWGQjLBrqhnzQa/hrU2XrZwSyBa6XjEBzfXzw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "jasmine-core": "^3.6.0"
       },
@@ -5083,10 +5802,11 @@
         "karma": "*"
       }
     },
-    "../shadergraph/node_modules/karma/node_modules/anymatch": {
+    "node_modules/karma/node_modules/anymatch": {
       "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
+      "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
       "dev": true,
-      "license": "ISC",
       "dependencies": {
         "normalize-path": "^3.0.0",
         "picomatch": "^2.0.4"
@@ -5095,18 +5815,20 @@
         "node": ">= 8"
       }
     },
-    "../shadergraph/node_modules/karma/node_modules/binary-extensions": {
+    "node_modules/karma/node_modules/binary-extensions": {
       "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+      "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
     },
-    "../shadergraph/node_modules/karma/node_modules/braces": {
+    "node_modules/karma/node_modules/braces": {
       "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "fill-range": "^7.0.1"
       },
@@ -5114,40 +5836,49 @@
         "node": ">=8"
       }
     },
-    "../shadergraph/node_modules/karma/node_modules/chokidar": {
-      "version": "3.5.1",
+    "node_modules/karma/node_modules/chokidar": {
+      "version": "3.5.3",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+      "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
       "dev": true,
-      "license": "MIT",
+      "funding": [
+        {
+          "type": "individual",
+          "url": "https://paulmillr.com/funding/"
+        }
+      ],
       "dependencies": {
-        "anymatch": "~3.1.1",
+        "anymatch": "~3.1.2",
         "braces": "~3.0.2",
-        "glob-parent": "~5.1.0",
+        "glob-parent": "~5.1.2",
         "is-binary-path": "~2.1.0",
         "is-glob": "~4.0.1",
         "normalize-path": "~3.0.0",
-        "readdirp": "~3.5.0"
+        "readdirp": "~3.6.0"
       },
       "engines": {
         "node": ">= 8.10.0"
       },
       "optionalDependencies": {
-        "fsevents": "~2.3.1"
+        "fsevents": "~2.3.2"
       }
     },
-    "../shadergraph/node_modules/karma/node_modules/cliui": {
+    "node_modules/karma/node_modules/cliui": {
       "version": "7.0.4",
+      "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+      "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
       "dev": true,
-      "license": "ISC",
       "dependencies": {
         "string-width": "^4.2.0",
         "strip-ansi": "^6.0.0",
         "wrap-ansi": "^7.0.0"
       }
     },
-    "../shadergraph/node_modules/karma/node_modules/fill-range": {
+    "node_modules/karma/node_modules/fill-range": {
       "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "to-regex-range": "^5.0.1"
       },
@@ -5155,10 +5886,12 @@
         "node": ">=8"
       }
     },
-    "../shadergraph/node_modules/karma/node_modules/fsevents": {
+    "node_modules/karma/node_modules/fsevents": {
       "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+      "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
       "dev": true,
-      "license": "MIT",
+      "hasInstallScript": true,
       "optional": true,
       "os": [
         "darwin"
@@ -5167,18 +5900,20 @@
         "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
       }
     },
-    "../shadergraph/node_modules/karma/node_modules/get-caller-file": {
+    "node_modules/karma/node_modules/get-caller-file": {
       "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
       "dev": true,
-      "license": "ISC",
       "engines": {
         "node": "6.* || 8.* || >= 10.*"
       }
     },
-    "../shadergraph/node_modules/karma/node_modules/is-binary-path": {
+    "node_modules/karma/node_modules/is-binary-path": {
       "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+      "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "binary-extensions": "^2.0.0"
       },
@@ -5186,18 +5921,20 @@
         "node": ">=8"
       }
     },
-    "../shadergraph/node_modules/karma/node_modules/is-number": {
+    "node_modules/karma/node_modules/is-number": {
       "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.12.0"
       }
     },
-    "../shadergraph/node_modules/karma/node_modules/readdirp": {
-      "version": "3.5.0",
+    "node_modules/karma/node_modules/readdirp": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "picomatch": "^2.2.1"
       },
@@ -5205,10 +5942,11 @@
         "node": ">=8.10.0"
       }
     },
-    "../shadergraph/node_modules/karma/node_modules/to-regex-range": {
+    "node_modules/karma/node_modules/to-regex-range": {
       "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-number": "^7.0.0"
       },
@@ -5216,10 +5954,11 @@
         "node": ">=8.0"
       }
     },
-    "../shadergraph/node_modules/karma/node_modules/wrap-ansi": {
+    "node_modules/karma/node_modules/wrap-ansi": {
       "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "ansi-styles": "^4.0.0",
         "string-width": "^4.1.0",
@@ -5232,18 +5971,20 @@
         "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
       }
     },
-    "../shadergraph/node_modules/karma/node_modules/y18n": {
+    "node_modules/karma/node_modules/y18n": {
       "version": "5.0.8",
+      "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+      "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
       "dev": true,
-      "license": "ISC",
       "engines": {
         "node": ">=10"
       }
     },
-    "../shadergraph/node_modules/karma/node_modules/yargs": {
+    "node_modules/karma/node_modules/yargs": {
       "version": "16.2.0",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+      "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "cliui": "^7.0.2",
         "escalade": "^3.1.1",
@@ -5257,26 +5998,29 @@
         "node": ">=10"
       }
     },
-    "../shadergraph/node_modules/karma/node_modules/yargs-parser": {
-      "version": "20.2.7",
+    "node_modules/karma/node_modules/yargs-parser": {
+      "version": "20.2.9",
+      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+      "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
       "dev": true,
-      "license": "ISC",
       "engines": {
         "node": ">=10"
       }
     },
-    "../shadergraph/node_modules/kind-of": {
+    "node_modules/kind-of": {
       "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+      "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/last-run": {
+    "node_modules/last-run": {
       "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz",
+      "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "default-resolution": "^2.0.0",
         "es6-weak-map": "^2.0.1"
@@ -5285,10 +6029,11 @@
         "node": ">= 0.10"
       }
     },
-    "../shadergraph/node_modules/lazystream": {
-      "version": "1.0.0",
+    "node_modules/lazystream": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz",
+      "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "readable-stream": "^2.0.5"
       },
@@ -5296,10 +6041,11 @@
         "node": ">= 0.6.3"
       }
     },
-    "../shadergraph/node_modules/lcid": {
+    "node_modules/lcid": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
+      "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "invert-kv": "^1.0.0"
       },
@@ -5307,10 +6053,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/lead": {
+    "node_modules/lead": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz",
+      "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "flush-write-stream": "^1.0.2"
       },
@@ -5318,10 +6065,11 @@
         "node": ">= 0.10"
       }
     },
-    "../shadergraph/node_modules/levn": {
+    "node_modules/levn": {
       "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+      "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "prelude-ls": "^1.2.1",
         "type-check": "~0.4.0"
@@ -5330,10 +6078,11 @@
         "node": ">= 0.8.0"
       }
     },
-    "../shadergraph/node_modules/liftoff": {
+    "node_modules/liftoff": {
       "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz",
+      "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "extend": "^3.0.0",
         "findup-sync": "^3.0.0",
@@ -5348,10 +6097,11 @@
         "node": ">= 0.8"
       }
     },
-    "../shadergraph/node_modules/liftoff/node_modules/is-plain-object": {
+    "node_modules/liftoff/node_modules/is-plain-object": {
       "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "isobject": "^3.0.1"
       },
@@ -5359,10 +6109,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/load-json-file": {
+    "node_modules/load-json-file": {
       "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
+      "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "graceful-fs": "^4.1.2",
         "parse-json": "^2.2.0",
@@ -5374,18 +6125,20 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/loader-runner": {
+    "node_modules/loader-runner": {
       "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz",
+      "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=6.11.5"
       }
     },
-    "../shadergraph/node_modules/loader-utils": {
+    "node_modules/loader-utils": {
       "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
+      "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "big.js": "^5.2.2",
         "emojis-list": "^3.0.0",
@@ -5395,10 +6148,11 @@
         "node": ">=4.0.0"
       }
     },
-    "../shadergraph/node_modules/locate-path": {
+    "node_modules/locate-path": {
       "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "p-locate": "^4.1.0"
       },
@@ -5406,60 +6160,57 @@
         "node": ">=8"
       }
     },
-    "../shadergraph/node_modules/lodash": {
+    "node_modules/lodash": {
       "version": "4.17.21",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../shadergraph/node_modules/lodash.clone": {
-      "version": "4.5.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+      "dev": true
     },
-    "../shadergraph/node_modules/lodash.clonedeep": {
+    "node_modules/lodash.clone": {
       "version": "4.5.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz",
+      "integrity": "sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=",
+      "dev": true
     },
-    "../shadergraph/node_modules/lodash.merge": {
+    "node_modules/lodash.merge": {
       "version": "4.6.2",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+      "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+      "dev": true
     },
-    "../shadergraph/node_modules/lodash.some": {
+    "node_modules/lodash.some": {
       "version": "4.6.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz",
+      "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=",
+      "dev": true
     },
-    "../shadergraph/node_modules/lodash.truncate": {
+    "node_modules/lodash.truncate": {
       "version": "4.4.2",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
+      "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=",
+      "dev": true
     },
-    "../shadergraph/node_modules/log4js": {
-      "version": "6.3.0",
+    "node_modules/log4js": {
+      "version": "6.4.1",
+      "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.4.1.tgz",
+      "integrity": "sha512-iUiYnXqAmNKiIZ1XSAitQ4TmNs8CdZYTAWINARF3LjnsLN8tY5m0vRwd6uuWj/yNY0YHxeZodnbmxKFUOM2rMg==",
       "dev": true,
-      "license": "Apache-2.0",
       "dependencies": {
-        "date-format": "^3.0.0",
-        "debug": "^4.1.1",
-        "flatted": "^2.0.1",
-        "rfdc": "^1.1.4",
-        "streamroller": "^2.2.4"
+        "date-format": "^4.0.3",
+        "debug": "^4.3.3",
+        "flatted": "^3.2.4",
+        "rfdc": "^1.3.0",
+        "streamroller": "^3.0.2"
       },
       "engines": {
         "node": ">=8.0"
       }
     },
-    "../shadergraph/node_modules/log4js/node_modules/flatted": {
-      "version": "2.0.2",
-      "dev": true,
-      "license": "ISC"
-    },
-    "../shadergraph/node_modules/lru-cache": {
+    "node_modules/lru-cache": {
       "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
       "dev": true,
-      "license": "ISC",
       "dependencies": {
         "yallist": "^4.0.0"
       },
@@ -5467,10 +6218,11 @@
         "node": ">=10"
       }
     },
-    "../shadergraph/node_modules/make-dir": {
+    "node_modules/make-dir": {
       "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
+      "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "pify": "^4.0.1",
         "semver": "^5.6.0"
@@ -5479,26 +6231,29 @@
         "node": ">=6"
       }
     },
-    "../shadergraph/node_modules/make-dir/node_modules/pify": {
+    "node_modules/make-dir/node_modules/pify": {
       "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+      "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=6"
       }
     },
-    "../shadergraph/node_modules/make-dir/node_modules/semver": {
+    "node_modules/make-dir/node_modules/semver": {
       "version": "5.7.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+      "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
       "dev": true,
-      "license": "ISC",
       "bin": {
         "semver": "bin/semver"
       }
     },
-    "../shadergraph/node_modules/make-iterator": {
+    "node_modules/make-iterator": {
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz",
+      "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "kind-of": "^6.0.2"
       },
@@ -5506,26 +6261,29 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/make-iterator/node_modules/kind-of": {
+    "node_modules/make-iterator/node_modules/kind-of": {
       "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/map-cache": {
+    "node_modules/map-cache": {
       "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+      "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/map-visit": {
+    "node_modules/map-visit": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+      "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "object-visit": "^1.0.0"
       },
@@ -5533,10 +6291,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/matchdep": {
+    "node_modules/matchdep": {
       "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz",
+      "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "findup-sync": "^2.0.0",
         "micromatch": "^3.0.4",
@@ -5547,10 +6306,11 @@
         "node": ">= 0.10.0"
       }
     },
-    "../shadergraph/node_modules/matchdep/node_modules/findup-sync": {
+    "node_modules/matchdep/node_modules/findup-sync": {
       "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz",
+      "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "detect-file": "^1.0.0",
         "is-glob": "^3.1.0",
@@ -5561,10 +6321,11 @@
         "node": ">= 0.10"
       }
     },
-    "../shadergraph/node_modules/matchdep/node_modules/is-glob": {
+    "node_modules/matchdep/node_modules/is-glob": {
       "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+      "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-extglob": "^2.1.0"
       },
@@ -5572,33 +6333,37 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/math-random": {
+    "node_modules/math-random": {
       "version": "1.0.4",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz",
+      "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==",
+      "dev": true
     },
-    "../shadergraph/node_modules/md5.js": {
+    "node_modules/md5.js": {
       "version": "1.3.5",
+      "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
+      "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "hash-base": "^3.0.0",
         "inherits": "^2.0.1",
         "safe-buffer": "^5.1.2"
       }
     },
-    "../shadergraph/node_modules/media-typer": {
+    "node_modules/media-typer": {
       "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+      "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">= 0.6"
       }
     },
-    "../shadergraph/node_modules/memory-fs": {
+    "node_modules/memory-fs": {
       "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz",
+      "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "errno": "^0.1.3",
         "readable-stream": "^2.0.1"
@@ -5607,15 +6372,17 @@
         "node": ">=4.3.0 <5.0.0 || >=5.10"
       }
     },
-    "../shadergraph/node_modules/merge-stream": {
+    "node_modules/merge-stream": {
       "version": "2.0.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+      "dev": true
     },
-    "../shadergraph/node_modules/micromatch": {
+    "node_modules/micromatch": {
       "version": "3.1.10",
+      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+      "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "arr-diff": "^4.0.0",
         "array-unique": "^0.3.2",
@@ -5635,10 +6402,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/micromatch/node_modules/extend-shallow": {
+    "node_modules/micromatch/node_modules/extend-shallow": {
       "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+      "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "assign-symbols": "^1.0.0",
         "is-extendable": "^1.0.1"
@@ -5647,10 +6415,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/micromatch/node_modules/is-extendable": {
+    "node_modules/micromatch/node_modules/is-extendable": {
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+      "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-plain-object": "^2.0.4"
       },
@@ -5658,10 +6427,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/micromatch/node_modules/is-plain-object": {
+    "node_modules/micromatch/node_modules/is-plain-object": {
       "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "isobject": "^3.0.1"
       },
@@ -5669,18 +6439,20 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/micromatch/node_modules/kind-of": {
+    "node_modules/micromatch/node_modules/kind-of": {
       "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/miller-rabin": {
+    "node_modules/miller-rabin": {
       "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
+      "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "bn.js": "^4.0.0",
         "brorand": "^1.0.1"
@@ -5689,15 +6461,17 @@
         "miller-rabin": "bin/miller-rabin"
       }
     },
-    "../shadergraph/node_modules/miller-rabin/node_modules/bn.js": {
+    "node_modules/miller-rabin/node_modules/bn.js": {
       "version": "4.12.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+      "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+      "dev": true
     },
-    "../shadergraph/node_modules/mime": {
-      "version": "2.5.2",
+    "node_modules/mime": {
+      "version": "2.6.0",
+      "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz",
+      "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==",
       "dev": true,
-      "license": "MIT",
       "bin": {
         "mime": "cli.js"
       },
@@ -5705,47 +6479,53 @@
         "node": ">=4.0.0"
       }
     },
-    "../shadergraph/node_modules/mime-db": {
-      "version": "1.48.0",
+    "node_modules/mime-db": {
+      "version": "1.51.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz",
+      "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">= 0.6"
       }
     },
-    "../shadergraph/node_modules/mime-types": {
-      "version": "2.1.31",
+    "node_modules/mime-types": {
+      "version": "2.1.34",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz",
+      "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "mime-db": "1.48.0"
+        "mime-db": "1.51.0"
       },
       "engines": {
         "node": ">= 0.6"
       }
     },
-    "../shadergraph/node_modules/mimic-fn": {
+    "node_modules/mimic-fn": {
       "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=6"
       }
     },
-    "../shadergraph/node_modules/minimalistic-assert": {
+    "node_modules/minimalistic-assert": {
       "version": "1.0.1",
-      "dev": true,
-      "license": "ISC"
+      "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+      "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
+      "dev": true
     },
-    "../shadergraph/node_modules/minimalistic-crypto-utils": {
+    "node_modules/minimalistic-crypto-utils": {
       "version": "1.0.1",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
+      "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=",
+      "dev": true
     },
-    "../shadergraph/node_modules/minimatch": {
-      "version": "3.0.4",
+    "node_modules/minimatch": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
       "dev": true,
-      "license": "ISC",
       "dependencies": {
         "brace-expansion": "^1.1.7"
       },
@@ -5753,15 +6533,17 @@
         "node": "*"
       }
     },
-    "../shadergraph/node_modules/minimist": {
+    "node_modules/minimist": {
       "version": "1.2.5",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+      "dev": true
     },
-    "../shadergraph/node_modules/mississippi": {
+    "node_modules/mississippi": {
       "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz",
+      "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==",
       "dev": true,
-      "license": "BSD-2-Clause",
       "dependencies": {
         "concat-stream": "^1.5.0",
         "duplexify": "^3.4.2",
@@ -5778,28 +6560,21 @@
         "node": ">=4.0.0"
       }
     },
-    "../shadergraph/node_modules/mississippi/node_modules/pump": {
+    "node_modules/mississippi/node_modules/pump": {
       "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+      "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "end-of-stream": "^1.1.0",
         "once": "^1.3.1"
       }
     },
-    "../shadergraph/node_modules/mississippi/node_modules/through2": {
-      "version": "2.0.5",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "readable-stream": "~2.3.6",
-        "xtend": "~4.0.1"
-      }
-    },
-    "../shadergraph/node_modules/mixin-deep": {
+    "node_modules/mixin-deep": {
       "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
+      "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "for-in": "^1.0.2",
         "is-extendable": "^1.0.1"
@@ -5808,10 +6583,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/mixin-deep/node_modules/is-extendable": {
+    "node_modules/mixin-deep/node_modules/is-extendable": {
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+      "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-plain-object": "^2.0.4"
       },
@@ -5819,10 +6595,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/mixin-deep/node_modules/is-plain-object": {
+    "node_modules/mixin-deep/node_modules/is-plain-object": {
       "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "isobject": "^3.0.1"
       },
@@ -5830,10 +6607,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/mkdirp": {
+    "node_modules/mkdirp": {
       "version": "0.5.5",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+      "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "minimist": "^1.2.5"
       },
@@ -5841,10 +6619,11 @@
         "mkdirp": "bin/cmd.js"
       }
     },
-    "../shadergraph/node_modules/move-concurrently": {
+    "node_modules/move-concurrently": {
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
+      "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=",
       "dev": true,
-      "license": "ISC",
       "dependencies": {
         "aproba": "^1.1.1",
         "copy-concurrently": "^1.0.0",
@@ -5854,10 +6633,11 @@
         "run-queue": "^1.0.3"
       }
     },
-    "../shadergraph/node_modules/move-concurrently/node_modules/rimraf": {
+    "node_modules/move-concurrently/node_modules/rimraf": {
       "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+      "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
       "dev": true,
-      "license": "ISC",
       "dependencies": {
         "glob": "^7.1.3"
       },
@@ -5865,34 +6645,39 @@
         "rimraf": "bin.js"
       }
     },
-    "../shadergraph/node_modules/ms": {
+    "node_modules/ms": {
       "version": "2.1.2",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+      "dev": true
     },
-    "../shadergraph/node_modules/mute-stdout": {
+    "node_modules/mute-stdout": {
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz",
+      "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">= 0.10"
       }
     },
-    "../shadergraph/node_modules/mute-stream": {
+    "node_modules/mute-stream": {
       "version": "0.0.8",
-      "dev": true,
-      "license": "ISC"
+      "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
+      "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
+      "dev": true
     },
-    "../shadergraph/node_modules/nan": {
-      "version": "2.14.2",
+    "node_modules/nan": {
+      "version": "2.15.0",
+      "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz",
+      "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==",
       "dev": true,
-      "license": "MIT",
       "optional": true
     },
-    "../shadergraph/node_modules/nanomatch": {
+    "node_modules/nanomatch": {
       "version": "1.2.13",
+      "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
+      "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "arr-diff": "^4.0.0",
         "array-unique": "^0.3.2",
@@ -5910,10 +6695,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/nanomatch/node_modules/extend-shallow": {
+    "node_modules/nanomatch/node_modules/extend-shallow": {
       "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+      "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "assign-symbols": "^1.0.0",
         "is-extendable": "^1.0.1"
@@ -5922,10 +6708,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/nanomatch/node_modules/is-extendable": {
+    "node_modules/nanomatch/node_modules/is-extendable": {
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+      "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-plain-object": "^2.0.4"
       },
@@ -5933,10 +6720,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/nanomatch/node_modules/is-plain-object": {
+    "node_modules/nanomatch/node_modules/is-plain-object": {
       "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "isobject": "^3.0.1"
       },
@@ -5944,46 +6732,53 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/nanomatch/node_modules/kind-of": {
+    "node_modules/nanomatch/node_modules/kind-of": {
       "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/natural-compare": {
+    "node_modules/natural-compare": {
       "version": "1.4.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+      "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+      "dev": true
     },
-    "../shadergraph/node_modules/negotiator": {
-      "version": "0.6.2",
+    "node_modules/negotiator": {
+      "version": "0.6.3",
+      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
+      "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">= 0.6"
       }
     },
-    "../shadergraph/node_modules/neo-async": {
+    "node_modules/neo-async": {
       "version": "2.6.2",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+      "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+      "dev": true
     },
-    "../shadergraph/node_modules/next-tick": {
+    "node_modules/next-tick": {
       "version": "1.0.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
+      "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=",
+      "dev": true
     },
-    "../shadergraph/node_modules/nice-try": {
+    "node_modules/nice-try": {
       "version": "1.0.5",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
+      "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
+      "dev": true
     },
-    "../shadergraph/node_modules/node-libs-browser": {
+    "node_modules/node-libs-browser": {
       "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz",
+      "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "assert": "^1.1.1",
         "browserify-zlib": "^0.2.0",
@@ -6010,20 +6805,33 @@
         "vm-browserify": "^1.0.1"
       }
     },
-    "../shadergraph/node_modules/node-libs-browser/node_modules/punycode": {
+    "node_modules/node-libs-browser/node_modules/punycode": {
       "version": "1.4.1",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+      "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+      "dev": true
     },
-    "../shadergraph/node_modules/node-releases": {
-      "version": "1.1.73",
+    "node_modules/node-libs-browser/node_modules/stream-browserify": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz",
+      "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==",
       "dev": true,
-      "license": "MIT"
+      "dependencies": {
+        "inherits": "~2.0.1",
+        "readable-stream": "^2.0.2"
+      }
+    },
+    "node_modules/node-releases": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz",
+      "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==",
+      "dev": true
     },
-    "../shadergraph/node_modules/normalize-package-data": {
+    "node_modules/normalize-package-data": {
       "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+      "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
       "dev": true,
-      "license": "BSD-2-Clause",
       "dependencies": {
         "hosted-git-info": "^2.1.4",
         "resolve": "^1.10.0",
@@ -6031,26 +6839,29 @@
         "validate-npm-package-license": "^3.0.1"
       }
     },
-    "../shadergraph/node_modules/normalize-package-data/node_modules/semver": {
+    "node_modules/normalize-package-data/node_modules/semver": {
       "version": "5.7.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+      "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
       "dev": true,
-      "license": "ISC",
       "bin": {
         "semver": "bin/semver"
       }
     },
-    "../shadergraph/node_modules/normalize-path": {
+    "node_modules/normalize-path": {
       "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/now-and-later": {
+    "node_modules/now-and-later": {
       "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz",
+      "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "once": "^1.3.2"
       },
@@ -6058,10 +6869,11 @@
         "node": ">= 0.10"
       }
     },
-    "../shadergraph/node_modules/npm-run-path": {
+    "node_modules/npm-run-path": {
       "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+      "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "path-key": "^3.0.0"
       },
@@ -6069,26 +6881,40 @@
         "node": ">=8"
       }
     },
-    "../shadergraph/node_modules/number-is-nan": {
+    "node_modules/nth-check": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz",
+      "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==",
+      "dependencies": {
+        "boolbase": "^1.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/nth-check?sponsor=1"
+      }
+    },
+    "node_modules/number-is-nan": {
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+      "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/object-assign": {
+    "node_modules/object-assign": {
       "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/object-copy": {
+    "node_modules/object-copy": {
       "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+      "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "copy-descriptor": "^0.1.0",
         "define-property": "^0.2.5",
@@ -6098,10 +6924,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/object-copy/node_modules/define-property": {
+    "node_modules/object-copy/node_modules/define-property": {
       "version": "0.2.5",
+      "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+      "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-descriptor": "^0.1.0"
       },
@@ -6109,10 +6936,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/object-copy/node_modules/is-accessor-descriptor": {
+    "node_modules/object-copy/node_modules/is-accessor-descriptor": {
       "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+      "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "kind-of": "^3.0.2"
       },
@@ -6120,10 +6948,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/object-copy/node_modules/is-data-descriptor": {
+    "node_modules/object-copy/node_modules/is-data-descriptor": {
       "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+      "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "kind-of": "^3.0.2"
       },
@@ -6131,10 +6960,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/object-copy/node_modules/is-descriptor": {
+    "node_modules/object-copy/node_modules/is-descriptor": {
       "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+      "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-accessor-descriptor": "^0.1.6",
         "is-data-descriptor": "^0.1.4",
@@ -6144,18 +6974,20 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": {
+    "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": {
       "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+      "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/object-copy/node_modules/kind-of": {
+    "node_modules/object-copy/node_modules/kind-of": {
       "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-buffer": "^1.1.5"
       },
@@ -6163,18 +6995,20 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/object-keys": {
+    "node_modules/object-keys": {
       "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">= 0.4"
       }
     },
-    "../shadergraph/node_modules/object-visit": {
+    "node_modules/object-visit": {
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+      "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "isobject": "^3.0.0"
       },
@@ -6182,10 +7016,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/object.assign": {
+    "node_modules/object.assign": {
       "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
+      "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "call-bind": "^1.0.0",
         "define-properties": "^1.1.3",
@@ -6199,10 +7034,11 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "../shadergraph/node_modules/object.defaults": {
+    "node_modules/object.defaults": {
       "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz",
+      "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "array-each": "^1.0.1",
         "array-slice": "^1.0.0",
@@ -6213,10 +7049,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/object.map": {
+    "node_modules/object.map": {
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz",
+      "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "for-own": "^1.0.0",
         "make-iterator": "^1.0.0"
@@ -6225,10 +7062,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/object.omit": {
+    "node_modules/object.omit": {
       "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
+      "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "for-own": "^0.1.4",
         "is-extendable": "^0.1.1"
@@ -6237,10 +7075,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/object.omit/node_modules/for-own": {
+    "node_modules/object.omit/node_modules/for-own": {
       "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
+      "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "for-in": "^1.0.1"
       },
@@ -6248,10 +7087,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/object.pick": {
+    "node_modules/object.pick": {
       "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+      "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "isobject": "^3.0.1"
       },
@@ -6259,10 +7099,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/object.reduce": {
+    "node_modules/object.reduce": {
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz",
+      "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "for-own": "^1.0.0",
         "make-iterator": "^1.0.0"
@@ -6271,10 +7112,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/on-finished": {
+    "node_modules/on-finished": {
       "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+      "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "ee-first": "1.1.1"
       },
@@ -6282,18 +7124,20 @@
         "node": ">= 0.8"
       }
     },
-    "../shadergraph/node_modules/once": {
+    "node_modules/once": {
       "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
       "dev": true,
-      "license": "ISC",
       "dependencies": {
         "wrappy": "1"
       }
     },
-    "../shadergraph/node_modules/onetime": {
+    "node_modules/onetime": {
       "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+      "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "mimic-fn": "^2.1.0"
       },
@@ -6304,10 +7148,11 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "../shadergraph/node_modules/optionator": {
+    "node_modules/optionator": {
       "version": "0.9.1",
+      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+      "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "deep-is": "^0.1.3",
         "fast-levenshtein": "^2.0.6",
@@ -6320,23 +7165,26 @@
         "node": ">= 0.8.0"
       }
     },
-    "../shadergraph/node_modules/ordered-read-streams": {
+    "node_modules/ordered-read-streams": {
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz",
+      "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "readable-stream": "^2.0.1"
       }
     },
-    "../shadergraph/node_modules/os-browserify": {
+    "node_modules/os-browserify": {
       "version": "0.3.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
+      "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=",
+      "dev": true
     },
-    "../shadergraph/node_modules/os-locale": {
+    "node_modules/os-locale": {
       "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
+      "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "lcid": "^1.0.0"
       },
@@ -6344,32 +7192,35 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/os-tmpdir": {
+    "node_modules/os-tmpdir": {
       "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+      "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/p-limit": {
-      "version": "3.1.0",
+    "node_modules/p-limit": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "yocto-queue": "^0.1.0"
+        "p-try": "^2.0.0"
       },
       "engines": {
-        "node": ">=10"
+        "node": ">=6"
       },
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "../shadergraph/node_modules/p-locate": {
+    "node_modules/p-locate": {
       "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "p-limit": "^2.2.0"
       },
@@ -6377,47 +7228,37 @@
         "node": ">=8"
       }
     },
-    "../shadergraph/node_modules/p-locate/node_modules/p-limit": {
-      "version": "2.3.0",
+    "node_modules/p-try": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "p-try": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "../shadergraph/node_modules/p-try": {
-      "version": "2.2.0",
-      "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=6"
       }
     },
-    "../shadergraph/node_modules/pako": {
+    "node_modules/pako": {
       "version": "1.0.11",
-      "dev": true,
-      "license": "(MIT AND Zlib)"
+      "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
+      "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
+      "dev": true
     },
-    "../shadergraph/node_modules/parallel-transform": {
+    "node_modules/parallel-transform": {
       "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz",
+      "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "cyclist": "^1.0.1",
         "inherits": "^2.0.3",
         "readable-stream": "^2.1.5"
       }
     },
-    "../shadergraph/node_modules/parent-module": {
+    "node_modules/parent-module": {
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "callsites": "^3.0.0"
       },
@@ -6425,10 +7266,11 @@
         "node": ">=6"
       }
     },
-    "../shadergraph/node_modules/parse-asn1": {
+    "node_modules/parse-asn1": {
       "version": "5.1.6",
+      "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz",
+      "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==",
       "dev": true,
-      "license": "ISC",
       "dependencies": {
         "asn1.js": "^5.2.0",
         "browserify-aes": "^1.0.0",
@@ -6437,10 +7279,11 @@
         "safe-buffer": "^5.1.1"
       }
     },
-    "../shadergraph/node_modules/parse-filepath": {
+    "node_modules/parse-filepath": {
       "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz",
+      "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-absolute": "^1.0.0",
         "map-cache": "^0.2.0",
@@ -6450,10 +7293,11 @@
         "node": ">=0.8"
       }
     },
-    "../shadergraph/node_modules/parse-glob": {
+    "node_modules/parse-glob": {
       "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
+      "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "glob-base": "^0.3.0",
         "is-dotfile": "^1.0.0",
@@ -6464,18 +7308,20 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/parse-glob/node_modules/is-extglob": {
+    "node_modules/parse-glob/node_modules/is-extglob": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+      "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/parse-glob/node_modules/is-glob": {
+    "node_modules/parse-glob/node_modules/is-glob": {
       "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+      "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-extglob": "^1.0.0"
       },
@@ -6483,10 +7329,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/parse-json": {
+    "node_modules/parse-json": {
       "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+      "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "error-ex": "^1.2.0"
       },
@@ -6494,81 +7341,92 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/parse-node-version": {
+    "node_modules/parse-node-version": {
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz",
+      "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">= 0.10"
       }
     },
-    "../shadergraph/node_modules/parse-passwd": {
+    "node_modules/parse-passwd": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
+      "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/parseurl": {
+    "node_modules/parseurl": {
       "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+      "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">= 0.8"
       }
     },
-    "../shadergraph/node_modules/pascalcase": {
+    "node_modules/pascalcase": {
       "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+      "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/path-browserify": {
+    "node_modules/path-browserify": {
       "version": "0.0.1",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz",
+      "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==",
+      "dev": true
     },
-    "../shadergraph/node_modules/path-dirname": {
+    "node_modules/path-dirname": {
       "version": "1.0.2",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+      "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+      "dev": true
     },
-    "../shadergraph/node_modules/path-exists": {
+    "node_modules/path-exists": {
       "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
     },
-    "../shadergraph/node_modules/path-is-absolute": {
+    "node_modules/path-is-absolute": {
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/path-key": {
+    "node_modules/path-key": {
       "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
     },
-    "../shadergraph/node_modules/path-parse": {
+    "node_modules/path-parse": {
       "version": "1.0.7",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+      "dev": true
     },
-    "../shadergraph/node_modules/path-root": {
+    "node_modules/path-root": {
       "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz",
+      "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "path-root-regex": "^0.1.0"
       },
@@ -6576,18 +7434,20 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/path-root-regex": {
+    "node_modules/path-root-regex": {
       "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz",
+      "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/path-type": {
+    "node_modules/path-type": {
       "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
+      "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "graceful-fs": "^4.1.2",
         "pify": "^2.0.0",
@@ -6597,10 +7457,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/pbkdf2": {
+    "node_modules/pbkdf2": {
       "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz",
+      "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "create-hash": "^1.1.2",
         "create-hmac": "^1.1.4",
@@ -6612,10 +7473,17 @@
         "node": ">=0.12"
       }
     },
-    "../shadergraph/node_modules/picomatch": {
-      "version": "2.3.0",
+    "node_modules/picocolors": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+      "dev": true
+    },
+    "node_modules/picomatch": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=8.6"
       },
@@ -6623,26 +7491,29 @@
         "url": "https://github.com/sponsors/jonschlinkert"
       }
     },
-    "../shadergraph/node_modules/pify": {
+    "node_modules/pify": {
       "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+      "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/pinkie": {
+    "node_modules/pinkie": {
       "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+      "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/pinkie-promise": {
+    "node_modules/pinkie-promise": {
       "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+      "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "pinkie": "^2.0.0"
       },
@@ -6650,10 +7521,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/pkg-dir": {
+    "node_modules/pkg-dir": {
       "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+      "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "find-up": "^4.0.0"
       },
@@ -6661,10 +7533,11 @@
         "node": ">=8"
       }
     },
-    "../shadergraph/node_modules/plugin-error": {
+    "node_modules/plugin-error": {
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz",
+      "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "ansi-colors": "^1.0.1",
         "arr-diff": "^4.0.0",
@@ -6675,10 +7548,11 @@
         "node": ">= 0.10"
       }
     },
-    "../shadergraph/node_modules/plugin-error/node_modules/ansi-colors": {
+    "node_modules/plugin-error/node_modules/ansi-colors": {
       "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
+      "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "ansi-wrap": "^0.1.0"
       },
@@ -6686,10 +7560,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/plugin-error/node_modules/extend-shallow": {
+    "node_modules/plugin-error/node_modules/extend-shallow": {
       "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+      "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "assign-symbols": "^1.0.0",
         "is-extendable": "^1.0.1"
@@ -6698,10 +7573,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/plugin-error/node_modules/is-extendable": {
+    "node_modules/plugin-error/node_modules/is-extendable": {
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+      "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-plain-object": "^2.0.4"
       },
@@ -6709,10 +7585,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/plugin-error/node_modules/is-plain-object": {
+    "node_modules/plugin-error/node_modules/is-plain-object": {
       "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "isobject": "^3.0.1"
       },
@@ -6720,34 +7597,38 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/posix-character-classes": {
+    "node_modules/posix-character-classes": {
       "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+      "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/prelude-ls": {
+    "node_modules/prelude-ls": {
       "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+      "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">= 0.8.0"
       }
     },
-    "../shadergraph/node_modules/preserve": {
+    "node_modules/preserve": {
       "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
+      "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/prettier": {
+    "node_modules/prettier": {
       "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.1.tgz",
+      "integrity": "sha512-p+vNbgpLjif/+D+DwAZAbndtRrR0md0MwfmOVN9N+2RgyACMT+7tfaRnT+WDPkqnuVwleyuBIG2XBxKDme3hPA==",
       "dev": true,
-      "license": "MIT",
       "bin": {
         "prettier": "bin-prettier.js"
       },
@@ -6755,49 +7636,56 @@
         "node": ">=10.13.0"
       }
     },
-    "../shadergraph/node_modules/pretty-hrtime": {
+    "node_modules/pretty-hrtime": {
       "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz",
+      "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">= 0.8"
       }
     },
-    "../shadergraph/node_modules/process": {
+    "node_modules/process": {
       "version": "0.11.10",
+      "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+      "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">= 0.6.0"
       }
     },
-    "../shadergraph/node_modules/process-nextick-args": {
+    "node_modules/process-nextick-args": {
       "version": "2.0.1",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+      "dev": true
     },
-    "../shadergraph/node_modules/progress": {
+    "node_modules/progress": {
       "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+      "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.4.0"
       }
     },
-    "../shadergraph/node_modules/promise-inflight": {
+    "node_modules/promise-inflight": {
       "version": "1.0.1",
-      "dev": true,
-      "license": "ISC"
+      "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
+      "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=",
+      "dev": true
     },
-    "../shadergraph/node_modules/prr": {
+    "node_modules/prr": {
       "version": "1.0.1",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
+      "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
+      "dev": true
     },
-    "../shadergraph/node_modules/public-encrypt": {
+    "node_modules/public-encrypt": {
       "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
+      "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "bn.js": "^4.1.0",
         "browserify-rsa": "^4.0.0",
@@ -6807,72 +7695,87 @@
         "safe-buffer": "^5.1.2"
       }
     },
-    "../shadergraph/node_modules/public-encrypt/node_modules/bn.js": {
+    "node_modules/public-encrypt/node_modules/bn.js": {
       "version": "4.12.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+      "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+      "dev": true
     },
-    "../shadergraph/node_modules/pump": {
+    "node_modules/pump": {
       "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
+      "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "end-of-stream": "^1.1.0",
         "once": "^1.3.1"
       }
     },
-    "../shadergraph/node_modules/pumpify": {
+    "node_modules/pumpify": {
       "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz",
+      "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "duplexify": "^3.6.0",
         "inherits": "^2.0.3",
         "pump": "^2.0.0"
       }
     },
-    "../shadergraph/node_modules/punycode": {
+    "node_modules/punycode": {
       "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=6"
       }
     },
-    "../shadergraph/node_modules/qjobs": {
+    "node_modules/qjobs": {
       "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz",
+      "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.9"
       }
     },
-    "../shadergraph/node_modules/qs": {
-      "version": "6.7.0",
+    "node_modules/qs": {
+      "version": "6.9.7",
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz",
+      "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==",
       "dev": true,
-      "license": "BSD-3-Clause",
       "engines": {
         "node": ">=0.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "../shadergraph/node_modules/querystring": {
+    "node_modules/querystring": {
       "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
+      "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
+      "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.",
       "dev": true,
       "engines": {
         "node": ">=0.4.x"
       }
     },
-    "../shadergraph/node_modules/querystring-es3": {
+    "node_modules/querystring-es3": {
       "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
+      "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=",
       "dev": true,
       "engines": {
         "node": ">=0.4.x"
       }
     },
-    "../shadergraph/node_modules/randomatic": {
+    "node_modules/randomatic": {
       "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz",
+      "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-number": "^4.0.0",
         "kind-of": "^6.0.0",
@@ -6882,54 +7785,60 @@
         "node": ">= 0.10.0"
       }
     },
-    "../shadergraph/node_modules/randomatic/node_modules/is-number": {
+    "node_modules/randomatic/node_modules/is-number": {
       "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+      "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/randomatic/node_modules/kind-of": {
+    "node_modules/randomatic/node_modules/kind-of": {
       "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/randombytes": {
+    "node_modules/randombytes": {
       "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+      "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "safe-buffer": "^5.1.0"
       }
     },
-    "../shadergraph/node_modules/randomfill": {
+    "node_modules/randomfill": {
       "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
+      "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "randombytes": "^2.0.5",
         "safe-buffer": "^5.1.0"
       }
     },
-    "../shadergraph/node_modules/range-parser": {
+    "node_modules/range-parser": {
       "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+      "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">= 0.6"
       }
     },
-    "../shadergraph/node_modules/raw-body": {
-      "version": "2.4.0",
+    "node_modules/raw-body": {
+      "version": "2.4.3",
+      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz",
+      "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "bytes": "3.1.0",
-        "http-errors": "1.7.2",
+        "bytes": "3.1.2",
+        "http-errors": "1.8.1",
         "iconv-lite": "0.4.24",
         "unpipe": "1.0.0"
       },
@@ -6937,10 +7846,11 @@
         "node": ">= 0.8"
       }
     },
-    "../shadergraph/node_modules/read-pkg": {
+    "node_modules/read-pkg": {
       "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
+      "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "load-json-file": "^1.0.0",
         "normalize-package-data": "^2.3.2",
@@ -6950,10 +7860,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/read-pkg-up": {
+    "node_modules/read-pkg-up": {
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
+      "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "find-up": "^1.0.0",
         "read-pkg": "^1.0.0"
@@ -6962,10 +7873,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/read-pkg-up/node_modules/find-up": {
+    "node_modules/read-pkg-up/node_modules/find-up": {
       "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
+      "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "path-exists": "^2.0.0",
         "pinkie-promise": "^2.0.0"
@@ -6974,10 +7886,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/read-pkg-up/node_modules/path-exists": {
+    "node_modules/read-pkg-up/node_modules/path-exists": {
       "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+      "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "pinkie-promise": "^2.0.0"
       },
@@ -6985,10 +7898,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/readable-stream": {
+    "node_modules/readable-stream": {
       "version": "2.3.7",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+      "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "core-util-is": "~1.0.0",
         "inherits": "~2.0.3",
@@ -6999,10 +7913,11 @@
         "util-deprecate": "~1.0.1"
       }
     },
-    "../shadergraph/node_modules/readdirp": {
+    "node_modules/readdirp": {
       "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
+      "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "graceful-fs": "^4.1.11",
         "micromatch": "^3.1.10",
@@ -7012,8 +7927,10 @@
         "node": ">=0.10"
       }
     },
-    "../shadergraph/node_modules/rechoir": {
+    "node_modules/rechoir": {
       "version": "0.6.2",
+      "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
+      "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
       "dev": true,
       "dependencies": {
         "resolve": "^1.1.6"
@@ -7022,10 +7939,11 @@
         "node": ">= 0.10"
       }
     },
-    "../shadergraph/node_modules/regex-cache": {
+    "node_modules/regex-cache": {
       "version": "0.4.4",
+      "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
+      "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-equal-shallow": "^0.1.3"
       },
@@ -7033,10 +7951,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/regex-not": {
+    "node_modules/regex-not": {
       "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+      "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "extend-shallow": "^3.0.2",
         "safe-regex": "^1.1.0"
@@ -7045,10 +7964,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/regex-not/node_modules/extend-shallow": {
+    "node_modules/regex-not/node_modules/extend-shallow": {
       "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+      "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "assign-symbols": "^1.0.0",
         "is-extendable": "^1.0.1"
@@ -7057,10 +7977,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/regex-not/node_modules/is-extendable": {
+    "node_modules/regex-not/node_modules/is-extendable": {
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+      "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-plain-object": "^2.0.4"
       },
@@ -7068,10 +7989,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/regex-not/node_modules/is-plain-object": {
+    "node_modules/regex-not/node_modules/is-plain-object": {
       "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "isobject": "^3.0.1"
       },
@@ -7079,10 +8001,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/regexpp": {
+    "node_modules/regexpp": {
       "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
+      "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=8"
       },
@@ -7090,10 +8013,11 @@
         "url": "https://github.com/sponsors/mysticatea"
       }
     },
-    "../shadergraph/node_modules/remove-bom-buffer": {
+    "node_modules/remove-bom-buffer": {
       "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz",
+      "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-buffer": "^1.1.5",
         "is-utf8": "^0.2.1"
@@ -7102,10 +8026,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/remove-bom-stream": {
+    "node_modules/remove-bom-stream": {
       "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz",
+      "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "remove-bom-buffer": "^3.0.0",
         "safe-buffer": "^5.1.0",
@@ -7115,48 +8040,44 @@
         "node": ">= 0.10"
       }
     },
-    "../shadergraph/node_modules/remove-bom-stream/node_modules/through2": {
-      "version": "2.0.5",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "readable-stream": "~2.3.6",
-        "xtend": "~4.0.1"
-      }
-    },
-    "../shadergraph/node_modules/remove-trailing-separator": {
+    "node_modules/remove-trailing-separator": {
       "version": "1.1.0",
-      "dev": true,
-      "license": "ISC"
+      "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
+      "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
+      "dev": true
     },
-    "../shadergraph/node_modules/repeat-element": {
+    "node_modules/repeat-element": {
       "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz",
+      "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/repeat-string": {
+    "node_modules/repeat-string": {
       "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+      "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10"
       }
     },
-    "../shadergraph/node_modules/replace-ext": {
+    "node_modules/replace-ext": {
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz",
+      "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">= 0.10"
       }
     },
-    "../shadergraph/node_modules/replace-homedir": {
+    "node_modules/replace-homedir": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz",
+      "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "homedir-polyfill": "^1.0.1",
         "is-absolute": "^1.0.0",
@@ -7166,48 +8087,58 @@
         "node": ">= 0.10"
       }
     },
-    "../shadergraph/node_modules/require-directory": {
+    "node_modules/require-directory": {
       "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/require-from-string": {
+    "node_modules/require-from-string": {
       "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+      "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/require-main-filename": {
+    "node_modules/require-main-filename": {
       "version": "1.0.1",
-      "dev": true,
-      "license": "ISC"
+      "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
+      "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
+      "dev": true
     },
-    "../shadergraph/node_modules/requires-port": {
+    "node_modules/requires-port": {
       "version": "1.0.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+      "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
+      "dev": true
     },
-    "../shadergraph/node_modules/resolve": {
-      "version": "1.20.0",
+    "node_modules/resolve": {
+      "version": "1.22.0",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz",
+      "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "is-core-module": "^2.2.0",
-        "path-parse": "^1.0.6"
+        "is-core-module": "^2.8.1",
+        "path-parse": "^1.0.7",
+        "supports-preserve-symlinks-flag": "^1.0.0"
+      },
+      "bin": {
+        "resolve": "bin/resolve"
       },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "../shadergraph/node_modules/resolve-cwd": {
+    "node_modules/resolve-cwd": {
       "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
+      "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "resolve-from": "^5.0.0"
       },
@@ -7215,18 +8146,20 @@
         "node": ">=8"
       }
     },
-    "../shadergraph/node_modules/resolve-cwd/node_modules/resolve-from": {
+    "node_modules/resolve-cwd/node_modules/resolve-from": {
       "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+      "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
     },
-    "../shadergraph/node_modules/resolve-dir": {
+    "node_modules/resolve-dir": {
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
+      "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "expand-tilde": "^2.0.0",
         "global-modules": "^1.0.0"
@@ -7235,18 +8168,20 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/resolve-from": {
+    "node_modules/resolve-from": {
       "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+      "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=4"
       }
     },
-    "../shadergraph/node_modules/resolve-options": {
+    "node_modules/resolve-options": {
       "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz",
+      "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "value-or-function": "^3.0.0"
       },
@@ -7254,15 +8189,18 @@
         "node": ">= 0.10"
       }
     },
-    "../shadergraph/node_modules/resolve-url": {
+    "node_modules/resolve-url": {
       "version": "0.2.1",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+      "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+      "deprecated": "https://github.com/lydell/resolve-url#deprecated",
+      "dev": true
     },
-    "../shadergraph/node_modules/restore-cursor": {
+    "node_modules/restore-cursor": {
       "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
+      "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "onetime": "^5.1.0",
         "signal-exit": "^3.0.2"
@@ -7271,23 +8209,26 @@
         "node": ">=8"
       }
     },
-    "../shadergraph/node_modules/ret": {
+    "node_modules/ret": {
       "version": "0.1.15",
+      "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+      "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.12"
       }
     },
-    "../shadergraph/node_modules/rfdc": {
+    "node_modules/rfdc": {
       "version": "1.3.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz",
+      "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==",
+      "dev": true
     },
-    "../shadergraph/node_modules/rimraf": {
+    "node_modules/rimraf": {
       "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
       "dev": true,
-      "license": "ISC",
       "dependencies": {
         "glob": "^7.1.3"
       },
@@ -7298,35 +8239,39 @@
         "url": "https://github.com/sponsors/isaacs"
       }
     },
-    "../shadergraph/node_modules/ripemd160": {
+    "node_modules/ripemd160": {
       "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
+      "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "hash-base": "^3.0.0",
         "inherits": "^2.0.1"
       }
     },
-    "../shadergraph/node_modules/run-async": {
+    "node_modules/run-async": {
       "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
+      "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.12.0"
       }
     },
-    "../shadergraph/node_modules/run-queue": {
+    "node_modules/run-queue": {
       "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz",
+      "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=",
       "dev": true,
-      "license": "ISC",
       "dependencies": {
         "aproba": "^1.1.1"
       }
     },
-    "../shadergraph/node_modules/rxjs": {
+    "node_modules/rxjs": {
       "version": "6.6.7",
+      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz",
+      "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==",
       "dev": true,
-      "license": "Apache-2.0",
       "dependencies": {
         "tslib": "^1.9.0"
       },
@@ -7334,30 +8279,34 @@
         "npm": ">=2.0.0"
       }
     },
-    "../shadergraph/node_modules/safe-buffer": {
+    "node_modules/safe-buffer": {
       "version": "5.1.2",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+      "dev": true
     },
-    "../shadergraph/node_modules/safe-regex": {
+    "node_modules/safe-regex": {
       "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+      "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "ret": "~0.1.10"
       }
     },
-    "../shadergraph/node_modules/safer-buffer": {
+    "node_modules/safer-buffer": {
       "version": "2.1.2",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+      "dev": true
     },
-    "../shadergraph/node_modules/schema-utils": {
-      "version": "3.0.0",
+    "node_modules/schema-utils": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
+      "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "@types/json-schema": "^7.0.6",
+        "@types/json-schema": "^7.0.8",
         "ajv": "^6.12.5",
         "ajv-keywords": "^3.5.2"
       },
@@ -7369,10 +8318,11 @@
         "url": "https://opencollective.com/webpack"
       }
     },
-    "../shadergraph/node_modules/semver": {
+    "node_modules/semver": {
       "version": "7.3.5",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+      "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
       "dev": true,
-      "license": "ISC",
       "dependencies": {
         "lru-cache": "^6.0.0"
       },
@@ -7383,10 +8333,11 @@
         "node": ">=10"
       }
     },
-    "../shadergraph/node_modules/semver-greatest-satisfied-range": {
+    "node_modules/semver-greatest-satisfied-range": {
       "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz",
+      "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "sver-compat": "^1.5.0"
       },
@@ -7394,23 +8345,26 @@
         "node": ">= 0.10"
       }
     },
-    "../shadergraph/node_modules/serialize-javascript": {
-      "version": "5.0.1",
+    "node_modules/serialize-javascript": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
+      "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
       "dev": true,
-      "license": "BSD-3-Clause",
       "dependencies": {
         "randombytes": "^2.1.0"
       }
     },
-    "../shadergraph/node_modules/set-blocking": {
+    "node_modules/set-blocking": {
       "version": "2.0.0",
-      "dev": true,
-      "license": "ISC"
+      "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
+      "dev": true
     },
-    "../shadergraph/node_modules/set-value": {
+    "node_modules/set-value": {
       "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
+      "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "extend-shallow": "^2.0.1",
         "is-extendable": "^0.1.1",
@@ -7421,10 +8375,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/set-value/node_modules/is-plain-object": {
+    "node_modules/set-value/node_modules/is-plain-object": {
       "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "isobject": "^3.0.1"
       },
@@ -7432,20 +8387,23 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/setimmediate": {
+    "node_modules/setimmediate": {
       "version": "1.0.5",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
+      "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=",
+      "dev": true
     },
-    "../shadergraph/node_modules/setprototypeof": {
-      "version": "1.1.1",
-      "dev": true,
-      "license": "ISC"
+    "node_modules/setprototypeof": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+      "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
+      "dev": true
     },
-    "../shadergraph/node_modules/sha.js": {
+    "node_modules/sha.js": {
       "version": "2.4.11",
+      "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
+      "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
       "dev": true,
-      "license": "(MIT AND BSD-3-Clause)",
       "dependencies": {
         "inherits": "^2.0.1",
         "safe-buffer": "^5.0.1"
@@ -7454,10 +8412,23 @@
         "sha.js": "bin.js"
       }
     },
-    "../shadergraph/node_modules/shallow-clone": {
+    "node_modules/shadergraph": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/shadergraph/-/shadergraph-2.1.3.tgz",
+      "integrity": "sha512-98Objdkj8OTNIuYG5wxkAZTdPsBEGXuDq8yveqQh0QVzBBkEObb6RA3sMozlOiWPQXycQ+Ng4ZmT2OJiokYplQ==",
+      "dependencies": {
+        "@sicmutils/glsl-parser": "^2.0.1",
+        "glsl-tokenizer": "^2.1.5"
+      },
+      "peerDependencies": {
+        "three": ">= 0.72.0"
+      }
+    },
+    "node_modules/shallow-clone": {
       "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
+      "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "kind-of": "^6.0.2"
       },
@@ -7465,18 +8436,20 @@
         "node": ">=8"
       }
     },
-    "../shadergraph/node_modules/shallow-clone/node_modules/kind-of": {
+    "node_modules/shallow-clone/node_modules/kind-of": {
       "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/shebang-command": {
+    "node_modules/shebang-command": {
       "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "shebang-regex": "^3.0.0"
       },
@@ -7484,31 +8457,35 @@
         "node": ">=8"
       }
     },
-    "../shadergraph/node_modules/shebang-regex": {
+    "node_modules/shebang-regex": {
       "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
     },
-    "../shadergraph/node_modules/signal-exit": {
-      "version": "3.0.3",
-      "dev": true,
-      "license": "ISC"
+    "node_modules/signal-exit": {
+      "version": "3.0.7",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+      "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+      "dev": true
     },
-    "../shadergraph/node_modules/slash": {
+    "node_modules/slash": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
+      "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/slice-ansi": {
+    "node_modules/slice-ansi": {
       "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+      "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "ansi-styles": "^4.0.0",
         "astral-regex": "^2.0.0",
@@ -7521,10 +8498,11 @@
         "url": "https://github.com/chalk/slice-ansi?sponsor=1"
       }
     },
-    "../shadergraph/node_modules/snapdragon": {
+    "node_modules/snapdragon": {
       "version": "0.8.2",
+      "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+      "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "base": "^0.11.1",
         "debug": "^2.2.0",
@@ -7539,10 +8517,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/snapdragon-node": {
+    "node_modules/snapdragon-node": {
       "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+      "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "define-property": "^1.0.0",
         "isobject": "^3.0.0",
@@ -7552,10 +8531,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/snapdragon-node/node_modules/define-property": {
+    "node_modules/snapdragon-node/node_modules/define-property": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+      "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-descriptor": "^1.0.0"
       },
@@ -7563,10 +8543,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/snapdragon-util": {
+    "node_modules/snapdragon-util": {
       "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+      "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "kind-of": "^3.2.0"
       },
@@ -7574,10 +8555,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/snapdragon-util/node_modules/kind-of": {
+    "node_modules/snapdragon-util/node_modules/kind-of": {
       "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-buffer": "^1.1.5"
       },
@@ -7585,18 +8567,20 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/snapdragon/node_modules/debug": {
+    "node_modules/snapdragon/node_modules/debug": {
       "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "ms": "2.0.0"
       }
     },
-    "../shadergraph/node_modules/snapdragon/node_modules/define-property": {
+    "node_modules/snapdragon/node_modules/define-property": {
       "version": "0.2.5",
+      "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+      "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-descriptor": "^0.1.0"
       },
@@ -7604,10 +8588,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/snapdragon/node_modules/is-accessor-descriptor": {
+    "node_modules/snapdragon/node_modules/is-accessor-descriptor": {
       "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+      "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "kind-of": "^3.0.2"
       },
@@ -7615,10 +8600,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": {
+    "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": {
       "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-buffer": "^1.1.5"
       },
@@ -7626,10 +8612,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/snapdragon/node_modules/is-data-descriptor": {
+    "node_modules/snapdragon/node_modules/is-data-descriptor": {
       "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+      "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "kind-of": "^3.0.2"
       },
@@ -7637,10 +8624,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": {
+    "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": {
       "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-buffer": "^1.1.5"
       },
@@ -7648,10 +8636,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/snapdragon/node_modules/is-descriptor": {
+    "node_modules/snapdragon/node_modules/is-descriptor": {
       "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+      "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-accessor-descriptor": "^0.1.6",
         "is-data-descriptor": "^0.1.4",
@@ -7661,47 +8650,49 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/snapdragon/node_modules/ms": {
+    "node_modules/snapdragon/node_modules/ms": {
       "version": "2.0.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+      "dev": true
     },
-    "../shadergraph/node_modules/snapdragon/node_modules/source-map": {
+    "node_modules/snapdragon/node_modules/source-map": {
       "version": "0.5.7",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+      "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
       "dev": true,
-      "license": "BSD-3-Clause",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/socket.io": {
-      "version": "3.1.2",
+    "node_modules/socket.io": {
+      "version": "4.4.1",
+      "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.4.1.tgz",
+      "integrity": "sha512-s04vrBswdQBUmuWJuuNTmXUVJhP0cVky8bBDhdkf8y0Ptsu7fKU2LuLbts9g+pdmAdyMMn8F/9Mf1/wbtUN0fg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "@types/cookie": "^0.4.0",
-        "@types/cors": "^2.8.8",
-        "@types/node": ">=10.0.0",
         "accepts": "~1.3.4",
         "base64id": "~2.0.0",
-        "debug": "~4.3.1",
-        "engine.io": "~4.1.0",
-        "socket.io-adapter": "~2.1.0",
-        "socket.io-parser": "~4.0.3"
+        "debug": "~4.3.2",
+        "engine.io": "~6.1.0",
+        "socket.io-adapter": "~2.3.3",
+        "socket.io-parser": "~4.0.4"
       },
       "engines": {
         "node": ">=10.0.0"
       }
     },
-    "../shadergraph/node_modules/socket.io-adapter": {
-      "version": "2.1.0",
-      "dev": true,
-      "license": "MIT"
+    "node_modules/socket.io-adapter": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.3.tgz",
+      "integrity": "sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ==",
+      "dev": true
     },
-    "../shadergraph/node_modules/socket.io-parser": {
+    "node_modules/socket.io-parser": {
       "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz",
+      "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "@types/component-emitter": "^1.2.10",
         "component-emitter": "~1.3.0",
@@ -7711,23 +8702,27 @@
         "node": ">=10.0.0"
       }
     },
-    "../shadergraph/node_modules/source-list-map": {
+    "node_modules/source-list-map": {
       "version": "2.0.1",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
+      "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==",
+      "dev": true
     },
-    "../shadergraph/node_modules/source-map": {
+    "node_modules/source-map": {
       "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
       "dev": true,
-      "license": "BSD-3-Clause",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/source-map-resolve": {
+    "node_modules/source-map-resolve": {
       "version": "0.5.3",
+      "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
+      "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
+      "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "atob": "^2.1.2",
         "decode-uri-component": "^0.2.0",
@@ -7736,60 +8731,75 @@
         "urix": "^0.1.0"
       }
     },
-    "../shadergraph/node_modules/source-map-support": {
-      "version": "0.5.19",
+    "node_modules/source-map-support": {
+      "version": "0.5.21",
+      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+      "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "buffer-from": "^1.0.0",
         "source-map": "^0.6.0"
       }
     },
-    "../shadergraph/node_modules/source-map-url": {
+    "node_modules/source-map-url": {
       "version": "0.4.1",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz",
+      "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==",
+      "deprecated": "See https://github.com/lydell/source-map-url#deprecated",
+      "dev": true
     },
-    "../shadergraph/node_modules/sparkles": {
+    "node_modules/sparkles": {
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz",
+      "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">= 0.10"
       }
     },
-    "../shadergraph/node_modules/spdx-correct": {
+    "node_modules/spawn-command": {
+      "version": "0.0.2-1",
+      "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz",
+      "integrity": "sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=",
+      "dev": true
+    },
+    "node_modules/spdx-correct": {
       "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
+      "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
       "dev": true,
-      "license": "Apache-2.0",
       "dependencies": {
         "spdx-expression-parse": "^3.0.0",
         "spdx-license-ids": "^3.0.0"
       }
     },
-    "../shadergraph/node_modules/spdx-exceptions": {
+    "node_modules/spdx-exceptions": {
       "version": "2.3.0",
-      "dev": true,
-      "license": "CC-BY-3.0"
+      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
+      "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
+      "dev": true
     },
-    "../shadergraph/node_modules/spdx-expression-parse": {
+    "node_modules/spdx-expression-parse": {
       "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+      "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "spdx-exceptions": "^2.1.0",
         "spdx-license-ids": "^3.0.0"
       }
     },
-    "../shadergraph/node_modules/spdx-license-ids": {
-      "version": "3.0.9",
-      "dev": true,
-      "license": "CC0-1.0"
+    "node_modules/spdx-license-ids": {
+      "version": "3.0.11",
+      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz",
+      "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==",
+      "dev": true
     },
-    "../shadergraph/node_modules/split-string": {
+    "node_modules/split-string": {
       "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+      "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "extend-shallow": "^3.0.0"
       },
@@ -7797,10 +8807,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/split-string/node_modules/extend-shallow": {
+    "node_modules/split-string/node_modules/extend-shallow": {
       "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+      "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "assign-symbols": "^1.0.0",
         "is-extendable": "^1.0.1"
@@ -7809,10 +8820,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/split-string/node_modules/is-extendable": {
+    "node_modules/split-string/node_modules/is-extendable": {
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+      "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-plain-object": "^2.0.4"
       },
@@ -7820,10 +8832,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/split-string/node_modules/is-plain-object": {
+    "node_modules/split-string/node_modules/is-plain-object": {
       "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "isobject": "^3.0.1"
       },
@@ -7831,31 +8844,35 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/sprintf-js": {
+    "node_modules/sprintf-js": {
       "version": "1.0.3",
-      "dev": true,
-      "license": "BSD-3-Clause"
+      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+      "dev": true
     },
-    "../shadergraph/node_modules/ssri": {
+    "node_modules/ssri": {
       "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz",
+      "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==",
       "dev": true,
-      "license": "ISC",
       "dependencies": {
         "figgy-pudding": "^3.5.1"
       }
     },
-    "../shadergraph/node_modules/stack-trace": {
+    "node_modules/stack-trace": {
       "version": "0.0.10",
+      "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+      "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": "*"
       }
     },
-    "../shadergraph/node_modules/static-extend": {
+    "node_modules/static-extend": {
       "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+      "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "define-property": "^0.2.5",
         "object-copy": "^0.1.0"
@@ -7864,10 +8881,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/static-extend/node_modules/define-property": {
+    "node_modules/static-extend/node_modules/define-property": {
       "version": "0.2.5",
+      "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+      "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-descriptor": "^0.1.0"
       },
@@ -7875,10 +8893,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/static-extend/node_modules/is-accessor-descriptor": {
+    "node_modules/static-extend/node_modules/is-accessor-descriptor": {
       "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+      "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "kind-of": "^3.0.2"
       },
@@ -7886,10 +8905,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": {
+    "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": {
       "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-buffer": "^1.1.5"
       },
@@ -7897,10 +8917,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/static-extend/node_modules/is-data-descriptor": {
+    "node_modules/static-extend/node_modules/is-data-descriptor": {
       "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+      "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "kind-of": "^3.0.2"
       },
@@ -7908,10 +8929,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": {
+    "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": {
       "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-buffer": "^1.1.5"
       },
@@ -7919,10 +8941,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/static-extend/node_modules/is-descriptor": {
+    "node_modules/static-extend/node_modules/is-descriptor": {
       "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+      "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-accessor-descriptor": "^0.1.6",
         "is-data-descriptor": "^0.1.4",
@@ -7932,41 +8955,41 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/statuses": {
+    "node_modules/stats.js": {
+      "version": "0.17.0",
+      "resolved": "https://registry.npmjs.org/stats.js/-/stats.js-0.17.0.tgz",
+      "integrity": "sha1-scPcRtlEmLV4t/05hbgaznExzH0="
+    },
+    "node_modules/statuses": {
       "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+      "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">= 0.6"
       }
     },
-    "../shadergraph/node_modules/stream-browserify": {
-      "version": "2.0.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "inherits": "~2.0.1",
-        "readable-stream": "^2.0.2"
-      }
-    },
-    "../shadergraph/node_modules/stream-each": {
+    "node_modules/stream-each": {
       "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz",
+      "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "end-of-stream": "^1.1.0",
         "stream-shift": "^1.0.0"
       }
     },
-    "../shadergraph/node_modules/stream-exhaust": {
+    "node_modules/stream-exhaust": {
       "version": "1.0.2",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz",
+      "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==",
+      "dev": true
     },
-    "../shadergraph/node_modules/stream-http": {
+    "node_modules/stream-http": {
       "version": "2.8.3",
+      "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz",
+      "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "builtin-status-codes": "^3.0.0",
         "inherits": "^2.0.1",
@@ -7975,68 +8998,66 @@
         "xtend": "^4.0.0"
       }
     },
-    "../shadergraph/node_modules/stream-shift": {
+    "node_modules/stream-shift": {
       "version": "1.0.1",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz",
+      "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==",
+      "dev": true
     },
-    "../shadergraph/node_modules/streamroller": {
-      "version": "2.2.4",
+    "node_modules/streamroller": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.0.2.tgz",
+      "integrity": "sha512-ur6y5S5dopOaRXBuRIZ1u6GC5bcEXHRZKgfBjfCglMhmIf+roVCECjvkEYzNQOXIN2/JPnkMPW/8B3CZoKaEPA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "date-format": "^2.1.0",
+        "date-format": "^4.0.3",
         "debug": "^4.1.1",
-        "fs-extra": "^8.1.0"
+        "fs-extra": "^10.0.0"
       },
       "engines": {
         "node": ">=8.0"
       }
     },
-    "../shadergraph/node_modules/streamroller/node_modules/date-format": {
-      "version": "2.1.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=4.0"
-      }
-    },
-    "../shadergraph/node_modules/string_decoder": {
+    "node_modules/string_decoder": {
       "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "safe-buffer": "~5.1.0"
       }
     },
-    "../shadergraph/node_modules/string-width": {
-      "version": "4.2.2",
+    "node_modules/string-width": {
+      "version": "4.2.3",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "emoji-regex": "^8.0.0",
         "is-fullwidth-code-point": "^3.0.0",
-        "strip-ansi": "^6.0.0"
+        "strip-ansi": "^6.0.1"
       },
       "engines": {
         "node": ">=8"
       }
     },
-    "../shadergraph/node_modules/strip-ansi": {
-      "version": "6.0.0",
+    "node_modules/strip-ansi": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "ansi-regex": "^5.0.0"
+        "ansi-regex": "^5.0.1"
       },
       "engines": {
         "node": ">=8"
       }
     },
-    "../shadergraph/node_modules/strip-bom": {
+    "node_modules/strip-bom": {
       "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+      "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-utf8": "^0.2.0"
       },
@@ -8044,10 +9065,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/strip-bom-stream": {
+    "node_modules/strip-bom-stream": {
       "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz",
+      "integrity": "sha1-+H217yYT9paKpUWr/h7HKLaoKco=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "first-chunk-stream": "^2.0.0",
         "strip-bom": "^2.0.0"
@@ -8056,18 +9078,20 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/strip-final-newline": {
+    "node_modules/strip-final-newline": {
       "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+      "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=6"
       }
     },
-    "../shadergraph/node_modules/strip-json-comments": {
+    "node_modules/strip-json-comments": {
       "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=8"
       },
@@ -8075,10 +9099,11 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "../shadergraph/node_modules/supports-color": {
+    "node_modules/supports-color": {
       "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "has-flag": "^4.0.0"
       },
@@ -8086,35 +9111,49 @@
         "node": ">=8"
       }
     },
-    "../shadergraph/node_modules/sver-compat": {
+    "node_modules/supports-preserve-symlinks-flag": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+      "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/sver-compat": {
       "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz",
+      "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "es6-iterator": "^2.0.1",
         "es6-symbol": "^3.1.1"
       }
     },
-    "../shadergraph/node_modules/table": {
-      "version": "6.7.1",
+    "node_modules/table": {
+      "version": "6.8.0",
+      "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz",
+      "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==",
       "dev": true,
-      "license": "BSD-3-Clause",
       "dependencies": {
         "ajv": "^8.0.1",
-        "lodash.clonedeep": "^4.5.0",
         "lodash.truncate": "^4.4.2",
         "slice-ansi": "^4.0.0",
-        "string-width": "^4.2.0",
-        "strip-ansi": "^6.0.0"
+        "string-width": "^4.2.3",
+        "strip-ansi": "^6.0.1"
       },
       "engines": {
         "node": ">=10.0.0"
       }
     },
-    "../shadergraph/node_modules/table/node_modules/ajv": {
-      "version": "8.6.0",
+    "node_modules/table/node_modules/ajv": {
+      "version": "8.10.0",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz",
+      "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "fast-deep-equal": "^3.1.1",
         "json-schema-traverse": "^1.0.0",
@@ -8126,46 +9165,49 @@
         "url": "https://github.com/sponsors/epoberezkin"
       }
     },
-    "../shadergraph/node_modules/table/node_modules/json-schema-traverse": {
+    "node_modules/table/node_modules/json-schema-traverse": {
       "version": "1.0.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+      "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+      "dev": true
     },
-    "../shadergraph/node_modules/tapable": {
-      "version": "2.2.0",
+    "node_modules/tapable": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
+      "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=6"
       }
     },
-    "../shadergraph/node_modules/terser": {
-      "version": "5.7.0",
+    "node_modules/terser": {
+      "version": "4.8.0",
+      "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz",
+      "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==",
       "dev": true,
-      "license": "BSD-2-Clause",
       "dependencies": {
         "commander": "^2.20.0",
-        "source-map": "~0.7.2",
-        "source-map-support": "~0.5.19"
+        "source-map": "~0.6.1",
+        "source-map-support": "~0.5.12"
       },
       "bin": {
         "terser": "bin/terser"
       },
       "engines": {
-        "node": ">=10"
+        "node": ">=6.0.0"
       }
     },
-    "../shadergraph/node_modules/terser-webpack-plugin": {
-      "version": "5.1.3",
+    "node_modules/terser-webpack-plugin": {
+      "version": "5.3.1",
+      "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz",
+      "integrity": "sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "jest-worker": "^27.0.2",
-        "p-limit": "^3.1.0",
-        "schema-utils": "^3.0.0",
-        "serialize-javascript": "^5.0.1",
+        "jest-worker": "^27.4.5",
+        "schema-utils": "^3.1.1",
+        "serialize-javascript": "^6.0.0",
         "source-map": "^0.6.1",
-        "terser": "^5.7.0"
+        "terser": "^5.7.2"
       },
       "engines": {
         "node": ">= 10.13.0"
@@ -8176,86 +9218,142 @@
       },
       "peerDependencies": {
         "webpack": "^5.1.0"
+      },
+      "peerDependenciesMeta": {
+        "@swc/core": {
+          "optional": true
+        },
+        "esbuild": {
+          "optional": true
+        },
+        "uglify-js": {
+          "optional": true
+        }
       }
     },
-    "../shadergraph/node_modules/terser/node_modules/source-map": {
+    "node_modules/terser-webpack-plugin/node_modules/acorn": {
+      "version": "8.7.0",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz",
+      "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==",
+      "dev": true,
+      "optional": true,
+      "peer": true,
+      "bin": {
+        "acorn": "bin/acorn"
+      },
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/terser-webpack-plugin/node_modules/commander": {
+      "version": "2.20.3",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+      "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+      "dev": true
+    },
+    "node_modules/terser-webpack-plugin/node_modules/terser": {
+      "version": "5.10.0",
+      "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz",
+      "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==",
+      "dev": true,
+      "dependencies": {
+        "commander": "^2.20.0",
+        "source-map": "~0.7.2",
+        "source-map-support": "~0.5.20"
+      },
+      "bin": {
+        "terser": "bin/terser"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "peerDependencies": {
+        "acorn": "^8.5.0"
+      },
+      "peerDependenciesMeta": {
+        "acorn": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/terser-webpack-plugin/node_modules/terser/node_modules/source-map": {
       "version": "0.7.3",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
+      "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
       "dev": true,
-      "license": "BSD-3-Clause",
       "engines": {
         "node": ">= 8"
       }
     },
-    "../shadergraph/node_modules/text-table": {
+    "node_modules/terser/node_modules/commander": {
+      "version": "2.20.3",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+      "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+      "dev": true
+    },
+    "node_modules/text-table": {
       "version": "0.2.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+      "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+      "dev": true
     },
-    "../shadergraph/node_modules/three": {
-      "version": "0.129.0",
-      "license": "MIT",
+    "node_modules/three": {
+      "version": "0.137.5",
+      "resolved": "https://registry.npmjs.org/three/-/three-0.137.5.tgz",
+      "integrity": "sha512-rTyr+HDFxjnN8+N/guZjDgfVxgHptZQpf6xfL/Mo7a5JYIFwK6tAq3bzxYYB4Ae0RosDZlDuP+X5aXDXz+XnHQ==",
       "peer": true
     },
-    "../shadergraph/node_modules/through": {
-      "version": "2.3.4",
-      "license": "MIT"
-    },
-    "../shadergraph/node_modules/through2": {
-      "version": "0.6.5",
-      "license": "MIT",
+    "node_modules/threestrap": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/threestrap/-/threestrap-0.4.1.tgz",
+      "integrity": "sha512-YGwdfKxTN1Jjq5eq1AHPdeAQiKiBWB22TxxQqTapoLznVeM4RdMm1Vh/Lyu6jLNlYapLmqb+NxQBxHaKwgABhw==",
       "dependencies": {
-        "readable-stream": ">=1.0.33-1 <1.1.0-0",
-        "xtend": ">=4.0.0 <4.1.0-0"
+        "stats.js": "^0.17.0"
+      },
+      "peerDependencies": {
+        "three": ">=0.118.0"
       }
     },
-    "../shadergraph/node_modules/through2-filter": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "through2": "~2.0.0",
-        "xtend": "~4.0.0"
-      }
+    "node_modules/through": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
+      "dev": true
     },
-    "../shadergraph/node_modules/through2-filter/node_modules/through2": {
+    "node_modules/through2": {
       "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+      "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "readable-stream": "~2.3.6",
         "xtend": "~4.0.1"
       }
     },
-    "../shadergraph/node_modules/through2/node_modules/isarray": {
-      "version": "0.0.1",
-      "license": "MIT"
-    },
-    "../shadergraph/node_modules/through2/node_modules/readable-stream": {
-      "version": "1.0.34",
-      "license": "MIT",
+    "node_modules/through2-filter": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz",
+      "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==",
+      "dev": true,
       "dependencies": {
-        "core-util-is": "~1.0.0",
-        "inherits": "~2.0.1",
-        "isarray": "0.0.1",
-        "string_decoder": "~0.10.x"
+        "through2": "~2.0.0",
+        "xtend": "~4.0.0"
       }
     },
-    "../shadergraph/node_modules/through2/node_modules/string_decoder": {
-      "version": "0.10.31",
-      "license": "MIT"
-    },
-    "../shadergraph/node_modules/time-stamp": {
+    "node_modules/time-stamp": {
       "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz",
+      "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/timers-browserify": {
+    "node_modules/timers-browserify": {
       "version": "2.0.12",
+      "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz",
+      "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "setimmediate": "^1.0.4"
       },
@@ -8263,10 +9361,11 @@
         "node": ">=0.6.0"
       }
     },
-    "../shadergraph/node_modules/tmp": {
+    "node_modules/tmp": {
       "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz",
+      "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "rimraf": "^3.0.0"
       },
@@ -8274,10 +9373,11 @@
         "node": ">=8.17.0"
       }
     },
-    "../shadergraph/node_modules/to-absolute-glob": {
+    "node_modules/to-absolute-glob": {
       "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz",
+      "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-absolute": "^1.0.0",
         "is-negated-glob": "^1.0.0"
@@ -8286,15 +9386,17 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/to-arraybuffer": {
+    "node_modules/to-arraybuffer": {
       "version": "1.0.1",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
+      "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=",
+      "dev": true
     },
-    "../shadergraph/node_modules/to-object-path": {
+    "node_modules/to-object-path": {
       "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+      "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "kind-of": "^3.0.2"
       },
@@ -8302,10 +9404,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/to-object-path/node_modules/kind-of": {
+    "node_modules/to-object-path/node_modules/kind-of": {
       "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-buffer": "^1.1.5"
       },
@@ -8313,10 +9416,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/to-regex": {
+    "node_modules/to-regex": {
       "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+      "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "define-property": "^2.0.2",
         "extend-shallow": "^3.0.2",
@@ -8327,10 +9431,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/to-regex-range": {
+    "node_modules/to-regex-range": {
       "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+      "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-number": "^3.0.0",
         "repeat-string": "^1.6.1"
@@ -8339,10 +9444,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/to-regex/node_modules/extend-shallow": {
+    "node_modules/to-regex/node_modules/extend-shallow": {
       "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+      "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "assign-symbols": "^1.0.0",
         "is-extendable": "^1.0.1"
@@ -8351,10 +9457,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/to-regex/node_modules/is-extendable": {
+    "node_modules/to-regex/node_modules/is-extendable": {
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+      "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-plain-object": "^2.0.4"
       },
@@ -8362,10 +9469,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/to-regex/node_modules/is-plain-object": {
+    "node_modules/to-regex/node_modules/is-plain-object": {
       "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "isobject": "^3.0.1"
       },
@@ -8373,10 +9481,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/to-through": {
+    "node_modules/to-through": {
       "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz",
+      "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "through2": "^2.0.3"
       },
@@ -8384,42 +9493,47 @@
         "node": ">= 0.10"
       }
     },
-    "../shadergraph/node_modules/to-through/node_modules/through2": {
-      "version": "2.0.5",
+    "node_modules/toidentifier": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+      "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "readable-stream": "~2.3.6",
-        "xtend": "~4.0.1"
+      "engines": {
+        "node": ">=0.6"
       }
     },
-    "../shadergraph/node_modules/toidentifier": {
-      "version": "1.0.0",
+    "node_modules/tree-kill": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
+      "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
       "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.6"
+      "bin": {
+        "tree-kill": "cli.js"
       }
     },
-    "../shadergraph/node_modules/tslib": {
+    "node_modules/tslib": {
       "version": "1.14.1",
-      "dev": true,
-      "license": "0BSD"
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+      "dev": true
     },
-    "../shadergraph/node_modules/tty-browserify": {
+    "node_modules/tty-browserify": {
       "version": "0.0.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
+      "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=",
+      "dev": true
     },
-    "../shadergraph/node_modules/type": {
+    "node_modules/type": {
       "version": "1.2.0",
-      "dev": true,
-      "license": "ISC"
+      "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
+      "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==",
+      "dev": true
     },
-    "../shadergraph/node_modules/type-check": {
+    "node_modules/type-check": {
       "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+      "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "prelude-ls": "^1.2.1"
       },
@@ -8427,10 +9541,11 @@
         "node": ">= 0.8.0"
       }
     },
-    "../shadergraph/node_modules/type-fest": {
+    "node_modules/type-fest": {
       "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+      "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
       "dev": true,
-      "license": "(MIT OR CC0-1.0)",
       "engines": {
         "node": ">=10"
       },
@@ -8438,10 +9553,11 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "../shadergraph/node_modules/type-is": {
+    "node_modules/type-is": {
       "version": "1.6.18",
+      "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+      "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "media-typer": "0.3.0",
         "mime-types": "~2.1.24"
@@ -8450,13 +9566,16 @@
         "node": ">= 0.6"
       }
     },
-    "../shadergraph/node_modules/typedarray": {
+    "node_modules/typedarray": {
       "version": "0.0.6",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+      "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
+      "dev": true
     },
-    "../shadergraph/node_modules/ua-parser-js": {
-      "version": "0.7.28",
+    "node_modules/ua-parser-js": {
+      "version": "0.7.31",
+      "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz",
+      "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==",
       "dev": true,
       "funding": [
         {
@@ -8468,23 +9587,24 @@
           "url": "https://paypal.me/faisalman"
         }
       ],
-      "license": "MIT",
       "engines": {
         "node": "*"
       }
     },
-    "../shadergraph/node_modules/unc-path-regex": {
+    "node_modules/unc-path-regex": {
       "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
+      "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/undertaker": {
+    "node_modules/undertaker": {
       "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.3.0.tgz",
+      "integrity": "sha512-/RXwi5m/Mu3H6IHQGww3GNt1PNXlbeCuclF2QYR14L/2CHPz3DFZkvB5hZ0N/QUkiXWCACML2jXViIQEQc2MLg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "arr-flatten": "^1.0.1",
         "arr-map": "^2.0.0",
@@ -8501,23 +9621,26 @@
         "node": ">= 0.10"
       }
     },
-    "../shadergraph/node_modules/undertaker-registry": {
+    "node_modules/undertaker-registry": {
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz",
+      "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">= 0.10"
       }
     },
-    "../shadergraph/node_modules/undertaker/node_modules/fast-levenshtein": {
+    "node_modules/undertaker/node_modules/fast-levenshtein": {
       "version": "1.1.4",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.1.4.tgz",
+      "integrity": "sha1-5qdUzI8V5YmHqpy9J69m/W9OWvk=",
+      "dev": true
     },
-    "../shadergraph/node_modules/union-value": {
+    "node_modules/union-value": {
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
+      "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "arr-union": "^3.1.0",
         "get-value": "^2.0.6",
@@ -8528,51 +9651,57 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/unique-filename": {
+    "node_modules/unique-filename": {
       "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
+      "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
       "dev": true,
-      "license": "ISC",
       "dependencies": {
         "unique-slug": "^2.0.0"
       }
     },
-    "../shadergraph/node_modules/unique-slug": {
+    "node_modules/unique-slug": {
       "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz",
+      "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==",
       "dev": true,
-      "license": "ISC",
       "dependencies": {
         "imurmurhash": "^0.1.4"
       }
     },
-    "../shadergraph/node_modules/unique-stream": {
+    "node_modules/unique-stream": {
       "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz",
+      "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "json-stable-stringify-without-jsonify": "^1.0.1",
         "through2-filter": "^3.0.0"
       }
     },
-    "../shadergraph/node_modules/universalify": {
-      "version": "0.1.2",
+    "node_modules/universalify": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+      "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
       "dev": true,
-      "license": "MIT",
       "engines": {
-        "node": ">= 4.0.0"
+        "node": ">= 10.0.0"
       }
     },
-    "../shadergraph/node_modules/unpipe": {
+    "node_modules/unpipe": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+      "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">= 0.8"
       }
     },
-    "../shadergraph/node_modules/unset-value": {
+    "node_modules/unset-value": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+      "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "has-value": "^0.3.1",
         "isobject": "^3.0.0"
@@ -8581,10 +9710,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/unset-value/node_modules/has-value": {
+    "node_modules/unset-value/node_modules/has-value": {
       "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+      "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "get-value": "^2.0.3",
         "has-values": "^0.1.4",
@@ -8594,10 +9724,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/unset-value/node_modules/has-value/node_modules/isobject": {
+    "node_modules/unset-value/node_modules/has-value/node_modules/isobject": {
       "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+      "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "isarray": "1.0.0"
       },
@@ -8605,93 +9736,107 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/unset-value/node_modules/has-values": {
+    "node_modules/unset-value/node_modules/has-values": {
       "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+      "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/upath": {
+    "node_modules/upath": {
       "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz",
+      "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=4",
         "yarn": "*"
       }
     },
-    "../shadergraph/node_modules/uri-js": {
+    "node_modules/uri-js": {
       "version": "4.4.1",
+      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
       "dev": true,
-      "license": "BSD-2-Clause",
       "dependencies": {
         "punycode": "^2.1.0"
       }
     },
-    "../shadergraph/node_modules/urix": {
+    "node_modules/urix": {
       "version": "0.1.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+      "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+      "deprecated": "Please see https://github.com/lydell/urix#deprecated",
+      "dev": true
     },
-    "../shadergraph/node_modules/url": {
+    "node_modules/url": {
       "version": "0.11.0",
+      "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
+      "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "punycode": "1.3.2",
         "querystring": "0.2.0"
       }
     },
-    "../shadergraph/node_modules/url/node_modules/punycode": {
+    "node_modules/url/node_modules/punycode": {
       "version": "1.3.2",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
+      "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
+      "dev": true
     },
-    "../shadergraph/node_modules/use": {
+    "node_modules/use": {
       "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
+      "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/util": {
+    "node_modules/util": {
       "version": "0.11.1",
+      "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz",
+      "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "inherits": "2.0.3"
       }
     },
-    "../shadergraph/node_modules/util-deprecate": {
+    "node_modules/util-deprecate": {
       "version": "1.0.2",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+      "dev": true
     },
-    "../shadergraph/node_modules/util/node_modules/inherits": {
+    "node_modules/util/node_modules/inherits": {
       "version": "2.0.3",
-      "dev": true,
-      "license": "ISC"
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+      "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+      "dev": true
     },
-    "../shadergraph/node_modules/utils-merge": {
+    "node_modules/utils-merge": {
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+      "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">= 0.4.0"
       }
     },
-    "../shadergraph/node_modules/v8-compile-cache": {
+    "node_modules/v8-compile-cache": {
       "version": "2.3.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
+      "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
+      "dev": true
     },
-    "../shadergraph/node_modules/v8flags": {
+    "node_modules/v8flags": {
       "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz",
+      "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "homedir-polyfill": "^1.0.1"
       },
@@ -8699,35 +9844,39 @@
         "node": ">= 0.10"
       }
     },
-    "../shadergraph/node_modules/validate-npm-package-license": {
+    "node_modules/validate-npm-package-license": {
       "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+      "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
       "dev": true,
-      "license": "Apache-2.0",
       "dependencies": {
         "spdx-correct": "^3.0.0",
         "spdx-expression-parse": "^3.0.0"
       }
     },
-    "../shadergraph/node_modules/value-or-function": {
+    "node_modules/value-or-function": {
       "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz",
+      "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">= 0.10"
       }
     },
-    "../shadergraph/node_modules/vary": {
+    "node_modules/vary": {
       "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+      "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">= 0.8"
       }
     },
-    "../shadergraph/node_modules/vinyl": {
+    "node_modules/vinyl": {
       "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz",
+      "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "clone": "^2.1.1",
         "clone-buffer": "^1.0.0",
@@ -8740,10 +9889,11 @@
         "node": ">= 0.10"
       }
     },
-    "../shadergraph/node_modules/vinyl-file": {
+    "node_modules/vinyl-file": {
       "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-2.0.0.tgz",
+      "integrity": "sha1-p+v1/779obfRjRQPyweyI++2dRo=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "graceful-fs": "^4.1.2",
         "pify": "^2.3.0",
@@ -8756,30 +9906,35 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/vinyl-file/node_modules/clone": {
+    "node_modules/vinyl-file/node_modules/clone": {
       "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+      "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.8"
       }
     },
-    "../shadergraph/node_modules/vinyl-file/node_modules/clone-stats": {
+    "node_modules/vinyl-file/node_modules/clone-stats": {
       "version": "0.0.1",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz",
+      "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=",
+      "dev": true
     },
-    "../shadergraph/node_modules/vinyl-file/node_modules/replace-ext": {
+    "node_modules/vinyl-file/node_modules/replace-ext": {
       "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz",
+      "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=",
       "dev": true,
       "engines": {
         "node": ">= 0.4"
       }
     },
-    "../shadergraph/node_modules/vinyl-file/node_modules/vinyl": {
+    "node_modules/vinyl-file/node_modules/vinyl": {
       "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz",
+      "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "clone": "^1.0.0",
         "clone-stats": "^0.0.1",
@@ -8789,10 +9944,11 @@
         "node": ">= 0.9"
       }
     },
-    "../shadergraph/node_modules/vinyl-fs": {
+    "node_modules/vinyl-fs": {
       "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz",
+      "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "fs-mkdirp-stream": "^1.0.0",
         "glob-stream": "^6.1.0",
@@ -8816,19 +9972,11 @@
         "node": ">= 0.10"
       }
     },
-    "../shadergraph/node_modules/vinyl-fs/node_modules/through2": {
-      "version": "2.0.5",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "readable-stream": "~2.3.6",
-        "xtend": "~4.0.1"
-      }
-    },
-    "../shadergraph/node_modules/vinyl-sourcemap": {
+    "node_modules/vinyl-sourcemap": {
       "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz",
+      "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "append-buffer": "^1.0.2",
         "convert-source-map": "^1.5.0",
@@ -8842,10 +9990,11 @@
         "node": ">= 0.10"
       }
     },
-    "../shadergraph/node_modules/vinyl-sourcemap/node_modules/normalize-path": {
+    "node_modules/vinyl-sourcemap/node_modules/normalize-path": {
       "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+      "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "remove-trailing-separator": "^1.0.1"
       },
@@ -8853,23 +10002,26 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/vm-browserify": {
+    "node_modules/vm-browserify": {
       "version": "1.1.2",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
+      "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==",
+      "dev": true
     },
-    "../shadergraph/node_modules/void-elements": {
+    "node_modules/void-elements": {
       "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz",
+      "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/watchpack": {
-      "version": "2.2.0",
+    "node_modules/watchpack": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz",
+      "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "glob-to-regexp": "^0.4.1",
         "graceful-fs": "^4.1.2"
@@ -8878,43 +10030,46 @@
         "node": ">=10.13.0"
       }
     },
-    "../shadergraph/node_modules/watchpack-chokidar2": {
+    "node_modules/watchpack-chokidar2": {
       "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz",
+      "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==",
       "dev": true,
-      "license": "MIT",
       "optional": true,
       "dependencies": {
         "chokidar": "^2.1.8"
       }
     },
-    "../shadergraph/node_modules/webpack": {
-      "version": "5.38.1",
+    "node_modules/webpack": {
+      "version": "5.69.1",
+      "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.69.1.tgz",
+      "integrity": "sha512-+VyvOSJXZMT2V5vLzOnDuMz5GxEqLk7hKWQ56YxPW/PQRUuKimPqmEIJOx8jHYeyo65pKbapbW464mvsKbaj4A==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "@types/eslint-scope": "^3.7.0",
-        "@types/estree": "^0.0.47",
-        "@webassemblyjs/ast": "1.11.0",
-        "@webassemblyjs/wasm-edit": "1.11.0",
-        "@webassemblyjs/wasm-parser": "1.11.0",
-        "acorn": "^8.2.1",
-        "browserslist": "^4.14.5",
-        "chrome-trace-event": "^1.0.2",
-        "enhanced-resolve": "^5.8.0",
-        "es-module-lexer": "^0.4.0",
-        "eslint-scope": "5.1.1",
-        "events": "^3.2.0",
+        "@types/eslint-scope": "^3.7.3",
+        "@types/estree": "^0.0.51",
+        "@webassemblyjs/ast": "1.11.1",
+        "@webassemblyjs/wasm-edit": "1.11.1",
+        "@webassemblyjs/wasm-parser": "1.11.1",
+        "acorn": "^8.4.1",
+        "acorn-import-assertions": "^1.7.6",
+        "browserslist": "^4.14.5",
+        "chrome-trace-event": "^1.0.2",
+        "enhanced-resolve": "^5.8.3",
+        "es-module-lexer": "^0.9.0",
+        "eslint-scope": "5.1.1",
+        "events": "^3.2.0",
         "glob-to-regexp": "^0.4.1",
-        "graceful-fs": "^4.2.4",
+        "graceful-fs": "^4.2.9",
         "json-parse-better-errors": "^1.0.2",
         "loader-runner": "^4.2.0",
         "mime-types": "^2.1.27",
         "neo-async": "^2.6.2",
-        "schema-utils": "^3.0.0",
+        "schema-utils": "^3.1.0",
         "tapable": "^2.1.1",
-        "terser-webpack-plugin": "^5.1.1",
-        "watchpack": "^2.2.0",
-        "webpack-sources": "^2.3.0"
+        "terser-webpack-plugin": "^5.1.3",
+        "watchpack": "^2.3.1",
+        "webpack-sources": "^3.2.3"
       },
       "bin": {
         "webpack": "bin/webpack.js"
@@ -8932,23 +10087,23 @@
         }
       }
     },
-    "../shadergraph/node_modules/webpack-cli": {
-      "version": "4.7.2",
+    "node_modules/webpack-cli": {
+      "version": "4.9.2",
+      "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.2.tgz",
+      "integrity": "sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "@discoveryjs/json-ext": "^0.5.0",
-        "@webpack-cli/configtest": "^1.0.4",
-        "@webpack-cli/info": "^1.3.0",
-        "@webpack-cli/serve": "^1.5.1",
-        "colorette": "^1.2.1",
+        "@webpack-cli/configtest": "^1.1.1",
+        "@webpack-cli/info": "^1.4.1",
+        "@webpack-cli/serve": "^1.6.1",
+        "colorette": "^2.0.14",
         "commander": "^7.0.0",
         "execa": "^5.0.0",
         "fastest-levenshtein": "^1.0.12",
         "import-local": "^3.0.2",
         "interpret": "^2.2.0",
         "rechoir": "^0.7.0",
-        "v8-compile-cache": "^2.2.0",
         "webpack-merge": "^5.7.3"
       },
       "bin": {
@@ -8975,26 +10130,20 @@
         }
       }
     },
-    "../shadergraph/node_modules/webpack-cli/node_modules/commander": {
-      "version": "7.2.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "../shadergraph/node_modules/webpack-cli/node_modules/interpret": {
+    "node_modules/webpack-cli/node_modules/interpret": {
       "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz",
+      "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">= 0.10"
       }
     },
-    "../shadergraph/node_modules/webpack-cli/node_modules/rechoir": {
-      "version": "0.7.0",
+    "node_modules/webpack-cli/node_modules/rechoir": {
+      "version": "0.7.1",
+      "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz",
+      "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "resolve": "^1.9.0"
       },
@@ -9002,10 +10151,11 @@
         "node": ">= 0.10"
       }
     },
-    "../shadergraph/node_modules/webpack-merge": {
+    "node_modules/webpack-merge": {
       "version": "5.8.0",
+      "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz",
+      "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "clone-deep": "^4.0.1",
         "wildcard": "^2.0.0"
@@ -9014,22 +10164,20 @@
         "node": ">=10.0.0"
       }
     },
-    "../shadergraph/node_modules/webpack-sources": {
-      "version": "2.3.0",
+    "node_modules/webpack-sources": {
+      "version": "3.2.3",
+      "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
+      "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "source-list-map": "^2.0.1",
-        "source-map": "^0.6.1"
-      },
       "engines": {
         "node": ">=10.13.0"
       }
     },
-    "../shadergraph/node_modules/webpack-stream": {
+    "node_modules/webpack-stream": {
       "version": "6.1.2",
+      "resolved": "https://registry.npmjs.org/webpack-stream/-/webpack-stream-6.1.2.tgz",
+      "integrity": "sha512-Bpbsrix1cmWRN705JEg69ErgNAEOpQBvtuWKFW3ZCrLddoPPK6oVpQn4svxNdfedqMLlWA3GLOLvw4c7u63GqA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "fancy-log": "^1.3.3",
         "lodash.clone": "^4.3.2",
@@ -9045,35 +10193,40 @@
         "node": ">= 8.0.0"
       }
     },
-    "../shadergraph/node_modules/webpack-stream/node_modules/@webassemblyjs/ast": {
+    "node_modules/webpack-stream/node_modules/@webassemblyjs/ast": {
       "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz",
+      "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "@webassemblyjs/helper-module-context": "1.9.0",
         "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
         "@webassemblyjs/wast-parser": "1.9.0"
       }
     },
-    "../shadergraph/node_modules/webpack-stream/node_modules/@webassemblyjs/helper-api-error": {
+    "node_modules/webpack-stream/node_modules/@webassemblyjs/helper-api-error": {
       "version": "1.9.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz",
+      "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==",
+      "dev": true
     },
-    "../shadergraph/node_modules/webpack-stream/node_modules/@webassemblyjs/helper-buffer": {
+    "node_modules/webpack-stream/node_modules/@webassemblyjs/helper-buffer": {
       "version": "1.9.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz",
+      "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==",
+      "dev": true
     },
-    "../shadergraph/node_modules/webpack-stream/node_modules/@webassemblyjs/helper-wasm-bytecode": {
+    "node_modules/webpack-stream/node_modules/@webassemblyjs/helper-wasm-bytecode": {
       "version": "1.9.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz",
+      "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==",
+      "dev": true
     },
-    "../shadergraph/node_modules/webpack-stream/node_modules/@webassemblyjs/helper-wasm-section": {
+    "node_modules/webpack-stream/node_modules/@webassemblyjs/helper-wasm-section": {
       "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz",
+      "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "@webassemblyjs/ast": "1.9.0",
         "@webassemblyjs/helper-buffer": "1.9.0",
@@ -9081,31 +10234,35 @@
         "@webassemblyjs/wasm-gen": "1.9.0"
       }
     },
-    "../shadergraph/node_modules/webpack-stream/node_modules/@webassemblyjs/ieee754": {
+    "node_modules/webpack-stream/node_modules/@webassemblyjs/ieee754": {
       "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz",
+      "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "@xtuc/ieee754": "^1.2.0"
       }
     },
-    "../shadergraph/node_modules/webpack-stream/node_modules/@webassemblyjs/leb128": {
+    "node_modules/webpack-stream/node_modules/@webassemblyjs/leb128": {
       "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz",
+      "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "@xtuc/long": "4.2.2"
       }
     },
-    "../shadergraph/node_modules/webpack-stream/node_modules/@webassemblyjs/utf8": {
+    "node_modules/webpack-stream/node_modules/@webassemblyjs/utf8": {
       "version": "1.9.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz",
+      "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==",
+      "dev": true
     },
-    "../shadergraph/node_modules/webpack-stream/node_modules/@webassemblyjs/wasm-edit": {
+    "node_modules/webpack-stream/node_modules/@webassemblyjs/wasm-edit": {
       "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz",
+      "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "@webassemblyjs/ast": "1.9.0",
         "@webassemblyjs/helper-buffer": "1.9.0",
@@ -9117,10 +10274,11 @@
         "@webassemblyjs/wast-printer": "1.9.0"
       }
     },
-    "../shadergraph/node_modules/webpack-stream/node_modules/@webassemblyjs/wasm-gen": {
+    "node_modules/webpack-stream/node_modules/@webassemblyjs/wasm-gen": {
       "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz",
+      "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "@webassemblyjs/ast": "1.9.0",
         "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
@@ -9129,10 +10287,11 @@
         "@webassemblyjs/utf8": "1.9.0"
       }
     },
-    "../shadergraph/node_modules/webpack-stream/node_modules/@webassemblyjs/wasm-opt": {
+    "node_modules/webpack-stream/node_modules/@webassemblyjs/wasm-opt": {
       "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz",
+      "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "@webassemblyjs/ast": "1.9.0",
         "@webassemblyjs/helper-buffer": "1.9.0",
@@ -9140,10 +10299,11 @@
         "@webassemblyjs/wasm-parser": "1.9.0"
       }
     },
-    "../shadergraph/node_modules/webpack-stream/node_modules/@webassemblyjs/wasm-parser": {
+    "node_modules/webpack-stream/node_modules/@webassemblyjs/wasm-parser": {
       "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz",
+      "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "@webassemblyjs/ast": "1.9.0",
         "@webassemblyjs/helper-api-error": "1.9.0",
@@ -9153,20 +10313,22 @@
         "@webassemblyjs/utf8": "1.9.0"
       }
     },
-    "../shadergraph/node_modules/webpack-stream/node_modules/@webassemblyjs/wast-printer": {
+    "node_modules/webpack-stream/node_modules/@webassemblyjs/wast-printer": {
       "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz",
+      "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "@webassemblyjs/ast": "1.9.0",
         "@webassemblyjs/wast-parser": "1.9.0",
         "@xtuc/long": "4.2.2"
       }
     },
-    "../shadergraph/node_modules/webpack-stream/node_modules/acorn": {
+    "node_modules/webpack-stream/node_modules/acorn": {
       "version": "6.4.2",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz",
+      "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==",
       "dev": true,
-      "license": "MIT",
       "bin": {
         "acorn": "bin/acorn"
       },
@@ -9174,10 +10336,11 @@
         "node": ">=0.4.0"
       }
     },
-    "../shadergraph/node_modules/webpack-stream/node_modules/anymatch": {
+    "node_modules/webpack-stream/node_modules/anymatch": {
       "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
+      "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
       "dev": true,
-      "license": "ISC",
       "optional": true,
       "dependencies": {
         "normalize-path": "^3.0.0",
@@ -9187,19 +10350,21 @@
         "node": ">= 8"
       }
     },
-    "../shadergraph/node_modules/webpack-stream/node_modules/binary-extensions": {
+    "node_modules/webpack-stream/node_modules/binary-extensions": {
       "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+      "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
       "dev": true,
-      "license": "MIT",
       "optional": true,
       "engines": {
         "node": ">=8"
       }
     },
-    "../shadergraph/node_modules/webpack-stream/node_modules/braces": {
+    "node_modules/webpack-stream/node_modules/braces": {
       "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
       "dev": true,
-      "license": "MIT",
       "optional": true,
       "dependencies": {
         "fill-range": "^7.0.1"
@@ -9208,29 +10373,38 @@
         "node": ">=8"
       }
     },
-    "../shadergraph/node_modules/webpack-stream/node_modules/chokidar": {
-      "version": "3.5.1",
+    "node_modules/webpack-stream/node_modules/chokidar": {
+      "version": "3.5.3",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+      "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
       "dev": true,
-      "license": "MIT",
+      "funding": [
+        {
+          "type": "individual",
+          "url": "https://paulmillr.com/funding/"
+        }
+      ],
       "optional": true,
       "dependencies": {
-        "anymatch": "~3.1.1",
+        "anymatch": "~3.1.2",
         "braces": "~3.0.2",
-        "glob-parent": "~5.1.0",
+        "glob-parent": "~5.1.2",
         "is-binary-path": "~2.1.0",
         "is-glob": "~4.0.1",
         "normalize-path": "~3.0.0",
-        "readdirp": "~3.5.0"
+        "readdirp": "~3.6.0"
       },
       "engines": {
         "node": ">= 8.10.0"
       },
       "optionalDependencies": {
-        "fsevents": "~2.3.1"
+        "fsevents": "~2.3.2"
       }
     },
-    "../shadergraph/node_modules/webpack-stream/node_modules/enhanced-resolve": {
+    "node_modules/webpack-stream/node_modules/enhanced-resolve": {
       "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz",
+      "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==",
       "dev": true,
       "dependencies": {
         "graceful-fs": "^4.1.2",
@@ -9241,10 +10415,11 @@
         "node": ">=6.9.0"
       }
     },
-    "../shadergraph/node_modules/webpack-stream/node_modules/eslint-scope": {
+    "node_modules/webpack-stream/node_modules/eslint-scope": {
       "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz",
+      "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==",
       "dev": true,
-      "license": "BSD-2-Clause",
       "dependencies": {
         "esrecurse": "^4.1.0",
         "estraverse": "^4.1.1"
@@ -9253,10 +10428,11 @@
         "node": ">=4.0.0"
       }
     },
-    "../shadergraph/node_modules/webpack-stream/node_modules/fill-range": {
+    "node_modules/webpack-stream/node_modules/fill-range": {
       "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
       "dev": true,
-      "license": "MIT",
       "optional": true,
       "dependencies": {
         "to-regex-range": "^5.0.1"
@@ -9265,10 +10441,12 @@
         "node": ">=8"
       }
     },
-    "../shadergraph/node_modules/webpack-stream/node_modules/fsevents": {
+    "node_modules/webpack-stream/node_modules/fsevents": {
       "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+      "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
       "dev": true,
-      "license": "MIT",
+      "hasInstallScript": true,
       "optional": true,
       "os": [
         "darwin"
@@ -9277,10 +10455,11 @@
         "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
       }
     },
-    "../shadergraph/node_modules/webpack-stream/node_modules/is-binary-path": {
+    "node_modules/webpack-stream/node_modules/is-binary-path": {
       "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+      "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
       "dev": true,
-      "license": "MIT",
       "optional": true,
       "dependencies": {
         "binary-extensions": "^2.0.0"
@@ -9289,27 +10468,30 @@
         "node": ">=8"
       }
     },
-    "../shadergraph/node_modules/webpack-stream/node_modules/is-number": {
+    "node_modules/webpack-stream/node_modules/is-number": {
       "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
       "dev": true,
-      "license": "MIT",
       "optional": true,
       "engines": {
         "node": ">=0.12.0"
       }
     },
-    "../shadergraph/node_modules/webpack-stream/node_modules/loader-runner": {
+    "node_modules/webpack-stream/node_modules/loader-runner": {
       "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz",
+      "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=4.3.0 <5.0.0 || >=5.10"
       }
     },
-    "../shadergraph/node_modules/webpack-stream/node_modules/readdirp": {
-      "version": "3.5.0",
+    "node_modules/webpack-stream/node_modules/readdirp": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
       "dev": true,
-      "license": "MIT",
       "optional": true,
       "dependencies": {
         "picomatch": "^2.2.1"
@@ -9318,10 +10500,11 @@
         "node": ">=8.10.0"
       }
     },
-    "../shadergraph/node_modules/webpack-stream/node_modules/schema-utils": {
+    "node_modules/webpack-stream/node_modules/schema-utils": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
+      "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "ajv": "^6.1.0",
         "ajv-errors": "^1.0.0",
@@ -9331,42 +10514,29 @@
         "node": ">= 4"
       }
     },
-    "../shadergraph/node_modules/webpack-stream/node_modules/serialize-javascript": {
+    "node_modules/webpack-stream/node_modules/serialize-javascript": {
       "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz",
+      "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==",
       "dev": true,
-      "license": "BSD-3-Clause",
       "dependencies": {
         "randombytes": "^2.1.0"
       }
     },
-    "../shadergraph/node_modules/webpack-stream/node_modules/tapable": {
+    "node_modules/webpack-stream/node_modules/tapable": {
       "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz",
+      "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=6"
       }
     },
-    "../shadergraph/node_modules/webpack-stream/node_modules/terser": {
-      "version": "4.8.0",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "dependencies": {
-        "commander": "^2.20.0",
-        "source-map": "~0.6.1",
-        "source-map-support": "~0.5.12"
-      },
-      "bin": {
-        "terser": "bin/terser"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "../shadergraph/node_modules/webpack-stream/node_modules/terser-webpack-plugin": {
+    "node_modules/webpack-stream/node_modules/terser-webpack-plugin": {
       "version": "1.4.5",
+      "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz",
+      "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "cacache": "^12.0.2",
         "find-cache-dir": "^2.1.0",
@@ -9385,15 +10555,11 @@
         "webpack": "^4.0.0"
       }
     },
-    "../shadergraph/node_modules/webpack-stream/node_modules/through": {
-      "version": "2.3.8",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../shadergraph/node_modules/webpack-stream/node_modules/to-regex-range": {
+    "node_modules/webpack-stream/node_modules/to-regex-range": {
       "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
       "dev": true,
-      "license": "MIT",
       "optional": true,
       "dependencies": {
         "is-number": "^7.0.0"
@@ -9402,10 +10568,11 @@
         "node": ">=8.0"
       }
     },
-    "../shadergraph/node_modules/webpack-stream/node_modules/watchpack": {
+    "node_modules/webpack-stream/node_modules/watchpack": {
       "version": "1.7.5",
+      "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz",
+      "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "graceful-fs": "^4.1.2",
         "neo-async": "^2.5.0"
@@ -9415,10 +10582,11 @@
         "watchpack-chokidar2": "^2.0.1"
       }
     },
-    "../shadergraph/node_modules/webpack-stream/node_modules/webpack": {
+    "node_modules/webpack-stream/node_modules/webpack": {
       "version": "4.46.0",
+      "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz",
+      "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "@webassemblyjs/ast": "1.9.0",
         "@webassemblyjs/helper-module-context": "1.9.0",
@@ -9463,28 +10631,31 @@
         }
       }
     },
-    "../shadergraph/node_modules/webpack-stream/node_modules/webpack-sources": {
+    "node_modules/webpack-stream/node_modules/webpack-sources": {
       "version": "1.4.3",
+      "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz",
+      "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "source-list-map": "^2.0.0",
         "source-map": "~0.6.1"
       }
     },
-    "../shadergraph/node_modules/webpack-stream/node_modules/webpack/node_modules/memory-fs": {
+    "node_modules/webpack-stream/node_modules/webpack/node_modules/memory-fs": {
       "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
+      "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "errno": "^0.1.3",
         "readable-stream": "^2.0.1"
       }
     },
-    "../shadergraph/node_modules/webpack/node_modules/acorn": {
-      "version": "8.4.0",
+    "node_modules/webpack/node_modules/acorn": {
+      "version": "8.7.0",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz",
+      "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==",
       "dev": true,
-      "license": "MIT",
       "bin": {
         "acorn": "bin/acorn"
       },
@@ -9492,10 +10663,20 @@
         "node": ">=0.4.0"
       }
     },
-    "../shadergraph/node_modules/which": {
+    "node_modules/webpack/node_modules/acorn-import-assertions": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz",
+      "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==",
+      "dev": true,
+      "peerDependencies": {
+        "acorn": "^8"
+      }
+    },
+    "node_modules/which": {
       "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
       "dev": true,
-      "license": "ISC",
       "dependencies": {
         "isexe": "^2.0.0"
       },
@@ -9506,36 +10687,41 @@
         "node": ">= 8"
       }
     },
-    "../shadergraph/node_modules/which-module": {
+    "node_modules/which-module": {
       "version": "1.0.0",
-      "dev": true,
-      "license": "ISC"
+      "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz",
+      "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=",
+      "dev": true
     },
-    "../shadergraph/node_modules/wildcard": {
+    "node_modules/wildcard": {
       "version": "2.0.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz",
+      "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==",
+      "dev": true
     },
-    "../shadergraph/node_modules/word-wrap": {
+    "node_modules/word-wrap": {
       "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+      "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/worker-farm": {
+    "node_modules/worker-farm": {
       "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz",
+      "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "errno": "~0.1.7"
       }
     },
-    "../shadergraph/node_modules/wrap-ansi": {
+    "node_modules/wrap-ansi": {
       "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
+      "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "string-width": "^1.0.1",
         "strip-ansi": "^3.0.1"
@@ -9544,18 +10730,20 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/wrap-ansi/node_modules/ansi-regex": {
+    "node_modules/wrap-ansi/node_modules/ansi-regex": {
       "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+      "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": {
+    "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+      "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "number-is-nan": "^1.0.0"
       },
@@ -9563,10 +10751,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/wrap-ansi/node_modules/string-width": {
+    "node_modules/wrap-ansi/node_modules/string-width": {
       "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+      "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "code-point-at": "^1.0.0",
         "is-fullwidth-code-point": "^1.0.0",
@@ -9576,10 +10765,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/wrap-ansi/node_modules/strip-ansi": {
+    "node_modules/wrap-ansi/node_modules/strip-ansi": {
       "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+      "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "ansi-regex": "^2.0.0"
       },
@@ -9587,15 +10777,17 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/wrappy": {
+    "node_modules/wrappy": {
       "version": "1.0.2",
-      "dev": true,
-      "license": "ISC"
+      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+      "dev": true
     },
-    "../shadergraph/node_modules/write": {
+    "node_modules/write": {
       "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz",
+      "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "mkdirp": "^0.5.1"
       },
@@ -9603,12 +10795,13 @@
         "node": ">=4"
       }
     },
-    "../shadergraph/node_modules/ws": {
-      "version": "7.4.6",
+    "node_modules/ws": {
+      "version": "8.2.3",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz",
+      "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==",
       "dev": true,
-      "license": "MIT",
       "engines": {
-        "node": ">=8.3.0"
+        "node": ">=10.0.0"
       },
       "peerDependencies": {
         "bufferutil": "^4.0.1",
@@ -9623,27 +10816,31 @@
         }
       }
     },
-    "../shadergraph/node_modules/xtend": {
+    "node_modules/xtend": {
       "version": "4.0.2",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
       "engines": {
         "node": ">=0.4"
       }
     },
-    "../shadergraph/node_modules/y18n": {
+    "node_modules/y18n": {
       "version": "3.2.2",
-      "dev": true,
-      "license": "ISC"
+      "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz",
+      "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==",
+      "dev": true
     },
-    "../shadergraph/node_modules/yallist": {
+    "node_modules/yallist": {
       "version": "4.0.0",
-      "dev": true,
-      "license": "ISC"
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+      "dev": true
     },
-    "../shadergraph/node_modules/yargs": {
+    "node_modules/yargs": {
       "version": "7.1.2",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.2.tgz",
+      "integrity": "sha512-ZEjj/dQYQy0Zx0lgLMLR8QuaqTihnxirir7EwUHp1Axq4e3+k8jXU5K0VLbNvedv1f4EWtBonDIZm0NUr+jCcA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "camelcase": "^3.0.0",
         "cliui": "^3.2.0",
@@ -9660,27 +10857,30 @@
         "yargs-parser": "^5.0.1"
       }
     },
-    "../shadergraph/node_modules/yargs-parser": {
+    "node_modules/yargs-parser": {
       "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.1.tgz",
+      "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==",
       "dev": true,
-      "license": "ISC",
       "dependencies": {
         "camelcase": "^3.0.0",
         "object.assign": "^4.1.0"
       }
     },
-    "../shadergraph/node_modules/yargs/node_modules/ansi-regex": {
+    "node_modules/yargs/node_modules/ansi-regex": {
       "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+      "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/yargs/node_modules/is-fullwidth-code-point": {
+    "node_modules/yargs/node_modules/is-fullwidth-code-point": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+      "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "number-is-nan": "^1.0.0"
       },
@@ -9688,10 +10888,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/yargs/node_modules/string-width": {
+    "node_modules/yargs/node_modules/string-width": {
       "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+      "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "code-point-at": "^1.0.0",
         "is-fullwidth-code-point": "^1.0.0",
@@ -9701,10 +10902,11 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/yargs/node_modules/strip-ansi": {
+    "node_modules/yargs/node_modules/strip-ansi": {
       "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+      "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "ansi-regex": "^2.0.0"
       },
@@ -9712,148 +10914,114 @@
         "node": ">=0.10.0"
       }
     },
-    "../shadergraph/node_modules/yocto-queue": {
-      "version": "0.1.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "../threestrap": {
-      "version": "0.3.0",
+    "vendor/gulp-jsify": {
+      "version": "0.0.0",
+      "extraneous": true,
       "license": "MIT",
       "dependencies": {
-        "stats.js": "^0.17.0"
-      },
-      "devDependencies": {
-        "eslint": "^7.28.0",
-        "eslint-plugin-jasmine": "^4.1.2",
-        "gulp": "^4.0.2",
-        "gulp-eslint": "^6.0.0",
-        "gulp-watch": "^5.0.1",
-        "jasmine-core": "^3.7.1",
-        "karma": "^6.3.3",
-        "karma-chrome-launcher": "^3.1.0",
-        "karma-jasmine": "^4.0.1",
-        "prettier": "2.3.1",
-        "webpack": "^5.38.1",
-        "webpack-cli": "^4.7.2",
-        "webpack-stream": "^6.1.2"
-      },
-      "peerDependencies": {
-        "three": ">=0.118.0"
+        "plugin-error": "~1.0.1",
+        "through": "~2.3.8",
+        "vinyl": "~2.2.1"
       }
-    },
-    "../threestrap/node_modules/@babel/code-frame": {
+    }
+  },
+  "dependencies": {
+    "@babel/code-frame": {
       "version": "7.12.11",
+      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
+      "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "@babel/highlight": "^7.10.4"
       }
     },
-    "../threestrap/node_modules/@babel/helper-validator-identifier": {
-      "version": "7.14.5",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6.9.0"
-      }
+    "@babel/helper-validator-identifier": {
+      "version": "7.16.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz",
+      "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==",
+      "dev": true
     },
-    "../threestrap/node_modules/@babel/highlight": {
-      "version": "7.14.5",
+    "@babel/highlight": {
+      "version": "7.16.10",
+      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz",
+      "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-validator-identifier": "^7.14.5",
+      "requires": {
+        "@babel/helper-validator-identifier": "^7.16.7",
         "chalk": "^2.0.0",
         "js-tokens": "^4.0.0"
       },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "../threestrap/node_modules/@babel/highlight/node_modules/ansi-styles": {
-      "version": "3.2.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "color-convert": "^1.9.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "../threestrap/node_modules/@babel/highlight/node_modules/chalk": {
-      "version": "2.4.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-styles": "^3.2.1",
-        "escape-string-regexp": "^1.0.5",
-        "supports-color": "^5.3.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "../threestrap/node_modules/@babel/highlight/node_modules/color-convert": {
-      "version": "1.9.3",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "color-name": "1.1.3"
-      }
-    },
-    "../threestrap/node_modules/@babel/highlight/node_modules/color-name": {
-      "version": "1.1.3",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/@babel/highlight/node_modules/escape-string-regexp": {
-      "version": "1.0.5",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.8.0"
-      }
-    },
-    "../threestrap/node_modules/@babel/highlight/node_modules/has-flag": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "../threestrap/node_modules/@babel/highlight/node_modules/supports-color": {
-      "version": "5.5.0",
-      "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=4"
+        "ansi-styles": {
+          "version": "3.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+          "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^1.9.0"
+          }
+        },
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^3.2.1",
+            "escape-string-regexp": "^1.0.5",
+            "supports-color": "^5.3.0"
+          }
+        },
+        "color-convert": {
+          "version": "1.9.3",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+          "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+          "dev": true,
+          "requires": {
+            "color-name": "1.1.3"
+          }
+        },
+        "color-name": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+          "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+          "dev": true
+        },
+        "escape-string-regexp": {
+          "version": "1.0.5",
+          "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+          "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "5.5.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
       }
     },
-    "../threestrap/node_modules/@discoveryjs/json-ext": {
-      "version": "0.5.3",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=10.0.0"
-      }
+    "@discoveryjs/json-ext": {
+      "version": "0.5.6",
+      "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz",
+      "integrity": "sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA==",
+      "dev": true
     },
-    "../threestrap/node_modules/@eslint/eslintrc": {
-      "version": "0.4.2",
+    "@eslint/eslintrc": {
+      "version": "0.4.3",
+      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz",
+      "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "ajv": "^6.12.4",
         "debug": "^4.1.1",
         "espree": "^7.3.0",
@@ -9863,739 +11031,745 @@
         "js-yaml": "^3.13.1",
         "minimatch": "^3.0.4",
         "strip-json-comments": "^3.1.1"
-      },
-      "engines": {
-        "node": "^10.12.0 || >=12.0.0"
       }
     },
-    "../threestrap/node_modules/@types/component-emitter": {
-      "version": "1.2.10",
+    "@humanwhocodes/config-array": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz",
+      "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==",
       "dev": true,
-      "license": "MIT"
+      "requires": {
+        "@humanwhocodes/object-schema": "^1.2.0",
+        "debug": "^4.1.1",
+        "minimatch": "^3.0.4"
+      }
     },
-    "../threestrap/node_modules/@types/cookie": {
-      "version": "0.4.0",
-      "dev": true,
-      "license": "MIT"
+    "@humanwhocodes/object-schema": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
+      "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
+      "dev": true
     },
-    "../threestrap/node_modules/@types/cors": {
-      "version": "2.8.10",
-      "dev": true,
-      "license": "MIT"
+    "@sicmutils/glsl-parser": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/@sicmutils/glsl-parser/-/glsl-parser-2.0.1.tgz",
+      "integrity": "sha512-svY++7/9A7oYE/BJtURM+Y77uvVWZ+PXfKuzZmbiQSWgBJRChUU3AHt8QXmmt4GFIXeVHV1zuSwjYpluU2WjXQ==",
+      "requires": {
+        "glsl-tokenizer": "^2.1.4"
+      }
+    },
+    "@socket.io/base64-arraybuffer": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/@socket.io/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz",
+      "integrity": "sha512-dOlCBKnDw4iShaIsH/bxujKTM18+2TOAsYz+KSc11Am38H4q5Xw8Bbz97ZYdrVNM+um3p7w86Bvvmcn9q+5+eQ==",
+      "dev": true
+    },
+    "@types/component-emitter": {
+      "version": "1.2.11",
+      "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz",
+      "integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==",
+      "dev": true
+    },
+    "@types/cookie": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz",
+      "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==",
+      "dev": true
+    },
+    "@types/cors": {
+      "version": "2.8.12",
+      "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz",
+      "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==",
+      "dev": true
     },
-    "../threestrap/node_modules/@types/eslint": {
-      "version": "7.2.13",
+    "@types/eslint": {
+      "version": "8.4.1",
+      "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.1.tgz",
+      "integrity": "sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "@types/estree": "*",
         "@types/json-schema": "*"
       }
     },
-    "../threestrap/node_modules/@types/eslint-scope": {
-      "version": "3.7.0",
+    "@types/eslint-scope": {
+      "version": "3.7.3",
+      "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz",
+      "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "@types/eslint": "*",
         "@types/estree": "*"
       }
     },
-    "../threestrap/node_modules/@types/estree": {
-      "version": "0.0.47",
-      "dev": true,
-      "license": "MIT"
+    "@types/estree": {
+      "version": "0.0.51",
+      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz",
+      "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==",
+      "dev": true
     },
-    "../threestrap/node_modules/@types/json-schema": {
-      "version": "7.0.7",
-      "dev": true,
-      "license": "MIT"
+    "@types/json-schema": {
+      "version": "7.0.9",
+      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz",
+      "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==",
+      "dev": true
     },
-    "../threestrap/node_modules/@types/node": {
-      "version": "15.12.2",
-      "dev": true,
-      "license": "MIT"
+    "@types/node": {
+      "version": "17.0.18",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.18.tgz",
+      "integrity": "sha512-eKj4f/BsN/qcculZiRSujogjvp5O/k4lOW5m35NopjZM/QwLOR075a8pJW5hD+Rtdm2DaCVPENS6KtSQnUD6BA==",
+      "dev": true
     },
-    "../threestrap/node_modules/@webassemblyjs/ast": {
-      "version": "1.11.0",
+    "@webassemblyjs/ast": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz",
+      "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@webassemblyjs/helper-numbers": "1.11.0",
-        "@webassemblyjs/helper-wasm-bytecode": "1.11.0"
+      "requires": {
+        "@webassemblyjs/helper-numbers": "1.11.1",
+        "@webassemblyjs/helper-wasm-bytecode": "1.11.1"
       }
     },
-    "../threestrap/node_modules/@webassemblyjs/floating-point-hex-parser": {
-      "version": "1.11.0",
-      "dev": true,
-      "license": "MIT"
+    "@webassemblyjs/floating-point-hex-parser": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz",
+      "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==",
+      "dev": true
     },
-    "../threestrap/node_modules/@webassemblyjs/helper-api-error": {
-      "version": "1.11.0",
-      "dev": true,
-      "license": "MIT"
+    "@webassemblyjs/helper-api-error": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz",
+      "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==",
+      "dev": true
     },
-    "../threestrap/node_modules/@webassemblyjs/helper-buffer": {
-      "version": "1.11.0",
-      "dev": true,
-      "license": "MIT"
+    "@webassemblyjs/helper-buffer": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz",
+      "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==",
+      "dev": true
     },
-    "../threestrap/node_modules/@webassemblyjs/helper-code-frame": {
+    "@webassemblyjs/helper-code-frame": {
       "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz",
+      "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "@webassemblyjs/wast-printer": "1.9.0"
-      }
-    },
-    "../threestrap/node_modules/@webassemblyjs/helper-code-frame/node_modules/@webassemblyjs/ast": {
-      "version": "1.9.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@webassemblyjs/helper-module-context": "1.9.0",
-        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
-        "@webassemblyjs/wast-parser": "1.9.0"
-      }
-    },
-    "../threestrap/node_modules/@webassemblyjs/helper-code-frame/node_modules/@webassemblyjs/helper-wasm-bytecode": {
-      "version": "1.9.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/@webassemblyjs/helper-code-frame/node_modules/@webassemblyjs/wast-printer": {
-      "version": "1.9.0",
-      "dev": true,
-      "license": "MIT",
+      },
       "dependencies": {
-        "@webassemblyjs/ast": "1.9.0",
-        "@webassemblyjs/wast-parser": "1.9.0",
-        "@xtuc/long": "4.2.2"
+        "@webassemblyjs/ast": {
+          "version": "1.9.0",
+          "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz",
+          "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==",
+          "dev": true,
+          "requires": {
+            "@webassemblyjs/helper-module-context": "1.9.0",
+            "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+            "@webassemblyjs/wast-parser": "1.9.0"
+          }
+        },
+        "@webassemblyjs/helper-wasm-bytecode": {
+          "version": "1.9.0",
+          "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz",
+          "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==",
+          "dev": true
+        },
+        "@webassemblyjs/wast-printer": {
+          "version": "1.9.0",
+          "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz",
+          "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==",
+          "dev": true,
+          "requires": {
+            "@webassemblyjs/ast": "1.9.0",
+            "@webassemblyjs/wast-parser": "1.9.0",
+            "@xtuc/long": "4.2.2"
+          }
+        }
       }
     },
-    "../threestrap/node_modules/@webassemblyjs/helper-fsm": {
+    "@webassemblyjs/helper-fsm": {
       "version": "1.9.0",
-      "dev": true,
-      "license": "ISC"
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz",
+      "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==",
+      "dev": true
     },
-    "../threestrap/node_modules/@webassemblyjs/helper-module-context": {
+    "@webassemblyjs/helper-module-context": {
       "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz",
+      "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "@webassemblyjs/ast": "1.9.0"
-      }
-    },
-    "../threestrap/node_modules/@webassemblyjs/helper-module-context/node_modules/@webassemblyjs/ast": {
-      "version": "1.9.0",
-      "dev": true,
-      "license": "MIT",
+      },
       "dependencies": {
-        "@webassemblyjs/helper-module-context": "1.9.0",
-        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
-        "@webassemblyjs/wast-parser": "1.9.0"
+        "@webassemblyjs/ast": {
+          "version": "1.9.0",
+          "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz",
+          "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==",
+          "dev": true,
+          "requires": {
+            "@webassemblyjs/helper-module-context": "1.9.0",
+            "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+            "@webassemblyjs/wast-parser": "1.9.0"
+          }
+        },
+        "@webassemblyjs/helper-wasm-bytecode": {
+          "version": "1.9.0",
+          "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz",
+          "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==",
+          "dev": true
+        }
       }
     },
-    "../threestrap/node_modules/@webassemblyjs/helper-module-context/node_modules/@webassemblyjs/helper-wasm-bytecode": {
-      "version": "1.9.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/@webassemblyjs/helper-numbers": {
-      "version": "1.11.0",
+    "@webassemblyjs/helper-numbers": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz",
+      "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@webassemblyjs/floating-point-hex-parser": "1.11.0",
-        "@webassemblyjs/helper-api-error": "1.11.0",
+      "requires": {
+        "@webassemblyjs/floating-point-hex-parser": "1.11.1",
+        "@webassemblyjs/helper-api-error": "1.11.1",
         "@xtuc/long": "4.2.2"
       }
     },
-    "../threestrap/node_modules/@webassemblyjs/helper-wasm-bytecode": {
-      "version": "1.11.0",
-      "dev": true,
-      "license": "MIT"
+    "@webassemblyjs/helper-wasm-bytecode": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz",
+      "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==",
+      "dev": true
     },
-    "../threestrap/node_modules/@webassemblyjs/helper-wasm-section": {
-      "version": "1.11.0",
+    "@webassemblyjs/helper-wasm-section": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz",
+      "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@webassemblyjs/ast": "1.11.0",
-        "@webassemblyjs/helper-buffer": "1.11.0",
-        "@webassemblyjs/helper-wasm-bytecode": "1.11.0",
-        "@webassemblyjs/wasm-gen": "1.11.0"
+      "requires": {
+        "@webassemblyjs/ast": "1.11.1",
+        "@webassemblyjs/helper-buffer": "1.11.1",
+        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+        "@webassemblyjs/wasm-gen": "1.11.1"
       }
     },
-    "../threestrap/node_modules/@webassemblyjs/ieee754": {
-      "version": "1.11.0",
+    "@webassemblyjs/ieee754": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz",
+      "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "@xtuc/ieee754": "^1.2.0"
       }
     },
-    "../threestrap/node_modules/@webassemblyjs/leb128": {
-      "version": "1.11.0",
+    "@webassemblyjs/leb128": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz",
+      "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==",
       "dev": true,
-      "license": "Apache-2.0",
-      "dependencies": {
+      "requires": {
         "@xtuc/long": "4.2.2"
       }
     },
-    "../threestrap/node_modules/@webassemblyjs/utf8": {
-      "version": "1.11.0",
-      "dev": true,
-      "license": "MIT"
+    "@webassemblyjs/utf8": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz",
+      "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==",
+      "dev": true
     },
-    "../threestrap/node_modules/@webassemblyjs/wasm-edit": {
-      "version": "1.11.0",
+    "@webassemblyjs/wasm-edit": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz",
+      "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@webassemblyjs/ast": "1.11.0",
-        "@webassemblyjs/helper-buffer": "1.11.0",
-        "@webassemblyjs/helper-wasm-bytecode": "1.11.0",
-        "@webassemblyjs/helper-wasm-section": "1.11.0",
-        "@webassemblyjs/wasm-gen": "1.11.0",
-        "@webassemblyjs/wasm-opt": "1.11.0",
-        "@webassemblyjs/wasm-parser": "1.11.0",
-        "@webassemblyjs/wast-printer": "1.11.0"
+      "requires": {
+        "@webassemblyjs/ast": "1.11.1",
+        "@webassemblyjs/helper-buffer": "1.11.1",
+        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+        "@webassemblyjs/helper-wasm-section": "1.11.1",
+        "@webassemblyjs/wasm-gen": "1.11.1",
+        "@webassemblyjs/wasm-opt": "1.11.1",
+        "@webassemblyjs/wasm-parser": "1.11.1",
+        "@webassemblyjs/wast-printer": "1.11.1"
       }
     },
-    "../threestrap/node_modules/@webassemblyjs/wasm-gen": {
-      "version": "1.11.0",
+    "@webassemblyjs/wasm-gen": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz",
+      "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@webassemblyjs/ast": "1.11.0",
-        "@webassemblyjs/helper-wasm-bytecode": "1.11.0",
-        "@webassemblyjs/ieee754": "1.11.0",
-        "@webassemblyjs/leb128": "1.11.0",
-        "@webassemblyjs/utf8": "1.11.0"
+      "requires": {
+        "@webassemblyjs/ast": "1.11.1",
+        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+        "@webassemblyjs/ieee754": "1.11.1",
+        "@webassemblyjs/leb128": "1.11.1",
+        "@webassemblyjs/utf8": "1.11.1"
       }
     },
-    "../threestrap/node_modules/@webassemblyjs/wasm-opt": {
-      "version": "1.11.0",
+    "@webassemblyjs/wasm-opt": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz",
+      "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@webassemblyjs/ast": "1.11.0",
-        "@webassemblyjs/helper-buffer": "1.11.0",
-        "@webassemblyjs/wasm-gen": "1.11.0",
-        "@webassemblyjs/wasm-parser": "1.11.0"
+      "requires": {
+        "@webassemblyjs/ast": "1.11.1",
+        "@webassemblyjs/helper-buffer": "1.11.1",
+        "@webassemblyjs/wasm-gen": "1.11.1",
+        "@webassemblyjs/wasm-parser": "1.11.1"
       }
     },
-    "../threestrap/node_modules/@webassemblyjs/wasm-parser": {
-      "version": "1.11.0",
+    "@webassemblyjs/wasm-parser": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz",
+      "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@webassemblyjs/ast": "1.11.0",
-        "@webassemblyjs/helper-api-error": "1.11.0",
-        "@webassemblyjs/helper-wasm-bytecode": "1.11.0",
-        "@webassemblyjs/ieee754": "1.11.0",
-        "@webassemblyjs/leb128": "1.11.0",
-        "@webassemblyjs/utf8": "1.11.0"
+      "requires": {
+        "@webassemblyjs/ast": "1.11.1",
+        "@webassemblyjs/helper-api-error": "1.11.1",
+        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+        "@webassemblyjs/ieee754": "1.11.1",
+        "@webassemblyjs/leb128": "1.11.1",
+        "@webassemblyjs/utf8": "1.11.1"
       }
     },
-    "../threestrap/node_modules/@webassemblyjs/wast-parser": {
+    "@webassemblyjs/wast-parser": {
       "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz",
+      "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "@webassemblyjs/ast": "1.9.0",
         "@webassemblyjs/floating-point-hex-parser": "1.9.0",
         "@webassemblyjs/helper-api-error": "1.9.0",
         "@webassemblyjs/helper-code-frame": "1.9.0",
         "@webassemblyjs/helper-fsm": "1.9.0",
         "@xtuc/long": "4.2.2"
-      }
-    },
-    "../threestrap/node_modules/@webassemblyjs/wast-parser/node_modules/@webassemblyjs/ast": {
-      "version": "1.9.0",
-      "dev": true,
-      "license": "MIT",
+      },
       "dependencies": {
-        "@webassemblyjs/helper-module-context": "1.9.0",
-        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
-        "@webassemblyjs/wast-parser": "1.9.0"
+        "@webassemblyjs/ast": {
+          "version": "1.9.0",
+          "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz",
+          "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==",
+          "dev": true,
+          "requires": {
+            "@webassemblyjs/helper-module-context": "1.9.0",
+            "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+            "@webassemblyjs/wast-parser": "1.9.0"
+          }
+        },
+        "@webassemblyjs/floating-point-hex-parser": {
+          "version": "1.9.0",
+          "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz",
+          "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==",
+          "dev": true
+        },
+        "@webassemblyjs/helper-api-error": {
+          "version": "1.9.0",
+          "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz",
+          "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==",
+          "dev": true
+        },
+        "@webassemblyjs/helper-wasm-bytecode": {
+          "version": "1.9.0",
+          "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz",
+          "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==",
+          "dev": true
+        }
       }
     },
-    "../threestrap/node_modules/@webassemblyjs/wast-parser/node_modules/@webassemblyjs/floating-point-hex-parser": {
-      "version": "1.9.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/@webassemblyjs/wast-parser/node_modules/@webassemblyjs/helper-api-error": {
-      "version": "1.9.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/@webassemblyjs/wast-parser/node_modules/@webassemblyjs/helper-wasm-bytecode": {
-      "version": "1.9.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/@webassemblyjs/wast-printer": {
-      "version": "1.11.0",
+    "@webassemblyjs/wast-printer": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz",
+      "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@webassemblyjs/ast": "1.11.0",
+      "requires": {
+        "@webassemblyjs/ast": "1.11.1",
         "@xtuc/long": "4.2.2"
       }
     },
-    "../threestrap/node_modules/@webpack-cli/configtest": {
-      "version": "1.0.4",
+    "@webpack-cli/configtest": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.1.tgz",
+      "integrity": "sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg==",
       "dev": true,
-      "license": "MIT",
-      "peerDependencies": {
-        "webpack": "4.x.x || 5.x.x",
-        "webpack-cli": "4.x.x"
-      }
+      "requires": {}
     },
-    "../threestrap/node_modules/@webpack-cli/info": {
-      "version": "1.3.0",
+    "@webpack-cli/info": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.1.tgz",
+      "integrity": "sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "envinfo": "^7.7.3"
-      },
-      "peerDependencies": {
-        "webpack-cli": "4.x.x"
       }
     },
-    "../threestrap/node_modules/@webpack-cli/serve": {
-      "version": "1.5.1",
+    "@webpack-cli/serve": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.1.tgz",
+      "integrity": "sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw==",
       "dev": true,
-      "license": "MIT",
-      "peerDependencies": {
-        "webpack-cli": "4.x.x"
-      },
-      "peerDependenciesMeta": {
-        "webpack-dev-server": {
-          "optional": true
-        }
-      }
+      "requires": {}
     },
-    "../threestrap/node_modules/@xtuc/ieee754": {
+    "@xtuc/ieee754": {
       "version": "1.2.0",
-      "dev": true,
-      "license": "BSD-3-Clause"
+      "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+      "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
+      "dev": true
     },
-    "../threestrap/node_modules/@xtuc/long": {
+    "@xtuc/long": {
       "version": "4.2.2",
-      "dev": true,
-      "license": "Apache-2.0"
+      "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
+      "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
+      "dev": true
     },
-    "../threestrap/node_modules/accepts": {
-      "version": "1.3.7",
+    "accepts": {
+      "version": "1.3.8",
+      "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
+      "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "mime-types": "~2.1.24",
-        "negotiator": "0.6.2"
-      },
-      "engines": {
-        "node": ">= 0.6"
+      "requires": {
+        "mime-types": "~2.1.34",
+        "negotiator": "0.6.3"
       }
     },
-    "../threestrap/node_modules/acorn": {
+    "acorn": {
       "version": "7.4.1",
-      "dev": true,
-      "license": "MIT",
-      "bin": {
-        "acorn": "bin/acorn"
-      },
-      "engines": {
-        "node": ">=0.4.0"
-      }
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+      "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+      "dev": true
     },
-    "../threestrap/node_modules/acorn-jsx": {
-      "version": "5.3.1",
+    "acorn-jsx": {
+      "version": "5.3.2",
+      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+      "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
       "dev": true,
-      "license": "MIT",
-      "peerDependencies": {
-        "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
-      }
+      "requires": {}
     },
-    "../threestrap/node_modules/ajv": {
+    "ajv": {
       "version": "6.12.6",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "fast-deep-equal": "^3.1.1",
         "fast-json-stable-stringify": "^2.0.0",
         "json-schema-traverse": "^0.4.1",
         "uri-js": "^4.2.2"
-      },
-      "funding": {
-        "type": "github",
-        "url": "https://github.com/sponsors/epoberezkin"
       }
     },
-    "../threestrap/node_modules/ajv-errors": {
+    "ajv-errors": {
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz",
+      "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==",
       "dev": true,
-      "license": "MIT",
-      "peerDependencies": {
-        "ajv": ">=5.0.0"
-      }
+      "requires": {}
     },
-    "../threestrap/node_modules/ajv-keywords": {
+    "ajv-keywords": {
       "version": "3.5.2",
+      "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+      "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
       "dev": true,
-      "license": "MIT",
-      "peerDependencies": {
-        "ajv": "^6.9.1"
-      }
+      "requires": {}
     },
-    "../threestrap/node_modules/ansi-colors": {
+    "ansi-colors": {
       "version": "4.1.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6"
-      }
+      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
+      "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
+      "dev": true
     },
-    "../threestrap/node_modules/ansi-escapes": {
+    "ansi-escapes": {
       "version": "4.3.2",
+      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+      "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "type-fest": "^0.21.3"
       },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+      "dependencies": {
+        "type-fest": {
+          "version": "0.21.3",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+          "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+          "dev": true
+        }
       }
     },
-    "../threestrap/node_modules/ansi-escapes/node_modules/type-fest": {
-      "version": "0.21.3",
-      "dev": true,
-      "license": "(MIT OR CC0-1.0)",
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "../threestrap/node_modules/ansi-gray": {
+    "ansi-gray": {
       "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz",
+      "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "ansi-wrap": "0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
       }
     },
-    "../threestrap/node_modules/ansi-regex": {
-      "version": "5.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
+    "ansi-regex": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+      "dev": true
     },
-    "../threestrap/node_modules/ansi-styles": {
+    "ansi-styles": {
       "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
       }
     },
-    "../threestrap/node_modules/ansi-wrap": {
+    "ansi-wrap": {
       "version": "0.1.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
+      "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz",
+      "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=",
+      "dev": true
     },
-    "../threestrap/node_modules/anymatch": {
+    "anymatch": {
       "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
+      "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
       "dev": true,
-      "license": "ISC",
-      "dependencies": {
+      "requires": {
         "micromatch": "^3.1.4",
         "normalize-path": "^2.1.1"
-      }
-    },
-    "../threestrap/node_modules/anymatch/node_modules/normalize-path": {
-      "version": "2.1.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "remove-trailing-separator": "^1.0.1"
       },
-      "engines": {
-        "node": ">=0.10.0"
+      "dependencies": {
+        "normalize-path": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+          "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+          "dev": true,
+          "requires": {
+            "remove-trailing-separator": "^1.0.1"
+          }
+        }
       }
     },
-    "../threestrap/node_modules/append-buffer": {
+    "append-buffer": {
       "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz",
+      "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "buffer-equal": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
       }
     },
-    "../threestrap/node_modules/aproba": {
+    "aproba": {
       "version": "1.2.0",
-      "dev": true,
-      "license": "ISC"
+      "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
+      "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
+      "dev": true
     },
-    "../threestrap/node_modules/archy": {
+    "archy": {
       "version": "1.0.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
+      "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=",
+      "dev": true
     },
-    "../threestrap/node_modules/argparse": {
+    "argparse": {
       "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "sprintf-js": "~1.0.2"
       }
     },
-    "../threestrap/node_modules/arr-diff": {
+    "arr-diff": {
       "version": "4.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
+      "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+      "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+      "dev": true
     },
-    "../threestrap/node_modules/arr-filter": {
+    "arr-filter": {
       "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz",
+      "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "make-iterator": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
       }
     },
-    "../threestrap/node_modules/arr-flatten": {
+    "arr-flatten": {
       "version": "1.1.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
+      "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+      "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+      "dev": true
     },
-    "../threestrap/node_modules/arr-map": {
+    "arr-map": {
       "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz",
+      "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "make-iterator": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
       }
     },
-    "../threestrap/node_modules/arr-union": {
+    "arr-union": {
       "version": "3.1.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
+      "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+      "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+      "dev": true
     },
-    "../threestrap/node_modules/array-each": {
+    "array-each": {
       "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
+      "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz",
+      "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=",
+      "dev": true
     },
-    "../threestrap/node_modules/array-initial": {
+    "array-initial": {
       "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz",
+      "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "array-slice": "^1.0.0",
         "is-number": "^4.0.0"
       },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/array-initial/node_modules/is-number": {
-      "version": "4.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
+      "dependencies": {
+        "is-number": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+          "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
+          "dev": true
+        }
       }
     },
-    "../threestrap/node_modules/array-last": {
+    "array-last": {
       "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz",
+      "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "is-number": "^4.0.0"
       },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/array-last/node_modules/is-number": {
-      "version": "4.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
+      "dependencies": {
+        "is-number": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+          "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
+          "dev": true
+        }
       }
     },
-    "../threestrap/node_modules/array-slice": {
+    "array-slice": {
       "version": "1.1.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
+      "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz",
+      "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==",
+      "dev": true
     },
-    "../threestrap/node_modules/array-sort": {
+    "array-sort": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz",
+      "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "default-compare": "^1.0.0",
         "get-value": "^2.0.6",
         "kind-of": "^5.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
       }
     },
-    "../threestrap/node_modules/array-unique": {
+    "array-unique": {
       "version": "0.3.2",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
+      "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+      "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+      "dev": true
     },
-    "../threestrap/node_modules/asn1.js": {
+    "asn1.js": {
       "version": "5.4.1",
+      "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz",
+      "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "bn.js": "^4.0.0",
         "inherits": "^2.0.1",
         "minimalistic-assert": "^1.0.0",
         "safer-buffer": "^2.1.0"
+      },
+      "dependencies": {
+        "bn.js": {
+          "version": "4.12.0",
+          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+          "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+          "dev": true
+        }
       }
     },
-    "../threestrap/node_modules/asn1.js/node_modules/bn.js": {
-      "version": "4.12.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/assert": {
+    "assert": {
       "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz",
+      "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "object-assign": "^4.1.1",
         "util": "0.10.3"
-      }
-    },
-    "../threestrap/node_modules/assert/node_modules/inherits": {
-      "version": "2.0.1",
-      "dev": true,
-      "license": "ISC"
-    },
-    "../threestrap/node_modules/assert/node_modules/util": {
-      "version": "0.10.3",
-      "dev": true,
-      "license": "MIT",
+      },
       "dependencies": {
-        "inherits": "2.0.1"
+        "inherits": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
+          "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
+          "dev": true
+        },
+        "util": {
+          "version": "0.10.3",
+          "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
+          "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
+          "dev": true,
+          "requires": {
+            "inherits": "2.0.1"
+          }
+        }
       }
     },
-    "../threestrap/node_modules/assign-symbols": {
+    "assign-symbols": {
       "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
+      "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+      "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+      "dev": true
     },
-    "../threestrap/node_modules/astral-regex": {
+    "astral-regex": {
       "version": "2.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
+      "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+      "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+      "dev": true
     },
-    "../threestrap/node_modules/async-done": {
+    "async-done": {
       "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz",
+      "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "end-of-stream": "^1.1.0",
         "once": "^1.3.2",
         "process-nextick-args": "^2.0.0",
         "stream-exhaust": "^1.0.1"
-      },
-      "engines": {
-        "node": ">= 0.10"
       }
     },
-    "../threestrap/node_modules/async-each": {
+    "async-each": {
       "version": "1.0.3",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz",
+      "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==",
+      "dev": true
     },
-    "../threestrap/node_modules/async-settle": {
+    "async-settle": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz",
+      "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "async-done": "^1.2.2"
-      },
-      "engines": {
-        "node": ">= 0.10"
       }
     },
-    "../threestrap/node_modules/atob": {
+    "atob": {
       "version": "2.1.2",
-      "dev": true,
-      "license": "(MIT OR Apache-2.0)",
-      "bin": {
-        "atob": "bin/atob.js"
-      },
-      "engines": {
-        "node": ">= 4.5.0"
-      }
+      "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
+      "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
+      "dev": true
     },
-    "../threestrap/node_modules/bach": {
+    "bach": {
       "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz",
+      "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "arr-filter": "^1.1.1",
         "arr-flatten": "^1.0.1",
         "arr-map": "^2.0.0",
@@ -10605,21 +11779,20 @@
         "async-done": "^1.2.2",
         "async-settle": "^1.0.0",
         "now-and-later": "^2.0.0"
-      },
-      "engines": {
-        "node": ">= 0.10"
       }
     },
-    "../threestrap/node_modules/balanced-match": {
+    "balanced-match": {
       "version": "1.0.2",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+      "dev": true
     },
-    "../threestrap/node_modules/base": {
+    "base": {
       "version": "0.11.2",
+      "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+      "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "cache-base": "^1.0.1",
         "class-utils": "^0.3.5",
         "component-emitter": "^1.2.1",
@@ -10628,137 +11801,120 @@
         "mixin-deep": "^1.2.0",
         "pascalcase": "^0.1.1"
       },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/base/node_modules/define-property": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "is-descriptor": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/base64-arraybuffer": {
-      "version": "0.1.4",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.6.0"
+        "define-property": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^1.0.0"
+          }
+        }
       }
     },
-    "../threestrap/node_modules/base64-js": {
+    "base64-js": {
       "version": "1.5.1",
-      "dev": true,
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ],
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+      "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+      "dev": true
     },
-    "../threestrap/node_modules/base64id": {
+    "base64id": {
       "version": "2.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": "^4.5.0 || >= 5.9"
-      }
+      "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
+      "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==",
+      "dev": true
     },
-    "../threestrap/node_modules/big.js": {
+    "big.js": {
       "version": "5.2.2",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": "*"
-      }
+      "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
+      "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
+      "dev": true
     },
-    "../threestrap/node_modules/binary-extensions": {
+    "binary-extensions": {
       "version": "1.13.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
+      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
+      "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
+      "dev": true
     },
-    "../threestrap/node_modules/bindings": {
+    "bindings": {
       "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
+      "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
       "dev": true,
-      "license": "MIT",
       "optional": true,
-      "dependencies": {
+      "requires": {
         "file-uri-to-path": "1.0.0"
       }
     },
-    "../threestrap/node_modules/bluebird": {
+    "bluebird": {
       "version": "3.7.2",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+      "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+      "dev": true
     },
-    "../threestrap/node_modules/bn.js": {
+    "bn.js": {
       "version": "5.2.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz",
+      "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==",
+      "dev": true
     },
-    "../threestrap/node_modules/body-parser": {
-      "version": "1.19.0",
+    "body-parser": {
+      "version": "1.19.2",
+      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz",
+      "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "bytes": "3.1.0",
+      "requires": {
+        "bytes": "3.1.2",
         "content-type": "~1.0.4",
         "debug": "2.6.9",
         "depd": "~1.1.2",
-        "http-errors": "1.7.2",
+        "http-errors": "1.8.1",
         "iconv-lite": "0.4.24",
         "on-finished": "~2.3.0",
-        "qs": "6.7.0",
-        "raw-body": "2.4.0",
-        "type-is": "~1.6.17"
+        "qs": "6.9.7",
+        "raw-body": "2.4.3",
+        "type-is": "~1.6.18"
       },
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "../threestrap/node_modules/body-parser/node_modules/debug": {
-      "version": "2.6.9",
-      "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "ms": "2.0.0"
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
+        }
       }
     },
-    "../threestrap/node_modules/body-parser/node_modules/ms": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "MIT"
+    "boolbase": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+      "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24="
     },
-    "../threestrap/node_modules/brace-expansion": {
+    "brace-expansion": {
       "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "balanced-match": "^1.0.0",
         "concat-map": "0.0.1"
       }
     },
-    "../threestrap/node_modules/braces": {
+    "braces": {
       "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+      "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "arr-flatten": "^1.1.0",
         "array-unique": "^0.3.2",
         "extend-shallow": "^2.0.1",
@@ -10769,21 +11925,20 @@
         "snapdragon-node": "^2.0.1",
         "split-string": "^3.0.2",
         "to-regex": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
       }
     },
-    "../threestrap/node_modules/brorand": {
+    "brorand": {
       "version": "1.1.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
+      "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=",
+      "dev": true
     },
-    "../threestrap/node_modules/browserify-aes": {
+    "browserify-aes": {
       "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
+      "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "buffer-xor": "^1.0.3",
         "cipher-base": "^1.0.0",
         "create-hash": "^1.1.0",
@@ -10792,41 +11947,45 @@
         "safe-buffer": "^5.0.1"
       }
     },
-    "../threestrap/node_modules/browserify-cipher": {
+    "browserify-cipher": {
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
+      "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "browserify-aes": "^1.0.4",
         "browserify-des": "^1.0.0",
         "evp_bytestokey": "^1.0.0"
       }
     },
-    "../threestrap/node_modules/browserify-des": {
+    "browserify-des": {
       "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
+      "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "cipher-base": "^1.0.1",
         "des.js": "^1.0.0",
         "inherits": "^2.0.1",
         "safe-buffer": "^5.1.2"
       }
     },
-    "../threestrap/node_modules/browserify-rsa": {
+    "browserify-rsa": {
       "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz",
+      "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "bn.js": "^5.0.0",
         "randombytes": "^2.0.1"
       }
     },
-    "../threestrap/node_modules/browserify-sign": {
+    "browserify-sign": {
       "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz",
+      "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==",
       "dev": true,
-      "license": "ISC",
-      "dependencies": {
+      "requires": {
         "bn.js": "^5.1.1",
         "browserify-rsa": "^4.0.1",
         "create-hash": "^1.2.0",
@@ -10836,116 +11995,96 @@
         "parse-asn1": "^5.1.5",
         "readable-stream": "^3.6.0",
         "safe-buffer": "^5.2.0"
-      }
-    },
-    "../threestrap/node_modules/browserify-sign/node_modules/readable-stream": {
-      "version": "3.6.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "inherits": "^2.0.3",
-        "string_decoder": "^1.1.1",
-        "util-deprecate": "^1.0.1"
       },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "../threestrap/node_modules/browserify-sign/node_modules/safe-buffer": {
-      "version": "5.2.1",
-      "dev": true,
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
+      "dependencies": {
+        "readable-stream": {
+          "version": "3.6.0",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+          "dev": true,
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
         },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
+        "safe-buffer": {
+          "version": "5.2.1",
+          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+          "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+          "dev": true
         }
-      ],
-      "license": "MIT"
+      }
     },
-    "../threestrap/node_modules/browserify-zlib": {
+    "browserify-zlib": {
       "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
+      "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "pako": "~1.0.5"
       }
     },
-    "../threestrap/node_modules/browserslist": {
-      "version": "4.16.6",
+    "browserslist": {
+      "version": "4.19.1",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz",
+      "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "caniuse-lite": "^1.0.30001219",
-        "colorette": "^1.2.2",
-        "electron-to-chromium": "^1.3.723",
+      "requires": {
+        "caniuse-lite": "^1.0.30001286",
+        "electron-to-chromium": "^1.4.17",
         "escalade": "^3.1.1",
-        "node-releases": "^1.1.71"
-      },
-      "bin": {
-        "browserslist": "cli.js"
-      },
-      "engines": {
-        "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/browserslist"
+        "node-releases": "^2.0.1",
+        "picocolors": "^1.0.0"
       }
     },
-    "../threestrap/node_modules/buffer": {
+    "buffer": {
       "version": "4.9.2",
+      "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz",
+      "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "base64-js": "^1.0.2",
         "ieee754": "^1.1.4",
         "isarray": "^1.0.0"
       }
     },
-    "../threestrap/node_modules/buffer-equal": {
+    "buffer-equal": {
       "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.4.0"
-      }
+      "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz",
+      "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=",
+      "dev": true
     },
-    "../threestrap/node_modules/buffer-from": {
-      "version": "1.1.1",
-      "dev": true,
-      "license": "MIT"
+    "buffer-from": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+      "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+      "dev": true
     },
-    "../threestrap/node_modules/buffer-xor": {
+    "buffer-xor": {
       "version": "1.0.3",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
+      "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=",
+      "dev": true
     },
-    "../threestrap/node_modules/builtin-status-codes": {
+    "builtin-status-codes": {
       "version": "3.0.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
+      "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=",
+      "dev": true
     },
-    "../threestrap/node_modules/bytes": {
-      "version": "3.1.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.8"
-      }
+    "bytes": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+      "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+      "dev": true
     },
-    "../threestrap/node_modules/cacache": {
+    "cacache": {
       "version": "12.0.4",
+      "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz",
+      "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==",
       "dev": true,
-      "license": "ISC",
-      "dependencies": {
+      "requires": {
         "bluebird": "^3.5.5",
         "chownr": "^1.1.1",
         "figgy-pudding": "^3.5.1",
@@ -10961,42 +12100,46 @@
         "ssri": "^6.0.1",
         "unique-filename": "^1.1.1",
         "y18n": "^4.0.0"
-      }
-    },
-    "../threestrap/node_modules/cacache/node_modules/lru-cache": {
-      "version": "5.1.1",
-      "dev": true,
-      "license": "ISC",
+      },
       "dependencies": {
-        "yallist": "^3.0.2"
-      }
-    },
-    "../threestrap/node_modules/cacache/node_modules/rimraf": {
-      "version": "2.7.1",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "glob": "^7.1.3"
-      },
-      "bin": {
-        "rimraf": "bin.js"
+        "lru-cache": {
+          "version": "5.1.1",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+          "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+          "dev": true,
+          "requires": {
+            "yallist": "^3.0.2"
+          }
+        },
+        "rimraf": {
+          "version": "2.7.1",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        },
+        "y18n": {
+          "version": "4.0.3",
+          "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
+          "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
+          "dev": true
+        },
+        "yallist": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+          "dev": true
+        }
       }
     },
-    "../threestrap/node_modules/cacache/node_modules/y18n": {
-      "version": "4.0.3",
-      "dev": true,
-      "license": "ISC"
-    },
-    "../threestrap/node_modules/cacache/node_modules/yallist": {
-      "version": "3.1.1",
-      "dev": true,
-      "license": "ISC"
-    },
-    "../threestrap/node_modules/cache-base": {
+    "cache-base": {
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+      "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "collection-visit": "^1.0.0",
         "component-emitter": "^1.2.1",
         "get-value": "^2.0.6",
@@ -11006,76 +12149,62 @@
         "to-object-path": "^0.3.0",
         "union-value": "^1.0.0",
         "unset-value": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
       }
     },
-    "../threestrap/node_modules/call-bind": {
+    "call-bind": {
       "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+      "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "function-bind": "^1.1.1",
         "get-intrinsic": "^1.0.2"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "../threestrap/node_modules/callsites": {
+    "callsites": {
       "version": "3.1.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6"
-      }
+      "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+      "dev": true
     },
-    "../threestrap/node_modules/camelcase": {
+    "camelcase": {
       "version": "3.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
+      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
+      "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
+      "dev": true
     },
-    "../threestrap/node_modules/caniuse-lite": {
-      "version": "1.0.30001237",
-      "dev": true,
-      "license": "CC-BY-4.0",
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/browserslist"
-      }
+    "caniuse-lite": {
+      "version": "1.0.30001312",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz",
+      "integrity": "sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ==",
+      "dev": true
     },
-    "../threestrap/node_modules/chalk": {
-      "version": "4.1.1",
+    "chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "ansi-styles": "^4.1.0",
         "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/chalk?sponsor=1"
       }
     },
-    "../threestrap/node_modules/chardet": {
+    "chardet": {
       "version": "0.7.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
+      "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
+      "dev": true
     },
-    "../threestrap/node_modules/chokidar": {
+    "chokidar": {
       "version": "2.1.8",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
+      "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "anymatch": "^2.0.0",
         "async-each": "^1.0.1",
         "braces": "^2.3.2",
+        "fsevents": "^1.2.7",
         "glob-parent": "^3.1.0",
         "inherits": "^2.0.3",
         "is-binary-path": "^1.0.0",
@@ -11085,510 +12214,575 @@
         "readdirp": "^2.2.1",
         "upath": "^1.1.1"
       },
-      "optionalDependencies": {
-        "fsevents": "^1.2.7"
-      }
-    },
-    "../threestrap/node_modules/chokidar/node_modules/glob-parent": {
-      "version": "3.1.0",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "is-glob": "^3.1.0",
-        "path-dirname": "^1.0.0"
-      }
-    },
-    "../threestrap/node_modules/chokidar/node_modules/glob-parent/node_modules/is-glob": {
-      "version": "3.1.0",
-      "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "is-extglob": "^2.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
+        "glob-parent": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+          "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+          "dev": true,
+          "requires": {
+            "is-glob": "^3.1.0",
+            "path-dirname": "^1.0.0"
+          },
+          "dependencies": {
+            "is-glob": {
+              "version": "3.1.0",
+              "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+              "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+              "dev": true,
+              "requires": {
+                "is-extglob": "^2.1.0"
+              }
+            }
+          }
+        }
       }
     },
-    "../threestrap/node_modules/chownr": {
+    "chownr": {
       "version": "1.1.4",
-      "dev": true,
-      "license": "ISC"
+      "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
+      "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
+      "dev": true
     },
-    "../threestrap/node_modules/chrome-trace-event": {
+    "chrome-trace-event": {
       "version": "1.0.3",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6.0"
-      }
+      "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
+      "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==",
+      "dev": true
     },
-    "../threestrap/node_modules/cipher-base": {
+    "cipher-base": {
       "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
+      "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "inherits": "^2.0.1",
         "safe-buffer": "^5.0.1"
       }
     },
-    "../threestrap/node_modules/class-utils": {
+    "class-utils": {
       "version": "0.3.6",
+      "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+      "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "arr-union": "^3.1.0",
         "define-property": "^0.2.5",
         "isobject": "^3.0.0",
         "static-extend": "^0.1.1"
       },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/class-utils/node_modules/define-property": {
-      "version": "0.2.5",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-descriptor": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/class-utils/node_modules/is-accessor-descriptor": {
-      "version": "0.1.6",
-      "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "kind-of": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "0.1.6",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+          "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^3.0.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "dev": true,
+              "requires": {
+                "is-buffer": "^1.1.5"
+              }
+            }
+          }
+        },
+        "is-data-descriptor": {
+          "version": "0.1.4",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+          "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^3.0.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "dev": true,
+              "requires": {
+                "is-buffer": "^1.1.5"
+              }
+            }
+          }
+        },
+        "is-descriptor": {
+          "version": "0.1.6",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+          "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "^0.1.6",
+            "is-data-descriptor": "^0.1.4",
+            "kind-of": "^5.0.0"
+          }
+        }
       }
     },
-    "../threestrap/node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": {
-      "version": "3.2.2",
+    "cli-cursor": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
+      "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
+      "requires": {
+        "restore-cursor": "^3.1.0"
       }
     },
-    "../threestrap/node_modules/class-utils/node_modules/is-data-descriptor": {
-      "version": "0.1.4",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "kind-of": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
+    "cli-width": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz",
+      "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==",
+      "dev": true
     },
-    "../threestrap/node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": {
-      "version": "3.2.2",
+    "cliui": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
+      "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-buffer": "^1.1.5"
+      "requires": {
+        "string-width": "^1.0.1",
+        "strip-ansi": "^3.0.1",
+        "wrap-ansi": "^2.0.0"
       },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/class-utils/node_modules/is-descriptor": {
-      "version": "0.1.6",
-      "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "is-accessor-descriptor": "^0.1.6",
-        "is-data-descriptor": "^0.1.4",
-        "kind-of": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/cli-cursor": {
-      "version": "3.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "restore-cursor": "^3.1.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "../threestrap/node_modules/cli-width": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "ISC",
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "../threestrap/node_modules/cliui": {
-      "version": "3.2.0",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "string-width": "^1.0.1",
-        "strip-ansi": "^3.0.1",
-        "wrap-ansi": "^2.0.0"
-      }
-    },
-    "../threestrap/node_modules/cliui/node_modules/ansi-regex": {
-      "version": "2.1.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/cliui/node_modules/is-fullwidth-code-point": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "number-is-nan": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/cliui/node_modules/string-width": {
-      "version": "1.0.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "code-point-at": "^1.0.0",
-        "is-fullwidth-code-point": "^1.0.0",
-        "strip-ansi": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/cliui/node_modules/strip-ansi": {
-      "version": "3.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-regex": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
+        "ansi-regex": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+          "dev": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+          "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+          "dev": true,
+          "requires": {
+            "number-is-nan": "^1.0.0"
+          }
+        },
+        "string-width": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+          "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+          "dev": true,
+          "requires": {
+            "code-point-at": "^1.0.0",
+            "is-fullwidth-code-point": "^1.0.0",
+            "strip-ansi": "^3.0.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+          "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^2.0.0"
+          }
+        }
       }
     },
-    "../threestrap/node_modules/clone": {
+    "clone": {
       "version": "2.1.2",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.8"
-      }
+      "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+      "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
+      "dev": true
     },
-    "../threestrap/node_modules/clone-buffer": {
+    "clone-buffer": {
       "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.10"
-      }
+      "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz",
+      "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=",
+      "dev": true
     },
-    "../threestrap/node_modules/clone-deep": {
+    "clone-deep": {
       "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
+      "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "is-plain-object": "^2.0.4",
         "kind-of": "^6.0.2",
         "shallow-clone": "^3.0.0"
       },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "../threestrap/node_modules/clone-deep/node_modules/is-plain-object": {
-      "version": "2.0.4",
-      "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "isobject": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/clone-deep/node_modules/kind-of": {
-      "version": "6.0.3",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
+        "is-plain-object": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+          "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+          "dev": true,
+          "requires": {
+            "isobject": "^3.0.1"
+          }
+        },
+        "kind-of": {
+          "version": "6.0.3",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+          "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+          "dev": true
+        }
       }
     },
-    "../threestrap/node_modules/clone-stats": {
+    "clone-stats": {
       "version": "1.0.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
+      "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=",
+      "dev": true
     },
-    "../threestrap/node_modules/cloneable-readable": {
+    "cloneable-readable": {
       "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz",
+      "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "inherits": "^2.0.1",
         "process-nextick-args": "^2.0.0",
         "readable-stream": "^2.3.5"
       }
     },
-    "../threestrap/node_modules/code-point-at": {
+    "code-point-at": {
       "version": "1.1.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
+      "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
+      "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
+      "dev": true
     },
-    "../threestrap/node_modules/collection-map": {
+    "collection-map": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz",
+      "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "arr-map": "^2.0.2",
         "for-own": "^1.0.0",
         "make-iterator": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
       }
     },
-    "../threestrap/node_modules/collection-visit": {
+    "collection-visit": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+      "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "map-visit": "^1.0.0",
         "object-visit": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
       }
     },
-    "../threestrap/node_modules/color-convert": {
+    "color-convert": {
       "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
       }
     },
-    "../threestrap/node_modules/color-name": {
+    "color-name": {
       "version": "1.1.4",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+      "dev": true
     },
-    "../threestrap/node_modules/color-support": {
+    "color-support": {
       "version": "1.1.3",
-      "dev": true,
-      "license": "ISC",
-      "bin": {
-        "color-support": "bin.js"
-      }
+      "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
+      "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
+      "dev": true
     },
-    "../threestrap/node_modules/colorette": {
-      "version": "1.2.2",
-      "dev": true,
-      "license": "MIT"
+    "colorette": {
+      "version": "2.0.16",
+      "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz",
+      "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==",
+      "dev": true
     },
-    "../threestrap/node_modules/colors": {
+    "colors": {
       "version": "1.4.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.1.90"
-      }
+      "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
+      "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
+      "dev": true
     },
-    "../threestrap/node_modules/commander": {
-      "version": "2.20.3",
-      "dev": true,
-      "license": "MIT"
+    "commander": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+      "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+      "dev": true
     },
-    "../threestrap/node_modules/commondir": {
+    "commondir": {
       "version": "1.0.1",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+      "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
+      "dev": true
     },
-    "../threestrap/node_modules/component-emitter": {
+    "component-emitter": {
       "version": "1.3.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
+      "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
+      "dev": true
     },
-    "../threestrap/node_modules/concat-map": {
+    "concat-map": {
       "version": "0.0.1",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+      "dev": true
     },
-    "../threestrap/node_modules/concat-stream": {
+    "concat-stream": {
       "version": "1.6.2",
+      "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+      "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
       "dev": true,
-      "engines": [
-        "node >= 0.8"
-      ],
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "buffer-from": "^1.0.0",
         "inherits": "^2.0.3",
         "readable-stream": "^2.2.2",
         "typedarray": "^0.0.6"
       }
     },
-    "../threestrap/node_modules/connect": {
-      "version": "3.7.0",
+    "concat-with-sourcemaps": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz",
+      "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "debug": "2.6.9",
-        "finalhandler": "1.1.2",
-        "parseurl": "~1.3.3",
-        "utils-merge": "1.0.1"
-      },
-      "engines": {
-        "node": ">= 0.10.0"
+      "requires": {
+        "source-map": "^0.6.1"
       }
     },
-    "../threestrap/node_modules/connect/node_modules/debug": {
-      "version": "2.6.9",
+    "concurrently": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.0.0.tgz",
+      "integrity": "sha512-WKM7PUsI8wyXpF80H+zjHP32fsgsHNQfPLw/e70Z5dYkV7hF+rf8q3D+ScWJIEr57CpkO3OWBko6hwhQLPR8Pw==",
       "dev": true,
-      "license": "MIT",
+      "requires": {
+        "chalk": "^4.1.0",
+        "date-fns": "^2.16.1",
+        "lodash": "^4.17.21",
+        "rxjs": "^6.6.3",
+        "spawn-command": "^0.0.2-1",
+        "supports-color": "^8.1.0",
+        "tree-kill": "^1.2.2",
+        "yargs": "^16.2.0"
+      },
       "dependencies": {
-        "ms": "2.0.0"
-      }
-    },
-    "../threestrap/node_modules/connect/node_modules/ms": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/console-browserify": {
-      "version": "1.2.0",
-      "dev": true
-    },
-    "../threestrap/node_modules/constants-browserify": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/content-type": {
-      "version": "1.0.4",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "../threestrap/node_modules/convert-source-map": {
-      "version": "1.7.0",
+        "cliui": {
+          "version": "7.0.4",
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+          "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+          "dev": true,
+          "requires": {
+            "string-width": "^4.2.0",
+            "strip-ansi": "^6.0.0",
+            "wrap-ansi": "^7.0.0"
+          }
+        },
+        "get-caller-file": {
+          "version": "2.0.5",
+          "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+          "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "8.1.1",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+          "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        },
+        "wrap-ansi": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+          "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.0.0",
+            "string-width": "^4.1.0",
+            "strip-ansi": "^6.0.0"
+          }
+        },
+        "y18n": {
+          "version": "5.0.8",
+          "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+          "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+          "dev": true
+        },
+        "yargs": {
+          "version": "16.2.0",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+          "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+          "dev": true,
+          "requires": {
+            "cliui": "^7.0.2",
+            "escalade": "^3.1.1",
+            "get-caller-file": "^2.0.5",
+            "require-directory": "^2.1.1",
+            "string-width": "^4.2.0",
+            "y18n": "^5.0.5",
+            "yargs-parser": "^20.2.2"
+          }
+        },
+        "yargs-parser": {
+          "version": "20.2.9",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+          "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+          "dev": true
+        }
+      }
+    },
+    "connect": {
+      "version": "3.7.0",
+      "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz",
+      "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==",
       "dev": true,
-      "license": "MIT",
+      "requires": {
+        "debug": "2.6.9",
+        "finalhandler": "1.1.2",
+        "parseurl": "~1.3.3",
+        "utils-merge": "1.0.1"
+      },
       "dependencies": {
-        "safe-buffer": "~5.1.1"
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
+        }
       }
     },
-    "../threestrap/node_modules/cookie": {
-      "version": "0.4.1",
+    "console-browserify": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz",
+      "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==",
+      "dev": true
+    },
+    "constants-browserify": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
+      "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
+      "dev": true
+    },
+    "content-type": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
+      "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
+      "dev": true
+    },
+    "convert-source-map": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz",
+      "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==",
       "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
+      "requires": {
+        "safe-buffer": "~5.1.1"
       }
     },
-    "../threestrap/node_modules/copy-concurrently": {
+    "cookie": {
+      "version": "0.4.2",
+      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
+      "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==",
+      "dev": true
+    },
+    "copy-concurrently": {
       "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz",
+      "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==",
       "dev": true,
-      "license": "ISC",
-      "dependencies": {
+      "requires": {
         "aproba": "^1.1.1",
         "fs-write-stream-atomic": "^1.0.8",
         "iferr": "^0.1.5",
         "mkdirp": "^0.5.1",
         "rimraf": "^2.5.4",
         "run-queue": "^1.0.0"
-      }
-    },
-    "../threestrap/node_modules/copy-concurrently/node_modules/rimraf": {
-      "version": "2.7.1",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "glob": "^7.1.3"
       },
-      "bin": {
-        "rimraf": "bin.js"
+      "dependencies": {
+        "rimraf": {
+          "version": "2.7.1",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        }
       }
     },
-    "../threestrap/node_modules/copy-descriptor": {
+    "copy-descriptor": {
       "version": "0.1.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
+      "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+      "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+      "dev": true
     },
-    "../threestrap/node_modules/copy-props": {
+    "copy-props": {
       "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.5.tgz",
+      "integrity": "sha512-XBlx8HSqrT0ObQwmSzM7WE5k8FxTV75h1DX1Z3n6NhQ/UYYAvInWYmG06vFt7hQZArE2fuO62aihiWIVQwh1sw==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "each-props": "^1.3.2",
         "is-plain-object": "^5.0.0"
       }
     },
-    "../threestrap/node_modules/core-util-is": {
-      "version": "1.0.2",
-      "dev": true,
-      "license": "MIT"
+    "core-util-is": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+      "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
     },
-    "../threestrap/node_modules/cors": {
+    "cors": {
       "version": "2.8.5",
+      "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
+      "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "object-assign": "^4",
         "vary": "^1"
-      },
-      "engines": {
-        "node": ">= 0.10"
       }
     },
-    "../threestrap/node_modules/create-ecdh": {
+    "create-ecdh": {
       "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz",
+      "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "bn.js": "^4.1.0",
         "elliptic": "^6.5.3"
+      },
+      "dependencies": {
+        "bn.js": {
+          "version": "4.12.0",
+          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+          "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+          "dev": true
+        }
       }
     },
-    "../threestrap/node_modules/create-ecdh/node_modules/bn.js": {
-      "version": "4.12.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/create-hash": {
+    "create-hash": {
       "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
+      "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "cipher-base": "^1.0.1",
         "inherits": "^2.0.1",
         "md5.js": "^1.3.4",
@@ -11596,11 +12790,12 @@
         "sha.js": "^2.4.0"
       }
     },
-    "../threestrap/node_modules/create-hmac": {
+    "create-hmac": {
       "version": "1.1.7",
+      "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
+      "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "cipher-base": "^1.0.3",
         "create-hash": "^1.1.0",
         "inherits": "^2.0.1",
@@ -11609,24 +12804,23 @@
         "sha.js": "^2.4.8"
       }
     },
-    "../threestrap/node_modules/cross-spawn": {
+    "cross-spawn": {
       "version": "7.0.3",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+      "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "path-key": "^3.1.0",
         "shebang-command": "^2.0.0",
         "which": "^2.0.1"
-      },
-      "engines": {
-        "node": ">= 8"
       }
     },
-    "../threestrap/node_modules/crypto-browserify": {
+    "crypto-browserify": {
       "version": "3.12.0",
+      "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
+      "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "browserify-cipher": "^1.0.0",
         "browserify-sign": "^4.0.0",
         "create-ecdh": "^4.0.0",
@@ -11638,239 +12832,278 @@
         "public-encrypt": "^4.0.0",
         "randombytes": "^2.0.0",
         "randomfill": "^1.0.3"
-      },
-      "engines": {
-        "node": "*"
       }
     },
-    "../threestrap/node_modules/custom-event": {
+    "css-select": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz",
+      "integrity": "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==",
+      "requires": {
+        "boolbase": "^1.0.0",
+        "css-what": "^5.1.0",
+        "domhandler": "^4.3.0",
+        "domutils": "^2.8.0",
+        "nth-check": "^2.0.1"
+      }
+    },
+    "css-what": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz",
+      "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw=="
+    },
+    "custom-event": {
       "version": "1.0.1",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz",
+      "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=",
+      "dev": true
     },
-    "../threestrap/node_modules/cyclist": {
+    "cyclist": {
       "version": "1.0.1",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz",
+      "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=",
+      "dev": true
     },
-    "../threestrap/node_modules/d": {
+    "d": {
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
+      "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
       "dev": true,
-      "license": "ISC",
-      "dependencies": {
+      "requires": {
         "es5-ext": "^0.10.50",
         "type": "^1.0.1"
       }
     },
-    "../threestrap/node_modules/date-format": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=4.0"
-      }
+    "date-fns": {
+      "version": "2.28.0",
+      "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.28.0.tgz",
+      "integrity": "sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw==",
+      "dev": true
+    },
+    "date-format": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.3.tgz",
+      "integrity": "sha512-7P3FyqDcfeznLZp2b+OMitV9Sz2lUnsT87WaTat9nVwqsBkTzPG3lPLNwW3en6F4pHUiWzr6vb8CLhjdK9bcxQ==",
+      "dev": true
     },
-    "../threestrap/node_modules/debug": {
-      "version": "4.3.1",
+    "debug": {
+      "version": "4.3.3",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
+      "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "ms": "2.1.2"
-      },
-      "engines": {
-        "node": ">=6.0"
-      },
-      "peerDependenciesMeta": {
-        "supports-color": {
-          "optional": true
-        }
       }
     },
-    "../threestrap/node_modules/decamelize": {
+    "decamelize": {
       "version": "1.2.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
+      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+      "dev": true
     },
-    "../threestrap/node_modules/decode-uri-component": {
+    "decode-uri-component": {
       "version": "0.2.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10"
-      }
+      "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+      "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+      "dev": true
     },
-    "../threestrap/node_modules/deep-is": {
-      "version": "0.1.3",
-      "dev": true,
-      "license": "MIT"
+    "deep-is": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+      "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+      "dev": true
     },
-    "../threestrap/node_modules/default-compare": {
+    "default-compare": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz",
+      "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "kind-of": "^5.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
       }
     },
-    "../threestrap/node_modules/default-resolution": {
+    "default-resolution": {
       "version": "2.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.10"
-      }
+      "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz",
+      "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=",
+      "dev": true
     },
-    "../threestrap/node_modules/define-properties": {
+    "define-properties": {
       "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+      "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "object-keys": "^1.0.12"
-      },
-      "engines": {
-        "node": ">= 0.4"
       }
     },
-    "../threestrap/node_modules/define-property": {
+    "define-property": {
       "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+      "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "is-descriptor": "^1.0.2",
         "isobject": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
       }
     },
-    "../threestrap/node_modules/depd": {
+    "depd": {
       "version": "1.1.2",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
+      "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+      "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
+      "dev": true
     },
-    "../threestrap/node_modules/des.js": {
+    "des.js": {
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz",
+      "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "inherits": "^2.0.1",
         "minimalistic-assert": "^1.0.0"
       }
     },
-    "../threestrap/node_modules/detect-file": {
+    "detect-file": {
       "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
+      "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
+      "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=",
+      "dev": true
     },
-    "../threestrap/node_modules/di": {
+    "di": {
       "version": "0.0.1",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz",
+      "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=",
+      "dev": true
     },
-    "../threestrap/node_modules/diffie-hellman": {
+    "diffie-hellman": {
       "version": "5.0.3",
+      "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
+      "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "bn.js": "^4.1.0",
         "miller-rabin": "^4.0.0",
         "randombytes": "^2.0.0"
+      },
+      "dependencies": {
+        "bn.js": {
+          "version": "4.12.0",
+          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+          "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+          "dev": true
+        }
       }
     },
-    "../threestrap/node_modules/diffie-hellman/node_modules/bn.js": {
-      "version": "4.12.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/doctrine": {
+    "doctrine": {
       "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+      "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
       "dev": true,
-      "license": "Apache-2.0",
-      "dependencies": {
+      "requires": {
         "esutils": "^2.0.2"
-      },
-      "engines": {
-        "node": ">=6.0.0"
       }
     },
-    "../threestrap/node_modules/dom-serialize": {
+    "dom-serialize": {
       "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz",
+      "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "custom-event": "~1.0.0",
         "ent": "~2.2.0",
         "extend": "^3.0.0",
         "void-elements": "^2.0.0"
       }
     },
-    "../threestrap/node_modules/domain-browser": {
+    "dom-serializer": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz",
+      "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==",
+      "requires": {
+        "domelementtype": "^2.0.1",
+        "domhandler": "^4.2.0",
+        "entities": "^2.0.0"
+      }
+    },
+    "domain-browser": {
       "version": "1.2.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.4",
-        "npm": ">=1.2"
+      "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
+      "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==",
+      "dev": true
+    },
+    "domelementtype": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz",
+      "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A=="
+    },
+    "domhandler": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz",
+      "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==",
+      "requires": {
+        "domelementtype": "^2.2.0"
+      }
+    },
+    "domutils": {
+      "version": "2.8.0",
+      "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
+      "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
+      "requires": {
+        "dom-serializer": "^1.0.1",
+        "domelementtype": "^2.2.0",
+        "domhandler": "^4.2.0"
       }
     },
-    "../threestrap/node_modules/duplexify": {
+    "duplexify": {
       "version": "3.7.1",
+      "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz",
+      "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "end-of-stream": "^1.0.0",
         "inherits": "^2.0.1",
         "readable-stream": "^2.0.0",
         "stream-shift": "^1.0.0"
       }
     },
-    "../threestrap/node_modules/each-props": {
+    "each-props": {
       "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz",
+      "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "is-plain-object": "^2.0.1",
         "object.defaults": "^1.1.0"
-      }
-    },
-    "../threestrap/node_modules/each-props/node_modules/is-plain-object": {
-      "version": "2.0.4",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "isobject": "^3.0.1"
       },
-      "engines": {
-        "node": ">=0.10.0"
+      "dependencies": {
+        "is-plain-object": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+          "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+          "dev": true,
+          "requires": {
+            "isobject": "^3.0.1"
+          }
+        }
       }
     },
-    "../threestrap/node_modules/ee-first": {
+    "ee-first": {
       "version": "1.1.1",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+      "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
+      "dev": true
     },
-    "../threestrap/node_modules/electron-to-chromium": {
-      "version": "1.3.752",
-      "dev": true,
-      "license": "ISC"
+    "electron-to-chromium": {
+      "version": "1.4.71",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.71.tgz",
+      "integrity": "sha512-Hk61vXXKRb2cd3znPE9F+2pLWdIOmP7GjiTj45y6L3W/lO+hSnUSUhq+6lEaERWBdZOHbk2s3YV5c9xVl3boVw==",
+      "dev": true
     },
-    "../threestrap/node_modules/elliptic": {
+    "elliptic": {
       "version": "6.5.4",
+      "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz",
+      "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "bn.js": "^4.11.9",
         "brorand": "^1.1.0",
         "hash.js": "^1.0.0",
@@ -11878,204 +13111,201 @@
         "inherits": "^2.0.4",
         "minimalistic-assert": "^1.0.1",
         "minimalistic-crypto-utils": "^1.0.1"
+      },
+      "dependencies": {
+        "bn.js": {
+          "version": "4.12.0",
+          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+          "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+          "dev": true
+        }
       }
     },
-    "../threestrap/node_modules/elliptic/node_modules/bn.js": {
-      "version": "4.12.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/emoji-regex": {
+    "emoji-regex": {
       "version": "8.0.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+      "dev": true
     },
-    "../threestrap/node_modules/emojis-list": {
+    "emojis-list": {
       "version": "3.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 4"
-      }
+      "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+      "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+      "dev": true
     },
-    "../threestrap/node_modules/encodeurl": {
+    "encodeurl": {
       "version": "1.0.2",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.8"
-      }
+      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+      "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
+      "dev": true
     },
-    "../threestrap/node_modules/end-of-stream": {
+    "end-of-stream": {
       "version": "1.4.4",
+      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+      "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "once": "^1.4.0"
       }
     },
-    "../threestrap/node_modules/engine.io": {
-      "version": "4.1.1",
+    "engine.io": {
+      "version": "6.1.2",
+      "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.1.2.tgz",
+      "integrity": "sha512-v/7eGHxPvO2AWsksyx2PUsQvBafuvqs0jJJQ0FdmJG1b9qIvgSbqDRGwNhfk2XHaTTbTXiC4quRE8Q9nRjsrQQ==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
+        "@types/cookie": "^0.4.1",
+        "@types/cors": "^2.8.12",
+        "@types/node": ">=10.0.0",
         "accepts": "~1.3.4",
         "base64id": "2.0.0",
         "cookie": "~0.4.1",
         "cors": "~2.8.5",
         "debug": "~4.3.1",
-        "engine.io-parser": "~4.0.0",
-        "ws": "~7.4.2"
-      },
-      "engines": {
-        "node": ">=10.0.0"
+        "engine.io-parser": "~5.0.0",
+        "ws": "~8.2.3"
       }
     },
-    "../threestrap/node_modules/engine.io-parser": {
-      "version": "4.0.2",
+    "engine.io-parser": {
+      "version": "5.0.3",
+      "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.3.tgz",
+      "integrity": "sha512-BtQxwF27XUNnSafQLvDi0dQ8s3i6VgzSoQMJacpIcGNrlUdfHSKbgm3jmjCVvQluGzqwujQMPAoMai3oYSTurg==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "base64-arraybuffer": "0.1.4"
-      },
-      "engines": {
-        "node": ">=8.0.0"
+      "requires": {
+        "@socket.io/base64-arraybuffer": "~1.0.2"
       }
     },
-    "../threestrap/node_modules/enhanced-resolve": {
-      "version": "5.8.2",
+    "enhanced-resolve": {
+      "version": "5.9.0",
+      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.0.tgz",
+      "integrity": "sha512-weDYmzbBygL7HzGGS26M3hGQx68vehdEg6VUmqSOaFzXExFqlnKuSvsEJCVGQHScS8CQMbrAqftT+AzzHNt/YA==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "graceful-fs": "^4.2.4",
         "tapable": "^2.2.0"
-      },
-      "engines": {
-        "node": ">=10.13.0"
       }
     },
-    "../threestrap/node_modules/enquirer": {
+    "enquirer": {
       "version": "2.3.6",
+      "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
+      "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "ansi-colors": "^4.1.1"
-      },
-      "engines": {
-        "node": ">=8.6"
       }
     },
-    "../threestrap/node_modules/ent": {
+    "ent": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz",
+      "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=",
+      "dev": true
+    },
+    "entities": {
       "version": "2.2.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
+      "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A=="
     },
-    "../threestrap/node_modules/envinfo": {
+    "envinfo": {
       "version": "7.8.1",
-      "dev": true,
-      "license": "MIT",
-      "bin": {
-        "envinfo": "dist/cli.js"
-      },
-      "engines": {
-        "node": ">=4"
-      }
+      "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz",
+      "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==",
+      "dev": true
     },
-    "../threestrap/node_modules/errno": {
+    "errno": {
       "version": "0.1.8",
+      "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
+      "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "prr": "~1.0.1"
-      },
-      "bin": {
-        "errno": "cli.js"
       }
     },
-    "../threestrap/node_modules/error-ex": {
+    "error-ex": {
       "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+      "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "is-arrayish": "^0.2.1"
       }
     },
-    "../threestrap/node_modules/es-module-lexer": {
-      "version": "0.4.1",
-      "dev": true,
-      "license": "MIT"
+    "es-module-lexer": {
+      "version": "0.9.3",
+      "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz",
+      "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==",
+      "dev": true
     },
-    "../threestrap/node_modules/es5-ext": {
+    "es5-ext": {
       "version": "0.10.53",
+      "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz",
+      "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==",
       "dev": true,
-      "license": "ISC",
-      "dependencies": {
+      "requires": {
         "es6-iterator": "~2.0.3",
         "es6-symbol": "~3.1.3",
         "next-tick": "~1.0.0"
       }
     },
-    "../threestrap/node_modules/es6-iterator": {
+    "es6-iterator": {
       "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
+      "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "d": "1",
         "es5-ext": "^0.10.35",
         "es6-symbol": "^3.1.1"
       }
     },
-    "../threestrap/node_modules/es6-symbol": {
+    "es6-symbol": {
       "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz",
+      "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
       "dev": true,
-      "license": "ISC",
-      "dependencies": {
+      "requires": {
         "d": "^1.0.1",
         "ext": "^1.1.2"
       }
     },
-    "../threestrap/node_modules/es6-weak-map": {
+    "es6-weak-map": {
       "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz",
+      "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==",
       "dev": true,
-      "license": "ISC",
-      "dependencies": {
+      "requires": {
         "d": "1",
         "es5-ext": "^0.10.46",
         "es6-iterator": "^2.0.3",
         "es6-symbol": "^3.1.1"
       }
     },
-    "../threestrap/node_modules/escalade": {
+    "escalade": {
       "version": "3.1.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6"
-      }
+      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+      "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+      "dev": true
     },
-    "../threestrap/node_modules/escape-html": {
+    "escape-html": {
       "version": "1.0.3",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
+      "dev": true
     },
-    "../threestrap/node_modules/escape-string-regexp": {
+    "escape-string-regexp": {
       "version": "4.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+      "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+      "dev": true
     },
-    "../threestrap/node_modules/eslint": {
-      "version": "7.28.0",
+    "eslint": {
+      "version": "7.32.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz",
+      "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "@babel/code-frame": "7.12.11",
-        "@eslint/eslintrc": "^0.4.2",
+        "@eslint/eslintrc": "^0.4.3",
+        "@humanwhocodes/config-array": "^0.5.0",
         "ajv": "^6.10.0",
         "chalk": "^4.0.0",
         "cross-spawn": "^7.0.2",
@@ -12113,182 +13343,146 @@
         "table": "^6.0.9",
         "text-table": "^0.2.0",
         "v8-compile-cache": "^2.0.3"
-      },
-      "bin": {
-        "eslint": "bin/eslint.js"
-      },
-      "engines": {
-        "node": "^10.12.0 || >=12.0.0"
-      },
-      "funding": {
-        "url": "https://opencollective.com/eslint"
       }
     },
-    "../threestrap/node_modules/eslint-plugin-jasmine": {
-      "version": "4.1.2",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8",
-        "npm": ">=6"
-      }
+    "eslint-plugin-jasmine": {
+      "version": "4.1.3",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-jasmine/-/eslint-plugin-jasmine-4.1.3.tgz",
+      "integrity": "sha512-q8j8KnLH/4uwmPELFZvEyfEcuCuGxXScJaRdqHjOjz064GcfX6aoFbzy5VohZ5QYk2+WvoqMoqDSb9nRLf89GQ==",
+      "dev": true
     },
-    "../threestrap/node_modules/eslint-scope": {
+    "eslint-scope": {
       "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+      "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
       "dev": true,
-      "license": "BSD-2-Clause",
-      "dependencies": {
+      "requires": {
         "esrecurse": "^4.3.0",
         "estraverse": "^4.1.1"
-      },
-      "engines": {
-        "node": ">=8.0.0"
       }
     },
-    "../threestrap/node_modules/eslint-utils": {
+    "eslint-utils": {
       "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
+      "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "eslint-visitor-keys": "^1.1.0"
       },
-      "engines": {
-        "node": ">=6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/mysticatea"
-      }
-    },
-    "../threestrap/node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
-      "version": "1.3.0",
-      "dev": true,
-      "license": "Apache-2.0",
-      "engines": {
-        "node": ">=4"
+      "dependencies": {
+        "eslint-visitor-keys": {
+          "version": "1.3.0",
+          "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+          "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+          "dev": true
+        }
       }
     },
-    "../threestrap/node_modules/eslint-visitor-keys": {
+    "eslint-visitor-keys": {
       "version": "2.1.0",
-      "dev": true,
-      "license": "Apache-2.0",
-      "engines": {
-        "node": ">=10"
-      }
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+      "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+      "dev": true
     },
-    "../threestrap/node_modules/espree": {
+    "espree": {
       "version": "7.3.1",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz",
+      "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==",
       "dev": true,
-      "license": "BSD-2-Clause",
-      "dependencies": {
+      "requires": {
         "acorn": "^7.4.0",
         "acorn-jsx": "^5.3.1",
         "eslint-visitor-keys": "^1.3.0"
       },
-      "engines": {
-        "node": "^10.12.0 || >=12.0.0"
-      }
-    },
-    "../threestrap/node_modules/espree/node_modules/eslint-visitor-keys": {
-      "version": "1.3.0",
-      "dev": true,
-      "license": "Apache-2.0",
-      "engines": {
-        "node": ">=4"
+      "dependencies": {
+        "eslint-visitor-keys": {
+          "version": "1.3.0",
+          "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+          "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+          "dev": true
+        }
       }
     },
-    "../threestrap/node_modules/esprima": {
+    "esprima": {
       "version": "4.0.1",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "bin": {
-        "esparse": "bin/esparse.js",
-        "esvalidate": "bin/esvalidate.js"
-      },
-      "engines": {
-        "node": ">=4"
-      }
+      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+      "dev": true
     },
-    "../threestrap/node_modules/esquery": {
+    "esquery": {
       "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
+      "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
       "dev": true,
-      "license": "BSD-3-Clause",
-      "dependencies": {
+      "requires": {
         "estraverse": "^5.1.0"
       },
-      "engines": {
-        "node": ">=0.10"
-      }
-    },
-    "../threestrap/node_modules/esquery/node_modules/estraverse": {
-      "version": "5.2.0",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "engines": {
-        "node": ">=4.0"
+      "dependencies": {
+        "estraverse": {
+          "version": "5.3.0",
+          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+          "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+          "dev": true
+        }
       }
     },
-    "../threestrap/node_modules/esrecurse": {
+    "esrecurse": {
       "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
       "dev": true,
-      "license": "BSD-2-Clause",
-      "dependencies": {
+      "requires": {
         "estraverse": "^5.2.0"
       },
-      "engines": {
-        "node": ">=4.0"
-      }
-    },
-    "../threestrap/node_modules/esrecurse/node_modules/estraverse": {
-      "version": "5.2.0",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "engines": {
-        "node": ">=4.0"
+      "dependencies": {
+        "estraverse": {
+          "version": "5.3.0",
+          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+          "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+          "dev": true
+        }
       }
     },
-    "../threestrap/node_modules/estraverse": {
+    "estraverse": {
       "version": "4.3.0",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "engines": {
-        "node": ">=4.0"
-      }
+      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+      "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+      "dev": true
     },
-    "../threestrap/node_modules/esutils": {
+    "esutils": {
       "version": "2.0.3",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "engines": {
-        "node": ">=0.10.0"
-      }
+      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+      "dev": true
     },
-    "../threestrap/node_modules/eventemitter3": {
+    "eventemitter3": {
       "version": "4.0.7",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
+      "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
+      "dev": true
     },
-    "../threestrap/node_modules/events": {
+    "events": {
       "version": "3.3.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.8.x"
-      }
+      "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+      "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+      "dev": true
     },
-    "../threestrap/node_modules/evp_bytestokey": {
+    "evp_bytestokey": {
       "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
+      "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "md5.js": "^1.3.4",
         "safe-buffer": "^5.1.1"
       }
     },
-    "../threestrap/node_modules/execa": {
+    "execa": {
       "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+      "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "cross-spawn": "^7.0.3",
         "get-stream": "^6.0.0",
         "human-signals": "^2.1.0",
@@ -12298,19 +13492,14 @@
         "onetime": "^5.1.2",
         "signal-exit": "^3.0.3",
         "strip-final-newline": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sindresorhus/execa?sponsor=1"
       }
     },
-    "../threestrap/node_modules/expand-brackets": {
+    "expand-brackets": {
       "version": "2.1.4",
+      "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+      "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "debug": "^2.3.3",
         "define-property": "^0.2.5",
         "extend-shallow": "^2.0.1",
@@ -12319,219 +13508,204 @@
         "snapdragon": "^0.8.1",
         "to-regex": "^3.0.1"
       },
-      "engines": {
-        "node": ">=0.10.0"
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "0.1.6",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+          "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^3.0.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "dev": true,
+              "requires": {
+                "is-buffer": "^1.1.5"
+              }
+            }
+          }
+        },
+        "is-data-descriptor": {
+          "version": "0.1.4",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+          "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^3.0.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "dev": true,
+              "requires": {
+                "is-buffer": "^1.1.5"
+              }
+            }
+          }
+        },
+        "is-descriptor": {
+          "version": "0.1.6",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+          "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "^0.1.6",
+            "is-data-descriptor": "^0.1.4",
+            "kind-of": "^5.0.0"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
+        }
       }
     },
-    "../threestrap/node_modules/expand-brackets/node_modules/debug": {
-      "version": "2.6.9",
+    "expand-range": {
+      "version": "1.8.2",
+      "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
+      "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
       "dev": true,
-      "license": "MIT",
+      "requires": {
+        "fill-range": "^2.1.0"
+      },
       "dependencies": {
-        "ms": "2.0.0"
+        "fill-range": {
+          "version": "2.2.4",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz",
+          "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==",
+          "dev": true,
+          "requires": {
+            "is-number": "^2.1.0",
+            "isobject": "^2.0.0",
+            "randomatic": "^3.0.0",
+            "repeat-element": "^1.1.2",
+            "repeat-string": "^1.5.2"
+          }
+        },
+        "is-number": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
+          "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^3.0.2"
+          }
+        },
+        "isobject": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+          "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+          "dev": true,
+          "requires": {
+            "isarray": "1.0.0"
+          }
+        },
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
       }
     },
-    "../threestrap/node_modules/expand-brackets/node_modules/define-property": {
-      "version": "0.2.5",
+    "expand-tilde": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
+      "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-descriptor": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
+      "requires": {
+        "homedir-polyfill": "^1.0.1"
       }
     },
-    "../threestrap/node_modules/expand-brackets/node_modules/is-accessor-descriptor": {
-      "version": "0.1.6",
+    "ext": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz",
+      "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "kind-of": "^3.0.2"
+      "requires": {
+        "type": "^2.5.0"
       },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": {
-      "version": "3.2.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/expand-brackets/node_modules/is-data-descriptor": {
-      "version": "0.1.4",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "kind-of": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": {
-      "version": "3.2.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/expand-brackets/node_modules/is-descriptor": {
-      "version": "0.1.6",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-accessor-descriptor": "^0.1.6",
-        "is-data-descriptor": "^0.1.4",
-        "kind-of": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/expand-brackets/node_modules/ms": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/expand-range": {
-      "version": "1.8.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "fill-range": "^2.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/expand-range/node_modules/fill-range": {
-      "version": "2.2.4",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-number": "^2.1.0",
-        "isobject": "^2.0.0",
-        "randomatic": "^3.0.0",
-        "repeat-element": "^1.1.2",
-        "repeat-string": "^1.5.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/expand-range/node_modules/is-number": {
-      "version": "2.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "kind-of": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/expand-range/node_modules/isobject": {
-      "version": "2.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "isarray": "1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/expand-range/node_modules/kind-of": {
-      "version": "3.2.2",
-      "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/expand-tilde": {
-      "version": "2.0.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "homedir-polyfill": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/ext": {
-      "version": "1.4.0",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "type": "^2.0.0"
+        "type": {
+          "version": "2.6.0",
+          "resolved": "https://registry.npmjs.org/type/-/type-2.6.0.tgz",
+          "integrity": "sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ==",
+          "dev": true
+        }
       }
     },
-    "../threestrap/node_modules/ext/node_modules/type": {
-      "version": "2.5.0",
-      "dev": true,
-      "license": "ISC"
-    },
-    "../threestrap/node_modules/extend": {
+    "extend": {
       "version": "3.0.2",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+      "dev": true
     },
-    "../threestrap/node_modules/extend-shallow": {
+    "extend-shallow": {
       "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+      "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "is-extendable": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
       }
     },
-    "../threestrap/node_modules/external-editor": {
+    "external-editor": {
       "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
+      "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "chardet": "^0.7.0",
         "iconv-lite": "^0.4.24",
         "tmp": "^0.0.33"
       },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "../threestrap/node_modules/external-editor/node_modules/tmp": {
-      "version": "0.0.33",
-      "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "os-tmpdir": "~1.0.2"
-      },
-      "engines": {
-        "node": ">=0.6.0"
+        "tmp": {
+          "version": "0.0.33",
+          "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+          "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+          "dev": true,
+          "requires": {
+            "os-tmpdir": "~1.0.2"
+          }
+        }
       }
     },
-    "../threestrap/node_modules/extglob": {
+    "extglob": {
       "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+      "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "array-unique": "^0.3.2",
         "define-property": "^1.0.0",
         "expand-brackets": "^2.1.4",
@@ -12541,126 +13715,117 @@
         "snapdragon": "^0.8.1",
         "to-regex": "^3.0.1"
       },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/extglob/node_modules/define-property": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "is-descriptor": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
+        "define-property": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^1.0.0"
+          }
+        }
       }
     },
-    "../threestrap/node_modules/fancy-log": {
+    "fancy-log": {
       "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz",
+      "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "ansi-gray": "^0.1.1",
         "color-support": "^1.1.3",
         "parse-node-version": "^1.0.0",
         "time-stamp": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.10"
       }
     },
-    "../threestrap/node_modules/fast-deep-equal": {
+    "fast-deep-equal": {
       "version": "3.1.3",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+      "dev": true
     },
-    "../threestrap/node_modules/fast-json-stable-stringify": {
+    "fast-json-stable-stringify": {
       "version": "2.1.0",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+      "dev": true
     },
-    "../threestrap/node_modules/fast-levenshtein": {
+    "fast-levenshtein": {
       "version": "2.0.6",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+      "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+      "dev": true
     },
-    "../threestrap/node_modules/fastest-levenshtein": {
+    "fastest-levenshtein": {
       "version": "1.0.12",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz",
+      "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==",
+      "dev": true
     },
-    "../threestrap/node_modules/figgy-pudding": {
+    "figgy-pudding": {
       "version": "3.5.2",
-      "dev": true,
-      "license": "ISC"
+      "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz",
+      "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==",
+      "dev": true
     },
-    "../threestrap/node_modules/figures": {
+    "figures": {
       "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
+      "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "escape-string-regexp": "^1.0.5"
       },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "../threestrap/node_modules/figures/node_modules/escape-string-regexp": {
-      "version": "1.0.5",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.8.0"
+      "dependencies": {
+        "escape-string-regexp": {
+          "version": "1.0.5",
+          "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+          "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+          "dev": true
+        }
       }
     },
-    "../threestrap/node_modules/file-entry-cache": {
+    "file-entry-cache": {
       "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+      "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "flat-cache": "^3.0.4"
-      },
-      "engines": {
-        "node": "^10.12.0 || >=12.0.0"
       }
     },
-    "../threestrap/node_modules/file-uri-to-path": {
+    "file-uri-to-path": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
+      "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
       "dev": true,
-      "license": "MIT",
       "optional": true
     },
-    "../threestrap/node_modules/filename-regex": {
+    "filename-regex": {
       "version": "2.0.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
+      "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
+      "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=",
+      "dev": true
     },
-    "../threestrap/node_modules/fill-range": {
+    "fill-range": {
       "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+      "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "extend-shallow": "^2.0.1",
         "is-number": "^3.0.0",
         "repeat-string": "^1.6.1",
         "to-regex-range": "^2.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
       }
     },
-    "../threestrap/node_modules/finalhandler": {
+    "finalhandler": {
       "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
+      "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "debug": "2.6.9",
         "encodeurl": "~1.0.2",
         "escape-html": "~1.0.3",
@@ -12669,437 +13834,363 @@
         "statuses": "~1.5.0",
         "unpipe": "~1.0.0"
       },
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "../threestrap/node_modules/finalhandler/node_modules/debug": {
-      "version": "2.6.9",
-      "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "ms": "2.0.0"
-      }
-    },
-    "../threestrap/node_modules/finalhandler/node_modules/ms": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "MIT"
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
+        }
+      }
     },
-    "../threestrap/node_modules/find-cache-dir": {
+    "find-cache-dir": {
       "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
+      "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "commondir": "^1.0.1",
         "make-dir": "^2.0.0",
         "pkg-dir": "^3.0.0"
       },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "../threestrap/node_modules/find-cache-dir/node_modules/find-up": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "locate-path": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "../threestrap/node_modules/find-cache-dir/node_modules/locate-path": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "p-locate": "^3.0.0",
-        "path-exists": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "../threestrap/node_modules/find-cache-dir/node_modules/p-limit": {
-      "version": "2.3.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "p-try": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "../threestrap/node_modules/find-cache-dir/node_modules/p-locate": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "p-limit": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "../threestrap/node_modules/find-cache-dir/node_modules/path-exists": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "../threestrap/node_modules/find-cache-dir/node_modules/pkg-dir": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "find-up": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
+        "find-up": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+          "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+          "dev": true,
+          "requires": {
+            "locate-path": "^3.0.0"
+          }
+        },
+        "locate-path": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+          "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+          "dev": true,
+          "requires": {
+            "p-locate": "^3.0.0",
+            "path-exists": "^3.0.0"
+          }
+        },
+        "p-locate": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+          "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.0.0"
+          }
+        },
+        "path-exists": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+          "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+          "dev": true
+        },
+        "pkg-dir": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
+          "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
+          "dev": true,
+          "requires": {
+            "find-up": "^3.0.0"
+          }
+        }
       }
     },
-    "../threestrap/node_modules/find-up": {
+    "find-up": {
       "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "locate-path": "^5.0.0",
         "path-exists": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
       }
     },
-    "../threestrap/node_modules/findup-sync": {
+    "findup-sync": {
       "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz",
+      "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "detect-file": "^1.0.0",
         "is-glob": "^4.0.0",
         "micromatch": "^3.0.4",
         "resolve-dir": "^1.0.1"
-      },
-      "engines": {
-        "node": ">= 0.10"
       }
     },
-    "../threestrap/node_modules/fined": {
+    "fined": {
       "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz",
+      "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "expand-tilde": "^2.0.2",
         "is-plain-object": "^2.0.3",
         "object.defaults": "^1.1.0",
         "object.pick": "^1.2.0",
         "parse-filepath": "^1.0.1"
       },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "../threestrap/node_modules/fined/node_modules/is-plain-object": {
-      "version": "2.0.4",
-      "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "isobject": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
+        "is-plain-object": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+          "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+          "dev": true,
+          "requires": {
+            "isobject": "^3.0.1"
+          }
+        }
       }
     },
-    "../threestrap/node_modules/first-chunk-stream": {
+    "first-chunk-stream": {
       "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz",
+      "integrity": "sha1-G97NuOCDwGZLkZRVgVd6Q6nzHXA=",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "readable-stream": "^2.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
       }
     },
-    "../threestrap/node_modules/flagged-respawn": {
+    "flagged-respawn": {
       "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.10"
-      }
+      "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz",
+      "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==",
+      "dev": true
     },
-    "../threestrap/node_modules/flat-cache": {
+    "flat-cache": {
       "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+      "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "flatted": "^3.1.0",
         "rimraf": "^3.0.2"
-      },
-      "engines": {
-        "node": "^10.12.0 || >=12.0.0"
       }
     },
-    "../threestrap/node_modules/flatted": {
-      "version": "3.1.1",
-      "dev": true,
-      "license": "ISC"
+    "flatted": {
+      "version": "3.2.5",
+      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz",
+      "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==",
+      "dev": true
     },
-    "../threestrap/node_modules/flush-write-stream": {
+    "flush-write-stream": {
       "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz",
+      "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "inherits": "^2.0.3",
         "readable-stream": "^2.3.6"
       }
     },
-    "../threestrap/node_modules/follow-redirects": {
-      "version": "1.14.1",
-      "dev": true,
-      "funding": [
-        {
-          "type": "individual",
-          "url": "https://github.com/sponsors/RubenVerborgh"
-        }
-      ],
-      "license": "MIT",
-      "engines": {
-        "node": ">=4.0"
-      },
-      "peerDependenciesMeta": {
-        "debug": {
-          "optional": true
-        }
-      }
+    "follow-redirects": {
+      "version": "1.14.8",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz",
+      "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==",
+      "dev": true
     },
-    "../threestrap/node_modules/for-in": {
+    "for-in": {
       "version": "1.0.2",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
+      "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+      "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+      "dev": true
     },
-    "../threestrap/node_modules/for-own": {
+    "for-own": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
+      "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "for-in": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
       }
     },
-    "../threestrap/node_modules/fragment-cache": {
+    "fragment-cache": {
       "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+      "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "map-cache": "^0.2.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
       }
     },
-    "../threestrap/node_modules/from2": {
+    "from2": {
       "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
+      "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "inherits": "^2.0.1",
         "readable-stream": "^2.0.0"
       }
     },
-    "../threestrap/node_modules/fs-extra": {
-      "version": "8.1.0",
+    "fs-extra": {
+      "version": "10.0.0",
+      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz",
+      "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "graceful-fs": "^4.2.0",
-        "jsonfile": "^4.0.0",
-        "universalify": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=6 <7 || >=8"
+        "jsonfile": "^6.0.1",
+        "universalify": "^2.0.0"
       }
     },
-    "../threestrap/node_modules/fs-mkdirp-stream": {
+    "fs-mkdirp-stream": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz",
+      "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "graceful-fs": "^4.1.11",
         "through2": "^2.0.3"
-      },
-      "engines": {
-        "node": ">= 0.10"
       }
     },
-    "../threestrap/node_modules/fs-write-stream-atomic": {
+    "fs-write-stream-atomic": {
       "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz",
+      "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=",
       "dev": true,
-      "license": "ISC",
-      "dependencies": {
+      "requires": {
         "graceful-fs": "^4.1.2",
         "iferr": "^0.1.5",
         "imurmurhash": "^0.1.4",
         "readable-stream": "1 || 2"
       }
     },
-    "../threestrap/node_modules/fs.realpath": {
+    "fs.realpath": {
       "version": "1.0.0",
-      "dev": true,
-      "license": "ISC"
+      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+      "dev": true
     },
-    "../threestrap/node_modules/fsevents": {
+    "fsevents": {
       "version": "1.2.13",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
+      "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
       "dev": true,
-      "hasInstallScript": true,
-      "license": "MIT",
       "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "dependencies": {
+      "requires": {
         "bindings": "^1.5.0",
         "nan": "^2.12.1"
-      },
-      "engines": {
-        "node": ">= 4.0"
       }
     },
-    "../threestrap/node_modules/function-bind": {
+    "function-bind": {
       "version": "1.1.1",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+      "dev": true
     },
-    "../threestrap/node_modules/functional-red-black-tree": {
+    "functional-red-black-tree": {
       "version": "1.0.1",
-      "dev": true,
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+      "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
+      "dev": true
     },
-    "../threestrap/node_modules/get-caller-file": {
+    "get-caller-file": {
       "version": "1.0.3",
-      "dev": true,
-      "license": "ISC"
+      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
+      "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==",
+      "dev": true
     },
-    "../threestrap/node_modules/get-intrinsic": {
+    "get-intrinsic": {
       "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
+      "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "function-bind": "^1.1.1",
         "has": "^1.0.3",
         "has-symbols": "^1.0.1"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "../threestrap/node_modules/get-stream": {
+    "get-stream": {
       "version": "6.0.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
+      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+      "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+      "dev": true
     },
-    "../threestrap/node_modules/get-value": {
+    "get-value": {
       "version": "2.0.6",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
+      "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+      "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+      "dev": true
     },
-    "../threestrap/node_modules/glob": {
-      "version": "7.1.7",
+    "glob": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
+      "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
       "dev": true,
-      "license": "ISC",
-      "dependencies": {
+      "requires": {
         "fs.realpath": "^1.0.0",
         "inflight": "^1.0.4",
         "inherits": "2",
         "minimatch": "^3.0.4",
         "once": "^1.3.0",
         "path-is-absolute": "^1.0.0"
-      },
-      "engines": {
-        "node": "*"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
       }
     },
-    "../threestrap/node_modules/glob-base": {
+    "glob-base": {
       "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
+      "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "glob-parent": "^2.0.0",
         "is-glob": "^2.0.0"
       },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/glob-base/node_modules/glob-parent": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "is-glob": "^2.0.0"
-      }
-    },
-    "../threestrap/node_modules/glob-base/node_modules/is-extglob": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/glob-base/node_modules/is-glob": {
-      "version": "2.0.1",
-      "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "is-extglob": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
+        "glob-parent": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
+          "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
+          "dev": true,
+          "requires": {
+            "is-glob": "^2.0.0"
+          }
+        },
+        "is-extglob": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+          "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
+          "dev": true
+        },
+        "is-glob": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+          "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+          "dev": true,
+          "requires": {
+            "is-extglob": "^1.0.0"
+          }
+        }
       }
     },
-    "../threestrap/node_modules/glob-parent": {
+    "glob-parent": {
       "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
       "dev": true,
-      "license": "ISC",
-      "dependencies": {
+      "requires": {
         "is-glob": "^4.0.1"
-      },
-      "engines": {
-        "node": ">= 6"
       }
     },
-    "../threestrap/node_modules/glob-stream": {
+    "glob-stream": {
       "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz",
+      "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "extend": "^3.0.0",
         "glob": "^7.1.1",
         "glob-parent": "^3.1.0",
@@ -13111,40 +14202,40 @@
         "to-absolute-glob": "^2.0.0",
         "unique-stream": "^2.0.2"
       },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "../threestrap/node_modules/glob-stream/node_modules/glob-parent": {
-      "version": "3.1.0",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "is-glob": "^3.1.0",
-        "path-dirname": "^1.0.0"
-      }
-    },
-    "../threestrap/node_modules/glob-stream/node_modules/is-glob": {
-      "version": "3.1.0",
-      "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "is-extglob": "^2.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
+        "glob-parent": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+          "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+          "dev": true,
+          "requires": {
+            "is-glob": "^3.1.0",
+            "path-dirname": "^1.0.0"
+          }
+        },
+        "is-glob": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+          "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+          "dev": true,
+          "requires": {
+            "is-extglob": "^2.1.0"
+          }
+        }
       }
     },
-    "../threestrap/node_modules/glob-to-regexp": {
+    "glob-to-regexp": {
       "version": "0.4.1",
-      "dev": true,
-      "license": "BSD-2-Clause"
+      "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
+      "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
+      "dev": true
     },
-    "../threestrap/node_modules/glob-watcher": {
+    "glob-watcher": {
       "version": "5.0.5",
+      "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.5.tgz",
+      "integrity": "sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "anymatch": "^2.0.0",
         "async-done": "^1.2.0",
         "chokidar": "^2.0.0",
@@ -13152,102 +14243,125 @@
         "just-debounce": "^1.0.0",
         "normalize-path": "^3.0.0",
         "object.defaults": "^1.1.0"
-      },
-      "engines": {
-        "node": ">= 0.10"
       }
     },
-    "../threestrap/node_modules/global-modules": {
+    "global-modules": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
+      "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "global-prefix": "^1.0.1",
         "is-windows": "^1.0.1",
         "resolve-dir": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
       }
     },
-    "../threestrap/node_modules/global-prefix": {
+    "global-prefix": {
       "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
+      "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "expand-tilde": "^2.0.2",
         "homedir-polyfill": "^1.0.1",
         "ini": "^1.3.4",
         "is-windows": "^1.0.1",
         "which": "^1.2.14"
       },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/global-prefix/node_modules/which": {
-      "version": "1.3.1",
-      "dev": true,
-      "license": "ISC",
       "dependencies": {
-        "isexe": "^2.0.0"
-      },
-      "bin": {
-        "which": "bin/which"
+        "which": {
+          "version": "1.3.1",
+          "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+          "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+          "dev": true,
+          "requires": {
+            "isexe": "^2.0.0"
+          }
+        }
       }
     },
-    "../threestrap/node_modules/globals": {
-      "version": "13.9.0",
+    "globals": {
+      "version": "13.12.1",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz",
+      "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "type-fest": "^0.20.2"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "../threestrap/node_modules/glogg": {
+    "glogg": {
       "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz",
+      "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "sparkles": "^1.0.0"
+      }
+    },
+    "glsl-tokenizer": {
+      "version": "2.1.5",
+      "resolved": "https://registry.npmjs.org/glsl-tokenizer/-/glsl-tokenizer-2.1.5.tgz",
+      "integrity": "sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA==",
+      "requires": {
+        "through2": "^0.6.3"
       },
-      "engines": {
-        "node": ">= 0.10"
+      "dependencies": {
+        "isarray": {
+          "version": "0.0.1",
+          "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+          "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+        },
+        "readable-stream": {
+          "version": "1.0.34",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+          "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+          "requires": {
+            "core-util-is": "~1.0.0",
+            "inherits": "~2.0.1",
+            "isarray": "0.0.1",
+            "string_decoder": "~0.10.x"
+          }
+        },
+        "string_decoder": {
+          "version": "0.10.31",
+          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+          "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
+        },
+        "through2": {
+          "version": "0.6.5",
+          "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+          "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+          "requires": {
+            "readable-stream": ">=1.0.33-1 <1.1.0-0",
+            "xtend": ">=4.0.0 <4.1.0-0"
+          }
+        }
       }
     },
-    "../threestrap/node_modules/graceful-fs": {
-      "version": "4.2.6",
-      "dev": true,
-      "license": "ISC"
+    "graceful-fs": {
+      "version": "4.2.9",
+      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz",
+      "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==",
+      "dev": true
     },
-    "../threestrap/node_modules/gulp": {
+    "gulp": {
       "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz",
+      "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "glob-watcher": "^5.0.3",
         "gulp-cli": "^2.2.0",
         "undertaker": "^1.2.1",
         "vinyl-fs": "^3.0.0"
-      },
-      "bin": {
-        "gulp": "bin/gulp.js"
-      },
-      "engines": {
-        "node": ">= 0.10"
       }
     },
-    "../threestrap/node_modules/gulp-cli": {
+    "gulp-cli": {
       "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.3.0.tgz",
+      "integrity": "sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "ansi-colors": "^1.0.1",
         "archy": "^1.0.0",
         "array-sort": "^1.0.0",
@@ -13267,34854 +14381,4053 @@
         "v8flags": "^3.2.0",
         "yargs": "^7.1.0"
       },
-      "bin": {
-        "gulp": "bin/gulp.js"
-      },
-      "engines": {
-        "node": ">= 0.10"
+      "dependencies": {
+        "ansi-colors": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
+          "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==",
+          "dev": true,
+          "requires": {
+            "ansi-wrap": "^0.1.0"
+          }
+        }
       }
     },
-    "../threestrap/node_modules/gulp-cli/node_modules/ansi-colors": {
-      "version": "1.1.0",
+    "gulp-concat": {
+      "version": "2.6.1",
+      "resolved": "https://registry.npmjs.org/gulp-concat/-/gulp-concat-2.6.1.tgz",
+      "integrity": "sha1-Yz0WyV2IUEYorQJmVmPO5aR5M1M=",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-wrap": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
+      "requires": {
+        "concat-with-sourcemaps": "^1.0.0",
+        "through2": "^2.0.0",
+        "vinyl": "^2.0.0"
       }
     },
-    "../threestrap/node_modules/gulp-eslint": {
+    "gulp-eslint": {
       "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/gulp-eslint/-/gulp-eslint-6.0.0.tgz",
+      "integrity": "sha512-dCVPSh1sA+UVhn7JSQt7KEb4An2sQNbOdB3PA8UCfxsoPlAKjJHxYHGXdXC7eb+V1FAnilSFFqslPrq037l1ig==",
       "dev": true,
-      "license": "MIT",
-      "dependencies": {
+      "requires": {
         "eslint": "^6.0.0",
         "fancy-log": "^1.3.2",
         "plugin-error": "^1.0.1"
-      }
-    },
-    "../threestrap/node_modules/gulp-eslint/node_modules/ansi-regex": {
-      "version": "4.1.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "../threestrap/node_modules/gulp-eslint/node_modules/ansi-styles": {
-      "version": "3.2.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "color-convert": "^1.9.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "../threestrap/node_modules/gulp-eslint/node_modules/astral-regex": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "../threestrap/node_modules/gulp-eslint/node_modules/chalk": {
-      "version": "2.4.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-styles": "^3.2.1",
-        "escape-string-regexp": "^1.0.5",
-        "supports-color": "^5.3.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "../threestrap/node_modules/gulp-eslint/node_modules/color-convert": {
-      "version": "1.9.3",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "color-name": "1.1.3"
-      }
-    },
-    "../threestrap/node_modules/gulp-eslint/node_modules/color-name": {
-      "version": "1.1.3",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/gulp-eslint/node_modules/cross-spawn": {
-      "version": "6.0.5",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "nice-try": "^1.0.4",
-        "path-key": "^2.0.1",
-        "semver": "^5.5.0",
-        "shebang-command": "^1.2.0",
-        "which": "^1.2.9"
-      },
-      "engines": {
-        "node": ">=4.8"
-      }
-    },
-    "../threestrap/node_modules/gulp-eslint/node_modules/cross-spawn/node_modules/semver": {
-      "version": "5.7.1",
-      "dev": true,
-      "license": "ISC",
-      "bin": {
-        "semver": "bin/semver"
-      }
-    },
-    "../threestrap/node_modules/gulp-eslint/node_modules/emoji-regex": {
-      "version": "7.0.3",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/gulp-eslint/node_modules/escape-string-regexp": {
-      "version": "1.0.5",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.8.0"
-      }
-    },
-    "../threestrap/node_modules/gulp-eslint/node_modules/eslint": {
-      "version": "6.8.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/code-frame": "^7.0.0",
-        "ajv": "^6.10.0",
-        "chalk": "^2.1.0",
-        "cross-spawn": "^6.0.5",
-        "debug": "^4.0.1",
-        "doctrine": "^3.0.0",
-        "eslint-scope": "^5.0.0",
-        "eslint-utils": "^1.4.3",
-        "eslint-visitor-keys": "^1.1.0",
-        "espree": "^6.1.2",
-        "esquery": "^1.0.1",
-        "esutils": "^2.0.2",
-        "file-entry-cache": "^5.0.1",
-        "functional-red-black-tree": "^1.0.1",
-        "glob-parent": "^5.0.0",
-        "globals": "^12.1.0",
-        "ignore": "^4.0.6",
-        "import-fresh": "^3.0.0",
-        "imurmurhash": "^0.1.4",
-        "inquirer": "^7.0.0",
-        "is-glob": "^4.0.0",
-        "js-yaml": "^3.13.1",
-        "json-stable-stringify-without-jsonify": "^1.0.1",
-        "levn": "^0.3.0",
-        "lodash": "^4.17.14",
-        "minimatch": "^3.0.4",
-        "mkdirp": "^0.5.1",
-        "natural-compare": "^1.4.0",
-        "optionator": "^0.8.3",
-        "progress": "^2.0.0",
-        "regexpp": "^2.0.1",
-        "semver": "^6.1.2",
-        "strip-ansi": "^5.2.0",
-        "strip-json-comments": "^3.0.1",
-        "table": "^5.2.3",
-        "text-table": "^0.2.0",
-        "v8-compile-cache": "^2.0.3"
-      },
-      "bin": {
-        "eslint": "bin/eslint.js"
-      },
-      "engines": {
-        "node": "^8.10.0 || ^10.13.0 || >=11.10.1"
-      },
-      "funding": {
-        "url": "https://opencollective.com/eslint"
-      }
-    },
-    "../threestrap/node_modules/gulp-eslint/node_modules/eslint-utils": {
-      "version": "1.4.3",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "eslint-visitor-keys": "^1.1.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "../threestrap/node_modules/gulp-eslint/node_modules/eslint-visitor-keys": {
-      "version": "1.3.0",
-      "dev": true,
-      "license": "Apache-2.0",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "../threestrap/node_modules/gulp-eslint/node_modules/espree": {
-      "version": "6.2.1",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "dependencies": {
-        "acorn": "^7.1.1",
-        "acorn-jsx": "^5.2.0",
-        "eslint-visitor-keys": "^1.1.0"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "../threestrap/node_modules/gulp-eslint/node_modules/file-entry-cache": {
-      "version": "5.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "flat-cache": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "../threestrap/node_modules/gulp-eslint/node_modules/flat-cache": {
-      "version": "2.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "flatted": "^2.0.0",
-        "rimraf": "2.6.3",
-        "write": "1.0.3"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "../threestrap/node_modules/gulp-eslint/node_modules/flatted": {
-      "version": "2.0.2",
-      "dev": true,
-      "license": "ISC"
-    },
-    "../threestrap/node_modules/gulp-eslint/node_modules/globals": {
-      "version": "12.4.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "type-fest": "^0.8.1"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "../threestrap/node_modules/gulp-eslint/node_modules/has-flag": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "../threestrap/node_modules/gulp-eslint/node_modules/is-fullwidth-code-point": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "../threestrap/node_modules/gulp-eslint/node_modules/levn": {
-      "version": "0.3.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "prelude-ls": "~1.1.2",
-        "type-check": "~0.3.2"
       },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "../threestrap/node_modules/gulp-eslint/node_modules/optionator": {
-      "version": "0.8.3",
-      "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "deep-is": "~0.1.3",
-        "fast-levenshtein": "~2.0.6",
-        "levn": "~0.3.0",
-        "prelude-ls": "~1.1.2",
-        "type-check": "~0.3.2",
-        "word-wrap": "~1.2.3"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "../threestrap/node_modules/gulp-eslint/node_modules/path-key": {
-      "version": "2.0.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "../threestrap/node_modules/gulp-eslint/node_modules/prelude-ls": {
-      "version": "1.1.2",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "../threestrap/node_modules/gulp-eslint/node_modules/regexpp": {
-      "version": "2.0.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6.5.0"
-      }
-    },
-    "../threestrap/node_modules/gulp-eslint/node_modules/rimraf": {
-      "version": "2.6.3",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "glob": "^7.1.3"
-      },
-      "bin": {
-        "rimraf": "bin.js"
-      }
-    },
-    "../threestrap/node_modules/gulp-eslint/node_modules/semver": {
-      "version": "6.3.0",
-      "dev": true,
-      "license": "ISC",
-      "bin": {
-        "semver": "bin/semver.js"
-      }
-    },
-    "../threestrap/node_modules/gulp-eslint/node_modules/shebang-command": {
-      "version": "1.2.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "shebang-regex": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/gulp-eslint/node_modules/shebang-regex": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/gulp-eslint/node_modules/slice-ansi": {
-      "version": "2.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-styles": "^3.2.0",
-        "astral-regex": "^1.0.0",
-        "is-fullwidth-code-point": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "../threestrap/node_modules/gulp-eslint/node_modules/string-width": {
-      "version": "3.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "emoji-regex": "^7.0.1",
-        "is-fullwidth-code-point": "^2.0.0",
-        "strip-ansi": "^5.1.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "../threestrap/node_modules/gulp-eslint/node_modules/strip-ansi": {
-      "version": "5.2.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-regex": "^4.1.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "../threestrap/node_modules/gulp-eslint/node_modules/supports-color": {
-      "version": "5.5.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "../threestrap/node_modules/gulp-eslint/node_modules/table": {
-      "version": "5.4.6",
-      "dev": true,
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "ajv": "^6.10.2",
-        "lodash": "^4.17.14",
-        "slice-ansi": "^2.1.0",
-        "string-width": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "../threestrap/node_modules/gulp-eslint/node_modules/type-check": {
-      "version": "0.3.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "prelude-ls": "~1.1.2"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "../threestrap/node_modules/gulp-eslint/node_modules/type-fest": {
-      "version": "0.8.1",
-      "dev": true,
-      "license": "(MIT OR CC0-1.0)",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "../threestrap/node_modules/gulp-eslint/node_modules/which": {
-      "version": "1.3.1",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "isexe": "^2.0.0"
-      },
-      "bin": {
-        "which": "bin/which"
-      }
-    },
-    "../threestrap/node_modules/gulp-watch": {
-      "version": "5.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-colors": "1.1.0",
-        "anymatch": "^1.3.0",
-        "chokidar": "^2.0.0",
-        "fancy-log": "1.3.2",
-        "glob-parent": "^3.0.1",
-        "object-assign": "^4.1.0",
-        "path-is-absolute": "^1.0.1",
-        "plugin-error": "1.0.1",
-        "readable-stream": "^2.2.2",
-        "slash": "^1.0.0",
-        "vinyl": "^2.1.0",
-        "vinyl-file": "^2.0.0"
-      }
-    },
-    "../threestrap/node_modules/gulp-watch/node_modules/ansi-colors": {
-      "version": "1.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-wrap": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/gulp-watch/node_modules/anymatch": {
-      "version": "1.3.2",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "micromatch": "^2.1.5",
-        "normalize-path": "^2.0.0"
-      }
-    },
-    "../threestrap/node_modules/gulp-watch/node_modules/arr-diff": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "arr-flatten": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/gulp-watch/node_modules/array-unique": {
-      "version": "0.2.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/gulp-watch/node_modules/braces": {
-      "version": "1.8.5",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "expand-range": "^1.8.1",
-        "preserve": "^0.2.0",
-        "repeat-element": "^1.1.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/gulp-watch/node_modules/expand-brackets": {
-      "version": "0.1.5",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-posix-bracket": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/gulp-watch/node_modules/extglob": {
-      "version": "0.3.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-extglob": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/gulp-watch/node_modules/extglob/node_modules/is-extglob": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/gulp-watch/node_modules/fancy-log": {
-      "version": "1.3.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-gray": "^0.1.1",
-        "color-support": "^1.1.3",
-        "time-stamp": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "../threestrap/node_modules/gulp-watch/node_modules/glob-parent": {
-      "version": "3.1.0",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "is-glob": "^3.1.0",
-        "path-dirname": "^1.0.0"
-      }
-    },
-    "../threestrap/node_modules/gulp-watch/node_modules/is-glob": {
-      "version": "3.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-extglob": "^2.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/gulp-watch/node_modules/kind-of": {
-      "version": "3.2.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/gulp-watch/node_modules/micromatch": {
-      "version": "2.3.11",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "arr-diff": "^2.0.0",
-        "array-unique": "^0.2.1",
-        "braces": "^1.8.2",
-        "expand-brackets": "^0.1.4",
-        "extglob": "^0.3.1",
-        "filename-regex": "^2.0.0",
-        "is-extglob": "^1.0.0",
-        "is-glob": "^2.0.1",
-        "kind-of": "^3.0.2",
-        "normalize-path": "^2.0.1",
-        "object.omit": "^2.0.0",
-        "parse-glob": "^3.0.4",
-        "regex-cache": "^0.4.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/gulp-watch/node_modules/micromatch/node_modules/is-extglob": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/gulp-watch/node_modules/micromatch/node_modules/is-glob": {
-      "version": "2.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-extglob": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/gulp-watch/node_modules/normalize-path": {
-      "version": "2.1.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "remove-trailing-separator": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/gulplog": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "glogg": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "../threestrap/node_modules/has": {
-      "version": "1.0.3",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "function-bind": "^1.1.1"
-      },
-      "engines": {
-        "node": ">= 0.4.0"
-      }
-    },
-    "../threestrap/node_modules/has-flag": {
-      "version": "4.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "../threestrap/node_modules/has-symbols": {
-      "version": "1.0.2",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "../threestrap/node_modules/has-value": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "get-value": "^2.0.6",
-        "has-values": "^1.0.0",
-        "isobject": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/has-values": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-number": "^3.0.0",
-        "kind-of": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/has-values/node_modules/kind-of": {
-      "version": "4.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/hash-base": {
-      "version": "3.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "inherits": "^2.0.4",
-        "readable-stream": "^3.6.0",
-        "safe-buffer": "^5.2.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "../threestrap/node_modules/hash-base/node_modules/readable-stream": {
-      "version": "3.6.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "inherits": "^2.0.3",
-        "string_decoder": "^1.1.1",
-        "util-deprecate": "^1.0.1"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "../threestrap/node_modules/hash-base/node_modules/safe-buffer": {
-      "version": "5.2.1",
-      "dev": true,
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ],
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/hash.js": {
-      "version": "1.1.7",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "inherits": "^2.0.3",
-        "minimalistic-assert": "^1.0.1"
-      }
-    },
-    "../threestrap/node_modules/hmac-drbg": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "hash.js": "^1.0.3",
-        "minimalistic-assert": "^1.0.0",
-        "minimalistic-crypto-utils": "^1.0.1"
-      }
-    },
-    "../threestrap/node_modules/homedir-polyfill": {
-      "version": "1.0.3",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "parse-passwd": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/hosted-git-info": {
-      "version": "2.8.9",
-      "dev": true,
-      "license": "ISC"
-    },
-    "../threestrap/node_modules/http-errors": {
-      "version": "1.7.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "depd": "~1.1.2",
-        "inherits": "2.0.3",
-        "setprototypeof": "1.1.1",
-        "statuses": ">= 1.5.0 < 2",
-        "toidentifier": "1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "../threestrap/node_modules/http-errors/node_modules/inherits": {
-      "version": "2.0.3",
-      "dev": true,
-      "license": "ISC"
-    },
-    "../threestrap/node_modules/http-proxy": {
-      "version": "1.18.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "eventemitter3": "^4.0.0",
-        "follow-redirects": "^1.0.0",
-        "requires-port": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=8.0.0"
-      }
-    },
-    "../threestrap/node_modules/https-browserify": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/human-signals": {
-      "version": "2.1.0",
-      "dev": true,
-      "license": "Apache-2.0",
-      "engines": {
-        "node": ">=10.17.0"
-      }
-    },
-    "../threestrap/node_modules/iconv-lite": {
-      "version": "0.4.24",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "safer-buffer": ">= 2.1.2 < 3"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/ieee754": {
-      "version": "1.2.1",
-      "dev": true,
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ],
-      "license": "BSD-3-Clause"
-    },
-    "../threestrap/node_modules/iferr": {
-      "version": "0.1.5",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/ignore": {
-      "version": "4.0.6",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 4"
-      }
-    },
-    "../threestrap/node_modules/import-fresh": {
-      "version": "3.3.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "parent-module": "^1.0.0",
-        "resolve-from": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "../threestrap/node_modules/import-local": {
-      "version": "3.0.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "pkg-dir": "^4.2.0",
-        "resolve-cwd": "^3.0.0"
-      },
-      "bin": {
-        "import-local-fixture": "fixtures/cli.js"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "../threestrap/node_modules/imurmurhash": {
-      "version": "0.1.4",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.8.19"
-      }
-    },
-    "../threestrap/node_modules/infer-owner": {
-      "version": "1.0.4",
-      "dev": true,
-      "license": "ISC"
-    },
-    "../threestrap/node_modules/inflight": {
-      "version": "1.0.6",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "once": "^1.3.0",
-        "wrappy": "1"
-      }
-    },
-    "../threestrap/node_modules/inherits": {
-      "version": "2.0.4",
-      "dev": true,
-      "license": "ISC"
-    },
-    "../threestrap/node_modules/ini": {
-      "version": "1.3.8",
-      "dev": true,
-      "license": "ISC"
-    },
-    "../threestrap/node_modules/inquirer": {
-      "version": "7.3.3",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-escapes": "^4.2.1",
-        "chalk": "^4.1.0",
-        "cli-cursor": "^3.1.0",
-        "cli-width": "^3.0.0",
-        "external-editor": "^3.0.3",
-        "figures": "^3.0.0",
-        "lodash": "^4.17.19",
-        "mute-stream": "0.0.8",
-        "run-async": "^2.4.0",
-        "rxjs": "^6.6.0",
-        "string-width": "^4.1.0",
-        "strip-ansi": "^6.0.0",
-        "through": "^2.3.6"
-      },
-      "engines": {
-        "node": ">=8.0.0"
-      }
-    },
-    "../threestrap/node_modules/interpret": {
-      "version": "1.4.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "../threestrap/node_modules/invert-kv": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/is-absolute": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-relative": "^1.0.0",
-        "is-windows": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/is-accessor-descriptor": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "kind-of": "^6.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/is-accessor-descriptor/node_modules/kind-of": {
-      "version": "6.0.3",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/is-arrayish": {
-      "version": "0.2.1",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/is-binary-path": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "binary-extensions": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/is-buffer": {
-      "version": "1.1.6",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/is-core-module": {
-      "version": "2.4.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "has": "^1.0.3"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "../threestrap/node_modules/is-data-descriptor": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "kind-of": "^6.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/is-data-descriptor/node_modules/kind-of": {
-      "version": "6.0.3",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/is-descriptor": {
-      "version": "1.0.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-accessor-descriptor": "^1.0.0",
-        "is-data-descriptor": "^1.0.0",
-        "kind-of": "^6.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/is-descriptor/node_modules/kind-of": {
-      "version": "6.0.3",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/is-dotfile": {
-      "version": "1.0.3",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/is-equal-shallow": {
-      "version": "0.1.3",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-primitive": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/is-extendable": {
-      "version": "0.1.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/is-extglob": {
-      "version": "2.1.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/is-fullwidth-code-point": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "../threestrap/node_modules/is-glob": {
-      "version": "4.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-extglob": "^2.1.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/is-negated-glob": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/is-number": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "kind-of": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/is-number/node_modules/kind-of": {
-      "version": "3.2.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/is-plain-object": {
-      "version": "5.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/is-posix-bracket": {
-      "version": "0.1.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/is-primitive": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/is-relative": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-unc-path": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/is-stream": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "../threestrap/node_modules/is-unc-path": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "unc-path-regex": "^0.1.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/is-utf8": {
-      "version": "0.2.1",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/is-valid-glob": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/is-windows": {
-      "version": "1.0.2",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/is-wsl": {
-      "version": "1.1.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "../threestrap/node_modules/isarray": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/isbinaryfile": {
-      "version": "4.0.8",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 8.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/gjtorikian/"
-      }
-    },
-    "../threestrap/node_modules/isexe": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "ISC"
-    },
-    "../threestrap/node_modules/isobject": {
-      "version": "3.0.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/jasmine-core": {
-      "version": "3.7.1",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/jest-worker": {
-      "version": "27.0.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@types/node": "*",
-        "merge-stream": "^2.0.0",
-        "supports-color": "^8.0.0"
-      },
-      "engines": {
-        "node": ">= 10.13.0"
-      }
-    },
-    "../threestrap/node_modules/jest-worker/node_modules/supports-color": {
-      "version": "8.1.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "has-flag": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/supports-color?sponsor=1"
-      }
-    },
-    "../threestrap/node_modules/js-tokens": {
-      "version": "4.0.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/js-yaml": {
-      "version": "3.14.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "argparse": "^1.0.7",
-        "esprima": "^4.0.0"
-      },
-      "bin": {
-        "js-yaml": "bin/js-yaml.js"
-      }
-    },
-    "../threestrap/node_modules/json-parse-better-errors": {
-      "version": "1.0.2",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/json-schema-traverse": {
-      "version": "0.4.1",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/json-stable-stringify-without-jsonify": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/json5": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "minimist": "^1.2.0"
-      },
-      "bin": {
-        "json5": "lib/cli.js"
-      }
-    },
-    "../threestrap/node_modules/jsonfile": {
-      "version": "4.0.0",
-      "dev": true,
-      "license": "MIT",
-      "optionalDependencies": {
-        "graceful-fs": "^4.1.6"
-      }
-    },
-    "../threestrap/node_modules/just-debounce": {
-      "version": "1.1.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/karma": {
-      "version": "6.3.4",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "body-parser": "^1.19.0",
-        "braces": "^3.0.2",
-        "chokidar": "^3.5.1",
-        "colors": "^1.4.0",
-        "connect": "^3.7.0",
-        "di": "^0.0.1",
-        "dom-serialize": "^2.2.1",
-        "glob": "^7.1.7",
-        "graceful-fs": "^4.2.6",
-        "http-proxy": "^1.18.1",
-        "isbinaryfile": "^4.0.8",
-        "lodash": "^4.17.21",
-        "log4js": "^6.3.0",
-        "mime": "^2.5.2",
-        "minimatch": "^3.0.4",
-        "qjobs": "^1.2.0",
-        "range-parser": "^1.2.1",
-        "rimraf": "^3.0.2",
-        "socket.io": "^3.1.0",
-        "source-map": "^0.6.1",
-        "tmp": "^0.2.1",
-        "ua-parser-js": "^0.7.28",
-        "yargs": "^16.1.1"
-      },
-      "bin": {
-        "karma": "bin/karma"
-      },
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "../threestrap/node_modules/karma-chrome-launcher": {
-      "version": "3.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "which": "^1.2.1"
-      }
-    },
-    "../threestrap/node_modules/karma-chrome-launcher/node_modules/which": {
-      "version": "1.3.1",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "isexe": "^2.0.0"
-      },
-      "bin": {
-        "which": "bin/which"
-      }
-    },
-    "../threestrap/node_modules/karma-jasmine": {
-      "version": "4.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "jasmine-core": "^3.6.0"
-      },
-      "engines": {
-        "node": ">= 10"
-      },
-      "peerDependencies": {
-        "karma": "*"
-      }
-    },
-    "../threestrap/node_modules/karma/node_modules/anymatch": {
-      "version": "3.1.2",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "normalize-path": "^3.0.0",
-        "picomatch": "^2.0.4"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "../threestrap/node_modules/karma/node_modules/binary-extensions": {
-      "version": "2.2.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "../threestrap/node_modules/karma/node_modules/braces": {
-      "version": "3.0.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "fill-range": "^7.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "../threestrap/node_modules/karma/node_modules/chokidar": {
-      "version": "3.5.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "anymatch": "~3.1.1",
-        "braces": "~3.0.2",
-        "glob-parent": "~5.1.0",
-        "is-binary-path": "~2.1.0",
-        "is-glob": "~4.0.1",
-        "normalize-path": "~3.0.0",
-        "readdirp": "~3.5.0"
-      },
-      "engines": {
-        "node": ">= 8.10.0"
-      },
-      "optionalDependencies": {
-        "fsevents": "~2.3.1"
-      }
-    },
-    "../threestrap/node_modules/karma/node_modules/cliui": {
-      "version": "7.0.4",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "string-width": "^4.2.0",
-        "strip-ansi": "^6.0.0",
-        "wrap-ansi": "^7.0.0"
-      }
-    },
-    "../threestrap/node_modules/karma/node_modules/fill-range": {
-      "version": "7.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "to-regex-range": "^5.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "../threestrap/node_modules/karma/node_modules/fsevents": {
-      "version": "2.3.2",
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
-      }
-    },
-    "../threestrap/node_modules/karma/node_modules/get-caller-file": {
-      "version": "2.0.5",
-      "dev": true,
-      "license": "ISC",
-      "engines": {
-        "node": "6.* || 8.* || >= 10.*"
-      }
-    },
-    "../threestrap/node_modules/karma/node_modules/is-binary-path": {
-      "version": "2.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "binary-extensions": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "../threestrap/node_modules/karma/node_modules/is-number": {
-      "version": "7.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.12.0"
-      }
-    },
-    "../threestrap/node_modules/karma/node_modules/readdirp": {
-      "version": "3.5.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "picomatch": "^2.2.1"
-      },
-      "engines": {
-        "node": ">=8.10.0"
-      }
-    },
-    "../threestrap/node_modules/karma/node_modules/to-regex-range": {
-      "version": "5.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-number": "^7.0.0"
-      },
-      "engines": {
-        "node": ">=8.0"
-      }
-    },
-    "../threestrap/node_modules/karma/node_modules/wrap-ansi": {
-      "version": "7.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-styles": "^4.0.0",
-        "string-width": "^4.1.0",
-        "strip-ansi": "^6.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
-      }
-    },
-    "../threestrap/node_modules/karma/node_modules/y18n": {
-      "version": "5.0.8",
-      "dev": true,
-      "license": "ISC",
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "../threestrap/node_modules/karma/node_modules/yargs": {
-      "version": "16.2.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "cliui": "^7.0.2",
-        "escalade": "^3.1.1",
-        "get-caller-file": "^2.0.5",
-        "require-directory": "^2.1.1",
-        "string-width": "^4.2.0",
-        "y18n": "^5.0.5",
-        "yargs-parser": "^20.2.2"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "../threestrap/node_modules/karma/node_modules/yargs-parser": {
-      "version": "20.2.7",
-      "dev": true,
-      "license": "ISC",
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "../threestrap/node_modules/kind-of": {
-      "version": "5.1.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/last-run": {
-      "version": "1.1.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "default-resolution": "^2.0.0",
-        "es6-weak-map": "^2.0.1"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "../threestrap/node_modules/lazystream": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "readable-stream": "^2.0.5"
-      },
-      "engines": {
-        "node": ">= 0.6.3"
-      }
-    },
-    "../threestrap/node_modules/lcid": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "invert-kv": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/lead": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "flush-write-stream": "^1.0.2"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "../threestrap/node_modules/levn": {
-      "version": "0.4.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "prelude-ls": "^1.2.1",
-        "type-check": "~0.4.0"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "../threestrap/node_modules/liftoff": {
-      "version": "3.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "extend": "^3.0.0",
-        "findup-sync": "^3.0.0",
-        "fined": "^1.0.1",
-        "flagged-respawn": "^1.0.0",
-        "is-plain-object": "^2.0.4",
-        "object.map": "^1.0.0",
-        "rechoir": "^0.6.2",
-        "resolve": "^1.1.7"
-      },
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "../threestrap/node_modules/liftoff/node_modules/is-plain-object": {
-      "version": "2.0.4",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "isobject": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/load-json-file": {
-      "version": "1.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "graceful-fs": "^4.1.2",
-        "parse-json": "^2.2.0",
-        "pify": "^2.0.0",
-        "pinkie-promise": "^2.0.0",
-        "strip-bom": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/loader-runner": {
-      "version": "4.2.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6.11.5"
-      }
-    },
-    "../threestrap/node_modules/loader-utils": {
-      "version": "1.4.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "big.js": "^5.2.2",
-        "emojis-list": "^3.0.0",
-        "json5": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=4.0.0"
-      }
-    },
-    "../threestrap/node_modules/locate-path": {
-      "version": "5.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "p-locate": "^4.1.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "../threestrap/node_modules/lodash": {
-      "version": "4.17.21",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/lodash.clone": {
-      "version": "4.5.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/lodash.clonedeep": {
-      "version": "4.5.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/lodash.merge": {
-      "version": "4.6.2",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/lodash.some": {
-      "version": "4.6.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/lodash.truncate": {
-      "version": "4.4.2",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/log4js": {
-      "version": "6.3.0",
-      "dev": true,
-      "license": "Apache-2.0",
-      "dependencies": {
-        "date-format": "^3.0.0",
-        "debug": "^4.1.1",
-        "flatted": "^2.0.1",
-        "rfdc": "^1.1.4",
-        "streamroller": "^2.2.4"
-      },
-      "engines": {
-        "node": ">=8.0"
-      }
-    },
-    "../threestrap/node_modules/log4js/node_modules/flatted": {
-      "version": "2.0.2",
-      "dev": true,
-      "license": "ISC"
-    },
-    "../threestrap/node_modules/lru-cache": {
-      "version": "6.0.0",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "../threestrap/node_modules/make-dir": {
-      "version": "2.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "pify": "^4.0.1",
-        "semver": "^5.6.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "../threestrap/node_modules/make-dir/node_modules/pify": {
-      "version": "4.0.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "../threestrap/node_modules/make-dir/node_modules/semver": {
-      "version": "5.7.1",
-      "dev": true,
-      "license": "ISC",
-      "bin": {
-        "semver": "bin/semver"
-      }
-    },
-    "../threestrap/node_modules/make-iterator": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "kind-of": "^6.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/make-iterator/node_modules/kind-of": {
-      "version": "6.0.3",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/map-cache": {
-      "version": "0.2.2",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/map-visit": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "object-visit": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/matchdep": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "findup-sync": "^2.0.0",
-        "micromatch": "^3.0.4",
-        "resolve": "^1.4.0",
-        "stack-trace": "0.0.10"
-      },
-      "engines": {
-        "node": ">= 0.10.0"
-      }
-    },
-    "../threestrap/node_modules/matchdep/node_modules/findup-sync": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "detect-file": "^1.0.0",
-        "is-glob": "^3.1.0",
-        "micromatch": "^3.0.4",
-        "resolve-dir": "^1.0.1"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "../threestrap/node_modules/matchdep/node_modules/is-glob": {
-      "version": "3.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-extglob": "^2.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/math-random": {
-      "version": "1.0.4",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/md5.js": {
-      "version": "1.3.5",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "hash-base": "^3.0.0",
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.1.2"
-      }
-    },
-    "../threestrap/node_modules/media-typer": {
-      "version": "0.3.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "../threestrap/node_modules/memory-fs": {
-      "version": "0.5.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "errno": "^0.1.3",
-        "readable-stream": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=4.3.0 <5.0.0 || >=5.10"
-      }
-    },
-    "../threestrap/node_modules/merge-stream": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/micromatch": {
-      "version": "3.1.10",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "arr-diff": "^4.0.0",
-        "array-unique": "^0.3.2",
-        "braces": "^2.3.1",
-        "define-property": "^2.0.2",
-        "extend-shallow": "^3.0.2",
-        "extglob": "^2.0.4",
-        "fragment-cache": "^0.2.1",
-        "kind-of": "^6.0.2",
-        "nanomatch": "^1.2.9",
-        "object.pick": "^1.3.0",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/micromatch/node_modules/extend-shallow": {
-      "version": "3.0.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "assign-symbols": "^1.0.0",
-        "is-extendable": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/micromatch/node_modules/is-extendable": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-plain-object": "^2.0.4"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/micromatch/node_modules/is-plain-object": {
-      "version": "2.0.4",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "isobject": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/micromatch/node_modules/kind-of": {
-      "version": "6.0.3",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/miller-rabin": {
-      "version": "4.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "bn.js": "^4.0.0",
-        "brorand": "^1.0.1"
-      },
-      "bin": {
-        "miller-rabin": "bin/miller-rabin"
-      }
-    },
-    "../threestrap/node_modules/miller-rabin/node_modules/bn.js": {
-      "version": "4.12.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/mime": {
-      "version": "2.5.2",
-      "dev": true,
-      "license": "MIT",
-      "bin": {
-        "mime": "cli.js"
-      },
-      "engines": {
-        "node": ">=4.0.0"
-      }
-    },
-    "../threestrap/node_modules/mime-db": {
-      "version": "1.48.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "../threestrap/node_modules/mime-types": {
-      "version": "2.1.31",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "mime-db": "1.48.0"
-      },
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "../threestrap/node_modules/mimic-fn": {
-      "version": "2.1.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "../threestrap/node_modules/minimalistic-assert": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "ISC"
-    },
-    "../threestrap/node_modules/minimalistic-crypto-utils": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/minimatch": {
-      "version": "3.0.4",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "brace-expansion": "^1.1.7"
-      },
-      "engines": {
-        "node": "*"
-      }
-    },
-    "../threestrap/node_modules/minimist": {
-      "version": "1.2.5",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/mississippi": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "dependencies": {
-        "concat-stream": "^1.5.0",
-        "duplexify": "^3.4.2",
-        "end-of-stream": "^1.1.0",
-        "flush-write-stream": "^1.0.0",
-        "from2": "^2.1.0",
-        "parallel-transform": "^1.1.0",
-        "pump": "^3.0.0",
-        "pumpify": "^1.3.3",
-        "stream-each": "^1.1.0",
-        "through2": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=4.0.0"
-      }
-    },
-    "../threestrap/node_modules/mississippi/node_modules/pump": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "end-of-stream": "^1.1.0",
-        "once": "^1.3.1"
-      }
-    },
-    "../threestrap/node_modules/mixin-deep": {
-      "version": "1.3.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "for-in": "^1.0.2",
-        "is-extendable": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/mixin-deep/node_modules/is-extendable": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-plain-object": "^2.0.4"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/mixin-deep/node_modules/is-plain-object": {
-      "version": "2.0.4",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "isobject": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/mkdirp": {
-      "version": "0.5.5",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "minimist": "^1.2.5"
-      },
-      "bin": {
-        "mkdirp": "bin/cmd.js"
-      }
-    },
-    "../threestrap/node_modules/move-concurrently": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "aproba": "^1.1.1",
-        "copy-concurrently": "^1.0.0",
-        "fs-write-stream-atomic": "^1.0.8",
-        "mkdirp": "^0.5.1",
-        "rimraf": "^2.5.4",
-        "run-queue": "^1.0.3"
-      }
-    },
-    "../threestrap/node_modules/move-concurrently/node_modules/rimraf": {
-      "version": "2.7.1",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "glob": "^7.1.3"
-      },
-      "bin": {
-        "rimraf": "bin.js"
-      }
-    },
-    "../threestrap/node_modules/ms": {
-      "version": "2.1.2",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/mute-stdout": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "../threestrap/node_modules/mute-stream": {
-      "version": "0.0.8",
-      "dev": true,
-      "license": "ISC"
-    },
-    "../threestrap/node_modules/nan": {
-      "version": "2.14.2",
-      "dev": true,
-      "license": "MIT",
-      "optional": true
-    },
-    "../threestrap/node_modules/nanomatch": {
-      "version": "1.2.13",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "arr-diff": "^4.0.0",
-        "array-unique": "^0.3.2",
-        "define-property": "^2.0.2",
-        "extend-shallow": "^3.0.2",
-        "fragment-cache": "^0.2.1",
-        "is-windows": "^1.0.2",
-        "kind-of": "^6.0.2",
-        "object.pick": "^1.3.0",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/nanomatch/node_modules/extend-shallow": {
-      "version": "3.0.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "assign-symbols": "^1.0.0",
-        "is-extendable": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/nanomatch/node_modules/is-extendable": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-plain-object": "^2.0.4"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/nanomatch/node_modules/is-plain-object": {
-      "version": "2.0.4",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "isobject": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/nanomatch/node_modules/kind-of": {
-      "version": "6.0.3",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/natural-compare": {
-      "version": "1.4.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/negotiator": {
-      "version": "0.6.2",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "../threestrap/node_modules/neo-async": {
-      "version": "2.6.2",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/next-tick": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/nice-try": {
-      "version": "1.0.5",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/node-libs-browser": {
-      "version": "2.2.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "assert": "^1.1.1",
-        "browserify-zlib": "^0.2.0",
-        "buffer": "^4.3.0",
-        "console-browserify": "^1.1.0",
-        "constants-browserify": "^1.0.0",
-        "crypto-browserify": "^3.11.0",
-        "domain-browser": "^1.1.1",
-        "events": "^3.0.0",
-        "https-browserify": "^1.0.0",
-        "os-browserify": "^0.3.0",
-        "path-browserify": "0.0.1",
-        "process": "^0.11.10",
-        "punycode": "^1.2.4",
-        "querystring-es3": "^0.2.0",
-        "readable-stream": "^2.3.3",
-        "stream-browserify": "^2.0.1",
-        "stream-http": "^2.7.2",
-        "string_decoder": "^1.0.0",
-        "timers-browserify": "^2.0.4",
-        "tty-browserify": "0.0.0",
-        "url": "^0.11.0",
-        "util": "^0.11.0",
-        "vm-browserify": "^1.0.1"
-      }
-    },
-    "../threestrap/node_modules/node-libs-browser/node_modules/punycode": {
-      "version": "1.4.1",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/node-releases": {
-      "version": "1.1.73",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/normalize-package-data": {
-      "version": "2.5.0",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "dependencies": {
-        "hosted-git-info": "^2.1.4",
-        "resolve": "^1.10.0",
-        "semver": "2 || 3 || 4 || 5",
-        "validate-npm-package-license": "^3.0.1"
-      }
-    },
-    "../threestrap/node_modules/normalize-package-data/node_modules/semver": {
-      "version": "5.7.1",
-      "dev": true,
-      "license": "ISC",
-      "bin": {
-        "semver": "bin/semver"
-      }
-    },
-    "../threestrap/node_modules/normalize-path": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/now-and-later": {
-      "version": "2.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "once": "^1.3.2"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "../threestrap/node_modules/npm-run-path": {
-      "version": "4.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "path-key": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "../threestrap/node_modules/number-is-nan": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/object-assign": {
-      "version": "4.1.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/object-copy": {
-      "version": "0.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "copy-descriptor": "^0.1.0",
-        "define-property": "^0.2.5",
-        "kind-of": "^3.0.3"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/object-copy/node_modules/define-property": {
-      "version": "0.2.5",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-descriptor": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/object-copy/node_modules/is-accessor-descriptor": {
-      "version": "0.1.6",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "kind-of": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/object-copy/node_modules/is-data-descriptor": {
-      "version": "0.1.4",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "kind-of": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/object-copy/node_modules/is-descriptor": {
-      "version": "0.1.6",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-accessor-descriptor": "^0.1.6",
-        "is-data-descriptor": "^0.1.4",
-        "kind-of": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": {
-      "version": "5.1.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/object-copy/node_modules/kind-of": {
-      "version": "3.2.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/object-keys": {
-      "version": "1.1.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "../threestrap/node_modules/object-visit": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "isobject": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/object.assign": {
-      "version": "4.1.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "call-bind": "^1.0.0",
-        "define-properties": "^1.1.3",
-        "has-symbols": "^1.0.1",
-        "object-keys": "^1.1.1"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "../threestrap/node_modules/object.defaults": {
-      "version": "1.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "array-each": "^1.0.1",
-        "array-slice": "^1.0.0",
-        "for-own": "^1.0.0",
-        "isobject": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/object.map": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "for-own": "^1.0.0",
-        "make-iterator": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/object.omit": {
-      "version": "2.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "for-own": "^0.1.4",
-        "is-extendable": "^0.1.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/object.omit/node_modules/for-own": {
-      "version": "0.1.5",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "for-in": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/object.pick": {
-      "version": "1.3.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "isobject": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/object.reduce": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "for-own": "^1.0.0",
-        "make-iterator": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/on-finished": {
-      "version": "2.3.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ee-first": "1.1.1"
-      },
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "../threestrap/node_modules/once": {
-      "version": "1.4.0",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "wrappy": "1"
-      }
-    },
-    "../threestrap/node_modules/onetime": {
-      "version": "5.1.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "mimic-fn": "^2.1.0"
-      },
-      "engines": {
-        "node": ">=6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "../threestrap/node_modules/optionator": {
-      "version": "0.9.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "deep-is": "^0.1.3",
-        "fast-levenshtein": "^2.0.6",
-        "levn": "^0.4.1",
-        "prelude-ls": "^1.2.1",
-        "type-check": "^0.4.0",
-        "word-wrap": "^1.2.3"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "../threestrap/node_modules/ordered-read-streams": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "readable-stream": "^2.0.1"
-      }
-    },
-    "../threestrap/node_modules/os-browserify": {
-      "version": "0.3.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/os-locale": {
-      "version": "1.4.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "lcid": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/os-tmpdir": {
-      "version": "1.0.2",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/p-limit": {
-      "version": "3.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "yocto-queue": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "../threestrap/node_modules/p-locate": {
-      "version": "4.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "p-limit": "^2.2.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "../threestrap/node_modules/p-locate/node_modules/p-limit": {
-      "version": "2.3.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "p-try": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "../threestrap/node_modules/p-try": {
-      "version": "2.2.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "../threestrap/node_modules/pako": {
-      "version": "1.0.11",
-      "dev": true,
-      "license": "(MIT AND Zlib)"
-    },
-    "../threestrap/node_modules/parallel-transform": {
-      "version": "1.2.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "cyclist": "^1.0.1",
-        "inherits": "^2.0.3",
-        "readable-stream": "^2.1.5"
-      }
-    },
-    "../threestrap/node_modules/parent-module": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "callsites": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "../threestrap/node_modules/parse-asn1": {
-      "version": "5.1.6",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "asn1.js": "^5.2.0",
-        "browserify-aes": "^1.0.0",
-        "evp_bytestokey": "^1.0.0",
-        "pbkdf2": "^3.0.3",
-        "safe-buffer": "^5.1.1"
-      }
-    },
-    "../threestrap/node_modules/parse-filepath": {
-      "version": "1.0.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-absolute": "^1.0.0",
-        "map-cache": "^0.2.0",
-        "path-root": "^0.1.1"
-      },
-      "engines": {
-        "node": ">=0.8"
-      }
-    },
-    "../threestrap/node_modules/parse-glob": {
-      "version": "3.0.4",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "glob-base": "^0.3.0",
-        "is-dotfile": "^1.0.0",
-        "is-extglob": "^1.0.0",
-        "is-glob": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/parse-glob/node_modules/is-extglob": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/parse-glob/node_modules/is-glob": {
-      "version": "2.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-extglob": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/parse-json": {
-      "version": "2.2.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "error-ex": "^1.2.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/parse-node-version": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "../threestrap/node_modules/parse-passwd": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/parseurl": {
-      "version": "1.3.3",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "../threestrap/node_modules/pascalcase": {
-      "version": "0.1.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/path-browserify": {
-      "version": "0.0.1",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/path-dirname": {
-      "version": "1.0.2",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/path-exists": {
-      "version": "4.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "../threestrap/node_modules/path-is-absolute": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/path-key": {
-      "version": "3.1.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "../threestrap/node_modules/path-parse": {
-      "version": "1.0.7",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/path-root": {
-      "version": "0.1.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "path-root-regex": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/path-root-regex": {
-      "version": "0.1.2",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/path-type": {
-      "version": "1.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "graceful-fs": "^4.1.2",
-        "pify": "^2.0.0",
-        "pinkie-promise": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/pbkdf2": {
-      "version": "3.1.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "create-hash": "^1.1.2",
-        "create-hmac": "^1.1.4",
-        "ripemd160": "^2.0.1",
-        "safe-buffer": "^5.0.1",
-        "sha.js": "^2.4.8"
-      },
-      "engines": {
-        "node": ">=0.12"
-      }
-    },
-    "../threestrap/node_modules/picomatch": {
-      "version": "2.3.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8.6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/jonschlinkert"
-      }
-    },
-    "../threestrap/node_modules/pify": {
-      "version": "2.3.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/pinkie": {
-      "version": "2.0.4",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/pinkie-promise": {
-      "version": "2.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "pinkie": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/pkg-dir": {
-      "version": "4.2.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "find-up": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "../threestrap/node_modules/plugin-error": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-colors": "^1.0.1",
-        "arr-diff": "^4.0.0",
-        "arr-union": "^3.1.0",
-        "extend-shallow": "^3.0.2"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "../threestrap/node_modules/plugin-error/node_modules/ansi-colors": {
-      "version": "1.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-wrap": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/plugin-error/node_modules/extend-shallow": {
-      "version": "3.0.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "assign-symbols": "^1.0.0",
-        "is-extendable": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/plugin-error/node_modules/is-extendable": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-plain-object": "^2.0.4"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/plugin-error/node_modules/is-plain-object": {
-      "version": "2.0.4",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "isobject": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/posix-character-classes": {
-      "version": "0.1.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/prelude-ls": {
-      "version": "1.2.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "../threestrap/node_modules/preserve": {
-      "version": "0.2.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/prettier": {
-      "version": "2.3.1",
-      "dev": true,
-      "license": "MIT",
-      "bin": {
-        "prettier": "bin-prettier.js"
-      },
-      "engines": {
-        "node": ">=10.13.0"
-      }
-    },
-    "../threestrap/node_modules/pretty-hrtime": {
-      "version": "1.0.3",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "../threestrap/node_modules/process": {
-      "version": "0.11.10",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6.0"
-      }
-    },
-    "../threestrap/node_modules/process-nextick-args": {
-      "version": "2.0.1",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/progress": {
-      "version": "2.0.3",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "../threestrap/node_modules/promise-inflight": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "ISC"
-    },
-    "../threestrap/node_modules/prr": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/public-encrypt": {
-      "version": "4.0.3",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "bn.js": "^4.1.0",
-        "browserify-rsa": "^4.0.0",
-        "create-hash": "^1.1.0",
-        "parse-asn1": "^5.0.0",
-        "randombytes": "^2.0.1",
-        "safe-buffer": "^5.1.2"
-      }
-    },
-    "../threestrap/node_modules/public-encrypt/node_modules/bn.js": {
-      "version": "4.12.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/pump": {
-      "version": "2.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "end-of-stream": "^1.1.0",
-        "once": "^1.3.1"
-      }
-    },
-    "../threestrap/node_modules/pumpify": {
-      "version": "1.5.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "duplexify": "^3.6.0",
-        "inherits": "^2.0.3",
-        "pump": "^2.0.0"
-      }
-    },
-    "../threestrap/node_modules/punycode": {
-      "version": "2.1.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "../threestrap/node_modules/qjobs": {
-      "version": "1.2.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.9"
-      }
-    },
-    "../threestrap/node_modules/qs": {
-      "version": "6.7.0",
-      "dev": true,
-      "license": "BSD-3-Clause",
-      "engines": {
-        "node": ">=0.6"
-      }
-    },
-    "../threestrap/node_modules/querystring": {
-      "version": "0.2.0",
-      "dev": true,
-      "engines": {
-        "node": ">=0.4.x"
-      }
-    },
-    "../threestrap/node_modules/querystring-es3": {
-      "version": "0.2.1",
-      "dev": true,
-      "engines": {
-        "node": ">=0.4.x"
-      }
-    },
-    "../threestrap/node_modules/randomatic": {
-      "version": "3.1.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-number": "^4.0.0",
-        "kind-of": "^6.0.0",
-        "math-random": "^1.0.1"
-      },
-      "engines": {
-        "node": ">= 0.10.0"
-      }
-    },
-    "../threestrap/node_modules/randomatic/node_modules/is-number": {
-      "version": "4.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/randomatic/node_modules/kind-of": {
-      "version": "6.0.3",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/randombytes": {
-      "version": "2.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "safe-buffer": "^5.1.0"
-      }
-    },
-    "../threestrap/node_modules/randomfill": {
-      "version": "1.0.4",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "randombytes": "^2.0.5",
-        "safe-buffer": "^5.1.0"
-      }
-    },
-    "../threestrap/node_modules/range-parser": {
-      "version": "1.2.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "../threestrap/node_modules/raw-body": {
-      "version": "2.4.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "bytes": "3.1.0",
-        "http-errors": "1.7.2",
-        "iconv-lite": "0.4.24",
-        "unpipe": "1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "../threestrap/node_modules/read-pkg": {
-      "version": "1.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "load-json-file": "^1.0.0",
-        "normalize-package-data": "^2.3.2",
-        "path-type": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/read-pkg-up": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "find-up": "^1.0.0",
-        "read-pkg": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/read-pkg-up/node_modules/find-up": {
-      "version": "1.1.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "path-exists": "^2.0.0",
-        "pinkie-promise": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/read-pkg-up/node_modules/path-exists": {
-      "version": "2.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "pinkie-promise": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/readable-stream": {
-      "version": "2.3.7",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "core-util-is": "~1.0.0",
-        "inherits": "~2.0.3",
-        "isarray": "~1.0.0",
-        "process-nextick-args": "~2.0.0",
-        "safe-buffer": "~5.1.1",
-        "string_decoder": "~1.1.1",
-        "util-deprecate": "~1.0.1"
-      }
-    },
-    "../threestrap/node_modules/readdirp": {
-      "version": "2.2.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "graceful-fs": "^4.1.11",
-        "micromatch": "^3.1.10",
-        "readable-stream": "^2.0.2"
-      },
-      "engines": {
-        "node": ">=0.10"
-      }
-    },
-    "../threestrap/node_modules/rechoir": {
-      "version": "0.6.2",
-      "dev": true,
-      "dependencies": {
-        "resolve": "^1.1.6"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "../threestrap/node_modules/regex-cache": {
-      "version": "0.4.4",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-equal-shallow": "^0.1.3"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/regex-not": {
-      "version": "1.0.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "extend-shallow": "^3.0.2",
-        "safe-regex": "^1.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/regex-not/node_modules/extend-shallow": {
-      "version": "3.0.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "assign-symbols": "^1.0.0",
-        "is-extendable": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/regex-not/node_modules/is-extendable": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-plain-object": "^2.0.4"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/regex-not/node_modules/is-plain-object": {
-      "version": "2.0.4",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "isobject": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/regexpp": {
-      "version": "3.2.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/mysticatea"
-      }
-    },
-    "../threestrap/node_modules/remove-bom-buffer": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-buffer": "^1.1.5",
-        "is-utf8": "^0.2.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/remove-bom-stream": {
-      "version": "1.2.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "remove-bom-buffer": "^3.0.0",
-        "safe-buffer": "^5.1.0",
-        "through2": "^2.0.3"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "../threestrap/node_modules/remove-trailing-separator": {
-      "version": "1.1.0",
-      "dev": true,
-      "license": "ISC"
-    },
-    "../threestrap/node_modules/repeat-element": {
-      "version": "1.1.4",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/repeat-string": {
-      "version": "1.6.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10"
-      }
-    },
-    "../threestrap/node_modules/replace-ext": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "../threestrap/node_modules/replace-homedir": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "homedir-polyfill": "^1.0.1",
-        "is-absolute": "^1.0.0",
-        "remove-trailing-separator": "^1.1.0"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "../threestrap/node_modules/require-directory": {
-      "version": "2.1.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/require-from-string": {
-      "version": "2.0.2",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/require-main-filename": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "ISC"
-    },
-    "../threestrap/node_modules/requires-port": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/resolve": {
-      "version": "1.20.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-core-module": "^2.2.0",
-        "path-parse": "^1.0.6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "../threestrap/node_modules/resolve-cwd": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "resolve-from": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "../threestrap/node_modules/resolve-cwd/node_modules/resolve-from": {
-      "version": "5.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "../threestrap/node_modules/resolve-dir": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "expand-tilde": "^2.0.0",
-        "global-modules": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/resolve-from": {
-      "version": "4.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "../threestrap/node_modules/resolve-options": {
-      "version": "1.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "value-or-function": "^3.0.0"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "../threestrap/node_modules/resolve-url": {
-      "version": "0.2.1",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/restore-cursor": {
-      "version": "3.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "onetime": "^5.1.0",
-        "signal-exit": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "../threestrap/node_modules/ret": {
-      "version": "0.1.15",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.12"
-      }
-    },
-    "../threestrap/node_modules/rfdc": {
-      "version": "1.3.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/rimraf": {
-      "version": "3.0.2",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "glob": "^7.1.3"
-      },
-      "bin": {
-        "rimraf": "bin.js"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "../threestrap/node_modules/ripemd160": {
-      "version": "2.0.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "hash-base": "^3.0.0",
-        "inherits": "^2.0.1"
-      }
-    },
-    "../threestrap/node_modules/run-async": {
-      "version": "2.4.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.12.0"
-      }
-    },
-    "../threestrap/node_modules/run-queue": {
-      "version": "1.0.3",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "aproba": "^1.1.1"
-      }
-    },
-    "../threestrap/node_modules/rxjs": {
-      "version": "6.6.7",
-      "dev": true,
-      "license": "Apache-2.0",
-      "dependencies": {
-        "tslib": "^1.9.0"
-      },
-      "engines": {
-        "npm": ">=2.0.0"
-      }
-    },
-    "../threestrap/node_modules/safe-buffer": {
-      "version": "5.1.2",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/safe-regex": {
-      "version": "1.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ret": "~0.1.10"
-      }
-    },
-    "../threestrap/node_modules/safer-buffer": {
-      "version": "2.1.2",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/schema-utils": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@types/json-schema": "^7.0.6",
-        "ajv": "^6.12.5",
-        "ajv-keywords": "^3.5.2"
-      },
-      "engines": {
-        "node": ">= 10.13.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/webpack"
-      }
-    },
-    "../threestrap/node_modules/semver": {
-      "version": "7.3.5",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "lru-cache": "^6.0.0"
-      },
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "../threestrap/node_modules/semver-greatest-satisfied-range": {
-      "version": "1.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "sver-compat": "^1.5.0"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "../threestrap/node_modules/serialize-javascript": {
-      "version": "5.0.1",
-      "dev": true,
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "randombytes": "^2.1.0"
-      }
-    },
-    "../threestrap/node_modules/set-blocking": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "ISC"
-    },
-    "../threestrap/node_modules/set-value": {
-      "version": "2.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "extend-shallow": "^2.0.1",
-        "is-extendable": "^0.1.1",
-        "is-plain-object": "^2.0.3",
-        "split-string": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/set-value/node_modules/is-plain-object": {
-      "version": "2.0.4",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "isobject": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/setimmediate": {
-      "version": "1.0.5",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/setprototypeof": {
-      "version": "1.1.1",
-      "dev": true,
-      "license": "ISC"
-    },
-    "../threestrap/node_modules/sha.js": {
-      "version": "2.4.11",
-      "dev": true,
-      "license": "(MIT AND BSD-3-Clause)",
-      "dependencies": {
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.0.1"
-      },
-      "bin": {
-        "sha.js": "bin.js"
-      }
-    },
-    "../threestrap/node_modules/shallow-clone": {
-      "version": "3.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "kind-of": "^6.0.2"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "../threestrap/node_modules/shallow-clone/node_modules/kind-of": {
-      "version": "6.0.3",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/shebang-command": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "shebang-regex": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "../threestrap/node_modules/shebang-regex": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "../threestrap/node_modules/signal-exit": {
-      "version": "3.0.3",
-      "dev": true,
-      "license": "ISC"
-    },
-    "../threestrap/node_modules/slash": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/slice-ansi": {
-      "version": "4.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-styles": "^4.0.0",
-        "astral-regex": "^2.0.0",
-        "is-fullwidth-code-point": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/slice-ansi?sponsor=1"
-      }
-    },
-    "../threestrap/node_modules/snapdragon": {
-      "version": "0.8.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "base": "^0.11.1",
-        "debug": "^2.2.0",
-        "define-property": "^0.2.5",
-        "extend-shallow": "^2.0.1",
-        "map-cache": "^0.2.2",
-        "source-map": "^0.5.6",
-        "source-map-resolve": "^0.5.0",
-        "use": "^3.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/snapdragon-node": {
-      "version": "2.1.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "define-property": "^1.0.0",
-        "isobject": "^3.0.0",
-        "snapdragon-util": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/snapdragon-node/node_modules/define-property": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-descriptor": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/snapdragon-util": {
-      "version": "3.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "kind-of": "^3.2.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/snapdragon-util/node_modules/kind-of": {
-      "version": "3.2.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/snapdragon/node_modules/debug": {
-      "version": "2.6.9",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ms": "2.0.0"
-      }
-    },
-    "../threestrap/node_modules/snapdragon/node_modules/define-property": {
-      "version": "0.2.5",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-descriptor": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/snapdragon/node_modules/is-accessor-descriptor": {
-      "version": "0.1.6",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "kind-of": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": {
-      "version": "3.2.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/snapdragon/node_modules/is-data-descriptor": {
-      "version": "0.1.4",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "kind-of": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": {
-      "version": "3.2.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/snapdragon/node_modules/is-descriptor": {
-      "version": "0.1.6",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-accessor-descriptor": "^0.1.6",
-        "is-data-descriptor": "^0.1.4",
-        "kind-of": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/snapdragon/node_modules/ms": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/snapdragon/node_modules/source-map": {
-      "version": "0.5.7",
-      "dev": true,
-      "license": "BSD-3-Clause",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/socket.io": {
-      "version": "3.1.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@types/cookie": "^0.4.0",
-        "@types/cors": "^2.8.8",
-        "@types/node": ">=10.0.0",
-        "accepts": "~1.3.4",
-        "base64id": "~2.0.0",
-        "debug": "~4.3.1",
-        "engine.io": "~4.1.0",
-        "socket.io-adapter": "~2.1.0",
-        "socket.io-parser": "~4.0.3"
-      },
-      "engines": {
-        "node": ">=10.0.0"
-      }
-    },
-    "../threestrap/node_modules/socket.io-adapter": {
-      "version": "2.1.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/socket.io-parser": {
-      "version": "4.0.4",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@types/component-emitter": "^1.2.10",
-        "component-emitter": "~1.3.0",
-        "debug": "~4.3.1"
-      },
-      "engines": {
-        "node": ">=10.0.0"
-      }
-    },
-    "../threestrap/node_modules/source-list-map": {
-      "version": "2.0.1",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/source-map": {
-      "version": "0.6.1",
-      "dev": true,
-      "license": "BSD-3-Clause",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/source-map-resolve": {
-      "version": "0.5.3",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "atob": "^2.1.2",
-        "decode-uri-component": "^0.2.0",
-        "resolve-url": "^0.2.1",
-        "source-map-url": "^0.4.0",
-        "urix": "^0.1.0"
-      }
-    },
-    "../threestrap/node_modules/source-map-support": {
-      "version": "0.5.19",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "buffer-from": "^1.0.0",
-        "source-map": "^0.6.0"
-      }
-    },
-    "../threestrap/node_modules/source-map-url": {
-      "version": "0.4.1",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/sparkles": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "../threestrap/node_modules/spdx-correct": {
-      "version": "3.1.1",
-      "dev": true,
-      "license": "Apache-2.0",
-      "dependencies": {
-        "spdx-expression-parse": "^3.0.0",
-        "spdx-license-ids": "^3.0.0"
-      }
-    },
-    "../threestrap/node_modules/spdx-exceptions": {
-      "version": "2.3.0",
-      "dev": true,
-      "license": "CC-BY-3.0"
-    },
-    "../threestrap/node_modules/spdx-expression-parse": {
-      "version": "3.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "spdx-exceptions": "^2.1.0",
-        "spdx-license-ids": "^3.0.0"
-      }
-    },
-    "../threestrap/node_modules/spdx-license-ids": {
-      "version": "3.0.9",
-      "dev": true,
-      "license": "CC0-1.0"
-    },
-    "../threestrap/node_modules/split-string": {
-      "version": "3.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "extend-shallow": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/split-string/node_modules/extend-shallow": {
-      "version": "3.0.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "assign-symbols": "^1.0.0",
-        "is-extendable": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/split-string/node_modules/is-extendable": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-plain-object": "^2.0.4"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/split-string/node_modules/is-plain-object": {
-      "version": "2.0.4",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "isobject": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/sprintf-js": {
-      "version": "1.0.3",
-      "dev": true,
-      "license": "BSD-3-Clause"
-    },
-    "../threestrap/node_modules/ssri": {
-      "version": "6.0.2",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "figgy-pudding": "^3.5.1"
-      }
-    },
-    "../threestrap/node_modules/stack-trace": {
-      "version": "0.0.10",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": "*"
-      }
-    },
-    "../threestrap/node_modules/static-extend": {
-      "version": "0.1.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "define-property": "^0.2.5",
-        "object-copy": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/static-extend/node_modules/define-property": {
-      "version": "0.2.5",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-descriptor": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/static-extend/node_modules/is-accessor-descriptor": {
-      "version": "0.1.6",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "kind-of": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": {
-      "version": "3.2.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/static-extend/node_modules/is-data-descriptor": {
-      "version": "0.1.4",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "kind-of": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": {
-      "version": "3.2.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/static-extend/node_modules/is-descriptor": {
-      "version": "0.1.6",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-accessor-descriptor": "^0.1.6",
-        "is-data-descriptor": "^0.1.4",
-        "kind-of": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/stats.js": {
-      "version": "0.17.0",
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/statuses": {
-      "version": "1.5.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "../threestrap/node_modules/stream-browserify": {
-      "version": "2.0.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "inherits": "~2.0.1",
-        "readable-stream": "^2.0.2"
-      }
-    },
-    "../threestrap/node_modules/stream-each": {
-      "version": "1.2.3",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "end-of-stream": "^1.1.0",
-        "stream-shift": "^1.0.0"
-      }
-    },
-    "../threestrap/node_modules/stream-exhaust": {
-      "version": "1.0.2",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/stream-http": {
-      "version": "2.8.3",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "builtin-status-codes": "^3.0.0",
-        "inherits": "^2.0.1",
-        "readable-stream": "^2.3.6",
-        "to-arraybuffer": "^1.0.0",
-        "xtend": "^4.0.0"
-      }
-    },
-    "../threestrap/node_modules/stream-shift": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/streamroller": {
-      "version": "2.2.4",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "date-format": "^2.1.0",
-        "debug": "^4.1.1",
-        "fs-extra": "^8.1.0"
-      },
-      "engines": {
-        "node": ">=8.0"
-      }
-    },
-    "../threestrap/node_modules/streamroller/node_modules/date-format": {
-      "version": "2.1.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=4.0"
-      }
-    },
-    "../threestrap/node_modules/string_decoder": {
-      "version": "1.1.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "safe-buffer": "~5.1.0"
-      }
-    },
-    "../threestrap/node_modules/string-width": {
-      "version": "4.2.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "emoji-regex": "^8.0.0",
-        "is-fullwidth-code-point": "^3.0.0",
-        "strip-ansi": "^6.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "../threestrap/node_modules/strip-ansi": {
-      "version": "6.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-regex": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "../threestrap/node_modules/strip-bom": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-utf8": "^0.2.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/strip-bom-stream": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "first-chunk-stream": "^2.0.0",
-        "strip-bom": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/strip-final-newline": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "../threestrap/node_modules/strip-json-comments": {
-      "version": "3.1.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "../threestrap/node_modules/supports-color": {
-      "version": "7.2.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "has-flag": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "../threestrap/node_modules/sver-compat": {
-      "version": "1.5.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "es6-iterator": "^2.0.1",
-        "es6-symbol": "^3.1.1"
-      }
-    },
-    "../threestrap/node_modules/table": {
-      "version": "6.7.1",
-      "dev": true,
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "ajv": "^8.0.1",
-        "lodash.clonedeep": "^4.5.0",
-        "lodash.truncate": "^4.4.2",
-        "slice-ansi": "^4.0.0",
-        "string-width": "^4.2.0",
-        "strip-ansi": "^6.0.0"
-      },
-      "engines": {
-        "node": ">=10.0.0"
-      }
-    },
-    "../threestrap/node_modules/table/node_modules/ajv": {
-      "version": "8.6.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "fast-deep-equal": "^3.1.1",
-        "json-schema-traverse": "^1.0.0",
-        "require-from-string": "^2.0.2",
-        "uri-js": "^4.2.2"
-      },
-      "funding": {
-        "type": "github",
-        "url": "https://github.com/sponsors/epoberezkin"
-      }
-    },
-    "../threestrap/node_modules/table/node_modules/json-schema-traverse": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/tapable": {
-      "version": "2.2.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "../threestrap/node_modules/terser": {
-      "version": "5.7.0",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "dependencies": {
-        "commander": "^2.20.0",
-        "source-map": "~0.7.2",
-        "source-map-support": "~0.5.19"
-      },
-      "bin": {
-        "terser": "bin/terser"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "../threestrap/node_modules/terser-webpack-plugin": {
-      "version": "5.1.3",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "jest-worker": "^27.0.2",
-        "p-limit": "^3.1.0",
-        "schema-utils": "^3.0.0",
-        "serialize-javascript": "^5.0.1",
-        "source-map": "^0.6.1",
-        "terser": "^5.7.0"
-      },
-      "engines": {
-        "node": ">= 10.13.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/webpack"
-      },
-      "peerDependencies": {
-        "webpack": "^5.1.0"
-      }
-    },
-    "../threestrap/node_modules/terser/node_modules/source-map": {
-      "version": "0.7.3",
-      "dev": true,
-      "license": "BSD-3-Clause",
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "../threestrap/node_modules/text-table": {
-      "version": "0.2.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/three": {
-      "version": "0.137.5",
-      "license": "MIT",
-      "peer": true
-    },
-    "../threestrap/node_modules/through": {
-      "version": "2.3.8",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/through2": {
-      "version": "2.0.5",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "readable-stream": "~2.3.6",
-        "xtend": "~4.0.1"
-      }
-    },
-    "../threestrap/node_modules/through2-filter": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "through2": "~2.0.0",
-        "xtend": "~4.0.0"
-      }
-    },
-    "../threestrap/node_modules/time-stamp": {
-      "version": "1.1.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/timers-browserify": {
-      "version": "2.0.12",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "setimmediate": "^1.0.4"
-      },
-      "engines": {
-        "node": ">=0.6.0"
-      }
-    },
-    "../threestrap/node_modules/tmp": {
-      "version": "0.2.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "rimraf": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=8.17.0"
-      }
-    },
-    "../threestrap/node_modules/to-absolute-glob": {
-      "version": "2.0.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-absolute": "^1.0.0",
-        "is-negated-glob": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/to-arraybuffer": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/to-object-path": {
-      "version": "0.3.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "kind-of": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/to-object-path/node_modules/kind-of": {
-      "version": "3.2.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/to-regex": {
-      "version": "3.0.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "define-property": "^2.0.2",
-        "extend-shallow": "^3.0.2",
-        "regex-not": "^1.0.2",
-        "safe-regex": "^1.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/to-regex-range": {
-      "version": "2.1.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-number": "^3.0.0",
-        "repeat-string": "^1.6.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/to-regex/node_modules/extend-shallow": {
-      "version": "3.0.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "assign-symbols": "^1.0.0",
-        "is-extendable": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/to-regex/node_modules/is-extendable": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-plain-object": "^2.0.4"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/to-regex/node_modules/is-plain-object": {
-      "version": "2.0.4",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "isobject": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/to-through": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "through2": "^2.0.3"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "../threestrap/node_modules/toidentifier": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.6"
-      }
-    },
-    "../threestrap/node_modules/tslib": {
-      "version": "1.14.1",
-      "dev": true,
-      "license": "0BSD"
-    },
-    "../threestrap/node_modules/tty-browserify": {
-      "version": "0.0.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/type": {
-      "version": "1.2.0",
-      "dev": true,
-      "license": "ISC"
-    },
-    "../threestrap/node_modules/type-check": {
-      "version": "0.4.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "prelude-ls": "^1.2.1"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "../threestrap/node_modules/type-fest": {
-      "version": "0.20.2",
-      "dev": true,
-      "license": "(MIT OR CC0-1.0)",
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "../threestrap/node_modules/type-is": {
-      "version": "1.6.18",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "media-typer": "0.3.0",
-        "mime-types": "~2.1.24"
-      },
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "../threestrap/node_modules/typedarray": {
-      "version": "0.0.6",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/ua-parser-js": {
-      "version": "0.7.28",
-      "dev": true,
-      "funding": [
-        {
-          "type": "opencollective",
-          "url": "https://opencollective.com/ua-parser-js"
-        },
-        {
-          "type": "paypal",
-          "url": "https://paypal.me/faisalman"
-        }
-      ],
-      "license": "MIT",
-      "engines": {
-        "node": "*"
-      }
-    },
-    "../threestrap/node_modules/unc-path-regex": {
-      "version": "0.1.2",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/undertaker": {
-      "version": "1.3.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "arr-flatten": "^1.0.1",
-        "arr-map": "^2.0.0",
-        "bach": "^1.0.0",
-        "collection-map": "^1.0.0",
-        "es6-weak-map": "^2.0.1",
-        "fast-levenshtein": "^1.0.0",
-        "last-run": "^1.1.0",
-        "object.defaults": "^1.0.0",
-        "object.reduce": "^1.0.0",
-        "undertaker-registry": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "../threestrap/node_modules/undertaker-registry": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "../threestrap/node_modules/undertaker/node_modules/fast-levenshtein": {
-      "version": "1.1.4",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/union-value": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "arr-union": "^3.1.0",
-        "get-value": "^2.0.6",
-        "is-extendable": "^0.1.1",
-        "set-value": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/unique-filename": {
-      "version": "1.1.1",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "unique-slug": "^2.0.0"
-      }
-    },
-    "../threestrap/node_modules/unique-slug": {
-      "version": "2.0.2",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "imurmurhash": "^0.1.4"
-      }
-    },
-    "../threestrap/node_modules/unique-stream": {
-      "version": "2.3.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "json-stable-stringify-without-jsonify": "^1.0.1",
-        "through2-filter": "^3.0.0"
-      }
-    },
-    "../threestrap/node_modules/universalify": {
-      "version": "0.1.2",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 4.0.0"
-      }
-    },
-    "../threestrap/node_modules/unpipe": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "../threestrap/node_modules/unset-value": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "has-value": "^0.3.1",
-        "isobject": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/unset-value/node_modules/has-value": {
-      "version": "0.3.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "get-value": "^2.0.3",
-        "has-values": "^0.1.4",
-        "isobject": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/unset-value/node_modules/has-value/node_modules/isobject": {
-      "version": "2.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "isarray": "1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/unset-value/node_modules/has-values": {
-      "version": "0.1.4",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/upath": {
-      "version": "1.2.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=4",
-        "yarn": "*"
-      }
-    },
-    "../threestrap/node_modules/uri-js": {
-      "version": "4.4.1",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "dependencies": {
-        "punycode": "^2.1.0"
-      }
-    },
-    "../threestrap/node_modules/urix": {
-      "version": "0.1.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/url": {
-      "version": "0.11.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "punycode": "1.3.2",
-        "querystring": "0.2.0"
-      }
-    },
-    "../threestrap/node_modules/url/node_modules/punycode": {
-      "version": "1.3.2",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/use": {
-      "version": "3.1.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/util": {
-      "version": "0.11.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "inherits": "2.0.3"
-      }
-    },
-    "../threestrap/node_modules/util-deprecate": {
-      "version": "1.0.2",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/util/node_modules/inherits": {
-      "version": "2.0.3",
-      "dev": true,
-      "license": "ISC"
-    },
-    "../threestrap/node_modules/utils-merge": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.4.0"
-      }
-    },
-    "../threestrap/node_modules/v8-compile-cache": {
-      "version": "2.3.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/v8flags": {
-      "version": "3.2.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "homedir-polyfill": "^1.0.1"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "../threestrap/node_modules/validate-npm-package-license": {
-      "version": "3.0.4",
-      "dev": true,
-      "license": "Apache-2.0",
-      "dependencies": {
-        "spdx-correct": "^3.0.0",
-        "spdx-expression-parse": "^3.0.0"
-      }
-    },
-    "../threestrap/node_modules/value-or-function": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "../threestrap/node_modules/vary": {
-      "version": "1.1.2",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "../threestrap/node_modules/vinyl": {
-      "version": "2.2.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "clone": "^2.1.1",
-        "clone-buffer": "^1.0.0",
-        "clone-stats": "^1.0.0",
-        "cloneable-readable": "^1.0.0",
-        "remove-trailing-separator": "^1.0.1",
-        "replace-ext": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "../threestrap/node_modules/vinyl-file": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "graceful-fs": "^4.1.2",
-        "pify": "^2.3.0",
-        "pinkie-promise": "^2.0.0",
-        "strip-bom": "^2.0.0",
-        "strip-bom-stream": "^2.0.0",
-        "vinyl": "^1.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/vinyl-file/node_modules/clone": {
-      "version": "1.0.4",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.8"
-      }
-    },
-    "../threestrap/node_modules/vinyl-file/node_modules/clone-stats": {
-      "version": "0.0.1",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/vinyl-file/node_modules/replace-ext": {
-      "version": "0.0.1",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "../threestrap/node_modules/vinyl-file/node_modules/vinyl": {
-      "version": "1.2.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "clone": "^1.0.0",
-        "clone-stats": "^0.0.1",
-        "replace-ext": "0.0.1"
-      },
-      "engines": {
-        "node": ">= 0.9"
-      }
-    },
-    "../threestrap/node_modules/vinyl-fs": {
-      "version": "3.0.3",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "fs-mkdirp-stream": "^1.0.0",
-        "glob-stream": "^6.1.0",
-        "graceful-fs": "^4.0.0",
-        "is-valid-glob": "^1.0.0",
-        "lazystream": "^1.0.0",
-        "lead": "^1.0.0",
-        "object.assign": "^4.0.4",
-        "pumpify": "^1.3.5",
-        "readable-stream": "^2.3.3",
-        "remove-bom-buffer": "^3.0.0",
-        "remove-bom-stream": "^1.2.0",
-        "resolve-options": "^1.1.0",
-        "through2": "^2.0.0",
-        "to-through": "^2.0.0",
-        "value-or-function": "^3.0.0",
-        "vinyl": "^2.0.0",
-        "vinyl-sourcemap": "^1.1.0"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "../threestrap/node_modules/vinyl-sourcemap": {
-      "version": "1.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "append-buffer": "^1.0.2",
-        "convert-source-map": "^1.5.0",
-        "graceful-fs": "^4.1.6",
-        "normalize-path": "^2.1.1",
-        "now-and-later": "^2.0.0",
-        "remove-bom-buffer": "^3.0.0",
-        "vinyl": "^2.0.0"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "../threestrap/node_modules/vinyl-sourcemap/node_modules/normalize-path": {
-      "version": "2.1.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "remove-trailing-separator": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/vm-browserify": {
-      "version": "1.1.2",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/void-elements": {
-      "version": "2.0.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/watchpack": {
-      "version": "2.2.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "glob-to-regexp": "^0.4.1",
-        "graceful-fs": "^4.1.2"
-      },
-      "engines": {
-        "node": ">=10.13.0"
-      }
-    },
-    "../threestrap/node_modules/watchpack-chokidar2": {
-      "version": "2.0.1",
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "dependencies": {
-        "chokidar": "^2.1.8"
-      }
-    },
-    "../threestrap/node_modules/webpack": {
-      "version": "5.39.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@types/eslint-scope": "^3.7.0",
-        "@types/estree": "^0.0.47",
-        "@webassemblyjs/ast": "1.11.0",
-        "@webassemblyjs/wasm-edit": "1.11.0",
-        "@webassemblyjs/wasm-parser": "1.11.0",
-        "acorn": "^8.2.1",
-        "browserslist": "^4.14.5",
-        "chrome-trace-event": "^1.0.2",
-        "enhanced-resolve": "^5.8.0",
-        "es-module-lexer": "^0.4.0",
-        "eslint-scope": "5.1.1",
-        "events": "^3.2.0",
-        "glob-to-regexp": "^0.4.1",
-        "graceful-fs": "^4.2.4",
-        "json-parse-better-errors": "^1.0.2",
-        "loader-runner": "^4.2.0",
-        "mime-types": "^2.1.27",
-        "neo-async": "^2.6.2",
-        "schema-utils": "^3.0.0",
-        "tapable": "^2.1.1",
-        "terser-webpack-plugin": "^5.1.1",
-        "watchpack": "^2.2.0",
-        "webpack-sources": "^2.3.0"
-      },
-      "bin": {
-        "webpack": "bin/webpack.js"
-      },
-      "engines": {
-        "node": ">=10.13.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/webpack"
-      },
-      "peerDependenciesMeta": {
-        "webpack-cli": {
-          "optional": true
-        }
-      }
-    },
-    "../threestrap/node_modules/webpack-cli": {
-      "version": "4.7.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@discoveryjs/json-ext": "^0.5.0",
-        "@webpack-cli/configtest": "^1.0.4",
-        "@webpack-cli/info": "^1.3.0",
-        "@webpack-cli/serve": "^1.5.1",
-        "colorette": "^1.2.1",
-        "commander": "^7.0.0",
-        "execa": "^5.0.0",
-        "fastest-levenshtein": "^1.0.12",
-        "import-local": "^3.0.2",
-        "interpret": "^2.2.0",
-        "rechoir": "^0.7.0",
-        "v8-compile-cache": "^2.2.0",
-        "webpack-merge": "^5.7.3"
-      },
-      "bin": {
-        "webpack-cli": "bin/cli.js"
-      },
-      "engines": {
-        "node": ">=10.13.0"
-      },
-      "peerDependencies": {
-        "webpack": "4.x.x || 5.x.x"
-      },
-      "peerDependenciesMeta": {
-        "@webpack-cli/generators": {
-          "optional": true
-        },
-        "@webpack-cli/migrate": {
-          "optional": true
-        },
-        "webpack-bundle-analyzer": {
-          "optional": true
-        },
-        "webpack-dev-server": {
-          "optional": true
-        }
-      }
-    },
-    "../threestrap/node_modules/webpack-cli/node_modules/commander": {
-      "version": "7.2.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "../threestrap/node_modules/webpack-cli/node_modules/interpret": {
-      "version": "2.2.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "../threestrap/node_modules/webpack-cli/node_modules/rechoir": {
-      "version": "0.7.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "resolve": "^1.9.0"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "../threestrap/node_modules/webpack-merge": {
-      "version": "5.8.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "clone-deep": "^4.0.1",
-        "wildcard": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=10.0.0"
-      }
-    },
-    "../threestrap/node_modules/webpack-sources": {
-      "version": "2.3.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "source-list-map": "^2.0.1",
-        "source-map": "^0.6.1"
-      },
-      "engines": {
-        "node": ">=10.13.0"
-      }
-    },
-    "../threestrap/node_modules/webpack-stream": {
-      "version": "6.1.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "fancy-log": "^1.3.3",
-        "lodash.clone": "^4.3.2",
-        "lodash.some": "^4.2.2",
-        "memory-fs": "^0.5.0",
-        "plugin-error": "^1.0.1",
-        "supports-color": "^7.2.0",
-        "through": "^2.3.8",
-        "vinyl": "^2.1.0",
-        "webpack": "^4.26.1"
-      },
-      "engines": {
-        "node": ">= 8.0.0"
-      }
-    },
-    "../threestrap/node_modules/webpack-stream/node_modules/@webassemblyjs/ast": {
-      "version": "1.9.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@webassemblyjs/helper-module-context": "1.9.0",
-        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
-        "@webassemblyjs/wast-parser": "1.9.0"
-      }
-    },
-    "../threestrap/node_modules/webpack-stream/node_modules/@webassemblyjs/helper-api-error": {
-      "version": "1.9.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/webpack-stream/node_modules/@webassemblyjs/helper-buffer": {
-      "version": "1.9.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/webpack-stream/node_modules/@webassemblyjs/helper-wasm-bytecode": {
-      "version": "1.9.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/webpack-stream/node_modules/@webassemblyjs/helper-wasm-section": {
-      "version": "1.9.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@webassemblyjs/ast": "1.9.0",
-        "@webassemblyjs/helper-buffer": "1.9.0",
-        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
-        "@webassemblyjs/wasm-gen": "1.9.0"
-      }
-    },
-    "../threestrap/node_modules/webpack-stream/node_modules/@webassemblyjs/ieee754": {
-      "version": "1.9.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@xtuc/ieee754": "^1.2.0"
-      }
-    },
-    "../threestrap/node_modules/webpack-stream/node_modules/@webassemblyjs/leb128": {
-      "version": "1.9.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@xtuc/long": "4.2.2"
-      }
-    },
-    "../threestrap/node_modules/webpack-stream/node_modules/@webassemblyjs/utf8": {
-      "version": "1.9.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/webpack-stream/node_modules/@webassemblyjs/wasm-edit": {
-      "version": "1.9.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@webassemblyjs/ast": "1.9.0",
-        "@webassemblyjs/helper-buffer": "1.9.0",
-        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
-        "@webassemblyjs/helper-wasm-section": "1.9.0",
-        "@webassemblyjs/wasm-gen": "1.9.0",
-        "@webassemblyjs/wasm-opt": "1.9.0",
-        "@webassemblyjs/wasm-parser": "1.9.0",
-        "@webassemblyjs/wast-printer": "1.9.0"
-      }
-    },
-    "../threestrap/node_modules/webpack-stream/node_modules/@webassemblyjs/wasm-gen": {
-      "version": "1.9.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@webassemblyjs/ast": "1.9.0",
-        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
-        "@webassemblyjs/ieee754": "1.9.0",
-        "@webassemblyjs/leb128": "1.9.0",
-        "@webassemblyjs/utf8": "1.9.0"
-      }
-    },
-    "../threestrap/node_modules/webpack-stream/node_modules/@webassemblyjs/wasm-opt": {
-      "version": "1.9.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@webassemblyjs/ast": "1.9.0",
-        "@webassemblyjs/helper-buffer": "1.9.0",
-        "@webassemblyjs/wasm-gen": "1.9.0",
-        "@webassemblyjs/wasm-parser": "1.9.0"
-      }
-    },
-    "../threestrap/node_modules/webpack-stream/node_modules/@webassemblyjs/wasm-parser": {
-      "version": "1.9.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@webassemblyjs/ast": "1.9.0",
-        "@webassemblyjs/helper-api-error": "1.9.0",
-        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
-        "@webassemblyjs/ieee754": "1.9.0",
-        "@webassemblyjs/leb128": "1.9.0",
-        "@webassemblyjs/utf8": "1.9.0"
-      }
-    },
-    "../threestrap/node_modules/webpack-stream/node_modules/@webassemblyjs/wast-printer": {
-      "version": "1.9.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@webassemblyjs/ast": "1.9.0",
-        "@webassemblyjs/wast-parser": "1.9.0",
-        "@xtuc/long": "4.2.2"
-      }
-    },
-    "../threestrap/node_modules/webpack-stream/node_modules/acorn": {
-      "version": "6.4.2",
-      "dev": true,
-      "license": "MIT",
-      "bin": {
-        "acorn": "bin/acorn"
-      },
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "../threestrap/node_modules/webpack-stream/node_modules/anymatch": {
-      "version": "3.1.2",
-      "dev": true,
-      "license": "ISC",
-      "optional": true,
-      "dependencies": {
-        "normalize-path": "^3.0.0",
-        "picomatch": "^2.0.4"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "../threestrap/node_modules/webpack-stream/node_modules/binary-extensions": {
-      "version": "2.2.0",
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "../threestrap/node_modules/webpack-stream/node_modules/braces": {
-      "version": "3.0.2",
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "dependencies": {
-        "fill-range": "^7.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "../threestrap/node_modules/webpack-stream/node_modules/chokidar": {
-      "version": "3.5.1",
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "dependencies": {
-        "anymatch": "~3.1.1",
-        "braces": "~3.0.2",
-        "glob-parent": "~5.1.0",
-        "is-binary-path": "~2.1.0",
-        "is-glob": "~4.0.1",
-        "normalize-path": "~3.0.0",
-        "readdirp": "~3.5.0"
-      },
-      "engines": {
-        "node": ">= 8.10.0"
-      },
-      "optionalDependencies": {
-        "fsevents": "~2.3.1"
-      }
-    },
-    "../threestrap/node_modules/webpack-stream/node_modules/enhanced-resolve": {
-      "version": "4.5.0",
-      "dev": true,
-      "dependencies": {
-        "graceful-fs": "^4.1.2",
-        "memory-fs": "^0.5.0",
-        "tapable": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "../threestrap/node_modules/webpack-stream/node_modules/eslint-scope": {
-      "version": "4.0.3",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "dependencies": {
-        "esrecurse": "^4.1.0",
-        "estraverse": "^4.1.1"
-      },
-      "engines": {
-        "node": ">=4.0.0"
-      }
-    },
-    "../threestrap/node_modules/webpack-stream/node_modules/fill-range": {
-      "version": "7.0.1",
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "dependencies": {
-        "to-regex-range": "^5.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "../threestrap/node_modules/webpack-stream/node_modules/fsevents": {
-      "version": "2.3.2",
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
-      }
-    },
-    "../threestrap/node_modules/webpack-stream/node_modules/is-binary-path": {
-      "version": "2.1.0",
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "dependencies": {
-        "binary-extensions": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "../threestrap/node_modules/webpack-stream/node_modules/is-number": {
-      "version": "7.0.0",
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "engines": {
-        "node": ">=0.12.0"
-      }
-    },
-    "../threestrap/node_modules/webpack-stream/node_modules/loader-runner": {
-      "version": "2.4.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=4.3.0 <5.0.0 || >=5.10"
-      }
-    },
-    "../threestrap/node_modules/webpack-stream/node_modules/readdirp": {
-      "version": "3.5.0",
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "dependencies": {
-        "picomatch": "^2.2.1"
-      },
-      "engines": {
-        "node": ">=8.10.0"
-      }
-    },
-    "../threestrap/node_modules/webpack-stream/node_modules/schema-utils": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ajv": "^6.1.0",
-        "ajv-errors": "^1.0.0",
-        "ajv-keywords": "^3.1.0"
-      },
-      "engines": {
-        "node": ">= 4"
-      }
-    },
-    "../threestrap/node_modules/webpack-stream/node_modules/serialize-javascript": {
-      "version": "4.0.0",
-      "dev": true,
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "randombytes": "^2.1.0"
-      }
-    },
-    "../threestrap/node_modules/webpack-stream/node_modules/tapable": {
-      "version": "1.1.3",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "../threestrap/node_modules/webpack-stream/node_modules/terser": {
-      "version": "4.8.0",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "dependencies": {
-        "commander": "^2.20.0",
-        "source-map": "~0.6.1",
-        "source-map-support": "~0.5.12"
-      },
-      "bin": {
-        "terser": "bin/terser"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "../threestrap/node_modules/webpack-stream/node_modules/terser-webpack-plugin": {
-      "version": "1.4.5",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "cacache": "^12.0.2",
-        "find-cache-dir": "^2.1.0",
-        "is-wsl": "^1.1.0",
-        "schema-utils": "^1.0.0",
-        "serialize-javascript": "^4.0.0",
-        "source-map": "^0.6.1",
-        "terser": "^4.1.2",
-        "webpack-sources": "^1.4.0",
-        "worker-farm": "^1.7.0"
-      },
-      "engines": {
-        "node": ">= 6.9.0"
-      },
-      "peerDependencies": {
-        "webpack": "^4.0.0"
-      }
-    },
-    "../threestrap/node_modules/webpack-stream/node_modules/to-regex-range": {
-      "version": "5.0.1",
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "dependencies": {
-        "is-number": "^7.0.0"
-      },
-      "engines": {
-        "node": ">=8.0"
-      }
-    },
-    "../threestrap/node_modules/webpack-stream/node_modules/watchpack": {
-      "version": "1.7.5",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "graceful-fs": "^4.1.2",
-        "neo-async": "^2.5.0"
-      },
-      "optionalDependencies": {
-        "chokidar": "^3.4.1",
-        "watchpack-chokidar2": "^2.0.1"
-      }
-    },
-    "../threestrap/node_modules/webpack-stream/node_modules/webpack": {
-      "version": "4.46.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@webassemblyjs/ast": "1.9.0",
-        "@webassemblyjs/helper-module-context": "1.9.0",
-        "@webassemblyjs/wasm-edit": "1.9.0",
-        "@webassemblyjs/wasm-parser": "1.9.0",
-        "acorn": "^6.4.1",
-        "ajv": "^6.10.2",
-        "ajv-keywords": "^3.4.1",
-        "chrome-trace-event": "^1.0.2",
-        "enhanced-resolve": "^4.5.0",
-        "eslint-scope": "^4.0.3",
-        "json-parse-better-errors": "^1.0.2",
-        "loader-runner": "^2.4.0",
-        "loader-utils": "^1.2.3",
-        "memory-fs": "^0.4.1",
-        "micromatch": "^3.1.10",
-        "mkdirp": "^0.5.3",
-        "neo-async": "^2.6.1",
-        "node-libs-browser": "^2.2.1",
-        "schema-utils": "^1.0.0",
-        "tapable": "^1.1.3",
-        "terser-webpack-plugin": "^1.4.3",
-        "watchpack": "^1.7.4",
-        "webpack-sources": "^1.4.1"
-      },
-      "bin": {
-        "webpack": "bin/webpack.js"
-      },
-      "engines": {
-        "node": ">=6.11.5"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/webpack"
-      },
-      "peerDependenciesMeta": {
-        "webpack-cli": {
-          "optional": true
-        },
-        "webpack-command": {
-          "optional": true
-        }
-      }
-    },
-    "../threestrap/node_modules/webpack-stream/node_modules/webpack-sources": {
-      "version": "1.4.3",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "source-list-map": "^2.0.0",
-        "source-map": "~0.6.1"
-      }
-    },
-    "../threestrap/node_modules/webpack-stream/node_modules/webpack/node_modules/memory-fs": {
-      "version": "0.4.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "errno": "^0.1.3",
-        "readable-stream": "^2.0.1"
-      }
-    },
-    "../threestrap/node_modules/webpack/node_modules/acorn": {
-      "version": "8.4.0",
-      "dev": true,
-      "license": "MIT",
-      "bin": {
-        "acorn": "bin/acorn"
-      },
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "../threestrap/node_modules/which": {
-      "version": "2.0.2",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "isexe": "^2.0.0"
-      },
-      "bin": {
-        "node-which": "bin/node-which"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "../threestrap/node_modules/which-module": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "ISC"
-    },
-    "../threestrap/node_modules/wildcard": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "../threestrap/node_modules/word-wrap": {
-      "version": "1.2.3",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/worker-farm": {
-      "version": "1.7.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "errno": "~0.1.7"
-      }
-    },
-    "../threestrap/node_modules/wrap-ansi": {
-      "version": "2.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "string-width": "^1.0.1",
-        "strip-ansi": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/wrap-ansi/node_modules/ansi-regex": {
-      "version": "2.1.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "number-is-nan": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/wrap-ansi/node_modules/string-width": {
-      "version": "1.0.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "code-point-at": "^1.0.0",
-        "is-fullwidth-code-point": "^1.0.0",
-        "strip-ansi": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/wrap-ansi/node_modules/strip-ansi": {
-      "version": "3.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-regex": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/wrappy": {
-      "version": "1.0.2",
-      "dev": true,
-      "license": "ISC"
-    },
-    "../threestrap/node_modules/write": {
-      "version": "1.0.3",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "mkdirp": "^0.5.1"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "../threestrap/node_modules/ws": {
-      "version": "7.4.6",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8.3.0"
-      },
-      "peerDependencies": {
-        "bufferutil": "^4.0.1",
-        "utf-8-validate": "^5.0.2"
-      },
-      "peerDependenciesMeta": {
-        "bufferutil": {
-          "optional": true
-        },
-        "utf-8-validate": {
-          "optional": true
-        }
-      }
-    },
-    "../threestrap/node_modules/xtend": {
-      "version": "4.0.2",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.4"
-      }
-    },
-    "../threestrap/node_modules/y18n": {
-      "version": "3.2.2",
-      "dev": true,
-      "license": "ISC"
-    },
-    "../threestrap/node_modules/yallist": {
-      "version": "4.0.0",
-      "dev": true,
-      "license": "ISC"
-    },
-    "../threestrap/node_modules/yargs": {
-      "version": "7.1.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "camelcase": "^3.0.0",
-        "cliui": "^3.2.0",
-        "decamelize": "^1.1.1",
-        "get-caller-file": "^1.0.1",
-        "os-locale": "^1.4.0",
-        "read-pkg-up": "^1.0.1",
-        "require-directory": "^2.1.1",
-        "require-main-filename": "^1.0.1",
-        "set-blocking": "^2.0.0",
-        "string-width": "^1.0.2",
-        "which-module": "^1.0.0",
-        "y18n": "^3.2.1",
-        "yargs-parser": "^5.0.1"
-      }
-    },
-    "../threestrap/node_modules/yargs-parser": {
-      "version": "5.0.1",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "camelcase": "^3.0.0",
-        "object.assign": "^4.1.0"
-      }
-    },
-    "../threestrap/node_modules/yargs/node_modules/ansi-regex": {
-      "version": "2.1.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/yargs/node_modules/is-fullwidth-code-point": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "number-is-nan": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/yargs/node_modules/string-width": {
-      "version": "1.0.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "code-point-at": "^1.0.0",
-        "is-fullwidth-code-point": "^1.0.0",
-        "strip-ansi": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/yargs/node_modules/strip-ansi": {
-      "version": "3.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-regex": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "../threestrap/node_modules/yocto-queue": {
-      "version": "0.1.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/@babel/code-frame": {
-      "version": "7.12.11",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/highlight": "^7.10.4"
-      }
-    },
-    "node_modules/@babel/helper-validator-identifier": {
-      "version": "7.16.7",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/highlight": {
-      "version": "7.16.10",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-validator-identifier": "^7.16.7",
-        "chalk": "^2.0.0",
-        "js-tokens": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/highlight/node_modules/ansi-styles": {
-      "version": "3.2.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "color-convert": "^1.9.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/@babel/highlight/node_modules/chalk": {
-      "version": "2.4.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-styles": "^3.2.1",
-        "escape-string-regexp": "^1.0.5",
-        "supports-color": "^5.3.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/@babel/highlight/node_modules/color-convert": {
-      "version": "1.9.3",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "color-name": "1.1.3"
-      }
-    },
-    "node_modules/@babel/highlight/node_modules/color-name": {
-      "version": "1.1.3",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/@babel/highlight/node_modules/escape-string-regexp": {
-      "version": "1.0.5",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.8.0"
-      }
-    },
-    "node_modules/@babel/highlight/node_modules/has-flag": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/@babel/highlight/node_modules/supports-color": {
-      "version": "5.5.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/@discoveryjs/json-ext": {
-      "version": "0.5.6",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=10.0.0"
-      }
-    },
-    "node_modules/@eslint/eslintrc": {
-      "version": "0.4.3",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ajv": "^6.12.4",
-        "debug": "^4.1.1",
-        "espree": "^7.3.0",
-        "globals": "^13.9.0",
-        "ignore": "^4.0.6",
-        "import-fresh": "^3.2.1",
-        "js-yaml": "^3.13.1",
-        "minimatch": "^3.0.4",
-        "strip-json-comments": "^3.1.1"
-      },
-      "engines": {
-        "node": "^10.12.0 || >=12.0.0"
-      }
-    },
-    "node_modules/@humanwhocodes/config-array": {
-      "version": "0.5.0",
-      "dev": true,
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@humanwhocodes/object-schema": "^1.2.0",
-        "debug": "^4.1.1",
-        "minimatch": "^3.0.4"
-      },
-      "engines": {
-        "node": ">=10.10.0"
-      }
-    },
-    "node_modules/@humanwhocodes/object-schema": {
-      "version": "1.2.1",
-      "dev": true,
-      "license": "BSD-3-Clause"
-    },
-    "node_modules/@socket.io/base64-arraybuffer": {
-      "version": "1.0.2",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6.0"
-      }
-    },
-    "node_modules/@types/component-emitter": {
-      "version": "1.2.11",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/@types/cookie": {
-      "version": "0.4.1",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/@types/cors": {
-      "version": "2.8.12",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/@types/eslint": {
-      "version": "8.4.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@types/estree": "*",
-        "@types/json-schema": "*"
-      }
-    },
-    "node_modules/@types/eslint-scope": {
-      "version": "3.7.3",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@types/eslint": "*",
-        "@types/estree": "*"
-      }
-    },
-    "node_modules/@types/estree": {
-      "version": "0.0.51",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/@types/json-schema": {
-      "version": "7.0.9",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/@types/node": {
-      "version": "17.0.18",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/@webassemblyjs/ast": {
-      "version": "1.11.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@webassemblyjs/helper-numbers": "1.11.1",
-        "@webassemblyjs/helper-wasm-bytecode": "1.11.1"
-      }
-    },
-    "node_modules/@webassemblyjs/floating-point-hex-parser": {
-      "version": "1.11.1",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/@webassemblyjs/helper-api-error": {
-      "version": "1.11.1",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/@webassemblyjs/helper-buffer": {
-      "version": "1.11.1",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/@webassemblyjs/helper-code-frame": {
-      "version": "1.9.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@webassemblyjs/wast-printer": "1.9.0"
-      }
-    },
-    "node_modules/@webassemblyjs/helper-code-frame/node_modules/@webassemblyjs/ast": {
-      "version": "1.9.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@webassemblyjs/helper-module-context": "1.9.0",
-        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
-        "@webassemblyjs/wast-parser": "1.9.0"
-      }
-    },
-    "node_modules/@webassemblyjs/helper-code-frame/node_modules/@webassemblyjs/helper-wasm-bytecode": {
-      "version": "1.9.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/@webassemblyjs/helper-code-frame/node_modules/@webassemblyjs/wast-printer": {
-      "version": "1.9.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@webassemblyjs/ast": "1.9.0",
-        "@webassemblyjs/wast-parser": "1.9.0",
-        "@xtuc/long": "4.2.2"
-      }
-    },
-    "node_modules/@webassemblyjs/helper-fsm": {
-      "version": "1.9.0",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/@webassemblyjs/helper-module-context": {
-      "version": "1.9.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@webassemblyjs/ast": "1.9.0"
-      }
-    },
-    "node_modules/@webassemblyjs/helper-module-context/node_modules/@webassemblyjs/ast": {
-      "version": "1.9.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@webassemblyjs/helper-module-context": "1.9.0",
-        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
-        "@webassemblyjs/wast-parser": "1.9.0"
-      }
-    },
-    "node_modules/@webassemblyjs/helper-module-context/node_modules/@webassemblyjs/helper-wasm-bytecode": {
-      "version": "1.9.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/@webassemblyjs/helper-numbers": {
-      "version": "1.11.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@webassemblyjs/floating-point-hex-parser": "1.11.1",
-        "@webassemblyjs/helper-api-error": "1.11.1",
-        "@xtuc/long": "4.2.2"
-      }
-    },
-    "node_modules/@webassemblyjs/helper-wasm-bytecode": {
-      "version": "1.11.1",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/@webassemblyjs/helper-wasm-section": {
-      "version": "1.11.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@webassemblyjs/ast": "1.11.1",
-        "@webassemblyjs/helper-buffer": "1.11.1",
-        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
-        "@webassemblyjs/wasm-gen": "1.11.1"
-      }
-    },
-    "node_modules/@webassemblyjs/ieee754": {
-      "version": "1.11.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@xtuc/ieee754": "^1.2.0"
-      }
-    },
-    "node_modules/@webassemblyjs/leb128": {
-      "version": "1.11.1",
-      "dev": true,
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@xtuc/long": "4.2.2"
-      }
-    },
-    "node_modules/@webassemblyjs/utf8": {
-      "version": "1.11.1",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/@webassemblyjs/wasm-edit": {
-      "version": "1.11.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@webassemblyjs/ast": "1.11.1",
-        "@webassemblyjs/helper-buffer": "1.11.1",
-        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
-        "@webassemblyjs/helper-wasm-section": "1.11.1",
-        "@webassemblyjs/wasm-gen": "1.11.1",
-        "@webassemblyjs/wasm-opt": "1.11.1",
-        "@webassemblyjs/wasm-parser": "1.11.1",
-        "@webassemblyjs/wast-printer": "1.11.1"
-      }
-    },
-    "node_modules/@webassemblyjs/wasm-gen": {
-      "version": "1.11.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@webassemblyjs/ast": "1.11.1",
-        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
-        "@webassemblyjs/ieee754": "1.11.1",
-        "@webassemblyjs/leb128": "1.11.1",
-        "@webassemblyjs/utf8": "1.11.1"
-      }
-    },
-    "node_modules/@webassemblyjs/wasm-opt": {
-      "version": "1.11.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@webassemblyjs/ast": "1.11.1",
-        "@webassemblyjs/helper-buffer": "1.11.1",
-        "@webassemblyjs/wasm-gen": "1.11.1",
-        "@webassemblyjs/wasm-parser": "1.11.1"
-      }
-    },
-    "node_modules/@webassemblyjs/wasm-parser": {
-      "version": "1.11.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@webassemblyjs/ast": "1.11.1",
-        "@webassemblyjs/helper-api-error": "1.11.1",
-        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
-        "@webassemblyjs/ieee754": "1.11.1",
-        "@webassemblyjs/leb128": "1.11.1",
-        "@webassemblyjs/utf8": "1.11.1"
-      }
-    },
-    "node_modules/@webassemblyjs/wast-parser": {
-      "version": "1.9.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@webassemblyjs/ast": "1.9.0",
-        "@webassemblyjs/floating-point-hex-parser": "1.9.0",
-        "@webassemblyjs/helper-api-error": "1.9.0",
-        "@webassemblyjs/helper-code-frame": "1.9.0",
-        "@webassemblyjs/helper-fsm": "1.9.0",
-        "@xtuc/long": "4.2.2"
-      }
-    },
-    "node_modules/@webassemblyjs/wast-parser/node_modules/@webassemblyjs/ast": {
-      "version": "1.9.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@webassemblyjs/helper-module-context": "1.9.0",
-        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
-        "@webassemblyjs/wast-parser": "1.9.0"
-      }
-    },
-    "node_modules/@webassemblyjs/wast-parser/node_modules/@webassemblyjs/floating-point-hex-parser": {
-      "version": "1.9.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/@webassemblyjs/wast-parser/node_modules/@webassemblyjs/helper-api-error": {
-      "version": "1.9.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/@webassemblyjs/wast-parser/node_modules/@webassemblyjs/helper-wasm-bytecode": {
-      "version": "1.9.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/@webassemblyjs/wast-printer": {
-      "version": "1.11.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@webassemblyjs/ast": "1.11.1",
-        "@xtuc/long": "4.2.2"
-      }
-    },
-    "node_modules/@webpack-cli/configtest": {
-      "version": "1.1.1",
-      "dev": true,
-      "license": "MIT",
-      "peerDependencies": {
-        "webpack": "4.x.x || 5.x.x",
-        "webpack-cli": "4.x.x"
-      }
-    },
-    "node_modules/@webpack-cli/info": {
-      "version": "1.4.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "envinfo": "^7.7.3"
-      },
-      "peerDependencies": {
-        "webpack-cli": "4.x.x"
-      }
-    },
-    "node_modules/@webpack-cli/serve": {
-      "version": "1.6.1",
-      "dev": true,
-      "license": "MIT",
-      "peerDependencies": {
-        "webpack-cli": "4.x.x"
-      },
-      "peerDependenciesMeta": {
-        "webpack-dev-server": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@xtuc/ieee754": {
-      "version": "1.2.0",
-      "dev": true,
-      "license": "BSD-3-Clause"
-    },
-    "node_modules/@xtuc/long": {
-      "version": "4.2.2",
-      "dev": true,
-      "license": "Apache-2.0"
-    },
-    "node_modules/accepts": {
-      "version": "1.3.8",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "mime-types": "~2.1.34",
-        "negotiator": "0.6.3"
-      },
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/acorn": {
-      "version": "7.4.1",
-      "dev": true,
-      "license": "MIT",
-      "bin": {
-        "acorn": "bin/acorn"
-      },
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "node_modules/acorn-jsx": {
-      "version": "5.3.2",
-      "dev": true,
-      "license": "MIT",
-      "peerDependencies": {
-        "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
-      }
-    },
-    "node_modules/ajv": {
-      "version": "6.12.6",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "fast-deep-equal": "^3.1.1",
-        "fast-json-stable-stringify": "^2.0.0",
-        "json-schema-traverse": "^0.4.1",
-        "uri-js": "^4.2.2"
-      },
-      "funding": {
-        "type": "github",
-        "url": "https://github.com/sponsors/epoberezkin"
-      }
-    },
-    "node_modules/ajv-errors": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "peerDependencies": {
-        "ajv": ">=5.0.0"
-      }
-    },
-    "node_modules/ajv-keywords": {
-      "version": "3.5.2",
-      "dev": true,
-      "license": "MIT",
-      "peerDependencies": {
-        "ajv": "^6.9.1"
-      }
-    },
-    "node_modules/ansi-colors": {
-      "version": "4.1.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/ansi-escapes": {
-      "version": "4.3.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "type-fest": "^0.21.3"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/ansi-escapes/node_modules/type-fest": {
-      "version": "0.21.3",
-      "dev": true,
-      "license": "(MIT OR CC0-1.0)",
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/ansi-gray": {
-      "version": "0.1.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-wrap": "0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/ansi-regex": {
-      "version": "5.0.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/ansi-wrap": {
-      "version": "0.1.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/anymatch": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "micromatch": "^3.1.4",
-        "normalize-path": "^2.1.1"
-      }
-    },
-    "node_modules/anymatch/node_modules/normalize-path": {
-      "version": "2.1.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "remove-trailing-separator": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/append-buffer": {
-      "version": "1.0.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "buffer-equal": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/aproba": {
-      "version": "1.2.0",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/archy": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/argparse": {
-      "version": "1.0.10",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "sprintf-js": "~1.0.2"
-      }
-    },
-    "node_modules/arr-diff": {
-      "version": "4.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/arr-filter": {
-      "version": "1.1.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "make-iterator": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/arr-flatten": {
-      "version": "1.1.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/arr-map": {
-      "version": "2.0.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "make-iterator": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/arr-union": {
-      "version": "3.1.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/array-each": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/array-initial": {
-      "version": "1.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "array-slice": "^1.0.0",
-        "is-number": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/array-initial/node_modules/is-number": {
-      "version": "4.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/array-last": {
-      "version": "1.3.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-number": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/array-last/node_modules/is-number": {
-      "version": "4.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/array-slice": {
-      "version": "1.1.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/array-sort": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "default-compare": "^1.0.0",
-        "get-value": "^2.0.6",
-        "kind-of": "^5.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/array-unique": {
-      "version": "0.3.2",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/asn1.js": {
-      "version": "5.4.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "bn.js": "^4.0.0",
-        "inherits": "^2.0.1",
-        "minimalistic-assert": "^1.0.0",
-        "safer-buffer": "^2.1.0"
-      }
-    },
-    "node_modules/asn1.js/node_modules/bn.js": {
-      "version": "4.12.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/assert": {
-      "version": "1.5.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "object-assign": "^4.1.1",
-        "util": "0.10.3"
-      }
-    },
-    "node_modules/assert/node_modules/inherits": {
-      "version": "2.0.1",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/assert/node_modules/util": {
-      "version": "0.10.3",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "inherits": "2.0.1"
-      }
-    },
-    "node_modules/assign-symbols": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/astral-regex": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/async-done": {
-      "version": "1.3.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "end-of-stream": "^1.1.0",
-        "once": "^1.3.2",
-        "process-nextick-args": "^2.0.0",
-        "stream-exhaust": "^1.0.1"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/async-each": {
-      "version": "1.0.3",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/async-settle": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "async-done": "^1.2.2"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/atob": {
-      "version": "2.1.2",
-      "dev": true,
-      "license": "(MIT OR Apache-2.0)",
-      "bin": {
-        "atob": "bin/atob.js"
-      },
-      "engines": {
-        "node": ">= 4.5.0"
-      }
-    },
-    "node_modules/bach": {
-      "version": "1.2.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "arr-filter": "^1.1.1",
-        "arr-flatten": "^1.0.1",
-        "arr-map": "^2.0.0",
-        "array-each": "^1.0.0",
-        "array-initial": "^1.0.0",
-        "array-last": "^1.1.1",
-        "async-done": "^1.2.2",
-        "async-settle": "^1.0.0",
-        "now-and-later": "^2.0.0"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/balanced-match": {
-      "version": "1.0.2",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/base": {
-      "version": "0.11.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "cache-base": "^1.0.1",
-        "class-utils": "^0.3.5",
-        "component-emitter": "^1.2.1",
-        "define-property": "^1.0.0",
-        "isobject": "^3.0.1",
-        "mixin-deep": "^1.2.0",
-        "pascalcase": "^0.1.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/base/node_modules/define-property": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-descriptor": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/base64-js": {
-      "version": "1.5.1",
-      "dev": true,
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ],
-      "license": "MIT"
-    },
-    "node_modules/base64id": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": "^4.5.0 || >= 5.9"
-      }
-    },
-    "node_modules/big.js": {
-      "version": "5.2.2",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/binary-extensions": {
-      "version": "1.13.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/bindings": {
-      "version": "1.5.0",
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "dependencies": {
-        "file-uri-to-path": "1.0.0"
-      }
-    },
-    "node_modules/bluebird": {
-      "version": "3.7.2",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/bn.js": {
-      "version": "5.2.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/body-parser": {
-      "version": "1.19.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "bytes": "3.1.2",
-        "content-type": "~1.0.4",
-        "debug": "2.6.9",
-        "depd": "~1.1.2",
-        "http-errors": "1.8.1",
-        "iconv-lite": "0.4.24",
-        "on-finished": "~2.3.0",
-        "qs": "6.9.7",
-        "raw-body": "2.4.3",
-        "type-is": "~1.6.18"
-      },
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/body-parser/node_modules/debug": {
-      "version": "2.6.9",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ms": "2.0.0"
-      }
-    },
-    "node_modules/body-parser/node_modules/ms": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/brace-expansion": {
-      "version": "1.1.11",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "balanced-match": "^1.0.0",
-        "concat-map": "0.0.1"
-      }
-    },
-    "node_modules/braces": {
-      "version": "2.3.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "arr-flatten": "^1.1.0",
-        "array-unique": "^0.3.2",
-        "extend-shallow": "^2.0.1",
-        "fill-range": "^4.0.0",
-        "isobject": "^3.0.1",
-        "repeat-element": "^1.1.2",
-        "snapdragon": "^0.8.1",
-        "snapdragon-node": "^2.0.1",
-        "split-string": "^3.0.2",
-        "to-regex": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/brorand": {
-      "version": "1.1.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/browserify-aes": {
-      "version": "1.2.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "buffer-xor": "^1.0.3",
-        "cipher-base": "^1.0.0",
-        "create-hash": "^1.1.0",
-        "evp_bytestokey": "^1.0.3",
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.0.1"
-      }
-    },
-    "node_modules/browserify-cipher": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "browserify-aes": "^1.0.4",
-        "browserify-des": "^1.0.0",
-        "evp_bytestokey": "^1.0.0"
-      }
-    },
-    "node_modules/browserify-des": {
-      "version": "1.0.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "cipher-base": "^1.0.1",
-        "des.js": "^1.0.0",
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.1.2"
-      }
-    },
-    "node_modules/browserify-rsa": {
-      "version": "4.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "bn.js": "^5.0.0",
-        "randombytes": "^2.0.1"
-      }
-    },
-    "node_modules/browserify-sign": {
-      "version": "4.2.1",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "bn.js": "^5.1.1",
-        "browserify-rsa": "^4.0.1",
-        "create-hash": "^1.2.0",
-        "create-hmac": "^1.1.7",
-        "elliptic": "^6.5.3",
-        "inherits": "^2.0.4",
-        "parse-asn1": "^5.1.5",
-        "readable-stream": "^3.6.0",
-        "safe-buffer": "^5.2.0"
-      }
-    },
-    "node_modules/browserify-sign/node_modules/readable-stream": {
-      "version": "3.6.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "inherits": "^2.0.3",
-        "string_decoder": "^1.1.1",
-        "util-deprecate": "^1.0.1"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/browserify-sign/node_modules/safe-buffer": {
-      "version": "5.2.1",
-      "dev": true,
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ],
-      "license": "MIT"
-    },
-    "node_modules/browserify-zlib": {
-      "version": "0.2.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "pako": "~1.0.5"
-      }
-    },
-    "node_modules/browserslist": {
-      "version": "4.19.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "caniuse-lite": "^1.0.30001286",
-        "electron-to-chromium": "^1.4.17",
-        "escalade": "^3.1.1",
-        "node-releases": "^2.0.1",
-        "picocolors": "^1.0.0"
-      },
-      "bin": {
-        "browserslist": "cli.js"
-      },
-      "engines": {
-        "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/browserslist"
-      }
-    },
-    "node_modules/buffer": {
-      "version": "4.9.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "base64-js": "^1.0.2",
-        "ieee754": "^1.1.4",
-        "isarray": "^1.0.0"
-      }
-    },
-    "node_modules/buffer-equal": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "node_modules/buffer-from": {
-      "version": "1.1.2",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/buffer-xor": {
-      "version": "1.0.3",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/builtin-status-codes": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/bytes": {
-      "version": "3.1.2",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/cacache": {
-      "version": "12.0.4",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "bluebird": "^3.5.5",
-        "chownr": "^1.1.1",
-        "figgy-pudding": "^3.5.1",
-        "glob": "^7.1.4",
-        "graceful-fs": "^4.1.15",
-        "infer-owner": "^1.0.3",
-        "lru-cache": "^5.1.1",
-        "mississippi": "^3.0.0",
-        "mkdirp": "^0.5.1",
-        "move-concurrently": "^1.0.1",
-        "promise-inflight": "^1.0.1",
-        "rimraf": "^2.6.3",
-        "ssri": "^6.0.1",
-        "unique-filename": "^1.1.1",
-        "y18n": "^4.0.0"
-      }
-    },
-    "node_modules/cacache/node_modules/lru-cache": {
-      "version": "5.1.1",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "yallist": "^3.0.2"
-      }
-    },
-    "node_modules/cacache/node_modules/rimraf": {
-      "version": "2.7.1",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "glob": "^7.1.3"
-      },
-      "bin": {
-        "rimraf": "bin.js"
-      }
-    },
-    "node_modules/cacache/node_modules/y18n": {
-      "version": "4.0.3",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/cacache/node_modules/yallist": {
-      "version": "3.1.1",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/cache-base": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "collection-visit": "^1.0.0",
-        "component-emitter": "^1.2.1",
-        "get-value": "^2.0.6",
-        "has-value": "^1.0.0",
-        "isobject": "^3.0.1",
-        "set-value": "^2.0.0",
-        "to-object-path": "^0.3.0",
-        "union-value": "^1.0.0",
-        "unset-value": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/call-bind": {
-      "version": "1.0.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "function-bind": "^1.1.1",
-        "get-intrinsic": "^1.0.2"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/callsites": {
-      "version": "3.1.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/camelcase": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/caniuse-lite": {
-      "version": "1.0.30001312",
-      "dev": true,
-      "license": "CC-BY-4.0",
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/browserslist"
-      }
-    },
-    "node_modules/chalk": {
-      "version": "4.1.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/chalk?sponsor=1"
-      }
-    },
-    "node_modules/chardet": {
-      "version": "0.7.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/chokidar": {
-      "version": "2.1.8",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "anymatch": "^2.0.0",
-        "async-each": "^1.0.1",
-        "braces": "^2.3.2",
-        "glob-parent": "^3.1.0",
-        "inherits": "^2.0.3",
-        "is-binary-path": "^1.0.0",
-        "is-glob": "^4.0.0",
-        "normalize-path": "^3.0.0",
-        "path-is-absolute": "^1.0.0",
-        "readdirp": "^2.2.1",
-        "upath": "^1.1.1"
-      },
-      "optionalDependencies": {
-        "fsevents": "^1.2.7"
-      }
-    },
-    "node_modules/chokidar/node_modules/glob-parent": {
-      "version": "3.1.0",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "is-glob": "^3.1.0",
-        "path-dirname": "^1.0.0"
-      }
-    },
-    "node_modules/chokidar/node_modules/glob-parent/node_modules/is-glob": {
-      "version": "3.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-extglob": "^2.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/chownr": {
-      "version": "1.1.4",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/chrome-trace-event": {
-      "version": "1.0.3",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6.0"
-      }
-    },
-    "node_modules/cipher-base": {
-      "version": "1.0.4",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.0.1"
-      }
-    },
-    "node_modules/class-utils": {
-      "version": "0.3.6",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "arr-union": "^3.1.0",
-        "define-property": "^0.2.5",
-        "isobject": "^3.0.0",
-        "static-extend": "^0.1.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/class-utils/node_modules/define-property": {
-      "version": "0.2.5",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-descriptor": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/class-utils/node_modules/is-accessor-descriptor": {
-      "version": "0.1.6",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "kind-of": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": {
-      "version": "3.2.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/class-utils/node_modules/is-data-descriptor": {
-      "version": "0.1.4",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "kind-of": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": {
-      "version": "3.2.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/class-utils/node_modules/is-descriptor": {
-      "version": "0.1.6",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-accessor-descriptor": "^0.1.6",
-        "is-data-descriptor": "^0.1.4",
-        "kind-of": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/cli-cursor": {
-      "version": "3.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "restore-cursor": "^3.1.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/cli-width": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "ISC",
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/cliui": {
-      "version": "3.2.0",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "string-width": "^1.0.1",
-        "strip-ansi": "^3.0.1",
-        "wrap-ansi": "^2.0.0"
-      }
-    },
-    "node_modules/cliui/node_modules/ansi-regex": {
-      "version": "2.1.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/cliui/node_modules/is-fullwidth-code-point": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "number-is-nan": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/cliui/node_modules/string-width": {
-      "version": "1.0.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "code-point-at": "^1.0.0",
-        "is-fullwidth-code-point": "^1.0.0",
-        "strip-ansi": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/cliui/node_modules/strip-ansi": {
-      "version": "3.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-regex": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/clone": {
-      "version": "2.1.2",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.8"
-      }
-    },
-    "node_modules/clone-buffer": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/clone-deep": {
-      "version": "4.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-plain-object": "^2.0.4",
-        "kind-of": "^6.0.2",
-        "shallow-clone": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/clone-deep/node_modules/is-plain-object": {
-      "version": "2.0.4",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "isobject": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/clone-deep/node_modules/kind-of": {
-      "version": "6.0.3",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/clone-stats": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/cloneable-readable": {
-      "version": "1.1.3",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "inherits": "^2.0.1",
-        "process-nextick-args": "^2.0.0",
-        "readable-stream": "^2.3.5"
-      }
-    },
-    "node_modules/code-point-at": {
-      "version": "1.1.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/collection-map": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "arr-map": "^2.0.2",
-        "for-own": "^1.0.0",
-        "make-iterator": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/collection-visit": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "map-visit": "^1.0.0",
-        "object-visit": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/color-convert": {
-      "version": "2.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/color-name": {
-      "version": "1.1.4",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/color-support": {
-      "version": "1.1.3",
-      "dev": true,
-      "license": "ISC",
-      "bin": {
-        "color-support": "bin.js"
-      }
-    },
-    "node_modules/colorette": {
-      "version": "2.0.16",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/colors": {
-      "version": "1.4.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.1.90"
-      }
-    },
-    "node_modules/commander": {
-      "version": "7.2.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/commondir": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/component-emitter": {
-      "version": "1.3.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/concat-map": {
-      "version": "0.0.1",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/concat-stream": {
-      "version": "1.6.2",
-      "dev": true,
-      "engines": [
-        "node >= 0.8"
-      ],
-      "license": "MIT",
-      "dependencies": {
-        "buffer-from": "^1.0.0",
-        "inherits": "^2.0.3",
-        "readable-stream": "^2.2.2",
-        "typedarray": "^0.0.6"
-      }
-    },
-    "node_modules/concat-with-sourcemaps": {
-      "version": "1.1.0",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "source-map": "^0.6.1"
-      }
-    },
-    "node_modules/connect": {
-      "version": "3.7.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "debug": "2.6.9",
-        "finalhandler": "1.1.2",
-        "parseurl": "~1.3.3",
-        "utils-merge": "1.0.1"
-      },
-      "engines": {
-        "node": ">= 0.10.0"
-      }
-    },
-    "node_modules/connect/node_modules/debug": {
-      "version": "2.6.9",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ms": "2.0.0"
-      }
-    },
-    "node_modules/connect/node_modules/ms": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/console-browserify": {
-      "version": "1.2.0",
-      "dev": true
-    },
-    "node_modules/constants-browserify": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/content-type": {
-      "version": "1.0.4",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/convert-source-map": {
-      "version": "1.8.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "safe-buffer": "~5.1.1"
-      }
-    },
-    "node_modules/cookie": {
-      "version": "0.4.2",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/copy-concurrently": {
-      "version": "1.0.5",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "aproba": "^1.1.1",
-        "fs-write-stream-atomic": "^1.0.8",
-        "iferr": "^0.1.5",
-        "mkdirp": "^0.5.1",
-        "rimraf": "^2.5.4",
-        "run-queue": "^1.0.0"
-      }
-    },
-    "node_modules/copy-concurrently/node_modules/rimraf": {
-      "version": "2.7.1",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "glob": "^7.1.3"
-      },
-      "bin": {
-        "rimraf": "bin.js"
-      }
-    },
-    "node_modules/copy-descriptor": {
-      "version": "0.1.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/copy-props": {
-      "version": "2.0.5",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "each-props": "^1.3.2",
-        "is-plain-object": "^5.0.0"
-      }
-    },
-    "node_modules/core-util-is": {
-      "version": "1.0.3",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/cors": {
-      "version": "2.8.5",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "object-assign": "^4",
-        "vary": "^1"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/create-ecdh": {
-      "version": "4.0.4",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "bn.js": "^4.1.0",
-        "elliptic": "^6.5.3"
-      }
-    },
-    "node_modules/create-ecdh/node_modules/bn.js": {
-      "version": "4.12.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/create-hash": {
-      "version": "1.2.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "cipher-base": "^1.0.1",
-        "inherits": "^2.0.1",
-        "md5.js": "^1.3.4",
-        "ripemd160": "^2.0.1",
-        "sha.js": "^2.4.0"
-      }
-    },
-    "node_modules/create-hmac": {
-      "version": "1.1.7",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "cipher-base": "^1.0.3",
-        "create-hash": "^1.1.0",
-        "inherits": "^2.0.1",
-        "ripemd160": "^2.0.0",
-        "safe-buffer": "^5.0.1",
-        "sha.js": "^2.4.8"
-      }
-    },
-    "node_modules/cross-spawn": {
-      "version": "7.0.3",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "path-key": "^3.1.0",
-        "shebang-command": "^2.0.0",
-        "which": "^2.0.1"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/crypto-browserify": {
-      "version": "3.12.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "browserify-cipher": "^1.0.0",
-        "browserify-sign": "^4.0.0",
-        "create-ecdh": "^4.0.0",
-        "create-hash": "^1.1.0",
-        "create-hmac": "^1.1.0",
-        "diffie-hellman": "^5.0.0",
-        "inherits": "^2.0.1",
-        "pbkdf2": "^3.0.3",
-        "public-encrypt": "^4.0.0",
-        "randombytes": "^2.0.0",
-        "randomfill": "^1.0.3"
-      },
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/cssauron": {
-      "version": "1.4.0",
-      "license": "MIT",
-      "dependencies": {
-        "through": "X.X.X"
-      }
-    },
-    "node_modules/custom-event": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/cyclist": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/d": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "es5-ext": "^0.10.50",
-        "type": "^1.0.1"
-      }
-    },
-    "node_modules/date-format": {
-      "version": "4.0.3",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=4.0"
-      }
-    },
-    "node_modules/debug": {
-      "version": "4.3.3",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ms": "2.1.2"
-      },
-      "engines": {
-        "node": ">=6.0"
-      },
-      "peerDependenciesMeta": {
-        "supports-color": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/decamelize": {
-      "version": "1.2.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/decode-uri-component": {
-      "version": "0.2.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10"
-      }
-    },
-    "node_modules/deep-is": {
-      "version": "0.1.4",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/default-compare": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "kind-of": "^5.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/default-resolution": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/define-properties": {
-      "version": "1.1.3",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "object-keys": "^1.0.12"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/define-property": {
-      "version": "2.0.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-descriptor": "^1.0.2",
-        "isobject": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/depd": {
-      "version": "1.1.2",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/des.js": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "inherits": "^2.0.1",
-        "minimalistic-assert": "^1.0.0"
-      }
-    },
-    "node_modules/detect-file": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/di": {
-      "version": "0.0.1",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/diffie-hellman": {
-      "version": "5.0.3",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "bn.js": "^4.1.0",
-        "miller-rabin": "^4.0.0",
-        "randombytes": "^2.0.0"
-      }
-    },
-    "node_modules/diffie-hellman/node_modules/bn.js": {
-      "version": "4.12.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/doctrine": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "Apache-2.0",
-      "dependencies": {
-        "esutils": "^2.0.2"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/dom-serialize": {
-      "version": "2.2.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "custom-event": "~1.0.0",
-        "ent": "~2.2.0",
-        "extend": "^3.0.0",
-        "void-elements": "^2.0.0"
-      }
-    },
-    "node_modules/domain-browser": {
-      "version": "1.2.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.4",
-        "npm": ">=1.2"
-      }
-    },
-    "node_modules/duplexify": {
-      "version": "3.7.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "end-of-stream": "^1.0.0",
-        "inherits": "^2.0.1",
-        "readable-stream": "^2.0.0",
-        "stream-shift": "^1.0.0"
-      }
-    },
-    "node_modules/each-props": {
-      "version": "1.3.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-plain-object": "^2.0.1",
-        "object.defaults": "^1.1.0"
-      }
-    },
-    "node_modules/each-props/node_modules/is-plain-object": {
-      "version": "2.0.4",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "isobject": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/ee-first": {
-      "version": "1.1.1",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/electron-to-chromium": {
-      "version": "1.4.71",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/elliptic": {
-      "version": "6.5.4",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "bn.js": "^4.11.9",
-        "brorand": "^1.1.0",
-        "hash.js": "^1.0.0",
-        "hmac-drbg": "^1.0.1",
-        "inherits": "^2.0.4",
-        "minimalistic-assert": "^1.0.1",
-        "minimalistic-crypto-utils": "^1.0.1"
-      }
-    },
-    "node_modules/elliptic/node_modules/bn.js": {
-      "version": "4.12.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/emoji-regex": {
-      "version": "8.0.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/emojis-list": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 4"
-      }
-    },
-    "node_modules/encodeurl": {
-      "version": "1.0.2",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/end-of-stream": {
-      "version": "1.4.4",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "once": "^1.4.0"
-      }
-    },
-    "node_modules/engine.io": {
-      "version": "6.1.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@types/cookie": "^0.4.1",
-        "@types/cors": "^2.8.12",
-        "@types/node": ">=10.0.0",
-        "accepts": "~1.3.4",
-        "base64id": "2.0.0",
-        "cookie": "~0.4.1",
-        "cors": "~2.8.5",
-        "debug": "~4.3.1",
-        "engine.io-parser": "~5.0.0",
-        "ws": "~8.2.3"
-      },
-      "engines": {
-        "node": ">=10.0.0"
-      }
-    },
-    "node_modules/engine.io-parser": {
-      "version": "5.0.3",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@socket.io/base64-arraybuffer": "~1.0.2"
-      },
-      "engines": {
-        "node": ">=10.0.0"
-      }
-    },
-    "node_modules/enhanced-resolve": {
-      "version": "5.9.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "graceful-fs": "^4.2.4",
-        "tapable": "^2.2.0"
-      },
-      "engines": {
-        "node": ">=10.13.0"
-      }
-    },
-    "node_modules/enquirer": {
-      "version": "2.3.6",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-colors": "^4.1.1"
-      },
-      "engines": {
-        "node": ">=8.6"
-      }
-    },
-    "node_modules/ent": {
-      "version": "2.2.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/envinfo": {
-      "version": "7.8.1",
-      "dev": true,
-      "license": "MIT",
-      "bin": {
-        "envinfo": "dist/cli.js"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/errno": {
-      "version": "0.1.8",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "prr": "~1.0.1"
-      },
-      "bin": {
-        "errno": "cli.js"
-      }
-    },
-    "node_modules/error-ex": {
-      "version": "1.3.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-arrayish": "^0.2.1"
-      }
-    },
-    "node_modules/es-module-lexer": {
-      "version": "0.9.3",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/es5-ext": {
-      "version": "0.10.53",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "es6-iterator": "~2.0.3",
-        "es6-symbol": "~3.1.3",
-        "next-tick": "~1.0.0"
-      }
-    },
-    "node_modules/es6-iterator": {
-      "version": "2.0.3",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "d": "1",
-        "es5-ext": "^0.10.35",
-        "es6-symbol": "^3.1.1"
-      }
-    },
-    "node_modules/es6-symbol": {
-      "version": "3.1.3",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "d": "^1.0.1",
-        "ext": "^1.1.2"
-      }
-    },
-    "node_modules/es6-weak-map": {
-      "version": "2.0.3",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "d": "1",
-        "es5-ext": "^0.10.46",
-        "es6-iterator": "^2.0.3",
-        "es6-symbol": "^3.1.1"
-      }
-    },
-    "node_modules/escalade": {
-      "version": "3.1.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/escape-html": {
-      "version": "1.0.3",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/escape-string-regexp": {
-      "version": "4.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/eslint": {
-      "version": "7.32.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/code-frame": "7.12.11",
-        "@eslint/eslintrc": "^0.4.3",
-        "@humanwhocodes/config-array": "^0.5.0",
-        "ajv": "^6.10.0",
-        "chalk": "^4.0.0",
-        "cross-spawn": "^7.0.2",
-        "debug": "^4.0.1",
-        "doctrine": "^3.0.0",
-        "enquirer": "^2.3.5",
-        "escape-string-regexp": "^4.0.0",
-        "eslint-scope": "^5.1.1",
-        "eslint-utils": "^2.1.0",
-        "eslint-visitor-keys": "^2.0.0",
-        "espree": "^7.3.1",
-        "esquery": "^1.4.0",
-        "esutils": "^2.0.2",
-        "fast-deep-equal": "^3.1.3",
-        "file-entry-cache": "^6.0.1",
-        "functional-red-black-tree": "^1.0.1",
-        "glob-parent": "^5.1.2",
-        "globals": "^13.6.0",
-        "ignore": "^4.0.6",
-        "import-fresh": "^3.0.0",
-        "imurmurhash": "^0.1.4",
-        "is-glob": "^4.0.0",
-        "js-yaml": "^3.13.1",
-        "json-stable-stringify-without-jsonify": "^1.0.1",
-        "levn": "^0.4.1",
-        "lodash.merge": "^4.6.2",
-        "minimatch": "^3.0.4",
-        "natural-compare": "^1.4.0",
-        "optionator": "^0.9.1",
-        "progress": "^2.0.0",
-        "regexpp": "^3.1.0",
-        "semver": "^7.2.1",
-        "strip-ansi": "^6.0.0",
-        "strip-json-comments": "^3.1.0",
-        "table": "^6.0.9",
-        "text-table": "^0.2.0",
-        "v8-compile-cache": "^2.0.3"
-      },
-      "bin": {
-        "eslint": "bin/eslint.js"
-      },
-      "engines": {
-        "node": "^10.12.0 || >=12.0.0"
-      },
-      "funding": {
-        "url": "https://opencollective.com/eslint"
-      }
-    },
-    "node_modules/eslint-plugin-jasmine": {
-      "version": "4.1.3",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8",
-        "npm": ">=6"
-      }
-    },
-    "node_modules/eslint-scope": {
-      "version": "5.1.1",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "dependencies": {
-        "esrecurse": "^4.3.0",
-        "estraverse": "^4.1.1"
-      },
-      "engines": {
-        "node": ">=8.0.0"
-      }
-    },
-    "node_modules/eslint-utils": {
-      "version": "2.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "eslint-visitor-keys": "^1.1.0"
-      },
-      "engines": {
-        "node": ">=6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/mysticatea"
-      }
-    },
-    "node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
-      "version": "1.3.0",
-      "dev": true,
-      "license": "Apache-2.0",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/eslint-visitor-keys": {
-      "version": "2.1.0",
-      "dev": true,
-      "license": "Apache-2.0",
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/espree": {
-      "version": "7.3.1",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "dependencies": {
-        "acorn": "^7.4.0",
-        "acorn-jsx": "^5.3.1",
-        "eslint-visitor-keys": "^1.3.0"
-      },
-      "engines": {
-        "node": "^10.12.0 || >=12.0.0"
-      }
-    },
-    "node_modules/espree/node_modules/eslint-visitor-keys": {
-      "version": "1.3.0",
-      "dev": true,
-      "license": "Apache-2.0",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/esprima": {
-      "version": "4.0.1",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "bin": {
-        "esparse": "bin/esparse.js",
-        "esvalidate": "bin/esvalidate.js"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/esquery": {
-      "version": "1.4.0",
-      "dev": true,
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "estraverse": "^5.1.0"
-      },
-      "engines": {
-        "node": ">=0.10"
-      }
-    },
-    "node_modules/esquery/node_modules/estraverse": {
-      "version": "5.3.0",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "engines": {
-        "node": ">=4.0"
-      }
-    },
-    "node_modules/esrecurse": {
-      "version": "4.3.0",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "dependencies": {
-        "estraverse": "^5.2.0"
-      },
-      "engines": {
-        "node": ">=4.0"
-      }
-    },
-    "node_modules/esrecurse/node_modules/estraverse": {
-      "version": "5.3.0",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "engines": {
-        "node": ">=4.0"
-      }
-    },
-    "node_modules/estraverse": {
-      "version": "4.3.0",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "engines": {
-        "node": ">=4.0"
-      }
-    },
-    "node_modules/esutils": {
-      "version": "2.0.3",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/eventemitter3": {
-      "version": "4.0.7",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/events": {
-      "version": "3.3.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.8.x"
-      }
-    },
-    "node_modules/evp_bytestokey": {
-      "version": "1.0.3",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "md5.js": "^1.3.4",
-        "safe-buffer": "^5.1.1"
-      }
-    },
-    "node_modules/execa": {
-      "version": "5.1.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "cross-spawn": "^7.0.3",
-        "get-stream": "^6.0.0",
-        "human-signals": "^2.1.0",
-        "is-stream": "^2.0.0",
-        "merge-stream": "^2.0.0",
-        "npm-run-path": "^4.0.1",
-        "onetime": "^5.1.2",
-        "signal-exit": "^3.0.3",
-        "strip-final-newline": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sindresorhus/execa?sponsor=1"
-      }
-    },
-    "node_modules/expand-brackets": {
-      "version": "2.1.4",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "debug": "^2.3.3",
-        "define-property": "^0.2.5",
-        "extend-shallow": "^2.0.1",
-        "posix-character-classes": "^0.1.0",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/expand-brackets/node_modules/debug": {
-      "version": "2.6.9",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ms": "2.0.0"
-      }
-    },
-    "node_modules/expand-brackets/node_modules/define-property": {
-      "version": "0.2.5",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-descriptor": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/expand-brackets/node_modules/is-accessor-descriptor": {
-      "version": "0.1.6",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "kind-of": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": {
-      "version": "3.2.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/expand-brackets/node_modules/is-data-descriptor": {
-      "version": "0.1.4",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "kind-of": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": {
-      "version": "3.2.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/expand-brackets/node_modules/is-descriptor": {
-      "version": "0.1.6",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-accessor-descriptor": "^0.1.6",
-        "is-data-descriptor": "^0.1.4",
-        "kind-of": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/expand-brackets/node_modules/ms": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/expand-range": {
-      "version": "1.8.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "fill-range": "^2.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/expand-range/node_modules/fill-range": {
-      "version": "2.2.4",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-number": "^2.1.0",
-        "isobject": "^2.0.0",
-        "randomatic": "^3.0.0",
-        "repeat-element": "^1.1.2",
-        "repeat-string": "^1.5.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/expand-range/node_modules/is-number": {
-      "version": "2.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "kind-of": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/expand-range/node_modules/isobject": {
-      "version": "2.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "isarray": "1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/expand-range/node_modules/kind-of": {
-      "version": "3.2.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/expand-tilde": {
-      "version": "2.0.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "homedir-polyfill": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/ext": {
-      "version": "1.6.0",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "type": "^2.5.0"
-      }
-    },
-    "node_modules/ext/node_modules/type": {
-      "version": "2.6.0",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/extend": {
-      "version": "3.0.2",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/extend-shallow": {
-      "version": "2.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-extendable": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/external-editor": {
-      "version": "3.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "chardet": "^0.7.0",
-        "iconv-lite": "^0.4.24",
-        "tmp": "^0.0.33"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/external-editor/node_modules/tmp": {
-      "version": "0.0.33",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "os-tmpdir": "~1.0.2"
-      },
-      "engines": {
-        "node": ">=0.6.0"
-      }
-    },
-    "node_modules/extglob": {
-      "version": "2.0.4",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "array-unique": "^0.3.2",
-        "define-property": "^1.0.0",
-        "expand-brackets": "^2.1.4",
-        "extend-shallow": "^2.0.1",
-        "fragment-cache": "^0.2.1",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/extglob/node_modules/define-property": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-descriptor": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/fancy-log": {
-      "version": "1.3.3",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-gray": "^0.1.1",
-        "color-support": "^1.1.3",
-        "parse-node-version": "^1.0.0",
-        "time-stamp": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/fast-deep-equal": {
-      "version": "3.1.3",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/fast-json-stable-stringify": {
-      "version": "2.1.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/fast-levenshtein": {
-      "version": "2.0.6",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/fastest-levenshtein": {
-      "version": "1.0.12",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/figgy-pudding": {
-      "version": "3.5.2",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/figures": {
-      "version": "3.2.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "escape-string-regexp": "^1.0.5"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/figures/node_modules/escape-string-regexp": {
-      "version": "1.0.5",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.8.0"
-      }
-    },
-    "node_modules/file-entry-cache": {
-      "version": "6.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "flat-cache": "^3.0.4"
-      },
-      "engines": {
-        "node": "^10.12.0 || >=12.0.0"
-      }
-    },
-    "node_modules/file-uri-to-path": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "optional": true
-    },
-    "node_modules/filename-regex": {
-      "version": "2.0.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/fill-range": {
-      "version": "4.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "extend-shallow": "^2.0.1",
-        "is-number": "^3.0.0",
-        "repeat-string": "^1.6.1",
-        "to-regex-range": "^2.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/finalhandler": {
-      "version": "1.1.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "debug": "2.6.9",
-        "encodeurl": "~1.0.2",
-        "escape-html": "~1.0.3",
-        "on-finished": "~2.3.0",
-        "parseurl": "~1.3.3",
-        "statuses": "~1.5.0",
-        "unpipe": "~1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/finalhandler/node_modules/debug": {
-      "version": "2.6.9",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ms": "2.0.0"
-      }
-    },
-    "node_modules/finalhandler/node_modules/ms": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/find-cache-dir": {
-      "version": "2.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "commondir": "^1.0.1",
-        "make-dir": "^2.0.0",
-        "pkg-dir": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/find-cache-dir/node_modules/find-up": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "locate-path": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/find-cache-dir/node_modules/locate-path": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "p-locate": "^3.0.0",
-        "path-exists": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/find-cache-dir/node_modules/p-locate": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "p-limit": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/find-cache-dir/node_modules/path-exists": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/find-cache-dir/node_modules/pkg-dir": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "find-up": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/find-up": {
-      "version": "4.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "locate-path": "^5.0.0",
-        "path-exists": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/findup-sync": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "detect-file": "^1.0.0",
-        "is-glob": "^4.0.0",
-        "micromatch": "^3.0.4",
-        "resolve-dir": "^1.0.1"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/fined": {
-      "version": "1.2.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "expand-tilde": "^2.0.2",
-        "is-plain-object": "^2.0.3",
-        "object.defaults": "^1.1.0",
-        "object.pick": "^1.2.0",
-        "parse-filepath": "^1.0.1"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/fined/node_modules/is-plain-object": {
-      "version": "2.0.4",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "isobject": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/first-chunk-stream": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "readable-stream": "^2.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/flagged-respawn": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/flat-cache": {
-      "version": "3.0.4",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "flatted": "^3.1.0",
-        "rimraf": "^3.0.2"
-      },
-      "engines": {
-        "node": "^10.12.0 || >=12.0.0"
-      }
-    },
-    "node_modules/flatted": {
-      "version": "3.2.5",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/flush-write-stream": {
-      "version": "1.1.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "inherits": "^2.0.3",
-        "readable-stream": "^2.3.6"
-      }
-    },
-    "node_modules/follow-redirects": {
-      "version": "1.14.8",
-      "dev": true,
-      "funding": [
-        {
-          "type": "individual",
-          "url": "https://github.com/sponsors/RubenVerborgh"
-        }
-      ],
-      "license": "MIT",
-      "engines": {
-        "node": ">=4.0"
-      },
-      "peerDependenciesMeta": {
-        "debug": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/for-in": {
-      "version": "1.0.2",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/for-own": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "for-in": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/fragment-cache": {
-      "version": "0.2.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "map-cache": "^0.2.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/from2": {
-      "version": "2.3.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "inherits": "^2.0.1",
-        "readable-stream": "^2.0.0"
-      }
-    },
-    "node_modules/fs-extra": {
-      "version": "10.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "graceful-fs": "^4.2.0",
-        "jsonfile": "^6.0.1",
-        "universalify": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/fs-mkdirp-stream": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "graceful-fs": "^4.1.11",
-        "through2": "^2.0.3"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/fs-write-stream-atomic": {
-      "version": "1.0.10",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "graceful-fs": "^4.1.2",
-        "iferr": "^0.1.5",
-        "imurmurhash": "^0.1.4",
-        "readable-stream": "1 || 2"
-      }
-    },
-    "node_modules/fs.realpath": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/fsevents": {
-      "version": "1.2.13",
-      "dev": true,
-      "hasInstallScript": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "dependencies": {
-        "bindings": "^1.5.0",
-        "nan": "^2.12.1"
-      },
-      "engines": {
-        "node": ">= 4.0"
-      }
-    },
-    "node_modules/function-bind": {
-      "version": "1.1.1",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/functional-red-black-tree": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/get-caller-file": {
-      "version": "1.0.3",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/get-intrinsic": {
-      "version": "1.1.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "function-bind": "^1.1.1",
-        "has": "^1.0.3",
-        "has-symbols": "^1.0.1"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/get-stream": {
-      "version": "6.0.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/get-value": {
-      "version": "2.0.6",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/glob": {
-      "version": "7.2.0",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "fs.realpath": "^1.0.0",
-        "inflight": "^1.0.4",
-        "inherits": "2",
-        "minimatch": "^3.0.4",
-        "once": "^1.3.0",
-        "path-is-absolute": "^1.0.0"
-      },
-      "engines": {
-        "node": "*"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/glob-base": {
-      "version": "0.3.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "glob-parent": "^2.0.0",
-        "is-glob": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/glob-base/node_modules/glob-parent": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "is-glob": "^2.0.0"
-      }
-    },
-    "node_modules/glob-base/node_modules/is-extglob": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/glob-base/node_modules/is-glob": {
-      "version": "2.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-extglob": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/glob-parent": {
-      "version": "5.1.2",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "is-glob": "^4.0.1"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/glob-stream": {
-      "version": "6.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "extend": "^3.0.0",
-        "glob": "^7.1.1",
-        "glob-parent": "^3.1.0",
-        "is-negated-glob": "^1.0.0",
-        "ordered-read-streams": "^1.0.0",
-        "pumpify": "^1.3.5",
-        "readable-stream": "^2.1.5",
-        "remove-trailing-separator": "^1.0.1",
-        "to-absolute-glob": "^2.0.0",
-        "unique-stream": "^2.0.2"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/glob-stream/node_modules/glob-parent": {
-      "version": "3.1.0",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "is-glob": "^3.1.0",
-        "path-dirname": "^1.0.0"
-      }
-    },
-    "node_modules/glob-stream/node_modules/is-glob": {
-      "version": "3.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-extglob": "^2.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/glob-to-regexp": {
-      "version": "0.4.1",
-      "dev": true,
-      "license": "BSD-2-Clause"
-    },
-    "node_modules/glob-watcher": {
-      "version": "5.0.5",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "anymatch": "^2.0.0",
-        "async-done": "^1.2.0",
-        "chokidar": "^2.0.0",
-        "is-negated-glob": "^1.0.0",
-        "just-debounce": "^1.0.0",
-        "normalize-path": "^3.0.0",
-        "object.defaults": "^1.1.0"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/global-modules": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "global-prefix": "^1.0.1",
-        "is-windows": "^1.0.1",
-        "resolve-dir": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/global-prefix": {
-      "version": "1.0.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "expand-tilde": "^2.0.2",
-        "homedir-polyfill": "^1.0.1",
-        "ini": "^1.3.4",
-        "is-windows": "^1.0.1",
-        "which": "^1.2.14"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/global-prefix/node_modules/which": {
-      "version": "1.3.1",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "isexe": "^2.0.0"
-      },
-      "bin": {
-        "which": "bin/which"
-      }
-    },
-    "node_modules/globals": {
-      "version": "13.12.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "type-fest": "^0.20.2"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/glogg": {
-      "version": "1.0.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "sparkles": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/graceful-fs": {
-      "version": "4.2.9",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/gulp": {
-      "version": "4.0.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "glob-watcher": "^5.0.3",
-        "gulp-cli": "^2.2.0",
-        "undertaker": "^1.2.1",
-        "vinyl-fs": "^3.0.0"
-      },
-      "bin": {
-        "gulp": "bin/gulp.js"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/gulp-cli": {
-      "version": "2.3.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-colors": "^1.0.1",
-        "archy": "^1.0.0",
-        "array-sort": "^1.0.0",
-        "color-support": "^1.1.3",
-        "concat-stream": "^1.6.0",
-        "copy-props": "^2.0.1",
-        "fancy-log": "^1.3.2",
-        "gulplog": "^1.0.0",
-        "interpret": "^1.4.0",
-        "isobject": "^3.0.1",
-        "liftoff": "^3.1.0",
-        "matchdep": "^2.0.0",
-        "mute-stdout": "^1.0.0",
-        "pretty-hrtime": "^1.0.0",
-        "replace-homedir": "^1.0.0",
-        "semver-greatest-satisfied-range": "^1.1.0",
-        "v8flags": "^3.2.0",
-        "yargs": "^7.1.0"
-      },
-      "bin": {
-        "gulp": "bin/gulp.js"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/gulp-cli/node_modules/ansi-colors": {
-      "version": "1.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-wrap": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/gulp-concat": {
-      "version": "2.6.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "concat-with-sourcemaps": "^1.0.0",
-        "through2": "^2.0.0",
-        "vinyl": "^2.0.0"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/gulp-eslint": {
-      "version": "6.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "eslint": "^6.0.0",
-        "fancy-log": "^1.3.2",
-        "plugin-error": "^1.0.1"
-      }
-    },
-    "node_modules/gulp-eslint/node_modules/ansi-regex": {
-      "version": "4.1.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/gulp-eslint/node_modules/ansi-styles": {
-      "version": "3.2.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "color-convert": "^1.9.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/gulp-eslint/node_modules/astral-regex": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/gulp-eslint/node_modules/chalk": {
-      "version": "2.4.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-styles": "^3.2.1",
-        "escape-string-regexp": "^1.0.5",
-        "supports-color": "^5.3.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/gulp-eslint/node_modules/color-convert": {
-      "version": "1.9.3",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "color-name": "1.1.3"
-      }
-    },
-    "node_modules/gulp-eslint/node_modules/color-name": {
-      "version": "1.1.3",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/gulp-eslint/node_modules/cross-spawn": {
-      "version": "6.0.5",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "nice-try": "^1.0.4",
-        "path-key": "^2.0.1",
-        "semver": "^5.5.0",
-        "shebang-command": "^1.2.0",
-        "which": "^1.2.9"
-      },
-      "engines": {
-        "node": ">=4.8"
-      }
-    },
-    "node_modules/gulp-eslint/node_modules/cross-spawn/node_modules/semver": {
-      "version": "5.7.1",
-      "dev": true,
-      "license": "ISC",
-      "bin": {
-        "semver": "bin/semver"
-      }
-    },
-    "node_modules/gulp-eslint/node_modules/emoji-regex": {
-      "version": "7.0.3",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/gulp-eslint/node_modules/escape-string-regexp": {
-      "version": "1.0.5",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.8.0"
-      }
-    },
-    "node_modules/gulp-eslint/node_modules/eslint": {
-      "version": "6.8.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/code-frame": "^7.0.0",
-        "ajv": "^6.10.0",
-        "chalk": "^2.1.0",
-        "cross-spawn": "^6.0.5",
-        "debug": "^4.0.1",
-        "doctrine": "^3.0.0",
-        "eslint-scope": "^5.0.0",
-        "eslint-utils": "^1.4.3",
-        "eslint-visitor-keys": "^1.1.0",
-        "espree": "^6.1.2",
-        "esquery": "^1.0.1",
-        "esutils": "^2.0.2",
-        "file-entry-cache": "^5.0.1",
-        "functional-red-black-tree": "^1.0.1",
-        "glob-parent": "^5.0.0",
-        "globals": "^12.1.0",
-        "ignore": "^4.0.6",
-        "import-fresh": "^3.0.0",
-        "imurmurhash": "^0.1.4",
-        "inquirer": "^7.0.0",
-        "is-glob": "^4.0.0",
-        "js-yaml": "^3.13.1",
-        "json-stable-stringify-without-jsonify": "^1.0.1",
-        "levn": "^0.3.0",
-        "lodash": "^4.17.14",
-        "minimatch": "^3.0.4",
-        "mkdirp": "^0.5.1",
-        "natural-compare": "^1.4.0",
-        "optionator": "^0.8.3",
-        "progress": "^2.0.0",
-        "regexpp": "^2.0.1",
-        "semver": "^6.1.2",
-        "strip-ansi": "^5.2.0",
-        "strip-json-comments": "^3.0.1",
-        "table": "^5.2.3",
-        "text-table": "^0.2.0",
-        "v8-compile-cache": "^2.0.3"
-      },
-      "bin": {
-        "eslint": "bin/eslint.js"
-      },
-      "engines": {
-        "node": "^8.10.0 || ^10.13.0 || >=11.10.1"
-      },
-      "funding": {
-        "url": "https://opencollective.com/eslint"
-      }
-    },
-    "node_modules/gulp-eslint/node_modules/eslint-utils": {
-      "version": "1.4.3",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "eslint-visitor-keys": "^1.1.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/gulp-eslint/node_modules/eslint-visitor-keys": {
-      "version": "1.3.0",
-      "dev": true,
-      "license": "Apache-2.0",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/gulp-eslint/node_modules/espree": {
-      "version": "6.2.1",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "dependencies": {
-        "acorn": "^7.1.1",
-        "acorn-jsx": "^5.2.0",
-        "eslint-visitor-keys": "^1.1.0"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/gulp-eslint/node_modules/file-entry-cache": {
-      "version": "5.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "flat-cache": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/gulp-eslint/node_modules/flat-cache": {
-      "version": "2.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "flatted": "^2.0.0",
-        "rimraf": "2.6.3",
-        "write": "1.0.3"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/gulp-eslint/node_modules/flatted": {
-      "version": "2.0.2",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/gulp-eslint/node_modules/globals": {
-      "version": "12.4.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "type-fest": "^0.8.1"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/gulp-eslint/node_modules/has-flag": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/gulp-eslint/node_modules/is-fullwidth-code-point": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/gulp-eslint/node_modules/levn": {
-      "version": "0.3.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "prelude-ls": "~1.1.2",
-        "type-check": "~0.3.2"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/gulp-eslint/node_modules/optionator": {
-      "version": "0.8.3",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "deep-is": "~0.1.3",
-        "fast-levenshtein": "~2.0.6",
-        "levn": "~0.3.0",
-        "prelude-ls": "~1.1.2",
-        "type-check": "~0.3.2",
-        "word-wrap": "~1.2.3"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/gulp-eslint/node_modules/path-key": {
-      "version": "2.0.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/gulp-eslint/node_modules/prelude-ls": {
-      "version": "1.1.2",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/gulp-eslint/node_modules/regexpp": {
-      "version": "2.0.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6.5.0"
-      }
-    },
-    "node_modules/gulp-eslint/node_modules/rimraf": {
-      "version": "2.6.3",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "glob": "^7.1.3"
-      },
-      "bin": {
-        "rimraf": "bin.js"
-      }
-    },
-    "node_modules/gulp-eslint/node_modules/semver": {
-      "version": "6.3.0",
-      "dev": true,
-      "license": "ISC",
-      "bin": {
-        "semver": "bin/semver.js"
-      }
-    },
-    "node_modules/gulp-eslint/node_modules/shebang-command": {
-      "version": "1.2.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "shebang-regex": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/gulp-eslint/node_modules/shebang-regex": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/gulp-eslint/node_modules/slice-ansi": {
-      "version": "2.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-styles": "^3.2.0",
-        "astral-regex": "^1.0.0",
-        "is-fullwidth-code-point": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/gulp-eslint/node_modules/string-width": {
-      "version": "3.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "emoji-regex": "^7.0.1",
-        "is-fullwidth-code-point": "^2.0.0",
-        "strip-ansi": "^5.1.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/gulp-eslint/node_modules/strip-ansi": {
-      "version": "5.2.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-regex": "^4.1.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/gulp-eslint/node_modules/supports-color": {
-      "version": "5.5.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/gulp-eslint/node_modules/table": {
-      "version": "5.4.6",
-      "dev": true,
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "ajv": "^6.10.2",
-        "lodash": "^4.17.14",
-        "slice-ansi": "^2.1.0",
-        "string-width": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/gulp-eslint/node_modules/type-check": {
-      "version": "0.3.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "prelude-ls": "~1.1.2"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/gulp-eslint/node_modules/type-fest": {
-      "version": "0.8.1",
-      "dev": true,
-      "license": "(MIT OR CC0-1.0)",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/gulp-eslint/node_modules/which": {
-      "version": "1.3.1",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "isexe": "^2.0.0"
-      },
-      "bin": {
-        "which": "bin/which"
-      }
-    },
-    "node_modules/gulp-jsify": {
-      "resolved": "vendor/gulp-jsify",
-      "link": true
-    },
-    "node_modules/gulp-rename": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/gulp-shell": {
-      "version": "0.8.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "chalk": "^3.0.0",
-        "fancy-log": "^1.3.3",
-        "lodash.template": "^4.5.0",
-        "plugin-error": "^1.0.1",
-        "through2": "^3.0.1",
-        "tslib": "^1.10.0"
-      },
-      "engines": {
-        "node": ">=10.0.0"
-      }
-    },
-    "node_modules/gulp-shell/node_modules/chalk": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/gulp-shell/node_modules/through2": {
-      "version": "3.0.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "inherits": "^2.0.4",
-        "readable-stream": "2 || 3"
-      }
-    },
-    "node_modules/gulp-watch": {
-      "version": "5.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-colors": "1.1.0",
-        "anymatch": "^1.3.0",
-        "chokidar": "^2.0.0",
-        "fancy-log": "1.3.2",
-        "glob-parent": "^3.0.1",
-        "object-assign": "^4.1.0",
-        "path-is-absolute": "^1.0.1",
-        "plugin-error": "1.0.1",
-        "readable-stream": "^2.2.2",
-        "slash": "^1.0.0",
-        "vinyl": "^2.1.0",
-        "vinyl-file": "^2.0.0"
-      }
-    },
-    "node_modules/gulp-watch/node_modules/ansi-colors": {
-      "version": "1.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-wrap": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/gulp-watch/node_modules/anymatch": {
-      "version": "1.3.2",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "micromatch": "^2.1.5",
-        "normalize-path": "^2.0.0"
-      }
-    },
-    "node_modules/gulp-watch/node_modules/arr-diff": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "arr-flatten": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/gulp-watch/node_modules/array-unique": {
-      "version": "0.2.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/gulp-watch/node_modules/braces": {
-      "version": "1.8.5",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "expand-range": "^1.8.1",
-        "preserve": "^0.2.0",
-        "repeat-element": "^1.1.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/gulp-watch/node_modules/expand-brackets": {
-      "version": "0.1.5",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-posix-bracket": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/gulp-watch/node_modules/extglob": {
-      "version": "0.3.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-extglob": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/gulp-watch/node_modules/extglob/node_modules/is-extglob": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/gulp-watch/node_modules/fancy-log": {
-      "version": "1.3.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-gray": "^0.1.1",
-        "color-support": "^1.1.3",
-        "time-stamp": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/gulp-watch/node_modules/glob-parent": {
-      "version": "3.1.0",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "is-glob": "^3.1.0",
-        "path-dirname": "^1.0.0"
-      }
-    },
-    "node_modules/gulp-watch/node_modules/is-glob": {
-      "version": "3.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-extglob": "^2.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/gulp-watch/node_modules/kind-of": {
-      "version": "3.2.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/gulp-watch/node_modules/micromatch": {
-      "version": "2.3.11",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "arr-diff": "^2.0.0",
-        "array-unique": "^0.2.1",
-        "braces": "^1.8.2",
-        "expand-brackets": "^0.1.4",
-        "extglob": "^0.3.1",
-        "filename-regex": "^2.0.0",
-        "is-extglob": "^1.0.0",
-        "is-glob": "^2.0.1",
-        "kind-of": "^3.0.2",
-        "normalize-path": "^2.0.1",
-        "object.omit": "^2.0.0",
-        "parse-glob": "^3.0.4",
-        "regex-cache": "^0.4.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/gulp-watch/node_modules/micromatch/node_modules/is-extglob": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/gulp-watch/node_modules/micromatch/node_modules/is-glob": {
-      "version": "2.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-extglob": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/gulp-watch/node_modules/normalize-path": {
-      "version": "2.1.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "remove-trailing-separator": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/gulplog": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "glogg": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/has": {
-      "version": "1.0.3",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "function-bind": "^1.1.1"
-      },
-      "engines": {
-        "node": ">= 0.4.0"
-      }
-    },
-    "node_modules/has-flag": {
-      "version": "4.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/has-symbols": {
-      "version": "1.0.2",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/has-value": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "get-value": "^2.0.6",
-        "has-values": "^1.0.0",
-        "isobject": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/has-values": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-number": "^3.0.0",
-        "kind-of": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/has-values/node_modules/kind-of": {
-      "version": "4.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/hash-base": {
-      "version": "3.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "inherits": "^2.0.4",
-        "readable-stream": "^3.6.0",
-        "safe-buffer": "^5.2.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/hash-base/node_modules/readable-stream": {
-      "version": "3.6.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "inherits": "^2.0.3",
-        "string_decoder": "^1.1.1",
-        "util-deprecate": "^1.0.1"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/hash-base/node_modules/safe-buffer": {
-      "version": "5.2.1",
-      "dev": true,
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ],
-      "license": "MIT"
-    },
-    "node_modules/hash.js": {
-      "version": "1.1.7",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "inherits": "^2.0.3",
-        "minimalistic-assert": "^1.0.1"
-      }
-    },
-    "node_modules/hmac-drbg": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "hash.js": "^1.0.3",
-        "minimalistic-assert": "^1.0.0",
-        "minimalistic-crypto-utils": "^1.0.1"
-      }
-    },
-    "node_modules/homedir-polyfill": {
-      "version": "1.0.3",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "parse-passwd": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/hosted-git-info": {
-      "version": "2.8.9",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/http-errors": {
-      "version": "1.8.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "depd": "~1.1.2",
-        "inherits": "2.0.4",
-        "setprototypeof": "1.2.0",
-        "statuses": ">= 1.5.0 < 2",
-        "toidentifier": "1.0.1"
-      },
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/http-proxy": {
-      "version": "1.18.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "eventemitter3": "^4.0.0",
-        "follow-redirects": "^1.0.0",
-        "requires-port": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=8.0.0"
-      }
-    },
-    "node_modules/https-browserify": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/human-signals": {
-      "version": "2.1.0",
-      "dev": true,
-      "license": "Apache-2.0",
-      "engines": {
-        "node": ">=10.17.0"
-      }
-    },
-    "node_modules/iconv-lite": {
-      "version": "0.4.24",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "safer-buffer": ">= 2.1.2 < 3"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/ieee754": {
-      "version": "1.2.1",
-      "dev": true,
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ],
-      "license": "BSD-3-Clause"
-    },
-    "node_modules/iferr": {
-      "version": "0.1.5",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/ignore": {
-      "version": "4.0.6",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 4"
-      }
-    },
-    "node_modules/import-fresh": {
-      "version": "3.3.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "parent-module": "^1.0.0",
-        "resolve-from": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/import-local": {
-      "version": "3.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "pkg-dir": "^4.2.0",
-        "resolve-cwd": "^3.0.0"
-      },
-      "bin": {
-        "import-local-fixture": "fixtures/cli.js"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/imurmurhash": {
-      "version": "0.1.4",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.8.19"
-      }
-    },
-    "node_modules/infer-owner": {
-      "version": "1.0.4",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/inflight": {
-      "version": "1.0.6",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "once": "^1.3.0",
-        "wrappy": "1"
-      }
-    },
-    "node_modules/inherits": {
-      "version": "2.0.4",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/ini": {
-      "version": "1.3.8",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/inquirer": {
-      "version": "7.3.3",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-escapes": "^4.2.1",
-        "chalk": "^4.1.0",
-        "cli-cursor": "^3.1.0",
-        "cli-width": "^3.0.0",
-        "external-editor": "^3.0.3",
-        "figures": "^3.0.0",
-        "lodash": "^4.17.19",
-        "mute-stream": "0.0.8",
-        "run-async": "^2.4.0",
-        "rxjs": "^6.6.0",
-        "string-width": "^4.1.0",
-        "strip-ansi": "^6.0.0",
-        "through": "^2.3.6"
-      },
-      "engines": {
-        "node": ">=8.0.0"
-      }
-    },
-    "node_modules/interpret": {
-      "version": "1.4.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/invert-kv": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-absolute": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-relative": "^1.0.0",
-        "is-windows": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-accessor-descriptor": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "kind-of": "^6.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-accessor-descriptor/node_modules/kind-of": {
-      "version": "6.0.3",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-arrayish": {
-      "version": "0.2.1",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/is-binary-path": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "binary-extensions": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-buffer": {
-      "version": "1.1.6",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/is-core-module": {
-      "version": "2.8.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "has": "^1.0.3"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-data-descriptor": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "kind-of": "^6.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-data-descriptor/node_modules/kind-of": {
-      "version": "6.0.3",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-descriptor": {
-      "version": "1.0.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-accessor-descriptor": "^1.0.0",
-        "is-data-descriptor": "^1.0.0",
-        "kind-of": "^6.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-descriptor/node_modules/kind-of": {
-      "version": "6.0.3",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-dotfile": {
-      "version": "1.0.3",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-equal-shallow": {
-      "version": "0.1.3",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-primitive": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-extendable": {
-      "version": "0.1.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-extglob": {
-      "version": "2.1.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-fullwidth-code-point": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/is-glob": {
-      "version": "4.0.3",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-extglob": "^2.1.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-negated-glob": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-number": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "kind-of": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-number/node_modules/kind-of": {
-      "version": "3.2.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-plain-object": {
-      "version": "5.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-posix-bracket": {
-      "version": "0.1.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-primitive": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-relative": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-unc-path": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-stream": {
-      "version": "2.0.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/is-unc-path": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "unc-path-regex": "^0.1.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-utf8": {
-      "version": "0.2.1",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/is-valid-glob": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-windows": {
-      "version": "1.0.2",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-wsl": {
-      "version": "1.1.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/isarray": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/isbinaryfile": {
-      "version": "4.0.8",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 8.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/gjtorikian/"
-      }
-    },
-    "node_modules/isexe": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/isobject": {
-      "version": "3.0.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/jasmine-core": {
-      "version": "3.99.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/jest-worker": {
-      "version": "27.5.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@types/node": "*",
-        "merge-stream": "^2.0.0",
-        "supports-color": "^8.0.0"
-      },
-      "engines": {
-        "node": ">= 10.13.0"
-      }
-    },
-    "node_modules/jest-worker/node_modules/supports-color": {
-      "version": "8.1.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "has-flag": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/supports-color?sponsor=1"
-      }
-    },
-    "node_modules/js-tokens": {
-      "version": "4.0.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/js-yaml": {
-      "version": "3.14.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "argparse": "^1.0.7",
-        "esprima": "^4.0.0"
-      },
-      "bin": {
-        "js-yaml": "bin/js-yaml.js"
-      }
-    },
-    "node_modules/json-parse-better-errors": {
-      "version": "1.0.2",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/json-schema-traverse": {
-      "version": "0.4.1",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/json-stable-stringify-without-jsonify": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/json5": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "minimist": "^1.2.0"
-      },
-      "bin": {
-        "json5": "lib/cli.js"
-      }
-    },
-    "node_modules/jsonfile": {
-      "version": "6.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "universalify": "^2.0.0"
-      },
-      "optionalDependencies": {
-        "graceful-fs": "^4.1.6"
-      }
-    },
-    "node_modules/just-debounce": {
-      "version": "1.1.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/karma": {
-      "version": "6.3.16",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "body-parser": "^1.19.0",
-        "braces": "^3.0.2",
-        "chokidar": "^3.5.1",
-        "colors": "1.4.0",
-        "connect": "^3.7.0",
-        "di": "^0.0.1",
-        "dom-serialize": "^2.2.1",
-        "glob": "^7.1.7",
-        "graceful-fs": "^4.2.6",
-        "http-proxy": "^1.18.1",
-        "isbinaryfile": "^4.0.8",
-        "lodash": "^4.17.21",
-        "log4js": "^6.4.1",
-        "mime": "^2.5.2",
-        "minimatch": "^3.0.4",
-        "mkdirp": "^0.5.5",
-        "qjobs": "^1.2.0",
-        "range-parser": "^1.2.1",
-        "rimraf": "^3.0.2",
-        "socket.io": "^4.2.0",
-        "source-map": "^0.6.1",
-        "tmp": "^0.2.1",
-        "ua-parser-js": "^0.7.30",
-        "yargs": "^16.1.1"
-      },
-      "bin": {
-        "karma": "bin/karma"
-      },
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/karma-chrome-launcher": {
-      "version": "3.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "which": "^1.2.1"
-      }
-    },
-    "node_modules/karma-chrome-launcher/node_modules/which": {
-      "version": "1.3.1",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "isexe": "^2.0.0"
-      },
-      "bin": {
-        "which": "bin/which"
-      }
-    },
-    "node_modules/karma-jasmine": {
-      "version": "4.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "jasmine-core": "^3.6.0"
-      },
-      "engines": {
-        "node": ">= 10"
-      },
-      "peerDependencies": {
-        "karma": "*"
-      }
-    },
-    "node_modules/karma/node_modules/anymatch": {
-      "version": "3.1.2",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "normalize-path": "^3.0.0",
-        "picomatch": "^2.0.4"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/karma/node_modules/binary-extensions": {
-      "version": "2.2.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/karma/node_modules/braces": {
-      "version": "3.0.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "fill-range": "^7.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/karma/node_modules/chokidar": {
-      "version": "3.5.3",
-      "dev": true,
-      "funding": [
-        {
-          "type": "individual",
-          "url": "https://paulmillr.com/funding/"
-        }
-      ],
-      "license": "MIT",
-      "dependencies": {
-        "anymatch": "~3.1.2",
-        "braces": "~3.0.2",
-        "glob-parent": "~5.1.2",
-        "is-binary-path": "~2.1.0",
-        "is-glob": "~4.0.1",
-        "normalize-path": "~3.0.0",
-        "readdirp": "~3.6.0"
-      },
-      "engines": {
-        "node": ">= 8.10.0"
-      },
-      "optionalDependencies": {
-        "fsevents": "~2.3.2"
-      }
-    },
-    "node_modules/karma/node_modules/cliui": {
-      "version": "7.0.4",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "string-width": "^4.2.0",
-        "strip-ansi": "^6.0.0",
-        "wrap-ansi": "^7.0.0"
-      }
-    },
-    "node_modules/karma/node_modules/fill-range": {
-      "version": "7.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "to-regex-range": "^5.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/karma/node_modules/fsevents": {
-      "version": "2.3.2",
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
-      }
-    },
-    "node_modules/karma/node_modules/get-caller-file": {
-      "version": "2.0.5",
-      "dev": true,
-      "license": "ISC",
-      "engines": {
-        "node": "6.* || 8.* || >= 10.*"
-      }
-    },
-    "node_modules/karma/node_modules/is-binary-path": {
-      "version": "2.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "binary-extensions": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/karma/node_modules/is-number": {
-      "version": "7.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.12.0"
-      }
-    },
-    "node_modules/karma/node_modules/readdirp": {
-      "version": "3.6.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "picomatch": "^2.2.1"
-      },
-      "engines": {
-        "node": ">=8.10.0"
-      }
-    },
-    "node_modules/karma/node_modules/to-regex-range": {
-      "version": "5.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-number": "^7.0.0"
-      },
-      "engines": {
-        "node": ">=8.0"
-      }
-    },
-    "node_modules/karma/node_modules/wrap-ansi": {
-      "version": "7.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-styles": "^4.0.0",
-        "string-width": "^4.1.0",
-        "strip-ansi": "^6.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
-      }
-    },
-    "node_modules/karma/node_modules/y18n": {
-      "version": "5.0.8",
-      "dev": true,
-      "license": "ISC",
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/karma/node_modules/yargs": {
-      "version": "16.2.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "cliui": "^7.0.2",
-        "escalade": "^3.1.1",
-        "get-caller-file": "^2.0.5",
-        "require-directory": "^2.1.1",
-        "string-width": "^4.2.0",
-        "y18n": "^5.0.5",
-        "yargs-parser": "^20.2.2"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/karma/node_modules/yargs-parser": {
-      "version": "20.2.9",
-      "dev": true,
-      "license": "ISC",
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/kind-of": {
-      "version": "5.1.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/last-run": {
-      "version": "1.1.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "default-resolution": "^2.0.0",
-        "es6-weak-map": "^2.0.1"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/lazystream": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "readable-stream": "^2.0.5"
-      },
-      "engines": {
-        "node": ">= 0.6.3"
-      }
-    },
-    "node_modules/lcid": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "invert-kv": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/lead": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "flush-write-stream": "^1.0.2"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/levn": {
-      "version": "0.4.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "prelude-ls": "^1.2.1",
-        "type-check": "~0.4.0"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/liftoff": {
-      "version": "3.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "extend": "^3.0.0",
-        "findup-sync": "^3.0.0",
-        "fined": "^1.0.1",
-        "flagged-respawn": "^1.0.0",
-        "is-plain-object": "^2.0.4",
-        "object.map": "^1.0.0",
-        "rechoir": "^0.6.2",
-        "resolve": "^1.1.7"
-      },
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/liftoff/node_modules/is-plain-object": {
-      "version": "2.0.4",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "isobject": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/load-json-file": {
-      "version": "1.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "graceful-fs": "^4.1.2",
-        "parse-json": "^2.2.0",
-        "pify": "^2.0.0",
-        "pinkie-promise": "^2.0.0",
-        "strip-bom": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/loader-runner": {
-      "version": "4.2.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6.11.5"
-      }
-    },
-    "node_modules/loader-utils": {
-      "version": "1.4.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "big.js": "^5.2.2",
-        "emojis-list": "^3.0.0",
-        "json5": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=4.0.0"
-      }
-    },
-    "node_modules/locate-path": {
-      "version": "5.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "p-locate": "^4.1.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/lodash": {
-      "version": "4.17.21",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/lodash._reinterpolate": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/lodash.clone": {
-      "version": "4.5.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/lodash.merge": {
-      "version": "4.6.2",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/lodash.some": {
-      "version": "4.6.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/lodash.template": {
-      "version": "4.5.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "lodash._reinterpolate": "^3.0.0",
-        "lodash.templatesettings": "^4.0.0"
-      }
-    },
-    "node_modules/lodash.templatesettings": {
-      "version": "4.2.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "lodash._reinterpolate": "^3.0.0"
-      }
-    },
-    "node_modules/lodash.truncate": {
-      "version": "4.4.2",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/log4js": {
-      "version": "6.4.1",
-      "dev": true,
-      "license": "Apache-2.0",
-      "dependencies": {
-        "date-format": "^4.0.3",
-        "debug": "^4.3.3",
-        "flatted": "^3.2.4",
-        "rfdc": "^1.3.0",
-        "streamroller": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=8.0"
-      }
-    },
-    "node_modules/lru-cache": {
-      "version": "6.0.0",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/make-dir": {
-      "version": "2.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "pify": "^4.0.1",
-        "semver": "^5.6.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/make-dir/node_modules/pify": {
-      "version": "4.0.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/make-dir/node_modules/semver": {
-      "version": "5.7.1",
-      "dev": true,
-      "license": "ISC",
-      "bin": {
-        "semver": "bin/semver"
-      }
-    },
-    "node_modules/make-iterator": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "kind-of": "^6.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/make-iterator/node_modules/kind-of": {
-      "version": "6.0.3",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/map-cache": {
-      "version": "0.2.2",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/map-visit": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "object-visit": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/matchdep": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "findup-sync": "^2.0.0",
-        "micromatch": "^3.0.4",
-        "resolve": "^1.4.0",
-        "stack-trace": "0.0.10"
-      },
-      "engines": {
-        "node": ">= 0.10.0"
-      }
-    },
-    "node_modules/matchdep/node_modules/findup-sync": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "detect-file": "^1.0.0",
-        "is-glob": "^3.1.0",
-        "micromatch": "^3.0.4",
-        "resolve-dir": "^1.0.1"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/matchdep/node_modules/is-glob": {
-      "version": "3.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-extglob": "^2.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/math-random": {
-      "version": "1.0.4",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/md5.js": {
-      "version": "1.3.5",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "hash-base": "^3.0.0",
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.1.2"
-      }
-    },
-    "node_modules/media-typer": {
-      "version": "0.3.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/memory-fs": {
-      "version": "0.5.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "errno": "^0.1.3",
-        "readable-stream": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=4.3.0 <5.0.0 || >=5.10"
-      }
-    },
-    "node_modules/merge-stream": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/micromatch": {
-      "version": "3.1.10",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "arr-diff": "^4.0.0",
-        "array-unique": "^0.3.2",
-        "braces": "^2.3.1",
-        "define-property": "^2.0.2",
-        "extend-shallow": "^3.0.2",
-        "extglob": "^2.0.4",
-        "fragment-cache": "^0.2.1",
-        "kind-of": "^6.0.2",
-        "nanomatch": "^1.2.9",
-        "object.pick": "^1.3.0",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/micromatch/node_modules/extend-shallow": {
-      "version": "3.0.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "assign-symbols": "^1.0.0",
-        "is-extendable": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/micromatch/node_modules/is-extendable": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-plain-object": "^2.0.4"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/micromatch/node_modules/is-plain-object": {
-      "version": "2.0.4",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "isobject": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/micromatch/node_modules/kind-of": {
-      "version": "6.0.3",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/miller-rabin": {
-      "version": "4.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "bn.js": "^4.0.0",
-        "brorand": "^1.0.1"
-      },
-      "bin": {
-        "miller-rabin": "bin/miller-rabin"
-      }
-    },
-    "node_modules/miller-rabin/node_modules/bn.js": {
-      "version": "4.12.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/mime": {
-      "version": "2.6.0",
-      "dev": true,
-      "license": "MIT",
-      "bin": {
-        "mime": "cli.js"
-      },
-      "engines": {
-        "node": ">=4.0.0"
-      }
-    },
-    "node_modules/mime-db": {
-      "version": "1.51.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/mime-types": {
-      "version": "2.1.34",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "mime-db": "1.51.0"
-      },
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/mimic-fn": {
-      "version": "2.1.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/minimalistic-assert": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/minimalistic-crypto-utils": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/minimatch": {
-      "version": "3.1.2",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "brace-expansion": "^1.1.7"
-      },
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/minimist": {
-      "version": "1.2.5",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/mississippi": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "dependencies": {
-        "concat-stream": "^1.5.0",
-        "duplexify": "^3.4.2",
-        "end-of-stream": "^1.1.0",
-        "flush-write-stream": "^1.0.0",
-        "from2": "^2.1.0",
-        "parallel-transform": "^1.1.0",
-        "pump": "^3.0.0",
-        "pumpify": "^1.3.3",
-        "stream-each": "^1.1.0",
-        "through2": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=4.0.0"
-      }
-    },
-    "node_modules/mississippi/node_modules/pump": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "end-of-stream": "^1.1.0",
-        "once": "^1.3.1"
-      }
-    },
-    "node_modules/mixin-deep": {
-      "version": "1.3.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "for-in": "^1.0.2",
-        "is-extendable": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/mixin-deep/node_modules/is-extendable": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-plain-object": "^2.0.4"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/mixin-deep/node_modules/is-plain-object": {
-      "version": "2.0.4",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "isobject": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/mkdirp": {
-      "version": "0.5.5",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "minimist": "^1.2.5"
-      },
-      "bin": {
-        "mkdirp": "bin/cmd.js"
-      }
-    },
-    "node_modules/move-concurrently": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "aproba": "^1.1.1",
-        "copy-concurrently": "^1.0.0",
-        "fs-write-stream-atomic": "^1.0.8",
-        "mkdirp": "^0.5.1",
-        "rimraf": "^2.5.4",
-        "run-queue": "^1.0.3"
-      }
-    },
-    "node_modules/move-concurrently/node_modules/rimraf": {
-      "version": "2.7.1",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "glob": "^7.1.3"
-      },
-      "bin": {
-        "rimraf": "bin.js"
-      }
-    },
-    "node_modules/ms": {
-      "version": "2.1.2",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/mute-stdout": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/mute-stream": {
-      "version": "0.0.8",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/nan": {
-      "version": "2.15.0",
-      "dev": true,
-      "license": "MIT",
-      "optional": true
-    },
-    "node_modules/nanomatch": {
-      "version": "1.2.13",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "arr-diff": "^4.0.0",
-        "array-unique": "^0.3.2",
-        "define-property": "^2.0.2",
-        "extend-shallow": "^3.0.2",
-        "fragment-cache": "^0.2.1",
-        "is-windows": "^1.0.2",
-        "kind-of": "^6.0.2",
-        "object.pick": "^1.3.0",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/nanomatch/node_modules/extend-shallow": {
-      "version": "3.0.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "assign-symbols": "^1.0.0",
-        "is-extendable": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/nanomatch/node_modules/is-extendable": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-plain-object": "^2.0.4"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/nanomatch/node_modules/is-plain-object": {
-      "version": "2.0.4",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "isobject": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/nanomatch/node_modules/kind-of": {
-      "version": "6.0.3",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/natural-compare": {
-      "version": "1.4.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/negotiator": {
-      "version": "0.6.3",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/neo-async": {
-      "version": "2.6.2",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/next-tick": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/nice-try": {
-      "version": "1.0.5",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/node-libs-browser": {
-      "version": "2.2.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "assert": "^1.1.1",
-        "browserify-zlib": "^0.2.0",
-        "buffer": "^4.3.0",
-        "console-browserify": "^1.1.0",
-        "constants-browserify": "^1.0.0",
-        "crypto-browserify": "^3.11.0",
-        "domain-browser": "^1.1.1",
-        "events": "^3.0.0",
-        "https-browserify": "^1.0.0",
-        "os-browserify": "^0.3.0",
-        "path-browserify": "0.0.1",
-        "process": "^0.11.10",
-        "punycode": "^1.2.4",
-        "querystring-es3": "^0.2.0",
-        "readable-stream": "^2.3.3",
-        "stream-browserify": "^2.0.1",
-        "stream-http": "^2.7.2",
-        "string_decoder": "^1.0.0",
-        "timers-browserify": "^2.0.4",
-        "tty-browserify": "0.0.0",
-        "url": "^0.11.0",
-        "util": "^0.11.0",
-        "vm-browserify": "^1.0.1"
-      }
-    },
-    "node_modules/node-libs-browser/node_modules/punycode": {
-      "version": "1.4.1",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/node-releases": {
-      "version": "2.0.2",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/normalize-package-data": {
-      "version": "2.5.0",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "dependencies": {
-        "hosted-git-info": "^2.1.4",
-        "resolve": "^1.10.0",
-        "semver": "2 || 3 || 4 || 5",
-        "validate-npm-package-license": "^3.0.1"
-      }
-    },
-    "node_modules/normalize-package-data/node_modules/semver": {
-      "version": "5.7.1",
-      "dev": true,
-      "license": "ISC",
-      "bin": {
-        "semver": "bin/semver"
-      }
-    },
-    "node_modules/normalize-path": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/now-and-later": {
-      "version": "2.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "once": "^1.3.2"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/npm-run-path": {
-      "version": "4.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "path-key": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/number-is-nan": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/object-assign": {
-      "version": "4.1.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/object-copy": {
-      "version": "0.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "copy-descriptor": "^0.1.0",
-        "define-property": "^0.2.5",
-        "kind-of": "^3.0.3"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/object-copy/node_modules/define-property": {
-      "version": "0.2.5",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-descriptor": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/object-copy/node_modules/is-accessor-descriptor": {
-      "version": "0.1.6",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "kind-of": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/object-copy/node_modules/is-data-descriptor": {
-      "version": "0.1.4",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "kind-of": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/object-copy/node_modules/is-descriptor": {
-      "version": "0.1.6",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-accessor-descriptor": "^0.1.6",
-        "is-data-descriptor": "^0.1.4",
-        "kind-of": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": {
-      "version": "5.1.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/object-copy/node_modules/kind-of": {
-      "version": "3.2.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/object-keys": {
-      "version": "1.1.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/object-visit": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "isobject": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/object.assign": {
-      "version": "4.1.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "call-bind": "^1.0.0",
-        "define-properties": "^1.1.3",
-        "has-symbols": "^1.0.1",
-        "object-keys": "^1.1.1"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/object.defaults": {
-      "version": "1.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "array-each": "^1.0.1",
-        "array-slice": "^1.0.0",
-        "for-own": "^1.0.0",
-        "isobject": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/object.map": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "for-own": "^1.0.0",
-        "make-iterator": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/object.omit": {
-      "version": "2.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "for-own": "^0.1.4",
-        "is-extendable": "^0.1.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/object.omit/node_modules/for-own": {
-      "version": "0.1.5",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "for-in": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/object.pick": {
-      "version": "1.3.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "isobject": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/object.reduce": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "for-own": "^1.0.0",
-        "make-iterator": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/on-finished": {
-      "version": "2.3.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ee-first": "1.1.1"
-      },
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/once": {
-      "version": "1.4.0",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "wrappy": "1"
-      }
-    },
-    "node_modules/onetime": {
-      "version": "5.1.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "mimic-fn": "^2.1.0"
-      },
-      "engines": {
-        "node": ">=6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/optionator": {
-      "version": "0.9.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "deep-is": "^0.1.3",
-        "fast-levenshtein": "^2.0.6",
-        "levn": "^0.4.1",
-        "prelude-ls": "^1.2.1",
-        "type-check": "^0.4.0",
-        "word-wrap": "^1.2.3"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/ordered-read-streams": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "readable-stream": "^2.0.1"
-      }
-    },
-    "node_modules/os-browserify": {
-      "version": "0.3.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/os-locale": {
-      "version": "1.4.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "lcid": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/os-tmpdir": {
-      "version": "1.0.2",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/p-limit": {
-      "version": "2.3.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "p-try": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/p-locate": {
-      "version": "4.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "p-limit": "^2.2.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/p-try": {
-      "version": "2.2.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/pako": {
-      "version": "1.0.11",
-      "dev": true,
-      "license": "(MIT AND Zlib)"
-    },
-    "node_modules/parallel-transform": {
-      "version": "1.2.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "cyclist": "^1.0.1",
-        "inherits": "^2.0.3",
-        "readable-stream": "^2.1.5"
-      }
-    },
-    "node_modules/parent-module": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "callsites": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/parse-asn1": {
-      "version": "5.1.6",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "asn1.js": "^5.2.0",
-        "browserify-aes": "^1.0.0",
-        "evp_bytestokey": "^1.0.0",
-        "pbkdf2": "^3.0.3",
-        "safe-buffer": "^5.1.1"
-      }
-    },
-    "node_modules/parse-filepath": {
-      "version": "1.0.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-absolute": "^1.0.0",
-        "map-cache": "^0.2.0",
-        "path-root": "^0.1.1"
-      },
-      "engines": {
-        "node": ">=0.8"
-      }
-    },
-    "node_modules/parse-glob": {
-      "version": "3.0.4",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "glob-base": "^0.3.0",
-        "is-dotfile": "^1.0.0",
-        "is-extglob": "^1.0.0",
-        "is-glob": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/parse-glob/node_modules/is-extglob": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/parse-glob/node_modules/is-glob": {
-      "version": "2.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-extglob": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/parse-json": {
-      "version": "2.2.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "error-ex": "^1.2.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/parse-node-version": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/parse-passwd": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/parseurl": {
-      "version": "1.3.3",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/pascalcase": {
-      "version": "0.1.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/path-browserify": {
-      "version": "0.0.1",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/path-dirname": {
-      "version": "1.0.2",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/path-exists": {
-      "version": "4.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/path-is-absolute": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/path-key": {
-      "version": "3.1.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/path-parse": {
-      "version": "1.0.7",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/path-root": {
-      "version": "0.1.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "path-root-regex": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/path-root-regex": {
-      "version": "0.1.2",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/path-type": {
-      "version": "1.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "graceful-fs": "^4.1.2",
-        "pify": "^2.0.0",
-        "pinkie-promise": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/pbkdf2": {
-      "version": "3.1.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "create-hash": "^1.1.2",
-        "create-hmac": "^1.1.4",
-        "ripemd160": "^2.0.1",
-        "safe-buffer": "^5.0.1",
-        "sha.js": "^2.4.8"
-      },
-      "engines": {
-        "node": ">=0.12"
-      }
-    },
-    "node_modules/picocolors": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/picomatch": {
-      "version": "2.3.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8.6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/jonschlinkert"
-      }
-    },
-    "node_modules/pify": {
-      "version": "2.3.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/pinkie": {
-      "version": "2.0.4",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/pinkie-promise": {
-      "version": "2.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "pinkie": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/pkg-dir": {
-      "version": "4.2.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "find-up": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/plugin-error": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-colors": "^1.0.1",
-        "arr-diff": "^4.0.0",
-        "arr-union": "^3.1.0",
-        "extend-shallow": "^3.0.2"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/plugin-error/node_modules/ansi-colors": {
-      "version": "1.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-wrap": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/plugin-error/node_modules/extend-shallow": {
-      "version": "3.0.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "assign-symbols": "^1.0.0",
-        "is-extendable": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/plugin-error/node_modules/is-extendable": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-plain-object": "^2.0.4"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/plugin-error/node_modules/is-plain-object": {
-      "version": "2.0.4",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "isobject": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/posix-character-classes": {
-      "version": "0.1.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/prelude-ls": {
-      "version": "1.2.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/preserve": {
-      "version": "0.2.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/prettier": {
-      "version": "2.3.1",
-      "dev": true,
-      "license": "MIT",
-      "bin": {
-        "prettier": "bin-prettier.js"
-      },
-      "engines": {
-        "node": ">=10.13.0"
-      }
-    },
-    "node_modules/pretty-hrtime": {
-      "version": "1.0.3",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/process": {
-      "version": "0.11.10",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6.0"
-      }
-    },
-    "node_modules/process-nextick-args": {
-      "version": "2.0.1",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/progress": {
-      "version": "2.0.3",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "node_modules/promise-inflight": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/prr": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/public-encrypt": {
-      "version": "4.0.3",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "bn.js": "^4.1.0",
-        "browserify-rsa": "^4.0.0",
-        "create-hash": "^1.1.0",
-        "parse-asn1": "^5.0.0",
-        "randombytes": "^2.0.1",
-        "safe-buffer": "^5.1.2"
-      }
-    },
-    "node_modules/public-encrypt/node_modules/bn.js": {
-      "version": "4.12.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/pump": {
-      "version": "2.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "end-of-stream": "^1.1.0",
-        "once": "^1.3.1"
-      }
-    },
-    "node_modules/pumpify": {
-      "version": "1.5.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "duplexify": "^3.6.0",
-        "inherits": "^2.0.3",
-        "pump": "^2.0.0"
-      }
-    },
-    "node_modules/punycode": {
-      "version": "2.1.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/qjobs": {
-      "version": "1.2.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.9"
-      }
-    },
-    "node_modules/qs": {
-      "version": "6.9.7",
-      "dev": true,
-      "license": "BSD-3-Clause",
-      "engines": {
-        "node": ">=0.6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/querystring": {
-      "version": "0.2.0",
-      "dev": true,
-      "engines": {
-        "node": ">=0.4.x"
-      }
-    },
-    "node_modules/querystring-es3": {
-      "version": "0.2.1",
-      "dev": true,
-      "engines": {
-        "node": ">=0.4.x"
-      }
-    },
-    "node_modules/randomatic": {
-      "version": "3.1.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-number": "^4.0.0",
-        "kind-of": "^6.0.0",
-        "math-random": "^1.0.1"
-      },
-      "engines": {
-        "node": ">= 0.10.0"
-      }
-    },
-    "node_modules/randomatic/node_modules/is-number": {
-      "version": "4.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/randomatic/node_modules/kind-of": {
-      "version": "6.0.3",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/randombytes": {
-      "version": "2.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "safe-buffer": "^5.1.0"
-      }
-    },
-    "node_modules/randomfill": {
-      "version": "1.0.4",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "randombytes": "^2.0.5",
-        "safe-buffer": "^5.1.0"
-      }
-    },
-    "node_modules/range-parser": {
-      "version": "1.2.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/raw-body": {
-      "version": "2.4.3",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "bytes": "3.1.2",
-        "http-errors": "1.8.1",
-        "iconv-lite": "0.4.24",
-        "unpipe": "1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/read-pkg": {
-      "version": "1.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "load-json-file": "^1.0.0",
-        "normalize-package-data": "^2.3.2",
-        "path-type": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/read-pkg-up": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "find-up": "^1.0.0",
-        "read-pkg": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/read-pkg-up/node_modules/find-up": {
-      "version": "1.1.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "path-exists": "^2.0.0",
-        "pinkie-promise": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/read-pkg-up/node_modules/path-exists": {
-      "version": "2.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "pinkie-promise": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/readable-stream": {
-      "version": "2.3.7",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "core-util-is": "~1.0.0",
-        "inherits": "~2.0.3",
-        "isarray": "~1.0.0",
-        "process-nextick-args": "~2.0.0",
-        "safe-buffer": "~5.1.1",
-        "string_decoder": "~1.1.1",
-        "util-deprecate": "~1.0.1"
-      }
-    },
-    "node_modules/readdirp": {
-      "version": "2.2.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "graceful-fs": "^4.1.11",
-        "micromatch": "^3.1.10",
-        "readable-stream": "^2.0.2"
-      },
-      "engines": {
-        "node": ">=0.10"
-      }
-    },
-    "node_modules/rechoir": {
-      "version": "0.6.2",
-      "dev": true,
-      "dependencies": {
-        "resolve": "^1.1.6"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/regex-cache": {
-      "version": "0.4.4",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-equal-shallow": "^0.1.3"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/regex-not": {
-      "version": "1.0.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "extend-shallow": "^3.0.2",
-        "safe-regex": "^1.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/regex-not/node_modules/extend-shallow": {
-      "version": "3.0.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "assign-symbols": "^1.0.0",
-        "is-extendable": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/regex-not/node_modules/is-extendable": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-plain-object": "^2.0.4"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/regex-not/node_modules/is-plain-object": {
-      "version": "2.0.4",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "isobject": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/regexpp": {
-      "version": "3.2.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/mysticatea"
-      }
-    },
-    "node_modules/remove-bom-buffer": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-buffer": "^1.1.5",
-        "is-utf8": "^0.2.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/remove-bom-stream": {
-      "version": "1.2.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "remove-bom-buffer": "^3.0.0",
-        "safe-buffer": "^5.1.0",
-        "through2": "^2.0.3"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/remove-trailing-separator": {
-      "version": "1.1.0",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/repeat-element": {
-      "version": "1.1.4",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/repeat-string": {
-      "version": "1.6.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10"
-      }
-    },
-    "node_modules/replace-ext": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/replace-homedir": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "homedir-polyfill": "^1.0.1",
-        "is-absolute": "^1.0.0",
-        "remove-trailing-separator": "^1.1.0"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/require-directory": {
-      "version": "2.1.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/require-from-string": {
-      "version": "2.0.2",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/require-main-filename": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/requires-port": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/resolve": {
-      "version": "1.22.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-core-module": "^2.8.1",
-        "path-parse": "^1.0.7",
-        "supports-preserve-symlinks-flag": "^1.0.0"
-      },
-      "bin": {
-        "resolve": "bin/resolve"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/resolve-cwd": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "resolve-from": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/resolve-cwd/node_modules/resolve-from": {
-      "version": "5.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/resolve-dir": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "expand-tilde": "^2.0.0",
-        "global-modules": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/resolve-from": {
-      "version": "4.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/resolve-options": {
-      "version": "1.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "value-or-function": "^3.0.0"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/resolve-url": {
-      "version": "0.2.1",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/restore-cursor": {
-      "version": "3.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "onetime": "^5.1.0",
-        "signal-exit": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/ret": {
-      "version": "0.1.15",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.12"
-      }
-    },
-    "node_modules/rfdc": {
-      "version": "1.3.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/rimraf": {
-      "version": "3.0.2",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "glob": "^7.1.3"
-      },
-      "bin": {
-        "rimraf": "bin.js"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/ripemd160": {
-      "version": "2.0.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "hash-base": "^3.0.0",
-        "inherits": "^2.0.1"
-      }
-    },
-    "node_modules/run-async": {
-      "version": "2.4.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.12.0"
-      }
-    },
-    "node_modules/run-queue": {
-      "version": "1.0.3",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "aproba": "^1.1.1"
-      }
-    },
-    "node_modules/rxjs": {
-      "version": "6.6.7",
-      "dev": true,
-      "license": "Apache-2.0",
-      "dependencies": {
-        "tslib": "^1.9.0"
-      },
-      "engines": {
-        "npm": ">=2.0.0"
-      }
-    },
-    "node_modules/safe-buffer": {
-      "version": "5.1.2",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/safe-regex": {
-      "version": "1.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ret": "~0.1.10"
-      }
-    },
-    "node_modules/safer-buffer": {
-      "version": "2.1.2",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/schema-utils": {
-      "version": "3.1.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@types/json-schema": "^7.0.8",
-        "ajv": "^6.12.5",
-        "ajv-keywords": "^3.5.2"
-      },
-      "engines": {
-        "node": ">= 10.13.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/webpack"
-      }
-    },
-    "node_modules/semver": {
-      "version": "7.3.5",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "lru-cache": "^6.0.0"
-      },
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/semver-greatest-satisfied-range": {
-      "version": "1.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "sver-compat": "^1.5.0"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/serialize-javascript": {
-      "version": "6.0.0",
-      "dev": true,
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "randombytes": "^2.1.0"
-      }
-    },
-    "node_modules/set-blocking": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/set-value": {
-      "version": "2.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "extend-shallow": "^2.0.1",
-        "is-extendable": "^0.1.1",
-        "is-plain-object": "^2.0.3",
-        "split-string": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/set-value/node_modules/is-plain-object": {
-      "version": "2.0.4",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "isobject": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/setimmediate": {
-      "version": "1.0.5",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/setprototypeof": {
-      "version": "1.2.0",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/sha.js": {
-      "version": "2.4.11",
-      "dev": true,
-      "license": "(MIT AND BSD-3-Clause)",
-      "dependencies": {
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.0.1"
-      },
-      "bin": {
-        "sha.js": "bin.js"
-      }
-    },
-    "node_modules/shadergraph": {
-      "resolved": "../shadergraph",
-      "link": true
-    },
-    "node_modules/shallow-clone": {
-      "version": "3.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "kind-of": "^6.0.2"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/shallow-clone/node_modules/kind-of": {
-      "version": "6.0.3",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/shebang-command": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "shebang-regex": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/shebang-regex": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/signal-exit": {
-      "version": "3.0.7",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/slash": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/slice-ansi": {
-      "version": "4.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-styles": "^4.0.0",
-        "astral-regex": "^2.0.0",
-        "is-fullwidth-code-point": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/slice-ansi?sponsor=1"
-      }
-    },
-    "node_modules/snapdragon": {
-      "version": "0.8.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "base": "^0.11.1",
-        "debug": "^2.2.0",
-        "define-property": "^0.2.5",
-        "extend-shallow": "^2.0.1",
-        "map-cache": "^0.2.2",
-        "source-map": "^0.5.6",
-        "source-map-resolve": "^0.5.0",
-        "use": "^3.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/snapdragon-node": {
-      "version": "2.1.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "define-property": "^1.0.0",
-        "isobject": "^3.0.0",
-        "snapdragon-util": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/snapdragon-node/node_modules/define-property": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-descriptor": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/snapdragon-util": {
-      "version": "3.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "kind-of": "^3.2.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/snapdragon-util/node_modules/kind-of": {
-      "version": "3.2.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/snapdragon/node_modules/debug": {
-      "version": "2.6.9",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ms": "2.0.0"
-      }
-    },
-    "node_modules/snapdragon/node_modules/define-property": {
-      "version": "0.2.5",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-descriptor": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/snapdragon/node_modules/is-accessor-descriptor": {
-      "version": "0.1.6",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "kind-of": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": {
-      "version": "3.2.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/snapdragon/node_modules/is-data-descriptor": {
-      "version": "0.1.4",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "kind-of": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": {
-      "version": "3.2.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/snapdragon/node_modules/is-descriptor": {
-      "version": "0.1.6",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-accessor-descriptor": "^0.1.6",
-        "is-data-descriptor": "^0.1.4",
-        "kind-of": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/snapdragon/node_modules/ms": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/snapdragon/node_modules/source-map": {
-      "version": "0.5.7",
-      "dev": true,
-      "license": "BSD-3-Clause",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/socket.io": {
-      "version": "4.4.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "accepts": "~1.3.4",
-        "base64id": "~2.0.0",
-        "debug": "~4.3.2",
-        "engine.io": "~6.1.0",
-        "socket.io-adapter": "~2.3.3",
-        "socket.io-parser": "~4.0.4"
-      },
-      "engines": {
-        "node": ">=10.0.0"
-      }
-    },
-    "node_modules/socket.io-adapter": {
-      "version": "2.3.3",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/socket.io-parser": {
-      "version": "4.0.4",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@types/component-emitter": "^1.2.10",
-        "component-emitter": "~1.3.0",
-        "debug": "~4.3.1"
-      },
-      "engines": {
-        "node": ">=10.0.0"
-      }
-    },
-    "node_modules/source-list-map": {
-      "version": "2.0.1",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/source-map": {
-      "version": "0.6.1",
-      "dev": true,
-      "license": "BSD-3-Clause",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/source-map-resolve": {
-      "version": "0.5.3",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "atob": "^2.1.2",
-        "decode-uri-component": "^0.2.0",
-        "resolve-url": "^0.2.1",
-        "source-map-url": "^0.4.0",
-        "urix": "^0.1.0"
-      }
-    },
-    "node_modules/source-map-support": {
-      "version": "0.5.21",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "buffer-from": "^1.0.0",
-        "source-map": "^0.6.0"
-      }
-    },
-    "node_modules/source-map-url": {
-      "version": "0.4.1",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/sparkles": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/spdx-correct": {
-      "version": "3.1.1",
-      "dev": true,
-      "license": "Apache-2.0",
-      "dependencies": {
-        "spdx-expression-parse": "^3.0.0",
-        "spdx-license-ids": "^3.0.0"
-      }
-    },
-    "node_modules/spdx-exceptions": {
-      "version": "2.3.0",
-      "dev": true,
-      "license": "CC-BY-3.0"
-    },
-    "node_modules/spdx-expression-parse": {
-      "version": "3.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "spdx-exceptions": "^2.1.0",
-        "spdx-license-ids": "^3.0.0"
-      }
-    },
-    "node_modules/spdx-license-ids": {
-      "version": "3.0.11",
-      "dev": true,
-      "license": "CC0-1.0"
-    },
-    "node_modules/split-string": {
-      "version": "3.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "extend-shallow": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/split-string/node_modules/extend-shallow": {
-      "version": "3.0.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "assign-symbols": "^1.0.0",
-        "is-extendable": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/split-string/node_modules/is-extendable": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-plain-object": "^2.0.4"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/split-string/node_modules/is-plain-object": {
-      "version": "2.0.4",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "isobject": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/sprintf-js": {
-      "version": "1.0.3",
-      "dev": true,
-      "license": "BSD-3-Clause"
-    },
-    "node_modules/ssri": {
-      "version": "6.0.2",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "figgy-pudding": "^3.5.1"
-      }
-    },
-    "node_modules/stack-trace": {
-      "version": "0.0.10",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/static-extend": {
-      "version": "0.1.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "define-property": "^0.2.5",
-        "object-copy": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/static-extend/node_modules/define-property": {
-      "version": "0.2.5",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-descriptor": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/static-extend/node_modules/is-accessor-descriptor": {
-      "version": "0.1.6",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "kind-of": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": {
-      "version": "3.2.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/static-extend/node_modules/is-data-descriptor": {
-      "version": "0.1.4",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "kind-of": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": {
-      "version": "3.2.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/static-extend/node_modules/is-descriptor": {
-      "version": "0.1.6",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-accessor-descriptor": "^0.1.6",
-        "is-data-descriptor": "^0.1.4",
-        "kind-of": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/statuses": {
-      "version": "1.5.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/stream-browserify": {
-      "version": "2.0.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "inherits": "~2.0.1",
-        "readable-stream": "^2.0.2"
-      }
-    },
-    "node_modules/stream-each": {
-      "version": "1.2.3",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "end-of-stream": "^1.1.0",
-        "stream-shift": "^1.0.0"
-      }
-    },
-    "node_modules/stream-exhaust": {
-      "version": "1.0.2",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/stream-http": {
-      "version": "2.8.3",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "builtin-status-codes": "^3.0.0",
-        "inherits": "^2.0.1",
-        "readable-stream": "^2.3.6",
-        "to-arraybuffer": "^1.0.0",
-        "xtend": "^4.0.0"
-      }
-    },
-    "node_modules/stream-shift": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/streamroller": {
-      "version": "3.0.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "date-format": "^4.0.3",
-        "debug": "^4.1.1",
-        "fs-extra": "^10.0.0"
-      },
-      "engines": {
-        "node": ">=8.0"
-      }
-    },
-    "node_modules/string_decoder": {
-      "version": "1.1.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "safe-buffer": "~5.1.0"
-      }
-    },
-    "node_modules/string-width": {
-      "version": "4.2.3",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "emoji-regex": "^8.0.0",
-        "is-fullwidth-code-point": "^3.0.0",
-        "strip-ansi": "^6.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/strip-ansi": {
-      "version": "6.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-regex": "^5.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/strip-bom": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-utf8": "^0.2.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/strip-bom-stream": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "first-chunk-stream": "^2.0.0",
-        "strip-bom": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/strip-final-newline": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/strip-json-comments": {
-      "version": "3.1.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/supports-color": {
-      "version": "7.2.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "has-flag": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/supports-preserve-symlinks-flag": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/sver-compat": {
-      "version": "1.5.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "es6-iterator": "^2.0.1",
-        "es6-symbol": "^3.1.1"
-      }
-    },
-    "node_modules/table": {
-      "version": "6.8.0",
-      "dev": true,
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "ajv": "^8.0.1",
-        "lodash.truncate": "^4.4.2",
-        "slice-ansi": "^4.0.0",
-        "string-width": "^4.2.3",
-        "strip-ansi": "^6.0.1"
-      },
-      "engines": {
-        "node": ">=10.0.0"
-      }
-    },
-    "node_modules/table/node_modules/ajv": {
-      "version": "8.10.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "fast-deep-equal": "^3.1.1",
-        "json-schema-traverse": "^1.0.0",
-        "require-from-string": "^2.0.2",
-        "uri-js": "^4.2.2"
-      },
-      "funding": {
-        "type": "github",
-        "url": "https://github.com/sponsors/epoberezkin"
-      }
-    },
-    "node_modules/table/node_modules/json-schema-traverse": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/tapable": {
-      "version": "2.2.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/terser": {
-      "version": "4.8.0",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "dependencies": {
-        "commander": "^2.20.0",
-        "source-map": "~0.6.1",
-        "source-map-support": "~0.5.12"
-      },
-      "bin": {
-        "terser": "bin/terser"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/terser-webpack-plugin": {
-      "version": "5.3.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "jest-worker": "^27.4.5",
-        "schema-utils": "^3.1.1",
-        "serialize-javascript": "^6.0.0",
-        "source-map": "^0.6.1",
-        "terser": "^5.7.2"
-      },
-      "engines": {
-        "node": ">= 10.13.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/webpack"
-      },
-      "peerDependencies": {
-        "webpack": "^5.1.0"
-      },
-      "peerDependenciesMeta": {
-        "@swc/core": {
-          "optional": true
-        },
-        "esbuild": {
-          "optional": true
-        },
-        "uglify-js": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/terser-webpack-plugin/node_modules/acorn": {
-      "version": "8.7.0",
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "peer": true,
-      "bin": {
-        "acorn": "bin/acorn"
-      },
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "node_modules/terser-webpack-plugin/node_modules/commander": {
-      "version": "2.20.3",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/terser-webpack-plugin/node_modules/terser": {
-      "version": "5.10.0",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "dependencies": {
-        "commander": "^2.20.0",
-        "source-map": "~0.7.2",
-        "source-map-support": "~0.5.20"
-      },
-      "bin": {
-        "terser": "bin/terser"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "peerDependencies": {
-        "acorn": "^8.5.0"
-      },
-      "peerDependenciesMeta": {
-        "acorn": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/terser-webpack-plugin/node_modules/terser/node_modules/source-map": {
-      "version": "0.7.3",
-      "dev": true,
-      "license": "BSD-3-Clause",
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/terser/node_modules/commander": {
-      "version": "2.20.3",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/text-table": {
-      "version": "0.2.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/three": {
-      "version": "0.137.5",
-      "license": "MIT",
-      "peer": true
-    },
-    "node_modules/threestrap": {
-      "resolved": "../threestrap",
-      "link": true
-    },
-    "node_modules/through": {
-      "version": "2.3.8",
-      "license": "MIT"
-    },
-    "node_modules/through2": {
-      "version": "2.0.5",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "readable-stream": "~2.3.6",
-        "xtend": "~4.0.1"
-      }
-    },
-    "node_modules/through2-filter": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "through2": "~2.0.0",
-        "xtend": "~4.0.0"
-      }
-    },
-    "node_modules/time-stamp": {
-      "version": "1.1.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/timers-browserify": {
-      "version": "2.0.12",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "setimmediate": "^1.0.4"
-      },
-      "engines": {
-        "node": ">=0.6.0"
-      }
-    },
-    "node_modules/tmp": {
-      "version": "0.2.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "rimraf": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=8.17.0"
-      }
-    },
-    "node_modules/to-absolute-glob": {
-      "version": "2.0.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-absolute": "^1.0.0",
-        "is-negated-glob": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/to-arraybuffer": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/to-object-path": {
-      "version": "0.3.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "kind-of": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/to-object-path/node_modules/kind-of": {
-      "version": "3.2.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/to-regex": {
-      "version": "3.0.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "define-property": "^2.0.2",
-        "extend-shallow": "^3.0.2",
-        "regex-not": "^1.0.2",
-        "safe-regex": "^1.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/to-regex-range": {
-      "version": "2.1.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-number": "^3.0.0",
-        "repeat-string": "^1.6.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/to-regex/node_modules/extend-shallow": {
-      "version": "3.0.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "assign-symbols": "^1.0.0",
-        "is-extendable": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/to-regex/node_modules/is-extendable": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-plain-object": "^2.0.4"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/to-regex/node_modules/is-plain-object": {
-      "version": "2.0.4",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "isobject": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/to-through": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "through2": "^2.0.3"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/toidentifier": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.6"
-      }
-    },
-    "node_modules/tslib": {
-      "version": "1.14.1",
-      "dev": true,
-      "license": "0BSD"
-    },
-    "node_modules/tty-browserify": {
-      "version": "0.0.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/type": {
-      "version": "1.2.0",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/type-check": {
-      "version": "0.4.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "prelude-ls": "^1.2.1"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/type-fest": {
-      "version": "0.20.2",
-      "dev": true,
-      "license": "(MIT OR CC0-1.0)",
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/type-is": {
-      "version": "1.6.18",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "media-typer": "0.3.0",
-        "mime-types": "~2.1.24"
-      },
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/typedarray": {
-      "version": "0.0.6",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/ua-parser-js": {
-      "version": "0.7.31",
-      "dev": true,
-      "funding": [
-        {
-          "type": "opencollective",
-          "url": "https://opencollective.com/ua-parser-js"
-        },
-        {
-          "type": "paypal",
-          "url": "https://paypal.me/faisalman"
-        }
-      ],
-      "license": "MIT",
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/unc-path-regex": {
-      "version": "0.1.2",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/undertaker": {
-      "version": "1.3.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "arr-flatten": "^1.0.1",
-        "arr-map": "^2.0.0",
-        "bach": "^1.0.0",
-        "collection-map": "^1.0.0",
-        "es6-weak-map": "^2.0.1",
-        "fast-levenshtein": "^1.0.0",
-        "last-run": "^1.1.0",
-        "object.defaults": "^1.0.0",
-        "object.reduce": "^1.0.0",
-        "undertaker-registry": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/undertaker-registry": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/undertaker/node_modules/fast-levenshtein": {
-      "version": "1.1.4",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/union-value": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "arr-union": "^3.1.0",
-        "get-value": "^2.0.6",
-        "is-extendable": "^0.1.1",
-        "set-value": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/unique-filename": {
-      "version": "1.1.1",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "unique-slug": "^2.0.0"
-      }
-    },
-    "node_modules/unique-slug": {
-      "version": "2.0.2",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "imurmurhash": "^0.1.4"
-      }
-    },
-    "node_modules/unique-stream": {
-      "version": "2.3.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "json-stable-stringify-without-jsonify": "^1.0.1",
-        "through2-filter": "^3.0.0"
-      }
-    },
-    "node_modules/universalify": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 10.0.0"
-      }
-    },
-    "node_modules/unpipe": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/unset-value": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "has-value": "^0.3.1",
-        "isobject": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/unset-value/node_modules/has-value": {
-      "version": "0.3.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "get-value": "^2.0.3",
-        "has-values": "^0.1.4",
-        "isobject": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/unset-value/node_modules/has-value/node_modules/isobject": {
-      "version": "2.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "isarray": "1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/unset-value/node_modules/has-values": {
-      "version": "0.1.4",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/upath": {
-      "version": "1.2.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=4",
-        "yarn": "*"
-      }
-    },
-    "node_modules/uri-js": {
-      "version": "4.4.1",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "dependencies": {
-        "punycode": "^2.1.0"
-      }
-    },
-    "node_modules/urix": {
-      "version": "0.1.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/url": {
-      "version": "0.11.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "punycode": "1.3.2",
-        "querystring": "0.2.0"
-      }
-    },
-    "node_modules/url/node_modules/punycode": {
-      "version": "1.3.2",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/use": {
-      "version": "3.1.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/util": {
-      "version": "0.11.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "inherits": "2.0.3"
-      }
-    },
-    "node_modules/util-deprecate": {
-      "version": "1.0.2",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/util/node_modules/inherits": {
-      "version": "2.0.3",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/utils-merge": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.4.0"
-      }
-    },
-    "node_modules/v8-compile-cache": {
-      "version": "2.3.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/v8flags": {
-      "version": "3.2.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "homedir-polyfill": "^1.0.1"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/validate-npm-package-license": {
-      "version": "3.0.4",
-      "dev": true,
-      "license": "Apache-2.0",
-      "dependencies": {
-        "spdx-correct": "^3.0.0",
-        "spdx-expression-parse": "^3.0.0"
-      }
-    },
-    "node_modules/value-or-function": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/vary": {
-      "version": "1.1.2",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/vinyl": {
-      "version": "2.2.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "clone": "^2.1.1",
-        "clone-buffer": "^1.0.0",
-        "clone-stats": "^1.0.0",
-        "cloneable-readable": "^1.0.0",
-        "remove-trailing-separator": "^1.0.1",
-        "replace-ext": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/vinyl-file": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "graceful-fs": "^4.1.2",
-        "pify": "^2.3.0",
-        "pinkie-promise": "^2.0.0",
-        "strip-bom": "^2.0.0",
-        "strip-bom-stream": "^2.0.0",
-        "vinyl": "^1.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/vinyl-file/node_modules/clone": {
-      "version": "1.0.4",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.8"
-      }
-    },
-    "node_modules/vinyl-file/node_modules/clone-stats": {
-      "version": "0.0.1",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/vinyl-file/node_modules/replace-ext": {
-      "version": "0.0.1",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/vinyl-file/node_modules/vinyl": {
-      "version": "1.2.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "clone": "^1.0.0",
-        "clone-stats": "^0.0.1",
-        "replace-ext": "0.0.1"
-      },
-      "engines": {
-        "node": ">= 0.9"
-      }
-    },
-    "node_modules/vinyl-fs": {
-      "version": "3.0.3",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "fs-mkdirp-stream": "^1.0.0",
-        "glob-stream": "^6.1.0",
-        "graceful-fs": "^4.0.0",
-        "is-valid-glob": "^1.0.0",
-        "lazystream": "^1.0.0",
-        "lead": "^1.0.0",
-        "object.assign": "^4.0.4",
-        "pumpify": "^1.3.5",
-        "readable-stream": "^2.3.3",
-        "remove-bom-buffer": "^3.0.0",
-        "remove-bom-stream": "^1.2.0",
-        "resolve-options": "^1.1.0",
-        "through2": "^2.0.0",
-        "to-through": "^2.0.0",
-        "value-or-function": "^3.0.0",
-        "vinyl": "^2.0.0",
-        "vinyl-sourcemap": "^1.1.0"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/vinyl-sourcemap": {
-      "version": "1.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "append-buffer": "^1.0.2",
-        "convert-source-map": "^1.5.0",
-        "graceful-fs": "^4.1.6",
-        "normalize-path": "^2.1.1",
-        "now-and-later": "^2.0.0",
-        "remove-bom-buffer": "^3.0.0",
-        "vinyl": "^2.0.0"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/vinyl-sourcemap/node_modules/normalize-path": {
-      "version": "2.1.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "remove-trailing-separator": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/vm-browserify": {
-      "version": "1.1.2",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/void-elements": {
-      "version": "2.0.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/watchpack": {
-      "version": "2.3.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "glob-to-regexp": "^0.4.1",
-        "graceful-fs": "^4.1.2"
-      },
-      "engines": {
-        "node": ">=10.13.0"
-      }
-    },
-    "node_modules/watchpack-chokidar2": {
-      "version": "2.0.1",
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "dependencies": {
-        "chokidar": "^2.1.8"
-      }
-    },
-    "node_modules/webpack": {
-      "version": "5.69.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@types/eslint-scope": "^3.7.3",
-        "@types/estree": "^0.0.51",
-        "@webassemblyjs/ast": "1.11.1",
-        "@webassemblyjs/wasm-edit": "1.11.1",
-        "@webassemblyjs/wasm-parser": "1.11.1",
-        "acorn": "^8.4.1",
-        "acorn-import-assertions": "^1.7.6",
-        "browserslist": "^4.14.5",
-        "chrome-trace-event": "^1.0.2",
-        "enhanced-resolve": "^5.9.0",
-        "es-module-lexer": "^0.9.0",
-        "eslint-scope": "5.1.1",
-        "events": "^3.2.0",
-        "glob-to-regexp": "^0.4.1",
-        "graceful-fs": "^4.2.9",
-        "json-parse-better-errors": "^1.0.2",
-        "loader-runner": "^4.2.0",
-        "mime-types": "^2.1.27",
-        "neo-async": "^2.6.2",
-        "schema-utils": "^3.1.0",
-        "tapable": "^2.1.1",
-        "terser-webpack-plugin": "^5.1.3",
-        "watchpack": "^2.3.1",
-        "webpack-sources": "^3.2.3"
-      },
-      "bin": {
-        "webpack": "bin/webpack.js"
-      },
-      "engines": {
-        "node": ">=10.13.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/webpack"
-      },
-      "peerDependenciesMeta": {
-        "webpack-cli": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/webpack-cli": {
-      "version": "4.9.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@discoveryjs/json-ext": "^0.5.0",
-        "@webpack-cli/configtest": "^1.1.1",
-        "@webpack-cli/info": "^1.4.1",
-        "@webpack-cli/serve": "^1.6.1",
-        "colorette": "^2.0.14",
-        "commander": "^7.0.0",
-        "execa": "^5.0.0",
-        "fastest-levenshtein": "^1.0.12",
-        "import-local": "^3.0.2",
-        "interpret": "^2.2.0",
-        "rechoir": "^0.7.0",
-        "webpack-merge": "^5.7.3"
-      },
-      "bin": {
-        "webpack-cli": "bin/cli.js"
-      },
-      "engines": {
-        "node": ">=10.13.0"
-      },
-      "peerDependencies": {
-        "webpack": "4.x.x || 5.x.x"
-      },
-      "peerDependenciesMeta": {
-        "@webpack-cli/generators": {
-          "optional": true
-        },
-        "@webpack-cli/migrate": {
-          "optional": true
-        },
-        "webpack-bundle-analyzer": {
-          "optional": true
-        },
-        "webpack-dev-server": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/webpack-cli/node_modules/interpret": {
-      "version": "2.2.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/webpack-cli/node_modules/rechoir": {
-      "version": "0.7.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "resolve": "^1.9.0"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/webpack-merge": {
-      "version": "5.8.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "clone-deep": "^4.0.1",
-        "wildcard": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=10.0.0"
-      }
-    },
-    "node_modules/webpack-sources": {
-      "version": "3.2.3",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=10.13.0"
-      }
-    },
-    "node_modules/webpack-stream": {
-      "version": "6.1.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "fancy-log": "^1.3.3",
-        "lodash.clone": "^4.3.2",
-        "lodash.some": "^4.2.2",
-        "memory-fs": "^0.5.0",
-        "plugin-error": "^1.0.1",
-        "supports-color": "^7.2.0",
-        "through": "^2.3.8",
-        "vinyl": "^2.1.0",
-        "webpack": "^4.26.1"
-      },
-      "engines": {
-        "node": ">= 8.0.0"
-      }
-    },
-    "node_modules/webpack-stream/node_modules/@webassemblyjs/ast": {
-      "version": "1.9.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@webassemblyjs/helper-module-context": "1.9.0",
-        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
-        "@webassemblyjs/wast-parser": "1.9.0"
-      }
-    },
-    "node_modules/webpack-stream/node_modules/@webassemblyjs/helper-api-error": {
-      "version": "1.9.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/webpack-stream/node_modules/@webassemblyjs/helper-buffer": {
-      "version": "1.9.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/webpack-stream/node_modules/@webassemblyjs/helper-wasm-bytecode": {
-      "version": "1.9.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/webpack-stream/node_modules/@webassemblyjs/helper-wasm-section": {
-      "version": "1.9.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@webassemblyjs/ast": "1.9.0",
-        "@webassemblyjs/helper-buffer": "1.9.0",
-        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
-        "@webassemblyjs/wasm-gen": "1.9.0"
-      }
-    },
-    "node_modules/webpack-stream/node_modules/@webassemblyjs/ieee754": {
-      "version": "1.9.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@xtuc/ieee754": "^1.2.0"
-      }
-    },
-    "node_modules/webpack-stream/node_modules/@webassemblyjs/leb128": {
-      "version": "1.9.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@xtuc/long": "4.2.2"
-      }
-    },
-    "node_modules/webpack-stream/node_modules/@webassemblyjs/utf8": {
-      "version": "1.9.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/webpack-stream/node_modules/@webassemblyjs/wasm-edit": {
-      "version": "1.9.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@webassemblyjs/ast": "1.9.0",
-        "@webassemblyjs/helper-buffer": "1.9.0",
-        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
-        "@webassemblyjs/helper-wasm-section": "1.9.0",
-        "@webassemblyjs/wasm-gen": "1.9.0",
-        "@webassemblyjs/wasm-opt": "1.9.0",
-        "@webassemblyjs/wasm-parser": "1.9.0",
-        "@webassemblyjs/wast-printer": "1.9.0"
-      }
-    },
-    "node_modules/webpack-stream/node_modules/@webassemblyjs/wasm-gen": {
-      "version": "1.9.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@webassemblyjs/ast": "1.9.0",
-        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
-        "@webassemblyjs/ieee754": "1.9.0",
-        "@webassemblyjs/leb128": "1.9.0",
-        "@webassemblyjs/utf8": "1.9.0"
-      }
-    },
-    "node_modules/webpack-stream/node_modules/@webassemblyjs/wasm-opt": {
-      "version": "1.9.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@webassemblyjs/ast": "1.9.0",
-        "@webassemblyjs/helper-buffer": "1.9.0",
-        "@webassemblyjs/wasm-gen": "1.9.0",
-        "@webassemblyjs/wasm-parser": "1.9.0"
-      }
-    },
-    "node_modules/webpack-stream/node_modules/@webassemblyjs/wasm-parser": {
-      "version": "1.9.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@webassemblyjs/ast": "1.9.0",
-        "@webassemblyjs/helper-api-error": "1.9.0",
-        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
-        "@webassemblyjs/ieee754": "1.9.0",
-        "@webassemblyjs/leb128": "1.9.0",
-        "@webassemblyjs/utf8": "1.9.0"
-      }
-    },
-    "node_modules/webpack-stream/node_modules/@webassemblyjs/wast-printer": {
-      "version": "1.9.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@webassemblyjs/ast": "1.9.0",
-        "@webassemblyjs/wast-parser": "1.9.0",
-        "@xtuc/long": "4.2.2"
-      }
-    },
-    "node_modules/webpack-stream/node_modules/acorn": {
-      "version": "6.4.2",
-      "dev": true,
-      "license": "MIT",
-      "bin": {
-        "acorn": "bin/acorn"
-      },
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "node_modules/webpack-stream/node_modules/anymatch": {
-      "version": "3.1.2",
-      "dev": true,
-      "license": "ISC",
-      "optional": true,
-      "dependencies": {
-        "normalize-path": "^3.0.0",
-        "picomatch": "^2.0.4"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/webpack-stream/node_modules/binary-extensions": {
-      "version": "2.2.0",
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/webpack-stream/node_modules/braces": {
-      "version": "3.0.2",
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "dependencies": {
-        "fill-range": "^7.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/webpack-stream/node_modules/chokidar": {
-      "version": "3.5.3",
-      "dev": true,
-      "funding": [
-        {
-          "type": "individual",
-          "url": "https://paulmillr.com/funding/"
-        }
-      ],
-      "license": "MIT",
-      "optional": true,
-      "dependencies": {
-        "anymatch": "~3.1.2",
-        "braces": "~3.0.2",
-        "glob-parent": "~5.1.2",
-        "is-binary-path": "~2.1.0",
-        "is-glob": "~4.0.1",
-        "normalize-path": "~3.0.0",
-        "readdirp": "~3.6.0"
-      },
-      "engines": {
-        "node": ">= 8.10.0"
-      },
-      "optionalDependencies": {
-        "fsevents": "~2.3.2"
-      }
-    },
-    "node_modules/webpack-stream/node_modules/enhanced-resolve": {
-      "version": "4.5.0",
-      "dev": true,
-      "dependencies": {
-        "graceful-fs": "^4.1.2",
-        "memory-fs": "^0.5.0",
-        "tapable": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/webpack-stream/node_modules/eslint-scope": {
-      "version": "4.0.3",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "dependencies": {
-        "esrecurse": "^4.1.0",
-        "estraverse": "^4.1.1"
-      },
-      "engines": {
-        "node": ">=4.0.0"
-      }
-    },
-    "node_modules/webpack-stream/node_modules/fill-range": {
-      "version": "7.0.1",
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "dependencies": {
-        "to-regex-range": "^5.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/webpack-stream/node_modules/fsevents": {
-      "version": "2.3.2",
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
-      }
-    },
-    "node_modules/webpack-stream/node_modules/is-binary-path": {
-      "version": "2.1.0",
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "dependencies": {
-        "binary-extensions": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/webpack-stream/node_modules/is-number": {
-      "version": "7.0.0",
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "engines": {
-        "node": ">=0.12.0"
-      }
-    },
-    "node_modules/webpack-stream/node_modules/loader-runner": {
-      "version": "2.4.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=4.3.0 <5.0.0 || >=5.10"
-      }
-    },
-    "node_modules/webpack-stream/node_modules/readdirp": {
-      "version": "3.6.0",
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "dependencies": {
-        "picomatch": "^2.2.1"
-      },
-      "engines": {
-        "node": ">=8.10.0"
-      }
-    },
-    "node_modules/webpack-stream/node_modules/schema-utils": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ajv": "^6.1.0",
-        "ajv-errors": "^1.0.0",
-        "ajv-keywords": "^3.1.0"
-      },
-      "engines": {
-        "node": ">= 4"
-      }
-    },
-    "node_modules/webpack-stream/node_modules/serialize-javascript": {
-      "version": "4.0.0",
-      "dev": true,
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "randombytes": "^2.1.0"
-      }
-    },
-    "node_modules/webpack-stream/node_modules/tapable": {
-      "version": "1.1.3",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/webpack-stream/node_modules/terser-webpack-plugin": {
-      "version": "1.4.5",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "cacache": "^12.0.2",
-        "find-cache-dir": "^2.1.0",
-        "is-wsl": "^1.1.0",
-        "schema-utils": "^1.0.0",
-        "serialize-javascript": "^4.0.0",
-        "source-map": "^0.6.1",
-        "terser": "^4.1.2",
-        "webpack-sources": "^1.4.0",
-        "worker-farm": "^1.7.0"
-      },
-      "engines": {
-        "node": ">= 6.9.0"
-      },
-      "peerDependencies": {
-        "webpack": "^4.0.0"
-      }
-    },
-    "node_modules/webpack-stream/node_modules/to-regex-range": {
-      "version": "5.0.1",
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "dependencies": {
-        "is-number": "^7.0.0"
-      },
-      "engines": {
-        "node": ">=8.0"
-      }
-    },
-    "node_modules/webpack-stream/node_modules/watchpack": {
-      "version": "1.7.5",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "graceful-fs": "^4.1.2",
-        "neo-async": "^2.5.0"
-      },
-      "optionalDependencies": {
-        "chokidar": "^3.4.1",
-        "watchpack-chokidar2": "^2.0.1"
-      }
-    },
-    "node_modules/webpack-stream/node_modules/webpack": {
-      "version": "4.46.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@webassemblyjs/ast": "1.9.0",
-        "@webassemblyjs/helper-module-context": "1.9.0",
-        "@webassemblyjs/wasm-edit": "1.9.0",
-        "@webassemblyjs/wasm-parser": "1.9.0",
-        "acorn": "^6.4.1",
-        "ajv": "^6.10.2",
-        "ajv-keywords": "^3.4.1",
-        "chrome-trace-event": "^1.0.2",
-        "enhanced-resolve": "^4.5.0",
-        "eslint-scope": "^4.0.3",
-        "json-parse-better-errors": "^1.0.2",
-        "loader-runner": "^2.4.0",
-        "loader-utils": "^1.2.3",
-        "memory-fs": "^0.4.1",
-        "micromatch": "^3.1.10",
-        "mkdirp": "^0.5.3",
-        "neo-async": "^2.6.1",
-        "node-libs-browser": "^2.2.1",
-        "schema-utils": "^1.0.0",
-        "tapable": "^1.1.3",
-        "terser-webpack-plugin": "^1.4.3",
-        "watchpack": "^1.7.4",
-        "webpack-sources": "^1.4.1"
-      },
-      "bin": {
-        "webpack": "bin/webpack.js"
-      },
-      "engines": {
-        "node": ">=6.11.5"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/webpack"
-      },
-      "peerDependenciesMeta": {
-        "webpack-cli": {
-          "optional": true
-        },
-        "webpack-command": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/webpack-stream/node_modules/webpack-sources": {
-      "version": "1.4.3",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "source-list-map": "^2.0.0",
-        "source-map": "~0.6.1"
-      }
-    },
-    "node_modules/webpack-stream/node_modules/webpack/node_modules/memory-fs": {
-      "version": "0.4.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "errno": "^0.1.3",
-        "readable-stream": "^2.0.1"
-      }
-    },
-    "node_modules/webpack/node_modules/acorn": {
-      "version": "8.7.0",
-      "dev": true,
-      "license": "MIT",
-      "bin": {
-        "acorn": "bin/acorn"
-      },
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "node_modules/webpack/node_modules/acorn-import-assertions": {
-      "version": "1.8.0",
-      "dev": true,
-      "license": "MIT",
-      "peerDependencies": {
-        "acorn": "^8"
-      }
-    },
-    "node_modules/which": {
-      "version": "2.0.2",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "isexe": "^2.0.0"
-      },
-      "bin": {
-        "node-which": "bin/node-which"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/which-module": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/wildcard": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/word-wrap": {
-      "version": "1.2.3",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/worker-farm": {
-      "version": "1.7.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "errno": "~0.1.7"
-      }
-    },
-    "node_modules/wrap-ansi": {
-      "version": "2.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "string-width": "^1.0.1",
-        "strip-ansi": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/wrap-ansi/node_modules/ansi-regex": {
-      "version": "2.1.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "number-is-nan": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/wrap-ansi/node_modules/string-width": {
-      "version": "1.0.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "code-point-at": "^1.0.0",
-        "is-fullwidth-code-point": "^1.0.0",
-        "strip-ansi": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/wrap-ansi/node_modules/strip-ansi": {
-      "version": "3.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-regex": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/wrappy": {
-      "version": "1.0.2",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/write": {
-      "version": "1.0.3",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "mkdirp": "^0.5.1"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/ws": {
-      "version": "8.2.3",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=10.0.0"
-      },
-      "peerDependencies": {
-        "bufferutil": "^4.0.1",
-        "utf-8-validate": "^5.0.2"
-      },
-      "peerDependenciesMeta": {
-        "bufferutil": {
-          "optional": true
-        },
-        "utf-8-validate": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/xtend": {
-      "version": "4.0.2",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.4"
-      }
-    },
-    "node_modules/y18n": {
-      "version": "3.2.2",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/yallist": {
-      "version": "4.0.0",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/yargs": {
-      "version": "7.1.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "camelcase": "^3.0.0",
-        "cliui": "^3.2.0",
-        "decamelize": "^1.1.1",
-        "get-caller-file": "^1.0.1",
-        "os-locale": "^1.4.0",
-        "read-pkg-up": "^1.0.1",
-        "require-directory": "^2.1.1",
-        "require-main-filename": "^1.0.1",
-        "set-blocking": "^2.0.0",
-        "string-width": "^1.0.2",
-        "which-module": "^1.0.0",
-        "y18n": "^3.2.1",
-        "yargs-parser": "^5.0.1"
-      }
-    },
-    "node_modules/yargs-parser": {
-      "version": "5.0.1",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "camelcase": "^3.0.0",
-        "object.assign": "^4.1.0"
-      }
-    },
-    "node_modules/yargs/node_modules/ansi-regex": {
-      "version": "2.1.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/yargs/node_modules/is-fullwidth-code-point": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "number-is-nan": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/yargs/node_modules/string-width": {
-      "version": "1.0.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "code-point-at": "^1.0.0",
-        "is-fullwidth-code-point": "^1.0.0",
-        "strip-ansi": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/yargs/node_modules/strip-ansi": {
-      "version": "3.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-regex": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "vendor/gulp-jsify": {
-      "version": "0.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "plugin-error": "~1.0.1",
-        "through": "~2.3.8",
-        "vinyl": "~2.2.1"
-      }
-    }
-  },
-  "dependencies": {
-    "@babel/code-frame": {
-      "version": "7.12.11",
-      "dev": true,
-      "requires": {
-        "@babel/highlight": "^7.10.4"
-      }
-    },
-    "@babel/helper-validator-identifier": {
-      "version": "7.16.7",
-      "dev": true
-    },
-    "@babel/highlight": {
-      "version": "7.16.10",
-      "dev": true,
-      "requires": {
-        "@babel/helper-validator-identifier": "^7.16.7",
-        "chalk": "^2.0.0",
-        "js-tokens": "^4.0.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "3.2.1",
-          "dev": true,
-          "requires": {
-            "color-convert": "^1.9.0"
-          }
-        },
-        "chalk": {
-          "version": "2.4.2",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^3.2.1",
-            "escape-string-regexp": "^1.0.5",
-            "supports-color": "^5.3.0"
-          }
-        },
-        "color-convert": {
-          "version": "1.9.3",
-          "dev": true,
-          "requires": {
-            "color-name": "1.1.3"
-          }
-        },
-        "color-name": {
-          "version": "1.1.3",
-          "dev": true
-        },
-        "escape-string-regexp": {
-          "version": "1.0.5",
-          "dev": true
-        },
-        "has-flag": {
-          "version": "3.0.0",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "5.5.0",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
-      }
-    },
-    "@discoveryjs/json-ext": {
-      "version": "0.5.6",
-      "dev": true
-    },
-    "@eslint/eslintrc": {
-      "version": "0.4.3",
-      "dev": true,
-      "requires": {
-        "ajv": "^6.12.4",
-        "debug": "^4.1.1",
-        "espree": "^7.3.0",
-        "globals": "^13.9.0",
-        "ignore": "^4.0.6",
-        "import-fresh": "^3.2.1",
-        "js-yaml": "^3.13.1",
-        "minimatch": "^3.0.4",
-        "strip-json-comments": "^3.1.1"
-      }
-    },
-    "@humanwhocodes/config-array": {
-      "version": "0.5.0",
-      "dev": true,
-      "requires": {
-        "@humanwhocodes/object-schema": "^1.2.0",
-        "debug": "^4.1.1",
-        "minimatch": "^3.0.4"
-      }
-    },
-    "@humanwhocodes/object-schema": {
-      "version": "1.2.1",
-      "dev": true
-    },
-    "@socket.io/base64-arraybuffer": {
-      "version": "1.0.2",
-      "dev": true
-    },
-    "@types/component-emitter": {
-      "version": "1.2.11",
-      "dev": true
-    },
-    "@types/cookie": {
-      "version": "0.4.1",
-      "dev": true
-    },
-    "@types/cors": {
-      "version": "2.8.12",
-      "dev": true
-    },
-    "@types/eslint": {
-      "version": "8.4.1",
-      "dev": true,
-      "requires": {
-        "@types/estree": "*",
-        "@types/json-schema": "*"
-      }
-    },
-    "@types/eslint-scope": {
-      "version": "3.7.3",
-      "dev": true,
-      "requires": {
-        "@types/eslint": "*",
-        "@types/estree": "*"
-      }
-    },
-    "@types/estree": {
-      "version": "0.0.51",
-      "dev": true
-    },
-    "@types/json-schema": {
-      "version": "7.0.9",
-      "dev": true
-    },
-    "@types/node": {
-      "version": "17.0.18",
-      "dev": true
-    },
-    "@webassemblyjs/ast": {
-      "version": "1.11.1",
-      "dev": true,
-      "requires": {
-        "@webassemblyjs/helper-numbers": "1.11.1",
-        "@webassemblyjs/helper-wasm-bytecode": "1.11.1"
-      }
-    },
-    "@webassemblyjs/floating-point-hex-parser": {
-      "version": "1.11.1",
-      "dev": true
-    },
-    "@webassemblyjs/helper-api-error": {
-      "version": "1.11.1",
-      "dev": true
-    },
-    "@webassemblyjs/helper-buffer": {
-      "version": "1.11.1",
-      "dev": true
-    },
-    "@webassemblyjs/helper-code-frame": {
-      "version": "1.9.0",
-      "dev": true,
-      "requires": {
-        "@webassemblyjs/wast-printer": "1.9.0"
-      },
-      "dependencies": {
-        "@webassemblyjs/ast": {
-          "version": "1.9.0",
-          "dev": true,
-          "requires": {
-            "@webassemblyjs/helper-module-context": "1.9.0",
-            "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
-            "@webassemblyjs/wast-parser": "1.9.0"
-          }
-        },
-        "@webassemblyjs/helper-wasm-bytecode": {
-          "version": "1.9.0",
-          "dev": true
-        },
-        "@webassemblyjs/wast-printer": {
-          "version": "1.9.0",
-          "dev": true,
-          "requires": {
-            "@webassemblyjs/ast": "1.9.0",
-            "@webassemblyjs/wast-parser": "1.9.0",
-            "@xtuc/long": "4.2.2"
-          }
-        }
-      }
-    },
-    "@webassemblyjs/helper-fsm": {
-      "version": "1.9.0",
-      "dev": true
-    },
-    "@webassemblyjs/helper-module-context": {
-      "version": "1.9.0",
-      "dev": true,
-      "requires": {
-        "@webassemblyjs/ast": "1.9.0"
-      },
-      "dependencies": {
-        "@webassemblyjs/ast": {
-          "version": "1.9.0",
-          "dev": true,
-          "requires": {
-            "@webassemblyjs/helper-module-context": "1.9.0",
-            "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
-            "@webassemblyjs/wast-parser": "1.9.0"
-          }
-        },
-        "@webassemblyjs/helper-wasm-bytecode": {
-          "version": "1.9.0",
-          "dev": true
-        }
-      }
-    },
-    "@webassemblyjs/helper-numbers": {
-      "version": "1.11.1",
-      "dev": true,
-      "requires": {
-        "@webassemblyjs/floating-point-hex-parser": "1.11.1",
-        "@webassemblyjs/helper-api-error": "1.11.1",
-        "@xtuc/long": "4.2.2"
-      }
-    },
-    "@webassemblyjs/helper-wasm-bytecode": {
-      "version": "1.11.1",
-      "dev": true
-    },
-    "@webassemblyjs/helper-wasm-section": {
-      "version": "1.11.1",
-      "dev": true,
-      "requires": {
-        "@webassemblyjs/ast": "1.11.1",
-        "@webassemblyjs/helper-buffer": "1.11.1",
-        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
-        "@webassemblyjs/wasm-gen": "1.11.1"
-      }
-    },
-    "@webassemblyjs/ieee754": {
-      "version": "1.11.1",
-      "dev": true,
-      "requires": {
-        "@xtuc/ieee754": "^1.2.0"
-      }
-    },
-    "@webassemblyjs/leb128": {
-      "version": "1.11.1",
-      "dev": true,
-      "requires": {
-        "@xtuc/long": "4.2.2"
-      }
-    },
-    "@webassemblyjs/utf8": {
-      "version": "1.11.1",
-      "dev": true
-    },
-    "@webassemblyjs/wasm-edit": {
-      "version": "1.11.1",
-      "dev": true,
-      "requires": {
-        "@webassemblyjs/ast": "1.11.1",
-        "@webassemblyjs/helper-buffer": "1.11.1",
-        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
-        "@webassemblyjs/helper-wasm-section": "1.11.1",
-        "@webassemblyjs/wasm-gen": "1.11.1",
-        "@webassemblyjs/wasm-opt": "1.11.1",
-        "@webassemblyjs/wasm-parser": "1.11.1",
-        "@webassemblyjs/wast-printer": "1.11.1"
-      }
-    },
-    "@webassemblyjs/wasm-gen": {
-      "version": "1.11.1",
-      "dev": true,
-      "requires": {
-        "@webassemblyjs/ast": "1.11.1",
-        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
-        "@webassemblyjs/ieee754": "1.11.1",
-        "@webassemblyjs/leb128": "1.11.1",
-        "@webassemblyjs/utf8": "1.11.1"
-      }
-    },
-    "@webassemblyjs/wasm-opt": {
-      "version": "1.11.1",
-      "dev": true,
-      "requires": {
-        "@webassemblyjs/ast": "1.11.1",
-        "@webassemblyjs/helper-buffer": "1.11.1",
-        "@webassemblyjs/wasm-gen": "1.11.1",
-        "@webassemblyjs/wasm-parser": "1.11.1"
-      }
-    },
-    "@webassemblyjs/wasm-parser": {
-      "version": "1.11.1",
-      "dev": true,
-      "requires": {
-        "@webassemblyjs/ast": "1.11.1",
-        "@webassemblyjs/helper-api-error": "1.11.1",
-        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
-        "@webassemblyjs/ieee754": "1.11.1",
-        "@webassemblyjs/leb128": "1.11.1",
-        "@webassemblyjs/utf8": "1.11.1"
-      }
-    },
-    "@webassemblyjs/wast-parser": {
-      "version": "1.9.0",
-      "dev": true,
-      "requires": {
-        "@webassemblyjs/ast": "1.9.0",
-        "@webassemblyjs/floating-point-hex-parser": "1.9.0",
-        "@webassemblyjs/helper-api-error": "1.9.0",
-        "@webassemblyjs/helper-code-frame": "1.9.0",
-        "@webassemblyjs/helper-fsm": "1.9.0",
-        "@xtuc/long": "4.2.2"
-      },
-      "dependencies": {
-        "@webassemblyjs/ast": {
-          "version": "1.9.0",
-          "dev": true,
-          "requires": {
-            "@webassemblyjs/helper-module-context": "1.9.0",
-            "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
-            "@webassemblyjs/wast-parser": "1.9.0"
-          }
-        },
-        "@webassemblyjs/floating-point-hex-parser": {
-          "version": "1.9.0",
-          "dev": true
-        },
-        "@webassemblyjs/helper-api-error": {
-          "version": "1.9.0",
-          "dev": true
-        },
-        "@webassemblyjs/helper-wasm-bytecode": {
-          "version": "1.9.0",
-          "dev": true
-        }
-      }
-    },
-    "@webassemblyjs/wast-printer": {
-      "version": "1.11.1",
-      "dev": true,
-      "requires": {
-        "@webassemblyjs/ast": "1.11.1",
-        "@xtuc/long": "4.2.2"
-      }
-    },
-    "@webpack-cli/configtest": {
-      "version": "1.1.1",
-      "dev": true,
-      "requires": {}
-    },
-    "@webpack-cli/info": {
-      "version": "1.4.1",
-      "dev": true,
-      "requires": {
-        "envinfo": "^7.7.3"
-      }
-    },
-    "@webpack-cli/serve": {
-      "version": "1.6.1",
-      "dev": true,
-      "requires": {}
-    },
-    "@xtuc/ieee754": {
-      "version": "1.2.0",
-      "dev": true
-    },
-    "@xtuc/long": {
-      "version": "4.2.2",
-      "dev": true
-    },
-    "accepts": {
-      "version": "1.3.8",
-      "dev": true,
-      "requires": {
-        "mime-types": "~2.1.34",
-        "negotiator": "0.6.3"
-      }
-    },
-    "acorn": {
-      "version": "7.4.1",
-      "dev": true
-    },
-    "acorn-jsx": {
-      "version": "5.3.2",
-      "dev": true,
-      "requires": {}
-    },
-    "ajv": {
-      "version": "6.12.6",
-      "dev": true,
-      "requires": {
-        "fast-deep-equal": "^3.1.1",
-        "fast-json-stable-stringify": "^2.0.0",
-        "json-schema-traverse": "^0.4.1",
-        "uri-js": "^4.2.2"
-      }
-    },
-    "ajv-errors": {
-      "version": "1.0.1",
-      "dev": true,
-      "requires": {}
-    },
-    "ajv-keywords": {
-      "version": "3.5.2",
-      "dev": true,
-      "requires": {}
-    },
-    "ansi-colors": {
-      "version": "4.1.1",
-      "dev": true
-    },
-    "ansi-escapes": {
-      "version": "4.3.2",
-      "dev": true,
-      "requires": {
-        "type-fest": "^0.21.3"
-      },
-      "dependencies": {
-        "type-fest": {
-          "version": "0.21.3",
-          "dev": true
-        }
-      }
-    },
-    "ansi-gray": {
-      "version": "0.1.1",
-      "dev": true,
-      "requires": {
-        "ansi-wrap": "0.1.0"
-      }
-    },
-    "ansi-regex": {
-      "version": "5.0.1",
-      "dev": true
-    },
-    "ansi-styles": {
-      "version": "4.3.0",
-      "dev": true,
-      "requires": {
-        "color-convert": "^2.0.1"
-      }
-    },
-    "ansi-wrap": {
-      "version": "0.1.0",
-      "dev": true
-    },
-    "anymatch": {
-      "version": "2.0.0",
-      "dev": true,
-      "requires": {
-        "micromatch": "^3.1.4",
-        "normalize-path": "^2.1.1"
-      },
-      "dependencies": {
-        "normalize-path": {
-          "version": "2.1.1",
-          "dev": true,
-          "requires": {
-            "remove-trailing-separator": "^1.0.1"
-          }
-        }
-      }
-    },
-    "append-buffer": {
-      "version": "1.0.2",
-      "dev": true,
-      "requires": {
-        "buffer-equal": "^1.0.0"
-      }
-    },
-    "aproba": {
-      "version": "1.2.0",
-      "dev": true
-    },
-    "archy": {
-      "version": "1.0.0",
-      "dev": true
-    },
-    "argparse": {
-      "version": "1.0.10",
-      "dev": true,
-      "requires": {
-        "sprintf-js": "~1.0.2"
-      }
-    },
-    "arr-diff": {
-      "version": "4.0.0",
-      "dev": true
-    },
-    "arr-filter": {
-      "version": "1.1.2",
-      "dev": true,
-      "requires": {
-        "make-iterator": "^1.0.0"
-      }
-    },
-    "arr-flatten": {
-      "version": "1.1.0",
-      "dev": true
-    },
-    "arr-map": {
-      "version": "2.0.2",
-      "dev": true,
-      "requires": {
-        "make-iterator": "^1.0.0"
-      }
-    },
-    "arr-union": {
-      "version": "3.1.0",
-      "dev": true
-    },
-    "array-each": {
-      "version": "1.0.1",
-      "dev": true
-    },
-    "array-initial": {
-      "version": "1.1.0",
-      "dev": true,
-      "requires": {
-        "array-slice": "^1.0.0",
-        "is-number": "^4.0.0"
-      },
-      "dependencies": {
-        "is-number": {
-          "version": "4.0.0",
-          "dev": true
-        }
-      }
-    },
-    "array-last": {
-      "version": "1.3.0",
-      "dev": true,
-      "requires": {
-        "is-number": "^4.0.0"
-      },
-      "dependencies": {
-        "is-number": {
-          "version": "4.0.0",
-          "dev": true
-        }
-      }
-    },
-    "array-slice": {
-      "version": "1.1.0",
-      "dev": true
-    },
-    "array-sort": {
-      "version": "1.0.0",
-      "dev": true,
-      "requires": {
-        "default-compare": "^1.0.0",
-        "get-value": "^2.0.6",
-        "kind-of": "^5.0.2"
-      }
-    },
-    "array-unique": {
-      "version": "0.3.2",
-      "dev": true
-    },
-    "asn1.js": {
-      "version": "5.4.1",
-      "dev": true,
-      "requires": {
-        "bn.js": "^4.0.0",
-        "inherits": "^2.0.1",
-        "minimalistic-assert": "^1.0.0",
-        "safer-buffer": "^2.1.0"
-      },
-      "dependencies": {
-        "bn.js": {
-          "version": "4.12.0",
-          "dev": true
-        }
-      }
-    },
-    "assert": {
-      "version": "1.5.0",
-      "dev": true,
-      "requires": {
-        "object-assign": "^4.1.1",
-        "util": "0.10.3"
-      },
-      "dependencies": {
-        "inherits": {
-          "version": "2.0.1",
-          "dev": true
-        },
-        "util": {
-          "version": "0.10.3",
-          "dev": true,
-          "requires": {
-            "inherits": "2.0.1"
-          }
-        }
-      }
-    },
-    "assign-symbols": {
-      "version": "1.0.0",
-      "dev": true
-    },
-    "astral-regex": {
-      "version": "2.0.0",
-      "dev": true
-    },
-    "async-done": {
-      "version": "1.3.2",
-      "dev": true,
-      "requires": {
-        "end-of-stream": "^1.1.0",
-        "once": "^1.3.2",
-        "process-nextick-args": "^2.0.0",
-        "stream-exhaust": "^1.0.1"
-      }
-    },
-    "async-each": {
-      "version": "1.0.3",
-      "dev": true
-    },
-    "async-settle": {
-      "version": "1.0.0",
-      "dev": true,
-      "requires": {
-        "async-done": "^1.2.2"
-      }
-    },
-    "atob": {
-      "version": "2.1.2",
-      "dev": true
-    },
-    "bach": {
-      "version": "1.2.0",
-      "dev": true,
-      "requires": {
-        "arr-filter": "^1.1.1",
-        "arr-flatten": "^1.0.1",
-        "arr-map": "^2.0.0",
-        "array-each": "^1.0.0",
-        "array-initial": "^1.0.0",
-        "array-last": "^1.1.1",
-        "async-done": "^1.2.2",
-        "async-settle": "^1.0.0",
-        "now-and-later": "^2.0.0"
-      }
-    },
-    "balanced-match": {
-      "version": "1.0.2",
-      "dev": true
-    },
-    "base": {
-      "version": "0.11.2",
-      "dev": true,
-      "requires": {
-        "cache-base": "^1.0.1",
-        "class-utils": "^0.3.5",
-        "component-emitter": "^1.2.1",
-        "define-property": "^1.0.0",
-        "isobject": "^3.0.1",
-        "mixin-deep": "^1.2.0",
-        "pascalcase": "^0.1.1"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "1.0.0",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^1.0.0"
-          }
-        }
-      }
-    },
-    "base64-js": {
-      "version": "1.5.1",
-      "dev": true
-    },
-    "base64id": {
-      "version": "2.0.0",
-      "dev": true
-    },
-    "big.js": {
-      "version": "5.2.2",
-      "dev": true
-    },
-    "binary-extensions": {
-      "version": "1.13.1",
-      "dev": true
-    },
-    "bindings": {
-      "version": "1.5.0",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "file-uri-to-path": "1.0.0"
-      }
-    },
-    "bluebird": {
-      "version": "3.7.2",
-      "dev": true
-    },
-    "bn.js": {
-      "version": "5.2.0",
-      "dev": true
-    },
-    "body-parser": {
-      "version": "1.19.2",
-      "dev": true,
-      "requires": {
-        "bytes": "3.1.2",
-        "content-type": "~1.0.4",
-        "debug": "2.6.9",
-        "depd": "~1.1.2",
-        "http-errors": "1.8.1",
-        "iconv-lite": "0.4.24",
-        "on-finished": "~2.3.0",
-        "qs": "6.9.7",
-        "raw-body": "2.4.3",
-        "type-is": "~1.6.18"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "ms": {
-          "version": "2.0.0",
-          "dev": true
-        }
-      }
-    },
-    "brace-expansion": {
-      "version": "1.1.11",
-      "dev": true,
-      "requires": {
-        "balanced-match": "^1.0.0",
-        "concat-map": "0.0.1"
-      }
-    },
-    "braces": {
-      "version": "2.3.2",
-      "dev": true,
-      "requires": {
-        "arr-flatten": "^1.1.0",
-        "array-unique": "^0.3.2",
-        "extend-shallow": "^2.0.1",
-        "fill-range": "^4.0.0",
-        "isobject": "^3.0.1",
-        "repeat-element": "^1.1.2",
-        "snapdragon": "^0.8.1",
-        "snapdragon-node": "^2.0.1",
-        "split-string": "^3.0.2",
-        "to-regex": "^3.0.1"
-      }
-    },
-    "brorand": {
-      "version": "1.1.0",
-      "dev": true
-    },
-    "browserify-aes": {
-      "version": "1.2.0",
-      "dev": true,
-      "requires": {
-        "buffer-xor": "^1.0.3",
-        "cipher-base": "^1.0.0",
-        "create-hash": "^1.1.0",
-        "evp_bytestokey": "^1.0.3",
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.0.1"
-      }
-    },
-    "browserify-cipher": {
-      "version": "1.0.1",
-      "dev": true,
-      "requires": {
-        "browserify-aes": "^1.0.4",
-        "browserify-des": "^1.0.0",
-        "evp_bytestokey": "^1.0.0"
-      }
-    },
-    "browserify-des": {
-      "version": "1.0.2",
-      "dev": true,
-      "requires": {
-        "cipher-base": "^1.0.1",
-        "des.js": "^1.0.0",
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.1.2"
-      }
-    },
-    "browserify-rsa": {
-      "version": "4.1.0",
-      "dev": true,
-      "requires": {
-        "bn.js": "^5.0.0",
-        "randombytes": "^2.0.1"
-      }
-    },
-    "browserify-sign": {
-      "version": "4.2.1",
-      "dev": true,
-      "requires": {
-        "bn.js": "^5.1.1",
-        "browserify-rsa": "^4.0.1",
-        "create-hash": "^1.2.0",
-        "create-hmac": "^1.1.7",
-        "elliptic": "^6.5.3",
-        "inherits": "^2.0.4",
-        "parse-asn1": "^5.1.5",
-        "readable-stream": "^3.6.0",
-        "safe-buffer": "^5.2.0"
-      },
-      "dependencies": {
-        "readable-stream": {
-          "version": "3.6.0",
-          "dev": true,
-          "requires": {
-            "inherits": "^2.0.3",
-            "string_decoder": "^1.1.1",
-            "util-deprecate": "^1.0.1"
-          }
-        },
-        "safe-buffer": {
-          "version": "5.2.1",
-          "dev": true
-        }
-      }
-    },
-    "browserify-zlib": {
-      "version": "0.2.0",
-      "dev": true,
-      "requires": {
-        "pako": "~1.0.5"
-      }
-    },
-    "browserslist": {
-      "version": "4.19.1",
-      "dev": true,
-      "requires": {
-        "caniuse-lite": "^1.0.30001286",
-        "electron-to-chromium": "^1.4.17",
-        "escalade": "^3.1.1",
-        "node-releases": "^2.0.1",
-        "picocolors": "^1.0.0"
-      }
-    },
-    "buffer": {
-      "version": "4.9.2",
-      "dev": true,
-      "requires": {
-        "base64-js": "^1.0.2",
-        "ieee754": "^1.1.4",
-        "isarray": "^1.0.0"
-      }
-    },
-    "buffer-equal": {
-      "version": "1.0.0",
-      "dev": true
-    },
-    "buffer-from": {
-      "version": "1.1.2",
-      "dev": true
-    },
-    "buffer-xor": {
-      "version": "1.0.3",
-      "dev": true
-    },
-    "builtin-status-codes": {
-      "version": "3.0.0",
-      "dev": true
-    },
-    "bytes": {
-      "version": "3.1.2",
-      "dev": true
-    },
-    "cacache": {
-      "version": "12.0.4",
-      "dev": true,
-      "requires": {
-        "bluebird": "^3.5.5",
-        "chownr": "^1.1.1",
-        "figgy-pudding": "^3.5.1",
-        "glob": "^7.1.4",
-        "graceful-fs": "^4.1.15",
-        "infer-owner": "^1.0.3",
-        "lru-cache": "^5.1.1",
-        "mississippi": "^3.0.0",
-        "mkdirp": "^0.5.1",
-        "move-concurrently": "^1.0.1",
-        "promise-inflight": "^1.0.1",
-        "rimraf": "^2.6.3",
-        "ssri": "^6.0.1",
-        "unique-filename": "^1.1.1",
-        "y18n": "^4.0.0"
-      },
-      "dependencies": {
-        "lru-cache": {
-          "version": "5.1.1",
-          "dev": true,
-          "requires": {
-            "yallist": "^3.0.2"
-          }
-        },
-        "rimraf": {
-          "version": "2.7.1",
-          "dev": true,
-          "requires": {
-            "glob": "^7.1.3"
-          }
-        },
-        "y18n": {
-          "version": "4.0.3",
-          "dev": true
-        },
-        "yallist": {
-          "version": "3.1.1",
-          "dev": true
-        }
-      }
-    },
-    "cache-base": {
-      "version": "1.0.1",
-      "dev": true,
-      "requires": {
-        "collection-visit": "^1.0.0",
-        "component-emitter": "^1.2.1",
-        "get-value": "^2.0.6",
-        "has-value": "^1.0.0",
-        "isobject": "^3.0.1",
-        "set-value": "^2.0.0",
-        "to-object-path": "^0.3.0",
-        "union-value": "^1.0.0",
-        "unset-value": "^1.0.0"
-      }
-    },
-    "call-bind": {
-      "version": "1.0.2",
-      "dev": true,
-      "requires": {
-        "function-bind": "^1.1.1",
-        "get-intrinsic": "^1.0.2"
-      }
-    },
-    "callsites": {
-      "version": "3.1.0",
-      "dev": true
-    },
-    "camelcase": {
-      "version": "3.0.0",
-      "dev": true
-    },
-    "caniuse-lite": {
-      "version": "1.0.30001312",
-      "dev": true
-    },
-    "chalk": {
-      "version": "4.1.2",
-      "dev": true,
-      "requires": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      }
-    },
-    "chardet": {
-      "version": "0.7.0",
-      "dev": true
-    },
-    "chokidar": {
-      "version": "2.1.8",
-      "dev": true,
-      "requires": {
-        "anymatch": "^2.0.0",
-        "async-each": "^1.0.1",
-        "braces": "^2.3.2",
-        "fsevents": "^1.2.7",
-        "glob-parent": "^3.1.0",
-        "inherits": "^2.0.3",
-        "is-binary-path": "^1.0.0",
-        "is-glob": "^4.0.0",
-        "normalize-path": "^3.0.0",
-        "path-is-absolute": "^1.0.0",
-        "readdirp": "^2.2.1",
-        "upath": "^1.1.1"
-      },
-      "dependencies": {
-        "glob-parent": {
-          "version": "3.1.0",
-          "dev": true,
-          "requires": {
-            "is-glob": "^3.1.0",
-            "path-dirname": "^1.0.0"
-          },
-          "dependencies": {
-            "is-glob": {
-              "version": "3.1.0",
-              "dev": true,
-              "requires": {
-                "is-extglob": "^2.1.0"
-              }
-            }
-          }
-        }
-      }
-    },
-    "chownr": {
-      "version": "1.1.4",
-      "dev": true
-    },
-    "chrome-trace-event": {
-      "version": "1.0.3",
-      "dev": true
-    },
-    "cipher-base": {
-      "version": "1.0.4",
-      "dev": true,
-      "requires": {
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.0.1"
-      }
-    },
-    "class-utils": {
-      "version": "0.3.6",
-      "dev": true,
-      "requires": {
-        "arr-union": "^3.1.0",
-        "define-property": "^0.2.5",
-        "isobject": "^3.0.0",
-        "static-extend": "^0.1.1"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "0.2.5",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        },
-        "is-accessor-descriptor": {
-          "version": "0.1.6",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.0.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "dev": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            }
-          }
-        },
-        "is-data-descriptor": {
-          "version": "0.1.4",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.0.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "dev": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            }
-          }
-        },
-        "is-descriptor": {
-          "version": "0.1.6",
-          "dev": true,
-          "requires": {
-            "is-accessor-descriptor": "^0.1.6",
-            "is-data-descriptor": "^0.1.4",
-            "kind-of": "^5.0.0"
-          }
-        }
-      }
-    },
-    "cli-cursor": {
-      "version": "3.1.0",
-      "dev": true,
-      "requires": {
-        "restore-cursor": "^3.1.0"
-      }
-    },
-    "cli-width": {
-      "version": "3.0.0",
-      "dev": true
-    },
-    "cliui": {
-      "version": "3.2.0",
-      "dev": true,
-      "requires": {
-        "string-width": "^1.0.1",
-        "strip-ansi": "^3.0.1",
-        "wrap-ansi": "^2.0.0"
-      },
-      "dependencies": {
-        "ansi-regex": {
-          "version": "2.1.1",
-          "dev": true
-        },
-        "is-fullwidth-code-point": {
-          "version": "1.0.0",
-          "dev": true,
-          "requires": {
-            "number-is-nan": "^1.0.0"
-          }
-        },
-        "string-width": {
-          "version": "1.0.2",
-          "dev": true,
-          "requires": {
-            "code-point-at": "^1.0.0",
-            "is-fullwidth-code-point": "^1.0.0",
-            "strip-ansi": "^3.0.0"
-          }
-        },
-        "strip-ansi": {
-          "version": "3.0.1",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^2.0.0"
-          }
-        }
-      }
-    },
-    "clone": {
-      "version": "2.1.2",
-      "dev": true
-    },
-    "clone-buffer": {
-      "version": "1.0.0",
-      "dev": true
-    },
-    "clone-deep": {
-      "version": "4.0.1",
-      "dev": true,
-      "requires": {
-        "is-plain-object": "^2.0.4",
-        "kind-of": "^6.0.2",
-        "shallow-clone": "^3.0.0"
-      },
-      "dependencies": {
-        "is-plain-object": {
-          "version": "2.0.4",
-          "dev": true,
-          "requires": {
-            "isobject": "^3.0.1"
-          }
-        },
-        "kind-of": {
-          "version": "6.0.3",
-          "dev": true
-        }
-      }
-    },
-    "clone-stats": {
-      "version": "1.0.0",
-      "dev": true
-    },
-    "cloneable-readable": {
-      "version": "1.1.3",
-      "dev": true,
-      "requires": {
-        "inherits": "^2.0.1",
-        "process-nextick-args": "^2.0.0",
-        "readable-stream": "^2.3.5"
-      }
-    },
-    "code-point-at": {
-      "version": "1.1.0",
-      "dev": true
-    },
-    "collection-map": {
-      "version": "1.0.0",
-      "dev": true,
-      "requires": {
-        "arr-map": "^2.0.2",
-        "for-own": "^1.0.0",
-        "make-iterator": "^1.0.0"
-      }
-    },
-    "collection-visit": {
-      "version": "1.0.0",
-      "dev": true,
-      "requires": {
-        "map-visit": "^1.0.0",
-        "object-visit": "^1.0.0"
-      }
-    },
-    "color-convert": {
-      "version": "2.0.1",
-      "dev": true,
-      "requires": {
-        "color-name": "~1.1.4"
-      }
-    },
-    "color-name": {
-      "version": "1.1.4",
-      "dev": true
-    },
-    "color-support": {
-      "version": "1.1.3",
-      "dev": true
-    },
-    "colorette": {
-      "version": "2.0.16",
-      "dev": true
-    },
-    "colors": {
-      "version": "1.4.0",
-      "dev": true
-    },
-    "commander": {
-      "version": "7.2.0",
-      "dev": true
-    },
-    "commondir": {
-      "version": "1.0.1",
-      "dev": true
-    },
-    "component-emitter": {
-      "version": "1.3.0",
-      "dev": true
-    },
-    "concat-map": {
-      "version": "0.0.1",
-      "dev": true
-    },
-    "concat-stream": {
-      "version": "1.6.2",
-      "dev": true,
-      "requires": {
-        "buffer-from": "^1.0.0",
-        "inherits": "^2.0.3",
-        "readable-stream": "^2.2.2",
-        "typedarray": "^0.0.6"
-      }
-    },
-    "concat-with-sourcemaps": {
-      "version": "1.1.0",
-      "dev": true,
-      "requires": {
-        "source-map": "^0.6.1"
-      }
-    },
-    "connect": {
-      "version": "3.7.0",
-      "dev": true,
-      "requires": {
-        "debug": "2.6.9",
-        "finalhandler": "1.1.2",
-        "parseurl": "~1.3.3",
-        "utils-merge": "1.0.1"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "ms": {
-          "version": "2.0.0",
-          "dev": true
-        }
-      }
-    },
-    "console-browserify": {
-      "version": "1.2.0",
-      "dev": true
-    },
-    "constants-browserify": {
-      "version": "1.0.0",
-      "dev": true
-    },
-    "content-type": {
-      "version": "1.0.4",
-      "dev": true
-    },
-    "convert-source-map": {
-      "version": "1.8.0",
-      "dev": true,
-      "requires": {
-        "safe-buffer": "~5.1.1"
-      }
-    },
-    "cookie": {
-      "version": "0.4.2",
-      "dev": true
-    },
-    "copy-concurrently": {
-      "version": "1.0.5",
-      "dev": true,
-      "requires": {
-        "aproba": "^1.1.1",
-        "fs-write-stream-atomic": "^1.0.8",
-        "iferr": "^0.1.5",
-        "mkdirp": "^0.5.1",
-        "rimraf": "^2.5.4",
-        "run-queue": "^1.0.0"
-      },
-      "dependencies": {
-        "rimraf": {
-          "version": "2.7.1",
-          "dev": true,
-          "requires": {
-            "glob": "^7.1.3"
-          }
-        }
-      }
-    },
-    "copy-descriptor": {
-      "version": "0.1.1",
-      "dev": true
-    },
-    "copy-props": {
-      "version": "2.0.5",
-      "dev": true,
-      "requires": {
-        "each-props": "^1.3.2",
-        "is-plain-object": "^5.0.0"
-      }
-    },
-    "core-util-is": {
-      "version": "1.0.3",
-      "dev": true
-    },
-    "cors": {
-      "version": "2.8.5",
-      "dev": true,
-      "requires": {
-        "object-assign": "^4",
-        "vary": "^1"
-      }
-    },
-    "create-ecdh": {
-      "version": "4.0.4",
-      "dev": true,
-      "requires": {
-        "bn.js": "^4.1.0",
-        "elliptic": "^6.5.3"
-      },
-      "dependencies": {
-        "bn.js": {
-          "version": "4.12.0",
-          "dev": true
-        }
-      }
-    },
-    "create-hash": {
-      "version": "1.2.0",
-      "dev": true,
-      "requires": {
-        "cipher-base": "^1.0.1",
-        "inherits": "^2.0.1",
-        "md5.js": "^1.3.4",
-        "ripemd160": "^2.0.1",
-        "sha.js": "^2.4.0"
-      }
-    },
-    "create-hmac": {
-      "version": "1.1.7",
-      "dev": true,
-      "requires": {
-        "cipher-base": "^1.0.3",
-        "create-hash": "^1.1.0",
-        "inherits": "^2.0.1",
-        "ripemd160": "^2.0.0",
-        "safe-buffer": "^5.0.1",
-        "sha.js": "^2.4.8"
-      }
-    },
-    "cross-spawn": {
-      "version": "7.0.3",
-      "dev": true,
-      "requires": {
-        "path-key": "^3.1.0",
-        "shebang-command": "^2.0.0",
-        "which": "^2.0.1"
-      }
-    },
-    "crypto-browserify": {
-      "version": "3.12.0",
-      "dev": true,
-      "requires": {
-        "browserify-cipher": "^1.0.0",
-        "browserify-sign": "^4.0.0",
-        "create-ecdh": "^4.0.0",
-        "create-hash": "^1.1.0",
-        "create-hmac": "^1.1.0",
-        "diffie-hellman": "^5.0.0",
-        "inherits": "^2.0.1",
-        "pbkdf2": "^3.0.3",
-        "public-encrypt": "^4.0.0",
-        "randombytes": "^2.0.0",
-        "randomfill": "^1.0.3"
-      }
-    },
-    "cssauron": {
-      "version": "1.4.0",
-      "requires": {
-        "through": "X.X.X"
-      }
-    },
-    "custom-event": {
-      "version": "1.0.1",
-      "dev": true
-    },
-    "cyclist": {
-      "version": "1.0.1",
-      "dev": true
-    },
-    "d": {
-      "version": "1.0.1",
-      "dev": true,
-      "requires": {
-        "es5-ext": "^0.10.50",
-        "type": "^1.0.1"
-      }
-    },
-    "date-format": {
-      "version": "4.0.3",
-      "dev": true
-    },
-    "debug": {
-      "version": "4.3.3",
-      "dev": true,
-      "requires": {
-        "ms": "2.1.2"
-      }
-    },
-    "decamelize": {
-      "version": "1.2.0",
-      "dev": true
-    },
-    "decode-uri-component": {
-      "version": "0.2.0",
-      "dev": true
-    },
-    "deep-is": {
-      "version": "0.1.4",
-      "dev": true
-    },
-    "default-compare": {
-      "version": "1.0.0",
-      "dev": true,
-      "requires": {
-        "kind-of": "^5.0.2"
-      }
-    },
-    "default-resolution": {
-      "version": "2.0.0",
-      "dev": true
-    },
-    "define-properties": {
-      "version": "1.1.3",
-      "dev": true,
-      "requires": {
-        "object-keys": "^1.0.12"
-      }
-    },
-    "define-property": {
-      "version": "2.0.2",
-      "dev": true,
-      "requires": {
-        "is-descriptor": "^1.0.2",
-        "isobject": "^3.0.1"
-      }
-    },
-    "depd": {
-      "version": "1.1.2",
-      "dev": true
-    },
-    "des.js": {
-      "version": "1.0.1",
-      "dev": true,
-      "requires": {
-        "inherits": "^2.0.1",
-        "minimalistic-assert": "^1.0.0"
-      }
-    },
-    "detect-file": {
-      "version": "1.0.0",
-      "dev": true
-    },
-    "di": {
-      "version": "0.0.1",
-      "dev": true
-    },
-    "diffie-hellman": {
-      "version": "5.0.3",
-      "dev": true,
-      "requires": {
-        "bn.js": "^4.1.0",
-        "miller-rabin": "^4.0.0",
-        "randombytes": "^2.0.0"
-      },
-      "dependencies": {
-        "bn.js": {
-          "version": "4.12.0",
-          "dev": true
-        }
-      }
-    },
-    "doctrine": {
-      "version": "3.0.0",
-      "dev": true,
-      "requires": {
-        "esutils": "^2.0.2"
-      }
-    },
-    "dom-serialize": {
-      "version": "2.2.1",
-      "dev": true,
-      "requires": {
-        "custom-event": "~1.0.0",
-        "ent": "~2.2.0",
-        "extend": "^3.0.0",
-        "void-elements": "^2.0.0"
-      }
-    },
-    "domain-browser": {
-      "version": "1.2.0",
-      "dev": true
-    },
-    "duplexify": {
-      "version": "3.7.1",
-      "dev": true,
-      "requires": {
-        "end-of-stream": "^1.0.0",
-        "inherits": "^2.0.1",
-        "readable-stream": "^2.0.0",
-        "stream-shift": "^1.0.0"
-      }
-    },
-    "each-props": {
-      "version": "1.3.2",
-      "dev": true,
-      "requires": {
-        "is-plain-object": "^2.0.1",
-        "object.defaults": "^1.1.0"
-      },
-      "dependencies": {
-        "is-plain-object": {
-          "version": "2.0.4",
-          "dev": true,
-          "requires": {
-            "isobject": "^3.0.1"
-          }
-        }
-      }
-    },
-    "ee-first": {
-      "version": "1.1.1",
-      "dev": true
-    },
-    "electron-to-chromium": {
-      "version": "1.4.71",
-      "dev": true
-    },
-    "elliptic": {
-      "version": "6.5.4",
-      "dev": true,
-      "requires": {
-        "bn.js": "^4.11.9",
-        "brorand": "^1.1.0",
-        "hash.js": "^1.0.0",
-        "hmac-drbg": "^1.0.1",
-        "inherits": "^2.0.4",
-        "minimalistic-assert": "^1.0.1",
-        "minimalistic-crypto-utils": "^1.0.1"
-      },
-      "dependencies": {
-        "bn.js": {
-          "version": "4.12.0",
-          "dev": true
-        }
-      }
-    },
-    "emoji-regex": {
-      "version": "8.0.0",
-      "dev": true
-    },
-    "emojis-list": {
-      "version": "3.0.0",
-      "dev": true
-    },
-    "encodeurl": {
-      "version": "1.0.2",
-      "dev": true
-    },
-    "end-of-stream": {
-      "version": "1.4.4",
-      "dev": true,
-      "requires": {
-        "once": "^1.4.0"
-      }
-    },
-    "engine.io": {
-      "version": "6.1.2",
-      "dev": true,
-      "requires": {
-        "@types/cookie": "^0.4.1",
-        "@types/cors": "^2.8.12",
-        "@types/node": ">=10.0.0",
-        "accepts": "~1.3.4",
-        "base64id": "2.0.0",
-        "cookie": "~0.4.1",
-        "cors": "~2.8.5",
-        "debug": "~4.3.1",
-        "engine.io-parser": "~5.0.0",
-        "ws": "~8.2.3"
-      }
-    },
-    "engine.io-parser": {
-      "version": "5.0.3",
-      "dev": true,
-      "requires": {
-        "@socket.io/base64-arraybuffer": "~1.0.2"
-      }
-    },
-    "enhanced-resolve": {
-      "version": "5.9.0",
-      "dev": true,
-      "requires": {
-        "graceful-fs": "^4.2.4",
-        "tapable": "^2.2.0"
-      }
-    },
-    "enquirer": {
-      "version": "2.3.6",
-      "dev": true,
-      "requires": {
-        "ansi-colors": "^4.1.1"
-      }
-    },
-    "ent": {
-      "version": "2.2.0",
-      "dev": true
-    },
-    "envinfo": {
-      "version": "7.8.1",
-      "dev": true
-    },
-    "errno": {
-      "version": "0.1.8",
-      "dev": true,
-      "requires": {
-        "prr": "~1.0.1"
-      }
-    },
-    "error-ex": {
-      "version": "1.3.2",
-      "dev": true,
-      "requires": {
-        "is-arrayish": "^0.2.1"
-      }
-    },
-    "es-module-lexer": {
-      "version": "0.9.3",
-      "dev": true
-    },
-    "es5-ext": {
-      "version": "0.10.53",
-      "dev": true,
-      "requires": {
-        "es6-iterator": "~2.0.3",
-        "es6-symbol": "~3.1.3",
-        "next-tick": "~1.0.0"
-      }
-    },
-    "es6-iterator": {
-      "version": "2.0.3",
-      "dev": true,
-      "requires": {
-        "d": "1",
-        "es5-ext": "^0.10.35",
-        "es6-symbol": "^3.1.1"
-      }
-    },
-    "es6-symbol": {
-      "version": "3.1.3",
-      "dev": true,
-      "requires": {
-        "d": "^1.0.1",
-        "ext": "^1.1.2"
-      }
-    },
-    "es6-weak-map": {
-      "version": "2.0.3",
-      "dev": true,
-      "requires": {
-        "d": "1",
-        "es5-ext": "^0.10.46",
-        "es6-iterator": "^2.0.3",
-        "es6-symbol": "^3.1.1"
-      }
-    },
-    "escalade": {
-      "version": "3.1.1",
-      "dev": true
-    },
-    "escape-html": {
-      "version": "1.0.3",
-      "dev": true
-    },
-    "escape-string-regexp": {
-      "version": "4.0.0",
-      "dev": true
-    },
-    "eslint": {
-      "version": "7.32.0",
-      "dev": true,
-      "requires": {
-        "@babel/code-frame": "7.12.11",
-        "@eslint/eslintrc": "^0.4.3",
-        "@humanwhocodes/config-array": "^0.5.0",
-        "ajv": "^6.10.0",
-        "chalk": "^4.0.0",
-        "cross-spawn": "^7.0.2",
-        "debug": "^4.0.1",
-        "doctrine": "^3.0.0",
-        "enquirer": "^2.3.5",
-        "escape-string-regexp": "^4.0.0",
-        "eslint-scope": "^5.1.1",
-        "eslint-utils": "^2.1.0",
-        "eslint-visitor-keys": "^2.0.0",
-        "espree": "^7.3.1",
-        "esquery": "^1.4.0",
-        "esutils": "^2.0.2",
-        "fast-deep-equal": "^3.1.3",
-        "file-entry-cache": "^6.0.1",
-        "functional-red-black-tree": "^1.0.1",
-        "glob-parent": "^5.1.2",
-        "globals": "^13.6.0",
-        "ignore": "^4.0.6",
-        "import-fresh": "^3.0.0",
-        "imurmurhash": "^0.1.4",
-        "is-glob": "^4.0.0",
-        "js-yaml": "^3.13.1",
-        "json-stable-stringify-without-jsonify": "^1.0.1",
-        "levn": "^0.4.1",
-        "lodash.merge": "^4.6.2",
-        "minimatch": "^3.0.4",
-        "natural-compare": "^1.4.0",
-        "optionator": "^0.9.1",
-        "progress": "^2.0.0",
-        "regexpp": "^3.1.0",
-        "semver": "^7.2.1",
-        "strip-ansi": "^6.0.0",
-        "strip-json-comments": "^3.1.0",
-        "table": "^6.0.9",
-        "text-table": "^0.2.0",
-        "v8-compile-cache": "^2.0.3"
-      }
-    },
-    "eslint-plugin-jasmine": {
-      "version": "4.1.3",
-      "dev": true
-    },
-    "eslint-scope": {
-      "version": "5.1.1",
-      "dev": true,
-      "requires": {
-        "esrecurse": "^4.3.0",
-        "estraverse": "^4.1.1"
-      }
-    },
-    "eslint-utils": {
-      "version": "2.1.0",
-      "dev": true,
-      "requires": {
-        "eslint-visitor-keys": "^1.1.0"
-      },
-      "dependencies": {
-        "eslint-visitor-keys": {
-          "version": "1.3.0",
-          "dev": true
-        }
-      }
-    },
-    "eslint-visitor-keys": {
-      "version": "2.1.0",
-      "dev": true
-    },
-    "espree": {
-      "version": "7.3.1",
-      "dev": true,
-      "requires": {
-        "acorn": "^7.4.0",
-        "acorn-jsx": "^5.3.1",
-        "eslint-visitor-keys": "^1.3.0"
-      },
-      "dependencies": {
-        "eslint-visitor-keys": {
-          "version": "1.3.0",
-          "dev": true
-        }
-      }
-    },
-    "esprima": {
-      "version": "4.0.1",
-      "dev": true
-    },
-    "esquery": {
-      "version": "1.4.0",
-      "dev": true,
-      "requires": {
-        "estraverse": "^5.1.0"
-      },
-      "dependencies": {
-        "estraverse": {
-          "version": "5.3.0",
-          "dev": true
-        }
-      }
-    },
-    "esrecurse": {
-      "version": "4.3.0",
-      "dev": true,
-      "requires": {
-        "estraverse": "^5.2.0"
-      },
-      "dependencies": {
-        "estraverse": {
-          "version": "5.3.0",
-          "dev": true
-        }
-      }
-    },
-    "estraverse": {
-      "version": "4.3.0",
-      "dev": true
-    },
-    "esutils": {
-      "version": "2.0.3",
-      "dev": true
-    },
-    "eventemitter3": {
-      "version": "4.0.7",
-      "dev": true
-    },
-    "events": {
-      "version": "3.3.0",
-      "dev": true
-    },
-    "evp_bytestokey": {
-      "version": "1.0.3",
-      "dev": true,
-      "requires": {
-        "md5.js": "^1.3.4",
-        "safe-buffer": "^5.1.1"
-      }
-    },
-    "execa": {
-      "version": "5.1.1",
-      "dev": true,
-      "requires": {
-        "cross-spawn": "^7.0.3",
-        "get-stream": "^6.0.0",
-        "human-signals": "^2.1.0",
-        "is-stream": "^2.0.0",
-        "merge-stream": "^2.0.0",
-        "npm-run-path": "^4.0.1",
-        "onetime": "^5.1.2",
-        "signal-exit": "^3.0.3",
-        "strip-final-newline": "^2.0.0"
-      }
-    },
-    "expand-brackets": {
-      "version": "2.1.4",
-      "dev": true,
-      "requires": {
-        "debug": "^2.3.3",
-        "define-property": "^0.2.5",
-        "extend-shallow": "^2.0.1",
-        "posix-character-classes": "^0.1.0",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.1"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "define-property": {
-          "version": "0.2.5",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        },
-        "is-accessor-descriptor": {
-          "version": "0.1.6",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.0.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "dev": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            }
-          }
-        },
-        "is-data-descriptor": {
-          "version": "0.1.4",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.0.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "dev": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            }
-          }
-        },
-        "is-descriptor": {
-          "version": "0.1.6",
-          "dev": true,
-          "requires": {
-            "is-accessor-descriptor": "^0.1.6",
-            "is-data-descriptor": "^0.1.4",
-            "kind-of": "^5.0.0"
-          }
-        },
-        "ms": {
-          "version": "2.0.0",
-          "dev": true
-        }
-      }
-    },
-    "expand-range": {
-      "version": "1.8.2",
-      "dev": true,
-      "requires": {
-        "fill-range": "^2.1.0"
-      },
-      "dependencies": {
-        "fill-range": {
-          "version": "2.2.4",
-          "dev": true,
-          "requires": {
-            "is-number": "^2.1.0",
-            "isobject": "^2.0.0",
-            "randomatic": "^3.0.0",
-            "repeat-element": "^1.1.2",
-            "repeat-string": "^1.5.2"
-          }
-        },
-        "is-number": {
-          "version": "2.1.0",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.0.2"
-          }
-        },
-        "isobject": {
-          "version": "2.1.0",
-          "dev": true,
-          "requires": {
-            "isarray": "1.0.0"
-          }
-        },
-        "kind-of": {
-          "version": "3.2.2",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "expand-tilde": {
-      "version": "2.0.2",
-      "dev": true,
-      "requires": {
-        "homedir-polyfill": "^1.0.1"
-      }
-    },
-    "ext": {
-      "version": "1.6.0",
-      "dev": true,
-      "requires": {
-        "type": "^2.5.0"
-      },
-      "dependencies": {
-        "type": {
-          "version": "2.6.0",
-          "dev": true
-        }
-      }
-    },
-    "extend": {
-      "version": "3.0.2",
-      "dev": true
-    },
-    "extend-shallow": {
-      "version": "2.0.1",
-      "dev": true,
-      "requires": {
-        "is-extendable": "^0.1.0"
-      }
-    },
-    "external-editor": {
-      "version": "3.1.0",
-      "dev": true,
-      "requires": {
-        "chardet": "^0.7.0",
-        "iconv-lite": "^0.4.24",
-        "tmp": "^0.0.33"
-      },
-      "dependencies": {
-        "tmp": {
-          "version": "0.0.33",
-          "dev": true,
-          "requires": {
-            "os-tmpdir": "~1.0.2"
-          }
-        }
-      }
-    },
-    "extglob": {
-      "version": "2.0.4",
-      "dev": true,
-      "requires": {
-        "array-unique": "^0.3.2",
-        "define-property": "^1.0.0",
-        "expand-brackets": "^2.1.4",
-        "extend-shallow": "^2.0.1",
-        "fragment-cache": "^0.2.1",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.1"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "1.0.0",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^1.0.0"
-          }
-        }
-      }
-    },
-    "fancy-log": {
-      "version": "1.3.3",
-      "dev": true,
-      "requires": {
-        "ansi-gray": "^0.1.1",
-        "color-support": "^1.1.3",
-        "parse-node-version": "^1.0.0",
-        "time-stamp": "^1.0.0"
-      }
-    },
-    "fast-deep-equal": {
-      "version": "3.1.3",
-      "dev": true
-    },
-    "fast-json-stable-stringify": {
-      "version": "2.1.0",
-      "dev": true
-    },
-    "fast-levenshtein": {
-      "version": "2.0.6",
-      "dev": true
-    },
-    "fastest-levenshtein": {
-      "version": "1.0.12",
-      "dev": true
-    },
-    "figgy-pudding": {
-      "version": "3.5.2",
-      "dev": true
-    },
-    "figures": {
-      "version": "3.2.0",
-      "dev": true,
-      "requires": {
-        "escape-string-regexp": "^1.0.5"
-      },
-      "dependencies": {
-        "escape-string-regexp": {
-          "version": "1.0.5",
-          "dev": true
-        }
-      }
-    },
-    "file-entry-cache": {
-      "version": "6.0.1",
-      "dev": true,
-      "requires": {
-        "flat-cache": "^3.0.4"
-      }
-    },
-    "file-uri-to-path": {
-      "version": "1.0.0",
-      "dev": true,
-      "optional": true
-    },
-    "filename-regex": {
-      "version": "2.0.1",
-      "dev": true
-    },
-    "fill-range": {
-      "version": "4.0.0",
-      "dev": true,
-      "requires": {
-        "extend-shallow": "^2.0.1",
-        "is-number": "^3.0.0",
-        "repeat-string": "^1.6.1",
-        "to-regex-range": "^2.1.0"
-      }
-    },
-    "finalhandler": {
-      "version": "1.1.2",
-      "dev": true,
-      "requires": {
-        "debug": "2.6.9",
-        "encodeurl": "~1.0.2",
-        "escape-html": "~1.0.3",
-        "on-finished": "~2.3.0",
-        "parseurl": "~1.3.3",
-        "statuses": "~1.5.0",
-        "unpipe": "~1.0.0"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "ms": {
-          "version": "2.0.0",
-          "dev": true
-        }
-      }
-    },
-    "find-cache-dir": {
-      "version": "2.1.0",
-      "dev": true,
-      "requires": {
-        "commondir": "^1.0.1",
-        "make-dir": "^2.0.0",
-        "pkg-dir": "^3.0.0"
-      },
-      "dependencies": {
-        "find-up": {
-          "version": "3.0.0",
-          "dev": true,
-          "requires": {
-            "locate-path": "^3.0.0"
-          }
-        },
-        "locate-path": {
-          "version": "3.0.0",
-          "dev": true,
-          "requires": {
-            "p-locate": "^3.0.0",
-            "path-exists": "^3.0.0"
-          }
-        },
-        "p-locate": {
-          "version": "3.0.0",
-          "dev": true,
-          "requires": {
-            "p-limit": "^2.0.0"
-          }
-        },
-        "path-exists": {
-          "version": "3.0.0",
-          "dev": true
-        },
-        "pkg-dir": {
-          "version": "3.0.0",
-          "dev": true,
-          "requires": {
-            "find-up": "^3.0.0"
-          }
-        }
-      }
-    },
-    "find-up": {
-      "version": "4.1.0",
-      "dev": true,
-      "requires": {
-        "locate-path": "^5.0.0",
-        "path-exists": "^4.0.0"
-      }
-    },
-    "findup-sync": {
-      "version": "3.0.0",
-      "dev": true,
-      "requires": {
-        "detect-file": "^1.0.0",
-        "is-glob": "^4.0.0",
-        "micromatch": "^3.0.4",
-        "resolve-dir": "^1.0.1"
-      }
-    },
-    "fined": {
-      "version": "1.2.0",
-      "dev": true,
-      "requires": {
-        "expand-tilde": "^2.0.2",
-        "is-plain-object": "^2.0.3",
-        "object.defaults": "^1.1.0",
-        "object.pick": "^1.2.0",
-        "parse-filepath": "^1.0.1"
-      },
-      "dependencies": {
-        "is-plain-object": {
-          "version": "2.0.4",
-          "dev": true,
-          "requires": {
-            "isobject": "^3.0.1"
-          }
-        }
-      }
-    },
-    "first-chunk-stream": {
-      "version": "2.0.0",
-      "dev": true,
-      "requires": {
-        "readable-stream": "^2.0.2"
-      }
-    },
-    "flagged-respawn": {
-      "version": "1.0.1",
-      "dev": true
-    },
-    "flat-cache": {
-      "version": "3.0.4",
-      "dev": true,
-      "requires": {
-        "flatted": "^3.1.0",
-        "rimraf": "^3.0.2"
-      }
-    },
-    "flatted": {
-      "version": "3.2.5",
-      "dev": true
-    },
-    "flush-write-stream": {
-      "version": "1.1.1",
-      "dev": true,
-      "requires": {
-        "inherits": "^2.0.3",
-        "readable-stream": "^2.3.6"
-      }
-    },
-    "follow-redirects": {
-      "version": "1.14.8",
-      "dev": true
-    },
-    "for-in": {
-      "version": "1.0.2",
-      "dev": true
-    },
-    "for-own": {
-      "version": "1.0.0",
-      "dev": true,
-      "requires": {
-        "for-in": "^1.0.1"
-      }
-    },
-    "fragment-cache": {
-      "version": "0.2.1",
-      "dev": true,
-      "requires": {
-        "map-cache": "^0.2.2"
-      }
-    },
-    "from2": {
-      "version": "2.3.0",
-      "dev": true,
-      "requires": {
-        "inherits": "^2.0.1",
-        "readable-stream": "^2.0.0"
-      }
-    },
-    "fs-extra": {
-      "version": "10.0.0",
-      "dev": true,
-      "requires": {
-        "graceful-fs": "^4.2.0",
-        "jsonfile": "^6.0.1",
-        "universalify": "^2.0.0"
-      }
-    },
-    "fs-mkdirp-stream": {
-      "version": "1.0.0",
-      "dev": true,
-      "requires": {
-        "graceful-fs": "^4.1.11",
-        "through2": "^2.0.3"
-      }
-    },
-    "fs-write-stream-atomic": {
-      "version": "1.0.10",
-      "dev": true,
-      "requires": {
-        "graceful-fs": "^4.1.2",
-        "iferr": "^0.1.5",
-        "imurmurhash": "^0.1.4",
-        "readable-stream": "1 || 2"
-      }
-    },
-    "fs.realpath": {
-      "version": "1.0.0",
-      "dev": true
-    },
-    "fsevents": {
-      "version": "1.2.13",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "bindings": "^1.5.0",
-        "nan": "^2.12.1"
-      }
-    },
-    "function-bind": {
-      "version": "1.1.1",
-      "dev": true
-    },
-    "functional-red-black-tree": {
-      "version": "1.0.1",
-      "dev": true
-    },
-    "get-caller-file": {
-      "version": "1.0.3",
-      "dev": true
-    },
-    "get-intrinsic": {
-      "version": "1.1.1",
-      "dev": true,
-      "requires": {
-        "function-bind": "^1.1.1",
-        "has": "^1.0.3",
-        "has-symbols": "^1.0.1"
-      }
-    },
-    "get-stream": {
-      "version": "6.0.1",
-      "dev": true
-    },
-    "get-value": {
-      "version": "2.0.6",
-      "dev": true
-    },
-    "glob": {
-      "version": "7.2.0",
-      "dev": true,
-      "requires": {
-        "fs.realpath": "^1.0.0",
-        "inflight": "^1.0.4",
-        "inherits": "2",
-        "minimatch": "^3.0.4",
-        "once": "^1.3.0",
-        "path-is-absolute": "^1.0.0"
-      }
-    },
-    "glob-base": {
-      "version": "0.3.0",
-      "dev": true,
-      "requires": {
-        "glob-parent": "^2.0.0",
-        "is-glob": "^2.0.0"
-      },
-      "dependencies": {
-        "glob-parent": {
-          "version": "2.0.0",
-          "dev": true,
-          "requires": {
-            "is-glob": "^2.0.0"
-          }
-        },
-        "is-extglob": {
-          "version": "1.0.0",
-          "dev": true
-        },
-        "is-glob": {
-          "version": "2.0.1",
-          "dev": true,
-          "requires": {
-            "is-extglob": "^1.0.0"
-          }
-        }
-      }
-    },
-    "glob-parent": {
-      "version": "5.1.2",
-      "dev": true,
-      "requires": {
-        "is-glob": "^4.0.1"
-      }
-    },
-    "glob-stream": {
-      "version": "6.1.0",
-      "dev": true,
-      "requires": {
-        "extend": "^3.0.0",
-        "glob": "^7.1.1",
-        "glob-parent": "^3.1.0",
-        "is-negated-glob": "^1.0.0",
-        "ordered-read-streams": "^1.0.0",
-        "pumpify": "^1.3.5",
-        "readable-stream": "^2.1.5",
-        "remove-trailing-separator": "^1.0.1",
-        "to-absolute-glob": "^2.0.0",
-        "unique-stream": "^2.0.2"
-      },
-      "dependencies": {
-        "glob-parent": {
-          "version": "3.1.0",
-          "dev": true,
-          "requires": {
-            "is-glob": "^3.1.0",
-            "path-dirname": "^1.0.0"
-          }
-        },
-        "is-glob": {
-          "version": "3.1.0",
-          "dev": true,
-          "requires": {
-            "is-extglob": "^2.1.0"
-          }
-        }
-      }
-    },
-    "glob-to-regexp": {
-      "version": "0.4.1",
-      "dev": true
-    },
-    "glob-watcher": {
-      "version": "5.0.5",
-      "dev": true,
-      "requires": {
-        "anymatch": "^2.0.0",
-        "async-done": "^1.2.0",
-        "chokidar": "^2.0.0",
-        "is-negated-glob": "^1.0.0",
-        "just-debounce": "^1.0.0",
-        "normalize-path": "^3.0.0",
-        "object.defaults": "^1.1.0"
-      }
-    },
-    "global-modules": {
-      "version": "1.0.0",
-      "dev": true,
-      "requires": {
-        "global-prefix": "^1.0.1",
-        "is-windows": "^1.0.1",
-        "resolve-dir": "^1.0.0"
-      }
-    },
-    "global-prefix": {
-      "version": "1.0.2",
-      "dev": true,
-      "requires": {
-        "expand-tilde": "^2.0.2",
-        "homedir-polyfill": "^1.0.1",
-        "ini": "^1.3.4",
-        "is-windows": "^1.0.1",
-        "which": "^1.2.14"
-      },
-      "dependencies": {
-        "which": {
-          "version": "1.3.1",
-          "dev": true,
-          "requires": {
-            "isexe": "^2.0.0"
-          }
-        }
-      }
-    },
-    "globals": {
-      "version": "13.12.1",
-      "dev": true,
-      "requires": {
-        "type-fest": "^0.20.2"
-      }
-    },
-    "glogg": {
-      "version": "1.0.2",
-      "dev": true,
-      "requires": {
-        "sparkles": "^1.0.0"
-      }
-    },
-    "graceful-fs": {
-      "version": "4.2.9",
-      "dev": true
-    },
-    "gulp": {
-      "version": "4.0.2",
-      "dev": true,
-      "requires": {
-        "glob-watcher": "^5.0.3",
-        "gulp-cli": "^2.2.0",
-        "undertaker": "^1.2.1",
-        "vinyl-fs": "^3.0.0"
-      }
-    },
-    "gulp-cli": {
-      "version": "2.3.0",
-      "dev": true,
-      "requires": {
-        "ansi-colors": "^1.0.1",
-        "archy": "^1.0.0",
-        "array-sort": "^1.0.0",
-        "color-support": "^1.1.3",
-        "concat-stream": "^1.6.0",
-        "copy-props": "^2.0.1",
-        "fancy-log": "^1.3.2",
-        "gulplog": "^1.0.0",
-        "interpret": "^1.4.0",
-        "isobject": "^3.0.1",
-        "liftoff": "^3.1.0",
-        "matchdep": "^2.0.0",
-        "mute-stdout": "^1.0.0",
-        "pretty-hrtime": "^1.0.0",
-        "replace-homedir": "^1.0.0",
-        "semver-greatest-satisfied-range": "^1.1.0",
-        "v8flags": "^3.2.0",
-        "yargs": "^7.1.0"
-      },
-      "dependencies": {
-        "ansi-colors": {
-          "version": "1.1.0",
-          "dev": true,
-          "requires": {
-            "ansi-wrap": "^0.1.0"
-          }
-        }
-      }
-    },
-    "gulp-concat": {
-      "version": "2.6.1",
-      "dev": true,
-      "requires": {
-        "concat-with-sourcemaps": "^1.0.0",
-        "through2": "^2.0.0",
-        "vinyl": "^2.0.0"
-      }
-    },
-    "gulp-eslint": {
-      "version": "6.0.0",
-      "dev": true,
-      "requires": {
-        "eslint": "^6.0.0",
-        "fancy-log": "^1.3.2",
-        "plugin-error": "^1.0.1"
-      },
-      "dependencies": {
-        "ansi-regex": {
-          "version": "4.1.0",
-          "dev": true
-        },
-        "ansi-styles": {
-          "version": "3.2.1",
-          "dev": true,
-          "requires": {
-            "color-convert": "^1.9.0"
-          }
-        },
-        "astral-regex": {
-          "version": "1.0.0",
-          "dev": true
-        },
-        "chalk": {
-          "version": "2.4.2",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^3.2.1",
-            "escape-string-regexp": "^1.0.5",
-            "supports-color": "^5.3.0"
-          }
-        },
-        "color-convert": {
-          "version": "1.9.3",
-          "dev": true,
-          "requires": {
-            "color-name": "1.1.3"
-          }
-        },
-        "color-name": {
-          "version": "1.1.3",
-          "dev": true
-        },
-        "cross-spawn": {
-          "version": "6.0.5",
-          "dev": true,
-          "requires": {
-            "nice-try": "^1.0.4",
-            "path-key": "^2.0.1",
-            "semver": "^5.5.0",
-            "shebang-command": "^1.2.0",
-            "which": "^1.2.9"
-          },
-          "dependencies": {
-            "semver": {
-              "version": "5.7.1",
-              "dev": true
-            }
-          }
-        },
-        "emoji-regex": {
-          "version": "7.0.3",
-          "dev": true
-        },
-        "escape-string-regexp": {
-          "version": "1.0.5",
-          "dev": true
-        },
-        "eslint": {
-          "version": "6.8.0",
-          "dev": true,
-          "requires": {
-            "@babel/code-frame": "^7.0.0",
-            "ajv": "^6.10.0",
-            "chalk": "^2.1.0",
-            "cross-spawn": "^6.0.5",
-            "debug": "^4.0.1",
-            "doctrine": "^3.0.0",
-            "eslint-scope": "^5.0.0",
-            "eslint-utils": "^1.4.3",
-            "eslint-visitor-keys": "^1.1.0",
-            "espree": "^6.1.2",
-            "esquery": "^1.0.1",
-            "esutils": "^2.0.2",
-            "file-entry-cache": "^5.0.1",
-            "functional-red-black-tree": "^1.0.1",
-            "glob-parent": "^5.0.0",
-            "globals": "^12.1.0",
-            "ignore": "^4.0.6",
-            "import-fresh": "^3.0.0",
-            "imurmurhash": "^0.1.4",
-            "inquirer": "^7.0.0",
-            "is-glob": "^4.0.0",
-            "js-yaml": "^3.13.1",
-            "json-stable-stringify-without-jsonify": "^1.0.1",
-            "levn": "^0.3.0",
-            "lodash": "^4.17.14",
-            "minimatch": "^3.0.4",
-            "mkdirp": "^0.5.1",
-            "natural-compare": "^1.4.0",
-            "optionator": "^0.8.3",
-            "progress": "^2.0.0",
-            "regexpp": "^2.0.1",
-            "semver": "^6.1.2",
-            "strip-ansi": "^5.2.0",
-            "strip-json-comments": "^3.0.1",
-            "table": "^5.2.3",
-            "text-table": "^0.2.0",
-            "v8-compile-cache": "^2.0.3"
-          }
-        },
-        "eslint-utils": {
-          "version": "1.4.3",
-          "dev": true,
-          "requires": {
-            "eslint-visitor-keys": "^1.1.0"
-          }
-        },
-        "eslint-visitor-keys": {
-          "version": "1.3.0",
-          "dev": true
-        },
-        "espree": {
-          "version": "6.2.1",
-          "dev": true,
-          "requires": {
-            "acorn": "^7.1.1",
-            "acorn-jsx": "^5.2.0",
-            "eslint-visitor-keys": "^1.1.0"
-          }
-        },
-        "file-entry-cache": {
-          "version": "5.0.1",
-          "dev": true,
-          "requires": {
-            "flat-cache": "^2.0.1"
-          }
-        },
-        "flat-cache": {
-          "version": "2.0.1",
-          "dev": true,
-          "requires": {
-            "flatted": "^2.0.0",
-            "rimraf": "2.6.3",
-            "write": "1.0.3"
-          }
-        },
-        "flatted": {
-          "version": "2.0.2",
-          "dev": true
-        },
-        "globals": {
-          "version": "12.4.0",
-          "dev": true,
-          "requires": {
-            "type-fest": "^0.8.1"
-          }
-        },
-        "has-flag": {
-          "version": "3.0.0",
-          "dev": true
-        },
-        "is-fullwidth-code-point": {
-          "version": "2.0.0",
-          "dev": true
-        },
-        "levn": {
-          "version": "0.3.0",
-          "dev": true,
-          "requires": {
-            "prelude-ls": "~1.1.2",
-            "type-check": "~0.3.2"
-          }
-        },
-        "optionator": {
-          "version": "0.8.3",
-          "dev": true,
-          "requires": {
-            "deep-is": "~0.1.3",
-            "fast-levenshtein": "~2.0.6",
-            "levn": "~0.3.0",
-            "prelude-ls": "~1.1.2",
-            "type-check": "~0.3.2",
-            "word-wrap": "~1.2.3"
-          }
-        },
-        "path-key": {
-          "version": "2.0.1",
-          "dev": true
-        },
-        "prelude-ls": {
-          "version": "1.1.2",
-          "dev": true
-        },
-        "regexpp": {
-          "version": "2.0.1",
-          "dev": true
-        },
-        "rimraf": {
-          "version": "2.6.3",
-          "dev": true,
-          "requires": {
-            "glob": "^7.1.3"
-          }
-        },
-        "semver": {
-          "version": "6.3.0",
-          "dev": true
-        },
-        "shebang-command": {
-          "version": "1.2.0",
-          "dev": true,
-          "requires": {
-            "shebang-regex": "^1.0.0"
-          }
-        },
-        "shebang-regex": {
-          "version": "1.0.0",
-          "dev": true
-        },
-        "slice-ansi": {
-          "version": "2.1.0",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^3.2.0",
-            "astral-regex": "^1.0.0",
-            "is-fullwidth-code-point": "^2.0.0"
-          }
-        },
-        "string-width": {
-          "version": "3.1.0",
-          "dev": true,
-          "requires": {
-            "emoji-regex": "^7.0.1",
-            "is-fullwidth-code-point": "^2.0.0",
-            "strip-ansi": "^5.1.0"
-          }
-        },
-        "strip-ansi": {
-          "version": "5.2.0",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^4.1.0"
-          }
-        },
-        "supports-color": {
-          "version": "5.5.0",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        },
-        "table": {
-          "version": "5.4.6",
-          "dev": true,
-          "requires": {
-            "ajv": "^6.10.2",
-            "lodash": "^4.17.14",
-            "slice-ansi": "^2.1.0",
-            "string-width": "^3.0.0"
-          }
-        },
-        "type-check": {
-          "version": "0.3.2",
-          "dev": true,
-          "requires": {
-            "prelude-ls": "~1.1.2"
-          }
-        },
-        "type-fest": {
-          "version": "0.8.1",
-          "dev": true
-        },
-        "which": {
-          "version": "1.3.1",
-          "dev": true,
-          "requires": {
-            "isexe": "^2.0.0"
-          }
-        }
-      }
-    },
-    "gulp-jsify": {
-      "version": "file:vendor/gulp-jsify",
-      "requires": {
-        "plugin-error": "~1.0.1",
-        "through": "~2.3.8",
-        "vinyl": "~2.2.1"
-      }
-    },
-    "gulp-rename": {
-      "version": "2.0.0",
-      "dev": true
-    },
-    "gulp-shell": {
-      "version": "0.8.0",
-      "dev": true,
-      "requires": {
-        "chalk": "^3.0.0",
-        "fancy-log": "^1.3.3",
-        "lodash.template": "^4.5.0",
-        "plugin-error": "^1.0.1",
-        "through2": "^3.0.1",
-        "tslib": "^1.10.0"
-      },
-      "dependencies": {
-        "chalk": {
-          "version": "3.0.0",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "through2": {
-          "version": "3.0.2",
-          "dev": true,
-          "requires": {
-            "inherits": "^2.0.4",
-            "readable-stream": "2 || 3"
-          }
-        }
-      }
-    },
-    "gulp-watch": {
-      "version": "5.0.1",
-      "dev": true,
-      "requires": {
-        "ansi-colors": "1.1.0",
-        "anymatch": "^1.3.0",
-        "chokidar": "^2.0.0",
-        "fancy-log": "1.3.2",
-        "glob-parent": "^3.0.1",
-        "object-assign": "^4.1.0",
-        "path-is-absolute": "^1.0.1",
-        "plugin-error": "1.0.1",
-        "readable-stream": "^2.2.2",
-        "slash": "^1.0.0",
-        "vinyl": "^2.1.0",
-        "vinyl-file": "^2.0.0"
-      },
-      "dependencies": {
-        "ansi-colors": {
-          "version": "1.1.0",
-          "dev": true,
-          "requires": {
-            "ansi-wrap": "^0.1.0"
-          }
-        },
-        "anymatch": {
-          "version": "1.3.2",
-          "dev": true,
-          "requires": {
-            "micromatch": "^2.1.5",
-            "normalize-path": "^2.0.0"
-          }
-        },
-        "arr-diff": {
-          "version": "2.0.0",
-          "dev": true,
-          "requires": {
-            "arr-flatten": "^1.0.1"
-          }
-        },
-        "array-unique": {
-          "version": "0.2.1",
-          "dev": true
-        },
-        "braces": {
-          "version": "1.8.5",
-          "dev": true,
-          "requires": {
-            "expand-range": "^1.8.1",
-            "preserve": "^0.2.0",
-            "repeat-element": "^1.1.2"
-          }
-        },
-        "expand-brackets": {
-          "version": "0.1.5",
-          "dev": true,
-          "requires": {
-            "is-posix-bracket": "^0.1.0"
-          }
-        },
-        "extglob": {
-          "version": "0.3.2",
-          "dev": true,
-          "requires": {
-            "is-extglob": "^1.0.0"
-          },
-          "dependencies": {
-            "is-extglob": {
-              "version": "1.0.0",
-              "dev": true
-            }
-          }
-        },
-        "fancy-log": {
-          "version": "1.3.2",
-          "dev": true,
-          "requires": {
-            "ansi-gray": "^0.1.1",
-            "color-support": "^1.1.3",
-            "time-stamp": "^1.0.0"
-          }
-        },
-        "glob-parent": {
-          "version": "3.1.0",
-          "dev": true,
-          "requires": {
-            "is-glob": "^3.1.0",
-            "path-dirname": "^1.0.0"
-          }
-        },
-        "is-glob": {
-          "version": "3.1.0",
-          "dev": true,
-          "requires": {
-            "is-extglob": "^2.1.0"
-          }
-        },
-        "kind-of": {
-          "version": "3.2.2",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        },
-        "micromatch": {
-          "version": "2.3.11",
-          "dev": true,
-          "requires": {
-            "arr-diff": "^2.0.0",
-            "array-unique": "^0.2.1",
-            "braces": "^1.8.2",
-            "expand-brackets": "^0.1.4",
-            "extglob": "^0.3.1",
-            "filename-regex": "^2.0.0",
-            "is-extglob": "^1.0.0",
-            "is-glob": "^2.0.1",
-            "kind-of": "^3.0.2",
-            "normalize-path": "^2.0.1",
-            "object.omit": "^2.0.0",
-            "parse-glob": "^3.0.4",
-            "regex-cache": "^0.4.2"
-          },
-          "dependencies": {
-            "is-extglob": {
-              "version": "1.0.0",
-              "dev": true
-            },
-            "is-glob": {
-              "version": "2.0.1",
-              "dev": true,
-              "requires": {
-                "is-extglob": "^1.0.0"
-              }
-            }
-          }
-        },
-        "normalize-path": {
-          "version": "2.1.1",
-          "dev": true,
-          "requires": {
-            "remove-trailing-separator": "^1.0.1"
-          }
-        }
-      }
-    },
-    "gulplog": {
-      "version": "1.0.0",
-      "dev": true,
-      "requires": {
-        "glogg": "^1.0.0"
-      }
-    },
-    "has": {
-      "version": "1.0.3",
-      "dev": true,
-      "requires": {
-        "function-bind": "^1.1.1"
-      }
-    },
-    "has-flag": {
-      "version": "4.0.0",
-      "dev": true
-    },
-    "has-symbols": {
-      "version": "1.0.2",
-      "dev": true
-    },
-    "has-value": {
-      "version": "1.0.0",
-      "dev": true,
-      "requires": {
-        "get-value": "^2.0.6",
-        "has-values": "^1.0.0",
-        "isobject": "^3.0.0"
-      }
-    },
-    "has-values": {
-      "version": "1.0.0",
-      "dev": true,
-      "requires": {
-        "is-number": "^3.0.0",
-        "kind-of": "^4.0.0"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "4.0.0",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "hash-base": {
-      "version": "3.1.0",
-      "dev": true,
-      "requires": {
-        "inherits": "^2.0.4",
-        "readable-stream": "^3.6.0",
-        "safe-buffer": "^5.2.0"
-      },
-      "dependencies": {
-        "readable-stream": {
-          "version": "3.6.0",
-          "dev": true,
-          "requires": {
-            "inherits": "^2.0.3",
-            "string_decoder": "^1.1.1",
-            "util-deprecate": "^1.0.1"
-          }
-        },
-        "safe-buffer": {
-          "version": "5.2.1",
-          "dev": true
-        }
-      }
-    },
-    "hash.js": {
-      "version": "1.1.7",
-      "dev": true,
-      "requires": {
-        "inherits": "^2.0.3",
-        "minimalistic-assert": "^1.0.1"
-      }
-    },
-    "hmac-drbg": {
-      "version": "1.0.1",
-      "dev": true,
-      "requires": {
-        "hash.js": "^1.0.3",
-        "minimalistic-assert": "^1.0.0",
-        "minimalistic-crypto-utils": "^1.0.1"
-      }
-    },
-    "homedir-polyfill": {
-      "version": "1.0.3",
-      "dev": true,
-      "requires": {
-        "parse-passwd": "^1.0.0"
-      }
-    },
-    "hosted-git-info": {
-      "version": "2.8.9",
-      "dev": true
-    },
-    "http-errors": {
-      "version": "1.8.1",
-      "dev": true,
-      "requires": {
-        "depd": "~1.1.2",
-        "inherits": "2.0.4",
-        "setprototypeof": "1.2.0",
-        "statuses": ">= 1.5.0 < 2",
-        "toidentifier": "1.0.1"
-      }
-    },
-    "http-proxy": {
-      "version": "1.18.1",
-      "dev": true,
-      "requires": {
-        "eventemitter3": "^4.0.0",
-        "follow-redirects": "^1.0.0",
-        "requires-port": "^1.0.0"
-      }
-    },
-    "https-browserify": {
-      "version": "1.0.0",
-      "dev": true
-    },
-    "human-signals": {
-      "version": "2.1.0",
-      "dev": true
-    },
-    "iconv-lite": {
-      "version": "0.4.24",
-      "dev": true,
-      "requires": {
-        "safer-buffer": ">= 2.1.2 < 3"
-      }
-    },
-    "ieee754": {
-      "version": "1.2.1",
-      "dev": true
-    },
-    "iferr": {
-      "version": "0.1.5",
-      "dev": true
-    },
-    "ignore": {
-      "version": "4.0.6",
-      "dev": true
-    },
-    "import-fresh": {
-      "version": "3.3.0",
-      "dev": true,
-      "requires": {
-        "parent-module": "^1.0.0",
-        "resolve-from": "^4.0.0"
-      }
-    },
-    "import-local": {
-      "version": "3.1.0",
-      "dev": true,
-      "requires": {
-        "pkg-dir": "^4.2.0",
-        "resolve-cwd": "^3.0.0"
-      }
-    },
-    "imurmurhash": {
-      "version": "0.1.4",
-      "dev": true
-    },
-    "infer-owner": {
-      "version": "1.0.4",
-      "dev": true
-    },
-    "inflight": {
-      "version": "1.0.6",
-      "dev": true,
-      "requires": {
-        "once": "^1.3.0",
-        "wrappy": "1"
-      }
-    },
-    "inherits": {
-      "version": "2.0.4",
-      "dev": true
-    },
-    "ini": {
-      "version": "1.3.8",
-      "dev": true
-    },
-    "inquirer": {
-      "version": "7.3.3",
-      "dev": true,
-      "requires": {
-        "ansi-escapes": "^4.2.1",
-        "chalk": "^4.1.0",
-        "cli-cursor": "^3.1.0",
-        "cli-width": "^3.0.0",
-        "external-editor": "^3.0.3",
-        "figures": "^3.0.0",
-        "lodash": "^4.17.19",
-        "mute-stream": "0.0.8",
-        "run-async": "^2.4.0",
-        "rxjs": "^6.6.0",
-        "string-width": "^4.1.0",
-        "strip-ansi": "^6.0.0",
-        "through": "^2.3.6"
-      }
-    },
-    "interpret": {
-      "version": "1.4.0",
-      "dev": true
-    },
-    "invert-kv": {
-      "version": "1.0.0",
-      "dev": true
-    },
-    "is-absolute": {
-      "version": "1.0.0",
-      "dev": true,
-      "requires": {
-        "is-relative": "^1.0.0",
-        "is-windows": "^1.0.1"
-      }
-    },
-    "is-accessor-descriptor": {
-      "version": "1.0.0",
-      "dev": true,
-      "requires": {
-        "kind-of": "^6.0.0"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "6.0.3",
-          "dev": true
-        }
-      }
-    },
-    "is-arrayish": {
-      "version": "0.2.1",
-      "dev": true
-    },
-    "is-binary-path": {
-      "version": "1.0.1",
-      "dev": true,
-      "requires": {
-        "binary-extensions": "^1.0.0"
-      }
-    },
-    "is-buffer": {
-      "version": "1.1.6",
-      "dev": true
-    },
-    "is-core-module": {
-      "version": "2.8.1",
-      "dev": true,
-      "requires": {
-        "has": "^1.0.3"
-      }
-    },
-    "is-data-descriptor": {
-      "version": "1.0.0",
-      "dev": true,
-      "requires": {
-        "kind-of": "^6.0.0"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "6.0.3",
-          "dev": true
-        }
-      }
-    },
-    "is-descriptor": {
-      "version": "1.0.2",
-      "dev": true,
-      "requires": {
-        "is-accessor-descriptor": "^1.0.0",
-        "is-data-descriptor": "^1.0.0",
-        "kind-of": "^6.0.2"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "6.0.3",
-          "dev": true
-        }
-      }
-    },
-    "is-dotfile": {
-      "version": "1.0.3",
-      "dev": true
-    },
-    "is-equal-shallow": {
-      "version": "0.1.3",
-      "dev": true,
-      "requires": {
-        "is-primitive": "^2.0.0"
-      }
-    },
-    "is-extendable": {
-      "version": "0.1.1",
-      "dev": true
-    },
-    "is-extglob": {
-      "version": "2.1.1",
-      "dev": true
-    },
-    "is-fullwidth-code-point": {
-      "version": "3.0.0",
-      "dev": true
-    },
-    "is-glob": {
-      "version": "4.0.3",
-      "dev": true,
-      "requires": {
-        "is-extglob": "^2.1.1"
-      }
-    },
-    "is-negated-glob": {
-      "version": "1.0.0",
-      "dev": true
-    },
-    "is-number": {
-      "version": "3.0.0",
-      "dev": true,
-      "requires": {
-        "kind-of": "^3.0.2"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "3.2.2",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "is-plain-object": {
-      "version": "5.0.0",
-      "dev": true
-    },
-    "is-posix-bracket": {
-      "version": "0.1.1",
-      "dev": true
-    },
-    "is-primitive": {
-      "version": "2.0.0",
-      "dev": true
-    },
-    "is-relative": {
-      "version": "1.0.0",
-      "dev": true,
-      "requires": {
-        "is-unc-path": "^1.0.0"
-      }
-    },
-    "is-stream": {
-      "version": "2.0.1",
-      "dev": true
-    },
-    "is-unc-path": {
-      "version": "1.0.0",
-      "dev": true,
-      "requires": {
-        "unc-path-regex": "^0.1.2"
-      }
-    },
-    "is-utf8": {
-      "version": "0.2.1",
-      "dev": true
-    },
-    "is-valid-glob": {
-      "version": "1.0.0",
-      "dev": true
-    },
-    "is-windows": {
-      "version": "1.0.2",
-      "dev": true
-    },
-    "is-wsl": {
-      "version": "1.1.0",
-      "dev": true
-    },
-    "isarray": {
-      "version": "1.0.0",
-      "dev": true
-    },
-    "isbinaryfile": {
-      "version": "4.0.8",
-      "dev": true
-    },
-    "isexe": {
-      "version": "2.0.0",
-      "dev": true
-    },
-    "isobject": {
-      "version": "3.0.1",
-      "dev": true
-    },
-    "jasmine-core": {
-      "version": "3.99.0",
-      "dev": true
-    },
-    "jest-worker": {
-      "version": "27.5.1",
-      "dev": true,
-      "requires": {
-        "@types/node": "*",
-        "merge-stream": "^2.0.0",
-        "supports-color": "^8.0.0"
-      },
-      "dependencies": {
-        "supports-color": {
-          "version": "8.1.1",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
-      }
-    },
-    "js-tokens": {
-      "version": "4.0.0",
-      "dev": true
-    },
-    "js-yaml": {
-      "version": "3.14.1",
-      "dev": true,
-      "requires": {
-        "argparse": "^1.0.7",
-        "esprima": "^4.0.0"
-      }
-    },
-    "json-parse-better-errors": {
-      "version": "1.0.2",
-      "dev": true
-    },
-    "json-schema-traverse": {
-      "version": "0.4.1",
-      "dev": true
-    },
-    "json-stable-stringify-without-jsonify": {
-      "version": "1.0.1",
-      "dev": true
-    },
-    "json5": {
-      "version": "1.0.1",
-      "dev": true,
-      "requires": {
-        "minimist": "^1.2.0"
-      }
-    },
-    "jsonfile": {
-      "version": "6.1.0",
-      "dev": true,
-      "requires": {
-        "graceful-fs": "^4.1.6",
-        "universalify": "^2.0.0"
-      }
-    },
-    "just-debounce": {
-      "version": "1.1.0",
-      "dev": true
-    },
-    "karma": {
-      "version": "6.3.16",
-      "dev": true,
-      "requires": {
-        "body-parser": "^1.19.0",
-        "braces": "^3.0.2",
-        "chokidar": "^3.5.1",
-        "colors": "1.4.0",
-        "connect": "^3.7.0",
-        "di": "^0.0.1",
-        "dom-serialize": "^2.2.1",
-        "glob": "^7.1.7",
-        "graceful-fs": "^4.2.6",
-        "http-proxy": "^1.18.1",
-        "isbinaryfile": "^4.0.8",
-        "lodash": "^4.17.21",
-        "log4js": "^6.4.1",
-        "mime": "^2.5.2",
-        "minimatch": "^3.0.4",
-        "mkdirp": "^0.5.5",
-        "qjobs": "^1.2.0",
-        "range-parser": "^1.2.1",
-        "rimraf": "^3.0.2",
-        "socket.io": "^4.2.0",
-        "source-map": "^0.6.1",
-        "tmp": "^0.2.1",
-        "ua-parser-js": "^0.7.30",
-        "yargs": "^16.1.1"
-      },
-      "dependencies": {
-        "anymatch": {
-          "version": "3.1.2",
-          "dev": true,
-          "requires": {
-            "normalize-path": "^3.0.0",
-            "picomatch": "^2.0.4"
-          }
-        },
-        "binary-extensions": {
-          "version": "2.2.0",
-          "dev": true
-        },
-        "braces": {
-          "version": "3.0.2",
-          "dev": true,
-          "requires": {
-            "fill-range": "^7.0.1"
-          }
-        },
-        "chokidar": {
-          "version": "3.5.3",
-          "dev": true,
-          "requires": {
-            "anymatch": "~3.1.2",
-            "braces": "~3.0.2",
-            "fsevents": "~2.3.2",
-            "glob-parent": "~5.1.2",
-            "is-binary-path": "~2.1.0",
-            "is-glob": "~4.0.1",
-            "normalize-path": "~3.0.0",
-            "readdirp": "~3.6.0"
-          }
-        },
-        "cliui": {
-          "version": "7.0.4",
-          "dev": true,
-          "requires": {
-            "string-width": "^4.2.0",
-            "strip-ansi": "^6.0.0",
-            "wrap-ansi": "^7.0.0"
-          }
-        },
-        "fill-range": {
-          "version": "7.0.1",
-          "dev": true,
-          "requires": {
-            "to-regex-range": "^5.0.1"
-          }
-        },
-        "fsevents": {
-          "version": "2.3.2",
-          "dev": true,
-          "optional": true
-        },
-        "get-caller-file": {
-          "version": "2.0.5",
-          "dev": true
-        },
-        "is-binary-path": {
-          "version": "2.1.0",
-          "dev": true,
-          "requires": {
-            "binary-extensions": "^2.0.0"
-          }
-        },
-        "is-number": {
-          "version": "7.0.0",
-          "dev": true
-        },
-        "readdirp": {
-          "version": "3.6.0",
-          "dev": true,
-          "requires": {
-            "picomatch": "^2.2.1"
-          }
-        },
-        "to-regex-range": {
-          "version": "5.0.1",
-          "dev": true,
-          "requires": {
-            "is-number": "^7.0.0"
-          }
-        },
-        "wrap-ansi": {
-          "version": "7.0.0",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.0.0",
-            "string-width": "^4.1.0",
-            "strip-ansi": "^6.0.0"
-          }
-        },
-        "y18n": {
-          "version": "5.0.8",
-          "dev": true
-        },
-        "yargs": {
-          "version": "16.2.0",
-          "dev": true,
-          "requires": {
-            "cliui": "^7.0.2",
-            "escalade": "^3.1.1",
-            "get-caller-file": "^2.0.5",
-            "require-directory": "^2.1.1",
-            "string-width": "^4.2.0",
-            "y18n": "^5.0.5",
-            "yargs-parser": "^20.2.2"
-          }
-        },
-        "yargs-parser": {
-          "version": "20.2.9",
-          "dev": true
-        }
-      }
-    },
-    "karma-chrome-launcher": {
-      "version": "3.1.0",
-      "dev": true,
-      "requires": {
-        "which": "^1.2.1"
-      },
-      "dependencies": {
-        "which": {
-          "version": "1.3.1",
-          "dev": true,
-          "requires": {
-            "isexe": "^2.0.0"
-          }
-        }
-      }
-    },
-    "karma-jasmine": {
-      "version": "4.0.1",
-      "dev": true,
-      "requires": {
-        "jasmine-core": "^3.6.0"
-      }
-    },
-    "kind-of": {
-      "version": "5.1.0",
-      "dev": true
-    },
-    "last-run": {
-      "version": "1.1.1",
-      "dev": true,
-      "requires": {
-        "default-resolution": "^2.0.0",
-        "es6-weak-map": "^2.0.1"
-      }
-    },
-    "lazystream": {
-      "version": "1.0.1",
-      "dev": true,
-      "requires": {
-        "readable-stream": "^2.0.5"
-      }
-    },
-    "lcid": {
-      "version": "1.0.0",
-      "dev": true,
-      "requires": {
-        "invert-kv": "^1.0.0"
-      }
-    },
-    "lead": {
-      "version": "1.0.0",
-      "dev": true,
-      "requires": {
-        "flush-write-stream": "^1.0.2"
-      }
-    },
-    "levn": {
-      "version": "0.4.1",
-      "dev": true,
-      "requires": {
-        "prelude-ls": "^1.2.1",
-        "type-check": "~0.4.0"
-      }
-    },
-    "liftoff": {
-      "version": "3.1.0",
-      "dev": true,
-      "requires": {
-        "extend": "^3.0.0",
-        "findup-sync": "^3.0.0",
-        "fined": "^1.0.1",
-        "flagged-respawn": "^1.0.0",
-        "is-plain-object": "^2.0.4",
-        "object.map": "^1.0.0",
-        "rechoir": "^0.6.2",
-        "resolve": "^1.1.7"
-      },
-      "dependencies": {
-        "is-plain-object": {
-          "version": "2.0.4",
-          "dev": true,
-          "requires": {
-            "isobject": "^3.0.1"
-          }
-        }
-      }
-    },
-    "load-json-file": {
-      "version": "1.1.0",
-      "dev": true,
-      "requires": {
-        "graceful-fs": "^4.1.2",
-        "parse-json": "^2.2.0",
-        "pify": "^2.0.0",
-        "pinkie-promise": "^2.0.0",
-        "strip-bom": "^2.0.0"
-      }
-    },
-    "loader-runner": {
-      "version": "4.2.0",
-      "dev": true
-    },
-    "loader-utils": {
-      "version": "1.4.0",
-      "dev": true,
-      "requires": {
-        "big.js": "^5.2.2",
-        "emojis-list": "^3.0.0",
-        "json5": "^1.0.1"
-      }
-    },
-    "locate-path": {
-      "version": "5.0.0",
-      "dev": true,
-      "requires": {
-        "p-locate": "^4.1.0"
-      }
-    },
-    "lodash": {
-      "version": "4.17.21",
-      "dev": true
-    },
-    "lodash._reinterpolate": {
-      "version": "3.0.0",
-      "dev": true
-    },
-    "lodash.clone": {
-      "version": "4.5.0",
-      "dev": true
-    },
-    "lodash.merge": {
-      "version": "4.6.2",
-      "dev": true
-    },
-    "lodash.some": {
-      "version": "4.6.0",
-      "dev": true
-    },
-    "lodash.template": {
-      "version": "4.5.0",
-      "dev": true,
-      "requires": {
-        "lodash._reinterpolate": "^3.0.0",
-        "lodash.templatesettings": "^4.0.0"
-      }
-    },
-    "lodash.templatesettings": {
-      "version": "4.2.0",
-      "dev": true,
-      "requires": {
-        "lodash._reinterpolate": "^3.0.0"
-      }
-    },
-    "lodash.truncate": {
-      "version": "4.4.2",
-      "dev": true
-    },
-    "log4js": {
-      "version": "6.4.1",
-      "dev": true,
-      "requires": {
-        "date-format": "^4.0.3",
-        "debug": "^4.3.3",
-        "flatted": "^3.2.4",
-        "rfdc": "^1.3.0",
-        "streamroller": "^3.0.2"
-      }
-    },
-    "lru-cache": {
-      "version": "6.0.0",
-      "dev": true,
-      "requires": {
-        "yallist": "^4.0.0"
-      }
-    },
-    "make-dir": {
-      "version": "2.1.0",
-      "dev": true,
-      "requires": {
-        "pify": "^4.0.1",
-        "semver": "^5.6.0"
-      },
-      "dependencies": {
-        "pify": {
-          "version": "4.0.1",
-          "dev": true
-        },
-        "semver": {
-          "version": "5.7.1",
-          "dev": true
-        }
-      }
-    },
-    "make-iterator": {
-      "version": "1.0.1",
-      "dev": true,
-      "requires": {
-        "kind-of": "^6.0.2"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "6.0.3",
-          "dev": true
-        }
-      }
-    },
-    "map-cache": {
-      "version": "0.2.2",
-      "dev": true
-    },
-    "map-visit": {
-      "version": "1.0.0",
-      "dev": true,
-      "requires": {
-        "object-visit": "^1.0.0"
-      }
-    },
-    "matchdep": {
-      "version": "2.0.0",
-      "dev": true,
-      "requires": {
-        "findup-sync": "^2.0.0",
-        "micromatch": "^3.0.4",
-        "resolve": "^1.4.0",
-        "stack-trace": "0.0.10"
-      },
-      "dependencies": {
-        "findup-sync": {
-          "version": "2.0.0",
-          "dev": true,
-          "requires": {
-            "detect-file": "^1.0.0",
-            "is-glob": "^3.1.0",
-            "micromatch": "^3.0.4",
-            "resolve-dir": "^1.0.1"
-          }
-        },
-        "is-glob": {
-          "version": "3.1.0",
-          "dev": true,
-          "requires": {
-            "is-extglob": "^2.1.0"
-          }
-        }
-      }
-    },
-    "math-random": {
-      "version": "1.0.4",
-      "dev": true
-    },
-    "md5.js": {
-      "version": "1.3.5",
-      "dev": true,
-      "requires": {
-        "hash-base": "^3.0.0",
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.1.2"
-      }
-    },
-    "media-typer": {
-      "version": "0.3.0",
-      "dev": true
-    },
-    "memory-fs": {
-      "version": "0.5.0",
-      "dev": true,
-      "requires": {
-        "errno": "^0.1.3",
-        "readable-stream": "^2.0.1"
-      }
-    },
-    "merge-stream": {
-      "version": "2.0.0",
-      "dev": true
-    },
-    "micromatch": {
-      "version": "3.1.10",
-      "dev": true,
-      "requires": {
-        "arr-diff": "^4.0.0",
-        "array-unique": "^0.3.2",
-        "braces": "^2.3.1",
-        "define-property": "^2.0.2",
-        "extend-shallow": "^3.0.2",
-        "extglob": "^2.0.4",
-        "fragment-cache": "^0.2.1",
-        "kind-of": "^6.0.2",
-        "nanomatch": "^1.2.9",
-        "object.pick": "^1.3.0",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.2"
-      },
-      "dependencies": {
-        "extend-shallow": {
-          "version": "3.0.2",
-          "dev": true,
-          "requires": {
-            "assign-symbols": "^1.0.0",
-            "is-extendable": "^1.0.1"
-          }
-        },
-        "is-extendable": {
-          "version": "1.0.1",
-          "dev": true,
-          "requires": {
-            "is-plain-object": "^2.0.4"
-          }
-        },
-        "is-plain-object": {
-          "version": "2.0.4",
-          "dev": true,
-          "requires": {
-            "isobject": "^3.0.1"
-          }
-        },
-        "kind-of": {
-          "version": "6.0.3",
-          "dev": true
-        }
-      }
-    },
-    "miller-rabin": {
-      "version": "4.0.1",
-      "dev": true,
-      "requires": {
-        "bn.js": "^4.0.0",
-        "brorand": "^1.0.1"
-      },
-      "dependencies": {
-        "bn.js": {
-          "version": "4.12.0",
-          "dev": true
-        }
-      }
-    },
-    "mime": {
-      "version": "2.6.0",
-      "dev": true
-    },
-    "mime-db": {
-      "version": "1.51.0",
-      "dev": true
-    },
-    "mime-types": {
-      "version": "2.1.34",
-      "dev": true,
-      "requires": {
-        "mime-db": "1.51.0"
-      }
-    },
-    "mimic-fn": {
-      "version": "2.1.0",
-      "dev": true
-    },
-    "minimalistic-assert": {
-      "version": "1.0.1",
-      "dev": true
-    },
-    "minimalistic-crypto-utils": {
-      "version": "1.0.1",
-      "dev": true
-    },
-    "minimatch": {
-      "version": "3.1.2",
-      "dev": true,
-      "requires": {
-        "brace-expansion": "^1.1.7"
-      }
-    },
-    "minimist": {
-      "version": "1.2.5",
-      "dev": true
-    },
-    "mississippi": {
-      "version": "3.0.0",
-      "dev": true,
-      "requires": {
-        "concat-stream": "^1.5.0",
-        "duplexify": "^3.4.2",
-        "end-of-stream": "^1.1.0",
-        "flush-write-stream": "^1.0.0",
-        "from2": "^2.1.0",
-        "parallel-transform": "^1.1.0",
-        "pump": "^3.0.0",
-        "pumpify": "^1.3.3",
-        "stream-each": "^1.1.0",
-        "through2": "^2.0.0"
-      },
-      "dependencies": {
-        "pump": {
-          "version": "3.0.0",
-          "dev": true,
-          "requires": {
-            "end-of-stream": "^1.1.0",
-            "once": "^1.3.1"
-          }
-        }
-      }
-    },
-    "mixin-deep": {
-      "version": "1.3.2",
-      "dev": true,
-      "requires": {
-        "for-in": "^1.0.2",
-        "is-extendable": "^1.0.1"
-      },
-      "dependencies": {
-        "is-extendable": {
-          "version": "1.0.1",
-          "dev": true,
-          "requires": {
-            "is-plain-object": "^2.0.4"
-          }
-        },
-        "is-plain-object": {
-          "version": "2.0.4",
-          "dev": true,
-          "requires": {
-            "isobject": "^3.0.1"
-          }
-        }
-      }
-    },
-    "mkdirp": {
-      "version": "0.5.5",
-      "dev": true,
-      "requires": {
-        "minimist": "^1.2.5"
-      }
-    },
-    "move-concurrently": {
-      "version": "1.0.1",
-      "dev": true,
-      "requires": {
-        "aproba": "^1.1.1",
-        "copy-concurrently": "^1.0.0",
-        "fs-write-stream-atomic": "^1.0.8",
-        "mkdirp": "^0.5.1",
-        "rimraf": "^2.5.4",
-        "run-queue": "^1.0.3"
-      },
-      "dependencies": {
-        "rimraf": {
-          "version": "2.7.1",
-          "dev": true,
-          "requires": {
-            "glob": "^7.1.3"
-          }
-        }
-      }
-    },
-    "ms": {
-      "version": "2.1.2",
-      "dev": true
-    },
-    "mute-stdout": {
-      "version": "1.0.1",
-      "dev": true
-    },
-    "mute-stream": {
-      "version": "0.0.8",
-      "dev": true
-    },
-    "nan": {
-      "version": "2.15.0",
-      "dev": true,
-      "optional": true
-    },
-    "nanomatch": {
-      "version": "1.2.13",
-      "dev": true,
-      "requires": {
-        "arr-diff": "^4.0.0",
-        "array-unique": "^0.3.2",
-        "define-property": "^2.0.2",
-        "extend-shallow": "^3.0.2",
-        "fragment-cache": "^0.2.1",
-        "is-windows": "^1.0.2",
-        "kind-of": "^6.0.2",
-        "object.pick": "^1.3.0",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.1"
-      },
-      "dependencies": {
-        "extend-shallow": {
-          "version": "3.0.2",
-          "dev": true,
-          "requires": {
-            "assign-symbols": "^1.0.0",
-            "is-extendable": "^1.0.1"
-          }
-        },
-        "is-extendable": {
-          "version": "1.0.1",
-          "dev": true,
-          "requires": {
-            "is-plain-object": "^2.0.4"
-          }
-        },
-        "is-plain-object": {
-          "version": "2.0.4",
-          "dev": true,
-          "requires": {
-            "isobject": "^3.0.1"
-          }
-        },
-        "kind-of": {
-          "version": "6.0.3",
-          "dev": true
-        }
-      }
-    },
-    "natural-compare": {
-      "version": "1.4.0",
-      "dev": true
-    },
-    "negotiator": {
-      "version": "0.6.3",
-      "dev": true
-    },
-    "neo-async": {
-      "version": "2.6.2",
-      "dev": true
-    },
-    "next-tick": {
-      "version": "1.0.0",
-      "dev": true
-    },
-    "nice-try": {
-      "version": "1.0.5",
-      "dev": true
-    },
-    "node-libs-browser": {
-      "version": "2.2.1",
-      "dev": true,
-      "requires": {
-        "assert": "^1.1.1",
-        "browserify-zlib": "^0.2.0",
-        "buffer": "^4.3.0",
-        "console-browserify": "^1.1.0",
-        "constants-browserify": "^1.0.0",
-        "crypto-browserify": "^3.11.0",
-        "domain-browser": "^1.1.1",
-        "events": "^3.0.0",
-        "https-browserify": "^1.0.0",
-        "os-browserify": "^0.3.0",
-        "path-browserify": "0.0.1",
-        "process": "^0.11.10",
-        "punycode": "^1.2.4",
-        "querystring-es3": "^0.2.0",
-        "readable-stream": "^2.3.3",
-        "stream-browserify": "^2.0.1",
-        "stream-http": "^2.7.2",
-        "string_decoder": "^1.0.0",
-        "timers-browserify": "^2.0.4",
-        "tty-browserify": "0.0.0",
-        "url": "^0.11.0",
-        "util": "^0.11.0",
-        "vm-browserify": "^1.0.1"
-      },
-      "dependencies": {
-        "punycode": {
-          "version": "1.4.1",
-          "dev": true
-        }
-      }
-    },
-    "node-releases": {
-      "version": "2.0.2",
-      "dev": true
-    },
-    "normalize-package-data": {
-      "version": "2.5.0",
-      "dev": true,
-      "requires": {
-        "hosted-git-info": "^2.1.4",
-        "resolve": "^1.10.0",
-        "semver": "2 || 3 || 4 || 5",
-        "validate-npm-package-license": "^3.0.1"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "5.7.1",
-          "dev": true
-        }
-      }
-    },
-    "normalize-path": {
-      "version": "3.0.0",
-      "dev": true
-    },
-    "now-and-later": {
-      "version": "2.0.1",
-      "dev": true,
-      "requires": {
-        "once": "^1.3.2"
-      }
-    },
-    "npm-run-path": {
-      "version": "4.0.1",
-      "dev": true,
-      "requires": {
-        "path-key": "^3.0.0"
-      }
-    },
-    "number-is-nan": {
-      "version": "1.0.1",
-      "dev": true
-    },
-    "object-assign": {
-      "version": "4.1.1",
-      "dev": true
-    },
-    "object-copy": {
-      "version": "0.1.0",
-      "dev": true,
-      "requires": {
-        "copy-descriptor": "^0.1.0",
-        "define-property": "^0.2.5",
-        "kind-of": "^3.0.3"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "0.2.5",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        },
-        "is-accessor-descriptor": {
-          "version": "0.1.6",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.0.2"
-          }
-        },
-        "is-data-descriptor": {
-          "version": "0.1.4",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.0.2"
-          }
-        },
-        "is-descriptor": {
-          "version": "0.1.6",
-          "dev": true,
-          "requires": {
-            "is-accessor-descriptor": "^0.1.6",
-            "is-data-descriptor": "^0.1.4",
-            "kind-of": "^5.0.0"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "5.1.0",
-              "dev": true
-            }
-          }
-        },
-        "kind-of": {
-          "version": "3.2.2",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "object-keys": {
-      "version": "1.1.1",
-      "dev": true
-    },
-    "object-visit": {
-      "version": "1.0.1",
-      "dev": true,
-      "requires": {
-        "isobject": "^3.0.0"
-      }
-    },
-    "object.assign": {
-      "version": "4.1.2",
-      "dev": true,
-      "requires": {
-        "call-bind": "^1.0.0",
-        "define-properties": "^1.1.3",
-        "has-symbols": "^1.0.1",
-        "object-keys": "^1.1.1"
-      }
-    },
-    "object.defaults": {
-      "version": "1.1.0",
-      "dev": true,
-      "requires": {
-        "array-each": "^1.0.1",
-        "array-slice": "^1.0.0",
-        "for-own": "^1.0.0",
-        "isobject": "^3.0.0"
-      }
-    },
-    "object.map": {
-      "version": "1.0.1",
-      "dev": true,
-      "requires": {
-        "for-own": "^1.0.0",
-        "make-iterator": "^1.0.0"
-      }
-    },
-    "object.omit": {
-      "version": "2.0.1",
-      "dev": true,
-      "requires": {
-        "for-own": "^0.1.4",
-        "is-extendable": "^0.1.1"
-      },
-      "dependencies": {
-        "for-own": {
-          "version": "0.1.5",
-          "dev": true,
-          "requires": {
-            "for-in": "^1.0.1"
-          }
-        }
-      }
-    },
-    "object.pick": {
-      "version": "1.3.0",
-      "dev": true,
-      "requires": {
-        "isobject": "^3.0.1"
-      }
-    },
-    "object.reduce": {
-      "version": "1.0.1",
-      "dev": true,
-      "requires": {
-        "for-own": "^1.0.0",
-        "make-iterator": "^1.0.0"
-      }
-    },
-    "on-finished": {
-      "version": "2.3.0",
-      "dev": true,
-      "requires": {
-        "ee-first": "1.1.1"
-      }
-    },
-    "once": {
-      "version": "1.4.0",
-      "dev": true,
-      "requires": {
-        "wrappy": "1"
-      }
-    },
-    "onetime": {
-      "version": "5.1.2",
-      "dev": true,
-      "requires": {
-        "mimic-fn": "^2.1.0"
-      }
-    },
-    "optionator": {
-      "version": "0.9.1",
-      "dev": true,
-      "requires": {
-        "deep-is": "^0.1.3",
-        "fast-levenshtein": "^2.0.6",
-        "levn": "^0.4.1",
-        "prelude-ls": "^1.2.1",
-        "type-check": "^0.4.0",
-        "word-wrap": "^1.2.3"
-      }
-    },
-    "ordered-read-streams": {
-      "version": "1.0.1",
-      "dev": true,
-      "requires": {
-        "readable-stream": "^2.0.1"
-      }
-    },
-    "os-browserify": {
-      "version": "0.3.0",
-      "dev": true
-    },
-    "os-locale": {
-      "version": "1.4.0",
-      "dev": true,
-      "requires": {
-        "lcid": "^1.0.0"
-      }
-    },
-    "os-tmpdir": {
-      "version": "1.0.2",
-      "dev": true
-    },
-    "p-limit": {
-      "version": "2.3.0",
-      "dev": true,
-      "requires": {
-        "p-try": "^2.0.0"
-      }
-    },
-    "p-locate": {
-      "version": "4.1.0",
-      "dev": true,
-      "requires": {
-        "p-limit": "^2.2.0"
-      }
-    },
-    "p-try": {
-      "version": "2.2.0",
-      "dev": true
-    },
-    "pako": {
-      "version": "1.0.11",
-      "dev": true
-    },
-    "parallel-transform": {
-      "version": "1.2.0",
-      "dev": true,
-      "requires": {
-        "cyclist": "^1.0.1",
-        "inherits": "^2.0.3",
-        "readable-stream": "^2.1.5"
-      }
-    },
-    "parent-module": {
-      "version": "1.0.1",
-      "dev": true,
-      "requires": {
-        "callsites": "^3.0.0"
-      }
-    },
-    "parse-asn1": {
-      "version": "5.1.6",
-      "dev": true,
-      "requires": {
-        "asn1.js": "^5.2.0",
-        "browserify-aes": "^1.0.0",
-        "evp_bytestokey": "^1.0.0",
-        "pbkdf2": "^3.0.3",
-        "safe-buffer": "^5.1.1"
-      }
-    },
-    "parse-filepath": {
-      "version": "1.0.2",
-      "dev": true,
-      "requires": {
-        "is-absolute": "^1.0.0",
-        "map-cache": "^0.2.0",
-        "path-root": "^0.1.1"
-      }
-    },
-    "parse-glob": {
-      "version": "3.0.4",
-      "dev": true,
-      "requires": {
-        "glob-base": "^0.3.0",
-        "is-dotfile": "^1.0.0",
-        "is-extglob": "^1.0.0",
-        "is-glob": "^2.0.0"
-      },
-      "dependencies": {
-        "is-extglob": {
-          "version": "1.0.0",
-          "dev": true
-        },
-        "is-glob": {
-          "version": "2.0.1",
-          "dev": true,
-          "requires": {
-            "is-extglob": "^1.0.0"
-          }
-        }
-      }
-    },
-    "parse-json": {
-      "version": "2.2.0",
-      "dev": true,
-      "requires": {
-        "error-ex": "^1.2.0"
-      }
-    },
-    "parse-node-version": {
-      "version": "1.0.1",
-      "dev": true
-    },
-    "parse-passwd": {
-      "version": "1.0.0",
-      "dev": true
-    },
-    "parseurl": {
-      "version": "1.3.3",
-      "dev": true
-    },
-    "pascalcase": {
-      "version": "0.1.1",
-      "dev": true
-    },
-    "path-browserify": {
-      "version": "0.0.1",
-      "dev": true
-    },
-    "path-dirname": {
-      "version": "1.0.2",
-      "dev": true
-    },
-    "path-exists": {
-      "version": "4.0.0",
-      "dev": true
-    },
-    "path-is-absolute": {
-      "version": "1.0.1",
-      "dev": true
-    },
-    "path-key": {
-      "version": "3.1.1",
-      "dev": true
-    },
-    "path-parse": {
-      "version": "1.0.7",
-      "dev": true
-    },
-    "path-root": {
-      "version": "0.1.1",
-      "dev": true,
-      "requires": {
-        "path-root-regex": "^0.1.0"
-      }
-    },
-    "path-root-regex": {
-      "version": "0.1.2",
-      "dev": true
-    },
-    "path-type": {
-      "version": "1.1.0",
-      "dev": true,
-      "requires": {
-        "graceful-fs": "^4.1.2",
-        "pify": "^2.0.0",
-        "pinkie-promise": "^2.0.0"
-      }
-    },
-    "pbkdf2": {
-      "version": "3.1.2",
-      "dev": true,
-      "requires": {
-        "create-hash": "^1.1.2",
-        "create-hmac": "^1.1.4",
-        "ripemd160": "^2.0.1",
-        "safe-buffer": "^5.0.1",
-        "sha.js": "^2.4.8"
-      }
-    },
-    "picocolors": {
-      "version": "1.0.0",
-      "dev": true
-    },
-    "picomatch": {
-      "version": "2.3.1",
-      "dev": true
-    },
-    "pify": {
-      "version": "2.3.0",
-      "dev": true
-    },
-    "pinkie": {
-      "version": "2.0.4",
-      "dev": true
-    },
-    "pinkie-promise": {
-      "version": "2.0.1",
-      "dev": true,
-      "requires": {
-        "pinkie": "^2.0.0"
-      }
-    },
-    "pkg-dir": {
-      "version": "4.2.0",
-      "dev": true,
-      "requires": {
-        "find-up": "^4.0.0"
-      }
-    },
-    "plugin-error": {
-      "version": "1.0.1",
-      "dev": true,
-      "requires": {
-        "ansi-colors": "^1.0.1",
-        "arr-diff": "^4.0.0",
-        "arr-union": "^3.1.0",
-        "extend-shallow": "^3.0.2"
-      },
-      "dependencies": {
-        "ansi-colors": {
-          "version": "1.1.0",
-          "dev": true,
-          "requires": {
-            "ansi-wrap": "^0.1.0"
-          }
-        },
-        "extend-shallow": {
-          "version": "3.0.2",
-          "dev": true,
-          "requires": {
-            "assign-symbols": "^1.0.0",
-            "is-extendable": "^1.0.1"
-          }
-        },
-        "is-extendable": {
-          "version": "1.0.1",
-          "dev": true,
-          "requires": {
-            "is-plain-object": "^2.0.4"
-          }
-        },
-        "is-plain-object": {
-          "version": "2.0.4",
-          "dev": true,
-          "requires": {
-            "isobject": "^3.0.1"
-          }
-        }
-      }
-    },
-    "posix-character-classes": {
-      "version": "0.1.1",
-      "dev": true
-    },
-    "prelude-ls": {
-      "version": "1.2.1",
-      "dev": true
-    },
-    "preserve": {
-      "version": "0.2.0",
-      "dev": true
-    },
-    "prettier": {
-      "version": "2.3.1",
-      "dev": true
-    },
-    "pretty-hrtime": {
-      "version": "1.0.3",
-      "dev": true
-    },
-    "process": {
-      "version": "0.11.10",
-      "dev": true
-    },
-    "process-nextick-args": {
-      "version": "2.0.1",
-      "dev": true
-    },
-    "progress": {
-      "version": "2.0.3",
-      "dev": true
-    },
-    "promise-inflight": {
-      "version": "1.0.1",
-      "dev": true
-    },
-    "prr": {
-      "version": "1.0.1",
-      "dev": true
-    },
-    "public-encrypt": {
-      "version": "4.0.3",
-      "dev": true,
-      "requires": {
-        "bn.js": "^4.1.0",
-        "browserify-rsa": "^4.0.0",
-        "create-hash": "^1.1.0",
-        "parse-asn1": "^5.0.0",
-        "randombytes": "^2.0.1",
-        "safe-buffer": "^5.1.2"
-      },
-      "dependencies": {
-        "bn.js": {
-          "version": "4.12.0",
-          "dev": true
-        }
-      }
-    },
-    "pump": {
-      "version": "2.0.1",
-      "dev": true,
-      "requires": {
-        "end-of-stream": "^1.1.0",
-        "once": "^1.3.1"
-      }
-    },
-    "pumpify": {
-      "version": "1.5.1",
-      "dev": true,
-      "requires": {
-        "duplexify": "^3.6.0",
-        "inherits": "^2.0.3",
-        "pump": "^2.0.0"
-      }
-    },
-    "punycode": {
-      "version": "2.1.1",
-      "dev": true
-    },
-    "qjobs": {
-      "version": "1.2.0",
-      "dev": true
-    },
-    "qs": {
-      "version": "6.9.7",
-      "dev": true
-    },
-    "querystring": {
-      "version": "0.2.0",
-      "dev": true
-    },
-    "querystring-es3": {
-      "version": "0.2.1",
-      "dev": true
-    },
-    "randomatic": {
-      "version": "3.1.1",
-      "dev": true,
-      "requires": {
-        "is-number": "^4.0.0",
-        "kind-of": "^6.0.0",
-        "math-random": "^1.0.1"
-      },
-      "dependencies": {
-        "is-number": {
-          "version": "4.0.0",
-          "dev": true
-        },
-        "kind-of": {
-          "version": "6.0.3",
-          "dev": true
-        }
-      }
-    },
-    "randombytes": {
-      "version": "2.1.0",
-      "dev": true,
-      "requires": {
-        "safe-buffer": "^5.1.0"
-      }
-    },
-    "randomfill": {
-      "version": "1.0.4",
-      "dev": true,
-      "requires": {
-        "randombytes": "^2.0.5",
-        "safe-buffer": "^5.1.0"
-      }
-    },
-    "range-parser": {
-      "version": "1.2.1",
-      "dev": true
-    },
-    "raw-body": {
-      "version": "2.4.3",
-      "dev": true,
-      "requires": {
-        "bytes": "3.1.2",
-        "http-errors": "1.8.1",
-        "iconv-lite": "0.4.24",
-        "unpipe": "1.0.0"
-      }
-    },
-    "read-pkg": {
-      "version": "1.1.0",
-      "dev": true,
-      "requires": {
-        "load-json-file": "^1.0.0",
-        "normalize-package-data": "^2.3.2",
-        "path-type": "^1.0.0"
-      }
-    },
-    "read-pkg-up": {
-      "version": "1.0.1",
-      "dev": true,
-      "requires": {
-        "find-up": "^1.0.0",
-        "read-pkg": "^1.0.0"
-      },
-      "dependencies": {
-        "find-up": {
-          "version": "1.1.2",
-          "dev": true,
-          "requires": {
-            "path-exists": "^2.0.0",
-            "pinkie-promise": "^2.0.0"
-          }
-        },
-        "path-exists": {
-          "version": "2.1.0",
-          "dev": true,
-          "requires": {
-            "pinkie-promise": "^2.0.0"
-          }
-        }
-      }
-    },
-    "readable-stream": {
-      "version": "2.3.7",
-      "dev": true,
-      "requires": {
-        "core-util-is": "~1.0.0",
-        "inherits": "~2.0.3",
-        "isarray": "~1.0.0",
-        "process-nextick-args": "~2.0.0",
-        "safe-buffer": "~5.1.1",
-        "string_decoder": "~1.1.1",
-        "util-deprecate": "~1.0.1"
-      }
-    },
-    "readdirp": {
-      "version": "2.2.1",
-      "dev": true,
-      "requires": {
-        "graceful-fs": "^4.1.11",
-        "micromatch": "^3.1.10",
-        "readable-stream": "^2.0.2"
-      }
-    },
-    "rechoir": {
-      "version": "0.6.2",
-      "dev": true,
-      "requires": {
-        "resolve": "^1.1.6"
-      }
-    },
-    "regex-cache": {
-      "version": "0.4.4",
-      "dev": true,
-      "requires": {
-        "is-equal-shallow": "^0.1.3"
-      }
-    },
-    "regex-not": {
-      "version": "1.0.2",
-      "dev": true,
-      "requires": {
-        "extend-shallow": "^3.0.2",
-        "safe-regex": "^1.1.0"
-      },
-      "dependencies": {
-        "extend-shallow": {
-          "version": "3.0.2",
-          "dev": true,
-          "requires": {
-            "assign-symbols": "^1.0.0",
-            "is-extendable": "^1.0.1"
-          }
-        },
-        "is-extendable": {
-          "version": "1.0.1",
-          "dev": true,
-          "requires": {
-            "is-plain-object": "^2.0.4"
-          }
-        },
-        "is-plain-object": {
-          "version": "2.0.4",
-          "dev": true,
-          "requires": {
-            "isobject": "^3.0.1"
-          }
-        }
-      }
-    },
-    "regexpp": {
-      "version": "3.2.0",
-      "dev": true
-    },
-    "remove-bom-buffer": {
-      "version": "3.0.0",
-      "dev": true,
-      "requires": {
-        "is-buffer": "^1.1.5",
-        "is-utf8": "^0.2.1"
-      }
-    },
-    "remove-bom-stream": {
-      "version": "1.2.0",
-      "dev": true,
-      "requires": {
-        "remove-bom-buffer": "^3.0.0",
-        "safe-buffer": "^5.1.0",
-        "through2": "^2.0.3"
-      }
-    },
-    "remove-trailing-separator": {
-      "version": "1.1.0",
-      "dev": true
-    },
-    "repeat-element": {
-      "version": "1.1.4",
-      "dev": true
-    },
-    "repeat-string": {
-      "version": "1.6.1",
-      "dev": true
-    },
-    "replace-ext": {
-      "version": "1.0.1",
-      "dev": true
-    },
-    "replace-homedir": {
-      "version": "1.0.0",
-      "dev": true,
-      "requires": {
-        "homedir-polyfill": "^1.0.1",
-        "is-absolute": "^1.0.0",
-        "remove-trailing-separator": "^1.1.0"
-      }
-    },
-    "require-directory": {
-      "version": "2.1.1",
-      "dev": true
-    },
-    "require-from-string": {
-      "version": "2.0.2",
-      "dev": true
-    },
-    "require-main-filename": {
-      "version": "1.0.1",
-      "dev": true
-    },
-    "requires-port": {
-      "version": "1.0.0",
-      "dev": true
-    },
-    "resolve": {
-      "version": "1.22.0",
-      "dev": true,
-      "requires": {
-        "is-core-module": "^2.8.1",
-        "path-parse": "^1.0.7",
-        "supports-preserve-symlinks-flag": "^1.0.0"
-      }
-    },
-    "resolve-cwd": {
-      "version": "3.0.0",
-      "dev": true,
-      "requires": {
-        "resolve-from": "^5.0.0"
-      },
-      "dependencies": {
-        "resolve-from": {
-          "version": "5.0.0",
-          "dev": true
-        }
-      }
-    },
-    "resolve-dir": {
-      "version": "1.0.1",
-      "dev": true,
-      "requires": {
-        "expand-tilde": "^2.0.0",
-        "global-modules": "^1.0.0"
-      }
-    },
-    "resolve-from": {
-      "version": "4.0.0",
-      "dev": true
-    },
-    "resolve-options": {
-      "version": "1.1.0",
-      "dev": true,
-      "requires": {
-        "value-or-function": "^3.0.0"
-      }
-    },
-    "resolve-url": {
-      "version": "0.2.1",
-      "dev": true
-    },
-    "restore-cursor": {
-      "version": "3.1.0",
-      "dev": true,
-      "requires": {
-        "onetime": "^5.1.0",
-        "signal-exit": "^3.0.2"
-      }
-    },
-    "ret": {
-      "version": "0.1.15",
-      "dev": true
-    },
-    "rfdc": {
-      "version": "1.3.0",
-      "dev": true
-    },
-    "rimraf": {
-      "version": "3.0.2",
-      "dev": true,
-      "requires": {
-        "glob": "^7.1.3"
-      }
-    },
-    "ripemd160": {
-      "version": "2.0.2",
-      "dev": true,
-      "requires": {
-        "hash-base": "^3.0.0",
-        "inherits": "^2.0.1"
-      }
-    },
-    "run-async": {
-      "version": "2.4.1",
-      "dev": true
-    },
-    "run-queue": {
-      "version": "1.0.3",
-      "dev": true,
-      "requires": {
-        "aproba": "^1.1.1"
-      }
-    },
-    "rxjs": {
-      "version": "6.6.7",
-      "dev": true,
-      "requires": {
-        "tslib": "^1.9.0"
-      }
-    },
-    "safe-buffer": {
-      "version": "5.1.2",
-      "dev": true
-    },
-    "safe-regex": {
-      "version": "1.1.0",
-      "dev": true,
-      "requires": {
-        "ret": "~0.1.10"
-      }
-    },
-    "safer-buffer": {
-      "version": "2.1.2",
-      "dev": true
-    },
-    "schema-utils": {
-      "version": "3.1.1",
-      "dev": true,
-      "requires": {
-        "@types/json-schema": "^7.0.8",
-        "ajv": "^6.12.5",
-        "ajv-keywords": "^3.5.2"
-      }
-    },
-    "semver": {
-      "version": "7.3.5",
-      "dev": true,
-      "requires": {
-        "lru-cache": "^6.0.0"
-      }
-    },
-    "semver-greatest-satisfied-range": {
-      "version": "1.1.0",
-      "dev": true,
-      "requires": {
-        "sver-compat": "^1.5.0"
-      }
-    },
-    "serialize-javascript": {
-      "version": "6.0.0",
-      "dev": true,
-      "requires": {
-        "randombytes": "^2.1.0"
-      }
-    },
-    "set-blocking": {
-      "version": "2.0.0",
-      "dev": true
-    },
-    "set-value": {
-      "version": "2.0.1",
-      "dev": true,
-      "requires": {
-        "extend-shallow": "^2.0.1",
-        "is-extendable": "^0.1.1",
-        "is-plain-object": "^2.0.3",
-        "split-string": "^3.0.1"
-      },
-      "dependencies": {
-        "is-plain-object": {
-          "version": "2.0.4",
-          "dev": true,
-          "requires": {
-            "isobject": "^3.0.1"
-          }
-        }
-      }
-    },
-    "setimmediate": {
-      "version": "1.0.5",
-      "dev": true
-    },
-    "setprototypeof": {
-      "version": "1.2.0",
-      "dev": true
-    },
-    "sha.js": {
-      "version": "2.4.11",
-      "dev": true,
-      "requires": {
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.0.1"
-      }
-    },
-    "shadergraph": {
-      "version": "file:../shadergraph",
-      "requires": {
-        "eslint": "^7.28.0",
-        "eslint-plugin-jasmine": "^4.1.2",
-        "glsl-parser": "^2.0.1",
-        "glsl-tokenizer": "^2.1.5",
-        "gulp": "^4.0.2",
-        "gulp-concat": "^2.6.1",
-        "gulp-eslint": "^6.0.0",
-        "gulp-watch": "^5.0.1",
-        "jasmine-core": "^3.7.1",
-        "karma": "^6.3.3",
-        "karma-chrome-launcher": "^3.1.0",
-        "karma-jasmine": "^4.0.1",
-        "prettier": "2.3.1",
-        "webpack": "^5.38.1",
-        "webpack-cli": "^4.7.2",
-        "webpack-stream": "^6.1.2"
-      },
-      "dependencies": {
-        "@babel/code-frame": {
-          "version": "7.12.11",
-          "dev": true,
-          "requires": {
-            "@babel/highlight": "^7.10.4"
-          }
-        },
-        "@babel/helper-validator-identifier": {
-          "version": "7.14.5",
-          "dev": true
-        },
-        "@babel/highlight": {
-          "version": "7.14.5",
-          "dev": true,
-          "requires": {
-            "@babel/helper-validator-identifier": "^7.14.5",
-            "chalk": "^2.0.0",
-            "js-tokens": "^4.0.0"
-          },
-          "dependencies": {
-            "ansi-styles": {
-              "version": "3.2.1",
-              "dev": true,
-              "requires": {
-                "color-convert": "^1.9.0"
-              }
-            },
-            "chalk": {
-              "version": "2.4.2",
-              "dev": true,
-              "requires": {
-                "ansi-styles": "^3.2.1",
-                "escape-string-regexp": "^1.0.5",
-                "supports-color": "^5.3.0"
-              }
-            },
-            "color-convert": {
-              "version": "1.9.3",
-              "dev": true,
-              "requires": {
-                "color-name": "1.1.3"
-              }
-            },
-            "color-name": {
-              "version": "1.1.3",
-              "dev": true
-            },
-            "escape-string-regexp": {
-              "version": "1.0.5",
-              "dev": true
-            },
-            "has-flag": {
-              "version": "3.0.0",
-              "dev": true
-            },
-            "supports-color": {
-              "version": "5.5.0",
-              "dev": true,
-              "requires": {
-                "has-flag": "^3.0.0"
-              }
-            }
-          }
-        },
-        "@discoveryjs/json-ext": {
-          "version": "0.5.3",
-          "dev": true
-        },
-        "@eslint/eslintrc": {
-          "version": "0.4.2",
-          "dev": true,
-          "requires": {
-            "ajv": "^6.12.4",
-            "debug": "^4.1.1",
-            "espree": "^7.3.0",
-            "globals": "^13.9.0",
-            "ignore": "^4.0.6",
-            "import-fresh": "^3.2.1",
-            "js-yaml": "^3.13.1",
-            "minimatch": "^3.0.4",
-            "strip-json-comments": "^3.1.1"
-          }
-        },
-        "@types/component-emitter": {
-          "version": "1.2.10",
-          "dev": true
-        },
-        "@types/cookie": {
-          "version": "0.4.0",
-          "dev": true
-        },
-        "@types/cors": {
-          "version": "2.8.10",
-          "dev": true
-        },
-        "@types/eslint": {
-          "version": "7.2.13",
-          "dev": true,
-          "requires": {
-            "@types/estree": "*",
-            "@types/json-schema": "*"
-          }
-        },
-        "@types/eslint-scope": {
-          "version": "3.7.0",
-          "dev": true,
-          "requires": {
-            "@types/eslint": "*",
-            "@types/estree": "*"
-          }
-        },
-        "@types/estree": {
-          "version": "0.0.47",
-          "dev": true
-        },
-        "@types/json-schema": {
-          "version": "7.0.7",
-          "dev": true
-        },
-        "@types/node": {
-          "version": "15.12.2",
-          "dev": true
-        },
-        "@webassemblyjs/ast": {
-          "version": "1.11.0",
-          "dev": true,
-          "requires": {
-            "@webassemblyjs/helper-numbers": "1.11.0",
-            "@webassemblyjs/helper-wasm-bytecode": "1.11.0"
-          }
-        },
-        "@webassemblyjs/floating-point-hex-parser": {
-          "version": "1.11.0",
-          "dev": true
-        },
-        "@webassemblyjs/helper-api-error": {
-          "version": "1.11.0",
-          "dev": true
-        },
-        "@webassemblyjs/helper-buffer": {
-          "version": "1.11.0",
-          "dev": true
-        },
-        "@webassemblyjs/helper-code-frame": {
-          "version": "1.9.0",
-          "dev": true,
-          "requires": {
-            "@webassemblyjs/wast-printer": "1.9.0"
-          },
-          "dependencies": {
-            "@webassemblyjs/ast": {
-              "version": "1.9.0",
-              "dev": true,
-              "requires": {
-                "@webassemblyjs/helper-module-context": "1.9.0",
-                "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
-                "@webassemblyjs/wast-parser": "1.9.0"
-              }
-            },
-            "@webassemblyjs/helper-wasm-bytecode": {
-              "version": "1.9.0",
-              "dev": true
-            },
-            "@webassemblyjs/wast-printer": {
-              "version": "1.9.0",
-              "dev": true,
-              "requires": {
-                "@webassemblyjs/ast": "1.9.0",
-                "@webassemblyjs/wast-parser": "1.9.0",
-                "@xtuc/long": "4.2.2"
-              }
-            }
-          }
-        },
-        "@webassemblyjs/helper-fsm": {
-          "version": "1.9.0",
-          "dev": true
-        },
-        "@webassemblyjs/helper-module-context": {
-          "version": "1.9.0",
-          "dev": true,
-          "requires": {
-            "@webassemblyjs/ast": "1.9.0"
-          },
-          "dependencies": {
-            "@webassemblyjs/ast": {
-              "version": "1.9.0",
-              "dev": true,
-              "requires": {
-                "@webassemblyjs/helper-module-context": "1.9.0",
-                "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
-                "@webassemblyjs/wast-parser": "1.9.0"
-              }
-            },
-            "@webassemblyjs/helper-wasm-bytecode": {
-              "version": "1.9.0",
-              "dev": true
-            }
-          }
-        },
-        "@webassemblyjs/helper-numbers": {
-          "version": "1.11.0",
-          "dev": true,
-          "requires": {
-            "@webassemblyjs/floating-point-hex-parser": "1.11.0",
-            "@webassemblyjs/helper-api-error": "1.11.0",
-            "@xtuc/long": "4.2.2"
-          }
-        },
-        "@webassemblyjs/helper-wasm-bytecode": {
-          "version": "1.11.0",
-          "dev": true
-        },
-        "@webassemblyjs/helper-wasm-section": {
-          "version": "1.11.0",
-          "dev": true,
-          "requires": {
-            "@webassemblyjs/ast": "1.11.0",
-            "@webassemblyjs/helper-buffer": "1.11.0",
-            "@webassemblyjs/helper-wasm-bytecode": "1.11.0",
-            "@webassemblyjs/wasm-gen": "1.11.0"
-          }
-        },
-        "@webassemblyjs/ieee754": {
-          "version": "1.11.0",
-          "dev": true,
-          "requires": {
-            "@xtuc/ieee754": "^1.2.0"
-          }
-        },
-        "@webassemblyjs/leb128": {
-          "version": "1.11.0",
-          "dev": true,
-          "requires": {
-            "@xtuc/long": "4.2.2"
-          }
-        },
-        "@webassemblyjs/utf8": {
-          "version": "1.11.0",
-          "dev": true
-        },
-        "@webassemblyjs/wasm-edit": {
-          "version": "1.11.0",
-          "dev": true,
-          "requires": {
-            "@webassemblyjs/ast": "1.11.0",
-            "@webassemblyjs/helper-buffer": "1.11.0",
-            "@webassemblyjs/helper-wasm-bytecode": "1.11.0",
-            "@webassemblyjs/helper-wasm-section": "1.11.0",
-            "@webassemblyjs/wasm-gen": "1.11.0",
-            "@webassemblyjs/wasm-opt": "1.11.0",
-            "@webassemblyjs/wasm-parser": "1.11.0",
-            "@webassemblyjs/wast-printer": "1.11.0"
-          }
-        },
-        "@webassemblyjs/wasm-gen": {
-          "version": "1.11.0",
-          "dev": true,
-          "requires": {
-            "@webassemblyjs/ast": "1.11.0",
-            "@webassemblyjs/helper-wasm-bytecode": "1.11.0",
-            "@webassemblyjs/ieee754": "1.11.0",
-            "@webassemblyjs/leb128": "1.11.0",
-            "@webassemblyjs/utf8": "1.11.0"
-          }
-        },
-        "@webassemblyjs/wasm-opt": {
-          "version": "1.11.0",
-          "dev": true,
-          "requires": {
-            "@webassemblyjs/ast": "1.11.0",
-            "@webassemblyjs/helper-buffer": "1.11.0",
-            "@webassemblyjs/wasm-gen": "1.11.0",
-            "@webassemblyjs/wasm-parser": "1.11.0"
-          }
-        },
-        "@webassemblyjs/wasm-parser": {
-          "version": "1.11.0",
-          "dev": true,
-          "requires": {
-            "@webassemblyjs/ast": "1.11.0",
-            "@webassemblyjs/helper-api-error": "1.11.0",
-            "@webassemblyjs/helper-wasm-bytecode": "1.11.0",
-            "@webassemblyjs/ieee754": "1.11.0",
-            "@webassemblyjs/leb128": "1.11.0",
-            "@webassemblyjs/utf8": "1.11.0"
-          }
-        },
-        "@webassemblyjs/wast-parser": {
-          "version": "1.9.0",
-          "dev": true,
-          "requires": {
-            "@webassemblyjs/ast": "1.9.0",
-            "@webassemblyjs/floating-point-hex-parser": "1.9.0",
-            "@webassemblyjs/helper-api-error": "1.9.0",
-            "@webassemblyjs/helper-code-frame": "1.9.0",
-            "@webassemblyjs/helper-fsm": "1.9.0",
-            "@xtuc/long": "4.2.2"
-          },
-          "dependencies": {
-            "@webassemblyjs/ast": {
-              "version": "1.9.0",
-              "dev": true,
-              "requires": {
-                "@webassemblyjs/helper-module-context": "1.9.0",
-                "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
-                "@webassemblyjs/wast-parser": "1.9.0"
-              }
-            },
-            "@webassemblyjs/floating-point-hex-parser": {
-              "version": "1.9.0",
-              "dev": true
-            },
-            "@webassemblyjs/helper-api-error": {
-              "version": "1.9.0",
-              "dev": true
-            },
-            "@webassemblyjs/helper-wasm-bytecode": {
-              "version": "1.9.0",
-              "dev": true
-            }
-          }
-        },
-        "@webassemblyjs/wast-printer": {
-          "version": "1.11.0",
-          "dev": true,
-          "requires": {
-            "@webassemblyjs/ast": "1.11.0",
-            "@xtuc/long": "4.2.2"
-          }
-        },
-        "@webpack-cli/configtest": {
-          "version": "1.0.4",
-          "dev": true,
-          "requires": {}
-        },
-        "@webpack-cli/info": {
-          "version": "1.3.0",
-          "dev": true,
-          "requires": {
-            "envinfo": "^7.7.3"
-          }
-        },
-        "@webpack-cli/serve": {
-          "version": "1.5.1",
-          "dev": true,
-          "requires": {}
-        },
-        "@xtuc/ieee754": {
-          "version": "1.2.0",
-          "dev": true
-        },
-        "@xtuc/long": {
-          "version": "4.2.2",
-          "dev": true
-        },
-        "accepts": {
-          "version": "1.3.7",
-          "dev": true,
-          "requires": {
-            "mime-types": "~2.1.24",
-            "negotiator": "0.6.2"
-          }
-        },
-        "acorn": {
-          "version": "7.4.1",
-          "dev": true
-        },
-        "acorn-jsx": {
-          "version": "5.3.1",
-          "dev": true,
-          "requires": {}
-        },
-        "ajv": {
-          "version": "6.12.6",
-          "dev": true,
-          "requires": {
-            "fast-deep-equal": "^3.1.1",
-            "fast-json-stable-stringify": "^2.0.0",
-            "json-schema-traverse": "^0.4.1",
-            "uri-js": "^4.2.2"
-          }
-        },
-        "ajv-errors": {
-          "version": "1.0.1",
-          "dev": true,
-          "requires": {}
-        },
-        "ajv-keywords": {
-          "version": "3.5.2",
-          "dev": true,
-          "requires": {}
-        },
-        "ansi-colors": {
-          "version": "4.1.1",
-          "dev": true
-        },
-        "ansi-escapes": {
-          "version": "4.3.2",
-          "dev": true,
-          "requires": {
-            "type-fest": "^0.21.3"
-          },
-          "dependencies": {
-            "type-fest": {
-              "version": "0.21.3",
-              "dev": true
-            }
-          }
-        },
-        "ansi-gray": {
-          "version": "0.1.1",
-          "dev": true,
-          "requires": {
-            "ansi-wrap": "0.1.0"
-          }
-        },
-        "ansi-regex": {
-          "version": "5.0.0",
-          "dev": true
-        },
-        "ansi-styles": {
-          "version": "4.3.0",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "ansi-wrap": {
-          "version": "0.1.0",
-          "dev": true
-        },
-        "anymatch": {
-          "version": "2.0.0",
-          "dev": true,
-          "requires": {
-            "micromatch": "^3.1.4",
-            "normalize-path": "^2.1.1"
-          },
-          "dependencies": {
-            "normalize-path": {
-              "version": "2.1.1",
-              "dev": true,
-              "requires": {
-                "remove-trailing-separator": "^1.0.1"
-              }
-            }
-          }
-        },
-        "append-buffer": {
-          "version": "1.0.2",
-          "dev": true,
-          "requires": {
-            "buffer-equal": "^1.0.0"
-          }
-        },
-        "aproba": {
-          "version": "1.2.0",
-          "dev": true
-        },
-        "archy": {
-          "version": "1.0.0",
-          "dev": true
-        },
-        "argparse": {
-          "version": "1.0.10",
-          "dev": true,
-          "requires": {
-            "sprintf-js": "~1.0.2"
-          }
-        },
-        "arr-diff": {
-          "version": "4.0.0",
-          "dev": true
-        },
-        "arr-filter": {
-          "version": "1.1.2",
-          "dev": true,
-          "requires": {
-            "make-iterator": "^1.0.0"
-          }
-        },
-        "arr-flatten": {
-          "version": "1.1.0",
-          "dev": true
-        },
-        "arr-map": {
-          "version": "2.0.2",
-          "dev": true,
-          "requires": {
-            "make-iterator": "^1.0.0"
-          }
-        },
-        "arr-union": {
-          "version": "3.1.0",
-          "dev": true
-        },
-        "array-each": {
-          "version": "1.0.1",
-          "dev": true
-        },
-        "array-initial": {
-          "version": "1.1.0",
-          "dev": true,
-          "requires": {
-            "array-slice": "^1.0.0",
-            "is-number": "^4.0.0"
-          },
-          "dependencies": {
-            "is-number": {
-              "version": "4.0.0",
-              "dev": true
-            }
-          }
-        },
-        "array-last": {
-          "version": "1.3.0",
-          "dev": true,
-          "requires": {
-            "is-number": "^4.0.0"
-          },
-          "dependencies": {
-            "is-number": {
-              "version": "4.0.0",
-              "dev": true
-            }
-          }
-        },
-        "array-slice": {
-          "version": "1.1.0",
-          "dev": true
-        },
-        "array-sort": {
-          "version": "1.0.0",
-          "dev": true,
-          "requires": {
-            "default-compare": "^1.0.0",
-            "get-value": "^2.0.6",
-            "kind-of": "^5.0.2"
-          }
-        },
-        "array-unique": {
-          "version": "0.3.2",
-          "dev": true
-        },
-        "asn1.js": {
-          "version": "5.4.1",
-          "dev": true,
-          "requires": {
-            "bn.js": "^4.0.0",
-            "inherits": "^2.0.1",
-            "minimalistic-assert": "^1.0.0",
-            "safer-buffer": "^2.1.0"
-          },
-          "dependencies": {
-            "bn.js": {
-              "version": "4.12.0",
-              "dev": true
-            }
-          }
-        },
-        "assert": {
-          "version": "1.5.0",
-          "dev": true,
-          "requires": {
-            "object-assign": "^4.1.1",
-            "util": "0.10.3"
-          },
-          "dependencies": {
-            "inherits": {
-              "version": "2.0.1",
-              "dev": true
-            },
-            "util": {
-              "version": "0.10.3",
-              "dev": true,
-              "requires": {
-                "inherits": "2.0.1"
-              }
-            }
-          }
-        },
-        "assign-symbols": {
-          "version": "1.0.0",
-          "dev": true
-        },
-        "astral-regex": {
-          "version": "2.0.0",
-          "dev": true
-        },
-        "async-done": {
-          "version": "1.3.2",
-          "dev": true,
-          "requires": {
-            "end-of-stream": "^1.1.0",
-            "once": "^1.3.2",
-            "process-nextick-args": "^2.0.0",
-            "stream-exhaust": "^1.0.1"
-          }
-        },
-        "async-each": {
-          "version": "1.0.3",
-          "dev": true
-        },
-        "async-settle": {
-          "version": "1.0.0",
-          "dev": true,
-          "requires": {
-            "async-done": "^1.2.2"
-          }
-        },
-        "atob": {
-          "version": "2.1.2",
-          "dev": true
-        },
-        "bach": {
-          "version": "1.2.0",
-          "dev": true,
-          "requires": {
-            "arr-filter": "^1.1.1",
-            "arr-flatten": "^1.0.1",
-            "arr-map": "^2.0.0",
-            "array-each": "^1.0.0",
-            "array-initial": "^1.0.0",
-            "array-last": "^1.1.1",
-            "async-done": "^1.2.2",
-            "async-settle": "^1.0.0",
-            "now-and-later": "^2.0.0"
-          }
-        },
-        "balanced-match": {
-          "version": "1.0.2",
-          "dev": true
-        },
-        "base": {
-          "version": "0.11.2",
-          "dev": true,
-          "requires": {
-            "cache-base": "^1.0.1",
-            "class-utils": "^0.3.5",
-            "component-emitter": "^1.2.1",
-            "define-property": "^1.0.0",
-            "isobject": "^3.0.1",
-            "mixin-deep": "^1.2.0",
-            "pascalcase": "^0.1.1"
-          },
-          "dependencies": {
-            "define-property": {
-              "version": "1.0.0",
-              "dev": true,
-              "requires": {
-                "is-descriptor": "^1.0.0"
-              }
-            }
-          }
-        },
-        "base64-arraybuffer": {
-          "version": "0.1.4",
-          "dev": true
-        },
-        "base64-js": {
-          "version": "1.5.1",
-          "dev": true
-        },
-        "base64id": {
-          "version": "2.0.0",
-          "dev": true
-        },
-        "big.js": {
-          "version": "5.2.2",
-          "dev": true
-        },
-        "binary-extensions": {
-          "version": "1.13.1",
-          "dev": true
-        },
-        "bindings": {
-          "version": "1.5.0",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "file-uri-to-path": "1.0.0"
-          }
-        },
-        "bluebird": {
-          "version": "3.7.2",
-          "dev": true
-        },
-        "bn.js": {
-          "version": "5.2.0",
-          "dev": true
-        },
-        "body-parser": {
-          "version": "1.19.0",
-          "dev": true,
-          "requires": {
-            "bytes": "3.1.0",
-            "content-type": "~1.0.4",
-            "debug": "2.6.9",
-            "depd": "~1.1.2",
-            "http-errors": "1.7.2",
-            "iconv-lite": "0.4.24",
-            "on-finished": "~2.3.0",
-            "qs": "6.7.0",
-            "raw-body": "2.4.0",
-            "type-is": "~1.6.17"
-          },
-          "dependencies": {
-            "debug": {
-              "version": "2.6.9",
-              "dev": true,
-              "requires": {
-                "ms": "2.0.0"
-              }
-            },
-            "ms": {
-              "version": "2.0.0",
-              "dev": true
-            }
-          }
-        },
-        "brace-expansion": {
-          "version": "1.1.11",
-          "dev": true,
-          "requires": {
-            "balanced-match": "^1.0.0",
-            "concat-map": "0.0.1"
-          }
-        },
-        "braces": {
-          "version": "2.3.2",
-          "dev": true,
-          "requires": {
-            "arr-flatten": "^1.1.0",
-            "array-unique": "^0.3.2",
-            "extend-shallow": "^2.0.1",
-            "fill-range": "^4.0.0",
-            "isobject": "^3.0.1",
-            "repeat-element": "^1.1.2",
-            "snapdragon": "^0.8.1",
-            "snapdragon-node": "^2.0.1",
-            "split-string": "^3.0.2",
-            "to-regex": "^3.0.1"
-          }
-        },
-        "brorand": {
-          "version": "1.1.0",
-          "dev": true
-        },
-        "browserify-aes": {
-          "version": "1.2.0",
-          "dev": true,
-          "requires": {
-            "buffer-xor": "^1.0.3",
-            "cipher-base": "^1.0.0",
-            "create-hash": "^1.1.0",
-            "evp_bytestokey": "^1.0.3",
-            "inherits": "^2.0.1",
-            "safe-buffer": "^5.0.1"
-          }
-        },
-        "browserify-cipher": {
-          "version": "1.0.1",
-          "dev": true,
-          "requires": {
-            "browserify-aes": "^1.0.4",
-            "browserify-des": "^1.0.0",
-            "evp_bytestokey": "^1.0.0"
-          }
-        },
-        "browserify-des": {
-          "version": "1.0.2",
-          "dev": true,
-          "requires": {
-            "cipher-base": "^1.0.1",
-            "des.js": "^1.0.0",
-            "inherits": "^2.0.1",
-            "safe-buffer": "^5.1.2"
-          }
-        },
-        "browserify-rsa": {
-          "version": "4.1.0",
-          "dev": true,
-          "requires": {
-            "bn.js": "^5.0.0",
-            "randombytes": "^2.0.1"
-          }
-        },
-        "browserify-sign": {
-          "version": "4.2.1",
-          "dev": true,
-          "requires": {
-            "bn.js": "^5.1.1",
-            "browserify-rsa": "^4.0.1",
-            "create-hash": "^1.2.0",
-            "create-hmac": "^1.1.7",
-            "elliptic": "^6.5.3",
-            "inherits": "^2.0.4",
-            "parse-asn1": "^5.1.5",
-            "readable-stream": "^3.6.0",
-            "safe-buffer": "^5.2.0"
-          },
-          "dependencies": {
-            "readable-stream": {
-              "version": "3.6.0",
-              "dev": true,
-              "requires": {
-                "inherits": "^2.0.3",
-                "string_decoder": "^1.1.1",
-                "util-deprecate": "^1.0.1"
-              }
-            },
-            "safe-buffer": {
-              "version": "5.2.1",
-              "dev": true
-            }
-          }
-        },
-        "browserify-zlib": {
-          "version": "0.2.0",
-          "dev": true,
-          "requires": {
-            "pako": "~1.0.5"
-          }
-        },
-        "browserslist": {
-          "version": "4.16.6",
-          "dev": true,
-          "requires": {
-            "caniuse-lite": "^1.0.30001219",
-            "colorette": "^1.2.2",
-            "electron-to-chromium": "^1.3.723",
-            "escalade": "^3.1.1",
-            "node-releases": "^1.1.71"
-          }
-        },
-        "buffer": {
-          "version": "4.9.2",
-          "dev": true,
-          "requires": {
-            "base64-js": "^1.0.2",
-            "ieee754": "^1.1.4",
-            "isarray": "^1.0.0"
-          }
-        },
-        "buffer-equal": {
-          "version": "1.0.0",
-          "dev": true
-        },
-        "buffer-from": {
-          "version": "1.1.1",
-          "dev": true
-        },
-        "buffer-xor": {
-          "version": "1.0.3",
-          "dev": true
-        },
-        "builtin-status-codes": {
-          "version": "3.0.0",
-          "dev": true
-        },
-        "bytes": {
-          "version": "3.1.0",
-          "dev": true
-        },
-        "cacache": {
-          "version": "12.0.4",
-          "dev": true,
-          "requires": {
-            "bluebird": "^3.5.5",
-            "chownr": "^1.1.1",
-            "figgy-pudding": "^3.5.1",
-            "glob": "^7.1.4",
-            "graceful-fs": "^4.1.15",
-            "infer-owner": "^1.0.3",
-            "lru-cache": "^5.1.1",
-            "mississippi": "^3.0.0",
-            "mkdirp": "^0.5.1",
-            "move-concurrently": "^1.0.1",
-            "promise-inflight": "^1.0.1",
-            "rimraf": "^2.6.3",
-            "ssri": "^6.0.1",
-            "unique-filename": "^1.1.1",
-            "y18n": "^4.0.0"
-          },
-          "dependencies": {
-            "lru-cache": {
-              "version": "5.1.1",
-              "dev": true,
-              "requires": {
-                "yallist": "^3.0.2"
-              }
-            },
-            "rimraf": {
-              "version": "2.7.1",
-              "dev": true,
-              "requires": {
-                "glob": "^7.1.3"
-              }
-            },
-            "y18n": {
-              "version": "4.0.3",
-              "dev": true
-            },
-            "yallist": {
-              "version": "3.1.1",
-              "dev": true
-            }
-          }
-        },
-        "cache-base": {
-          "version": "1.0.1",
-          "dev": true,
-          "requires": {
-            "collection-visit": "^1.0.0",
-            "component-emitter": "^1.2.1",
-            "get-value": "^2.0.6",
-            "has-value": "^1.0.0",
-            "isobject": "^3.0.1",
-            "set-value": "^2.0.0",
-            "to-object-path": "^0.3.0",
-            "union-value": "^1.0.0",
-            "unset-value": "^1.0.0"
-          }
-        },
-        "call-bind": {
-          "version": "1.0.2",
-          "dev": true,
-          "requires": {
-            "function-bind": "^1.1.1",
-            "get-intrinsic": "^1.0.2"
-          }
-        },
-        "callsites": {
-          "version": "3.1.0",
-          "dev": true
-        },
-        "camelcase": {
-          "version": "3.0.0",
-          "dev": true
-        },
-        "caniuse-lite": {
-          "version": "1.0.30001237",
-          "dev": true
-        },
-        "chalk": {
-          "version": "4.1.1",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "chardet": {
-          "version": "0.7.0",
-          "dev": true
-        },
-        "chokidar": {
-          "version": "2.1.8",
-          "dev": true,
-          "requires": {
-            "anymatch": "^2.0.0",
-            "async-each": "^1.0.1",
-            "braces": "^2.3.2",
-            "fsevents": "^1.2.7",
-            "glob-parent": "^3.1.0",
-            "inherits": "^2.0.3",
-            "is-binary-path": "^1.0.0",
-            "is-glob": "^4.0.0",
-            "normalize-path": "^3.0.0",
-            "path-is-absolute": "^1.0.0",
-            "readdirp": "^2.2.1",
-            "upath": "^1.1.1"
-          },
-          "dependencies": {
-            "glob-parent": {
-              "version": "3.1.0",
-              "dev": true,
-              "requires": {
-                "is-glob": "^3.1.0",
-                "path-dirname": "^1.0.0"
-              },
-              "dependencies": {
-                "is-glob": {
-                  "version": "3.1.0",
-                  "dev": true,
-                  "requires": {
-                    "is-extglob": "^2.1.0"
-                  }
-                }
-              }
-            }
-          }
-        },
-        "chownr": {
-          "version": "1.1.4",
-          "dev": true
-        },
-        "chrome-trace-event": {
-          "version": "1.0.3",
-          "dev": true
-        },
-        "cipher-base": {
-          "version": "1.0.4",
-          "dev": true,
-          "requires": {
-            "inherits": "^2.0.1",
-            "safe-buffer": "^5.0.1"
-          }
-        },
-        "class-utils": {
-          "version": "0.3.6",
-          "dev": true,
-          "requires": {
-            "arr-union": "^3.1.0",
-            "define-property": "^0.2.5",
-            "isobject": "^3.0.0",
-            "static-extend": "^0.1.1"
-          },
-          "dependencies": {
-            "define-property": {
-              "version": "0.2.5",
-              "dev": true,
-              "requires": {
-                "is-descriptor": "^0.1.0"
-              }
-            },
-            "is-accessor-descriptor": {
-              "version": "0.1.6",
-              "dev": true,
-              "requires": {
-                "kind-of": "^3.0.2"
-              },
-              "dependencies": {
-                "kind-of": {
-                  "version": "3.2.2",
-                  "dev": true,
-                  "requires": {
-                    "is-buffer": "^1.1.5"
-                  }
-                }
-              }
-            },
-            "is-data-descriptor": {
-              "version": "0.1.4",
-              "dev": true,
-              "requires": {
-                "kind-of": "^3.0.2"
-              },
-              "dependencies": {
-                "kind-of": {
-                  "version": "3.2.2",
-                  "dev": true,
-                  "requires": {
-                    "is-buffer": "^1.1.5"
-                  }
-                }
-              }
-            },
-            "is-descriptor": {
-              "version": "0.1.6",
-              "dev": true,
-              "requires": {
-                "is-accessor-descriptor": "^0.1.6",
-                "is-data-descriptor": "^0.1.4",
-                "kind-of": "^5.0.0"
-              }
-            }
-          }
-        },
-        "cli-cursor": {
-          "version": "3.1.0",
-          "dev": true,
-          "requires": {
-            "restore-cursor": "^3.1.0"
-          }
-        },
-        "cli-width": {
-          "version": "3.0.0",
-          "dev": true
-        },
-        "cliui": {
-          "version": "3.2.0",
-          "dev": true,
-          "requires": {
-            "string-width": "^1.0.1",
-            "strip-ansi": "^3.0.1",
-            "wrap-ansi": "^2.0.0"
-          },
-          "dependencies": {
-            "ansi-regex": {
-              "version": "2.1.1",
-              "dev": true
-            },
-            "is-fullwidth-code-point": {
-              "version": "1.0.0",
-              "dev": true,
-              "requires": {
-                "number-is-nan": "^1.0.0"
-              }
-            },
-            "string-width": {
-              "version": "1.0.2",
-              "dev": true,
-              "requires": {
-                "code-point-at": "^1.0.0",
-                "is-fullwidth-code-point": "^1.0.0",
-                "strip-ansi": "^3.0.0"
-              }
-            },
-            "strip-ansi": {
-              "version": "3.0.1",
-              "dev": true,
-              "requires": {
-                "ansi-regex": "^2.0.0"
-              }
-            }
-          }
-        },
-        "clone": {
-          "version": "2.1.2",
-          "dev": true
-        },
-        "clone-buffer": {
-          "version": "1.0.0",
-          "dev": true
-        },
-        "clone-deep": {
-          "version": "4.0.1",
-          "dev": true,
-          "requires": {
-            "is-plain-object": "^2.0.4",
-            "kind-of": "^6.0.2",
-            "shallow-clone": "^3.0.0"
-          },
-          "dependencies": {
-            "is-plain-object": {
-              "version": "2.0.4",
-              "dev": true,
-              "requires": {
-                "isobject": "^3.0.1"
-              }
-            },
-            "kind-of": {
-              "version": "6.0.3",
-              "dev": true
-            }
-          }
-        },
-        "clone-stats": {
-          "version": "1.0.0",
-          "dev": true
-        },
-        "cloneable-readable": {
-          "version": "1.1.3",
-          "dev": true,
-          "requires": {
-            "inherits": "^2.0.1",
-            "process-nextick-args": "^2.0.0",
-            "readable-stream": "^2.3.5"
-          }
-        },
-        "code-point-at": {
-          "version": "1.1.0",
-          "dev": true
-        },
-        "collection-map": {
-          "version": "1.0.0",
-          "dev": true,
-          "requires": {
-            "arr-map": "^2.0.2",
-            "for-own": "^1.0.0",
-            "make-iterator": "^1.0.0"
-          }
-        },
-        "collection-visit": {
-          "version": "1.0.0",
-          "dev": true,
-          "requires": {
-            "map-visit": "^1.0.0",
-            "object-visit": "^1.0.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "dev": true
-        },
-        "color-support": {
-          "version": "1.1.3",
-          "dev": true
-        },
-        "colorette": {
-          "version": "1.2.2",
-          "dev": true
-        },
-        "colors": {
-          "version": "1.4.0",
-          "dev": true
-        },
-        "commander": {
-          "version": "2.20.3",
-          "dev": true
-        },
-        "commondir": {
-          "version": "1.0.1",
-          "dev": true
-        },
-        "component-emitter": {
-          "version": "1.3.0",
-          "dev": true
-        },
-        "concat-map": {
-          "version": "0.0.1",
-          "dev": true
-        },
-        "concat-stream": {
-          "version": "1.6.2",
-          "dev": true,
-          "requires": {
-            "buffer-from": "^1.0.0",
-            "inherits": "^2.0.3",
-            "readable-stream": "^2.2.2",
-            "typedarray": "^0.0.6"
-          }
-        },
-        "concat-with-sourcemaps": {
-          "version": "1.1.0",
-          "dev": true,
-          "requires": {
-            "source-map": "^0.6.1"
-          }
-        },
-        "connect": {
-          "version": "3.7.0",
-          "dev": true,
-          "requires": {
-            "debug": "2.6.9",
-            "finalhandler": "1.1.2",
-            "parseurl": "~1.3.3",
-            "utils-merge": "1.0.1"
-          },
-          "dependencies": {
-            "debug": {
-              "version": "2.6.9",
-              "dev": true,
-              "requires": {
-                "ms": "2.0.0"
-              }
-            },
-            "ms": {
-              "version": "2.0.0",
-              "dev": true
-            }
-          }
-        },
-        "console-browserify": {
-          "version": "1.2.0",
-          "dev": true
-        },
-        "constants-browserify": {
-          "version": "1.0.0",
-          "dev": true
-        },
-        "content-type": {
-          "version": "1.0.4",
-          "dev": true
-        },
-        "convert-source-map": {
-          "version": "1.7.0",
-          "dev": true,
-          "requires": {
-            "safe-buffer": "~5.1.1"
-          }
-        },
-        "cookie": {
-          "version": "0.4.1",
-          "dev": true
-        },
-        "copy-concurrently": {
-          "version": "1.0.5",
-          "dev": true,
-          "requires": {
-            "aproba": "^1.1.1",
-            "fs-write-stream-atomic": "^1.0.8",
-            "iferr": "^0.1.5",
-            "mkdirp": "^0.5.1",
-            "rimraf": "^2.5.4",
-            "run-queue": "^1.0.0"
-          },
-          "dependencies": {
-            "rimraf": {
-              "version": "2.7.1",
-              "dev": true,
-              "requires": {
-                "glob": "^7.1.3"
-              }
-            }
-          }
-        },
-        "copy-descriptor": {
-          "version": "0.1.1",
-          "dev": true
-        },
-        "copy-props": {
-          "version": "2.0.5",
-          "dev": true,
-          "requires": {
-            "each-props": "^1.3.2",
-            "is-plain-object": "^5.0.0"
-          }
-        },
-        "core-util-is": {
-          "version": "1.0.2"
-        },
-        "cors": {
-          "version": "2.8.5",
-          "dev": true,
-          "requires": {
-            "object-assign": "^4",
-            "vary": "^1"
-          }
-        },
-        "create-ecdh": {
-          "version": "4.0.4",
-          "dev": true,
-          "requires": {
-            "bn.js": "^4.1.0",
-            "elliptic": "^6.5.3"
-          },
-          "dependencies": {
-            "bn.js": {
-              "version": "4.12.0",
-              "dev": true
-            }
-          }
-        },
-        "create-hash": {
-          "version": "1.2.0",
-          "dev": true,
-          "requires": {
-            "cipher-base": "^1.0.1",
-            "inherits": "^2.0.1",
-            "md5.js": "^1.3.4",
-            "ripemd160": "^2.0.1",
-            "sha.js": "^2.4.0"
-          }
-        },
-        "create-hmac": {
-          "version": "1.1.7",
-          "dev": true,
-          "requires": {
-            "cipher-base": "^1.0.3",
-            "create-hash": "^1.1.0",
-            "inherits": "^2.0.1",
-            "ripemd160": "^2.0.0",
-            "safe-buffer": "^5.0.1",
-            "sha.js": "^2.4.8"
-          }
-        },
-        "cross-spawn": {
-          "version": "7.0.3",
-          "dev": true,
-          "requires": {
-            "path-key": "^3.1.0",
-            "shebang-command": "^2.0.0",
-            "which": "^2.0.1"
-          }
-        },
-        "crypto-browserify": {
-          "version": "3.12.0",
-          "dev": true,
-          "requires": {
-            "browserify-cipher": "^1.0.0",
-            "browserify-sign": "^4.0.0",
-            "create-ecdh": "^4.0.0",
-            "create-hash": "^1.1.0",
-            "create-hmac": "^1.1.0",
-            "diffie-hellman": "^5.0.0",
-            "inherits": "^2.0.1",
-            "pbkdf2": "^3.0.3",
-            "public-encrypt": "^4.0.0",
-            "randombytes": "^2.0.0",
-            "randomfill": "^1.0.3"
-          }
-        },
-        "custom-event": {
-          "version": "1.0.1",
-          "dev": true
-        },
-        "cyclist": {
-          "version": "1.0.1",
-          "dev": true
-        },
-        "d": {
-          "version": "1.0.1",
-          "dev": true,
-          "requires": {
-            "es5-ext": "^0.10.50",
-            "type": "^1.0.1"
-          }
-        },
-        "date-format": {
-          "version": "3.0.0",
-          "dev": true
-        },
-        "debug": {
-          "version": "4.3.1",
-          "dev": true,
-          "requires": {
-            "ms": "2.1.2"
-          }
-        },
-        "decamelize": {
-          "version": "1.2.0",
-          "dev": true
-        },
-        "decode-uri-component": {
-          "version": "0.2.0",
-          "dev": true
-        },
-        "deep-is": {
-          "version": "0.1.3",
-          "dev": true
-        },
-        "default-compare": {
-          "version": "1.0.0",
-          "dev": true,
-          "requires": {
-            "kind-of": "^5.0.2"
-          }
-        },
-        "default-resolution": {
-          "version": "2.0.0",
-          "dev": true
-        },
-        "define-properties": {
-          "version": "1.1.3",
-          "dev": true,
-          "requires": {
-            "object-keys": "^1.0.12"
-          }
-        },
-        "define-property": {
-          "version": "2.0.2",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^1.0.2",
-            "isobject": "^3.0.1"
-          }
-        },
-        "depd": {
-          "version": "1.1.2",
-          "dev": true
-        },
-        "des.js": {
-          "version": "1.0.1",
-          "dev": true,
-          "requires": {
-            "inherits": "^2.0.1",
-            "minimalistic-assert": "^1.0.0"
-          }
-        },
-        "detect-file": {
-          "version": "1.0.0",
-          "dev": true
-        },
-        "di": {
-          "version": "0.0.1",
-          "dev": true
-        },
-        "diffie-hellman": {
-          "version": "5.0.3",
-          "dev": true,
-          "requires": {
-            "bn.js": "^4.1.0",
-            "miller-rabin": "^4.0.0",
-            "randombytes": "^2.0.0"
-          },
-          "dependencies": {
-            "bn.js": {
-              "version": "4.12.0",
-              "dev": true
-            }
-          }
-        },
-        "doctrine": {
-          "version": "3.0.0",
-          "dev": true,
-          "requires": {
-            "esutils": "^2.0.2"
-          }
-        },
-        "dom-serialize": {
-          "version": "2.2.1",
-          "dev": true,
-          "requires": {
-            "custom-event": "~1.0.0",
-            "ent": "~2.2.0",
-            "extend": "^3.0.0",
-            "void-elements": "^2.0.0"
-          }
-        },
-        "domain-browser": {
-          "version": "1.2.0",
-          "dev": true
-        },
-        "duplexify": {
-          "version": "3.7.1",
-          "dev": true,
-          "requires": {
-            "end-of-stream": "^1.0.0",
-            "inherits": "^2.0.1",
-            "readable-stream": "^2.0.0",
-            "stream-shift": "^1.0.0"
-          }
-        },
-        "each-props": {
-          "version": "1.3.2",
-          "dev": true,
-          "requires": {
-            "is-plain-object": "^2.0.1",
-            "object.defaults": "^1.1.0"
-          },
-          "dependencies": {
-            "is-plain-object": {
-              "version": "2.0.4",
-              "dev": true,
-              "requires": {
-                "isobject": "^3.0.1"
-              }
-            }
-          }
-        },
-        "ee-first": {
-          "version": "1.1.1",
-          "dev": true
-        },
-        "electron-to-chromium": {
-          "version": "1.3.752",
-          "dev": true
-        },
-        "elliptic": {
-          "version": "6.5.4",
-          "dev": true,
-          "requires": {
-            "bn.js": "^4.11.9",
-            "brorand": "^1.1.0",
-            "hash.js": "^1.0.0",
-            "hmac-drbg": "^1.0.1",
-            "inherits": "^2.0.4",
-            "minimalistic-assert": "^1.0.1",
-            "minimalistic-crypto-utils": "^1.0.1"
-          },
-          "dependencies": {
-            "bn.js": {
-              "version": "4.12.0",
-              "dev": true
-            }
-          }
-        },
-        "emoji-regex": {
-          "version": "8.0.0",
-          "dev": true
-        },
-        "emojis-list": {
-          "version": "3.0.0",
-          "dev": true
-        },
-        "encodeurl": {
-          "version": "1.0.2",
-          "dev": true
-        },
-        "end-of-stream": {
-          "version": "1.4.4",
-          "dev": true,
-          "requires": {
-            "once": "^1.4.0"
-          }
-        },
-        "engine.io": {
-          "version": "4.1.1",
-          "dev": true,
-          "requires": {
-            "accepts": "~1.3.4",
-            "base64id": "2.0.0",
-            "cookie": "~0.4.1",
-            "cors": "~2.8.5",
-            "debug": "~4.3.1",
-            "engine.io-parser": "~4.0.0",
-            "ws": "~7.4.2"
-          }
-        },
-        "engine.io-parser": {
-          "version": "4.0.2",
-          "dev": true,
-          "requires": {
-            "base64-arraybuffer": "0.1.4"
-          }
-        },
-        "enhanced-resolve": {
-          "version": "5.8.2",
-          "dev": true,
-          "requires": {
-            "graceful-fs": "^4.2.4",
-            "tapable": "^2.2.0"
-          }
-        },
-        "enquirer": {
-          "version": "2.3.6",
-          "dev": true,
-          "requires": {
-            "ansi-colors": "^4.1.1"
-          }
-        },
-        "ent": {
-          "version": "2.2.0",
-          "dev": true
-        },
-        "envinfo": {
-          "version": "7.8.1",
-          "dev": true
-        },
-        "errno": {
-          "version": "0.1.8",
-          "dev": true,
-          "requires": {
-            "prr": "~1.0.1"
-          }
-        },
-        "error-ex": {
-          "version": "1.3.2",
-          "dev": true,
-          "requires": {
-            "is-arrayish": "^0.2.1"
-          }
-        },
-        "es-module-lexer": {
-          "version": "0.4.1",
-          "dev": true
-        },
-        "es5-ext": {
-          "version": "0.10.53",
-          "dev": true,
-          "requires": {
-            "es6-iterator": "~2.0.3",
-            "es6-symbol": "~3.1.3",
-            "next-tick": "~1.0.0"
-          }
-        },
-        "es6-iterator": {
-          "version": "2.0.3",
-          "dev": true,
-          "requires": {
-            "d": "1",
-            "es5-ext": "^0.10.35",
-            "es6-symbol": "^3.1.1"
-          }
-        },
-        "es6-symbol": {
-          "version": "3.1.3",
-          "dev": true,
-          "requires": {
-            "d": "^1.0.1",
-            "ext": "^1.1.2"
-          }
-        },
-        "es6-weak-map": {
-          "version": "2.0.3",
-          "dev": true,
-          "requires": {
-            "d": "1",
-            "es5-ext": "^0.10.46",
-            "es6-iterator": "^2.0.3",
-            "es6-symbol": "^3.1.1"
-          }
-        },
-        "escalade": {
-          "version": "3.1.1",
-          "dev": true
-        },
-        "escape-html": {
-          "version": "1.0.3",
-          "dev": true
-        },
-        "escape-string-regexp": {
-          "version": "4.0.0",
-          "dev": true
-        },
-        "eslint": {
-          "version": "7.28.0",
-          "dev": true,
-          "requires": {
-            "@babel/code-frame": "7.12.11",
-            "@eslint/eslintrc": "^0.4.2",
-            "ajv": "^6.10.0",
-            "chalk": "^4.0.0",
-            "cross-spawn": "^7.0.2",
-            "debug": "^4.0.1",
-            "doctrine": "^3.0.0",
-            "enquirer": "^2.3.5",
-            "escape-string-regexp": "^4.0.0",
-            "eslint-scope": "^5.1.1",
-            "eslint-utils": "^2.1.0",
-            "eslint-visitor-keys": "^2.0.0",
-            "espree": "^7.3.1",
-            "esquery": "^1.4.0",
-            "esutils": "^2.0.2",
-            "fast-deep-equal": "^3.1.3",
-            "file-entry-cache": "^6.0.1",
-            "functional-red-black-tree": "^1.0.1",
-            "glob-parent": "^5.1.2",
-            "globals": "^13.6.0",
-            "ignore": "^4.0.6",
-            "import-fresh": "^3.0.0",
-            "imurmurhash": "^0.1.4",
-            "is-glob": "^4.0.0",
-            "js-yaml": "^3.13.1",
-            "json-stable-stringify-without-jsonify": "^1.0.1",
-            "levn": "^0.4.1",
-            "lodash.merge": "^4.6.2",
-            "minimatch": "^3.0.4",
-            "natural-compare": "^1.4.0",
-            "optionator": "^0.9.1",
-            "progress": "^2.0.0",
-            "regexpp": "^3.1.0",
-            "semver": "^7.2.1",
-            "strip-ansi": "^6.0.0",
-            "strip-json-comments": "^3.1.0",
-            "table": "^6.0.9",
-            "text-table": "^0.2.0",
-            "v8-compile-cache": "^2.0.3"
-          }
-        },
-        "eslint-plugin-jasmine": {
-          "version": "4.1.2",
-          "dev": true
-        },
-        "eslint-scope": {
-          "version": "5.1.1",
-          "dev": true,
-          "requires": {
-            "esrecurse": "^4.3.0",
-            "estraverse": "^4.1.1"
-          }
-        },
-        "eslint-utils": {
-          "version": "2.1.0",
-          "dev": true,
-          "requires": {
-            "eslint-visitor-keys": "^1.1.0"
-          },
-          "dependencies": {
-            "eslint-visitor-keys": {
-              "version": "1.3.0",
-              "dev": true
-            }
-          }
-        },
-        "eslint-visitor-keys": {
-          "version": "2.1.0",
-          "dev": true
-        },
-        "espree": {
-          "version": "7.3.1",
-          "dev": true,
-          "requires": {
-            "acorn": "^7.4.0",
-            "acorn-jsx": "^5.3.1",
-            "eslint-visitor-keys": "^1.3.0"
-          },
-          "dependencies": {
-            "eslint-visitor-keys": {
-              "version": "1.3.0",
-              "dev": true
-            }
-          }
-        },
-        "esprima": {
-          "version": "4.0.1",
-          "dev": true
-        },
-        "esquery": {
-          "version": "1.4.0",
-          "dev": true,
-          "requires": {
-            "estraverse": "^5.1.0"
-          },
-          "dependencies": {
-            "estraverse": {
-              "version": "5.2.0",
-              "dev": true
-            }
-          }
-        },
-        "esrecurse": {
-          "version": "4.3.0",
-          "dev": true,
-          "requires": {
-            "estraverse": "^5.2.0"
-          },
-          "dependencies": {
-            "estraverse": {
-              "version": "5.2.0",
-              "dev": true
-            }
-          }
-        },
-        "estraverse": {
-          "version": "4.3.0",
-          "dev": true
-        },
-        "esutils": {
-          "version": "2.0.3",
-          "dev": true
-        },
-        "eventemitter3": {
-          "version": "4.0.7",
-          "dev": true
-        },
-        "events": {
-          "version": "3.3.0",
-          "dev": true
-        },
-        "evp_bytestokey": {
-          "version": "1.0.3",
-          "dev": true,
-          "requires": {
-            "md5.js": "^1.3.4",
-            "safe-buffer": "^5.1.1"
-          }
-        },
-        "execa": {
-          "version": "5.1.1",
-          "dev": true,
-          "requires": {
-            "cross-spawn": "^7.0.3",
-            "get-stream": "^6.0.0",
-            "human-signals": "^2.1.0",
-            "is-stream": "^2.0.0",
-            "merge-stream": "^2.0.0",
-            "npm-run-path": "^4.0.1",
-            "onetime": "^5.1.2",
-            "signal-exit": "^3.0.3",
-            "strip-final-newline": "^2.0.0"
-          }
-        },
-        "expand-brackets": {
-          "version": "2.1.4",
-          "dev": true,
-          "requires": {
-            "debug": "^2.3.3",
-            "define-property": "^0.2.5",
-            "extend-shallow": "^2.0.1",
-            "posix-character-classes": "^0.1.0",
-            "regex-not": "^1.0.0",
-            "snapdragon": "^0.8.1",
-            "to-regex": "^3.0.1"
-          },
-          "dependencies": {
-            "debug": {
-              "version": "2.6.9",
-              "dev": true,
-              "requires": {
-                "ms": "2.0.0"
-              }
-            },
-            "define-property": {
-              "version": "0.2.5",
-              "dev": true,
-              "requires": {
-                "is-descriptor": "^0.1.0"
-              }
-            },
-            "is-accessor-descriptor": {
-              "version": "0.1.6",
-              "dev": true,
-              "requires": {
-                "kind-of": "^3.0.2"
-              },
-              "dependencies": {
-                "kind-of": {
-                  "version": "3.2.2",
-                  "dev": true,
-                  "requires": {
-                    "is-buffer": "^1.1.5"
-                  }
-                }
-              }
-            },
-            "is-data-descriptor": {
-              "version": "0.1.4",
-              "dev": true,
-              "requires": {
-                "kind-of": "^3.0.2"
-              },
-              "dependencies": {
-                "kind-of": {
-                  "version": "3.2.2",
-                  "dev": true,
-                  "requires": {
-                    "is-buffer": "^1.1.5"
-                  }
-                }
-              }
-            },
-            "is-descriptor": {
-              "version": "0.1.6",
-              "dev": true,
-              "requires": {
-                "is-accessor-descriptor": "^0.1.6",
-                "is-data-descriptor": "^0.1.4",
-                "kind-of": "^5.0.0"
-              }
-            },
-            "ms": {
-              "version": "2.0.0",
-              "dev": true
-            }
-          }
-        },
-        "expand-range": {
-          "version": "1.8.2",
-          "dev": true,
-          "requires": {
-            "fill-range": "^2.1.0"
-          },
-          "dependencies": {
-            "fill-range": {
-              "version": "2.2.4",
-              "dev": true,
-              "requires": {
-                "is-number": "^2.1.0",
-                "isobject": "^2.0.0",
-                "randomatic": "^3.0.0",
-                "repeat-element": "^1.1.2",
-                "repeat-string": "^1.5.2"
-              }
-            },
-            "is-number": {
-              "version": "2.1.0",
-              "dev": true,
-              "requires": {
-                "kind-of": "^3.0.2"
-              }
-            },
-            "isobject": {
-              "version": "2.1.0",
-              "dev": true,
-              "requires": {
-                "isarray": "1.0.0"
-              }
-            },
-            "kind-of": {
-              "version": "3.2.2",
-              "dev": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            }
-          }
-        },
-        "expand-tilde": {
-          "version": "2.0.2",
-          "dev": true,
-          "requires": {
-            "homedir-polyfill": "^1.0.1"
-          }
-        },
-        "ext": {
-          "version": "1.4.0",
-          "dev": true,
-          "requires": {
-            "type": "^2.0.0"
-          },
-          "dependencies": {
-            "type": {
-              "version": "2.5.0",
-              "dev": true
-            }
-          }
-        },
-        "extend": {
-          "version": "3.0.2",
-          "dev": true
-        },
-        "extend-shallow": {
-          "version": "2.0.1",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        },
-        "external-editor": {
-          "version": "3.1.0",
-          "dev": true,
-          "requires": {
-            "chardet": "^0.7.0",
-            "iconv-lite": "^0.4.24",
-            "tmp": "^0.0.33"
-          },
-          "dependencies": {
-            "tmp": {
-              "version": "0.0.33",
-              "dev": true,
-              "requires": {
-                "os-tmpdir": "~1.0.2"
-              }
-            }
-          }
-        },
-        "extglob": {
-          "version": "2.0.4",
-          "dev": true,
-          "requires": {
-            "array-unique": "^0.3.2",
-            "define-property": "^1.0.0",
-            "expand-brackets": "^2.1.4",
-            "extend-shallow": "^2.0.1",
-            "fragment-cache": "^0.2.1",
-            "regex-not": "^1.0.0",
-            "snapdragon": "^0.8.1",
-            "to-regex": "^3.0.1"
-          },
-          "dependencies": {
-            "define-property": {
-              "version": "1.0.0",
-              "dev": true,
-              "requires": {
-                "is-descriptor": "^1.0.0"
-              }
-            }
-          }
-        },
-        "fancy-log": {
-          "version": "1.3.3",
-          "dev": true,
-          "requires": {
-            "ansi-gray": "^0.1.1",
-            "color-support": "^1.1.3",
-            "parse-node-version": "^1.0.0",
-            "time-stamp": "^1.0.0"
-          }
-        },
-        "fast-deep-equal": {
-          "version": "3.1.3",
-          "dev": true
-        },
-        "fast-json-stable-stringify": {
-          "version": "2.1.0",
-          "dev": true
-        },
-        "fast-levenshtein": {
-          "version": "2.0.6",
-          "dev": true
-        },
-        "fastest-levenshtein": {
-          "version": "1.0.12",
-          "dev": true
-        },
-        "figgy-pudding": {
-          "version": "3.5.2",
-          "dev": true
-        },
-        "figures": {
-          "version": "3.2.0",
-          "dev": true,
-          "requires": {
-            "escape-string-regexp": "^1.0.5"
-          },
-          "dependencies": {
-            "escape-string-regexp": {
-              "version": "1.0.5",
-              "dev": true
-            }
-          }
-        },
-        "file-entry-cache": {
-          "version": "6.0.1",
-          "dev": true,
-          "requires": {
-            "flat-cache": "^3.0.4"
-          }
-        },
-        "file-uri-to-path": {
-          "version": "1.0.0",
-          "dev": true,
-          "optional": true
-        },
-        "filename-regex": {
-          "version": "2.0.1",
-          "dev": true
-        },
-        "fill-range": {
-          "version": "4.0.0",
-          "dev": true,
-          "requires": {
-            "extend-shallow": "^2.0.1",
-            "is-number": "^3.0.0",
-            "repeat-string": "^1.6.1",
-            "to-regex-range": "^2.1.0"
-          }
-        },
-        "finalhandler": {
-          "version": "1.1.2",
-          "dev": true,
-          "requires": {
-            "debug": "2.6.9",
-            "encodeurl": "~1.0.2",
-            "escape-html": "~1.0.3",
-            "on-finished": "~2.3.0",
-            "parseurl": "~1.3.3",
-            "statuses": "~1.5.0",
-            "unpipe": "~1.0.0"
-          },
-          "dependencies": {
-            "debug": {
-              "version": "2.6.9",
-              "dev": true,
-              "requires": {
-                "ms": "2.0.0"
-              }
-            },
-            "ms": {
-              "version": "2.0.0",
-              "dev": true
-            }
-          }
-        },
-        "find-cache-dir": {
-          "version": "2.1.0",
-          "dev": true,
-          "requires": {
-            "commondir": "^1.0.1",
-            "make-dir": "^2.0.0",
-            "pkg-dir": "^3.0.0"
-          },
-          "dependencies": {
-            "find-up": {
-              "version": "3.0.0",
-              "dev": true,
-              "requires": {
-                "locate-path": "^3.0.0"
-              }
-            },
-            "locate-path": {
-              "version": "3.0.0",
-              "dev": true,
-              "requires": {
-                "p-locate": "^3.0.0",
-                "path-exists": "^3.0.0"
-              }
-            },
-            "p-limit": {
-              "version": "2.3.0",
-              "dev": true,
-              "requires": {
-                "p-try": "^2.0.0"
-              }
-            },
-            "p-locate": {
-              "version": "3.0.0",
-              "dev": true,
-              "requires": {
-                "p-limit": "^2.0.0"
-              }
-            },
-            "path-exists": {
-              "version": "3.0.0",
-              "dev": true
-            },
-            "pkg-dir": {
-              "version": "3.0.0",
-              "dev": true,
-              "requires": {
-                "find-up": "^3.0.0"
-              }
-            }
-          }
-        },
-        "find-up": {
-          "version": "4.1.0",
-          "dev": true,
-          "requires": {
-            "locate-path": "^5.0.0",
-            "path-exists": "^4.0.0"
-          }
-        },
-        "findup-sync": {
-          "version": "3.0.0",
-          "dev": true,
-          "requires": {
-            "detect-file": "^1.0.0",
-            "is-glob": "^4.0.0",
-            "micromatch": "^3.0.4",
-            "resolve-dir": "^1.0.1"
-          }
-        },
-        "fined": {
-          "version": "1.2.0",
-          "dev": true,
-          "requires": {
-            "expand-tilde": "^2.0.2",
-            "is-plain-object": "^2.0.3",
-            "object.defaults": "^1.1.0",
-            "object.pick": "^1.2.0",
-            "parse-filepath": "^1.0.1"
-          },
-          "dependencies": {
-            "is-plain-object": {
-              "version": "2.0.4",
-              "dev": true,
-              "requires": {
-                "isobject": "^3.0.1"
-              }
-            }
-          }
-        },
-        "first-chunk-stream": {
-          "version": "2.0.0",
-          "dev": true,
-          "requires": {
-            "readable-stream": "^2.0.2"
-          }
-        },
-        "flagged-respawn": {
-          "version": "1.0.1",
-          "dev": true
-        },
-        "flat-cache": {
-          "version": "3.0.4",
-          "dev": true,
-          "requires": {
-            "flatted": "^3.1.0",
-            "rimraf": "^3.0.2"
-          }
-        },
-        "flatted": {
-          "version": "3.1.1",
-          "dev": true
-        },
-        "flush-write-stream": {
-          "version": "1.1.1",
-          "dev": true,
-          "requires": {
-            "inherits": "^2.0.3",
-            "readable-stream": "^2.3.6"
-          }
-        },
-        "follow-redirects": {
-          "version": "1.14.1",
-          "dev": true
-        },
-        "for-in": {
-          "version": "1.0.2",
-          "dev": true
-        },
-        "for-own": {
-          "version": "1.0.0",
-          "dev": true,
-          "requires": {
-            "for-in": "^1.0.1"
-          }
-        },
-        "fragment-cache": {
-          "version": "0.2.1",
-          "dev": true,
-          "requires": {
-            "map-cache": "^0.2.2"
-          }
-        },
-        "from2": {
-          "version": "2.3.0",
-          "dev": true,
-          "requires": {
-            "inherits": "^2.0.1",
-            "readable-stream": "^2.0.0"
-          }
-        },
-        "fs-extra": {
-          "version": "8.1.0",
-          "dev": true,
-          "requires": {
-            "graceful-fs": "^4.2.0",
-            "jsonfile": "^4.0.0",
-            "universalify": "^0.1.0"
-          }
-        },
-        "fs-mkdirp-stream": {
-          "version": "1.0.0",
-          "dev": true,
-          "requires": {
-            "graceful-fs": "^4.1.11",
-            "through2": "^2.0.3"
-          },
-          "dependencies": {
-            "through2": {
-              "version": "2.0.5",
-              "dev": true,
-              "requires": {
-                "readable-stream": "~2.3.6",
-                "xtend": "~4.0.1"
-              }
-            }
-          }
-        },
-        "fs-write-stream-atomic": {
-          "version": "1.0.10",
-          "dev": true,
-          "requires": {
-            "graceful-fs": "^4.1.2",
-            "iferr": "^0.1.5",
-            "imurmurhash": "^0.1.4",
-            "readable-stream": "1 || 2"
-          }
-        },
-        "fs.realpath": {
-          "version": "1.0.0",
-          "dev": true
-        },
-        "fsevents": {
-          "version": "1.2.13",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "bindings": "^1.5.0",
-            "nan": "^2.12.1"
-          }
-        },
-        "function-bind": {
-          "version": "1.1.1",
-          "dev": true
-        },
-        "functional-red-black-tree": {
-          "version": "1.0.1",
-          "dev": true
-        },
-        "get-caller-file": {
-          "version": "1.0.3",
-          "dev": true
-        },
-        "get-intrinsic": {
-          "version": "1.1.1",
-          "dev": true,
-          "requires": {
-            "function-bind": "^1.1.1",
-            "has": "^1.0.3",
-            "has-symbols": "^1.0.1"
-          }
-        },
-        "get-stream": {
-          "version": "6.0.1",
-          "dev": true
-        },
-        "get-value": {
-          "version": "2.0.6",
-          "dev": true
-        },
-        "glob": {
-          "version": "7.1.7",
-          "dev": true,
-          "requires": {
-            "fs.realpath": "^1.0.0",
-            "inflight": "^1.0.4",
-            "inherits": "2",
-            "minimatch": "^3.0.4",
-            "once": "^1.3.0",
-            "path-is-absolute": "^1.0.0"
-          }
-        },
-        "glob-base": {
-          "version": "0.3.0",
-          "dev": true,
-          "requires": {
-            "glob-parent": "^2.0.0",
-            "is-glob": "^2.0.0"
-          },
-          "dependencies": {
-            "glob-parent": {
-              "version": "2.0.0",
-              "dev": true,
-              "requires": {
-                "is-glob": "^2.0.0"
-              }
-            },
-            "is-extglob": {
-              "version": "1.0.0",
-              "dev": true
-            },
-            "is-glob": {
-              "version": "2.0.1",
-              "dev": true,
-              "requires": {
-                "is-extglob": "^1.0.0"
-              }
-            }
-          }
-        },
-        "glob-parent": {
-          "version": "5.1.2",
-          "dev": true,
-          "requires": {
-            "is-glob": "^4.0.1"
-          }
-        },
-        "glob-stream": {
-          "version": "6.1.0",
-          "dev": true,
-          "requires": {
-            "extend": "^3.0.0",
-            "glob": "^7.1.1",
-            "glob-parent": "^3.1.0",
-            "is-negated-glob": "^1.0.0",
-            "ordered-read-streams": "^1.0.0",
-            "pumpify": "^1.3.5",
-            "readable-stream": "^2.1.5",
-            "remove-trailing-separator": "^1.0.1",
-            "to-absolute-glob": "^2.0.0",
-            "unique-stream": "^2.0.2"
-          },
-          "dependencies": {
-            "glob-parent": {
-              "version": "3.1.0",
-              "dev": true,
-              "requires": {
-                "is-glob": "^3.1.0",
-                "path-dirname": "^1.0.0"
-              }
-            },
-            "is-glob": {
-              "version": "3.1.0",
-              "dev": true,
-              "requires": {
-                "is-extglob": "^2.1.0"
-              }
-            }
-          }
-        },
-        "glob-to-regexp": {
-          "version": "0.4.1",
-          "dev": true
-        },
-        "glob-watcher": {
-          "version": "5.0.5",
-          "dev": true,
-          "requires": {
-            "anymatch": "^2.0.0",
-            "async-done": "^1.2.0",
-            "chokidar": "^2.0.0",
-            "is-negated-glob": "^1.0.0",
-            "just-debounce": "^1.0.0",
-            "normalize-path": "^3.0.0",
-            "object.defaults": "^1.1.0"
-          }
-        },
-        "global-modules": {
-          "version": "1.0.0",
-          "dev": true,
-          "requires": {
-            "global-prefix": "^1.0.1",
-            "is-windows": "^1.0.1",
-            "resolve-dir": "^1.0.0"
-          }
-        },
-        "global-prefix": {
-          "version": "1.0.2",
-          "dev": true,
-          "requires": {
-            "expand-tilde": "^2.0.2",
-            "homedir-polyfill": "^1.0.1",
-            "ini": "^1.3.4",
-            "is-windows": "^1.0.1",
-            "which": "^1.2.14"
-          },
-          "dependencies": {
-            "which": {
-              "version": "1.3.1",
-              "dev": true,
-              "requires": {
-                "isexe": "^2.0.0"
-              }
-            }
-          }
-        },
-        "globals": {
-          "version": "13.9.0",
-          "dev": true,
-          "requires": {
-            "type-fest": "^0.20.2"
-          }
-        },
-        "glogg": {
-          "version": "1.0.2",
-          "dev": true,
-          "requires": {
-            "sparkles": "^1.0.0"
-          }
-        },
-        "glsl-parser": {
-          "version": "2.0.1",
-          "requires": {
-            "glsl-tokenizer": "^2.1.4",
-            "through": "2.3.4",
-            "through2": "^0.6.3"
-          }
-        },
-        "glsl-tokenizer": {
-          "version": "2.1.5",
-          "requires": {
-            "through2": "^0.6.3"
-          }
-        },
-        "graceful-fs": {
-          "version": "4.2.6",
-          "dev": true
-        },
-        "gulp": {
-          "version": "4.0.2",
-          "dev": true,
-          "requires": {
-            "glob-watcher": "^5.0.3",
-            "gulp-cli": "^2.2.0",
-            "undertaker": "^1.2.1",
-            "vinyl-fs": "^3.0.0"
-          }
-        },
-        "gulp-cli": {
-          "version": "2.3.0",
-          "dev": true,
-          "requires": {
-            "ansi-colors": "^1.0.1",
-            "archy": "^1.0.0",
-            "array-sort": "^1.0.0",
-            "color-support": "^1.1.3",
-            "concat-stream": "^1.6.0",
-            "copy-props": "^2.0.1",
-            "fancy-log": "^1.3.2",
-            "gulplog": "^1.0.0",
-            "interpret": "^1.4.0",
-            "isobject": "^3.0.1",
-            "liftoff": "^3.1.0",
-            "matchdep": "^2.0.0",
-            "mute-stdout": "^1.0.0",
-            "pretty-hrtime": "^1.0.0",
-            "replace-homedir": "^1.0.0",
-            "semver-greatest-satisfied-range": "^1.1.0",
-            "v8flags": "^3.2.0",
-            "yargs": "^7.1.0"
-          },
-          "dependencies": {
-            "ansi-colors": {
-              "version": "1.1.0",
-              "dev": true,
-              "requires": {
-                "ansi-wrap": "^0.1.0"
-              }
-            }
-          }
-        },
-        "gulp-concat": {
-          "version": "2.6.1",
-          "dev": true,
-          "requires": {
-            "concat-with-sourcemaps": "^1.0.0",
-            "through2": "^2.0.0",
-            "vinyl": "^2.0.0"
-          },
-          "dependencies": {
-            "through2": {
-              "version": "2.0.5",
-              "dev": true,
-              "requires": {
-                "readable-stream": "~2.3.6",
-                "xtend": "~4.0.1"
-              }
-            }
-          }
-        },
-        "gulp-eslint": {
-          "version": "6.0.0",
-          "dev": true,
-          "requires": {
-            "eslint": "^6.0.0",
-            "fancy-log": "^1.3.2",
-            "plugin-error": "^1.0.1"
-          },
-          "dependencies": {
-            "ansi-regex": {
-              "version": "4.1.0",
-              "dev": true
-            },
-            "ansi-styles": {
-              "version": "3.2.1",
-              "dev": true,
-              "requires": {
-                "color-convert": "^1.9.0"
-              }
-            },
-            "astral-regex": {
-              "version": "1.0.0",
-              "dev": true
-            },
-            "chalk": {
-              "version": "2.4.2",
-              "dev": true,
-              "requires": {
-                "ansi-styles": "^3.2.1",
-                "escape-string-regexp": "^1.0.5",
-                "supports-color": "^5.3.0"
-              }
-            },
-            "color-convert": {
-              "version": "1.9.3",
-              "dev": true,
-              "requires": {
-                "color-name": "1.1.3"
-              }
-            },
-            "color-name": {
-              "version": "1.1.3",
-              "dev": true
-            },
-            "cross-spawn": {
-              "version": "6.0.5",
-              "dev": true,
-              "requires": {
-                "nice-try": "^1.0.4",
-                "path-key": "^2.0.1",
-                "semver": "^5.5.0",
-                "shebang-command": "^1.2.0",
-                "which": "^1.2.9"
-              },
-              "dependencies": {
-                "semver": {
-                  "version": "5.7.1",
-                  "dev": true
-                }
-              }
-            },
-            "emoji-regex": {
-              "version": "7.0.3",
-              "dev": true
-            },
-            "escape-string-regexp": {
-              "version": "1.0.5",
-              "dev": true
-            },
-            "eslint": {
-              "version": "6.8.0",
-              "dev": true,
-              "requires": {
-                "@babel/code-frame": "^7.0.0",
-                "ajv": "^6.10.0",
-                "chalk": "^2.1.0",
-                "cross-spawn": "^6.0.5",
-                "debug": "^4.0.1",
-                "doctrine": "^3.0.0",
-                "eslint-scope": "^5.0.0",
-                "eslint-utils": "^1.4.3",
-                "eslint-visitor-keys": "^1.1.0",
-                "espree": "^6.1.2",
-                "esquery": "^1.0.1",
-                "esutils": "^2.0.2",
-                "file-entry-cache": "^5.0.1",
-                "functional-red-black-tree": "^1.0.1",
-                "glob-parent": "^5.0.0",
-                "globals": "^12.1.0",
-                "ignore": "^4.0.6",
-                "import-fresh": "^3.0.0",
-                "imurmurhash": "^0.1.4",
-                "inquirer": "^7.0.0",
-                "is-glob": "^4.0.0",
-                "js-yaml": "^3.13.1",
-                "json-stable-stringify-without-jsonify": "^1.0.1",
-                "levn": "^0.3.0",
-                "lodash": "^4.17.14",
-                "minimatch": "^3.0.4",
-                "mkdirp": "^0.5.1",
-                "natural-compare": "^1.4.0",
-                "optionator": "^0.8.3",
-                "progress": "^2.0.0",
-                "regexpp": "^2.0.1",
-                "semver": "^6.1.2",
-                "strip-ansi": "^5.2.0",
-                "strip-json-comments": "^3.0.1",
-                "table": "^5.2.3",
-                "text-table": "^0.2.0",
-                "v8-compile-cache": "^2.0.3"
-              }
-            },
-            "eslint-utils": {
-              "version": "1.4.3",
-              "dev": true,
-              "requires": {
-                "eslint-visitor-keys": "^1.1.0"
-              }
-            },
-            "eslint-visitor-keys": {
-              "version": "1.3.0",
-              "dev": true
-            },
-            "espree": {
-              "version": "6.2.1",
-              "dev": true,
-              "requires": {
-                "acorn": "^7.1.1",
-                "acorn-jsx": "^5.2.0",
-                "eslint-visitor-keys": "^1.1.0"
-              }
-            },
-            "file-entry-cache": {
-              "version": "5.0.1",
-              "dev": true,
-              "requires": {
-                "flat-cache": "^2.0.1"
-              }
-            },
-            "flat-cache": {
-              "version": "2.0.1",
-              "dev": true,
-              "requires": {
-                "flatted": "^2.0.0",
-                "rimraf": "2.6.3",
-                "write": "1.0.3"
-              }
-            },
-            "flatted": {
-              "version": "2.0.2",
-              "dev": true
-            },
-            "globals": {
-              "version": "12.4.0",
-              "dev": true,
-              "requires": {
-                "type-fest": "^0.8.1"
-              }
-            },
-            "has-flag": {
-              "version": "3.0.0",
-              "dev": true
-            },
-            "is-fullwidth-code-point": {
-              "version": "2.0.0",
-              "dev": true
-            },
-            "levn": {
-              "version": "0.3.0",
-              "dev": true,
-              "requires": {
-                "prelude-ls": "~1.1.2",
-                "type-check": "~0.3.2"
-              }
-            },
-            "optionator": {
-              "version": "0.8.3",
-              "dev": true,
-              "requires": {
-                "deep-is": "~0.1.3",
-                "fast-levenshtein": "~2.0.6",
-                "levn": "~0.3.0",
-                "prelude-ls": "~1.1.2",
-                "type-check": "~0.3.2",
-                "word-wrap": "~1.2.3"
-              }
-            },
-            "path-key": {
-              "version": "2.0.1",
-              "dev": true
-            },
-            "prelude-ls": {
-              "version": "1.1.2",
-              "dev": true
-            },
-            "regexpp": {
-              "version": "2.0.1",
-              "dev": true
-            },
-            "rimraf": {
-              "version": "2.6.3",
-              "dev": true,
-              "requires": {
-                "glob": "^7.1.3"
-              }
-            },
-            "semver": {
-              "version": "6.3.0",
-              "dev": true
-            },
-            "shebang-command": {
-              "version": "1.2.0",
-              "dev": true,
-              "requires": {
-                "shebang-regex": "^1.0.0"
-              }
-            },
-            "shebang-regex": {
-              "version": "1.0.0",
-              "dev": true
-            },
-            "slice-ansi": {
-              "version": "2.1.0",
-              "dev": true,
-              "requires": {
-                "ansi-styles": "^3.2.0",
-                "astral-regex": "^1.0.0",
-                "is-fullwidth-code-point": "^2.0.0"
-              }
-            },
-            "string-width": {
-              "version": "3.1.0",
-              "dev": true,
-              "requires": {
-                "emoji-regex": "^7.0.1",
-                "is-fullwidth-code-point": "^2.0.0",
-                "strip-ansi": "^5.1.0"
-              }
-            },
-            "strip-ansi": {
-              "version": "5.2.0",
-              "dev": true,
-              "requires": {
-                "ansi-regex": "^4.1.0"
-              }
-            },
-            "supports-color": {
-              "version": "5.5.0",
-              "dev": true,
-              "requires": {
-                "has-flag": "^3.0.0"
-              }
-            },
-            "table": {
-              "version": "5.4.6",
-              "dev": true,
-              "requires": {
-                "ajv": "^6.10.2",
-                "lodash": "^4.17.14",
-                "slice-ansi": "^2.1.0",
-                "string-width": "^3.0.0"
-              }
-            },
-            "type-check": {
-              "version": "0.3.2",
-              "dev": true,
-              "requires": {
-                "prelude-ls": "~1.1.2"
-              }
-            },
-            "type-fest": {
-              "version": "0.8.1",
-              "dev": true
-            },
-            "which": {
-              "version": "1.3.1",
-              "dev": true,
-              "requires": {
-                "isexe": "^2.0.0"
-              }
-            }
-          }
-        },
-        "gulp-watch": {
-          "version": "5.0.1",
-          "dev": true,
-          "requires": {
-            "ansi-colors": "1.1.0",
-            "anymatch": "^1.3.0",
-            "chokidar": "^2.0.0",
-            "fancy-log": "1.3.2",
-            "glob-parent": "^3.0.1",
-            "object-assign": "^4.1.0",
-            "path-is-absolute": "^1.0.1",
-            "plugin-error": "1.0.1",
-            "readable-stream": "^2.2.2",
-            "slash": "^1.0.0",
-            "vinyl": "^2.1.0",
-            "vinyl-file": "^2.0.0"
-          },
-          "dependencies": {
-            "ansi-colors": {
-              "version": "1.1.0",
-              "dev": true,
-              "requires": {
-                "ansi-wrap": "^0.1.0"
-              }
-            },
-            "anymatch": {
-              "version": "1.3.2",
-              "dev": true,
-              "requires": {
-                "micromatch": "^2.1.5",
-                "normalize-path": "^2.0.0"
-              }
-            },
-            "arr-diff": {
-              "version": "2.0.0",
-              "dev": true,
-              "requires": {
-                "arr-flatten": "^1.0.1"
-              }
-            },
-            "array-unique": {
-              "version": "0.2.1",
-              "dev": true
-            },
-            "braces": {
-              "version": "1.8.5",
-              "dev": true,
-              "requires": {
-                "expand-range": "^1.8.1",
-                "preserve": "^0.2.0",
-                "repeat-element": "^1.1.2"
-              }
-            },
-            "expand-brackets": {
-              "version": "0.1.5",
-              "dev": true,
-              "requires": {
-                "is-posix-bracket": "^0.1.0"
-              }
-            },
-            "extglob": {
-              "version": "0.3.2",
-              "dev": true,
-              "requires": {
-                "is-extglob": "^1.0.0"
-              },
-              "dependencies": {
-                "is-extglob": {
-                  "version": "1.0.0",
-                  "dev": true
-                }
-              }
-            },
-            "fancy-log": {
-              "version": "1.3.2",
-              "dev": true,
-              "requires": {
-                "ansi-gray": "^0.1.1",
-                "color-support": "^1.1.3",
-                "time-stamp": "^1.0.0"
-              }
-            },
-            "glob-parent": {
-              "version": "3.1.0",
-              "dev": true,
-              "requires": {
-                "is-glob": "^3.1.0",
-                "path-dirname": "^1.0.0"
-              }
-            },
-            "is-glob": {
-              "version": "3.1.0",
-              "dev": true,
-              "requires": {
-                "is-extglob": "^2.1.0"
-              }
-            },
-            "kind-of": {
-              "version": "3.2.2",
-              "dev": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            },
-            "micromatch": {
-              "version": "2.3.11",
-              "dev": true,
-              "requires": {
-                "arr-diff": "^2.0.0",
-                "array-unique": "^0.2.1",
-                "braces": "^1.8.2",
-                "expand-brackets": "^0.1.4",
-                "extglob": "^0.3.1",
-                "filename-regex": "^2.0.0",
-                "is-extglob": "^1.0.0",
-                "is-glob": "^2.0.1",
-                "kind-of": "^3.0.2",
-                "normalize-path": "^2.0.1",
-                "object.omit": "^2.0.0",
-                "parse-glob": "^3.0.4",
-                "regex-cache": "^0.4.2"
-              },
-              "dependencies": {
-                "is-extglob": {
-                  "version": "1.0.0",
-                  "dev": true
-                },
-                "is-glob": {
-                  "version": "2.0.1",
-                  "dev": true,
-                  "requires": {
-                    "is-extglob": "^1.0.0"
-                  }
-                }
-              }
-            },
-            "normalize-path": {
-              "version": "2.1.1",
-              "dev": true,
-              "requires": {
-                "remove-trailing-separator": "^1.0.1"
-              }
-            }
-          }
-        },
-        "gulplog": {
-          "version": "1.0.0",
-          "dev": true,
-          "requires": {
-            "glogg": "^1.0.0"
-          }
-        },
-        "has": {
-          "version": "1.0.3",
-          "dev": true,
-          "requires": {
-            "function-bind": "^1.1.1"
-          }
-        },
-        "has-flag": {
-          "version": "4.0.0",
-          "dev": true
-        },
-        "has-symbols": {
-          "version": "1.0.2",
-          "dev": true
-        },
-        "has-value": {
-          "version": "1.0.0",
-          "dev": true,
-          "requires": {
-            "get-value": "^2.0.6",
-            "has-values": "^1.0.0",
-            "isobject": "^3.0.0"
-          }
-        },
-        "has-values": {
-          "version": "1.0.0",
-          "dev": true,
-          "requires": {
-            "is-number": "^3.0.0",
-            "kind-of": "^4.0.0"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "4.0.0",
-              "dev": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            }
-          }
-        },
-        "hash-base": {
-          "version": "3.1.0",
-          "dev": true,
-          "requires": {
-            "inherits": "^2.0.4",
-            "readable-stream": "^3.6.0",
-            "safe-buffer": "^5.2.0"
-          },
-          "dependencies": {
-            "readable-stream": {
-              "version": "3.6.0",
-              "dev": true,
-              "requires": {
-                "inherits": "^2.0.3",
-                "string_decoder": "^1.1.1",
-                "util-deprecate": "^1.0.1"
-              }
-            },
-            "safe-buffer": {
-              "version": "5.2.1",
-              "dev": true
-            }
-          }
-        },
-        "hash.js": {
-          "version": "1.1.7",
-          "dev": true,
-          "requires": {
-            "inherits": "^2.0.3",
-            "minimalistic-assert": "^1.0.1"
-          }
-        },
-        "hmac-drbg": {
-          "version": "1.0.1",
-          "dev": true,
-          "requires": {
-            "hash.js": "^1.0.3",
-            "minimalistic-assert": "^1.0.0",
-            "minimalistic-crypto-utils": "^1.0.1"
-          }
-        },
-        "homedir-polyfill": {
-          "version": "1.0.3",
-          "dev": true,
-          "requires": {
-            "parse-passwd": "^1.0.0"
-          }
-        },
-        "hosted-git-info": {
-          "version": "2.8.9",
-          "dev": true
-        },
-        "http-errors": {
-          "version": "1.7.2",
-          "dev": true,
-          "requires": {
-            "depd": "~1.1.2",
-            "inherits": "2.0.3",
-            "setprototypeof": "1.1.1",
-            "statuses": ">= 1.5.0 < 2",
-            "toidentifier": "1.0.0"
-          },
-          "dependencies": {
-            "inherits": {
-              "version": "2.0.3",
-              "dev": true
-            }
-          }
-        },
-        "http-proxy": {
-          "version": "1.18.1",
-          "dev": true,
-          "requires": {
-            "eventemitter3": "^4.0.0",
-            "follow-redirects": "^1.0.0",
-            "requires-port": "^1.0.0"
-          }
-        },
-        "https-browserify": {
-          "version": "1.0.0",
-          "dev": true
-        },
-        "human-signals": {
-          "version": "2.1.0",
-          "dev": true
-        },
-        "iconv-lite": {
-          "version": "0.4.24",
-          "dev": true,
-          "requires": {
-            "safer-buffer": ">= 2.1.2 < 3"
-          }
-        },
-        "ieee754": {
-          "version": "1.2.1",
-          "dev": true
-        },
-        "iferr": {
-          "version": "0.1.5",
-          "dev": true
-        },
-        "ignore": {
-          "version": "4.0.6",
-          "dev": true
-        },
-        "import-fresh": {
-          "version": "3.3.0",
-          "dev": true,
-          "requires": {
-            "parent-module": "^1.0.0",
-            "resolve-from": "^4.0.0"
-          }
-        },
-        "import-local": {
-          "version": "3.0.2",
-          "dev": true,
-          "requires": {
-            "pkg-dir": "^4.2.0",
-            "resolve-cwd": "^3.0.0"
-          }
-        },
-        "imurmurhash": {
-          "version": "0.1.4",
-          "dev": true
-        },
-        "infer-owner": {
-          "version": "1.0.4",
-          "dev": true
-        },
-        "inflight": {
-          "version": "1.0.6",
-          "dev": true,
-          "requires": {
-            "once": "^1.3.0",
-            "wrappy": "1"
-          }
-        },
-        "inherits": {
-          "version": "2.0.4"
-        },
-        "ini": {
-          "version": "1.3.8",
-          "dev": true
-        },
-        "inquirer": {
-          "version": "7.3.3",
-          "dev": true,
-          "requires": {
-            "ansi-escapes": "^4.2.1",
-            "chalk": "^4.1.0",
-            "cli-cursor": "^3.1.0",
-            "cli-width": "^3.0.0",
-            "external-editor": "^3.0.3",
-            "figures": "^3.0.0",
-            "lodash": "^4.17.19",
-            "mute-stream": "0.0.8",
-            "run-async": "^2.4.0",
-            "rxjs": "^6.6.0",
-            "string-width": "^4.1.0",
-            "strip-ansi": "^6.0.0",
-            "through": "^2.3.6"
-          },
-          "dependencies": {
-            "through": {
-              "version": "2.3.8",
-              "dev": true
-            }
-          }
-        },
-        "interpret": {
-          "version": "1.4.0",
-          "dev": true
-        },
-        "invert-kv": {
-          "version": "1.0.0",
-          "dev": true
-        },
-        "is-absolute": {
-          "version": "1.0.0",
-          "dev": true,
-          "requires": {
-            "is-relative": "^1.0.0",
-            "is-windows": "^1.0.1"
-          }
-        },
-        "is-accessor-descriptor": {
-          "version": "1.0.0",
-          "dev": true,
-          "requires": {
-            "kind-of": "^6.0.0"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "6.0.3",
-              "dev": true
-            }
-          }
-        },
-        "is-arrayish": {
-          "version": "0.2.1",
-          "dev": true
-        },
-        "is-binary-path": {
-          "version": "1.0.1",
-          "dev": true,
-          "requires": {
-            "binary-extensions": "^1.0.0"
-          }
-        },
-        "is-buffer": {
-          "version": "1.1.6",
-          "dev": true
-        },
-        "is-core-module": {
-          "version": "2.4.0",
-          "dev": true,
-          "requires": {
-            "has": "^1.0.3"
-          }
-        },
-        "is-data-descriptor": {
-          "version": "1.0.0",
-          "dev": true,
-          "requires": {
-            "kind-of": "^6.0.0"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "6.0.3",
-              "dev": true
-            }
-          }
-        },
-        "is-descriptor": {
-          "version": "1.0.2",
-          "dev": true,
-          "requires": {
-            "is-accessor-descriptor": "^1.0.0",
-            "is-data-descriptor": "^1.0.0",
-            "kind-of": "^6.0.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "6.0.3",
-              "dev": true
-            }
-          }
-        },
-        "is-dotfile": {
-          "version": "1.0.3",
-          "dev": true
-        },
-        "is-equal-shallow": {
-          "version": "0.1.3",
-          "dev": true,
-          "requires": {
-            "is-primitive": "^2.0.0"
-          }
-        },
-        "is-extendable": {
-          "version": "0.1.1",
-          "dev": true
-        },
-        "is-extglob": {
-          "version": "2.1.1",
-          "dev": true
-        },
-        "is-fullwidth-code-point": {
-          "version": "3.0.0",
-          "dev": true
-        },
-        "is-glob": {
-          "version": "4.0.1",
-          "dev": true,
-          "requires": {
-            "is-extglob": "^2.1.1"
-          }
-        },
-        "is-negated-glob": {
-          "version": "1.0.0",
-          "dev": true
-        },
-        "is-number": {
-          "version": "3.0.0",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.0.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "dev": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            }
-          }
-        },
-        "is-plain-object": {
-          "version": "5.0.0",
-          "dev": true
-        },
-        "is-posix-bracket": {
-          "version": "0.1.1",
-          "dev": true
-        },
-        "is-primitive": {
-          "version": "2.0.0",
-          "dev": true
-        },
-        "is-relative": {
-          "version": "1.0.0",
-          "dev": true,
-          "requires": {
-            "is-unc-path": "^1.0.0"
-          }
-        },
-        "is-stream": {
-          "version": "2.0.0",
-          "dev": true
-        },
-        "is-unc-path": {
-          "version": "1.0.0",
-          "dev": true,
-          "requires": {
-            "unc-path-regex": "^0.1.2"
-          }
-        },
-        "is-utf8": {
-          "version": "0.2.1",
-          "dev": true
-        },
-        "is-valid-glob": {
-          "version": "1.0.0",
-          "dev": true
-        },
-        "is-windows": {
-          "version": "1.0.2",
-          "dev": true
-        },
-        "is-wsl": {
-          "version": "1.1.0",
-          "dev": true
-        },
-        "isarray": {
-          "version": "1.0.0",
-          "dev": true
-        },
-        "isbinaryfile": {
-          "version": "4.0.8",
-          "dev": true
-        },
-        "isexe": {
-          "version": "2.0.0",
-          "dev": true
-        },
-        "isobject": {
-          "version": "3.0.1",
-          "dev": true
-        },
-        "jasmine-core": {
-          "version": "3.7.1",
-          "dev": true
-        },
-        "jest-worker": {
-          "version": "27.0.2",
-          "dev": true,
-          "requires": {
-            "@types/node": "*",
-            "merge-stream": "^2.0.0",
-            "supports-color": "^8.0.0"
-          },
-          "dependencies": {
-            "supports-color": {
-              "version": "8.1.1",
-              "dev": true,
-              "requires": {
-                "has-flag": "^4.0.0"
-              }
-            }
-          }
-        },
-        "js-tokens": {
-          "version": "4.0.0",
-          "dev": true
-        },
-        "js-yaml": {
-          "version": "3.14.1",
-          "dev": true,
-          "requires": {
-            "argparse": "^1.0.7",
-            "esprima": "^4.0.0"
-          }
-        },
-        "json-parse-better-errors": {
-          "version": "1.0.2",
-          "dev": true
-        },
-        "json-schema-traverse": {
-          "version": "0.4.1",
-          "dev": true
-        },
-        "json-stable-stringify-without-jsonify": {
-          "version": "1.0.1",
-          "dev": true
-        },
-        "json5": {
-          "version": "1.0.1",
-          "dev": true,
-          "requires": {
-            "minimist": "^1.2.0"
-          }
-        },
-        "jsonfile": {
-          "version": "4.0.0",
-          "dev": true,
-          "requires": {
-            "graceful-fs": "^4.1.6"
-          }
-        },
-        "just-debounce": {
-          "version": "1.1.0",
-          "dev": true
-        },
-        "karma": {
-          "version": "6.3.4",
-          "dev": true,
-          "requires": {
-            "body-parser": "^1.19.0",
-            "braces": "^3.0.2",
-            "chokidar": "^3.5.1",
-            "colors": "^1.4.0",
-            "connect": "^3.7.0",
-            "di": "^0.0.1",
-            "dom-serialize": "^2.2.1",
-            "glob": "^7.1.7",
-            "graceful-fs": "^4.2.6",
-            "http-proxy": "^1.18.1",
-            "isbinaryfile": "^4.0.8",
-            "lodash": "^4.17.21",
-            "log4js": "^6.3.0",
-            "mime": "^2.5.2",
-            "minimatch": "^3.0.4",
-            "qjobs": "^1.2.0",
-            "range-parser": "^1.2.1",
-            "rimraf": "^3.0.2",
-            "socket.io": "^3.1.0",
-            "source-map": "^0.6.1",
-            "tmp": "^0.2.1",
-            "ua-parser-js": "^0.7.28",
-            "yargs": "^16.1.1"
-          },
-          "dependencies": {
-            "anymatch": {
-              "version": "3.1.2",
-              "dev": true,
-              "requires": {
-                "normalize-path": "^3.0.0",
-                "picomatch": "^2.0.4"
-              }
-            },
-            "binary-extensions": {
-              "version": "2.2.0",
-              "dev": true
-            },
-            "braces": {
-              "version": "3.0.2",
-              "dev": true,
-              "requires": {
-                "fill-range": "^7.0.1"
-              }
-            },
-            "chokidar": {
-              "version": "3.5.1",
-              "dev": true,
-              "requires": {
-                "anymatch": "~3.1.1",
-                "braces": "~3.0.2",
-                "fsevents": "~2.3.1",
-                "glob-parent": "~5.1.0",
-                "is-binary-path": "~2.1.0",
-                "is-glob": "~4.0.1",
-                "normalize-path": "~3.0.0",
-                "readdirp": "~3.5.0"
-              }
-            },
-            "cliui": {
-              "version": "7.0.4",
-              "dev": true,
-              "requires": {
-                "string-width": "^4.2.0",
-                "strip-ansi": "^6.0.0",
-                "wrap-ansi": "^7.0.0"
-              }
-            },
-            "fill-range": {
-              "version": "7.0.1",
-              "dev": true,
-              "requires": {
-                "to-regex-range": "^5.0.1"
-              }
-            },
-            "fsevents": {
-              "version": "2.3.2",
-              "dev": true,
-              "optional": true
-            },
-            "get-caller-file": {
-              "version": "2.0.5",
-              "dev": true
-            },
-            "is-binary-path": {
-              "version": "2.1.0",
-              "dev": true,
-              "requires": {
-                "binary-extensions": "^2.0.0"
-              }
-            },
-            "is-number": {
-              "version": "7.0.0",
-              "dev": true
-            },
-            "readdirp": {
-              "version": "3.5.0",
-              "dev": true,
-              "requires": {
-                "picomatch": "^2.2.1"
-              }
-            },
-            "to-regex-range": {
-              "version": "5.0.1",
-              "dev": true,
-              "requires": {
-                "is-number": "^7.0.0"
-              }
-            },
-            "wrap-ansi": {
-              "version": "7.0.0",
-              "dev": true,
-              "requires": {
-                "ansi-styles": "^4.0.0",
-                "string-width": "^4.1.0",
-                "strip-ansi": "^6.0.0"
-              }
-            },
-            "y18n": {
-              "version": "5.0.8",
-              "dev": true
-            },
-            "yargs": {
-              "version": "16.2.0",
-              "dev": true,
-              "requires": {
-                "cliui": "^7.0.2",
-                "escalade": "^3.1.1",
-                "get-caller-file": "^2.0.5",
-                "require-directory": "^2.1.1",
-                "string-width": "^4.2.0",
-                "y18n": "^5.0.5",
-                "yargs-parser": "^20.2.2"
-              }
-            },
-            "yargs-parser": {
-              "version": "20.2.7",
-              "dev": true
-            }
-          }
-        },
-        "karma-chrome-launcher": {
-          "version": "3.1.0",
-          "dev": true,
-          "requires": {
-            "which": "^1.2.1"
-          },
-          "dependencies": {
-            "which": {
-              "version": "1.3.1",
-              "dev": true,
-              "requires": {
-                "isexe": "^2.0.0"
-              }
-            }
-          }
-        },
-        "karma-jasmine": {
-          "version": "4.0.1",
-          "dev": true,
-          "requires": {
-            "jasmine-core": "^3.6.0"
-          }
-        },
-        "kind-of": {
-          "version": "5.1.0",
-          "dev": true
-        },
-        "last-run": {
-          "version": "1.1.1",
-          "dev": true,
-          "requires": {
-            "default-resolution": "^2.0.0",
-            "es6-weak-map": "^2.0.1"
-          }
-        },
-        "lazystream": {
-          "version": "1.0.0",
-          "dev": true,
-          "requires": {
-            "readable-stream": "^2.0.5"
-          }
-        },
-        "lcid": {
-          "version": "1.0.0",
-          "dev": true,
-          "requires": {
-            "invert-kv": "^1.0.0"
-          }
-        },
-        "lead": {
-          "version": "1.0.0",
-          "dev": true,
-          "requires": {
-            "flush-write-stream": "^1.0.2"
-          }
-        },
-        "levn": {
-          "version": "0.4.1",
-          "dev": true,
-          "requires": {
-            "prelude-ls": "^1.2.1",
-            "type-check": "~0.4.0"
-          }
-        },
-        "liftoff": {
-          "version": "3.1.0",
-          "dev": true,
-          "requires": {
-            "extend": "^3.0.0",
-            "findup-sync": "^3.0.0",
-            "fined": "^1.0.1",
-            "flagged-respawn": "^1.0.0",
-            "is-plain-object": "^2.0.4",
-            "object.map": "^1.0.0",
-            "rechoir": "^0.6.2",
-            "resolve": "^1.1.7"
-          },
-          "dependencies": {
-            "is-plain-object": {
-              "version": "2.0.4",
-              "dev": true,
-              "requires": {
-                "isobject": "^3.0.1"
-              }
-            }
-          }
-        },
-        "load-json-file": {
-          "version": "1.1.0",
-          "dev": true,
-          "requires": {
-            "graceful-fs": "^4.1.2",
-            "parse-json": "^2.2.0",
-            "pify": "^2.0.0",
-            "pinkie-promise": "^2.0.0",
-            "strip-bom": "^2.0.0"
-          }
-        },
-        "loader-runner": {
-          "version": "4.2.0",
-          "dev": true
-        },
-        "loader-utils": {
-          "version": "1.4.0",
-          "dev": true,
-          "requires": {
-            "big.js": "^5.2.2",
-            "emojis-list": "^3.0.0",
-            "json5": "^1.0.1"
-          }
-        },
-        "locate-path": {
-          "version": "5.0.0",
-          "dev": true,
-          "requires": {
-            "p-locate": "^4.1.0"
-          }
-        },
-        "lodash": {
-          "version": "4.17.21",
-          "dev": true
-        },
-        "lodash.clone": {
-          "version": "4.5.0",
-          "dev": true
-        },
-        "lodash.clonedeep": {
-          "version": "4.5.0",
-          "dev": true
-        },
-        "lodash.merge": {
-          "version": "4.6.2",
-          "dev": true
-        },
-        "lodash.some": {
-          "version": "4.6.0",
-          "dev": true
-        },
-        "lodash.truncate": {
-          "version": "4.4.2",
-          "dev": true
-        },
-        "log4js": {
-          "version": "6.3.0",
-          "dev": true,
-          "requires": {
-            "date-format": "^3.0.0",
-            "debug": "^4.1.1",
-            "flatted": "^2.0.1",
-            "rfdc": "^1.1.4",
-            "streamroller": "^2.2.4"
-          },
-          "dependencies": {
-            "flatted": {
-              "version": "2.0.2",
-              "dev": true
-            }
-          }
-        },
-        "lru-cache": {
-          "version": "6.0.0",
-          "dev": true,
-          "requires": {
-            "yallist": "^4.0.0"
-          }
-        },
-        "make-dir": {
-          "version": "2.1.0",
-          "dev": true,
-          "requires": {
-            "pify": "^4.0.1",
-            "semver": "^5.6.0"
-          },
-          "dependencies": {
-            "pify": {
-              "version": "4.0.1",
-              "dev": true
-            },
-            "semver": {
-              "version": "5.7.1",
-              "dev": true
-            }
-          }
-        },
-        "make-iterator": {
-          "version": "1.0.1",
-          "dev": true,
-          "requires": {
-            "kind-of": "^6.0.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "6.0.3",
-              "dev": true
-            }
-          }
-        },
-        "map-cache": {
-          "version": "0.2.2",
-          "dev": true
-        },
-        "map-visit": {
-          "version": "1.0.0",
-          "dev": true,
-          "requires": {
-            "object-visit": "^1.0.0"
-          }
-        },
-        "matchdep": {
-          "version": "2.0.0",
-          "dev": true,
-          "requires": {
-            "findup-sync": "^2.0.0",
-            "micromatch": "^3.0.4",
-            "resolve": "^1.4.0",
-            "stack-trace": "0.0.10"
-          },
-          "dependencies": {
-            "findup-sync": {
-              "version": "2.0.0",
-              "dev": true,
-              "requires": {
-                "detect-file": "^1.0.0",
-                "is-glob": "^3.1.0",
-                "micromatch": "^3.0.4",
-                "resolve-dir": "^1.0.1"
-              }
-            },
-            "is-glob": {
-              "version": "3.1.0",
-              "dev": true,
-              "requires": {
-                "is-extglob": "^2.1.0"
-              }
-            }
-          }
-        },
-        "math-random": {
-          "version": "1.0.4",
-          "dev": true
-        },
-        "md5.js": {
-          "version": "1.3.5",
-          "dev": true,
-          "requires": {
-            "hash-base": "^3.0.0",
-            "inherits": "^2.0.1",
-            "safe-buffer": "^5.1.2"
-          }
-        },
-        "media-typer": {
-          "version": "0.3.0",
-          "dev": true
-        },
-        "memory-fs": {
-          "version": "0.5.0",
-          "dev": true,
-          "requires": {
-            "errno": "^0.1.3",
-            "readable-stream": "^2.0.1"
-          }
-        },
-        "merge-stream": {
-          "version": "2.0.0",
-          "dev": true
-        },
-        "micromatch": {
-          "version": "3.1.10",
-          "dev": true,
-          "requires": {
-            "arr-diff": "^4.0.0",
-            "array-unique": "^0.3.2",
-            "braces": "^2.3.1",
-            "define-property": "^2.0.2",
-            "extend-shallow": "^3.0.2",
-            "extglob": "^2.0.4",
-            "fragment-cache": "^0.2.1",
-            "kind-of": "^6.0.2",
-            "nanomatch": "^1.2.9",
-            "object.pick": "^1.3.0",
-            "regex-not": "^1.0.0",
-            "snapdragon": "^0.8.1",
-            "to-regex": "^3.0.2"
-          },
-          "dependencies": {
-            "extend-shallow": {
-              "version": "3.0.2",
-              "dev": true,
-              "requires": {
-                "assign-symbols": "^1.0.0",
-                "is-extendable": "^1.0.1"
-              }
-            },
-            "is-extendable": {
-              "version": "1.0.1",
-              "dev": true,
-              "requires": {
-                "is-plain-object": "^2.0.4"
-              }
-            },
-            "is-plain-object": {
-              "version": "2.0.4",
-              "dev": true,
-              "requires": {
-                "isobject": "^3.0.1"
-              }
-            },
-            "kind-of": {
-              "version": "6.0.3",
-              "dev": true
-            }
-          }
-        },
-        "miller-rabin": {
-          "version": "4.0.1",
-          "dev": true,
-          "requires": {
-            "bn.js": "^4.0.0",
-            "brorand": "^1.0.1"
-          },
-          "dependencies": {
-            "bn.js": {
-              "version": "4.12.0",
-              "dev": true
-            }
-          }
-        },
-        "mime": {
-          "version": "2.5.2",
-          "dev": true
-        },
-        "mime-db": {
-          "version": "1.48.0",
-          "dev": true
-        },
-        "mime-types": {
-          "version": "2.1.31",
-          "dev": true,
-          "requires": {
-            "mime-db": "1.48.0"
-          }
-        },
-        "mimic-fn": {
-          "version": "2.1.0",
-          "dev": true
-        },
-        "minimalistic-assert": {
-          "version": "1.0.1",
-          "dev": true
-        },
-        "minimalistic-crypto-utils": {
-          "version": "1.0.1",
-          "dev": true
-        },
-        "minimatch": {
-          "version": "3.0.4",
-          "dev": true,
-          "requires": {
-            "brace-expansion": "^1.1.7"
-          }
-        },
-        "minimist": {
-          "version": "1.2.5",
-          "dev": true
-        },
-        "mississippi": {
-          "version": "3.0.0",
-          "dev": true,
-          "requires": {
-            "concat-stream": "^1.5.0",
-            "duplexify": "^3.4.2",
-            "end-of-stream": "^1.1.0",
-            "flush-write-stream": "^1.0.0",
-            "from2": "^2.1.0",
-            "parallel-transform": "^1.1.0",
-            "pump": "^3.0.0",
-            "pumpify": "^1.3.3",
-            "stream-each": "^1.1.0",
-            "through2": "^2.0.0"
-          },
-          "dependencies": {
-            "pump": {
-              "version": "3.0.0",
-              "dev": true,
-              "requires": {
-                "end-of-stream": "^1.1.0",
-                "once": "^1.3.1"
-              }
-            },
-            "through2": {
-              "version": "2.0.5",
-              "dev": true,
-              "requires": {
-                "readable-stream": "~2.3.6",
-                "xtend": "~4.0.1"
-              }
-            }
-          }
-        },
-        "mixin-deep": {
-          "version": "1.3.2",
-          "dev": true,
-          "requires": {
-            "for-in": "^1.0.2",
-            "is-extendable": "^1.0.1"
-          },
-          "dependencies": {
-            "is-extendable": {
-              "version": "1.0.1",
-              "dev": true,
-              "requires": {
-                "is-plain-object": "^2.0.4"
-              }
-            },
-            "is-plain-object": {
-              "version": "2.0.4",
-              "dev": true,
-              "requires": {
-                "isobject": "^3.0.1"
-              }
-            }
-          }
-        },
-        "mkdirp": {
-          "version": "0.5.5",
-          "dev": true,
-          "requires": {
-            "minimist": "^1.2.5"
-          }
-        },
-        "move-concurrently": {
-          "version": "1.0.1",
-          "dev": true,
-          "requires": {
-            "aproba": "^1.1.1",
-            "copy-concurrently": "^1.0.0",
-            "fs-write-stream-atomic": "^1.0.8",
-            "mkdirp": "^0.5.1",
-            "rimraf": "^2.5.4",
-            "run-queue": "^1.0.3"
-          },
-          "dependencies": {
-            "rimraf": {
-              "version": "2.7.1",
-              "dev": true,
-              "requires": {
-                "glob": "^7.1.3"
-              }
-            }
-          }
-        },
-        "ms": {
-          "version": "2.1.2",
-          "dev": true
-        },
-        "mute-stdout": {
-          "version": "1.0.1",
-          "dev": true
-        },
-        "mute-stream": {
-          "version": "0.0.8",
-          "dev": true
-        },
-        "nan": {
-          "version": "2.14.2",
-          "dev": true,
-          "optional": true
-        },
-        "nanomatch": {
-          "version": "1.2.13",
-          "dev": true,
-          "requires": {
-            "arr-diff": "^4.0.0",
-            "array-unique": "^0.3.2",
-            "define-property": "^2.0.2",
-            "extend-shallow": "^3.0.2",
-            "fragment-cache": "^0.2.1",
-            "is-windows": "^1.0.2",
-            "kind-of": "^6.0.2",
-            "object.pick": "^1.3.0",
-            "regex-not": "^1.0.0",
-            "snapdragon": "^0.8.1",
-            "to-regex": "^3.0.1"
-          },
-          "dependencies": {
-            "extend-shallow": {
-              "version": "3.0.2",
-              "dev": true,
-              "requires": {
-                "assign-symbols": "^1.0.0",
-                "is-extendable": "^1.0.1"
-              }
-            },
-            "is-extendable": {
-              "version": "1.0.1",
-              "dev": true,
-              "requires": {
-                "is-plain-object": "^2.0.4"
-              }
-            },
-            "is-plain-object": {
-              "version": "2.0.4",
-              "dev": true,
-              "requires": {
-                "isobject": "^3.0.1"
-              }
-            },
-            "kind-of": {
-              "version": "6.0.3",
-              "dev": true
-            }
-          }
-        },
-        "natural-compare": {
-          "version": "1.4.0",
-          "dev": true
-        },
-        "negotiator": {
-          "version": "0.6.2",
-          "dev": true
-        },
-        "neo-async": {
-          "version": "2.6.2",
-          "dev": true
-        },
-        "next-tick": {
-          "version": "1.0.0",
-          "dev": true
-        },
-        "nice-try": {
-          "version": "1.0.5",
-          "dev": true
-        },
-        "node-libs-browser": {
-          "version": "2.2.1",
-          "dev": true,
-          "requires": {
-            "assert": "^1.1.1",
-            "browserify-zlib": "^0.2.0",
-            "buffer": "^4.3.0",
-            "console-browserify": "^1.1.0",
-            "constants-browserify": "^1.0.0",
-            "crypto-browserify": "^3.11.0",
-            "domain-browser": "^1.1.1",
-            "events": "^3.0.0",
-            "https-browserify": "^1.0.0",
-            "os-browserify": "^0.3.0",
-            "path-browserify": "0.0.1",
-            "process": "^0.11.10",
-            "punycode": "^1.2.4",
-            "querystring-es3": "^0.2.0",
-            "readable-stream": "^2.3.3",
-            "stream-browserify": "^2.0.1",
-            "stream-http": "^2.7.2",
-            "string_decoder": "^1.0.0",
-            "timers-browserify": "^2.0.4",
-            "tty-browserify": "0.0.0",
-            "url": "^0.11.0",
-            "util": "^0.11.0",
-            "vm-browserify": "^1.0.1"
-          },
-          "dependencies": {
-            "punycode": {
-              "version": "1.4.1",
-              "dev": true
-            }
-          }
-        },
-        "node-releases": {
-          "version": "1.1.73",
-          "dev": true
-        },
-        "normalize-package-data": {
-          "version": "2.5.0",
-          "dev": true,
-          "requires": {
-            "hosted-git-info": "^2.1.4",
-            "resolve": "^1.10.0",
-            "semver": "2 || 3 || 4 || 5",
-            "validate-npm-package-license": "^3.0.1"
-          },
-          "dependencies": {
-            "semver": {
-              "version": "5.7.1",
-              "dev": true
-            }
-          }
-        },
-        "normalize-path": {
-          "version": "3.0.0",
-          "dev": true
-        },
-        "now-and-later": {
-          "version": "2.0.1",
-          "dev": true,
-          "requires": {
-            "once": "^1.3.2"
-          }
-        },
-        "npm-run-path": {
-          "version": "4.0.1",
-          "dev": true,
-          "requires": {
-            "path-key": "^3.0.0"
-          }
-        },
-        "number-is-nan": {
-          "version": "1.0.1",
-          "dev": true
-        },
-        "object-assign": {
-          "version": "4.1.1",
-          "dev": true
-        },
-        "object-copy": {
-          "version": "0.1.0",
-          "dev": true,
-          "requires": {
-            "copy-descriptor": "^0.1.0",
-            "define-property": "^0.2.5",
-            "kind-of": "^3.0.3"
-          },
-          "dependencies": {
-            "define-property": {
-              "version": "0.2.5",
-              "dev": true,
-              "requires": {
-                "is-descriptor": "^0.1.0"
-              }
-            },
-            "is-accessor-descriptor": {
-              "version": "0.1.6",
-              "dev": true,
-              "requires": {
-                "kind-of": "^3.0.2"
-              }
-            },
-            "is-data-descriptor": {
-              "version": "0.1.4",
-              "dev": true,
-              "requires": {
-                "kind-of": "^3.0.2"
-              }
-            },
-            "is-descriptor": {
-              "version": "0.1.6",
-              "dev": true,
-              "requires": {
-                "is-accessor-descriptor": "^0.1.6",
-                "is-data-descriptor": "^0.1.4",
-                "kind-of": "^5.0.0"
-              },
-              "dependencies": {
-                "kind-of": {
-                  "version": "5.1.0",
-                  "dev": true
-                }
-              }
-            },
-            "kind-of": {
-              "version": "3.2.2",
-              "dev": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            }
-          }
-        },
-        "object-keys": {
-          "version": "1.1.1",
-          "dev": true
-        },
-        "object-visit": {
-          "version": "1.0.1",
-          "dev": true,
-          "requires": {
-            "isobject": "^3.0.0"
-          }
-        },
-        "object.assign": {
-          "version": "4.1.2",
-          "dev": true,
-          "requires": {
-            "call-bind": "^1.0.0",
-            "define-properties": "^1.1.3",
-            "has-symbols": "^1.0.1",
-            "object-keys": "^1.1.1"
-          }
-        },
-        "object.defaults": {
-          "version": "1.1.0",
-          "dev": true,
-          "requires": {
-            "array-each": "^1.0.1",
-            "array-slice": "^1.0.0",
-            "for-own": "^1.0.0",
-            "isobject": "^3.0.0"
-          }
-        },
-        "object.map": {
-          "version": "1.0.1",
-          "dev": true,
-          "requires": {
-            "for-own": "^1.0.0",
-            "make-iterator": "^1.0.0"
-          }
-        },
-        "object.omit": {
-          "version": "2.0.1",
-          "dev": true,
-          "requires": {
-            "for-own": "^0.1.4",
-            "is-extendable": "^0.1.1"
-          },
-          "dependencies": {
-            "for-own": {
-              "version": "0.1.5",
-              "dev": true,
-              "requires": {
-                "for-in": "^1.0.1"
-              }
-            }
-          }
-        },
-        "object.pick": {
-          "version": "1.3.0",
-          "dev": true,
-          "requires": {
-            "isobject": "^3.0.1"
-          }
-        },
-        "object.reduce": {
-          "version": "1.0.1",
-          "dev": true,
-          "requires": {
-            "for-own": "^1.0.0",
-            "make-iterator": "^1.0.0"
-          }
-        },
-        "on-finished": {
-          "version": "2.3.0",
-          "dev": true,
-          "requires": {
-            "ee-first": "1.1.1"
-          }
-        },
-        "once": {
-          "version": "1.4.0",
-          "dev": true,
-          "requires": {
-            "wrappy": "1"
-          }
-        },
-        "onetime": {
-          "version": "5.1.2",
-          "dev": true,
-          "requires": {
-            "mimic-fn": "^2.1.0"
-          }
-        },
-        "optionator": {
-          "version": "0.9.1",
-          "dev": true,
-          "requires": {
-            "deep-is": "^0.1.3",
-            "fast-levenshtein": "^2.0.6",
-            "levn": "^0.4.1",
-            "prelude-ls": "^1.2.1",
-            "type-check": "^0.4.0",
-            "word-wrap": "^1.2.3"
-          }
-        },
-        "ordered-read-streams": {
-          "version": "1.0.1",
-          "dev": true,
-          "requires": {
-            "readable-stream": "^2.0.1"
-          }
-        },
-        "os-browserify": {
-          "version": "0.3.0",
-          "dev": true
-        },
-        "os-locale": {
-          "version": "1.4.0",
-          "dev": true,
-          "requires": {
-            "lcid": "^1.0.0"
-          }
-        },
-        "os-tmpdir": {
-          "version": "1.0.2",
-          "dev": true
-        },
-        "p-limit": {
-          "version": "3.1.0",
-          "dev": true,
-          "requires": {
-            "yocto-queue": "^0.1.0"
-          }
-        },
-        "p-locate": {
-          "version": "4.1.0",
-          "dev": true,
-          "requires": {
-            "p-limit": "^2.2.0"
-          },
-          "dependencies": {
-            "p-limit": {
-              "version": "2.3.0",
-              "dev": true,
-              "requires": {
-                "p-try": "^2.0.0"
-              }
-            }
-          }
-        },
-        "p-try": {
-          "version": "2.2.0",
-          "dev": true
-        },
-        "pako": {
-          "version": "1.0.11",
-          "dev": true
-        },
-        "parallel-transform": {
-          "version": "1.2.0",
-          "dev": true,
-          "requires": {
-            "cyclist": "^1.0.1",
-            "inherits": "^2.0.3",
-            "readable-stream": "^2.1.5"
-          }
-        },
-        "parent-module": {
-          "version": "1.0.1",
-          "dev": true,
-          "requires": {
-            "callsites": "^3.0.0"
-          }
-        },
-        "parse-asn1": {
-          "version": "5.1.6",
-          "dev": true,
-          "requires": {
-            "asn1.js": "^5.2.0",
-            "browserify-aes": "^1.0.0",
-            "evp_bytestokey": "^1.0.0",
-            "pbkdf2": "^3.0.3",
-            "safe-buffer": "^5.1.1"
-          }
-        },
-        "parse-filepath": {
-          "version": "1.0.2",
-          "dev": true,
-          "requires": {
-            "is-absolute": "^1.0.0",
-            "map-cache": "^0.2.0",
-            "path-root": "^0.1.1"
-          }
-        },
-        "parse-glob": {
-          "version": "3.0.4",
-          "dev": true,
-          "requires": {
-            "glob-base": "^0.3.0",
-            "is-dotfile": "^1.0.0",
-            "is-extglob": "^1.0.0",
-            "is-glob": "^2.0.0"
-          },
-          "dependencies": {
-            "is-extglob": {
-              "version": "1.0.0",
-              "dev": true
-            },
-            "is-glob": {
-              "version": "2.0.1",
-              "dev": true,
-              "requires": {
-                "is-extglob": "^1.0.0"
-              }
-            }
-          }
-        },
-        "parse-json": {
-          "version": "2.2.0",
-          "dev": true,
-          "requires": {
-            "error-ex": "^1.2.0"
-          }
-        },
-        "parse-node-version": {
-          "version": "1.0.1",
-          "dev": true
-        },
-        "parse-passwd": {
-          "version": "1.0.0",
-          "dev": true
-        },
-        "parseurl": {
-          "version": "1.3.3",
-          "dev": true
-        },
-        "pascalcase": {
-          "version": "0.1.1",
-          "dev": true
-        },
-        "path-browserify": {
-          "version": "0.0.1",
-          "dev": true
-        },
-        "path-dirname": {
-          "version": "1.0.2",
-          "dev": true
-        },
-        "path-exists": {
-          "version": "4.0.0",
-          "dev": true
-        },
-        "path-is-absolute": {
-          "version": "1.0.1",
-          "dev": true
-        },
-        "path-key": {
-          "version": "3.1.1",
-          "dev": true
-        },
-        "path-parse": {
-          "version": "1.0.7",
-          "dev": true
-        },
-        "path-root": {
-          "version": "0.1.1",
-          "dev": true,
-          "requires": {
-            "path-root-regex": "^0.1.0"
-          }
-        },
-        "path-root-regex": {
-          "version": "0.1.2",
-          "dev": true
-        },
-        "path-type": {
-          "version": "1.1.0",
-          "dev": true,
-          "requires": {
-            "graceful-fs": "^4.1.2",
-            "pify": "^2.0.0",
-            "pinkie-promise": "^2.0.0"
-          }
-        },
-        "pbkdf2": {
-          "version": "3.1.2",
-          "dev": true,
-          "requires": {
-            "create-hash": "^1.1.2",
-            "create-hmac": "^1.1.4",
-            "ripemd160": "^2.0.1",
-            "safe-buffer": "^5.0.1",
-            "sha.js": "^2.4.8"
-          }
-        },
-        "picomatch": {
-          "version": "2.3.0",
-          "dev": true
-        },
-        "pify": {
-          "version": "2.3.0",
-          "dev": true
-        },
-        "pinkie": {
-          "version": "2.0.4",
-          "dev": true
-        },
-        "pinkie-promise": {
-          "version": "2.0.1",
-          "dev": true,
-          "requires": {
-            "pinkie": "^2.0.0"
-          }
-        },
-        "pkg-dir": {
-          "version": "4.2.0",
-          "dev": true,
-          "requires": {
-            "find-up": "^4.0.0"
-          }
-        },
-        "plugin-error": {
-          "version": "1.0.1",
-          "dev": true,
-          "requires": {
-            "ansi-colors": "^1.0.1",
-            "arr-diff": "^4.0.0",
-            "arr-union": "^3.1.0",
-            "extend-shallow": "^3.0.2"
-          },
-          "dependencies": {
-            "ansi-colors": {
-              "version": "1.1.0",
-              "dev": true,
-              "requires": {
-                "ansi-wrap": "^0.1.0"
-              }
-            },
-            "extend-shallow": {
-              "version": "3.0.2",
-              "dev": true,
-              "requires": {
-                "assign-symbols": "^1.0.0",
-                "is-extendable": "^1.0.1"
-              }
-            },
-            "is-extendable": {
-              "version": "1.0.1",
-              "dev": true,
-              "requires": {
-                "is-plain-object": "^2.0.4"
-              }
-            },
-            "is-plain-object": {
-              "version": "2.0.4",
-              "dev": true,
-              "requires": {
-                "isobject": "^3.0.1"
-              }
-            }
-          }
-        },
-        "posix-character-classes": {
-          "version": "0.1.1",
-          "dev": true
-        },
-        "prelude-ls": {
-          "version": "1.2.1",
-          "dev": true
-        },
-        "preserve": {
-          "version": "0.2.0",
-          "dev": true
-        },
-        "prettier": {
-          "version": "2.3.1",
-          "dev": true
-        },
-        "pretty-hrtime": {
-          "version": "1.0.3",
-          "dev": true
-        },
-        "process": {
-          "version": "0.11.10",
-          "dev": true
-        },
-        "process-nextick-args": {
-          "version": "2.0.1",
-          "dev": true
-        },
-        "progress": {
-          "version": "2.0.3",
-          "dev": true
-        },
-        "promise-inflight": {
-          "version": "1.0.1",
-          "dev": true
-        },
-        "prr": {
-          "version": "1.0.1",
-          "dev": true
-        },
-        "public-encrypt": {
-          "version": "4.0.3",
-          "dev": true,
-          "requires": {
-            "bn.js": "^4.1.0",
-            "browserify-rsa": "^4.0.0",
-            "create-hash": "^1.1.0",
-            "parse-asn1": "^5.0.0",
-            "randombytes": "^2.0.1",
-            "safe-buffer": "^5.1.2"
-          },
-          "dependencies": {
-            "bn.js": {
-              "version": "4.12.0",
-              "dev": true
-            }
-          }
-        },
-        "pump": {
-          "version": "2.0.1",
-          "dev": true,
-          "requires": {
-            "end-of-stream": "^1.1.0",
-            "once": "^1.3.1"
-          }
-        },
-        "pumpify": {
-          "version": "1.5.1",
-          "dev": true,
-          "requires": {
-            "duplexify": "^3.6.0",
-            "inherits": "^2.0.3",
-            "pump": "^2.0.0"
-          }
-        },
-        "punycode": {
-          "version": "2.1.1",
-          "dev": true
-        },
-        "qjobs": {
-          "version": "1.2.0",
-          "dev": true
-        },
-        "qs": {
-          "version": "6.7.0",
-          "dev": true
-        },
-        "querystring": {
-          "version": "0.2.0",
-          "dev": true
-        },
-        "querystring-es3": {
-          "version": "0.2.1",
-          "dev": true
-        },
-        "randomatic": {
-          "version": "3.1.1",
-          "dev": true,
-          "requires": {
-            "is-number": "^4.0.0",
-            "kind-of": "^6.0.0",
-            "math-random": "^1.0.1"
-          },
-          "dependencies": {
-            "is-number": {
-              "version": "4.0.0",
-              "dev": true
-            },
-            "kind-of": {
-              "version": "6.0.3",
-              "dev": true
-            }
-          }
-        },
-        "randombytes": {
-          "version": "2.1.0",
-          "dev": true,
-          "requires": {
-            "safe-buffer": "^5.1.0"
-          }
-        },
-        "randomfill": {
-          "version": "1.0.4",
-          "dev": true,
-          "requires": {
-            "randombytes": "^2.0.5",
-            "safe-buffer": "^5.1.0"
-          }
-        },
-        "range-parser": {
-          "version": "1.2.1",
-          "dev": true
-        },
-        "raw-body": {
-          "version": "2.4.0",
-          "dev": true,
-          "requires": {
-            "bytes": "3.1.0",
-            "http-errors": "1.7.2",
-            "iconv-lite": "0.4.24",
-            "unpipe": "1.0.0"
-          }
-        },
-        "read-pkg": {
-          "version": "1.1.0",
-          "dev": true,
-          "requires": {
-            "load-json-file": "^1.0.0",
-            "normalize-package-data": "^2.3.2",
-            "path-type": "^1.0.0"
-          }
-        },
-        "read-pkg-up": {
-          "version": "1.0.1",
-          "dev": true,
-          "requires": {
-            "find-up": "^1.0.0",
-            "read-pkg": "^1.0.0"
-          },
-          "dependencies": {
-            "find-up": {
-              "version": "1.1.2",
-              "dev": true,
-              "requires": {
-                "path-exists": "^2.0.0",
-                "pinkie-promise": "^2.0.0"
-              }
-            },
-            "path-exists": {
-              "version": "2.1.0",
-              "dev": true,
-              "requires": {
-                "pinkie-promise": "^2.0.0"
-              }
-            }
-          }
-        },
-        "readable-stream": {
-          "version": "2.3.7",
-          "dev": true,
-          "requires": {
-            "core-util-is": "~1.0.0",
-            "inherits": "~2.0.3",
-            "isarray": "~1.0.0",
-            "process-nextick-args": "~2.0.0",
-            "safe-buffer": "~5.1.1",
-            "string_decoder": "~1.1.1",
-            "util-deprecate": "~1.0.1"
-          }
-        },
-        "readdirp": {
-          "version": "2.2.1",
-          "dev": true,
-          "requires": {
-            "graceful-fs": "^4.1.11",
-            "micromatch": "^3.1.10",
-            "readable-stream": "^2.0.2"
-          }
-        },
-        "rechoir": {
-          "version": "0.6.2",
-          "dev": true,
-          "requires": {
-            "resolve": "^1.1.6"
-          }
-        },
-        "regex-cache": {
-          "version": "0.4.4",
-          "dev": true,
-          "requires": {
-            "is-equal-shallow": "^0.1.3"
-          }
-        },
-        "regex-not": {
-          "version": "1.0.2",
-          "dev": true,
-          "requires": {
-            "extend-shallow": "^3.0.2",
-            "safe-regex": "^1.1.0"
-          },
-          "dependencies": {
-            "extend-shallow": {
-              "version": "3.0.2",
-              "dev": true,
-              "requires": {
-                "assign-symbols": "^1.0.0",
-                "is-extendable": "^1.0.1"
-              }
-            },
-            "is-extendable": {
-              "version": "1.0.1",
-              "dev": true,
-              "requires": {
-                "is-plain-object": "^2.0.4"
-              }
-            },
-            "is-plain-object": {
-              "version": "2.0.4",
-              "dev": true,
-              "requires": {
-                "isobject": "^3.0.1"
-              }
-            }
-          }
-        },
-        "regexpp": {
-          "version": "3.2.0",
-          "dev": true
-        },
-        "remove-bom-buffer": {
-          "version": "3.0.0",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5",
-            "is-utf8": "^0.2.1"
-          }
-        },
-        "remove-bom-stream": {
-          "version": "1.2.0",
-          "dev": true,
-          "requires": {
-            "remove-bom-buffer": "^3.0.0",
-            "safe-buffer": "^5.1.0",
-            "through2": "^2.0.3"
-          },
-          "dependencies": {
-            "through2": {
-              "version": "2.0.5",
-              "dev": true,
-              "requires": {
-                "readable-stream": "~2.3.6",
-                "xtend": "~4.0.1"
-              }
-            }
-          }
-        },
-        "remove-trailing-separator": {
-          "version": "1.1.0",
-          "dev": true
-        },
-        "repeat-element": {
-          "version": "1.1.4",
-          "dev": true
-        },
-        "repeat-string": {
-          "version": "1.6.1",
-          "dev": true
-        },
-        "replace-ext": {
-          "version": "1.0.1",
-          "dev": true
-        },
-        "replace-homedir": {
-          "version": "1.0.0",
-          "dev": true,
-          "requires": {
-            "homedir-polyfill": "^1.0.1",
-            "is-absolute": "^1.0.0",
-            "remove-trailing-separator": "^1.1.0"
-          }
-        },
-        "require-directory": {
-          "version": "2.1.1",
-          "dev": true
-        },
-        "require-from-string": {
-          "version": "2.0.2",
-          "dev": true
-        },
-        "require-main-filename": {
-          "version": "1.0.1",
-          "dev": true
-        },
-        "requires-port": {
-          "version": "1.0.0",
-          "dev": true
-        },
-        "resolve": {
-          "version": "1.20.0",
-          "dev": true,
-          "requires": {
-            "is-core-module": "^2.2.0",
-            "path-parse": "^1.0.6"
-          }
-        },
-        "resolve-cwd": {
-          "version": "3.0.0",
-          "dev": true,
-          "requires": {
-            "resolve-from": "^5.0.0"
-          },
-          "dependencies": {
-            "resolve-from": {
-              "version": "5.0.0",
-              "dev": true
-            }
-          }
-        },
-        "resolve-dir": {
-          "version": "1.0.1",
-          "dev": true,
-          "requires": {
-            "expand-tilde": "^2.0.0",
-            "global-modules": "^1.0.0"
-          }
-        },
-        "resolve-from": {
-          "version": "4.0.0",
-          "dev": true
-        },
-        "resolve-options": {
-          "version": "1.1.0",
-          "dev": true,
-          "requires": {
-            "value-or-function": "^3.0.0"
-          }
-        },
-        "resolve-url": {
-          "version": "0.2.1",
-          "dev": true
-        },
-        "restore-cursor": {
-          "version": "3.1.0",
-          "dev": true,
-          "requires": {
-            "onetime": "^5.1.0",
-            "signal-exit": "^3.0.2"
-          }
-        },
-        "ret": {
-          "version": "0.1.15",
-          "dev": true
-        },
-        "rfdc": {
-          "version": "1.3.0",
-          "dev": true
-        },
-        "rimraf": {
-          "version": "3.0.2",
-          "dev": true,
-          "requires": {
-            "glob": "^7.1.3"
-          }
-        },
-        "ripemd160": {
-          "version": "2.0.2",
-          "dev": true,
-          "requires": {
-            "hash-base": "^3.0.0",
-            "inherits": "^2.0.1"
-          }
-        },
-        "run-async": {
-          "version": "2.4.1",
-          "dev": true
-        },
-        "run-queue": {
-          "version": "1.0.3",
-          "dev": true,
-          "requires": {
-            "aproba": "^1.1.1"
-          }
-        },
-        "rxjs": {
-          "version": "6.6.7",
-          "dev": true,
-          "requires": {
-            "tslib": "^1.9.0"
-          }
-        },
-        "safe-buffer": {
-          "version": "5.1.2",
-          "dev": true
-        },
-        "safe-regex": {
-          "version": "1.1.0",
-          "dev": true,
-          "requires": {
-            "ret": "~0.1.10"
-          }
-        },
-        "safer-buffer": {
-          "version": "2.1.2",
-          "dev": true
-        },
-        "schema-utils": {
-          "version": "3.0.0",
-          "dev": true,
-          "requires": {
-            "@types/json-schema": "^7.0.6",
-            "ajv": "^6.12.5",
-            "ajv-keywords": "^3.5.2"
-          }
-        },
-        "semver": {
-          "version": "7.3.5",
-          "dev": true,
-          "requires": {
-            "lru-cache": "^6.0.0"
-          }
-        },
-        "semver-greatest-satisfied-range": {
-          "version": "1.1.0",
-          "dev": true,
-          "requires": {
-            "sver-compat": "^1.5.0"
-          }
-        },
-        "serialize-javascript": {
-          "version": "5.0.1",
-          "dev": true,
-          "requires": {
-            "randombytes": "^2.1.0"
-          }
-        },
-        "set-blocking": {
-          "version": "2.0.0",
-          "dev": true
-        },
-        "set-value": {
-          "version": "2.0.1",
-          "dev": true,
-          "requires": {
-            "extend-shallow": "^2.0.1",
-            "is-extendable": "^0.1.1",
-            "is-plain-object": "^2.0.3",
-            "split-string": "^3.0.1"
-          },
-          "dependencies": {
-            "is-plain-object": {
-              "version": "2.0.4",
-              "dev": true,
-              "requires": {
-                "isobject": "^3.0.1"
-              }
-            }
-          }
-        },
-        "setimmediate": {
-          "version": "1.0.5",
-          "dev": true
-        },
-        "setprototypeof": {
-          "version": "1.1.1",
-          "dev": true
-        },
-        "sha.js": {
-          "version": "2.4.11",
-          "dev": true,
-          "requires": {
-            "inherits": "^2.0.1",
-            "safe-buffer": "^5.0.1"
-          }
-        },
-        "shallow-clone": {
-          "version": "3.0.1",
-          "dev": true,
-          "requires": {
-            "kind-of": "^6.0.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "6.0.3",
-              "dev": true
-            }
-          }
-        },
-        "shebang-command": {
-          "version": "2.0.0",
-          "dev": true,
-          "requires": {
-            "shebang-regex": "^3.0.0"
-          }
-        },
-        "shebang-regex": {
-          "version": "3.0.0",
-          "dev": true
-        },
-        "signal-exit": {
-          "version": "3.0.3",
-          "dev": true
-        },
-        "slash": {
-          "version": "1.0.0",
-          "dev": true
-        },
-        "slice-ansi": {
-          "version": "4.0.0",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.0.0",
-            "astral-regex": "^2.0.0",
-            "is-fullwidth-code-point": "^3.0.0"
-          }
-        },
-        "snapdragon": {
-          "version": "0.8.2",
-          "dev": true,
-          "requires": {
-            "base": "^0.11.1",
-            "debug": "^2.2.0",
-            "define-property": "^0.2.5",
-            "extend-shallow": "^2.0.1",
-            "map-cache": "^0.2.2",
-            "source-map": "^0.5.6",
-            "source-map-resolve": "^0.5.0",
-            "use": "^3.1.0"
-          },
-          "dependencies": {
-            "debug": {
-              "version": "2.6.9",
-              "dev": true,
-              "requires": {
-                "ms": "2.0.0"
-              }
-            },
-            "define-property": {
-              "version": "0.2.5",
-              "dev": true,
-              "requires": {
-                "is-descriptor": "^0.1.0"
-              }
-            },
-            "is-accessor-descriptor": {
-              "version": "0.1.6",
-              "dev": true,
-              "requires": {
-                "kind-of": "^3.0.2"
-              },
-              "dependencies": {
-                "kind-of": {
-                  "version": "3.2.2",
-                  "dev": true,
-                  "requires": {
-                    "is-buffer": "^1.1.5"
-                  }
-                }
-              }
-            },
-            "is-data-descriptor": {
-              "version": "0.1.4",
-              "dev": true,
-              "requires": {
-                "kind-of": "^3.0.2"
-              },
-              "dependencies": {
-                "kind-of": {
-                  "version": "3.2.2",
-                  "dev": true,
-                  "requires": {
-                    "is-buffer": "^1.1.5"
-                  }
-                }
-              }
-            },
-            "is-descriptor": {
-              "version": "0.1.6",
-              "dev": true,
-              "requires": {
-                "is-accessor-descriptor": "^0.1.6",
-                "is-data-descriptor": "^0.1.4",
-                "kind-of": "^5.0.0"
-              }
-            },
-            "ms": {
-              "version": "2.0.0",
-              "dev": true
-            },
-            "source-map": {
-              "version": "0.5.7",
-              "dev": true
-            }
-          }
-        },
-        "snapdragon-node": {
-          "version": "2.1.1",
-          "dev": true,
-          "requires": {
-            "define-property": "^1.0.0",
-            "isobject": "^3.0.0",
-            "snapdragon-util": "^3.0.1"
-          },
-          "dependencies": {
-            "define-property": {
-              "version": "1.0.0",
-              "dev": true,
-              "requires": {
-                "is-descriptor": "^1.0.0"
-              }
-            }
-          }
-        },
-        "snapdragon-util": {
-          "version": "3.0.1",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.2.0"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "dev": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            }
-          }
-        },
-        "socket.io": {
-          "version": "3.1.2",
-          "dev": true,
-          "requires": {
-            "@types/cookie": "^0.4.0",
-            "@types/cors": "^2.8.8",
-            "@types/node": ">=10.0.0",
-            "accepts": "~1.3.4",
-            "base64id": "~2.0.0",
-            "debug": "~4.3.1",
-            "engine.io": "~4.1.0",
-            "socket.io-adapter": "~2.1.0",
-            "socket.io-parser": "~4.0.3"
-          }
-        },
-        "socket.io-adapter": {
-          "version": "2.1.0",
-          "dev": true
-        },
-        "socket.io-parser": {
-          "version": "4.0.4",
-          "dev": true,
-          "requires": {
-            "@types/component-emitter": "^1.2.10",
-            "component-emitter": "~1.3.0",
-            "debug": "~4.3.1"
-          }
-        },
-        "source-list-map": {
-          "version": "2.0.1",
-          "dev": true
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "dev": true
-        },
-        "source-map-resolve": {
-          "version": "0.5.3",
-          "dev": true,
-          "requires": {
-            "atob": "^2.1.2",
-            "decode-uri-component": "^0.2.0",
-            "resolve-url": "^0.2.1",
-            "source-map-url": "^0.4.0",
-            "urix": "^0.1.0"
-          }
-        },
-        "source-map-support": {
-          "version": "0.5.19",
-          "dev": true,
-          "requires": {
-            "buffer-from": "^1.0.0",
-            "source-map": "^0.6.0"
-          }
-        },
-        "source-map-url": {
-          "version": "0.4.1",
-          "dev": true
-        },
-        "sparkles": {
-          "version": "1.0.1",
-          "dev": true
-        },
-        "spdx-correct": {
-          "version": "3.1.1",
-          "dev": true,
-          "requires": {
-            "spdx-expression-parse": "^3.0.0",
-            "spdx-license-ids": "^3.0.0"
-          }
-        },
-        "spdx-exceptions": {
-          "version": "2.3.0",
-          "dev": true
-        },
-        "spdx-expression-parse": {
-          "version": "3.0.1",
-          "dev": true,
-          "requires": {
-            "spdx-exceptions": "^2.1.0",
-            "spdx-license-ids": "^3.0.0"
-          }
-        },
-        "spdx-license-ids": {
-          "version": "3.0.9",
-          "dev": true
-        },
-        "split-string": {
-          "version": "3.1.0",
-          "dev": true,
-          "requires": {
-            "extend-shallow": "^3.0.0"
-          },
-          "dependencies": {
-            "extend-shallow": {
-              "version": "3.0.2",
-              "dev": true,
-              "requires": {
-                "assign-symbols": "^1.0.0",
-                "is-extendable": "^1.0.1"
-              }
-            },
-            "is-extendable": {
-              "version": "1.0.1",
-              "dev": true,
-              "requires": {
-                "is-plain-object": "^2.0.4"
-              }
-            },
-            "is-plain-object": {
-              "version": "2.0.4",
-              "dev": true,
-              "requires": {
-                "isobject": "^3.0.1"
-              }
-            }
-          }
-        },
-        "sprintf-js": {
-          "version": "1.0.3",
-          "dev": true
-        },
-        "ssri": {
-          "version": "6.0.2",
-          "dev": true,
-          "requires": {
-            "figgy-pudding": "^3.5.1"
-          }
-        },
-        "stack-trace": {
-          "version": "0.0.10",
-          "dev": true
-        },
-        "static-extend": {
-          "version": "0.1.2",
-          "dev": true,
-          "requires": {
-            "define-property": "^0.2.5",
-            "object-copy": "^0.1.0"
-          },
-          "dependencies": {
-            "define-property": {
-              "version": "0.2.5",
-              "dev": true,
-              "requires": {
-                "is-descriptor": "^0.1.0"
-              }
-            },
-            "is-accessor-descriptor": {
-              "version": "0.1.6",
-              "dev": true,
-              "requires": {
-                "kind-of": "^3.0.2"
-              },
-              "dependencies": {
-                "kind-of": {
-                  "version": "3.2.2",
-                  "dev": true,
-                  "requires": {
-                    "is-buffer": "^1.1.5"
-                  }
-                }
-              }
-            },
-            "is-data-descriptor": {
-              "version": "0.1.4",
-              "dev": true,
-              "requires": {
-                "kind-of": "^3.0.2"
-              },
-              "dependencies": {
-                "kind-of": {
-                  "version": "3.2.2",
-                  "dev": true,
-                  "requires": {
-                    "is-buffer": "^1.1.5"
-                  }
-                }
-              }
-            },
-            "is-descriptor": {
-              "version": "0.1.6",
-              "dev": true,
-              "requires": {
-                "is-accessor-descriptor": "^0.1.6",
-                "is-data-descriptor": "^0.1.4",
-                "kind-of": "^5.0.0"
-              }
-            }
-          }
-        },
-        "statuses": {
-          "version": "1.5.0",
-          "dev": true
-        },
-        "stream-browserify": {
-          "version": "2.0.2",
-          "dev": true,
-          "requires": {
-            "inherits": "~2.0.1",
-            "readable-stream": "^2.0.2"
-          }
-        },
-        "stream-each": {
-          "version": "1.2.3",
-          "dev": true,
-          "requires": {
-            "end-of-stream": "^1.1.0",
-            "stream-shift": "^1.0.0"
-          }
-        },
-        "stream-exhaust": {
-          "version": "1.0.2",
-          "dev": true
-        },
-        "stream-http": {
-          "version": "2.8.3",
-          "dev": true,
-          "requires": {
-            "builtin-status-codes": "^3.0.0",
-            "inherits": "^2.0.1",
-            "readable-stream": "^2.3.6",
-            "to-arraybuffer": "^1.0.0",
-            "xtend": "^4.0.0"
-          }
-        },
-        "stream-shift": {
-          "version": "1.0.1",
-          "dev": true
-        },
-        "streamroller": {
-          "version": "2.2.4",
-          "dev": true,
-          "requires": {
-            "date-format": "^2.1.0",
-            "debug": "^4.1.1",
-            "fs-extra": "^8.1.0"
-          },
-          "dependencies": {
-            "date-format": {
-              "version": "2.1.0",
-              "dev": true
-            }
-          }
-        },
-        "string_decoder": {
-          "version": "1.1.1",
-          "dev": true,
-          "requires": {
-            "safe-buffer": "~5.1.0"
-          }
-        },
-        "string-width": {
-          "version": "4.2.2",
-          "dev": true,
-          "requires": {
-            "emoji-regex": "^8.0.0",
-            "is-fullwidth-code-point": "^3.0.0",
-            "strip-ansi": "^6.0.0"
-          }
-        },
-        "strip-ansi": {
-          "version": "6.0.0",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^5.0.0"
-          }
-        },
-        "strip-bom": {
-          "version": "2.0.0",
-          "dev": true,
-          "requires": {
-            "is-utf8": "^0.2.0"
-          }
-        },
-        "strip-bom-stream": {
-          "version": "2.0.0",
-          "dev": true,
-          "requires": {
-            "first-chunk-stream": "^2.0.0",
-            "strip-bom": "^2.0.0"
-          }
-        },
-        "strip-final-newline": {
-          "version": "2.0.0",
-          "dev": true
-        },
-        "strip-json-comments": {
-          "version": "3.1.1",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        },
-        "sver-compat": {
-          "version": "1.5.0",
-          "dev": true,
-          "requires": {
-            "es6-iterator": "^2.0.1",
-            "es6-symbol": "^3.1.1"
-          }
-        },
-        "table": {
-          "version": "6.7.1",
-          "dev": true,
-          "requires": {
-            "ajv": "^8.0.1",
-            "lodash.clonedeep": "^4.5.0",
-            "lodash.truncate": "^4.4.2",
-            "slice-ansi": "^4.0.0",
-            "string-width": "^4.2.0",
-            "strip-ansi": "^6.0.0"
-          },
-          "dependencies": {
-            "ajv": {
-              "version": "8.6.0",
-              "dev": true,
-              "requires": {
-                "fast-deep-equal": "^3.1.1",
-                "json-schema-traverse": "^1.0.0",
-                "require-from-string": "^2.0.2",
-                "uri-js": "^4.2.2"
-              }
-            },
-            "json-schema-traverse": {
-              "version": "1.0.0",
-              "dev": true
-            }
-          }
-        },
-        "tapable": {
-          "version": "2.2.0",
-          "dev": true
-        },
-        "terser": {
-          "version": "5.7.0",
-          "dev": true,
-          "requires": {
-            "commander": "^2.20.0",
-            "source-map": "~0.7.2",
-            "source-map-support": "~0.5.19"
-          },
-          "dependencies": {
-            "source-map": {
-              "version": "0.7.3",
-              "dev": true
-            }
-          }
-        },
-        "terser-webpack-plugin": {
-          "version": "5.1.3",
-          "dev": true,
-          "requires": {
-            "jest-worker": "^27.0.2",
-            "p-limit": "^3.1.0",
-            "schema-utils": "^3.0.0",
-            "serialize-javascript": "^5.0.1",
-            "source-map": "^0.6.1",
-            "terser": "^5.7.0"
-          }
-        },
-        "text-table": {
-          "version": "0.2.0",
-          "dev": true
-        },
-        "three": {
-          "version": "0.129.0",
-          "peer": true
-        },
-        "through": {
-          "version": "2.3.4"
-        },
-        "through2": {
-          "version": "0.6.5",
-          "requires": {
-            "readable-stream": ">=1.0.33-1 <1.1.0-0",
-            "xtend": ">=4.0.0 <4.1.0-0"
-          },
-          "dependencies": {
-            "isarray": {
-              "version": "0.0.1"
-            },
-            "readable-stream": {
-              "version": "1.0.34",
-              "requires": {
-                "core-util-is": "~1.0.0",
-                "inherits": "~2.0.1",
-                "isarray": "0.0.1",
-                "string_decoder": "~0.10.x"
-              }
-            },
-            "string_decoder": {
-              "version": "0.10.31"
-            }
-          }
-        },
-        "through2-filter": {
-          "version": "3.0.0",
-          "dev": true,
-          "requires": {
-            "through2": "~2.0.0",
-            "xtend": "~4.0.0"
-          },
-          "dependencies": {
-            "through2": {
-              "version": "2.0.5",
-              "dev": true,
-              "requires": {
-                "readable-stream": "~2.3.6",
-                "xtend": "~4.0.1"
-              }
-            }
-          }
-        },
-        "time-stamp": {
-          "version": "1.1.0",
-          "dev": true
-        },
-        "timers-browserify": {
-          "version": "2.0.12",
-          "dev": true,
-          "requires": {
-            "setimmediate": "^1.0.4"
-          }
-        },
-        "tmp": {
-          "version": "0.2.1",
-          "dev": true,
-          "requires": {
-            "rimraf": "^3.0.0"
-          }
-        },
-        "to-absolute-glob": {
-          "version": "2.0.2",
-          "dev": true,
-          "requires": {
-            "is-absolute": "^1.0.0",
-            "is-negated-glob": "^1.0.0"
-          }
-        },
-        "to-arraybuffer": {
-          "version": "1.0.1",
-          "dev": true
-        },
-        "to-object-path": {
-          "version": "0.3.0",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.0.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "dev": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            }
-          }
-        },
-        "to-regex": {
-          "version": "3.0.2",
-          "dev": true,
-          "requires": {
-            "define-property": "^2.0.2",
-            "extend-shallow": "^3.0.2",
-            "regex-not": "^1.0.2",
-            "safe-regex": "^1.1.0"
-          },
-          "dependencies": {
-            "extend-shallow": {
-              "version": "3.0.2",
-              "dev": true,
-              "requires": {
-                "assign-symbols": "^1.0.0",
-                "is-extendable": "^1.0.1"
-              }
-            },
-            "is-extendable": {
-              "version": "1.0.1",
-              "dev": true,
-              "requires": {
-                "is-plain-object": "^2.0.4"
-              }
-            },
-            "is-plain-object": {
-              "version": "2.0.4",
-              "dev": true,
-              "requires": {
-                "isobject": "^3.0.1"
-              }
-            }
-          }
-        },
-        "to-regex-range": {
-          "version": "2.1.1",
-          "dev": true,
-          "requires": {
-            "is-number": "^3.0.0",
-            "repeat-string": "^1.6.1"
-          }
-        },
-        "to-through": {
-          "version": "2.0.0",
-          "dev": true,
-          "requires": {
-            "through2": "^2.0.3"
-          },
-          "dependencies": {
-            "through2": {
-              "version": "2.0.5",
-              "dev": true,
-              "requires": {
-                "readable-stream": "~2.3.6",
-                "xtend": "~4.0.1"
-              }
-            }
-          }
-        },
-        "toidentifier": {
-          "version": "1.0.0",
-          "dev": true
-        },
-        "tslib": {
-          "version": "1.14.1",
-          "dev": true
-        },
-        "tty-browserify": {
-          "version": "0.0.0",
-          "dev": true
-        },
-        "type": {
-          "version": "1.2.0",
-          "dev": true
-        },
-        "type-check": {
-          "version": "0.4.0",
-          "dev": true,
-          "requires": {
-            "prelude-ls": "^1.2.1"
-          }
-        },
-        "type-fest": {
-          "version": "0.20.2",
-          "dev": true
-        },
-        "type-is": {
-          "version": "1.6.18",
-          "dev": true,
-          "requires": {
-            "media-typer": "0.3.0",
-            "mime-types": "~2.1.24"
-          }
-        },
-        "typedarray": {
-          "version": "0.0.6",
-          "dev": true
-        },
-        "ua-parser-js": {
-          "version": "0.7.28",
-          "dev": true
-        },
-        "unc-path-regex": {
-          "version": "0.1.2",
-          "dev": true
-        },
-        "undertaker": {
-          "version": "1.3.0",
-          "dev": true,
-          "requires": {
-            "arr-flatten": "^1.0.1",
-            "arr-map": "^2.0.0",
-            "bach": "^1.0.0",
-            "collection-map": "^1.0.0",
-            "es6-weak-map": "^2.0.1",
-            "fast-levenshtein": "^1.0.0",
-            "last-run": "^1.1.0",
-            "object.defaults": "^1.0.0",
-            "object.reduce": "^1.0.0",
-            "undertaker-registry": "^1.0.0"
-          },
-          "dependencies": {
-            "fast-levenshtein": {
-              "version": "1.1.4",
-              "dev": true
-            }
-          }
-        },
-        "undertaker-registry": {
-          "version": "1.0.1",
-          "dev": true
-        },
-        "union-value": {
-          "version": "1.0.1",
-          "dev": true,
-          "requires": {
-            "arr-union": "^3.1.0",
-            "get-value": "^2.0.6",
-            "is-extendable": "^0.1.1",
-            "set-value": "^2.0.1"
-          }
-        },
-        "unique-filename": {
-          "version": "1.1.1",
-          "dev": true,
-          "requires": {
-            "unique-slug": "^2.0.0"
-          }
-        },
-        "unique-slug": {
-          "version": "2.0.2",
-          "dev": true,
-          "requires": {
-            "imurmurhash": "^0.1.4"
-          }
-        },
-        "unique-stream": {
-          "version": "2.3.1",
-          "dev": true,
-          "requires": {
-            "json-stable-stringify-without-jsonify": "^1.0.1",
-            "through2-filter": "^3.0.0"
-          }
-        },
-        "universalify": {
-          "version": "0.1.2",
-          "dev": true
-        },
-        "unpipe": {
-          "version": "1.0.0",
-          "dev": true
-        },
-        "unset-value": {
-          "version": "1.0.0",
-          "dev": true,
-          "requires": {
-            "has-value": "^0.3.1",
-            "isobject": "^3.0.0"
-          },
-          "dependencies": {
-            "has-value": {
-              "version": "0.3.1",
-              "dev": true,
-              "requires": {
-                "get-value": "^2.0.3",
-                "has-values": "^0.1.4",
-                "isobject": "^2.0.0"
-              },
-              "dependencies": {
-                "isobject": {
-                  "version": "2.1.0",
-                  "dev": true,
-                  "requires": {
-                    "isarray": "1.0.0"
-                  }
-                }
-              }
-            },
-            "has-values": {
-              "version": "0.1.4",
-              "dev": true
-            }
-          }
-        },
-        "upath": {
-          "version": "1.2.0",
-          "dev": true
-        },
-        "uri-js": {
-          "version": "4.4.1",
-          "dev": true,
-          "requires": {
-            "punycode": "^2.1.0"
-          }
-        },
-        "urix": {
-          "version": "0.1.0",
-          "dev": true
-        },
-        "url": {
-          "version": "0.11.0",
-          "dev": true,
-          "requires": {
-            "punycode": "1.3.2",
-            "querystring": "0.2.0"
-          },
-          "dependencies": {
-            "punycode": {
-              "version": "1.3.2",
-              "dev": true
-            }
-          }
-        },
-        "use": {
-          "version": "3.1.1",
-          "dev": true
-        },
-        "util": {
-          "version": "0.11.1",
-          "dev": true,
-          "requires": {
-            "inherits": "2.0.3"
-          },
-          "dependencies": {
-            "inherits": {
-              "version": "2.0.3",
-              "dev": true
-            }
-          }
-        },
-        "util-deprecate": {
-          "version": "1.0.2",
-          "dev": true
-        },
-        "utils-merge": {
-          "version": "1.0.1",
-          "dev": true
-        },
-        "v8-compile-cache": {
-          "version": "2.3.0",
-          "dev": true
-        },
-        "v8flags": {
-          "version": "3.2.0",
-          "dev": true,
-          "requires": {
-            "homedir-polyfill": "^1.0.1"
-          }
-        },
-        "validate-npm-package-license": {
-          "version": "3.0.4",
-          "dev": true,
-          "requires": {
-            "spdx-correct": "^3.0.0",
-            "spdx-expression-parse": "^3.0.0"
-          }
-        },
-        "value-or-function": {
-          "version": "3.0.0",
-          "dev": true
-        },
-        "vary": {
-          "version": "1.1.2",
-          "dev": true
-        },
-        "vinyl": {
-          "version": "2.2.1",
-          "dev": true,
-          "requires": {
-            "clone": "^2.1.1",
-            "clone-buffer": "^1.0.0",
-            "clone-stats": "^1.0.0",
-            "cloneable-readable": "^1.0.0",
-            "remove-trailing-separator": "^1.0.1",
-            "replace-ext": "^1.0.0"
-          }
-        },
-        "vinyl-file": {
-          "version": "2.0.0",
-          "dev": true,
-          "requires": {
-            "graceful-fs": "^4.1.2",
-            "pify": "^2.3.0",
-            "pinkie-promise": "^2.0.0",
-            "strip-bom": "^2.0.0",
-            "strip-bom-stream": "^2.0.0",
-            "vinyl": "^1.1.0"
-          },
-          "dependencies": {
-            "clone": {
-              "version": "1.0.4",
-              "dev": true
-            },
-            "clone-stats": {
-              "version": "0.0.1",
-              "dev": true
-            },
-            "replace-ext": {
-              "version": "0.0.1",
-              "dev": true
-            },
-            "vinyl": {
-              "version": "1.2.0",
-              "dev": true,
-              "requires": {
-                "clone": "^1.0.0",
-                "clone-stats": "^0.0.1",
-                "replace-ext": "0.0.1"
-              }
-            }
-          }
-        },
-        "vinyl-fs": {
-          "version": "3.0.3",
-          "dev": true,
-          "requires": {
-            "fs-mkdirp-stream": "^1.0.0",
-            "glob-stream": "^6.1.0",
-            "graceful-fs": "^4.0.0",
-            "is-valid-glob": "^1.0.0",
-            "lazystream": "^1.0.0",
-            "lead": "^1.0.0",
-            "object.assign": "^4.0.4",
-            "pumpify": "^1.3.5",
-            "readable-stream": "^2.3.3",
-            "remove-bom-buffer": "^3.0.0",
-            "remove-bom-stream": "^1.2.0",
-            "resolve-options": "^1.1.0",
-            "through2": "^2.0.0",
-            "to-through": "^2.0.0",
-            "value-or-function": "^3.0.0",
-            "vinyl": "^2.0.0",
-            "vinyl-sourcemap": "^1.1.0"
-          },
-          "dependencies": {
-            "through2": {
-              "version": "2.0.5",
-              "dev": true,
-              "requires": {
-                "readable-stream": "~2.3.6",
-                "xtend": "~4.0.1"
-              }
-            }
-          }
-        },
-        "vinyl-sourcemap": {
-          "version": "1.1.0",
-          "dev": true,
-          "requires": {
-            "append-buffer": "^1.0.2",
-            "convert-source-map": "^1.5.0",
-            "graceful-fs": "^4.1.6",
-            "normalize-path": "^2.1.1",
-            "now-and-later": "^2.0.0",
-            "remove-bom-buffer": "^3.0.0",
-            "vinyl": "^2.0.0"
-          },
-          "dependencies": {
-            "normalize-path": {
-              "version": "2.1.1",
-              "dev": true,
-              "requires": {
-                "remove-trailing-separator": "^1.0.1"
-              }
-            }
-          }
-        },
-        "vm-browserify": {
-          "version": "1.1.2",
-          "dev": true
-        },
-        "void-elements": {
-          "version": "2.0.1",
-          "dev": true
-        },
-        "watchpack": {
-          "version": "2.2.0",
-          "dev": true,
-          "requires": {
-            "glob-to-regexp": "^0.4.1",
-            "graceful-fs": "^4.1.2"
-          }
-        },
-        "watchpack-chokidar2": {
-          "version": "2.0.1",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "chokidar": "^2.1.8"
-          }
-        },
-        "webpack": {
-          "version": "5.38.1",
-          "dev": true,
-          "requires": {
-            "@types/eslint-scope": "^3.7.0",
-            "@types/estree": "^0.0.47",
-            "@webassemblyjs/ast": "1.11.0",
-            "@webassemblyjs/wasm-edit": "1.11.0",
-            "@webassemblyjs/wasm-parser": "1.11.0",
-            "acorn": "^8.2.1",
-            "browserslist": "^4.14.5",
-            "chrome-trace-event": "^1.0.2",
-            "enhanced-resolve": "^5.8.0",
-            "es-module-lexer": "^0.4.0",
-            "eslint-scope": "5.1.1",
-            "events": "^3.2.0",
-            "glob-to-regexp": "^0.4.1",
-            "graceful-fs": "^4.2.4",
-            "json-parse-better-errors": "^1.0.2",
-            "loader-runner": "^4.2.0",
-            "mime-types": "^2.1.27",
-            "neo-async": "^2.6.2",
-            "schema-utils": "^3.0.0",
-            "tapable": "^2.1.1",
-            "terser-webpack-plugin": "^5.1.1",
-            "watchpack": "^2.2.0",
-            "webpack-sources": "^2.3.0"
-          },
-          "dependencies": {
-            "acorn": {
-              "version": "8.4.0",
-              "dev": true
-            }
-          }
-        },
-        "webpack-cli": {
-          "version": "4.7.2",
-          "dev": true,
-          "requires": {
-            "@discoveryjs/json-ext": "^0.5.0",
-            "@webpack-cli/configtest": "^1.0.4",
-            "@webpack-cli/info": "^1.3.0",
-            "@webpack-cli/serve": "^1.5.1",
-            "colorette": "^1.2.1",
-            "commander": "^7.0.0",
-            "execa": "^5.0.0",
-            "fastest-levenshtein": "^1.0.12",
-            "import-local": "^3.0.2",
-            "interpret": "^2.2.0",
-            "rechoir": "^0.7.0",
-            "v8-compile-cache": "^2.2.0",
-            "webpack-merge": "^5.7.3"
-          },
-          "dependencies": {
-            "commander": {
-              "version": "7.2.0",
-              "dev": true
-            },
-            "interpret": {
-              "version": "2.2.0",
-              "dev": true
-            },
-            "rechoir": {
-              "version": "0.7.0",
-              "dev": true,
-              "requires": {
-                "resolve": "^1.9.0"
-              }
-            }
-          }
-        },
-        "webpack-merge": {
-          "version": "5.8.0",
-          "dev": true,
-          "requires": {
-            "clone-deep": "^4.0.1",
-            "wildcard": "^2.0.0"
-          }
-        },
-        "webpack-sources": {
-          "version": "2.3.0",
-          "dev": true,
-          "requires": {
-            "source-list-map": "^2.0.1",
-            "source-map": "^0.6.1"
-          }
-        },
-        "webpack-stream": {
-          "version": "6.1.2",
-          "dev": true,
-          "requires": {
-            "fancy-log": "^1.3.3",
-            "lodash.clone": "^4.3.2",
-            "lodash.some": "^4.2.2",
-            "memory-fs": "^0.5.0",
-            "plugin-error": "^1.0.1",
-            "supports-color": "^7.2.0",
-            "through": "^2.3.8",
-            "vinyl": "^2.1.0",
-            "webpack": "^4.26.1"
-          },
-          "dependencies": {
-            "@webassemblyjs/ast": {
-              "version": "1.9.0",
-              "dev": true,
-              "requires": {
-                "@webassemblyjs/helper-module-context": "1.9.0",
-                "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
-                "@webassemblyjs/wast-parser": "1.9.0"
-              }
-            },
-            "@webassemblyjs/helper-api-error": {
-              "version": "1.9.0",
-              "dev": true
-            },
-            "@webassemblyjs/helper-buffer": {
-              "version": "1.9.0",
-              "dev": true
-            },
-            "@webassemblyjs/helper-wasm-bytecode": {
-              "version": "1.9.0",
-              "dev": true
-            },
-            "@webassemblyjs/helper-wasm-section": {
-              "version": "1.9.0",
-              "dev": true,
-              "requires": {
-                "@webassemblyjs/ast": "1.9.0",
-                "@webassemblyjs/helper-buffer": "1.9.0",
-                "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
-                "@webassemblyjs/wasm-gen": "1.9.0"
-              }
-            },
-            "@webassemblyjs/ieee754": {
-              "version": "1.9.0",
-              "dev": true,
-              "requires": {
-                "@xtuc/ieee754": "^1.2.0"
-              }
-            },
-            "@webassemblyjs/leb128": {
-              "version": "1.9.0",
-              "dev": true,
-              "requires": {
-                "@xtuc/long": "4.2.2"
-              }
-            },
-            "@webassemblyjs/utf8": {
-              "version": "1.9.0",
-              "dev": true
-            },
-            "@webassemblyjs/wasm-edit": {
-              "version": "1.9.0",
-              "dev": true,
-              "requires": {
-                "@webassemblyjs/ast": "1.9.0",
-                "@webassemblyjs/helper-buffer": "1.9.0",
-                "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
-                "@webassemblyjs/helper-wasm-section": "1.9.0",
-                "@webassemblyjs/wasm-gen": "1.9.0",
-                "@webassemblyjs/wasm-opt": "1.9.0",
-                "@webassemblyjs/wasm-parser": "1.9.0",
-                "@webassemblyjs/wast-printer": "1.9.0"
-              }
-            },
-            "@webassemblyjs/wasm-gen": {
-              "version": "1.9.0",
-              "dev": true,
-              "requires": {
-                "@webassemblyjs/ast": "1.9.0",
-                "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
-                "@webassemblyjs/ieee754": "1.9.0",
-                "@webassemblyjs/leb128": "1.9.0",
-                "@webassemblyjs/utf8": "1.9.0"
-              }
-            },
-            "@webassemblyjs/wasm-opt": {
-              "version": "1.9.0",
-              "dev": true,
-              "requires": {
-                "@webassemblyjs/ast": "1.9.0",
-                "@webassemblyjs/helper-buffer": "1.9.0",
-                "@webassemblyjs/wasm-gen": "1.9.0",
-                "@webassemblyjs/wasm-parser": "1.9.0"
-              }
-            },
-            "@webassemblyjs/wasm-parser": {
-              "version": "1.9.0",
-              "dev": true,
-              "requires": {
-                "@webassemblyjs/ast": "1.9.0",
-                "@webassemblyjs/helper-api-error": "1.9.0",
-                "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
-                "@webassemblyjs/ieee754": "1.9.0",
-                "@webassemblyjs/leb128": "1.9.0",
-                "@webassemblyjs/utf8": "1.9.0"
-              }
-            },
-            "@webassemblyjs/wast-printer": {
-              "version": "1.9.0",
-              "dev": true,
-              "requires": {
-                "@webassemblyjs/ast": "1.9.0",
-                "@webassemblyjs/wast-parser": "1.9.0",
-                "@xtuc/long": "4.2.2"
-              }
-            },
-            "acorn": {
-              "version": "6.4.2",
-              "dev": true
-            },
-            "anymatch": {
-              "version": "3.1.2",
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "normalize-path": "^3.0.0",
-                "picomatch": "^2.0.4"
-              }
-            },
-            "binary-extensions": {
-              "version": "2.2.0",
-              "dev": true,
-              "optional": true
-            },
-            "braces": {
-              "version": "3.0.2",
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "fill-range": "^7.0.1"
-              }
-            },
-            "chokidar": {
-              "version": "3.5.1",
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "anymatch": "~3.1.1",
-                "braces": "~3.0.2",
-                "fsevents": "~2.3.1",
-                "glob-parent": "~5.1.0",
-                "is-binary-path": "~2.1.0",
-                "is-glob": "~4.0.1",
-                "normalize-path": "~3.0.0",
-                "readdirp": "~3.5.0"
-              }
-            },
-            "enhanced-resolve": {
-              "version": "4.5.0",
-              "dev": true,
-              "requires": {
-                "graceful-fs": "^4.1.2",
-                "memory-fs": "^0.5.0",
-                "tapable": "^1.0.0"
-              }
-            },
-            "eslint-scope": {
-              "version": "4.0.3",
-              "dev": true,
-              "requires": {
-                "esrecurse": "^4.1.0",
-                "estraverse": "^4.1.1"
-              }
-            },
-            "fill-range": {
-              "version": "7.0.1",
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "to-regex-range": "^5.0.1"
-              }
-            },
-            "fsevents": {
-              "version": "2.3.2",
-              "dev": true,
-              "optional": true
-            },
-            "is-binary-path": {
-              "version": "2.1.0",
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "binary-extensions": "^2.0.0"
-              }
-            },
-            "is-number": {
-              "version": "7.0.0",
-              "dev": true,
-              "optional": true
-            },
-            "loader-runner": {
-              "version": "2.4.0",
-              "dev": true
-            },
-            "readdirp": {
-              "version": "3.5.0",
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "picomatch": "^2.2.1"
-              }
-            },
-            "schema-utils": {
-              "version": "1.0.0",
-              "dev": true,
-              "requires": {
-                "ajv": "^6.1.0",
-                "ajv-errors": "^1.0.0",
-                "ajv-keywords": "^3.1.0"
-              }
-            },
-            "serialize-javascript": {
-              "version": "4.0.0",
-              "dev": true,
-              "requires": {
-                "randombytes": "^2.1.0"
-              }
-            },
-            "tapable": {
-              "version": "1.1.3",
-              "dev": true
-            },
-            "terser": {
-              "version": "4.8.0",
-              "dev": true,
-              "requires": {
-                "commander": "^2.20.0",
-                "source-map": "~0.6.1",
-                "source-map-support": "~0.5.12"
-              }
-            },
-            "terser-webpack-plugin": {
-              "version": "1.4.5",
-              "dev": true,
-              "requires": {
-                "cacache": "^12.0.2",
-                "find-cache-dir": "^2.1.0",
-                "is-wsl": "^1.1.0",
-                "schema-utils": "^1.0.0",
-                "serialize-javascript": "^4.0.0",
-                "source-map": "^0.6.1",
-                "terser": "^4.1.2",
-                "webpack-sources": "^1.4.0",
-                "worker-farm": "^1.7.0"
-              }
-            },
-            "through": {
-              "version": "2.3.8",
-              "dev": true
-            },
-            "to-regex-range": {
-              "version": "5.0.1",
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "is-number": "^7.0.0"
-              }
-            },
-            "watchpack": {
-              "version": "1.7.5",
-              "dev": true,
-              "requires": {
-                "chokidar": "^3.4.1",
-                "graceful-fs": "^4.1.2",
-                "neo-async": "^2.5.0",
-                "watchpack-chokidar2": "^2.0.1"
-              }
-            },
-            "webpack": {
-              "version": "4.46.0",
-              "dev": true,
-              "requires": {
-                "@webassemblyjs/ast": "1.9.0",
-                "@webassemblyjs/helper-module-context": "1.9.0",
-                "@webassemblyjs/wasm-edit": "1.9.0",
-                "@webassemblyjs/wasm-parser": "1.9.0",
-                "acorn": "^6.4.1",
-                "ajv": "^6.10.2",
-                "ajv-keywords": "^3.4.1",
-                "chrome-trace-event": "^1.0.2",
-                "enhanced-resolve": "^4.5.0",
-                "eslint-scope": "^4.0.3",
-                "json-parse-better-errors": "^1.0.2",
-                "loader-runner": "^2.4.0",
-                "loader-utils": "^1.2.3",
-                "memory-fs": "^0.4.1",
-                "micromatch": "^3.1.10",
-                "mkdirp": "^0.5.3",
-                "neo-async": "^2.6.1",
-                "node-libs-browser": "^2.2.1",
-                "schema-utils": "^1.0.0",
-                "tapable": "^1.1.3",
-                "terser-webpack-plugin": "^1.4.3",
-                "watchpack": "^1.7.4",
-                "webpack-sources": "^1.4.1"
-              },
-              "dependencies": {
-                "memory-fs": {
-                  "version": "0.4.1",
-                  "dev": true,
-                  "requires": {
-                    "errno": "^0.1.3",
-                    "readable-stream": "^2.0.1"
-                  }
-                }
-              }
-            },
-            "webpack-sources": {
-              "version": "1.4.3",
-              "dev": true,
-              "requires": {
-                "source-list-map": "^2.0.0",
-                "source-map": "~0.6.1"
-              }
-            }
-          }
-        },
-        "which": {
-          "version": "2.0.2",
-          "dev": true,
-          "requires": {
-            "isexe": "^2.0.0"
-          }
-        },
-        "which-module": {
-          "version": "1.0.0",
-          "dev": true
-        },
-        "wildcard": {
-          "version": "2.0.0",
-          "dev": true
-        },
-        "word-wrap": {
-          "version": "1.2.3",
-          "dev": true
-        },
-        "worker-farm": {
-          "version": "1.7.0",
-          "dev": true,
-          "requires": {
-            "errno": "~0.1.7"
-          }
-        },
-        "wrap-ansi": {
-          "version": "2.1.0",
-          "dev": true,
-          "requires": {
-            "string-width": "^1.0.1",
-            "strip-ansi": "^3.0.1"
-          },
-          "dependencies": {
-            "ansi-regex": {
-              "version": "2.1.1",
-              "dev": true
-            },
-            "is-fullwidth-code-point": {
-              "version": "1.0.0",
-              "dev": true,
-              "requires": {
-                "number-is-nan": "^1.0.0"
-              }
-            },
-            "string-width": {
-              "version": "1.0.2",
-              "dev": true,
-              "requires": {
-                "code-point-at": "^1.0.0",
-                "is-fullwidth-code-point": "^1.0.0",
-                "strip-ansi": "^3.0.0"
-              }
-            },
-            "strip-ansi": {
-              "version": "3.0.1",
-              "dev": true,
-              "requires": {
-                "ansi-regex": "^2.0.0"
-              }
-            }
-          }
-        },
-        "wrappy": {
-          "version": "1.0.2",
-          "dev": true
-        },
-        "write": {
-          "version": "1.0.3",
-          "dev": true,
-          "requires": {
-            "mkdirp": "^0.5.1"
-          }
-        },
-        "ws": {
-          "version": "7.4.6",
-          "dev": true,
-          "requires": {}
-        },
-        "xtend": {
-          "version": "4.0.2"
-        },
-        "y18n": {
-          "version": "3.2.2",
-          "dev": true
-        },
-        "yallist": {
-          "version": "4.0.0",
-          "dev": true
-        },
-        "yargs": {
-          "version": "7.1.2",
-          "dev": true,
-          "requires": {
-            "camelcase": "^3.0.0",
-            "cliui": "^3.2.0",
-            "decamelize": "^1.1.1",
-            "get-caller-file": "^1.0.1",
-            "os-locale": "^1.4.0",
-            "read-pkg-up": "^1.0.1",
-            "require-directory": "^2.1.1",
-            "require-main-filename": "^1.0.1",
-            "set-blocking": "^2.0.0",
-            "string-width": "^1.0.2",
-            "which-module": "^1.0.0",
-            "y18n": "^3.2.1",
-            "yargs-parser": "^5.0.1"
-          },
-          "dependencies": {
-            "ansi-regex": {
-              "version": "2.1.1",
-              "dev": true
-            },
-            "is-fullwidth-code-point": {
-              "version": "1.0.0",
-              "dev": true,
-              "requires": {
-                "number-is-nan": "^1.0.0"
-              }
-            },
-            "string-width": {
-              "version": "1.0.2",
-              "dev": true,
-              "requires": {
-                "code-point-at": "^1.0.0",
-                "is-fullwidth-code-point": "^1.0.0",
-                "strip-ansi": "^3.0.0"
-              }
-            },
-            "strip-ansi": {
-              "version": "3.0.1",
-              "dev": true,
-              "requires": {
-                "ansi-regex": "^2.0.0"
-              }
-            }
-          }
-        },
-        "yargs-parser": {
-          "version": "5.0.1",
-          "dev": true,
-          "requires": {
-            "camelcase": "^3.0.0",
-            "object.assign": "^4.1.0"
-          }
-        },
-        "yocto-queue": {
-          "version": "0.1.0",
-          "dev": true
-        }
-      }
-    },
-    "shallow-clone": {
-      "version": "3.0.1",
-      "dev": true,
-      "requires": {
-        "kind-of": "^6.0.2"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "6.0.3",
-          "dev": true
-        }
-      }
-    },
-    "shebang-command": {
-      "version": "2.0.0",
-      "dev": true,
-      "requires": {
-        "shebang-regex": "^3.0.0"
-      }
-    },
-    "shebang-regex": {
-      "version": "3.0.0",
-      "dev": true
-    },
-    "signal-exit": {
-      "version": "3.0.7",
-      "dev": true
-    },
-    "slash": {
-      "version": "1.0.0",
-      "dev": true
-    },
-    "slice-ansi": {
-      "version": "4.0.0",
-      "dev": true,
-      "requires": {
-        "ansi-styles": "^4.0.0",
-        "astral-regex": "^2.0.0",
-        "is-fullwidth-code-point": "^3.0.0"
-      }
-    },
-    "snapdragon": {
-      "version": "0.8.2",
-      "dev": true,
-      "requires": {
-        "base": "^0.11.1",
-        "debug": "^2.2.0",
-        "define-property": "^0.2.5",
-        "extend-shallow": "^2.0.1",
-        "map-cache": "^0.2.2",
-        "source-map": "^0.5.6",
-        "source-map-resolve": "^0.5.0",
-        "use": "^3.1.0"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "define-property": {
-          "version": "0.2.5",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        },
-        "is-accessor-descriptor": {
-          "version": "0.1.6",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.0.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "dev": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            }
-          }
-        },
-        "is-data-descriptor": {
-          "version": "0.1.4",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.0.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "dev": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            }
-          }
-        },
-        "is-descriptor": {
-          "version": "0.1.6",
-          "dev": true,
-          "requires": {
-            "is-accessor-descriptor": "^0.1.6",
-            "is-data-descriptor": "^0.1.4",
-            "kind-of": "^5.0.0"
-          }
-        },
-        "ms": {
-          "version": "2.0.0",
-          "dev": true
-        },
-        "source-map": {
-          "version": "0.5.7",
-          "dev": true
-        }
-      }
-    },
-    "snapdragon-node": {
-      "version": "2.1.1",
-      "dev": true,
-      "requires": {
-        "define-property": "^1.0.0",
-        "isobject": "^3.0.0",
-        "snapdragon-util": "^3.0.1"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "1.0.0",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^1.0.0"
-          }
-        }
-      }
-    },
-    "snapdragon-util": {
-      "version": "3.0.1",
-      "dev": true,
-      "requires": {
-        "kind-of": "^3.2.0"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "3.2.2",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "socket.io": {
-      "version": "4.4.1",
-      "dev": true,
-      "requires": {
-        "accepts": "~1.3.4",
-        "base64id": "~2.0.0",
-        "debug": "~4.3.2",
-        "engine.io": "~6.1.0",
-        "socket.io-adapter": "~2.3.3",
-        "socket.io-parser": "~4.0.4"
-      }
-    },
-    "socket.io-adapter": {
-      "version": "2.3.3",
-      "dev": true
-    },
-    "socket.io-parser": {
-      "version": "4.0.4",
-      "dev": true,
-      "requires": {
-        "@types/component-emitter": "^1.2.10",
-        "component-emitter": "~1.3.0",
-        "debug": "~4.3.1"
-      }
-    },
-    "source-list-map": {
-      "version": "2.0.1",
-      "dev": true
-    },
-    "source-map": {
-      "version": "0.6.1",
-      "dev": true
-    },
-    "source-map-resolve": {
-      "version": "0.5.3",
-      "dev": true,
-      "requires": {
-        "atob": "^2.1.2",
-        "decode-uri-component": "^0.2.0",
-        "resolve-url": "^0.2.1",
-        "source-map-url": "^0.4.0",
-        "urix": "^0.1.0"
-      }
-    },
-    "source-map-support": {
-      "version": "0.5.21",
-      "dev": true,
-      "requires": {
-        "buffer-from": "^1.0.0",
-        "source-map": "^0.6.0"
-      }
-    },
-    "source-map-url": {
-      "version": "0.4.1",
-      "dev": true
-    },
-    "sparkles": {
-      "version": "1.0.1",
-      "dev": true
-    },
-    "spdx-correct": {
-      "version": "3.1.1",
-      "dev": true,
-      "requires": {
-        "spdx-expression-parse": "^3.0.0",
-        "spdx-license-ids": "^3.0.0"
-      }
-    },
-    "spdx-exceptions": {
-      "version": "2.3.0",
-      "dev": true
-    },
-    "spdx-expression-parse": {
-      "version": "3.0.1",
-      "dev": true,
-      "requires": {
-        "spdx-exceptions": "^2.1.0",
-        "spdx-license-ids": "^3.0.0"
-      }
-    },
-    "spdx-license-ids": {
-      "version": "3.0.11",
-      "dev": true
-    },
-    "split-string": {
-      "version": "3.1.0",
-      "dev": true,
-      "requires": {
-        "extend-shallow": "^3.0.0"
-      },
-      "dependencies": {
-        "extend-shallow": {
-          "version": "3.0.2",
-          "dev": true,
-          "requires": {
-            "assign-symbols": "^1.0.0",
-            "is-extendable": "^1.0.1"
-          }
-        },
-        "is-extendable": {
-          "version": "1.0.1",
-          "dev": true,
-          "requires": {
-            "is-plain-object": "^2.0.4"
-          }
-        },
-        "is-plain-object": {
-          "version": "2.0.4",
-          "dev": true,
-          "requires": {
-            "isobject": "^3.0.1"
-          }
-        }
-      }
-    },
-    "sprintf-js": {
-      "version": "1.0.3",
-      "dev": true
-    },
-    "ssri": {
-      "version": "6.0.2",
-      "dev": true,
-      "requires": {
-        "figgy-pudding": "^3.5.1"
-      }
-    },
-    "stack-trace": {
-      "version": "0.0.10",
-      "dev": true
-    },
-    "static-extend": {
-      "version": "0.1.2",
-      "dev": true,
-      "requires": {
-        "define-property": "^0.2.5",
-        "object-copy": "^0.1.0"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "0.2.5",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        },
-        "is-accessor-descriptor": {
-          "version": "0.1.6",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.0.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "dev": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            }
-          }
-        },
-        "is-data-descriptor": {
-          "version": "0.1.4",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.0.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "dev": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            }
-          }
-        },
-        "is-descriptor": {
-          "version": "0.1.6",
-          "dev": true,
-          "requires": {
-            "is-accessor-descriptor": "^0.1.6",
-            "is-data-descriptor": "^0.1.4",
-            "kind-of": "^5.0.0"
-          }
-        }
-      }
-    },
-    "statuses": {
-      "version": "1.5.0",
-      "dev": true
-    },
-    "stream-browserify": {
-      "version": "2.0.2",
-      "dev": true,
-      "requires": {
-        "inherits": "~2.0.1",
-        "readable-stream": "^2.0.2"
-      }
-    },
-    "stream-each": {
-      "version": "1.2.3",
-      "dev": true,
-      "requires": {
-        "end-of-stream": "^1.1.0",
-        "stream-shift": "^1.0.0"
-      }
-    },
-    "stream-exhaust": {
-      "version": "1.0.2",
-      "dev": true
-    },
-    "stream-http": {
-      "version": "2.8.3",
-      "dev": true,
-      "requires": {
-        "builtin-status-codes": "^3.0.0",
-        "inherits": "^2.0.1",
-        "readable-stream": "^2.3.6",
-        "to-arraybuffer": "^1.0.0",
-        "xtend": "^4.0.0"
-      }
-    },
-    "stream-shift": {
-      "version": "1.0.1",
-      "dev": true
-    },
-    "streamroller": {
-      "version": "3.0.2",
-      "dev": true,
-      "requires": {
-        "date-format": "^4.0.3",
-        "debug": "^4.1.1",
-        "fs-extra": "^10.0.0"
-      }
-    },
-    "string_decoder": {
-      "version": "1.1.1",
-      "dev": true,
-      "requires": {
-        "safe-buffer": "~5.1.0"
-      }
-    },
-    "string-width": {
-      "version": "4.2.3",
-      "dev": true,
-      "requires": {
-        "emoji-regex": "^8.0.0",
-        "is-fullwidth-code-point": "^3.0.0",
-        "strip-ansi": "^6.0.1"
-      }
-    },
-    "strip-ansi": {
-      "version": "6.0.1",
-      "dev": true,
-      "requires": {
-        "ansi-regex": "^5.0.1"
-      }
-    },
-    "strip-bom": {
-      "version": "2.0.0",
-      "dev": true,
-      "requires": {
-        "is-utf8": "^0.2.0"
-      }
-    },
-    "strip-bom-stream": {
-      "version": "2.0.0",
-      "dev": true,
-      "requires": {
-        "first-chunk-stream": "^2.0.0",
-        "strip-bom": "^2.0.0"
-      }
-    },
-    "strip-final-newline": {
-      "version": "2.0.0",
-      "dev": true
-    },
-    "strip-json-comments": {
-      "version": "3.1.1",
-      "dev": true
-    },
-    "supports-color": {
-      "version": "7.2.0",
-      "dev": true,
-      "requires": {
-        "has-flag": "^4.0.0"
-      }
-    },
-    "supports-preserve-symlinks-flag": {
-      "version": "1.0.0",
-      "dev": true
-    },
-    "sver-compat": {
-      "version": "1.5.0",
-      "dev": true,
-      "requires": {
-        "es6-iterator": "^2.0.1",
-        "es6-symbol": "^3.1.1"
-      }
-    },
-    "table": {
-      "version": "6.8.0",
-      "dev": true,
-      "requires": {
-        "ajv": "^8.0.1",
-        "lodash.truncate": "^4.4.2",
-        "slice-ansi": "^4.0.0",
-        "string-width": "^4.2.3",
-        "strip-ansi": "^6.0.1"
-      },
-      "dependencies": {
-        "ajv": {
-          "version": "8.10.0",
-          "dev": true,
-          "requires": {
-            "fast-deep-equal": "^3.1.1",
-            "json-schema-traverse": "^1.0.0",
-            "require-from-string": "^2.0.2",
-            "uri-js": "^4.2.2"
-          }
-        },
-        "json-schema-traverse": {
-          "version": "1.0.0",
-          "dev": true
-        }
-      }
-    },
-    "tapable": {
-      "version": "2.2.1",
-      "dev": true
-    },
-    "terser": {
-      "version": "4.8.0",
-      "dev": true,
-      "requires": {
-        "commander": "^2.20.0",
-        "source-map": "~0.6.1",
-        "source-map-support": "~0.5.12"
-      },
-      "dependencies": {
-        "commander": {
-          "version": "2.20.3",
-          "dev": true
-        }
-      }
-    },
-    "terser-webpack-plugin": {
-      "version": "5.3.1",
-      "dev": true,
-      "requires": {
-        "jest-worker": "^27.4.5",
-        "schema-utils": "^3.1.1",
-        "serialize-javascript": "^6.0.0",
-        "source-map": "^0.6.1",
-        "terser": "^5.7.2"
-      },
-      "dependencies": {
-        "acorn": {
-          "version": "8.7.0",
-          "dev": true,
-          "optional": true,
-          "peer": true
-        },
-        "commander": {
-          "version": "2.20.3",
-          "dev": true
-        },
-        "terser": {
-          "version": "5.10.0",
-          "dev": true,
-          "requires": {
-            "commander": "^2.20.0",
-            "source-map": "~0.7.2",
-            "source-map-support": "~0.5.20"
-          },
-          "dependencies": {
-            "source-map": {
-              "version": "0.7.3",
-              "dev": true
-            }
-          }
-        }
-      }
-    },
-    "text-table": {
-      "version": "0.2.0",
-      "dev": true
-    },
-    "three": {
-      "version": "0.137.5",
-      "peer": true
-    },
-    "threestrap": {
-      "version": "file:../threestrap",
-      "requires": {
-        "eslint": "^7.28.0",
-        "eslint-plugin-jasmine": "^4.1.2",
-        "gulp": "^4.0.2",
-        "gulp-eslint": "^6.0.0",
-        "gulp-watch": "^5.0.1",
-        "jasmine-core": "^3.7.1",
-        "karma": "^6.3.3",
-        "karma-chrome-launcher": "^3.1.0",
-        "karma-jasmine": "^4.0.1",
-        "prettier": "2.3.1",
-        "stats.js": "^0.17.0",
-        "webpack": "^5.38.1",
-        "webpack-cli": "^4.7.2",
-        "webpack-stream": "^6.1.2"
-      },
-      "dependencies": {
-        "@babel/code-frame": {
-          "version": "7.12.11",
-          "dev": true,
-          "requires": {
-            "@babel/highlight": "^7.10.4"
-          }
-        },
-        "@babel/helper-validator-identifier": {
-          "version": "7.14.5",
-          "dev": true
-        },
-        "@babel/highlight": {
-          "version": "7.14.5",
-          "dev": true,
-          "requires": {
-            "@babel/helper-validator-identifier": "^7.14.5",
-            "chalk": "^2.0.0",
-            "js-tokens": "^4.0.0"
-          },
-          "dependencies": {
-            "ansi-styles": {
-              "version": "3.2.1",
-              "dev": true,
-              "requires": {
-                "color-convert": "^1.9.0"
-              }
-            },
-            "chalk": {
-              "version": "2.4.2",
-              "dev": true,
-              "requires": {
-                "ansi-styles": "^3.2.1",
-                "escape-string-regexp": "^1.0.5",
-                "supports-color": "^5.3.0"
-              }
-            },
-            "color-convert": {
-              "version": "1.9.3",
-              "dev": true,
-              "requires": {
-                "color-name": "1.1.3"
-              }
-            },
-            "color-name": {
-              "version": "1.1.3",
-              "dev": true
-            },
-            "escape-string-regexp": {
-              "version": "1.0.5",
-              "dev": true
-            },
-            "has-flag": {
-              "version": "3.0.0",
-              "dev": true
-            },
-            "supports-color": {
-              "version": "5.5.0",
-              "dev": true,
-              "requires": {
-                "has-flag": "^3.0.0"
-              }
-            }
-          }
-        },
-        "@discoveryjs/json-ext": {
-          "version": "0.5.3",
-          "dev": true
-        },
-        "@eslint/eslintrc": {
-          "version": "0.4.2",
-          "dev": true,
-          "requires": {
-            "ajv": "^6.12.4",
-            "debug": "^4.1.1",
-            "espree": "^7.3.0",
-            "globals": "^13.9.0",
-            "ignore": "^4.0.6",
-            "import-fresh": "^3.2.1",
-            "js-yaml": "^3.13.1",
-            "minimatch": "^3.0.4",
-            "strip-json-comments": "^3.1.1"
-          }
-        },
-        "@types/component-emitter": {
-          "version": "1.2.10",
-          "dev": true
-        },
-        "@types/cookie": {
-          "version": "0.4.0",
-          "dev": true
-        },
-        "@types/cors": {
-          "version": "2.8.10",
-          "dev": true
-        },
-        "@types/eslint": {
-          "version": "7.2.13",
-          "dev": true,
-          "requires": {
-            "@types/estree": "*",
-            "@types/json-schema": "*"
-          }
-        },
-        "@types/eslint-scope": {
-          "version": "3.7.0",
-          "dev": true,
-          "requires": {
-            "@types/eslint": "*",
-            "@types/estree": "*"
-          }
-        },
-        "@types/estree": {
-          "version": "0.0.47",
-          "dev": true
-        },
-        "@types/json-schema": {
-          "version": "7.0.7",
-          "dev": true
-        },
-        "@types/node": {
-          "version": "15.12.2",
-          "dev": true
-        },
-        "@webassemblyjs/ast": {
-          "version": "1.11.0",
-          "dev": true,
-          "requires": {
-            "@webassemblyjs/helper-numbers": "1.11.0",
-            "@webassemblyjs/helper-wasm-bytecode": "1.11.0"
-          }
-        },
-        "@webassemblyjs/floating-point-hex-parser": {
-          "version": "1.11.0",
-          "dev": true
-        },
-        "@webassemblyjs/helper-api-error": {
-          "version": "1.11.0",
-          "dev": true
-        },
-        "@webassemblyjs/helper-buffer": {
-          "version": "1.11.0",
-          "dev": true
-        },
-        "@webassemblyjs/helper-code-frame": {
-          "version": "1.9.0",
-          "dev": true,
-          "requires": {
-            "@webassemblyjs/wast-printer": "1.9.0"
-          },
-          "dependencies": {
-            "@webassemblyjs/ast": {
-              "version": "1.9.0",
-              "dev": true,
-              "requires": {
-                "@webassemblyjs/helper-module-context": "1.9.0",
-                "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
-                "@webassemblyjs/wast-parser": "1.9.0"
-              }
-            },
-            "@webassemblyjs/helper-wasm-bytecode": {
-              "version": "1.9.0",
-              "dev": true
-            },
-            "@webassemblyjs/wast-printer": {
-              "version": "1.9.0",
-              "dev": true,
-              "requires": {
-                "@webassemblyjs/ast": "1.9.0",
-                "@webassemblyjs/wast-parser": "1.9.0",
-                "@xtuc/long": "4.2.2"
-              }
-            }
-          }
-        },
-        "@webassemblyjs/helper-fsm": {
-          "version": "1.9.0",
-          "dev": true
-        },
-        "@webassemblyjs/helper-module-context": {
-          "version": "1.9.0",
-          "dev": true,
-          "requires": {
-            "@webassemblyjs/ast": "1.9.0"
-          },
-          "dependencies": {
-            "@webassemblyjs/ast": {
-              "version": "1.9.0",
-              "dev": true,
-              "requires": {
-                "@webassemblyjs/helper-module-context": "1.9.0",
-                "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
-                "@webassemblyjs/wast-parser": "1.9.0"
-              }
-            },
-            "@webassemblyjs/helper-wasm-bytecode": {
-              "version": "1.9.0",
-              "dev": true
-            }
-          }
-        },
-        "@webassemblyjs/helper-numbers": {
-          "version": "1.11.0",
-          "dev": true,
-          "requires": {
-            "@webassemblyjs/floating-point-hex-parser": "1.11.0",
-            "@webassemblyjs/helper-api-error": "1.11.0",
-            "@xtuc/long": "4.2.2"
-          }
-        },
-        "@webassemblyjs/helper-wasm-bytecode": {
-          "version": "1.11.0",
-          "dev": true
-        },
-        "@webassemblyjs/helper-wasm-section": {
-          "version": "1.11.0",
-          "dev": true,
-          "requires": {
-            "@webassemblyjs/ast": "1.11.0",
-            "@webassemblyjs/helper-buffer": "1.11.0",
-            "@webassemblyjs/helper-wasm-bytecode": "1.11.0",
-            "@webassemblyjs/wasm-gen": "1.11.0"
-          }
-        },
-        "@webassemblyjs/ieee754": {
-          "version": "1.11.0",
-          "dev": true,
-          "requires": {
-            "@xtuc/ieee754": "^1.2.0"
-          }
-        },
-        "@webassemblyjs/leb128": {
-          "version": "1.11.0",
-          "dev": true,
-          "requires": {
-            "@xtuc/long": "4.2.2"
-          }
-        },
-        "@webassemblyjs/utf8": {
-          "version": "1.11.0",
-          "dev": true
-        },
-        "@webassemblyjs/wasm-edit": {
-          "version": "1.11.0",
-          "dev": true,
-          "requires": {
-            "@webassemblyjs/ast": "1.11.0",
-            "@webassemblyjs/helper-buffer": "1.11.0",
-            "@webassemblyjs/helper-wasm-bytecode": "1.11.0",
-            "@webassemblyjs/helper-wasm-section": "1.11.0",
-            "@webassemblyjs/wasm-gen": "1.11.0",
-            "@webassemblyjs/wasm-opt": "1.11.0",
-            "@webassemblyjs/wasm-parser": "1.11.0",
-            "@webassemblyjs/wast-printer": "1.11.0"
-          }
-        },
-        "@webassemblyjs/wasm-gen": {
-          "version": "1.11.0",
-          "dev": true,
-          "requires": {
-            "@webassemblyjs/ast": "1.11.0",
-            "@webassemblyjs/helper-wasm-bytecode": "1.11.0",
-            "@webassemblyjs/ieee754": "1.11.0",
-            "@webassemblyjs/leb128": "1.11.0",
-            "@webassemblyjs/utf8": "1.11.0"
-          }
-        },
-        "@webassemblyjs/wasm-opt": {
-          "version": "1.11.0",
-          "dev": true,
-          "requires": {
-            "@webassemblyjs/ast": "1.11.0",
-            "@webassemblyjs/helper-buffer": "1.11.0",
-            "@webassemblyjs/wasm-gen": "1.11.0",
-            "@webassemblyjs/wasm-parser": "1.11.0"
-          }
-        },
-        "@webassemblyjs/wasm-parser": {
-          "version": "1.11.0",
-          "dev": true,
-          "requires": {
-            "@webassemblyjs/ast": "1.11.0",
-            "@webassemblyjs/helper-api-error": "1.11.0",
-            "@webassemblyjs/helper-wasm-bytecode": "1.11.0",
-            "@webassemblyjs/ieee754": "1.11.0",
-            "@webassemblyjs/leb128": "1.11.0",
-            "@webassemblyjs/utf8": "1.11.0"
-          }
-        },
-        "@webassemblyjs/wast-parser": {
-          "version": "1.9.0",
-          "dev": true,
-          "requires": {
-            "@webassemblyjs/ast": "1.9.0",
-            "@webassemblyjs/floating-point-hex-parser": "1.9.0",
-            "@webassemblyjs/helper-api-error": "1.9.0",
-            "@webassemblyjs/helper-code-frame": "1.9.0",
-            "@webassemblyjs/helper-fsm": "1.9.0",
-            "@xtuc/long": "4.2.2"
-          },
-          "dependencies": {
-            "@webassemblyjs/ast": {
-              "version": "1.9.0",
-              "dev": true,
-              "requires": {
-                "@webassemblyjs/helper-module-context": "1.9.0",
-                "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
-                "@webassemblyjs/wast-parser": "1.9.0"
-              }
-            },
-            "@webassemblyjs/floating-point-hex-parser": {
-              "version": "1.9.0",
-              "dev": true
-            },
-            "@webassemblyjs/helper-api-error": {
-              "version": "1.9.0",
-              "dev": true
-            },
-            "@webassemblyjs/helper-wasm-bytecode": {
-              "version": "1.9.0",
-              "dev": true
-            }
-          }
-        },
-        "@webassemblyjs/wast-printer": {
-          "version": "1.11.0",
-          "dev": true,
-          "requires": {
-            "@webassemblyjs/ast": "1.11.0",
-            "@xtuc/long": "4.2.2"
-          }
-        },
-        "@webpack-cli/configtest": {
-          "version": "1.0.4",
-          "dev": true,
-          "requires": {}
-        },
-        "@webpack-cli/info": {
-          "version": "1.3.0",
-          "dev": true,
-          "requires": {
-            "envinfo": "^7.7.3"
-          }
-        },
-        "@webpack-cli/serve": {
-          "version": "1.5.1",
-          "dev": true,
-          "requires": {}
-        },
-        "@xtuc/ieee754": {
-          "version": "1.2.0",
-          "dev": true
-        },
-        "@xtuc/long": {
-          "version": "4.2.2",
-          "dev": true
-        },
-        "accepts": {
-          "version": "1.3.7",
-          "dev": true,
-          "requires": {
-            "mime-types": "~2.1.24",
-            "negotiator": "0.6.2"
-          }
-        },
-        "acorn": {
-          "version": "7.4.1",
-          "dev": true
-        },
-        "acorn-jsx": {
-          "version": "5.3.1",
-          "dev": true,
-          "requires": {}
-        },
-        "ajv": {
-          "version": "6.12.6",
-          "dev": true,
-          "requires": {
-            "fast-deep-equal": "^3.1.1",
-            "fast-json-stable-stringify": "^2.0.0",
-            "json-schema-traverse": "^0.4.1",
-            "uri-js": "^4.2.2"
-          }
-        },
-        "ajv-errors": {
-          "version": "1.0.1",
-          "dev": true,
-          "requires": {}
-        },
-        "ajv-keywords": {
-          "version": "3.5.2",
-          "dev": true,
-          "requires": {}
-        },
-        "ansi-colors": {
-          "version": "4.1.1",
-          "dev": true
-        },
-        "ansi-escapes": {
-          "version": "4.3.2",
-          "dev": true,
-          "requires": {
-            "type-fest": "^0.21.3"
-          },
-          "dependencies": {
-            "type-fest": {
-              "version": "0.21.3",
-              "dev": true
-            }
-          }
-        },
-        "ansi-gray": {
-          "version": "0.1.1",
-          "dev": true,
-          "requires": {
-            "ansi-wrap": "0.1.0"
-          }
-        },
-        "ansi-regex": {
-          "version": "5.0.0",
-          "dev": true
-        },
-        "ansi-styles": {
-          "version": "4.3.0",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "ansi-wrap": {
-          "version": "0.1.0",
-          "dev": true
-        },
-        "anymatch": {
-          "version": "2.0.0",
-          "dev": true,
-          "requires": {
-            "micromatch": "^3.1.4",
-            "normalize-path": "^2.1.1"
-          },
-          "dependencies": {
-            "normalize-path": {
-              "version": "2.1.1",
-              "dev": true,
-              "requires": {
-                "remove-trailing-separator": "^1.0.1"
-              }
-            }
-          }
-        },
-        "append-buffer": {
-          "version": "1.0.2",
-          "dev": true,
-          "requires": {
-            "buffer-equal": "^1.0.0"
-          }
-        },
-        "aproba": {
-          "version": "1.2.0",
-          "dev": true
-        },
-        "archy": {
-          "version": "1.0.0",
-          "dev": true
-        },
-        "argparse": {
-          "version": "1.0.10",
-          "dev": true,
-          "requires": {
-            "sprintf-js": "~1.0.2"
-          }
-        },
-        "arr-diff": {
-          "version": "4.0.0",
-          "dev": true
-        },
-        "arr-filter": {
-          "version": "1.1.2",
-          "dev": true,
-          "requires": {
-            "make-iterator": "^1.0.0"
-          }
-        },
-        "arr-flatten": {
-          "version": "1.1.0",
-          "dev": true
-        },
-        "arr-map": {
-          "version": "2.0.2",
-          "dev": true,
-          "requires": {
-            "make-iterator": "^1.0.0"
-          }
-        },
-        "arr-union": {
-          "version": "3.1.0",
-          "dev": true
-        },
-        "array-each": {
-          "version": "1.0.1",
-          "dev": true
-        },
-        "array-initial": {
-          "version": "1.1.0",
-          "dev": true,
-          "requires": {
-            "array-slice": "^1.0.0",
-            "is-number": "^4.0.0"
-          },
-          "dependencies": {
-            "is-number": {
-              "version": "4.0.0",
-              "dev": true
-            }
-          }
-        },
-        "array-last": {
-          "version": "1.3.0",
-          "dev": true,
-          "requires": {
-            "is-number": "^4.0.0"
-          },
-          "dependencies": {
-            "is-number": {
-              "version": "4.0.0",
-              "dev": true
-            }
-          }
-        },
-        "array-slice": {
-          "version": "1.1.0",
-          "dev": true
-        },
-        "array-sort": {
-          "version": "1.0.0",
-          "dev": true,
-          "requires": {
-            "default-compare": "^1.0.0",
-            "get-value": "^2.0.6",
-            "kind-of": "^5.0.2"
-          }
-        },
-        "array-unique": {
-          "version": "0.3.2",
-          "dev": true
-        },
-        "asn1.js": {
-          "version": "5.4.1",
-          "dev": true,
-          "requires": {
-            "bn.js": "^4.0.0",
-            "inherits": "^2.0.1",
-            "minimalistic-assert": "^1.0.0",
-            "safer-buffer": "^2.1.0"
-          },
-          "dependencies": {
-            "bn.js": {
-              "version": "4.12.0",
-              "dev": true
-            }
-          }
-        },
-        "assert": {
-          "version": "1.5.0",
-          "dev": true,
-          "requires": {
-            "object-assign": "^4.1.1",
-            "util": "0.10.3"
-          },
-          "dependencies": {
-            "inherits": {
-              "version": "2.0.1",
-              "dev": true
-            },
-            "util": {
-              "version": "0.10.3",
-              "dev": true,
-              "requires": {
-                "inherits": "2.0.1"
-              }
-            }
-          }
-        },
-        "assign-symbols": {
-          "version": "1.0.0",
-          "dev": true
-        },
-        "astral-regex": {
-          "version": "2.0.0",
-          "dev": true
-        },
-        "async-done": {
-          "version": "1.3.2",
-          "dev": true,
-          "requires": {
-            "end-of-stream": "^1.1.0",
-            "once": "^1.3.2",
-            "process-nextick-args": "^2.0.0",
-            "stream-exhaust": "^1.0.1"
-          }
-        },
-        "async-each": {
-          "version": "1.0.3",
-          "dev": true
-        },
-        "async-settle": {
-          "version": "1.0.0",
-          "dev": true,
-          "requires": {
-            "async-done": "^1.2.2"
-          }
-        },
-        "atob": {
-          "version": "2.1.2",
-          "dev": true
-        },
-        "bach": {
-          "version": "1.2.0",
-          "dev": true,
-          "requires": {
-            "arr-filter": "^1.1.1",
-            "arr-flatten": "^1.0.1",
-            "arr-map": "^2.0.0",
-            "array-each": "^1.0.0",
-            "array-initial": "^1.0.0",
-            "array-last": "^1.1.1",
-            "async-done": "^1.2.2",
-            "async-settle": "^1.0.0",
-            "now-and-later": "^2.0.0"
-          }
-        },
-        "balanced-match": {
-          "version": "1.0.2",
-          "dev": true
-        },
-        "base": {
-          "version": "0.11.2",
-          "dev": true,
-          "requires": {
-            "cache-base": "^1.0.1",
-            "class-utils": "^0.3.5",
-            "component-emitter": "^1.2.1",
-            "define-property": "^1.0.0",
-            "isobject": "^3.0.1",
-            "mixin-deep": "^1.2.0",
-            "pascalcase": "^0.1.1"
-          },
-          "dependencies": {
-            "define-property": {
-              "version": "1.0.0",
-              "dev": true,
-              "requires": {
-                "is-descriptor": "^1.0.0"
-              }
-            }
-          }
-        },
-        "base64-arraybuffer": {
-          "version": "0.1.4",
-          "dev": true
-        },
-        "base64-js": {
-          "version": "1.5.1",
-          "dev": true
-        },
-        "base64id": {
-          "version": "2.0.0",
-          "dev": true
-        },
-        "big.js": {
-          "version": "5.2.2",
-          "dev": true
-        },
-        "binary-extensions": {
-          "version": "1.13.1",
-          "dev": true
-        },
-        "bindings": {
-          "version": "1.5.0",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "file-uri-to-path": "1.0.0"
-          }
-        },
-        "bluebird": {
-          "version": "3.7.2",
-          "dev": true
-        },
-        "bn.js": {
-          "version": "5.2.0",
-          "dev": true
-        },
-        "body-parser": {
-          "version": "1.19.0",
-          "dev": true,
-          "requires": {
-            "bytes": "3.1.0",
-            "content-type": "~1.0.4",
-            "debug": "2.6.9",
-            "depd": "~1.1.2",
-            "http-errors": "1.7.2",
-            "iconv-lite": "0.4.24",
-            "on-finished": "~2.3.0",
-            "qs": "6.7.0",
-            "raw-body": "2.4.0",
-            "type-is": "~1.6.17"
-          },
-          "dependencies": {
-            "debug": {
-              "version": "2.6.9",
-              "dev": true,
-              "requires": {
-                "ms": "2.0.0"
-              }
-            },
-            "ms": {
-              "version": "2.0.0",
-              "dev": true
-            }
-          }
-        },
-        "brace-expansion": {
-          "version": "1.1.11",
-          "dev": true,
-          "requires": {
-            "balanced-match": "^1.0.0",
-            "concat-map": "0.0.1"
-          }
-        },
-        "braces": {
-          "version": "2.3.2",
-          "dev": true,
-          "requires": {
-            "arr-flatten": "^1.1.0",
-            "array-unique": "^0.3.2",
-            "extend-shallow": "^2.0.1",
-            "fill-range": "^4.0.0",
-            "isobject": "^3.0.1",
-            "repeat-element": "^1.1.2",
-            "snapdragon": "^0.8.1",
-            "snapdragon-node": "^2.0.1",
-            "split-string": "^3.0.2",
-            "to-regex": "^3.0.1"
-          }
-        },
-        "brorand": {
-          "version": "1.1.0",
-          "dev": true
-        },
-        "browserify-aes": {
-          "version": "1.2.0",
-          "dev": true,
-          "requires": {
-            "buffer-xor": "^1.0.3",
-            "cipher-base": "^1.0.0",
-            "create-hash": "^1.1.0",
-            "evp_bytestokey": "^1.0.3",
-            "inherits": "^2.0.1",
-            "safe-buffer": "^5.0.1"
-          }
-        },
-        "browserify-cipher": {
-          "version": "1.0.1",
-          "dev": true,
-          "requires": {
-            "browserify-aes": "^1.0.4",
-            "browserify-des": "^1.0.0",
-            "evp_bytestokey": "^1.0.0"
-          }
-        },
-        "browserify-des": {
-          "version": "1.0.2",
-          "dev": true,
-          "requires": {
-            "cipher-base": "^1.0.1",
-            "des.js": "^1.0.0",
-            "inherits": "^2.0.1",
-            "safe-buffer": "^5.1.2"
-          }
-        },
-        "browserify-rsa": {
-          "version": "4.1.0",
-          "dev": true,
-          "requires": {
-            "bn.js": "^5.0.0",
-            "randombytes": "^2.0.1"
-          }
-        },
-        "browserify-sign": {
-          "version": "4.2.1",
-          "dev": true,
-          "requires": {
-            "bn.js": "^5.1.1",
-            "browserify-rsa": "^4.0.1",
-            "create-hash": "^1.2.0",
-            "create-hmac": "^1.1.7",
-            "elliptic": "^6.5.3",
-            "inherits": "^2.0.4",
-            "parse-asn1": "^5.1.5",
-            "readable-stream": "^3.6.0",
-            "safe-buffer": "^5.2.0"
-          },
-          "dependencies": {
-            "readable-stream": {
-              "version": "3.6.0",
-              "dev": true,
-              "requires": {
-                "inherits": "^2.0.3",
-                "string_decoder": "^1.1.1",
-                "util-deprecate": "^1.0.1"
-              }
-            },
-            "safe-buffer": {
-              "version": "5.2.1",
-              "dev": true
-            }
-          }
-        },
-        "browserify-zlib": {
-          "version": "0.2.0",
-          "dev": true,
-          "requires": {
-            "pako": "~1.0.5"
-          }
-        },
-        "browserslist": {
-          "version": "4.16.6",
-          "dev": true,
-          "requires": {
-            "caniuse-lite": "^1.0.30001219",
-            "colorette": "^1.2.2",
-            "electron-to-chromium": "^1.3.723",
-            "escalade": "^3.1.1",
-            "node-releases": "^1.1.71"
-          }
-        },
-        "buffer": {
-          "version": "4.9.2",
-          "dev": true,
-          "requires": {
-            "base64-js": "^1.0.2",
-            "ieee754": "^1.1.4",
-            "isarray": "^1.0.0"
-          }
-        },
-        "buffer-equal": {
-          "version": "1.0.0",
-          "dev": true
-        },
-        "buffer-from": {
-          "version": "1.1.1",
-          "dev": true
-        },
-        "buffer-xor": {
-          "version": "1.0.3",
-          "dev": true
-        },
-        "builtin-status-codes": {
-          "version": "3.0.0",
-          "dev": true
-        },
-        "bytes": {
-          "version": "3.1.0",
-          "dev": true
-        },
-        "cacache": {
-          "version": "12.0.4",
-          "dev": true,
-          "requires": {
-            "bluebird": "^3.5.5",
-            "chownr": "^1.1.1",
-            "figgy-pudding": "^3.5.1",
-            "glob": "^7.1.4",
-            "graceful-fs": "^4.1.15",
-            "infer-owner": "^1.0.3",
-            "lru-cache": "^5.1.1",
-            "mississippi": "^3.0.0",
-            "mkdirp": "^0.5.1",
-            "move-concurrently": "^1.0.1",
-            "promise-inflight": "^1.0.1",
-            "rimraf": "^2.6.3",
-            "ssri": "^6.0.1",
-            "unique-filename": "^1.1.1",
-            "y18n": "^4.0.0"
-          },
-          "dependencies": {
-            "lru-cache": {
-              "version": "5.1.1",
-              "dev": true,
-              "requires": {
-                "yallist": "^3.0.2"
-              }
-            },
-            "rimraf": {
-              "version": "2.7.1",
-              "dev": true,
-              "requires": {
-                "glob": "^7.1.3"
-              }
-            },
-            "y18n": {
-              "version": "4.0.3",
-              "dev": true
-            },
-            "yallist": {
-              "version": "3.1.1",
-              "dev": true
-            }
-          }
-        },
-        "cache-base": {
-          "version": "1.0.1",
-          "dev": true,
-          "requires": {
-            "collection-visit": "^1.0.0",
-            "component-emitter": "^1.2.1",
-            "get-value": "^2.0.6",
-            "has-value": "^1.0.0",
-            "isobject": "^3.0.1",
-            "set-value": "^2.0.0",
-            "to-object-path": "^0.3.0",
-            "union-value": "^1.0.0",
-            "unset-value": "^1.0.0"
-          }
-        },
-        "call-bind": {
-          "version": "1.0.2",
-          "dev": true,
-          "requires": {
-            "function-bind": "^1.1.1",
-            "get-intrinsic": "^1.0.2"
-          }
-        },
-        "callsites": {
-          "version": "3.1.0",
-          "dev": true
-        },
-        "camelcase": {
-          "version": "3.0.0",
-          "dev": true
-        },
-        "caniuse-lite": {
-          "version": "1.0.30001237",
-          "dev": true
-        },
-        "chalk": {
-          "version": "4.1.1",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "chardet": {
-          "version": "0.7.0",
-          "dev": true
-        },
-        "chokidar": {
-          "version": "2.1.8",
-          "dev": true,
-          "requires": {
-            "anymatch": "^2.0.0",
-            "async-each": "^1.0.1",
-            "braces": "^2.3.2",
-            "fsevents": "^1.2.7",
-            "glob-parent": "^3.1.0",
-            "inherits": "^2.0.3",
-            "is-binary-path": "^1.0.0",
-            "is-glob": "^4.0.0",
-            "normalize-path": "^3.0.0",
-            "path-is-absolute": "^1.0.0",
-            "readdirp": "^2.2.1",
-            "upath": "^1.1.1"
-          },
-          "dependencies": {
-            "glob-parent": {
-              "version": "3.1.0",
-              "dev": true,
-              "requires": {
-                "is-glob": "^3.1.0",
-                "path-dirname": "^1.0.0"
-              },
-              "dependencies": {
-                "is-glob": {
-                  "version": "3.1.0",
-                  "dev": true,
-                  "requires": {
-                    "is-extglob": "^2.1.0"
-                  }
-                }
-              }
-            }
-          }
-        },
-        "chownr": {
-          "version": "1.1.4",
-          "dev": true
-        },
-        "chrome-trace-event": {
-          "version": "1.0.3",
-          "dev": true
-        },
-        "cipher-base": {
-          "version": "1.0.4",
-          "dev": true,
-          "requires": {
-            "inherits": "^2.0.1",
-            "safe-buffer": "^5.0.1"
-          }
-        },
-        "class-utils": {
-          "version": "0.3.6",
-          "dev": true,
-          "requires": {
-            "arr-union": "^3.1.0",
-            "define-property": "^0.2.5",
-            "isobject": "^3.0.0",
-            "static-extend": "^0.1.1"
-          },
-          "dependencies": {
-            "define-property": {
-              "version": "0.2.5",
-              "dev": true,
-              "requires": {
-                "is-descriptor": "^0.1.0"
-              }
-            },
-            "is-accessor-descriptor": {
-              "version": "0.1.6",
-              "dev": true,
-              "requires": {
-                "kind-of": "^3.0.2"
-              },
-              "dependencies": {
-                "kind-of": {
-                  "version": "3.2.2",
-                  "dev": true,
-                  "requires": {
-                    "is-buffer": "^1.1.5"
-                  }
-                }
-              }
-            },
-            "is-data-descriptor": {
-              "version": "0.1.4",
-              "dev": true,
-              "requires": {
-                "kind-of": "^3.0.2"
-              },
-              "dependencies": {
-                "kind-of": {
-                  "version": "3.2.2",
-                  "dev": true,
-                  "requires": {
-                    "is-buffer": "^1.1.5"
-                  }
-                }
-              }
-            },
-            "is-descriptor": {
-              "version": "0.1.6",
-              "dev": true,
-              "requires": {
-                "is-accessor-descriptor": "^0.1.6",
-                "is-data-descriptor": "^0.1.4",
-                "kind-of": "^5.0.0"
-              }
-            }
-          }
-        },
-        "cli-cursor": {
-          "version": "3.1.0",
-          "dev": true,
-          "requires": {
-            "restore-cursor": "^3.1.0"
-          }
-        },
-        "cli-width": {
-          "version": "3.0.0",
-          "dev": true
-        },
-        "cliui": {
-          "version": "3.2.0",
-          "dev": true,
-          "requires": {
-            "string-width": "^1.0.1",
-            "strip-ansi": "^3.0.1",
-            "wrap-ansi": "^2.0.0"
-          },
-          "dependencies": {
-            "ansi-regex": {
-              "version": "2.1.1",
-              "dev": true
-            },
-            "is-fullwidth-code-point": {
-              "version": "1.0.0",
-              "dev": true,
-              "requires": {
-                "number-is-nan": "^1.0.0"
-              }
-            },
-            "string-width": {
-              "version": "1.0.2",
-              "dev": true,
-              "requires": {
-                "code-point-at": "^1.0.0",
-                "is-fullwidth-code-point": "^1.0.0",
-                "strip-ansi": "^3.0.0"
-              }
-            },
-            "strip-ansi": {
-              "version": "3.0.1",
-              "dev": true,
-              "requires": {
-                "ansi-regex": "^2.0.0"
-              }
-            }
-          }
-        },
-        "clone": {
-          "version": "2.1.2",
-          "dev": true
-        },
-        "clone-buffer": {
-          "version": "1.0.0",
-          "dev": true
-        },
-        "clone-deep": {
-          "version": "4.0.1",
-          "dev": true,
-          "requires": {
-            "is-plain-object": "^2.0.4",
-            "kind-of": "^6.0.2",
-            "shallow-clone": "^3.0.0"
-          },
-          "dependencies": {
-            "is-plain-object": {
-              "version": "2.0.4",
-              "dev": true,
-              "requires": {
-                "isobject": "^3.0.1"
-              }
-            },
-            "kind-of": {
-              "version": "6.0.3",
-              "dev": true
-            }
-          }
-        },
-        "clone-stats": {
-          "version": "1.0.0",
-          "dev": true
-        },
-        "cloneable-readable": {
-          "version": "1.1.3",
-          "dev": true,
-          "requires": {
-            "inherits": "^2.0.1",
-            "process-nextick-args": "^2.0.0",
-            "readable-stream": "^2.3.5"
-          }
-        },
-        "code-point-at": {
-          "version": "1.1.0",
-          "dev": true
-        },
-        "collection-map": {
-          "version": "1.0.0",
-          "dev": true,
-          "requires": {
-            "arr-map": "^2.0.2",
-            "for-own": "^1.0.0",
-            "make-iterator": "^1.0.0"
-          }
-        },
-        "collection-visit": {
-          "version": "1.0.0",
-          "dev": true,
-          "requires": {
-            "map-visit": "^1.0.0",
-            "object-visit": "^1.0.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "dev": true
-        },
-        "color-support": {
-          "version": "1.1.3",
-          "dev": true
-        },
-        "colorette": {
-          "version": "1.2.2",
-          "dev": true
-        },
-        "colors": {
-          "version": "1.4.0",
-          "dev": true
-        },
-        "commander": {
-          "version": "2.20.3",
-          "dev": true
-        },
-        "commondir": {
-          "version": "1.0.1",
-          "dev": true
-        },
-        "component-emitter": {
-          "version": "1.3.0",
-          "dev": true
-        },
-        "concat-map": {
-          "version": "0.0.1",
-          "dev": true
-        },
-        "concat-stream": {
-          "version": "1.6.2",
-          "dev": true,
-          "requires": {
-            "buffer-from": "^1.0.0",
-            "inherits": "^2.0.3",
-            "readable-stream": "^2.2.2",
-            "typedarray": "^0.0.6"
-          }
-        },
-        "connect": {
-          "version": "3.7.0",
-          "dev": true,
-          "requires": {
-            "debug": "2.6.9",
-            "finalhandler": "1.1.2",
-            "parseurl": "~1.3.3",
-            "utils-merge": "1.0.1"
-          },
-          "dependencies": {
-            "debug": {
-              "version": "2.6.9",
-              "dev": true,
-              "requires": {
-                "ms": "2.0.0"
-              }
-            },
-            "ms": {
-              "version": "2.0.0",
-              "dev": true
-            }
-          }
-        },
-        "console-browserify": {
-          "version": "1.2.0",
-          "dev": true
-        },
-        "constants-browserify": {
-          "version": "1.0.0",
-          "dev": true
-        },
-        "content-type": {
-          "version": "1.0.4",
-          "dev": true
-        },
-        "convert-source-map": {
-          "version": "1.7.0",
-          "dev": true,
-          "requires": {
-            "safe-buffer": "~5.1.1"
-          }
-        },
-        "cookie": {
-          "version": "0.4.1",
-          "dev": true
-        },
-        "copy-concurrently": {
-          "version": "1.0.5",
-          "dev": true,
-          "requires": {
-            "aproba": "^1.1.1",
-            "fs-write-stream-atomic": "^1.0.8",
-            "iferr": "^0.1.5",
-            "mkdirp": "^0.5.1",
-            "rimraf": "^2.5.4",
-            "run-queue": "^1.0.0"
-          },
-          "dependencies": {
-            "rimraf": {
-              "version": "2.7.1",
-              "dev": true,
-              "requires": {
-                "glob": "^7.1.3"
-              }
-            }
-          }
-        },
-        "copy-descriptor": {
-          "version": "0.1.1",
-          "dev": true
-        },
-        "copy-props": {
-          "version": "2.0.5",
-          "dev": true,
-          "requires": {
-            "each-props": "^1.3.2",
-            "is-plain-object": "^5.0.0"
-          }
-        },
-        "core-util-is": {
-          "version": "1.0.2",
-          "dev": true
-        },
-        "cors": {
-          "version": "2.8.5",
-          "dev": true,
-          "requires": {
-            "object-assign": "^4",
-            "vary": "^1"
-          }
-        },
-        "create-ecdh": {
-          "version": "4.0.4",
-          "dev": true,
-          "requires": {
-            "bn.js": "^4.1.0",
-            "elliptic": "^6.5.3"
-          },
-          "dependencies": {
-            "bn.js": {
-              "version": "4.12.0",
-              "dev": true
-            }
-          }
-        },
-        "create-hash": {
-          "version": "1.2.0",
-          "dev": true,
-          "requires": {
-            "cipher-base": "^1.0.1",
-            "inherits": "^2.0.1",
-            "md5.js": "^1.3.4",
-            "ripemd160": "^2.0.1",
-            "sha.js": "^2.4.0"
-          }
-        },
-        "create-hmac": {
-          "version": "1.1.7",
-          "dev": true,
-          "requires": {
-            "cipher-base": "^1.0.3",
-            "create-hash": "^1.1.0",
-            "inherits": "^2.0.1",
-            "ripemd160": "^2.0.0",
-            "safe-buffer": "^5.0.1",
-            "sha.js": "^2.4.8"
-          }
-        },
-        "cross-spawn": {
-          "version": "7.0.3",
-          "dev": true,
-          "requires": {
-            "path-key": "^3.1.0",
-            "shebang-command": "^2.0.0",
-            "which": "^2.0.1"
-          }
-        },
-        "crypto-browserify": {
-          "version": "3.12.0",
-          "dev": true,
-          "requires": {
-            "browserify-cipher": "^1.0.0",
-            "browserify-sign": "^4.0.0",
-            "create-ecdh": "^4.0.0",
-            "create-hash": "^1.1.0",
-            "create-hmac": "^1.1.0",
-            "diffie-hellman": "^5.0.0",
-            "inherits": "^2.0.1",
-            "pbkdf2": "^3.0.3",
-            "public-encrypt": "^4.0.0",
-            "randombytes": "^2.0.0",
-            "randomfill": "^1.0.3"
-          }
-        },
-        "custom-event": {
-          "version": "1.0.1",
-          "dev": true
-        },
-        "cyclist": {
-          "version": "1.0.1",
-          "dev": true
-        },
-        "d": {
-          "version": "1.0.1",
-          "dev": true,
-          "requires": {
-            "es5-ext": "^0.10.50",
-            "type": "^1.0.1"
-          }
-        },
-        "date-format": {
-          "version": "3.0.0",
-          "dev": true
-        },
-        "debug": {
-          "version": "4.3.1",
-          "dev": true,
-          "requires": {
-            "ms": "2.1.2"
-          }
-        },
-        "decamelize": {
-          "version": "1.2.0",
-          "dev": true
-        },
-        "decode-uri-component": {
-          "version": "0.2.0",
-          "dev": true
-        },
-        "deep-is": {
-          "version": "0.1.3",
-          "dev": true
-        },
-        "default-compare": {
-          "version": "1.0.0",
-          "dev": true,
-          "requires": {
-            "kind-of": "^5.0.2"
-          }
-        },
-        "default-resolution": {
-          "version": "2.0.0",
-          "dev": true
-        },
-        "define-properties": {
-          "version": "1.1.3",
-          "dev": true,
-          "requires": {
-            "object-keys": "^1.0.12"
-          }
-        },
-        "define-property": {
-          "version": "2.0.2",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^1.0.2",
-            "isobject": "^3.0.1"
-          }
-        },
-        "depd": {
-          "version": "1.1.2",
-          "dev": true
-        },
-        "des.js": {
-          "version": "1.0.1",
-          "dev": true,
-          "requires": {
-            "inherits": "^2.0.1",
-            "minimalistic-assert": "^1.0.0"
-          }
-        },
-        "detect-file": {
-          "version": "1.0.0",
-          "dev": true
-        },
-        "di": {
-          "version": "0.0.1",
-          "dev": true
-        },
-        "diffie-hellman": {
-          "version": "5.0.3",
-          "dev": true,
-          "requires": {
-            "bn.js": "^4.1.0",
-            "miller-rabin": "^4.0.0",
-            "randombytes": "^2.0.0"
-          },
-          "dependencies": {
-            "bn.js": {
-              "version": "4.12.0",
-              "dev": true
-            }
-          }
-        },
-        "doctrine": {
-          "version": "3.0.0",
-          "dev": true,
-          "requires": {
-            "esutils": "^2.0.2"
-          }
-        },
-        "dom-serialize": {
-          "version": "2.2.1",
-          "dev": true,
-          "requires": {
-            "custom-event": "~1.0.0",
-            "ent": "~2.2.0",
-            "extend": "^3.0.0",
-            "void-elements": "^2.0.0"
-          }
-        },
-        "domain-browser": {
-          "version": "1.2.0",
-          "dev": true
-        },
-        "duplexify": {
-          "version": "3.7.1",
-          "dev": true,
-          "requires": {
-            "end-of-stream": "^1.0.0",
-            "inherits": "^2.0.1",
-            "readable-stream": "^2.0.0",
-            "stream-shift": "^1.0.0"
-          }
-        },
-        "each-props": {
-          "version": "1.3.2",
-          "dev": true,
-          "requires": {
-            "is-plain-object": "^2.0.1",
-            "object.defaults": "^1.1.0"
-          },
-          "dependencies": {
-            "is-plain-object": {
-              "version": "2.0.4",
-              "dev": true,
-              "requires": {
-                "isobject": "^3.0.1"
-              }
-            }
-          }
-        },
-        "ee-first": {
-          "version": "1.1.1",
-          "dev": true
-        },
-        "electron-to-chromium": {
-          "version": "1.3.752",
-          "dev": true
-        },
-        "elliptic": {
-          "version": "6.5.4",
-          "dev": true,
-          "requires": {
-            "bn.js": "^4.11.9",
-            "brorand": "^1.1.0",
-            "hash.js": "^1.0.0",
-            "hmac-drbg": "^1.0.1",
-            "inherits": "^2.0.4",
-            "minimalistic-assert": "^1.0.1",
-            "minimalistic-crypto-utils": "^1.0.1"
-          },
-          "dependencies": {
-            "bn.js": {
-              "version": "4.12.0",
-              "dev": true
-            }
-          }
-        },
-        "emoji-regex": {
-          "version": "8.0.0",
-          "dev": true
-        },
-        "emojis-list": {
-          "version": "3.0.0",
-          "dev": true
-        },
-        "encodeurl": {
-          "version": "1.0.2",
-          "dev": true
-        },
-        "end-of-stream": {
-          "version": "1.4.4",
-          "dev": true,
-          "requires": {
-            "once": "^1.4.0"
-          }
-        },
-        "engine.io": {
-          "version": "4.1.1",
-          "dev": true,
-          "requires": {
-            "accepts": "~1.3.4",
-            "base64id": "2.0.0",
-            "cookie": "~0.4.1",
-            "cors": "~2.8.5",
-            "debug": "~4.3.1",
-            "engine.io-parser": "~4.0.0",
-            "ws": "~7.4.2"
-          }
-        },
-        "engine.io-parser": {
-          "version": "4.0.2",
-          "dev": true,
-          "requires": {
-            "base64-arraybuffer": "0.1.4"
-          }
-        },
-        "enhanced-resolve": {
-          "version": "5.8.2",
-          "dev": true,
-          "requires": {
-            "graceful-fs": "^4.2.4",
-            "tapable": "^2.2.0"
-          }
-        },
-        "enquirer": {
-          "version": "2.3.6",
-          "dev": true,
-          "requires": {
-            "ansi-colors": "^4.1.1"
-          }
-        },
-        "ent": {
-          "version": "2.2.0",
-          "dev": true
-        },
-        "envinfo": {
-          "version": "7.8.1",
-          "dev": true
-        },
-        "errno": {
-          "version": "0.1.8",
-          "dev": true,
-          "requires": {
-            "prr": "~1.0.1"
-          }
-        },
-        "error-ex": {
-          "version": "1.3.2",
-          "dev": true,
-          "requires": {
-            "is-arrayish": "^0.2.1"
-          }
-        },
-        "es-module-lexer": {
-          "version": "0.4.1",
-          "dev": true
-        },
-        "es5-ext": {
-          "version": "0.10.53",
-          "dev": true,
-          "requires": {
-            "es6-iterator": "~2.0.3",
-            "es6-symbol": "~3.1.3",
-            "next-tick": "~1.0.0"
-          }
-        },
-        "es6-iterator": {
-          "version": "2.0.3",
-          "dev": true,
-          "requires": {
-            "d": "1",
-            "es5-ext": "^0.10.35",
-            "es6-symbol": "^3.1.1"
-          }
-        },
-        "es6-symbol": {
-          "version": "3.1.3",
-          "dev": true,
-          "requires": {
-            "d": "^1.0.1",
-            "ext": "^1.1.2"
-          }
-        },
-        "es6-weak-map": {
-          "version": "2.0.3",
-          "dev": true,
-          "requires": {
-            "d": "1",
-            "es5-ext": "^0.10.46",
-            "es6-iterator": "^2.0.3",
-            "es6-symbol": "^3.1.1"
-          }
-        },
-        "escalade": {
-          "version": "3.1.1",
-          "dev": true
-        },
-        "escape-html": {
-          "version": "1.0.3",
-          "dev": true
-        },
-        "escape-string-regexp": {
-          "version": "4.0.0",
-          "dev": true
-        },
-        "eslint": {
-          "version": "7.28.0",
-          "dev": true,
-          "requires": {
-            "@babel/code-frame": "7.12.11",
-            "@eslint/eslintrc": "^0.4.2",
-            "ajv": "^6.10.0",
-            "chalk": "^4.0.0",
-            "cross-spawn": "^7.0.2",
-            "debug": "^4.0.1",
-            "doctrine": "^3.0.0",
-            "enquirer": "^2.3.5",
-            "escape-string-regexp": "^4.0.0",
-            "eslint-scope": "^5.1.1",
-            "eslint-utils": "^2.1.0",
-            "eslint-visitor-keys": "^2.0.0",
-            "espree": "^7.3.1",
-            "esquery": "^1.4.0",
-            "esutils": "^2.0.2",
-            "fast-deep-equal": "^3.1.3",
-            "file-entry-cache": "^6.0.1",
-            "functional-red-black-tree": "^1.0.1",
-            "glob-parent": "^5.1.2",
-            "globals": "^13.6.0",
-            "ignore": "^4.0.6",
-            "import-fresh": "^3.0.0",
-            "imurmurhash": "^0.1.4",
-            "is-glob": "^4.0.0",
-            "js-yaml": "^3.13.1",
-            "json-stable-stringify-without-jsonify": "^1.0.1",
-            "levn": "^0.4.1",
-            "lodash.merge": "^4.6.2",
-            "minimatch": "^3.0.4",
-            "natural-compare": "^1.4.0",
-            "optionator": "^0.9.1",
-            "progress": "^2.0.0",
-            "regexpp": "^3.1.0",
-            "semver": "^7.2.1",
-            "strip-ansi": "^6.0.0",
-            "strip-json-comments": "^3.1.0",
-            "table": "^6.0.9",
-            "text-table": "^0.2.0",
-            "v8-compile-cache": "^2.0.3"
-          }
-        },
-        "eslint-plugin-jasmine": {
-          "version": "4.1.2",
-          "dev": true
-        },
-        "eslint-scope": {
-          "version": "5.1.1",
-          "dev": true,
-          "requires": {
-            "esrecurse": "^4.3.0",
-            "estraverse": "^4.1.1"
-          }
-        },
-        "eslint-utils": {
-          "version": "2.1.0",
-          "dev": true,
-          "requires": {
-            "eslint-visitor-keys": "^1.1.0"
-          },
-          "dependencies": {
-            "eslint-visitor-keys": {
-              "version": "1.3.0",
-              "dev": true
-            }
-          }
-        },
-        "eslint-visitor-keys": {
-          "version": "2.1.0",
-          "dev": true
-        },
-        "espree": {
-          "version": "7.3.1",
-          "dev": true,
-          "requires": {
-            "acorn": "^7.4.0",
-            "acorn-jsx": "^5.3.1",
-            "eslint-visitor-keys": "^1.3.0"
-          },
-          "dependencies": {
-            "eslint-visitor-keys": {
-              "version": "1.3.0",
-              "dev": true
-            }
-          }
-        },
-        "esprima": {
-          "version": "4.0.1",
-          "dev": true
-        },
-        "esquery": {
-          "version": "1.4.0",
-          "dev": true,
-          "requires": {
-            "estraverse": "^5.1.0"
-          },
-          "dependencies": {
-            "estraverse": {
-              "version": "5.2.0",
-              "dev": true
-            }
-          }
-        },
-        "esrecurse": {
-          "version": "4.3.0",
-          "dev": true,
-          "requires": {
-            "estraverse": "^5.2.0"
-          },
-          "dependencies": {
-            "estraverse": {
-              "version": "5.2.0",
-              "dev": true
-            }
-          }
-        },
-        "estraverse": {
-          "version": "4.3.0",
-          "dev": true
-        },
-        "esutils": {
-          "version": "2.0.3",
-          "dev": true
-        },
-        "eventemitter3": {
-          "version": "4.0.7",
-          "dev": true
-        },
-        "events": {
-          "version": "3.3.0",
-          "dev": true
-        },
-        "evp_bytestokey": {
-          "version": "1.0.3",
-          "dev": true,
-          "requires": {
-            "md5.js": "^1.3.4",
-            "safe-buffer": "^5.1.1"
-          }
-        },
-        "execa": {
-          "version": "5.1.1",
-          "dev": true,
-          "requires": {
-            "cross-spawn": "^7.0.3",
-            "get-stream": "^6.0.0",
-            "human-signals": "^2.1.0",
-            "is-stream": "^2.0.0",
-            "merge-stream": "^2.0.0",
-            "npm-run-path": "^4.0.1",
-            "onetime": "^5.1.2",
-            "signal-exit": "^3.0.3",
-            "strip-final-newline": "^2.0.0"
-          }
-        },
-        "expand-brackets": {
-          "version": "2.1.4",
-          "dev": true,
-          "requires": {
-            "debug": "^2.3.3",
-            "define-property": "^0.2.5",
-            "extend-shallow": "^2.0.1",
-            "posix-character-classes": "^0.1.0",
-            "regex-not": "^1.0.0",
-            "snapdragon": "^0.8.1",
-            "to-regex": "^3.0.1"
-          },
-          "dependencies": {
-            "debug": {
-              "version": "2.6.9",
-              "dev": true,
-              "requires": {
-                "ms": "2.0.0"
-              }
-            },
-            "define-property": {
-              "version": "0.2.5",
-              "dev": true,
-              "requires": {
-                "is-descriptor": "^0.1.0"
-              }
-            },
-            "is-accessor-descriptor": {
-              "version": "0.1.6",
-              "dev": true,
-              "requires": {
-                "kind-of": "^3.0.2"
-              },
-              "dependencies": {
-                "kind-of": {
-                  "version": "3.2.2",
-                  "dev": true,
-                  "requires": {
-                    "is-buffer": "^1.1.5"
-                  }
-                }
-              }
-            },
-            "is-data-descriptor": {
-              "version": "0.1.4",
-              "dev": true,
-              "requires": {
-                "kind-of": "^3.0.2"
-              },
-              "dependencies": {
-                "kind-of": {
-                  "version": "3.2.2",
-                  "dev": true,
-                  "requires": {
-                    "is-buffer": "^1.1.5"
-                  }
-                }
-              }
-            },
-            "is-descriptor": {
-              "version": "0.1.6",
-              "dev": true,
-              "requires": {
-                "is-accessor-descriptor": "^0.1.6",
-                "is-data-descriptor": "^0.1.4",
-                "kind-of": "^5.0.0"
-              }
-            },
-            "ms": {
-              "version": "2.0.0",
-              "dev": true
-            }
-          }
-        },
-        "expand-range": {
-          "version": "1.8.2",
-          "dev": true,
-          "requires": {
-            "fill-range": "^2.1.0"
-          },
-          "dependencies": {
-            "fill-range": {
-              "version": "2.2.4",
-              "dev": true,
-              "requires": {
-                "is-number": "^2.1.0",
-                "isobject": "^2.0.0",
-                "randomatic": "^3.0.0",
-                "repeat-element": "^1.1.2",
-                "repeat-string": "^1.5.2"
-              }
-            },
-            "is-number": {
-              "version": "2.1.0",
-              "dev": true,
-              "requires": {
-                "kind-of": "^3.0.2"
-              }
-            },
-            "isobject": {
-              "version": "2.1.0",
-              "dev": true,
-              "requires": {
-                "isarray": "1.0.0"
-              }
-            },
-            "kind-of": {
-              "version": "3.2.2",
-              "dev": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            }
-          }
-        },
-        "expand-tilde": {
-          "version": "2.0.2",
-          "dev": true,
-          "requires": {
-            "homedir-polyfill": "^1.0.1"
-          }
-        },
-        "ext": {
-          "version": "1.4.0",
-          "dev": true,
-          "requires": {
-            "type": "^2.0.0"
-          },
-          "dependencies": {
-            "type": {
-              "version": "2.5.0",
-              "dev": true
-            }
-          }
-        },
-        "extend": {
-          "version": "3.0.2",
-          "dev": true
-        },
-        "extend-shallow": {
-          "version": "2.0.1",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        },
-        "external-editor": {
-          "version": "3.1.0",
-          "dev": true,
-          "requires": {
-            "chardet": "^0.7.0",
-            "iconv-lite": "^0.4.24",
-            "tmp": "^0.0.33"
-          },
-          "dependencies": {
-            "tmp": {
-              "version": "0.0.33",
-              "dev": true,
-              "requires": {
-                "os-tmpdir": "~1.0.2"
-              }
-            }
-          }
-        },
-        "extglob": {
-          "version": "2.0.4",
-          "dev": true,
-          "requires": {
-            "array-unique": "^0.3.2",
-            "define-property": "^1.0.0",
-            "expand-brackets": "^2.1.4",
-            "extend-shallow": "^2.0.1",
-            "fragment-cache": "^0.2.1",
-            "regex-not": "^1.0.0",
-            "snapdragon": "^0.8.1",
-            "to-regex": "^3.0.1"
-          },
-          "dependencies": {
-            "define-property": {
-              "version": "1.0.0",
-              "dev": true,
-              "requires": {
-                "is-descriptor": "^1.0.0"
-              }
-            }
-          }
-        },
-        "fancy-log": {
-          "version": "1.3.3",
-          "dev": true,
-          "requires": {
-            "ansi-gray": "^0.1.1",
-            "color-support": "^1.1.3",
-            "parse-node-version": "^1.0.0",
-            "time-stamp": "^1.0.0"
-          }
-        },
-        "fast-deep-equal": {
-          "version": "3.1.3",
-          "dev": true
-        },
-        "fast-json-stable-stringify": {
-          "version": "2.1.0",
-          "dev": true
-        },
-        "fast-levenshtein": {
-          "version": "2.0.6",
-          "dev": true
-        },
-        "fastest-levenshtein": {
-          "version": "1.0.12",
-          "dev": true
-        },
-        "figgy-pudding": {
-          "version": "3.5.2",
-          "dev": true
-        },
-        "figures": {
-          "version": "3.2.0",
-          "dev": true,
-          "requires": {
-            "escape-string-regexp": "^1.0.5"
-          },
-          "dependencies": {
-            "escape-string-regexp": {
-              "version": "1.0.5",
-              "dev": true
-            }
-          }
-        },
-        "file-entry-cache": {
-          "version": "6.0.1",
-          "dev": true,
-          "requires": {
-            "flat-cache": "^3.0.4"
-          }
-        },
-        "file-uri-to-path": {
-          "version": "1.0.0",
-          "dev": true,
-          "optional": true
-        },
-        "filename-regex": {
-          "version": "2.0.1",
-          "dev": true
-        },
-        "fill-range": {
-          "version": "4.0.0",
-          "dev": true,
-          "requires": {
-            "extend-shallow": "^2.0.1",
-            "is-number": "^3.0.0",
-            "repeat-string": "^1.6.1",
-            "to-regex-range": "^2.1.0"
-          }
-        },
-        "finalhandler": {
-          "version": "1.1.2",
-          "dev": true,
-          "requires": {
-            "debug": "2.6.9",
-            "encodeurl": "~1.0.2",
-            "escape-html": "~1.0.3",
-            "on-finished": "~2.3.0",
-            "parseurl": "~1.3.3",
-            "statuses": "~1.5.0",
-            "unpipe": "~1.0.0"
-          },
-          "dependencies": {
-            "debug": {
-              "version": "2.6.9",
-              "dev": true,
-              "requires": {
-                "ms": "2.0.0"
-              }
-            },
-            "ms": {
-              "version": "2.0.0",
-              "dev": true
-            }
-          }
-        },
-        "find-cache-dir": {
-          "version": "2.1.0",
-          "dev": true,
-          "requires": {
-            "commondir": "^1.0.1",
-            "make-dir": "^2.0.0",
-            "pkg-dir": "^3.0.0"
-          },
-          "dependencies": {
-            "find-up": {
-              "version": "3.0.0",
-              "dev": true,
-              "requires": {
-                "locate-path": "^3.0.0"
-              }
-            },
-            "locate-path": {
-              "version": "3.0.0",
-              "dev": true,
-              "requires": {
-                "p-locate": "^3.0.0",
-                "path-exists": "^3.0.0"
-              }
-            },
-            "p-limit": {
-              "version": "2.3.0",
-              "dev": true,
-              "requires": {
-                "p-try": "^2.0.0"
-              }
-            },
-            "p-locate": {
-              "version": "3.0.0",
-              "dev": true,
-              "requires": {
-                "p-limit": "^2.0.0"
-              }
-            },
-            "path-exists": {
-              "version": "3.0.0",
-              "dev": true
-            },
-            "pkg-dir": {
-              "version": "3.0.0",
-              "dev": true,
-              "requires": {
-                "find-up": "^3.0.0"
-              }
-            }
-          }
-        },
-        "find-up": {
-          "version": "4.1.0",
-          "dev": true,
-          "requires": {
-            "locate-path": "^5.0.0",
-            "path-exists": "^4.0.0"
-          }
-        },
-        "findup-sync": {
-          "version": "3.0.0",
-          "dev": true,
-          "requires": {
-            "detect-file": "^1.0.0",
-            "is-glob": "^4.0.0",
-            "micromatch": "^3.0.4",
-            "resolve-dir": "^1.0.1"
-          }
-        },
-        "fined": {
-          "version": "1.2.0",
-          "dev": true,
-          "requires": {
-            "expand-tilde": "^2.0.2",
-            "is-plain-object": "^2.0.3",
-            "object.defaults": "^1.1.0",
-            "object.pick": "^1.2.0",
-            "parse-filepath": "^1.0.1"
-          },
-          "dependencies": {
-            "is-plain-object": {
-              "version": "2.0.4",
-              "dev": true,
-              "requires": {
-                "isobject": "^3.0.1"
-              }
-            }
-          }
-        },
-        "first-chunk-stream": {
-          "version": "2.0.0",
-          "dev": true,
-          "requires": {
-            "readable-stream": "^2.0.2"
-          }
-        },
-        "flagged-respawn": {
-          "version": "1.0.1",
-          "dev": true
-        },
-        "flat-cache": {
-          "version": "3.0.4",
-          "dev": true,
-          "requires": {
-            "flatted": "^3.1.0",
-            "rimraf": "^3.0.2"
-          }
-        },
-        "flatted": {
-          "version": "3.1.1",
-          "dev": true
-        },
-        "flush-write-stream": {
-          "version": "1.1.1",
-          "dev": true,
-          "requires": {
-            "inherits": "^2.0.3",
-            "readable-stream": "^2.3.6"
-          }
-        },
-        "follow-redirects": {
-          "version": "1.14.1",
-          "dev": true
-        },
-        "for-in": {
-          "version": "1.0.2",
-          "dev": true
-        },
-        "for-own": {
-          "version": "1.0.0",
-          "dev": true,
-          "requires": {
-            "for-in": "^1.0.1"
-          }
-        },
-        "fragment-cache": {
-          "version": "0.2.1",
-          "dev": true,
-          "requires": {
-            "map-cache": "^0.2.2"
-          }
-        },
-        "from2": {
-          "version": "2.3.0",
-          "dev": true,
-          "requires": {
-            "inherits": "^2.0.1",
-            "readable-stream": "^2.0.0"
-          }
-        },
-        "fs-extra": {
-          "version": "8.1.0",
-          "dev": true,
-          "requires": {
-            "graceful-fs": "^4.2.0",
-            "jsonfile": "^4.0.0",
-            "universalify": "^0.1.0"
-          }
-        },
-        "fs-mkdirp-stream": {
-          "version": "1.0.0",
-          "dev": true,
-          "requires": {
-            "graceful-fs": "^4.1.11",
-            "through2": "^2.0.3"
-          }
-        },
-        "fs-write-stream-atomic": {
-          "version": "1.0.10",
-          "dev": true,
-          "requires": {
-            "graceful-fs": "^4.1.2",
-            "iferr": "^0.1.5",
-            "imurmurhash": "^0.1.4",
-            "readable-stream": "1 || 2"
-          }
-        },
-        "fs.realpath": {
-          "version": "1.0.0",
-          "dev": true
-        },
-        "fsevents": {
-          "version": "1.2.13",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "bindings": "^1.5.0",
-            "nan": "^2.12.1"
-          }
-        },
-        "function-bind": {
-          "version": "1.1.1",
-          "dev": true
-        },
-        "functional-red-black-tree": {
-          "version": "1.0.1",
-          "dev": true
-        },
-        "get-caller-file": {
-          "version": "1.0.3",
-          "dev": true
-        },
-        "get-intrinsic": {
-          "version": "1.1.1",
-          "dev": true,
-          "requires": {
-            "function-bind": "^1.1.1",
-            "has": "^1.0.3",
-            "has-symbols": "^1.0.1"
-          }
-        },
-        "get-stream": {
-          "version": "6.0.1",
-          "dev": true
-        },
-        "get-value": {
-          "version": "2.0.6",
-          "dev": true
-        },
-        "glob": {
-          "version": "7.1.7",
-          "dev": true,
-          "requires": {
-            "fs.realpath": "^1.0.0",
-            "inflight": "^1.0.4",
-            "inherits": "2",
-            "minimatch": "^3.0.4",
-            "once": "^1.3.0",
-            "path-is-absolute": "^1.0.0"
-          }
-        },
-        "glob-base": {
-          "version": "0.3.0",
-          "dev": true,
-          "requires": {
-            "glob-parent": "^2.0.0",
-            "is-glob": "^2.0.0"
-          },
-          "dependencies": {
-            "glob-parent": {
-              "version": "2.0.0",
-              "dev": true,
-              "requires": {
-                "is-glob": "^2.0.0"
-              }
-            },
-            "is-extglob": {
-              "version": "1.0.0",
-              "dev": true
-            },
-            "is-glob": {
-              "version": "2.0.1",
-              "dev": true,
-              "requires": {
-                "is-extglob": "^1.0.0"
-              }
-            }
-          }
-        },
-        "glob-parent": {
-          "version": "5.1.2",
-          "dev": true,
-          "requires": {
-            "is-glob": "^4.0.1"
-          }
-        },
-        "glob-stream": {
-          "version": "6.1.0",
-          "dev": true,
-          "requires": {
-            "extend": "^3.0.0",
-            "glob": "^7.1.1",
-            "glob-parent": "^3.1.0",
-            "is-negated-glob": "^1.0.0",
-            "ordered-read-streams": "^1.0.0",
-            "pumpify": "^1.3.5",
-            "readable-stream": "^2.1.5",
-            "remove-trailing-separator": "^1.0.1",
-            "to-absolute-glob": "^2.0.0",
-            "unique-stream": "^2.0.2"
-          },
-          "dependencies": {
-            "glob-parent": {
-              "version": "3.1.0",
-              "dev": true,
-              "requires": {
-                "is-glob": "^3.1.0",
-                "path-dirname": "^1.0.0"
-              }
-            },
-            "is-glob": {
-              "version": "3.1.0",
-              "dev": true,
-              "requires": {
-                "is-extglob": "^2.1.0"
-              }
-            }
-          }
-        },
-        "glob-to-regexp": {
-          "version": "0.4.1",
-          "dev": true
-        },
-        "glob-watcher": {
-          "version": "5.0.5",
-          "dev": true,
-          "requires": {
-            "anymatch": "^2.0.0",
-            "async-done": "^1.2.0",
-            "chokidar": "^2.0.0",
-            "is-negated-glob": "^1.0.0",
-            "just-debounce": "^1.0.0",
-            "normalize-path": "^3.0.0",
-            "object.defaults": "^1.1.0"
-          }
-        },
-        "global-modules": {
-          "version": "1.0.0",
-          "dev": true,
-          "requires": {
-            "global-prefix": "^1.0.1",
-            "is-windows": "^1.0.1",
-            "resolve-dir": "^1.0.0"
-          }
-        },
-        "global-prefix": {
-          "version": "1.0.2",
-          "dev": true,
-          "requires": {
-            "expand-tilde": "^2.0.2",
-            "homedir-polyfill": "^1.0.1",
-            "ini": "^1.3.4",
-            "is-windows": "^1.0.1",
-            "which": "^1.2.14"
-          },
-          "dependencies": {
-            "which": {
-              "version": "1.3.1",
-              "dev": true,
-              "requires": {
-                "isexe": "^2.0.0"
-              }
-            }
-          }
-        },
-        "globals": {
-          "version": "13.9.0",
-          "dev": true,
-          "requires": {
-            "type-fest": "^0.20.2"
-          }
-        },
-        "glogg": {
-          "version": "1.0.2",
-          "dev": true,
-          "requires": {
-            "sparkles": "^1.0.0"
-          }
-        },
-        "graceful-fs": {
-          "version": "4.2.6",
-          "dev": true
-        },
-        "gulp": {
-          "version": "4.0.2",
-          "dev": true,
-          "requires": {
-            "glob-watcher": "^5.0.3",
-            "gulp-cli": "^2.2.0",
-            "undertaker": "^1.2.1",
-            "vinyl-fs": "^3.0.0"
-          }
-        },
-        "gulp-cli": {
-          "version": "2.3.0",
-          "dev": true,
-          "requires": {
-            "ansi-colors": "^1.0.1",
-            "archy": "^1.0.0",
-            "array-sort": "^1.0.0",
-            "color-support": "^1.1.3",
-            "concat-stream": "^1.6.0",
-            "copy-props": "^2.0.1",
-            "fancy-log": "^1.3.2",
-            "gulplog": "^1.0.0",
-            "interpret": "^1.4.0",
-            "isobject": "^3.0.1",
-            "liftoff": "^3.1.0",
-            "matchdep": "^2.0.0",
-            "mute-stdout": "^1.0.0",
-            "pretty-hrtime": "^1.0.0",
-            "replace-homedir": "^1.0.0",
-            "semver-greatest-satisfied-range": "^1.1.0",
-            "v8flags": "^3.2.0",
-            "yargs": "^7.1.0"
-          },
-          "dependencies": {
-            "ansi-colors": {
-              "version": "1.1.0",
-              "dev": true,
-              "requires": {
-                "ansi-wrap": "^0.1.0"
-              }
-            }
-          }
-        },
-        "gulp-eslint": {
-          "version": "6.0.0",
-          "dev": true,
-          "requires": {
-            "eslint": "^6.0.0",
-            "fancy-log": "^1.3.2",
-            "plugin-error": "^1.0.1"
-          },
-          "dependencies": {
-            "ansi-regex": {
-              "version": "4.1.0",
-              "dev": true
-            },
-            "ansi-styles": {
-              "version": "3.2.1",
-              "dev": true,
-              "requires": {
-                "color-convert": "^1.9.0"
-              }
-            },
-            "astral-regex": {
-              "version": "1.0.0",
-              "dev": true
-            },
-            "chalk": {
-              "version": "2.4.2",
-              "dev": true,
-              "requires": {
-                "ansi-styles": "^3.2.1",
-                "escape-string-regexp": "^1.0.5",
-                "supports-color": "^5.3.0"
-              }
-            },
-            "color-convert": {
-              "version": "1.9.3",
-              "dev": true,
-              "requires": {
-                "color-name": "1.1.3"
-              }
-            },
-            "color-name": {
-              "version": "1.1.3",
-              "dev": true
-            },
-            "cross-spawn": {
-              "version": "6.0.5",
-              "dev": true,
-              "requires": {
-                "nice-try": "^1.0.4",
-                "path-key": "^2.0.1",
-                "semver": "^5.5.0",
-                "shebang-command": "^1.2.0",
-                "which": "^1.2.9"
-              },
-              "dependencies": {
-                "semver": {
-                  "version": "5.7.1",
-                  "dev": true
-                }
-              }
-            },
-            "emoji-regex": {
-              "version": "7.0.3",
-              "dev": true
-            },
-            "escape-string-regexp": {
-              "version": "1.0.5",
-              "dev": true
-            },
-            "eslint": {
-              "version": "6.8.0",
-              "dev": true,
-              "requires": {
-                "@babel/code-frame": "^7.0.0",
-                "ajv": "^6.10.0",
-                "chalk": "^2.1.0",
-                "cross-spawn": "^6.0.5",
-                "debug": "^4.0.1",
-                "doctrine": "^3.0.0",
-                "eslint-scope": "^5.0.0",
-                "eslint-utils": "^1.4.3",
-                "eslint-visitor-keys": "^1.1.0",
-                "espree": "^6.1.2",
-                "esquery": "^1.0.1",
-                "esutils": "^2.0.2",
-                "file-entry-cache": "^5.0.1",
-                "functional-red-black-tree": "^1.0.1",
-                "glob-parent": "^5.0.0",
-                "globals": "^12.1.0",
-                "ignore": "^4.0.6",
-                "import-fresh": "^3.0.0",
-                "imurmurhash": "^0.1.4",
-                "inquirer": "^7.0.0",
-                "is-glob": "^4.0.0",
-                "js-yaml": "^3.13.1",
-                "json-stable-stringify-without-jsonify": "^1.0.1",
-                "levn": "^0.3.0",
-                "lodash": "^4.17.14",
-                "minimatch": "^3.0.4",
-                "mkdirp": "^0.5.1",
-                "natural-compare": "^1.4.0",
-                "optionator": "^0.8.3",
-                "progress": "^2.0.0",
-                "regexpp": "^2.0.1",
-                "semver": "^6.1.2",
-                "strip-ansi": "^5.2.0",
-                "strip-json-comments": "^3.0.1",
-                "table": "^5.2.3",
-                "text-table": "^0.2.0",
-                "v8-compile-cache": "^2.0.3"
-              }
-            },
-            "eslint-utils": {
-              "version": "1.4.3",
-              "dev": true,
-              "requires": {
-                "eslint-visitor-keys": "^1.1.0"
-              }
-            },
-            "eslint-visitor-keys": {
-              "version": "1.3.0",
-              "dev": true
-            },
-            "espree": {
-              "version": "6.2.1",
-              "dev": true,
-              "requires": {
-                "acorn": "^7.1.1",
-                "acorn-jsx": "^5.2.0",
-                "eslint-visitor-keys": "^1.1.0"
-              }
-            },
-            "file-entry-cache": {
-              "version": "5.0.1",
-              "dev": true,
-              "requires": {
-                "flat-cache": "^2.0.1"
-              }
-            },
-            "flat-cache": {
-              "version": "2.0.1",
-              "dev": true,
-              "requires": {
-                "flatted": "^2.0.0",
-                "rimraf": "2.6.3",
-                "write": "1.0.3"
-              }
-            },
-            "flatted": {
-              "version": "2.0.2",
-              "dev": true
-            },
-            "globals": {
-              "version": "12.4.0",
-              "dev": true,
-              "requires": {
-                "type-fest": "^0.8.1"
-              }
-            },
-            "has-flag": {
-              "version": "3.0.0",
-              "dev": true
-            },
-            "is-fullwidth-code-point": {
-              "version": "2.0.0",
-              "dev": true
-            },
-            "levn": {
-              "version": "0.3.0",
-              "dev": true,
-              "requires": {
-                "prelude-ls": "~1.1.2",
-                "type-check": "~0.3.2"
-              }
-            },
-            "optionator": {
-              "version": "0.8.3",
-              "dev": true,
-              "requires": {
-                "deep-is": "~0.1.3",
-                "fast-levenshtein": "~2.0.6",
-                "levn": "~0.3.0",
-                "prelude-ls": "~1.1.2",
-                "type-check": "~0.3.2",
-                "word-wrap": "~1.2.3"
-              }
-            },
-            "path-key": {
-              "version": "2.0.1",
-              "dev": true
-            },
-            "prelude-ls": {
-              "version": "1.1.2",
-              "dev": true
-            },
-            "regexpp": {
-              "version": "2.0.1",
-              "dev": true
-            },
-            "rimraf": {
-              "version": "2.6.3",
-              "dev": true,
-              "requires": {
-                "glob": "^7.1.3"
-              }
-            },
-            "semver": {
-              "version": "6.3.0",
-              "dev": true
-            },
-            "shebang-command": {
-              "version": "1.2.0",
-              "dev": true,
-              "requires": {
-                "shebang-regex": "^1.0.0"
-              }
-            },
-            "shebang-regex": {
-              "version": "1.0.0",
-              "dev": true
-            },
-            "slice-ansi": {
-              "version": "2.1.0",
-              "dev": true,
-              "requires": {
-                "ansi-styles": "^3.2.0",
-                "astral-regex": "^1.0.0",
-                "is-fullwidth-code-point": "^2.0.0"
-              }
-            },
-            "string-width": {
-              "version": "3.1.0",
-              "dev": true,
-              "requires": {
-                "emoji-regex": "^7.0.1",
-                "is-fullwidth-code-point": "^2.0.0",
-                "strip-ansi": "^5.1.0"
-              }
-            },
-            "strip-ansi": {
-              "version": "5.2.0",
-              "dev": true,
-              "requires": {
-                "ansi-regex": "^4.1.0"
-              }
-            },
-            "supports-color": {
-              "version": "5.5.0",
-              "dev": true,
-              "requires": {
-                "has-flag": "^3.0.0"
-              }
-            },
-            "table": {
-              "version": "5.4.6",
-              "dev": true,
-              "requires": {
-                "ajv": "^6.10.2",
-                "lodash": "^4.17.14",
-                "slice-ansi": "^2.1.0",
-                "string-width": "^3.0.0"
-              }
-            },
-            "type-check": {
-              "version": "0.3.2",
-              "dev": true,
-              "requires": {
-                "prelude-ls": "~1.1.2"
-              }
-            },
-            "type-fest": {
-              "version": "0.8.1",
-              "dev": true
-            },
-            "which": {
-              "version": "1.3.1",
-              "dev": true,
-              "requires": {
-                "isexe": "^2.0.0"
-              }
-            }
-          }
-        },
-        "gulp-watch": {
-          "version": "5.0.1",
-          "dev": true,
-          "requires": {
-            "ansi-colors": "1.1.0",
-            "anymatch": "^1.3.0",
-            "chokidar": "^2.0.0",
-            "fancy-log": "1.3.2",
-            "glob-parent": "^3.0.1",
-            "object-assign": "^4.1.0",
-            "path-is-absolute": "^1.0.1",
-            "plugin-error": "1.0.1",
-            "readable-stream": "^2.2.2",
-            "slash": "^1.0.0",
-            "vinyl": "^2.1.0",
-            "vinyl-file": "^2.0.0"
-          },
-          "dependencies": {
-            "ansi-colors": {
-              "version": "1.1.0",
-              "dev": true,
-              "requires": {
-                "ansi-wrap": "^0.1.0"
-              }
-            },
-            "anymatch": {
-              "version": "1.3.2",
-              "dev": true,
-              "requires": {
-                "micromatch": "^2.1.5",
-                "normalize-path": "^2.0.0"
-              }
-            },
-            "arr-diff": {
-              "version": "2.0.0",
-              "dev": true,
-              "requires": {
-                "arr-flatten": "^1.0.1"
-              }
-            },
-            "array-unique": {
-              "version": "0.2.1",
-              "dev": true
-            },
-            "braces": {
-              "version": "1.8.5",
-              "dev": true,
-              "requires": {
-                "expand-range": "^1.8.1",
-                "preserve": "^0.2.0",
-                "repeat-element": "^1.1.2"
-              }
-            },
-            "expand-brackets": {
-              "version": "0.1.5",
-              "dev": true,
-              "requires": {
-                "is-posix-bracket": "^0.1.0"
-              }
-            },
-            "extglob": {
-              "version": "0.3.2",
-              "dev": true,
-              "requires": {
-                "is-extglob": "^1.0.0"
-              },
-              "dependencies": {
-                "is-extglob": {
-                  "version": "1.0.0",
-                  "dev": true
-                }
-              }
-            },
-            "fancy-log": {
-              "version": "1.3.2",
-              "dev": true,
-              "requires": {
-                "ansi-gray": "^0.1.1",
-                "color-support": "^1.1.3",
-                "time-stamp": "^1.0.0"
-              }
-            },
-            "glob-parent": {
-              "version": "3.1.0",
-              "dev": true,
-              "requires": {
-                "is-glob": "^3.1.0",
-                "path-dirname": "^1.0.0"
-              }
-            },
-            "is-glob": {
-              "version": "3.1.0",
-              "dev": true,
-              "requires": {
-                "is-extglob": "^2.1.0"
-              }
-            },
-            "kind-of": {
-              "version": "3.2.2",
-              "dev": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            },
-            "micromatch": {
-              "version": "2.3.11",
-              "dev": true,
-              "requires": {
-                "arr-diff": "^2.0.0",
-                "array-unique": "^0.2.1",
-                "braces": "^1.8.2",
-                "expand-brackets": "^0.1.4",
-                "extglob": "^0.3.1",
-                "filename-regex": "^2.0.0",
-                "is-extglob": "^1.0.0",
-                "is-glob": "^2.0.1",
-                "kind-of": "^3.0.2",
-                "normalize-path": "^2.0.1",
-                "object.omit": "^2.0.0",
-                "parse-glob": "^3.0.4",
-                "regex-cache": "^0.4.2"
-              },
-              "dependencies": {
-                "is-extglob": {
-                  "version": "1.0.0",
-                  "dev": true
-                },
-                "is-glob": {
-                  "version": "2.0.1",
-                  "dev": true,
-                  "requires": {
-                    "is-extglob": "^1.0.0"
-                  }
-                }
-              }
-            },
-            "normalize-path": {
-              "version": "2.1.1",
-              "dev": true,
-              "requires": {
-                "remove-trailing-separator": "^1.0.1"
-              }
-            }
-          }
-        },
-        "gulplog": {
-          "version": "1.0.0",
-          "dev": true,
-          "requires": {
-            "glogg": "^1.0.0"
-          }
-        },
-        "has": {
-          "version": "1.0.3",
-          "dev": true,
-          "requires": {
-            "function-bind": "^1.1.1"
-          }
-        },
-        "has-flag": {
-          "version": "4.0.0",
-          "dev": true
-        },
-        "has-symbols": {
-          "version": "1.0.2",
-          "dev": true
-        },
-        "has-value": {
-          "version": "1.0.0",
-          "dev": true,
-          "requires": {
-            "get-value": "^2.0.6",
-            "has-values": "^1.0.0",
-            "isobject": "^3.0.0"
-          }
-        },
-        "has-values": {
-          "version": "1.0.0",
-          "dev": true,
-          "requires": {
-            "is-number": "^3.0.0",
-            "kind-of": "^4.0.0"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "4.0.0",
-              "dev": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            }
-          }
-        },
-        "hash-base": {
-          "version": "3.1.0",
-          "dev": true,
-          "requires": {
-            "inherits": "^2.0.4",
-            "readable-stream": "^3.6.0",
-            "safe-buffer": "^5.2.0"
-          },
-          "dependencies": {
-            "readable-stream": {
-              "version": "3.6.0",
-              "dev": true,
-              "requires": {
-                "inherits": "^2.0.3",
-                "string_decoder": "^1.1.1",
-                "util-deprecate": "^1.0.1"
-              }
-            },
-            "safe-buffer": {
-              "version": "5.2.1",
-              "dev": true
-            }
-          }
-        },
-        "hash.js": {
-          "version": "1.1.7",
-          "dev": true,
-          "requires": {
-            "inherits": "^2.0.3",
-            "minimalistic-assert": "^1.0.1"
-          }
-        },
-        "hmac-drbg": {
-          "version": "1.0.1",
-          "dev": true,
-          "requires": {
-            "hash.js": "^1.0.3",
-            "minimalistic-assert": "^1.0.0",
-            "minimalistic-crypto-utils": "^1.0.1"
-          }
-        },
-        "homedir-polyfill": {
-          "version": "1.0.3",
-          "dev": true,
-          "requires": {
-            "parse-passwd": "^1.0.0"
-          }
-        },
-        "hosted-git-info": {
-          "version": "2.8.9",
-          "dev": true
-        },
-        "http-errors": {
-          "version": "1.7.2",
-          "dev": true,
-          "requires": {
-            "depd": "~1.1.2",
-            "inherits": "2.0.3",
-            "setprototypeof": "1.1.1",
-            "statuses": ">= 1.5.0 < 2",
-            "toidentifier": "1.0.0"
-          },
-          "dependencies": {
-            "inherits": {
-              "version": "2.0.3",
-              "dev": true
-            }
-          }
-        },
-        "http-proxy": {
-          "version": "1.18.1",
-          "dev": true,
-          "requires": {
-            "eventemitter3": "^4.0.0",
-            "follow-redirects": "^1.0.0",
-            "requires-port": "^1.0.0"
-          }
-        },
-        "https-browserify": {
-          "version": "1.0.0",
-          "dev": true
-        },
-        "human-signals": {
-          "version": "2.1.0",
-          "dev": true
-        },
-        "iconv-lite": {
-          "version": "0.4.24",
-          "dev": true,
-          "requires": {
-            "safer-buffer": ">= 2.1.2 < 3"
-          }
-        },
-        "ieee754": {
-          "version": "1.2.1",
-          "dev": true
-        },
-        "iferr": {
-          "version": "0.1.5",
-          "dev": true
-        },
-        "ignore": {
-          "version": "4.0.6",
-          "dev": true
-        },
-        "import-fresh": {
-          "version": "3.3.0",
-          "dev": true,
-          "requires": {
-            "parent-module": "^1.0.0",
-            "resolve-from": "^4.0.0"
-          }
-        },
-        "import-local": {
-          "version": "3.0.2",
-          "dev": true,
-          "requires": {
-            "pkg-dir": "^4.2.0",
-            "resolve-cwd": "^3.0.0"
-          }
-        },
-        "imurmurhash": {
-          "version": "0.1.4",
-          "dev": true
-        },
-        "infer-owner": {
-          "version": "1.0.4",
-          "dev": true
-        },
-        "inflight": {
-          "version": "1.0.6",
-          "dev": true,
-          "requires": {
-            "once": "^1.3.0",
-            "wrappy": "1"
-          }
-        },
-        "inherits": {
-          "version": "2.0.4",
-          "dev": true
-        },
-        "ini": {
-          "version": "1.3.8",
-          "dev": true
-        },
-        "inquirer": {
-          "version": "7.3.3",
-          "dev": true,
-          "requires": {
-            "ansi-escapes": "^4.2.1",
-            "chalk": "^4.1.0",
-            "cli-cursor": "^3.1.0",
-            "cli-width": "^3.0.0",
-            "external-editor": "^3.0.3",
-            "figures": "^3.0.0",
-            "lodash": "^4.17.19",
-            "mute-stream": "0.0.8",
-            "run-async": "^2.4.0",
-            "rxjs": "^6.6.0",
-            "string-width": "^4.1.0",
-            "strip-ansi": "^6.0.0",
-            "through": "^2.3.6"
-          }
-        },
-        "interpret": {
-          "version": "1.4.0",
-          "dev": true
-        },
-        "invert-kv": {
-          "version": "1.0.0",
-          "dev": true
-        },
-        "is-absolute": {
-          "version": "1.0.0",
-          "dev": true,
-          "requires": {
-            "is-relative": "^1.0.0",
-            "is-windows": "^1.0.1"
-          }
-        },
-        "is-accessor-descriptor": {
-          "version": "1.0.0",
-          "dev": true,
-          "requires": {
-            "kind-of": "^6.0.0"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "6.0.3",
-              "dev": true
-            }
-          }
-        },
-        "is-arrayish": {
-          "version": "0.2.1",
-          "dev": true
-        },
-        "is-binary-path": {
-          "version": "1.0.1",
-          "dev": true,
-          "requires": {
-            "binary-extensions": "^1.0.0"
-          }
-        },
-        "is-buffer": {
-          "version": "1.1.6",
-          "dev": true
-        },
-        "is-core-module": {
-          "version": "2.4.0",
-          "dev": true,
-          "requires": {
-            "has": "^1.0.3"
-          }
-        },
-        "is-data-descriptor": {
-          "version": "1.0.0",
-          "dev": true,
-          "requires": {
-            "kind-of": "^6.0.0"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "6.0.3",
-              "dev": true
-            }
-          }
-        },
-        "is-descriptor": {
-          "version": "1.0.2",
-          "dev": true,
-          "requires": {
-            "is-accessor-descriptor": "^1.0.0",
-            "is-data-descriptor": "^1.0.0",
-            "kind-of": "^6.0.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "6.0.3",
-              "dev": true
-            }
-          }
-        },
-        "is-dotfile": {
-          "version": "1.0.3",
-          "dev": true
-        },
-        "is-equal-shallow": {
-          "version": "0.1.3",
-          "dev": true,
-          "requires": {
-            "is-primitive": "^2.0.0"
-          }
-        },
-        "is-extendable": {
-          "version": "0.1.1",
-          "dev": true
-        },
-        "is-extglob": {
-          "version": "2.1.1",
-          "dev": true
-        },
-        "is-fullwidth-code-point": {
-          "version": "3.0.0",
-          "dev": true
-        },
-        "is-glob": {
-          "version": "4.0.1",
-          "dev": true,
-          "requires": {
-            "is-extglob": "^2.1.1"
-          }
-        },
-        "is-negated-glob": {
-          "version": "1.0.0",
-          "dev": true
-        },
-        "is-number": {
-          "version": "3.0.0",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.0.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "dev": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            }
-          }
-        },
-        "is-plain-object": {
-          "version": "5.0.0",
-          "dev": true
-        },
-        "is-posix-bracket": {
-          "version": "0.1.1",
-          "dev": true
-        },
-        "is-primitive": {
-          "version": "2.0.0",
-          "dev": true
-        },
-        "is-relative": {
-          "version": "1.0.0",
-          "dev": true,
-          "requires": {
-            "is-unc-path": "^1.0.0"
-          }
-        },
-        "is-stream": {
-          "version": "2.0.0",
-          "dev": true
-        },
-        "is-unc-path": {
-          "version": "1.0.0",
-          "dev": true,
-          "requires": {
-            "unc-path-regex": "^0.1.2"
-          }
-        },
-        "is-utf8": {
-          "version": "0.2.1",
-          "dev": true
-        },
-        "is-valid-glob": {
-          "version": "1.0.0",
-          "dev": true
-        },
-        "is-windows": {
-          "version": "1.0.2",
-          "dev": true
-        },
-        "is-wsl": {
-          "version": "1.1.0",
-          "dev": true
-        },
-        "isarray": {
-          "version": "1.0.0",
-          "dev": true
-        },
-        "isbinaryfile": {
-          "version": "4.0.8",
-          "dev": true
-        },
-        "isexe": {
-          "version": "2.0.0",
-          "dev": true
-        },
-        "isobject": {
-          "version": "3.0.1",
-          "dev": true
-        },
-        "jasmine-core": {
-          "version": "3.7.1",
-          "dev": true
-        },
-        "jest-worker": {
-          "version": "27.0.2",
-          "dev": true,
-          "requires": {
-            "@types/node": "*",
-            "merge-stream": "^2.0.0",
-            "supports-color": "^8.0.0"
-          },
-          "dependencies": {
-            "supports-color": {
-              "version": "8.1.1",
-              "dev": true,
-              "requires": {
-                "has-flag": "^4.0.0"
-              }
-            }
-          }
-        },
-        "js-tokens": {
-          "version": "4.0.0",
-          "dev": true
-        },
-        "js-yaml": {
-          "version": "3.14.1",
-          "dev": true,
-          "requires": {
-            "argparse": "^1.0.7",
-            "esprima": "^4.0.0"
-          }
-        },
-        "json-parse-better-errors": {
-          "version": "1.0.2",
-          "dev": true
-        },
-        "json-schema-traverse": {
-          "version": "0.4.1",
-          "dev": true
-        },
-        "json-stable-stringify-without-jsonify": {
-          "version": "1.0.1",
-          "dev": true
-        },
-        "json5": {
-          "version": "1.0.1",
-          "dev": true,
-          "requires": {
-            "minimist": "^1.2.0"
-          }
-        },
-        "jsonfile": {
-          "version": "4.0.0",
-          "dev": true,
-          "requires": {
-            "graceful-fs": "^4.1.6"
-          }
-        },
-        "just-debounce": {
-          "version": "1.1.0",
-          "dev": true
-        },
-        "karma": {
-          "version": "6.3.4",
-          "dev": true,
-          "requires": {
-            "body-parser": "^1.19.0",
-            "braces": "^3.0.2",
-            "chokidar": "^3.5.1",
-            "colors": "^1.4.0",
-            "connect": "^3.7.0",
-            "di": "^0.0.1",
-            "dom-serialize": "^2.2.1",
-            "glob": "^7.1.7",
-            "graceful-fs": "^4.2.6",
-            "http-proxy": "^1.18.1",
-            "isbinaryfile": "^4.0.8",
-            "lodash": "^4.17.21",
-            "log4js": "^6.3.0",
-            "mime": "^2.5.2",
-            "minimatch": "^3.0.4",
-            "qjobs": "^1.2.0",
-            "range-parser": "^1.2.1",
-            "rimraf": "^3.0.2",
-            "socket.io": "^3.1.0",
-            "source-map": "^0.6.1",
-            "tmp": "^0.2.1",
-            "ua-parser-js": "^0.7.28",
-            "yargs": "^16.1.1"
-          },
-          "dependencies": {
-            "anymatch": {
-              "version": "3.1.2",
-              "dev": true,
-              "requires": {
-                "normalize-path": "^3.0.0",
-                "picomatch": "^2.0.4"
-              }
-            },
-            "binary-extensions": {
-              "version": "2.2.0",
-              "dev": true
-            },
-            "braces": {
-              "version": "3.0.2",
-              "dev": true,
-              "requires": {
-                "fill-range": "^7.0.1"
-              }
-            },
-            "chokidar": {
-              "version": "3.5.1",
-              "dev": true,
-              "requires": {
-                "anymatch": "~3.1.1",
-                "braces": "~3.0.2",
-                "fsevents": "~2.3.1",
-                "glob-parent": "~5.1.0",
-                "is-binary-path": "~2.1.0",
-                "is-glob": "~4.0.1",
-                "normalize-path": "~3.0.0",
-                "readdirp": "~3.5.0"
-              }
-            },
-            "cliui": {
-              "version": "7.0.4",
-              "dev": true,
-              "requires": {
-                "string-width": "^4.2.0",
-                "strip-ansi": "^6.0.0",
-                "wrap-ansi": "^7.0.0"
-              }
-            },
-            "fill-range": {
-              "version": "7.0.1",
-              "dev": true,
-              "requires": {
-                "to-regex-range": "^5.0.1"
-              }
-            },
-            "fsevents": {
-              "version": "2.3.2",
-              "dev": true,
-              "optional": true
-            },
-            "get-caller-file": {
-              "version": "2.0.5",
-              "dev": true
-            },
-            "is-binary-path": {
-              "version": "2.1.0",
-              "dev": true,
-              "requires": {
-                "binary-extensions": "^2.0.0"
-              }
-            },
-            "is-number": {
-              "version": "7.0.0",
-              "dev": true
-            },
-            "readdirp": {
-              "version": "3.5.0",
-              "dev": true,
-              "requires": {
-                "picomatch": "^2.2.1"
-              }
-            },
-            "to-regex-range": {
-              "version": "5.0.1",
-              "dev": true,
-              "requires": {
-                "is-number": "^7.0.0"
-              }
-            },
-            "wrap-ansi": {
-              "version": "7.0.0",
-              "dev": true,
-              "requires": {
-                "ansi-styles": "^4.0.0",
-                "string-width": "^4.1.0",
-                "strip-ansi": "^6.0.0"
-              }
-            },
-            "y18n": {
-              "version": "5.0.8",
-              "dev": true
-            },
-            "yargs": {
-              "version": "16.2.0",
-              "dev": true,
-              "requires": {
-                "cliui": "^7.0.2",
-                "escalade": "^3.1.1",
-                "get-caller-file": "^2.0.5",
-                "require-directory": "^2.1.1",
-                "string-width": "^4.2.0",
-                "y18n": "^5.0.5",
-                "yargs-parser": "^20.2.2"
-              }
-            },
-            "yargs-parser": {
-              "version": "20.2.7",
-              "dev": true
-            }
-          }
-        },
-        "karma-chrome-launcher": {
-          "version": "3.1.0",
-          "dev": true,
-          "requires": {
-            "which": "^1.2.1"
-          },
-          "dependencies": {
-            "which": {
-              "version": "1.3.1",
-              "dev": true,
-              "requires": {
-                "isexe": "^2.0.0"
-              }
-            }
-          }
-        },
-        "karma-jasmine": {
-          "version": "4.0.1",
-          "dev": true,
-          "requires": {
-            "jasmine-core": "^3.6.0"
-          }
-        },
-        "kind-of": {
-          "version": "5.1.0",
-          "dev": true
-        },
-        "last-run": {
-          "version": "1.1.1",
-          "dev": true,
-          "requires": {
-            "default-resolution": "^2.0.0",
-            "es6-weak-map": "^2.0.1"
-          }
-        },
-        "lazystream": {
-          "version": "1.0.0",
-          "dev": true,
-          "requires": {
-            "readable-stream": "^2.0.5"
-          }
-        },
-        "lcid": {
-          "version": "1.0.0",
-          "dev": true,
-          "requires": {
-            "invert-kv": "^1.0.0"
-          }
-        },
-        "lead": {
-          "version": "1.0.0",
-          "dev": true,
-          "requires": {
-            "flush-write-stream": "^1.0.2"
-          }
-        },
-        "levn": {
-          "version": "0.4.1",
-          "dev": true,
-          "requires": {
-            "prelude-ls": "^1.2.1",
-            "type-check": "~0.4.0"
-          }
-        },
-        "liftoff": {
-          "version": "3.1.0",
-          "dev": true,
-          "requires": {
-            "extend": "^3.0.0",
-            "findup-sync": "^3.0.0",
-            "fined": "^1.0.1",
-            "flagged-respawn": "^1.0.0",
-            "is-plain-object": "^2.0.4",
-            "object.map": "^1.0.0",
-            "rechoir": "^0.6.2",
-            "resolve": "^1.1.7"
-          },
-          "dependencies": {
-            "is-plain-object": {
-              "version": "2.0.4",
-              "dev": true,
-              "requires": {
-                "isobject": "^3.0.1"
-              }
-            }
-          }
-        },
-        "load-json-file": {
-          "version": "1.1.0",
-          "dev": true,
-          "requires": {
-            "graceful-fs": "^4.1.2",
-            "parse-json": "^2.2.0",
-            "pify": "^2.0.0",
-            "pinkie-promise": "^2.0.0",
-            "strip-bom": "^2.0.0"
-          }
-        },
-        "loader-runner": {
-          "version": "4.2.0",
-          "dev": true
-        },
-        "loader-utils": {
-          "version": "1.4.0",
-          "dev": true,
-          "requires": {
-            "big.js": "^5.2.2",
-            "emojis-list": "^3.0.0",
-            "json5": "^1.0.1"
-          }
-        },
-        "locate-path": {
-          "version": "5.0.0",
-          "dev": true,
-          "requires": {
-            "p-locate": "^4.1.0"
-          }
-        },
-        "lodash": {
-          "version": "4.17.21",
-          "dev": true
-        },
-        "lodash.clone": {
-          "version": "4.5.0",
-          "dev": true
-        },
-        "lodash.clonedeep": {
-          "version": "4.5.0",
-          "dev": true
-        },
-        "lodash.merge": {
-          "version": "4.6.2",
-          "dev": true
-        },
-        "lodash.some": {
-          "version": "4.6.0",
-          "dev": true
-        },
-        "lodash.truncate": {
-          "version": "4.4.2",
-          "dev": true
-        },
-        "log4js": {
-          "version": "6.3.0",
-          "dev": true,
-          "requires": {
-            "date-format": "^3.0.0",
-            "debug": "^4.1.1",
-            "flatted": "^2.0.1",
-            "rfdc": "^1.1.4",
-            "streamroller": "^2.2.4"
-          },
-          "dependencies": {
-            "flatted": {
-              "version": "2.0.2",
-              "dev": true
-            }
-          }
-        },
-        "lru-cache": {
-          "version": "6.0.0",
-          "dev": true,
-          "requires": {
-            "yallist": "^4.0.0"
-          }
-        },
-        "make-dir": {
-          "version": "2.1.0",
-          "dev": true,
-          "requires": {
-            "pify": "^4.0.1",
-            "semver": "^5.6.0"
-          },
-          "dependencies": {
-            "pify": {
-              "version": "4.0.1",
-              "dev": true
-            },
-            "semver": {
-              "version": "5.7.1",
-              "dev": true
-            }
-          }
-        },
-        "make-iterator": {
-          "version": "1.0.1",
-          "dev": true,
-          "requires": {
-            "kind-of": "^6.0.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "6.0.3",
-              "dev": true
-            }
-          }
-        },
-        "map-cache": {
-          "version": "0.2.2",
-          "dev": true
-        },
-        "map-visit": {
-          "version": "1.0.0",
-          "dev": true,
-          "requires": {
-            "object-visit": "^1.0.0"
-          }
-        },
-        "matchdep": {
-          "version": "2.0.0",
-          "dev": true,
-          "requires": {
-            "findup-sync": "^2.0.0",
-            "micromatch": "^3.0.4",
-            "resolve": "^1.4.0",
-            "stack-trace": "0.0.10"
-          },
-          "dependencies": {
-            "findup-sync": {
-              "version": "2.0.0",
-              "dev": true,
-              "requires": {
-                "detect-file": "^1.0.0",
-                "is-glob": "^3.1.0",
-                "micromatch": "^3.0.4",
-                "resolve-dir": "^1.0.1"
-              }
-            },
-            "is-glob": {
-              "version": "3.1.0",
-              "dev": true,
-              "requires": {
-                "is-extglob": "^2.1.0"
-              }
-            }
-          }
-        },
-        "math-random": {
-          "version": "1.0.4",
-          "dev": true
-        },
-        "md5.js": {
-          "version": "1.3.5",
-          "dev": true,
-          "requires": {
-            "hash-base": "^3.0.0",
-            "inherits": "^2.0.1",
-            "safe-buffer": "^5.1.2"
-          }
-        },
-        "media-typer": {
-          "version": "0.3.0",
-          "dev": true
-        },
-        "memory-fs": {
-          "version": "0.5.0",
-          "dev": true,
-          "requires": {
-            "errno": "^0.1.3",
-            "readable-stream": "^2.0.1"
-          }
-        },
-        "merge-stream": {
-          "version": "2.0.0",
-          "dev": true
-        },
-        "micromatch": {
-          "version": "3.1.10",
-          "dev": true,
-          "requires": {
-            "arr-diff": "^4.0.0",
-            "array-unique": "^0.3.2",
-            "braces": "^2.3.1",
-            "define-property": "^2.0.2",
-            "extend-shallow": "^3.0.2",
-            "extglob": "^2.0.4",
-            "fragment-cache": "^0.2.1",
-            "kind-of": "^6.0.2",
-            "nanomatch": "^1.2.9",
-            "object.pick": "^1.3.0",
-            "regex-not": "^1.0.0",
-            "snapdragon": "^0.8.1",
-            "to-regex": "^3.0.2"
-          },
-          "dependencies": {
-            "extend-shallow": {
-              "version": "3.0.2",
-              "dev": true,
-              "requires": {
-                "assign-symbols": "^1.0.0",
-                "is-extendable": "^1.0.1"
-              }
-            },
-            "is-extendable": {
-              "version": "1.0.1",
-              "dev": true,
-              "requires": {
-                "is-plain-object": "^2.0.4"
-              }
-            },
-            "is-plain-object": {
-              "version": "2.0.4",
-              "dev": true,
-              "requires": {
-                "isobject": "^3.0.1"
-              }
-            },
-            "kind-of": {
-              "version": "6.0.3",
-              "dev": true
-            }
-          }
-        },
-        "miller-rabin": {
-          "version": "4.0.1",
-          "dev": true,
-          "requires": {
-            "bn.js": "^4.0.0",
-            "brorand": "^1.0.1"
-          },
-          "dependencies": {
-            "bn.js": {
-              "version": "4.12.0",
-              "dev": true
-            }
-          }
-        },
-        "mime": {
-          "version": "2.5.2",
-          "dev": true
-        },
-        "mime-db": {
-          "version": "1.48.0",
-          "dev": true
-        },
-        "mime-types": {
-          "version": "2.1.31",
-          "dev": true,
-          "requires": {
-            "mime-db": "1.48.0"
-          }
-        },
-        "mimic-fn": {
-          "version": "2.1.0",
-          "dev": true
-        },
-        "minimalistic-assert": {
-          "version": "1.0.1",
-          "dev": true
-        },
-        "minimalistic-crypto-utils": {
-          "version": "1.0.1",
-          "dev": true
-        },
-        "minimatch": {
-          "version": "3.0.4",
-          "dev": true,
-          "requires": {
-            "brace-expansion": "^1.1.7"
-          }
-        },
-        "minimist": {
-          "version": "1.2.5",
-          "dev": true
-        },
-        "mississippi": {
-          "version": "3.0.0",
-          "dev": true,
-          "requires": {
-            "concat-stream": "^1.5.0",
-            "duplexify": "^3.4.2",
-            "end-of-stream": "^1.1.0",
-            "flush-write-stream": "^1.0.0",
-            "from2": "^2.1.0",
-            "parallel-transform": "^1.1.0",
-            "pump": "^3.0.0",
-            "pumpify": "^1.3.3",
-            "stream-each": "^1.1.0",
-            "through2": "^2.0.0"
-          },
-          "dependencies": {
-            "pump": {
-              "version": "3.0.0",
-              "dev": true,
-              "requires": {
-                "end-of-stream": "^1.1.0",
-                "once": "^1.3.1"
-              }
-            }
-          }
-        },
-        "mixin-deep": {
-          "version": "1.3.2",
-          "dev": true,
-          "requires": {
-            "for-in": "^1.0.2",
-            "is-extendable": "^1.0.1"
-          },
-          "dependencies": {
-            "is-extendable": {
-              "version": "1.0.1",
-              "dev": true,
-              "requires": {
-                "is-plain-object": "^2.0.4"
-              }
-            },
-            "is-plain-object": {
-              "version": "2.0.4",
-              "dev": true,
-              "requires": {
-                "isobject": "^3.0.1"
-              }
-            }
-          }
-        },
-        "mkdirp": {
-          "version": "0.5.5",
-          "dev": true,
-          "requires": {
-            "minimist": "^1.2.5"
-          }
-        },
-        "move-concurrently": {
-          "version": "1.0.1",
-          "dev": true,
-          "requires": {
-            "aproba": "^1.1.1",
-            "copy-concurrently": "^1.0.0",
-            "fs-write-stream-atomic": "^1.0.8",
-            "mkdirp": "^0.5.1",
-            "rimraf": "^2.5.4",
-            "run-queue": "^1.0.3"
-          },
-          "dependencies": {
-            "rimraf": {
-              "version": "2.7.1",
-              "dev": true,
-              "requires": {
-                "glob": "^7.1.3"
-              }
-            }
-          }
-        },
-        "ms": {
-          "version": "2.1.2",
-          "dev": true
-        },
-        "mute-stdout": {
-          "version": "1.0.1",
-          "dev": true
-        },
-        "mute-stream": {
-          "version": "0.0.8",
-          "dev": true
-        },
-        "nan": {
-          "version": "2.14.2",
-          "dev": true,
-          "optional": true
-        },
-        "nanomatch": {
-          "version": "1.2.13",
-          "dev": true,
-          "requires": {
-            "arr-diff": "^4.0.0",
-            "array-unique": "^0.3.2",
-            "define-property": "^2.0.2",
-            "extend-shallow": "^3.0.2",
-            "fragment-cache": "^0.2.1",
-            "is-windows": "^1.0.2",
-            "kind-of": "^6.0.2",
-            "object.pick": "^1.3.0",
-            "regex-not": "^1.0.0",
-            "snapdragon": "^0.8.1",
-            "to-regex": "^3.0.1"
-          },
-          "dependencies": {
-            "extend-shallow": {
-              "version": "3.0.2",
-              "dev": true,
-              "requires": {
-                "assign-symbols": "^1.0.0",
-                "is-extendable": "^1.0.1"
-              }
-            },
-            "is-extendable": {
-              "version": "1.0.1",
-              "dev": true,
-              "requires": {
-                "is-plain-object": "^2.0.4"
-              }
-            },
-            "is-plain-object": {
-              "version": "2.0.4",
-              "dev": true,
-              "requires": {
-                "isobject": "^3.0.1"
-              }
-            },
-            "kind-of": {
-              "version": "6.0.3",
-              "dev": true
-            }
-          }
-        },
-        "natural-compare": {
-          "version": "1.4.0",
-          "dev": true
-        },
-        "negotiator": {
-          "version": "0.6.2",
-          "dev": true
-        },
-        "neo-async": {
-          "version": "2.6.2",
-          "dev": true
-        },
-        "next-tick": {
-          "version": "1.0.0",
-          "dev": true
-        },
-        "nice-try": {
-          "version": "1.0.5",
-          "dev": true
-        },
-        "node-libs-browser": {
-          "version": "2.2.1",
-          "dev": true,
-          "requires": {
-            "assert": "^1.1.1",
-            "browserify-zlib": "^0.2.0",
-            "buffer": "^4.3.0",
-            "console-browserify": "^1.1.0",
-            "constants-browserify": "^1.0.0",
-            "crypto-browserify": "^3.11.0",
-            "domain-browser": "^1.1.1",
-            "events": "^3.0.0",
-            "https-browserify": "^1.0.0",
-            "os-browserify": "^0.3.0",
-            "path-browserify": "0.0.1",
-            "process": "^0.11.10",
-            "punycode": "^1.2.4",
-            "querystring-es3": "^0.2.0",
-            "readable-stream": "^2.3.3",
-            "stream-browserify": "^2.0.1",
-            "stream-http": "^2.7.2",
-            "string_decoder": "^1.0.0",
-            "timers-browserify": "^2.0.4",
-            "tty-browserify": "0.0.0",
-            "url": "^0.11.0",
-            "util": "^0.11.0",
-            "vm-browserify": "^1.0.1"
-          },
-          "dependencies": {
-            "punycode": {
-              "version": "1.4.1",
-              "dev": true
-            }
-          }
-        },
-        "node-releases": {
-          "version": "1.1.73",
-          "dev": true
-        },
-        "normalize-package-data": {
-          "version": "2.5.0",
-          "dev": true,
-          "requires": {
-            "hosted-git-info": "^2.1.4",
-            "resolve": "^1.10.0",
-            "semver": "2 || 3 || 4 || 5",
-            "validate-npm-package-license": "^3.0.1"
-          },
-          "dependencies": {
-            "semver": {
-              "version": "5.7.1",
-              "dev": true
-            }
-          }
-        },
-        "normalize-path": {
-          "version": "3.0.0",
-          "dev": true
-        },
-        "now-and-later": {
-          "version": "2.0.1",
-          "dev": true,
-          "requires": {
-            "once": "^1.3.2"
-          }
-        },
-        "npm-run-path": {
-          "version": "4.0.1",
-          "dev": true,
-          "requires": {
-            "path-key": "^3.0.0"
-          }
-        },
-        "number-is-nan": {
-          "version": "1.0.1",
-          "dev": true
-        },
-        "object-assign": {
-          "version": "4.1.1",
-          "dev": true
-        },
-        "object-copy": {
-          "version": "0.1.0",
-          "dev": true,
-          "requires": {
-            "copy-descriptor": "^0.1.0",
-            "define-property": "^0.2.5",
-            "kind-of": "^3.0.3"
-          },
-          "dependencies": {
-            "define-property": {
-              "version": "0.2.5",
-              "dev": true,
-              "requires": {
-                "is-descriptor": "^0.1.0"
-              }
-            },
-            "is-accessor-descriptor": {
-              "version": "0.1.6",
-              "dev": true,
-              "requires": {
-                "kind-of": "^3.0.2"
-              }
-            },
-            "is-data-descriptor": {
-              "version": "0.1.4",
-              "dev": true,
-              "requires": {
-                "kind-of": "^3.0.2"
-              }
-            },
-            "is-descriptor": {
-              "version": "0.1.6",
-              "dev": true,
-              "requires": {
-                "is-accessor-descriptor": "^0.1.6",
-                "is-data-descriptor": "^0.1.4",
-                "kind-of": "^5.0.0"
-              },
-              "dependencies": {
-                "kind-of": {
-                  "version": "5.1.0",
-                  "dev": true
-                }
-              }
-            },
-            "kind-of": {
-              "version": "3.2.2",
-              "dev": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            }
-          }
-        },
-        "object-keys": {
-          "version": "1.1.1",
-          "dev": true
-        },
-        "object-visit": {
-          "version": "1.0.1",
-          "dev": true,
-          "requires": {
-            "isobject": "^3.0.0"
-          }
-        },
-        "object.assign": {
-          "version": "4.1.2",
-          "dev": true,
-          "requires": {
-            "call-bind": "^1.0.0",
-            "define-properties": "^1.1.3",
-            "has-symbols": "^1.0.1",
-            "object-keys": "^1.1.1"
-          }
-        },
-        "object.defaults": {
-          "version": "1.1.0",
-          "dev": true,
-          "requires": {
-            "array-each": "^1.0.1",
-            "array-slice": "^1.0.0",
-            "for-own": "^1.0.0",
-            "isobject": "^3.0.0"
-          }
-        },
-        "object.map": {
-          "version": "1.0.1",
-          "dev": true,
-          "requires": {
-            "for-own": "^1.0.0",
-            "make-iterator": "^1.0.0"
-          }
-        },
-        "object.omit": {
-          "version": "2.0.1",
-          "dev": true,
-          "requires": {
-            "for-own": "^0.1.4",
-            "is-extendable": "^0.1.1"
-          },
-          "dependencies": {
-            "for-own": {
-              "version": "0.1.5",
-              "dev": true,
-              "requires": {
-                "for-in": "^1.0.1"
-              }
-            }
-          }
-        },
-        "object.pick": {
-          "version": "1.3.0",
-          "dev": true,
-          "requires": {
-            "isobject": "^3.0.1"
-          }
-        },
-        "object.reduce": {
-          "version": "1.0.1",
-          "dev": true,
-          "requires": {
-            "for-own": "^1.0.0",
-            "make-iterator": "^1.0.0"
-          }
-        },
-        "on-finished": {
-          "version": "2.3.0",
-          "dev": true,
-          "requires": {
-            "ee-first": "1.1.1"
-          }
-        },
-        "once": {
-          "version": "1.4.0",
-          "dev": true,
-          "requires": {
-            "wrappy": "1"
-          }
-        },
-        "onetime": {
-          "version": "5.1.2",
-          "dev": true,
-          "requires": {
-            "mimic-fn": "^2.1.0"
-          }
-        },
-        "optionator": {
-          "version": "0.9.1",
-          "dev": true,
-          "requires": {
-            "deep-is": "^0.1.3",
-            "fast-levenshtein": "^2.0.6",
-            "levn": "^0.4.1",
-            "prelude-ls": "^1.2.1",
-            "type-check": "^0.4.0",
-            "word-wrap": "^1.2.3"
-          }
-        },
-        "ordered-read-streams": {
-          "version": "1.0.1",
-          "dev": true,
-          "requires": {
-            "readable-stream": "^2.0.1"
-          }
-        },
-        "os-browserify": {
-          "version": "0.3.0",
+        "ansi-regex": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
           "dev": true
         },
-        "os-locale": {
-          "version": "1.4.0",
+        "ansi-styles": {
+          "version": "3.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+          "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
           "dev": true,
           "requires": {
-            "lcid": "^1.0.0"
+            "color-convert": "^1.9.0"
           }
         },
-        "os-tmpdir": {
-          "version": "1.0.2",
+        "astral-regex": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
+          "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
           "dev": true
         },
-        "p-limit": {
-          "version": "3.1.0",
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
           "dev": true,
           "requires": {
-            "yocto-queue": "^0.1.0"
+            "ansi-styles": "^3.2.1",
+            "escape-string-regexp": "^1.0.5",
+            "supports-color": "^5.3.0"
           }
         },
-        "p-locate": {
-          "version": "4.1.0",
+        "color-convert": {
+          "version": "1.9.3",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+          "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
           "dev": true,
           "requires": {
-            "p-limit": "^2.2.0"
-          },
-          "dependencies": {
-            "p-limit": {
-              "version": "2.3.0",
-              "dev": true,
-              "requires": {
-                "p-try": "^2.0.0"
-              }
-            }
+            "color-name": "1.1.3"
           }
         },
-        "p-try": {
-          "version": "2.2.0",
-          "dev": true
-        },
-        "pako": {
-          "version": "1.0.11",
+        "color-name": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+          "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
           "dev": true
         },
-        "parallel-transform": {
-          "version": "1.2.0",
-          "dev": true,
-          "requires": {
-            "cyclist": "^1.0.1",
-            "inherits": "^2.0.3",
-            "readable-stream": "^2.1.5"
-          }
-        },
-        "parent-module": {
-          "version": "1.0.1",
-          "dev": true,
-          "requires": {
-            "callsites": "^3.0.0"
-          }
-        },
-        "parse-asn1": {
-          "version": "5.1.6",
-          "dev": true,
-          "requires": {
-            "asn1.js": "^5.2.0",
-            "browserify-aes": "^1.0.0",
-            "evp_bytestokey": "^1.0.0",
-            "pbkdf2": "^3.0.3",
-            "safe-buffer": "^5.1.1"
-          }
-        },
-        "parse-filepath": {
-          "version": "1.0.2",
-          "dev": true,
-          "requires": {
-            "is-absolute": "^1.0.0",
-            "map-cache": "^0.2.0",
-            "path-root": "^0.1.1"
-          }
-        },
-        "parse-glob": {
-          "version": "3.0.4",
+        "cross-spawn": {
+          "version": "6.0.5",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+          "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
           "dev": true,
           "requires": {
-            "glob-base": "^0.3.0",
-            "is-dotfile": "^1.0.0",
-            "is-extglob": "^1.0.0",
-            "is-glob": "^2.0.0"
+            "nice-try": "^1.0.4",
+            "path-key": "^2.0.1",
+            "semver": "^5.5.0",
+            "shebang-command": "^1.2.0",
+            "which": "^1.2.9"
           },
           "dependencies": {
-            "is-extglob": {
-              "version": "1.0.0",
+            "semver": {
+              "version": "5.7.1",
+              "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+              "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
               "dev": true
-            },
-            "is-glob": {
-              "version": "2.0.1",
-              "dev": true,
-              "requires": {
-                "is-extglob": "^1.0.0"
-              }
             }
           }
         },
-        "parse-json": {
-          "version": "2.2.0",
-          "dev": true,
-          "requires": {
-            "error-ex": "^1.2.0"
-          }
-        },
-        "parse-node-version": {
-          "version": "1.0.1",
-          "dev": true
-        },
-        "parse-passwd": {
-          "version": "1.0.0",
-          "dev": true
-        },
-        "parseurl": {
-          "version": "1.3.3",
-          "dev": true
-        },
-        "pascalcase": {
-          "version": "0.1.1",
-          "dev": true
-        },
-        "path-browserify": {
-          "version": "0.0.1",
-          "dev": true
-        },
-        "path-dirname": {
-          "version": "1.0.2",
-          "dev": true
-        },
-        "path-exists": {
-          "version": "4.0.0",
-          "dev": true
-        },
-        "path-is-absolute": {
-          "version": "1.0.1",
+        "emoji-regex": {
+          "version": "7.0.3",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
+          "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
           "dev": true
         },
-        "path-key": {
-          "version": "3.1.1",
+        "escape-string-regexp": {
+          "version": "1.0.5",
+          "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+          "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
           "dev": true
         },
-        "path-parse": {
-          "version": "1.0.7",
-          "dev": true
+        "eslint": {
+          "version": "6.8.0",
+          "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz",
+          "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "ajv": "^6.10.0",
+            "chalk": "^2.1.0",
+            "cross-spawn": "^6.0.5",
+            "debug": "^4.0.1",
+            "doctrine": "^3.0.0",
+            "eslint-scope": "^5.0.0",
+            "eslint-utils": "^1.4.3",
+            "eslint-visitor-keys": "^1.1.0",
+            "espree": "^6.1.2",
+            "esquery": "^1.0.1",
+            "esutils": "^2.0.2",
+            "file-entry-cache": "^5.0.1",
+            "functional-red-black-tree": "^1.0.1",
+            "glob-parent": "^5.0.0",
+            "globals": "^12.1.0",
+            "ignore": "^4.0.6",
+            "import-fresh": "^3.0.0",
+            "imurmurhash": "^0.1.4",
+            "inquirer": "^7.0.0",
+            "is-glob": "^4.0.0",
+            "js-yaml": "^3.13.1",
+            "json-stable-stringify-without-jsonify": "^1.0.1",
+            "levn": "^0.3.0",
+            "lodash": "^4.17.14",
+            "minimatch": "^3.0.4",
+            "mkdirp": "^0.5.1",
+            "natural-compare": "^1.4.0",
+            "optionator": "^0.8.3",
+            "progress": "^2.0.0",
+            "regexpp": "^2.0.1",
+            "semver": "^6.1.2",
+            "strip-ansi": "^5.2.0",
+            "strip-json-comments": "^3.0.1",
+            "table": "^5.2.3",
+            "text-table": "^0.2.0",
+            "v8-compile-cache": "^2.0.3"
+          }
         },
-        "path-root": {
-          "version": "0.1.1",
+        "eslint-utils": {
+          "version": "1.4.3",
+          "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz",
+          "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==",
           "dev": true,
           "requires": {
-            "path-root-regex": "^0.1.0"
+            "eslint-visitor-keys": "^1.1.0"
           }
         },
-        "path-root-regex": {
-          "version": "0.1.2",
+        "eslint-visitor-keys": {
+          "version": "1.3.0",
+          "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+          "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
           "dev": true
         },
-        "path-type": {
-          "version": "1.1.0",
+        "espree": {
+          "version": "6.2.1",
+          "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz",
+          "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==",
           "dev": true,
           "requires": {
-            "graceful-fs": "^4.1.2",
-            "pify": "^2.0.0",
-            "pinkie-promise": "^2.0.0"
+            "acorn": "^7.1.1",
+            "acorn-jsx": "^5.2.0",
+            "eslint-visitor-keys": "^1.1.0"
           }
         },
-        "pbkdf2": {
-          "version": "3.1.2",
+        "file-entry-cache": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
+          "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==",
           "dev": true,
           "requires": {
-            "create-hash": "^1.1.2",
-            "create-hmac": "^1.1.4",
-            "ripemd160": "^2.0.1",
-            "safe-buffer": "^5.0.1",
-            "sha.js": "^2.4.8"
+            "flat-cache": "^2.0.1"
           }
         },
-        "picomatch": {
-          "version": "2.3.0",
-          "dev": true
-        },
-        "pify": {
-          "version": "2.3.0",
-          "dev": true
-        },
-        "pinkie": {
-          "version": "2.0.4",
-          "dev": true
-        },
-        "pinkie-promise": {
+        "flat-cache": {
           "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
+          "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
           "dev": true,
           "requires": {
-            "pinkie": "^2.0.0"
+            "flatted": "^2.0.0",
+            "rimraf": "2.6.3",
+            "write": "1.0.3"
           }
         },
-        "pkg-dir": {
-          "version": "4.2.0",
-          "dev": true,
-          "requires": {
-            "find-up": "^4.0.0"
-          }
+        "flatted": {
+          "version": "2.0.2",
+          "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz",
+          "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==",
+          "dev": true
         },
-        "plugin-error": {
-          "version": "1.0.1",
+        "globals": {
+          "version": "12.4.0",
+          "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
+          "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
           "dev": true,
           "requires": {
-            "ansi-colors": "^1.0.1",
-            "arr-diff": "^4.0.0",
-            "arr-union": "^3.1.0",
-            "extend-shallow": "^3.0.2"
-          },
-          "dependencies": {
-            "ansi-colors": {
-              "version": "1.1.0",
-              "dev": true,
-              "requires": {
-                "ansi-wrap": "^0.1.0"
-              }
-            },
-            "extend-shallow": {
-              "version": "3.0.2",
-              "dev": true,
-              "requires": {
-                "assign-symbols": "^1.0.0",
-                "is-extendable": "^1.0.1"
-              }
-            },
-            "is-extendable": {
-              "version": "1.0.1",
-              "dev": true,
-              "requires": {
-                "is-plain-object": "^2.0.4"
-              }
-            },
-            "is-plain-object": {
-              "version": "2.0.4",
-              "dev": true,
-              "requires": {
-                "isobject": "^3.0.1"
-              }
-            }
+            "type-fest": "^0.8.1"
           }
         },
-        "posix-character-classes": {
-          "version": "0.1.1",
+        "has-flag": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
           "dev": true
         },
-        "prelude-ls": {
-          "version": "1.2.1",
+        "is-fullwidth-code-point": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+          "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
           "dev": true
         },
-        "preserve": {
-          "version": "0.2.0",
-          "dev": true
+        "levn": {
+          "version": "0.3.0",
+          "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+          "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+          "dev": true,
+          "requires": {
+            "prelude-ls": "~1.1.2",
+            "type-check": "~0.3.2"
+          }
         },
-        "prettier": {
-          "version": "2.3.1",
-          "dev": true
+        "optionator": {
+          "version": "0.8.3",
+          "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
+          "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+          "dev": true,
+          "requires": {
+            "deep-is": "~0.1.3",
+            "fast-levenshtein": "~2.0.6",
+            "levn": "~0.3.0",
+            "prelude-ls": "~1.1.2",
+            "type-check": "~0.3.2",
+            "word-wrap": "~1.2.3"
+          }
         },
-        "pretty-hrtime": {
-          "version": "1.0.3",
+        "path-key": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+          "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
           "dev": true
         },
-        "process": {
-          "version": "0.11.10",
+        "prelude-ls": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+          "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
           "dev": true
         },
-        "process-nextick-args": {
+        "regexpp": {
           "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz",
+          "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==",
           "dev": true
         },
-        "progress": {
-          "version": "2.0.3",
-          "dev": true
+        "rimraf": {
+          "version": "2.6.3",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
+          "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
         },
-        "promise-inflight": {
-          "version": "1.0.1",
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
           "dev": true
         },
-        "prr": {
-          "version": "1.0.1",
+        "shebang-command": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+          "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+          "dev": true,
+          "requires": {
+            "shebang-regex": "^1.0.0"
+          }
+        },
+        "shebang-regex": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+          "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
           "dev": true
         },
-        "public-encrypt": {
-          "version": "4.0.3",
+        "slice-ansi": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
+          "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
           "dev": true,
           "requires": {
-            "bn.js": "^4.1.0",
-            "browserify-rsa": "^4.0.0",
-            "create-hash": "^1.1.0",
-            "parse-asn1": "^5.0.0",
-            "randombytes": "^2.0.1",
-            "safe-buffer": "^5.1.2"
-          },
-          "dependencies": {
-            "bn.js": {
-              "version": "4.12.0",
-              "dev": true
-            }
+            "ansi-styles": "^3.2.0",
+            "astral-regex": "^1.0.0",
+            "is-fullwidth-code-point": "^2.0.0"
           }
         },
-        "pump": {
-          "version": "2.0.1",
+        "string-width": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
           "dev": true,
           "requires": {
-            "end-of-stream": "^1.1.0",
-            "once": "^1.3.1"
+            "emoji-regex": "^7.0.1",
+            "is-fullwidth-code-point": "^2.0.0",
+            "strip-ansi": "^5.1.0"
           }
         },
-        "pumpify": {
-          "version": "1.5.1",
+        "strip-ansi": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
           "dev": true,
           "requires": {
-            "duplexify": "^3.6.0",
-            "inherits": "^2.0.3",
-            "pump": "^2.0.0"
+            "ansi-regex": "^4.1.0"
           }
         },
-        "punycode": {
-          "version": "2.1.1",
-          "dev": true
-        },
-        "qjobs": {
-          "version": "1.2.0",
-          "dev": true
+        "supports-color": {
+          "version": "5.5.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
         },
-        "qs": {
-          "version": "6.7.0",
-          "dev": true
+        "table": {
+          "version": "5.4.6",
+          "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
+          "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==",
+          "dev": true,
+          "requires": {
+            "ajv": "^6.10.2",
+            "lodash": "^4.17.14",
+            "slice-ansi": "^2.1.0",
+            "string-width": "^3.0.0"
+          }
         },
-        "querystring": {
-          "version": "0.2.0",
-          "dev": true
+        "type-check": {
+          "version": "0.3.2",
+          "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+          "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+          "dev": true,
+          "requires": {
+            "prelude-ls": "~1.1.2"
+          }
         },
-        "querystring-es3": {
-          "version": "0.2.1",
+        "type-fest": {
+          "version": "0.8.1",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+          "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
           "dev": true
         },
-        "randomatic": {
-          "version": "3.1.1",
+        "which": {
+          "version": "1.3.1",
+          "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+          "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
           "dev": true,
           "requires": {
-            "is-number": "^4.0.0",
-            "kind-of": "^6.0.0",
-            "math-random": "^1.0.1"
-          },
-          "dependencies": {
-            "is-number": {
-              "version": "4.0.0",
-              "dev": true
-            },
-            "kind-of": {
-              "version": "6.0.3",
-              "dev": true
-            }
+            "isexe": "^2.0.0"
+          }
+        }
+      }
+    },
+    "gulp-rename": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-2.0.0.tgz",
+      "integrity": "sha512-97Vba4KBzbYmR5VBs9mWmK+HwIf5mj+/zioxfZhOKeXtx5ZjBk57KFlePf5nxq9QsTtFl0ejnHE3zTC9MHXqyQ==",
+      "dev": true
+    },
+    "gulp-watch": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/gulp-watch/-/gulp-watch-5.0.1.tgz",
+      "integrity": "sha512-HnTSBdzAOFIT4wmXYPDUn783TaYAq9bpaN05vuZNP5eni3z3aRx0NAKbjhhMYtcq76x4R1wf4oORDGdlrEjuog==",
+      "dev": true,
+      "requires": {
+        "ansi-colors": "1.1.0",
+        "anymatch": "^1.3.0",
+        "chokidar": "^2.0.0",
+        "fancy-log": "1.3.2",
+        "glob-parent": "^3.0.1",
+        "object-assign": "^4.1.0",
+        "path-is-absolute": "^1.0.1",
+        "plugin-error": "1.0.1",
+        "readable-stream": "^2.2.2",
+        "slash": "^1.0.0",
+        "vinyl": "^2.1.0",
+        "vinyl-file": "^2.0.0"
+      },
+      "dependencies": {
+        "ansi-colors": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
+          "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==",
+          "dev": true,
+          "requires": {
+            "ansi-wrap": "^0.1.0"
           }
         },
-        "randombytes": {
-          "version": "2.1.0",
+        "anymatch": {
+          "version": "1.3.2",
+          "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz",
+          "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==",
           "dev": true,
           "requires": {
-            "safe-buffer": "^5.1.0"
+            "micromatch": "^2.1.5",
+            "normalize-path": "^2.0.0"
           }
         },
-        "randomfill": {
-          "version": "1.0.4",
+        "arr-diff": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
+          "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
           "dev": true,
           "requires": {
-            "randombytes": "^2.0.5",
-            "safe-buffer": "^5.1.0"
+            "arr-flatten": "^1.0.1"
           }
         },
-        "range-parser": {
-          "version": "1.2.1",
+        "array-unique": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
+          "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
           "dev": true
         },
-        "raw-body": {
-          "version": "2.4.0",
+        "braces": {
+          "version": "1.8.5",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
+          "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
           "dev": true,
           "requires": {
-            "bytes": "3.1.0",
-            "http-errors": "1.7.2",
-            "iconv-lite": "0.4.24",
-            "unpipe": "1.0.0"
+            "expand-range": "^1.8.1",
+            "preserve": "^0.2.0",
+            "repeat-element": "^1.1.2"
           }
         },
-        "read-pkg": {
-          "version": "1.1.0",
+        "expand-brackets": {
+          "version": "0.1.5",
+          "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
+          "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
           "dev": true,
           "requires": {
-            "load-json-file": "^1.0.0",
-            "normalize-package-data": "^2.3.2",
-            "path-type": "^1.0.0"
+            "is-posix-bracket": "^0.1.0"
           }
         },
-        "read-pkg-up": {
-          "version": "1.0.1",
+        "extglob": {
+          "version": "0.3.2",
+          "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
+          "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
           "dev": true,
           "requires": {
-            "find-up": "^1.0.0",
-            "read-pkg": "^1.0.0"
+            "is-extglob": "^1.0.0"
           },
           "dependencies": {
-            "find-up": {
-              "version": "1.1.2",
-              "dev": true,
-              "requires": {
-                "path-exists": "^2.0.0",
-                "pinkie-promise": "^2.0.0"
-              }
-            },
-            "path-exists": {
-              "version": "2.1.0",
-              "dev": true,
-              "requires": {
-                "pinkie-promise": "^2.0.0"
-              }
+            "is-extglob": {
+              "version": "1.0.0",
+              "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+              "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
+              "dev": true
             }
           }
         },
-        "readable-stream": {
-          "version": "2.3.7",
+        "fancy-log": {
+          "version": "1.3.2",
+          "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz",
+          "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=",
           "dev": true,
           "requires": {
-            "core-util-is": "~1.0.0",
-            "inherits": "~2.0.3",
-            "isarray": "~1.0.0",
-            "process-nextick-args": "~2.0.0",
-            "safe-buffer": "~5.1.1",
-            "string_decoder": "~1.1.1",
-            "util-deprecate": "~1.0.1"
+            "ansi-gray": "^0.1.1",
+            "color-support": "^1.1.3",
+            "time-stamp": "^1.0.0"
           }
         },
-        "readdirp": {
-          "version": "2.2.1",
+        "glob-parent": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+          "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
           "dev": true,
           "requires": {
-            "graceful-fs": "^4.1.11",
-            "micromatch": "^3.1.10",
-            "readable-stream": "^2.0.2"
+            "is-glob": "^3.1.0",
+            "path-dirname": "^1.0.0"
           }
         },
-        "rechoir": {
-          "version": "0.6.2",
+        "is-glob": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+          "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
           "dev": true,
           "requires": {
-            "resolve": "^1.1.6"
+            "is-extglob": "^2.1.0"
           }
         },
-        "regex-cache": {
-          "version": "0.4.4",
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
           "dev": true,
           "requires": {
-            "is-equal-shallow": "^0.1.3"
+            "is-buffer": "^1.1.5"
           }
         },
-        "regex-not": {
-          "version": "1.0.2",
+        "micromatch": {
+          "version": "2.3.11",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
+          "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
           "dev": true,
           "requires": {
-            "extend-shallow": "^3.0.2",
-            "safe-regex": "^1.1.0"
+            "arr-diff": "^2.0.0",
+            "array-unique": "^0.2.1",
+            "braces": "^1.8.2",
+            "expand-brackets": "^0.1.4",
+            "extglob": "^0.3.1",
+            "filename-regex": "^2.0.0",
+            "is-extglob": "^1.0.0",
+            "is-glob": "^2.0.1",
+            "kind-of": "^3.0.2",
+            "normalize-path": "^2.0.1",
+            "object.omit": "^2.0.0",
+            "parse-glob": "^3.0.4",
+            "regex-cache": "^0.4.2"
           },
           "dependencies": {
-            "extend-shallow": {
-              "version": "3.0.2",
-              "dev": true,
-              "requires": {
-                "assign-symbols": "^1.0.0",
-                "is-extendable": "^1.0.1"
-              }
-            },
-            "is-extendable": {
-              "version": "1.0.1",
-              "dev": true,
-              "requires": {
-                "is-plain-object": "^2.0.4"
-              }
+            "is-extglob": {
+              "version": "1.0.0",
+              "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+              "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
+              "dev": true
             },
-            "is-plain-object": {
-              "version": "2.0.4",
+            "is-glob": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+              "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
               "dev": true,
               "requires": {
-                "isobject": "^3.0.1"
+                "is-extglob": "^1.0.0"
               }
             }
           }
         },
-        "regexpp": {
-          "version": "3.2.0",
-          "dev": true
-        },
-        "remove-bom-buffer": {
-          "version": "3.0.0",
+        "normalize-path": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+          "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
           "dev": true,
           "requires": {
-            "is-buffer": "^1.1.5",
-            "is-utf8": "^0.2.1"
+            "remove-trailing-separator": "^1.0.1"
           }
-        },
-        "remove-bom-stream": {
-          "version": "1.2.0",
+        }
+      }
+    },
+    "gulplog": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz",
+      "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=",
+      "dev": true,
+      "requires": {
+        "glogg": "^1.0.0"
+      }
+    },
+    "has": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+      "dev": true,
+      "requires": {
+        "function-bind": "^1.1.1"
+      }
+    },
+    "has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "dev": true
+    },
+    "has-symbols": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
+      "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
+      "dev": true
+    },
+    "has-value": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+      "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+      "dev": true,
+      "requires": {
+        "get-value": "^2.0.6",
+        "has-values": "^1.0.0",
+        "isobject": "^3.0.0"
+      }
+    },
+    "has-values": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+      "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+      "dev": true,
+      "requires": {
+        "is-number": "^3.0.0",
+        "kind-of": "^4.0.0"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+          "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
           "dev": true,
           "requires": {
-            "remove-bom-buffer": "^3.0.0",
-            "safe-buffer": "^5.1.0",
-            "through2": "^2.0.3"
+            "is-buffer": "^1.1.5"
           }
-        },
-        "remove-trailing-separator": {
-          "version": "1.1.0",
-          "dev": true
-        },
-        "repeat-element": {
-          "version": "1.1.4",
-          "dev": true
-        },
-        "repeat-string": {
-          "version": "1.6.1",
-          "dev": true
-        },
-        "replace-ext": {
-          "version": "1.0.1",
-          "dev": true
-        },
-        "replace-homedir": {
-          "version": "1.0.0",
+        }
+      }
+    },
+    "hash-base": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz",
+      "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.4",
+        "readable-stream": "^3.6.0",
+        "safe-buffer": "^5.2.0"
+      },
+      "dependencies": {
+        "readable-stream": {
+          "version": "3.6.0",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
           "dev": true,
           "requires": {
-            "homedir-polyfill": "^1.0.1",
-            "is-absolute": "^1.0.0",
-            "remove-trailing-separator": "^1.1.0"
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
           }
         },
-        "require-directory": {
-          "version": "2.1.1",
+        "safe-buffer": {
+          "version": "5.2.1",
+          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+          "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
           "dev": true
-        },
-        "require-from-string": {
-          "version": "2.0.2",
+        }
+      }
+    },
+    "hash.js": {
+      "version": "1.1.7",
+      "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
+      "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.3",
+        "minimalistic-assert": "^1.0.1"
+      }
+    },
+    "hmac-drbg": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
+      "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
+      "dev": true,
+      "requires": {
+        "hash.js": "^1.0.3",
+        "minimalistic-assert": "^1.0.0",
+        "minimalistic-crypto-utils": "^1.0.1"
+      }
+    },
+    "homedir-polyfill": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz",
+      "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==",
+      "dev": true,
+      "requires": {
+        "parse-passwd": "^1.0.0"
+      }
+    },
+    "hosted-git-info": {
+      "version": "2.8.9",
+      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+      "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
+      "dev": true
+    },
+    "http-errors": {
+      "version": "1.8.1",
+      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz",
+      "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==",
+      "dev": true,
+      "requires": {
+        "depd": "~1.1.2",
+        "inherits": "2.0.4",
+        "setprototypeof": "1.2.0",
+        "statuses": ">= 1.5.0 < 2",
+        "toidentifier": "1.0.1"
+      }
+    },
+    "http-proxy": {
+      "version": "1.18.1",
+      "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
+      "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
+      "dev": true,
+      "requires": {
+        "eventemitter3": "^4.0.0",
+        "follow-redirects": "^1.0.0",
+        "requires-port": "^1.0.0"
+      }
+    },
+    "https-browserify": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
+      "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=",
+      "dev": true
+    },
+    "human-signals": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+      "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+      "dev": true
+    },
+    "iconv-lite": {
+      "version": "0.4.24",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+      "dev": true,
+      "requires": {
+        "safer-buffer": ">= 2.1.2 < 3"
+      }
+    },
+    "ieee754": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+      "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+      "dev": true
+    },
+    "iferr": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz",
+      "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=",
+      "dev": true
+    },
+    "ignore": {
+      "version": "4.0.6",
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
+      "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
+      "dev": true
+    },
+    "import-fresh": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+      "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+      "dev": true,
+      "requires": {
+        "parent-module": "^1.0.0",
+        "resolve-from": "^4.0.0"
+      }
+    },
+    "import-local": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
+      "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==",
+      "dev": true,
+      "requires": {
+        "pkg-dir": "^4.2.0",
+        "resolve-cwd": "^3.0.0"
+      }
+    },
+    "imurmurhash": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+      "dev": true
+    },
+    "infer-owner": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz",
+      "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==",
+      "dev": true
+    },
+    "inflight": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+      "dev": true,
+      "requires": {
+        "once": "^1.3.0",
+        "wrappy": "1"
+      }
+    },
+    "inherits": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+    },
+    "ini": {
+      "version": "1.3.8",
+      "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+      "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+      "dev": true
+    },
+    "inquirer": {
+      "version": "7.3.3",
+      "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz",
+      "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==",
+      "dev": true,
+      "requires": {
+        "ansi-escapes": "^4.2.1",
+        "chalk": "^4.1.0",
+        "cli-cursor": "^3.1.0",
+        "cli-width": "^3.0.0",
+        "external-editor": "^3.0.3",
+        "figures": "^3.0.0",
+        "lodash": "^4.17.19",
+        "mute-stream": "0.0.8",
+        "run-async": "^2.4.0",
+        "rxjs": "^6.6.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0",
+        "through": "^2.3.6"
+      }
+    },
+    "interpret": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz",
+      "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==",
+      "dev": true
+    },
+    "invert-kv": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
+      "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
+      "dev": true
+    },
+    "is-absolute": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz",
+      "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==",
+      "dev": true,
+      "requires": {
+        "is-relative": "^1.0.0",
+        "is-windows": "^1.0.1"
+      }
+    },
+    "is-accessor-descriptor": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+      "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+      "dev": true,
+      "requires": {
+        "kind-of": "^6.0.0"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "6.0.3",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+          "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
           "dev": true
-        },
-        "require-main-filename": {
-          "version": "1.0.1",
+        }
+      }
+    },
+    "is-arrayish": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+      "dev": true
+    },
+    "is-binary-path": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
+      "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
+      "dev": true,
+      "requires": {
+        "binary-extensions": "^1.0.0"
+      }
+    },
+    "is-buffer": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+      "dev": true
+    },
+    "is-core-module": {
+      "version": "2.8.1",
+      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz",
+      "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==",
+      "dev": true,
+      "requires": {
+        "has": "^1.0.3"
+      }
+    },
+    "is-data-descriptor": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+      "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+      "dev": true,
+      "requires": {
+        "kind-of": "^6.0.0"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "6.0.3",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+          "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
           "dev": true
-        },
-        "requires-port": {
-          "version": "1.0.0",
+        }
+      }
+    },
+    "is-descriptor": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+      "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+      "dev": true,
+      "requires": {
+        "is-accessor-descriptor": "^1.0.0",
+        "is-data-descriptor": "^1.0.0",
+        "kind-of": "^6.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "6.0.3",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+          "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
           "dev": true
-        },
-        "resolve": {
-          "version": "1.20.0",
-          "dev": true,
-          "requires": {
-            "is-core-module": "^2.2.0",
-            "path-parse": "^1.0.6"
-          }
-        },
-        "resolve-cwd": {
-          "version": "3.0.0",
-          "dev": true,
-          "requires": {
-            "resolve-from": "^5.0.0"
-          },
-          "dependencies": {
-            "resolve-from": {
-              "version": "5.0.0",
-              "dev": true
-            }
-          }
-        },
-        "resolve-dir": {
-          "version": "1.0.1",
+        }
+      }
+    },
+    "is-dotfile": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz",
+      "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=",
+      "dev": true
+    },
+    "is-equal-shallow": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
+      "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
+      "dev": true,
+      "requires": {
+        "is-primitive": "^2.0.0"
+      }
+    },
+    "is-extendable": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+      "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+      "dev": true
+    },
+    "is-extglob": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+      "dev": true
+    },
+    "is-fullwidth-code-point": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+      "dev": true
+    },
+    "is-glob": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+      "dev": true,
+      "requires": {
+        "is-extglob": "^2.1.1"
+      }
+    },
+    "is-negated-glob": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz",
+      "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=",
+      "dev": true
+    },
+    "is-number": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+      "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+      "dev": true,
+      "requires": {
+        "kind-of": "^3.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
           "dev": true,
           "requires": {
-            "expand-tilde": "^2.0.0",
-            "global-modules": "^1.0.0"
+            "is-buffer": "^1.1.5"
           }
-        },
-        "resolve-from": {
-          "version": "4.0.0",
-          "dev": true
-        },
-        "resolve-options": {
-          "version": "1.1.0",
+        }
+      }
+    },
+    "is-plain-object": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
+      "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
+      "dev": true
+    },
+    "is-posix-bracket": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
+      "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=",
+      "dev": true
+    },
+    "is-primitive": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
+      "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=",
+      "dev": true
+    },
+    "is-relative": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz",
+      "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==",
+      "dev": true,
+      "requires": {
+        "is-unc-path": "^1.0.0"
+      }
+    },
+    "is-stream": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+      "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+      "dev": true
+    },
+    "is-unc-path": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz",
+      "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==",
+      "dev": true,
+      "requires": {
+        "unc-path-regex": "^0.1.2"
+      }
+    },
+    "is-utf8": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
+      "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
+      "dev": true
+    },
+    "is-valid-glob": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz",
+      "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=",
+      "dev": true
+    },
+    "is-windows": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+      "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+      "dev": true
+    },
+    "is-wsl": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
+      "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=",
+      "dev": true
+    },
+    "isarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+      "dev": true
+    },
+    "isbinaryfile": {
+      "version": "4.0.8",
+      "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.8.tgz",
+      "integrity": "sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w==",
+      "dev": true
+    },
+    "isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+      "dev": true
+    },
+    "isobject": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+      "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+      "dev": true
+    },
+    "jasmine-core": {
+      "version": "3.99.0",
+      "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.99.0.tgz",
+      "integrity": "sha512-+ZDaJlEfRopINQqgE+hvzRyDIQDeKfqqTvF8RzXsvU1yE3pBDRud2+Qfh9WvGgRpuzqxyQJVI6Amy5XQ11r/3w==",
+      "dev": true
+    },
+    "jest-worker": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
+      "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
+      "dev": true,
+      "requires": {
+        "@types/node": "*",
+        "merge-stream": "^2.0.0",
+        "supports-color": "^8.0.0"
+      },
+      "dependencies": {
+        "supports-color": {
+          "version": "8.1.1",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+          "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
           "dev": true,
           "requires": {
-            "value-or-function": "^3.0.0"
+            "has-flag": "^4.0.0"
           }
-        },
-        "resolve-url": {
-          "version": "0.2.1",
-          "dev": true
-        },
-        "restore-cursor": {
-          "version": "3.1.0",
+        }
+      }
+    },
+    "js-tokens": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+      "dev": true
+    },
+    "js-yaml": {
+      "version": "3.14.1",
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+      "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+      "dev": true,
+      "requires": {
+        "argparse": "^1.0.7",
+        "esprima": "^4.0.0"
+      }
+    },
+    "json-parse-better-errors": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
+      "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
+      "dev": true
+    },
+    "json-schema-traverse": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+      "dev": true
+    },
+    "json-stable-stringify-without-jsonify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+      "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+      "dev": true
+    },
+    "json5": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+      "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+      "dev": true,
+      "requires": {
+        "minimist": "^1.2.0"
+      }
+    },
+    "jsonfile": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+      "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.6",
+        "universalify": "^2.0.0"
+      }
+    },
+    "just-debounce": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.1.0.tgz",
+      "integrity": "sha512-qpcRocdkUmf+UTNBYx5w6dexX5J31AKK1OmPwH630a83DdVVUIngk55RSAiIGpQyoH0dlr872VHfPjnQnK1qDQ==",
+      "dev": true
+    },
+    "karma": {
+      "version": "6.3.16",
+      "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.16.tgz",
+      "integrity": "sha512-nEU50jLvDe5yvXqkEJRf8IuvddUkOY2x5Xc4WXHz6dxINgGDrgD2uqQWeVrJs4hbfNaotn+HQ1LZJ4yOXrL7xQ==",
+      "dev": true,
+      "requires": {
+        "body-parser": "^1.19.0",
+        "braces": "^3.0.2",
+        "chokidar": "^3.5.1",
+        "colors": "1.4.0",
+        "connect": "^3.7.0",
+        "di": "^0.0.1",
+        "dom-serialize": "^2.2.1",
+        "glob": "^7.1.7",
+        "graceful-fs": "^4.2.6",
+        "http-proxy": "^1.18.1",
+        "isbinaryfile": "^4.0.8",
+        "lodash": "^4.17.21",
+        "log4js": "^6.4.1",
+        "mime": "^2.5.2",
+        "minimatch": "^3.0.4",
+        "mkdirp": "^0.5.5",
+        "qjobs": "^1.2.0",
+        "range-parser": "^1.2.1",
+        "rimraf": "^3.0.2",
+        "socket.io": "^4.2.0",
+        "source-map": "^0.6.1",
+        "tmp": "^0.2.1",
+        "ua-parser-js": "^0.7.30",
+        "yargs": "^16.1.1"
+      },
+      "dependencies": {
+        "anymatch": {
+          "version": "3.1.2",
+          "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
+          "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
           "dev": true,
           "requires": {
-            "onetime": "^5.1.0",
-            "signal-exit": "^3.0.2"
+            "normalize-path": "^3.0.0",
+            "picomatch": "^2.0.4"
           }
         },
-        "ret": {
-          "version": "0.1.15",
-          "dev": true
-        },
-        "rfdc": {
-          "version": "1.3.0",
+        "binary-extensions": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+          "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
           "dev": true
         },
-        "rimraf": {
+        "braces": {
           "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+          "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
           "dev": true,
           "requires": {
-            "glob": "^7.1.3"
-          }
-        },
-        "ripemd160": {
-          "version": "2.0.2",
-          "dev": true,
-          "requires": {
-            "hash-base": "^3.0.0",
-            "inherits": "^2.0.1"
-          }
-        },
-        "run-async": {
-          "version": "2.4.1",
-          "dev": true
-        },
-        "run-queue": {
-          "version": "1.0.3",
-          "dev": true,
-          "requires": {
-            "aproba": "^1.1.1"
-          }
-        },
-        "rxjs": {
-          "version": "6.6.7",
-          "dev": true,
-          "requires": {
-            "tslib": "^1.9.0"
-          }
-        },
-        "safe-buffer": {
-          "version": "5.1.2",
-          "dev": true
-        },
-        "safe-regex": {
-          "version": "1.1.0",
-          "dev": true,
-          "requires": {
-            "ret": "~0.1.10"
+            "fill-range": "^7.0.1"
           }
         },
-        "safer-buffer": {
-          "version": "2.1.2",
-          "dev": true
-        },
-        "schema-utils": {
-          "version": "3.0.0",
+        "chokidar": {
+          "version": "3.5.3",
+          "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+          "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
           "dev": true,
           "requires": {
-            "@types/json-schema": "^7.0.6",
-            "ajv": "^6.12.5",
-            "ajv-keywords": "^3.5.2"
+            "anymatch": "~3.1.2",
+            "braces": "~3.0.2",
+            "fsevents": "~2.3.2",
+            "glob-parent": "~5.1.2",
+            "is-binary-path": "~2.1.0",
+            "is-glob": "~4.0.1",
+            "normalize-path": "~3.0.0",
+            "readdirp": "~3.6.0"
           }
         },
-        "semver": {
-          "version": "7.3.5",
+        "cliui": {
+          "version": "7.0.4",
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+          "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
           "dev": true,
           "requires": {
-            "lru-cache": "^6.0.0"
+            "string-width": "^4.2.0",
+            "strip-ansi": "^6.0.0",
+            "wrap-ansi": "^7.0.0"
           }
         },
-        "semver-greatest-satisfied-range": {
-          "version": "1.1.0",
+        "fill-range": {
+          "version": "7.0.1",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+          "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
           "dev": true,
           "requires": {
-            "sver-compat": "^1.5.0"
+            "to-regex-range": "^5.0.1"
           }
         },
-        "serialize-javascript": {
-          "version": "5.0.1",
+        "fsevents": {
+          "version": "2.3.2",
+          "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+          "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
           "dev": true,
-          "requires": {
-            "randombytes": "^2.1.0"
-          }
+          "optional": true
         },
-        "set-blocking": {
-          "version": "2.0.0",
+        "get-caller-file": {
+          "version": "2.0.5",
+          "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+          "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
           "dev": true
         },
-        "set-value": {
-          "version": "2.0.1",
+        "is-binary-path": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+          "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
           "dev": true,
           "requires": {
-            "extend-shallow": "^2.0.1",
-            "is-extendable": "^0.1.1",
-            "is-plain-object": "^2.0.3",
-            "split-string": "^3.0.1"
-          },
-          "dependencies": {
-            "is-plain-object": {
-              "version": "2.0.4",
-              "dev": true,
-              "requires": {
-                "isobject": "^3.0.1"
-              }
-            }
+            "binary-extensions": "^2.0.0"
           }
         },
-        "setimmediate": {
-          "version": "1.0.5",
-          "dev": true
-        },
-        "setprototypeof": {
-          "version": "1.1.1",
+        "is-number": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
           "dev": true
         },
-        "sha.js": {
-          "version": "2.4.11",
-          "dev": true,
-          "requires": {
-            "inherits": "^2.0.1",
-            "safe-buffer": "^5.0.1"
-          }
-        },
-        "shallow-clone": {
-          "version": "3.0.1",
+        "readdirp": {
+          "version": "3.6.0",
+          "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+          "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
           "dev": true,
           "requires": {
-            "kind-of": "^6.0.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "6.0.3",
-              "dev": true
-            }
+            "picomatch": "^2.2.1"
           }
         },
-        "shebang-command": {
-          "version": "2.0.0",
+        "to-regex-range": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+          "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
           "dev": true,
           "requires": {
-            "shebang-regex": "^3.0.0"
+            "is-number": "^7.0.0"
           }
         },
-        "shebang-regex": {
-          "version": "3.0.0",
-          "dev": true
-        },
-        "signal-exit": {
-          "version": "3.0.3",
-          "dev": true
-        },
-        "slash": {
-          "version": "1.0.0",
-          "dev": true
-        },
-        "slice-ansi": {
-          "version": "4.0.0",
+        "wrap-ansi": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+          "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
           "dev": true,
           "requires": {
             "ansi-styles": "^4.0.0",
-            "astral-regex": "^2.0.0",
-            "is-fullwidth-code-point": "^3.0.0"
-          }
-        },
-        "snapdragon": {
-          "version": "0.8.2",
-          "dev": true,
-          "requires": {
-            "base": "^0.11.1",
-            "debug": "^2.2.0",
-            "define-property": "^0.2.5",
-            "extend-shallow": "^2.0.1",
-            "map-cache": "^0.2.2",
-            "source-map": "^0.5.6",
-            "source-map-resolve": "^0.5.0",
-            "use": "^3.1.0"
-          },
-          "dependencies": {
-            "debug": {
-              "version": "2.6.9",
-              "dev": true,
-              "requires": {
-                "ms": "2.0.0"
-              }
-            },
-            "define-property": {
-              "version": "0.2.5",
-              "dev": true,
-              "requires": {
-                "is-descriptor": "^0.1.0"
-              }
-            },
-            "is-accessor-descriptor": {
-              "version": "0.1.6",
-              "dev": true,
-              "requires": {
-                "kind-of": "^3.0.2"
-              },
-              "dependencies": {
-                "kind-of": {
-                  "version": "3.2.2",
-                  "dev": true,
-                  "requires": {
-                    "is-buffer": "^1.1.5"
-                  }
-                }
-              }
-            },
-            "is-data-descriptor": {
-              "version": "0.1.4",
-              "dev": true,
-              "requires": {
-                "kind-of": "^3.0.2"
-              },
-              "dependencies": {
-                "kind-of": {
-                  "version": "3.2.2",
-                  "dev": true,
-                  "requires": {
-                    "is-buffer": "^1.1.5"
-                  }
-                }
-              }
-            },
-            "is-descriptor": {
-              "version": "0.1.6",
-              "dev": true,
-              "requires": {
-                "is-accessor-descriptor": "^0.1.6",
-                "is-data-descriptor": "^0.1.4",
-                "kind-of": "^5.0.0"
-              }
-            },
-            "ms": {
-              "version": "2.0.0",
-              "dev": true
-            },
-            "source-map": {
-              "version": "0.5.7",
-              "dev": true
-            }
-          }
-        },
-        "snapdragon-node": {
-          "version": "2.1.1",
-          "dev": true,
-          "requires": {
-            "define-property": "^1.0.0",
-            "isobject": "^3.0.0",
-            "snapdragon-util": "^3.0.1"
-          },
-          "dependencies": {
-            "define-property": {
-              "version": "1.0.0",
-              "dev": true,
-              "requires": {
-                "is-descriptor": "^1.0.0"
-              }
-            }
-          }
-        },
-        "snapdragon-util": {
-          "version": "3.0.1",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.2.0"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "dev": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            }
-          }
-        },
-        "socket.io": {
-          "version": "3.1.2",
-          "dev": true,
-          "requires": {
-            "@types/cookie": "^0.4.0",
-            "@types/cors": "^2.8.8",
-            "@types/node": ">=10.0.0",
-            "accepts": "~1.3.4",
-            "base64id": "~2.0.0",
-            "debug": "~4.3.1",
-            "engine.io": "~4.1.0",
-            "socket.io-adapter": "~2.1.0",
-            "socket.io-parser": "~4.0.3"
+            "string-width": "^4.1.0",
+            "strip-ansi": "^6.0.0"
           }
         },
-        "socket.io-adapter": {
-          "version": "2.1.0",
+        "y18n": {
+          "version": "5.0.8",
+          "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+          "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
           "dev": true
         },
-        "socket.io-parser": {
-          "version": "4.0.4",
+        "yargs": {
+          "version": "16.2.0",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+          "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
           "dev": true,
           "requires": {
-            "@types/component-emitter": "^1.2.10",
-            "component-emitter": "~1.3.0",
-            "debug": "~4.3.1"
+            "cliui": "^7.0.2",
+            "escalade": "^3.1.1",
+            "get-caller-file": "^2.0.5",
+            "require-directory": "^2.1.1",
+            "string-width": "^4.2.0",
+            "y18n": "^5.0.5",
+            "yargs-parser": "^20.2.2"
           }
         },
-        "source-list-map": {
-          "version": "2.0.1",
-          "dev": true
-        },
-        "source-map": {
-          "version": "0.6.1",
+        "yargs-parser": {
+          "version": "20.2.9",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+          "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
           "dev": true
-        },
-        "source-map-resolve": {
-          "version": "0.5.3",
+        }
+      }
+    },
+    "karma-chrome-launcher": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz",
+      "integrity": "sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg==",
+      "dev": true,
+      "requires": {
+        "which": "^1.2.1"
+      },
+      "dependencies": {
+        "which": {
+          "version": "1.3.1",
+          "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+          "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
           "dev": true,
           "requires": {
-            "atob": "^2.1.2",
-            "decode-uri-component": "^0.2.0",
-            "resolve-url": "^0.2.1",
-            "source-map-url": "^0.4.0",
-            "urix": "^0.1.0"
+            "isexe": "^2.0.0"
           }
-        },
-        "source-map-support": {
-          "version": "0.5.19",
+        }
+      }
+    },
+    "karma-jasmine": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-4.0.1.tgz",
+      "integrity": "sha512-h8XDAhTiZjJKzfkoO1laMH+zfNlra+dEQHUAjpn5JV1zCPtOIVWGQjLBrqhnzQa/hrU2XrZwSyBa6XjEBzfXzw==",
+      "dev": true,
+      "requires": {
+        "jasmine-core": "^3.6.0"
+      }
+    },
+    "kind-of": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+      "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+      "dev": true
+    },
+    "last-run": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz",
+      "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=",
+      "dev": true,
+      "requires": {
+        "default-resolution": "^2.0.0",
+        "es6-weak-map": "^2.0.1"
+      }
+    },
+    "lazystream": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz",
+      "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==",
+      "dev": true,
+      "requires": {
+        "readable-stream": "^2.0.5"
+      }
+    },
+    "lcid": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
+      "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
+      "dev": true,
+      "requires": {
+        "invert-kv": "^1.0.0"
+      }
+    },
+    "lead": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz",
+      "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=",
+      "dev": true,
+      "requires": {
+        "flush-write-stream": "^1.0.2"
+      }
+    },
+    "levn": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+      "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+      "dev": true,
+      "requires": {
+        "prelude-ls": "^1.2.1",
+        "type-check": "~0.4.0"
+      }
+    },
+    "liftoff": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz",
+      "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==",
+      "dev": true,
+      "requires": {
+        "extend": "^3.0.0",
+        "findup-sync": "^3.0.0",
+        "fined": "^1.0.1",
+        "flagged-respawn": "^1.0.0",
+        "is-plain-object": "^2.0.4",
+        "object.map": "^1.0.0",
+        "rechoir": "^0.6.2",
+        "resolve": "^1.1.7"
+      },
+      "dependencies": {
+        "is-plain-object": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+          "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
           "dev": true,
           "requires": {
-            "buffer-from": "^1.0.0",
-            "source-map": "^0.6.0"
+            "isobject": "^3.0.1"
           }
-        },
-        "source-map-url": {
-          "version": "0.4.1",
+        }
+      }
+    },
+    "load-json-file": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
+      "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "parse-json": "^2.2.0",
+        "pify": "^2.0.0",
+        "pinkie-promise": "^2.0.0",
+        "strip-bom": "^2.0.0"
+      }
+    },
+    "loader-runner": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz",
+      "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==",
+      "dev": true
+    },
+    "loader-utils": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
+      "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+      "dev": true,
+      "requires": {
+        "big.js": "^5.2.2",
+        "emojis-list": "^3.0.0",
+        "json5": "^1.0.1"
+      }
+    },
+    "locate-path": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+      "dev": true,
+      "requires": {
+        "p-locate": "^4.1.0"
+      }
+    },
+    "lodash": {
+      "version": "4.17.21",
+      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+      "dev": true
+    },
+    "lodash.clone": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz",
+      "integrity": "sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=",
+      "dev": true
+    },
+    "lodash.merge": {
+      "version": "4.6.2",
+      "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+      "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+      "dev": true
+    },
+    "lodash.some": {
+      "version": "4.6.0",
+      "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz",
+      "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=",
+      "dev": true
+    },
+    "lodash.truncate": {
+      "version": "4.4.2",
+      "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
+      "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=",
+      "dev": true
+    },
+    "log4js": {
+      "version": "6.4.1",
+      "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.4.1.tgz",
+      "integrity": "sha512-iUiYnXqAmNKiIZ1XSAitQ4TmNs8CdZYTAWINARF3LjnsLN8tY5m0vRwd6uuWj/yNY0YHxeZodnbmxKFUOM2rMg==",
+      "dev": true,
+      "requires": {
+        "date-format": "^4.0.3",
+        "debug": "^4.3.3",
+        "flatted": "^3.2.4",
+        "rfdc": "^1.3.0",
+        "streamroller": "^3.0.2"
+      }
+    },
+    "lru-cache": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+      "dev": true,
+      "requires": {
+        "yallist": "^4.0.0"
+      }
+    },
+    "make-dir": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
+      "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
+      "dev": true,
+      "requires": {
+        "pify": "^4.0.1",
+        "semver": "^5.6.0"
+      },
+      "dependencies": {
+        "pify": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+          "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
           "dev": true
         },
-        "sparkles": {
-          "version": "1.0.1",
+        "semver": {
+          "version": "5.7.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
           "dev": true
-        },
-        "spdx-correct": {
-          "version": "3.1.1",
-          "dev": true,
-          "requires": {
-            "spdx-expression-parse": "^3.0.0",
-            "spdx-license-ids": "^3.0.0"
-          }
-        },
-        "spdx-exceptions": {
-          "version": "2.3.0",
+        }
+      }
+    },
+    "make-iterator": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz",
+      "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==",
+      "dev": true,
+      "requires": {
+        "kind-of": "^6.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "6.0.3",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+          "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
           "dev": true
-        },
-        "spdx-expression-parse": {
-          "version": "3.0.1",
+        }
+      }
+    },
+    "map-cache": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+      "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+      "dev": true
+    },
+    "map-visit": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+      "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+      "dev": true,
+      "requires": {
+        "object-visit": "^1.0.0"
+      }
+    },
+    "matchdep": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz",
+      "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=",
+      "dev": true,
+      "requires": {
+        "findup-sync": "^2.0.0",
+        "micromatch": "^3.0.4",
+        "resolve": "^1.4.0",
+        "stack-trace": "0.0.10"
+      },
+      "dependencies": {
+        "findup-sync": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz",
+          "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=",
           "dev": true,
           "requires": {
-            "spdx-exceptions": "^2.1.0",
-            "spdx-license-ids": "^3.0.0"
+            "detect-file": "^1.0.0",
+            "is-glob": "^3.1.0",
+            "micromatch": "^3.0.4",
+            "resolve-dir": "^1.0.1"
           }
         },
-        "spdx-license-ids": {
-          "version": "3.0.9",
-          "dev": true
-        },
-        "split-string": {
+        "is-glob": {
           "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+          "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
           "dev": true,
           "requires": {
-            "extend-shallow": "^3.0.0"
-          },
-          "dependencies": {
-            "extend-shallow": {
-              "version": "3.0.2",
-              "dev": true,
-              "requires": {
-                "assign-symbols": "^1.0.0",
-                "is-extendable": "^1.0.1"
-              }
-            },
-            "is-extendable": {
-              "version": "1.0.1",
-              "dev": true,
-              "requires": {
-                "is-plain-object": "^2.0.4"
-              }
-            },
-            "is-plain-object": {
-              "version": "2.0.4",
-              "dev": true,
-              "requires": {
-                "isobject": "^3.0.1"
-              }
-            }
-          }
-        },
-        "sprintf-js": {
-          "version": "1.0.3",
-          "dev": true
-        },
-        "ssri": {
-          "version": "6.0.2",
-          "dev": true,
-          "requires": {
-            "figgy-pudding": "^3.5.1"
+            "is-extglob": "^2.1.0"
           }
-        },
-        "stack-trace": {
-          "version": "0.0.10",
-          "dev": true
-        },
-        "static-extend": {
-          "version": "0.1.2",
-          "dev": true,
-          "requires": {
-            "define-property": "^0.2.5",
-            "object-copy": "^0.1.0"
-          },
-          "dependencies": {
-            "define-property": {
-              "version": "0.2.5",
-              "dev": true,
-              "requires": {
-                "is-descriptor": "^0.1.0"
-              }
-            },
-            "is-accessor-descriptor": {
-              "version": "0.1.6",
-              "dev": true,
-              "requires": {
-                "kind-of": "^3.0.2"
-              },
-              "dependencies": {
-                "kind-of": {
-                  "version": "3.2.2",
-                  "dev": true,
-                  "requires": {
-                    "is-buffer": "^1.1.5"
-                  }
-                }
-              }
-            },
-            "is-data-descriptor": {
-              "version": "0.1.4",
-              "dev": true,
-              "requires": {
-                "kind-of": "^3.0.2"
-              },
-              "dependencies": {
-                "kind-of": {
-                  "version": "3.2.2",
-                  "dev": true,
-                  "requires": {
-                    "is-buffer": "^1.1.5"
-                  }
-                }
-              }
-            },
-            "is-descriptor": {
-              "version": "0.1.6",
-              "dev": true,
-              "requires": {
-                "is-accessor-descriptor": "^0.1.6",
-                "is-data-descriptor": "^0.1.4",
-                "kind-of": "^5.0.0"
-              }
-            }
+        }
+      }
+    },
+    "math-random": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz",
+      "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==",
+      "dev": true
+    },
+    "md5.js": {
+      "version": "1.3.5",
+      "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
+      "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
+      "dev": true,
+      "requires": {
+        "hash-base": "^3.0.0",
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.1.2"
+      }
+    },
+    "media-typer": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+      "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
+      "dev": true
+    },
+    "memory-fs": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz",
+      "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==",
+      "dev": true,
+      "requires": {
+        "errno": "^0.1.3",
+        "readable-stream": "^2.0.1"
+      }
+    },
+    "merge-stream": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+      "dev": true
+    },
+    "micromatch": {
+      "version": "3.1.10",
+      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+      "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+      "dev": true,
+      "requires": {
+        "arr-diff": "^4.0.0",
+        "array-unique": "^0.3.2",
+        "braces": "^2.3.1",
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "extglob": "^2.0.4",
+        "fragment-cache": "^0.2.1",
+        "kind-of": "^6.0.2",
+        "nanomatch": "^1.2.9",
+        "object.pick": "^1.3.0",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.2"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+          "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+          "dev": true,
+          "requires": {
+            "assign-symbols": "^1.0.0",
+            "is-extendable": "^1.0.1"
           }
         },
-        "stats.js": {
-          "version": "0.17.0"
-        },
-        "statuses": {
-          "version": "1.5.0",
-          "dev": true
-        },
-        "stream-browserify": {
-          "version": "2.0.2",
+        "is-extendable": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
           "dev": true,
           "requires": {
-            "inherits": "~2.0.1",
-            "readable-stream": "^2.0.2"
+            "is-plain-object": "^2.0.4"
           }
         },
-        "stream-each": {
-          "version": "1.2.3",
+        "is-plain-object": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+          "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
           "dev": true,
           "requires": {
-            "end-of-stream": "^1.1.0",
-            "stream-shift": "^1.0.0"
+            "isobject": "^3.0.1"
           }
         },
-        "stream-exhaust": {
-          "version": "1.0.2",
+        "kind-of": {
+          "version": "6.0.3",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+          "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
           "dev": true
-        },
-        "stream-http": {
-          "version": "2.8.3",
+        }
+      }
+    },
+    "miller-rabin": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
+      "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.0.0",
+        "brorand": "^1.0.1"
+      },
+      "dependencies": {
+        "bn.js": {
+          "version": "4.12.0",
+          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+          "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+          "dev": true
+        }
+      }
+    },
+    "mime": {
+      "version": "2.6.0",
+      "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz",
+      "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==",
+      "dev": true
+    },
+    "mime-db": {
+      "version": "1.51.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz",
+      "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==",
+      "dev": true
+    },
+    "mime-types": {
+      "version": "2.1.34",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz",
+      "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==",
+      "dev": true,
+      "requires": {
+        "mime-db": "1.51.0"
+      }
+    },
+    "mimic-fn": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+      "dev": true
+    },
+    "minimalistic-assert": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+      "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
+      "dev": true
+    },
+    "minimalistic-crypto-utils": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
+      "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=",
+      "dev": true
+    },
+    "minimatch": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+      "dev": true,
+      "requires": {
+        "brace-expansion": "^1.1.7"
+      }
+    },
+    "minimist": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+      "dev": true
+    },
+    "mississippi": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz",
+      "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==",
+      "dev": true,
+      "requires": {
+        "concat-stream": "^1.5.0",
+        "duplexify": "^3.4.2",
+        "end-of-stream": "^1.1.0",
+        "flush-write-stream": "^1.0.0",
+        "from2": "^2.1.0",
+        "parallel-transform": "^1.1.0",
+        "pump": "^3.0.0",
+        "pumpify": "^1.3.3",
+        "stream-each": "^1.1.0",
+        "through2": "^2.0.0"
+      },
+      "dependencies": {
+        "pump": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+          "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
           "dev": true,
           "requires": {
-            "builtin-status-codes": "^3.0.0",
-            "inherits": "^2.0.1",
-            "readable-stream": "^2.3.6",
-            "to-arraybuffer": "^1.0.0",
-            "xtend": "^4.0.0"
+            "end-of-stream": "^1.1.0",
+            "once": "^1.3.1"
           }
-        },
-        "stream-shift": {
+        }
+      }
+    },
+    "mixin-deep": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
+      "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
+      "dev": true,
+      "requires": {
+        "for-in": "^1.0.2",
+        "is-extendable": "^1.0.1"
+      },
+      "dependencies": {
+        "is-extendable": {
           "version": "1.0.1",
-          "dev": true
-        },
-        "streamroller": {
-          "version": "2.2.4",
+          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
           "dev": true,
           "requires": {
-            "date-format": "^2.1.0",
-            "debug": "^4.1.1",
-            "fs-extra": "^8.1.0"
-          },
-          "dependencies": {
-            "date-format": {
-              "version": "2.1.0",
-              "dev": true
-            }
+            "is-plain-object": "^2.0.4"
           }
         },
-        "string_decoder": {
-          "version": "1.1.1",
+        "is-plain-object": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+          "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+          "dev": true,
+          "requires": {
+            "isobject": "^3.0.1"
+          }
+        }
+      }
+    },
+    "mkdirp": {
+      "version": "0.5.5",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+      "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+      "dev": true,
+      "requires": {
+        "minimist": "^1.2.5"
+      }
+    },
+    "move-concurrently": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
+      "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=",
+      "dev": true,
+      "requires": {
+        "aproba": "^1.1.1",
+        "copy-concurrently": "^1.0.0",
+        "fs-write-stream-atomic": "^1.0.8",
+        "mkdirp": "^0.5.1",
+        "rimraf": "^2.5.4",
+        "run-queue": "^1.0.3"
+      },
+      "dependencies": {
+        "rimraf": {
+          "version": "2.7.1",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        }
+      }
+    },
+    "ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+      "dev": true
+    },
+    "mute-stdout": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz",
+      "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==",
+      "dev": true
+    },
+    "mute-stream": {
+      "version": "0.0.8",
+      "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
+      "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
+      "dev": true
+    },
+    "nan": {
+      "version": "2.15.0",
+      "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz",
+      "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==",
+      "dev": true,
+      "optional": true
+    },
+    "nanomatch": {
+      "version": "1.2.13",
+      "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
+      "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
+      "dev": true,
+      "requires": {
+        "arr-diff": "^4.0.0",
+        "array-unique": "^0.3.2",
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "fragment-cache": "^0.2.1",
+        "is-windows": "^1.0.2",
+        "kind-of": "^6.0.2",
+        "object.pick": "^1.3.0",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.1"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+          "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
           "dev": true,
           "requires": {
-            "safe-buffer": "~5.1.0"
+            "assign-symbols": "^1.0.0",
+            "is-extendable": "^1.0.1"
           }
         },
-        "string-width": {
-          "version": "4.2.2",
+        "is-extendable": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
           "dev": true,
           "requires": {
-            "emoji-regex": "^8.0.0",
-            "is-fullwidth-code-point": "^3.0.0",
-            "strip-ansi": "^6.0.0"
+            "is-plain-object": "^2.0.4"
           }
         },
-        "strip-ansi": {
-          "version": "6.0.0",
+        "is-plain-object": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+          "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
           "dev": true,
           "requires": {
-            "ansi-regex": "^5.0.0"
+            "isobject": "^3.0.1"
           }
         },
-        "strip-bom": {
-          "version": "2.0.0",
+        "kind-of": {
+          "version": "6.0.3",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+          "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+          "dev": true
+        }
+      }
+    },
+    "natural-compare": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+      "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+      "dev": true
+    },
+    "negotiator": {
+      "version": "0.6.3",
+      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
+      "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+      "dev": true
+    },
+    "neo-async": {
+      "version": "2.6.2",
+      "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+      "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+      "dev": true
+    },
+    "next-tick": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
+      "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=",
+      "dev": true
+    },
+    "nice-try": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
+      "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
+      "dev": true
+    },
+    "node-libs-browser": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz",
+      "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==",
+      "dev": true,
+      "requires": {
+        "assert": "^1.1.1",
+        "browserify-zlib": "^0.2.0",
+        "buffer": "^4.3.0",
+        "console-browserify": "^1.1.0",
+        "constants-browserify": "^1.0.0",
+        "crypto-browserify": "^3.11.0",
+        "domain-browser": "^1.1.1",
+        "events": "^3.0.0",
+        "https-browserify": "^1.0.0",
+        "os-browserify": "^0.3.0",
+        "path-browserify": "0.0.1",
+        "process": "^0.11.10",
+        "punycode": "^1.2.4",
+        "querystring-es3": "^0.2.0",
+        "readable-stream": "^2.3.3",
+        "stream-browserify": "^2.0.1",
+        "stream-http": "^2.7.2",
+        "string_decoder": "^1.0.0",
+        "timers-browserify": "^2.0.4",
+        "tty-browserify": "0.0.0",
+        "url": "^0.11.0",
+        "util": "^0.11.0",
+        "vm-browserify": "^1.0.1"
+      },
+      "dependencies": {
+        "punycode": {
+          "version": "1.4.1",
+          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+          "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+          "dev": true
+        },
+        "stream-browserify": {
+          "version": "2.0.2",
+          "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz",
+          "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==",
           "dev": true,
           "requires": {
-            "is-utf8": "^0.2.0"
+            "inherits": "~2.0.1",
+            "readable-stream": "^2.0.2"
           }
-        },
-        "strip-bom-stream": {
-          "version": "2.0.0",
+        }
+      }
+    },
+    "node-releases": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz",
+      "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==",
+      "dev": true
+    },
+    "normalize-package-data": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+      "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+      "dev": true,
+      "requires": {
+        "hosted-git-info": "^2.1.4",
+        "resolve": "^1.10.0",
+        "semver": "2 || 3 || 4 || 5",
+        "validate-npm-package-license": "^3.0.1"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "5.7.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+          "dev": true
+        }
+      }
+    },
+    "normalize-path": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+      "dev": true
+    },
+    "now-and-later": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz",
+      "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==",
+      "dev": true,
+      "requires": {
+        "once": "^1.3.2"
+      }
+    },
+    "npm-run-path": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+      "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+      "dev": true,
+      "requires": {
+        "path-key": "^3.0.0"
+      }
+    },
+    "nth-check": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz",
+      "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==",
+      "requires": {
+        "boolbase": "^1.0.0"
+      }
+    },
+    "number-is-nan": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+      "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+      "dev": true
+    },
+    "object-assign": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+      "dev": true
+    },
+    "object-copy": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+      "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+      "dev": true,
+      "requires": {
+        "copy-descriptor": "^0.1.0",
+        "define-property": "^0.2.5",
+        "kind-of": "^3.0.3"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
           "dev": true,
           "requires": {
-            "first-chunk-stream": "^2.0.0",
-            "strip-bom": "^2.0.0"
+            "is-descriptor": "^0.1.0"
           }
         },
-        "strip-final-newline": {
-          "version": "2.0.0",
-          "dev": true
-        },
-        "strip-json-comments": {
-          "version": "3.1.1",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "7.2.0",
+        "is-accessor-descriptor": {
+          "version": "0.1.6",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+          "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
           "dev": true,
           "requires": {
-            "has-flag": "^4.0.0"
+            "kind-of": "^3.0.2"
           }
         },
-        "sver-compat": {
-          "version": "1.5.0",
+        "is-data-descriptor": {
+          "version": "0.1.4",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+          "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
           "dev": true,
           "requires": {
-            "es6-iterator": "^2.0.1",
-            "es6-symbol": "^3.1.1"
+            "kind-of": "^3.0.2"
           }
         },
-        "table": {
-          "version": "6.7.1",
+        "is-descriptor": {
+          "version": "0.1.6",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+          "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
           "dev": true,
           "requires": {
-            "ajv": "^8.0.1",
-            "lodash.clonedeep": "^4.5.0",
-            "lodash.truncate": "^4.4.2",
-            "slice-ansi": "^4.0.0",
-            "string-width": "^4.2.0",
-            "strip-ansi": "^6.0.0"
+            "is-accessor-descriptor": "^0.1.6",
+            "is-data-descriptor": "^0.1.4",
+            "kind-of": "^5.0.0"
           },
           "dependencies": {
-            "ajv": {
-              "version": "8.6.0",
-              "dev": true,
-              "requires": {
-                "fast-deep-equal": "^3.1.1",
-                "json-schema-traverse": "^1.0.0",
-                "require-from-string": "^2.0.2",
-                "uri-js": "^4.2.2"
-              }
-            },
-            "json-schema-traverse": {
-              "version": "1.0.0",
+            "kind-of": {
+              "version": "5.1.0",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+              "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
               "dev": true
             }
           }
         },
-        "tapable": {
-          "version": "2.2.0",
-          "dev": true
-        },
-        "terser": {
-          "version": "5.7.0",
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
           "dev": true,
           "requires": {
-            "commander": "^2.20.0",
-            "source-map": "~0.7.2",
-            "source-map-support": "~0.5.19"
-          },
-          "dependencies": {
-            "source-map": {
-              "version": "0.7.3",
-              "dev": true
-            }
+            "is-buffer": "^1.1.5"
           }
-        },
-        "terser-webpack-plugin": {
-          "version": "5.1.3",
+        }
+      }
+    },
+    "object-keys": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+      "dev": true
+    },
+    "object-visit": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+      "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+      "dev": true,
+      "requires": {
+        "isobject": "^3.0.0"
+      }
+    },
+    "object.assign": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
+      "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.0",
+        "define-properties": "^1.1.3",
+        "has-symbols": "^1.0.1",
+        "object-keys": "^1.1.1"
+      }
+    },
+    "object.defaults": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz",
+      "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=",
+      "dev": true,
+      "requires": {
+        "array-each": "^1.0.1",
+        "array-slice": "^1.0.0",
+        "for-own": "^1.0.0",
+        "isobject": "^3.0.0"
+      }
+    },
+    "object.map": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz",
+      "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=",
+      "dev": true,
+      "requires": {
+        "for-own": "^1.0.0",
+        "make-iterator": "^1.0.0"
+      }
+    },
+    "object.omit": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
+      "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
+      "dev": true,
+      "requires": {
+        "for-own": "^0.1.4",
+        "is-extendable": "^0.1.1"
+      },
+      "dependencies": {
+        "for-own": {
+          "version": "0.1.5",
+          "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
+          "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
           "dev": true,
           "requires": {
-            "jest-worker": "^27.0.2",
-            "p-limit": "^3.1.0",
-            "schema-utils": "^3.0.0",
-            "serialize-javascript": "^5.0.1",
-            "source-map": "^0.6.1",
-            "terser": "^5.7.0"
+            "for-in": "^1.0.1"
           }
-        },
-        "text-table": {
-          "version": "0.2.0",
-          "dev": true
-        },
-        "three": {
-          "version": "0.137.5",
-          "peer": true
-        },
-        "through": {
-          "version": "2.3.8",
+        }
+      }
+    },
+    "object.pick": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+      "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+      "dev": true,
+      "requires": {
+        "isobject": "^3.0.1"
+      }
+    },
+    "object.reduce": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz",
+      "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=",
+      "dev": true,
+      "requires": {
+        "for-own": "^1.0.0",
+        "make-iterator": "^1.0.0"
+      }
+    },
+    "on-finished": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+      "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
+      "dev": true,
+      "requires": {
+        "ee-first": "1.1.1"
+      }
+    },
+    "once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+      "dev": true,
+      "requires": {
+        "wrappy": "1"
+      }
+    },
+    "onetime": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+      "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+      "dev": true,
+      "requires": {
+        "mimic-fn": "^2.1.0"
+      }
+    },
+    "optionator": {
+      "version": "0.9.1",
+      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+      "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+      "dev": true,
+      "requires": {
+        "deep-is": "^0.1.3",
+        "fast-levenshtein": "^2.0.6",
+        "levn": "^0.4.1",
+        "prelude-ls": "^1.2.1",
+        "type-check": "^0.4.0",
+        "word-wrap": "^1.2.3"
+      }
+    },
+    "ordered-read-streams": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz",
+      "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=",
+      "dev": true,
+      "requires": {
+        "readable-stream": "^2.0.1"
+      }
+    },
+    "os-browserify": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
+      "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=",
+      "dev": true
+    },
+    "os-locale": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
+      "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
+      "dev": true,
+      "requires": {
+        "lcid": "^1.0.0"
+      }
+    },
+    "os-tmpdir": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+      "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
+      "dev": true
+    },
+    "p-limit": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+      "dev": true,
+      "requires": {
+        "p-try": "^2.0.0"
+      }
+    },
+    "p-locate": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+      "dev": true,
+      "requires": {
+        "p-limit": "^2.2.0"
+      }
+    },
+    "p-try": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+      "dev": true
+    },
+    "pako": {
+      "version": "1.0.11",
+      "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
+      "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
+      "dev": true
+    },
+    "parallel-transform": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz",
+      "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==",
+      "dev": true,
+      "requires": {
+        "cyclist": "^1.0.1",
+        "inherits": "^2.0.3",
+        "readable-stream": "^2.1.5"
+      }
+    },
+    "parent-module": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+      "dev": true,
+      "requires": {
+        "callsites": "^3.0.0"
+      }
+    },
+    "parse-asn1": {
+      "version": "5.1.6",
+      "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz",
+      "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==",
+      "dev": true,
+      "requires": {
+        "asn1.js": "^5.2.0",
+        "browserify-aes": "^1.0.0",
+        "evp_bytestokey": "^1.0.0",
+        "pbkdf2": "^3.0.3",
+        "safe-buffer": "^5.1.1"
+      }
+    },
+    "parse-filepath": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz",
+      "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=",
+      "dev": true,
+      "requires": {
+        "is-absolute": "^1.0.0",
+        "map-cache": "^0.2.0",
+        "path-root": "^0.1.1"
+      }
+    },
+    "parse-glob": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
+      "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
+      "dev": true,
+      "requires": {
+        "glob-base": "^0.3.0",
+        "is-dotfile": "^1.0.0",
+        "is-extglob": "^1.0.0",
+        "is-glob": "^2.0.0"
+      },
+      "dependencies": {
+        "is-extglob": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+          "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
           "dev": true
         },
-        "through2": {
-          "version": "2.0.5",
-          "dev": true,
-          "requires": {
-            "readable-stream": "~2.3.6",
-            "xtend": "~4.0.1"
-          }
-        },
-        "through2-filter": {
-          "version": "3.0.0",
+        "is-glob": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+          "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
           "dev": true,
           "requires": {
-            "through2": "~2.0.0",
-            "xtend": "~4.0.0"
+            "is-extglob": "^1.0.0"
           }
-        },
-        "time-stamp": {
+        }
+      }
+    },
+    "parse-json": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+      "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+      "dev": true,
+      "requires": {
+        "error-ex": "^1.2.0"
+      }
+    },
+    "parse-node-version": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz",
+      "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==",
+      "dev": true
+    },
+    "parse-passwd": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
+      "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
+      "dev": true
+    },
+    "parseurl": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+      "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+      "dev": true
+    },
+    "pascalcase": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+      "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+      "dev": true
+    },
+    "path-browserify": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz",
+      "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==",
+      "dev": true
+    },
+    "path-dirname": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+      "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+      "dev": true
+    },
+    "path-exists": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+      "dev": true
+    },
+    "path-is-absolute": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+      "dev": true
+    },
+    "path-key": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+      "dev": true
+    },
+    "path-parse": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+      "dev": true
+    },
+    "path-root": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz",
+      "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=",
+      "dev": true,
+      "requires": {
+        "path-root-regex": "^0.1.0"
+      }
+    },
+    "path-root-regex": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz",
+      "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=",
+      "dev": true
+    },
+    "path-type": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
+      "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "pify": "^2.0.0",
+        "pinkie-promise": "^2.0.0"
+      }
+    },
+    "pbkdf2": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz",
+      "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==",
+      "dev": true,
+      "requires": {
+        "create-hash": "^1.1.2",
+        "create-hmac": "^1.1.4",
+        "ripemd160": "^2.0.1",
+        "safe-buffer": "^5.0.1",
+        "sha.js": "^2.4.8"
+      }
+    },
+    "picocolors": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+      "dev": true
+    },
+    "picomatch": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+      "dev": true
+    },
+    "pify": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+      "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+      "dev": true
+    },
+    "pinkie": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+      "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
+      "dev": true
+    },
+    "pinkie-promise": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+      "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+      "dev": true,
+      "requires": {
+        "pinkie": "^2.0.0"
+      }
+    },
+    "pkg-dir": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+      "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+      "dev": true,
+      "requires": {
+        "find-up": "^4.0.0"
+      }
+    },
+    "plugin-error": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz",
+      "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==",
+      "dev": true,
+      "requires": {
+        "ansi-colors": "^1.0.1",
+        "arr-diff": "^4.0.0",
+        "arr-union": "^3.1.0",
+        "extend-shallow": "^3.0.2"
+      },
+      "dependencies": {
+        "ansi-colors": {
           "version": "1.1.0",
-          "dev": true
-        },
-        "timers-browserify": {
-          "version": "2.0.12",
-          "dev": true,
-          "requires": {
-            "setimmediate": "^1.0.4"
-          }
-        },
-        "tmp": {
-          "version": "0.2.1",
-          "dev": true,
-          "requires": {
-            "rimraf": "^3.0.0"
-          }
-        },
-        "to-absolute-glob": {
-          "version": "2.0.2",
-          "dev": true,
-          "requires": {
-            "is-absolute": "^1.0.0",
-            "is-negated-glob": "^1.0.0"
-          }
-        },
-        "to-arraybuffer": {
-          "version": "1.0.1",
-          "dev": true
-        },
-        "to-object-path": {
-          "version": "0.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
+          "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==",
           "dev": true,
           "requires": {
-            "kind-of": "^3.0.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "dev": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            }
+            "ansi-wrap": "^0.1.0"
           }
         },
-        "to-regex": {
+        "extend-shallow": {
           "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+          "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
           "dev": true,
           "requires": {
-            "define-property": "^2.0.2",
-            "extend-shallow": "^3.0.2",
-            "regex-not": "^1.0.2",
-            "safe-regex": "^1.1.0"
-          },
-          "dependencies": {
-            "extend-shallow": {
-              "version": "3.0.2",
-              "dev": true,
-              "requires": {
-                "assign-symbols": "^1.0.0",
-                "is-extendable": "^1.0.1"
-              }
-            },
-            "is-extendable": {
-              "version": "1.0.1",
-              "dev": true,
-              "requires": {
-                "is-plain-object": "^2.0.4"
-              }
-            },
-            "is-plain-object": {
-              "version": "2.0.4",
-              "dev": true,
-              "requires": {
-                "isobject": "^3.0.1"
-              }
-            }
+            "assign-symbols": "^1.0.0",
+            "is-extendable": "^1.0.1"
           }
         },
-        "to-regex-range": {
-          "version": "2.1.1",
+        "is-extendable": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
           "dev": true,
           "requires": {
-            "is-number": "^3.0.0",
-            "repeat-string": "^1.6.1"
+            "is-plain-object": "^2.0.4"
           }
         },
-        "to-through": {
-          "version": "2.0.0",
+        "is-plain-object": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+          "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
           "dev": true,
           "requires": {
-            "through2": "^2.0.3"
+            "isobject": "^3.0.1"
           }
-        },
-        "toidentifier": {
-          "version": "1.0.0",
-          "dev": true
-        },
-        "tslib": {
-          "version": "1.14.1",
+        }
+      }
+    },
+    "posix-character-classes": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+      "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+      "dev": true
+    },
+    "prelude-ls": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+      "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+      "dev": true
+    },
+    "preserve": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
+      "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=",
+      "dev": true
+    },
+    "prettier": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.1.tgz",
+      "integrity": "sha512-p+vNbgpLjif/+D+DwAZAbndtRrR0md0MwfmOVN9N+2RgyACMT+7tfaRnT+WDPkqnuVwleyuBIG2XBxKDme3hPA==",
+      "dev": true
+    },
+    "pretty-hrtime": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz",
+      "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=",
+      "dev": true
+    },
+    "process": {
+      "version": "0.11.10",
+      "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+      "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
+      "dev": true
+    },
+    "process-nextick-args": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+      "dev": true
+    },
+    "progress": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+      "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+      "dev": true
+    },
+    "promise-inflight": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
+      "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=",
+      "dev": true
+    },
+    "prr": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
+      "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
+      "dev": true
+    },
+    "public-encrypt": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
+      "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.1.0",
+        "browserify-rsa": "^4.0.0",
+        "create-hash": "^1.1.0",
+        "parse-asn1": "^5.0.0",
+        "randombytes": "^2.0.1",
+        "safe-buffer": "^5.1.2"
+      },
+      "dependencies": {
+        "bn.js": {
+          "version": "4.12.0",
+          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+          "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
           "dev": true
-        },
-        "tty-browserify": {
-          "version": "0.0.0",
+        }
+      }
+    },
+    "pump": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
+      "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
+      "dev": true,
+      "requires": {
+        "end-of-stream": "^1.1.0",
+        "once": "^1.3.1"
+      }
+    },
+    "pumpify": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz",
+      "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==",
+      "dev": true,
+      "requires": {
+        "duplexify": "^3.6.0",
+        "inherits": "^2.0.3",
+        "pump": "^2.0.0"
+      }
+    },
+    "punycode": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+      "dev": true
+    },
+    "qjobs": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz",
+      "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==",
+      "dev": true
+    },
+    "qs": {
+      "version": "6.9.7",
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz",
+      "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==",
+      "dev": true
+    },
+    "querystring": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
+      "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
+      "dev": true
+    },
+    "querystring-es3": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
+      "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=",
+      "dev": true
+    },
+    "randomatic": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz",
+      "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==",
+      "dev": true,
+      "requires": {
+        "is-number": "^4.0.0",
+        "kind-of": "^6.0.0",
+        "math-random": "^1.0.1"
+      },
+      "dependencies": {
+        "is-number": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+          "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
           "dev": true
         },
-        "type": {
-          "version": "1.2.0",
+        "kind-of": {
+          "version": "6.0.3",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+          "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
           "dev": true
-        },
-        "type-check": {
-          "version": "0.4.0",
+        }
+      }
+    },
+    "randombytes": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+      "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "^5.1.0"
+      }
+    },
+    "randomfill": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
+      "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
+      "dev": true,
+      "requires": {
+        "randombytes": "^2.0.5",
+        "safe-buffer": "^5.1.0"
+      }
+    },
+    "range-parser": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+      "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+      "dev": true
+    },
+    "raw-body": {
+      "version": "2.4.3",
+      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz",
+      "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==",
+      "dev": true,
+      "requires": {
+        "bytes": "3.1.2",
+        "http-errors": "1.8.1",
+        "iconv-lite": "0.4.24",
+        "unpipe": "1.0.0"
+      }
+    },
+    "read-pkg": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
+      "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
+      "dev": true,
+      "requires": {
+        "load-json-file": "^1.0.0",
+        "normalize-package-data": "^2.3.2",
+        "path-type": "^1.0.0"
+      }
+    },
+    "read-pkg-up": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
+      "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
+      "dev": true,
+      "requires": {
+        "find-up": "^1.0.0",
+        "read-pkg": "^1.0.0"
+      },
+      "dependencies": {
+        "find-up": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
+          "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
           "dev": true,
           "requires": {
-            "prelude-ls": "^1.2.1"
+            "path-exists": "^2.0.0",
+            "pinkie-promise": "^2.0.0"
           }
         },
-        "type-fest": {
-          "version": "0.20.2",
-          "dev": true
-        },
-        "type-is": {
-          "version": "1.6.18",
+        "path-exists": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+          "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
           "dev": true,
           "requires": {
-            "media-typer": "0.3.0",
-            "mime-types": "~2.1.24"
+            "pinkie-promise": "^2.0.0"
+          }
+        }
+      }
+    },
+    "readable-stream": {
+      "version": "2.3.7",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+      "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+      "dev": true,
+      "requires": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      }
+    },
+    "readdirp": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
+      "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.11",
+        "micromatch": "^3.1.10",
+        "readable-stream": "^2.0.2"
+      }
+    },
+    "rechoir": {
+      "version": "0.6.2",
+      "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
+      "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
+      "dev": true,
+      "requires": {
+        "resolve": "^1.1.6"
+      }
+    },
+    "regex-cache": {
+      "version": "0.4.4",
+      "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
+      "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
+      "dev": true,
+      "requires": {
+        "is-equal-shallow": "^0.1.3"
+      }
+    },
+    "regex-not": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+      "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+      "dev": true,
+      "requires": {
+        "extend-shallow": "^3.0.2",
+        "safe-regex": "^1.1.0"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+          "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+          "dev": true,
+          "requires": {
+            "assign-symbols": "^1.0.0",
+            "is-extendable": "^1.0.1"
           }
         },
-        "typedarray": {
-          "version": "0.0.6",
-          "dev": true
-        },
-        "ua-parser-js": {
-          "version": "0.7.28",
-          "dev": true
+        "is-extendable": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+          "dev": true,
+          "requires": {
+            "is-plain-object": "^2.0.4"
+          }
         },
-        "unc-path-regex": {
-          "version": "0.1.2",
+        "is-plain-object": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+          "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+          "dev": true,
+          "requires": {
+            "isobject": "^3.0.1"
+          }
+        }
+      }
+    },
+    "regexpp": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
+      "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
+      "dev": true
+    },
+    "remove-bom-buffer": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz",
+      "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==",
+      "dev": true,
+      "requires": {
+        "is-buffer": "^1.1.5",
+        "is-utf8": "^0.2.1"
+      }
+    },
+    "remove-bom-stream": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz",
+      "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=",
+      "dev": true,
+      "requires": {
+        "remove-bom-buffer": "^3.0.0",
+        "safe-buffer": "^5.1.0",
+        "through2": "^2.0.3"
+      }
+    },
+    "remove-trailing-separator": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
+      "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
+      "dev": true
+    },
+    "repeat-element": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz",
+      "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==",
+      "dev": true
+    },
+    "repeat-string": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+      "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+      "dev": true
+    },
+    "replace-ext": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz",
+      "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==",
+      "dev": true
+    },
+    "replace-homedir": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz",
+      "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=",
+      "dev": true,
+      "requires": {
+        "homedir-polyfill": "^1.0.1",
+        "is-absolute": "^1.0.0",
+        "remove-trailing-separator": "^1.1.0"
+      }
+    },
+    "require-directory": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+      "dev": true
+    },
+    "require-from-string": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+      "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+      "dev": true
+    },
+    "require-main-filename": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
+      "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
+      "dev": true
+    },
+    "requires-port": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+      "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
+      "dev": true
+    },
+    "resolve": {
+      "version": "1.22.0",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz",
+      "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==",
+      "dev": true,
+      "requires": {
+        "is-core-module": "^2.8.1",
+        "path-parse": "^1.0.7",
+        "supports-preserve-symlinks-flag": "^1.0.0"
+      }
+    },
+    "resolve-cwd": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
+      "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
+      "dev": true,
+      "requires": {
+        "resolve-from": "^5.0.0"
+      },
+      "dependencies": {
+        "resolve-from": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+          "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
           "dev": true
-        },
-        "undertaker": {
-          "version": "1.3.0",
+        }
+      }
+    },
+    "resolve-dir": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
+      "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
+      "dev": true,
+      "requires": {
+        "expand-tilde": "^2.0.0",
+        "global-modules": "^1.0.0"
+      }
+    },
+    "resolve-from": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+      "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+      "dev": true
+    },
+    "resolve-options": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz",
+      "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=",
+      "dev": true,
+      "requires": {
+        "value-or-function": "^3.0.0"
+      }
+    },
+    "resolve-url": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+      "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+      "dev": true
+    },
+    "restore-cursor": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
+      "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
+      "dev": true,
+      "requires": {
+        "onetime": "^5.1.0",
+        "signal-exit": "^3.0.2"
+      }
+    },
+    "ret": {
+      "version": "0.1.15",
+      "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+      "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+      "dev": true
+    },
+    "rfdc": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz",
+      "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==",
+      "dev": true
+    },
+    "rimraf": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+      "dev": true,
+      "requires": {
+        "glob": "^7.1.3"
+      }
+    },
+    "ripemd160": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
+      "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
+      "dev": true,
+      "requires": {
+        "hash-base": "^3.0.0",
+        "inherits": "^2.0.1"
+      }
+    },
+    "run-async": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
+      "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==",
+      "dev": true
+    },
+    "run-queue": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz",
+      "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=",
+      "dev": true,
+      "requires": {
+        "aproba": "^1.1.1"
+      }
+    },
+    "rxjs": {
+      "version": "6.6.7",
+      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz",
+      "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==",
+      "dev": true,
+      "requires": {
+        "tslib": "^1.9.0"
+      }
+    },
+    "safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+      "dev": true
+    },
+    "safe-regex": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+      "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+      "dev": true,
+      "requires": {
+        "ret": "~0.1.10"
+      }
+    },
+    "safer-buffer": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+      "dev": true
+    },
+    "schema-utils": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
+      "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
+      "dev": true,
+      "requires": {
+        "@types/json-schema": "^7.0.8",
+        "ajv": "^6.12.5",
+        "ajv-keywords": "^3.5.2"
+      }
+    },
+    "semver": {
+      "version": "7.3.5",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+      "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+      "dev": true,
+      "requires": {
+        "lru-cache": "^6.0.0"
+      }
+    },
+    "semver-greatest-satisfied-range": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz",
+      "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=",
+      "dev": true,
+      "requires": {
+        "sver-compat": "^1.5.0"
+      }
+    },
+    "serialize-javascript": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
+      "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
+      "dev": true,
+      "requires": {
+        "randombytes": "^2.1.0"
+      }
+    },
+    "set-blocking": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
+      "dev": true
+    },
+    "set-value": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
+      "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
+      "dev": true,
+      "requires": {
+        "extend-shallow": "^2.0.1",
+        "is-extendable": "^0.1.1",
+        "is-plain-object": "^2.0.3",
+        "split-string": "^3.0.1"
+      },
+      "dependencies": {
+        "is-plain-object": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+          "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
           "dev": true,
           "requires": {
-            "arr-flatten": "^1.0.1",
-            "arr-map": "^2.0.0",
-            "bach": "^1.0.0",
-            "collection-map": "^1.0.0",
-            "es6-weak-map": "^2.0.1",
-            "fast-levenshtein": "^1.0.0",
-            "last-run": "^1.1.0",
-            "object.defaults": "^1.0.0",
-            "object.reduce": "^1.0.0",
-            "undertaker-registry": "^1.0.0"
-          },
-          "dependencies": {
-            "fast-levenshtein": {
-              "version": "1.1.4",
-              "dev": true
-            }
+            "isobject": "^3.0.1"
           }
-        },
-        "undertaker-registry": {
-          "version": "1.0.1",
+        }
+      }
+    },
+    "setimmediate": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
+      "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=",
+      "dev": true
+    },
+    "setprototypeof": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+      "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
+      "dev": true
+    },
+    "sha.js": {
+      "version": "2.4.11",
+      "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
+      "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "shadergraph": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/shadergraph/-/shadergraph-2.1.3.tgz",
+      "integrity": "sha512-98Objdkj8OTNIuYG5wxkAZTdPsBEGXuDq8yveqQh0QVzBBkEObb6RA3sMozlOiWPQXycQ+Ng4ZmT2OJiokYplQ==",
+      "requires": {
+        "@sicmutils/glsl-parser": "^2.0.1",
+        "glsl-tokenizer": "^2.1.5"
+      }
+    },
+    "shallow-clone": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
+      "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
+      "dev": true,
+      "requires": {
+        "kind-of": "^6.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "6.0.3",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+          "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
           "dev": true
-        },
-        "union-value": {
-          "version": "1.0.1",
-          "dev": true,
-          "requires": {
-            "arr-union": "^3.1.0",
-            "get-value": "^2.0.6",
-            "is-extendable": "^0.1.1",
-            "set-value": "^2.0.1"
-          }
-        },
-        "unique-filename": {
-          "version": "1.1.1",
-          "dev": true,
-          "requires": {
-            "unique-slug": "^2.0.0"
-          }
-        },
-        "unique-slug": {
-          "version": "2.0.2",
+        }
+      }
+    },
+    "shebang-command": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+      "dev": true,
+      "requires": {
+        "shebang-regex": "^3.0.0"
+      }
+    },
+    "shebang-regex": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+      "dev": true
+    },
+    "signal-exit": {
+      "version": "3.0.7",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+      "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+      "dev": true
+    },
+    "slash": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
+      "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
+      "dev": true
+    },
+    "slice-ansi": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+      "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+      "dev": true,
+      "requires": {
+        "ansi-styles": "^4.0.0",
+        "astral-regex": "^2.0.0",
+        "is-fullwidth-code-point": "^3.0.0"
+      }
+    },
+    "snapdragon": {
+      "version": "0.8.2",
+      "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+      "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+      "dev": true,
+      "requires": {
+        "base": "^0.11.1",
+        "debug": "^2.2.0",
+        "define-property": "^0.2.5",
+        "extend-shallow": "^2.0.1",
+        "map-cache": "^0.2.2",
+        "source-map": "^0.5.6",
+        "source-map-resolve": "^0.5.0",
+        "use": "^3.1.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
           "dev": true,
           "requires": {
-            "imurmurhash": "^0.1.4"
+            "ms": "2.0.0"
           }
         },
-        "unique-stream": {
-          "version": "2.3.1",
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
           "dev": true,
           "requires": {
-            "json-stable-stringify-without-jsonify": "^1.0.1",
-            "through2-filter": "^3.0.0"
+            "is-descriptor": "^0.1.0"
           }
         },
-        "universalify": {
-          "version": "0.1.2",
-          "dev": true
-        },
-        "unpipe": {
-          "version": "1.0.0",
-          "dev": true
-        },
-        "unset-value": {
-          "version": "1.0.0",
+        "is-accessor-descriptor": {
+          "version": "0.1.6",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+          "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
           "dev": true,
           "requires": {
-            "has-value": "^0.3.1",
-            "isobject": "^3.0.0"
+            "kind-of": "^3.0.2"
           },
           "dependencies": {
-            "has-value": {
-              "version": "0.3.1",
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
               "dev": true,
               "requires": {
-                "get-value": "^2.0.3",
-                "has-values": "^0.1.4",
-                "isobject": "^2.0.0"
-              },
-              "dependencies": {
-                "isobject": {
-                  "version": "2.1.0",
-                  "dev": true,
-                  "requires": {
-                    "isarray": "1.0.0"
-                  }
-                }
+                "is-buffer": "^1.1.5"
               }
-            },
-            "has-values": {
-              "version": "0.1.4",
-              "dev": true
-            }
-          }
-        },
-        "upath": {
-          "version": "1.2.0",
-          "dev": true
-        },
-        "uri-js": {
-          "version": "4.4.1",
-          "dev": true,
-          "requires": {
-            "punycode": "^2.1.0"
-          }
-        },
-        "urix": {
-          "version": "0.1.0",
-          "dev": true
-        },
-        "url": {
-          "version": "0.11.0",
-          "dev": true,
-          "requires": {
-            "punycode": "1.3.2",
-            "querystring": "0.2.0"
-          },
-          "dependencies": {
-            "punycode": {
-              "version": "1.3.2",
-              "dev": true
-            }
-          }
-        },
-        "use": {
-          "version": "3.1.1",
-          "dev": true
-        },
-        "util": {
-          "version": "0.11.1",
-          "dev": true,
-          "requires": {
-            "inherits": "2.0.3"
-          },
-          "dependencies": {
-            "inherits": {
-              "version": "2.0.3",
-              "dev": true
             }
           }
         },
-        "util-deprecate": {
-          "version": "1.0.2",
-          "dev": true
-        },
-        "utils-merge": {
-          "version": "1.0.1",
-          "dev": true
-        },
-        "v8-compile-cache": {
-          "version": "2.3.0",
-          "dev": true
-        },
-        "v8flags": {
-          "version": "3.2.0",
-          "dev": true,
-          "requires": {
-            "homedir-polyfill": "^1.0.1"
-          }
-        },
-        "validate-npm-package-license": {
-          "version": "3.0.4",
-          "dev": true,
-          "requires": {
-            "spdx-correct": "^3.0.0",
-            "spdx-expression-parse": "^3.0.0"
-          }
-        },
-        "value-or-function": {
-          "version": "3.0.0",
-          "dev": true
-        },
-        "vary": {
-          "version": "1.1.2",
-          "dev": true
-        },
-        "vinyl": {
-          "version": "2.2.1",
-          "dev": true,
-          "requires": {
-            "clone": "^2.1.1",
-            "clone-buffer": "^1.0.0",
-            "clone-stats": "^1.0.0",
-            "cloneable-readable": "^1.0.0",
-            "remove-trailing-separator": "^1.0.1",
-            "replace-ext": "^1.0.0"
-          }
-        },
-        "vinyl-file": {
-          "version": "2.0.0",
+        "is-data-descriptor": {
+          "version": "0.1.4",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+          "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
           "dev": true,
           "requires": {
-            "graceful-fs": "^4.1.2",
-            "pify": "^2.3.0",
-            "pinkie-promise": "^2.0.0",
-            "strip-bom": "^2.0.0",
-            "strip-bom-stream": "^2.0.0",
-            "vinyl": "^1.1.0"
+            "kind-of": "^3.0.2"
           },
           "dependencies": {
-            "clone": {
-              "version": "1.0.4",
-              "dev": true
-            },
-            "clone-stats": {
-              "version": "0.0.1",
-              "dev": true
-            },
-            "replace-ext": {
-              "version": "0.0.1",
-              "dev": true
-            },
-            "vinyl": {
-              "version": "1.2.0",
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
               "dev": true,
               "requires": {
-                "clone": "^1.0.0",
-                "clone-stats": "^0.0.1",
-                "replace-ext": "0.0.1"
+                "is-buffer": "^1.1.5"
               }
             }
           }
         },
-        "vinyl-fs": {
-          "version": "3.0.3",
-          "dev": true,
-          "requires": {
-            "fs-mkdirp-stream": "^1.0.0",
-            "glob-stream": "^6.1.0",
-            "graceful-fs": "^4.0.0",
-            "is-valid-glob": "^1.0.0",
-            "lazystream": "^1.0.0",
-            "lead": "^1.0.0",
-            "object.assign": "^4.0.4",
-            "pumpify": "^1.3.5",
-            "readable-stream": "^2.3.3",
-            "remove-bom-buffer": "^3.0.0",
-            "remove-bom-stream": "^1.2.0",
-            "resolve-options": "^1.1.0",
-            "through2": "^2.0.0",
-            "to-through": "^2.0.0",
-            "value-or-function": "^3.0.0",
-            "vinyl": "^2.0.0",
-            "vinyl-sourcemap": "^1.1.0"
-          }
-        },
-        "vinyl-sourcemap": {
-          "version": "1.1.0",
+        "is-descriptor": {
+          "version": "0.1.6",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+          "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
           "dev": true,
           "requires": {
-            "append-buffer": "^1.0.2",
-            "convert-source-map": "^1.5.0",
-            "graceful-fs": "^4.1.6",
-            "normalize-path": "^2.1.1",
-            "now-and-later": "^2.0.0",
-            "remove-bom-buffer": "^3.0.0",
-            "vinyl": "^2.0.0"
-          },
-          "dependencies": {
-            "normalize-path": {
-              "version": "2.1.1",
-              "dev": true,
-              "requires": {
-                "remove-trailing-separator": "^1.0.1"
-              }
-            }
+            "is-accessor-descriptor": "^0.1.6",
+            "is-data-descriptor": "^0.1.4",
+            "kind-of": "^5.0.0"
           }
         },
-        "vm-browserify": {
-          "version": "1.1.2",
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
           "dev": true
         },
-        "void-elements": {
-          "version": "2.0.1",
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
           "dev": true
-        },
-        "watchpack": {
-          "version": "2.2.0",
+        }
+      }
+    },
+    "snapdragon-node": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+      "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+      "dev": true,
+      "requires": {
+        "define-property": "^1.0.0",
+        "isobject": "^3.0.0",
+        "snapdragon-util": "^3.0.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
           "dev": true,
           "requires": {
-            "glob-to-regexp": "^0.4.1",
-            "graceful-fs": "^4.1.2"
+            "is-descriptor": "^1.0.0"
           }
-        },
-        "watchpack-chokidar2": {
-          "version": "2.0.1",
+        }
+      }
+    },
+    "snapdragon-util": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+      "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+      "dev": true,
+      "requires": {
+        "kind-of": "^3.2.0"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
           "dev": true,
-          "optional": true,
           "requires": {
-            "chokidar": "^2.1.8"
+            "is-buffer": "^1.1.5"
           }
-        },
-        "webpack": {
-          "version": "5.39.0",
+        }
+      }
+    },
+    "socket.io": {
+      "version": "4.4.1",
+      "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.4.1.tgz",
+      "integrity": "sha512-s04vrBswdQBUmuWJuuNTmXUVJhP0cVky8bBDhdkf8y0Ptsu7fKU2LuLbts9g+pdmAdyMMn8F/9Mf1/wbtUN0fg==",
+      "dev": true,
+      "requires": {
+        "accepts": "~1.3.4",
+        "base64id": "~2.0.0",
+        "debug": "~4.3.2",
+        "engine.io": "~6.1.0",
+        "socket.io-adapter": "~2.3.3",
+        "socket.io-parser": "~4.0.4"
+      }
+    },
+    "socket.io-adapter": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.3.tgz",
+      "integrity": "sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ==",
+      "dev": true
+    },
+    "socket.io-parser": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz",
+      "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==",
+      "dev": true,
+      "requires": {
+        "@types/component-emitter": "^1.2.10",
+        "component-emitter": "~1.3.0",
+        "debug": "~4.3.1"
+      }
+    },
+    "source-list-map": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
+      "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==",
+      "dev": true
+    },
+    "source-map": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+      "dev": true
+    },
+    "source-map-resolve": {
+      "version": "0.5.3",
+      "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
+      "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
+      "dev": true,
+      "requires": {
+        "atob": "^2.1.2",
+        "decode-uri-component": "^0.2.0",
+        "resolve-url": "^0.2.1",
+        "source-map-url": "^0.4.0",
+        "urix": "^0.1.0"
+      }
+    },
+    "source-map-support": {
+      "version": "0.5.21",
+      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+      "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+      "dev": true,
+      "requires": {
+        "buffer-from": "^1.0.0",
+        "source-map": "^0.6.0"
+      }
+    },
+    "source-map-url": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz",
+      "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==",
+      "dev": true
+    },
+    "sparkles": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz",
+      "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==",
+      "dev": true
+    },
+    "spawn-command": {
+      "version": "0.0.2-1",
+      "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz",
+      "integrity": "sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=",
+      "dev": true
+    },
+    "spdx-correct": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
+      "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
+      "dev": true,
+      "requires": {
+        "spdx-expression-parse": "^3.0.0",
+        "spdx-license-ids": "^3.0.0"
+      }
+    },
+    "spdx-exceptions": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
+      "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
+      "dev": true
+    },
+    "spdx-expression-parse": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+      "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+      "dev": true,
+      "requires": {
+        "spdx-exceptions": "^2.1.0",
+        "spdx-license-ids": "^3.0.0"
+      }
+    },
+    "spdx-license-ids": {
+      "version": "3.0.11",
+      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz",
+      "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==",
+      "dev": true
+    },
+    "split-string": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+      "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+      "dev": true,
+      "requires": {
+        "extend-shallow": "^3.0.0"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+          "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
           "dev": true,
           "requires": {
-            "@types/eslint-scope": "^3.7.0",
-            "@types/estree": "^0.0.47",
-            "@webassemblyjs/ast": "1.11.0",
-            "@webassemblyjs/wasm-edit": "1.11.0",
-            "@webassemblyjs/wasm-parser": "1.11.0",
-            "acorn": "^8.2.1",
-            "browserslist": "^4.14.5",
-            "chrome-trace-event": "^1.0.2",
-            "enhanced-resolve": "^5.8.0",
-            "es-module-lexer": "^0.4.0",
-            "eslint-scope": "5.1.1",
-            "events": "^3.2.0",
-            "glob-to-regexp": "^0.4.1",
-            "graceful-fs": "^4.2.4",
-            "json-parse-better-errors": "^1.0.2",
-            "loader-runner": "^4.2.0",
-            "mime-types": "^2.1.27",
-            "neo-async": "^2.6.2",
-            "schema-utils": "^3.0.0",
-            "tapable": "^2.1.1",
-            "terser-webpack-plugin": "^5.1.1",
-            "watchpack": "^2.2.0",
-            "webpack-sources": "^2.3.0"
-          },
-          "dependencies": {
-            "acorn": {
-              "version": "8.4.0",
-              "dev": true
-            }
+            "assign-symbols": "^1.0.0",
+            "is-extendable": "^1.0.1"
           }
         },
-        "webpack-cli": {
-          "version": "4.7.2",
+        "is-extendable": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
           "dev": true,
           "requires": {
-            "@discoveryjs/json-ext": "^0.5.0",
-            "@webpack-cli/configtest": "^1.0.4",
-            "@webpack-cli/info": "^1.3.0",
-            "@webpack-cli/serve": "^1.5.1",
-            "colorette": "^1.2.1",
-            "commander": "^7.0.0",
-            "execa": "^5.0.0",
-            "fastest-levenshtein": "^1.0.12",
-            "import-local": "^3.0.2",
-            "interpret": "^2.2.0",
-            "rechoir": "^0.7.0",
-            "v8-compile-cache": "^2.2.0",
-            "webpack-merge": "^5.7.3"
-          },
-          "dependencies": {
-            "commander": {
-              "version": "7.2.0",
-              "dev": true
-            },
-            "interpret": {
-              "version": "2.2.0",
-              "dev": true
-            },
-            "rechoir": {
-              "version": "0.7.0",
-              "dev": true,
-              "requires": {
-                "resolve": "^1.9.0"
-              }
-            }
+            "is-plain-object": "^2.0.4"
           }
         },
-        "webpack-merge": {
-          "version": "5.8.0",
+        "is-plain-object": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+          "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
           "dev": true,
           "requires": {
-            "clone-deep": "^4.0.1",
-            "wildcard": "^2.0.0"
+            "isobject": "^3.0.1"
           }
-        },
-        "webpack-sources": {
-          "version": "2.3.0",
+        }
+      }
+    },
+    "sprintf-js": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+      "dev": true
+    },
+    "ssri": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz",
+      "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==",
+      "dev": true,
+      "requires": {
+        "figgy-pudding": "^3.5.1"
+      }
+    },
+    "stack-trace": {
+      "version": "0.0.10",
+      "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+      "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+      "dev": true
+    },
+    "static-extend": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+      "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+      "dev": true,
+      "requires": {
+        "define-property": "^0.2.5",
+        "object-copy": "^0.1.0"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
           "dev": true,
           "requires": {
-            "source-list-map": "^2.0.1",
-            "source-map": "^0.6.1"
+            "is-descriptor": "^0.1.0"
           }
         },
-        "webpack-stream": {
-          "version": "6.1.2",
+        "is-accessor-descriptor": {
+          "version": "0.1.6",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+          "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
           "dev": true,
           "requires": {
-            "fancy-log": "^1.3.3",
-            "lodash.clone": "^4.3.2",
-            "lodash.some": "^4.2.2",
-            "memory-fs": "^0.5.0",
-            "plugin-error": "^1.0.1",
-            "supports-color": "^7.2.0",
-            "through": "^2.3.8",
-            "vinyl": "^2.1.0",
-            "webpack": "^4.26.1"
+            "kind-of": "^3.0.2"
           },
           "dependencies": {
-            "@webassemblyjs/ast": {
-              "version": "1.9.0",
-              "dev": true,
-              "requires": {
-                "@webassemblyjs/helper-module-context": "1.9.0",
-                "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
-                "@webassemblyjs/wast-parser": "1.9.0"
-              }
-            },
-            "@webassemblyjs/helper-api-error": {
-              "version": "1.9.0",
-              "dev": true
-            },
-            "@webassemblyjs/helper-buffer": {
-              "version": "1.9.0",
-              "dev": true
-            },
-            "@webassemblyjs/helper-wasm-bytecode": {
-              "version": "1.9.0",
-              "dev": true
-            },
-            "@webassemblyjs/helper-wasm-section": {
-              "version": "1.9.0",
-              "dev": true,
-              "requires": {
-                "@webassemblyjs/ast": "1.9.0",
-                "@webassemblyjs/helper-buffer": "1.9.0",
-                "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
-                "@webassemblyjs/wasm-gen": "1.9.0"
-              }
-            },
-            "@webassemblyjs/ieee754": {
-              "version": "1.9.0",
-              "dev": true,
-              "requires": {
-                "@xtuc/ieee754": "^1.2.0"
-              }
-            },
-            "@webassemblyjs/leb128": {
-              "version": "1.9.0",
-              "dev": true,
-              "requires": {
-                "@xtuc/long": "4.2.2"
-              }
-            },
-            "@webassemblyjs/utf8": {
-              "version": "1.9.0",
-              "dev": true
-            },
-            "@webassemblyjs/wasm-edit": {
-              "version": "1.9.0",
-              "dev": true,
-              "requires": {
-                "@webassemblyjs/ast": "1.9.0",
-                "@webassemblyjs/helper-buffer": "1.9.0",
-                "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
-                "@webassemblyjs/helper-wasm-section": "1.9.0",
-                "@webassemblyjs/wasm-gen": "1.9.0",
-                "@webassemblyjs/wasm-opt": "1.9.0",
-                "@webassemblyjs/wasm-parser": "1.9.0",
-                "@webassemblyjs/wast-printer": "1.9.0"
-              }
-            },
-            "@webassemblyjs/wasm-gen": {
-              "version": "1.9.0",
-              "dev": true,
-              "requires": {
-                "@webassemblyjs/ast": "1.9.0",
-                "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
-                "@webassemblyjs/ieee754": "1.9.0",
-                "@webassemblyjs/leb128": "1.9.0",
-                "@webassemblyjs/utf8": "1.9.0"
-              }
-            },
-            "@webassemblyjs/wasm-opt": {
-              "version": "1.9.0",
-              "dev": true,
-              "requires": {
-                "@webassemblyjs/ast": "1.9.0",
-                "@webassemblyjs/helper-buffer": "1.9.0",
-                "@webassemblyjs/wasm-gen": "1.9.0",
-                "@webassemblyjs/wasm-parser": "1.9.0"
-              }
-            },
-            "@webassemblyjs/wasm-parser": {
-              "version": "1.9.0",
-              "dev": true,
-              "requires": {
-                "@webassemblyjs/ast": "1.9.0",
-                "@webassemblyjs/helper-api-error": "1.9.0",
-                "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
-                "@webassemblyjs/ieee754": "1.9.0",
-                "@webassemblyjs/leb128": "1.9.0",
-                "@webassemblyjs/utf8": "1.9.0"
-              }
-            },
-            "@webassemblyjs/wast-printer": {
-              "version": "1.9.0",
-              "dev": true,
-              "requires": {
-                "@webassemblyjs/ast": "1.9.0",
-                "@webassemblyjs/wast-parser": "1.9.0",
-                "@xtuc/long": "4.2.2"
-              }
-            },
-            "acorn": {
-              "version": "6.4.2",
-              "dev": true
-            },
-            "anymatch": {
-              "version": "3.1.2",
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "normalize-path": "^3.0.0",
-                "picomatch": "^2.0.4"
-              }
-            },
-            "binary-extensions": {
-              "version": "2.2.0",
-              "dev": true,
-              "optional": true
-            },
-            "braces": {
-              "version": "3.0.2",
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "fill-range": "^7.0.1"
-              }
-            },
-            "chokidar": {
-              "version": "3.5.1",
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "anymatch": "~3.1.1",
-                "braces": "~3.0.2",
-                "fsevents": "~2.3.1",
-                "glob-parent": "~5.1.0",
-                "is-binary-path": "~2.1.0",
-                "is-glob": "~4.0.1",
-                "normalize-path": "~3.0.0",
-                "readdirp": "~3.5.0"
-              }
-            },
-            "enhanced-resolve": {
-              "version": "4.5.0",
-              "dev": true,
-              "requires": {
-                "graceful-fs": "^4.1.2",
-                "memory-fs": "^0.5.0",
-                "tapable": "^1.0.0"
-              }
-            },
-            "eslint-scope": {
-              "version": "4.0.3",
-              "dev": true,
-              "requires": {
-                "esrecurse": "^4.1.0",
-                "estraverse": "^4.1.1"
-              }
-            },
-            "fill-range": {
-              "version": "7.0.1",
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "to-regex-range": "^5.0.1"
-              }
-            },
-            "fsevents": {
-              "version": "2.3.2",
-              "dev": true,
-              "optional": true
-            },
-            "is-binary-path": {
-              "version": "2.1.0",
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "binary-extensions": "^2.0.0"
-              }
-            },
-            "is-number": {
-              "version": "7.0.0",
-              "dev": true,
-              "optional": true
-            },
-            "loader-runner": {
-              "version": "2.4.0",
-              "dev": true
-            },
-            "readdirp": {
-              "version": "3.5.0",
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "picomatch": "^2.2.1"
-              }
-            },
-            "schema-utils": {
-              "version": "1.0.0",
-              "dev": true,
-              "requires": {
-                "ajv": "^6.1.0",
-                "ajv-errors": "^1.0.0",
-                "ajv-keywords": "^3.1.0"
-              }
-            },
-            "serialize-javascript": {
-              "version": "4.0.0",
-              "dev": true,
-              "requires": {
-                "randombytes": "^2.1.0"
-              }
-            },
-            "tapable": {
-              "version": "1.1.3",
-              "dev": true
-            },
-            "terser": {
-              "version": "4.8.0",
-              "dev": true,
-              "requires": {
-                "commander": "^2.20.0",
-                "source-map": "~0.6.1",
-                "source-map-support": "~0.5.12"
-              }
-            },
-            "terser-webpack-plugin": {
-              "version": "1.4.5",
-              "dev": true,
-              "requires": {
-                "cacache": "^12.0.2",
-                "find-cache-dir": "^2.1.0",
-                "is-wsl": "^1.1.0",
-                "schema-utils": "^1.0.0",
-                "serialize-javascript": "^4.0.0",
-                "source-map": "^0.6.1",
-                "terser": "^4.1.2",
-                "webpack-sources": "^1.4.0",
-                "worker-farm": "^1.7.0"
-              }
-            },
-            "to-regex-range": {
-              "version": "5.0.1",
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "is-number": "^7.0.0"
-              }
-            },
-            "watchpack": {
-              "version": "1.7.5",
-              "dev": true,
-              "requires": {
-                "chokidar": "^3.4.1",
-                "graceful-fs": "^4.1.2",
-                "neo-async": "^2.5.0",
-                "watchpack-chokidar2": "^2.0.1"
-              }
-            },
-            "webpack": {
-              "version": "4.46.0",
-              "dev": true,
-              "requires": {
-                "@webassemblyjs/ast": "1.9.0",
-                "@webassemblyjs/helper-module-context": "1.9.0",
-                "@webassemblyjs/wasm-edit": "1.9.0",
-                "@webassemblyjs/wasm-parser": "1.9.0",
-                "acorn": "^6.4.1",
-                "ajv": "^6.10.2",
-                "ajv-keywords": "^3.4.1",
-                "chrome-trace-event": "^1.0.2",
-                "enhanced-resolve": "^4.5.0",
-                "eslint-scope": "^4.0.3",
-                "json-parse-better-errors": "^1.0.2",
-                "loader-runner": "^2.4.0",
-                "loader-utils": "^1.2.3",
-                "memory-fs": "^0.4.1",
-                "micromatch": "^3.1.10",
-                "mkdirp": "^0.5.3",
-                "neo-async": "^2.6.1",
-                "node-libs-browser": "^2.2.1",
-                "schema-utils": "^1.0.0",
-                "tapable": "^1.1.3",
-                "terser-webpack-plugin": "^1.4.3",
-                "watchpack": "^1.7.4",
-                "webpack-sources": "^1.4.1"
-              },
-              "dependencies": {
-                "memory-fs": {
-                  "version": "0.4.1",
-                  "dev": true,
-                  "requires": {
-                    "errno": "^0.1.3",
-                    "readable-stream": "^2.0.1"
-                  }
-                }
-              }
-            },
-            "webpack-sources": {
-              "version": "1.4.3",
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
               "dev": true,
               "requires": {
-                "source-list-map": "^2.0.0",
-                "source-map": "~0.6.1"
-              }
-            }
-          }
-        },
-        "which": {
-          "version": "2.0.2",
-          "dev": true,
-          "requires": {
-            "isexe": "^2.0.0"
-          }
-        },
-        "which-module": {
-          "version": "1.0.0",
-          "dev": true
-        },
-        "wildcard": {
-          "version": "2.0.0",
-          "dev": true
-        },
-        "word-wrap": {
-          "version": "1.2.3",
-          "dev": true
-        },
-        "worker-farm": {
-          "version": "1.7.0",
-          "dev": true,
-          "requires": {
-            "errno": "~0.1.7"
+                "is-buffer": "^1.1.5"
+              }
+            }
           }
         },
-        "wrap-ansi": {
-          "version": "2.1.0",
+        "is-data-descriptor": {
+          "version": "0.1.4",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+          "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
           "dev": true,
           "requires": {
-            "string-width": "^1.0.1",
-            "strip-ansi": "^3.0.1"
+            "kind-of": "^3.0.2"
           },
           "dependencies": {
-            "ansi-regex": {
-              "version": "2.1.1",
-              "dev": true
-            },
-            "is-fullwidth-code-point": {
-              "version": "1.0.0",
-              "dev": true,
-              "requires": {
-                "number-is-nan": "^1.0.0"
-              }
-            },
-            "string-width": {
-              "version": "1.0.2",
-              "dev": true,
-              "requires": {
-                "code-point-at": "^1.0.0",
-                "is-fullwidth-code-point": "^1.0.0",
-                "strip-ansi": "^3.0.0"
-              }
-            },
-            "strip-ansi": {
-              "version": "3.0.1",
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
               "dev": true,
               "requires": {
-                "ansi-regex": "^2.0.0"
+                "is-buffer": "^1.1.5"
               }
             }
           }
         },
-        "wrappy": {
-          "version": "1.0.2",
-          "dev": true
-        },
-        "write": {
-          "version": "1.0.3",
+        "is-descriptor": {
+          "version": "0.1.6",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+          "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
           "dev": true,
           "requires": {
-            "mkdirp": "^0.5.1"
+            "is-accessor-descriptor": "^0.1.6",
+            "is-data-descriptor": "^0.1.4",
+            "kind-of": "^5.0.0"
           }
-        },
-        "ws": {
-          "version": "7.4.6",
+        }
+      }
+    },
+    "stats.js": {
+      "version": "0.17.0",
+      "resolved": "https://registry.npmjs.org/stats.js/-/stats.js-0.17.0.tgz",
+      "integrity": "sha1-scPcRtlEmLV4t/05hbgaznExzH0="
+    },
+    "statuses": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+      "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
+      "dev": true
+    },
+    "stream-each": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz",
+      "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==",
+      "dev": true,
+      "requires": {
+        "end-of-stream": "^1.1.0",
+        "stream-shift": "^1.0.0"
+      }
+    },
+    "stream-exhaust": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz",
+      "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==",
+      "dev": true
+    },
+    "stream-http": {
+      "version": "2.8.3",
+      "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz",
+      "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==",
+      "dev": true,
+      "requires": {
+        "builtin-status-codes": "^3.0.0",
+        "inherits": "^2.0.1",
+        "readable-stream": "^2.3.6",
+        "to-arraybuffer": "^1.0.0",
+        "xtend": "^4.0.0"
+      }
+    },
+    "stream-shift": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz",
+      "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==",
+      "dev": true
+    },
+    "streamroller": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.0.2.tgz",
+      "integrity": "sha512-ur6y5S5dopOaRXBuRIZ1u6GC5bcEXHRZKgfBjfCglMhmIf+roVCECjvkEYzNQOXIN2/JPnkMPW/8B3CZoKaEPA==",
+      "dev": true,
+      "requires": {
+        "date-format": "^4.0.3",
+        "debug": "^4.1.1",
+        "fs-extra": "^10.0.0"
+      }
+    },
+    "string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "~5.1.0"
+      }
+    },
+    "string-width": {
+      "version": "4.2.3",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+      "dev": true,
+      "requires": {
+        "emoji-regex": "^8.0.0",
+        "is-fullwidth-code-point": "^3.0.0",
+        "strip-ansi": "^6.0.1"
+      }
+    },
+    "strip-ansi": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+      "dev": true,
+      "requires": {
+        "ansi-regex": "^5.0.1"
+      }
+    },
+    "strip-bom": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+      "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+      "dev": true,
+      "requires": {
+        "is-utf8": "^0.2.0"
+      }
+    },
+    "strip-bom-stream": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz",
+      "integrity": "sha1-+H217yYT9paKpUWr/h7HKLaoKco=",
+      "dev": true,
+      "requires": {
+        "first-chunk-stream": "^2.0.0",
+        "strip-bom": "^2.0.0"
+      }
+    },
+    "strip-final-newline": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+      "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+      "dev": true
+    },
+    "strip-json-comments": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+      "dev": true
+    },
+    "supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "dev": true,
+      "requires": {
+        "has-flag": "^4.0.0"
+      }
+    },
+    "supports-preserve-symlinks-flag": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+      "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+      "dev": true
+    },
+    "sver-compat": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz",
+      "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=",
+      "dev": true,
+      "requires": {
+        "es6-iterator": "^2.0.1",
+        "es6-symbol": "^3.1.1"
+      }
+    },
+    "table": {
+      "version": "6.8.0",
+      "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz",
+      "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==",
+      "dev": true,
+      "requires": {
+        "ajv": "^8.0.1",
+        "lodash.truncate": "^4.4.2",
+        "slice-ansi": "^4.0.0",
+        "string-width": "^4.2.3",
+        "strip-ansi": "^6.0.1"
+      },
+      "dependencies": {
+        "ajv": {
+          "version": "8.10.0",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz",
+          "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==",
           "dev": true,
-          "requires": {}
+          "requires": {
+            "fast-deep-equal": "^3.1.1",
+            "json-schema-traverse": "^1.0.0",
+            "require-from-string": "^2.0.2",
+            "uri-js": "^4.2.2"
+          }
         },
-        "xtend": {
-          "version": "4.0.2",
+        "json-schema-traverse": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+          "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
           "dev": true
-        },
-        "y18n": {
-          "version": "3.2.2",
+        }
+      }
+    },
+    "tapable": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
+      "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
+      "dev": true
+    },
+    "terser": {
+      "version": "4.8.0",
+      "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz",
+      "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==",
+      "dev": true,
+      "requires": {
+        "commander": "^2.20.0",
+        "source-map": "~0.6.1",
+        "source-map-support": "~0.5.12"
+      },
+      "dependencies": {
+        "commander": {
+          "version": "2.20.3",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+          "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
           "dev": true
+        }
+      }
+    },
+    "terser-webpack-plugin": {
+      "version": "5.3.1",
+      "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz",
+      "integrity": "sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==",
+      "dev": true,
+      "requires": {
+        "jest-worker": "^27.4.5",
+        "schema-utils": "^3.1.1",
+        "serialize-javascript": "^6.0.0",
+        "source-map": "^0.6.1",
+        "terser": "^5.7.2"
+      },
+      "dependencies": {
+        "acorn": {
+          "version": "8.7.0",
+          "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz",
+          "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==",
+          "dev": true,
+          "optional": true,
+          "peer": true
         },
-        "yallist": {
-          "version": "4.0.0",
+        "commander": {
+          "version": "2.20.3",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+          "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
           "dev": true
         },
-        "yargs": {
-          "version": "7.1.2",
+        "terser": {
+          "version": "5.10.0",
+          "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz",
+          "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==",
           "dev": true,
           "requires": {
-            "camelcase": "^3.0.0",
-            "cliui": "^3.2.0",
-            "decamelize": "^1.1.1",
-            "get-caller-file": "^1.0.1",
-            "os-locale": "^1.4.0",
-            "read-pkg-up": "^1.0.1",
-            "require-directory": "^2.1.1",
-            "require-main-filename": "^1.0.1",
-            "set-blocking": "^2.0.0",
-            "string-width": "^1.0.2",
-            "which-module": "^1.0.0",
-            "y18n": "^3.2.1",
-            "yargs-parser": "^5.0.1"
+            "commander": "^2.20.0",
+            "source-map": "~0.7.2",
+            "source-map-support": "~0.5.20"
           },
           "dependencies": {
-            "ansi-regex": {
-              "version": "2.1.1",
+            "source-map": {
+              "version": "0.7.3",
+              "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
+              "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
               "dev": true
-            },
-            "is-fullwidth-code-point": {
-              "version": "1.0.0",
-              "dev": true,
-              "requires": {
-                "number-is-nan": "^1.0.0"
-              }
-            },
-            "string-width": {
-              "version": "1.0.2",
-              "dev": true,
-              "requires": {
-                "code-point-at": "^1.0.0",
-                "is-fullwidth-code-point": "^1.0.0",
-                "strip-ansi": "^3.0.0"
-              }
-            },
-            "strip-ansi": {
-              "version": "3.0.1",
-              "dev": true,
-              "requires": {
-                "ansi-regex": "^2.0.0"
-              }
             }
           }
-        },
-        "yargs-parser": {
-          "version": "5.0.1",
-          "dev": true,
-          "requires": {
-            "camelcase": "^3.0.0",
-            "object.assign": "^4.1.0"
-          }
-        },
-        "yocto-queue": {
-          "version": "0.1.0",
-          "dev": true
         }
       }
     },
+    "text-table": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+      "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+      "dev": true
+    },
+    "three": {
+      "version": "0.137.5",
+      "resolved": "https://registry.npmjs.org/three/-/three-0.137.5.tgz",
+      "integrity": "sha512-rTyr+HDFxjnN8+N/guZjDgfVxgHptZQpf6xfL/Mo7a5JYIFwK6tAq3bzxYYB4Ae0RosDZlDuP+X5aXDXz+XnHQ==",
+      "peer": true
+    },
+    "threestrap": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/threestrap/-/threestrap-0.4.1.tgz",
+      "integrity": "sha512-YGwdfKxTN1Jjq5eq1AHPdeAQiKiBWB22TxxQqTapoLznVeM4RdMm1Vh/Lyu6jLNlYapLmqb+NxQBxHaKwgABhw==",
+      "requires": {
+        "stats.js": "^0.17.0"
+      }
+    },
     "through": {
-      "version": "2.3.8"
+      "version": "2.3.8",
+      "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
+      "dev": true
     },
     "through2": {
       "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+      "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
       "dev": true,
       "requires": {
         "readable-stream": "~2.3.6",
@@ -48123,6 +18436,8 @@
     },
     "through2-filter": {
       "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz",
+      "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==",
       "dev": true,
       "requires": {
         "through2": "~2.0.0",
@@ -48131,10 +18446,14 @@
     },
     "time-stamp": {
       "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz",
+      "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=",
       "dev": true
     },
     "timers-browserify": {
       "version": "2.0.12",
+      "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz",
+      "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==",
       "dev": true,
       "requires": {
         "setimmediate": "^1.0.4"
@@ -48142,6 +18461,8 @@
     },
     "tmp": {
       "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz",
+      "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==",
       "dev": true,
       "requires": {
         "rimraf": "^3.0.0"
@@ -48149,6 +18470,8 @@
     },
     "to-absolute-glob": {
       "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz",
+      "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=",
       "dev": true,
       "requires": {
         "is-absolute": "^1.0.0",
@@ -48157,10 +18480,14 @@
     },
     "to-arraybuffer": {
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
+      "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=",
       "dev": true
     },
     "to-object-path": {
       "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+      "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
       "dev": true,
       "requires": {
         "kind-of": "^3.0.2"
@@ -48168,6 +18495,8 @@
       "dependencies": {
         "kind-of": {
           "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
           "dev": true,
           "requires": {
             "is-buffer": "^1.1.5"
@@ -48177,6 +18506,8 @@
     },
     "to-regex": {
       "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+      "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
       "dev": true,
       "requires": {
         "define-property": "^2.0.2",
@@ -48187,6 +18518,8 @@
       "dependencies": {
         "extend-shallow": {
           "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+          "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
           "dev": true,
           "requires": {
             "assign-symbols": "^1.0.0",
@@ -48195,6 +18528,8 @@
         },
         "is-extendable": {
           "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
           "dev": true,
           "requires": {
             "is-plain-object": "^2.0.4"
@@ -48202,6 +18537,8 @@
         },
         "is-plain-object": {
           "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+          "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
           "dev": true,
           "requires": {
             "isobject": "^3.0.1"
@@ -48211,6 +18548,8 @@
     },
     "to-regex-range": {
       "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+      "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
       "dev": true,
       "requires": {
         "is-number": "^3.0.0",
@@ -48219,6 +18558,8 @@
     },
     "to-through": {
       "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz",
+      "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=",
       "dev": true,
       "requires": {
         "through2": "^2.0.3"
@@ -48226,22 +18567,38 @@
     },
     "toidentifier": {
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+      "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+      "dev": true
+    },
+    "tree-kill": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
+      "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
       "dev": true
     },
     "tslib": {
       "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
       "dev": true
     },
     "tty-browserify": {
       "version": "0.0.0",
+      "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
+      "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=",
       "dev": true
     },
     "type": {
       "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
+      "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==",
       "dev": true
     },
     "type-check": {
       "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+      "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
       "dev": true,
       "requires": {
         "prelude-ls": "^1.2.1"
@@ -48249,10 +18606,14 @@
     },
     "type-fest": {
       "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+      "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
       "dev": true
     },
     "type-is": {
       "version": "1.6.18",
+      "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+      "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
       "dev": true,
       "requires": {
         "media-typer": "0.3.0",
@@ -48261,18 +18622,26 @@
     },
     "typedarray": {
       "version": "0.0.6",
+      "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+      "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
       "dev": true
     },
     "ua-parser-js": {
       "version": "0.7.31",
+      "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz",
+      "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==",
       "dev": true
     },
     "unc-path-regex": {
       "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
+      "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=",
       "dev": true
     },
     "undertaker": {
       "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.3.0.tgz",
+      "integrity": "sha512-/RXwi5m/Mu3H6IHQGww3GNt1PNXlbeCuclF2QYR14L/2CHPz3DFZkvB5hZ0N/QUkiXWCACML2jXViIQEQc2MLg==",
       "dev": true,
       "requires": {
         "arr-flatten": "^1.0.1",
@@ -48289,16 +18658,22 @@
       "dependencies": {
         "fast-levenshtein": {
           "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.1.4.tgz",
+          "integrity": "sha1-5qdUzI8V5YmHqpy9J69m/W9OWvk=",
           "dev": true
         }
       }
     },
     "undertaker-registry": {
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz",
+      "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=",
       "dev": true
     },
     "union-value": {
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
+      "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
       "dev": true,
       "requires": {
         "arr-union": "^3.1.0",
@@ -48309,6 +18684,8 @@
     },
     "unique-filename": {
       "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
+      "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
       "dev": true,
       "requires": {
         "unique-slug": "^2.0.0"
@@ -48316,6 +18693,8 @@
     },
     "unique-slug": {
       "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz",
+      "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==",
       "dev": true,
       "requires": {
         "imurmurhash": "^0.1.4"
@@ -48323,6 +18702,8 @@
     },
     "unique-stream": {
       "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz",
+      "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==",
       "dev": true,
       "requires": {
         "json-stable-stringify-without-jsonify": "^1.0.1",
@@ -48331,14 +18712,20 @@
     },
     "universalify": {
       "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+      "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
       "dev": true
     },
     "unpipe": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+      "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
       "dev": true
     },
     "unset-value": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+      "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
       "dev": true,
       "requires": {
         "has-value": "^0.3.1",
@@ -48347,6 +18734,8 @@
       "dependencies": {
         "has-value": {
           "version": "0.3.1",
+          "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+          "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
           "dev": true,
           "requires": {
             "get-value": "^2.0.3",
@@ -48356,6 +18745,8 @@
           "dependencies": {
             "isobject": {
               "version": "2.1.0",
+              "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+              "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
               "dev": true,
               "requires": {
                 "isarray": "1.0.0"
@@ -48365,16 +18756,22 @@
         },
         "has-values": {
           "version": "0.1.4",
+          "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+          "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
           "dev": true
         }
       }
     },
     "upath": {
       "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz",
+      "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==",
       "dev": true
     },
     "uri-js": {
       "version": "4.4.1",
+      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
       "dev": true,
       "requires": {
         "punycode": "^2.1.0"
@@ -48382,10 +18779,14 @@
     },
     "urix": {
       "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+      "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
       "dev": true
     },
     "url": {
       "version": "0.11.0",
+      "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
+      "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
       "dev": true,
       "requires": {
         "punycode": "1.3.2",
@@ -48394,16 +18795,22 @@
       "dependencies": {
         "punycode": {
           "version": "1.3.2",
+          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
+          "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
           "dev": true
         }
       }
     },
     "use": {
       "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
+      "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
       "dev": true
     },
     "util": {
       "version": "0.11.1",
+      "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz",
+      "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==",
       "dev": true,
       "requires": {
         "inherits": "2.0.3"
@@ -48411,24 +18818,34 @@
       "dependencies": {
         "inherits": {
           "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
           "dev": true
         }
       }
     },
     "util-deprecate": {
       "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
       "dev": true
     },
     "utils-merge": {
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+      "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
       "dev": true
     },
     "v8-compile-cache": {
       "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
+      "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
       "dev": true
     },
     "v8flags": {
       "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz",
+      "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==",
       "dev": true,
       "requires": {
         "homedir-polyfill": "^1.0.1"
@@ -48436,6 +18853,8 @@
     },
     "validate-npm-package-license": {
       "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+      "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
       "dev": true,
       "requires": {
         "spdx-correct": "^3.0.0",
@@ -48444,14 +18863,20 @@
     },
     "value-or-function": {
       "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz",
+      "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=",
       "dev": true
     },
     "vary": {
       "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+      "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
       "dev": true
     },
     "vinyl": {
       "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz",
+      "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==",
       "dev": true,
       "requires": {
         "clone": "^2.1.1",
@@ -48464,6 +18889,8 @@
     },
     "vinyl-file": {
       "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-2.0.0.tgz",
+      "integrity": "sha1-p+v1/779obfRjRQPyweyI++2dRo=",
       "dev": true,
       "requires": {
         "graceful-fs": "^4.1.2",
@@ -48476,18 +18903,26 @@
       "dependencies": {
         "clone": {
           "version": "1.0.4",
+          "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+          "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
           "dev": true
         },
         "clone-stats": {
           "version": "0.0.1",
+          "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz",
+          "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=",
           "dev": true
         },
         "replace-ext": {
           "version": "0.0.1",
+          "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz",
+          "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=",
           "dev": true
         },
         "vinyl": {
           "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz",
+          "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=",
           "dev": true,
           "requires": {
             "clone": "^1.0.0",
@@ -48499,6 +18934,8 @@
     },
     "vinyl-fs": {
       "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz",
+      "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==",
       "dev": true,
       "requires": {
         "fs-mkdirp-stream": "^1.0.0",
@@ -48522,6 +18959,8 @@
     },
     "vinyl-sourcemap": {
       "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz",
+      "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=",
       "dev": true,
       "requires": {
         "append-buffer": "^1.0.2",
@@ -48535,6 +18974,8 @@
       "dependencies": {
         "normalize-path": {
           "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+          "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
           "dev": true,
           "requires": {
             "remove-trailing-separator": "^1.0.1"
@@ -48544,14 +18985,20 @@
     },
     "vm-browserify": {
       "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
+      "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==",
       "dev": true
     },
     "void-elements": {
       "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz",
+      "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=",
       "dev": true
     },
     "watchpack": {
       "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz",
+      "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==",
       "dev": true,
       "requires": {
         "glob-to-regexp": "^0.4.1",
@@ -48560,6 +19007,8 @@
     },
     "watchpack-chokidar2": {
       "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz",
+      "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==",
       "dev": true,
       "optional": true,
       "requires": {
@@ -48567,7 +19016,9 @@
       }
     },
     "webpack": {
-      "version": "5.69.0",
+      "version": "5.69.1",
+      "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.69.1.tgz",
+      "integrity": "sha512-+VyvOSJXZMT2V5vLzOnDuMz5GxEqLk7hKWQ56YxPW/PQRUuKimPqmEIJOx8jHYeyo65pKbapbW464mvsKbaj4A==",
       "dev": true,
       "requires": {
         "@types/eslint-scope": "^3.7.3",
@@ -48579,7 +19030,7 @@
         "acorn-import-assertions": "^1.7.6",
         "browserslist": "^4.14.5",
         "chrome-trace-event": "^1.0.2",
-        "enhanced-resolve": "^5.9.0",
+        "enhanced-resolve": "^5.8.3",
         "es-module-lexer": "^0.9.0",
         "eslint-scope": "5.1.1",
         "events": "^3.2.0",
@@ -48598,10 +19049,14 @@
       "dependencies": {
         "acorn": {
           "version": "8.7.0",
+          "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz",
+          "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==",
           "dev": true
         },
         "acorn-import-assertions": {
           "version": "1.8.0",
+          "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz",
+          "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==",
           "dev": true,
           "requires": {}
         }
@@ -48609,6 +19064,8 @@
     },
     "webpack-cli": {
       "version": "4.9.2",
+      "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.2.tgz",
+      "integrity": "sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ==",
       "dev": true,
       "requires": {
         "@discoveryjs/json-ext": "^0.5.0",
@@ -48627,10 +19084,14 @@
       "dependencies": {
         "interpret": {
           "version": "2.2.0",
+          "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz",
+          "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==",
           "dev": true
         },
         "rechoir": {
           "version": "0.7.1",
+          "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz",
+          "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==",
           "dev": true,
           "requires": {
             "resolve": "^1.9.0"
@@ -48640,6 +19101,8 @@
     },
     "webpack-merge": {
       "version": "5.8.0",
+      "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz",
+      "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==",
       "dev": true,
       "requires": {
         "clone-deep": "^4.0.1",
@@ -48648,10 +19111,14 @@
     },
     "webpack-sources": {
       "version": "3.2.3",
+      "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
+      "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
       "dev": true
     },
     "webpack-stream": {
       "version": "6.1.2",
+      "resolved": "https://registry.npmjs.org/webpack-stream/-/webpack-stream-6.1.2.tgz",
+      "integrity": "sha512-Bpbsrix1cmWRN705JEg69ErgNAEOpQBvtuWKFW3ZCrLddoPPK6oVpQn4svxNdfedqMLlWA3GLOLvw4c7u63GqA==",
       "dev": true,
       "requires": {
         "fancy-log": "^1.3.3",
@@ -48667,6 +19134,8 @@
       "dependencies": {
         "@webassemblyjs/ast": {
           "version": "1.9.0",
+          "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz",
+          "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==",
           "dev": true,
           "requires": {
             "@webassemblyjs/helper-module-context": "1.9.0",
@@ -48676,18 +19145,26 @@
         },
         "@webassemblyjs/helper-api-error": {
           "version": "1.9.0",
+          "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz",
+          "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==",
           "dev": true
         },
         "@webassemblyjs/helper-buffer": {
           "version": "1.9.0",
+          "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz",
+          "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==",
           "dev": true
         },
         "@webassemblyjs/helper-wasm-bytecode": {
           "version": "1.9.0",
+          "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz",
+          "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==",
           "dev": true
         },
         "@webassemblyjs/helper-wasm-section": {
           "version": "1.9.0",
+          "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz",
+          "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==",
           "dev": true,
           "requires": {
             "@webassemblyjs/ast": "1.9.0",
@@ -48698,6 +19175,8 @@
         },
         "@webassemblyjs/ieee754": {
           "version": "1.9.0",
+          "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz",
+          "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==",
           "dev": true,
           "requires": {
             "@xtuc/ieee754": "^1.2.0"
@@ -48705,6 +19184,8 @@
         },
         "@webassemblyjs/leb128": {
           "version": "1.9.0",
+          "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz",
+          "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==",
           "dev": true,
           "requires": {
             "@xtuc/long": "4.2.2"
@@ -48712,10 +19193,14 @@
         },
         "@webassemblyjs/utf8": {
           "version": "1.9.0",
+          "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz",
+          "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==",
           "dev": true
         },
         "@webassemblyjs/wasm-edit": {
           "version": "1.9.0",
+          "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz",
+          "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==",
           "dev": true,
           "requires": {
             "@webassemblyjs/ast": "1.9.0",
@@ -48730,6 +19215,8 @@
         },
         "@webassemblyjs/wasm-gen": {
           "version": "1.9.0",
+          "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz",
+          "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==",
           "dev": true,
           "requires": {
             "@webassemblyjs/ast": "1.9.0",
@@ -48741,6 +19228,8 @@
         },
         "@webassemblyjs/wasm-opt": {
           "version": "1.9.0",
+          "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz",
+          "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==",
           "dev": true,
           "requires": {
             "@webassemblyjs/ast": "1.9.0",
@@ -48751,6 +19240,8 @@
         },
         "@webassemblyjs/wasm-parser": {
           "version": "1.9.0",
+          "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz",
+          "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==",
           "dev": true,
           "requires": {
             "@webassemblyjs/ast": "1.9.0",
@@ -48763,6 +19254,8 @@
         },
         "@webassemblyjs/wast-printer": {
           "version": "1.9.0",
+          "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz",
+          "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==",
           "dev": true,
           "requires": {
             "@webassemblyjs/ast": "1.9.0",
@@ -48772,10 +19265,14 @@
         },
         "acorn": {
           "version": "6.4.2",
+          "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz",
+          "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==",
           "dev": true
         },
         "anymatch": {
           "version": "3.1.2",
+          "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
+          "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
           "dev": true,
           "optional": true,
           "requires": {
@@ -48785,11 +19282,15 @@
         },
         "binary-extensions": {
           "version": "2.2.0",
+          "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+          "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
           "dev": true,
           "optional": true
         },
         "braces": {
           "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+          "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
           "dev": true,
           "optional": true,
           "requires": {
@@ -48798,6 +19299,8 @@
         },
         "chokidar": {
           "version": "3.5.3",
+          "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+          "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
           "dev": true,
           "optional": true,
           "requires": {
@@ -48813,6 +19316,8 @@
         },
         "enhanced-resolve": {
           "version": "4.5.0",
+          "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz",
+          "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==",
           "dev": true,
           "requires": {
             "graceful-fs": "^4.1.2",
@@ -48822,6 +19327,8 @@
         },
         "eslint-scope": {
           "version": "4.0.3",
+          "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz",
+          "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==",
           "dev": true,
           "requires": {
             "esrecurse": "^4.1.0",
@@ -48830,6 +19337,8 @@
         },
         "fill-range": {
           "version": "7.0.1",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+          "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
           "dev": true,
           "optional": true,
           "requires": {
@@ -48838,11 +19347,15 @@
         },
         "fsevents": {
           "version": "2.3.2",
+          "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+          "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
           "dev": true,
           "optional": true
         },
         "is-binary-path": {
           "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+          "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
           "dev": true,
           "optional": true,
           "requires": {
@@ -48851,15 +19364,21 @@
         },
         "is-number": {
           "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
           "dev": true,
           "optional": true
         },
         "loader-runner": {
           "version": "2.4.0",
+          "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz",
+          "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==",
           "dev": true
         },
         "readdirp": {
           "version": "3.6.0",
+          "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+          "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
           "dev": true,
           "optional": true,
           "requires": {
@@ -48868,6 +19387,8 @@
         },
         "schema-utils": {
           "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
+          "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
           "dev": true,
           "requires": {
             "ajv": "^6.1.0",
@@ -48877,6 +19398,8 @@
         },
         "serialize-javascript": {
           "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz",
+          "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==",
           "dev": true,
           "requires": {
             "randombytes": "^2.1.0"
@@ -48884,10 +19407,14 @@
         },
         "tapable": {
           "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz",
+          "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==",
           "dev": true
         },
         "terser-webpack-plugin": {
           "version": "1.4.5",
+          "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz",
+          "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==",
           "dev": true,
           "requires": {
             "cacache": "^12.0.2",
@@ -48903,6 +19430,8 @@
         },
         "to-regex-range": {
           "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+          "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
           "dev": true,
           "optional": true,
           "requires": {
@@ -48911,6 +19440,8 @@
         },
         "watchpack": {
           "version": "1.7.5",
+          "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz",
+          "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==",
           "dev": true,
           "requires": {
             "chokidar": "^3.4.1",
@@ -48921,6 +19452,8 @@
         },
         "webpack": {
           "version": "4.46.0",
+          "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz",
+          "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==",
           "dev": true,
           "requires": {
             "@webassemblyjs/ast": "1.9.0",
@@ -48950,6 +19483,8 @@
           "dependencies": {
             "memory-fs": {
               "version": "0.4.1",
+              "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
+              "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
               "dev": true,
               "requires": {
                 "errno": "^0.1.3",
@@ -48960,6 +19495,8 @@
         },
         "webpack-sources": {
           "version": "1.4.3",
+          "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz",
+          "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==",
           "dev": true,
           "requires": {
             "source-list-map": "^2.0.0",
@@ -48970,6 +19507,8 @@
     },
     "which": {
       "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
       "dev": true,
       "requires": {
         "isexe": "^2.0.0"
@@ -48977,18 +19516,26 @@
     },
     "which-module": {
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz",
+      "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=",
       "dev": true
     },
     "wildcard": {
       "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz",
+      "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==",
       "dev": true
     },
     "word-wrap": {
       "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+      "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
       "dev": true
     },
     "worker-farm": {
       "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz",
+      "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==",
       "dev": true,
       "requires": {
         "errno": "~0.1.7"
@@ -48996,6 +19543,8 @@
     },
     "wrap-ansi": {
       "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
+      "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
       "dev": true,
       "requires": {
         "string-width": "^1.0.1",
@@ -49004,10 +19553,14 @@
       "dependencies": {
         "ansi-regex": {
           "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
           "dev": true
         },
         "is-fullwidth-code-point": {
           "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+          "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
           "dev": true,
           "requires": {
             "number-is-nan": "^1.0.0"
@@ -49015,6 +19568,8 @@
         },
         "string-width": {
           "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+          "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
           "dev": true,
           "requires": {
             "code-point-at": "^1.0.0",
@@ -49024,6 +19579,8 @@
         },
         "strip-ansi": {
           "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+          "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
           "dev": true,
           "requires": {
             "ansi-regex": "^2.0.0"
@@ -49033,10 +19590,14 @@
     },
     "wrappy": {
       "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
       "dev": true
     },
     "write": {
       "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz",
+      "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
       "dev": true,
       "requires": {
         "mkdirp": "^0.5.1"
@@ -49044,23 +19605,32 @@
     },
     "ws": {
       "version": "8.2.3",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz",
+      "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==",
       "dev": true,
       "requires": {}
     },
     "xtend": {
       "version": "4.0.2",
-      "dev": true
+      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
     },
     "y18n": {
       "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz",
+      "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==",
       "dev": true
     },
     "yallist": {
       "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
       "dev": true
     },
     "yargs": {
       "version": "7.1.2",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.2.tgz",
+      "integrity": "sha512-ZEjj/dQYQy0Zx0lgLMLR8QuaqTihnxirir7EwUHp1Axq4e3+k8jXU5K0VLbNvedv1f4EWtBonDIZm0NUr+jCcA==",
       "dev": true,
       "requires": {
         "camelcase": "^3.0.0",
@@ -49080,10 +19650,14 @@
       "dependencies": {
         "ansi-regex": {
           "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
           "dev": true
         },
         "is-fullwidth-code-point": {
           "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+          "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
           "dev": true,
           "requires": {
             "number-is-nan": "^1.0.0"
@@ -49091,6 +19665,8 @@
         },
         "string-width": {
           "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+          "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
           "dev": true,
           "requires": {
             "code-point-at": "^1.0.0",
@@ -49100,6 +19676,8 @@
         },
         "strip-ansi": {
           "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+          "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
           "dev": true,
           "requires": {
             "ansi-regex": "^2.0.0"
@@ -49109,6 +19687,8 @@
     },
     "yargs-parser": {
       "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.1.tgz",
+      "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==",
       "dev": true,
       "requires": {
         "camelcase": "^3.0.0",
diff --git a/package.json b/package.json
index f836608a8ec992335c7f0584dd2a39737ec758ce..4910fbfb4c36469d4edcbdeae45fdadb439a963f 100644
--- a/package.json
+++ b/package.json
@@ -1,46 +1,62 @@
 {
   "name": "mathbox",
-  "version": "2.0.0",
+  "version": "2.1.1-dev",
   "description": "Presentation-quality WebGL math graphing",
   "repository": {
     "type": "git",
     "url": "https://gitgud.io/unconed/mathbox"
   },
-  "main": "src/index.js",
+  "module": "./src/index.js",
+  "exports": {
+    "import": "./src/index.js"
+  },
+  "main": "./src/index.js",
+  "files": [
+    "src",
+    "build",
+    "*.md",
+    "FUNDING.yml"
+  ],
   "scripts": {
-    "test": "gulp test",
-    "docs": "gulp docs",
-    "build": "gulp"
+    "docs": "npx webpack --config config/webpack.config.docs.js && node build_docs/generate.js > docs/primitives.md",
+    "build": "gulp",
+    "lint": "eslint src/",
+    "test": "webpack --config config/webpack.config.testing.js && karma start --single-run",
+    "test:watch": "concurrently 'webpack --watch --config config/webpack.config.testing.js' 'karma start'"
   },
   "prettier": {},
   "dependencies": {
-    "cssauron": "^1.4.0",
-    "shadergraph": "^2.1.0",
-    "threestrap": "^0.3.0"
+    "css-select": "^4.2.1",
+    "shadergraph": "^2.1.3",
+    "threestrap": "^0.4.1"
   },
   "peerDependencies": {
     "three": ">=0.118.0"
   },
   "devDependencies": {
+    "concurrently": "^7.0.0",
     "eslint": "^7.28.0",
     "eslint-plugin-jasmine": "^4.1.2",
     "gulp": "^4.0.2",
     "gulp-concat": "^2.6.1",
-    "gulp-eslint": "^6.0.0",
-    "gulp-jsify": "file:./vendor/gulp-jsify",
     "gulp-rename": "^2.0.0",
-    "gulp-shell": "^0.8.0",
     "gulp-watch": "^5.0.1",
     "jasmine-core": "^3.7.1",
     "karma": "^6.3.3",
     "karma-chrome-launcher": "^3.1.0",
     "karma-jasmine": "^4.0.1",
     "prettier": "2.3.1",
-    "stream-browserify": "^2.0.2",
     "webpack": "^5.38.1",
     "webpack-cli": "^4.7.2",
     "webpack-stream": "^6.1.2"
   },
   "author": "Steven Wittens",
-  "license": "MIT"
+  "license": "MIT",
+  "keywords": [
+    "mathbox",
+    "threejs",
+    "visualizations",
+    "mathematics",
+    "webgl"
+  ]
 }
diff --git a/src/docs/generate.js b/src/docs/generate.js
index 55eb5c0f040325383a9730120b00375dd3098b1f..863f4f15c21fba03a2eeb68826bff9782032e0b9 100644
--- a/src/docs/generate.js
+++ b/src/docs/generate.js
@@ -6,13 +6,11 @@
  * DS207: Consider shorter variations of null checks
  * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  */
-let def, _module, type;
-require("../node");
-
-const TraitDefs = require("./traits");
-const PrimitiveDefs = require("./primitives");
+import * as Primitives from '../primitives'
+import PrimitiveDefs from './primitives.js'
+import TraitDefs from './traits.js'
 
-const Primitives = require("../primitives");
+let def, _module, type;
 
 const defs = {};
 
@@ -25,7 +23,7 @@ for (type in Primitives.Types.Classes) {
     let ns;
     [trait, ns] = Array.from(trait.split(":"));
     const suffix = ns != null ? titleCase(ns) : "";
-    for (let k in TraitDefs[trait]) {
+    for (const k in TraitDefs[trait]) {
       const v = TraitDefs[trait][k];
       if (TraitDefs[trait] != null) {
         def[k + suffix] = v;
@@ -60,7 +58,7 @@ for (type in defs) {
   const props = Object.keys(def);
   props.sort();
 
-  for (let key of Array.from(props)) {
+  for (const key of Array.from(props)) {
     const prop = def[key];
 
     let ex =
@@ -92,7 +90,7 @@ types.sort();
 const modules = Object.keys(index);
 modules.sort();
 
-for (let m of modules) {
+for (const m of modules) {
   console.log(`#### ${m}\n\n`);
   console.log(index[m].join("\n"));
   console.log("\n");
diff --git a/src/docs/primitives.js b/src/docs/primitives.js
index 3935c4261c2fe8373de19687de50f6ca26252cd5..e69fafc2b6359723a9887277f4361b1b16054daf 100644
--- a/src/docs/primitives.js
+++ b/src/docs/primitives.js
@@ -1,6 +1,4 @@
-// TODO: This file was created by bulk-decaffeinate.
-// Sanity-check the conversion and remove this comment.
-export const Classes = {
+export default {
   axis: ["draw", "Draw an axis", {}, { end: "true", zBias: "-1" }],
   face: ["draw", "Draw polygon faces"],
   grid: ["draw", "Draw a 2D line grid", {}, { width: "1", zBias: "-2" }],
diff --git a/src/docs/traits.js b/src/docs/traits.js
index 0cf0a7f865fc4e60bd75947b8f3e0ebc7ff9215f..cb79f6cd2f5225067a931516d75c2d5327ab9dba 100644
--- a/src/docs/traits.js
+++ b/src/docs/traits.js
@@ -1,6 +1,4 @@
-// TODO: This file was created by bulk-decaffeinate.
-// Sanity-check the conversion and remove this comment.
-export const Traits = {
+export default {
   node: {
     id: ["Unique ID", "nullable string", "null", '"sampler"'],
     classes: ["Custom classes", "string array", "[]", '["big"]'],
@@ -226,7 +224,7 @@ export const Traits = {
     depth: ["Depth scaling", "number", 1],
   },
   line: {
-    size: ["Line width", "positive number", 2],
+    width: ["Line width", "positive number", 2],
     stroke: ["Line stroke (solid, dotted, dashed)", "stroke", '"solid"'],
     depth: ["Depth scaling", "number", 1],
     proximity: ["Proximity threshold", "nullable number", "null", "10"],
diff --git a/src/index.js b/src/index.js
index 614321d4acdf5df066bc0b68d251885b6e6a4b6b..ed355a18018e6663ea75cb7bb359315177a84f47 100644
--- a/src/index.js
+++ b/src/index.js
@@ -23,7 +23,7 @@ import * as util from "./util";
 import { Bootstrap } from "threestrap/src/bootstrap.js";
 import { Context as ctx } from "./context.js";
 
-export const version = "0.0.5";
+export const version = "2.1.1";
 
 // Just because
 export const π = Math.PI;
diff --git a/src/model/attributes.js b/src/model/attributes.js
index 846c6712b255c043cb2270ac42507c65a548b9cd..1674a32ee3ca7522d251716e017a822404adc0d4 100644
--- a/src/model/attributes.js
+++ b/src/model/attributes.js
@@ -72,7 +72,7 @@ export class Attributes {
 
   compute() {
     if (this.bound.length) {
-      for (let cb of Array.from(this.bound)) {
+      for (const cb of Array.from(this.bound)) {
         this.invoke(cb);
       }
     }
@@ -85,7 +85,7 @@ export class Attributes {
     }
 
     [calls, this.pending] = Array.from([this.pending, []]);
-    for (let callback of Array.from(calls)) {
+    for (const callback of Array.from(calls)) {
       callback();
     }
 
@@ -105,7 +105,7 @@ export class Attributes {
 
 const shallowCopy = function (x) {
   const out = {};
-  for (let k in x) {
+  for (const k in x) {
     const v = x[k];
     out[k] = v;
   }
@@ -115,7 +115,8 @@ const shallowCopy = function (x) {
 class Data {
   constructor(object, config, _attributes) {
     let key, ns, oldComputed, oldExpr, oldOrig, oldProps, spec;
-    let { traits, props, finals, freeform } = config;
+    let { props } = config;
+    const { traits, finals, freeform } = config;
     const data = this;
 
     // Save existing (original) values if re-applying
@@ -244,9 +245,9 @@ class Data {
 
     const _bound = {};
     const _eval = {};
-    var _expr = {};
-    var _computed = {};
-    var _finals = {};
+    const _expr = {};
+    const _computed = {};
+    const _finals = {};
 
     const bind = function (key, expression, computed) {
       if (computed == null) {
@@ -414,11 +415,11 @@ class Data {
 
     // Validate value for key
     const makers = {};
-    var validators = {};
+    const validators = {};
     const equalors = {};
 
-    var equals = (key, value, target) => equalors[key](value, target);
-    var validate = (key, value, target, invalid) =>
+    const equals = (key, value, target) => equalors[key](value, target);
+    const validate = (key, value, target, invalid) =>
       validators[key](value, target, invalid);
 
     object.validate = function (key, value) {
@@ -442,7 +443,7 @@ class Data {
     let changed = {};
     let touched = {};
     const getNS = (key) => key.split(".")[0];
-    var change = function (key, value) {
+    const change = function (key, value) {
       if (!dirty) {
         dirty = true;
         _attributes.queue(digest, object, key, value);
@@ -464,7 +465,7 @@ class Data {
     };
 
     // Notify listeners of accumulated changes
-    var digest = function () {
+    const digest = function () {
       // Swap double buffered changes objects
       let k;
       event.changed = changes;
@@ -488,7 +489,7 @@ class Data {
 
       return (() => {
         const result = [];
-        for (let trait in event.touched) {
+        for (const trait in event.touched) {
           event.type = `change:${trait}`;
           result.push(object.trigger(event));
         }
@@ -512,7 +513,7 @@ class Data {
       (() => {
         const result = [];
         for (let key in spec) {
-          var value;
+          let value;
           const type = spec[key];
           key = [name, key].join(".");
           const short = shorthand(key);
diff --git a/src/model/css-select-adapted.js b/src/model/css-select-adapted.js
new file mode 100644
index 0000000000000000000000000000000000000000..3923813dd5503b89a8d6ec89f5576d727c5168e2
--- /dev/null
+++ b/src/model/css-select-adapted.js
@@ -0,0 +1,78 @@
+import * as CSSselect from "css-select";
+import adapter from "./css-select-adapter.js";
+
+/**
+ * Returns a filtered array of elements which are contained in context.
+ */
+const filter = (nodes, context) => {
+  const out = [];
+  const contextNodes = Array.isArray(context) ? context : [context];
+  const contextSet = new Set(contextNodes);
+  for (const node of Array.from(nodes)) {
+    let ancestor = node;
+    while (ancestor != null) {
+      if (contextSet.has(ancestor)) {
+        out.push(node);
+        break;
+      }
+      ancestor = adapter.getParent(ancestor);
+    }
+  }
+  return out;
+};
+
+const getRoot = (element) => {
+  let ancestor = element;
+  while (adapter.getParent(ancestor) !== null) {
+    ancestor = adapter.getParent(ancestor);
+  }
+  return ancestor;
+};
+
+/**
+ * Finds elements in the given context matching the given css-selector.
+ *
+ * Does NOT throw if css query is invalid.
+ *
+ * @param {string} query A css selector
+ * @param {*} context Element or array of elements
+ * @returns All elements in context matching query
+ */
+export const selectAll = (query, context) => {
+  try {
+    /**
+     * Try/catch to tolerate invalid css queries.
+     * See https://gitgud.io/unconed/mathbox/-/issues/23
+     */
+    CSSselect.compile(query);
+  } catch (err) {
+    return [];
+  }
+
+  /**
+   * Delegate to css-select, except always make queries relative to root and
+   * filter matches outside of context ourselves. css-select does not currently
+   * handle contextualized queries relative to root correctly.
+   *
+   * See https://github.com/fb55/css-select/issues/709
+   */
+
+  const isArray = Array.isArray(context);
+  if (isArray && context.length === 0) return [];
+  const root = getRoot(isArray ? context[0] : context);
+  const matches = CSSselect.selectAll(query, root, { adapter });
+  if (context) return filter(matches, context);
+  return matches;
+};
+
+export const compile = (query) => {
+  try {
+    /**
+     * Try/catch to tolerate invalid css queries.
+     * See https://gitgud.io/unconed/mathbox/-/issues/23
+     */
+    return CSSselect.compile(query, { adapter });
+  } catch (err) {
+    return () => false;
+  }
+};
diff --git a/src/model/css-select-adapter.js b/src/model/css-select-adapter.js
new file mode 100644
index 0000000000000000000000000000000000000000..9d0a78705d4a735f0efe5d18898c0b67c1fdcd83
--- /dev/null
+++ b/src/model/css-select-adapter.js
@@ -0,0 +1,124 @@
+/**
+ * This file contains an *adapter* for css-select. css-select is a CSS selection
+ * engine for HTML that can be used with other data structures (XML, etc) via
+ * adapters. Here we define an adapter for MathBox's vdom.
+ *
+ * The adapter interface is described here:
+ *    https://github.com/fb55/css-select/blob/1aa44bdd64aaf2ebdfd7f338e2e76bed36521957/src/types.ts#L6-L96
+ *
+ * Nodes vs Elements:
+ * In general, CSS Selectors act on a document tree built from nodes, which can
+ * include element nodes and non-element nodes. For example, in HTML, tags are
+ * element nodes but lines of text are non-element node. Non-element text nodes
+ * can influence css selection, e.g., via :first-line pseudoclass, but these
+ * non-element nodes are never returned by selectors.
+ *
+ * Mathbox only has element nodes.
+ */
+
+/**
+ * Is this node an element node? Yes. Mathbox only has element nodes.
+ */
+function isTag(_elem) {
+  return true;
+}
+
+function getChildren(elem) {
+  return elem.children || [];
+}
+
+function getParent(elem) {
+  return elem.parent;
+}
+
+/**
+ * Takes an array of nodes, and removes any duplicates, as well as any
+ * nodes whose ancestors are also in the array.
+ */
+function removeSubsets(nodes) {
+  const deduped = new Set(nodes);
+
+  deduped.forEach((node) => {
+    let ancestor = node.parent;
+    while (ancestor) {
+      if (deduped.has(ancestor)) {
+        deduped.delete(node);
+        return;
+      }
+      ancestor = ancestor.parent;
+    }
+  });
+
+  return Array.from(deduped);
+}
+
+const adapter = {
+  isTag,
+  /**
+   * Does at least one of passed element nodes pass the test predicate?
+   */
+  existsOne(test, elems) {
+    return elems.some((elem) =>
+      isTag(elem)
+        ? test(elem) || adapter.existsOne(test, getChildren(elem))
+        : false
+    );
+  },
+  /**
+   * Get the siblings of the node. Note that unlike jQuery's `siblings` method,
+   * this is expected to include the current node as well
+   */
+  getSiblings(elem) {
+    const parent = getParent(elem);
+    return parent ? getChildren(parent) : [elem];
+  },
+  getChildren,
+  getParent,
+  getAttributeValue(elem, name) {
+    if (name === "class") return elem.props.classes.join(" ");
+    if (name === "id") return elem.id;
+    return "";
+  },
+  hasAttrib(elem, name) {
+    if (name === "id") return !!elem.id;
+    if (name === "class") return elem.props.classes.length > 0;
+    if (!elem.traits.hash) return false;
+    return Object.prototype.hasOwnProperty.call(elem.traits.hash, name);
+  },
+  removeSubsets,
+  getName(elem) {
+    return elem.type ?? "";
+  },
+  /**
+   * Finds the first node in the array that matches the test predicate, or one
+   * of its children.
+   */
+  findOne: function findOne(test, elems) {
+    for (const node of elems) {
+      if (test(node)) {
+        return node;
+      } else {
+        const match = findOne(test, getChildren(node));
+        if (match) return match;
+      }
+    }
+
+    return null;
+  },
+  findAll: function findAll(test, elems) {
+    const result = [];
+    for (const elem of elems) {
+      if (!isTag(elem)) continue;
+      if (test(elem)) {
+        result.push(elem);
+      }
+      result.push(...findAll(test, getChildren(elem)));
+    }
+    return result;
+  },
+  getText: function getText(_elem) {
+    return "";
+  },
+};
+
+export default adapter;
diff --git a/src/model/group.js b/src/model/group.js
index 969fa66e5959ccdb3718573c9a49d89f03c3ba33..4ddc6ba88ed16b8ce3a875b51d555d09edc7b846 100644
--- a/src/model/group.js
+++ b/src/model/group.js
@@ -53,7 +53,7 @@ export class Group extends Node {
 
   empty() {
     const children = this.children.slice().reverse();
-    for (let node of Array.from(children)) {
+    for (const node of Array.from(children)) {
       this.remove(node);
     }
   }
diff --git a/src/model/model.js b/src/model/model.js
index 767e02a6e70bd0ae092a01fa0e9821a78293e2bd..497f65c0e928d2fac9fc682c0497e6ef83e94b62 100644
--- a/src/model/model.js
+++ b/src/model/model.js
@@ -4,25 +4,15 @@
  * decaffeinate suggestions:
  * DS101: Remove unnecessary use of Array.from
  * DS102: Remove unnecessary code created because of implicit returns
- * DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining
  * DS104: Avoid inline assignments
  * DS205: Consider reworking code to avoid use of IIFEs
  * DS207: Consider shorter variations of null checks
  * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  */
 
-const cssauron = require("cssauron");
-
-const ALL = "*";
-const ID = /^#([A-Za-z0-9_])$/;
-const CLASS = /^\.([A-Za-z0-9_]+)$/;
-const TRAIT = /^\[([A-Za-z0-9_]+)\]$/;
-const TYPE = /^[A-Za-z0-9_]+$/;
+import { compile, selectAll } from "./css-select-adapted";
 const AUTO = /^<([0-9]+|<*)$/;
 
-// Lazy load CSSauron
-let language = null;
-
 /*
   Model that wraps a root node and its children.
 
@@ -50,18 +40,6 @@ export class Model {
 
     this.event = { type: "update" };
 
-    // Init CSSauron
-    if (language == null) {
-      language = cssauron({
-        tag: "type",
-        id: "id",
-        class: "classes.join(' ')",
-        parent: "parent",
-        children: "children",
-        attr: "traits.hash[attr]",
-      });
-    }
-
     // Triggered by child addition/removal
     const add = (event) => adopt(event.node);
     const remove = (event) => dispose(event.node);
@@ -70,7 +48,7 @@ export class Model {
     this.root.on("remove", remove);
 
     // Track node lifecycle
-    var adopt = (node) => {
+    const adopt = (node) => {
       addNode(node);
       addType(node);
       addTraits(node);
@@ -80,7 +58,7 @@ export class Model {
       return force(node);
     };
 
-    var dispose = (node) => {
+    const dispose = (node) => {
       removeNode(node);
       removeType(node);
       removeTraits(node);
@@ -93,14 +71,14 @@ export class Model {
 
     // Watcher cycle for catching changes in id/classes
     const prime = (node) => {
-      for (let watcher of Array.from(this.watchers)) {
+      for (const watcher of Array.from(this.watchers)) {
         watcher.match = watcher.matcher(node);
       }
       return null;
     };
 
     const check = (node) => {
-      for (let watcher of Array.from(this.watchers)) {
+      for (const watcher of Array.from(this.watchers)) {
         const fire =
           watcher.fire ||
           (watcher.fire = watcher.match !== watcher.matcher(node));
@@ -114,8 +92,8 @@ export class Model {
       return null;
     };
 
-    var force = (node) => {
-      for (let watcher of Array.from(this.watchers)) {
+    const force = (node) => {
+      for (const watcher of Array.from(this.watchers)) {
         const fire = watcher.fire || (watcher.fire = watcher.matcher(node));
         if (fire) {
           this.lastNode = node;
@@ -131,7 +109,7 @@ export class Model {
       if (!this.fire) {
         return false;
       }
-      for (let watcher of Array.from(this.watchers.slice())) {
+      for (const watcher of Array.from(this.watchers.slice())) {
         if (watcher.fire) {
           watcher.fire = false;
           watcher.handler();
@@ -142,7 +120,7 @@ export class Model {
     };
 
     // Track id/class changes
-    var update = (event, node, init) => {
+    const update = (event, node, init) => {
       const _id = init || event.changed["node.id"];
       const _klass = init || event.changed["node.classes"];
       let primed = false;
@@ -195,7 +173,7 @@ export class Model {
       if (tags == null) {
         return;
       }
-      for (let k of Array.from(tags)) {
+      for (const k of Array.from(tags)) {
         const list = sets[k] != null ? sets[k] : [];
         list.push(node);
         sets[k] = list;
@@ -207,7 +185,7 @@ export class Model {
       if (tags == null) {
         return;
       }
-      for (let k of Array.from(tags)) {
+      for (const k of Array.from(tags)) {
         const list = sets[k];
         const index = list.indexOf(node);
         if (index >= 0) {
@@ -232,7 +210,7 @@ export class Model {
     const unhashTags = (array) => delete array.hash;
 
     // Track IDs (live)
-    var addID = (id, node) => {
+    const addID = (id, node) => {
       if (this.ids[id]) {
         throw new Error(`Duplicate node id \`${id}\``);
       }
@@ -243,7 +221,7 @@ export class Model {
       return (node.id = id != null ? id : node._id);
     };
 
-    var removeID = (id, node) => {
+    const removeID = (id, node) => {
       if (id != null) {
         delete this.ids[id];
       }
@@ -251,14 +229,14 @@ export class Model {
     };
 
     // Track classes (live)
-    var addClasses = (classes, node) => {
+    const addClasses = (classes, node) => {
       addTags(this.classes, classes, node);
       if (classes != null) {
         return hashTags(classes);
       }
     };
 
-    var removeClasses = (classes, node) => {
+    const removeClasses = (classes, node) => {
       removeTags(this.classes, classes, node);
       if (classes != null) {
         return unhashTags(classes);
@@ -266,20 +244,20 @@ export class Model {
     };
 
     // Track nodes
-    var addNode = (node) => this.nodes.push(node);
-    var removeNode = (node) => this.nodes.splice(this.nodes.indexOf(node), 1);
+    const addNode = (node) => this.nodes.push(node);
+    const removeNode = (node) => this.nodes.splice(this.nodes.indexOf(node), 1);
 
     // Track nodes by type
-    var addType = (node) => addTags(this.types, [node.type], node);
-    var removeType = (node) => removeTags(this.types, [node.type], node);
+    const addType = (node) => addTags(this.types, [node.type], node);
+    const removeType = (node) => removeTags(this.types, [node.type], node);
 
     // Track nodes by trait
-    var addTraits = (node) => {
+    const addTraits = (node) => {
       addTags(this.traits, node.traits, node);
       return hashTags(node.traits);
     };
 
-    var removeTraits = (node) => {
+    const removeTraits = (node) => {
       removeTags(this.traits, node.traits, node);
       return unhashTags(node.traits);
     };
@@ -288,44 +266,8 @@ export class Model {
     this.root.trigger({ type: "added" });
   }
 
-  // Filter array by selector
-  filter(nodes, selector) {
-    const matcher = this._matcher(selector);
-    return (() => {
-      const result = [];
-      for (let node of Array.from(nodes)) {
-        if (matcher(node)) {
-          result.push(node);
-        }
-      }
-      return result;
-    })();
-  }
-
-  // Filter array by ancestry
-  ancestry(nodes, parents) {
-    const out = [];
-    for (let node of Array.from(nodes)) {
-      let { parent } = node;
-      while (parent != null) {
-        if (Array.from(parents).includes(parent)) {
-          out.push(node);
-          break;
-        }
-        ({ parent } = parent);
-      }
-    }
-    return out;
-  }
-
-  // Query model by (scoped) selector
-  select(selector, parents) {
-    let matches = this._select(selector);
-    if (parents != null) {
-      matches = this.ancestry(matches, parents);
-    }
-    matches.sort((a, b) => b.order - a.order);
-    return matches;
+  select(query, context) {
+    return selectAll(query, context || this.getRoot());
   }
 
   // Watch selector with handler
@@ -355,90 +297,12 @@ export class Model {
     return delete handler.watcher;
   }
 
-  // Check for simplified selector
-  _simplify(s) {
-    // Trim whitespace
-    let all, auto, id, klass, trait, type;
-    s = s.replace(/^\s+/, "");
-    s = s.replace(/\s+$/, "");
-
-    // Look for *, #id, .class, type, auto
-    let found = (all = s === ALL);
-    if (!found) {
-      found = id = __guard__(s.match(ID), (x) => x[1]);
-    }
-    if (!found) {
-      found = klass = __guard__(s.match(CLASS), (x1) => x1[1]);
-    }
-    if (!found) {
-      found = trait = __guard__(s.match(TRAIT), (x2) => x2[1]);
-    }
-    if (!found) {
-      found = type = __guard__(s.match(TYPE), (x3) => x3[0]);
-    }
-    if (!found) {
-      found = auto = __guard__(s.match(AUTO), (x4) => x4[0]);
-    }
-    return [all, id, klass, trait, type, auto];
-  }
-
   // Make a matcher for a single selector
-  _matcher(s) {
-    // Check for simple *, #id, .class or type selector
-    const [all, id, klass, trait, type, auto] = Array.from(this._simplify(s));
-    if (all) {
-      return (_node) => true;
-    }
-    if (id) {
-      return (node) => node.id === id;
-    }
-    if (klass) {
-      return (node) =>
-        __guard__(
-          node.classes != null ? node.classes.hash : undefined,
-          (x) => x[klass]
-        );
-    }
-    if (trait) {
-      return (node) =>
-        __guard__(
-          node.traits != null ? node.traits.hash : undefined,
-          (x) => x[trait]
-        );
-    }
-    if (type) {
-      return (node) => node.type === type;
-    }
-    if (auto) {
-      throw "Auto-link matcher unsupported";
-    }
-
-    // Otherwise apply CSSauron filter
-    return language(s);
-  }
-
-  // Query single selector
-  _select(s) {
-    // Check for simple *, #id, .class or type selector
-    const [all, id, klass, trait, type] = Array.from(this._simplify(s));
-    if (all) {
-      return this.nodes;
-    }
-    if (id) {
-      return this.ids[id] != null ? this.ids[id] : [];
-    }
-    if (klass) {
-      return this.classes[klass] != null ? this.classes[klass] : [];
-    }
-    if (trait) {
-      return this.traits[trait] != null ? this.traits[trait] : [];
+  _matcher(query) {
+    if (AUTO.test(query)) {
+      throw new Error("Auto-link matcher unsupported");
     }
-    if (type) {
-      return this.types[type] != null ? this.types[type] : [];
-    }
-
-    // Otherwise apply CSSauron to everything
-    return this.filter(this.nodes, s);
+    return compile(query);
   }
 
   getRoot() {
@@ -449,9 +313,3 @@ export class Model {
     return this.lastNode.toString();
   }
 }
-
-function __guard__(value, transform) {
-  return typeof value !== "undefined" && value !== null
-    ? transform(value)
-    : undefined;
-}
diff --git a/src/model/node.js b/src/model/node.js
index 31f718f1c7c7b87d814bc079a2e0fe531688b19c..a5b58bc9b899ae061232820c124647293471cb43 100644
--- a/src/model/node.js
+++ b/src/model/node.js
@@ -144,9 +144,9 @@ export class Node {
     const map = (x) => k / (x + k);
     const lerp = (t) => b + (a - b) * t;
 
-    var a = 1 + 1 / k;
-    var b = 0;
-    for (let index of Array.from(path)) {
+    let a = 1 + 1 / k;
+    let b = 0;
+    for (const index of Array.from(path)) {
       const f = map(index + 1);
       const g = map(index + 2);
       [a, b] = Array.from([lerp(f), lerp(g)]);
diff --git a/src/overlay/dom.js b/src/overlay/dom.js
index b87cacdd1a6ec06d539b368602d528f8cb22b40b..ba304f30671ced80147b4fd74a6b054a2789a846 100644
--- a/src/overlay/dom.js
+++ b/src/overlay/dom.js
@@ -36,7 +36,7 @@ export class DOM extends Overlay {
   }
 
   unmount(_overlay) {
-    if (this.overlay.parentNode) {
+    if (this.overlay && this.overlay.parentNode) {
       this.element.removeChild(this.overlay);
     }
     return (this.overlay = null);
@@ -56,6 +56,11 @@ export class DOM extends Overlay {
       el = this.el("div", null, el);
     }
 
+    // Create empty div if el is null
+    if (el == null) {
+      el = this.el("div");
+    }
+
     // See if it can be mounted directly
     const naked = el.type === "div";
 
diff --git a/src/primitives/primitive.js b/src/primitives/primitive.js
index b9e621fcd9c30ea2c4902903f3b732da15af6d30..6842b8fa4516bed9dc47349699c0fbb68861431c 100644
--- a/src/primitives/primitive.js
+++ b/src/primitives/primitive.js
@@ -155,7 +155,7 @@ export class Primitive {
       self = this;
     }
     if (object instanceof Array) {
-      for (let o of Array.from(object)) {
+      for (const o of Array.from(object)) {
         return this.__listen(o, type, method, self);
       }
     }
@@ -185,7 +185,7 @@ export class Primitive {
       return;
     }
 
-    for (let [object, type, handler] of Array.from(this._handlers.listen)) {
+    for (const [object, type, handler] of Array.from(this._handlers.listen)) {
       object.off(type, handler);
     }
     return (this._handlers.listen = []);
@@ -240,7 +240,7 @@ export class Primitive {
         return list;
       }
       let out = [];
-      for (let sub of Array.from(list)) {
+      for (const sub of Array.from(list)) {
         if (sub instanceof Array) {
           out = out.concat(sub);
         } else {
@@ -250,7 +250,7 @@ export class Primitive {
       return out;
     };
 
-    var resolve = (selector) => {
+    const resolve = (selector) => {
       // Direct JS binding, no watcher.
       let node, nodes;
       if (typeof selector === "object") {
@@ -381,7 +381,7 @@ export class Primitive {
       return;
     }
 
-    for (let watcher of Array.from(this._handlers.watch)) {
+    for (const watcher of Array.from(this._handlers.watch)) {
       if (watcher != null) {
         watcher.unwatch();
       }
@@ -400,7 +400,7 @@ export class Primitive {
     if (!this._handlers.compute.length) {
       return;
     }
-    for (let key of Array.from(this._handlers.compute)) {
+    for (const key of Array.from(this._handlers.compute)) {
       this.node.unbind(key, true);
     }
     return (this._handlers.compute = []);
diff --git a/src/primitives/types/data/data.js b/src/primitives/types/data/data.js
index f4dcfbcea14459732c0249d8b174940c6a4737d2..c11f029cefae6e6ac7ce827b257e08004fde5aa3 100644
--- a/src/primitives/types/data/data.js
+++ b/src/primitives/types/data/data.js
@@ -22,10 +22,8 @@ export class Data extends Source {
   }
 
   emitter(channels, items) {
-    let emitter;
-    const { data } = this.props;
-    const { bind } = this.props;
-    const { expr } = this.props;
+    let emitter, resolve;
+    const { data, bind, expr } = this.props;
 
     if (data != null) {
       // Make new emitter if data geometry doesn't match
@@ -44,7 +42,7 @@ export class Data extends Source {
       emitter = this.dataEmitter;
     } else if (resolve != null) {
       // Hook up data-bound expression to its source
-      var resolve = this._inherit("resolve");
+      resolve = this._inherit("resolve");
       emitter = this.callback(resolve.callback(bind));
     } else if (expr != null) {
       // Convert given free expression to appropriate callback
diff --git a/src/primitives/types/draw/grid.js b/src/primitives/types/draw/grid.js
index 5cbc7e457d9edfb26dc7b87a053045bfa7373688..0d66d51d268861bc99c792dca5ee40b0e2dbcabb 100644
--- a/src/primitives/types/draw/grid.js
+++ b/src/primitives/types/draw/grid.js
@@ -124,7 +124,7 @@ export class Grid extends Primitive {
     const transpose = ["0000", "x000", "y000", "z000", "w000"][axes[1]];
 
     // Stroke style
-    var { stroke, join } = this.props;
+    const { stroke, join } = this.props;
 
     this.axes = [];
     lineX && this.axes.push(axis("x.", "y.", null));
@@ -151,7 +151,7 @@ export class Grid extends Primitive {
     this._helpers.object.unmake();
     this._helpers.span.unmake();
 
-    for (let axis of this.axes) {
+    for (const axis of this.axes) {
       axis.buffer.dispose();
     }
 
@@ -213,7 +213,7 @@ export class Grid extends Primitive {
     };
 
     // Fetch grid range in both dimensions
-    var { axes, origin } = this.props;
+    const { axes, origin } = this.props;
     const range1 = this._helpers.span.get("x.", axes[0]);
     const range2 = this._helpers.span.get("y.", axes[1]);
 
diff --git a/src/primitives/types/draw/strip.js b/src/primitives/types/draw/strip.js
index 6cc9a512f680d3f4cdeeed07488950b7e32743d7..1d32328a2a31e3cef88ec2f5e45b5dea20962d9d 100644
--- a/src/primitives/types/draw/strip.js
+++ b/src/primitives/types/draw/strip.js
@@ -65,7 +65,7 @@ export class Strip extends Primitive {
 
   make() {
     // Bind to attached data sources
-    let color, join, stroke, uniforms;
+    let color, uniforms;
     this._helpers.bind.make([
       { to: "geometry.points", trait: "source" },
       { to: "geometry.colors", trait: "source" },
@@ -91,9 +91,7 @@ export class Strip extends Primitive {
     const unitUniforms = this._inherit("unit").getUnitUniforms();
 
     // Get display properties
-    let { line } = this.props;
-    let { shaded } = this.props;
-    let { fill } = this.props;
+    const { line, shaded, fill, stroke, join } = this.props;
 
     // Auto z-bias wireframe over surface
     const wireUniforms = {};
@@ -104,9 +102,6 @@ export class Strip extends Primitive {
     const dims = this.bind.points.getDimensions();
     const { items, width, height, depth } = dims;
 
-    // Get display properties
-    ({ line, shaded, fill, stroke, join } = this.props);
-
     // Build color lookup
     if (this.bind.colors) {
       color = this._shaders.shader();
diff --git a/src/primitives/types/helpers.js b/src/primitives/types/helpers.js
index 6bec60518b5055505e31ffd5b5c2a2d04db584ac..a889dd1ffd438c24842897792d7672c0210777e5 100644
--- a/src/primitives/types/helpers.js
+++ b/src/primitives/types/helpers.js
@@ -37,8 +37,9 @@ const helpers = {
 
       // Fetch attached objects and bind to them
       // Attach rebuild watcher for DOM changes to bound nodes
-      for (let slot of Array.from(slots)) {
-        let { to, trait, optional, unique, multiple, callback } = slot;
+      for (const slot of Array.from(slots)) {
+        let { callback } = slot;
+        const { to, trait, optional, unique, multiple } = slot;
 
         if (callback == null) {
           callback = this.rebuild;
@@ -78,7 +79,7 @@ const helpers = {
           }
 
           if (multiple) {
-            for (let s of Array.from(source)) {
+            for (const s of Array.from(source)) {
               this.bound.push(s);
             }
           } else {
@@ -245,7 +246,7 @@ const helpers = {
       if (shader == null) {
         shader = this._shaders.shader();
       }
-      for (var pass = 0; pass <= 2; pass++) {
+      for (let pass = 0; pass <= 2; pass++) {
         shader = __guard__(this._inherit("fragment"), (x) =>
           x.fragment(shader, pass)
         );
@@ -273,7 +274,7 @@ const helpers = {
       if (shader == null) {
         shader = this._shaders.shader();
       }
-      for (var pass = 0; pass <= 3; pass++) {
+      for (let pass = 0; pass <= 3; pass++) {
         shader = __guard__(this._inherit("vertex"), (x) =>
           x.vertex(shader, pass)
         );
@@ -316,7 +317,7 @@ const helpers = {
         return onVisible();
       };
 
-      var onVisible = () => {
+      const onVisible = () => {
         let left;
         const last = this.isVisible;
         let self =
@@ -335,7 +336,7 @@ const helpers = {
         }
       };
 
-      var visibleParent = this._inherit("visible");
+      const visibleParent = this._inherit("visible");
       if (visibleParent) {
         this._listen(visibleParent, "visible.change", onVisible);
       }
@@ -363,7 +364,7 @@ const helpers = {
         return onActive();
       };
 
-      var onActive = () => {
+      const onActive = () => {
         let left;
         const last = this.isActive;
         let self =
@@ -381,7 +382,7 @@ const helpers = {
         }
       };
 
-      var activeParent = this._inherit("active");
+      const activeParent = this._inherit("active");
       if (activeParent) {
         this._listen(activeParent, "active.change", onActive);
       }
@@ -453,7 +454,7 @@ const helpers = {
         }
       };
 
-      var onVisible = () => {
+      const onVisible = () => {
         const order = zOrder != null ? -zOrder : this.node.order;
 
         const visible =
@@ -463,7 +464,7 @@ const helpers = {
           if (hasStyle) {
             return (() => {
               const result = [];
-              for (let o of Array.from(this.objects)) {
+              for (const o of Array.from(this.objects)) {
                 o.show(opacity < 1, blending, order);
                 result.push(o.depth(zWrite, zTest));
               }
@@ -472,7 +473,7 @@ const helpers = {
           } else {
             return (() => {
               const result1 = [];
-              for (let o of Array.from(this.objects)) {
+              for (const o of Array.from(this.objects)) {
                 result1.push(o.show(true, blending, order));
               }
               return result1;
@@ -481,7 +482,7 @@ const helpers = {
         } else {
           return (() => {
             const result2 = [];
-            for (let o of Array.from(this.objects)) {
+            for (const o of Array.from(this.objects)) {
               result2.push(o.hide());
             }
             return result2;
@@ -493,7 +494,7 @@ const helpers = {
       this._listen(this.node, "reindex", onVisible);
       this._listen(this, "visible.change", onVisible);
 
-      for (let object of Array.from(this.objects)) {
+      for (const object of Array.from(this.objects)) {
         objectScene.adopt(object);
       }
       return onVisible();
@@ -640,7 +641,7 @@ const helpers = {
 
       //console.log 'worldUnit', world, pixel, rscale, isAbsolute
 
-      var root = this.is("root") ? this : this._inherit("root");
+      const root = this.is("root") ? this : this._inherit("root");
       //@_listen root, 'root.resize', handler
       //@_listen root, 'root.camera', handler
       //@_listen @node, 'change:unit', handler
@@ -655,7 +656,7 @@ const helpers = {
 
     get() {
       const u = {};
-      for (let k in this.unitUniforms) {
+      for (const k in this.unitUniforms) {
         const v = this.unitUniforms[k];
         u[k] = v.value;
       }
@@ -670,14 +671,14 @@ const helpers = {
 
 export const Helpers = function (object, traits) {
   const h = {};
-  for (let trait of Array.from(traits)) {
-    var methods;
+  for (const trait of Array.from(traits)) {
+    let methods;
     if (!(methods = helpers[trait])) {
       continue;
     }
 
     h[trait] = {};
-    for (let key in methods) {
+    for (const key in methods) {
       const method = methods[key];
       h[trait][key] = method.bind(object);
     }
diff --git a/src/primitives/types/operator/lerp.js b/src/primitives/types/operator/lerp.js
index c511ea0626e5ba12191a8c06d76d22298737c915..d87f442a9b11ece1d66835f75ca20d3c979fcd2b 100644
--- a/src/primitives/types/operator/lerp.js
+++ b/src/primitives/types/operator/lerp.js
@@ -183,7 +183,7 @@ export class Lerp extends Operator {
     operator.pipe("resample.padding", uniforms);
 
     // Prepare centered sampling offset
-    let vec = [];
+    const vec = [];
     let any = false;
     const iterable = ["width", "height", "depth", "items"];
     for (i = 0; i < iterable.length; i++) {
@@ -195,12 +195,13 @@ export class Lerp extends Operator {
       vec[i] = centered ? "0.5" : "0.0";
     }
 
+    let vec4;
+
     // Add centered sampling offset (from source)
     if (any && resize) {
-      vec = `vec4(${vec})`;
-      // TODO is this right? it was vec4 before.
-      operator.pipe(UGLSL.binaryOperator(4, "+", vec));
-      indexer.pipe(UGLSL.binaryOperator(4, "+", vec));
+      vec4 = `vec4(${vec})`;
+      operator.pipe(UGLSL.binaryOperator(4, "+", vec4));
+      indexer.pipe(UGLSL.binaryOperator(4, "+", vec4));
     }
 
     // Addressing relative to target
@@ -214,8 +215,8 @@ export class Lerp extends Operator {
 
     // Remove centered sampling offset (to target)
     if (any && resize) {
-      operator.pipe(UGLSL.binaryOperator(4, "-", vec));
-      indexer.pipe(UGLSL.binaryOperator(4, "-", vec));
+      operator.pipe(UGLSL.binaryOperator(4, "-", vec4));
+      indexer.pipe(UGLSL.binaryOperator(4, "-", vec4));
     }
 
     // Make sampler
diff --git a/src/primitives/types/operator/spread.js b/src/primitives/types/operator/spread.js
index db3b87973c972adee8f907495f9ed6a8cdb982a8..371970dc8f7f9ff399746a94ec7107e0e264e689 100644
--- a/src/primitives/types/operator/spread.js
+++ b/src/primitives/types/operator/spread.js
@@ -79,9 +79,9 @@ export class Spread extends Operator {
     return (() => {
       const result = [];
       for (i = 0; i < order.length; i++) {
-        var offset;
+        let offset;
         key = order[i];
-        var spread = this.props[key];
+        const spread = this.props[key];
         const anchor = this.props[align[i]];
 
         if (spread != null) {
@@ -96,7 +96,7 @@ export class Spread extends Operator {
           (() => {
             const result1 = [];
             for (k = 0; k <= 3; k++) {
-              var left;
+              let left;
               v =
                 (left = spread != null ? spread.getComponent(k) : undefined) !=
                 null
diff --git a/src/primitives/types/operator/subdivide.js b/src/primitives/types/operator/subdivide.js
index 4ea2f927b3835b76d638402a761b9d8eaeae8907..7e67397f4d9ab59eb604db5b7bb48b4b5563efdd 100644
--- a/src/primitives/types/operator/subdivide.js
+++ b/src/primitives/types/operator/subdivide.js
@@ -74,7 +74,8 @@ export class Subdivide extends Operator {
     }
 
     // Get resampled dimensions
-    let { items, width, height, depth, lerp } = this.props;
+    let { lerp } = this.props;
+    const { items, width, height, depth } = this.props;
 
     this.resampled = {};
     if (items != null) {
diff --git a/src/primitives/types/overlay/dom.js b/src/primitives/types/overlay/dom.js
index 5c6d2d8533f4a8804f0c18b8c94dde2ea1512700..95d7c950975fa2309f9772836cb3f5b4f7e9b49a 100644
--- a/src/primitives/types/overlay/dom.js
+++ b/src/primitives/types/overlay/dom.js
@@ -126,7 +126,7 @@ export class DOM extends Primitive {
     if (this.readback == null) {
       return;
     }
-    this.dom.render(this.isVisible ? this.emitter.nodes() : []);
+    this.dom.render(this.isVisible ? this.emitter.nodes() : null);
   }
 
   callback(data) {
diff --git a/src/primitives/types/present/move.js b/src/primitives/types/present/move.js
index 05ce8ec0d637fb4abf610ef7f3614d3d4eab53f2..7f2b0e912e073ba93c162a1ec5b9cc71909ced29 100644
--- a/src/primitives/types/present/move.js
+++ b/src/primitives/types/present/move.js
@@ -23,7 +23,7 @@ export class Move extends Transition {
       moveFrom: this.node.attributes["move.from"],
       moveTo: this.node.attributes["move.to"],
     };
-    for (let k in object) {
+    for (const k in object) {
       const v = object[k];
       this.uniforms[k] = v;
     }
diff --git a/src/primitives/types/present/present.js b/src/primitives/types/present/present.js
index 0da29053b59be84a960ef4d2447e475f4ddd46e2..c3ec765d845274648ab98024bf6f934f33d821a8 100644
--- a/src/primitives/types/present/present.js
+++ b/src/primitives/types/present/present.js
@@ -50,7 +50,7 @@ export class Present extends Parent {
       return;
     }
 
-    for (let controller of Array.from(this.dirty)) {
+    for (const controller of Array.from(this.dirty)) {
       this.slideReset(controller);
     }
 
@@ -93,7 +93,8 @@ export class Present extends Parent {
         }
         return result;
       })();
-    var parents = traverse(function (el) {
+
+    const parents = traverse(function (el) {
       if (el.parent.traits.hash.present) {
         return null;
       } else {
@@ -102,7 +103,7 @@ export class Present extends Parent {
     });
 
     // Helpers
-    var isSlide = (el) => nodes.indexOf(el) >= 0;
+    const isSlide = (el) => nodes.indexOf(el) >= 0;
 
     // Order paths (leaf -> parent slide -> ...)
     const order = (paths) =>
@@ -156,7 +157,7 @@ export class Present extends Parent {
     const split = function (steps) {
       const relative = [];
       const absolute = [];
-      for (let step of Array.from(steps)) {
+      for (const step of Array.from(steps)) {
         (step[0].props.steps != null ? relative : absolute).push(step);
       }
       return [relative, absolute];
@@ -228,7 +229,7 @@ export class Present extends Parent {
     };
 
     // Remove duplicates
-    var dedupe = function (step) {
+    const dedupe = function (step) {
       if (step) {
         return (() => {
           const result = [];
@@ -246,7 +247,7 @@ export class Present extends Parent {
     };
 
     // Finalize individual step by document order
-    var finalize = (step) => step.sort((a, b) => a.order - b.order);
+    const finalize = (step) => step.sort((a, b) => a.order - b.order);
 
     const paths = slides(nodes);
     const steps = order(paths);
diff --git a/src/primitives/types/present/step.js b/src/primitives/types/present/step.js
index 2db833fdbbc9a3c6b97394a31a1b1918f0ca74a4..0a62a88b9f8e18a404205715fa4e3bf7cb37a260 100644
--- a/src/primitives/types/present/step.js
+++ b/src/primitives/types/present/step.js
@@ -57,7 +57,8 @@ export class Step extends Track {
     // Update playhead in response to slide change
     return this._listen("slide", "slide.step", (e) => {
       let left;
-      let { delay, duration, pace, speed, playback, rewind, skip, trigger } =
+      let { duration } = this.props;
+      const { delay, pace, speed, playback, rewind, skip, trigger } =
         this.props;
 
       // Note: enter phase is from index 0 to 1
@@ -87,7 +88,7 @@ export class Step extends Track {
       const skips = this.stops.slice(Math.min(last, i), Math.max(last, i));
       let free = 0;
       last = skips.shift();
-      for (let stop of Array.from(skips)) {
+      for (const stop of Array.from(skips)) {
         if (last === stop) {
           free++;
         }
@@ -139,9 +140,9 @@ export class Step extends Track {
 Step.initClass();
 
 function __range__(left, right, inclusive) {
-  let range = [];
-  let ascending = left < right;
-  let end = !inclusive ? right : ascending ? right + 1 : right - 1;
+  const range = [];
+  const ascending = left < right;
+  const end = !inclusive ? right : ascending ? right + 1 : right - 1;
   for (let i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {
     range.push(i);
   }
diff --git a/src/primitives/types/present/track.js b/src/primitives/types/present/track.js
index 21f5aa48c78048124bf268cf34cd9e380d701b04..352d6a5bee2d2845c870abb2112260d6bba2e19b 100644
--- a/src/primitives/types/present/track.js
+++ b/src/primitives/types/present/track.js
@@ -16,7 +16,7 @@ import { Primitive } from "../../primitive.js";
 
 const deepCopy = function (x) {
   const out = {};
-  for (let k in x) {
+  for (const k in x) {
     const v = x[k];
     if (v instanceof Array) {
       out[k] = v.slice();
@@ -242,7 +242,8 @@ export class Track extends Primitive {
   }
 
   update() {
-    let { playhead, script } = this;
+    let { playhead } = this;
+    const { script } = this;
     const { ease, seek } = this.props;
     const node = this.targetNode;
 
diff --git a/src/primitives/types/shader/shader.js b/src/primitives/types/shader/shader.js
index 1cabaa327e941d4f878e152c24ed8ecafd3bde73..c3fa5113f089ef07553a4044760eda0f24474760 100644
--- a/src/primitives/types/shader/shader.js
+++ b/src/primitives/types/shader/shader.js
@@ -38,7 +38,8 @@ export class Shader extends Primitive {
     // Convert uniforms to attributes
     const types = this._types;
     const uniforms = {};
-    var make = (type) => {
+    const make = (type) => {
+      let t;
       switch (type) {
         case "i":
           return types.int();
@@ -57,7 +58,7 @@ export class Shader extends Primitive {
         case "t":
           return types.object();
         default:
-          var t = type.split("");
+          t = type.split("");
           if (t.pop() === "v") {
             return types.array(make(t.join("")));
           } else {
@@ -66,8 +67,8 @@ export class Shader extends Primitive {
       }
     };
 
-    for (let def of Array.from(snippet._signatures.uniform)) {
-      var type;
+    for (const def of Array.from(snippet._signatures.uniform)) {
+      let type;
       if ((type = make(def.type))) {
         uniforms[def.name] = type;
       }
@@ -128,7 +129,7 @@ export class Shader extends Primitive {
 
     // Require sources
     if (this.bind.sources != null) {
-      for (let source of Array.from(this.bind.sources)) {
+      for (const source of Array.from(this.bind.sources)) {
         s.require(source.sourceShader(this._shaders.shader()));
       }
     }
diff --git a/src/primitives/types/text/format.js b/src/primitives/types/text/format.js
index ff354408776fdee756abb7238ae6710303312c19..175faba41f88ab4ecef6b9bd6c7a4ad2d2d27bd1 100644
--- a/src/primitives/types/text/format.js
+++ b/src/primitives/types/text/format.js
@@ -45,6 +45,7 @@ export class Format extends Operator {
   textIsSDF() {
     return this.props.sdf > 0;
   }
+
   textHeight() {
     return this.props.detail;
   }
@@ -156,7 +157,8 @@ export class Format extends Operator {
       init
     ) {
       let map;
-      let { digits, expr, data } = this.props;
+      let { expr } = this.props;
+      const { digits, data } = this.props;
 
       if (expr == null) {
         if (data != null) {
diff --git a/src/primitives/types/transform/layer.js b/src/primitives/types/transform/layer.js
index 4316cb8b9a4b785ed959a01ec94121a32f791a4a..8df1ad1bff3216bc24de522a050c497687810692 100644
--- a/src/primitives/types/transform/layer.js
+++ b/src/primitives/types/transform/layer.js
@@ -33,7 +33,8 @@ export class Layer extends Transform {
 
     const _enum = this.node.attributes["layer.fit"].enum;
 
-    let { fit, depth } = this.props;
+    let { fit } = this.props;
+    const { depth } = this.props;
 
     // Convert contain/cover into x/y
     switch (fit) {
diff --git a/src/primitives/types/types.js b/src/primitives/types/types.js
index 1bb36060ab917536e63fb9897f4d88f83d021ded..d4d3c302bd828a4bb62e48c1641bdb7371b206d8 100644
--- a/src/primitives/types/types.js
+++ b/src/primitives/types/types.js
@@ -54,7 +54,7 @@ import { Vector4 } from "three/src/math/Vector4.js";
 //   # Option 3: Return new value
 //   return +value
 //
-var _Types = {
+const _Types = {
   array(type, size, value = null) {
     const lerp = type.lerp
       ? function (a, b, target, f) {
@@ -1408,7 +1408,7 @@ var _Types = {
 };
 
 const decorate = function (types) {
-  for (let k in types) {
+  for (const k in types) {
     const type = types[k];
     types[k] = ((type) =>
       function () {
@@ -1437,9 +1437,9 @@ const decorate = function (types) {
 export const Types = decorate(_Types);
 
 function __range__(left, right, inclusive) {
-  let range = [];
-  let ascending = left < right;
-  let end = !inclusive ? right : ascending ? right + 1 : right - 1;
+  const range = [];
+  const ascending = left < right;
+  const end = !inclusive ? right : ascending ? right + 1 : right - 1;
   for (let i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {
     range.push(i);
   }
diff --git a/src/render/buffer/pushbuffer.js b/src/render/buffer/pushbuffer.js
index 5b242ec7deafe7dd1dda70c044a1e9e21811fb1c..d9e03287d06a1b91e08c158f10a08c015ccfd335 100644
--- a/src/render/buffer/pushbuffer.js
+++ b/src/render/buffer/pushbuffer.js
@@ -131,9 +131,9 @@ export class PushBuffer extends Buffer {
 }
 
 function __range__(left, right, inclusive) {
-  let range = [];
-  let ascending = left < right;
-  let end = !inclusive ? right : ascending ? right + 1 : right - 1;
+  const range = [];
+  const ascending = left < right;
+  const end = !inclusive ? right : ascending ? right + 1 : right - 1;
   for (let i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {
     range.push(i);
   }
diff --git a/src/render/buffer/readback.js b/src/render/buffer/readback.js
index b447d0437411c02e5f9fcfd879d94703de1ca1b6..4b7585228af6907ab87b944c91d22aba3119eb68 100644
--- a/src/render/buffer/readback.js
+++ b/src/render/buffer/readback.js
@@ -68,7 +68,8 @@ export class Readback extends Renderable {
     const { indexer } = options;
     const isIndexed = indexer != null && !indexer.empty();
 
-    let { items, width, height, depth, stpq } = this;
+    let { stpq } = this;
+    const { items, width, height, depth } = this;
 
     let sampler = map;
     if (isIndexed) {
@@ -143,7 +144,7 @@ export class Readback extends Renderable {
       // Direct sampling
       encoder = this.shaders.shader();
       encoder.pipe(sampler);
-      encoder.pipe(UGLSL.truncateVec4(4, 1));
+      encoder.pipe(UGLSL.truncateVec(4, 1));
       encoder.pipe("float.encode");
       sampler = encoder;
     }
@@ -263,7 +264,7 @@ export class Readback extends Renderable {
 
   post() {
     const currentTarget = this.renderer.getRenderTarget();
-    this.renderer.setRenderTarget(this.byteMemo.target.write);
+    this.renderer.setRenderTarget(this.byteMemo.target.targets[0]);
     this.gl.readPixels(
       0,
       0,
@@ -340,7 +341,7 @@ export class Readback extends Renderable {
       emit = (x, y, z, w) => callback(x, y, z, w, i, j, k, l);
     }
 
-    var i = (j = k = l = m = 0);
+    let i = (j = k = l = m = 0);
     while (!done() && m < limit) {
       m++;
       const repeat = consume(emit);
diff --git a/src/render/buffer/textatlas.js b/src/render/buffer/textatlas.js
index b59147a8cfb7a981000d2388236c3b7f7da1e91b..e20e72763abea1fe05f8a474296580a7b023c790 100644
--- a/src/render/buffer/textatlas.js
+++ b/src/render/buffer/textatlas.js
@@ -128,9 +128,9 @@ export class TextAtlas extends Atlas {
 
   end() {
     const { mapped } = this;
-    for (let row of Array.from(this.rows.slice())) {
+    for (const row of Array.from(this.rows.slice())) {
       if (row.alive === 0) {
-        for (let key of Array.from(row.keys)) {
+        for (const key of Array.from(row.keys)) {
           delete mapped[key];
         }
         this.collapse(row);
@@ -164,7 +164,7 @@ export class TextAtlas extends Atlas {
   }
 
   draw(text) {
-    let data, i, imageData, j;
+    let data, i, j;
     let w = this.width;
     const h = this.lineHeight;
     const o = this.outline;
@@ -188,7 +188,7 @@ export class TextAtlas extends Atlas {
       // Alpha sprite (fast)
       let asc, end;
       ctx.fillText(text, x, y);
-      ({ data } = imageData = ctx.getImageData(0, 0, w, h));
+      ({ data } = ctx.getImageData(0, 0, w, h));
       j = 3; // Skip to alpha channel
       for (
         i = 0, end = data.length / 4, asc = 0 <= end;
@@ -226,7 +226,7 @@ export class TextAtlas extends Atlas {
       ctx.fillText(text, x, y);
 
       // Pull image data
-      ({ data } = imageData = ctx.getImageData(0, 0, w, h));
+      ({ data } = ctx.getImageData(0, 0, w, h));
       j = 0;
       const { gamma } = this;
 
diff --git a/src/render/buffer/texture/rendertarget.js b/src/render/buffer/texture/rendertarget.js
index 3e5724458f641092b800720cd6dbd93def76f54c..1fb1d90d5a4b1f4c89d6fc9311f7ca97762f8c86 100644
--- a/src/render/buffer/texture/rendertarget.js
+++ b/src/render/buffer/texture/rendertarget.js
@@ -116,7 +116,7 @@ export class RenderTarget {
   }
 
   dispose() {
-    for (let target of Array.from(this.targets)) {
+    for (const target of Array.from(this.targets)) {
       target.dispose();
     }
     return (this.targets = this.reads = this.write = null);
diff --git a/src/render/geometry/arrowgeometry.js b/src/render/geometry/arrowgeometry.js
index 901e285d2db534f5668be83efc9f04fcc93d2a4a..708ead427406e36e7f238b028285bfb1207e5242 100644
--- a/src/render/geometry/arrowgeometry.js
+++ b/src/render/geometry/arrowgeometry.js
@@ -78,7 +78,7 @@ export class ArrowGeometry extends ClipGeometry {
       asc1 ? i < end1 : i > end1;
       asc1 ? i++ : i--
     ) {
-      var asc2, end2;
+      let asc2, end2;
       const tip = base++;
       const back = tip + sides + 1;
 
@@ -122,7 +122,7 @@ export class ArrowGeometry extends ClipGeometry {
           asc5 ? y < end5 : y > end5;
           asc5 ? y++ : y--
         ) {
-          var asc6, end6;
+          let asc6, end6;
           position(x, y, z, l);
           arrow(0, 0, 0);
           attach(near, far);
diff --git a/src/render/geometry/linegeometry.js b/src/render/geometry/linegeometry.js
index 7caa3c7f19fa8346da38e4428b1822c6906202f5..71bf03d6531f3e2405399a8c1a5d067e2c098d32 100644
--- a/src/render/geometry/linegeometry.js
+++ b/src/render/geometry/linegeometry.js
@@ -139,19 +139,19 @@ export class LineGeometry extends ClipGeometry {
         asc3 ? l < end3 : l > end3;
         asc3 ? l++ : l--
       ) {
-        var asc4, end4;
+        let asc4, end4;
         for (
           z = 0, end4 = ribbons, asc4 = 0 <= end4;
           asc4 ? z < end4 : z > end4;
           asc4 ? z++ : z--
         ) {
-          var asc5, end5;
+          let asc5, end5;
           for (
             y = 0, end5 = strips, asc5 = 0 <= end5;
             asc5 ? y < end5 : y > end5;
             asc5 ? y++ : y--
           ) {
-            var asc6, end6, i1;
+            let asc6, end6, i1;
             for (
               i1 = 0, x = i1, end6 = samples, asc6 = 0 <= end6;
               asc6 ? i1 < end6 : i1 > end6;
@@ -204,19 +204,19 @@ export class LineGeometry extends ClipGeometry {
         asc8 ? l < end8 : l > end8;
         asc8 ? l++ : l--
       ) {
-        var asc9, end9;
+        let asc9, end9;
         for (
           z = 0, end9 = ribbons, asc9 = 0 <= end9;
           asc9 ? z < end9 : z > end9;
           asc9 ? z++ : z--
         ) {
-          var asc10, end10;
+          let asc10, end10;
           for (
             y = 0, end10 = strips, asc10 = 0 <= end10;
             asc10 ? y < end10 : y > end10;
             asc10 ? y++ : y--
           ) {
-            var asc11, end11, j1;
+            let asc11, end11, j1;
             for (
               j1 = 0, x = j1, end11 = samples, asc11 = 0 <= end11;
               asc11 ? j1 < end11 : j1 > end11;
diff --git a/src/render/geometry/spritegeometry.js b/src/render/geometry/spritegeometry.js
index 39ecd239b3440a59ec662d79d80da7cff0b58736..2e802bcdb895161bdedde96ab6229164dc043eee 100644
--- a/src/render/geometry/spritegeometry.js
+++ b/src/render/geometry/spritegeometry.js
@@ -104,7 +104,7 @@ export class SpriteGeometry extends ClipGeometry {
             asc4 ? l < end4 : l > end4;
             asc4 ? l++ : l--
           ) {
-            for (let v of Array.from(quad)) {
+            for (const v of Array.from(quad)) {
               position(x, y, z, l);
               sprite(v[0], v[1]);
             }
diff --git a/src/render/meshes/arrow.js b/src/render/meshes/arrow.js
index 70d5fb2ab1264f09e9ae0ec18b822eb916c092a3..5cbb2cb3dc7890a8dab50d5ad376b87ae9d7b449 100644
--- a/src/render/meshes/arrow.js
+++ b/src/render/meshes/arrow.js
@@ -17,17 +17,10 @@ export class Arrow extends Base {
     let f;
     super(renderer, shaders, options);
 
-    let {
-      uniforms,
-      material,
-      position,
-      color,
-      mask,
-      map,
-      combine,
-      stpq,
-      linear,
-    } = options;
+    let { uniforms } = options;
+
+    const { material, position, color, mask, map, combine, stpq, linear } =
+      options;
     if (uniforms == null) {
       uniforms = {};
     }
diff --git a/src/render/meshes/base.js b/src/render/meshes/base.js
index 95656f47c090b9e916e9ea98db0afe7282b52e9a..7d68e79d209bb2b0da56de61cdf19d578a790f0a 100644
--- a/src/render/meshes/base.js
+++ b/src/render/meshes/base.js
@@ -20,21 +20,21 @@ export class Base extends Renderable {
   }
 
   raw() {
-    for (let object of Array.from(this.renders)) {
+    for (const object of Array.from(this.renders)) {
       this._raw(object);
     }
     return null;
   }
 
   depth(write, test) {
-    for (let object of Array.from(this.renders)) {
+    for (const object of Array.from(this.renders)) {
       this._depth(object, write, test);
     }
     return null;
   }
 
   polygonOffset(factor, units) {
-    for (let object of Array.from(this.renders)) {
+    for (const object of Array.from(this.renders)) {
       this._polygonOffset(object, factor, units);
     }
     return null;
@@ -47,7 +47,7 @@ export class Base extends Renderable {
   }
 
   hide() {
-    for (let object of Array.from(this.renders)) {
+    for (const object of Array.from(this.renders)) {
       this._hide(object);
     }
     return null;
diff --git a/src/render/meshes/face.js b/src/render/meshes/face.js
index ab7b0d12a68a4a0a901a3a582b56dffca279c40c..9af1dfb18f9152d430fd07c36a0f09cd90792d56 100644
--- a/src/render/meshes/face.js
+++ b/src/render/meshes/face.js
@@ -17,17 +17,8 @@ export class Face extends Base {
     let f;
     super(renderer, shaders, options);
 
-    let {
-      uniforms,
-      material,
-      position,
-      color,
-      mask,
-      map,
-      combine,
-      stpq,
-      linear,
-    } = options;
+    let { uniforms, material } = options;
+    const { position, color, mask, map, combine, stpq, linear } = options;
 
     if (uniforms == null) {
       uniforms = {};
diff --git a/src/render/meshes/line.js b/src/render/meshes/line.js
index e15ca19c9f15455b95292a69d69fdbc7defdf50d..73865fb53a8d6bec501d4f778e8a66dac97dadf7 100644
--- a/src/render/meshes/line.js
+++ b/src/render/meshes/line.js
@@ -18,8 +18,9 @@ export class Line extends Base {
     let left;
     super(renderer, shaders, options);
 
-    let {
-      uniforms,
+    let { uniforms, stroke, join } = options;
+
+    const {
       material,
       position,
       color,
@@ -29,8 +30,6 @@ export class Line extends Base {
       stpq,
       linear,
       clip,
-      stroke,
-      join,
       proximity,
     } = options;
 
diff --git a/src/render/meshes/memoscreen.js b/src/render/meshes/memoscreen.js
index ef2e1b8e2f2c36db9d7f8c8b97e19ab5d70c593e..a646ef199d0e15572079b42b26d75f0c5f01abab 100644
--- a/src/render/meshes/memoscreen.js
+++ b/src/render/meshes/memoscreen.js
@@ -52,7 +52,7 @@ export class MemoScreen extends Screen {
     this.memo = options;
     this.uniforms = uniforms;
 
-    for (let object of Array.from(this.renders)) {
+    for (const object of Array.from(this.renders)) {
       object.transparent = false;
     }
   }
diff --git a/src/render/meshes/point.js b/src/render/meshes/point.js
index 55b0d1cc5d64508b12b82ed70898f1cb76bf390d..7eed603f389b1180bf2b867257a16c06c18a6522 100644
--- a/src/render/meshes/point.js
+++ b/src/render/meshes/point.js
@@ -18,8 +18,9 @@ export class Point extends Base {
     let f, left;
     super(renderer, shaders, options);
 
-    let {
-      uniforms,
+    let { uniforms, shape, fill } = options;
+
+    const {
       material,
       position,
       color,
@@ -28,9 +29,7 @@ export class Point extends Base {
       map,
       combine,
       linear,
-      shape,
       optical,
-      fill,
       stpq,
     } = options;
 
diff --git a/src/render/meshes/screen.js b/src/render/meshes/screen.js
index bd9efa39ca127b6e30b5c62d455b40729c7363a3..54f4430d75576f090f3ab3c3ecfd750826eff721 100644
--- a/src/render/meshes/screen.js
+++ b/src/render/meshes/screen.js
@@ -17,7 +17,9 @@ export class Screen extends Base {
     let f;
     super(renderer, shaders, options);
 
-    let { uniforms, map, combine, stpq, linear } = options;
+    let { uniforms } = options;
+    const { map, combine, stpq, linear } = options;
+
     if (uniforms == null) {
       uniforms = {};
     }
diff --git a/src/render/meshes/sprite.js b/src/render/meshes/sprite.js
index a506221e47d0c5739f8b8945f9c01e83ea2cebfa..3e0cd4987f7b77042ef28ca2b091c5846b05efbc 100644
--- a/src/render/meshes/sprite.js
+++ b/src/render/meshes/sprite.js
@@ -17,8 +17,8 @@ export class Sprite extends Base {
     let f;
     super(renderer, shaders, options);
 
-    let {
-      uniforms,
+    let { uniforms } = options;
+    const {
       material,
       position,
       sprite,
@@ -29,6 +29,7 @@ export class Sprite extends Base {
       mask,
       stpq,
     } = options;
+
     if (uniforms == null) {
       uniforms = {};
     }
diff --git a/src/render/meshes/strip.js b/src/render/meshes/strip.js
index 0a53303c5a60fc294f91ca208dbe2c5450a0ba53..f4bd1e137da1e88b4d28acfb5fd6064d98d086ff 100644
--- a/src/render/meshes/strip.js
+++ b/src/render/meshes/strip.js
@@ -17,17 +17,8 @@ export class Strip extends Base {
     let f;
     super(renderer, shaders, options);
 
-    let {
-      uniforms,
-      material,
-      position,
-      color,
-      mask,
-      map,
-      combine,
-      linear,
-      stpq,
-    } = options;
+    let { uniforms, material } = options;
+    const { position, color, mask, map, combine, linear, stpq } = options;
 
     if (uniforms == null) {
       uniforms = {};
diff --git a/src/render/meshes/surface.js b/src/render/meshes/surface.js
index 7241092362ce213ca25ee7f8aeb1326e7f804b56..add200c36753c86b55d27727e747679fe9b79813 100644
--- a/src/render/meshes/surface.js
+++ b/src/render/meshes/surface.js
@@ -17,18 +17,10 @@ export class Surface extends Base {
     let defs, f;
     super(renderer, shaders, options);
 
-    let {
-      uniforms,
-      material,
-      position,
-      color,
-      mask,
-      map,
-      combine,
-      linear,
-      stpq,
-      intUV,
-    } = options;
+    let { uniforms, material } = options;
+
+    const { position, color, mask, map, combine, linear, stpq, intUV } =
+      options;
 
     if (uniforms == null) {
       uniforms = {};
diff --git a/src/render/renderable.js b/src/render/renderable.js
index c224cfee30f1fd2b0158020137172e2b1513d006..7a56eec144db080edfce6d19a203a1c51d159030 100644
--- a/src/render/renderable.js
+++ b/src/render/renderable.js
@@ -22,14 +22,14 @@ export class Renderable {
   }
 
   _adopt(uniforms) {
-    for (let key in uniforms) {
+    for (const key in uniforms) {
       const value = uniforms[key];
       this.uniforms[key] = value;
     }
   }
 
   _set(uniforms) {
-    for (let key in uniforms) {
+    for (const key in uniforms) {
       const value = uniforms[key];
       if (this.uniforms[key] != null) {
         this.uniforms[key].value = value;
diff --git a/src/shaders/glsl/arrow.position.glsl b/src/shaders/glsl/arrow.position.js
similarity index 97%
rename from src/shaders/glsl/arrow.position.glsl
rename to src/shaders/glsl/arrow.position.js
index 2da55742e15e58f9f7dcb444b8051d77e913f065..49a2e3c1f898f2c54e21cf4fc46298cebf8dca08 100644
--- a/src/shaders/glsl/arrow.position.glsl
+++ b/src/shaders/glsl/arrow.position.js
@@ -1,4 +1,4 @@
-uniform float worldUnit;
+export default /* glsl */ `uniform float worldUnit;
 uniform float lineDepth;
 uniform float lineWidth;
 uniform float focusDepth;
@@ -72,3 +72,4 @@ vec3 getArrowPosition() {
   return (matrix * vec4(arrow.xyz, 1.0)).xyz;
 
 }
+`;
diff --git a/src/shaders/glsl/axis.position.glsl b/src/shaders/glsl/axis.position.js
similarity index 70%
rename from src/shaders/glsl/axis.position.glsl
rename to src/shaders/glsl/axis.position.js
index 5f3bd1c53e04654e55bf851294798d4a89e7244a..d351283cb8b5088f3c46d98119898913c9924bd9 100644
--- a/src/shaders/glsl/axis.position.glsl
+++ b/src/shaders/glsl/axis.position.js
@@ -1,6 +1,7 @@
-uniform vec4 axisStep;
+export default /* glsl */ `uniform vec4 axisStep;
 uniform vec4 axisPosition;
 
 vec4 getAxisPosition(vec4 xyzw, inout vec4 stpq) {
   return axisStep * xyzw.x + axisPosition;
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/cartesian.position.glsl b/src/shaders/glsl/cartesian.position.js
similarity index 67%
rename from src/shaders/glsl/cartesian.position.glsl
rename to src/shaders/glsl/cartesian.position.js
index 8570ff6f3400207df80cc75b290d9da5b166bbe6..c0886ca17a169aa368cb5a3ed2919059638ec608 100644
--- a/src/shaders/glsl/cartesian.position.glsl
+++ b/src/shaders/glsl/cartesian.position.js
@@ -1,5 +1,6 @@
-uniform mat4 viewMatrix;
+export default /* glsl */ `uniform mat4 viewMatrix;
 
 vec4 getCartesianPosition(vec4 position, inout vec4 stpq) {
   return viewMatrix * vec4(position.xyz, 1.0);
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/cartesian4.position.glsl b/src/shaders/glsl/cartesian4.position.js
similarity index 77%
rename from src/shaders/glsl/cartesian4.position.glsl
rename to src/shaders/glsl/cartesian4.position.js
index 26e633367b60d802a9063bbf3f4e21dceaa3e2ff..d94e6f827f77a7c82b3da533ea6ad1999b27e19f 100644
--- a/src/shaders/glsl/cartesian4.position.glsl
+++ b/src/shaders/glsl/cartesian4.position.js
@@ -1,4 +1,4 @@
-uniform vec4 basisScale;
+export default /* glsl */ `uniform vec4 basisScale;
 uniform vec4 basisOffset;
 uniform vec4 viewScale;
 uniform vec4 viewOffset;
@@ -6,3 +6,4 @@ uniform vec4 viewOffset;
 vec4 getCartesian4Position(vec4 position, inout vec4 stpq) {
   return position * basisScale + basisOffset;
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/clamp.position.glsl b/src/shaders/glsl/clamp.position.js
similarity index 59%
rename from src/shaders/glsl/clamp.position.glsl
rename to src/shaders/glsl/clamp.position.js
index c352eea4134cfa14f887e6b495cd3eead26bba94..93241a1cada460ffd23ad15f0c2c64aaef456395 100644
--- a/src/shaders/glsl/clamp.position.glsl
+++ b/src/shaders/glsl/clamp.position.js
@@ -1,5 +1,6 @@
-uniform vec4 clampLimit;
+export default /* glsl */ `uniform vec4 clampLimit;
 
 vec4 getClampXYZW(vec4 xyzw) {
   return clamp(xyzw, vec4(0.0), clampLimit);
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/color.opaque.glsl b/src/shaders/glsl/color.opaque.glsl
deleted file mode 100644
index d9d87f099c5c4969807374351d0e31e05e8eb09f..0000000000000000000000000000000000000000
--- a/src/shaders/glsl/color.opaque.glsl
+++ /dev/null
@@ -1,3 +0,0 @@
-vec4 opaqueColor(vec4 color) {
-  return vec4(color.rgb, 1.0);
-}
diff --git a/src/shaders/glsl/color.opaque.js b/src/shaders/glsl/color.opaque.js
new file mode 100644
index 0000000000000000000000000000000000000000..dd8c2ccab3fc02e3b34b9a50c4713bf55997ae2d
--- /dev/null
+++ b/src/shaders/glsl/color.opaque.js
@@ -0,0 +1,4 @@
+export default /* glsl */ `vec4 opaqueColor(vec4 color) {
+  return vec4(color.rgb, 1.0);
+}
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/face.position.glsl b/src/shaders/glsl/face.position.js
similarity index 76%
rename from src/shaders/glsl/face.position.glsl
rename to src/shaders/glsl/face.position.js
index 7c41c590d52ad3078a987f1573056e61742152d2..ae3da0d90dd88c1f31f25f3aa9760071cf3980b9 100644
--- a/src/shaders/glsl/face.position.glsl
+++ b/src/shaders/glsl/face.position.js
@@ -1,4 +1,4 @@
-uniform vec4 geometryClip;
+export default /* glsl */ `uniform vec4 geometryClip;
 attribute vec4 position4;
 
 // External
@@ -8,3 +8,4 @@ vec3 getFacePosition() {
   vec4 p = min(geometryClip, position4);
   return getPosition(p, 1.0);
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/face.position.normal.glsl b/src/shaders/glsl/face.position.normal.js
similarity index 92%
rename from src/shaders/glsl/face.position.normal.glsl
rename to src/shaders/glsl/face.position.normal.js
index a2bdb9ecceacea923ef9d365cbe03578eb6d2599..54b3229278970bf75f331f8e0d3e94f5a9acd06f 100644
--- a/src/shaders/glsl/face.position.normal.glsl
+++ b/src/shaders/glsl/face.position.normal.js
@@ -1,4 +1,4 @@
-attribute vec4 position4;
+export default /* glsl */ `attribute vec4 position4;
 
 // External
 vec3 getPosition(vec4 xyzw, float canonical);
@@ -28,3 +28,4 @@ vec3 getFacePositionNormal() {
 
   return center;
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/float.encode.glsl b/src/shaders/glsl/float.encode.js
similarity index 97%
rename from src/shaders/glsl/float.encode.glsl
rename to src/shaders/glsl/float.encode.js
index 314b06ecfd92773f765f2f677687cb84f2e6b34a..2fb54dd3752ddb7822af7736716fe9691d111bc7 100644
--- a/src/shaders/glsl/float.encode.glsl
+++ b/src/shaders/glsl/float.encode.js
@@ -1,4 +1,4 @@
-/*
+export default /* glsl */ `/*
 Float encoding technique by
 Carlos Scheidegger
 https://github.com/cscheid/lux/blob/master/src/shade/bits/encode_float.js
@@ -41,3 +41,4 @@ vec4 encode_float(float val) {
   float byte1 = (valuesign * 128.0 + remaining_bits_of_biased_exponent) / 255.0; 
   return vec4(byte4, byte3, byte2, byte1); 
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/float.index.pack.glsl b/src/shaders/glsl/float.index.pack.js
similarity index 84%
rename from src/shaders/glsl/float.index.pack.glsl
rename to src/shaders/glsl/float.index.pack.js
index 339f7e585d65b2f0ad3fa99f3500539279dcc9de..89c41a5e6e4a40f0626026b69fe2721ea162110c 100644
--- a/src/shaders/glsl/float.index.pack.glsl
+++ b/src/shaders/glsl/float.index.pack.js
@@ -1,4 +1,4 @@
-uniform vec4 indexModulus;
+export default /* glsl */ `uniform vec4 indexModulus;
 
 vec4 getSample(vec4 xyzw);
 vec4 getIndex(vec4 xyzw);
@@ -11,4 +11,4 @@ vec4 floatPackIndex(vec4 xyzw) {
   vec2 sum2 = offset.xy + offset.zw;
   float sum = sum2.x + sum2.y;
   return vec4(value.xyz, sum);
-}
\ No newline at end of file
+}`;
\ No newline at end of file
diff --git a/src/shaders/glsl/float.stretch.glsl b/src/shaders/glsl/float.stretch.js
similarity index 77%
rename from src/shaders/glsl/float.stretch.glsl
rename to src/shaders/glsl/float.stretch.js
index dc45482c31a2daab857313a04c9be4d5c363d287..eb10abf73636bc5b07e6ce21ad9ce0b6c42a4555 100644
--- a/src/shaders/glsl/float.stretch.glsl
+++ b/src/shaders/glsl/float.stretch.js
@@ -1,7 +1,7 @@
-vec4 getSample(vec4 xyzw);
+export default /* glsl */ `vec4 getSample(vec4 xyzw);
 
 float floatStretch(vec4 xyzw, float channelIndex) {
   vec4 sample = getSample(xyzw);
   vec2 xy = channelIndex > 1.5 ? sample.zw : sample.xy;
   return mod(channelIndex, 2.0) > .5 ? xy.y : xy.x;
-}
\ No newline at end of file
+}`;
\ No newline at end of file
diff --git a/src/shaders/glsl/fragment.clip.dashed.glsl b/src/shaders/glsl/fragment.clip.dashed.js
similarity index 88%
rename from src/shaders/glsl/fragment.clip.dashed.glsl
rename to src/shaders/glsl/fragment.clip.dashed.js
index 25c5a3f77e92e5399572b73733da276ac4a23d8f..36550ffcfb828597ba7ab2beb6242b358cd612ca 100644
--- a/src/shaders/glsl/fragment.clip.dashed.glsl
+++ b/src/shaders/glsl/fragment.clip.dashed.js
@@ -1,4 +1,4 @@
-varying float vClipStrokeWidth;
+export default /* glsl */ `varying float vClipStrokeWidth;
 varying float vClipStrokeIndex;
 varying vec3  vClipStrokeEven;
 varying vec3  vClipStrokeOdd;
@@ -20,3 +20,4 @@ void clipStrokeFragment() {
     discard;
   }
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/fragment.clip.dotted.glsl b/src/shaders/glsl/fragment.clip.dotted.js
similarity index 87%
rename from src/shaders/glsl/fragment.clip.dotted.glsl
rename to src/shaders/glsl/fragment.clip.dotted.js
index fda9ac621f89ed2843d7ad8520ebd55eb3330895..9d47284424bf1652ad263b88f141f1650d264a1b 100644
--- a/src/shaders/glsl/fragment.clip.dotted.glsl
+++ b/src/shaders/glsl/fragment.clip.dotted.js
@@ -1,4 +1,4 @@
-varying float vClipStrokeWidth;
+export default /* glsl */ `varying float vClipStrokeWidth;
 varying float vClipStrokeIndex;
 varying vec3  vClipStrokeEven;
 varying vec3  vClipStrokeOdd;
@@ -20,3 +20,4 @@ void clipStrokeFragment() {
     discard;
   }
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/fragment.clip.ends.glsl b/src/shaders/glsl/fragment.clip.ends.js
similarity index 61%
rename from src/shaders/glsl/fragment.clip.ends.glsl
rename to src/shaders/glsl/fragment.clip.ends.js
index 3fd657f6a6b0f2c389e0395b62c1e7e876f06e80..39f072720ea64b3ec0281429ad0901ca82f4aace 100644
--- a/src/shaders/glsl/fragment.clip.ends.glsl
+++ b/src/shaders/glsl/fragment.clip.ends.js
@@ -1,5 +1,6 @@
-varying vec2 vClipEnds;
+export default /* glsl */ `varying vec2 vClipEnds;
 
 void clipEndsFragment() {
   if (vClipEnds.x < 0.0 || vClipEnds.y < 0.0) discard;
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/fragment.clip.proximity.glsl b/src/shaders/glsl/fragment.clip.proximity.js
similarity index 53%
rename from src/shaders/glsl/fragment.clip.proximity.glsl
rename to src/shaders/glsl/fragment.clip.proximity.js
index 1e45fab00987b2e982b92a4777dca17a41378181..0f63197e14a31aba3edf6da86d9b64b8eeb8e838 100644
--- a/src/shaders/glsl/fragment.clip.proximity.glsl
+++ b/src/shaders/glsl/fragment.clip.proximity.js
@@ -1,5 +1,5 @@
-varying float vClipProximity;
+export default /* glsl */ `varying float vClipProximity;
 
 void clipProximityFragment() {
   if (vClipProximity >= 0.5) discard;
-}
\ No newline at end of file
+}`;
\ No newline at end of file
diff --git a/src/shaders/glsl/fragment.color.glsl b/src/shaders/glsl/fragment.color.glsl
deleted file mode 100644
index 5801c236985d2e92b1e856c70070dc7412a48f1b..0000000000000000000000000000000000000000
--- a/src/shaders/glsl/fragment.color.glsl
+++ /dev/null
@@ -1,3 +0,0 @@
-void setFragmentColor(vec4 color) {
-  gl_FragColor = color;
-}
\ No newline at end of file
diff --git a/src/shaders/glsl/fragment.color.js b/src/shaders/glsl/fragment.color.js
new file mode 100644
index 0000000000000000000000000000000000000000..7cba4bc26256688618136897c1b1520d44000721
--- /dev/null
+++ b/src/shaders/glsl/fragment.color.js
@@ -0,0 +1,3 @@
+export default /* glsl */ `void setFragmentColor(vec4 color) {
+  gl_FragColor = color;
+}`;
\ No newline at end of file
diff --git a/src/shaders/glsl/fragment.map.rgba.glsl b/src/shaders/glsl/fragment.map.rgba.glsl
deleted file mode 100644
index d00c707862998e9b1490d93dace78350379bfb03..0000000000000000000000000000000000000000
--- a/src/shaders/glsl/fragment.map.rgba.glsl
+++ /dev/null
@@ -1,3 +0,0 @@
-vec4 fragmentRGBA(vec4 rgba, vec4 stpq) {
-  return rgba;
-}
\ No newline at end of file
diff --git a/src/shaders/glsl/fragment.map.rgba.js b/src/shaders/glsl/fragment.map.rgba.js
new file mode 100644
index 0000000000000000000000000000000000000000..3c6e7510dd7eabb476e604fbf84220ebe8172cb6
--- /dev/null
+++ b/src/shaders/glsl/fragment.map.rgba.js
@@ -0,0 +1,3 @@
+export default /* glsl */ `vec4 fragmentRGBA(vec4 rgba, vec4 stpq) {
+  return rgba;
+}`;
\ No newline at end of file
diff --git a/src/shaders/glsl/fragment.solid.glsl b/src/shaders/glsl/fragment.solid.glsl
deleted file mode 100644
index e154f1bd301d6bed46d38ad4a911403edcc949f1..0000000000000000000000000000000000000000
--- a/src/shaders/glsl/fragment.solid.glsl
+++ /dev/null
@@ -1,4 +0,0 @@
-void setFragmentColor(vec4 color) {
-  if (color.a < 1.0) discard;
-  gl_FragColor = color;
-}
\ No newline at end of file
diff --git a/src/shaders/glsl/fragment.solid.js b/src/shaders/glsl/fragment.solid.js
new file mode 100644
index 0000000000000000000000000000000000000000..e52a0137cedc9a3e3264482b1b98395588de42a6
--- /dev/null
+++ b/src/shaders/glsl/fragment.solid.js
@@ -0,0 +1,4 @@
+export default /* glsl */ `void setFragmentColor(vec4 color) {
+  if (color.a < 1.0) discard;
+  gl_FragColor = color;
+}`;
\ No newline at end of file
diff --git a/src/shaders/glsl/fragment.transparent.glsl b/src/shaders/glsl/fragment.transparent.glsl
deleted file mode 100644
index 78afa5a8f39a789a620ee5191bf7565b5860ab6c..0000000000000000000000000000000000000000
--- a/src/shaders/glsl/fragment.transparent.glsl
+++ /dev/null
@@ -1,4 +0,0 @@
-void setFragmentColor(vec4 color) {
-  if (color.a >= 1.0) discard;
-  gl_FragColor = color;
-}
\ No newline at end of file
diff --git a/src/shaders/glsl/fragment.transparent.js b/src/shaders/glsl/fragment.transparent.js
new file mode 100644
index 0000000000000000000000000000000000000000..4520a2fefd1581be3fa8db5d6efe4b43b83bd684
--- /dev/null
+++ b/src/shaders/glsl/fragment.transparent.js
@@ -0,0 +1,4 @@
+export default /* glsl */ `void setFragmentColor(vec4 color) {
+  if (color.a >= 1.0) discard;
+  gl_FragColor = color;
+}`;
\ No newline at end of file
diff --git a/src/shaders/glsl/grid.position.glsl b/src/shaders/glsl/grid.position.js
similarity index 81%
rename from src/shaders/glsl/grid.position.glsl
rename to src/shaders/glsl/grid.position.js
index 2e1516d77c494a39d684eba536bbff17e99d62b9..4fbc91b27d79afe8f5c7faf8bb9731a5e3787126 100644
--- a/src/shaders/glsl/grid.position.glsl
+++ b/src/shaders/glsl/grid.position.js
@@ -1,4 +1,4 @@
-uniform vec4 gridPosition;
+export default /* glsl */ `uniform vec4 gridPosition;
 uniform vec4 gridStep;
 uniform vec4 gridAxis;
 
@@ -9,3 +9,4 @@ vec4 getGridPosition(vec4 xyzw) {
   vec4 offAxis = gridStep * xyzw.x + gridPosition;
   return onAxis + offAxis;
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/grow.position.glsl b/src/shaders/glsl/grow.position.js
similarity index 83%
rename from src/shaders/glsl/grow.position.glsl
rename to src/shaders/glsl/grow.position.js
index 241c4fefe87d5c13755db4a192b7dd802de85316..91383e47bb20333c95015f7e8f36ee277befa3e1 100644
--- a/src/shaders/glsl/grow.position.glsl
+++ b/src/shaders/glsl/grow.position.js
@@ -1,4 +1,4 @@
-uniform float growScale;
+export default /* glsl */ `uniform float growScale;
 uniform vec4  growMask;
 uniform vec4  growAnchor;
 
@@ -11,4 +11,4 @@ vec4 getGrowSample(vec4 xyzw) {
   vec4 center = getSample(anchor);
 
   return mix(center, position, growScale);
-}
\ No newline at end of file
+}`;
\ No newline at end of file
diff --git a/src/shaders/glsl/join.position.glsl b/src/shaders/glsl/join.position.js
similarity index 86%
rename from src/shaders/glsl/join.position.glsl
rename to src/shaders/glsl/join.position.js
index b3e9acba6c1de2ea724fc229a796ed7229762301..7ec87268fb652e43f7558dde5258f062e859ecf8 100644
--- a/src/shaders/glsl/join.position.glsl
+++ b/src/shaders/glsl/join.position.js
@@ -1,4 +1,4 @@
-uniform float joinStride;
+export default /* glsl */ `uniform float joinStride;
 uniform float joinStrideInv;
 
 float getIndex(vec4 xyzw);
@@ -15,3 +15,4 @@ vec4 getJoinXYZW(vec4 xyzw) {
   
   return injectIndices(fraction * joinStride, integer) + getRest(xyzw);
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/label.alpha.glsl b/src/shaders/glsl/label.alpha.js
similarity index 81%
rename from src/shaders/glsl/label.alpha.glsl
rename to src/shaders/glsl/label.alpha.js
index 6c8c71f62a8b391754faf64e458627fa57748cf8..ef81c82d61acc5927dfc1164de1f2bc23ae4dc04 100644
--- a/src/shaders/glsl/label.alpha.glsl
+++ b/src/shaders/glsl/label.alpha.js
@@ -1,4 +1,4 @@
-varying float vPixelSize;
+export default /* glsl */ `varying float vPixelSize;
 
 vec4 getLabelAlphaColor(vec4 color, vec4 sample) {
   float mask = clamp(sample.r * 1000.0, 0.0, 1.0);
@@ -7,3 +7,4 @@ vec4 getLabelAlphaColor(vec4 color, vec4 sample) {
   if (a <= 0.0) discard;
   return vec4(color.xyz, a);
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/label.map.glsl b/src/shaders/glsl/label.map.glsl
deleted file mode 100644
index 6c3d73393e609085b0e5f083e616b29aa2add0bb..0000000000000000000000000000000000000000
--- a/src/shaders/glsl/label.map.glsl
+++ /dev/null
@@ -1,3 +0,0 @@
-vec2 mapUV(vec4 uvwo, vec4 stpq) {
-  return uvwo.xy;
-}
diff --git a/src/shaders/glsl/label.map.js b/src/shaders/glsl/label.map.js
new file mode 100644
index 0000000000000000000000000000000000000000..a8ed391f8c99d3594d1161e9e7aaf797fc1bdb86
--- /dev/null
+++ b/src/shaders/glsl/label.map.js
@@ -0,0 +1,4 @@
+export default /* glsl */ `vec2 mapUV(vec4 uvwo, vec4 stpq) {
+  return uvwo.xy;
+}
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/label.outline.glsl b/src/shaders/glsl/label.outline.js
similarity index 91%
rename from src/shaders/glsl/label.outline.glsl
rename to src/shaders/glsl/label.outline.js
index f0276e3b852fe7a08094a58c5a2feb3f852039a5..bc3d6799baec46192f107a8baa7d924c614eb9c6 100644
--- a/src/shaders/glsl/label.outline.glsl
+++ b/src/shaders/glsl/label.outline.js
@@ -1,4 +1,4 @@
-uniform float outlineExpand;
+export default /* glsl */ `uniform float outlineExpand;
 uniform float outlineStep;
 uniform vec3  outlineColor;
 
@@ -25,3 +25,4 @@ vec4 getLabelOutlineColor(vec4 color, vec4 sample) {
   
   return vec4(blend, alpha.y * color.a);
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/layer.position.glsl b/src/shaders/glsl/layer.position.js
similarity index 69%
rename from src/shaders/glsl/layer.position.glsl
rename to src/shaders/glsl/layer.position.js
index 0bed10e717e827d9ac36722b2a0354cf6d794db5..06c57c4ad619e17a2e9e412db2f562ce994acc1e 100644
--- a/src/shaders/glsl/layer.position.glsl
+++ b/src/shaders/glsl/layer.position.js
@@ -1,6 +1,7 @@
-uniform vec4 layerScale;
+export default /* glsl */ `uniform vec4 layerScale;
 uniform vec4 layerBias;
 
 vec4 layerPosition(vec4 position, inout vec4 stpq) {
   return layerScale * position + layerBias;
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/lerp.depth.glsl b/src/shaders/glsl/lerp.depth.js
similarity index 87%
rename from src/shaders/glsl/lerp.depth.glsl
rename to src/shaders/glsl/lerp.depth.js
index cf8560a270d471cc7aedf2a6991d6526b4aa57aa..6ee2b3bae77b8a07a1db66dab5a680534ec3adc0 100644
--- a/src/shaders/glsl/lerp.depth.glsl
+++ b/src/shaders/glsl/lerp.depth.js
@@ -1,4 +1,4 @@
-// External
+export default /* glsl */ `// External
 vec4 sampleData(vec4 xyzw);
 
 vec4 lerpDepth(vec4 xyzw) {
@@ -14,3 +14,4 @@ vec4 lerpDepth(vec4 xyzw) {
 
   return mix(a, b, f);
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/lerp.height.glsl b/src/shaders/glsl/lerp.height.js
similarity index 88%
rename from src/shaders/glsl/lerp.height.glsl
rename to src/shaders/glsl/lerp.height.js
index ad09c814c2f3861fb5ec74dfe1d2ee5da41f26b0..730b4b649da2304e31faac36ea81e52c3e076683 100644
--- a/src/shaders/glsl/lerp.height.glsl
+++ b/src/shaders/glsl/lerp.height.js
@@ -1,4 +1,4 @@
-// External
+export default /* glsl */ `// External
 vec4 sampleData(vec4 xyzw);
 
 vec4 lerpHeight(vec4 xyzw) {
@@ -14,3 +14,4 @@ vec4 lerpHeight(vec4 xyzw) {
 
   return mix(a, b, f);
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/lerp.items.glsl b/src/shaders/glsl/lerp.items.js
similarity index 87%
rename from src/shaders/glsl/lerp.items.glsl
rename to src/shaders/glsl/lerp.items.js
index 43f05438c845772f4cc2546fe1781b2f6d39b9b8..848e9357ce92d1df447ad642591a7009a0b69e7c 100644
--- a/src/shaders/glsl/lerp.items.glsl
+++ b/src/shaders/glsl/lerp.items.js
@@ -1,4 +1,4 @@
-// External
+export default /* glsl */ `// External
 vec4 sampleData(vec4 xyzw);
 
 vec4 lerpItems(vec4 xyzw) {
@@ -14,3 +14,4 @@ vec4 lerpItems(vec4 xyzw) {
 
   return mix(a, b, f);
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/lerp.width.glsl b/src/shaders/glsl/lerp.width.js
similarity index 87%
rename from src/shaders/glsl/lerp.width.glsl
rename to src/shaders/glsl/lerp.width.js
index 32ec1c0aff2a38b6d1846eb6fe45bbe1bd5a9ce9..ec56fd011758180d658f3b613f15ec1ce30fa3f0 100644
--- a/src/shaders/glsl/lerp.width.glsl
+++ b/src/shaders/glsl/lerp.width.js
@@ -1,4 +1,4 @@
-// External
+export default /* glsl */ `// External
 vec4 sampleData(vec4 xyzw);
 
 vec4 lerpWidth(vec4 xyzw) {
@@ -14,3 +14,4 @@ vec4 lerpWidth(vec4 xyzw) {
 
   return mix(a, b, f);
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/line.position.glsl b/src/shaders/glsl/line.position.js
similarity index 92%
rename from src/shaders/glsl/line.position.glsl
rename to src/shaders/glsl/line.position.js
index 230ed2cae79b095c7cbe20ff179a38e4b53843a1..58f910327a27b970439fd4f16a502ed5aebd8e1e 100644
--- a/src/shaders/glsl/line.position.glsl
+++ b/src/shaders/glsl/line.position.js
@@ -1,4 +1,4 @@
-// Units and calibration
+export default /* glsl */ `// Units and calibration
 uniform float worldUnit;
 uniform float lineWidth;
 uniform float lineDepth;
@@ -8,7 +8,7 @@ uniform float focusDepth;
 uniform vec4 geometryClip;
 attribute vec4 position4;
 
-// (Start/mid/end -1/0/1, top/bottom -1,1) 
+// (Start/mid/end -1/0/1, top/bottom -1,1)
 attribute vec2 line;
 
 // 0...1 for round or bevel joins
@@ -72,20 +72,25 @@ void clipEnds(vec4 xyzw, vec3 center, vec3 pos) {
       float z = max(0.00001, -end.z);
       depth = mix(z, focusDepth, lineDepth);
     }
-    
+
     // Absolute arrow length
     float size = arrowSize * depth;
 
     // Adjust clip range
     // Approach linear scaling with cubic ease the smaller we get
     float mini = clamp(1.0 - l / size * .333, 0.0, 1.0);
-    float scale = 1.0 - mini * mini * mini; 
+    float scale = 1.0 - mini * mini * mini;
     float invrange = 1.0 / (size * scale);
-  
+
     // Clip end
-    diff = normalize(end - center);
-    float d = dot(end - pos, diff);
-    vClipEnds.x = d * invrange - 1.0;
+    diff = end - center;
+    if(diff == vec3(0.0))
+      vClipEnds.x = -1.0;
+    else {
+      diff = normalize(end - center);
+      float d = dot(end - pos, diff);
+      vClipEnds.x = d * invrange - 1.0;
+    }
   }
 
   if (clipStyle.x > 0.0) {
@@ -95,20 +100,25 @@ void clipEnds(vec4 xyzw, vec3 center, vec3 pos) {
       float z = max(0.00001, -start.z);
       depth = mix(z, focusDepth, lineDepth);
     }
-    
+
     // Absolute arrow length
     float size = arrowSize * depth;
 
     // Adjust clip range
     // Approach linear scaling with cubic ease the smaller we get
     float mini = clamp(1.0 - l / size * .333, 0.0, 1.0);
-    float scale = 1.0 - mini * mini * mini; 
+    float scale = 1.0 - mini * mini * mini;
     float invrange = 1.0 / (size * scale);
-  
-    // Clip start 
-    diff = normalize(center - start);
-    float d = dot(pos - start, diff);
-    vClipEnds.y = d * invrange - 1.0;
+
+    // Clip start
+    diff = center - start;
+    if(diff == vec3(0.0))
+      vClipEnds.y = -1.0;
+    else {
+      diff = normalize(center - start);
+      float d = dot(pos - start, diff);
+      vClipEnds.y = d * invrange - 1.0;
+    }
   }
 
 
@@ -171,7 +181,7 @@ vec3 getLineJoin(float edge, bool odd, vec3 left, vec3 center, vec3 right, float
   float l2 = dot(d.zw, d.zw);
 
   if (l1 + l2 > 0.0) {
-    
+
     if (edge > 0.5 || l2 == 0.0) {
       vec2 nl = normalize(d.xy);
       vec2 tl = vec2(nl.y, -nl.x);
@@ -226,7 +236,7 @@ vec3 getLineJoin(float edge, bool odd, vec3 left, vec3 center, vec3 right, float
       // Average tangent
       vec2 tc = normalize(tl + tr);
 #endif
-    
+
       // Miter join
       float cosA   = dot(nl, tc);
       float sinA   = max(0.1, abs(dot(tl, tc)));
@@ -340,3 +350,4 @@ vec3 getLinePosition() {
 
   return pos;
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/map.2d.data.glsl b/src/shaders/glsl/map.2d.data.js
similarity index 63%
rename from src/shaders/glsl/map.2d.data.glsl
rename to src/shaders/glsl/map.2d.data.js
index 9b895cd651a0dac62fbe1a02b3be37d795908d22..ea46a28c995c5f217dd2ece66f98f18879b4fba2 100644
--- a/src/shaders/glsl/map.2d.data.glsl
+++ b/src/shaders/glsl/map.2d.data.js
@@ -1,6 +1,7 @@
-uniform vec2 dataResolution;
+export default /* glsl */ `uniform vec2 dataResolution;
 uniform vec2 dataPointer;
 
 vec2 map2DData(vec2 xy) {
   return (xy + dataPointer) * dataResolution;
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/map.2d.data.wrap.glsl b/src/shaders/glsl/map.2d.data.wrap.js
similarity index 65%
rename from src/shaders/glsl/map.2d.data.wrap.glsl
rename to src/shaders/glsl/map.2d.data.wrap.js
index c3b9d13121cb2b4e603b901108f1b59ff5809e0e..4605d0d6fa73b7c54f6dc2ad2c410fd7bfa65fc5 100644
--- a/src/shaders/glsl/map.2d.data.wrap.glsl
+++ b/src/shaders/glsl/map.2d.data.wrap.js
@@ -1,6 +1,7 @@
-uniform vec2 dataResolution;
+export default /* glsl */ `uniform vec2 dataResolution;
 uniform vec2 dataPointer;
 
 vec2 map2DData(vec2 xy) {
   return fract((xy + dataPointer) * dataResolution);
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/map.xyzw.2dv.glsl b/src/shaders/glsl/map.xyzw.2dv.glsl
deleted file mode 100644
index 4cddfb62ae891d9b6294bd99f7a79159b7dd7529..0000000000000000000000000000000000000000
--- a/src/shaders/glsl/map.xyzw.2dv.glsl
+++ /dev/null
@@ -1,5 +0,0 @@
-void mapXyzw2DV(vec4 xyzw, out vec2 xy, out float z) {
-  xy = xyzw.xy;
-  z  = xyzw.z;
-}
-
diff --git a/src/shaders/glsl/map.xyzw.2dv.js b/src/shaders/glsl/map.xyzw.2dv.js
new file mode 100644
index 0000000000000000000000000000000000000000..1fd1ba040d1976143db10bc86e8675c06939a14e
--- /dev/null
+++ b/src/shaders/glsl/map.xyzw.2dv.js
@@ -0,0 +1,6 @@
+export default /* glsl */ `void mapXyzw2DV(vec4 xyzw, out vec2 xy, out float z) {
+  xy = xyzw.xy;
+  z  = xyzw.z;
+}
+
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/map.xyzw.align.glsl b/src/shaders/glsl/map.xyzw.align.glsl
deleted file mode 100644
index 9151ebc828dadf47e011c48a550604c14ec870dd..0000000000000000000000000000000000000000
--- a/src/shaders/glsl/map.xyzw.align.glsl
+++ /dev/null
@@ -1,4 +0,0 @@
-vec4 alignXYZW(vec4 xyzw) {
-  return floor(xyzw + .5);
-}
-
diff --git a/src/shaders/glsl/map.xyzw.align.js b/src/shaders/glsl/map.xyzw.align.js
new file mode 100644
index 0000000000000000000000000000000000000000..b4db6886b3b8b301b0e76ba254a8711a4d65d58d
--- /dev/null
+++ b/src/shaders/glsl/map.xyzw.align.js
@@ -0,0 +1,5 @@
+export default /* glsl */ `vec4 alignXYZW(vec4 xyzw) {
+  return floor(xyzw + .5);
+}
+
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/map.xyzw.texture.glsl b/src/shaders/glsl/map.xyzw.texture.js
similarity index 79%
rename from src/shaders/glsl/map.xyzw.texture.glsl
rename to src/shaders/glsl/map.xyzw.texture.js
index bbb38fff70644afdf3495d2baefdc13c45592eb8..6ac04c4c5b727ed6d0489d4cb5fd8e7dfa052932 100644
--- a/src/shaders/glsl/map.xyzw.texture.glsl
+++ b/src/shaders/glsl/map.xyzw.texture.js
@@ -1,4 +1,4 @@
-uniform float textureItems;
+export default /* glsl */ `uniform float textureItems;
 uniform float textureHeight;
 
 vec2 mapXyzwTexture(vec4 xyzw) {
@@ -11,3 +11,4 @@ vec2 mapXyzwTexture(vec4 xyzw) {
   return vec2(i, y) + vec2(x, z) * vec2(textureItems, textureHeight);
 }
 
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/mesh.fragment.color.glsl b/src/shaders/glsl/mesh.fragment.color.glsl
deleted file mode 100644
index 9019b2d73a05d0b3ff6e6d479733890ab2ab9207..0000000000000000000000000000000000000000
--- a/src/shaders/glsl/mesh.fragment.color.glsl
+++ /dev/null
@@ -1,5 +0,0 @@
-varying vec4 vColor;
-
-vec4 getColor() {
-  return vColor;
-}
diff --git a/src/shaders/glsl/mesh.fragment.color.js b/src/shaders/glsl/mesh.fragment.color.js
new file mode 100644
index 0000000000000000000000000000000000000000..1cd71de639d079e3af2a4dc031b513345db8fd58
--- /dev/null
+++ b/src/shaders/glsl/mesh.fragment.color.js
@@ -0,0 +1,6 @@
+export default /* glsl */ `varying vec4 vColor;
+
+vec4 getColor() {
+  return vColor;
+}
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/mesh.fragment.map.glsl b/src/shaders/glsl/mesh.fragment.map.js
similarity index 92%
rename from src/shaders/glsl/mesh.fragment.map.glsl
rename to src/shaders/glsl/mesh.fragment.map.js
index 554a33385539b6ede2ee90cb1da61691f9042410..85df295416f1a7c3b61c0e42873251b5554ff791 100644
--- a/src/shaders/glsl/mesh.fragment.map.glsl
+++ b/src/shaders/glsl/mesh.fragment.map.js
@@ -1,4 +1,4 @@
-#ifdef POSITION_STPQ
+export default /* glsl */ `#ifdef POSITION_STPQ
 varying vec4 vSTPQ;
 #endif
 #ifdef POSITION_U
@@ -38,3 +38,4 @@ vec4 getMapColor() {
 
   return getSample(uvwo, stpq);
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/mesh.fragment.mask.glsl b/src/shaders/glsl/mesh.fragment.mask.js
similarity index 77%
rename from src/shaders/glsl/mesh.fragment.mask.glsl
rename to src/shaders/glsl/mesh.fragment.mask.js
index a3630f9d4a7c16ec69c6faea630225e962100a90..1152427d321de75e8400d53436a8a922485791f3 100644
--- a/src/shaders/glsl/mesh.fragment.mask.glsl
+++ b/src/shaders/glsl/mesh.fragment.mask.js
@@ -1,4 +1,4 @@
-varying float vMask;
+export default /* glsl */ `varying float vMask;
 
 float ease(float t) {
   t = clamp(t, 0.0, 1.0);
@@ -9,3 +9,4 @@ vec4 maskColor() {
   if (vMask <= 0.0) discard;
   return vec4(vec3(1.0), ease(vMask));
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/mesh.fragment.material.glsl b/src/shaders/glsl/mesh.fragment.material.js
similarity index 92%
rename from src/shaders/glsl/mesh.fragment.material.glsl
rename to src/shaders/glsl/mesh.fragment.material.js
index 5c3dde6c7324849304e0409cd97b1a4edba49db3..f28f41496b318567b419cb9daa8810c14a3be24f 100644
--- a/src/shaders/glsl/mesh.fragment.material.glsl
+++ b/src/shaders/glsl/mesh.fragment.material.js
@@ -1,4 +1,4 @@
-#ifdef POSITION_STPQ
+export default /* glsl */ `#ifdef POSITION_STPQ
 varying vec4 vSTPQ;
 #endif
 #ifdef POSITION_U
@@ -38,3 +38,4 @@ vec4 getMaterialColor(vec4 rgba) {
 
   return getSample(rgba, stpq);
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/mesh.fragment.shaded.glsl b/src/shaders/glsl/mesh.fragment.shaded.js
similarity index 93%
rename from src/shaders/glsl/mesh.fragment.shaded.glsl
rename to src/shaders/glsl/mesh.fragment.shaded.js
index 352a6ae3e3f150ea56334fc08b65a9dd4ad0b41f..a24bae8f502b367f407d4caaf5bdf400277d0c91 100644
--- a/src/shaders/glsl/mesh.fragment.shaded.glsl
+++ b/src/shaders/glsl/mesh.fragment.shaded.js
@@ -1,4 +1,4 @@
-varying vec3 vNormal;
+export default /* glsl */ `varying vec3 vNormal;
 varying vec3 vLight;
 varying vec3 vPosition;
 
@@ -26,3 +26,4 @@ vec4 getShadedColor(vec4 rgba) {
 	
 	return vec4(color * (diffuse * .9 + .05) + .25 * color2 * specular, rgba.a);
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/mesh.fragment.texture.glsl b/src/shaders/glsl/mesh.fragment.texture.glsl
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/src/shaders/glsl/mesh.fragment.texture.js b/src/shaders/glsl/mesh.fragment.texture.js
new file mode 100644
index 0000000000000000000000000000000000000000..692c28077ffd940cb71029e7a3f199bf4f0ae879
--- /dev/null
+++ b/src/shaders/glsl/mesh.fragment.texture.js
@@ -0,0 +1 @@
+export default /* glsl */ ``;
\ No newline at end of file
diff --git a/src/shaders/glsl/mesh.gamma.in.glsl b/src/shaders/glsl/mesh.gamma.in.glsl
deleted file mode 100644
index 7e4d6969f177467e15dd2de67169df584aced4a9..0000000000000000000000000000000000000000
--- a/src/shaders/glsl/mesh.gamma.in.glsl
+++ /dev/null
@@ -1,3 +0,0 @@
-vec4 getGammaInColor(vec4 rgba) {
-  return vec4(rgba.rgb * rgba.rgb, rgba.a);
-}
diff --git a/src/shaders/glsl/mesh.gamma.in.js b/src/shaders/glsl/mesh.gamma.in.js
new file mode 100644
index 0000000000000000000000000000000000000000..52a28afb21a6152d049ec7965beb508ec3de4fda
--- /dev/null
+++ b/src/shaders/glsl/mesh.gamma.in.js
@@ -0,0 +1,4 @@
+export default /* glsl */ `vec4 getGammaInColor(vec4 rgba) {
+  return vec4(rgba.rgb * rgba.rgb, rgba.a);
+}
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/mesh.gamma.out.glsl b/src/shaders/glsl/mesh.gamma.out.glsl
deleted file mode 100644
index 10217850082ac2ab5932467dfbb7e508426b3e5e..0000000000000000000000000000000000000000
--- a/src/shaders/glsl/mesh.gamma.out.glsl
+++ /dev/null
@@ -1,3 +0,0 @@
-vec4 getGammaOutColor(vec4 rgba) {
-  return vec4(sqrt(rgba.rgb), rgba.a);
-}
diff --git a/src/shaders/glsl/mesh.gamma.out.js b/src/shaders/glsl/mesh.gamma.out.js
new file mode 100644
index 0000000000000000000000000000000000000000..4b5477c3e50b3720b845f42e012dcff0dea07ffc
--- /dev/null
+++ b/src/shaders/glsl/mesh.gamma.out.js
@@ -0,0 +1,4 @@
+export default /* glsl */ `vec4 getGammaOutColor(vec4 rgba) {
+  return vec4(sqrt(rgba.rgb), rgba.a);
+}
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/mesh.map.uvwo.glsl b/src/shaders/glsl/mesh.map.uvwo.glsl
deleted file mode 100644
index 5b97862f3b48d381fffbcbde25ef02d69f518fd8..0000000000000000000000000000000000000000
--- a/src/shaders/glsl/mesh.map.uvwo.glsl
+++ /dev/null
@@ -1,3 +0,0 @@
-vec4 mapUVWO(vec4 uvwo, vec4 stpq) {
-  return uvwo;
-}
diff --git a/src/shaders/glsl/mesh.map.uvwo.js b/src/shaders/glsl/mesh.map.uvwo.js
new file mode 100644
index 0000000000000000000000000000000000000000..6194a18710f2eca12db15f2948d5d55f6391b883
--- /dev/null
+++ b/src/shaders/glsl/mesh.map.uvwo.js
@@ -0,0 +1,4 @@
+export default /* glsl */ `vec4 mapUVWO(vec4 uvwo, vec4 stpq) {
+  return uvwo;
+}
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/mesh.position.glsl b/src/shaders/glsl/mesh.position.js
similarity index 76%
rename from src/shaders/glsl/mesh.position.glsl
rename to src/shaders/glsl/mesh.position.js
index b4ac8f3111d90fa1ef49f7e4438eb75c0b507720..23ca54bbdde83e46aa4c10e3ed98eae15aa61d60 100644
--- a/src/shaders/glsl/mesh.position.glsl
+++ b/src/shaders/glsl/mesh.position.js
@@ -1,4 +1,4 @@
-uniform vec4 geometryClip;
+export default /* glsl */ `uniform vec4 geometryClip;
 attribute vec4 position4;
 
 // External
@@ -8,3 +8,4 @@ vec3 getMeshPosition() {
   vec4 p = min(geometryClip, position4);
   return getPosition(p, 1.0);
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/mesh.vertex.color.glsl b/src/shaders/glsl/mesh.vertex.color.js
similarity index 76%
rename from src/shaders/glsl/mesh.vertex.color.glsl
rename to src/shaders/glsl/mesh.vertex.color.js
index d17a1919b4cc8728df5004f96ac3bd2aa5fa0b4e..7a276d17ff7f288aa7c6c389ae17c69a2235fca2 100644
--- a/src/shaders/glsl/mesh.vertex.color.glsl
+++ b/src/shaders/glsl/mesh.vertex.color.js
@@ -1,4 +1,4 @@
-attribute vec4 position4;
+export default /* glsl */ `attribute vec4 position4;
 uniform vec4 geometryClip;
 varying vec4 vColor;
 
@@ -9,3 +9,4 @@ void vertexColor() {
   vec4 p = min(geometryClip, position4);
   vColor = getSample(p);
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/mesh.vertex.mask.glsl b/src/shaders/glsl/mesh.vertex.mask.js
similarity index 80%
rename from src/shaders/glsl/mesh.vertex.mask.glsl
rename to src/shaders/glsl/mesh.vertex.mask.js
index 3e9e383c75545e768aa5623969631cfa35c5e269..32e7e75d3a12f508357dc449269b396cb76d8b83 100644
--- a/src/shaders/glsl/mesh.vertex.mask.glsl
+++ b/src/shaders/glsl/mesh.vertex.mask.js
@@ -1,4 +1,4 @@
-attribute vec4 position4;
+export default /* glsl */ `attribute vec4 position4;
 uniform vec4 geometryResolution;
 uniform vec4 geometryClip;
 varying float vMask;
@@ -10,3 +10,4 @@ void maskLevel() {
   vec4 p = min(geometryClip, position4);
   vMask = getSample(p * geometryResolution);
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/mesh.vertex.position.glsl b/src/shaders/glsl/mesh.vertex.position.js
similarity index 92%
rename from src/shaders/glsl/mesh.vertex.position.glsl
rename to src/shaders/glsl/mesh.vertex.position.js
index 48a6b182e5aec54b8392ef540f5d0785f0c3aa24..cc8ac8068606a8d64f60cdee75b49ccffbb2776e 100644
--- a/src/shaders/glsl/mesh.vertex.position.glsl
+++ b/src/shaders/glsl/mesh.vertex.position.js
@@ -1,4 +1,4 @@
-uniform vec4 geometryResolution;
+export default /* glsl */ `uniform vec4 geometryResolution;
 
 #ifdef POSITION_STPQ
 varying vec4 vSTPQ;
@@ -44,3 +44,4 @@ vec3 getMeshPosition(vec4 xyzw, float canonical) {
   #endif
   return xyz;
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/move.position.glsl b/src/shaders/glsl/move.position.js
similarity index 92%
rename from src/shaders/glsl/move.position.glsl
rename to src/shaders/glsl/move.position.js
index 91793442ab174fc12c6c8f352bb1481acb1ae451..659b3d561beb77ce919723f782e5ba5690322748 100644
--- a/src/shaders/glsl/move.position.glsl
+++ b/src/shaders/glsl/move.position.js
@@ -1,4 +1,4 @@
-uniform float transitionEnter;
+export default /* glsl */ `uniform float transitionEnter;
 uniform float transitionExit;
 uniform vec4  transitionScale;
 uniform vec4  transitionBias;
@@ -29,4 +29,4 @@ vec4 getTransitionPosition(vec4 xyzw, inout vec4 stpq) {
   float a2 = ease(exit  * factor + offset - skew);
 
   return xyzw + a1 * moveFrom + a2 * moveTo;
-}
\ No newline at end of file
+}`;
\ No newline at end of file
diff --git a/src/shaders/glsl/object.mask.default.glsl b/src/shaders/glsl/object.mask.default.glsl
deleted file mode 100644
index bd0f167ec3f14a5da4f22cd64c421aa96ac69aa9..0000000000000000000000000000000000000000
--- a/src/shaders/glsl/object.mask.default.glsl
+++ /dev/null
@@ -1,3 +0,0 @@
-vec4 getMask(vec4 xyzw) {
-  return vec4(1.0);
-}
\ No newline at end of file
diff --git a/src/shaders/glsl/object.mask.default.js b/src/shaders/glsl/object.mask.default.js
new file mode 100644
index 0000000000000000000000000000000000000000..b6f2cd950e7460803c49eb4429fe431badd69653
--- /dev/null
+++ b/src/shaders/glsl/object.mask.default.js
@@ -0,0 +1,3 @@
+export default /* glsl */ `vec4 getMask(vec4 xyzw) {
+  return vec4(1.0);
+}`;
\ No newline at end of file
diff --git a/src/shaders/glsl/point.alpha.circle.hollow.glsl b/src/shaders/glsl/point.alpha.circle.hollow.js
similarity index 64%
rename from src/shaders/glsl/point.alpha.circle.hollow.glsl
rename to src/shaders/glsl/point.alpha.circle.hollow.js
index cd3294e74d49f5973515bb8d35754e04e1811f64..7376d1951672ee5ad8c14e89fa328d49458a30aa 100644
--- a/src/shaders/glsl/point.alpha.circle.hollow.glsl
+++ b/src/shaders/glsl/point.alpha.circle.hollow.js
@@ -1,5 +1,6 @@
-varying float vPixelSize;
+export default /* glsl */ `varying float vPixelSize;
 
 float getDiscHollowAlpha(float mask) {
   return vPixelSize * (0.5 - 2.0 * abs(sqrt(mask) - .75));
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/point.alpha.circle.glsl b/src/shaders/glsl/point.alpha.circle.js
similarity index 78%
rename from src/shaders/glsl/point.alpha.circle.glsl
rename to src/shaders/glsl/point.alpha.circle.js
index 143d026227ea7462f57f764566b1f4c07b4b1458..1b36d2953fb91a28bc8106b3b05d1685590bcfeb 100644
--- a/src/shaders/glsl/point.alpha.circle.glsl
+++ b/src/shaders/glsl/point.alpha.circle.js
@@ -1,7 +1,8 @@
-varying float vPixelSize;
+export default /* glsl */ `varying float vPixelSize;
 
 float getDiscAlpha(float mask) {
   // Approximation: 1 - x*x is approximately linear around x = 1 with slope 2
   return vPixelSize * (1.0 - mask);
   //  return vPixelSize * 2.0 * (1.0 - sqrt(mask));
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/point.alpha.generic.hollow.glsl b/src/shaders/glsl/point.alpha.generic.hollow.js
similarity index 64%
rename from src/shaders/glsl/point.alpha.generic.hollow.glsl
rename to src/shaders/glsl/point.alpha.generic.hollow.js
index 70468f17e289a2d1d3e3d4de7e7f4d01887cf4de..c662f0c9f7017176f98c8f6581b448e24f6c25ea 100644
--- a/src/shaders/glsl/point.alpha.generic.hollow.glsl
+++ b/src/shaders/glsl/point.alpha.generic.hollow.js
@@ -1,5 +1,6 @@
-varying float vPixelSize;
+export default /* glsl */ `varying float vPixelSize;
 
 float getGenericHollowAlpha(float mask) {
   return vPixelSize * (0.5 - 2.0 * abs(mask - .75));
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/point.alpha.generic.glsl b/src/shaders/glsl/point.alpha.generic.js
similarity index 59%
rename from src/shaders/glsl/point.alpha.generic.glsl
rename to src/shaders/glsl/point.alpha.generic.js
index eca0471413424d045274d11081f8979c786fefb1..3bce777776585adf70164b37c409768997f309ac 100644
--- a/src/shaders/glsl/point.alpha.generic.glsl
+++ b/src/shaders/glsl/point.alpha.generic.js
@@ -1,5 +1,6 @@
-varying float vPixelSize;
+export default /* glsl */ `varying float vPixelSize;
 
 float getGenericAlpha(float mask) {
   return vPixelSize * 2.0 * (1.0 - mask);
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/point.edge.glsl b/src/shaders/glsl/point.edge.js
similarity index 85%
rename from src/shaders/glsl/point.edge.glsl
rename to src/shaders/glsl/point.edge.js
index 4dfcc22a098d5fffcfb6e5de4f7ab7eeb5682a27..a5108fbed3ad1ef8f712a4cb98967a2981b1b636 100644
--- a/src/shaders/glsl/point.edge.glsl
+++ b/src/shaders/glsl/point.edge.js
@@ -1,4 +1,4 @@
-varying vec2 vSprite;
+export default /* glsl */ `varying vec2 vSprite;
 
 float getSpriteMask(vec2 xy);
 float getSpriteAlpha(float mask);
@@ -14,3 +14,4 @@ void setFragmentColorFill(vec4 color) {
   }
   gl_FragColor = vec4(color.rgb, alpha * color.a);
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/point.fill.glsl b/src/shaders/glsl/point.fill.js
similarity index 84%
rename from src/shaders/glsl/point.fill.glsl
rename to src/shaders/glsl/point.fill.js
index aece9cc5edc96cabdcb7cb16f40cfa0e11b93d79..6f454b3c352818a7874e6b7659dca1580bd5c27c 100644
--- a/src/shaders/glsl/point.fill.glsl
+++ b/src/shaders/glsl/point.fill.js
@@ -1,4 +1,4 @@
-varying vec2 vSprite;
+export default /* glsl */ `varying vec2 vSprite;
 
 float getSpriteMask(vec2 xy);
 float getSpriteAlpha(float mask);
@@ -15,3 +15,4 @@ void setFragmentColorFill(vec4 color) {
   gl_FragColor = color;
 }
 
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/point.mask.circle.glsl b/src/shaders/glsl/point.mask.circle.js
similarity index 50%
rename from src/shaders/glsl/point.mask.circle.glsl
rename to src/shaders/glsl/point.mask.circle.js
index 42b834cd5b4b2e011e822a88146000ecd632e132..a8332f890c378da50b67ac4a71920a6687a96b4f 100644
--- a/src/shaders/glsl/point.mask.circle.glsl
+++ b/src/shaders/glsl/point.mask.circle.js
@@ -1,5 +1,6 @@
-varying float vPixelSize;
+export default /* glsl */ `varying float vPixelSize;
 
 float getCircleMask(vec2 uv) {
   return dot(uv, uv);
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/point.mask.diamond.glsl b/src/shaders/glsl/point.mask.diamond.js
similarity index 57%
rename from src/shaders/glsl/point.mask.diamond.glsl
rename to src/shaders/glsl/point.mask.diamond.js
index c992be8b20c94c83dd94dea84bf1c996f9a9759f..19c9a1c4dad93057315bf35f188481eeb47e49a0 100644
--- a/src/shaders/glsl/point.mask.diamond.glsl
+++ b/src/shaders/glsl/point.mask.diamond.js
@@ -1,6 +1,7 @@
-varying float vPixelSize;
+export default /* glsl */ `varying float vPixelSize;
 
 float getDiamondMask(vec2 uv) {
   vec2 a = abs(uv);
   return a.x + a.y;
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/point.mask.down.glsl b/src/shaders/glsl/point.mask.down.js
similarity index 66%
rename from src/shaders/glsl/point.mask.down.glsl
rename to src/shaders/glsl/point.mask.down.js
index 5a821e84253c9b2c507bc497087b986eecc38eb6..1189d156afb5061929fb742c646e6b04bd29c70c 100644
--- a/src/shaders/glsl/point.mask.down.glsl
+++ b/src/shaders/glsl/point.mask.down.js
@@ -1,6 +1,7 @@
-varying float vPixelSize;
+export default /* glsl */ `varying float vPixelSize;
 
 float getTriangleDownMask(vec2 uv) {
   uv.y += .25;
   return max(uv.y, abs(uv.x) * .866 - uv.y * .5 + .6);
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/point.mask.left.glsl b/src/shaders/glsl/point.mask.left.js
similarity index 66%
rename from src/shaders/glsl/point.mask.left.glsl
rename to src/shaders/glsl/point.mask.left.js
index ae95931ecb556c8cae4891e5c048dbc2b066a550..fdd2140265063753ae37af612bbbd878796d40d2 100644
--- a/src/shaders/glsl/point.mask.left.glsl
+++ b/src/shaders/glsl/point.mask.left.js
@@ -1,6 +1,7 @@
-varying float vPixelSize;
+export default /* glsl */ `varying float vPixelSize;
 
 float getTriangleLeftMask(vec2 uv) {
   uv.x += .25;
   return max(uv.x, abs(uv.y) * .866 - uv.x * .5 + .6);
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/point.mask.right.glsl b/src/shaders/glsl/point.mask.right.js
similarity index 67%
rename from src/shaders/glsl/point.mask.right.glsl
rename to src/shaders/glsl/point.mask.right.js
index 8a7bec182b16aaa420015c8f1bf98522ea9e4487..727cb33094080028df4991e027b2399b4d277f48 100644
--- a/src/shaders/glsl/point.mask.right.glsl
+++ b/src/shaders/glsl/point.mask.right.js
@@ -1,6 +1,7 @@
-varying float vPixelSize;
+export default /* glsl */ `varying float vPixelSize;
 
 float getTriangleRightMask(vec2 uv) {
   uv.x -= .25;
   return max(-uv.x, abs(uv.y) * .866 + uv.x * .5 + .6);
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/point.mask.square.glsl b/src/shaders/glsl/point.mask.square.js
similarity index 58%
rename from src/shaders/glsl/point.mask.square.glsl
rename to src/shaders/glsl/point.mask.square.js
index a16787e5284f5af7b064080068e378df723f3d07..ed142f5c9678211c4a9c518504d354f52ad5cfdb 100644
--- a/src/shaders/glsl/point.mask.square.glsl
+++ b/src/shaders/glsl/point.mask.square.js
@@ -1,6 +1,7 @@
-varying float vPixelSize;
+export default /* glsl */ `varying float vPixelSize;
 
 float getSquareMask(vec2 uv) {
   vec2 a = abs(uv);
   return max(a.x, a.y);
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/point.mask.up.glsl b/src/shaders/glsl/point.mask.up.js
similarity index 66%
rename from src/shaders/glsl/point.mask.up.glsl
rename to src/shaders/glsl/point.mask.up.js
index b73f93a6bd2506c305acf638ed500762df2055ca..ed8d756a88bb9df93edbd9a6565468a2676fee4f 100644
--- a/src/shaders/glsl/point.mask.up.glsl
+++ b/src/shaders/glsl/point.mask.up.js
@@ -1,6 +1,7 @@
-varying float vPixelSize;
+export default /* glsl */ `varying float vPixelSize;
 
 float getTriangleUpMask(vec2 uv) {
   uv.y -= .25;
   return max(-uv.y, abs(uv.x) * .866 + uv.y * .5 + .6);
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/point.position.glsl b/src/shaders/glsl/point.position.js
similarity index 95%
rename from src/shaders/glsl/point.position.glsl
rename to src/shaders/glsl/point.position.js
index 4b6aa7986e49765c725bea2ee197dcbdeee9884b..8a4dc453038e970d178c5a40d5f8ccd3d10e2da2 100644
--- a/src/shaders/glsl/point.position.glsl
+++ b/src/shaders/glsl/point.position.js
@@ -1,4 +1,4 @@
-uniform float pointDepth;
+export default /* glsl */ `uniform float pointDepth;
 
 uniform float pixelUnit;
 uniform float renderScale;
@@ -45,3 +45,4 @@ vec3 getPointPosition() {
 
   return center + vec3(sprite * depthSize * renderScaleInv * padFactor, 0.0);
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/point.size.uniform.glsl b/src/shaders/glsl/point.size.uniform.glsl
deleted file mode 100644
index b158af2af4dbf9f6b961349e14fb44845eedf0fa..0000000000000000000000000000000000000000
--- a/src/shaders/glsl/point.size.uniform.glsl
+++ /dev/null
@@ -1,5 +0,0 @@
-uniform float pointSize;
-
-float getPointSize(vec4 xyzw) {
-  return pointSize;
-}
\ No newline at end of file
diff --git a/src/shaders/glsl/point.size.uniform.js b/src/shaders/glsl/point.size.uniform.js
new file mode 100644
index 0000000000000000000000000000000000000000..93b02bf1b2f4dc044b0afac5048162263db7c67d
--- /dev/null
+++ b/src/shaders/glsl/point.size.uniform.js
@@ -0,0 +1,5 @@
+export default /* glsl */ `uniform float pointSize;
+
+float getPointSize(vec4 xyzw) {
+  return pointSize;
+}`;
\ No newline at end of file
diff --git a/src/shaders/glsl/point.size.varying.glsl b/src/shaders/glsl/point.size.varying.js
similarity index 64%
rename from src/shaders/glsl/point.size.varying.glsl
rename to src/shaders/glsl/point.size.varying.js
index 03a3e12b24c51bdbe71d61e03fbdb8f4aad0950e..4edb07f9615a6ce89b00f40632c306075b2939e0 100644
--- a/src/shaders/glsl/point.size.varying.glsl
+++ b/src/shaders/glsl/point.size.varying.js
@@ -1,7 +1,7 @@
-uniform float pointSize;
+export default /* glsl */ `uniform float pointSize;
 
 vec4 getSample(vec4 xyzw);
 
 float getPointSize(vec4 xyzw) {
   return pointSize * getSample(xyzw).x;
-}
\ No newline at end of file
+}`;
\ No newline at end of file
diff --git a/src/shaders/glsl/polar.position.glsl b/src/shaders/glsl/polar.position.js
similarity index 95%
rename from src/shaders/glsl/polar.position.glsl
rename to src/shaders/glsl/polar.position.js
index fa40a1d69c87037c3dbb2eeb42a2dafae31f4e13..0f71af7b89e60494f6da02833e853c6cdf221aeb 100644
--- a/src/shaders/glsl/polar.position.glsl
+++ b/src/shaders/glsl/polar.position.js
@@ -1,4 +1,4 @@
-uniform float polarBend;
+export default /* glsl */ `uniform float polarBend;
 uniform float polarFocus;
 uniform float polarAspect;
 uniform float polarHelix;
@@ -36,4 +36,4 @@ vec4 getPolarPosition(vec4 position, inout vec4 stpq) {
   else {
     return viewMatrix * vec4(position.xyz, 1.0);
   }
-}
\ No newline at end of file
+}`;
\ No newline at end of file
diff --git a/src/shaders/glsl/project.position.glsl b/src/shaders/glsl/project.position.js
similarity index 87%
rename from src/shaders/glsl/project.position.glsl
rename to src/shaders/glsl/project.position.js
index b922e799a33158f304ec50672613ca7a64b0d04a..d0d521959043f62247b6e9cacb66a8c4fade15c1 100644
--- a/src/shaders/glsl/project.position.glsl
+++ b/src/shaders/glsl/project.position.js
@@ -1,4 +1,4 @@
-uniform float styleZBias;
+export default /* glsl */ `uniform float styleZBias;
 uniform float styleZIndex;
 
 void setPosition(vec3 position) {
@@ -15,4 +15,4 @@ void setPosition(vec3 position) {
   }
   
   gl_Position = pos;
-}
\ No newline at end of file
+}`;
\ No newline at end of file
diff --git a/src/shaders/glsl/project.readback.glsl b/src/shaders/glsl/project.readback.js
similarity index 74%
rename from src/shaders/glsl/project.readback.glsl
rename to src/shaders/glsl/project.readback.js
index 89ff2f1799bb636081705a4ece7edd0b23ee9a39..06cf1fa9b8427b06605568a83e6f33cf09736eae 100644
--- a/src/shaders/glsl/project.readback.glsl
+++ b/src/shaders/glsl/project.readback.js
@@ -1,4 +1,4 @@
-// This is three.js' global uniform, missing from fragment shaders.
+export default /* glsl */ `// This is three.js' global uniform, missing from fragment shaders.
 uniform mat4 projectionMatrix;
 
 vec4 readbackPosition(vec3 position, vec4 stpq) {
@@ -11,3 +11,4 @@ vec4 readbackPosition(vec3 position, vec4 stpq) {
     return vec4(final, -position.z);
   }
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/raw.position.scale.glsl b/src/shaders/glsl/raw.position.scale.js
similarity index 62%
rename from src/shaders/glsl/raw.position.scale.glsl
rename to src/shaders/glsl/raw.position.scale.js
index df6c18bdbe646156e9d7dc4b913304d5ccdbb3fc..c0c696b56a329ab873c5beba741b83a84f7a3a1c 100644
--- a/src/shaders/glsl/raw.position.scale.glsl
+++ b/src/shaders/glsl/raw.position.scale.js
@@ -1,6 +1,7 @@
-uniform vec4 geometryScale;
+export default /* glsl */ `uniform vec4 geometryScale;
 attribute vec4 position4;
 
 vec4 getRawPositionScale() {
   return geometryScale * position4;
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/repeat.position.glsl b/src/shaders/glsl/repeat.position.js
similarity index 58%
rename from src/shaders/glsl/repeat.position.glsl
rename to src/shaders/glsl/repeat.position.js
index ea54903822b5f48b9dc2ba1d06b30178cd951313..4805943725fb5e846fbf073b1dfa81823ef74f8f 100644
--- a/src/shaders/glsl/repeat.position.glsl
+++ b/src/shaders/glsl/repeat.position.js
@@ -1,5 +1,6 @@
-uniform vec4 repeatModulus;
+export default /* glsl */ `uniform vec4 repeatModulus;
 
 vec4 getRepeatXYZW(vec4 xyzw) {
   return mod(xyzw + .5, repeatModulus) - .5;
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/resample.padding.glsl b/src/shaders/glsl/resample.padding.js
similarity index 53%
rename from src/shaders/glsl/resample.padding.glsl
rename to src/shaders/glsl/resample.padding.js
index 4fcc97a4eae26bc4f513aab27fdfbe3a844bdee3..b22112d19f778b0292705d87c7c80f89fc76efa7 100644
--- a/src/shaders/glsl/resample.padding.glsl
+++ b/src/shaders/glsl/resample.padding.js
@@ -1,5 +1,5 @@
-uniform vec4 resampleBias;
+export default /* glsl */ `uniform vec4 resampleBias;
 
 vec4 resamplePadding(vec4 xyzw) {
   return xyzw + resampleBias;
-}
\ No newline at end of file
+}`;
\ No newline at end of file
diff --git a/src/shaders/glsl/resample.relative.glsl b/src/shaders/glsl/resample.relative.js
similarity index 53%
rename from src/shaders/glsl/resample.relative.glsl
rename to src/shaders/glsl/resample.relative.js
index c43070e933c8417bf730c154e465e3ef99a3627e..6fef81ff669e7cae5eb818ea1a3783bc4b47e334 100644
--- a/src/shaders/glsl/resample.relative.glsl
+++ b/src/shaders/glsl/resample.relative.js
@@ -1,5 +1,5 @@
-uniform vec4 resampleFactor;
+export default /* glsl */ `uniform vec4 resampleFactor;
 
 vec4 resampleRelative(vec4 xyzw) {
   return xyzw * resampleFactor;
-}
\ No newline at end of file
+}`;
\ No newline at end of file
diff --git a/src/shaders/glsl/reveal.mask.glsl b/src/shaders/glsl/reveal.mask.js
similarity index 91%
rename from src/shaders/glsl/reveal.mask.glsl
rename to src/shaders/glsl/reveal.mask.js
index 24e71d56a2677baaac6233a3812d4eb04e6d62e5..587d109e3d6c6c13fd60a997e5de12fe8c99fd84 100644
--- a/src/shaders/glsl/reveal.mask.glsl
+++ b/src/shaders/glsl/reveal.mask.js
@@ -1,4 +1,4 @@
-uniform float transitionEnter;
+export default /* glsl */ `uniform float transitionEnter;
 uniform float transitionExit;
 uniform vec4  transitionScale;
 uniform vec4  transitionBias;
@@ -21,4 +21,4 @@ float getTransitionSDFMask(vec4 stpq) {
   if (exit  == 1.0) return d.x;
   if (enter == 1.0) return d.y;
   return min(d.x, d.y);
-}
\ No newline at end of file
+}`;
\ No newline at end of file
diff --git a/src/shaders/glsl/root.position.glsl b/src/shaders/glsl/root.position.glsl
deleted file mode 100644
index 81e7c6797f8455259ae0878c22ceb53c6812f12f..0000000000000000000000000000000000000000
--- a/src/shaders/glsl/root.position.glsl
+++ /dev/null
@@ -1,4 +0,0 @@
-vec3 getRootPosition(vec4 position, in vec4 stpqIn, out vec4 stpqOut) {
-  stpqOut = stpqIn; // avoid inout confusion
-  return position.xyz;
-}
\ No newline at end of file
diff --git a/src/shaders/glsl/root.position.js b/src/shaders/glsl/root.position.js
new file mode 100644
index 0000000000000000000000000000000000000000..ed543febd5ee637d712592f7270334083fe7a84d
--- /dev/null
+++ b/src/shaders/glsl/root.position.js
@@ -0,0 +1,4 @@
+export default /* glsl */ `vec3 getRootPosition(vec4 position, in vec4 stpqIn, out vec4 stpqOut) {
+  stpqOut = stpqIn; // avoid inout confusion
+  return position.xyz;
+}`;
\ No newline at end of file
diff --git a/src/shaders/glsl/sample.2d.glsl b/src/shaders/glsl/sample.2d.js
similarity index 52%
rename from src/shaders/glsl/sample.2d.glsl
rename to src/shaders/glsl/sample.2d.js
index f041c085b58a16a56483b0378a65eade7dfb304a..dc6ff47f75ee2e9617b2a2f0c33b0dcfff52e7e8 100644
--- a/src/shaders/glsl/sample.2d.glsl
+++ b/src/shaders/glsl/sample.2d.js
@@ -1,5 +1,6 @@
-uniform sampler2D dataTexture;
+export default /* glsl */ `uniform sampler2D dataTexture;
 
 vec4 sample2D(vec2 uv) {
   return texture2D(dataTexture, uv);
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/scale.position.glsl b/src/shaders/glsl/scale.position.js
similarity index 73%
rename from src/shaders/glsl/scale.position.glsl
rename to src/shaders/glsl/scale.position.js
index c42bbad89d11ce1307fe58c266486cd08c5458bf..908ff49647ad70b2a5c973d5a496c7f517eea81f 100644
--- a/src/shaders/glsl/scale.position.glsl
+++ b/src/shaders/glsl/scale.position.js
@@ -1,4 +1,4 @@
-uniform vec4 scaleAxis;
+export default /* glsl */ `uniform vec4 scaleAxis;
 uniform vec4 scaleOffset;
 
 vec4 sampleData(float x);
@@ -6,3 +6,4 @@ vec4 sampleData(float x);
 vec4 getScalePosition(vec4 xyzw) {
   return scaleAxis * sampleData(xyzw.x).x + scaleOffset;
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/screen.map.stpq.glsl b/src/shaders/glsl/screen.map.stpq.js
similarity index 62%
rename from src/shaders/glsl/screen.map.stpq.glsl
rename to src/shaders/glsl/screen.map.stpq.js
index 22395901abbbfa9299ac4f34c98027148b23c4a9..0fecc131017a62f6ca1b51091ff4f12e0069d53d 100644
--- a/src/shaders/glsl/screen.map.stpq.glsl
+++ b/src/shaders/glsl/screen.map.stpq.js
@@ -1,6 +1,7 @@
-uniform vec4 remapSTPQScale;
+export default /* glsl */ `uniform vec4 remapSTPQScale;
 
 vec4 screenMapSTPQ(vec4 xyzw, out vec4 stpq) {
   stpq = xyzw * remapSTPQScale;
   return xyzw;
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/screen.map.xy.glsl b/src/shaders/glsl/screen.map.xy.js
similarity index 64%
rename from src/shaders/glsl/screen.map.xy.glsl
rename to src/shaders/glsl/screen.map.xy.js
index b31ccd344467723701e1f45a0bf5fa85db793064..2c987d9303fe9df75255d3ebe2b1d164bad347c8 100644
--- a/src/shaders/glsl/screen.map.xy.glsl
+++ b/src/shaders/glsl/screen.map.xy.js
@@ -1,5 +1,6 @@
-uniform vec2 remapUVScale;
+export default /* glsl */ `uniform vec2 remapUVScale;
 
 vec4 screenMapXY(vec4 uvwo, vec4 stpq) {
   return vec4(floor(remapUVScale * uvwo.xy), 0.0, 0.0);
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/screen.map.xyzw.glsl b/src/shaders/glsl/screen.map.xyzw.js
similarity index 84%
rename from src/shaders/glsl/screen.map.xyzw.glsl
rename to src/shaders/glsl/screen.map.xyzw.js
index 90a1da27a30f66b076bd9836fa5654fa22175027..f1e5daa369a354c6f781e3de4f7a1de43c96788b 100644
--- a/src/shaders/glsl/screen.map.xyzw.glsl
+++ b/src/shaders/glsl/screen.map.xyzw.js
@@ -1,4 +1,4 @@
-uniform vec2 remapUVScale;
+export default /* glsl */ `uniform vec2 remapUVScale;
 uniform vec2 remapModulus;
 uniform vec2 remapModulusInv;
 
@@ -10,3 +10,4 @@ vec4 screenMapXYZW(vec4 uvwo, vec4 stpq) {
   vec2 zw = fxy * remapModulus;
   return vec4(ixy.x, zw.y, ixy.y, zw.x);
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/screen.pass.uv.glsl b/src/shaders/glsl/screen.pass.uv.glsl
deleted file mode 100644
index 149d1123b3c5c510892acf119c00261a2500addf..0000000000000000000000000000000000000000
--- a/src/shaders/glsl/screen.pass.uv.glsl
+++ /dev/null
@@ -1,3 +0,0 @@
-vec2 screenPassUV(vec4 uvwo, vec4 stpq) {
-  return uvwo.xy;
-}
diff --git a/src/shaders/glsl/screen.pass.uv.js b/src/shaders/glsl/screen.pass.uv.js
new file mode 100644
index 0000000000000000000000000000000000000000..3f68a4679cd38f9342cf79fc6f4f4869210ad480
--- /dev/null
+++ b/src/shaders/glsl/screen.pass.uv.js
@@ -0,0 +1,4 @@
+export default /* glsl */ `vec2 screenPassUV(vec4 uvwo, vec4 stpq) {
+  return uvwo.xy;
+}
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/screen.position.glsl b/src/shaders/glsl/screen.position.glsl
deleted file mode 100644
index 6228f3884bd7d1d81cd3c99a968e7044bc333633..0000000000000000000000000000000000000000
--- a/src/shaders/glsl/screen.position.glsl
+++ /dev/null
@@ -1,3 +0,0 @@
-void setScreenPosition(vec4 position) {
-  gl_Position = vec4(position.xy * 2.0 - 1.0, 0.5, 1.0);
-}
diff --git a/src/shaders/glsl/screen.position.js b/src/shaders/glsl/screen.position.js
new file mode 100644
index 0000000000000000000000000000000000000000..6b8e2320b5db109bbc2a8b43e4ef889b885f811f
--- /dev/null
+++ b/src/shaders/glsl/screen.position.js
@@ -0,0 +1,4 @@
+export default /* glsl */ `void setScreenPosition(vec4 position) {
+  gl_Position = vec4(position.xy * 2.0 - 1.0, 0.5, 1.0);
+}
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/slice.position.glsl b/src/shaders/glsl/slice.position.js
similarity index 54%
rename from src/shaders/glsl/slice.position.glsl
rename to src/shaders/glsl/slice.position.js
index 38f401815b9042dbcaaeb64d210c0b4e6be3361a..6aea0a11ff1655ecd52c6723147927e1478e7fa9 100644
--- a/src/shaders/glsl/slice.position.glsl
+++ b/src/shaders/glsl/slice.position.js
@@ -1,5 +1,6 @@
-uniform vec4 sliceOffset;
+export default /* glsl */ `uniform vec4 sliceOffset;
 
 vec4 getSliceOffset(vec4 xyzw) {
   return xyzw + sliceOffset;
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/spherical.position.glsl b/src/shaders/glsl/spherical.position.js
similarity index 92%
rename from src/shaders/glsl/spherical.position.glsl
rename to src/shaders/glsl/spherical.position.js
index 33655662dc3405346a85a68c09573324a470b3b6..b8c7403e831c5a0860c6a175f8cc397132542853 100644
--- a/src/shaders/glsl/spherical.position.glsl
+++ b/src/shaders/glsl/spherical.position.js
@@ -1,4 +1,4 @@
-uniform float sphericalBend;
+export default /* glsl */ `uniform float sphericalBend;
 uniform float sphericalFocus;
 uniform float sphericalAspectX;
 uniform float sphericalAspectY;
@@ -23,4 +23,4 @@ vec4 getSphericalPosition(vec4 position, inout vec4 stpq) {
   else {
     return viewMatrix * vec4(position.xyz, 1.0);
   }
-}
\ No newline at end of file
+}`;
\ No newline at end of file
diff --git a/src/shaders/glsl/split.position.glsl b/src/shaders/glsl/split.position.js
similarity index 80%
rename from src/shaders/glsl/split.position.glsl
rename to src/shaders/glsl/split.position.js
index 9cfb6606bdeb306a03eb52178f0b0444d6e50944..57af328b82b700571ff8e52263f3d72be3f34375 100644
--- a/src/shaders/glsl/split.position.glsl
+++ b/src/shaders/glsl/split.position.js
@@ -1,4 +1,4 @@
-uniform float splitStride;
+export default /* glsl */ `uniform float splitStride;
 
 vec2 getIndices(vec4 xyzw);
 vec4 getRest(vec4 xyzw);
@@ -9,3 +9,4 @@ vec4 getSplitXYZW(vec4 xyzw) {
   float offset = uv.x + uv.y * splitStride;
   return injectIndex(offset) + getRest(xyzw);
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/spread.position.glsl b/src/shaders/glsl/spread.position.js
similarity index 77%
rename from src/shaders/glsl/spread.position.glsl
rename to src/shaders/glsl/spread.position.js
index c2e5cc5949a9b29dfcf32c2d7a498316b301d5bb..6a4dd4031d83136c3cd88b904c8b5b9044eb1c36 100644
--- a/src/shaders/glsl/spread.position.glsl
+++ b/src/shaders/glsl/spread.position.js
@@ -1,4 +1,4 @@
-uniform vec4 spreadOffset;
+export default /* glsl */ `uniform vec4 spreadOffset;
 uniform mat4 spreadMatrix;
 
 // External
@@ -8,3 +8,4 @@ vec4 getSpreadSample(vec4 xyzw) {
   vec4 sample = getSample(xyzw);
   return sample + spreadMatrix * (spreadOffset + xyzw);
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/sprite.fragment.glsl b/src/shaders/glsl/sprite.fragment.js
similarity index 60%
rename from src/shaders/glsl/sprite.fragment.glsl
rename to src/shaders/glsl/sprite.fragment.js
index 7768bda1b292f5a7f8efd34defa527980ae6d016..09aa2304803f6f875dd2e6163254f6602bd67779 100644
--- a/src/shaders/glsl/sprite.fragment.glsl
+++ b/src/shaders/glsl/sprite.fragment.js
@@ -1,7 +1,7 @@
-varying vec2 vSprite;
+export default /* glsl */ `varying vec2 vSprite;
 
 vec4 getSample(vec2 xy);
 
 vec4 getSpriteColor() {
   return getSample(vSprite);
-}
\ No newline at end of file
+}`;
\ No newline at end of file
diff --git a/src/shaders/glsl/sprite.position.glsl b/src/shaders/glsl/sprite.position.js
similarity index 97%
rename from src/shaders/glsl/sprite.position.glsl
rename to src/shaders/glsl/sprite.position.js
index 116df96a0f2687d2a8796effc9cd7ac3c4286360..25333740088f0203a60c2425e1f8f48607a3389e 100644
--- a/src/shaders/glsl/sprite.position.glsl
+++ b/src/shaders/glsl/sprite.position.js
@@ -1,4 +1,4 @@
-uniform vec2 spriteOffset;
+export default /* glsl */ `uniform vec2 spriteOffset;
 uniform float spriteScale;
 uniform float spriteDepth;
 uniform float spriteSnap;
@@ -71,3 +71,4 @@ vec3 getSpritePosition() {
   }
 
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/stereographic.position.glsl b/src/shaders/glsl/stereographic.position.js
similarity index 87%
rename from src/shaders/glsl/stereographic.position.glsl
rename to src/shaders/glsl/stereographic.position.js
index 68b6e62da5f965d4f83305040887a2ccd6e1da03..bfcd52bbac2cffd033ff88e9419db1108107ad5b 100644
--- a/src/shaders/glsl/stereographic.position.glsl
+++ b/src/shaders/glsl/stereographic.position.js
@@ -1,4 +1,4 @@
-uniform float stereoBend;
+export default /* glsl */ `uniform float stereoBend;
 
 uniform mat4 viewMatrix;
 
@@ -17,4 +17,4 @@ vec4 getStereoPosition(vec4 position, inout vec4 stpq) {
   else {
     return viewMatrix * vec4(position.xyz, 1.0);
   }
-}
\ No newline at end of file
+}`;
\ No newline at end of file
diff --git a/src/shaders/glsl/stereographic4.position.glsl b/src/shaders/glsl/stereographic4.position.js
similarity index 91%
rename from src/shaders/glsl/stereographic4.position.glsl
rename to src/shaders/glsl/stereographic4.position.js
index c812dbe6b34955af55e73b0daf4f86e91ae13df2..05a8958294de29f5efcebcddd39499a09f069f69 100644
--- a/src/shaders/glsl/stereographic4.position.glsl
+++ b/src/shaders/glsl/stereographic4.position.js
@@ -1,4 +1,4 @@
-uniform float stereoBend;
+export default /* glsl */ `uniform float stereoBend;
 uniform vec4 basisScale;
 uniform vec4 basisOffset;
 uniform mat4 viewMatrix;
@@ -23,3 +23,4 @@ vec4 getStereographic4Position(vec4 position, inout vec4 stpq) {
   vec3 xyz = (viewMatrix * vec4(pos4.xyz, 1.0)).xyz;
   return vec4(xyz, pos4.w * view4D.y + view4D.x);
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/stpq.sample.2d.glsl b/src/shaders/glsl/stpq.sample.2d.js
similarity index 61%
rename from src/shaders/glsl/stpq.sample.2d.glsl
rename to src/shaders/glsl/stpq.sample.2d.js
index c4c218eefe0371c142a6ce3883279b662e95b1b9..b307d53700a52dc33f3191682217c57df681722a 100644
--- a/src/shaders/glsl/stpq.sample.2d.glsl
+++ b/src/shaders/glsl/stpq.sample.2d.js
@@ -1,7 +1,8 @@
-varying vec2 vST;
+export default /* glsl */ `varying vec2 vST;
 
 vec4 getSample(vec2 st);
 
 vec4 getSTSample() {
   return getSample(vST);
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/stpq.xyzw.2d.glsl b/src/shaders/glsl/stpq.xyzw.2d.js
similarity index 50%
rename from src/shaders/glsl/stpq.xyzw.2d.glsl
rename to src/shaders/glsl/stpq.xyzw.2d.js
index 992f1d25f18a38aadf1f68b287325e519c83ecd8..22db7ea4d44478e0c48fed28f910679afe2334c1 100644
--- a/src/shaders/glsl/stpq.xyzw.2d.glsl
+++ b/src/shaders/glsl/stpq.xyzw.2d.js
@@ -1,5 +1,6 @@
-varying vec2 vUV;
+export default /* glsl */ `varying vec2 vUV;
 
 void setRawUV(vec4 xyzw) {
   vUV = xyzw.xy;
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/strip.position.normal.glsl b/src/shaders/glsl/strip.position.normal.js
similarity index 93%
rename from src/shaders/glsl/strip.position.normal.glsl
rename to src/shaders/glsl/strip.position.normal.js
index 6ec5feb2b29ae7c9b146fa50b8a5a4cea7390cce..2c403e118a07b5e8025c2f9495414cd9c46b08bf 100644
--- a/src/shaders/glsl/strip.position.normal.glsl
+++ b/src/shaders/glsl/strip.position.normal.js
@@ -1,4 +1,4 @@
-uniform vec4 geometryClip;
+export default /* glsl */ `uniform vec4 geometryClip;
 attribute vec4 position4;
 attribute vec3 strip;
 
@@ -33,3 +33,4 @@ vec3 getStripPositionNormal() {
 
   return center;
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/style.color.glsl b/src/shaders/glsl/style.color.js
similarity index 63%
rename from src/shaders/glsl/style.color.glsl
rename to src/shaders/glsl/style.color.js
index b3af943efb2a9c425b577aff28293c544189062a..bcac55d5ed12148f1c27f306d678fbeb78fb7509 100644
--- a/src/shaders/glsl/style.color.glsl
+++ b/src/shaders/glsl/style.color.js
@@ -1,6 +1,7 @@
-uniform vec3 styleColor;
+export default /* glsl */ `uniform vec3 styleColor;
 uniform float styleOpacity;
 
 vec4 getStyleColor() {
   return vec4(styleColor, styleOpacity);
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/subdivide.depth.glsl b/src/shaders/glsl/subdivide.depth.js
similarity index 83%
rename from src/shaders/glsl/subdivide.depth.glsl
rename to src/shaders/glsl/subdivide.depth.js
index 6c1609cfc90dcf1fbcc25b663810a5d484d629e9..c4aeb09c9a3a9a931bbd4184f822cbabfbc005ce 100644
--- a/src/shaders/glsl/subdivide.depth.glsl
+++ b/src/shaders/glsl/subdivide.depth.js
@@ -1,4 +1,4 @@
-uniform float subdivideBevel;
+export default /* glsl */ `uniform float subdivideBevel;
 
 // External
 vec4 sampleData(vec4 xyzw);
@@ -13,3 +13,4 @@ vec4 subdivideDepth(vec4 xyzw) {
 
   return sampleData(vec4(xyzw.xy, i + g, xyzw.w));
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/subdivide.depth.lerp.glsl b/src/shaders/glsl/subdivide.depth.lerp.js
similarity index 87%
rename from src/shaders/glsl/subdivide.depth.lerp.glsl
rename to src/shaders/glsl/subdivide.depth.lerp.js
index 29abf967160edd4eba22c9f35861f3022cd3c48f..5655a2e939d8424cd0c9c520474f63404d470280 100644
--- a/src/shaders/glsl/subdivide.depth.lerp.glsl
+++ b/src/shaders/glsl/subdivide.depth.lerp.js
@@ -1,4 +1,4 @@
-uniform float subdivideBevel;
+export default /* glsl */ `uniform float subdivideBevel;
 
 // External
 vec4 sampleData(vec4 xyzw);
@@ -19,3 +19,4 @@ vec4 subdivideDepthLerp(vec4 xyzw) {
 
   return mix(a, b, g);
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/subdivide.height.glsl b/src/shaders/glsl/subdivide.height.js
similarity index 83%
rename from src/shaders/glsl/subdivide.height.glsl
rename to src/shaders/glsl/subdivide.height.js
index 31966f097d789025a827aefdd1274e17692f51fe..42977062da2382a2df1a82b707f3ca60481a0e78 100644
--- a/src/shaders/glsl/subdivide.height.glsl
+++ b/src/shaders/glsl/subdivide.height.js
@@ -1,4 +1,4 @@
-uniform float subdivideBevel;
+export default /* glsl */ `uniform float subdivideBevel;
 
 // External
 vec4 sampleData(vec4 xyzw);
@@ -13,3 +13,4 @@ vec4 subdivideHeight(vec4 xyzw) {
 
   return sampleData(vec4(xyzw.x, i + g, xyzw.zw));
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/subdivide.height.lerp.glsl b/src/shaders/glsl/subdivide.height.lerp.js
similarity index 87%
rename from src/shaders/glsl/subdivide.height.lerp.glsl
rename to src/shaders/glsl/subdivide.height.lerp.js
index fb8b3e9092c30916255f96785070dfd727e02b51..8248ee3ba41de184b6f08e5a882b3dd8e39a3884 100644
--- a/src/shaders/glsl/subdivide.height.lerp.glsl
+++ b/src/shaders/glsl/subdivide.height.lerp.js
@@ -1,4 +1,4 @@
-uniform float subdivideBevel;
+export default /* glsl */ `uniform float subdivideBevel;
 
 // External
 vec4 sampleData(vec4 xyzw);
@@ -19,3 +19,4 @@ vec4 subdivideHeightLerp(vec4 xyzw) {
 
   return mix(a, b, g);
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/subdivide.items.glsl b/src/shaders/glsl/subdivide.items.js
similarity index 83%
rename from src/shaders/glsl/subdivide.items.glsl
rename to src/shaders/glsl/subdivide.items.js
index 2c05a3d414d40eaa55b09e1df1fd011dacbb37d7..b215005e9676818e27ab272e4c05d263fb5240c8 100644
--- a/src/shaders/glsl/subdivide.items.glsl
+++ b/src/shaders/glsl/subdivide.items.js
@@ -1,4 +1,4 @@
-uniform float subdivideBevel;
+export default /* glsl */ `uniform float subdivideBevel;
 
 // External
 vec4 sampleData(vec4 xyzw);
@@ -13,3 +13,4 @@ vec4 subdivideItems(vec4 xyzw) {
 
   return sampleData(vec4(xyzw.xyz, i + g));
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/subdivide.items.lerp.glsl b/src/shaders/glsl/subdivide.items.lerp.js
similarity index 87%
rename from src/shaders/glsl/subdivide.items.lerp.glsl
rename to src/shaders/glsl/subdivide.items.lerp.js
index e241970e729d82ef8dfc2571814ce3f7b68b9485..b9951cb662500e22c3c2ad92d6357cd684a69a83 100644
--- a/src/shaders/glsl/subdivide.items.lerp.glsl
+++ b/src/shaders/glsl/subdivide.items.lerp.js
@@ -1,4 +1,4 @@
-uniform float subdivideBevel;
+export default /* glsl */ `uniform float subdivideBevel;
 
 // External
 vec4 sampleData(vec4 xyzw);
@@ -19,3 +19,4 @@ vec4 subdivideItemsLerp(vec4 xyzw) {
 
   return mix(a, b, g);
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/subdivide.width.glsl b/src/shaders/glsl/subdivide.width.js
similarity index 83%
rename from src/shaders/glsl/subdivide.width.glsl
rename to src/shaders/glsl/subdivide.width.js
index daedf91c9c4e0e28912a7f798fb60d1478467961..0253c14611cd5b3c130918e84a1020208a409215 100644
--- a/src/shaders/glsl/subdivide.width.glsl
+++ b/src/shaders/glsl/subdivide.width.js
@@ -1,4 +1,4 @@
-uniform float subdivideBevel;
+export default /* glsl */ `uniform float subdivideBevel;
 
 // External
 vec4 sampleData(vec4 xyzw);
@@ -13,3 +13,4 @@ vec4 subdivideWidth(vec4 xyzw) {
 
   return sampleData(vec4(i + g, xyzw.yzw));
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/subdivide.width.lerp.glsl b/src/shaders/glsl/subdivide.width.lerp.js
similarity index 87%
rename from src/shaders/glsl/subdivide.width.lerp.glsl
rename to src/shaders/glsl/subdivide.width.lerp.js
index c9be9d8674595c2b2b076613097288c5155b46fc..4e7fd057716b9acf2b60c010f787c23f26403325 100644
--- a/src/shaders/glsl/subdivide.width.lerp.glsl
+++ b/src/shaders/glsl/subdivide.width.lerp.js
@@ -1,4 +1,4 @@
-uniform float subdivideBevel;
+export default /* glsl */ `uniform float subdivideBevel;
 
 // External
 vec4 sampleData(vec4 xyzw);
@@ -19,3 +19,4 @@ vec4 subdivideWidthLerp(vec4 xyzw) {
 
   return mix(a, b, g);
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/surface.mask.hollow.glsl b/src/shaders/glsl/surface.mask.hollow.js
similarity index 74%
rename from src/shaders/glsl/surface.mask.hollow.glsl
rename to src/shaders/glsl/surface.mask.hollow.js
index 1b7fd6a1e92486a91c4204a2d4b7a203d1cb5b4b..3cdf72eae39cb758d8e35c8cef22d567084fc06d 100644
--- a/src/shaders/glsl/surface.mask.hollow.glsl
+++ b/src/shaders/glsl/surface.mask.hollow.js
@@ -1,8 +1,8 @@
-attribute vec4 position4;
+export default /* glsl */ `attribute vec4 position4;
 
 float getSurfaceHollowMask(vec4 xyzw) {
   vec4 df = abs(fract(position4) - .5);
   vec2 df2 = min(df.xy, df.zw);
   float df3 = min(df2.x, df2.y);
   return df3;
-}
\ No newline at end of file
+}`;
\ No newline at end of file
diff --git a/src/shaders/glsl/surface.position.glsl b/src/shaders/glsl/surface.position.js
similarity index 89%
rename from src/shaders/glsl/surface.position.glsl
rename to src/shaders/glsl/surface.position.js
index 6f23bab303570b48bf6eaf63b4ae4b4ebc21c4ef..aa8884f31162aac83ef18ec190c3c30bb9b5f5d0 100644
--- a/src/shaders/glsl/surface.position.glsl
+++ b/src/shaders/glsl/surface.position.js
@@ -1,4 +1,4 @@
-uniform vec4 geometryClip;
+export default /* glsl */ `uniform vec4 geometryClip;
 uniform vec4 geometryResolution;
 uniform vec4 mapSize;
 
@@ -22,3 +22,4 @@ vec3 getSurfacePosition() {
 
   return xyz;
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/surface.position.normal.glsl b/src/shaders/glsl/surface.position.normal.js
similarity index 97%
rename from src/shaders/glsl/surface.position.normal.glsl
rename to src/shaders/glsl/surface.position.normal.js
index ff134bf38310a348ac2170854cd46c4529bc9da6..fb7886ef4aaa7d0f55ad6c4a3513b7282dbe227d 100644
--- a/src/shaders/glsl/surface.position.normal.glsl
+++ b/src/shaders/glsl/surface.position.normal.js
@@ -1,4 +1,4 @@
-uniform vec4 mapSize;
+export default /* glsl */ `uniform vec4 mapSize;
 uniform vec4 geometryResolution;
 uniform vec4 geometryClip;
 attribute vec4 position4;
@@ -62,3 +62,4 @@ vec3 getSurfacePositionNormal() {
   
   return center;
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/ticks.position.glsl b/src/shaders/glsl/ticks.position.js
similarity index 95%
rename from src/shaders/glsl/ticks.position.glsl
rename to src/shaders/glsl/ticks.position.js
index 9a433d4769abaded0b1115604257785a3bae8527..c3073d3c0f7b6d5aff926d45b75fdbd9a3b4eb01 100644
--- a/src/shaders/glsl/ticks.position.glsl
+++ b/src/shaders/glsl/ticks.position.js
@@ -1,4 +1,4 @@
-uniform float worldUnit;
+export default /* glsl */ `uniform float worldUnit;
 uniform float focusDepth;
 uniform float tickSize;
 uniform float tickEpsilon;
@@ -42,3 +42,4 @@ vec3 getTickPosition(vec4 xyzw, in vec4 stpqIn, out vec4 stpqOut) {
 
   return mid + side * line * tickSize * worldUnit * focusDepth;
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/transform3.position.glsl b/src/shaders/glsl/transform3.position.js
similarity index 65%
rename from src/shaders/glsl/transform3.position.glsl
rename to src/shaders/glsl/transform3.position.js
index 1edd631696c588dd91d94714603f6c7dea4493f4..930cf803683fdb98214ef792df0d1baacea66332 100644
--- a/src/shaders/glsl/transform3.position.glsl
+++ b/src/shaders/glsl/transform3.position.js
@@ -1,5 +1,6 @@
-uniform mat4 transformMatrix;
+export default /* glsl */ `uniform mat4 transformMatrix;
 
 vec4 transformPosition(vec4 position, inout vec4 stpq) {
   return transformMatrix * vec4(position.xyz, 1.0);
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/transform4.position.glsl b/src/shaders/glsl/transform4.position.js
similarity index 71%
rename from src/shaders/glsl/transform4.position.glsl
rename to src/shaders/glsl/transform4.position.js
index 5621aecc5c8e8e4d124f96d845de43ff1c2fab30..02a75c57f8c77a40544ad19990bd1d0c84d7fef0 100644
--- a/src/shaders/glsl/transform4.position.glsl
+++ b/src/shaders/glsl/transform4.position.js
@@ -1,6 +1,7 @@
-uniform mat4 transformMatrix;
+export default /* glsl */ `uniform mat4 transformMatrix;
 uniform vec4 transformOffset;
 
 vec4 transformPosition(vec4 position, inout vec4 stpq) {
   return transformMatrix * position + transformOffset;
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/glsl/view.position.glsl b/src/shaders/glsl/view.position.js
similarity index 69%
rename from src/shaders/glsl/view.position.glsl
rename to src/shaders/glsl/view.position.js
index 43c9021a43781f9d97a9c9e5c1125db83e8b6a08..20ded51703f55e15c1c45ba18ba4ea0c65477598 100644
--- a/src/shaders/glsl/view.position.glsl
+++ b/src/shaders/glsl/view.position.js
@@ -1,6 +1,7 @@
-// Implicit three.js uniform
+export default /* glsl */ `// Implicit three.js uniform
 // uniform mat4 viewMatrix;
 
 vec4 getViewPosition(vec4 position, inout vec4 stpq) {
   return (viewMatrix * vec4(position.xyz, 1.0));
 }
+`;
\ No newline at end of file
diff --git a/src/shaders/index.js b/src/shaders/index.js
index 390942849f12dad847537d1087a27df91ff3b646..c1882c60216e1bc183b002d14c6c1225cabb65a7 100644
--- a/src/shaders/index.js
+++ b/src/shaders/index.js
@@ -1,4 +1,225 @@
-export * from "./factory.js";
+import arrowposition from "./glsl/arrow.position";
+import axisposition from "./glsl/axis.position";
+import cartesian4position from "./glsl/cartesian4.position";
+import cartesianposition from "./glsl/cartesian.position";
+import clampposition from "./glsl/clamp.position";
+import coloropaque from "./glsl/color.opaque";
+import faceposition from "./glsl/face.position";
+import facepositionnormal from "./glsl/face.position.normal";
+import floatencode from "./glsl/float.encode";
+import floatindexpack from "./glsl/float.index.pack";
+import floatstretch from "./glsl/float.stretch";
+import fragmentclipdashed from "./glsl/fragment.clip.dashed";
+import fragmentclipdotted from "./glsl/fragment.clip.dotted";
+import fragmentclipends from "./glsl/fragment.clip.ends";
+import fragmentclipproximity from "./glsl/fragment.clip.proximity";
+import fragmentcolor from "./glsl/fragment.color";
+import fragmentmaprgba from "./glsl/fragment.map.rgba";
+import fragmentsolid from "./glsl/fragment.solid";
+import fragmenttransparent from "./glsl/fragment.transparent";
+import gridposition from "./glsl/grid.position";
+import growposition from "./glsl/grow.position";
+import joinposition from "./glsl/join.position";
+import labelalpha from "./glsl/label.alpha";
+import labelmap from "./glsl/label.map";
+import labeloutline from "./glsl/label.outline";
+import layerposition from "./glsl/layer.position";
+import lerpdepth from "./glsl/lerp.depth";
+import lerpheight from "./glsl/lerp.height";
+import lerpitems from "./glsl/lerp.items";
+import lerpwidth from "./glsl/lerp.width";
+import lineposition from "./glsl/line.position";
+import map2ddata from "./glsl/map.2d.data";
+import map2ddatawrap from "./glsl/map.2d.data.wrap";
+import mapxyzw2dv from "./glsl/map.xyzw.2dv";
+import mapxyzwalign from "./glsl/map.xyzw.align";
+import mapxyzwtexture from "./glsl/map.xyzw.texture";
+import meshfragmentcolor from "./glsl/mesh.fragment.color";
+import meshfragmentmap from "./glsl/mesh.fragment.map";
+import meshfragmentmask from "./glsl/mesh.fragment.mask";
+import meshfragmentmaterial from "./glsl/mesh.fragment.material";
+import meshfragmentshaded from "./glsl/mesh.fragment.shaded";
+import meshfragmenttexture from "./glsl/mesh.fragment.texture";
+import meshgammain from "./glsl/mesh.gamma.in";
+import meshgammaout from "./glsl/mesh.gamma.out";
+import meshmapuvwo from "./glsl/mesh.map.uvwo";
+import meshposition from "./glsl/mesh.position";
+import meshvertexcolor from "./glsl/mesh.vertex.color";
+import meshvertexmask from "./glsl/mesh.vertex.mask";
+import meshvertexposition from "./glsl/mesh.vertex.position";
+import moveposition from "./glsl/move.position";
+import objectmaskdefault from "./glsl/object.mask.default";
+import pointalphacircle from "./glsl/point.alpha.circle";
+import pointalphacirclehollow from "./glsl/point.alpha.circle.hollow";
+import pointalphageneric from "./glsl/point.alpha.generic";
+import pointalphagenerichollow from "./glsl/point.alpha.generic.hollow";
+import pointedge from "./glsl/point.edge";
+import pointfill from "./glsl/point.fill";
+import pointmaskcircle from "./glsl/point.mask.circle";
+import pointmaskdiamond from "./glsl/point.mask.diamond";
+import pointmaskdown from "./glsl/point.mask.down";
+import pointmaskleft from "./glsl/point.mask.left";
+import pointmaskright from "./glsl/point.mask.right";
+import pointmasksquare from "./glsl/point.mask.square";
+import pointmaskup from "./glsl/point.mask.up";
+import pointposition from "./glsl/point.position";
+import pointsizeuniform from "./glsl/point.size.uniform";
+import pointsizevarying from "./glsl/point.size.varying";
+import polarposition from "./glsl/polar.position";
+import projectposition from "./glsl/project.position";
+import projectreadback from "./glsl/project.readback";
+import rawpositionscale from "./glsl/raw.position.scale";
+import repeatposition from "./glsl/repeat.position";
+import resamplepadding from "./glsl/resample.padding";
+import resamplerelative from "./glsl/resample.relative";
+import revealmask from "./glsl/reveal.mask";
+import rootposition from "./glsl/root.position";
+import sample2d from "./glsl/sample.2d";
+import scaleposition from "./glsl/scale.position";
+import screenmapstpq from "./glsl/screen.map.stpq";
+import screenmapxy from "./glsl/screen.map.xy";
+import screenmapxyzw from "./glsl/screen.map.xyzw";
+import screenpassuv from "./glsl/screen.pass.uv";
+import screenposition from "./glsl/screen.position";
+import sliceposition from "./glsl/slice.position";
+import sphericalposition from "./glsl/spherical.position";
+import splitposition from "./glsl/split.position";
+import spreadposition from "./glsl/spread.position";
+import spritefragment from "./glsl/sprite.fragment";
+import spriteposition from "./glsl/sprite.position";
+import stereographic4position from "./glsl/stereographic4.position";
+import stereographicposition from "./glsl/stereographic.position";
+import stpqsample2d from "./glsl/stpq.sample.2d";
+import stpqxyzw2d from "./glsl/stpq.xyzw.2d";
+import strippositionnormal from "./glsl/strip.position.normal";
+import stylecolor from "./glsl/style.color";
+import subdividedepth from "./glsl/subdivide.depth";
+import subdividedepthlerp from "./glsl/subdivide.depth.lerp";
+import subdivideheight from "./glsl/subdivide.height";
+import subdivideheightlerp from "./glsl/subdivide.height.lerp";
+import subdivideitems from "./glsl/subdivide.items";
+import subdivideitemslerp from "./glsl/subdivide.items.lerp";
+import subdividewidth from "./glsl/subdivide.width";
+import subdividewidthlerp from "./glsl/subdivide.width.lerp";
+import surfacemaskhollow from "./glsl/surface.mask.hollow";
+import surfaceposition from "./glsl/surface.position";
+import surfacepositionnormal from "./glsl/surface.position.normal";
+import ticksposition from "./glsl/ticks.position";
+import transform3position from "./glsl/transform3.position";
+import transform4position from "./glsl/transform4.position";
+import viewposition from "./glsl/view.position";
+
+export const Snippets = {
+  "arrow.position": arrowposition,
+  "axis.position": axisposition,
+  "cartesian.position": cartesianposition,
+  "cartesian4.position": cartesian4position,
+  "clamp.position": clampposition,
+  "color.opaque": coloropaque,
+  "face.position": faceposition,
+  "face.position.normal": facepositionnormal,
+  "float.encode": floatencode,
+  "float.index.pack": floatindexpack,
+  "float.stretch": floatstretch,
+  "fragment.clip.dashed": fragmentclipdashed,
+  "fragment.clip.dotted": fragmentclipdotted,
+  "fragment.clip.ends": fragmentclipends,
+  "fragment.clip.proximity": fragmentclipproximity,
+  "fragment.color": fragmentcolor,
+  "fragment.map.rgba": fragmentmaprgba,
+  "fragment.solid": fragmentsolid,
+  "fragment.transparent": fragmenttransparent,
+  "grid.position": gridposition,
+  "grow.position": growposition,
+  "join.position": joinposition,
+  "label.alpha": labelalpha,
+  "label.map": labelmap,
+  "label.outline": labeloutline,
+  "layer.position": layerposition,
+  "lerp.depth": lerpdepth,
+  "lerp.height": lerpheight,
+  "lerp.items": lerpitems,
+  "lerp.width": lerpwidth,
+  "line.position": lineposition,
+  "map.2d.data": map2ddata,
+  "map.2d.data.wrap": map2ddatawrap,
+  "map.xyzw.2dv": mapxyzw2dv,
+  "map.xyzw.align": mapxyzwalign,
+  "map.xyzw.texture": mapxyzwtexture,
+  "mesh.fragment.color": meshfragmentcolor,
+  "mesh.fragment.map": meshfragmentmap,
+  "mesh.fragment.mask": meshfragmentmask,
+  "mesh.fragment.material": meshfragmentmaterial,
+  "mesh.fragment.shaded": meshfragmentshaded,
+  "mesh.fragment.texture": meshfragmenttexture,
+  "mesh.gamma.in": meshgammain,
+  "mesh.gamma.out": meshgammaout,
+  "mesh.map.uvwo": meshmapuvwo,
+  "mesh.position": meshposition,
+  "mesh.vertex.color": meshvertexcolor,
+  "mesh.vertex.mask": meshvertexmask,
+  "mesh.vertex.position": meshvertexposition,
+  "move.position": moveposition,
+  "object.mask.default": objectmaskdefault,
+  "point.alpha.circle": pointalphacircle,
+  "point.alpha.circle.hollow": pointalphacirclehollow,
+  "point.alpha.generic": pointalphageneric,
+  "point.alpha.generic.hollow": pointalphagenerichollow,
+  "point.edge": pointedge,
+  "point.fill": pointfill,
+  "point.mask.circle": pointmaskcircle,
+  "point.mask.diamond": pointmaskdiamond,
+  "point.mask.down": pointmaskdown,
+  "point.mask.left": pointmaskleft,
+  "point.mask.right": pointmaskright,
+  "point.mask.square": pointmasksquare,
+  "point.mask.up": pointmaskup,
+  "point.position": pointposition,
+  "point.size.uniform": pointsizeuniform,
+  "point.size.varying": pointsizevarying,
+  "polar.position": polarposition,
+  "project.position": projectposition,
+  "project.readback": projectreadback,
+  "raw.position.scale": rawpositionscale,
+  "repeat.position": repeatposition,
+  "resample.padding": resamplepadding,
+  "resample.relative": resamplerelative,
+  "reveal.mask": revealmask,
+  "root.position": rootposition,
+  "sample.2d": sample2d,
+  "scale.position": scaleposition,
+  "screen.map.stpq": screenmapstpq,
+  "screen.map.xy": screenmapxy,
+  "screen.map.xyzw": screenmapxyzw,
+  "screen.pass.uv": screenpassuv,
+  "screen.position": screenposition,
+  "slice.position": sliceposition,
+  "spherical.position": sphericalposition,
+  "split.position": splitposition,
+  "spread.position": spreadposition,
+  "sprite.fragment": spritefragment,
+  "sprite.position": spriteposition,
+  "stereographic.position": stereographicposition,
+  "stereographic4.position": stereographic4position,
+  "stpq.sample.2d": stpqsample2d,
+  "stpq.xyzw.2d": stpqxyzw2d,
+  "strip.position.normal": strippositionnormal,
+  "style.color": stylecolor,
+  "subdivide.depth": subdividedepth,
+  "subdivide.depth.lerp": subdividedepthlerp,
+  "subdivide.height": subdivideheight,
+  "subdivide.height.lerp": subdivideheightlerp,
+  "subdivide.items": subdivideitems,
+  "subdivide.items.lerp": subdivideitemslerp,
+  "subdivide.width": subdividewidth,
+  "subdivide.width.lerp": subdividewidthlerp,
+  "surface.mask.hollow": surfacemaskhollow,
+  "surface.position": surfaceposition,
+  "surface.position.normal": surfacepositionnormal,
+  "ticks.position": ticksposition,
+  "transform3.position": transform3position,
+  "transform4.position": transform4position,
+  "view.position": viewposition,
+};
 
-// Compiled in build step
-export const Snippets = require("../../build/shaders.js");
+export * from "./factory.js";
diff --git a/src/splash.js b/src/splash.js
index ea1520c9b81c7961686d1600c6e505256b5ea952..e5679723d6196b338f9b4d266207a82f26ee09c1 100644
--- a/src/splash.js
+++ b/src/splash.js
@@ -119,7 +119,7 @@ Bootstrap.registerPlugin("splash", {
       return (() => {
         const result = [];
         for (let i = 0; i < this.gyro.length; i++) {
-          var t;
+          let t;
           const el = this.gyro[i];
           this.transforms[i] = t = increment(this.transforms[i]);
           result.push((el.style.transform = el.style.WebkitTransform = t));
diff --git a/src/stage/animator.js b/src/stage/animator.js
index 8be22732bd02c15e26c46528bd861b7f7d9e05cc..65c16e311be2863d14ad0eea8293b2ee42c1db4e 100644
--- a/src/stage/animator.js
+++ b/src/stage/animator.js
@@ -30,7 +30,7 @@ export class Animator {
     const { time } = this.context;
     return (this.anims = (() => {
       const result = [];
-      for (let anim of Array.from(this.anims)) {
+      for (const anim of Array.from(this.anims)) {
         if (anim.update(time) !== false) {
           result.push(anim);
         }
@@ -62,6 +62,8 @@ export class Animator {
         const emitter = type.emitter(from, to);
         from.emitterFrom = emitter;
         to.emitterTo = emitter;
+        emitter.lerp(f);
+        return emitter;
       }
 
       // Generic binary operator
@@ -189,7 +191,7 @@ class Animation {
       invalid = true;
       return null;
     });
-    if (value !== undefined) {
+    if (value !== undefined && !invalid) {
       target = value;
     }
 
@@ -212,12 +214,15 @@ class Animation {
     }
 
     const clock = this.getTime();
-    let { value, queue } = this;
+    let { value } = this;
+    const { queue } = this;
 
     let active = false;
     while (!active) {
-      var stage;
-      var { from, to, start, end, step, complete, ease } = (stage = queue[0]);
+      const stage = queue[0];
+
+      let { from } = stage;
+      const { to, start, end, step, complete, ease } = stage;
 
       if (from == null) {
         from = stage.from = this.type.clone(this.value);
diff --git a/src/stage/api.js b/src/stage/api.js
index e91accd397bc2bc37ec0c71513b743d44e17d288..bd29d21f91bfd7f7bd0634b3a10a993d4388e45e 100644
--- a/src/stage/api.js
+++ b/src/stage/api.js
@@ -38,7 +38,7 @@ export class API {
     this.length = this._targets.length;
 
     // Primitive factory. This is where all API methods are assigned.
-    for (let type of Array.from(this._context.controller.getTypes())) {
+    for (const type of Array.from(this._context.controller.getTypes())) {
       if (!["root"].includes(type)) {
         this[type] = (options, binds) => this.add(type, options, binds);
       }
@@ -97,7 +97,7 @@ export class API {
 
     // Add to target
     const nodes = [];
-    for (let target of this._targets) {
+    for (const target of this._targets) {
       const node = controller.make(type, options, binds);
       controller.add(node, target);
       nodes.push(node);
@@ -111,14 +111,14 @@ export class API {
     if (selector) {
       return this.select(selector).remove();
     }
-    for (let target of Array.from(this._targets.slice().reverse())) {
+    for (const target of Array.from(this._targets.slice().reverse())) {
       this._context.controller.remove(target);
     }
     return this._pop();
   }
 
   set(key, value) {
-    for (let target of Array.from(this._targets)) {
+    for (const target of Array.from(this._targets)) {
       this._context.controller.set(target, key, value);
     }
     return this;
@@ -141,14 +141,14 @@ export class API {
   }
 
   bind(key, value) {
-    for (let target of Array.from(this._targets)) {
+    for (const target of Array.from(this._targets)) {
       this._context.controller.bind(target, key, value);
     }
     return this;
   }
 
   unbind(key) {
-    for (let target of Array.from(this._targets)) {
+    for (const target of Array.from(this._targets)) {
       this._context.controller.unbind(target, key);
     }
     return this;
@@ -185,7 +185,7 @@ export class API {
 
   off() {
     const args = arguments;
-    this._targets.map((x) => x.on.apply(x, args));
+    this._targets.map((x) => x.off.apply(x, args));
     return this;
   }
 
@@ -218,7 +218,7 @@ export class API {
       owner.constructor.toString().match("function +([^(]*)")[1];
 
     const shaders = [];
-    for (let shader of Array.from(info.shaders)) {
+    for (const shader of Array.from(info.shaders)) {
       const name = getName(shader.owner);
       shaders.push(`${name} - Vertex`);
       shaders.push(shader.vertex);
@@ -253,7 +253,7 @@ export class API {
         list.push(map(node));
       }
       if (node.children != null) {
-        for (let child of Array.from(node.children)) {
+        for (const child of Array.from(node.children)) {
           self(child, list);
         }
       }
@@ -285,8 +285,8 @@ export class API {
     };
 
     // Inspect all targets
-    for (let target of Array.from(this._targets)) {
-      var renderables;
+    for (const target of Array.from(this._targets)) {
+      let renderables;
       if (print) {
         target.print(selector, "info");
       }
@@ -301,7 +301,7 @@ export class API {
         ),
       };
 
-      for (let k in _info) {
+      for (const k in _info) {
         info[k] = info[k].concat(_info[k]);
       }
     }
@@ -311,9 +311,9 @@ export class API {
 }
 
 function __range__(left, right, inclusive) {
-  let range = [];
-  let ascending = left < right;
-  let end = !inclusive ? right : ascending ? right + 1 : right - 1;
+  const range = [];
+  const ascending = left < right;
+  const end = !inclusive ? right : ascending ? right + 1 : right - 1;
   for (let i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {
     range.push(i);
   }
diff --git a/src/util/data.js b/src/util/data.js
index edf5219784c4fb583687bc561f93474e2c7bafe4..edb2d06025c39506c4223999940fce5b8d91dc1f 100644
--- a/src/util/data.js
+++ b/src/util/data.js
@@ -177,7 +177,7 @@ export const makeEmitter = function (thunk, items, channels) {
 
   let next = null;
   while (items > 0) {
-    var n = Math.min(items, 8);
+    const n = Math.min(items, 8);
     outer = (() => {
       switch (n) {
         case 1:
@@ -269,6 +269,8 @@ export const getThunk = function (data) {
   let c = sizes.pop();
   const d = sizes.pop();
 
+  let i, first, second, third, fourth;
+
   switch (nesting) {
     case 0:
       thunk = () => 0;
@@ -276,14 +278,14 @@ export const getThunk = function (data) {
       break;
 
     case 1:
-      var i = 0;
+      i = 0;
       thunk = () => data[i++];
       thunk.reset = () => (i = 0);
       break;
 
     case 2:
       i = j = 0;
-      var first = data[j] != null ? data[j] : [];
+      first = data[j] != null ? data[j] : [];
 
       thunk = function () {
         const x = first[i++];
@@ -303,7 +305,7 @@ export const getThunk = function (data) {
 
     case 3:
       i = j = k = 0;
-      var second = data[k] != null ? data[k] : [];
+      second = data[k] != null ? data[k] : [];
       first = second[j] != null ? second[j] : [];
 
       thunk = function () {
@@ -330,7 +332,7 @@ export const getThunk = function (data) {
 
     case 4:
       i = j = k = l = 0;
-      var third = data[l] != null ? data[l] : [];
+      third = data[l] != null ? data[l] : [];
       second = third[k] != null ? third[k] : [];
       first = second[j] != null ? second[j] : [];
 
@@ -364,7 +366,7 @@ export const getThunk = function (data) {
 
     case 5:
       i = j = k = l = m = 0;
-      var fourth = data[m] != null ? data[m] : [];
+      fourth = data[m] != null ? data[m] : [];
       third = fourth[l] != null ? fourth[l] : [];
       second = third[k] != null ? third[k] : [];
       first = second[j] != null ? second[j] : [];
@@ -427,7 +429,6 @@ export const getThunk = function (data) {
 
 export const getStreamer = function (array, samples, channels, items) {
   let i, j;
-  let emit;
   let limit = (i = j = 0);
 
   const reset = function () {
@@ -494,7 +495,7 @@ export const getStreamer = function (array, samples, channels, items) {
     }
   })();
 
-  emit = (() => {
+  const emit = (() => {
     switch (channels) {
       case 1:
         return function (x) {
@@ -690,9 +691,9 @@ export const getLerpThunk = function (data1, data2) {
 };
 
 function __range__(left, right, inclusive) {
-  let range = [];
-  let ascending = left < right;
-  let end = !inclusive ? right : ascending ? right + 1 : right - 1;
+  const range = [];
+  const ascending = left < right;
+  const end = !inclusive ? right : ascending ? right + 1 : right - 1;
   for (let i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {
     range.push(i);
   }
diff --git a/src/util/glsl.js b/src/util/glsl.js
index ca979f8a5b01ada4c2f982c9fb9029825d364e5a..02394fae95c8bdd8868a831d08ad97d8d26d8127 100644
--- a/src/util/glsl.js
+++ b/src/util/glsl.js
@@ -62,7 +62,7 @@ vec4 float2ByteIndex(vec4 xyzw, out float channelIndex) {
 
 // Sample data texture array
 export const sample2DArray = function (textures) {
-  var divide = function (a, b) {
+  const divide = function (a, b) {
     let out;
     if (a === b) {
       out = `\
@@ -276,9 +276,9 @@ return ${value};
 `;
 
 function __range__(left, right, inclusive) {
-  let range = [];
-  let ascending = left < right;
-  let end = !inclusive ? right : ascending ? right + 1 : right - 1;
+  const range = [];
+  const ascending = left < right;
+  const end = !inclusive ? right : ascending ? right + 1 : right - 1;
   for (let i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {
     range.push(i);
   }
diff --git a/src/util/js.js b/src/util/js.js
index 288440838b56c009c9b1d9b2170caca88d2438fa..98cfbd6412796986b12990e2d40de06b9c448aea 100644
--- a/src/util/js.js
+++ b/src/util/js.js
@@ -10,8 +10,8 @@
 // Merge multiple objects
 export const merge = function () {
   const x = {};
-  for (let obj of Array.from(arguments)) {
-    for (let k in obj) {
+  for (const obj of Array.from(arguments)) {
+    for (const k in obj) {
       const v = obj[k];
       x[k] = v;
     }
@@ -34,9 +34,9 @@ export const parseQuoted = function (str) {
 
   str = str.split(/(?=(?:\\.|["' ,]))/g);
   let quote = false;
-  var list = [];
+  const list = [];
 
-  for (let chunk of Array.from(str)) {
+  for (const chunk of Array.from(str)) {
     const char = chunk[0];
     const token = chunk.slice(1);
     switch (char) {
diff --git a/src/util/pretty.js b/src/util/pretty.js
index 224076aa6a38b0d73858fac6deaddb8c3d9a606b..ae35e86fa62275448c07347eab5259188b05175e 100644
--- a/src/util/pretty.js
+++ b/src/util/pretty.js
@@ -66,9 +66,9 @@ const formatPrimes = [
 ];
 
 const prettyNumber = function (options) {
-  let cache, compact, e, pi, precision, tau, threshold;
+  let cache, compact, e, pi, tau;
   if (options) {
-    ({ cache, compact, tau, pi, e, threshold, precision } = options);
+    ({ cache, compact, tau, pi, e } = options);
   }
 
   compact = +!!(compact != null ? compact : true);
@@ -102,16 +102,17 @@ const prettyNumber = function (options) {
       }
     };
 
-    for (let k in formatFactors[formatIndex]) {
+    for (const k in formatFactors[formatIndex]) {
       const f = formatFactors[formatIndex][k];
       if (checkUnit(v / f)) {
         match(`${formatMultiple(v / f, 1, k, compact)}`);
       } else {
+        // eslint-disable-next-line prefer-const
         for (let [denom, list] of Array.from(formatPrimes)) {
           let numer = (v / f) * denom;
           if (checkUnit(numer)) {
-            for (let p of Array.from(list)) {
-              var d, n;
+            for (const p of Array.from(list)) {
+              let d, n;
               while (checkUnit((n = numer / p)) && checkUnit((d = denom / p))) {
                 numer = n;
                 denom = d;
@@ -145,7 +146,7 @@ const prettyPrint = function (markup, level) {
   return console[level].apply(console, markup);
 };
 
-var prettyMarkup = function (markup) {
+const prettyMarkup = function (markup) {
   // quick n dirty
 
   const tag = "color:rgb(128,0,128)";
@@ -224,7 +225,7 @@ var prettyMarkup = function (markup) {
 const prettyJSXProp = (k, v) => prettyJSXPair(k, v, "=");
 const prettyJSXBind = (k, v) => prettyJSXPair(k, v, "=>");
 
-var prettyJSXPair = (function () {
+const prettyJSXPair = (function () {
   const formatNumber = prettyNumber({ compact: false });
 
   return function (k, v, op) {
@@ -242,7 +243,7 @@ var prettyJSXPair = (function () {
         return `{${v}}`;
       }
     };
-    var value = function (v) {
+    const value = function (v) {
       if (v instanceof Array) {
         return `[${v.map(value).join(", ")}]`;
       }
@@ -280,7 +281,7 @@ var prettyJSXPair = (function () {
                 "{" +
                 (() => {
                   const result = [];
-                  for (let kk in v) {
+                  for (const kk in v) {
                     const vv = v[kk];
                     if (Object.prototype.hasOwnProperty.call(v, kk)) {
                       result.push(`${key(kk)}: ${value(vv)}`);
@@ -315,7 +316,8 @@ const prettyFormat = function (str) {
 
   str = escapeHTML(str);
 
-  for (let arg of Array.from(args)) {
+  // eslint-disable-next-line no-unused-vars
+  for (const _arg of Array.from(args)) {
     str = str.replace(/%([a-z])/, function (_, f) {
       const v = args.shift();
       switch (f) {
diff --git a/src/util/three.js b/src/util/three.js
index 504b60d35e14e646a810d1443a288417f98cd860..676b41f92e0934f96575a498809554e6159952fe 100644
--- a/src/util/three.js
+++ b/src/util/three.js
@@ -53,10 +53,6 @@ export const paramToGL = function (gl, p) {
   if (p === CONST.UnsignedShort5551Type) {
     return gl.UNSIGNED_SHORT_5_5_5_1;
   }
-  if (p === CONST.UnsignedShort565Type) {
-    return gl.UNSIGNED_SHORT_5_6_5;
-  }
-
   if (p === CONST.ByteType) {
     return gl.BYTE;
   }
@@ -79,9 +75,6 @@ export const paramToGL = function (gl, p) {
   if (p === CONST.AlphaFormat) {
     return gl.ALPHA;
   }
-  if (p === CONST.RGBFormat) {
-    return gl.RGB;
-  }
   if (p === CONST.RGBAFormat) {
     return gl.RGBA;
   }
diff --git a/src/util/vdom.js b/src/util/vdom.js
index a7d9d28f800eb21134bbe0c0acb77ec398773d97..f2c8a6862adbe284c3ab7c507514cd694f1836c4 100644
--- a/src/util/vdom.js
+++ b/src/util/vdom.js
@@ -65,7 +65,7 @@ export const recycle = function (el) {
   HEAP.push(el);
 
   if (children != null) {
-    for (let child of Array.from(children)) {
+    for (const child of Array.from(children)) {
       recycle(child);
     }
   }
@@ -159,7 +159,7 @@ export const apply = function (el, last, node, parent, index) {
             if (el.props == null) {
               el.props = {};
             }
-            for (let k in comp.defaultProps) {
+            for (const k in comp.defaultProps) {
               const v = comp.defaultProps[k];
               if (el.props[k] == null) {
                 el.props[k] = v;
@@ -273,7 +273,7 @@ export const apply = function (el, last, node, parent, index) {
   }
 };
 
-var mount = function (el, parent, index) {
+const mount = function (el, parent, index) {
   let node;
   if (index == null) {
     index = 0;
@@ -305,7 +305,7 @@ var mount = function (el, parent, index) {
       if (el.props == null) {
         el.props = {};
       }
-      for (let k in comp.defaultProps) {
+      for (const k in comp.defaultProps) {
         const v = comp.defaultProps[k];
         if (el.props[k] == null) {
           el.props[k] = v;
@@ -345,7 +345,7 @@ var mount = function (el, parent, index) {
     } else {
       // VDOM Node
       node = document.createElement(el.type);
-      for (let key in el.props) {
+      for (const key in el.props) {
         const value = el.props[key];
         set(node, key, value);
       }
@@ -375,19 +375,19 @@ var mount = function (el, parent, index) {
   return node;
 };
 
-var unmount = function (comp, node) {
+const unmount = function (comp, node) {
   if (comp) {
     if (typeof comp.willUnmount === "function") {
       comp.willUnmount();
     }
-    for (let k in comp) {
+    for (const k in comp) {
       delete comp[k];
     }
   }
 
   return (() => {
     const result = [];
-    for (let child of Array.from(node.childNodes)) {
+    for (const child of Array.from(node.childNodes)) {
       unmount(child._COMPONENT, child);
       result.push(delete child._COMPONENT);
     }
@@ -405,7 +405,7 @@ const prop = function (key) {
 
   key = key[0].toUpperCase() + key.slice(1);
   const prefixes = ["webkit", "moz", "ms", "o"];
-  for (let prefix of Array.from(prefixes)) {
+  for (const prefix of Array.from(prefixes)) {
     if (document.documentElement.style[prefix + key] != null) {
       return prefix + key;
     }
@@ -413,13 +413,13 @@ const prop = function (key) {
 };
 
 const map = {};
-for (let key of ["transform"]) {
+for (const key of ["transform"]) {
   map[key] = prop(key);
 }
 
-var set = function (node, key, value, orig) {
+const set = function (node, key, value, orig) {
   if (key === "style") {
-    for (let k in value) {
+    for (const k in value) {
       const v = value[k];
       if ((orig != null ? orig[k] : undefined) !== v) {
         node.style[map[k] != null ? map[k] : k] = v;
@@ -443,9 +443,9 @@ var set = function (node, key, value, orig) {
   }
 };
 
-var unset = function (node, key, orig) {
+const unset = function (node, key, orig) {
   if (key === "style") {
-    for (let k in orig) {
+    for (const k in orig) {
       node.style[map[k] != null ? map[k] : k] = "";
     }
     return;
@@ -472,7 +472,7 @@ export const createClass = function (prototype) {
     didUpdate: "componentDidUpdate",
     willUnmount: "componentWillUnmount",
   };
-  for (let a in aliases) {
+  for (const a in aliases) {
     const b = aliases[a];
     if (prototype[a] == null) {
       prototype[a] = prototype[b];
@@ -553,9 +553,9 @@ export const createClass = function (prototype) {
 };
 
 function __range__(left, right, inclusive) {
-  let range = [];
-  let ascending = left < right;
-  let end = !inclusive ? right : ascending ? right + 1 : right - 1;
+  const range = [];
+  const ascending = left < right;
+  const end = !inclusive ? right : ascending ? right + 1 : right - 1;
   for (let i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {
     range.push(i);
   }
diff --git a/test/examples.spec.js b/test/examples.spec.js
new file mode 100644
index 0000000000000000000000000000000000000000..92265e5e9064d0d9df2c89e1083adf6a3884e25c
--- /dev/null
+++ b/test/examples.spec.js
@@ -0,0 +1,173 @@
+import * as MathBox from "../src";
+import * as THREE from "three";
+import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";
+
+describe("examples", () => {
+  it("runs the axis example", () => {
+    const mathbox = MathBox.mathBox({
+      plugins: ["core", "controls", "cursor"],
+      controls: {
+        klass: OrbitControls,
+      },
+      camera: {
+        fov: 45,
+      },
+    });
+    const three = mathbox.three;
+
+    three.camera.position.set(-0.15, 0.15, 3.6);
+    three.renderer.setClearColor(new THREE.Color(0xffffff), 1.0);
+
+    const colors = {
+      x: new THREE.Color(0xff4136),
+      y: new THREE.Color(0x2ecc40),
+      z: new THREE.Color(0x0074d9),
+    };
+
+    const view = mathbox
+      .set({
+        scale: 720,
+        focus: 1,
+      })
+      .cartesian({
+        range: [
+          [-2, 2],
+          [-1, 1],
+          [-1, 1],
+        ],
+        scale: [2, 1, 1],
+      });
+    view.axis({
+      color: colors.x,
+    });
+    view.axis({
+      axis: 2, // "y" also works
+      color: colors.y,
+    });
+    view.axis({
+      axis: 3,
+      color: colors.z,
+    });
+
+    mathbox
+      .select("axis")
+      .set("end", true)
+      .set("width", 5)
+      .bind("depth", function (t) {
+        return 0.5 + 0.5 * Math.sin(t * 0.5);
+      });
+
+    view.array({
+      id: "colors",
+      live: false,
+      data: [colors.x, colors.y, colors.z].map(function (color) {
+        return [color.r, color.g, color.b, 1];
+      }),
+    });
+
+    view
+      .array({
+        data: [
+          [2, 0, 0],
+          [0, 1.11, 0],
+          [0, 0, 1],
+        ],
+        channels: 3, // necessary
+        live: false,
+      })
+      .text({
+        data: ["x", "y", "z"],
+      })
+      .label({
+        color: 0xffffff,
+        colors: "#colors",
+      });
+  });
+
+  it("runs the curve example", () => {
+    const mathbox = MathBox.mathBox({
+      plugins: ["core", "controls", "cursor"],
+      controls: {
+        klass: OrbitControls,
+      },
+    });
+    const three = mathbox.three;
+
+    three.camera.position.set(0, 0, 3);
+    three.renderer.setClearColor(new THREE.Color(0xffffff), 1.0);
+
+    const view = mathbox
+      .set({
+        focus: 3,
+      })
+      .cartesian({
+        range: [
+          [-2, 2],
+          [-1, 1],
+          [-1, 1],
+        ],
+        scale: [2, 1, 1],
+      });
+
+    view.axis({
+      detail: 30,
+    });
+
+    view.axis({
+      axis: 2,
+    });
+
+    view.scale({
+      divide: 10,
+    });
+    view.ticks({
+      classes: ["foo", "bar"],
+      width: 2,
+    });
+
+    view.grid({
+      divideX: 30,
+      width: 1,
+      opacity: 0.5,
+      zBias: -5,
+    });
+
+    view.interval({
+      id: "sampler",
+      width: 64,
+      expr: function (emit, x, i, t) {
+        const y = Math.sin(x + t) * 0.7; // + (i%2)*Math.sin(x * 400000 + t * 5 + x * x * 10000)*.05;
+        emit(x, y);
+      },
+      channels: 2,
+    });
+
+    view.line({
+      points: "#sampler",
+      color: 0x3090ff,
+      width: 5,
+    });
+
+    view
+      .transform({
+        position: [0, 0.1, 0],
+      })
+      .line({
+        points: "#sampler",
+        color: 0x3090ff,
+        width: 5,
+        stroke: "dotted",
+      });
+
+    view
+      .transform({
+        position: [0, -0.1, 0],
+      })
+      .line({
+        points: "#sampler",
+        color: 0x3090ff,
+        width: 5,
+        stroke: "dashed",
+      });
+  });
+});
diff --git a/test/primitives/types/types.spec.js b/test/primitives/types/types.spec.js
index 6dba02d92b908aa428f4f56b1abb64389920beea..c4e260a19419525a28ad68a81597aa9fb5603b89 100644
--- a/test/primitives/types/types.spec.js
+++ b/test/primitives/types/types.spec.js
@@ -5,6 +5,7 @@
  * DS102: Remove unnecessary code created because of implicit returns
  * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  */
+import * as MathBox from "../../../src";
 const { Types } = MathBox.Primitives.Types;
 
 describe("primitives.types.types", function () {
@@ -45,7 +46,7 @@ describe("primitives.types.types", function () {
       items: 4,
     };
 
-    for (let key in map) {
+    for (const key in map) {
       i = map[key];
       prime();
       x = axis.validate(key, value, invalid);
@@ -106,7 +107,7 @@ describe("primitives.types.types", function () {
       items: 4,
     };
 
-    for (let key in map) {
+    for (const key in map) {
       i = map[key];
       prime();
       x = axis.validate(key, value, invalid);
diff --git a/test/remove.spec.js b/test/remove.spec.js
new file mode 100644
index 0000000000000000000000000000000000000000..b18ec3656ccf824e1731b218a1902b5d88091b4c
--- /dev/null
+++ b/test/remove.spec.js
@@ -0,0 +1,40 @@
+import * as MathBox from "../src";
+
+describe("remove", () => {
+  it("does not throw (from issue #15)", () => {
+    const mathbox = MathBox.mathBox({
+      plugins: ["core", "mathbox"],
+    });
+
+    mathbox
+      .cartesian({
+        range: [
+          [-2, 2],
+          [-1, 1],
+        ],
+        scale: [2, 1],
+      })
+      .array({
+        width: 4,
+        expr: (emit, i) => {
+          emit(i, 0);
+        },
+        channels: 2,
+      })
+      .html({
+        width: 4,
+        expr: (emit, el, _i) => {
+          emit(el("span", { innerHTML: "hello" }));
+        },
+      })
+      .dom({
+        size: 12,
+        offset: [0, 0],
+        outline: 2,
+        zIndex: 2,
+      });
+
+    expect(mathbox.remove("html")).toBe(mathbox);
+    expect(mathbox.remove("dom")).toBe(mathbox);
+  });
+});
diff --git a/test/select.spec.js b/test/select.spec.js
new file mode 100644
index 0000000000000000000000000000000000000000..7ef3812d69c99aa801996f95db8ad2d97d5a9497
--- /dev/null
+++ b/test/select.spec.js
@@ -0,0 +1,59 @@
+import * as MathBox from "../src";
+
+const expectSelectionIs = (selection, selections) => {
+  expect(selection.length).toBe(selections.length);
+  selection.each((node, i) => {
+    expect(selections[i].length).toBe(1);
+    expect(node).toBe(selections[i][0]);
+  });
+};
+
+describe("select", () => {
+  /**
+   * The goal here is not to exhaustively test the selection API, but rather
+   * to sanity check that we've interfaced correctly with our qeurying library
+   */
+
+  it("runs the axis example", () => {
+    const root = MathBox.mathBox();
+    const [c1, c2, c3] = [
+      { classes: ["child", "one"] },
+      { classes: ["child", "two"] },
+      { classes: ["child", "three"] },
+    ].map(({ classes }) => root.group({ classes }));
+
+    // two groups
+    const gc1a = c1.group({ classes: ["grandchild", "a"] });
+    const gc1b = c1.group({ classes: ["grandchild", "b"] });
+    // group + area
+    const gc2a = c2.group({ classes: ["grandchild", "a"], id: "group-2a" });
+    const gc2b = c2.axis({ classes: ["grandchild", "b"], size: 2 });
+    // group + area
+    const gc3a = c3.group({ classes: ["grandchild", "a"] });
+    const gc3b = c3.axis({ classes: ["grandchild", "b"], size: 3 });
+
+    expectSelectionIs(
+      root.select("group"),
+      [c1, gc1a, gc1b, c2, gc2a, c3, gc3a] //
+    );
+
+    expectSelectionIs(
+      root.select(".grandchild.a"),
+      [gc1a, gc2a, gc3a] //
+    );
+
+    expectSelectionIs(
+      root.select("root group.child axis"),
+      [gc2b, gc3b] //
+    );
+    expectSelectionIs(
+      c2.select("root group.child axis"),
+      [gc2b] //
+    );
+
+    expectSelectionIs(
+      c2.select("#group-2a"),
+      [gc2a] //
+    );
+  });
+});
diff --git a/test/test_entrypoint.js b/test/test_entrypoint.js
new file mode 100644
index 0000000000000000000000000000000000000000..606b9b3568cccdcb3d74816483ab1ed5ab44fc76
--- /dev/null
+++ b/test/test_entrypoint.js
@@ -0,0 +1,8 @@
+/**
+ * Import all files in a directory matching a pattern, and do it recursively.
+ *
+ * This is webpack specific syntax and the arguments to require.context must be
+ * literals since this is transformed while webpack parses.
+ */
+const contextualRequire = require.context("./", true, /\.spec\.js$/);
+contextualRequire.keys().forEach(contextualRequire);
diff --git a/test/util/data.spec.js b/test/util/data.spec.js
index 79484684faf526c26d964617dc0a3e0de571c718..23bc9b49e529884fceb62964b306e31cd4b078f9 100644
--- a/test/util/data.spec.js
+++ b/test/util/data.spec.js
@@ -9,6 +9,7 @@
  * DS207: Consider shorter variations of null checks
  * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  */
+import * as MathBox from "../../src";
 const { Data } = MathBox.Util;
 
 describe("util.data", function () {
@@ -159,7 +160,7 @@ describe("util.data", function () {
   });
 
   it("parses 2D JS array dimensions", function () {
-    const map = (channels) => (x) => __range__(1, channels, true);
+    const map = (channels) => (_x) => __range__(1, channels, true);
 
     let spec = Data.getDimensions([1, 2, 3].map(map(2)), {
       items: 1,
@@ -313,7 +314,7 @@ describe("util.data", function () {
   });
 
   it("parses 3D JS array dimensions", function () {
-    const map = (channels) => (x) => __range__(1, channels, true);
+    const map = (channels) => (_x) => __range__(1, channels, true);
     const nest = (f, g) => (x) => f(x).map(g);
 
     let spec = Data.getDimensions([1, 2, 3, 4, 5].map(nest(map(3), map(2))), {
@@ -444,9 +445,8 @@ describe("util.data", function () {
 
   it("thunks a 2D array", function () {
     let index = 1;
-    const map = (channels) => (x) =>
+    const map = (channels) => (_x) =>
       __range__(index, (index += channels), false);
-    const nest = (f, g) => (x) => f(x).map(g);
 
     const data = [1, 2, 3].map(map(2));
     const thunk = Data.getThunk(data);
@@ -470,7 +470,7 @@ describe("util.data", function () {
 
   it("thunks a 3D array", function () {
     let index = 1;
-    const map = (channels) => (x) =>
+    const map = (channels) => (_x) =>
       __range__(index, (index += channels), false);
     const nest = (f, g) => (x) => f(x).map(g);
 
@@ -496,7 +496,7 @@ describe("util.data", function () {
 
   it("thunks a 4D array", function () {
     let index = 1;
-    const map = (channels) => (x) =>
+    const map = (channels) => (_x) =>
       __range__(index, (index += channels), false);
     const nest = (f, g) => (x) => f(x).map(g);
 
@@ -522,7 +522,7 @@ describe("util.data", function () {
 
   it("thunks a 5D array", function () {
     let index = 1;
-    const map = (channels) => (x) =>
+    const map = (channels) => (_x) =>
       __range__(index, (index += channels), false);
     const nest = (f, g) => (x) => f(x).map(g);
 
@@ -620,9 +620,9 @@ describe("util.data", function () {
 });
 
 function __range__(left, right, inclusive) {
-  let range = [];
-  let ascending = left < right;
-  let end = !inclusive ? right : ascending ? right + 1 : right - 1;
+  const range = [];
+  const ascending = left < right;
+  const end = !inclusive ? right : ascending ? right + 1 : right - 1;
   for (let i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {
     range.push(i);
   }
diff --git a/test/util/glsl.spec.js b/test/util/glsl.spec.js
index bb5fab6aa6ee3b48c25d986addb19625af2ec0b2..ed24f47cc4617efb10e86556a7ebf36488d4f4f7 100644
--- a/test/util/glsl.spec.js
+++ b/test/util/glsl.spec.js
@@ -5,6 +5,7 @@
  * DS102: Remove unnecessary code created because of implicit returns
  * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  */
+import * as MathBox from "../../src";
 const { GLSL } = MathBox.Util;
 
 describe("util.glsl", function () {
diff --git a/vendor/gulp-jsify/index.js b/vendor/gulp-jsify/index.js
deleted file mode 100644
index 8777d0a42a3243be60480d15ecdea4c2cc202b4b..0000000000000000000000000000000000000000
--- a/vendor/gulp-jsify/index.js
+++ /dev/null
@@ -1,52 +0,0 @@
-var through = require("through");
-var path = require("path");
-var PluginError = require("plugin-error");
-var File = require("vinyl");
-
-module.exports = function (fileName, global) {
-  if (!fileName)
-    throw new PluginError(
-      "gulp-concat",
-      "Missing fileName option for gulp-jsify"
-    );
-
-  var buffer = [];
-  var firstFile = null;
-
-  function bufferContents(file) {
-    if (file.isNull()) return; // ignore
-    if (file.isStream())
-      return this.emit(
-        "error",
-        new PluginError("gulp-concat", "Streaming not supported")
-      );
-
-    if (!firstFile) firstFile = file;
-
-    var contents = file.contents.toString("utf8");
-    var json = JSON.stringify(contents);
-    var parts = path.basename(file.path).split(/\./g);
-    var name = JSON.stringify(parts.slice(0, -1).join("."));
-
-    buffer.push(name + ": " + json);
-  }
-
-  function endStream() {
-    if (buffer.length === 0) return this.emit("end");
-
-    var joinedContents = global + " = {" + buffer.join(",\n") + "};\n";
-    var joinedPath = path.join(firstFile.base, fileName);
-
-    var joinedFile = new File({
-      cwd: firstFile.cwd,
-      base: firstFile.base,
-      path: joinedPath,
-      contents: Buffer.from(joinedContents),
-    });
-
-    this.emit("data", joinedFile);
-    this.emit("end");
-  }
-
-  return through(bufferContents, endStream);
-};
diff --git a/vendor/gulp-jsify/package-lock.json b/vendor/gulp-jsify/package-lock.json
deleted file mode 100644
index 5f331432930fbf020c221806cb681312932e332f..0000000000000000000000000000000000000000
--- a/vendor/gulp-jsify/package-lock.json
+++ /dev/null
@@ -1,409 +0,0 @@
-{
-  "name": "gulp-jsify",
-  "version": "0.0.0",
-  "lockfileVersion": 2,
-  "requires": true,
-  "packages": {
-    "": {
-      "version": "0.0.0",
-      "license": "MIT",
-      "dependencies": {
-        "plugin-error": "~1.0.1",
-        "through": "~2.3.8",
-        "vinyl": "~2.2.1"
-      }
-    },
-    "node_modules/ansi-colors": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
-      "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==",
-      "dependencies": {
-        "ansi-wrap": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/ansi-wrap": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz",
-      "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/arr-diff": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
-      "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/arr-union": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
-      "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/assign-symbols": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
-      "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/clone": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
-      "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
-      "engines": {
-        "node": ">=0.8"
-      }
-    },
-    "node_modules/clone-buffer": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz",
-      "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=",
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/clone-stats": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
-      "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA="
-    },
-    "node_modules/cloneable-readable": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz",
-      "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==",
-      "dependencies": {
-        "inherits": "^2.0.1",
-        "process-nextick-args": "^2.0.0",
-        "readable-stream": "^2.3.5"
-      }
-    },
-    "node_modules/core-util-is": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
-      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
-    },
-    "node_modules/extend-shallow": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
-      "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
-      "dependencies": {
-        "assign-symbols": "^1.0.0",
-        "is-extendable": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/inherits": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
-      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
-    },
-    "node_modules/is-extendable": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
-      "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
-      "dependencies": {
-        "is-plain-object": "^2.0.4"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-plain-object": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
-      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
-      "dependencies": {
-        "isobject": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/isarray": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
-    },
-    "node_modules/isobject": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
-      "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/plugin-error": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz",
-      "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==",
-      "dependencies": {
-        "ansi-colors": "^1.0.1",
-        "arr-diff": "^4.0.0",
-        "arr-union": "^3.1.0",
-        "extend-shallow": "^3.0.2"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/process-nextick-args": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
-      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
-    },
-    "node_modules/readable-stream": {
-      "version": "2.3.7",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
-      "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
-      "dependencies": {
-        "core-util-is": "~1.0.0",
-        "inherits": "~2.0.3",
-        "isarray": "~1.0.0",
-        "process-nextick-args": "~2.0.0",
-        "safe-buffer": "~5.1.1",
-        "string_decoder": "~1.1.1",
-        "util-deprecate": "~1.0.1"
-      }
-    },
-    "node_modules/remove-trailing-separator": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
-      "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8="
-    },
-    "node_modules/replace-ext": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz",
-      "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==",
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/safe-buffer": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
-    },
-    "node_modules/string_decoder": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-      "dependencies": {
-        "safe-buffer": "~5.1.0"
-      }
-    },
-    "node_modules/through": {
-      "version": "2.3.8",
-      "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
-      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
-    },
-    "node_modules/util-deprecate": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
-      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
-    },
-    "node_modules/vinyl": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz",
-      "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==",
-      "dependencies": {
-        "clone": "^2.1.1",
-        "clone-buffer": "^1.0.0",
-        "clone-stats": "^1.0.0",
-        "cloneable-readable": "^1.0.0",
-        "remove-trailing-separator": "^1.0.1",
-        "replace-ext": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    }
-  },
-  "dependencies": {
-    "ansi-colors": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
-      "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==",
-      "requires": {
-        "ansi-wrap": "^0.1.0"
-      }
-    },
-    "ansi-wrap": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz",
-      "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768="
-    },
-    "arr-diff": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
-      "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA="
-    },
-    "arr-union": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
-      "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ="
-    },
-    "assign-symbols": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
-      "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c="
-    },
-    "clone": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
-      "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18="
-    },
-    "clone-buffer": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz",
-      "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg="
-    },
-    "clone-stats": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
-      "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA="
-    },
-    "cloneable-readable": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz",
-      "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==",
-      "requires": {
-        "inherits": "^2.0.1",
-        "process-nextick-args": "^2.0.0",
-        "readable-stream": "^2.3.5"
-      }
-    },
-    "core-util-is": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
-      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
-    },
-    "extend-shallow": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
-      "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
-      "requires": {
-        "assign-symbols": "^1.0.0",
-        "is-extendable": "^1.0.1"
-      }
-    },
-    "inherits": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
-      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
-    },
-    "is-extendable": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
-      "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
-      "requires": {
-        "is-plain-object": "^2.0.4"
-      }
-    },
-    "is-plain-object": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
-      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
-      "requires": {
-        "isobject": "^3.0.1"
-      }
-    },
-    "isarray": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
-    },
-    "isobject": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
-      "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
-    },
-    "plugin-error": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz",
-      "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==",
-      "requires": {
-        "ansi-colors": "^1.0.1",
-        "arr-diff": "^4.0.0",
-        "arr-union": "^3.1.0",
-        "extend-shallow": "^3.0.2"
-      }
-    },
-    "process-nextick-args": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
-      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
-    },
-    "readable-stream": {
-      "version": "2.3.7",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
-      "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
-      "requires": {
-        "core-util-is": "~1.0.0",
-        "inherits": "~2.0.3",
-        "isarray": "~1.0.0",
-        "process-nextick-args": "~2.0.0",
-        "safe-buffer": "~5.1.1",
-        "string_decoder": "~1.1.1",
-        "util-deprecate": "~1.0.1"
-      }
-    },
-    "remove-trailing-separator": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
-      "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8="
-    },
-    "replace-ext": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz",
-      "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw=="
-    },
-    "safe-buffer": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
-    },
-    "string_decoder": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-      "requires": {
-        "safe-buffer": "~5.1.0"
-      }
-    },
-    "through": {
-      "version": "2.3.8",
-      "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
-      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
-    },
-    "util-deprecate": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
-      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
-    },
-    "vinyl": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz",
-      "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==",
-      "requires": {
-        "clone": "^2.1.1",
-        "clone-buffer": "^1.0.0",
-        "clone-stats": "^1.0.0",
-        "cloneable-readable": "^1.0.0",
-        "remove-trailing-separator": "^1.0.1",
-        "replace-ext": "^1.0.0"
-      }
-    }
-  }
-}
diff --git a/vendor/gulp-jsify/package.json b/vendor/gulp-jsify/package.json
deleted file mode 100644
index 5fb3beddf290fbf5c9d05efe188223ce2c88c3f4..0000000000000000000000000000000000000000
--- a/vendor/gulp-jsify/package.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "name": "gulp-jsify",
-  "version": "0.0.0",
-  "description": "",
-  "main": "index.js",
-  "dependencies": {
-    "through": "~2.3.8",
-    "plugin-error": "~1.0.1",
-    "vinyl": "~2.2.1"
-  },
-  "scripts": {
-  },
-  "author": "Steven Wittens",
-  "license": "MIT"
-}